- Fix a really nasty bug in the bytecode reader that caused it to fail
authorChris Lattner <sabre@nondot.org>
Wed, 23 Oct 2002 00:51:54 +0000 (00:51 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 23 Oct 2002 00:51:54 +0000 (00:51 +0000)
    reading bytecode files with > 255 types in them, but only when optimization
    is enabled.  This was caused by GCC shrinking an enum to a single byte
    instead of a whole word.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4266 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bytecode/Reader/Reader.cpp

index 23af02e516b38609dea75c13d2aad6ad50d27995..0f9889c4c8eff14a46b7146a02f608260a9a3711 100644 (file)
@@ -48,15 +48,14 @@ bool BytecodeParser::getTypeSlot(const Type *Ty, unsigned &Slot) {
 }
 
 const Type *BytecodeParser::getType(unsigned ID) {
-  const Type *T = Type::getPrimitiveType((Type::PrimitiveID)ID);
-  if (T) return T;
+  if (ID < Type::NumPrimitiveIDs) {
+    const Type *T = Type::getPrimitiveType((Type::PrimitiveID)ID);
+    if (T) return T;
+  }
   
   //cerr << "Looking up Type ID: " << ID << "\n";
-
-  const Value *D = getValue(Type::TypeTy, ID, false);
-  if (D == 0) return 0;
-
-  return cast<Type>(D);
+  const Value *V = getValue(Type::TypeTy, ID, false);
+  return cast_or_null<Type>(V);
 }
 
 int BytecodeParser::insertValue(Value *Val, std::vector<ValueList> &ValueTab) {
@@ -82,8 +81,10 @@ Value *BytecodeParser::getValue(const Type *Ty, unsigned oNum, bool Create) {
 
   if (type == Type::TypeTyID) {  // The 'type' plane has implicit values
     assert(Create == false);
-    const Type *T = Type::getPrimitiveType((Type::PrimitiveID)Num);
-    if (T) return (Value*)T;   // Asked for a primitive type...
+    if (Num < Type::NumPrimitiveIDs) {
+      const Type *T = Type::getPrimitiveType((Type::PrimitiveID)Num);
+      if (T) return (Value*)T;   // Asked for a primitive type...
+    }
 
     // Otherwise, derived types need offset...
     Num -= FirstDerivedTyID;
@@ -452,7 +453,7 @@ bool BytecodeParser::ParseModuleGlobalInfo(const uchar *&Buf, const uchar *End,
       Error = "Function not ptr to func type!  Ty = " + Ty->getDescription();
       return true; 
     }
-    
+
     // We create methods by passing the underlying FunctionType to create...
     Ty = cast<PointerType>(Ty)->getElementType();