mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-13 17:38:39 +00:00
move 'cfgonly' pass tracking into PassInfo, instead of handling it with
yet-another global data structure. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32102 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5365489f6c
commit
947c7689fc
@ -38,6 +38,7 @@ class PassInfo {
|
|||||||
const char *PassName; // Nice name for Pass
|
const char *PassName; // Nice name for Pass
|
||||||
const char *PassArgument; // Command Line argument to run this pass
|
const char *PassArgument; // Command Line argument to run this pass
|
||||||
const std::type_info &TypeInfo; // type_info object for this Pass class
|
const std::type_info &TypeInfo; // type_info object for this Pass class
|
||||||
|
bool IsCFGOnlyPass; // Pass only looks at the CFG.
|
||||||
bool IsAnalysisGroup; // True if an analysis group.
|
bool IsAnalysisGroup; // True if an analysis group.
|
||||||
std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
|
std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
|
||||||
|
|
||||||
@ -48,8 +49,8 @@ public:
|
|||||||
/// through RegisterPass.
|
/// through RegisterPass.
|
||||||
PassInfo(const char *name, const char *arg, const std::type_info &ti,
|
PassInfo(const char *name, const char *arg, const std::type_info &ti,
|
||||||
Pass *(*normal)() = 0)
|
Pass *(*normal)() = 0)
|
||||||
: PassName(name), PassArgument(arg), TypeInfo(ti), IsAnalysisGroup(false),
|
: PassName(name), PassArgument(arg), TypeInfo(ti),
|
||||||
NormalCtor(normal) {
|
IsCFGOnlyPass(false), IsAnalysisGroup(false), NormalCtor(normal) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// getPassName - Return the friendly name for the pass, never returns null
|
/// getPassName - Return the friendly name for the pass, never returns null
|
||||||
@ -73,6 +74,11 @@ public:
|
|||||||
bool isAnalysisGroup() const { return IsAnalysisGroup; }
|
bool isAnalysisGroup() const { return IsAnalysisGroup; }
|
||||||
void SetIsAnalysisGroup() { IsAnalysisGroup = true; }
|
void SetIsAnalysisGroup() { IsAnalysisGroup = true; }
|
||||||
|
|
||||||
|
/// isCFGOnlyPass - return true if this pass only looks at the CFG for the
|
||||||
|
/// function.
|
||||||
|
bool isCFGOnlyPass() const { return IsCFGOnlyPass; }
|
||||||
|
void SetIsCFGOnlyPass() { IsCFGOnlyPass = true; }
|
||||||
|
|
||||||
/// getNormalCtor - Return a pointer to a function, that when called, creates
|
/// getNormalCtor - Return a pointer to a function, that when called, creates
|
||||||
/// an instance of the pass and returns it. This pointer may be null if there
|
/// an instance of the pass and returns it. This pointer may be null if there
|
||||||
/// is no default constructor for the pass.
|
/// is no default constructor for the pass.
|
||||||
@ -159,7 +165,9 @@ protected:
|
|||||||
/// setOnlyUsesCFG - Notice that this pass only depends on the CFG, so
|
/// setOnlyUsesCFG - Notice that this pass only depends on the CFG, so
|
||||||
/// transformations that do not modify the CFG do not invalidate this pass.
|
/// transformations that do not modify the CFG do not invalidate this pass.
|
||||||
///
|
///
|
||||||
void setOnlyUsesCFG();
|
void setOnlyUsesCFG() {
|
||||||
|
PIObj.SetIsCFGOnlyPass();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename PassName>
|
template<typename PassName>
|
||||||
|
@ -23,21 +23,6 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
// AnalysisID Class Implementation
|
|
||||||
//
|
|
||||||
|
|
||||||
// getCFGOnlyAnalyses - A wrapper around the CFGOnlyAnalyses which make it
|
|
||||||
// initializer order independent.
|
|
||||||
static std::vector<const PassInfo*> &getCFGOnlyAnalyses() {
|
|
||||||
static std::vector<const PassInfo*> CFGOnlyAnalyses;
|
|
||||||
return CFGOnlyAnalyses;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegisterPassBase::setOnlyUsesCFG() {
|
|
||||||
getCFGOnlyAnalyses().push_back(&PIObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// AnalysisResolver Class Implementation
|
// AnalysisResolver Class Implementation
|
||||||
//
|
//
|
||||||
@ -49,28 +34,6 @@ void AnalysisResolver::setAnalysisResolver(Pass *P, AnalysisResolver *AR) {
|
|||||||
P->Resolver = AR;
|
P->Resolver = AR;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
// AnalysisUsage Class Implementation
|
|
||||||
//
|
|
||||||
|
|
||||||
// setPreservesCFG - This function should be called to by the pass, iff they do
|
|
||||||
// not:
|
|
||||||
//
|
|
||||||
// 1. Add or remove basic blocks from the function
|
|
||||||
// 2. Modify terminator instructions in any way.
|
|
||||||
//
|
|
||||||
// This function annotates the AnalysisUsage info object to say that analyses
|
|
||||||
// that only depend on the CFG are preserved by this pass.
|
|
||||||
//
|
|
||||||
void AnalysisUsage::setPreservesCFG() {
|
|
||||||
// Since this transformation doesn't modify the CFG, it preserves all analyses
|
|
||||||
// that only depend on the CFG (like dominators, loop info, etc...)
|
|
||||||
//
|
|
||||||
Preserved.insert(Preserved.end(),
|
|
||||||
getCFGOnlyAnalyses().begin(), getCFGOnlyAnalyses().end());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// PassManager implementation - The PassManager class is a simple Pimpl class
|
// PassManager implementation - The PassManager class is a simple Pimpl class
|
||||||
// that wraps the PassManagerT template.
|
// that wraps the PassManagerT template.
|
||||||
@ -500,3 +463,29 @@ void PassRegistrationListener::enumeratePasses() {
|
|||||||
passEnumerate(I->second);
|
passEnumerate(I->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// AnalysisUsage Class Implementation
|
||||||
|
//
|
||||||
|
|
||||||
|
// setPreservesCFG - This function should be called to by the pass, iff they do
|
||||||
|
// not:
|
||||||
|
//
|
||||||
|
// 1. Add or remove basic blocks from the function
|
||||||
|
// 2. Modify terminator instructions in any way.
|
||||||
|
//
|
||||||
|
// This function annotates the AnalysisUsage info object to say that analyses
|
||||||
|
// that only depend on the CFG are preserved by this pass.
|
||||||
|
//
|
||||||
|
void AnalysisUsage::setPreservesCFG() {
|
||||||
|
// Since this transformation doesn't modify the CFG, it preserves all analyses
|
||||||
|
// that only depend on the CFG (like dominators, loop info, etc...)
|
||||||
|
//
|
||||||
|
if (PassInfoMap) {
|
||||||
|
for (std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->begin(),
|
||||||
|
E = PassInfoMap->end(); I != E; ++I)
|
||||||
|
if (I->second->isCFGOnlyPass())
|
||||||
|
Preserved.push_back(I->second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user