Fix bug: Assembler/2003-05-03-BytecodeReaderProblem.llx
authorChris Lattner <sabre@nondot.org>
Thu, 22 May 2003 18:35:38 +0000 (18:35 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 22 May 2003 18:35:38 +0000 (18:35 +0000)
by emitting the type planes before any constants (which could be constant
expressions involving undefined types!)

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

lib/Bytecode/Writer/Writer.cpp

index f97d7e232b5d7a9b0a0dd88e02b39ea38ccaf3a4..ad13eef734d50e08d38660e63db1b3f60a2d89a1 100644 (file)
@@ -125,25 +125,34 @@ void BytecodeWriter::outputConstants(bool isFunction) {
   BytecodeBlock CPool(BytecodeFormat::ConstantPool, Out);
 
   unsigned NumPlanes = Table.getNumPlanes();
-  
-  for (unsigned pno = 0; pno != NumPlanes; pno++) {
-    const std::vector<const Value*> &Plane = Table.getPlane(pno);
-    if (!Plane.empty()) {              // Skip empty type planes...
-      unsigned ValNo = 0;
-      if (isFunction)                 // Don't reemit module constants
-        ValNo += Table.getModuleLevel(pno);
-      else if (pno == Type::TypeTyID) // If type plane wasn't written out above
-        continue;
-
-      if (pno >= Type::FirstDerivedTyID) {
-        // Skip zero initializer
-        if (ValNo == 0)
-          ValNo = 1;
-      }
 
-      outputConstantsInPlane(Plane, ValNo); // Write out constants in the plane
+  // Output the type plane before any constants!
+  if (isFunction && NumPlanes > Type::TypeTyID) {
+    const std::vector<const Value*> &Plane = Table.getPlane(Type::TypeTyID);
+    if (!Plane.empty()) {              // Skip empty type planes...
+      unsigned ValNo = Table.getModuleLevel(Type::TypeTyID);
+      outputConstantsInPlane(Plane, ValNo);
     }
   }
+  
+  for (unsigned pno = 0; pno != NumPlanes; pno++)
+    if (pno != Type::TypeTyID) {         // Type plane handled above.
+      const std::vector<const Value*> &Plane = Table.getPlane(pno);
+      if (!Plane.empty()) {              // Skip empty type planes...
+        unsigned ValNo = 0;
+        if (isFunction)                  // Don't reemit module constants
+          ValNo += Table.getModuleLevel(pno);
+        
+        if (pno >= Type::FirstDerivedTyID) {
+          // Skip zero initializer
+          if (ValNo == 0)
+            ValNo = 1;
+        }
+        
+        // Write out constants in the plane
+        outputConstantsInPlane(Plane, ValNo);
+      }
+    }
 }
 
 void BytecodeWriter::outputModuleInfoBlock(const Module *M) {