From 63af07fdec14331e7e1982d97390409214c2d8b5 Mon Sep 17 00:00:00 2001 From: Karl Schimpf Date: Thu, 25 Jul 2013 09:57:20 -0700 Subject: Remove constant expressions and constant inline assembly from the PNaCl reader/writer, since they can't appear in PNaCl bitcode. BUG= https://code.google.com/p/nativeclient/issues/detail?id=3590 R=mseaborn@chromium.org Review URL: https://codereview.chromium.org/20172002 --- lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp | 180 +------------------------- 1 file changed, 2 insertions(+), 178 deletions(-) (limited to 'lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp') 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 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 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(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(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(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(CurTy); - VectorType *OpTy = - dyn_cast_or_null(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(CurTy); - V = InlineAsm::get(cast(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(CurTy); - V = InlineAsm::get(cast(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]); -- cgit v1.2.3-18-g5258