[llvm] [PassBuilder] Add callback invoking to PassBuilder string API (PR #157153)
Gabriel Baraldi via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 18 06:26:26 PDT 2025
================
@@ -528,6 +549,101 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
#include "llvm/Passes/MachinePassRegistry.def"
});
}
+
+ // Module-level callbacks without LTO phase
+ registerPipelineParsingCallback(
+ [this](StringRef Name, ModulePassManager &PM,
+ ArrayRef<PassBuilder::PipelineElement>) {
+#define MODULE_CALLBACK(NAME, INVOKE) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
+ auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+ if (!L) { \
+ errs() << NAME ": " << toString(L.takeError()) << '\n'; \
+ return false; \
+ } \
+ INVOKE(PM, L.get()); \
+ return true; \
+ }
+#include "PassRegistry.def"
+#undef MODULE_CALLBACK
+ return false;
+ });
+
+ // Module-level callbacks with LTO phase (use Phase::None for string API)
+ registerPipelineParsingCallback(
+ [this](StringRef Name, ModulePassManager &PM,
+ ArrayRef<PassBuilder::PipelineElement>) {
+#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
+ auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+ if (!L) { \
+ errs() << NAME ": " << toString(L.takeError()) << '\n'; \
+ return false; \
+ } \
+ INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
+ return true; \
+ }
+#include "PassRegistry.def"
+#undef MODULE_LTO_CALLBACK
+ return false;
+ });
+
+ // Function-level callbacks
+ registerPipelineParsingCallback(
+ [this](StringRef Name, FunctionPassManager &PM,
+ ArrayRef<PassBuilder::PipelineElement>) {
+#define FUNCTION_CALLBACK(NAME, INVOKE) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
+ auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+ if (!L) { \
+ errs() << NAME ": " << toString(L.takeError()) << '\n'; \
+ return false; \
+ } \
+ INVOKE(PM, L.get()); \
+ return true; \
+ }
+#include "PassRegistry.def"
+#undef FUNCTION_CALLBACK
+ return false;
+ });
+
+ // CGSCC-level callbacks
+ registerPipelineParsingCallback(
+ [this](StringRef Name, CGSCCPassManager &PM,
+ ArrayRef<PassBuilder::PipelineElement>) {
+#define CGSCC_CALLBACK(NAME, INVOKE) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
+ auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+ if (!L) { \
+ errs() << NAME ": " << toString(L.takeError()) << '\n'; \
+ return false; \
+ } \
+ INVOKE(PM, L.get()); \
+ return true; \
+ }
+#include "PassRegistry.def"
+#undef CGSCC_CALLBACK
----------------
gbaraldi wrote:
Oh, I hadn't seen that. I usually don't `#define` in one file and `#undef` in the other but following convention is fine
https://github.com/llvm/llvm-project/pull/157153
More information about the llvm-commits
mailing list