Chromium Code Reviews| 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 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 362 break; | 362 break; |
| 363 } | 363 } |
| 364 | 364 |
| 365 ResultTy = getTypeByID(Record[1]); | 365 ResultTy = getTypeByID(Record[1]); |
| 366 if (ResultTy == 0 || ArgTys.size() < Record.size()-2) | 366 if (ResultTy == 0 || ArgTys.size() < Record.size()-2) |
| 367 return Error("invalid type in function type"); | 367 return Error("invalid type in function type"); |
| 368 | 368 |
| 369 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); | 369 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); |
| 370 break; | 370 break; |
| 371 } | 371 } |
| 372 case naclbitc::TYPE_CODE_VECTOR: { // VECTOR: [numelts, eltty] | |
| 373 if (Record.size() != 2) | |
| 374 return Error("Invalid VECTOR type record"); | |
| 375 if ((ResultTy = getTypeByID(Record[1]))) | |
| 376 ResultTy = VectorType::get(ResultTy, Record[0]); | |
| 377 else | |
| 378 return Error("invalid type in vector type"); | |
| 379 break; | |
| 380 } | |
| 372 } | 381 } |
| 373 | 382 |
| 374 if (NumRecords >= TypeList.size()) | 383 if (NumRecords >= TypeList.size()) |
| 375 return Error("invalid TYPE table"); | 384 return Error("invalid TYPE table"); |
| 376 assert(ResultTy && "Didn't read a type?"); | 385 assert(ResultTy && "Didn't read a type?"); |
| 377 assert(TypeList[NumRecords] == 0 && "Already read type?"); | 386 assert(TypeList[NumRecords] == 0 && "Already read type?"); |
| 378 TypeList[NumRecords++] = ResultTy; | 387 TypeList[NumRecords++] = ResultTy; |
| 379 } | 388 } |
| 380 } | 389 } |
| 381 | 390 |
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1151 FalseVal = ConvertOpToScalar(FalseVal, CurBBNo); | 1160 FalseVal = ConvertOpToScalar(FalseVal, CurBBNo); |
| 1152 | 1161 |
| 1153 // expect i1 | 1162 // expect i1 |
| 1154 if (Cond->getType() != Type::getInt1Ty(Context)) | 1163 if (Cond->getType() != Type::getInt1Ty(Context)) |
| 1155 return Error("Invalid SELECT condition type"); | 1164 return Error("Invalid SELECT condition type"); |
| 1156 | 1165 |
| 1157 I = SelectInst::Create(Cond, TrueVal, FalseVal); | 1166 I = SelectInst::Create(Cond, TrueVal, FalseVal); |
| 1158 break; | 1167 break; |
| 1159 } | 1168 } |
| 1160 | 1169 |
| 1170 case naclbitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opty, opval, opv al] | |
|
Jim Stichnoth
2014/04/04 23:08:17
line longer than 80 chars...
jvoung (off chromium)
2014/04/04 23:20:21
no opty?
JF
2014/04/15 01:52:27
jvoung's comment made it go under 80, I nonetheles
JF
2014/04/15 01:52:27
Done.
| |
| 1171 unsigned OpNum = 0; | |
| 1172 Value *Vec, *Idx; | |
| 1173 if (popValue(Record, &OpNum, NextValueNo, &Vec) || | |
| 1174 popValue(Record, &OpNum, NextValueNo, &Idx) || | |
| 1175 OpNum != Record.size()) | |
| 1176 return Error("Invalid EXTRACTELEMENT record"); | |
| 1177 | |
| 1178 // expect i32 | |
| 1179 if (Idx->getType() != Type::getInt32Ty(Context)) | |
| 1180 return Error("Invalid EXTRACTELEMENT index type"); | |
| 1181 | |
| 1182 I = ExtractElementInst::Create(Vec, Idx); | |
| 1183 break; | |
| 1184 } | |
| 1185 | |
| 1186 case naclbitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [opval,opval,opval] | |
| 1187 unsigned OpNum = 0; | |
| 1188 Value *Vec, *Elt, *Idx; | |
| 1189 if (popValue(Record, &OpNum, NextValueNo, &Vec) || | |
| 1190 popValue(Record, &OpNum, NextValueNo, &Elt) || | |
| 1191 popValue(Record, &OpNum, NextValueNo, &Idx) || | |
| 1192 OpNum != Record.size()) | |
| 1193 return Error("Invalid INSERTELEMENT record"); | |
| 1194 | |
| 1195 // expect vector type | |
| 1196 if (!isa<VectorType>(Vec->getType())) | |
| 1197 return Error("Invalid INSERTELEMENT vector type"); | |
| 1198 // match vector and element types | |
| 1199 if (cast<VectorType>(Vec->getType())->getElementType() != Elt->getType()) | |
| 1200 return Error("Mismatched INSERTELEMENT vector and element type"); | |
| 1201 // expect i32 | |
| 1202 if (Idx->getType() != Type::getInt32Ty(Context)) | |
| 1203 return Error("Invalid INSERTELEMENT index type"); | |
| 1204 | |
| 1205 I = InsertElementInst::Create(Vec, Elt, Idx); | |
| 1206 break; | |
| 1207 } | |
| 1208 | |
| 1161 case naclbitc::FUNC_CODE_INST_CMP2: { // CMP2: [opval, opval, pred] | 1209 case naclbitc::FUNC_CODE_INST_CMP2: { // CMP2: [opval, opval, pred] |
| 1162 // FCmp/ICmp returning bool or vector of bool | 1210 // FCmp/ICmp returning bool or vector of bool |
| 1163 | 1211 |
| 1164 unsigned OpNum = 0; | 1212 unsigned OpNum = 0; |
| 1165 Value *LHS, *RHS; | 1213 Value *LHS, *RHS; |
| 1166 if (popValue(Record, &OpNum, NextValueNo, &LHS) || | 1214 if (popValue(Record, &OpNum, NextValueNo, &LHS) || |
| 1167 popValue(Record, &OpNum, NextValueNo, &RHS) || | 1215 popValue(Record, &OpNum, NextValueNo, &RHS) || |
| 1168 OpNum+1 != Record.size()) | 1216 OpNum+1 != Record.size()) |
| 1169 return Error("Invalid CMP record"); | 1217 return Error("Invalid CMP record"); |
| 1170 | 1218 |
| (...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1696 if (M->MaterializeAllPermanently(ErrMsg)) { | 1744 if (M->MaterializeAllPermanently(ErrMsg)) { |
| 1697 delete M; | 1745 delete M; |
| 1698 return 0; | 1746 return 0; |
| 1699 } | 1747 } |
| 1700 | 1748 |
| 1701 // TODO: Restore the use-lists to the in-memory state when the bitcode was | 1749 // 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. | 1750 // written. We must defer until the Module has been fully materialized. |
| 1703 | 1751 |
| 1704 return M; | 1752 return M; |
| 1705 } | 1753 } |
| OLD | NEW |