[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