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 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 Type *ResultTy = 0; | 321 Type *ResultTy = 0; |
322 unsigned TypeCode = Stream.readRecord(Entry.ID, Record); | 322 unsigned TypeCode = Stream.readRecord(Entry.ID, Record); |
323 switch (TypeCode) { | 323 switch (TypeCode) { |
324 default: { | 324 default: { |
325 std::string Message; | 325 std::string Message; |
326 raw_string_ostream StrM(Message); | 326 raw_string_ostream StrM(Message); |
327 StrM << "Unknown type code in type table: " << TypeCode; | 327 StrM << "Unknown type code in type table: " << TypeCode; |
328 StrM.flush(); | 328 StrM.flush(); |
329 return Error(Message); | 329 return Error(Message); |
330 } | 330 } |
| 331 |
331 case naclbitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] | 332 case naclbitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries] |
332 // TYPE_CODE_NUMENTRY contains a count of the number of types in the | 333 // TYPE_CODE_NUMENTRY contains a count of the number of types in the |
333 // type list. This allows us to reserve space. | 334 // type list. This allows us to reserve space. |
334 if (Record.size() < 1) | 335 if (Record.size() != 1) |
335 return Error("Invalid TYPE_CODE_NUMENTRY record"); | 336 return Error("Invalid TYPE_CODE_NUMENTRY record"); |
336 TypeList.resize(Record[0]); | 337 TypeList.resize(Record[0]); |
| 338 // No type was defined, skip the checks that follow the switch. |
337 continue; | 339 continue; |
338 case naclbitc::TYPE_CODE_VOID: // VOID | 340 |
| 341 case naclbitc::TYPE_CODE_VOID: // VOID |
| 342 if (Record.size() != 0) |
| 343 return Error("Invalid TYPE_CODE_VOID record"); |
339 ResultTy = Type::getVoidTy(Context); | 344 ResultTy = Type::getVoidTy(Context); |
340 break; | 345 break; |
341 case naclbitc::TYPE_CODE_FLOAT: // FLOAT | 346 |
| 347 case naclbitc::TYPE_CODE_FLOAT: // FLOAT |
| 348 if (Record.size() != 0) |
| 349 return Error("Invalid TYPE_CODE_FLOAT record"); |
342 ResultTy = Type::getFloatTy(Context); | 350 ResultTy = Type::getFloatTy(Context); |
343 break; | 351 break; |
344 case naclbitc::TYPE_CODE_DOUBLE: // DOUBLE | 352 |
| 353 case naclbitc::TYPE_CODE_DOUBLE: // DOUBLE |
| 354 if (Record.size() != 0) |
| 355 return Error("Invalid TYPE_CODE_DOUBLE record"); |
345 ResultTy = Type::getDoubleTy(Context); | 356 ResultTy = Type::getDoubleTy(Context); |
346 break; | 357 break; |
347 case naclbitc::TYPE_CODE_INTEGER: // INTEGER: [width] | |
348 if (Record.size() < 1) | |
349 return Error("Invalid Integer type record"); | |
350 | 358 |
| 359 case naclbitc::TYPE_CODE_INTEGER: // INTEGER: [width] |
| 360 if (Record.size() != 1) |
| 361 return Error("Invalid TYPE_CODE_INTEGER record"); |
351 ResultTy = IntegerType::get(Context, Record[0]); | 362 ResultTy = IntegerType::get(Context, Record[0]); |
352 break; | 363 break; |
| 364 |
353 case naclbitc::TYPE_CODE_FUNCTION: { | 365 case naclbitc::TYPE_CODE_FUNCTION: { |
354 // FUNCTION: [vararg, retty, paramty x N] | 366 // FUNCTION: [vararg, retty, paramty x N] |
355 if (Record.size() < 2) | 367 if (Record.size() < 2) |
356 return Error("Invalid FUNCTION type record"); | 368 return Error("Invalid TYPE_CODE_FUNCTION record"); |
357 SmallVector<Type*, 8> ArgTys; | 369 SmallVector<Type *, 8> ArgTys; |
358 for (unsigned i = 2, e = Record.size(); i != e; ++i) { | 370 for (unsigned i = 2, e = Record.size(); i != e; ++i) { |
359 if (Type *T = getTypeByID(Record[i])) | 371 if (Type *T = getTypeByID(Record[i])) |
360 ArgTys.push_back(T); | 372 ArgTys.push_back(T); |
361 else | 373 else |
362 break; | 374 break; |
363 } | 375 } |
364 | 376 |
365 ResultTy = getTypeByID(Record[1]); | 377 ResultTy = getTypeByID(Record[1]); |
366 if (ResultTy == 0 || ArgTys.size() < Record.size()-2) | 378 if (ResultTy == 0 || ArgTys.size() < Record.size() - 2) |
367 return Error("invalid type in function type"); | 379 return Error("invalid type in function type"); |
368 | 380 |
369 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); | 381 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); |
370 break; | 382 break; |
371 } | 383 } |
372 } | 384 } |
373 | 385 |
374 if (NumRecords >= TypeList.size()) | 386 if (NumRecords >= TypeList.size()) |
375 return Error("invalid TYPE table"); | 387 return Error("invalid TYPE table"); |
376 assert(ResultTy && "Didn't read a type?"); | 388 assert(ResultTy && "Didn't read a type?"); |
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 raw_string_ostream StrM(Message); | 1079 raw_string_ostream StrM(Message); |
1068 StrM << "Unknown instruction record: <" << BitCode; | 1080 StrM << "Unknown instruction record: <" << BitCode; |
1069 for (unsigned I = 0, E = Record.size(); I != E; ++I) { | 1081 for (unsigned I = 0, E = Record.size(); I != E; ++I) { |
1070 StrM << " " << Record[I]; | 1082 StrM << " " << Record[I]; |
1071 } | 1083 } |
1072 StrM << ">"; | 1084 StrM << ">"; |
1073 return Error(StrM.str()); | 1085 return Error(StrM.str()); |
1074 } | 1086 } |
1075 | 1087 |
1076 case naclbitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] | 1088 case naclbitc::FUNC_CODE_DECLAREBLOCKS: // DECLAREBLOCKS: [nblocks] |
1077 if (Record.size() < 1 || Record[0] == 0) | 1089 if (Record.size() != 1 || Record[0] == 0) |
1078 return Error("Invalid DECLAREBLOCKS record"); | 1090 return Error("Invalid DECLAREBLOCKS record"); |
1079 // Create all the basic blocks for the function. | 1091 // Create all the basic blocks for the function. |
1080 FunctionBBs.resize(Record[0]); | 1092 FunctionBBs.resize(Record[0]); |
1081 for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) { | 1093 for (unsigned i = 0, e = FunctionBBs.size(); i != e; ++i) { |
1082 BasicBlockInfo &BBInfo = FunctionBBs[i]; | 1094 BasicBlockInfo &BBInfo = FunctionBBs[i]; |
1083 BBInfo.BB = BasicBlock::Create(Context, "", F); | 1095 BBInfo.BB = BasicBlock::Create(Context, "", F); |
1084 } | 1096 } |
1085 CurBB = FunctionBBs.at(0).BB; | 1097 CurBB = FunctionBBs.at(0).BB; |
1086 continue; | 1098 continue; |
1087 | 1099 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1137 break; | 1149 break; |
1138 } | 1150 } |
1139 | 1151 |
1140 case naclbitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [opval, opval, pred] | 1152 case naclbitc::FUNC_CODE_INST_VSELECT: {// VSELECT: [opval, opval, pred] |
1141 // new form of select | 1153 // new form of select |
1142 // handles select i1 or select [N x i1] | 1154 // handles select i1 or select [N x i1] |
1143 unsigned OpNum = 0; | 1155 unsigned OpNum = 0; |
1144 Value *TrueVal, *FalseVal, *Cond; | 1156 Value *TrueVal, *FalseVal, *Cond; |
1145 if (popValue(Record, &OpNum, NextValueNo, &TrueVal) || | 1157 if (popValue(Record, &OpNum, NextValueNo, &TrueVal) || |
1146 popValue(Record, &OpNum, NextValueNo, &FalseVal) || | 1158 popValue(Record, &OpNum, NextValueNo, &FalseVal) || |
1147 popValue(Record, &OpNum, NextValueNo, &Cond)) | 1159 popValue(Record, &OpNum, NextValueNo, &Cond) || |
| 1160 OpNum != Record.size()) |
1148 return Error("Invalid SELECT record"); | 1161 return Error("Invalid SELECT record"); |
1149 | 1162 |
1150 TrueVal = ConvertOpToScalar(TrueVal, CurBBNo); | 1163 TrueVal = ConvertOpToScalar(TrueVal, CurBBNo); |
1151 FalseVal = ConvertOpToScalar(FalseVal, CurBBNo); | 1164 FalseVal = ConvertOpToScalar(FalseVal, CurBBNo); |
1152 | 1165 |
1153 // expect i1 | 1166 // expect i1 |
1154 if (Cond->getType() != Type::getInt1Ty(Context)) | 1167 if (Cond->getType() != Type::getInt1Ty(Context)) |
1155 return Error("Invalid SELECT condition type"); | 1168 return Error("Invalid SELECT condition type"); |
1156 | 1169 |
1157 I = SelectInst::Create(Cond, TrueVal, FalseVal); | 1170 I = SelectInst::Create(Cond, TrueVal, FalseVal); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 Op = ConvertOpToType(Op, T->getPointerTo(), CurBBNo); | 1323 Op = ConvertOpToType(Op, T->getPointerTo(), CurBBNo); |
1311 if (Op == 0) return true; | 1324 if (Op == 0) return true; |
1312 I = new LoadInst(Op, "", false, (1 << Record[OpNum]) >> 1); | 1325 I = new LoadInst(Op, "", false, (1 << Record[OpNum]) >> 1); |
1313 break; | 1326 break; |
1314 } | 1327 } |
1315 case naclbitc::FUNC_CODE_INST_STORE: { | 1328 case naclbitc::FUNC_CODE_INST_STORE: { |
1316 // STORE: [ptr, val, align] | 1329 // STORE: [ptr, val, align] |
1317 unsigned OpNum = 0; | 1330 unsigned OpNum = 0; |
1318 Value *Val, *Ptr; | 1331 Value *Val, *Ptr; |
1319 if (popValue(Record, &OpNum, NextValueNo, &Ptr) || | 1332 if (popValue(Record, &OpNum, NextValueNo, &Ptr) || |
1320 popValue(Record, &OpNum, NextValueNo, &Val)) | 1333 popValue(Record, &OpNum, NextValueNo, &Val) || |
1321 return Error("Invalid STORE record"); | 1334 OpNum+1 != Record.size()) |
1322 if (OpNum+1 != Record.size()) | |
1323 return Error("Invalid STORE record"); | 1335 return Error("Invalid STORE record"); |
1324 Val = ConvertOpToScalar(Val, CurBBNo); | 1336 Val = ConvertOpToScalar(Val, CurBBNo); |
1325 Ptr = ConvertOpToType(Ptr, Val->getType()->getPointerTo(), CurBBNo); | 1337 Ptr = ConvertOpToType(Ptr, Val->getType()->getPointerTo(), CurBBNo); |
1326 I = new StoreInst(Val, Ptr, false, (1 << Record[OpNum]) >> 1); | 1338 I = new StoreInst(Val, Ptr, false, (1 << Record[OpNum]) >> 1); |
1327 break; | 1339 break; |
1328 } | 1340 } |
1329 case naclbitc::FUNC_CODE_INST_CALL: | 1341 case naclbitc::FUNC_CODE_INST_CALL: |
1330 case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: { | 1342 case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: { |
1331 // CALL: [cc, fnid, arg0, arg1...] | 1343 // CALL: [cc, fnid, arg0, arg1...] |
1332 // CALL_INDIRECT: [cc, fnid, fnty, args...] | 1344 // CALL_INDIRECT: [cc, fnid, fnty, args...] |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1696 if (M->MaterializeAllPermanently(ErrMsg)) { | 1708 if (M->MaterializeAllPermanently(ErrMsg)) { |
1697 delete M; | 1709 delete M; |
1698 return 0; | 1710 return 0; |
1699 } | 1711 } |
1700 | 1712 |
1701 // TODO: Restore the use-lists to the in-memory state when the bitcode was | 1713 // TODO: Restore the use-lists to the in-memory state when the bitcode was |
1702 // written. We must defer until the Module has been fully materialized. | 1714 // written. We must defer until the Module has been fully materialized. |
1703 | 1715 |
1704 return M; | 1716 return M; |
1705 } | 1717 } |
OLD | NEW |