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

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 nit and add test cases. 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
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
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: 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 /// Tests if we recognize when alignment gets too large.
jvoung (off chromium) 2014/12/16 23:24:39 nit: maybe change Alloc - >"Alloca" to be a bit mo
Karl 2014/12/17 20:52:38 Done.
83 TEST(NaClParseInstsTests, BadAllocInstAlignment) {
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 Log32_32(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 of base input.
106 NaClObjDumpMunger DumpMunger(BitcodeRecords,
107 array_lengthof(BitcodeRecords), Terminator);
108 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadAllocInstAlignment"));
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
128 NaClParseBitcodeMunger Munger(BitcodeRecords,
129 array_lengthof(BitcodeRecords), Terminator);
130 EXPECT_TRUE(Munger.runTest("BadAllocInstAlignment", true));
131 EXPECT_EQ(
132 "Successful parse!\n",
133 Munger.getTestResults());
134
135 // Show what happens when changing alignment to 30.
jvoung (off chromium) 2014/12/16 23:24:39 "to 30" -> "to 2**30" ?
Karl 2014/12/17 20:52:38 Done.
136 const uint64_t Align30[] = {
137 ReplaceIndex, NaClBitcodeMunger::Replace,
138 // Note: alignment stored as Log32_32(Alignment)+1.
jvoung (off chromium) 2014/12/16 23:24:39 I don't quite know what Log32_32 means. Do you mea
Karl 2014/12/17 20:52:38 Done.
139 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 31, Terminator,
140 };
141 EXPECT_FALSE(Munger.runTest(
142 "BadAllocInstAlignment-30", Align30, array_lengthof(Align30), true));
143 EXPECT_EQ(
144 "Error: Alignment can't be greater than 2**29. Found: 2**30\n"
145 "Error: Invalid value in record\n",
146 Munger.getTestResults());
147
148 // Show what happens when changing alignment to 29.
149 const uint64_t Align29[] = {
150 ReplaceIndex, NaClBitcodeMunger::Replace,
151 // Note: alignment stored as Log32_32(Alignment)+1.
152 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 30, Terminator,
153 };
154 EXPECT_TRUE(Munger.runTest(
155 "BadAllocInstAlignment-29", Align29, array_lengthof(Align29), true));
156 EXPECT_EQ(
157 "Successful parse!\n",
158 Munger.getTestResults());
159 EXPECT_TRUE(DumpMunger.runTestForAssembly(
160 "BadAllocInstAlignment-29", Align29, array_lengthof(Align29)));
161 EXPECT_EQ(
162 " %v0 = alloca i8, i32 %p0, align 536870912;\n",
163 DumpMunger.getLinesWithSubstring("alloca"));
164 }
165
166 TEST(NaClParseInstsTests, BadLoadAlignment) {
167 const uint64_t BitcodeRecords[] = {
168 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
169 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
170 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator,
171 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
172 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator,
173 0, naclbitc::BLK_CODE_EXIT, Terminator,
174 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator,
175 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
176 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
177 // Note: alignment stored as Log32_32(Alignment)+1.
178 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 1, 0, Terminator,
179 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
180 0, naclbitc::BLK_CODE_EXIT, Terminator,
181 0, naclbitc::BLK_CODE_EXIT, Terminator
182 };
183
184 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD
185
186 // Note: i32 can only have alignment of 1.
187 // Show text of base input.
188 NaClObjDumpMunger DumpMunger(BitcodeRecords,
189 array_lengthof(BitcodeRecords), Terminator);
190 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadLoadAlignment"));
191 EXPECT_EQ(
192 "module { // BlockID = 8\n"
193 " types { // BlockID = 17\n"
194 " count 2;\n"
195 " @t0 = i32;\n"
196 " @t1 = i32 (i32);\n"
197 " }\n"
198 " define external i32 @f0(i32);\n"
199 " function i32 @f0(i32 %p0) { // BlockID = 12\n"
200 " blocks 1;\n"
201 " %b0:\n"
202 " %v0 = load i32* %p0, align 1;\n"
203 " ret i32 %v0;\n"
204 " }\n"
205 "}\n",
206 DumpMunger.getTestResults());
207
208 // Show what happens when changing alignment to 4.
209 const uint64_t Align4[] = {
210 ReplaceIndex, NaClBitcodeMunger::Replace,
211 // Note: alignment stored as Log32_32(Alignment)+1.
212 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 3, 0, Terminator,
213 };
214 NaClParseBitcodeMunger Munger(BitcodeRecords,
215 array_lengthof(BitcodeRecords), Terminator);
216 EXPECT_FALSE(Munger.runTest(
217 "BadLoadAlignment", Align4, array_lengthof(Align4), true));
218 EXPECT_EQ(
219 "Error: Invalid alignment for load of type i32: 4\n"
220 "Error: Invalid value in record\n",
221 Munger.getTestResults());
222 }
223
224 TEST(NaClParseInstsTests, BadStoreAlignment) {
225 const uint64_t BitcodeRecords[] = {
226 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
227 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
228 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator,
229 3, naclbitc::TYPE_CODE_FLOAT, Terminator,
230 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
231 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator,
232 0, naclbitc::BLK_CODE_EXIT, Terminator,
233 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
234 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
235 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
236 // Note: alignment stored as Log32_32(Alignment)+1.
237 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 1, Terminator,
238 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
239 0, naclbitc::BLK_CODE_EXIT, Terminator,
240 0, naclbitc::BLK_CODE_EXIT, Terminator
241 };
242
243 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD
244
245 // Note: float can only have alignment of 1 and 4.
246 // Show text of base input.
247 NaClObjDumpMunger DumpMunger(BitcodeRecords,
248 array_lengthof(BitcodeRecords), Terminator);
249 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadStoreAlignment"));
250 EXPECT_EQ(
251 "module { // BlockID = 8\n"
252 " types { // BlockID = 17\n"
253 " count 3;\n"
254 " @t0 = float;\n"
255 " @t1 = i32;\n"
256 " @t2 = float (i32, float);\n"
257 " }\n"
258 " define external float @f0(i32, float);\n"
259 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n"
260 " blocks 1;\n"
261 " %b0:\n"
262 " store float %p1, float* %p0, align 1;\n"
263 " ret float %p1;\n"
264 " }\n"
265 "}\n",
266 DumpMunger.getTestResults());
267
268 // Show what happens when changing alignment to 2.
269 const uint64_t Align2[] = {
270 ReplaceIndex, NaClBitcodeMunger::Replace,
271 // Note: alignment stored as Log32_32(Alignment)+1.
272 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 2, Terminator,
273 };
274 NaClParseBitcodeMunger Munger(BitcodeRecords,
275 array_lengthof(BitcodeRecords), Terminator);
276 EXPECT_FALSE(Munger.runTest(
277 "BadStoreAlignment-2", Align2, array_lengthof(Align2), true));
278 EXPECT_EQ(
279 "Error: Invalid alignment for store of type float: 2\n"
280 "Error: Invalid value in record\n",
281 Munger.getTestResults());
282
283 // Show what happens when changing alignment to 4.
284 const uint64_t Align4[] = {
285 ReplaceIndex, NaClBitcodeMunger::Replace,
286 // Note: alignment stored as Log32_32(Alignment)+1.
287 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 3, Terminator,
288 };
289 EXPECT_TRUE(Munger.runTest(
290 "BadStoreAlignment-4", Align4, array_lengthof(Align4), true));
291 EXPECT_EQ(
292 "Successful parse!\n",
293 Munger.getTestResults());
294 EXPECT_TRUE(DumpMunger.runTestForAssembly(
295 "BadStoreAlignment-4", Align4, array_lengthof(Align4)));
296 EXPECT_EQ(
297 " store float %p1, float* %p0, align 4;\n",
298 DumpMunger.getLinesWithSubstring("store"));
299
300 // Show what happens when changing alignment to 8.
301 const uint64_t Align8[] = {
302 ReplaceIndex, NaClBitcodeMunger::Replace,
303 // Note: alignment stored as Log32_32(Alignment)+1.
304 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 4, Terminator,
305 };
306 EXPECT_FALSE(Munger.runTest(
307 "BadStoreAlignment-8", Align8, array_lengthof(Align8), true));
308 EXPECT_EQ(
309 "Error: Invalid alignment for store of type float: 8\n"
310 "Error: Invalid value in record\n",
311 Munger.getTestResults());
312 }
313
82 } // end of anonamous namespace. 314 } // end of anonamous namespace.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698