forked from OSchip/llvm-project
- 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:
parent
55b6b6434e
commit
41b98843e8
|
@ -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();
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -1554,7 +1566,7 @@ 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue