From f69315bd79c3cc8f92f3b003b2cdab57aba3a20e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 22 May 2003 18:35:38 +0000 Subject: [PATCH] Fix bug: Assembler/2003-05-03-BytecodeReaderProblem.llx 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 | 41 +++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp index f97d7e232b5..ad13eef734d 100644 --- a/lib/Bytecode/Writer/Writer.cpp +++ b/lib/Bytecode/Writer/Writer.cpp @@ -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 &Plane = Table.getPlane(pno); + + // Output the type plane before any constants! + if (isFunction && NumPlanes > Type::TypeTyID) { + const std::vector &Plane = Table.getPlane(Type::TypeTyID); 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 + 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 &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) {