mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Update assignPassManager() signature to allow selection of preferred
pass manager type. This allows new FPPassManager to select Call Graph Pass Manager (if available) as its parent. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33306 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -57,6 +57,20 @@ class PMDataManager;
|
|||||||
// AnalysisID - Use the PassInfo to identify a pass...
|
// AnalysisID - Use the PassInfo to identify a pass...
|
||||||
typedef const PassInfo* AnalysisID;
|
typedef const PassInfo* AnalysisID;
|
||||||
|
|
||||||
|
/// Different types of internal pass managers. External pass managers
|
||||||
|
/// (PassManager and FunctionPassManager) are not represented here.
|
||||||
|
/// Ordering of pass manager types is important here.
|
||||||
|
enum PassManagerType {
|
||||||
|
PMT_Unknown = 0,
|
||||||
|
PMT_ModulePassManager = 1, /// MPPassManager
|
||||||
|
PMT_CallGraphPassManager, /// CGPassManager
|
||||||
|
PMT_FunctionPassManager, /// FPPassManager
|
||||||
|
PMT_LoopPassManager, /// LPPassManager
|
||||||
|
PMT_BasicBlockPassManager /// BBPassManager
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum PassManagerType PassManagerType;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
/// Pass interface - Implemented by all 'passes'. Subclass this if you are an
|
/// Pass interface - Implemented by all 'passes'. Subclass this if you are an
|
||||||
/// interprocedural optimization or you do not fit into any of the more
|
/// interprocedural optimization or you do not fit into any of the more
|
||||||
@@ -107,7 +121,8 @@ public:
|
|||||||
void print(std::ostream *O, const Module *M) const { if (O) print(*O, M); }
|
void print(std::ostream *O, const Module *M) const { if (O) print(*O, M); }
|
||||||
void dump() const; // dump - call print(std::cerr, 0);
|
void dump() const; // dump - call print(std::cerr, 0);
|
||||||
|
|
||||||
virtual void assignPassManager(PMStack &PMS) {}
|
virtual void assignPassManager(PMStack &PMS,
|
||||||
|
PassManagerType T = PMT_Unknown) {}
|
||||||
// Access AnalysisResolver
|
// Access AnalysisResolver
|
||||||
inline void setResolver(AnalysisResolver *AR) { Resolver = AR; }
|
inline void setResolver(AnalysisResolver *AR) { Resolver = AR; }
|
||||||
inline AnalysisResolver *getResolver() { return Resolver; }
|
inline AnalysisResolver *getResolver() { return Resolver; }
|
||||||
@@ -200,7 +215,8 @@ public:
|
|||||||
virtual bool runPass(Module &M) { return runOnModule(M); }
|
virtual bool runPass(Module &M) { return runOnModule(M); }
|
||||||
virtual bool runPass(BasicBlock&) { return false; }
|
virtual bool runPass(BasicBlock&) { return false; }
|
||||||
|
|
||||||
virtual void assignPassManager(PMStack &PMS);
|
virtual void assignPassManager(PMStack &PMS,
|
||||||
|
PassManagerType T = PMT_ModulePassManager);
|
||||||
// Force out-of-line virtual method.
|
// Force out-of-line virtual method.
|
||||||
virtual ~ModulePass();
|
virtual ~ModulePass();
|
||||||
};
|
};
|
||||||
@@ -266,7 +282,8 @@ public:
|
|||||||
///
|
///
|
||||||
bool run(Function &F);
|
bool run(Function &F);
|
||||||
|
|
||||||
virtual void assignPassManager(PMStack &PMS);
|
virtual void assignPassManager(PMStack &PMS,
|
||||||
|
PassManagerType T = PMT_FunctionPassManager);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -320,19 +337,8 @@ public:
|
|||||||
virtual bool runPass(Module &M) { return false; }
|
virtual bool runPass(Module &M) { return false; }
|
||||||
virtual bool runPass(BasicBlock &BB);
|
virtual bool runPass(BasicBlock &BB);
|
||||||
|
|
||||||
virtual void assignPassManager(PMStack &PMS);
|
virtual void assignPassManager(PMStack &PMS,
|
||||||
};
|
PassManagerType T = PMT_BasicBlockPassManager);
|
||||||
|
|
||||||
/// Different types of internal pass managers. External pass managers
|
|
||||||
/// (PassManager and FunctionPassManager) are not represented here.
|
|
||||||
/// Ordering of pass manager types is important here.
|
|
||||||
enum PassManagerType {
|
|
||||||
PMT_Unknown = 0,
|
|
||||||
PMT_ModulePassManager = 1, /// MPPassManager
|
|
||||||
PMT_CallGraphPassManager, /// CGPassManager
|
|
||||||
PMT_FunctionPassManager, /// FPPassManager
|
|
||||||
PMT_LoopPassManager, /// LPPassManager
|
|
||||||
PMT_BasicBlockPassManager /// BBPassManager
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// PMStack
|
/// PMStack
|
||||||
|
@@ -1202,7 +1202,8 @@ void PMStack::handleLastUserOverflow() {
|
|||||||
|
|
||||||
/// Find appropriate Module Pass Manager in the PM Stack and
|
/// Find appropriate Module Pass Manager in the PM Stack and
|
||||||
/// add self into that manager.
|
/// add self into that manager.
|
||||||
void ModulePass::assignPassManager(PMStack &PMS) {
|
void ModulePass::assignPassManager(PMStack &PMS,
|
||||||
|
PassManagerType PreferredType) {
|
||||||
|
|
||||||
// Find Module Pass Manager
|
// Find Module Pass Manager
|
||||||
while(!PMS.empty()) {
|
while(!PMS.empty()) {
|
||||||
@@ -1219,7 +1220,8 @@ void ModulePass::assignPassManager(PMStack &PMS) {
|
|||||||
|
|
||||||
/// Find appropriate Function Pass Manager or Call Graph Pass Manager
|
/// Find appropriate Function Pass Manager or Call Graph Pass Manager
|
||||||
/// in the PM Stack and add self into that manager.
|
/// in the PM Stack and add self into that manager.
|
||||||
void FunctionPass::assignPassManager(PMStack &PMS) {
|
void FunctionPass::assignPassManager(PMStack &PMS,
|
||||||
|
PassManagerType PreferredType) {
|
||||||
|
|
||||||
// Find Module Pass Manager (TODO : Or Call Graph Pass Manager)
|
// Find Module Pass Manager (TODO : Or Call Graph Pass Manager)
|
||||||
while(!PMS.empty()) {
|
while(!PMS.empty()) {
|
||||||
@@ -1245,7 +1247,13 @@ void FunctionPass::assignPassManager(PMStack &PMS) {
|
|||||||
// [3] Assign manager to manage this new manager. This may create
|
// [3] Assign manager to manage this new manager. This may create
|
||||||
// and push new managers into PMS
|
// and push new managers into PMS
|
||||||
Pass *P = dynamic_cast<Pass *>(FPP);
|
Pass *P = dynamic_cast<Pass *>(FPP);
|
||||||
P->assignPassManager(PMS);
|
|
||||||
|
// If Call Graph Pass Manager is active then use it to manage
|
||||||
|
// this new Function Pass manager.
|
||||||
|
if (PMD->getPassManagerType() == PMT_CallGraphPassManager)
|
||||||
|
P->assignPassManager(PMS, PMT_CallGraphPassManager);
|
||||||
|
else
|
||||||
|
P->assignPassManager(PMS);
|
||||||
|
|
||||||
// [4] Push new manager into PMS
|
// [4] Push new manager into PMS
|
||||||
PMS.push(FPP);
|
PMS.push(FPP);
|
||||||
@@ -1257,7 +1265,8 @@ void FunctionPass::assignPassManager(PMStack &PMS) {
|
|||||||
|
|
||||||
/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
|
/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
|
||||||
/// in the PM Stack and add self into that manager.
|
/// in the PM Stack and add self into that manager.
|
||||||
void BasicBlockPass::assignPassManager(PMStack &PMS) {
|
void BasicBlockPass::assignPassManager(PMStack &PMS,
|
||||||
|
PassManagerType PreferredType) {
|
||||||
|
|
||||||
BBPassManager *BBP = NULL;
|
BBPassManager *BBP = NULL;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user