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