- Added calls to doInitialization/doFinalization to immutable passes

- fixed ordering of calls to doFinalization to be the reverse of the pass run order due to potential dependencies
- fixed machine module info to operate in the doInitialization/doFinalization model, also fixes some FIXMEs

reviewed by Evan Cheng <evan.cheng@apple.com>

llvm-svn: 169391
This commit is contained in:
Pedro Artigas 2012-12-05 17:12:22 +00:00
parent 55b6b6434e
commit 41b98843e8
3 changed files with 56 additions and 15 deletions

View File

@ -180,6 +180,10 @@ public:
const MCObjectFileInfo *MOFI);
~MachineModuleInfo();
// Initialization and Finalization
virtual bool doInitialization(Module &);
virtual bool doFinalization(Module &);
/// EndFunction - Discard function meta information.
///
void EndFunction();

View File

@ -253,15 +253,8 @@ void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
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()
MachineModuleInfo::~MachineModuleInfo() {
delete ObjFileMMI;
}
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();
// FIXME: Why isn't doFinalization being called??
//assert(AddrLabelSymbols == 0 && "doFinalization not called");
delete AddrLabelSymbols;
AddrLabelSymbols = 0;
return false;
}
/// EndFunction - Discard function meta information.

View File

@ -1333,7 +1333,7 @@ bool BBPassManager::doInitialization(Module &M) {
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 @@ bool FunctionPassManagerImpl::doInitialization(Module &M) {
dumpArguments();
dumpPasses();
SmallVectorImpl<ImmutablePass *>& IPV = getImmutablePasses();
for (SmallVectorImpl<ImmutablePass *>::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::doInitialization(Module &M) {
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<ImmutablePass *>& IPV = getImmutablePasses();
for (SmallVectorImpl<ImmutablePass *>::const_iterator I = IPV.begin(),
E = IPV.end(); I != E; ++I) {
Changed |= (*I)->doFinalization(M);
}
return Changed;
}
@ -1553,8 +1565,8 @@ bool FPPassManager::doInitialization(Module &M) {
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 @@ MPPassManager::runOnModule(Module &M) {
}
// 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 @@ bool PassManagerImpl::run(Module &M) {
dumpArguments();
dumpPasses();
SmallVectorImpl<ImmutablePass *>& IPV = getImmutablePasses();
for (SmallVectorImpl<ImmutablePass *>::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<ImmutablePass *>::const_iterator I = IPV.begin(),
E = IPV.end(); I != E; ++I) {
Changed |= (*I)->doFinalization(M);
}
return Changed;
}