//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_PASS_SUPPORT_H
-#define LLVM_PASS_SUPPORT_H
+#ifndef LLVM_PASSSUPPORT_H
+#define LLVM_PASSSUPPORT_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 <vector>
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
}
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) \
if (old_val == 0) { \
function(Registry); \
sys::MemoryFence(); \
+ TsanIgnoreWritesBegin(); \
+ TsanHappensBefore(&initialized); \
initialized = 2; \
+ TsanIgnoreWritesEnd(); \
} else { \
sys::cas_flag tmp = initialized; \
sys::MemoryFence(); \
tmp = initialized; \
sys::MemoryFence(); \
} \
- }
+ } \
+ TsanHappensAfter(&initialized);
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis) \
static void* initialize##passName##PassOnce(PassRegistry &Registry) { \
}
};
- /// 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
/// clients that are interested in which passes get registered and unregistered
/// at runtime (which can be because of the RegisterPass constructors being run
/// as the program starts up, or may be because a shared object just got
-/// loaded). Deriving from the PassRegistationListener class automatically
+/// loaded). Deriving from the PassRegistrationListener class automatically
/// registers your object to receive callbacks indicating when passes are loaded
/// and removed.
///