OLD | NEW |
---|---|
1 //===- NaClBitcodeReader.cpp ----------------------------------------------===// | 1 //===- NaClBitcodeReader.cpp ----------------------------------------------===// |
2 // Internal NaClBitcodeReader implementation | 2 // Internal NaClBitcodeReader implementation |
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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
109 | 109 |
110 // No type specified, must be invalid reference. | 110 // No type specified, must be invalid reference. |
111 if (Ty == 0) | 111 if (Ty == 0) |
112 return true; | 112 return true; |
113 | 113 |
114 // Create a placeholder, which will later be RAUW'd. | 114 // Create a placeholder, which will later be RAUW'd. |
115 ValuePtrs[Idx] = new Argument(Ty); | 115 ValuePtrs[Idx] = new Argument(Ty); |
116 return false; | 116 return false; |
117 } | 117 } |
118 | 118 |
119 namespace { | |
120 class NaClBitcodeErrorCategoryType : public std::error_category { | |
121 const char *name() const LLVM_NOEXCEPT override { | |
122 return "pnacl.bitcode"; | |
123 } | |
124 std::string message(int IndexError) const override { | |
125 switch(static_cast<NaClBitcodeReader::ErrorType>(IndexError)) { | |
126 case NaClBitcodeReader::InvalidBBForInstruction: | |
127 return "No basic block for instruction"; | |
128 case NaClBitcodeReader::InvalidBitstream: | |
129 return "Error in bitstream format"; | |
130 case NaClBitcodeReader::InvalidConstantReference: | |
131 return "Bad constant reference"; | |
132 case NaClBitcodeReader::InvalidMultipleBlocks: | |
133 return "Multiple blocks for a kind of block that should have only one"; | |
134 case NaClBitcodeReader::InvalidRecord: | |
135 return "Record doesn't have expected size or structure"; | |
136 case NaClBitcodeReader::InvalidType: | |
137 return "Invalid type in record"; | |
138 case NaClBitcodeReader::InvalidTypeForValue: | |
139 return "Type of value in record incorrect"; | |
140 case NaClBitcodeReader::InvalidValue: | |
141 return "Invalid value in record"; | |
142 case NaClBitcodeReader::MalformedBlock: | |
143 return "Malformed block. Unable to advance over block"; | |
144 case NaClBitcodeReader::NoFunctionInStream: | |
145 return "Unable to find function in bitcode stream."; | |
146 default: | |
147 return "Unknown bitsteam error"; | |
JF
2014/12/02 00:49:04
I wouldn't put a default here: the compiler will w
Karl
2014/12/03 18:32:09
Done.
| |
148 } | |
149 } | |
JF
2014/12/02 00:49:04
Put llvm_unreachable here instead (like BitcodeRea
Karl
2014/12/03 18:32:09
Done.
| |
150 }; | |
151 } // end of anonomous namespace. | |
152 | |
153 const std::error_category &NaClBitcodeReader::BitcodeErrorCategory() { | |
154 static NaClBitcodeErrorCategoryType ErrCat; | |
JF
2014/12/02 00:49:03
BitcodeReader.cpp uses a ManagedStatic instead of
Karl
2014/12/03 18:32:09
Not in our local version. Waiting for merge?
| |
155 return ErrCat; | |
156 } | |
157 | |
119 Type *NaClBitcodeReader::getTypeByID(unsigned ID) { | 158 Type *NaClBitcodeReader::getTypeByID(unsigned ID) { |
120 // The type table size is always specified correctly. | 159 // The type table size is always specified correctly. |
121 if (ID >= TypeList.size()) | 160 if (ID >= TypeList.size()) |
122 return 0; | 161 return 0; |
123 | 162 |
124 if (Type *Ty = TypeList[ID]) | 163 if (Type *Ty = TypeList[ID]) |
125 return Ty; | 164 return Ty; |
126 | 165 |
127 // If we have a forward reference, the only possible case is when it is to a | 166 // If we have a forward reference, the only possible case is when it is to a |
128 // named struct. Just create a placeholder for now. | 167 // named struct. Just create a placeholder for now. |
129 return TypeList[ID] = StructType::create(Context); | 168 return TypeList[ID] = StructType::create(Context); |
130 } | 169 } |
131 | 170 |
132 | 171 |
133 //===----------------------------------------------------------------------===// | 172 //===----------------------------------------------------------------------===// |
134 // Functions for parsing blocks from the bitcode file | 173 // Functions for parsing blocks from the bitcode file |
135 //===----------------------------------------------------------------------===// | 174 //===----------------------------------------------------------------------===// |
136 | 175 |
137 | 176 |
138 bool NaClBitcodeReader::ParseTypeTable() { | 177 std::error_code NaClBitcodeReader::Error(ErrorType E, |
178 const std::string &Message) const { | |
179 if (Verbose) | |
180 errs() << "Error: " << Message << "\n"; | |
181 return Error(E); | |
182 } | |
183 | |
184 std::error_code NaClBitcodeReader::ParseTypeTable() { | |
139 DEBUG(dbgs() << "-> ParseTypeTable\n"); | 185 DEBUG(dbgs() << "-> ParseTypeTable\n"); |
140 if (Stream.EnterSubBlock(naclbitc::TYPE_BLOCK_ID_NEW)) | 186 if (Stream.EnterSubBlock(naclbitc::TYPE_BLOCK_ID_NEW)) |
141 return Error("Malformed block record"); | 187 return Error(MalformedBlock, "Malformed block record"); |
jvoung (off chromium)
2014/12/01 23:23:49
similar, InvalidRecord or MalformedBlock?
Karl
2014/12/03 18:32:09
Changed to InvalidRecord.
| |
142 | 188 |
143 bool result = ParseTypeTableBody(); | 189 std::error_code result = ParseTypeTableBody(); |
144 if (!result) | 190 if (!result) |
145 DEBUG(dbgs() << "<- ParseTypeTable\n"); | 191 DEBUG(dbgs() << "<- ParseTypeTable\n"); |
146 return result; | 192 return result; |
147 } | 193 } |
148 | 194 |
149 bool NaClBitcodeReader::ParseTypeTableBody() { | 195 std::error_code NaClBitcodeReader::ParseTypeTableBody() { |
150 if (!TypeList.empty()) | 196 if (!TypeList.empty()) |
151 return Error("Multiple TYPE_BLOCKs found!"); | 197 return Error(InvalidMultipleBlocks, "Multiple TYPE_BLOCKs found!"); |
152 | 198 |
153 SmallVector<uint64_t, 64> Record; | 199 SmallVector<uint64_t, 64> Record; |
154 unsigned NumRecords = 0; | 200 unsigned NumRecords = 0; |
155 | 201 |
156 // Read all the records for this type table. | 202 // Read all the records for this type table. |
157 while (1) { | 203 while (1) { |
158 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 204 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
159 | 205 |
160 switch (Entry.Kind) { | 206 switch (Entry.Kind) { |
161 case NaClBitstreamEntry::SubBlock: // Handled for us already. | 207 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
162 case NaClBitstreamEntry::Error: | 208 case NaClBitstreamEntry::Error: |
163 Error("Error in the type table block"); | 209 return Error(MalformedBlock, "Error in the type table block"); |
164 return true; | |
165 case NaClBitstreamEntry::EndBlock: | 210 case NaClBitstreamEntry::EndBlock: |
166 if (NumRecords != TypeList.size()) | 211 if (NumRecords != TypeList.size()) |
167 return Error("Invalid type forward reference in TYPE_BLOCK"); | 212 return Error(MalformedBlock, |
168 return false; | 213 "Invalid type forward reference in TYPE_BLOCK"); |
214 return std::error_code(); | |
169 case NaClBitstreamEntry::Record: | 215 case NaClBitstreamEntry::Record: |
170 // The interesting case. | 216 // The interesting case. |
171 break; | 217 break; |
172 } | 218 } |
173 | 219 |
174 // Read a record. | 220 // Read a record. |
175 Record.clear(); | 221 Record.clear(); |
176 Type *ResultTy = 0; | 222 Type *ResultTy = 0; |
177 unsigned TypeCode = Stream.readRecord(Entry.ID, Record); | 223 unsigned TypeCode = Stream.readRecord(Entry.ID, Record); |
178 switch (TypeCode) { | 224 switch (TypeCode) { |
179 default: { | 225 default: { |
180 std::string Message; | 226 std::string Message; |
181 raw_string_ostream StrM(Message); | 227 raw_string_ostream StrM(Message); |
182 StrM << "Unknown type code in type table: " << TypeCode; | 228 StrM << "Unknown type code in type table: " << TypeCode; |
183 StrM.flush(); | 229 StrM.flush(); |
184 return Error(Message); | 230 return Error(InvalidValue, Message); |
185 } | 231 } |
186 | 232 |
187 case naclbitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] | 233 case naclbitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] |
188 // TYPE_CODE_NUMENTRY contains a count of the number of types in the | 234 // TYPE_CODE_NUMENTRY contains a count of the number of types in the |
189 // type list. This allows us to reserve space. | 235 // type list. This allows us to reserve space. |
190 if (Record.size() != 1) | 236 if (Record.size() != 1) |
191 return Error("Invalid TYPE_CODE_NUMENTRY record"); | 237 return Error(InvalidRecord, "Invalid TYPE_CODE_NUMENTRY record"); |
192 TypeList.resize(Record[0]); | 238 TypeList.resize(Record[0]); |
193 // No type was defined, skip the checks that follow the switch. | 239 // No type was defined, skip the checks that follow the switch. |
194 continue; | 240 continue; |
195 | 241 |
196 case naclbitc::TYPE_CODE_VOID: // VOID | 242 case naclbitc::TYPE_CODE_VOID: // VOID |
197 if (Record.size() != 0) | 243 if (Record.size() != 0) |
198 return Error("Invalid TYPE_CODE_VOID record"); | 244 return Error(InvalidRecord, "Invalid TYPE_CODE_VOID record"); |
199 ResultTy = Type::getVoidTy(Context); | 245 ResultTy = Type::getVoidTy(Context); |
200 break; | 246 break; |
201 | 247 |
202 case naclbitc::TYPE_CODE_FLOAT: // FLOAT | 248 case naclbitc::TYPE_CODE_FLOAT: // FLOAT |
203 if (Record.size() != 0) | 249 if (Record.size() != 0) |
204 return Error("Invalid TYPE_CODE_FLOAT record"); | 250 return Error(InvalidRecord, "Invalid TYPE_CODE_FLOAT record"); |
205 ResultTy = Type::getFloatTy(Context); | 251 ResultTy = Type::getFloatTy(Context); |
206 break; | 252 break; |
207 | 253 |
208 case naclbitc::TYPE_CODE_DOUBLE: // DOUBLE | 254 case naclbitc::TYPE_CODE_DOUBLE: // DOUBLE |
209 if (Record.size() != 0) | 255 if (Record.size() != 0) |
210 return Error("Invalid TYPE_CODE_DOUBLE record"); | 256 return Error(InvalidRecord, "Invalid TYPE_CODE_DOUBLE record"); |
211 ResultTy = Type::getDoubleTy(Context); | 257 ResultTy = Type::getDoubleTy(Context); |
212 break; | 258 break; |
213 | 259 |
214 case naclbitc::TYPE_CODE_INTEGER: // INTEGER: [width] | 260 case naclbitc::TYPE_CODE_INTEGER: // INTEGER: [width] |
215 if (Record.size() != 1) | 261 if (Record.size() != 1) |
216 return Error("Invalid TYPE_CODE_INTEGER record"); | 262 return Error(InvalidRecord, "Invalid TYPE_CODE_INTEGER record"); |
217 ResultTy = IntegerType::get(Context, Record[0]); | 263 ResultTy = IntegerType::get(Context, Record[0]); |
218 break; | 264 break; |
219 | 265 |
220 case naclbitc::TYPE_CODE_FUNCTION: { | 266 case naclbitc::TYPE_CODE_FUNCTION: { |
221 // FUNCTION: [vararg, retty, paramty x N] | 267 // FUNCTION: [vararg, retty, paramty x N] |
222 if (Record.size() < 2) | 268 if (Record.size() < 2) |
223 return Error("Invalid TYPE_CODE_FUNCTION record"); | 269 return Error(InvalidRecord, "Invalid TYPE_CODE_FUNCTION record"); |
224 SmallVector<Type *, 8> ArgTys; | 270 SmallVector<Type *, 8> ArgTys; |
225 for (unsigned i = 2, e = Record.size(); i != e; ++i) { | 271 for (unsigned i = 2, e = Record.size(); i != e; ++i) { |
226 if (Type *T = getTypeByID(Record[i])) | 272 if (Type *T = getTypeByID(Record[i])) |
227 ArgTys.push_back(T); | 273 ArgTys.push_back(T); |
228 else | 274 else |
229 break; | 275 break; |
230 } | 276 } |
231 | 277 |
232 ResultTy = getTypeByID(Record[1]); | 278 ResultTy = getTypeByID(Record[1]); |
233 if (ResultTy == 0 || ArgTys.size() < Record.size() - 2) | 279 if (ResultTy == 0 || ArgTys.size() < Record.size() - 2) |
234 return Error("invalid type in function type"); | 280 return Error(InvalidType, "invalid type in function type"); |
235 | 281 |
236 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); | 282 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); |
237 break; | 283 break; |
238 } | 284 } |
239 case naclbitc::TYPE_CODE_VECTOR: { // VECTOR: [numelts, eltty] | 285 case naclbitc::TYPE_CODE_VECTOR: { // VECTOR: [numelts, eltty] |
240 if (Record.size() != 2) | 286 if (Record.size() != 2) |
241 return Error("Invalid VECTOR type record"); | 287 return Error(InvalidRecord, "Invalid VECTOR type record"); |
242 if ((ResultTy = getTypeByID(Record[1]))) | 288 if ((ResultTy = getTypeByID(Record[1]))) |
243 ResultTy = VectorType::get(ResultTy, Record[0]); | 289 ResultTy = VectorType::get(ResultTy, Record[0]); |
244 else | 290 else |
245 return Error("invalid type in vector type"); | 291 return Error(InvalidType, "invalid type in vector type"); |
246 break; | 292 break; |
247 } | 293 } |
248 } | 294 } |
249 | 295 |
250 if (NumRecords >= TypeList.size()) | 296 if (NumRecords >= TypeList.size()) |
251 return Error("invalid TYPE table"); | 297 return Error(MalformedBlock, "invalid TYPE table"); |
252 assert(ResultTy && "Didn't read a type?"); | 298 assert(ResultTy && "Didn't read a type?"); |
253 assert(TypeList[NumRecords] == 0 && "Already read type?"); | 299 assert(TypeList[NumRecords] == 0 && "Already read type?"); |
254 TypeList[NumRecords++] = ResultTy; | 300 TypeList[NumRecords++] = ResultTy; |
255 } | 301 } |
302 return std::error_code(); | |
256 } | 303 } |
257 | 304 |
258 namespace { | 305 namespace { |
259 | 306 |
260 // Class to process globals in two passes. In the first pass, build | 307 // Class to process globals in two passes. In the first pass, build |
261 // the corresponding global variables with no initializers. In the | 308 // the corresponding global variables with no initializers. In the |
262 // second pass, add initializers. The purpose of putting off | 309 // second pass, add initializers. The purpose of putting off |
263 // initializers is to make sure that we don't need to generate | 310 // initializers is to make sure that we don't need to generate |
264 // placeholders for relocation records, and the corresponding cost | 311 // placeholders for relocation records, and the corresponding cost |
265 // of duplicating initializers when these placeholders are replaced. | 312 // of duplicating initializers when these placeholders are replaced. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
303 Module *TheModule) | 350 Module *TheModule) |
304 : Reader(Reader), | 351 : Reader(Reader), |
305 ValueList(ValueList), | 352 ValueList(ValueList), |
306 Stream(Stream), | 353 Stream(Stream), |
307 Context(Context), | 354 Context(Context), |
308 TheModule(TheModule), | 355 TheModule(TheModule), |
309 FirstValueNo(ValueList.size()), | 356 FirstValueNo(ValueList.size()), |
310 NumGlobals(0), | 357 NumGlobals(0), |
311 StartBit(Stream.GetCurrentBitNo()) {} | 358 StartBit(Stream.GetCurrentBitNo()) {} |
312 | 359 |
313 bool GenerateGlobalVarsPass() { | 360 std::error_code GenerateGlobalVarsPass() { |
314 InitPass(); | 361 InitPass(); |
315 | 362 |
316 // The type for the initializer of the global variable. | 363 // The type for the initializer of the global variable. |
317 SmallVector<Type*, 10> VarType; | 364 SmallVector<Type*, 10> VarType; |
318 // The alignment value defined for the global variable. | 365 // The alignment value defined for the global variable. |
319 unsigned VarAlignment = 0; | 366 unsigned VarAlignment = 0; |
320 // True if the variable is read-only. | 367 // True if the variable is read-only. |
321 bool VarIsConstant = false; | 368 bool VarIsConstant = false; |
322 | 369 |
323 // Read all records to build global variables without initializers. | 370 // Read all records to build global variables without initializers. |
324 while (1) { | 371 while (1) { |
325 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks( | 372 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks( |
326 NaClBitstreamCursor::AF_DontPopBlockAtEnd); | 373 NaClBitstreamCursor::AF_DontPopBlockAtEnd); |
327 switch (Entry.Kind) { | 374 switch (Entry.Kind) { |
328 case NaClBitstreamEntry::SubBlock: | 375 case NaClBitstreamEntry::SubBlock: |
329 case NaClBitstreamEntry::Error: | 376 case NaClBitstreamEntry::Error: |
330 return Reader.Error("Error in the global vars block"); | 377 return Reader.Error(NaClBitcodeReader::MalformedBlock, |
378 "Error in the global vars block"); | |
331 case NaClBitstreamEntry::EndBlock: | 379 case NaClBitstreamEntry::EndBlock: |
332 if (ProcessingGlobal || NumGlobals != (NextValueNo - FirstValueNo)) | 380 if (ProcessingGlobal || NumGlobals != (NextValueNo - FirstValueNo)) |
333 return Reader.Error("Error in the global vars block"); | 381 return Reader.Error(NaClBitcodeReader::MalformedBlock, |
334 return false; | 382 "Error in the global vars block"); |
383 return std::error_code(); | |
335 case NaClBitstreamEntry::Record: | 384 case NaClBitstreamEntry::Record: |
336 // The interesting case. | 385 // The interesting case. |
337 break; | 386 break; |
338 } | 387 } |
339 | 388 |
340 // Read a record. | 389 // Read a record. |
341 Record.clear(); | 390 Record.clear(); |
342 unsigned Bitcode = Stream.readRecord(Entry.ID, Record); | 391 unsigned Bitcode = Stream.readRecord(Entry.ID, Record); |
343 switch (Bitcode) { | 392 switch (Bitcode) { |
344 default: return Reader.Error("Unknown global variable entry"); | 393 default: |
394 return Reader.Error(NaClBitcodeReader::InvalidValue, | |
395 "Unknown global variable entry"); | |
345 case naclbitc::GLOBALVAR_VAR: | 396 case naclbitc::GLOBALVAR_VAR: |
346 // Start the definition of a global variable. | 397 // Start the definition of a global variable. |
347 if (ProcessingGlobal || Record.size() != 2) | 398 if (ProcessingGlobal || Record.size() != 2) |
348 return Reader.Error("Bad GLOBALVAR_VAR record"); | 399 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
400 "Bad GLOBALVAR_VAR record"); | |
349 ProcessingGlobal = true; | 401 ProcessingGlobal = true; |
350 VarAlignment = (1 << Record[0]) >> 1; | 402 VarAlignment = (1 << Record[0]) >> 1; |
351 VarIsConstant = Record[1] != 0; | 403 VarIsConstant = Record[1] != 0; |
352 // Assume (by default) there is a single initializer. | 404 // Assume (by default) there is a single initializer. |
353 VarInitializersNeeded = 1; | 405 VarInitializersNeeded = 1; |
354 break; | 406 break; |
355 case naclbitc::GLOBALVAR_COMPOUND: | 407 case naclbitc::GLOBALVAR_COMPOUND: |
356 // Global variable has multiple initializers. Changes the | 408 // Global variable has multiple initializers. Changes the |
357 // default number of initializers to the given value in | 409 // default number of initializers to the given value in |
358 // Record[0]. | 410 // Record[0]. |
359 if (!ProcessingGlobal || !VarType.empty() || | 411 if (!ProcessingGlobal || !VarType.empty() || |
360 VarInitializersNeeded != 1 || Record.size() != 1) | 412 VarInitializersNeeded != 1 || Record.size() != 1) |
361 return Reader.Error("Bad GLOBALVAR_COMPOUND record"); | 413 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
414 "Bad GLOBALVAR_COMPOUND record"); | |
362 VarInitializersNeeded = Record[0]; | 415 VarInitializersNeeded = Record[0]; |
363 break; | 416 break; |
364 case naclbitc::GLOBALVAR_ZEROFILL: { | 417 case naclbitc::GLOBALVAR_ZEROFILL: { |
365 // Define a type that defines a sequence of zero-filled bytes. | 418 // Define a type that defines a sequence of zero-filled bytes. |
366 if (!ProcessingGlobal || Record.size() != 1) | 419 if (!ProcessingGlobal || Record.size() != 1) |
367 return Reader.Error("Bad GLOBALVAR_ZEROFILL record"); | 420 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
421 "Bad GLOBALVAR_ZEROFILL record"); | |
368 VarType.push_back(ArrayType::get( | 422 VarType.push_back(ArrayType::get( |
369 Type::getInt8Ty(Context), Record[0])); | 423 Type::getInt8Ty(Context), Record[0])); |
370 break; | 424 break; |
371 } | 425 } |
372 case naclbitc::GLOBALVAR_DATA: { | 426 case naclbitc::GLOBALVAR_DATA: { |
373 // Defines a type defined by a sequence of byte values. | 427 // Defines a type defined by a sequence of byte values. |
374 if (!ProcessingGlobal || Record.size() < 1) | 428 if (!ProcessingGlobal || Record.size() < 1) |
375 return Reader.Error("Bad GLOBALVAR_DATA record"); | 429 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
430 "Bad GLOBALVAR_DATA record"); | |
376 VarType.push_back(ArrayType::get( | 431 VarType.push_back(ArrayType::get( |
377 Type::getInt8Ty(Context), Record.size())); | 432 Type::getInt8Ty(Context), Record.size())); |
378 break; | 433 break; |
379 } | 434 } |
380 case naclbitc::GLOBALVAR_RELOC: { | 435 case naclbitc::GLOBALVAR_RELOC: { |
381 // Define a relocation initializer type. | 436 // Define a relocation initializer type. |
382 if (!ProcessingGlobal || Record.size() < 1 || Record.size() > 2) | 437 if (!ProcessingGlobal || Record.size() < 1 || Record.size() > 2) |
383 return Reader.Error("Bad GLOBALVAR_RELOC record"); | 438 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
439 "Bad GLOBALVAR_RELOC record"); | |
384 VarType.push_back(IntegerType::get(Context, 32)); | 440 VarType.push_back(IntegerType::get(Context, 32)); |
385 break; | 441 break; |
386 } | 442 } |
387 case naclbitc::GLOBALVAR_COUNT: | 443 case naclbitc::GLOBALVAR_COUNT: |
388 if (Record.size() != 1 || NumGlobals != 0) | 444 if (Record.size() != 1 || NumGlobals != 0) |
389 return Reader.Error("Invalid global count record"); | 445 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
446 "Invalid global count record"); | |
390 NumGlobals = Record[0]; | 447 NumGlobals = Record[0]; |
391 break; | 448 break; |
392 } | 449 } |
393 | 450 |
394 // If more initializers needed for global variable, continue processing. | 451 // If more initializers needed for global variable, continue processing. |
395 if (!ProcessingGlobal || VarType.size() < VarInitializersNeeded) | 452 if (!ProcessingGlobal || VarType.size() < VarInitializersNeeded) |
396 continue; | 453 continue; |
397 | 454 |
398 Type *Ty = 0; | 455 Type *Ty = 0; |
399 switch (VarType.size()) { | 456 switch (VarType.size()) { |
400 case 0: | 457 case 0: |
401 return Reader.Error( | 458 return Reader.Error( |
459 NaClBitcodeReader::InvalidRecord, | |
402 "No initializer for global variable in global vars block"); | 460 "No initializer for global variable in global vars block"); |
403 case 1: | 461 case 1: |
404 Ty = VarType[0]; | 462 Ty = VarType[0]; |
405 break; | 463 break; |
406 default: | 464 default: |
407 Ty = StructType::get(Context, VarType, true); | 465 Ty = StructType::get(Context, VarType, true); |
408 break; | 466 break; |
409 } | 467 } |
410 GlobalVariable *GV = new GlobalVariable( | 468 GlobalVariable *GV = new GlobalVariable( |
411 *TheModule, Ty, VarIsConstant, | 469 *TheModule, Ty, VarIsConstant, |
412 GlobalValue::InternalLinkage, NULL, ""); | 470 GlobalValue::InternalLinkage, NULL, ""); |
413 GV->setAlignment(VarAlignment); | 471 GV->setAlignment(VarAlignment); |
414 ValueList.AssignValue(GV, NextValueNo); | 472 ValueList.AssignValue(GV, NextValueNo); |
415 ++NextValueNo; | 473 ++NextValueNo; |
416 ProcessingGlobal = false; | 474 ProcessingGlobal = false; |
417 VarAlignment = 0; | 475 VarAlignment = 0; |
418 VarIsConstant = false; | 476 VarIsConstant = false; |
419 VarInitializersNeeded = 0; | 477 VarInitializersNeeded = 0; |
420 VarType.clear(); | 478 VarType.clear(); |
421 } | 479 } |
480 return std::error_code(); | |
422 } | 481 } |
423 | 482 |
424 bool GenerateGlobalVarInitsPass() { | 483 std::error_code GenerateGlobalVarInitsPass() { |
425 InitPass(); | 484 InitPass(); |
426 // The initializer for the global variable. | 485 // The initializer for the global variable. |
427 SmallVector<Constant *, 10> VarInit; | 486 SmallVector<Constant *, 10> VarInit; |
428 | 487 |
429 while (1) { | 488 while (1) { |
430 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks( | 489 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks( |
431 NaClBitstreamCursor::AF_DontAutoprocessAbbrevs); | 490 NaClBitstreamCursor::AF_DontAutoprocessAbbrevs); |
432 switch (Entry.Kind) { | 491 switch (Entry.Kind) { |
433 case NaClBitstreamEntry::SubBlock: | 492 case NaClBitstreamEntry::SubBlock: |
434 case NaClBitstreamEntry::Error: | 493 case NaClBitstreamEntry::Error: |
435 return Reader.Error("Error in the global vars block"); | 494 return Reader.Error(NaClBitcodeReader::MalformedBlock, |
495 "Error in the global vars block"); | |
436 case NaClBitstreamEntry::EndBlock: | 496 case NaClBitstreamEntry::EndBlock: |
437 if (ProcessingGlobal || NumGlobals != (NextValueNo - FirstValueNo)) | 497 if (ProcessingGlobal || NumGlobals != (NextValueNo - FirstValueNo)) |
438 return Reader.Error("Error in the global vars block"); | 498 return Reader.Error(NaClBitcodeReader::MalformedBlock, |
439 return false; | 499 "Error in the global vars block"); |
500 return std::error_code(); | |
440 case NaClBitstreamEntry::Record: | 501 case NaClBitstreamEntry::Record: |
441 if (Entry.ID == naclbitc::DEFINE_ABBREV) { | 502 if (Entry.ID == naclbitc::DEFINE_ABBREV) { |
442 Stream.SkipAbbrevRecord(); | 503 Stream.SkipAbbrevRecord(); |
443 continue; | 504 continue; |
444 } | 505 } |
445 // The interesting case. | 506 // The interesting case. |
446 break; | 507 break; |
447 default: | 508 default: |
448 return Reader.Error("Unexpected record"); | 509 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
510 "Unexpected record"); | |
449 } | 511 } |
450 | 512 |
451 // Read a record. | 513 // Read a record. |
452 Record.clear(); | 514 Record.clear(); |
453 unsigned Bitcode = Stream.readRecord(Entry.ID, Record); | 515 unsigned Bitcode = Stream.readRecord(Entry.ID, Record); |
454 switch (Bitcode) { | 516 switch (Bitcode) { |
455 default: return Reader.Error("Unknown global variable entry 2"); | 517 default: |
518 return Reader.Error(NaClBitcodeReader::InvalidValue, | |
519 "Unknown global variable entry 2"); | |
456 case naclbitc::GLOBALVAR_VAR: | 520 case naclbitc::GLOBALVAR_VAR: |
457 // Start the definition of a global variable. | 521 // Start the definition of a global variable. |
458 ProcessingGlobal = true; | 522 ProcessingGlobal = true; |
459 // Assume (by default) there is a single initializer. | 523 // Assume (by default) there is a single initializer. |
460 VarInitializersNeeded = 1; | 524 VarInitializersNeeded = 1; |
461 break; | 525 break; |
462 case naclbitc::GLOBALVAR_COMPOUND: | 526 case naclbitc::GLOBALVAR_COMPOUND: |
463 // Global variable has multiple initializers. Changes the | 527 // Global variable has multiple initializers. Changes the |
464 // default number of initializers to the given value in | 528 // default number of initializers to the given value in |
465 // Record[0]. | 529 // Record[0]. |
466 if (!ProcessingGlobal || !VarInit.empty() || | 530 if (!ProcessingGlobal || !VarInit.empty() || |
467 VarInitializersNeeded != 1 || Record.size() != 1) | 531 VarInitializersNeeded != 1 || Record.size() != 1) |
468 return Reader.Error("Bad GLOBALVAR_COMPOUND record"); | 532 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
533 "Bad GLOBALVAR_COMPOUND record"); | |
469 VarInitializersNeeded = Record[0]; | 534 VarInitializersNeeded = Record[0]; |
470 break; | 535 break; |
471 case naclbitc::GLOBALVAR_ZEROFILL: { | 536 case naclbitc::GLOBALVAR_ZEROFILL: { |
472 // Define an initializer that defines a sequence of zero-filled bytes. | 537 // Define an initializer that defines a sequence of zero-filled bytes. |
473 if (!ProcessingGlobal || Record.size() != 1) | 538 if (!ProcessingGlobal || Record.size() != 1) |
474 return Reader.Error("Bad GLOBALVAR_ZEROFILL record"); | 539 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
540 "Bad GLOBALVAR_ZEROFILL record"); | |
475 Type *Ty = ArrayType::get(Type::getInt8Ty(Context), | 541 Type *Ty = ArrayType::get(Type::getInt8Ty(Context), |
476 Record[0]); | 542 Record[0]); |
477 Constant *Zero = ConstantAggregateZero::get(Ty); | 543 Constant *Zero = ConstantAggregateZero::get(Ty); |
478 VarInit.push_back(Zero); | 544 VarInit.push_back(Zero); |
479 break; | 545 break; |
480 } | 546 } |
481 case naclbitc::GLOBALVAR_DATA: { | 547 case naclbitc::GLOBALVAR_DATA: { |
482 // Defines an initializer defined by a sequence of byte values. | 548 // Defines an initializer defined by a sequence of byte values. |
483 if (!ProcessingGlobal || Record.size() < 1) | 549 if (!ProcessingGlobal || Record.size() < 1) |
484 return Reader.Error("Bad GLOBALVAR_DATA record"); | 550 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
551 "Bad GLOBALVAR_DATA record"); | |
485 unsigned Size = Record.size(); | 552 unsigned Size = Record.size(); |
486 uint8_t *Buf = new uint8_t[Size]; | 553 uint8_t *Buf = new uint8_t[Size]; |
487 assert(Buf); | 554 assert(Buf); |
488 for (unsigned i = 0; i < Size; ++i) | 555 for (unsigned i = 0; i < Size; ++i) |
489 Buf[i] = Record[i]; | 556 Buf[i] = Record[i]; |
490 Constant *Init = ConstantDataArray::get( | 557 Constant *Init = ConstantDataArray::get( |
491 Context, ArrayRef<uint8_t>(Buf, Buf + Size)); | 558 Context, ArrayRef<uint8_t>(Buf, Buf + Size)); |
492 VarInit.push_back(Init); | 559 VarInit.push_back(Init); |
493 delete[] Buf; | 560 delete[] Buf; |
494 break; | 561 break; |
495 } | 562 } |
496 case naclbitc::GLOBALVAR_RELOC: { | 563 case naclbitc::GLOBALVAR_RELOC: { |
497 // Define a relocation initializer. | 564 // Define a relocation initializer. |
498 if (!ProcessingGlobal || Record.size() < 1 || Record.size() > 2) | 565 if (!ProcessingGlobal || Record.size() < 1 || Record.size() > 2) |
499 return Reader.Error("Bad GLOBALVAR_RELOC record"); | 566 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
567 "Bad GLOBALVAR_RELOC record"); | |
500 Constant *BaseVal = cast<Constant>(ValueList[Record[0]]); | 568 Constant *BaseVal = cast<Constant>(ValueList[Record[0]]); |
501 Type *IntPtrType = IntegerType::get(Context, 32); | 569 Type *IntPtrType = IntegerType::get(Context, 32); |
502 Constant *Val = ConstantExpr::getPtrToInt(BaseVal, IntPtrType); | 570 Constant *Val = ConstantExpr::getPtrToInt(BaseVal, IntPtrType); |
503 if (Record.size() == 2) { | 571 if (Record.size() == 2) { |
504 uint32_t Addend = Record[1]; | 572 uint32_t Addend = Record[1]; |
505 Val = ConstantExpr::getAdd(Val, ConstantInt::get(IntPtrType, | 573 Val = ConstantExpr::getAdd(Val, ConstantInt::get(IntPtrType, |
506 Addend)); | 574 Addend)); |
507 } | 575 } |
508 VarInit.push_back(Val); | 576 VarInit.push_back(Val); |
509 break; | 577 break; |
510 } | 578 } |
511 case naclbitc::GLOBALVAR_COUNT: | 579 case naclbitc::GLOBALVAR_COUNT: |
512 if (Record.size() != 1) | 580 if (Record.size() != 1) |
513 return Reader.Error("Invalid global count record"); | 581 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
582 "Invalid global count record"); | |
514 // Note: NumGlobals should have been set in GenerateGlobalVarsPass. | 583 // Note: NumGlobals should have been set in GenerateGlobalVarsPass. |
515 // Fail if methods are called in wrong order. | 584 // Fail if methods are called in wrong order. |
516 assert(NumGlobals == Record[0]); | 585 assert(NumGlobals == Record[0]); |
517 break; | 586 break; |
518 } | 587 } |
519 | 588 |
520 // If more initializers needed for global variable, continue processing. | 589 // If more initializers needed for global variable, continue processing. |
521 if (!ProcessingGlobal || VarInit.size() < VarInitializersNeeded) | 590 if (!ProcessingGlobal || VarInit.size() < VarInitializersNeeded) |
522 continue; | 591 continue; |
523 | 592 |
524 Constant *Init = 0; | 593 Constant *Init = 0; |
525 switch (VarInit.size()) { | 594 switch (VarInit.size()) { |
526 case 0: | 595 case 0: |
527 return Reader.Error( | 596 return Reader.Error(NaClBitcodeReader::InvalidRecord, |
528 "No initializer for global variable in global vars block"); | 597 "No initializer for global variable in global vars block"); |
529 case 1: | 598 case 1: |
530 Init = VarInit[0]; | 599 Init = VarInit[0]; |
531 break; | 600 break; |
532 default: | 601 default: |
533 Init = ConstantStruct::getAnon(Context, VarInit, true); | 602 Init = ConstantStruct::getAnon(Context, VarInit, true); |
534 break; | 603 break; |
535 } | 604 } |
536 cast<GlobalVariable>(ValueList[NextValueNo])->setInitializer(Init); | 605 cast<GlobalVariable>(ValueList[NextValueNo])->setInitializer(Init); |
537 ++NextValueNo; | 606 ++NextValueNo; |
538 ProcessingGlobal = false; | 607 ProcessingGlobal = false; |
539 VarInitializersNeeded = 0; | 608 VarInitializersNeeded = 0; |
540 VarInit.clear(); | 609 VarInit.clear(); |
541 } | 610 } |
611 return std::error_code(); | |
542 } | 612 } |
543 }; | 613 }; |
544 | 614 |
545 } // End anonymous namespace. | 615 } // End anonymous namespace. |
546 | 616 |
547 bool NaClBitcodeReader::ParseGlobalVars() { | 617 std::error_code NaClBitcodeReader::ParseGlobalVars() { |
548 if (Stream.EnterSubBlock(naclbitc::GLOBALVAR_BLOCK_ID)) | 618 if (Stream.EnterSubBlock(naclbitc::GLOBALVAR_BLOCK_ID)) |
549 return Error("Malformed block record"); | 619 return Error(MalformedBlock, "Malformed block record"); |
jvoung (off chromium)
2014/12/01 23:23:49
Sometimes errors in EnterSubBlock are InvalidRecor
Karl
2014/12/03 18:32:09
Done.
| |
550 | 620 |
551 ParseGlobalsHandler PassHandler(*this, ValueList, Stream, Context, TheModule); | 621 ParseGlobalsHandler PassHandler(*this, ValueList, Stream, Context, TheModule); |
552 if (PassHandler.GenerateGlobalVarsPass()) return true; | 622 if (std::error_code EC = PassHandler.GenerateGlobalVarsPass()) |
623 return EC; | |
553 return PassHandler.GenerateGlobalVarInitsPass(); | 624 return PassHandler.GenerateGlobalVarInitsPass(); |
554 } | 625 } |
555 | 626 |
556 bool NaClBitcodeReader::ParseValueSymbolTable() { | 627 std::error_code NaClBitcodeReader::ParseValueSymbolTable() { |
557 DEBUG(dbgs() << "-> ParseValueSymbolTable\n"); | 628 DEBUG(dbgs() << "-> ParseValueSymbolTable\n"); |
558 if (Stream.EnterSubBlock(naclbitc::VALUE_SYMTAB_BLOCK_ID)) | 629 if (Stream.EnterSubBlock(naclbitc::VALUE_SYMTAB_BLOCK_ID)) |
559 return Error("Malformed block record"); | 630 return Error(InvalidRecord, "Malformed block record"); |
560 | 631 |
561 SmallVector<uint64_t, 64> Record; | 632 SmallVector<uint64_t, 64> Record; |
562 | 633 |
563 // Read all the records for this value table. | 634 // Read all the records for this value table. |
564 SmallString<128> ValueName; | 635 SmallString<128> ValueName; |
565 while (1) { | 636 while (1) { |
566 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 637 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
567 | 638 |
568 switch (Entry.Kind) { | 639 switch (Entry.Kind) { |
569 case NaClBitstreamEntry::SubBlock: // Handled for us already. | 640 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
570 case NaClBitstreamEntry::Error: | 641 case NaClBitstreamEntry::Error: |
571 return Error("malformed value symbol table block"); | 642 return Error(MalformedBlock, "malformed value symbol table block"); |
572 case NaClBitstreamEntry::EndBlock: | 643 case NaClBitstreamEntry::EndBlock: |
573 DEBUG(dbgs() << "<- ParseValueSymbolTable\n"); | 644 DEBUG(dbgs() << "<- ParseValueSymbolTable\n"); |
574 return false; | 645 return std::error_code(); |
575 case NaClBitstreamEntry::Record: | 646 case NaClBitstreamEntry::Record: |
576 // The interesting case. | 647 // The interesting case. |
577 break; | 648 break; |
578 } | 649 } |
579 | 650 |
580 // Read a record. | 651 // Read a record. |
581 Record.clear(); | 652 Record.clear(); |
582 switch (Stream.readRecord(Entry.ID, Record)) { | 653 switch (Stream.readRecord(Entry.ID, Record)) { |
583 default: // Default behavior: unknown type. | 654 default: // Default behavior: unknown type. |
584 break; | 655 break; |
585 case naclbitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] | 656 case naclbitc::VST_CODE_ENTRY: { // VST_ENTRY: [valueid, namechar x N] |
586 if (ConvertToString(Record, 1, ValueName)) | 657 if (ConvertToString(Record, 1, ValueName)) |
587 return Error("Invalid VST_ENTRY record"); | 658 return Error(InvalidRecord, "Invalid VST_ENTRY record"); |
588 unsigned ValueID = Record[0]; | 659 unsigned ValueID = Record[0]; |
589 if (ValueID >= ValueList.size()) | 660 if (ValueID >= ValueList.size()) |
590 return Error("Invalid Value ID in VST_ENTRY record"); | 661 return Error(InvalidValue, "Invalid Value ID in VST_ENTRY record"); |
591 Value *V = ValueList[ValueID]; | 662 Value *V = ValueList[ValueID]; |
592 | 663 |
593 V->setName(StringRef(ValueName.data(), ValueName.size())); | 664 V->setName(StringRef(ValueName.data(), ValueName.size())); |
594 ValueName.clear(); | 665 ValueName.clear(); |
595 break; | 666 break; |
596 } | 667 } |
597 case naclbitc::VST_CODE_BBENTRY: { | 668 case naclbitc::VST_CODE_BBENTRY: { |
598 if (ConvertToString(Record, 1, ValueName)) | 669 if (ConvertToString(Record, 1, ValueName)) |
599 return Error("Invalid VST_BBENTRY record"); | 670 return Error(InvalidRecord, "Invalid VST_BBENTRY record"); |
600 BasicBlock *BB = getBasicBlock(Record[0]); | 671 BasicBlock *BB = getBasicBlock(Record[0]); |
601 if (BB == 0) | 672 if (BB == 0) |
602 return Error("Invalid BB ID in VST_BBENTRY record"); | 673 return Error(InvalidValue, "Invalid BB ID in VST_BBENTRY record"); |
603 | 674 |
604 BB->setName(StringRef(ValueName.data(), ValueName.size())); | 675 BB->setName(StringRef(ValueName.data(), ValueName.size())); |
605 ValueName.clear(); | 676 ValueName.clear(); |
606 break; | 677 break; |
607 } | 678 } |
608 } | 679 } |
609 } | 680 } |
610 } | 681 } |
611 | 682 |
612 bool NaClBitcodeReader::ParseConstants() { | 683 std::error_code NaClBitcodeReader::ParseConstants() { |
613 DEBUG(dbgs() << "-> ParseConstants\n"); | 684 DEBUG(dbgs() << "-> ParseConstants\n"); |
614 if (Stream.EnterSubBlock(naclbitc::CONSTANTS_BLOCK_ID)) | 685 if (Stream.EnterSubBlock(naclbitc::CONSTANTS_BLOCK_ID)) |
615 return Error("Malformed block record"); | 686 return Error(InvalidRecord, "Malformed block record"); |
616 | 687 |
617 SmallVector<uint64_t, 64> Record; | 688 SmallVector<uint64_t, 64> Record; |
618 | 689 |
619 // Read all the records for this value table. | 690 // Read all the records for this value table. |
620 Type *CurTy = Type::getInt32Ty(Context); | 691 Type *CurTy = Type::getInt32Ty(Context); |
621 unsigned NextCstNo = ValueList.size(); | 692 unsigned NextCstNo = ValueList.size(); |
622 while (1) { | 693 while (1) { |
623 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); | 694 NaClBitstreamEntry Entry = Stream.advanceSkippingSubblocks(); |
624 | 695 |
625 switch (Entry.Kind) { | 696 switch (Entry.Kind) { |
626 case NaClBitstreamEntry::SubBlock: // Handled for us already. | 697 case NaClBitstreamEntry::SubBlock: // Handled for us already. |
627 case NaClBitstreamEntry::Error: | 698 case NaClBitstreamEntry::Error: |
628 return Error("malformed block record in AST file"); | 699 return Error(MalformedBlock, "malformed block record in AST file"); |
629 case NaClBitstreamEntry::EndBlock: | 700 case NaClBitstreamEntry::EndBlock: |
630 if (NextCstNo != ValueList.size()) | 701 if (NextCstNo != ValueList.size()) |
631 return Error("Invalid constant reference!"); | 702 return Error(InvalidConstantReference, |
703 "Invalid constant reference!"); | |
632 DEBUG(dbgs() << "<- ParseConstants\n"); | 704 DEBUG(dbgs() << "<- ParseConstants\n"); |
633 return false; | 705 return std::error_code(); |
634 case NaClBitstreamEntry::Record: | 706 case NaClBitstreamEntry::Record: |
635 // The interesting case. | 707 // The interesting case. |
636 break; | 708 break; |
637 } | 709 } |
638 | 710 |
639 // Read a record. | 711 // Read a record. |
640 Record.clear(); | 712 Record.clear(); |
641 Value *V = 0; | 713 Value *V = 0; |
642 unsigned BitCode = Stream.readRecord(Entry.ID, Record); | 714 unsigned BitCode = Stream.readRecord(Entry.ID, Record); |
643 switch (BitCode) { | 715 switch (BitCode) { |
644 default: { | 716 default: { |
645 std::string Message; | 717 std::string Message; |
646 raw_string_ostream StrM(Message); | 718 raw_string_ostream StrM(Message); |
647 StrM << "Invalid Constant code: " << BitCode; | 719 StrM << "Invalid Constant code: " << BitCode; |
648 StrM.flush(); | 720 StrM.flush(); |
649 return Error(Message); | 721 return Error(InvalidValue, Message); |
650 } | 722 } |
651 case naclbitc::CST_CODE_UNDEF: // UNDEF | 723 case naclbitc::CST_CODE_UNDEF: // UNDEF |
652 V = UndefValue::get(CurTy); | 724 V = UndefValue::get(CurTy); |
653 break; | 725 break; |
654 case naclbitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] | 726 case naclbitc::CST_CODE_SETTYPE: // SETTYPE: [typeid] |
655 if (Record.empty()) | 727 if (Record.empty()) |
656 return Error("Malformed CST_SETTYPE record"); | 728 return Error(NaClBitcodeReader::InvalidRecord, |
729 "Malformed CST_SETTYPE record"); | |
657 if (Record[0] >= TypeList.size()) | 730 if (Record[0] >= TypeList.size()) |
658 return Error("Invalid Type ID in CST_SETTYPE record"); | 731 return Error(NaClBitcodeReader::InvalidType, |
732 "Invalid Type ID in CST_SETTYPE record"); | |
659 CurTy = TypeList[Record[0]]; | 733 CurTy = TypeList[Record[0]]; |
660 continue; // Skip the ValueList manipulation. | 734 continue; // Skip the ValueList manipulation. |
661 case naclbitc::CST_CODE_INTEGER: // INTEGER: [intval] | 735 case naclbitc::CST_CODE_INTEGER: // INTEGER: [intval] |
662 if (!CurTy->isIntegerTy() || Record.empty()) | 736 if (!CurTy->isIntegerTy() || Record.empty()) |
663 return Error("Invalid CST_INTEGER record"); | 737 return Error(InvalidRecord, "Invalid CST_INTEGER record"); |
664 V = ConstantInt::get(CurTy, NaClDecodeSignRotatedValue(Record[0])); | 738 V = ConstantInt::get(CurTy, NaClDecodeSignRotatedValue(Record[0])); |
665 break; | 739 break; |
666 case naclbitc::CST_CODE_FLOAT: { // FLOAT: [fpval] | 740 case naclbitc::CST_CODE_FLOAT: { // FLOAT: [fpval] |
667 if (Record.empty()) | 741 if (Record.empty()) |
668 return Error("Invalid FLOAT record"); | 742 return Error(NaClBitcodeReader::InvalidRecord, "Invalid FLOAT record"); |
669 if (CurTy->isFloatTy()) | 743 if (CurTy->isFloatTy()) |
670 V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, | 744 V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle, |
671 APInt(32, (uint32_t)Record[0]))); | 745 APInt(32, (uint32_t)Record[0]))); |
672 else if (CurTy->isDoubleTy()) | 746 else if (CurTy->isDoubleTy()) |
673 V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, | 747 V = ConstantFP::get(Context, APFloat(APFloat::IEEEdouble, |
674 APInt(64, Record[0]))); | 748 APInt(64, Record[0]))); |
675 else | 749 else |
676 return Error("Unknown type for FLOAT record"); | 750 return Error(NaClBitcodeReader::InvalidRecord, |
751 "Unknown type for FLOAT record"); | |
677 break; | 752 break; |
678 } | 753 } |
679 } | 754 } |
680 | 755 |
681 ValueList.AssignValue(V, NextCstNo); | 756 ValueList.AssignValue(V, NextCstNo); |
682 ++NextCstNo; | 757 ++NextCstNo; |
683 } | 758 } |
759 return std::error_code(); | |
684 } | 760 } |
685 | 761 |
686 /// RememberAndSkipFunctionBody - When we see the block for a function body, | 762 /// RememberAndSkipFunctionBody - When we see the block for a function body, |
687 /// remember where it is and then skip it. This lets us lazily deserialize the | 763 /// remember where it is and then skip it. This lets us lazily deserialize the |
688 /// functions. | 764 /// functions. |
689 bool NaClBitcodeReader::RememberAndSkipFunctionBody() { | 765 std::error_code NaClBitcodeReader::RememberAndSkipFunctionBody() { |
690 DEBUG(dbgs() << "-> RememberAndSkipFunctionBody\n"); | 766 DEBUG(dbgs() << "-> RememberAndSkipFunctionBody\n"); |
691 // Get the function we are talking about. | 767 // Get the function we are talking about. |
692 if (FunctionsWithBodies.empty()) | 768 if (FunctionsWithBodies.empty()) |
693 return Error("Insufficient function protos"); | 769 return Error(NaClBitcodeReader::MalformedBlock, |
jvoung (off chromium)
2014/12/01 23:23:49
Upstream they have a separate error code for this.
Karl
2014/12/03 18:32:09
Changed to match upstream.
| |
770 "Insufficient function protos"); | |
694 | 771 |
695 Function *Fn = FunctionsWithBodies.back(); | 772 Function *Fn = FunctionsWithBodies.back(); |
696 FunctionsWithBodies.pop_back(); | 773 FunctionsWithBodies.pop_back(); |
697 | 774 |
698 // Save the current stream state. | 775 // Save the current stream state. |
699 uint64_t CurBit = Stream.GetCurrentBitNo(); | 776 uint64_t CurBit = Stream.GetCurrentBitNo(); |
700 DeferredFunctionInfo[Fn] = CurBit; | 777 DeferredFunctionInfo[Fn] = CurBit; |
701 | 778 |
702 // Skip over the function block for now. | 779 // Skip over the function block for now. |
703 if (Stream.SkipBlock()) | 780 if (Stream.SkipBlock()) |
704 return Error("Malformed block record"); | 781 return Error(MalformedBlock, "Malformed block record"); |
705 DEBUG(dbgs() << "<- RememberAndSkipFunctionBody\n"); | 782 DEBUG(dbgs() << "<- RememberAndSkipFunctionBody\n"); |
706 return false; | 783 return std::error_code(); |
707 } | 784 } |
708 | 785 |
709 bool NaClBitcodeReader::GlobalCleanup() { | 786 std::error_code NaClBitcodeReader::GlobalCleanup() { |
710 // Look for intrinsic functions which need to be upgraded at some point | 787 // Look for intrinsic functions which need to be upgraded at some point |
711 for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); | 788 for (Module::iterator FI = TheModule->begin(), FE = TheModule->end(); |
712 FI != FE; ++FI) { | 789 FI != FE; ++FI) { |
713 Function *NewFn; | 790 Function *NewFn; |
714 if (UpgradeIntrinsicFunction(FI, NewFn)) | 791 if (UpgradeIntrinsicFunction(FI, NewFn)) |
715 UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); | 792 UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn)); |
716 } | 793 } |
717 | 794 |
718 // Look for global variables which need to be renamed. | 795 // Look for global variables which need to be renamed. |
719 for (Module::global_iterator | 796 for (Module::global_iterator |
720 GI = TheModule->global_begin(), GE = TheModule->global_end(); | 797 GI = TheModule->global_begin(), GE = TheModule->global_end(); |
721 GI != GE; ++GI) | 798 GI != GE; ++GI) |
722 UpgradeGlobalVariable(GI); | 799 UpgradeGlobalVariable(GI); |
723 return false; | 800 return std::error_code(); |
724 } | 801 } |
725 | 802 |
726 FunctionType *NaClBitcodeReader::AddPointerTypesToIntrinsicType( | 803 FunctionType *NaClBitcodeReader::AddPointerTypesToIntrinsicType( |
727 StringRef Name, FunctionType *FTy) { | 804 StringRef Name, FunctionType *FTy) { |
728 FunctionType *IntrinsicTy = AllowedIntrinsics.getIntrinsicType(Name); | 805 FunctionType *IntrinsicTy = AllowedIntrinsics.getIntrinsicType(Name); |
729 if (IntrinsicTy == 0) return FTy; | 806 if (IntrinsicTy == 0) return FTy; |
730 | 807 |
731 Type *IReturnTy = IntrinsicTy->getReturnType(); | 808 Type *IReturnTy = IntrinsicTy->getReturnType(); |
732 Type *FReturnTy = FTy->getReturnType(); | 809 Type *FReturnTy = FTy->getReturnType(); |
733 | 810 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
770 Function *NewIntrinsic = Function::Create( | 847 Function *NewIntrinsic = Function::Create( |
771 ITy, GlobalValue::ExternalLinkage, "", TheModule); | 848 ITy, GlobalValue::ExternalLinkage, "", TheModule); |
772 NewIntrinsic->takeName(Func); | 849 NewIntrinsic->takeName(Func); |
773 ValueList.OverwriteValue(NewIntrinsic, Index); | 850 ValueList.OverwriteValue(NewIntrinsic, Index); |
774 Func->eraseFromParent(); | 851 Func->eraseFromParent(); |
775 } | 852 } |
776 } | 853 } |
777 } | 854 } |
778 } | 855 } |
779 | 856 |
780 bool NaClBitcodeReader::ParseModule(bool Resume) { | 857 std::error_code NaClBitcodeReader::ParseModule(bool Resume) { |
781 DEBUG(dbgs() << "-> ParseModule\n"); | 858 DEBUG(dbgs() << "-> ParseModule\n"); |
782 if (Resume) | 859 if (Resume) |
783 Stream.JumpToBit(NextUnreadBit); | 860 Stream.JumpToBit(NextUnreadBit); |
784 else if (Stream.EnterSubBlock(naclbitc::MODULE_BLOCK_ID)) | 861 else if (Stream.EnterSubBlock(naclbitc::MODULE_BLOCK_ID)) |
785 return Error("Malformed block record"); | 862 return Error(InvalidRecord, "Malformed block record"); |
786 | 863 |
787 SmallVector<uint64_t, 64> Record; | 864 SmallVector<uint64_t, 64> Record; |
788 | 865 |
789 // Read all the records for this module. | 866 // Read all the records for this module. |
790 while (1) { | 867 while (1) { |
791 NaClBitstreamEntry Entry = Stream.advance(0, 0); | 868 NaClBitstreamEntry Entry = Stream.advance(0, 0); |
792 | 869 |
793 switch (Entry.Kind) { | 870 switch (Entry.Kind) { |
794 case NaClBitstreamEntry::Error: | 871 case NaClBitstreamEntry::Error: |
795 Error("malformed module block"); | 872 return Error(MalformedBlock, "malformed module block"); |
796 return true; | |
797 case NaClBitstreamEntry::EndBlock: | 873 case NaClBitstreamEntry::EndBlock: |
798 DEBUG(dbgs() << "<- ParseModule\n"); | 874 DEBUG(dbgs() << "<- ParseModule\n"); |
799 return GlobalCleanup(); | 875 return GlobalCleanup(); |
800 | 876 |
801 case NaClBitstreamEntry::SubBlock: | 877 case NaClBitstreamEntry::SubBlock: |
802 switch (Entry.ID) { | 878 switch (Entry.ID) { |
803 default: { | 879 default: { |
804 std::string Message; | 880 std::string Message; |
805 raw_string_ostream StrM(Message); | 881 raw_string_ostream StrM(Message); |
806 StrM << "Unknown block ID: " << Entry.ID; | 882 StrM << "Unknown block ID: " << Entry.ID; |
807 return Error(StrM.str()); | 883 return Error(InvalidRecord, StrM.str()); |
808 } | 884 } |
809 case naclbitc::BLOCKINFO_BLOCK_ID: | 885 case naclbitc::BLOCKINFO_BLOCK_ID: |
810 if (Stream.ReadBlockInfoBlock(0)) | 886 if (Stream.ReadBlockInfoBlock(0)) |
811 return Error("Malformed BlockInfoBlock"); | 887 return Error(MalformedBlock, "Malformed BlockInfoBlock"); |
812 break; | 888 break; |
813 case naclbitc::TYPE_BLOCK_ID_NEW: | 889 case naclbitc::TYPE_BLOCK_ID_NEW: |
814 if (ParseTypeTable()) | 890 if (std::error_code EC = ParseTypeTable()) |
815 return true; | 891 return EC; |
816 break; | 892 break; |
817 case naclbitc::GLOBALVAR_BLOCK_ID: | 893 case naclbitc::GLOBALVAR_BLOCK_ID: |
818 if (ParseGlobalVars()) | 894 if (std::error_code EC = ParseGlobalVars()) |
819 return true; | 895 return EC; |
820 break; | 896 break; |
821 case naclbitc::VALUE_SYMTAB_BLOCK_ID: | 897 case naclbitc::VALUE_SYMTAB_BLOCK_ID: |
822 if (ParseValueSymbolTable()) | 898 if (std::error_code EC = ParseValueSymbolTable()) |
823 return true; | 899 return EC; |
824 SeenValueSymbolTable = true; | 900 SeenValueSymbolTable = true; |
825 // Now that we know the names of the intrinsics, we can add | 901 // Now that we know the names of the intrinsics, we can add |
826 // pointer types to the intrinsic declarations' types. | 902 // pointer types to the intrinsic declarations' types. |
827 AddPointerTypesToIntrinsicParams(); | 903 AddPointerTypesToIntrinsicParams(); |
828 break; | 904 break; |
829 case naclbitc::FUNCTION_BLOCK_ID: | 905 case naclbitc::FUNCTION_BLOCK_ID: |
830 // If this is the first function body we've seen, reverse the | 906 // If this is the first function body we've seen, reverse the |
831 // FunctionsWithBodies list. | 907 // FunctionsWithBodies list. |
832 if (!SeenFirstFunctionBody) { | 908 if (!SeenFirstFunctionBody) { |
833 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); | 909 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end()); |
834 if (GlobalCleanup()) | 910 if (std::error_code EC = GlobalCleanup()) |
835 return true; | 911 return EC; |
836 SeenFirstFunctionBody = true; | 912 SeenFirstFunctionBody = true; |
837 } | 913 } |
838 | 914 |
839 if (RememberAndSkipFunctionBody()) | 915 if (std::error_code EC = RememberAndSkipFunctionBody()) |
840 return true; | 916 return EC; |
841 | 917 |
842 // For streaming bitcode, suspend parsing when we reach the function | 918 // For streaming bitcode, suspend parsing when we reach the function |
843 // bodies. Subsequent materialization calls will resume it when | 919 // bodies. Subsequent materialization calls will resume it when |
844 // necessary. For streaming, the function bodies must be at the end of | 920 // necessary. For streaming, the function bodies must be at the end of |
845 // the bitcode. If the bitcode file is old, the symbol table will be | 921 // the bitcode. If the bitcode file is old, the symbol table will be |
846 // at the end instead and will not have been seen yet. In this case, | 922 // at the end instead and will not have been seen yet. In this case, |
847 // just finish the parse now. | 923 // just finish the parse now. |
848 if (LazyStreamer && SeenValueSymbolTable) { | 924 if (LazyStreamer && SeenValueSymbolTable) { |
849 NextUnreadBit = Stream.GetCurrentBitNo(); | 925 NextUnreadBit = Stream.GetCurrentBitNo(); |
850 DEBUG(dbgs() << "<- ParseModule\n"); | 926 DEBUG(dbgs() << "<- ParseModule\n"); |
851 return false; | 927 return std::error_code(); |
852 } | 928 } |
853 break; | 929 break; |
854 } | 930 } |
855 continue; | 931 continue; |
856 | 932 |
857 case NaClBitstreamEntry::Record: | 933 case NaClBitstreamEntry::Record: |
858 // The interesting case. | 934 // The interesting case. |
859 break; | 935 break; |
860 } | 936 } |
861 | 937 |
862 // Read a record. | 938 // Read a record. |
863 unsigned Selector = Stream.readRecord(Entry.ID, Record); | 939 unsigned Selector = Stream.readRecord(Entry.ID, Record); |
864 switch (Selector) { | 940 switch (Selector) { |
865 default: { | 941 default: { |
866 std::string Message; | 942 std::string Message; |
867 raw_string_ostream StrM(Message); | 943 raw_string_ostream StrM(Message); |
868 StrM << "Invalid MODULE_CODE: " << Selector; | 944 StrM << "Invalid MODULE_CODE: " << Selector; |
869 StrM.flush(); | 945 StrM.flush(); |
870 return Error(Message); | 946 return Error(InvalidValue, Message); |
871 } | 947 } |
872 case naclbitc::MODULE_CODE_VERSION: { // VERSION: [version#] | 948 case naclbitc::MODULE_CODE_VERSION: { // VERSION: [version#] |
873 if (Record.size() < 1) | 949 if (Record.size() < 1) |
874 return Error("Malformed MODULE_CODE_VERSION"); | 950 return Error(InvalidRecord, "Malformed MODULE_CODE_VERSION"); |
875 // Only version #1 is supported for PNaCl. Version #0 is not supported. | 951 // Only version #1 is supported for PNaCl. Version #0 is not supported. |
876 unsigned module_version = Record[0]; | 952 unsigned module_version = Record[0]; |
877 if (module_version != 1) | 953 if (module_version != 1) |
878 return Error("Unknown bitstream version!"); | 954 return Error(InvalidValue, "Unknown bitstream version!"); |
879 break; | 955 break; |
880 } | 956 } |
881 // FUNCTION: [type, callingconv, isproto, linkage] | 957 // FUNCTION: [type, callingconv, isproto, linkage] |
882 case naclbitc::MODULE_CODE_FUNCTION: { | 958 case naclbitc::MODULE_CODE_FUNCTION: { |
883 if (Record.size() < 4) | 959 if (Record.size() < 4) |
884 return Error("Invalid MODULE_CODE_FUNCTION record"); | 960 return Error(InvalidRecord, "Invalid MODULE_CODE_FUNCTION record"); |
885 Type *Ty = getTypeByID(Record[0]); | 961 Type *Ty = getTypeByID(Record[0]); |
886 if (!Ty) return Error("Invalid MODULE_CODE_FUNCTION record"); | 962 if (!Ty) |
963 return Error(InvalidType, "Invalid MODULE_CODE_FUNCTION record"); | |
887 FunctionType *FTy = dyn_cast<FunctionType>(Ty); | 964 FunctionType *FTy = dyn_cast<FunctionType>(Ty); |
888 if (!FTy) | 965 if (!FTy) |
889 return Error("Function not declared with a function type!"); | 966 return Error(InvalidType, |
967 "Function not declared with a function type!"); | |
890 | 968 |
891 Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, | 969 Function *Func = Function::Create(FTy, GlobalValue::ExternalLinkage, |
892 "", TheModule); | 970 "", TheModule); |
893 | 971 |
894 CallingConv::ID CallingConv; | 972 CallingConv::ID CallingConv; |
895 if (!naclbitc::DecodeCallingConv(Record[1], CallingConv)) | 973 if (!naclbitc::DecodeCallingConv(Record[1], CallingConv)) |
896 return Error("PNaCl bitcode contains invalid calling conventions."); | 974 return Error(InvalidValue, |
975 "PNaCl bitcode contains invalid calling conventions."); | |
897 Func->setCallingConv(CallingConv); | 976 Func->setCallingConv(CallingConv); |
898 bool isProto = Record[2]; | 977 bool isProto = Record[2]; |
899 GlobalValue::LinkageTypes Linkage; | 978 GlobalValue::LinkageTypes Linkage; |
900 if (!naclbitc::DecodeLinkage(Record[3], Linkage)) | 979 if (!naclbitc::DecodeLinkage(Record[3], Linkage)) |
901 return Error("Unknown linkage type"); | 980 return Error(InvalidValue, "Unknown linkage type"); |
902 Func->setLinkage(Linkage); | 981 Func->setLinkage(Linkage); |
903 ValueList.push_back(Func); | 982 ValueList.push_back(Func); |
904 | 983 |
905 // If this is a function with a body, remember the prototype we are | 984 // If this is a function with a body, remember the prototype we are |
906 // creating now, so that we can match up the body with them later. | 985 // creating now, so that we can match up the body with them later. |
907 if (!isProto) { | 986 if (!isProto) { |
908 FunctionsWithBodies.push_back(Func); | 987 FunctionsWithBodies.push_back(Func); |
909 if (LazyStreamer) DeferredFunctionInfo[Func] = 0; | 988 if (LazyStreamer) DeferredFunctionInfo[Func] = 0; |
910 } | 989 } |
911 break; | 990 break; |
912 } | 991 } |
913 } | 992 } |
914 Record.clear(); | 993 Record.clear(); |
915 } | 994 } |
995 return std::error_code(); | |
916 } | 996 } |
917 | 997 |
918 const char *llvm::PNaClDataLayout = | 998 const char *llvm::PNaClDataLayout = |
919 "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" | 999 "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" |
920 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"; | 1000 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"; |
921 | 1001 |
922 bool NaClBitcodeReader::ParseBitcodeInto(Module *M) { | 1002 std::error_code NaClBitcodeReader::ParseBitcodeInto(Module *M) { |
923 TheModule = 0; | 1003 TheModule = 0; |
924 | 1004 |
925 // PNaCl does not support different DataLayouts in pexes, so we | 1005 // PNaCl does not support different DataLayouts in pexes, so we |
926 // implicitly set the DataLayout to the following default. | 1006 // implicitly set the DataLayout to the following default. |
927 // | 1007 // |
928 // This is not usually needed by the backend, but it might be used | 1008 // This is not usually needed by the backend, but it might be used |
929 // by IR passes that the PNaCl translator runs. We set this in the | 1009 // by IR passes that the PNaCl translator runs. We set this in the |
930 // reader rather than in pnacl-llc so that 'opt' will also use the | 1010 // reader rather than in pnacl-llc so that 'opt' will also use the |
931 // correct DataLayout if it is run on a pexe. | 1011 // correct DataLayout if it is run on a pexe. |
932 M->setDataLayout(PNaClDataLayout); | 1012 M->setDataLayout(PNaClDataLayout); |
933 | 1013 |
934 if (InitStream()) return true; // InitSream will set the error string. | 1014 if (std::error_code EC = InitStream()) |
1015 return EC; | |
935 | 1016 |
936 // We expect a number of well-defined blocks, though we don't necessarily | 1017 // We expect a number of well-defined blocks, though we don't necessarily |
937 // need to understand them all. | 1018 // need to understand them all. |
938 while (1) { | 1019 while (1) { |
939 if (Stream.AtEndOfStream()) | 1020 if (Stream.AtEndOfStream()) |
940 return false; | 1021 return std::error_code(); |
941 | 1022 |
942 NaClBitstreamEntry Entry = | 1023 NaClBitstreamEntry Entry = |
943 Stream.advance(NaClBitstreamCursor::AF_DontAutoprocessAbbrevs, 0); | 1024 Stream.advance(NaClBitstreamCursor::AF_DontAutoprocessAbbrevs, 0); |
944 | 1025 |
945 switch (Entry.Kind) { | 1026 switch (Entry.Kind) { |
946 case NaClBitstreamEntry::Error: | 1027 case NaClBitstreamEntry::Error: |
947 Error("malformed module file"); | 1028 return Error(MalformedBlock, "malformed module file"); |
948 return true; | |
949 case NaClBitstreamEntry::EndBlock: | 1029 case NaClBitstreamEntry::EndBlock: |
950 return false; | 1030 return std::error_code(); |
951 | 1031 |
952 case NaClBitstreamEntry::SubBlock: | 1032 case NaClBitstreamEntry::SubBlock: |
953 switch (Entry.ID) { | 1033 switch (Entry.ID) { |
954 case naclbitc::BLOCKINFO_BLOCK_ID: | 1034 case naclbitc::BLOCKINFO_BLOCK_ID: |
955 if (Stream.ReadBlockInfoBlock(0)) | 1035 if (Stream.ReadBlockInfoBlock(0)) |
956 return Error("Malformed BlockInfoBlock"); | 1036 return Error(MalformedBlock, "Malformed BlockInfoBlock"); |
957 break; | 1037 break; |
958 case naclbitc::MODULE_BLOCK_ID: | 1038 case naclbitc::MODULE_BLOCK_ID: |
959 // Reject multiple MODULE_BLOCK's in a single bitstream. | 1039 // Reject multiple MODULE_BLOCK's in a single bitstream. |
960 if (TheModule) | 1040 if (TheModule) |
961 return Error("Multiple MODULE_BLOCKs in same stream"); | 1041 return Error(InvalidMultipleBlocks, |
1042 "Multiple MODULE_BLOCKs in same stream"); | |
962 TheModule = M; | 1043 TheModule = M; |
963 if (ParseModule(false)) | 1044 if (std::error_code EC = ParseModule(false)) |
964 return true; | 1045 return EC; |
965 if (LazyStreamer) return false; | 1046 if (LazyStreamer) |
1047 return std::error_code(); | |
966 break; | 1048 break; |
967 default: | 1049 default: |
968 if (Stream.SkipBlock()) | 1050 if (Stream.SkipBlock()) |
969 return Error("Malformed block record"); | 1051 return Error(InvalidRecord, "Malformed block record"); |
970 break; | 1052 break; |
971 } | 1053 } |
972 continue; | 1054 continue; |
973 case NaClBitstreamEntry::Record: | 1055 case NaClBitstreamEntry::Record: |
974 // There should be no records in the top-level of blocks. | 1056 // There should be no records in the top-level of blocks. |
975 return Error("Invalid record at top-level"); | 1057 return Error(InvalidRecord, "Invalid record at top-level"); |
976 } | 1058 } |
977 } | 1059 } |
978 } | 1060 } |
979 | 1061 |
980 // Returns true if error occured installing I into BB. | 1062 // Returns true if error occured installing I into BB. |
981 bool NaClBitcodeReader::InstallInstruction( | 1063 std::error_code NaClBitcodeReader::InstallInstruction( |
982 BasicBlock *BB, Instruction *I) { | 1064 BasicBlock *BB, Instruction *I) { |
983 // Add instruction to end of current BB. If there is no current BB, reject | 1065 // Add instruction to end of current BB. If there is no current BB, reject |
984 // this file. | 1066 // this file. |
985 if (BB == 0) { | 1067 if (BB == 0) { |
986 delete I; | 1068 delete I; |
987 return Error("Invalid instruction with no BB"); | 1069 return Error(InvalidBBForInstruction, |
1070 "Instruction with no BB, can't install"); | |
988 } | 1071 } |
989 BB->getInstList().push_back(I); | 1072 BB->getInstList().push_back(I); |
990 return false; | 1073 return std::error_code(); |
991 } | 1074 } |
992 | 1075 |
993 CastInst * | 1076 CastInst * |
994 NaClBitcodeReader::CreateCast(unsigned BBIndex, Instruction::CastOps Op, | 1077 NaClBitcodeReader::CreateCast(unsigned BBIndex, Instruction::CastOps Op, |
995 Type *CT, Value *V, bool DeferInsertion) { | 1078 Type *CT, Value *V, bool DeferInsertion) { |
996 if (BBIndex >= FunctionBBs.size()) | 1079 if (BBIndex >= FunctionBBs.size()) |
997 report_fatal_error("CreateCast on unknown basic block"); | 1080 report_fatal_error("CreateCast on unknown basic block"); |
998 BasicBlockInfo &BBInfo = FunctionBBs[BBIndex]; | 1081 BasicBlockInfo &BBInfo = FunctionBBs[BBIndex]; |
999 NaClBitcodeReaderCast ModeledCast(Op, CT, V); | 1082 NaClBitcodeReaderCast ModeledCast(Op, CT, V); |
1000 CastInst *Cast = BBInfo.CastMap[ModeledCast]; | 1083 CastInst *Cast = BBInfo.CastMap[ModeledCast]; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1035 return CreateCast(BBIndex, Instruction::IntToPtr, T, Op); | 1118 return CreateCast(BBIndex, Instruction::IntToPtr, T, Op); |
1036 } | 1119 } |
1037 | 1120 |
1038 std::string Message; | 1121 std::string Message; |
1039 raw_string_ostream StrM(Message); | 1122 raw_string_ostream StrM(Message); |
1040 StrM << "Can't convert " << *Op << " to type " << *T << "\n"; | 1123 StrM << "Can't convert " << *Op << " to type " << *T << "\n"; |
1041 report_fatal_error(StrM.str()); | 1124 report_fatal_error(StrM.str()); |
1042 } | 1125 } |
1043 | 1126 |
1044 /// ParseFunctionBody - Lazily parse the specified function body block. | 1127 /// ParseFunctionBody - Lazily parse the specified function body block. |
1045 bool NaClBitcodeReader::ParseFunctionBody(Function *F) { | 1128 std::error_code NaClBitcodeReader::ParseFunctionBody(Function *F) { |
1046 DEBUG(dbgs() << "-> ParseFunctionBody\n"); | 1129 DEBUG(dbgs() << "-> ParseFunctionBody\n"); |
1047 if (Stream.EnterSubBlock(naclbitc::FUNCTION_BLOCK_ID)) | 1130 if (Stream.EnterSubBlock(naclbitc::FUNCTION_BLOCK_ID)) |
1048 return Error("Malformed block record"); | 1131 return Error(InvalidRecord, "Malformed block record"); |
1049 | 1132 |
1050 unsigned ModuleValueListSize = ValueList.size(); | 1133 unsigned ModuleValueListSize = ValueList.size(); |
1051 | 1134 |
1052 // Add all the function arguments to the value table. | 1135 // Add all the function arguments to the value table. |
1053 for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) | 1136 for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) |
1054 ValueList.push_back(I); | 1137 ValueList.push_back(I); |
1055 | 1138 |
1056 unsigned NextValueNo = ValueList.size(); | 1139 unsigned NextValueNo = ValueList.size(); |
1057 BasicBlock *CurBB = 0; | 1140 BasicBlock *CurBB = 0; |
1058 unsigned CurBBNo = 0; | 1141 unsigned CurBBNo = 0; |
1059 | 1142 |
1060 // Read all the records. | 1143 // Read all the records. |
1061 SmallVector<uint64_t, 64> Record; | 1144 SmallVector<uint64_t, 64> Record; |
1062 while (1) { | 1145 while (1) { |
1063 NaClBitstreamEntry Entry = Stream.advance(0, 0); | 1146 NaClBitstreamEntry Entry = Stream.advance(0, 0); |
1064 | 1147 |
1065 switch (Entry.Kind) { | 1148 switch (Entry.Kind) { |
1066 case NaClBitstreamEntry::Error: | 1149 case NaClBitstreamEntry::Error: |
1067 return Error("Bitcode error in function block"); | 1150 return Error(MalformedBlock, "Bitcode error in function block"); |
1068 case NaClBitstreamEntry::EndBlock: | 1151 case NaClBitstreamEntry::EndBlock: |
1069 goto OutOfRecordLoop; | 1152 goto OutOfRecordLoop; |
1070 | 1153 |
1071 case NaClBitstreamEntry::SubBlock: | 1154 case NaClBitstreamEntry::SubBlock: |
1072 switch (Entry.ID) { | 1155 switch (Entry.ID) { |
1073 default: // Skip unknown content. | 1156 default: // Skip unknown content. |
1074 dbgs() << "default skip block\n"; | |
1075 if (Stream.SkipBlock()) | 1157 if (Stream.SkipBlock()) |
1076 return Error("Malformed block record"); | 1158 return Error(InvalidRecord, "Malformed block record"); |
jvoung (off chromium)
2014/12/01 23:23:49
If these are all InvalidRecord, maybe the verbose
Karl
2014/12/03 18:32:09
Upstream uses InvalidRecord if SkipBlock fails. Ad
| |
1077 break; | 1159 break; |
1078 case naclbitc::CONSTANTS_BLOCK_ID: | 1160 case naclbitc::CONSTANTS_BLOCK_ID: |
1079 if (ParseConstants()) | 1161 if (std::error_code EC = ParseConstants()) |
1080 return true; | 1162 return EC; |
1081 NextValueNo = ValueList.size(); | 1163 NextValueNo = ValueList.size(); |
1082 break; | 1164 break; |
1083 case naclbitc::VALUE_SYMTAB_BLOCK_ID: | 1165 case naclbitc::VALUE_SYMTAB_BLOCK_ID: |
1084 if (PNaClAllowLocalSymbolTables) { | 1166 if (PNaClAllowLocalSymbolTables) { |
1085 if (ParseValueSymbolTable()) | 1167 if (std::error_code EC = ParseValueSymbolTable()) |
1086 return true; | 1168 return EC; |
1087 } else { | 1169 } else { |
1088 return Error("Local value symbol tables not allowed"); | 1170 return Error(InvalidRecord, "Local value symbol tables not allowed"); |
1089 } | 1171 } |
1090 break; | 1172 break; |
1091 } | 1173 } |
1092 continue; | 1174 continue; |
1093 | 1175 |
1094 case NaClBitstreamEntry::Record: | 1176 case NaClBitstreamEntry::Record: |
1095 // The interesting case. | 1177 // The interesting case. |
1096 break; | 1178 break; |
1097 } | 1179 } |
1098 | 1180 |
1099 // Read a record. | 1181 // Read a record. |
1100 Record.clear(); | 1182 Record.clear(); |
1101 Instruction *I = 0; | 1183 Instruction *I = 0; |
1102 unsigned BitCode = Stream.readRecord(Entry.ID, Record); | 1184 unsigned BitCode = Stream.readRecord(Entry.ID, Record); |
1103 switch (BitCode) { | 1185 switch (BitCode) { |
1104 default: {// Default behavior: reject | 1186 default: {// Default behavior: reject |
1105 std::string Message; | 1187 std::string Message; |
1106 raw_string_ostream StrM(Message); | 1188 raw_string_ostream StrM(Message); |
1107 StrM << "Unknown instruction record: <" << BitCode; | 1189 StrM << "Unknown instruction record: <" << BitCode; |
1108 for (unsigned I = 0, E = Record.size(); I != E; ++I) { | 1190 for (unsigned I = 0, E = Record.size(); I != E; ++I) { |
1109 StrM << " " << Record[I]; | 1191 StrM << " " << Record[I]; |
1110 } | 1192 } |
1111 StrM << ">"; | 1193 StrM << ">"; |
1112 return Error(StrM.str()); | 1194 return Error(InvalidRecord, StrM.str()); |
1113 } | 1195 } |
1114 | 1196 |
1115 case naclbitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] | 1197 case naclbitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] |
1116 if (Record.size() != 1 || Record[0] == 0) | 1198 if (Record.size() != 1 || Record[0] == 0) |
1117 return Error("Invalid DECLAREBLOCKS record"); | 1199 return Error(InvalidRecord, "Invalid DECLAREBLOCKS record"); |
1118 // Create all the basic blocks for the function. | 1200 // Create all the basic blocks for the function. |
1119 FunctionBBs.resize(Record[0]); | 1201 FunctionBBs.resize(Record[0]); |
1120 for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) { | 1202 for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) { |
1121 BasicBlockInfo &BBInfo = FunctionBBs[i]; | 1203 BasicBlockInfo &BBInfo = FunctionBBs[i]; |
1122 BBInfo.BB = BasicBlock::Create(Context, "", F); | 1204 BBInfo.BB = BasicBlock::Create(Context, "", F); |
1123 } | 1205 } |
1124 CurBB = FunctionBBs.at(0).BB; | 1206 CurBB = FunctionBBs.at(0).BB; |
1125 continue; | 1207 continue; |
1126 | 1208 |
1127 case naclbitc::FUNC_CODE_INST_BINOP: { | 1209 case naclbitc::FUNC_CODE_INST_BINOP: { |
1128 // BINOP: [opval, opval, opcode[, flags]] | 1210 // BINOP: [opval, opval, opcode[, flags]] |
1129 // Note: Only old PNaCl bitcode files may contain flags. If | 1211 // Note: Only old PNaCl bitcode files may contain flags. If |
1130 // they are found, we ignore them. | 1212 // they are found, we ignore them. |
1131 unsigned OpNum = 0; | 1213 unsigned OpNum = 0; |
1132 Value *LHS, *RHS; | 1214 Value *LHS, *RHS; |
1133 if (popValue(Record, &OpNum, NextValueNo, &LHS) || | 1215 if (popValue(Record, &OpNum, NextValueNo, &LHS) || |
1134 popValue(Record, &OpNum, NextValueNo, &RHS) || | 1216 popValue(Record, &OpNum, NextValueNo, &RHS) || |
1135 OpNum+1 > Record.size()) | 1217 OpNum+1 > Record.size()) |
1136 return Error("Invalid BINOP record"); | 1218 return Error(InvalidRecord, "Invalid BINOP record"); |
1137 | 1219 |
1138 LHS = ConvertOpToScalar(LHS, CurBBNo); | 1220 LHS = ConvertOpToScalar(LHS, CurBBNo); |
1139 RHS = ConvertOpToScalar(RHS, CurBBNo); | 1221 RHS = ConvertOpToScalar(RHS, CurBBNo); |
1140 | 1222 |
1141 Instruction::BinaryOps Opc; | 1223 Instruction::BinaryOps Opc; |
1142 if (!naclbitc::DecodeBinaryOpcode(Record[OpNum++], LHS->getType(), Opc)) | 1224 if (!naclbitc::DecodeBinaryOpcode(Record[OpNum++], LHS->getType(), Opc)) |
1143 return Error("Invalid binary opcode in BINOP record"); | 1225 return Error(InvalidValue, "Invalid binary opcode in BINOP record"); |
1144 I = BinaryOperator::Create(Opc, LHS, RHS); | 1226 I = BinaryOperator::Create(Opc, LHS, RHS); |
1145 break; | 1227 break; |
1146 } | 1228 } |
1147 case naclbitc::FUNC_CODE_INST_CAST: { // CAST: [opval, destty, castopc] | 1229 case naclbitc::FUNC_CODE_INST_CAST: { // CAST: [opval, destty, castopc] |
1148 unsigned OpNum = 0; | 1230 unsigned OpNum = 0; |
1149 Value *Op; | 1231 Value *Op; |
1150 if (popValue(Record, &OpNum, NextValueNo, &Op) || | 1232 if (popValue(Record, &OpNum, NextValueNo, &Op) || |
1151 OpNum+2 != Record.size()) | 1233 OpNum+2 != Record.size()) |
1152 return Error("Invalid CAST record: bad record size"); | 1234 return Error(InvalidRecord, "Invalid CAST record: bad record size"); |
1153 | 1235 |
1154 Type *ResTy = getTypeByID(Record[OpNum]); | 1236 Type *ResTy = getTypeByID(Record[OpNum]); |
1155 if (ResTy == 0) | 1237 if (ResTy == 0) |
1156 return Error("Invalid CAST record: bad type ID"); | 1238 return Error(InvalidType, "Invalid CAST record: bad type ID"); |
1157 Instruction::CastOps Opc; | 1239 Instruction::CastOps Opc; |
1158 if (!naclbitc::DecodeCastOpcode(Record[OpNum+1], Opc)) { | 1240 if (!naclbitc::DecodeCastOpcode(Record[OpNum+1], Opc)) { |
1159 return Error("Invalid CAST record: bad opcode"); | 1241 return Error(InvalidValue, "Invalid CAST record: bad opcode"); |
1160 } | 1242 } |
1161 | 1243 |
1162 // If a ptrtoint cast was elided on the argument of the cast, | 1244 // If a ptrtoint cast was elided on the argument of the cast, |
1163 // add it back. Note: The casts allowed here should match the | 1245 // add it back. Note: The casts allowed here should match the |
1164 // casts in NaClValueEnumerator::ExpectsScalarValue. | 1246 // casts in NaClValueEnumerator::ExpectsScalarValue. |
1165 switch (Opc) { | 1247 switch (Opc) { |
1166 case Instruction::Trunc: | 1248 case Instruction::Trunc: |
1167 case Instruction::ZExt: | 1249 case Instruction::ZExt: |
1168 case Instruction::SExt: | 1250 case Instruction::SExt: |
1169 case Instruction::UIToFP: | 1251 case Instruction::UIToFP: |
(...skipping 10 matching lines...) Expand all Loading... | |
1180 | 1262 |
1181 case naclbitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [opval, opval, pred] | 1263 case naclbitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [opval, opval, pred] |
1182 // new form of select | 1264 // new form of select |
1183 // handles select i1 or select [N x i1] | 1265 // handles select i1 or select [N x i1] |
1184 unsigned OpNum = 0; | 1266 unsigned OpNum = 0; |
1185 Value *TrueVal, *FalseVal, *Cond; | 1267 Value *TrueVal, *FalseVal, *Cond; |
1186 if (popValue(Record, &OpNum, NextValueNo, &TrueVal) || | 1268 if (popValue(Record, &OpNum, NextValueNo, &TrueVal) || |
1187 popValue(Record, &OpNum, NextValueNo, &FalseVal) || | 1269 popValue(Record, &OpNum, NextValueNo, &FalseVal) || |
1188 popValue(Record, &OpNum, NextValueNo, &Cond) || | 1270 popValue(Record, &OpNum, NextValueNo, &Cond) || |
1189 OpNum != Record.size()) | 1271 OpNum != Record.size()) |
1190 return Error("Invalid SELECT record"); | 1272 return Error(InvalidRecord, "Invalid SELECT record"); |
1191 | 1273 |
1192 TrueVal = ConvertOpToScalar(TrueVal, CurBBNo); | 1274 TrueVal = ConvertOpToScalar(TrueVal, CurBBNo); |
1193 FalseVal = ConvertOpToScalar(FalseVal, CurBBNo); | 1275 FalseVal = ConvertOpToScalar(FalseVal, CurBBNo); |
1194 | 1276 |
1195 // select condition can be either i1 or [N x i1] | 1277 // select condition can be either i1 or [N x i1] |
1196 if (VectorType* vector_type = | 1278 if (VectorType* vector_type = |
1197 dyn_cast<VectorType>(Cond->getType())) { | 1279 dyn_cast<VectorType>(Cond->getType())) { |
1198 // expect <n x i1> | 1280 // expect <n x i1> |
1199 if (vector_type->getElementType() != Type::getInt1Ty(Context)) | 1281 if (vector_type->getElementType() != Type::getInt1Ty(Context)) |
1200 return Error("Invalid SELECT vector condition type"); | 1282 return Error(InvalidTypeForValue, |
1283 "Invalid SELECT vector condition type"); | |
1201 } else { | 1284 } else { |
1202 // expect i1 | 1285 // expect i1 |
1203 if (Cond->getType() != Type::getInt1Ty(Context)) | 1286 if (Cond->getType() != Type::getInt1Ty(Context)) |
1204 return Error("Invalid SELECT condition type"); | 1287 return Error(InvalidTypeForValue, "Invalid SELECT condition type"); |
1205 } | 1288 } |
1206 | 1289 |
1207 I = SelectInst::Create(Cond, TrueVal, FalseVal); | 1290 I = SelectInst::Create(Cond, TrueVal, FalseVal); |
1208 break; | 1291 break; |
1209 } | 1292 } |
1210 | 1293 |
1211 case naclbitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opval, opval] | 1294 case naclbitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opval, opval] |
1212 unsigned OpNum = 0; | 1295 unsigned OpNum = 0; |
1213 Value *Vec, *Idx; | 1296 Value *Vec, *Idx; |
1214 if (popValue(Record, &OpNum, NextValueNo, &Vec) || | 1297 if (popValue(Record, &OpNum, NextValueNo, &Vec) || |
1215 popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size()) | 1298 popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size()) |
1216 return Error("Invalid EXTRACTELEMENT record"); | 1299 return Error(InvalidRecord, "Invalid EXTRACTELEMENT record"); |
1217 | 1300 |
1218 // expect i32 | 1301 // expect i32 |
1219 if (Idx->getType() != Type::getInt32Ty(Context)) | 1302 if (Idx->getType() != Type::getInt32Ty(Context)) |
1220 return Error("Invalid EXTRACTELEMENT index type"); | 1303 return Error(InvalidTypeForValue, "Invalid EXTRACTELEMENT index type"); |
1221 | 1304 |
1222 I = ExtractElementInst::Create(Vec, Idx); | 1305 I = ExtractElementInst::Create(Vec, Idx); |
1223 break; | 1306 break; |
1224 } | 1307 } |
1225 | 1308 |
1226 case naclbitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [opval,opval,opval] | 1309 case naclbitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [opval,opval,opval] |
1227 unsigned OpNum = 0; | 1310 unsigned OpNum = 0; |
1228 Value *Vec, *Elt, *Idx; | 1311 Value *Vec, *Elt, *Idx; |
1229 if (popValue(Record, &OpNum, NextValueNo, &Vec) || | 1312 if (popValue(Record, &OpNum, NextValueNo, &Vec) || |
1230 popValue(Record, &OpNum, NextValueNo, &Elt) || | 1313 popValue(Record, &OpNum, NextValueNo, &Elt) || |
1231 popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size()) | 1314 popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size()) |
1232 return Error("Invalid INSERTELEMENT record"); | 1315 return Error(InvalidRecord, "Invalid INSERTELEMENT record"); |
1233 | 1316 |
1234 // expect vector type | 1317 // expect vector type |
1235 if (!isa<VectorType>(Vec->getType())) | 1318 if (!isa<VectorType>(Vec->getType())) |
1236 return Error("Invalid INSERTELEMENT vector type"); | 1319 return Error(InvalidTypeForValue, "Invalid INSERTELEMENT vector type"); |
1237 // match vector and element types | 1320 // match vector and element types |
1238 if (cast<VectorType>(Vec->getType())->getElementType() != Elt->getType()) | 1321 if (cast<VectorType>(Vec->getType())->getElementType() != Elt->getType()) |
1239 return Error("Mismatched INSERTELEMENT vector and element type"); | 1322 return Error(InvalidTypeForValue, |
1323 "Mismatched INSERTELEMENT vector and element type"); | |
1240 // expect i32 | 1324 // expect i32 |
1241 if (Idx->getType() != Type::getInt32Ty(Context)) | 1325 if (Idx->getType() != Type::getInt32Ty(Context)) |
1242 return Error("Invalid INSERTELEMENT index type"); | 1326 return Error(InvalidTypeForValue, "Invalid INSERTELEMENT index type"); |
1243 | 1327 |
1244 I = InsertElementInst::Create(Vec, Elt, Idx); | 1328 I = InsertElementInst::Create(Vec, Elt, Idx); |
1245 break; | 1329 break; |
1246 } | 1330 } |
1247 | 1331 |
1248 case naclbitc::FUNC_CODE_INST_CMP2: { // CMP2: [opval, opval, pred] | 1332 case naclbitc::FUNC_CODE_INST_CMP2: { // CMP2: [opval, opval, pred] |
1249 // FCmp/ICmp returning bool or vector of bool | 1333 // FCmp/ICmp returning bool or vector of bool |
1250 | 1334 |
1251 unsigned OpNum = 0; | 1335 unsigned OpNum = 0; |
1252 Value *LHS, *RHS; | 1336 Value *LHS, *RHS; |
1253 if (popValue(Record, &OpNum, NextValueNo, &LHS) || | 1337 if (popValue(Record, &OpNum, NextValueNo, &LHS) || |
1254 popValue(Record, &OpNum, NextValueNo, &RHS) || | 1338 popValue(Record, &OpNum, NextValueNo, &RHS) || |
1255 OpNum+1 != Record.size()) | 1339 OpNum+1 != Record.size()) |
1256 return Error("Invalid CMP record"); | 1340 return Error(InvalidRecord, "Invalid CMP record"); |
1257 | 1341 |
1258 LHS = ConvertOpToScalar(LHS, CurBBNo); | 1342 LHS = ConvertOpToScalar(LHS, CurBBNo); |
1259 RHS = ConvertOpToScalar(RHS, CurBBNo); | 1343 RHS = ConvertOpToScalar(RHS, CurBBNo); |
1260 | 1344 |
1261 CmpInst::Predicate Predicate; | 1345 CmpInst::Predicate Predicate; |
1262 if (LHS->getType()->isFPOrFPVectorTy()) { | 1346 if (LHS->getType()->isFPOrFPVectorTy()) { |
1263 if (!naclbitc::DecodeFcmpPredicate(Record[OpNum], Predicate)) | 1347 if (!naclbitc::DecodeFcmpPredicate(Record[OpNum], Predicate)) |
1264 return Error( | 1348 return Error( |
1349 InvalidValue, | |
1265 "PNaCl bitcode contains invalid floating comparison predicate"); | 1350 "PNaCl bitcode contains invalid floating comparison predicate"); |
1266 I = new FCmpInst(Predicate, LHS, RHS); | 1351 I = new FCmpInst(Predicate, LHS, RHS); |
1267 } else { | 1352 } else { |
1268 if (!naclbitc::DecodeIcmpPredicate(Record[OpNum], Predicate)) | 1353 if (!naclbitc::DecodeIcmpPredicate(Record[OpNum], Predicate)) |
1269 return Error( | 1354 return Error( |
1355 InvalidValue, | |
1270 "PNaCl bitcode contains invalid integer comparison predicate"); | 1356 "PNaCl bitcode contains invalid integer comparison predicate"); |
1271 I = new ICmpInst(Predicate, LHS, RHS); | 1357 I = new ICmpInst(Predicate, LHS, RHS); |
1272 } | 1358 } |
1273 break; | 1359 break; |
1274 } | 1360 } |
1275 | 1361 |
1276 case naclbitc::FUNC_CODE_INST_RET: // RET: [opval<optional>] | 1362 case naclbitc::FUNC_CODE_INST_RET: // RET: [opval<optional>] |
1277 { | 1363 { |
1278 unsigned Size = Record.size(); | 1364 unsigned Size = Record.size(); |
1279 if (Size == 0) { | 1365 if (Size == 0) { |
1280 I = ReturnInst::Create(Context); | 1366 I = ReturnInst::Create(Context); |
1281 break; | 1367 break; |
1282 } | 1368 } |
1283 | 1369 |
1284 unsigned OpNum = 0; | 1370 unsigned OpNum = 0; |
1285 Value *Op = NULL; | 1371 Value *Op = NULL; |
1286 if (popValue(Record, &OpNum, NextValueNo, &Op)) | 1372 if (popValue(Record, &OpNum, NextValueNo, &Op)) |
1287 return Error("Invalid RET record"); | 1373 return Error(InvalidRecord, "Invalid RET record"); |
1288 if (OpNum != Record.size()) | 1374 if (OpNum != Record.size()) |
1289 return Error("Invalid RET record"); | 1375 return Error(InvalidRecord, "Invalid RET record"); |
1290 | 1376 |
1291 I = ReturnInst::Create(Context, ConvertOpToScalar(Op, CurBBNo)); | 1377 I = ReturnInst::Create(Context, ConvertOpToScalar(Op, CurBBNo)); |
1292 break; | 1378 break; |
1293 } | 1379 } |
1294 case naclbitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] | 1380 case naclbitc::FUNC_CODE_INST_BR: { // BR: [bb#, bb#, opval] or [bb#] |
1295 if (Record.size() != 1 && Record.size() != 3) | 1381 if (Record.size() != 1 && Record.size() != 3) |
1296 return Error("Invalid BR record"); | 1382 return Error(InvalidRecord, "Invalid BR record"); |
1297 BasicBlock *TrueDest = getBasicBlock(Record[0]); | 1383 BasicBlock *TrueDest = getBasicBlock(Record[0]); |
1298 if (TrueDest == 0) | 1384 if (TrueDest == 0) |
1299 return Error("Invalid BR record"); | 1385 return Error(InvalidRecord, "Invalid BR record"); |
1300 | 1386 |
1301 if (Record.size() == 1) { | 1387 if (Record.size() == 1) { |
1302 I = BranchInst::Create(TrueDest); | 1388 I = BranchInst::Create(TrueDest); |
1303 } | 1389 } |
1304 else { | 1390 else { |
1305 BasicBlock *FalseDest = getBasicBlock(Record[1]); | 1391 BasicBlock *FalseDest = getBasicBlock(Record[1]); |
1306 Value *Cond = getValue(Record, 2, NextValueNo); | 1392 Value *Cond = getValue(Record, 2, NextValueNo); |
1307 if (FalseDest == 0 || Cond == 0) | 1393 if (FalseDest == 0 || Cond == 0) |
1308 return Error("Invalid BR record"); | 1394 return Error(InvalidValue, "Invalid BR record"); |
1309 I = BranchInst::Create(TrueDest, FalseDest, Cond); | 1395 I = BranchInst::Create(TrueDest, FalseDest, Cond); |
1310 } | 1396 } |
1311 break; | 1397 break; |
1312 } | 1398 } |
1313 case naclbitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] | 1399 case naclbitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...] |
1314 if (Record.size() < 4) | 1400 if (Record.size() < 4) |
1315 return Error("Invalid SWITCH record"); | 1401 return Error(InvalidRecord, "Invalid SWITCH record"); |
1316 Type *OpTy = getTypeByID(Record[0]); | 1402 Type *OpTy = getTypeByID(Record[0]); |
1317 unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); | 1403 unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); |
1318 if (ValueBitWidth > 64) | 1404 if (ValueBitWidth > 64) |
1319 return Error("Wide integers are not supported in PNaCl bitcode"); | 1405 return Error(InvalidValue, |
1406 "Wide integers are not supported in PNaCl bitcode"); | |
1320 | 1407 |
1321 Value *Cond = getValue(Record, 1, NextValueNo); | 1408 Value *Cond = getValue(Record, 1, NextValueNo); |
1322 BasicBlock *Default = getBasicBlock(Record[2]); | 1409 BasicBlock *Default = getBasicBlock(Record[2]); |
1323 if (OpTy == 0 || Cond == 0 || Default == 0) | 1410 if (OpTy == 0 || Cond == 0 || Default == 0) |
1324 return Error("Invalid SWITCH record"); | 1411 return Error(InvalidRecord, "Invalid SWITCH record"); |
1325 | 1412 |
1326 unsigned NumCases = Record[3]; | 1413 unsigned NumCases = Record[3]; |
1327 | 1414 |
1328 SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); | 1415 SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases); |
1329 | 1416 |
1330 unsigned CurIdx = 4; | 1417 unsigned CurIdx = 4; |
1331 for (unsigned i = 0; i != NumCases; ++i) { | 1418 for (unsigned i = 0; i != NumCases; ++i) { |
1332 // The PNaCl bitcode format has vestigial support for case | 1419 // The PNaCl bitcode format has vestigial support for case |
1333 // ranges, but we no longer support reading them because | 1420 // ranges, but we no longer support reading them because |
1334 // no-one produced them. | 1421 // no-one produced them. |
1335 // See https://code.google.com/p/nativeclient/issues/detail?id=3758 | 1422 // See https://code.google.com/p/nativeclient/issues/detail?id=3758 |
1336 unsigned NumItems = Record[CurIdx++]; | 1423 unsigned NumItems = Record[CurIdx++]; |
1337 bool isSingleNumber = Record[CurIdx++]; | 1424 bool isSingleNumber = Record[CurIdx++]; |
1338 if (NumItems != 1 || !isSingleNumber) | 1425 if (NumItems != 1 || !isSingleNumber) |
1339 return Error("Case ranges are not supported in PNaCl bitcode"); | 1426 return Error(InvalidRecord, |
1427 "Case ranges are not supported in PNaCl bitcode"); | |
1340 | 1428 |
1341 APInt CaseValue(ValueBitWidth, | 1429 APInt CaseValue(ValueBitWidth, |
1342 NaClDecodeSignRotatedValue(Record[CurIdx++])); | 1430 NaClDecodeSignRotatedValue(Record[CurIdx++])); |
1343 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]); | 1431 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]); |
1344 SI->addCase(ConstantInt::get(Context, CaseValue), DestBB); | 1432 SI->addCase(ConstantInt::get(Context, CaseValue), DestBB); |
1345 } | 1433 } |
1346 I = SI; | 1434 I = SI; |
1347 break; | 1435 break; |
1348 } | 1436 } |
1349 case naclbitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE | 1437 case naclbitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE |
1350 I = new UnreachableInst(Context); | 1438 I = new UnreachableInst(Context); |
1351 break; | 1439 break; |
1352 case naclbitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] | 1440 case naclbitc::FUNC_CODE_INST_PHI: { // PHI: [ty, val0,bb0, ...] |
1353 if (Record.size() < 1 || ((Record.size()-1)&1)) | 1441 if (Record.size() < 1 || ((Record.size()-1)&1)) |
1354 return Error("Invalid PHI record"); | 1442 return Error(InvalidRecord, "Invalid PHI record"); |
1355 Type *Ty = getTypeByID(Record[0]); | 1443 Type *Ty = getTypeByID(Record[0]); |
1356 if (!Ty) return Error("Invalid PHI record"); | 1444 if (!Ty) return Error(InvalidType, "Invalid PHI record"); |
1357 | 1445 |
1358 PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); | 1446 PHINode *PN = PHINode::Create(Ty, (Record.size()-1)/2); |
1359 | 1447 |
1360 for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { | 1448 for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { |
1361 Value *V; | 1449 Value *V; |
1362 // With relative value IDs, it is possible that operands have | 1450 // With relative value IDs, it is possible that operands have |
1363 // negative IDs (for forward references). Use a signed VBR | 1451 // negative IDs (for forward references). Use a signed VBR |
1364 // representation to keep the encoding small. | 1452 // representation to keep the encoding small. |
1365 V = getValueSigned(Record, 1+i, NextValueNo); | 1453 V = getValueSigned(Record, 1+i, NextValueNo); |
1366 unsigned BBIndex = Record[2+i]; | 1454 unsigned BBIndex = Record[2+i]; |
1367 BasicBlock *BB = getBasicBlock(BBIndex); | 1455 BasicBlock *BB = getBasicBlock(BBIndex); |
1368 if (!V || !BB) return Error("Invalid PHI record"); | 1456 if (!V || !BB) |
1457 return Error(InvalidValue, "Invalid PHI record"); | |
1369 if (Ty == IntPtrType) { | 1458 if (Ty == IntPtrType) { |
1370 // Delay installing scalar casts until all instructions of | 1459 // Delay installing scalar casts until all instructions of |
1371 // the function are rendered. This guarantees that we insert | 1460 // the function are rendered. This guarantees that we insert |
1372 // the conversion just before the incoming edge (or use an | 1461 // the conversion just before the incoming edge (or use an |
1373 // existing conversion if already installed). | 1462 // existing conversion if already installed). |
1374 V = ConvertOpToScalar(V, BBIndex, /* DeferInsertion = */ true); | 1463 V = ConvertOpToScalar(V, BBIndex, /* DeferInsertion = */ true); |
1375 } | 1464 } |
1376 PN->addIncoming(V, BB); | 1465 PN->addIncoming(V, BB); |
1377 } | 1466 } |
1378 I = PN; | 1467 I = PN; |
1379 break; | 1468 break; |
1380 } | 1469 } |
1381 | 1470 |
1382 case naclbitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [op, align] | 1471 case naclbitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [op, align] |
1383 if (Record.size() != 2) | 1472 if (Record.size() != 2) |
1384 return Error("Invalid ALLOCA record"); | 1473 return Error(InvalidRecord, "Invalid ALLOCA record"); |
1385 Value *Size; | 1474 Value *Size; |
1386 unsigned OpNum = 0; | 1475 unsigned OpNum = 0; |
1387 if (popValue(Record, &OpNum, NextValueNo, &Size)) | 1476 if (popValue(Record, &OpNum, NextValueNo, &Size)) |
1388 return Error("Invalid ALLOCA record"); | 1477 return Error(InvalidRecord, "Invalid ALLOCA record"); |
1389 unsigned Align = Record[1]; | 1478 unsigned Align = Record[1]; |
1390 I = new AllocaInst(Type::getInt8Ty(Context), Size, (1 << Align) >> 1); | 1479 I = new AllocaInst(Type::getInt8Ty(Context), Size, (1 << Align) >> 1); |
1391 break; | 1480 break; |
1392 } | 1481 } |
1393 case naclbitc::FUNC_CODE_INST_LOAD: { | 1482 case naclbitc::FUNC_CODE_INST_LOAD: { |
1394 // LOAD: [op, align, ty] | 1483 // LOAD: [op, align, ty] |
1395 unsigned OpNum = 0; | 1484 unsigned OpNum = 0; |
1396 Value *Op; | 1485 Value *Op; |
1397 if (popValue(Record, &OpNum, NextValueNo, &Op) || | 1486 if (popValue(Record, &OpNum, NextValueNo, &Op) || |
1398 Record.size() != 3) | 1487 Record.size() != 3) |
1399 return Error("Invalid LOAD record"); | 1488 return Error(InvalidRecord, "Invalid LOAD record"); |
1400 | 1489 |
1401 // Add pointer cast to op. | 1490 // Add pointer cast to op. |
1402 Type *T = getTypeByID(Record[2]); | 1491 Type *T = getTypeByID(Record[2]); |
1403 if (T == 0) | 1492 if (T == 0) |
1404 return Error("Invalid type for load instruction"); | 1493 return Error(InvalidType, "Invalid type for load instruction"); |
1405 Op = ConvertOpToType(Op, T->getPointerTo(), CurBBNo); | 1494 Op = ConvertOpToType(Op, T->getPointerTo(), CurBBNo); |
1406 if (Op == 0) return true; | 1495 if (Op == 0) |
jvoung (off chromium)
2014/12/01 23:23:49
nullptr instead of 0.
Actually, n/m. It may be be
Karl
2014/12/03 18:32:09
In general, I agree that we should delay. However,
| |
1496 return Error(InvalidTypeForValue, "Can't convert cast to type"); | |
1407 I = new LoadInst(Op, "", false, (1 << Record[OpNum]) >> 1); | 1497 I = new LoadInst(Op, "", false, (1 << Record[OpNum]) >> 1); |
1408 break; | 1498 break; |
1409 } | 1499 } |
1410 case naclbitc::FUNC_CODE_INST_STORE: { | 1500 case naclbitc::FUNC_CODE_INST_STORE: { |
1411 // STORE: [ptr, val, align] | 1501 // STORE: [ptr, val, align] |
1412 unsigned OpNum = 0; | 1502 unsigned OpNum = 0; |
1413 Value *Val, *Ptr; | 1503 Value *Val, *Ptr; |
1414 if (popValue(Record, &OpNum, NextValueNo, &Ptr) || | 1504 if (popValue(Record, &OpNum, NextValueNo, &Ptr) || |
1415 popValue(Record, &OpNum, NextValueNo, &Val) || | 1505 popValue(Record, &OpNum, NextValueNo, &Val) || |
1416 OpNum+1 != Record.size()) | 1506 OpNum+1 != Record.size()) |
1417 return Error("Invalid STORE record"); | 1507 return Error(InvalidRecord, "Invalid STORE record"); |
1418 Val = ConvertOpToScalar(Val, CurBBNo); | 1508 Val = ConvertOpToScalar(Val, CurBBNo); |
1419 Ptr = ConvertOpToType(Ptr, Val->getType()->getPointerTo(), CurBBNo); | 1509 Ptr = ConvertOpToType(Ptr, Val->getType()->getPointerTo(), CurBBNo); |
jvoung (off chromium)
2014/12/01 23:23:49
For loads, the code checks that ConvertOpToType re
Karl
2014/12/03 18:32:09
Good point. Adding test.
| |
1420 I = new StoreInst(Val, Ptr, false, (1 << Record[OpNum]) >> 1); | 1510 I = new StoreInst(Val, Ptr, false, (1 << Record[OpNum]) >> 1); |
1421 break; | 1511 break; |
1422 } | 1512 } |
1423 case naclbitc::FUNC_CODE_INST_CALL: | 1513 case naclbitc::FUNC_CODE_INST_CALL: |
1424 case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: { | 1514 case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: { |
1425 // CALL: [cc, fnid, arg0, arg1...] | 1515 // CALL: [cc, fnid, arg0, arg1...] |
1426 // CALL_INDIRECT: [cc, fnid, returnty, args...] | 1516 // CALL_INDIRECT: [cc, fnid, returnty, args...] |
1427 if ((Record.size() < 2) || | 1517 if ((Record.size() < 2) || |
1428 (BitCode == naclbitc::FUNC_CODE_INST_CALL_INDIRECT && | 1518 (BitCode == naclbitc::FUNC_CODE_INST_CALL_INDIRECT && |
1429 Record.size() < 3)) | 1519 Record.size() < 3)) |
1430 return Error("Invalid CALL record"); | 1520 return Error(InvalidRecord, "Invalid CALL record"); |
1431 | 1521 |
1432 unsigned CCInfo = Record[0]; | 1522 unsigned CCInfo = Record[0]; |
1433 | 1523 |
1434 unsigned OpNum = 1; | 1524 unsigned OpNum = 1; |
1435 Value *Callee; | 1525 Value *Callee; |
1436 if (popValue(Record, &OpNum, NextValueNo, &Callee)) | 1526 if (popValue(Record, &OpNum, NextValueNo, &Callee)) |
1437 return Error("Invalid CALL record"); | 1527 return Error(InvalidRecord, "Invalid CALL record"); |
1438 | 1528 |
1439 // Build function type for call. | 1529 // Build function type for call. |
1440 FunctionType *FTy = 0; | 1530 FunctionType *FTy = 0; |
1441 Type *ReturnType = 0; | 1531 Type *ReturnType = 0; |
1442 if (BitCode == naclbitc::FUNC_CODE_INST_CALL_INDIRECT) { | 1532 if (BitCode == naclbitc::FUNC_CODE_INST_CALL_INDIRECT) { |
1443 // Callee type has been elided, add back in. | 1533 // Callee type has been elided, add back in. |
1444 ReturnType = getTypeByID(Record[2]); | 1534 ReturnType = getTypeByID(Record[2]); |
1445 ++OpNum; | 1535 ++OpNum; |
1446 } else { | 1536 } else { |
1447 // Get type signature from callee. | 1537 // Get type signature from callee. |
1448 if (PointerType *OpTy = dyn_cast<PointerType>(Callee->getType())) { | 1538 if (PointerType *OpTy = dyn_cast<PointerType>(Callee->getType())) { |
1449 FTy = dyn_cast<FunctionType>(OpTy->getElementType()); | 1539 FTy = dyn_cast<FunctionType>(OpTy->getElementType()); |
1450 } | 1540 } |
1451 if (FTy == 0) | 1541 if (FTy == 0) |
1452 return Error("Invalid type for CALL record"); | 1542 return Error(InvalidType, "Invalid type for CALL record"); |
1453 } | 1543 } |
1454 | 1544 |
1455 unsigned NumParams = Record.size() - OpNum; | 1545 unsigned NumParams = Record.size() - OpNum; |
1456 if (FTy && NumParams != FTy->getNumParams()) | 1546 if (FTy && NumParams != FTy->getNumParams()) |
1457 return Error("Invalid CALL record"); | 1547 return Error(InvalidRecord, "Invalid CALL record"); |
1458 | 1548 |
1459 // Process call arguments. | 1549 // Process call arguments. |
1460 SmallVector<Value*, 6> Args; | 1550 SmallVector<Value*, 6> Args; |
1461 for (unsigned Index = 0; Index < NumParams; ++Index) { | 1551 for (unsigned Index = 0; Index < NumParams; ++Index) { |
1462 Value *Arg; | 1552 Value *Arg; |
1463 if (popValue(Record, &OpNum, NextValueNo, &Arg)) | 1553 if (popValue(Record, &OpNum, NextValueNo, &Arg)) |
1464 Error("Invalid argument in CALL record"); | 1554 Error(InvalidValue, "Invalid argument in CALL record"); |
1465 if (FTy) { | 1555 if (FTy) { |
1466 // Add a cast, to a pointer type if necessary, in case this | 1556 // Add a cast, to a pointer type if necessary, in case this |
1467 // is an intrinsic call that takes a pointer argument. | 1557 // is an intrinsic call that takes a pointer argument. |
1468 Arg = ConvertOpToType(Arg, FTy->getParamType(Index), CurBBNo); | 1558 Arg = ConvertOpToType(Arg, FTy->getParamType(Index), CurBBNo); |
1469 } else { | 1559 } else { |
1470 Arg = ConvertOpToScalar(Arg, CurBBNo); | 1560 Arg = ConvertOpToScalar(Arg, CurBBNo); |
1471 } | 1561 } |
1472 Args.push_back(Arg); | 1562 Args.push_back(Arg); |
1473 } | 1563 } |
1474 | 1564 |
1475 if (FTy == 0) { | 1565 if (FTy == 0) { |
1476 // Reconstruct the function type and cast the function pointer | 1566 // Reconstruct the function type and cast the function pointer |
1477 // to it. | 1567 // to it. |
1478 SmallVector<Type*, 6> ArgTypes; | 1568 SmallVector<Type*, 6> ArgTypes; |
1479 for (unsigned Index = 0; Index < NumParams; ++Index) | 1569 for (unsigned Index = 0; Index < NumParams; ++Index) |
1480 ArgTypes.push_back(Args[Index]->getType()); | 1570 ArgTypes.push_back(Args[Index]->getType()); |
1481 FTy = FunctionType::get(ReturnType, ArgTypes, false); | 1571 FTy = FunctionType::get(ReturnType, ArgTypes, false); |
1482 Callee = ConvertOpToType(Callee, FTy->getPointerTo(), CurBBNo); | 1572 Callee = ConvertOpToType(Callee, FTy->getPointerTo(), CurBBNo); |
1483 } | 1573 } |
1484 | 1574 |
1485 // Construct call. | 1575 // Construct call. |
1486 I = CallInst::Create(Callee, Args); | 1576 I = CallInst::Create(Callee, Args); |
1487 CallingConv::ID CallingConv; | 1577 CallingConv::ID CallingConv; |
1488 if (!naclbitc::DecodeCallingConv(CCInfo>>1, CallingConv)) | 1578 if (!naclbitc::DecodeCallingConv(CCInfo>>1, CallingConv)) |
1489 return Error("PNaCl bitcode contains invalid calling conventions."); | 1579 return Error(InvalidValue, |
1580 "PNaCl bitcode contains invalid calling conventions."); | |
1490 cast<CallInst>(I)->setCallingConv(CallingConv); | 1581 cast<CallInst>(I)->setCallingConv(CallingConv); |
1491 cast<CallInst>(I)->setTailCall(CCInfo & 1); | 1582 cast<CallInst>(I)->setTailCall(CCInfo & 1); |
1492 break; | 1583 break; |
1493 } | 1584 } |
1494 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: | 1585 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: |
1495 // Build corresponding forward reference. | 1586 // Build corresponding forward reference. |
1496 if (Record.size() != 2 || | 1587 if (Record.size() != 2 || |
1497 ValueList.createValueFwdRef(Record[0], getTypeByID(Record[1]))) | 1588 ValueList.createValueFwdRef(Record[0], getTypeByID(Record[1]))) |
1498 return Error("Invalid FORWARDTYPEREF record"); | 1589 return Error(InvalidRecord, "Invalid FORWARDTYPEREF record"); |
1499 continue; | 1590 continue; |
1500 } | 1591 } |
1501 | 1592 |
1502 if (InstallInstruction(CurBB, I)) | 1593 if (std::error_code EC = InstallInstruction(CurBB, I)) |
1503 return true; | 1594 return EC; |
1504 | 1595 |
1505 // If this was a terminator instruction, move to the next block. | 1596 // If this was a terminator instruction, move to the next block. |
1506 if (isa<TerminatorInst>(I)) { | 1597 if (isa<TerminatorInst>(I)) { |
1507 ++CurBBNo; | 1598 ++CurBBNo; |
1508 CurBB = getBasicBlock(CurBBNo); | 1599 CurBB = getBasicBlock(CurBBNo); |
1509 } | 1600 } |
1510 | 1601 |
1511 // Non-void values get registered in the value table for future use. | 1602 // Non-void values get registered in the value table for future use. |
1512 if (I && !I->getType()->isVoidTy()) { | 1603 if (I && !I->getType()->isVoidTy()) { |
1513 Value *NewVal = I; | 1604 Value *NewVal = I; |
(...skipping 29 matching lines...) Expand all Loading... | |
1543 // Check the function list for unresolved values. | 1634 // Check the function list for unresolved values. |
1544 if (Argument *A = dyn_cast<Argument>(ValueList.back())) { | 1635 if (Argument *A = dyn_cast<Argument>(ValueList.back())) { |
1545 if (A->getParent() == 0) { | 1636 if (A->getParent() == 0) { |
1546 // We found at least one unresolved value. Nuke them all to avoid leaks. | 1637 // We found at least one unresolved value. Nuke them all to avoid leaks. |
1547 for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ | 1638 for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ |
1548 if ((A = dyn_cast<Argument>(ValueList[i])) && A->getParent() == 0) { | 1639 if ((A = dyn_cast<Argument>(ValueList[i])) && A->getParent() == 0) { |
1549 A->replaceAllUsesWith(UndefValue::get(A->getType())); | 1640 A->replaceAllUsesWith(UndefValue::get(A->getType())); |
1550 delete A; | 1641 delete A; |
1551 } | 1642 } |
1552 } | 1643 } |
1553 return Error("Never resolved value found in function!"); | 1644 return Error(InvalidValue, "Never resolved value found in function!"); |
1554 } | 1645 } |
1555 } | 1646 } |
1556 | 1647 |
1557 // Trim the value list down to the size it was before we parsed this function. | 1648 // Trim the value list down to the size it was before we parsed this function. |
1558 ValueList.shrinkTo(ModuleValueListSize); | 1649 ValueList.shrinkTo(ModuleValueListSize); |
1559 FunctionBBs.clear(); | 1650 FunctionBBs.clear(); |
1560 DEBUG(dbgs() << "-> ParseFunctionBody\n"); | 1651 DEBUG(dbgs() << "-> ParseFunctionBody\n"); |
1561 return false; | 1652 return std::error_code(); |
1562 } | 1653 } |
1563 | 1654 |
1564 /// FindFunctionInStream - Find the function body in the bitcode stream | 1655 /// FindFunctionInStream - Find the function body in the bitcode stream |
1565 bool NaClBitcodeReader::FindFunctionInStream(Function *F, | 1656 std::error_code NaClBitcodeReader::FindFunctionInStream( |
1566 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator) { | 1657 Function *F, |
1658 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator) { | |
1567 while (DeferredFunctionInfoIterator->second == 0) { | 1659 while (DeferredFunctionInfoIterator->second == 0) { |
1568 if (Stream.AtEndOfStream()) | 1660 if (Stream.AtEndOfStream()) |
1569 return Error("Could not find Function in stream"); | 1661 return Error(NoFunctionInStream, "Could not find Function in stream"); |
1570 // ParseModule will parse the next body in the stream and set its | 1662 // ParseModule will parse the next body in the stream and set its |
1571 // position in the DeferredFunctionInfo map. | 1663 // position in the DeferredFunctionInfo map. |
1572 if (ParseModule(true)) return true; | 1664 if (std::error_code EC = ParseModule(true)) |
1665 return EC; | |
1573 } | 1666 } |
1574 return false; | 1667 return std::error_code(); |
1575 } | 1668 } |
1576 | 1669 |
1577 //===----------------------------------------------------------------------===// | 1670 //===----------------------------------------------------------------------===// |
1578 // GVMaterializer implementation | 1671 // GVMaterializer implementation |
1579 //===----------------------------------------------------------------------===// | 1672 //===----------------------------------------------------------------------===// |
1580 | 1673 |
1581 void NaClBitcodeReader::releaseBuffer() { Buffer.release(); } | 1674 void NaClBitcodeReader::releaseBuffer() { Buffer.release(); } |
1582 | 1675 |
1583 bool NaClBitcodeReader::isMaterializable(const GlobalValue *GV) const { | 1676 bool NaClBitcodeReader::isMaterializable(const GlobalValue *GV) const { |
1584 if (const Function *F = dyn_cast<Function>(GV)) { | 1677 if (const Function *F = dyn_cast<Function>(GV)) { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1687 if (!I->first->use_empty()) | 1780 if (!I->first->use_empty()) |
1688 I->first->replaceAllUsesWith(I->second); | 1781 I->first->replaceAllUsesWith(I->second); |
1689 I->first->eraseFromParent(); | 1782 I->first->eraseFromParent(); |
1690 } | 1783 } |
1691 } | 1784 } |
1692 std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); | 1785 std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); |
1693 | 1786 |
1694 return std::error_code(); | 1787 return std::error_code(); |
1695 } | 1788 } |
1696 | 1789 |
1697 bool NaClBitcodeReader::InitStream() { | 1790 std::error_code NaClBitcodeReader::InitStream() { |
1698 if (LazyStreamer) return InitLazyStream(); | 1791 if (LazyStreamer) |
1792 return InitLazyStream(); | |
1699 return InitStreamFromBuffer(); | 1793 return InitStreamFromBuffer(); |
1700 } | 1794 } |
1701 | 1795 |
1702 bool NaClBitcodeReader::InitStreamFromBuffer() { | 1796 std::error_code NaClBitcodeReader::InitStreamFromBuffer() { |
1703 const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); | 1797 const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart(); |
1704 const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); | 1798 const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize(); |
1705 | 1799 |
1706 if (Buffer->getBufferSize() & 3) | 1800 if (Buffer->getBufferSize() & 3) |
1707 return Error("Bitcode stream should be a multiple of 4 bytes in length"); | 1801 return Error(InvalidBitstream, |
1802 "Bitcode stream should be a multiple of 4 bytes in length"); | |
1708 | 1803 |
1709 if (Header.Read(BufPtr, BufEnd)) | 1804 if (Header.Read(BufPtr, BufEnd)) |
1710 return Error(Header.Unsupported()); | 1805 return Error(InvalidBitstream, Header.Unsupported()); |
1711 | 1806 |
1712 StreamFile.reset(new NaClBitstreamReader(BufPtr, BufEnd)); | 1807 StreamFile.reset(new NaClBitstreamReader(BufPtr, BufEnd)); |
1713 Stream.init(*StreamFile); | 1808 Stream.init(*StreamFile); |
1714 | 1809 |
1715 if (AcceptHeader()) | 1810 if (AcceptHeader()) |
1716 return Error(Header.Unsupported()); | 1811 return Error(InvalidBitstream, Header.Unsupported()); |
1717 return false; | 1812 return std::error_code(); |
1718 } | 1813 } |
1719 | 1814 |
1720 bool NaClBitcodeReader::InitLazyStream() { | 1815 std::error_code NaClBitcodeReader::InitLazyStream() { |
1721 if (Header.Read(LazyStreamer)) | 1816 if (Header.Read(LazyStreamer)) |
1722 return Error(Header.Unsupported()); | 1817 return Error(InvalidBitstream, Header.Unsupported()); |
1723 | 1818 |
1724 StreamFile.reset(new NaClBitstreamReader(LazyStreamer, | 1819 StreamFile.reset(new NaClBitstreamReader(LazyStreamer, |
1725 Header.getHeaderSize())); | 1820 Header.getHeaderSize())); |
1726 Stream.init(*StreamFile); | 1821 Stream.init(*StreamFile); |
1727 if (AcceptHeader()) | 1822 if (AcceptHeader()) |
1728 return Error(Header.Unsupported()); | 1823 return Error(InvalidBitstream, Header.Unsupported()); |
1729 return false; | 1824 return std::error_code(); |
1730 } | 1825 } |
1731 | 1826 |
1732 //===----------------------------------------------------------------------===// | 1827 //===----------------------------------------------------------------------===// |
1733 // External interface | 1828 // External interface |
1734 //===----------------------------------------------------------------------===// | 1829 //===----------------------------------------------------------------------===// |
1735 | 1830 |
1736 /// getNaClLazyBitcodeModule - lazy function-at-a-time loading from a file. | 1831 /// getNaClLazyBitcodeModule - lazy function-at-a-time loading from a file. |
1737 /// | 1832 /// |
1738 Module *llvm::getNaClLazyBitcodeModule(MemoryBuffer *Buffer, | 1833 ErrorOr<Module *> llvm::getNaClLazyBitcodeModule( |
1739 LLVMContext& Context, | 1834 MemoryBuffer *Buffer, LLVMContext& Context, bool VerboseErrors, |
1740 std::string *ErrMsg, | 1835 bool AcceptSupportedOnly) { |
1741 bool AcceptSupportedOnly) { | |
1742 Module *M = new Module(Buffer->getBufferIdentifier(), Context); | 1836 Module *M = new Module(Buffer->getBufferIdentifier(), Context); |
1743 NaClBitcodeReader *R = | 1837 NaClBitcodeReader *R = |
1744 new NaClBitcodeReader(Buffer, Context, AcceptSupportedOnly); | 1838 new NaClBitcodeReader(Buffer, Context, VerboseErrors, AcceptSupportedOnly) ; |
1745 M->setMaterializer(R); | 1839 M->setMaterializer(R); |
1746 if (R->ParseBitcodeInto(M)) { | 1840 if (std::error_code EC = R->ParseBitcodeInto(M)) { |
1747 if (ErrMsg) | 1841 R->releaseBuffer(); // Never take ownership on error. |
1748 *ErrMsg = R->getErrorString(); | |
1749 | |
1750 delete M; // Also deletes R. | 1842 delete M; // Also deletes R. |
1751 return 0; | 1843 return EC; |
1752 } | 1844 } |
1753 | 1845 |
1754 return M; | 1846 return M; |
1755 } | 1847 } |
1756 | 1848 |
1757 | 1849 |
1758 Module *llvm::getNaClStreamedBitcodeModule(const std::string &name, | 1850 Module *llvm::getNaClStreamedBitcodeModule(const std::string &name, |
1759 StreamingMemoryObject *Streamer, | 1851 StreamingMemoryObject *Streamer, |
1760 LLVMContext &Context, | 1852 LLVMContext &Context, |
1853 bool VerboseErrors, | |
1761 std::string *ErrMsg, | 1854 std::string *ErrMsg, |
1762 bool AcceptSupportedOnly) { | 1855 bool AcceptSupportedOnly) { |
1763 Module *M = new Module(name, Context); | 1856 Module *M = new Module(name, Context); |
1764 NaClBitcodeReader *R = | 1857 NaClBitcodeReader *R = |
1765 new NaClBitcodeReader(Streamer, Context, AcceptSupportedOnly); | 1858 new NaClBitcodeReader(Streamer, Context, VerboseErrors, |
1859 AcceptSupportedOnly); | |
1766 M->setMaterializer(R); | 1860 M->setMaterializer(R); |
1767 if (R->ParseBitcodeInto(M)) { | 1861 if (std::error_code EC = R->ParseBitcodeInto(M)) { |
1768 if (ErrMsg) | 1862 if (ErrMsg) |
1769 *ErrMsg = R->getErrorString(); | 1863 *ErrMsg = EC.message(); |
1770 delete M; // Also deletes R. | 1864 delete M; // Also deletes R. |
1771 return 0; | 1865 return nullptr; |
1772 } | 1866 } |
1773 | 1867 |
1774 return M; | 1868 return M; |
1775 } | 1869 } |
1776 | 1870 |
1777 /// NaClParseBitcodeFile - Read the specified bitcode file, returning the module . | 1871 /// NaClParseBitcodeFile - Read the specified bitcode file, returning the module . |
1778 /// If an error occurs, return null and fill in *ErrMsg if non-null. | 1872 /// If an error occurs, return null and fill in *ErrMsg if non-null. |
1779 Module *llvm::NaClParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context, | 1873 ErrorOr<Module *> llvm::NaClParseBitcodeFile( |
1780 std::string *ErrMsg, | 1874 MemoryBuffer *Buffer, LLVMContext& Context, bool VerboseErrors, |
1781 bool AcceptSupportedOnly){ | 1875 bool AcceptSupportedOnly){ |
1782 Module *M = getNaClLazyBitcodeModule(Buffer, Context, ErrMsg, | 1876 ErrorOr<Module *> ModuleOrErr = |
1783 AcceptSupportedOnly); | 1877 getNaClLazyBitcodeModule(Buffer, Context, VerboseErrors, |
1784 if (!M) return 0; | 1878 AcceptSupportedOnly); |
1785 | 1879 if (!ModuleOrErr) |
1880 return ModuleOrErr; | |
1881 Module *M = ModuleOrErr.get(); | |
1786 // Read in the entire module, and destroy the NaClBitcodeReader. | 1882 // Read in the entire module, and destroy the NaClBitcodeReader. |
1787 if (std::error_code EC = M->materializeAllPermanently()) { | 1883 if (std::error_code EC = M->materializeAllPermanently()) { |
1788 *ErrMsg = EC.message(); | |
1789 delete M; | 1884 delete M; |
1790 return 0; | 1885 return EC; |
1791 } | 1886 } |
1792 | 1887 |
1793 // TODO: Restore the use-lists to the in-memory state when the bitcode was | 1888 // TODO: Restore the use-lists to the in-memory state when the bitcode was |
1794 // written. We must defer until the Module has been fully materialized. | 1889 // written. We must defer until the Module has been fully materialized. |
1795 | 1890 |
1796 return M; | 1891 return M; |
1797 } | 1892 } |
OLD | NEW |