Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: unittests/Bitcode/NaClParseInstsTest.cpp

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « unittests/Bitcode/NaClObjDumpTypesTest.cpp ('k') | unittests/Bitcode/NaClParseTypesTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 //===- llvm/unittest/Bitcode/NaClParseInstsTest.cpp ----------------------===//
2 // Tests parser for PNaCl bitcode instructions.
3 //
4 // The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 // Tests record errors in the function block when parsing PNaCl bitcode.
12
13 // TODO(kschimpf) Add more tests.
14
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/Bitcode/NaCl/NaClBitcodeMunge.h"
17 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h"
18 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h"
19
20 #include "gtest/gtest.h"
21
22 using namespace llvm;
23
24 namespace {
25
26 static const uint64_t Terminator = 0x5768798008978675LL;
27
28 // Note: alignment stored as 0 or log2(Alignment)+1.
29 uint64_t getEncAlignPower(unsigned Power) {
30 return Power + 1;
31 }
32 uint64_t getEncAlignZero() { return 0; }
33
34 /// Test how we report a call arg that refers to nonexistent call argument
35 TEST(NaClParseInstsTest, NonexistantCallArg) {
36 const uint64_t BitcodeRecords[] = {
37 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
38 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
39 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator,
40 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
41 3, naclbitc::TYPE_CODE_VOID, Terminator,
42 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator,
43 0, naclbitc::BLK_CODE_EXIT, Terminator,
44 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator,
45 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
46 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
47 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
48 // Note: 100 is a bad value index in next line.
49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator,
50 3, naclbitc::FUNC_CODE_INST_RET, Terminator,
51 0, naclbitc::BLK_CODE_EXIT, Terminator,
52 0, naclbitc::BLK_CODE_EXIT, Terminator
53 };
54
55 // Show text of base input.
56 NaClObjDumpMunger DumpMunger(BitcodeRecords,
57 array_lengthof(BitcodeRecords), Terminator);
58 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistant call arg"));
59 EXPECT_EQ(
60 "module { // BlockID = 8\n"
61 " types { // BlockID = 17\n"
62 " count 3;\n"
63 " @t0 = i32;\n"
64 " @t1 = void;\n"
65 " @t2 = void (i32, i32);\n"
66 " }\n"
67 " declare external void @f0(i32, i32);\n"
68 " define external void @f1(i32, i32);\n"
69 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n"
70 " blocks 1;\n"
71 " %b0:\n"
72 " call void @f0(i32 %p0, i32 @f0);\n"
73 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n"
74 " ret void;\n"
75 " }\n"
76 "}\n",
77 DumpMunger.getTestResults());
78
79 NaClParseBitcodeMunger Munger(BitcodeRecords,
80 array_lengthof(BitcodeRecords), Terminator);
81 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true));
82 EXPECT_EQ(
83 "Error: (56:6) Invalid call argument: Index 1\n"
84 "Error: Invalid value in record\n",
85 Munger.getTestResults());
86 }
87
88 /// Test how we recognize alignments in alloca instructions.
89 TEST(NaClParseInstsTests, BadAllocaAlignment) {
90 const uint64_t BitcodeRecords[] = {
91 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
92 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
93 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator,
94 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
95 3, naclbitc::TYPE_CODE_VOID, Terminator,
96 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator,
97 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator,
98 0, naclbitc::BLK_CODE_EXIT, Terminator,
99 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
100 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
101 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
102 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator,
103 3, naclbitc::FUNC_CODE_INST_RET, Terminator,
104 0, naclbitc::BLK_CODE_EXIT, Terminator,
105 0, naclbitc::BLK_CODE_EXIT, Terminator
106 };
107
108 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA
109
110 // Show text when alignment is 1.
111 NaClObjDumpMunger DumpMunger(BitcodeRecords,
112 array_lengthof(BitcodeRecords), Terminator);
113 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadAllocaAlignment"));
114 EXPECT_EQ(
115 "module { // BlockID = 8\n"
116 " types { // BlockID = 17\n"
117 " count 4;\n"
118 " @t0 = i32;\n"
119 " @t1 = void;\n"
120 " @t2 = void (i32);\n"
121 " @t3 = i8;\n"
122 " }\n"
123 " define external void @f0(i32);\n"
124 " function void @f0(i32 %p0) { // BlockID = 12\n"
125 " blocks 1;\n"
126 " %b0:\n"
127 " %v0 = alloca i8, i32 %p0, align 1;\n"
128 " ret void;\n"
129 " }\n"
130 "}\n",
131 DumpMunger.getTestResults());
132 NaClParseBitcodeMunger Munger(BitcodeRecords,
133 array_lengthof(BitcodeRecords), Terminator);
134 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true));
135
136 // Show what happens when changing alignment to 0.
137 const uint64_t Align0[] = {
138 ReplaceIndex, NaClBitcodeMunger::Replace,
139 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator,
140 };
141 EXPECT_TRUE(Munger.runTest(
142 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true));
143 EXPECT_TRUE(DumpMunger.runTestForAssembly(
144 "BadAllocaAlignment-0", Align0, array_lengthof(Align0)));
145 EXPECT_EQ(
146 " %v0 = alloca i8, i32 %p0, align 0;\n",
147 DumpMunger.getLinesWithSubstring("alloca"));
148
149 // Show what happens when changing alignment to 2**30.
150 const uint64_t Align30[] = {
151 ReplaceIndex, NaClBitcodeMunger::Replace,
152 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator,
153 };
154 EXPECT_FALSE(Munger.runTest(
155 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true));
156 EXPECT_EQ(
157 "Error: (49:6) Alignment can't be greater than 2**29. Found: 2**30\n"
158 "Error: Invalid value in record\n",
159 Munger.getTestResults());
160 EXPECT_FALSE(DumpMunger.runTestForAssembly(
161 "BadAllocaAlignment-30", Align30, array_lengthof(Align30)));
162 EXPECT_EQ(
163 " %v0 = alloca i8, i32 %p0, align 0;\n",
164 DumpMunger.getLinesWithSubstring("alloca"));
165 EXPECT_EQ(
166 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n",
167 DumpMunger.getLinesWithSubstring("Error"));
168
169 // Show what happens when changing alignment to 2**29.
170 const uint64_t Align29[] = {
171 ReplaceIndex, NaClBitcodeMunger::Replace,
172 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator,
173 };
174 EXPECT_TRUE(Munger.runTest(
175 "BadAllocaAlignment-29", Align29, array_lengthof(Align29), true));
176 EXPECT_EQ(
177 "Successful parse!\n",
178 Munger.getTestResults());
179 EXPECT_TRUE(DumpMunger.runTestForAssembly(
180 "BadAllocaAlignment-29", Align29, array_lengthof(Align29)));
181 EXPECT_EQ(
182 " %v0 = alloca i8, i32 %p0, align 536870912;\n",
183 DumpMunger.getLinesWithSubstring("alloca"));
184 }
185
186 // Test how we recognize alignments in load instructions.
187 TEST(NaClParseInstsTests, BadLoadAlignment) {
188 const uint64_t BitcodeRecords[] = {
189 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
190 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
191 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator,
192 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
193 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator,
194 0, naclbitc::BLK_CODE_EXIT, Terminator,
195 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator,
196 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
197 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
198 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator,
199 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
200 0, naclbitc::BLK_CODE_EXIT, Terminator,
201 0, naclbitc::BLK_CODE_EXIT, Terminator
202 };
203
204 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD
205
206 // Show text when alignment is 1.
207 NaClObjDumpMunger DumpMunger(BitcodeRecords,
208 array_lengthof(BitcodeRecords), Terminator);
209 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadLoadAlignment-1"));
210 EXPECT_EQ(
211 "module { // BlockID = 8\n"
212 " types { // BlockID = 17\n"
213 " count 2;\n"
214 " @t0 = i32;\n"
215 " @t1 = i32 (i32);\n"
216 " }\n"
217 " define external i32 @f0(i32);\n"
218 " function i32 @f0(i32 %p0) { // BlockID = 12\n"
219 " blocks 1;\n"
220 " %b0:\n"
221 " %v0 = load i32* %p0, align 1;\n"
222 " ret i32 %v0;\n"
223 " }\n"
224 "}\n",
225 DumpMunger.getTestResults());
226 NaClParseBitcodeMunger Munger(BitcodeRecords,
227 array_lengthof(BitcodeRecords), Terminator);
228 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true));
229
230 // Show what happens when changing alignment to 0.
231 const uint64_t Align0[] = {
232 ReplaceIndex, NaClBitcodeMunger::Replace,
233 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator,
234 };
235 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl
236 // bitcode reader). It is checked later by the PNaCl ABI checker in
237 // pnacl-llc. On the other hand, the DumpMunger checks alignment for
238 // loads while parsing.
239 EXPECT_TRUE(Munger.runTest(
240 "BadLoadAlignment-0", Align0, array_lengthof(Align0), true));
241 EXPECT_FALSE(DumpMunger.runTestForAssembly(
242 "BadLoadAlignment-0", Align0, array_lengthof(Align0)));
243 EXPECT_EQ(
244 " %v0 = load i32* %p0, align 0;\n"
245 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
246 DumpMunger.getLinesWithSubstring("load"));
247
248 // Show what happens when changing alignment to 4.
249 const uint64_t Align4[] = {
250 ReplaceIndex, NaClBitcodeMunger::Replace,
251 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator,
252 };
253 EXPECT_TRUE(Munger.runTest(
254 "BadLoadAlignment-4", Align4, array_lengthof(Align4), true));
255 EXPECT_FALSE(DumpMunger.runTestForAssembly(
256 "BadLoadAlignment-4", Align4, array_lengthof(Align4)));
257 EXPECT_EQ(
258 " %v0 = load i32* %p0, align 4;\n"
259 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
260 DumpMunger.getLinesWithSubstring("load"));
261
262 // Show what happens when changing alignment to 2**29.
263 const uint64_t Align29[] = {
264 ReplaceIndex, NaClBitcodeMunger::Replace,
265 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator,
266 };
267 EXPECT_TRUE(Munger.runTest(
268 "BadLoadAlignment-29", Align29, array_lengthof(Align29), true));
269 EXPECT_FALSE(DumpMunger.runTestForAssembly(
270 "BadLoadAlignment-29", Align29, array_lengthof(Align29)));
271 EXPECT_EQ(
272 " %v0 = load i32* %p0, align 536870912;\n"
273 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
274 DumpMunger.getLinesWithSubstring("load"));
275
276 // Show what happens when changing alignment to 2**30.
277 const uint64_t Align30[] = {
278 ReplaceIndex, NaClBitcodeMunger::Replace,
279 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator,
280 };
281 EXPECT_FALSE(Munger.runTest(
282 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true));
283 EXPECT_EQ(
284 "Error: (46:4) Alignment can't be greater than 2**29. Found: 2**30\n"
285 "Error: Invalid value in record\n",
286 Munger.getTestResults());
287 EXPECT_FALSE(DumpMunger.runTestForAssembly(
288 "BadLoadAlignment-30", Align30, array_lengthof(Align30)));
289 EXPECT_EQ(
290 " %v0 = load i32* %p0, align 0;\n"
291 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
292 DumpMunger.getLinesWithSubstring("load"));
293 }
294
295 // Test how we recognize alignments in store instructions.
296 TEST(NaClParseInstsTests, BadStoreAlignment) {
297 const uint64_t BitcodeRecords[] = {
298 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
299 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
300 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator,
301 3, naclbitc::TYPE_CODE_FLOAT, Terminator,
302 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
303 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator,
304 0, naclbitc::BLK_CODE_EXIT, Terminator,
305 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
306 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
307 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
308 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator,
309 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
310 0, naclbitc::BLK_CODE_EXIT, Terminator,
311 0, naclbitc::BLK_CODE_EXIT, Terminator
312 };
313
314 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE
315
316 // Show text when alignment is 1.
317 NaClObjDumpMunger DumpMunger(BitcodeRecords,
318 array_lengthof(BitcodeRecords), Terminator);
319 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadStoreAlignment"));
320 EXPECT_EQ(
321 "module { // BlockID = 8\n"
322 " types { // BlockID = 17\n"
323 " count 3;\n"
324 " @t0 = float;\n"
325 " @t1 = i32;\n"
326 " @t2 = float (i32, float);\n"
327 " }\n"
328 " define external float @f0(i32, float);\n"
329 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n"
330 " blocks 1;\n"
331 " %b0:\n"
332 " store float %p1, float* %p0, align 1;\n"
333 " ret float %p1;\n"
334 " }\n"
335 "}\n",
336 DumpMunger.getTestResults());
337 NaClParseBitcodeMunger Munger(BitcodeRecords,
338 array_lengthof(BitcodeRecords), Terminator);
339 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true));
340
341 // Show what happens when changing alignment to 0.
342 const uint64_t Align0[] = {
343 ReplaceIndex, NaClBitcodeMunger::Replace,
344 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator,
345 };
346 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl
347 // bitcode reader). It is checked later by the PNaCl ABI checker in
348 // pnacl-llc. On the other hand, the DumpMunger checks alignment for
349 // stores while parsing.
350 EXPECT_TRUE(Munger.runTest(
351 "BadStoreAlignment-0", Align0, array_lengthof(Align0), true));
352 EXPECT_FALSE(DumpMunger.runTestForAssembly(
353 "BadStoreAlignment-0", Align0, array_lengthof(Align0)));
354 EXPECT_EQ(
355 " store float %p1, float* %p0, align 0;\n"
356 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
357 DumpMunger.getLinesWithSubstring("store"));
358
359 // Show what happens when changing alignment to 4.
360 const uint64_t Align4[] = {
361 ReplaceIndex, NaClBitcodeMunger::Replace,
362 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator,
363 };
364 EXPECT_TRUE(Munger.runTest(
365 "BadStoreAlignment-4", Align4, array_lengthof(Align4), true));
366 EXPECT_TRUE(DumpMunger.runTestForAssembly(
367 "BadStoreAlignment-4", Align4, array_lengthof(Align4)));
368
369 // Show what happens when changing alignment to 8.
370 const uint64_t Align8[] = {
371 ReplaceIndex, NaClBitcodeMunger::Replace,
372 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator,
373 };
374 EXPECT_TRUE(Munger.runTest(
375 "BadStoreAlignment-8", Align8, array_lengthof(Align8), true));
376 EXPECT_FALSE(DumpMunger.runTestForAssembly(
377 "BadStoreAlignment-8", Align8, array_lengthof(Align8)));
378 EXPECT_EQ(
379 " store float %p1, float* %p0, align 8;\n"
380 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
381 DumpMunger.getLinesWithSubstring("store"));
382
383 // Show what happens when changing alignment to 2**29.
384 const uint64_t Align29[] = {
385 ReplaceIndex, NaClBitcodeMunger::Replace,
386 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator,
387 };
388 EXPECT_TRUE(Munger.runTest(
389 "BadStoreAlignment-29", Align29, array_lengthof(Align29), true));
390 EXPECT_FALSE(DumpMunger.runTestForAssembly(
391 "BadStoreAlignment-29", Align29, array_lengthof(Align29)));
392 EXPECT_EQ(
393 " store float %p1, float* %p0, align 536870912;\n"
394 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
395 DumpMunger.getLinesWithSubstring("store"));
396
397 // Show what happens when changing alignment to 2**30.
398 const uint64_t Align30[] = {
399 ReplaceIndex, NaClBitcodeMunger::Replace,
400 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator,
401 };
402 EXPECT_FALSE(Munger.runTest(
403 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true));
404 EXPECT_EQ(
405 "Error: (50:4) Alignment can't be greater than 2**29. Found: 2**30\n"
406 "Error: Invalid value in record\n",
407 Munger.getTestResults());
408 EXPECT_FALSE(DumpMunger.runTestForAssembly(
409 "BadStoreAlignment-30", Align30, array_lengthof(Align30)));
410 EXPECT_EQ(
411 " store float %p1, float* %p0, align 0;\n"
412 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
413 DumpMunger.getLinesWithSubstring("store"));
414 }
415
416 } // end of anonamous namespace.
OLDNEW
« no previous file with comments | « unittests/Bitcode/NaClObjDumpTypesTest.cpp ('k') | unittests/Bitcode/NaClParseTypesTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698