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