Index: include/llvm/CodeGen/MachineModuleInfo.h =================================================================== --- include/llvm/CodeGen/MachineModuleInfo.h (revision 169290) +++ include/llvm/CodeGen/MachineModuleInfo.h (working copy) @@ -180,6 +180,10 @@ const MCObjectFileInfo *MOFI); ~MachineModuleInfo(); + // Initialization and Finalization + virtual bool doInitialization(Module &); + virtual bool doFinalization(Module &); + /// EndFunction - Discard function meta information. /// void EndFunction(); Index: lib/VMCore/PassManager.cpp =================================================================== --- lib/VMCore/PassManager.cpp (revision 169290) +++ lib/VMCore/PassManager.cpp (working copy) @@ -1333,7 +1333,7 @@ bool BBPassManager::doFinalization(Module &M) { bool Changed = false; - for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) + for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index) Changed |= getContainedPass(Index)->doFinalization(M); return Changed; @@ -1423,6 +1423,12 @@ dumpArguments(); dumpPasses(); + SmallVectorImpl& IPV = getImmutablePasses(); + for (SmallVectorImpl::const_iterator I = IPV.begin(), + E = IPV.end(); I != E; ++I) { + Changed |= (*I)->doInitialization(M); + } + for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) Changed |= getContainedManager(Index)->doInitialization(M); @@ -1432,9 +1438,15 @@ bool FunctionPassManagerImpl::doFinalization(Module &M) { bool Changed = false; - for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) + for (int Index = getNumContainedManagers() - 1; Index >= 0; --Index) Changed |= getContainedManager(Index)->doFinalization(M); + SmallVectorImpl& IPV = getImmutablePasses(); + for (SmallVectorImpl::const_iterator I = IPV.begin(), + E = IPV.end(); I != E; ++I) { + Changed |= (*I)->doFinalization(M); + } + return Changed; } @@ -1553,8 +1565,8 @@ bool FPPassManager::doFinalization(Module &M) { bool Changed = false; - - for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) + + for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index) Changed |= getContainedPass(Index)->doFinalization(M); return Changed; @@ -1611,7 +1623,7 @@ } // Finalize module passes - for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) + for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index) Changed |= getContainedPass(Index)->doFinalization(M); // Finalize on-the-fly passes @@ -1682,9 +1694,21 @@ dumpArguments(); dumpPasses(); + SmallVectorImpl& IPV = getImmutablePasses(); + for (SmallVectorImpl::const_iterator I = IPV.begin(), + E = IPV.end(); I != E; ++I) { + Changed |= (*I)->doInitialization(M); + } + initializeAllAnalysisInfo(); for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) Changed |= getContainedManager(Index)->runOnModule(M); + + for (SmallVectorImpl::const_iterator I = IPV.begin(), + E = IPV.end(); I != E; ++I) { + Changed |= (*I)->doFinalization(M); + } + return Changed; } Index: lib/CodeGen/MachineModuleInfo.cpp =================================================================== --- lib/CodeGen/MachineModuleInfo.cpp (revision 169290) +++ lib/CodeGen/MachineModuleInfo.cpp (working copy) @@ -253,15 +253,8 @@ MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI, const MCRegisterInfo &MRI, const MCObjectFileInfo *MOFI) - : ImmutablePass(ID), Context(MAI, MRI, MOFI), - ObjFileMMI(0), CompactUnwindEncoding(0), CurCallSite(0), CallsEHReturn(0), - CallsUnwindInit(0), DbgInfoAvailable(false), - UsesVAFloatArgument(false) { + : ImmutablePass(ID), Context(MAI, MRI, MOFI) { initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry()); - // Always emit some info, by default "no personality" info. - Personalities.push_back(NULL); - AddrLabelSymbols = 0; - TheModule = 0; } MachineModuleInfo::MachineModuleInfo() @@ -274,11 +267,31 @@ MachineModuleInfo::~MachineModuleInfo() { delete ObjFileMMI; +} - // FIXME: Why isn't doFinalization being called?? - //assert(AddrLabelSymbols == 0 && "doFinalization not called"); +bool MachineModuleInfo::doInitialization(Module &M) { + ObjFileMMI = 0; + CompactUnwindEncoding = 0; + CurCallSite = 0; + CallsEHReturn = 0; + CallsUnwindInit = 0; + DbgInfoAvailable = UsesVAFloatArgument = false; + // Always emit some info, by default "no personality" info. + Personalities.push_back(NULL); + AddrLabelSymbols = 0; + TheModule = 0; + + return false; +} + +bool MachineModuleInfo::doFinalization(Module &M) { + + Personalities.clear(); + delete AddrLabelSymbols; AddrLabelSymbols = 0; + + return false; } /// EndFunction - Discard function meta information.