Add some extra checks. Opaque types don't have a null marker.
authorChris Lattner <sabre@nondot.org>
Thu, 5 May 2005 20:57:00 +0000 (20:57 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 5 May 2005 20:57:00 +0000 (20:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21700 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bytecode/Reader/Reader.cpp

index 398ecfc37292659e81a3ffcd416cb55a99ffaffb..75460c66fd1e1832dc84f049d1cc917a83c5de55 100644 (file)
@@ -412,9 +412,12 @@ Value * BytecodeReader::getValue(unsigned type, unsigned oNum, bool Create) {
       GlobalTyID = CompactionTypes[type-Type::FirstDerivedTyID].second;
 
     if (hasImplicitNull(GlobalTyID)) {
-      if (Num == 0)
-        return Constant::getNullValue(getType(type));
-      --Num;
+      const Type *Ty = getType(type);
+      if (!isa<OpaqueType>(Ty)) {
+        if (Num == 0)
+          return Constant::getNullValue(Ty);
+        --Num;
+      }
     }
 
     if (GlobalTyID < ModuleValues.size() && ModuleValues[GlobalTyID]) {
@@ -529,7 +532,7 @@ unsigned BytecodeReader::insertValue(Value *Val, unsigned type,
 
   ValueTab[type]->push_back(Val);
 
-  bool HasOffset = hasImplicitNull(type);
+  bool HasOffset = hasImplicitNull(type) && !isa<OpaqueType>(Val->getType());
   return ValueTab[type]->size()-1 + HasOffset;
 }
 
@@ -2141,6 +2144,9 @@ void BytecodeReader::ParseModule() {
       error("Cannot find initializer value.");
   }
 
+  if (!ConstantFwdRefs.empty())
+    error("Use of undefined constants in a module");
+
   /// Make sure we pulled them all out. If we didn't then there's a declaration
   /// but a missing body. That's not allowed.
   if (!FunctionSignatureList.empty())