File indexing completed on 2026-05-10 08:44:46
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #if !defined(LLVM_PASS_H) || defined(LLVM_PASSSUPPORT_H)
0021 #error "Do not include <PassSupport.h>; include <Pass.h> instead"
0022 #endif
0023
0024 #ifndef LLVM_PASSSUPPORT_H
0025 #define LLVM_PASSSUPPORT_H
0026
0027 #include "llvm/ADT/StringRef.h"
0028 #include "llvm/PassInfo.h"
0029 #include "llvm/PassRegistry.h"
0030 #include "llvm/Support/Error.h"
0031 #include "llvm/Support/Threading.h"
0032 #include <functional>
0033
0034 namespace llvm {
0035
0036 class Pass;
0037
0038 #define INITIALIZE_PASS(passName, arg, name, cfg, analysis) \
0039 static void *initialize##passName##PassOnce(PassRegistry &Registry) { \
0040 PassInfo *PI = new PassInfo( \
0041 name, arg, &passName::ID, \
0042 PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
0043 Registry.registerPass(*PI, true); \
0044 return PI; \
0045 } \
0046 static llvm::once_flag Initialize##passName##PassFlag; \
0047 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
0048 llvm::call_once(Initialize##passName##PassFlag, \
0049 initialize##passName##PassOnce, std::ref(Registry)); \
0050 }
0051
0052 #define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis) \
0053 static void *initialize##passName##PassOnce(PassRegistry &Registry) {
0054
0055 #define INITIALIZE_PASS_DEPENDENCY(depName) initialize##depName##Pass(Registry);
0056
0057 #define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis) \
0058 PassInfo *PI = new PassInfo( \
0059 name, arg, &passName::ID, \
0060 PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
0061 Registry.registerPass(*PI, true); \
0062 return PI; \
0063 } \
0064 static llvm::once_flag Initialize##passName##PassFlag; \
0065 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
0066 llvm::call_once(Initialize##passName##PassFlag, \
0067 initialize##passName##PassOnce, std::ref(Registry)); \
0068 }
0069
0070 #define INITIALIZE_PASS_WITH_OPTIONS(PassName, Arg, Name, Cfg, Analysis) \
0071 INITIALIZE_PASS_BEGIN(PassName, Arg, Name, Cfg, Analysis) \
0072 PassName::registerOptions(); \
0073 INITIALIZE_PASS_END(PassName, Arg, Name, Cfg, Analysis)
0074
0075 #define INITIALIZE_PASS_WITH_OPTIONS_BEGIN(PassName, Arg, Name, Cfg, Analysis) \
0076 INITIALIZE_PASS_BEGIN(PassName, Arg, Name, Cfg, Analysis) \
0077 PassName::registerOptions();
0078
0079 template <
0080 class PassName,
0081 std::enable_if_t<std::is_default_constructible<PassName>{}, bool> = true>
0082 Pass *callDefaultCtor() {
0083 return new PassName();
0084 }
0085
0086 template <
0087 class PassName,
0088 std::enable_if_t<!std::is_default_constructible<PassName>{}, bool> = true>
0089 Pass *callDefaultCtor() {
0090
0091
0092 report_fatal_error("target-specific codegen-only pass");
0093 }
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 template <typename passName> struct RegisterPass : public PassInfo {
0108
0109 RegisterPass(StringRef PassArg, StringRef Name, bool CFGOnly = false,
0110 bool is_analysis = false)
0111 : PassInfo(Name, PassArg, &passName::ID,
0112 PassInfo::NormalCtor_t(callDefaultCtor<passName>), CFGOnly,
0113 is_analysis) {
0114 PassRegistry::getPassRegistry()->registerPass(*this);
0115 }
0116 };
0117
0118
0119
0120
0121
0122
0123
0124 struct PassRegistrationListener {
0125 PassRegistrationListener() = default;
0126 virtual ~PassRegistrationListener() = default;
0127
0128
0129
0130 virtual void passRegistered(const PassInfo *) {}
0131
0132
0133
0134 void enumeratePasses();
0135
0136
0137
0138 virtual void passEnumerate(const PassInfo *) {}
0139 };
0140
0141 }
0142
0143 #endif