mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
[opt][PassInfo] Allow opt to run passes that need target machine.
When registering a pass, a pass can now specify a second construct that takes as argument a pointer to TargetMachine. The PassInfo class has been updated to reflect that possibility. If such a constructor exists opt will use it instead of the default constructor when instantiating the pass. Since such IR passes are supposed to be rare, no specific support has been added to this commit to allow an easy registration of such a pass. In other words, for such pass, the initialization function has to be hand-written (see CodeGenPrepare for instance). Now, codegenprepare can be tested using opt: opt -codegenprepare -mtriple=mytriple input.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199430 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
class TargetMachine;
|
||||||
//===---------------------------------------------------------------------------
|
//===---------------------------------------------------------------------------
|
||||||
/// PassInfo class - An instance of this class exists for every pass known by
|
/// PassInfo class - An instance of this class exists for every pass known by
|
||||||
/// the system, and can be obtained from a live Pass by calling its
|
/// the system, and can be obtained from a live Pass by calling its
|
||||||
@@ -39,6 +40,7 @@ namespace llvm {
|
|||||||
class PassInfo {
|
class PassInfo {
|
||||||
public:
|
public:
|
||||||
typedef Pass* (*NormalCtor_t)();
|
typedef Pass* (*NormalCtor_t)();
|
||||||
|
typedef Pass *(*TargetMachineCtor_t)(TargetMachine *);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char *const PassName; // Nice name for Pass
|
const char *const PassName; // Nice name for Pass
|
||||||
@@ -50,22 +52,26 @@ private:
|
|||||||
std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
|
std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
|
||||||
|
|
||||||
NormalCtor_t NormalCtor;
|
NormalCtor_t NormalCtor;
|
||||||
|
TargetMachineCtor_t TargetMachineCtor;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// PassInfo ctor - Do not call this directly, this should only be invoked
|
/// PassInfo ctor - Do not call this directly, this should only be invoked
|
||||||
/// through RegisterPass.
|
/// through RegisterPass.
|
||||||
PassInfo(const char *name, const char *arg, const void *pi,
|
PassInfo(const char *name, const char *arg, const void *pi,
|
||||||
NormalCtor_t normal, bool isCFGOnly, bool is_analysis)
|
NormalCtor_t normal, bool isCFGOnly, bool is_analysis,
|
||||||
|
TargetMachineCtor_t machine = NULL)
|
||||||
: PassName(name), PassArgument(arg), PassID(pi),
|
: PassName(name), PassArgument(arg), PassID(pi),
|
||||||
IsCFGOnlyPass(isCFGOnly),
|
IsCFGOnlyPass(isCFGOnly),
|
||||||
IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal) { }
|
IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal),
|
||||||
|
TargetMachineCtor(machine) {}
|
||||||
/// PassInfo ctor - Do not call this directly, this should only be invoked
|
/// PassInfo ctor - Do not call this directly, this should only be invoked
|
||||||
/// through RegisterPass. This version is for use by analysis groups; it
|
/// through RegisterPass. This version is for use by analysis groups; it
|
||||||
/// does not auto-register the pass.
|
/// does not auto-register the pass.
|
||||||
PassInfo(const char *name, const void *pi)
|
PassInfo(const char *name, const void *pi)
|
||||||
: PassName(name), PassArgument(""), PassID(pi),
|
: PassName(name), PassArgument(""), PassID(pi),
|
||||||
IsCFGOnlyPass(false),
|
IsCFGOnlyPass(false),
|
||||||
IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(0) { }
|
IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(0),
|
||||||
|
TargetMachineCtor(0) {}
|
||||||
|
|
||||||
/// getPassName - Return the friendly name for the pass, never returns null
|
/// getPassName - Return the friendly name for the pass, never returns null
|
||||||
///
|
///
|
||||||
@@ -107,6 +113,16 @@ public:
|
|||||||
NormalCtor = Ctor;
|
NormalCtor = Ctor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getTargetMachineCtor - Return a pointer to a function, that when called
|
||||||
|
/// with a TargetMachine, creates an instance of the pass and returns it.
|
||||||
|
/// This pointer may be null if there is no constructor with a TargetMachine
|
||||||
|
/// for the pass.
|
||||||
|
///
|
||||||
|
TargetMachineCtor_t getTargetMachineCtor() const { return TargetMachineCtor; }
|
||||||
|
void setTargetMachineCtor(TargetMachineCtor_t Ctor) {
|
||||||
|
TargetMachineCtor = Ctor;
|
||||||
|
}
|
||||||
|
|
||||||
/// createPass() - Use this method to create an instance of this pass.
|
/// createPass() - Use this method to create an instance of this pass.
|
||||||
Pass *createPass() const;
|
Pass *createPass() const;
|
||||||
|
|
||||||
@@ -182,6 +198,10 @@ private:
|
|||||||
template<typename PassName>
|
template<typename PassName>
|
||||||
Pass *callDefaultCtor() { return new PassName(); }
|
Pass *callDefaultCtor() { return new PassName(); }
|
||||||
|
|
||||||
|
template <typename PassName> Pass *callTargetMachineCtor(TargetMachine *TM) {
|
||||||
|
return new PassName(TM);
|
||||||
|
}
|
||||||
|
|
||||||
//===---------------------------------------------------------------------------
|
//===---------------------------------------------------------------------------
|
||||||
/// RegisterPass<t> template - This template class is used to notify the system
|
/// RegisterPass<t> template - This template class is used to notify the system
|
||||||
/// that a Pass is available for use, and registers it into the internal
|
/// that a Pass is available for use, and registers it into the internal
|
||||||
|
@@ -179,6 +179,8 @@ void PassRegistry::registerAnalysisGroup(const void *InterfaceID,
|
|||||||
assert(ImplementationInfo->getNormalCtor() &&
|
assert(ImplementationInfo->getNormalCtor() &&
|
||||||
"Cannot specify pass as default if it does not have a default ctor");
|
"Cannot specify pass as default if it does not have a default ctor");
|
||||||
InterfaceInfo->setNormalCtor(ImplementationInfo->getNormalCtor());
|
InterfaceInfo->setNormalCtor(ImplementationInfo->getNormalCtor());
|
||||||
|
InterfaceInfo->setTargetMachineCtor(
|
||||||
|
ImplementationInfo->getTargetMachineCtor());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -129,11 +129,19 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
char CodeGenPrepare::ID = 0;
|
char CodeGenPrepare::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(CodeGenPrepare, "codegenprepare",
|
static void *initializeCodeGenPreparePassOnce(PassRegistry &Registry) {
|
||||||
"Optimize for code generation", false, false)
|
initializeTargetLibraryInfoPass(Registry);
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
PassInfo *PI = new PassInfo(
|
||||||
INITIALIZE_PASS_END(CodeGenPrepare, "codegenprepare",
|
"Optimize for code generation", "codegenprepare", &CodeGenPrepare::ID,
|
||||||
"Optimize for code generation", false, false)
|
PassInfo::NormalCtor_t(callDefaultCtor<CodeGenPrepare>), false, false,
|
||||||
|
PassInfo::TargetMachineCtor_t(callTargetMachineCtor<CodeGenPrepare>));
|
||||||
|
Registry.registerPass(*PI, true);
|
||||||
|
return PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
void llvm::initializeCodeGenPreparePass(PassRegistry &Registry) {
|
||||||
|
CALL_ONCE_INITIALIZATION(initializeCodeGenPreparePassOnce)
|
||||||
|
}
|
||||||
|
|
||||||
FunctionPass *llvm::createCodeGenPreparePass(const TargetMachine *TM) {
|
FunctionPass *llvm::createCodeGenPreparePass(const TargetMachine *TM) {
|
||||||
return new CodeGenPrepare(TM);
|
return new CodeGenPrepare(TM);
|
||||||
|
@@ -795,7 +795,9 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
const PassInfo *PassInf = PassList[i];
|
const PassInfo *PassInf = PassList[i];
|
||||||
Pass *P = 0;
|
Pass *P = 0;
|
||||||
if (PassInf->getNormalCtor())
|
if (PassInf->getTargetMachineCtor())
|
||||||
|
P = PassInf->getTargetMachineCtor()(TM.get());
|
||||||
|
else if (PassInf->getNormalCtor())
|
||||||
P = PassInf->getNormalCtor()();
|
P = PassInf->getNormalCtor()();
|
||||||
else
|
else
|
||||||
errs() << argv[0] << ": cannot create pass: "
|
errs() << argv[0] << ": cannot create pass: "
|
||||||
|
Reference in New Issue
Block a user