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

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

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

Powered by Google App Engine
This is Rietveld 408576698