X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FPassSupport.h;h=8206e5f28e6a11ec524af3db9c15295704aa94df;hb=21d03f2de0087d60dbf575d95924404a97852879;hp=f20e40743f36b5f7b2a7c6b975e01e8d41dd5705;hpb=43714d11ea98b637967472640bf13532de076e48;p=oota-llvm.git diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h index f20e40743f3..8206e5f28e6 100644 --- a/include/llvm/PassSupport.h +++ b/include/llvm/PassSupport.h @@ -1,10 +1,10 @@ //===- llvm/PassSupport.h - Pass Support code -------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines stuff that is used to define and "use" Passes. This file @@ -50,12 +50,12 @@ public: /// AnalysisGroup flag with others. /// enum { - Analysis = 1, Optimization = 2, LLC = 4, AnalysisGroup = 8 + Analysis = 1, Optimization = 2, AnalysisGroup = 4 }; /// PassInfo ctor - Do not call this directly, this should only be invoked /// 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, unsigned char pt, Pass *(*normal)() = 0, Pass *(*targetctor)(TargetMachine &) = 0) : PassName(name), PassArgument(arg), TypeInfo(ti), PassType(pt), @@ -86,7 +86,7 @@ public: /// 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 /// is no default constructor for the pass. - /// + /// Pass *(*getNormalCtor() const)() { return NormalCtor; } @@ -135,7 +135,7 @@ public: /// for example will not be able to see the pass and attempts to create the pass /// will fail. This template is used in the follow manner (at global scope, in /// your .cpp file): -/// +/// /// static RegisterPass tmp("passopt", "My Pass Name"); /// /// This statement will cause your pass to be created by calling the default @@ -145,21 +145,35 @@ public: /// /// Pass *createMyPass(foo &opt) { return new MyPass(opt); } /// static RegisterPass tmp("passopt", "My Name", createMyPass); -/// +/// struct RegisterPassBase { /// getPassInfo - Get the pass info for the registered class... /// - const PassInfo *getPassInfo() const { return PIObj; } + const PassInfo *getPassInfo() const { return &PIObj; } - RegisterPassBase() : PIObj(0) {} - ~RegisterPassBase() { // Intentionally non-virtual... - if (PIObj) unregisterPass(PIObj); + RegisterPassBase(const char *Name, const char *Arg, const std::type_info &TI, + unsigned char PT, Pass *(*Normal)() = 0, + Pass *(*TargetCtor)(TargetMachine &) = 0) + : PIObj(Name, Arg, TI, PT, Normal, TargetCtor) { + registerPass(); + } + RegisterPassBase(const std::type_info &TI, unsigned char PT) + : PIObj("", "", TI, PT, 0, 0) { + // This ctor may only be used for analysis groups: it does not auto-register + // the pass. + assert(PT == PassInfo::AnalysisGroup && "Not an AnalysisGroup!"); + } + + ~RegisterPassBase() { // Intentionally non-virtual. + // Analysis groups are registered/unregistered by their dtor. + if (PIObj.getPassType() != PassInfo::AnalysisGroup) + unregisterPass(); } protected: - PassInfo *PIObj; // The PassInfo object for this pass - void registerPass(PassInfo *); - void unregisterPass(PassInfo *); + PassInfo PIObj; // The PassInfo object for this pass + void registerPass(); + void unregisterPass(); /// setOnlyUsesCFG - Notice that this pass only depends on the CFG, so /// transformations that do not modify the CFG do not invalidate this pass. @@ -172,32 +186,28 @@ Pass *callDefaultCtor() { return new PassName(); } template struct RegisterPass : public RegisterPassBase { - + // Register Pass using default constructor... - RegisterPass(const char *PassArg, const char *Name, unsigned char PassTy = 0){ - registerPass(new PassInfo(Name, PassArg, typeid(PassName), PassTy, - callDefaultCtor)); - } + RegisterPass(const char *PassArg, const char *Name, unsigned char PassTy = 0) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassTy, + callDefaultCtor) {} // Register Pass using default constructor explicitly... RegisterPass(const char *PassArg, const char *Name, unsigned char PassTy, - Pass *(*ctor)()) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), PassTy, ctor)); - } + Pass *(*ctor)()) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassTy, ctor) {} // Register Pass using TargetMachine constructor... RegisterPass(const char *PassArg, const char *Name, unsigned char PassTy, - Pass *(*targetctor)(TargetMachine &)) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), PassTy, - 0, targetctor)); - } + Pass *(*targetctor)(TargetMachine &)) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassTy, + 0, targetctor) {} // Generic constructor version that has an unknown ctor type... template RegisterPass(const char *PassArg, const char *Name, unsigned char PassTy, - CtorType *Fn) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), PassTy, 0)); - } + CtorType *Fn) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassTy, 0) {} }; /// RegisterOpt - Register something that is to show up in Opt, this is just a @@ -205,38 +215,36 @@ struct RegisterPass : public RegisterPassBase { /// template struct RegisterOpt : public RegisterPassBase { - RegisterOpt(const char *PassArg, const char *Name, bool CFGOnly = false) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::Optimization, - callDefaultCtor)); + RegisterOpt(const char *PassArg, const char *Name, bool CFGOnly = false) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassInfo::Optimization, + callDefaultCtor) { if (CFGOnly) setOnlyUsesCFG(); } /// Register Pass using default constructor explicitly... /// RegisterOpt(const char *PassArg, const char *Name, Pass *(*ctor)(), - bool CFGOnly = false) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::Optimization, ctor)); + bool CFGOnly = false) + : RegisterPassBase(Name, PassArg, typeid(PassName), + PassInfo::Optimization, ctor) { if (CFGOnly) setOnlyUsesCFG(); } /// Register FunctionPass using default constructor explicitly... /// RegisterOpt(const char *PassArg, const char *Name, FunctionPass *(*ctor)(), - bool CFGOnly = false) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::Optimization, - static_cast(ctor))); + bool CFGOnly = false) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassInfo::Optimization, + static_cast(ctor)) { if (CFGOnly) setOnlyUsesCFG(); } /// Register Pass using TargetMachine constructor... /// RegisterOpt(const char *PassArg, const char *Name, - Pass *(*targetctor)(TargetMachine &), bool CFGOnly = false) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::Optimization, 0, targetctor)); + Pass *(*targetctor)(TargetMachine &), bool CFGOnly = false) + : RegisterPassBase(Name, PassArg, typeid(PassName), + PassInfo::Optimization, 0, targetctor) { if (CFGOnly) setOnlyUsesCFG(); } @@ -244,10 +252,9 @@ struct RegisterOpt : public RegisterPassBase { /// RegisterOpt(const char *PassArg, const char *Name, FunctionPass *(*targetctor)(TargetMachine &), - bool CFGOnly = false) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::Optimization, 0, - static_cast(targetctor))); + bool CFGOnly = false) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassInfo::Optimization, 0, + static_cast(targetctor)) { if (CFGOnly) setOnlyUsesCFG(); } }; @@ -261,41 +268,13 @@ struct RegisterOpt : public RegisterPassBase { template struct RegisterAnalysis : public RegisterPassBase { RegisterAnalysis(const char *PassArg, const char *Name, - bool CFGOnly = false) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::Analysis, - callDefaultCtor)); + bool CFGOnly = false) + : RegisterPassBase(Name, PassArg, typeid(PassName), PassInfo::Analysis, + callDefaultCtor) { if (CFGOnly) setOnlyUsesCFG(); } }; -/// RegisterLLC - Register something that is to show up in LLC, this is just a -/// shortcut for specifying RegisterPass... -/// -template -struct RegisterLLC : public RegisterPassBase { - RegisterLLC(const char *PassArg, const char *Name) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::LLC, - callDefaultCtor)); - } - - /// Register Pass using default constructor explicitly... - /// - RegisterLLC(const char *PassArg, const char *Name, Pass *(*ctor)()) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::LLC, ctor)); - } - - /// Register Pass using TargetMachine constructor... - /// - RegisterLLC(const char *PassArg, const char *Name, - Pass *(*datactor)(TargetMachine &)) { - registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::LLC)); - } -}; - /// RegisterAnalysisGroup - Register a Pass as a member of an analysis _group_. /// Analysis groups are used to define an interface (which need not derive from