diff options
-rw-r--r-- | include/llvm/Bitcode/NaCl/NaClLLVMBitCodes.h | 26 | ||||
-rw-r--r-- | lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp | 180 | ||||
-rw-r--r-- | lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp | 109 |
3 files changed, 17 insertions, 298 deletions
diff --git a/include/llvm/Bitcode/NaCl/NaClLLVMBitCodes.h b/include/llvm/Bitcode/NaCl/NaClLLVMBitCodes.h index 5a1e350a29..3c317cad75 100644 --- a/include/llvm/Bitcode/NaCl/NaClLLVMBitCodes.h +++ b/include/llvm/Bitcode/NaCl/NaClLLVMBitCodes.h @@ -151,22 +151,20 @@ namespace naclbitc { CST_CODE_AGGREGATE = 7, // AGGREGATE: [n x value number] CST_CODE_STRING = 8, // STRING: [values] CST_CODE_CSTRING = 9, // CSTRING: [values] - CST_CODE_CE_BINOP = 10, // CE_BINOP: [opcode, opval, opval] - CST_CODE_CE_CAST = 11, // CE_CAST: [opcode, opty, opval] - CST_CODE_CE_GEP = 12, // CE_GEP: [n x operands] - CST_CODE_CE_SELECT = 13, // CE_SELECT: [opval, opval, opval] - CST_CODE_CE_EXTRACTELT = 14, // CE_EXTRACTELT: [opty, opval, opval] - CST_CODE_CE_INSERTELT = 15, // CE_INSERTELT: [opval, opval, opval] - CST_CODE_CE_SHUFFLEVEC = 16, // CE_SHUFFLEVEC: [opval, opval, opval] - CST_CODE_CE_CMP = 17, // CE_CMP: [opty, opval, opval, pred] - CST_CODE_INLINEASM_OLD = 18, // INLINEASM: [sideeffect|alignstack, - // asmstr,conststr] - CST_CODE_CE_SHUFVEC_EX = 19, // SHUFVEC_EX: [opty, opval, opval, opval] - CST_CODE_CE_INBOUNDS_GEP = 20,// INBOUNDS_GEP: [n x operands] + CST_CODE_CE_BINOP = 10, // Not used in PNaCl. + CST_CODE_CE_CAST = 11, // Not used in PNaCl. + CST_CODE_CE_GEP = 12, // Not used in PNaCl. + CST_CODE_CE_SELECT = 13, // Not used in PNaCl. + CST_CODE_CE_EXTRACTELT = 14, // Not used in PNaCl. + CST_CODE_CE_INSERTELT = 15, // Not used in PNaCl. + CST_CODE_CE_SHUFFLEVEC = 16, // Not used in PNaCl. + CST_CODE_CE_CMP = 17, // Not used in PNaCl. + CST_CODE_INLINEASM_OLD = 18, // No longer used. + CST_CODE_CE_SHUFVEC_EX = 19, // Not used in PNaCl. + CST_CODE_CE_INBOUNDS_GEP = 20,// Not used in PNaCl. CST_CODE_BLOCKADDRESS = 21, // CST_CODE_BLOCKADDRESS [fnty, fnval, bb#] CST_CODE_DATA = 22, // DATA: [n x elements] - CST_CODE_INLINEASM = 23 // INLINEASM: [sideeffect|alignstack| - // asmdialect,asmstr,conststr] + CST_CODE_INLINEASM = 23 // Not used in PNaCl. }; /// GlobalVarOpcodes - These are values used in the bitcode files to diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp index c7eb1ac683..91c3658db3 100644 --- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp +++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp @@ -904,7 +904,8 @@ bool NaClBitcodeReader::ParseConstants() { Value *V = 0; unsigned BitCode = Stream.readRecord(Entry.ID, Record); switch (BitCode) { - default: // Default behavior: unknown constant + default: + return Error("Unknown Constant"); case naclbitc::CST_CODE_UNDEF: // UNDEF V = UndefValue::get(CurTy); break; @@ -1052,183 +1053,6 @@ bool NaClBitcodeReader::ParseConstants() { break; } - case naclbitc::CST_CODE_CE_BINOP: { // CE_BINOP: [opcode, opval, opval] - if (Record.size() < 3) return Error("Invalid CE_BINOP record"); - int Opc = GetDecodedBinaryOpcode(Record[0], CurTy); - if (Opc < 0) { - V = UndefValue::get(CurTy); // Unknown binop. - } else { - Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy); - Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy); - unsigned Flags = 0; - if (Record.size() >= 4) { - if (Opc == Instruction::Add || - Opc == Instruction::Sub || - Opc == Instruction::Mul || - Opc == Instruction::Shl) { - if (Record[3] & (1 << naclbitc::OBO_NO_SIGNED_WRAP)) - Flags |= OverflowingBinaryOperator::NoSignedWrap; - if (Record[3] & (1 << naclbitc::OBO_NO_UNSIGNED_WRAP)) - Flags |= OverflowingBinaryOperator::NoUnsignedWrap; - } else if (Opc == Instruction::SDiv || - Opc == Instruction::UDiv || - Opc == Instruction::LShr || - Opc == Instruction::AShr) { - if (Record[3] & (1 << naclbitc::PEO_EXACT)) - Flags |= SDivOperator::IsExact; - } - } - V = ConstantExpr::get(Opc, LHS, RHS, Flags); - } - break; - } - case naclbitc::CST_CODE_CE_CAST: { // CE_CAST: [opcode, opty, opval] - if (Record.size() < 3) return Error("Invalid CE_CAST record"); - int Opc = GetDecodedCastOpcode(Record[0]); - if (Opc < 0) { - V = UndefValue::get(CurTy); // Unknown cast. - } else { - Type *OpTy = getTypeByID(Record[1]); - if (!OpTy) return Error("Invalid CE_CAST record"); - Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy); - V = ConstantExpr::getCast(Opc, Op, CurTy); - } - break; - } - case naclbitc::CST_CODE_CE_INBOUNDS_GEP: - case naclbitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands] - if (Record.size() & 1) return Error("Invalid CE_GEP record"); - SmallVector<Constant*, 16> Elts; - for (unsigned i = 0, e = Record.size(); i != e; i += 2) { - Type *ElTy = getTypeByID(Record[i]); - if (!ElTy) return Error("Invalid CE_GEP record"); - Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], ElTy)); - } - ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end()); - V = ConstantExpr::getGetElementPtr(Elts[0], Indices, - BitCode == - naclbitc::CST_CODE_CE_INBOUNDS_GEP); - break; - } - case naclbitc::CST_CODE_CE_SELECT: // CE_SELECT: [opval#, opval#, opval#] - if (Record.size() < 3) return Error("Invalid CE_SELECT record"); - V = ConstantExpr::getSelect( - ValueList.getConstantFwdRef(Record[0], - Type::getInt1Ty(Context)), - ValueList.getConstantFwdRef(Record[1],CurTy), - ValueList.getConstantFwdRef(Record[2],CurTy)); - break; - case naclbitc::CST_CODE_CE_EXTRACTELT: { - // CE_EXTRACTELT: [opty, opval, opval] - if (Record.size() < 3) return Error("Invalid CE_EXTRACTELT record"); - VectorType *OpTy = - dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); - if (OpTy == 0) return Error("Invalid CE_EXTRACTELT record"); - Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); - Constant *Op1 = ValueList.getConstantFwdRef(Record[2], - Type::getInt32Ty(Context)); - V = ConstantExpr::getExtractElement(Op0, Op1); - break; - } - case naclbitc::CST_CODE_CE_INSERTELT: {// CE_INSERTELT: [opval, opval, opval] - VectorType *OpTy = dyn_cast<VectorType>(CurTy); - if (Record.size() < 3 || OpTy == 0) - return Error("Invalid CE_INSERTELT record"); - Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); - Constant *Op1 = ValueList.getConstantFwdRef(Record[1], - OpTy->getElementType()); - Constant *Op2 = ValueList.getConstantFwdRef(Record[2], - Type::getInt32Ty(Context)); - V = ConstantExpr::getInsertElement(Op0, Op1, Op2); - break; - } - case naclbitc::CST_CODE_CE_SHUFFLEVEC: { // CE_SHUFFLEVEC: [opval, opval, opval] - VectorType *OpTy = dyn_cast<VectorType>(CurTy); - if (Record.size() < 3 || OpTy == 0) - return Error("Invalid CE_SHUFFLEVEC record"); - Constant *Op0 = ValueList.getConstantFwdRef(Record[0], OpTy); - Constant *Op1 = ValueList.getConstantFwdRef(Record[1], OpTy); - Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), - OpTy->getNumElements()); - Constant *Op2 = ValueList.getConstantFwdRef(Record[2], ShufTy); - V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); - break; - } - case naclbitc::CST_CODE_CE_SHUFVEC_EX: { // [opty, opval, opval, opval] - VectorType *RTy = dyn_cast<VectorType>(CurTy); - VectorType *OpTy = - dyn_cast_or_null<VectorType>(getTypeByID(Record[0])); - if (Record.size() < 4 || RTy == 0 || OpTy == 0) - return Error("Invalid CE_SHUFVEC_EX record"); - Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); - Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); - Type *ShufTy = VectorType::get(Type::getInt32Ty(Context), - RTy->getNumElements()); - Constant *Op2 = ValueList.getConstantFwdRef(Record[3], ShufTy); - V = ConstantExpr::getShuffleVector(Op0, Op1, Op2); - break; - } - case naclbitc::CST_CODE_CE_CMP: { // CE_CMP: [opty, opval, opval, pred] - if (Record.size() < 4) return Error("Invalid CE_CMP record"); - Type *OpTy = getTypeByID(Record[0]); - if (OpTy == 0) return Error("Invalid CE_CMP record"); - Constant *Op0 = ValueList.getConstantFwdRef(Record[1], OpTy); - Constant *Op1 = ValueList.getConstantFwdRef(Record[2], OpTy); - - if (OpTy->isFPOrFPVectorTy()) - V = ConstantExpr::getFCmp(Record[3], Op0, Op1); - else - V = ConstantExpr::getICmp(Record[3], Op0, Op1); - break; - } - // This maintains backward compatibility, pre-asm dialect keywords. - // FIXME: Remove with the 4.0 release. - case naclbitc::CST_CODE_INLINEASM_OLD: { - if (Record.size() < 2) return Error("Invalid INLINEASM record"); - std::string AsmStr, ConstrStr; - bool HasSideEffects = Record[0] & 1; - bool IsAlignStack = Record[0] >> 1; - unsigned AsmStrSize = Record[1]; - if (2+AsmStrSize >= Record.size()) - return Error("Invalid INLINEASM record"); - unsigned ConstStrSize = Record[2+AsmStrSize]; - if (3+AsmStrSize+ConstStrSize > Record.size()) - return Error("Invalid INLINEASM record"); - - for (unsigned i = 0; i != AsmStrSize; ++i) - AsmStr += (char)Record[2+i]; - for (unsigned i = 0; i != ConstStrSize; ++i) - ConstrStr += (char)Record[3+AsmStrSize+i]; - PointerType *PTy = cast<PointerType>(CurTy); - V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), - AsmStr, ConstrStr, HasSideEffects, IsAlignStack); - break; - } - // This version adds support for the asm dialect keywords (e.g., - // inteldialect). - case naclbitc::CST_CODE_INLINEASM: { - if (Record.size() < 2) return Error("Invalid INLINEASM record"); - std::string AsmStr, ConstrStr; - bool HasSideEffects = Record[0] & 1; - bool IsAlignStack = (Record[0] >> 1) & 1; - unsigned AsmDialect = Record[0] >> 2; - unsigned AsmStrSize = Record[1]; - if (2+AsmStrSize >= Record.size()) - return Error("Invalid INLINEASM record"); - unsigned ConstStrSize = Record[2+AsmStrSize]; - if (3+AsmStrSize+ConstStrSize > Record.size()) - return Error("Invalid INLINEASM record"); - - for (unsigned i = 0; i != AsmStrSize; ++i) - AsmStr += (char)Record[2+i]; - for (unsigned i = 0; i != ConstStrSize; ++i) - ConstrStr += (char)Record[3+AsmStrSize+i]; - PointerType *PTy = cast<PointerType>(CurTy); - V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), - AsmStr, ConstrStr, HasSideEffects, IsAlignStack, - InlineAsm::AsmDialect(AsmDialect)); - break; - } case naclbitc::CST_CODE_BLOCKADDRESS:{ if (Record.size() < 3) return Error("Invalid CE_BLOCKADDRESS record"); Type *FnTy = getTypeByID(Record[0]); diff --git a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp index e41ef6062c..1c2fb2986e 100644 --- a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp +++ b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp @@ -63,7 +63,6 @@ enum { // CONSTANTS_BLOCK abbrev id's. CONSTANTS_SETTYPE_ABBREV = naclbitc::FIRST_APPLICATION_ABBREV, CONSTANTS_INTEGER_ABBREV, - CONSTANTS_CE_CAST_Abbrev, CONSTANTS_NULL_Abbrev, CONSTANTS_MAX_ABBREV = CONSTANTS_NULL_Abbrev, @@ -706,25 +705,8 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, Record.clear(); } - if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) { - Record.push_back(unsigned(IA->hasSideEffects()) | - unsigned(IA->isAlignStack()) << 1 | - unsigned(IA->getDialect()&1) << 2); - - // Add the asm string. - const std::string &AsmStr = IA->getAsmString(); - Record.push_back(AsmStr.size()); - for (unsigned i = 0, e = AsmStr.size(); i != e; ++i) - Record.push_back(AsmStr[i]); - - // Add the constraint string. - const std::string &ConstraintStr = IA->getConstraintString(); - Record.push_back(ConstraintStr.size()); - for (unsigned i = 0, e = ConstraintStr.size(); i != e; ++i) - Record.push_back(ConstraintStr[i]); - Stream.EmitRecord(naclbitc::CST_CODE_INLINEASM, Record); - Record.clear(); - continue; + if (isa<InlineAsm>(V)) { + ReportIllegalValue("inline assembly", *V); } const Constant *C = cast<Constant>(V); unsigned Code = -1U; @@ -809,77 +791,6 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) Record.push_back(VE.getValueID(C->getOperand(i))); AbbrevToUse = AggregateAbbrev; - } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { - switch (CE->getOpcode()) { - default: - if (Instruction::isCast(CE->getOpcode())) { - Code = naclbitc::CST_CODE_CE_CAST; - Record.push_back(GetEncodedCastOpcode(CE->getOpcode(), *CE)); - Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); - Record.push_back(VE.getValueID(C->getOperand(0))); - AbbrevToUse = CONSTANTS_CE_CAST_Abbrev; - } else { - assert(CE->getNumOperands() == 2 && "Unknown constant expr!"); - Code = naclbitc::CST_CODE_CE_BINOP; - Record.push_back(GetEncodedBinaryOpcode(CE->getOpcode(), *CE)); - Record.push_back(VE.getValueID(C->getOperand(0))); - Record.push_back(VE.getValueID(C->getOperand(1))); - uint64_t Flags = GetOptimizationFlags(CE); - if (Flags != 0) - Record.push_back(Flags); - } - break; - case Instruction::GetElementPtr: - Code = naclbitc::CST_CODE_CE_GEP; - if (cast<GEPOperator>(C)->isInBounds()) - Code = naclbitc::CST_CODE_CE_INBOUNDS_GEP; - for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) { - Record.push_back(VE.getTypeID(C->getOperand(i)->getType())); - Record.push_back(VE.getValueID(C->getOperand(i))); - } - break; - case Instruction::Select: - Code = naclbitc::CST_CODE_CE_SELECT; - Record.push_back(VE.getValueID(C->getOperand(0))); - Record.push_back(VE.getValueID(C->getOperand(1))); - Record.push_back(VE.getValueID(C->getOperand(2))); - break; - case Instruction::ExtractElement: - Code = naclbitc::CST_CODE_CE_EXTRACTELT; - Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); - Record.push_back(VE.getValueID(C->getOperand(0))); - Record.push_back(VE.getValueID(C->getOperand(1))); - break; - case Instruction::InsertElement: - Code = naclbitc::CST_CODE_CE_INSERTELT; - Record.push_back(VE.getValueID(C->getOperand(0))); - Record.push_back(VE.getValueID(C->getOperand(1))); - Record.push_back(VE.getValueID(C->getOperand(2))); - break; - case Instruction::ShuffleVector: - // If the return type and argument types are the same, this is a - // standard shufflevector instruction. If the types are different, - // then the shuffle is widening or truncating the input vectors, and - // the argument type must also be encoded. - if (C->getType() == C->getOperand(0)->getType()) { - Code = naclbitc::CST_CODE_CE_SHUFFLEVEC; - } else { - Code = naclbitc::CST_CODE_CE_SHUFVEC_EX; - Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); - } - Record.push_back(VE.getValueID(C->getOperand(0))); - Record.push_back(VE.getValueID(C->getOperand(1))); - Record.push_back(VE.getValueID(C->getOperand(2))); - break; - case Instruction::ICmp: - case Instruction::FCmp: - Code = naclbitc::CST_CODE_CE_CMP; - Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); - Record.push_back(VE.getValueID(C->getOperand(0))); - Record.push_back(VE.getValueID(C->getOperand(1))); - Record.push_back(CE->getPredicate()); - break; - } } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) { Code = naclbitc::CST_CODE_BLOCKADDRESS; Record.push_back(VE.getTypeID(BA->getFunction()->getType())); @@ -889,7 +800,7 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, #ifndef NDEBUG C->dump(); #endif - llvm_unreachable("Unknown constant!"); + ReportIllegalValue("constant", *C); } Stream.EmitRecord(Code, Record, AbbrevToUse); Record.clear(); @@ -1473,20 +1384,6 @@ static void WriteBlockInfo(const NaClValueEnumerator &VE, Abbv) != CONSTANTS_INTEGER_ABBREV) llvm_unreachable("Unexpected abbrev ordering!"); } - - { // CE_CAST abbrev for CONSTANTS_BLOCK. - NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev(); - Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_CE_CAST)); - Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 4)); // cast opc - Abbv->Add(NaClBitCodeAbbrevOp( - NaClBitCodeAbbrevOp::Fixed, // typeid - NaClBitsNeededForValue(VE.getTypes().size()))); - Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8)); // value id - - if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, - Abbv) != CONSTANTS_CE_CAST_Abbrev) - llvm_unreachable("Unexpected abbrev ordering!"); - } { // NULL abbrev for CONSTANTS_BLOCK. NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev(); Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_NULL)); |