LEB128Test.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. //===- llvm/unittest/Support/LEB128Test.cpp - LEB128 function tests -------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "gtest/gtest.h"
  10. #include "llvm/Support/DataTypes.h"
  11. #include "llvm/Support/LEB128.h"
  12. #include "llvm/Support/raw_ostream.h"
  13. #include <string>
  14. using namespace llvm;
  15. namespace {
  16. TEST(LEB128Test, EncodeSLEB128) {
  17. #define EXPECT_SLEB128_EQ(EXPECTED, VALUE) \
  18. do { \
  19. /* encodeSLEB128(uint64_t, raw_ostream &) */ \
  20. std::string Expected(EXPECTED, sizeof(EXPECTED) - 1); \
  21. std::string Actual; \
  22. raw_string_ostream Stream(Actual); \
  23. encodeSLEB128(VALUE, Stream); \
  24. Stream.flush(); \
  25. EXPECT_EQ(Expected, Actual); \
  26. } while (0)
  27. // Encode SLEB128
  28. EXPECT_SLEB128_EQ("\x00", 0);
  29. EXPECT_SLEB128_EQ("\x01", 1);
  30. EXPECT_SLEB128_EQ("\x7f", -1);
  31. EXPECT_SLEB128_EQ("\x3f", 63);
  32. EXPECT_SLEB128_EQ("\x41", -63);
  33. EXPECT_SLEB128_EQ("\x40", -64);
  34. EXPECT_SLEB128_EQ("\xbf\x7f", -65);
  35. EXPECT_SLEB128_EQ("\xc0\x00", 64);
  36. #undef EXPECT_SLEB128_EQ
  37. }
  38. TEST(LEB128Test, EncodeULEB128) {
  39. #define EXPECT_ULEB128_EQ(EXPECTED, VALUE, PAD) \
  40. do { \
  41. std::string Expected(EXPECTED, sizeof(EXPECTED) - 1); \
  42. \
  43. /* encodeULEB128(uint64_t, raw_ostream &, unsigned) */ \
  44. std::string Actual1; \
  45. raw_string_ostream Stream(Actual1); \
  46. encodeULEB128(VALUE, Stream, PAD); \
  47. Stream.flush(); \
  48. EXPECT_EQ(Expected, Actual1); \
  49. \
  50. /* encodeULEB128(uint64_t, uint8_t *, unsigned) */ \
  51. uint8_t Buffer[32]; \
  52. unsigned Size = encodeULEB128(VALUE, Buffer, PAD); \
  53. std::string Actual2(reinterpret_cast<const char *>(Buffer), Size); \
  54. EXPECT_EQ(Expected, Actual2); \
  55. } while (0)
  56. // Encode ULEB128
  57. EXPECT_ULEB128_EQ("\x00", 0, 0);
  58. EXPECT_ULEB128_EQ("\x01", 1, 0);
  59. EXPECT_ULEB128_EQ("\x3f", 63, 0);
  60. EXPECT_ULEB128_EQ("\x40", 64, 0);
  61. EXPECT_ULEB128_EQ("\x7f", 0x7f, 0);
  62. EXPECT_ULEB128_EQ("\x80\x01", 0x80, 0);
  63. EXPECT_ULEB128_EQ("\x81\x01", 0x81, 0);
  64. EXPECT_ULEB128_EQ("\x90\x01", 0x90, 0);
  65. EXPECT_ULEB128_EQ("\xff\x01", 0xff, 0);
  66. EXPECT_ULEB128_EQ("\x80\x02", 0x100, 0);
  67. EXPECT_ULEB128_EQ("\x81\x02", 0x101, 0);
  68. // Encode ULEB128 with some extra padding bytes
  69. EXPECT_ULEB128_EQ("\x80\x00", 0, 1);
  70. EXPECT_ULEB128_EQ("\x80\x80\x00", 0, 2);
  71. EXPECT_ULEB128_EQ("\xff\x00", 0x7f, 1);
  72. EXPECT_ULEB128_EQ("\xff\x80\x00", 0x7f, 2);
  73. EXPECT_ULEB128_EQ("\x80\x81\x00", 0x80, 1);
  74. EXPECT_ULEB128_EQ("\x80\x81\x80\x00", 0x80, 2);
  75. #undef EXPECT_ULEB128_EQ
  76. }
  77. TEST(LEB128Test, DecodeULEB128) {
  78. #define EXPECT_DECODE_ULEB128_EQ(EXPECTED, VALUE) \
  79. do { \
  80. unsigned ActualSize = 0; \
  81. uint64_t Actual = decodeULEB128(reinterpret_cast<const uint8_t *>(VALUE), \
  82. &ActualSize); \
  83. EXPECT_EQ(sizeof(VALUE) - 1, ActualSize); \
  84. EXPECT_EQ(EXPECTED, Actual); \
  85. } while (0)
  86. // Decode ULEB128
  87. EXPECT_DECODE_ULEB128_EQ(0u, "\x00");
  88. EXPECT_DECODE_ULEB128_EQ(1u, "\x01");
  89. EXPECT_DECODE_ULEB128_EQ(63u, "\x3f");
  90. EXPECT_DECODE_ULEB128_EQ(64u, "\x40");
  91. EXPECT_DECODE_ULEB128_EQ(0x7fu, "\x7f");
  92. EXPECT_DECODE_ULEB128_EQ(0x80u, "\x80\x01");
  93. EXPECT_DECODE_ULEB128_EQ(0x81u, "\x81\x01");
  94. EXPECT_DECODE_ULEB128_EQ(0x90u, "\x90\x01");
  95. EXPECT_DECODE_ULEB128_EQ(0xffu, "\xff\x01");
  96. EXPECT_DECODE_ULEB128_EQ(0x100u, "\x80\x02");
  97. EXPECT_DECODE_ULEB128_EQ(0x101u, "\x81\x02");
  98. EXPECT_DECODE_ULEB128_EQ(4294975616ULL, "\x80\xc1\x80\x80\x10");
  99. // Decode ULEB128 with extra padding bytes
  100. EXPECT_DECODE_ULEB128_EQ(0u, "\x80\x00");
  101. EXPECT_DECODE_ULEB128_EQ(0u, "\x80\x80\x00");
  102. EXPECT_DECODE_ULEB128_EQ(0x7fu, "\xff\x00");
  103. EXPECT_DECODE_ULEB128_EQ(0x7fu, "\xff\x80\x00");
  104. EXPECT_DECODE_ULEB128_EQ(0x80u, "\x80\x81\x00");
  105. EXPECT_DECODE_ULEB128_EQ(0x80u, "\x80\x81\x80\x00");
  106. #undef EXPECT_DECODE_ULEB128_EQ
  107. }
  108. TEST(LEB128Test, DecodeSLEB128) {
  109. #define EXPECT_DECODE_SLEB128_EQ(EXPECTED, VALUE) \
  110. do { \
  111. unsigned ActualSize = 0; \
  112. int64_t Actual = decodeSLEB128(reinterpret_cast<const uint8_t *>(VALUE), \
  113. &ActualSize); \
  114. EXPECT_EQ(sizeof(VALUE) - 1, ActualSize); \
  115. EXPECT_EQ(EXPECTED, Actual); \
  116. } while (0)
  117. // Decode SLEB128
  118. EXPECT_DECODE_SLEB128_EQ(0L, "\x00");
  119. EXPECT_DECODE_SLEB128_EQ(1L, "\x01");
  120. EXPECT_DECODE_SLEB128_EQ(63L, "\x3f");
  121. EXPECT_DECODE_SLEB128_EQ(-64L, "\x40");
  122. EXPECT_DECODE_SLEB128_EQ(-63L, "\x41");
  123. EXPECT_DECODE_SLEB128_EQ(-1L, "\x7f");
  124. EXPECT_DECODE_SLEB128_EQ(128L, "\x80\x01");
  125. EXPECT_DECODE_SLEB128_EQ(129L, "\x81\x01");
  126. EXPECT_DECODE_SLEB128_EQ(-129L, "\xff\x7e");
  127. EXPECT_DECODE_SLEB128_EQ(-128L, "\x80\x7f");
  128. EXPECT_DECODE_SLEB128_EQ(-127L, "\x81\x7f");
  129. EXPECT_DECODE_SLEB128_EQ(64L, "\xc0\x00");
  130. EXPECT_DECODE_SLEB128_EQ(-12345L, "\xc7\x9f\x7f");
  131. // Decode unnormalized SLEB128 with extra padding bytes.
  132. EXPECT_DECODE_SLEB128_EQ(0L, "\x80\x00");
  133. EXPECT_DECODE_SLEB128_EQ(0L, "\x80\x80\x00");
  134. EXPECT_DECODE_SLEB128_EQ(0x7fL, "\xff\x00");
  135. EXPECT_DECODE_SLEB128_EQ(0x7fL, "\xff\x80\x00");
  136. EXPECT_DECODE_SLEB128_EQ(0x80L, "\x80\x81\x00");
  137. EXPECT_DECODE_SLEB128_EQ(0x80L, "\x80\x81\x80\x00");
  138. #undef EXPECT_DECODE_SLEB128_EQ
  139. }
  140. TEST(LEB128Test, SLEB128Size) {
  141. // Positive Value Testing Plan:
  142. // (1) 128 ^ n - 1 ........ need (n+1) bytes
  143. // (2) 128 ^ n ............ need (n+1) bytes
  144. // (3) 128 ^ n * 63 ....... need (n+1) bytes
  145. // (4) 128 ^ n * 64 - 1 ... need (n+1) bytes
  146. // (5) 128 ^ n * 64 ....... need (n+2) bytes
  147. EXPECT_EQ(1u, getSLEB128Size(0x0LL));
  148. EXPECT_EQ(1u, getSLEB128Size(0x1LL));
  149. EXPECT_EQ(1u, getSLEB128Size(0x3fLL));
  150. EXPECT_EQ(1u, getSLEB128Size(0x3fLL));
  151. EXPECT_EQ(2u, getSLEB128Size(0x40LL));
  152. EXPECT_EQ(2u, getSLEB128Size(0x7fLL));
  153. EXPECT_EQ(2u, getSLEB128Size(0x80LL));
  154. EXPECT_EQ(2u, getSLEB128Size(0x1f80LL));
  155. EXPECT_EQ(2u, getSLEB128Size(0x1fffLL));
  156. EXPECT_EQ(3u, getSLEB128Size(0x2000LL));
  157. EXPECT_EQ(3u, getSLEB128Size(0x3fffLL));
  158. EXPECT_EQ(3u, getSLEB128Size(0x4000LL));
  159. EXPECT_EQ(3u, getSLEB128Size(0xfc000LL));
  160. EXPECT_EQ(3u, getSLEB128Size(0xfffffLL));
  161. EXPECT_EQ(4u, getSLEB128Size(0x100000LL));
  162. EXPECT_EQ(4u, getSLEB128Size(0x1fffffLL));
  163. EXPECT_EQ(4u, getSLEB128Size(0x200000LL));
  164. EXPECT_EQ(4u, getSLEB128Size(0x7e00000LL));
  165. EXPECT_EQ(4u, getSLEB128Size(0x7ffffffLL));
  166. EXPECT_EQ(5u, getSLEB128Size(0x8000000LL));
  167. EXPECT_EQ(5u, getSLEB128Size(0xfffffffLL));
  168. EXPECT_EQ(5u, getSLEB128Size(0x10000000LL));
  169. EXPECT_EQ(5u, getSLEB128Size(0x3f0000000LL));
  170. EXPECT_EQ(5u, getSLEB128Size(0x3ffffffffLL));
  171. EXPECT_EQ(6u, getSLEB128Size(0x400000000LL));
  172. EXPECT_EQ(6u, getSLEB128Size(0x7ffffffffLL));
  173. EXPECT_EQ(6u, getSLEB128Size(0x800000000LL));
  174. EXPECT_EQ(6u, getSLEB128Size(0x1f800000000LL));
  175. EXPECT_EQ(6u, getSLEB128Size(0x1ffffffffffLL));
  176. EXPECT_EQ(7u, getSLEB128Size(0x20000000000LL));
  177. EXPECT_EQ(7u, getSLEB128Size(0x3ffffffffffLL));
  178. EXPECT_EQ(7u, getSLEB128Size(0x40000000000LL));
  179. EXPECT_EQ(7u, getSLEB128Size(0xfc0000000000LL));
  180. EXPECT_EQ(7u, getSLEB128Size(0xffffffffffffLL));
  181. EXPECT_EQ(8u, getSLEB128Size(0x1000000000000LL));
  182. EXPECT_EQ(8u, getSLEB128Size(0x1ffffffffffffLL));
  183. EXPECT_EQ(8u, getSLEB128Size(0x2000000000000LL));
  184. EXPECT_EQ(8u, getSLEB128Size(0x7e000000000000LL));
  185. EXPECT_EQ(8u, getSLEB128Size(0x7fffffffffffffLL));
  186. EXPECT_EQ(9u, getSLEB128Size(0x80000000000000LL));
  187. EXPECT_EQ(9u, getSLEB128Size(0xffffffffffffffLL));
  188. EXPECT_EQ(9u, getSLEB128Size(0x100000000000000LL));
  189. EXPECT_EQ(9u, getSLEB128Size(0x3f00000000000000LL));
  190. EXPECT_EQ(9u, getSLEB128Size(0x3fffffffffffffffLL));
  191. EXPECT_EQ(10u, getSLEB128Size(0x4000000000000000LL));
  192. EXPECT_EQ(10u, getSLEB128Size(0x7fffffffffffffffLL));
  193. EXPECT_EQ(10u, getSLEB128Size(INT64_MAX));
  194. // Negative Value Testing Plan:
  195. // (1) - 128 ^ n - 1 ........ need (n+1) bytes
  196. // (2) - 128 ^ n ............ need (n+1) bytes
  197. // (3) - 128 ^ n * 63 ....... need (n+1) bytes
  198. // (4) - 128 ^ n * 64 ....... need (n+1) bytes (different from positive one)
  199. // (5) - 128 ^ n * 65 - 1 ... need (n+2) bytes (if n > 0)
  200. // (6) - 128 ^ n * 65 ....... need (n+2) bytes
  201. EXPECT_EQ(1u, getSLEB128Size(0x0LL));
  202. EXPECT_EQ(1u, getSLEB128Size(-0x1LL));
  203. EXPECT_EQ(1u, getSLEB128Size(-0x3fLL));
  204. EXPECT_EQ(1u, getSLEB128Size(-0x40LL));
  205. EXPECT_EQ(1u, getSLEB128Size(-0x40LL)); // special case
  206. EXPECT_EQ(2u, getSLEB128Size(-0x41LL));
  207. EXPECT_EQ(2u, getSLEB128Size(-0x7fLL));
  208. EXPECT_EQ(2u, getSLEB128Size(-0x80LL));
  209. EXPECT_EQ(2u, getSLEB128Size(-0x1f80LL));
  210. EXPECT_EQ(2u, getSLEB128Size(-0x2000LL));
  211. EXPECT_EQ(3u, getSLEB128Size(-0x207fLL));
  212. EXPECT_EQ(3u, getSLEB128Size(-0x2080LL));
  213. EXPECT_EQ(3u, getSLEB128Size(-0x3fffLL));
  214. EXPECT_EQ(3u, getSLEB128Size(-0x4000LL));
  215. EXPECT_EQ(3u, getSLEB128Size(-0xfc000LL));
  216. EXPECT_EQ(3u, getSLEB128Size(-0x100000LL));
  217. EXPECT_EQ(4u, getSLEB128Size(-0x103fffLL));
  218. EXPECT_EQ(4u, getSLEB128Size(-0x104000LL));
  219. EXPECT_EQ(4u, getSLEB128Size(-0x1fffffLL));
  220. EXPECT_EQ(4u, getSLEB128Size(-0x200000LL));
  221. EXPECT_EQ(4u, getSLEB128Size(-0x7e00000LL));
  222. EXPECT_EQ(4u, getSLEB128Size(-0x8000000LL));
  223. EXPECT_EQ(5u, getSLEB128Size(-0x81fffffLL));
  224. EXPECT_EQ(5u, getSLEB128Size(-0x8200000LL));
  225. EXPECT_EQ(5u, getSLEB128Size(-0xfffffffLL));
  226. EXPECT_EQ(5u, getSLEB128Size(-0x10000000LL));
  227. EXPECT_EQ(5u, getSLEB128Size(-0x3f0000000LL));
  228. EXPECT_EQ(5u, getSLEB128Size(-0x400000000LL));
  229. EXPECT_EQ(6u, getSLEB128Size(-0x40fffffffLL));
  230. EXPECT_EQ(6u, getSLEB128Size(-0x410000000LL));
  231. EXPECT_EQ(6u, getSLEB128Size(-0x7ffffffffLL));
  232. EXPECT_EQ(6u, getSLEB128Size(-0x800000000LL));
  233. EXPECT_EQ(6u, getSLEB128Size(-0x1f800000000LL));
  234. EXPECT_EQ(6u, getSLEB128Size(-0x20000000000LL));
  235. EXPECT_EQ(7u, getSLEB128Size(-0x207ffffffffLL));
  236. EXPECT_EQ(7u, getSLEB128Size(-0x20800000000LL));
  237. EXPECT_EQ(7u, getSLEB128Size(-0x3ffffffffffLL));
  238. EXPECT_EQ(7u, getSLEB128Size(-0x40000000000LL));
  239. EXPECT_EQ(7u, getSLEB128Size(-0xfc0000000000LL));
  240. EXPECT_EQ(7u, getSLEB128Size(-0x1000000000000LL));
  241. EXPECT_EQ(8u, getSLEB128Size(-0x103ffffffffffLL));
  242. EXPECT_EQ(8u, getSLEB128Size(-0x1040000000000LL));
  243. EXPECT_EQ(8u, getSLEB128Size(-0x1ffffffffffffLL));
  244. EXPECT_EQ(8u, getSLEB128Size(-0x2000000000000LL));
  245. EXPECT_EQ(8u, getSLEB128Size(-0x7e000000000000LL));
  246. EXPECT_EQ(8u, getSLEB128Size(-0x80000000000000LL));
  247. EXPECT_EQ(9u, getSLEB128Size(-0x81ffffffffffffLL));
  248. EXPECT_EQ(9u, getSLEB128Size(-0x82000000000000LL));
  249. EXPECT_EQ(9u, getSLEB128Size(-0xffffffffffffffLL));
  250. EXPECT_EQ(9u, getSLEB128Size(-0x100000000000000LL));
  251. EXPECT_EQ(9u, getSLEB128Size(-0x3f00000000000000LL));
  252. EXPECT_EQ(9u, getSLEB128Size(-0x4000000000000000LL));
  253. EXPECT_EQ(10u, getSLEB128Size(-0x40ffffffffffffffLL));
  254. EXPECT_EQ(10u, getSLEB128Size(-0x4100000000000000LL));
  255. EXPECT_EQ(10u, getSLEB128Size(-0x7fffffffffffffffLL));
  256. EXPECT_EQ(10u, getSLEB128Size(-0x8000000000000000LL));
  257. EXPECT_EQ(10u, getSLEB128Size(INT64_MIN));
  258. }
  259. TEST(LEB128Test, ULEB128Size) {
  260. // Testing Plan:
  261. // (1) 128 ^ n ............ need (n+1) bytes
  262. // (2) 128 ^ n * 64 ....... need (n+1) bytes
  263. // (3) 128 ^ (n+1) - 1 .... need (n+1) bytes
  264. EXPECT_EQ(1u, getULEB128Size(0)); // special case
  265. EXPECT_EQ(1u, getULEB128Size(0x1ULL));
  266. EXPECT_EQ(1u, getULEB128Size(0x40ULL));
  267. EXPECT_EQ(1u, getULEB128Size(0x7fULL));
  268. EXPECT_EQ(2u, getULEB128Size(0x80ULL));
  269. EXPECT_EQ(2u, getULEB128Size(0x2000ULL));
  270. EXPECT_EQ(2u, getULEB128Size(0x3fffULL));
  271. EXPECT_EQ(3u, getULEB128Size(0x4000ULL));
  272. EXPECT_EQ(3u, getULEB128Size(0x100000ULL));
  273. EXPECT_EQ(3u, getULEB128Size(0x1fffffULL));
  274. EXPECT_EQ(4u, getULEB128Size(0x200000ULL));
  275. EXPECT_EQ(4u, getULEB128Size(0x8000000ULL));
  276. EXPECT_EQ(4u, getULEB128Size(0xfffffffULL));
  277. EXPECT_EQ(5u, getULEB128Size(0x10000000ULL));
  278. EXPECT_EQ(5u, getULEB128Size(0x400000000ULL));
  279. EXPECT_EQ(5u, getULEB128Size(0x7ffffffffULL));
  280. EXPECT_EQ(6u, getULEB128Size(0x800000000ULL));
  281. EXPECT_EQ(6u, getULEB128Size(0x20000000000ULL));
  282. EXPECT_EQ(6u, getULEB128Size(0x3ffffffffffULL));
  283. EXPECT_EQ(7u, getULEB128Size(0x40000000000ULL));
  284. EXPECT_EQ(7u, getULEB128Size(0x1000000000000ULL));
  285. EXPECT_EQ(7u, getULEB128Size(0x1ffffffffffffULL));
  286. EXPECT_EQ(8u, getULEB128Size(0x2000000000000ULL));
  287. EXPECT_EQ(8u, getULEB128Size(0x80000000000000ULL));
  288. EXPECT_EQ(8u, getULEB128Size(0xffffffffffffffULL));
  289. EXPECT_EQ(9u, getULEB128Size(0x100000000000000ULL));
  290. EXPECT_EQ(9u, getULEB128Size(0x4000000000000000ULL));
  291. EXPECT_EQ(9u, getULEB128Size(0x7fffffffffffffffULL));
  292. EXPECT_EQ(10u, getULEB128Size(0x8000000000000000ULL));
  293. EXPECT_EQ(10u, getULEB128Size(UINT64_MAX));
  294. }
  295. } // anonymous namespace