LEB128Test.cpp 13 KB

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