aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Passes/PassBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Passes/PassBuilder.cpp')
-rw-r--r--llvm/lib/Passes/PassBuilder.cpp81
1 files changed, 78 insertions, 3 deletions
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 048c58d..3c9a27a 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -669,7 +669,14 @@ void PassBuilder::registerFunctionAnalyses(FunctionAnalysisManager &FAM) {
FAM.registerPass([&] { return buildDefaultAAPipeline(); });
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
- FAM.registerPass([&] { return CREATE_PASS; });
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CREATE_PASS)>, \
+ const TargetMachine &>) { \
+ if (TM) \
+ FAM.registerPass([&] { return CREATE_PASS; }); \
+ } else { \
+ FAM.registerPass([&] { return CREATE_PASS; }); \
+ }
#include "PassRegistry.def"
for (auto &C : FunctionAnalysisRegistrationCallbacks)
@@ -2038,6 +2045,14 @@ Error PassBuilder::parseModulePass(ModulePassManager &MPM,
}
#define FUNCTION_PASS(NAME, CREATE_PASS) \
if (Name == NAME) { \
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CREATE_PASS)>, \
+ const TargetMachine &>) { \
+ if (!TM) \
+ return make_error<StringError>( \
+ formatv("pass '{0}' requires TargetMachine", Name).str(), \
+ inconvertibleErrorCode()); \
+ } \
MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
return Error::success(); \
}
@@ -2046,6 +2061,18 @@ Error PassBuilder::parseModulePass(ModulePassManager &MPM,
auto Params = parsePassParameters(PARSER, Name, NAME); \
if (!Params) \
return Params.takeError(); \
+ auto CreatePass = CREATE_PASS; \
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CreatePass( \
+ Params.get()))>, \
+ const TargetMachine &, \
+ std::remove_reference_t<decltype(Params.get())>>) { \
+ if (!TM) { \
+ return make_error<StringError>( \
+ formatv("pass '{0}' requires TargetMachine", Name).str(), \
+ inconvertibleErrorCode()); \
+ } \
+ } \
MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
return Error::success(); \
}
@@ -2152,6 +2179,14 @@ Error PassBuilder::parseCGSCCPass(CGSCCPassManager &CGPM,
}
#define FUNCTION_PASS(NAME, CREATE_PASS) \
if (Name == NAME) { \
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CREATE_PASS)>, \
+ const TargetMachine &>) { \
+ if (!TM) \
+ return make_error<StringError>( \
+ formatv("pass '{0}' requires TargetMachine", Name).str(), \
+ inconvertibleErrorCode()); \
+ } \
CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
return Error::success(); \
}
@@ -2160,6 +2195,18 @@ Error PassBuilder::parseCGSCCPass(CGSCCPassManager &CGPM,
auto Params = parsePassParameters(PARSER, Name, NAME); \
if (!Params) \
return Params.takeError(); \
+ auto CreatePass = CREATE_PASS; \
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CreatePass( \
+ Params.get()))>, \
+ const TargetMachine &, \
+ std::remove_reference_t<decltype(Params.get())>>) { \
+ if (!TM) { \
+ return make_error<StringError>( \
+ formatv("pass '{0}' requires TargetMachine", Name).str(), \
+ inconvertibleErrorCode()); \
+ } \
+ } \
CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
return Error::success(); \
}
@@ -2239,6 +2286,14 @@ Error PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
// Now expand the basic registered passes from the .inc file.
#define FUNCTION_PASS(NAME, CREATE_PASS) \
if (Name == NAME) { \
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CREATE_PASS)>, \
+ const TargetMachine &>) { \
+ if (!TM) \
+ return make_error<StringError>( \
+ formatv("pass '{0}' requires TargetMachine", Name).str(), \
+ inconvertibleErrorCode()); \
+ } \
FPM.addPass(CREATE_PASS); \
return Error::success(); \
}
@@ -2247,14 +2302,34 @@ Error PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
auto Params = parsePassParameters(PARSER, Name, NAME); \
if (!Params) \
return Params.takeError(); \
+ auto CreatePass = CREATE_PASS; \
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CreatePass( \
+ Params.get()))>, \
+ const TargetMachine &, \
+ std::remove_reference_t<decltype(Params.get())>>) { \
+ if (!TM) { \
+ return make_error<StringError>( \
+ formatv("pass '{0}' requires TargetMachine", Name).str(), \
+ inconvertibleErrorCode()); \
+ } \
+ } \
FPM.addPass(CREATE_PASS(Params.get())); \
return Error::success(); \
}
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
if (Name == "require<" NAME ">") { \
+ if constexpr (std::is_constructible_v< \
+ std::remove_reference_t<decltype(CREATE_PASS)>, \
+ const TargetMachine &>) { \
+ if (!TM) \
+ return make_error<StringError>( \
+ formatv("pass '{0}' requires TargetMachine", Name).str(), \
+ inconvertibleErrorCode()); \
+ } \
FPM.addPass( \
- RequireAnalysisPass< \
- std::remove_reference_t<decltype(CREATE_PASS)>, Function>()); \
+ RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
+ Function>()); \
return Error::success(); \
} \
if (Name == "invalidate<" NAME ">") { \