ensure that every error return sets a message (and goes through Error, for

easy breakpointing).

Fix bugs reading constantexpr geps.  We now can disassemble kc++ global
initializers.

llvm-svn: 36398
This commit is contained in:
Chris Lattner 2007-04-24 18:15:21 +00:00
parent 0ee6a3a561
commit 890683d636
3 changed files with 37 additions and 19 deletions

View File

@ -161,7 +161,9 @@ bool BitcodeReader::ParseTypeTable(BitstreamReader &Stream) {
if (Code == bitc::END_BLOCK) {
if (NumRecords != TypeList.size())
return Error("Invalid type forward reference in TYPE_BLOCK");
return Stream.ReadBlockEnd();
if (Stream.ReadBlockEnd())
return Error("Error at end of type table block");
return false;
}
if (Code == bitc::ENTER_SUBBLOCK) {
@ -299,8 +301,11 @@ bool BitcodeReader::ParseTypeSymbolTable(BitstreamReader &Stream) {
std::string TypeName;
while (1) {
unsigned Code = Stream.ReadCode();
if (Code == bitc::END_BLOCK)
return Stream.ReadBlockEnd();
if (Code == bitc::END_BLOCK) {
if (Stream.ReadBlockEnd())
return Error("Error at end of type symbol table block");
return false;
}
if (Code == bitc::ENTER_SUBBLOCK) {
// No known subblocks, always skip them.
@ -344,9 +349,11 @@ bool BitcodeReader::ParseValueSymbolTable(BitstreamReader &Stream) {
SmallString<128> ValueName;
while (1) {
unsigned Code = Stream.ReadCode();
if (Code == bitc::END_BLOCK)
return Stream.ReadBlockEnd();
if (Code == bitc::END_BLOCK) {
if (Stream.ReadBlockEnd())
return Error("Error at end of value symbol table block");
return false;
}
if (Code == bitc::ENTER_SUBBLOCK) {
// No known subblocks, always skip them.
Stream.ReadSubBlockID();
@ -420,7 +427,9 @@ bool BitcodeReader::ParseConstants(BitstreamReader &Stream) {
if (NextCstNo != ValueList.size())
return Error("Invalid constant reference!");
return Stream.ReadBlockEnd();
if (Stream.ReadBlockEnd())
return Error("Error at end of constants block");
return false;
}
if (Code == bitc::ENTER_SUBBLOCK) {
@ -515,21 +524,25 @@ bool BitcodeReader::ParseConstants(BitstreamReader &Stream) {
case bitc::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) return UndefValue::get(CurTy); // Unknown binop.
Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy);
Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy);
V = ConstantExpr::get(Opc, LHS, RHS);
if (Opc < 0) {
V = UndefValue::get(CurTy); // Unknown binop.
} else {
Constant *LHS = ValueList.getConstantFwdRef(Record[1], CurTy);
Constant *RHS = ValueList.getConstantFwdRef(Record[2], CurTy);
V = ConstantExpr::get(Opc, LHS, RHS);
}
break;
}
case bitc::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) return UndefValue::get(CurTy); // Unknown cast.
const Type *OpTy = getTypeByID(Record[1]);
Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy);
V = ConstantExpr::getCast(Opc, Op, CurTy);
if (Opc < 0) {
V = UndefValue::get(CurTy); // Unknown cast.
} else {
const Type *OpTy = getTypeByID(Record[1]);
Constant *Op = ValueList.getConstantFwdRef(Record[2], OpTy);
V = ConstantExpr::getCast(Opc, Op, CurTy);
}
break;
}
case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands]
@ -540,7 +553,8 @@ bool BitcodeReader::ParseConstants(BitstreamReader &Stream) {
if (!ElTy) return Error("Invalid CE_GEP record");
Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], ElTy));
}
return ConstantExpr::getGetElementPtr(Elts[0], &Elts[1], Elts.size()-1);
V = ConstantExpr::getGetElementPtr(Elts[0], &Elts[1], Elts.size()-1);
break;
}
case bitc::CST_CODE_CE_SELECT: // CE_SELECT: [opval#, opval#, opval#]
if (Record.size() < 3) return Error("Invalid CE_SELECT record");
@ -634,7 +648,9 @@ bool BitcodeReader::ParseModule(BitstreamReader &Stream,
if (Code == bitc::END_BLOCK) {
if (!GlobalInits.empty())
return Error("Malformed global initializer set");
return Stream.ReadBlockEnd();
if (Stream.ReadBlockEnd())
return Error("Error at end of module block");
return false;
}
if (Code == bitc::ENTER_SUBBLOCK) {

View File

@ -58,6 +58,7 @@ class BitcodeReader : public ModuleProvider {
BitcodeReaderValueList ValueList;
std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits;
public:
BitcodeReader() : ErrorString(0) {}
virtual ~BitcodeReader() {}
virtual void FreeState() {}

View File

@ -51,6 +51,7 @@ bool BitcodeFileReader::Read(std::string *ErrMsg) {
unsigned char *Buffer = reinterpret_cast<unsigned char*>(File.base());
if (!ParseBitcode(Buffer, File.size(), Filename))
return false;
assert(getErrorString() && "Didn't set an error string?");
if (ErrMsg) *ErrMsg = getErrorString();
return true;
}