Index: lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
index 7332761b3e1c88b41f3355efea479d1e41ed2d25..24f926c3ca5184ca67b1cda0f8b005ec49299b7a 100644 |
--- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
+++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp |
@@ -369,6 +369,15 @@ bool NaClBitcodeReader::ParseTypeTableBody() { |
ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]); |
break; |
} |
+ case naclbitc::TYPE_CODE_VECTOR: { // VECTOR: [numelts, eltty] |
+ if (Record.size() != 2) |
+ return Error("Invalid VECTOR type record"); |
+ if ((ResultTy = getTypeByID(Record[1]))) |
+ ResultTy = VectorType::get(ResultTy, Record[0]); |
+ else |
+ return Error("invalid type in vector type"); |
+ break; |
+ } |
} |
if (NumRecords >= TypeList.size()) |
@@ -1158,6 +1167,43 @@ bool NaClBitcodeReader::ParseFunctionBody(Function *F) { |
break; |
} |
+ case naclbitc::FUNC_CODE_INST_EXTRACTELT: { // EXTRACTELT: [opval, opval] |
+ unsigned OpNum = 0; |
+ Value *Vec, *Idx; |
+ if (popValue(Record, &OpNum, NextValueNo, &Vec) || |
+ popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size()) |
+ return Error("Invalid EXTRACTELEMENT record"); |
+ |
+ // expect i32 |
+ if (Idx->getType() != Type::getInt32Ty(Context)) |
+ return Error("Invalid EXTRACTELEMENT index type"); |
+ |
+ I = ExtractElementInst::Create(Vec, Idx); |
+ break; |
+ } |
+ |
+ case naclbitc::FUNC_CODE_INST_INSERTELT: { // INSERTELT: [opval,opval,opval] |
+ unsigned OpNum = 0; |
+ Value *Vec, *Elt, *Idx; |
+ if (popValue(Record, &OpNum, NextValueNo, &Vec) || |
+ popValue(Record, &OpNum, NextValueNo, &Elt) || |
+ popValue(Record, &OpNum, NextValueNo, &Idx) || OpNum != Record.size()) |
+ return Error("Invalid INSERTELEMENT record"); |
+ |
+ // expect vector type |
+ if (!isa<VectorType>(Vec->getType())) |
+ return Error("Invalid INSERTELEMENT vector type"); |
+ // match vector and element types |
+ if (cast<VectorType>(Vec->getType())->getElementType() != Elt->getType()) |
+ return Error("Mismatched INSERTELEMENT vector and element type"); |
+ // expect i32 |
+ if (Idx->getType() != Type::getInt32Ty(Context)) |
+ return Error("Invalid INSERTELEMENT index type"); |
+ |
+ I = InsertElementInst::Create(Vec, Elt, Idx); |
+ break; |
+ } |
+ |
case naclbitc::FUNC_CODE_INST_CMP2: { // CMP2: [opval, opval, pred] |
// FCmp/ICmp returning bool or vector of bool |