comparison unittests/Support/LEB128Test.cpp @ 77:54457678186b LLVM3.6

LLVM 3.6
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Mon, 08 Sep 2014 22:06:00 +0900
parents
children 60c9769439b8
comparison
equal deleted inserted replaced
34:e874dbf0ad9d 77:54457678186b
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, SLEB128Size) {
123 // Positive Value Testing Plan:
124 // (1) 128 ^ n - 1 ........ need (n+1) bytes
125 // (2) 128 ^ n ............ need (n+1) bytes
126 // (3) 128 ^ n * 63 ....... need (n+1) bytes
127 // (4) 128 ^ n * 64 - 1 ... need (n+1) bytes
128 // (5) 128 ^ n * 64 ....... need (n+2) bytes
129
130 EXPECT_EQ(1u, getSLEB128Size(0x0LL));
131 EXPECT_EQ(1u, getSLEB128Size(0x1LL));
132 EXPECT_EQ(1u, getSLEB128Size(0x3fLL));
133 EXPECT_EQ(1u, getSLEB128Size(0x3fLL));
134 EXPECT_EQ(2u, getSLEB128Size(0x40LL));
135
136 EXPECT_EQ(2u, getSLEB128Size(0x7fLL));
137 EXPECT_EQ(2u, getSLEB128Size(0x80LL));
138 EXPECT_EQ(2u, getSLEB128Size(0x1f80LL));
139 EXPECT_EQ(2u, getSLEB128Size(0x1fffLL));
140 EXPECT_EQ(3u, getSLEB128Size(0x2000LL));
141
142 EXPECT_EQ(3u, getSLEB128Size(0x3fffLL));
143 EXPECT_EQ(3u, getSLEB128Size(0x4000LL));
144 EXPECT_EQ(3u, getSLEB128Size(0xfc000LL));
145 EXPECT_EQ(3u, getSLEB128Size(0xfffffLL));
146 EXPECT_EQ(4u, getSLEB128Size(0x100000LL));
147
148 EXPECT_EQ(4u, getSLEB128Size(0x1fffffLL));
149 EXPECT_EQ(4u, getSLEB128Size(0x200000LL));
150 EXPECT_EQ(4u, getSLEB128Size(0x7e00000LL));
151 EXPECT_EQ(4u, getSLEB128Size(0x7ffffffLL));
152 EXPECT_EQ(5u, getSLEB128Size(0x8000000LL));
153
154 EXPECT_EQ(5u, getSLEB128Size(0xfffffffLL));
155 EXPECT_EQ(5u, getSLEB128Size(0x10000000LL));
156 EXPECT_EQ(5u, getSLEB128Size(0x3f0000000LL));
157 EXPECT_EQ(5u, getSLEB128Size(0x3ffffffffLL));
158 EXPECT_EQ(6u, getSLEB128Size(0x400000000LL));
159
160 EXPECT_EQ(6u, getSLEB128Size(0x7ffffffffLL));
161 EXPECT_EQ(6u, getSLEB128Size(0x800000000LL));
162 EXPECT_EQ(6u, getSLEB128Size(0x1f800000000LL));
163 EXPECT_EQ(6u, getSLEB128Size(0x1ffffffffffLL));
164 EXPECT_EQ(7u, getSLEB128Size(0x20000000000LL));
165
166 EXPECT_EQ(7u, getSLEB128Size(0x3ffffffffffLL));
167 EXPECT_EQ(7u, getSLEB128Size(0x40000000000LL));
168 EXPECT_EQ(7u, getSLEB128Size(0xfc0000000000LL));
169 EXPECT_EQ(7u, getSLEB128Size(0xffffffffffffLL));
170 EXPECT_EQ(8u, getSLEB128Size(0x1000000000000LL));
171
172 EXPECT_EQ(8u, getSLEB128Size(0x1ffffffffffffLL));
173 EXPECT_EQ(8u, getSLEB128Size(0x2000000000000LL));
174 EXPECT_EQ(8u, getSLEB128Size(0x7e000000000000LL));
175 EXPECT_EQ(8u, getSLEB128Size(0x7fffffffffffffLL));
176 EXPECT_EQ(9u, getSLEB128Size(0x80000000000000LL));
177
178 EXPECT_EQ(9u, getSLEB128Size(0xffffffffffffffLL));
179 EXPECT_EQ(9u, getSLEB128Size(0x100000000000000LL));
180 EXPECT_EQ(9u, getSLEB128Size(0x3f00000000000000LL));
181 EXPECT_EQ(9u, getSLEB128Size(0x3fffffffffffffffLL));
182 EXPECT_EQ(10u, getSLEB128Size(0x4000000000000000LL));
183
184 EXPECT_EQ(10u, getSLEB128Size(0x7fffffffffffffffLL));
185 EXPECT_EQ(10u, getSLEB128Size(INT64_MAX));
186
187 // Negative Value Testing Plan:
188 // (1) - 128 ^ n - 1 ........ need (n+1) bytes
189 // (2) - 128 ^ n ............ need (n+1) bytes
190 // (3) - 128 ^ n * 63 ....... need (n+1) bytes
191 // (4) - 128 ^ n * 64 ....... need (n+1) bytes (different from positive one)
192 // (5) - 128 ^ n * 65 - 1 ... need (n+2) bytes (if n > 0)
193 // (6) - 128 ^ n * 65 ....... need (n+2) bytes
194
195 EXPECT_EQ(1u, getSLEB128Size(0x0LL));
196 EXPECT_EQ(1u, getSLEB128Size(-0x1LL));
197 EXPECT_EQ(1u, getSLEB128Size(-0x3fLL));
198 EXPECT_EQ(1u, getSLEB128Size(-0x40LL));
199 EXPECT_EQ(1u, getSLEB128Size(-0x40LL)); // special case
200 EXPECT_EQ(2u, getSLEB128Size(-0x41LL));
201
202 EXPECT_EQ(2u, getSLEB128Size(-0x7fLL));
203 EXPECT_EQ(2u, getSLEB128Size(-0x80LL));
204 EXPECT_EQ(2u, getSLEB128Size(-0x1f80LL));
205 EXPECT_EQ(2u, getSLEB128Size(-0x2000LL));
206 EXPECT_EQ(3u, getSLEB128Size(-0x207fLL));
207 EXPECT_EQ(3u, getSLEB128Size(-0x2080LL));
208
209 EXPECT_EQ(3u, getSLEB128Size(-0x3fffLL));
210 EXPECT_EQ(3u, getSLEB128Size(-0x4000LL));
211 EXPECT_EQ(3u, getSLEB128Size(-0xfc000LL));
212 EXPECT_EQ(3u, getSLEB128Size(-0x100000LL));
213 EXPECT_EQ(4u, getSLEB128Size(-0x103fffLL));
214 EXPECT_EQ(4u, getSLEB128Size(-0x104000LL));
215
216 EXPECT_EQ(4u, getSLEB128Size(-0x1fffffLL));
217 EXPECT_EQ(4u, getSLEB128Size(-0x200000LL));
218 EXPECT_EQ(4u, getSLEB128Size(-0x7e00000LL));
219 EXPECT_EQ(4u, getSLEB128Size(-0x8000000LL));
220 EXPECT_EQ(5u, getSLEB128Size(-0x81fffffLL));
221 EXPECT_EQ(5u, getSLEB128Size(-0x8200000LL));
222
223 EXPECT_EQ(5u, getSLEB128Size(-0xfffffffLL));
224 EXPECT_EQ(5u, getSLEB128Size(-0x10000000LL));
225 EXPECT_EQ(5u, getSLEB128Size(-0x3f0000000LL));
226 EXPECT_EQ(5u, getSLEB128Size(-0x400000000LL));
227 EXPECT_EQ(6u, getSLEB128Size(-0x40fffffffLL));
228 EXPECT_EQ(6u, getSLEB128Size(-0x410000000LL));
229
230 EXPECT_EQ(6u, getSLEB128Size(-0x7ffffffffLL));
231 EXPECT_EQ(6u, getSLEB128Size(-0x800000000LL));
232 EXPECT_EQ(6u, getSLEB128Size(-0x1f800000000LL));
233 EXPECT_EQ(6u, getSLEB128Size(-0x20000000000LL));
234 EXPECT_EQ(7u, getSLEB128Size(-0x207ffffffffLL));
235 EXPECT_EQ(7u, getSLEB128Size(-0x20800000000LL));
236
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
244 EXPECT_EQ(8u, getSLEB128Size(-0x1ffffffffffffLL));
245 EXPECT_EQ(8u, getSLEB128Size(-0x2000000000000LL));
246 EXPECT_EQ(8u, getSLEB128Size(-0x7e000000000000LL));
247 EXPECT_EQ(8u, getSLEB128Size(-0x80000000000000LL));
248 EXPECT_EQ(9u, getSLEB128Size(-0x81ffffffffffffLL));
249 EXPECT_EQ(9u, getSLEB128Size(-0x82000000000000LL));
250
251 EXPECT_EQ(9u, getSLEB128Size(-0xffffffffffffffLL));
252 EXPECT_EQ(9u, getSLEB128Size(-0x100000000000000LL));
253 EXPECT_EQ(9u, getSLEB128Size(-0x3f00000000000000LL));
254 EXPECT_EQ(9u, getSLEB128Size(-0x4000000000000000LL));
255 EXPECT_EQ(10u, getSLEB128Size(-0x40ffffffffffffffLL));
256 EXPECT_EQ(10u, getSLEB128Size(-0x4100000000000000LL));
257
258 EXPECT_EQ(10u, getSLEB128Size(-0x7fffffffffffffffLL));
259 EXPECT_EQ(10u, getSLEB128Size(-0x8000000000000000LL));
260 EXPECT_EQ(10u, getSLEB128Size(INT64_MIN));
261 }
262
263 TEST(LEB128Test, ULEB128Size) {
264 // Testing Plan:
265 // (1) 128 ^ n ............ need (n+1) bytes
266 // (2) 128 ^ n * 64 ....... need (n+1) bytes
267 // (3) 128 ^ (n+1) - 1 .... need (n+1) bytes
268
269 EXPECT_EQ(1u, getULEB128Size(0)); // special case
270
271 EXPECT_EQ(1u, getULEB128Size(0x1ULL));
272 EXPECT_EQ(1u, getULEB128Size(0x40ULL));
273 EXPECT_EQ(1u, getULEB128Size(0x7fULL));
274
275 EXPECT_EQ(2u, getULEB128Size(0x80ULL));
276 EXPECT_EQ(2u, getULEB128Size(0x2000ULL));
277 EXPECT_EQ(2u, getULEB128Size(0x3fffULL));
278
279 EXPECT_EQ(3u, getULEB128Size(0x4000ULL));
280 EXPECT_EQ(3u, getULEB128Size(0x100000ULL));
281 EXPECT_EQ(3u, getULEB128Size(0x1fffffULL));
282
283 EXPECT_EQ(4u, getULEB128Size(0x200000ULL));
284 EXPECT_EQ(4u, getULEB128Size(0x8000000ULL));
285 EXPECT_EQ(4u, getULEB128Size(0xfffffffULL));
286
287 EXPECT_EQ(5u, getULEB128Size(0x10000000ULL));
288 EXPECT_EQ(5u, getULEB128Size(0x400000000ULL));
289 EXPECT_EQ(5u, getULEB128Size(0x7ffffffffULL));
290
291 EXPECT_EQ(6u, getULEB128Size(0x800000000ULL));
292 EXPECT_EQ(6u, getULEB128Size(0x20000000000ULL));
293 EXPECT_EQ(6u, getULEB128Size(0x3ffffffffffULL));
294
295 EXPECT_EQ(7u, getULEB128Size(0x40000000000ULL));
296 EXPECT_EQ(7u, getULEB128Size(0x1000000000000ULL));
297 EXPECT_EQ(7u, getULEB128Size(0x1ffffffffffffULL));
298
299 EXPECT_EQ(8u, getULEB128Size(0x2000000000000ULL));
300 EXPECT_EQ(8u, getULEB128Size(0x80000000000000ULL));
301 EXPECT_EQ(8u, getULEB128Size(0xffffffffffffffULL));
302
303 EXPECT_EQ(9u, getULEB128Size(0x100000000000000ULL));
304 EXPECT_EQ(9u, getULEB128Size(0x4000000000000000ULL));
305 EXPECT_EQ(9u, getULEB128Size(0x7fffffffffffffffULL));
306
307 EXPECT_EQ(10u, getULEB128Size(0x8000000000000000ULL));
308
309 EXPECT_EQ(10u, getULEB128Size(UINT64_MAX));
310 }
311
312 } // anonymous namespace