X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FPassSupport.h;h=81b3ce153c9104db1dc6eac3ba1470a9e5481026;hb=645016533d1208d2e7a17d917d64b8b63c4f9939;hp=ad6ab754b8a1febb08e810720bdb5eecef6d2462;hpb=0fa92e55c3b9a7c7cadd9dde0193fbbecdde977c;p=oota-llvm.git diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h index ad6ab754b8a..81b3ce153c9 100644 --- a/include/llvm/PassSupport.h +++ b/include/llvm/PassSupport.h @@ -22,15 +22,14 @@ #define LLVM_PASS_SUPPORT_H #include "Pass.h" -#include "llvm/PassRegistry.h" #include "llvm/InitializePasses.h" +#include "llvm/PassRegistry.h" #include "llvm/Support/Atomic.h" +#include "llvm/Support/Valgrind.h" #include 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 @@ -127,8 +126,8 @@ public: } private: - void operator=(const PassInfo &); // do not implement - PassInfo(const PassInfo &); // do not implement + void operator=(const PassInfo &) LLVM_DELETED_FUNCTION; + PassInfo(const PassInfo &) LLVM_DELETED_FUNCTION; }; #define CALL_ONCE_INITIALIZATION(function) \ @@ -137,7 +136,10 @@ private: if (old_val == 0) { \ function(Registry); \ sys::MemoryFence(); \ + TsanIgnoreWritesBegin(); \ + TsanHappensBefore(&initialized); \ initialized = 2; \ + TsanIgnoreWritesEnd(); \ } else { \ sys::cas_flag tmp = initialized; \ sys::MemoryFence(); \ @@ -145,7 +147,8 @@ private: tmp = initialized; \ sys::MemoryFence(); \ } \ - } + } \ + TsanHappensAfter(&initialized); #define INITIALIZE_PASS(passName, arg, name, cfg, analysis) \ static void* initialize##passName##PassOnce(PassRegistry &Registry) { \ @@ -209,149 +212,6 @@ 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<> 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 - 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), - 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