diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp index c3f7eb64349..29812da561e 100644 --- a/lib/Bytecode/Reader/Reader.cpp +++ b/lib/Bytecode/Reader/Reader.cpp @@ -176,33 +176,6 @@ Constant *BytecodeParser::getConstantValue(const Type *Ty, unsigned Slot) { } -void BytecodeParser::postResolveValues(ValueTable &ValTab) { - while (!ValTab.empty()) { - ValueList &VL = *ValTab.back(); - ValTab.pop_back(); - - while (!VL.empty()) { - Value *V = VL.back(); - unsigned IDNumber = getValueIDNumberFromPlaceHolder(V); - VL.pop_back(); - - Value *NewVal = getValue(V->getType(), IDNumber, false); - if (NewVal == 0) - throw std::string("Unresolvable reference found: <" + - V->getType()->getDescription() + ">:" + - utostr(IDNumber) + "."); - - // Fixup all of the uses of this placeholder def... - V->replaceAllUsesWith(NewVal); - - // Now that all the uses are gone, delete the placeholder... - // If we couldn't find a def (error case), then leak a little - delete V; // memory, 'cause otherwise we can't remove all uses! - } - delete &VL; - } -} - std::auto_ptr BytecodeParser::ParseBasicBlock(const unsigned char *&Buf, const unsigned char *EndBuf) { @@ -381,9 +354,31 @@ void BytecodeParser::materializeFunction(Function* F) { } // Check for unresolvable references - postResolveValues(LateResolveValues); + while (!LateResolveValues.empty()) { + ValueList &VL = *LateResolveValues.back(); + LateResolveValues.pop_back(); - //ResolveReferencesToValue(F, FunctionSlot); + while (!VL.empty()) { + Value *V = VL.back(); + unsigned IDNumber = getValueIDNumberFromPlaceHolder(V); + VL.pop_back(); + + Value *NewVal = getValue(V->getType(), IDNumber, false); + if (NewVal == 0) + throw std::string("Unresolvable reference found: <" + + V->getType()->getDescription() + ">:" + + utostr(IDNumber) + "."); + + // Fixup all of the uses of this placeholder def... + V->replaceAllUsesWith(NewVal); + + // Now that all the uses are gone, delete the placeholder... + // If we couldn't find a def (error case), then leak a little + // memory, because otherwise we can't remove all uses! + delete V; + } + delete &VL; + } // Clear out function-level types... FunctionTypeValues.clear(); diff --git a/lib/Bytecode/Reader/ReaderInternals.h b/lib/Bytecode/Reader/ReaderInternals.h index c022519e58e..8825df7fbe0 100644 --- a/lib/Bytecode/Reader/ReaderInternals.h +++ b/lib/Bytecode/Reader/ReaderInternals.h @@ -77,11 +77,9 @@ public: std::cerr << "BytecodeParser instance!\n"; } -private: // All of this data is transient across calls to ParseBytecode +private: struct ValueList : public User { - ValueList() : User(Type::TypeTy, Value::TypeVal) { - } - ~ValueList() {} + ValueList() : User(Type::TypeTy, Value::TypeVal) {} // vector compatibility methods unsigned size() const { return getNumOperands(); } @@ -185,7 +183,6 @@ private: int insertValue(Value *V, ValueTable &Table); // -1 = Failure void setValueTo(ValueTable &D, unsigned Slot, Value *V); - void postResolveValues(ValueTable &ValTab); unsigned getTypeSlot(const Type *Ty);