diff --git a/lib/Bytecode/Writer/SlotCalculator.cpp b/lib/Bytecode/Writer/SlotCalculator.cpp index 00f7cbc5aea..d4c16e9bac5 100644 --- a/lib/Bytecode/Writer/SlotCalculator.cpp +++ b/lib/Bytecode/Writer/SlotCalculator.cpp @@ -24,7 +24,6 @@ #include "llvm/TypeSymbolTable.h" #include "llvm/Type.h" #include "llvm/ValueSymbolTable.h" -#include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/STLExtras.h" #include #include @@ -355,34 +354,16 @@ unsigned SlotCalculator::getOrCreateTypeSlot(const Type *Ty) { int SlotNo = getTypeSlot(Ty); // Check to see if it's already in! if (SlotNo != -1) return (unsigned)SlotNo; - // Insert the current type before any subtypes. This is important because - // recursive types elements are inserted in a bottom up order. Changing - // this here can break things. For example: - // - // global { \2 * } { { \2 }* null } - // - unsigned ResultSlot = doInsertType(Ty); + // Insert into TypeMap. + unsigned ResultSlot = TypeMap[Ty] = Types.size(); + Types.push_back(Ty); + SC_DEBUG(" Inserting type [" << ResultSlot << "] = " << *Ty << "\n" ); + + // Loop over any contained types in the definition, ensuring they are also + // inserted. + for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end(); + I != E; ++I) + getOrCreateTypeSlot(*I); - // Loop over any contained types in the definition... in post - // order. - for (po_iterator I = po_begin(Ty), E = po_end(Ty); - I != E; ++I) { - if (*I != Ty && !TypeMap.count(*I)) { - // If we haven't seen this sub type before, add it to our type table! - doInsertType(*I); - } - } return ResultSlot; } - - -// doInsertType - This is a small helper function to be called only -// be insertType. -// -unsigned SlotCalculator::doInsertType(const Type *Ty) { - // Insert into TypeMap. - unsigned DestSlot = TypeMap[Ty] = Types.size(); - Types.push_back(Ty); - SC_DEBUG(" Inserting type [" << DestSlot << "] = " << *Ty << "\n" ); - return DestSlot; -} diff --git a/lib/Bytecode/Writer/SlotCalculator.h b/lib/Bytecode/Writer/SlotCalculator.h index 9223fb71f42..a8e22103403 100644 --- a/lib/Bytecode/Writer/SlotCalculator.h +++ b/lib/Bytecode/Writer/SlotCalculator.h @@ -107,9 +107,6 @@ private: void CreateSlotIfNeeded(const Value *V); unsigned getOrCreateTypeSlot(const Type *T); - // doInsertValue - Small helper function to be called only be insertVal. - unsigned doInsertType(const Type *T); - // processModule - Process all of the module level function declarations and // types that are available. //