mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 13:10:34 +00:00
Add new method to FunctionPassManager to add ImmutablePasses.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7838 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e69f72758b
commit
1d3fa21cdd
@ -34,6 +34,7 @@ public:
|
||||
};
|
||||
|
||||
class FunctionPass;
|
||||
class ImmutablePass;
|
||||
class Function;
|
||||
|
||||
class FunctionPassManager {
|
||||
@ -50,6 +51,11 @@ public:
|
||||
///
|
||||
void add(FunctionPass *P);
|
||||
|
||||
/// add - ImmutablePasses are not FunctionPasses, so we have a
|
||||
/// special hack to get them into a FunctionPassManager.
|
||||
///
|
||||
void add(ImmutablePass *IP);
|
||||
|
||||
/// run - Execute all of the passes scheduled for execution. Keep
|
||||
/// track of whether any of the passes modifies the function, and if
|
||||
/// so, return true.
|
||||
|
@ -78,6 +78,7 @@ bool PassManager::run(Module &M) { return PM->run(M); }
|
||||
FunctionPassManager::FunctionPassManager() : PM(new PassManagerT<Function>()) {}
|
||||
FunctionPassManager::~FunctionPassManager() { delete PM; }
|
||||
void FunctionPassManager::add(FunctionPass *P) { PM->add(P); }
|
||||
void FunctionPassManager::add(ImmutablePass *IP) { PM->add(IP); }
|
||||
bool FunctionPassManager::run(Function &F) { return PM->run(F); }
|
||||
|
||||
|
||||
|
@ -444,8 +444,27 @@ public:
|
||||
P->addToPassManager(this, AnUsage);
|
||||
}
|
||||
|
||||
private:
|
||||
// add - H4x0r an ImmutablePass into a PassManager that might not be
|
||||
// expecting one.
|
||||
//
|
||||
void add(ImmutablePass *P) {
|
||||
// Get information about what analyses the pass uses...
|
||||
AnalysisUsage AnUsage;
|
||||
P->getAnalysisUsage(AnUsage);
|
||||
const std::vector<AnalysisID> &Required = AnUsage.getRequiredSet();
|
||||
|
||||
// Loop over all of the analyses used by this pass,
|
||||
for (std::vector<AnalysisID>::const_iterator I = Required.begin(),
|
||||
E = Required.end(); I != E; ++I) {
|
||||
if (getAnalysisOrNullDown(*I) == 0)
|
||||
add((PassClass*)(*I)->createPass());
|
||||
}
|
||||
|
||||
// Add the ImmutablePass to this PassManager.
|
||||
addPass(P, AnUsage);
|
||||
}
|
||||
|
||||
private:
|
||||
// addPass - These functions are used to implement the subclass specific
|
||||
// behaviors present in PassManager. Basically the add(Pass*) method ends up
|
||||
// reflecting its behavior into a Pass::addToPassManager call. Subclasses of
|
||||
|
Loading…
Reference in New Issue
Block a user