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

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

Issue 932953002: Fix the NaCl bitstream reader to report fatal errors. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Merge with master Created 5 years, 9 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/NaClAbbrevErrorTests.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
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
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 // Note: 100 is a bad value index in next line. 48 // Note: 100 is a bad value index in next line.
49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, 49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator,
50 3, naclbitc::FUNC_CODE_INST_RET, Terminator, 50 3, naclbitc::FUNC_CODE_INST_RET, Terminator,
51 0, naclbitc::BLK_CODE_EXIT, Terminator, 51 0, naclbitc::BLK_CODE_EXIT, Terminator,
52 0, naclbitc::BLK_CODE_EXIT, Terminator 52 0, naclbitc::BLK_CODE_EXIT, Terminator
53 }; 53 };
54 54
55 // Show text of base input. 55 // Show text of base input.
56 NaClObjDumpMunger DumpMunger(BitcodeRecords, 56 NaClObjDumpMunger DumpMunger(BitcodeRecords,
57 array_lengthof(BitcodeRecords), Terminator); 57 array_lengthof(BitcodeRecords), Terminator);
58 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistant call arg")); 58 EXPECT_FALSE(DumpMunger.runTest("Nonexistant call arg"));
59 EXPECT_EQ( 59 EXPECT_EQ(
60 "module { // BlockID = 8\n" 60 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
61 " types { // BlockID = 17\n" 61 "88, 69)\n"
62 " count 3;\n" 62 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
63 " @t0 = i32;\n" 63 " | 0> |\n"
64 " @t1 = void;\n" 64 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
65 " @t2 = void (i32, i32);\n" 65 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
66 " }\n" 66 " 32:0| 3: <1, 3> | count 3;\n"
67 " declare external void @f0(i32, i32);\n" 67 " 34:4| 3: <7, 32> | @t0 = i32;\n"
68 " define external void @f1(i32, i32);\n" 68 " 37:6| 3: <2> | @t1 = void;\n"
69 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" 69 " 39:4| 3: <21, 0, 1, 0, 0> | @t2 = void (i32, i32);\n"
70 " blocks 1;\n" 70 " 44:2| 0: <65534> | }\n"
71 " %b0:\n" 71 " 48:0| 3: <8, 2, 0, 1, 0> | declare external void @f0(i32"
72 " call void @f0(i32 %p0, i32 @f0);\n" 72 ", i32);\n"
73 " 52:6| 3: <8, 2, 0, 0, 0> | define external void @f1(i32,"
74 " i32);\n"
75 " 57:4| 1: <65535, 12, 2> | function void @f1(i32 %p0, "
76 "i32 %p1) {\n"
77 " | | // BlockID "
78 "= 12\n"
79 " 64:0| 3: <1, 1> | blocks 1;\n"
80 " | | %b0:\n"
81 " 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 %p0, i32"
82 " @f0);\n"
73 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" 83 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n"
74 " ret void;\n" 84 " 72:6| 3: <10> | ret void;\n"
75 " }\n" 85 " 74:4| 0: <65534> | }\n"
76 "}\n", 86 " 76:0|0: <65534> |}\n",
77 DumpMunger.getTestResults()); 87 DumpMunger.getTestResults());
78 88
79 NaClParseBitcodeMunger Munger(BitcodeRecords, 89 NaClParseBitcodeMunger Munger(BitcodeRecords,
80 array_lengthof(BitcodeRecords), Terminator); 90 array_lengthof(BitcodeRecords), Terminator);
81 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); 91 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true));
82 EXPECT_EQ( 92 EXPECT_EQ(
83 "Error: (56:6) Invalid call argument: Index 1\n" 93 "Error: (72:6) Invalid call argument: Index 1\n"
84 "Error: Invalid value in record\n", 94 "Error: Invalid value in record\n",
85 Munger.getTestResults()); 95 Munger.getTestResults());
86 } 96 }
87 97
88 /// Test how we recognize alignments in alloca instructions. 98 /// Test how we recognize alignments in alloca instructions.
89 TEST(NaClParseInstsTests, BadAllocaAlignment) { 99 TEST(NaClParseInstsTests, BadAllocaAlignment) {
90 const uint64_t BitcodeRecords[] = { 100 const uint64_t BitcodeRecords[] = {
91 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 101 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
92 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 102 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
93 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, 103 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator,
94 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 104 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
95 3, naclbitc::TYPE_CODE_VOID, Terminator, 105 3, naclbitc::TYPE_CODE_VOID, Terminator,
96 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, 106 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator,
97 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, 107 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator,
98 0, naclbitc::BLK_CODE_EXIT, Terminator, 108 0, naclbitc::BLK_CODE_EXIT, Terminator,
99 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 109 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
100 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 110 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
101 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 111 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
102 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, 112 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator,
103 3, naclbitc::FUNC_CODE_INST_RET, Terminator, 113 3, naclbitc::FUNC_CODE_INST_RET, Terminator,
104 0, naclbitc::BLK_CODE_EXIT, Terminator, 114 0, naclbitc::BLK_CODE_EXIT, Terminator,
105 0, naclbitc::BLK_CODE_EXIT, Terminator 115 0, naclbitc::BLK_CODE_EXIT, Terminator
106 }; 116 };
107 117
108 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA 118 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA
109 119
110 // Show text when alignment is 1. 120 // Show text when alignment is 1.
111 NaClObjDumpMunger DumpMunger(BitcodeRecords, 121 NaClObjDumpMunger DumpMunger(BitcodeRecords,
112 array_lengthof(BitcodeRecords), Terminator); 122 array_lengthof(BitcodeRecords), Terminator);
113 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadAllocaAlignment")); 123 EXPECT_TRUE(DumpMunger.runTest("BadAllocaAlignment"));
114 EXPECT_EQ( 124 EXPECT_EQ(
115 "module { // BlockID = 8\n" 125 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
116 " types { // BlockID = 17\n" 126 "88, 69)\n"
117 " count 4;\n" 127 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
118 " @t0 = i32;\n" 128 " | 0> |\n"
119 " @t1 = void;\n" 129 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
120 " @t2 = void (i32);\n" 130 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
121 " @t3 = i8;\n" 131 " 32:0| 3: <1, 4> | count 4;\n"
122 " }\n" 132 " 34:4| 3: <7, 32> | @t0 = i32;\n"
123 " define external void @f0(i32);\n" 133 " 37:6| 3: <2> | @t1 = void;\n"
124 " function void @f0(i32 %p0) { // BlockID = 12\n" 134 " 39:4| 3: <21, 0, 1, 0> | @t2 = void (i32);\n"
125 " blocks 1;\n" 135 " 43:4| 3: <7, 8> | @t3 = i8;\n"
126 " %b0:\n" 136 " 46:0| 0: <65534> | }\n"
127 " %v0 = alloca i8, i32 %p0, align 1;\n" 137 " 48:0| 3: <8, 2, 0, 0, 0> | define external void @f0(i32"
128 " ret void;\n" 138 ");\n"
129 " }\n" 139 " 52:6| 1: <65535, 12, 2> | function void @f0(i32 %p0) {"
130 "}\n", 140 " \n"
141 " | | // BlockID "
142 "= 12\n"
143 " 60:0| 3: <1, 1> | blocks 1;\n"
144 " | | %b0:\n"
145 " 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 %p0, "
146 "align 1;\n"
147 " 65:6| 3: <10> | ret void;\n"
148 " 67:4| 0: <65534> | }\n"
149 " 68:0|0: <65534> |}\n",
131 DumpMunger.getTestResults()); 150 DumpMunger.getTestResults());
132 NaClParseBitcodeMunger Munger(BitcodeRecords, 151 NaClParseBitcodeMunger Munger(BitcodeRecords,
133 array_lengthof(BitcodeRecords), Terminator); 152 array_lengthof(BitcodeRecords), Terminator);
134 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true)); 153 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true));
135 154
136 // Show what happens when changing alignment to 0. 155 // Show what happens when changing alignment to 0.
137 const uint64_t Align0[] = { 156 const uint64_t Align0[] = {
138 ReplaceIndex, NaClBitcodeMunger::Replace, 157 ReplaceIndex, NaClBitcodeMunger::Replace,
139 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, 158 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator,
140 }; 159 };
141 EXPECT_TRUE(Munger.runTest( 160 EXPECT_TRUE(Munger.runTest(
142 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true)); 161 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true));
143 EXPECT_TRUE(DumpMunger.runTestForAssembly( 162 EXPECT_TRUE(DumpMunger.runTestForAssembly(
144 "BadAllocaAlignment-0", Align0, array_lengthof(Align0))); 163 "BadAllocaAlignment-0", Align0, array_lengthof(Align0)));
145 EXPECT_EQ( 164 EXPECT_EQ(
146 " %v0 = alloca i8, i32 %p0, align 0;\n", 165 " %v0 = alloca i8, i32 %p0, align 0;\n",
147 DumpMunger.getLinesWithSubstring("alloca")); 166 DumpMunger.getLinesWithSubstring("alloca"));
148 167
149 // Show what happens when changing alignment to 2**30. 168 // Show what happens when changing alignment to 2**30.
150 const uint64_t Align30[] = { 169 const uint64_t Align30[] = {
151 ReplaceIndex, NaClBitcodeMunger::Replace, 170 ReplaceIndex, NaClBitcodeMunger::Replace,
152 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, 171 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator,
153 }; 172 };
154 EXPECT_FALSE(Munger.runTest( 173 EXPECT_FALSE(Munger.runTest(
155 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true)); 174 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true));
156 EXPECT_EQ( 175 EXPECT_EQ(
157 "Error: (49:6) Alignment can't be greater than 2**29. Found: 2**30\n" 176 "Error: (65:6) Alignment can't be greater than 2**29. Found: 2**30\n"
158 "Error: Invalid value in record\n", 177 "Error: Invalid value in record\n",
159 Munger.getTestResults()); 178 Munger.getTestResults());
160 EXPECT_FALSE(DumpMunger.runTestForAssembly( 179 EXPECT_FALSE(DumpMunger.runTestForAssembly(
161 "BadAllocaAlignment-30", Align30, array_lengthof(Align30))); 180 "BadAllocaAlignment-30", Align30, array_lengthof(Align30)));
162 EXPECT_EQ( 181 EXPECT_EQ(
163 " %v0 = alloca i8, i32 %p0, align 0;\n", 182 " %v0 = alloca i8, i32 %p0, align 0;\n",
164 DumpMunger.getLinesWithSubstring("alloca")); 183 DumpMunger.getLinesWithSubstring("alloca"));
165 EXPECT_EQ( 184 EXPECT_EQ(
166 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", 185 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n",
167 DumpMunger.getLinesWithSubstring("Error")); 186 DumpMunger.getLinesWithSubstring("Error"));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, 218 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
200 0, naclbitc::BLK_CODE_EXIT, Terminator, 219 0, naclbitc::BLK_CODE_EXIT, Terminator,
201 0, naclbitc::BLK_CODE_EXIT, Terminator 220 0, naclbitc::BLK_CODE_EXIT, Terminator
202 }; 221 };
203 222
204 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD 223 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD
205 224
206 // Show text when alignment is 1. 225 // Show text when alignment is 1.
207 NaClObjDumpMunger DumpMunger(BitcodeRecords, 226 NaClObjDumpMunger DumpMunger(BitcodeRecords,
208 array_lengthof(BitcodeRecords), Terminator); 227 array_lengthof(BitcodeRecords), Terminator);
209 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadLoadAlignment-1")); 228 EXPECT_TRUE(DumpMunger.runTest("BadLoadAlignment-1"));
210 EXPECT_EQ( 229 EXPECT_EQ(
211 "module { // BlockID = 8\n" 230 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
212 " types { // BlockID = 17\n" 231 "88, 69)\n"
213 " count 2;\n" 232 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
214 " @t0 = i32;\n" 233 " | 0> |\n"
215 " @t1 = i32 (i32);\n" 234 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
216 " }\n" 235 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
217 " define external i32 @f0(i32);\n" 236 " 32:0| 3: <1, 2> | count 2;\n"
218 " function i32 @f0(i32 %p0) { // BlockID = 12\n" 237 " 34:4| 3: <7, 32> | @t0 = i32;\n"
219 " blocks 1;\n" 238 " 37:6| 3: <21, 0, 0, 0> | @t1 = i32 (i32);\n"
220 " %b0:\n" 239 " 41:6| 0: <65534> | }\n"
221 " %v0 = load i32* %p0, align 1;\n" 240 " 44:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32"
222 " ret i32 %v0;\n" 241 ");\n"
223 " }\n" 242 " 48:6| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {"
224 "}\n", 243 " \n"
244 " | | // BlockID "
245 "= 12\n"
246 " 56:0| 3: <1, 1> | blocks 1;\n"
247 " | | %b0:\n"
248 " 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, "
249 "align 1;\n"
250 " 62:4| 3: <10, 1> | ret i32 %v0;\n"
251 " 65:0| 0: <65534> | }\n"
252 " 68:0|0: <65534> |}\n",
225 DumpMunger.getTestResults()); 253 DumpMunger.getTestResults());
226 NaClParseBitcodeMunger Munger(BitcodeRecords, 254 NaClParseBitcodeMunger Munger(BitcodeRecords,
227 array_lengthof(BitcodeRecords), Terminator); 255 array_lengthof(BitcodeRecords), Terminator);
228 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true)); 256 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true));
229 257
230 // Show what happens when changing alignment to 0. 258 // Show what happens when changing alignment to 0.
231 const uint64_t Align0[] = { 259 const uint64_t Align0[] = {
232 ReplaceIndex, NaClBitcodeMunger::Replace, 260 ReplaceIndex, NaClBitcodeMunger::Replace,
233 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, 261 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator,
234 }; 262 };
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 DumpMunger.getLinesWithSubstring("load")); 302 DumpMunger.getLinesWithSubstring("load"));
275 303
276 // Show what happens when changing alignment to 2**30. 304 // Show what happens when changing alignment to 2**30.
277 const uint64_t Align30[] = { 305 const uint64_t Align30[] = {
278 ReplaceIndex, NaClBitcodeMunger::Replace, 306 ReplaceIndex, NaClBitcodeMunger::Replace,
279 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, 307 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator,
280 }; 308 };
281 EXPECT_FALSE(Munger.runTest( 309 EXPECT_FALSE(Munger.runTest(
282 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true)); 310 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true));
283 EXPECT_EQ( 311 EXPECT_EQ(
284 "Error: (46:4) Alignment can't be greater than 2**29. Found: 2**30\n" 312 "Error: (62:4) Alignment can't be greater than 2**29. Found: 2**30\n"
285 "Error: Invalid value in record\n", 313 "Error: Invalid value in record\n",
286 Munger.getTestResults()); 314 Munger.getTestResults());
287 EXPECT_FALSE(DumpMunger.runTestForAssembly( 315 EXPECT_FALSE(DumpMunger.runTestForAssembly(
288 "BadLoadAlignment-30", Align30, array_lengthof(Align30))); 316 "BadLoadAlignment-30", Align30, array_lengthof(Align30)));
289 EXPECT_EQ( 317 EXPECT_EQ(
290 " %v0 = load i32* %p0, align 0;\n" 318 " %v0 = load i32* %p0, align 0;\n"
291 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 319 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
292 DumpMunger.getLinesWithSubstring("load")); 320 DumpMunger.getLinesWithSubstring("load"));
293 } 321 }
294 322
(...skipping 14 matching lines...) Expand all
309 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, 337 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
310 0, naclbitc::BLK_CODE_EXIT, Terminator, 338 0, naclbitc::BLK_CODE_EXIT, Terminator,
311 0, naclbitc::BLK_CODE_EXIT, Terminator 339 0, naclbitc::BLK_CODE_EXIT, Terminator
312 }; 340 };
313 341
314 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE 342 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE
315 343
316 // Show text when alignment is 1. 344 // Show text when alignment is 1.
317 NaClObjDumpMunger DumpMunger(BitcodeRecords, 345 NaClObjDumpMunger DumpMunger(BitcodeRecords,
318 array_lengthof(BitcodeRecords), Terminator); 346 array_lengthof(BitcodeRecords), Terminator);
319 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadStoreAlignment")); 347 EXPECT_TRUE(DumpMunger.runTest("BadStoreAlignment"));
320 EXPECT_EQ( 348 EXPECT_EQ(
321 "module { // BlockID = 8\n" 349 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
322 " types { // BlockID = 17\n" 350 "88, 69)\n"
323 " count 3;\n" 351 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
324 " @t0 = float;\n" 352 " | 0> |\n"
325 " @t1 = i32;\n" 353 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
326 " @t2 = float (i32, float);\n" 354 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
327 " }\n" 355 " 32:0| 3: <1, 3> | count 3;\n"
328 " define external float @f0(i32, float);\n" 356 " 34:4| 3: <3> | @t0 = float;\n"
329 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" 357 " 36:2| 3: <7, 32> | @t1 = i32;\n"
330 " blocks 1;\n" 358 " 39:4| 3: <21, 0, 0, 1, 0> | @t2 = float (i32, float);\n"
331 " %b0:\n" 359 " 44:2| 0: <65534> | }\n"
332 " store float %p1, float* %p0, align 1;\n" 360 " 48:0| 3: <8, 2, 0, 0, 0> | define external \n"
333 " ret float %p1;\n" 361 " | | float @f0(i32, float);\n"
334 " }\n" 362 " 52:6| 1: <65535, 12, 2> | function \n"
335 "}\n", 363 " | | float @f0(i32 %p0, float "
364 "%p1) { \n"
365 " | | // BlockID "
366 "= 12\n"
367 " 60:0| 3: <1, 1> | blocks 1;\n"
368 " | | %b0:\n"
369 " 62:4| 3: <24, 2, 1, 1> | store float %p1, float* "
370 "%p0, \n"
371 " | | align 1;\n"
372 " 66:4| 3: <10, 1> | ret float %p1;\n"
373 " 69:0| 0: <65534> | }\n"
374 " 72:0|0: <65534> |}\n",
336 DumpMunger.getTestResults()); 375 DumpMunger.getTestResults());
337 NaClParseBitcodeMunger Munger(BitcodeRecords, 376 NaClParseBitcodeMunger Munger(BitcodeRecords,
338 array_lengthof(BitcodeRecords), Terminator); 377 array_lengthof(BitcodeRecords), Terminator);
339 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true)); 378 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true));
340 379
341 // Show what happens when changing alignment to 0. 380 // Show what happens when changing alignment to 0.
342 const uint64_t Align0[] = { 381 const uint64_t Align0[] = {
343 ReplaceIndex, NaClBitcodeMunger::Replace, 382 ReplaceIndex, NaClBitcodeMunger::Replace,
344 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator,
345 }; 384 };
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 DumpMunger.getLinesWithSubstring("store")); 434 DumpMunger.getLinesWithSubstring("store"));
396 435
397 // Show what happens when changing alignment to 2**30. 436 // Show what happens when changing alignment to 2**30.
398 const uint64_t Align30[] = { 437 const uint64_t Align30[] = {
399 ReplaceIndex, NaClBitcodeMunger::Replace, 438 ReplaceIndex, NaClBitcodeMunger::Replace,
400 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, 439 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator,
401 }; 440 };
402 EXPECT_FALSE(Munger.runTest( 441 EXPECT_FALSE(Munger.runTest(
403 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true)); 442 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true));
404 EXPECT_EQ( 443 EXPECT_EQ(
405 "Error: (50:4) Alignment can't be greater than 2**29. Found: 2**30\n" 444 "Error: (66:4) Alignment can't be greater than 2**29. Found: 2**30\n"
406 "Error: Invalid value in record\n", 445 "Error: Invalid value in record\n",
407 Munger.getTestResults()); 446 Munger.getTestResults());
408 EXPECT_FALSE(DumpMunger.runTestForAssembly( 447 EXPECT_FALSE(DumpMunger.runTestForAssembly(
409 "BadStoreAlignment-30", Align30, array_lengthof(Align30))); 448 "BadStoreAlignment-30", Align30, array_lengthof(Align30)));
410 EXPECT_EQ( 449 EXPECT_EQ(
411 " store float %p1, float* %p0, align 0;\n" 450 " store float %p1, float* %p0, align 0;\n"
412 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 451 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
413 DumpMunger.getLinesWithSubstring("store")); 452 DumpMunger.getLinesWithSubstring("store"));
414 } 453 }
415 454
416 } // end of anonamous namespace. 455 } // end of anonamous namespace.
OLDNEW
« no previous file with comments | « unittests/Bitcode/NaClAbbrevErrorTests.cpp ('k') | unittests/Bitcode/NaClParseTypesTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698