aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Bitcode/NaCl/NaClLLVMBitCodes.h26
-rw-r--r--lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp180
-rw-r--r--lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp109
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));