[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp BitcodeReader.h ReaderWrappers.cpp
Chris Lattner
sabre at nondot.org
Tue Apr 24 11:15:41 PDT 2007
Changes in directory llvm/lib/Bitcode/Reader:
BitcodeReader.cpp updated: 1.11 -> 1.12
BitcodeReader.h updated: 1.7 -> 1.8
ReaderWrappers.cpp updated: 1.1 -> 1.2
---
Log message:
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.
---
Diffs of the changes: (+37 -19)
BitcodeReader.cpp | 54 ++++++++++++++++++++++++++++++++++-------------------
BitcodeReader.h | 1
ReaderWrappers.cpp | 1
3 files changed, 37 insertions(+), 19 deletions(-)
Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.11 llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.12
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.11 Tue Apr 24 12:22:05 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp Tue Apr 24 13:15:21 2007
@@ -161,7 +161,9 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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) {
Index: llvm/lib/Bitcode/Reader/BitcodeReader.h
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.h:1.7 llvm/lib/Bitcode/Reader/BitcodeReader.h:1.8
--- llvm/lib/Bitcode/Reader/BitcodeReader.h:1.7 Tue Apr 24 00:48:56 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.h Tue Apr 24 13:15:21 2007
@@ -58,6 +58,7 @@
BitcodeReaderValueList ValueList;
std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits;
public:
+ BitcodeReader() : ErrorString(0) {}
virtual ~BitcodeReader() {}
virtual void FreeState() {}
Index: llvm/lib/Bitcode/Reader/ReaderWrappers.cpp
diff -u llvm/lib/Bitcode/Reader/ReaderWrappers.cpp:1.1 llvm/lib/Bitcode/Reader/ReaderWrappers.cpp:1.2
--- llvm/lib/Bitcode/Reader/ReaderWrappers.cpp:1.1 Sun Apr 22 01:23:29 2007
+++ llvm/lib/Bitcode/Reader/ReaderWrappers.cpp Tue Apr 24 13:15:21 2007
@@ -51,6 +51,7 @@
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;
}
More information about the llvm-commits
mailing list