Allow bytecode files to refer directly to global values as constants, instead
authorChris Lattner <sabre@nondot.org>
Thu, 15 Jan 2004 18:45:25 +0000 (18:45 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 15 Jan 2004 18:45:25 +0000 (18:45 +0000)
of forcing them to go through ConstantPointerRef's.  This allows bytecode
files to mirror .ll files, allows more efficient encoding, and makes it easier
to eventually eliminate CPR's.

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

lib/Bytecode/Reader/Reader.cpp

index bc84135a96fa99966d0318c1ae98e842f317f222..9cc24b32cda09b6b78c5b4fd3b06b27776128bb8 100644 (file)
@@ -151,6 +151,10 @@ Constant *BytecodeParser::getConstantValue(unsigned TypeSlot, unsigned Slot) {
   if (Value *V = getValue(TypeSlot, Slot, false))
     if (Constant *C = dyn_cast<Constant>(V))
       return C;   // If we already have the value parsed, just return it
+    else if (GlobalValue *GV = dyn_cast<GlobalValue>(V))
+      // ConstantPointerRef's are an abomination, but at least they don't have
+      // to infest bytecode files.
+      return ConstantPointerRef::get(GV);
     else
       throw std::string("Reference of a value is expected to be a constant!");
 
@@ -637,10 +641,10 @@ void BytecodeParser::ParseModule(const unsigned char *Buf,
     // Look up the initializer value...
     // FIXME: Preserve this type ID!
     unsigned TypeSlot = getTypeSlot(GV->getType()->getElementType());
-    if (Value *V = getValue(TypeSlot, Slot, false)) {
+    if (Constant *CV = getConstantValue(TypeSlot, Slot)) {
       if (GV->hasInitializer()) 
         throw std::string("Global *already* has an initializer?!");
-      GV->setInitializer(cast<Constant>(V));
+      GV->setInitializer(CV);
     } else
       throw std::string("Cannot find initializer value.");
   }