diff options
Diffstat (limited to 'include/llvm/PassSupport.h')
-rw-r--r-- | include/llvm/PassSupport.h | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h index 082790956c..ad6ab754b8 100644 --- a/include/llvm/PassSupport.h +++ b/include/llvm/PassSupport.h @@ -29,6 +29,8 @@ namespace llvm { + class PassManagerBase; + //===--------------------------------------------------------------------------- /// 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 @@ -207,6 +209,149 @@ struct RegisterPass : public PassInfo { } }; + /// Unique identifiers for the default standard passes. The addresses of + /// these symbols are used to uniquely identify passes from the default list. + namespace DefaultStandardPasses { + extern unsigned char AggressiveDCEID; + extern unsigned char ArgumentPromotionID; + extern unsigned char BasicAliasAnalysisID; + extern unsigned char CFGSimplificationID; + extern unsigned char ConstantMergeID; + extern unsigned char CorrelatedValuePropagationID; + extern unsigned char DeadArgEliminationID; + extern unsigned char DeadStoreEliminationID; + extern unsigned char DeadTypeEliminationID; + extern unsigned char EarlyCSEID; + extern unsigned char FunctionAttrsID; + extern unsigned char FunctionInliningID; + extern unsigned char GVNID; + extern unsigned char GlobalDCEID; + extern unsigned char GlobalOptimizerID; + extern unsigned char GlobalsModRefID; + extern unsigned char IPSCCPID; + extern unsigned char IndVarSimplifyID; + extern unsigned char InlinerPlaceholderID; + extern unsigned char InstructionCombiningID; + extern unsigned char JumpThreadingID; + extern unsigned char LICMID; + extern unsigned char LoopDeletionID; + extern unsigned char LoopIdiomID; + extern unsigned char LoopRotateID; + extern unsigned char LoopUnrollID; + extern unsigned char LoopUnswitchID; + extern unsigned char MemCpyOptID; + extern unsigned char PruneEHID; + extern unsigned char ReassociateID; + extern unsigned char SCCPID; + extern unsigned char ScalarReplAggregatesID; + extern unsigned char SimplifyLibCallsID; + extern unsigned char StripDeadPrototypesID; + extern unsigned char TailCallEliminationID; + extern unsigned char TypeBasedAliasAnalysisID; + } + + +class RegisterStandardPass; +/// RegisterStandardPass - Registers a pass as a member of a standard set. +class StandardPass { + friend class RegisterStandardPassLists; + public: + /// Predefined standard sets of passes + enum StandardSet { + AliasAnalysis, + Function, + Module, + LTO + }; + /// Flags to specify whether a pass should be enabled. Passes registered + /// with the standard sets may specify a minimum optimization level and one + /// or more flags that must be set when constructing the set for the pass to + /// be used. + enum OptimizationFlags { + /// Optimize for size was requested. + OptimizeSize = 1<<0, + /// Allow passes which may make global module changes. + UnitAtATime = 1<<1, + /// UnrollLoops - Allow loop unrolling. + UnrollLoops = 1<<2, + /// Allow library calls to be simplified. + SimplifyLibCalls = 1<<3, + /// Whether the module may have code using exceptions. + HaveExceptions = 1<<4, + // Run an inliner pass as part of this set. + RunInliner = 1<<5 + }; + enum OptimizationFlagComponents { + /// The low bits are used to store the optimization level. When requesting + /// passes, this should store the requested optimisation level. When + /// setting passes, this should set the minimum optimization level at which + /// the pass will run. + OptimizationLevelMask = 0xf, + /// The maximum optimisation level at which the pass is run. + MaxOptimizationLevelMask = 0xf0, + // Flags that must be set + RequiredFlagMask = 0xff00, + // Flags that may not be set. + DisallowedFlagMask = 0xff0000, + MaxOptimizationLevelShift = 4, + RequiredFlagShift = 8, + DisallowedFlagShift = 16 + }; + /// Returns the optimisation level from a set of flags. + static unsigned OptimizationLevel(unsigned flags) { + return flags & OptimizationLevelMask; + } + /// Returns the maximum optimization level for this set of flags + static unsigned MaxOptimizationLevel(unsigned flags) { + return (flags & MaxOptimizationLevelMask) >> 4; + } + /// Constructs a set of flags from the specified minimum and maximum + /// optimisation level + static unsigned OptimizationFlags(unsigned minLevel=0, unsigned maxLevel=0xf, + unsigned requiredFlags=0, + unsigned disallowedFlags=0) { + return ((minLevel & OptimizationLevelMask) | + ((maxLevel<<MaxOptimizationLevelShift) & MaxOptimizationLevelMask) + | ((requiredFlags<<RequiredFlagShift) & RequiredFlagMask) + | ((disallowedFlags<<DisallowedFlagShift) & DisallowedFlagMask)); + } + /// Returns the flags that must be set for this to match + static unsigned RequiredFlags(unsigned flags) { + return (flags & RequiredFlagMask) >> RequiredFlagShift; + } + /// Returns the flags that must not be set for this to match + static unsigned DisallowedFlags(unsigned flags) { + return (flags & DisallowedFlagMask) >> RequiredFlagShift; + } + /// Register a standard pass in the specified set. If flags is non-zero, + /// then the pass will only be returned when the specified flags are set. + template<typename passName> + class RegisterStandardPass { + RegisterStandardPass(StandardSet set, unsigned char *runBefore=0, + unsigned flags=0, unsigned char *ID=0) { + // Use the pass's ID if one is not specified + RegisterDefaultPass(PassInfo::NormalCtor_t(callDefaultCtor<passName>), + ID ? ID : &passName::ID, runBefore, set, flags); + }; + }; + /// Adds the passes from the specified set to a pass manager. + static void AddPassesFromSet(PassManagerBase *PM, + StandardSet Set, + unsigned Flags=0, + bool VerifyEach=false, + Pass *Inliner=0); + private: + /// Registers the default passes. This is set by RegisterStandardPassLists + /// and is called lazily. + static void (*RegisterDefaultPasses)(void); + /// Registers the pass + static void RegisterDefaultPass(PassInfo::NormalCtor_t constructor, + unsigned char *newPass, + unsigned char *oldPass, + StandardSet set, + unsigned flags=0); +}; + /// RegisterAnalysisGroup - Register a Pass as a member of an analysis _group_. /// Analysis groups are used to define an interface (which need not derive from |