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