[flang-commits] [flang] [llvm] [LLVM] Register static pass plugins in LLVMRunPasses C-API (PR #196754)
via flang-commits
flang-commits at lists.llvm.org
Tue Jun 16 14:46:34 PDT 2026
https://github.com/Vadmeme updated https://github.com/llvm/llvm-project/pull/196754
>From a5744f7ca812493f12c0ef6dde4d1368b09a7fe3 Mon Sep 17 00:00:00 2001
From: Vadmeme <invalid at example.com>
Date: Sat, 9 May 2026 13:31:07 -0700
Subject: [PATCH 1/6] [LLVM] Register static pass plugins in LLVMRunPasses
C-API
LLVMRunPasses and LLVMRunPassesOnFunction create their own PassBuilder,
but did not register statically linked pass plugin callbacks from
Extension.def. This made C API pipelines fail to parse passes provided by
statically linked plugins, even when the same plugins were available to
opt and LTO.
Register the static extension callbacks after constructing the PassBuilder,
matching opt's NewPMDriver behavior.
Add coverage using the Bye plugin when it is linked into tools.
---
llvm/lib/Passes/PassBuilderBindings.cpp | 11 ++++++++++
.../Passes/PassBuilderBindings/CMakeLists.txt | 5 ++++-
.../PassBuilderBindingsTest.cpp | 21 +++++++++++++++++++
.../Passes/PassBuilderBindings/BUILD.gn | 1 +
4 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Passes/PassBuilderBindings.cpp b/llvm/lib/Passes/PassBuilderBindings.cpp
index 933fe89e53a94..2c88433d446cc 100644
--- a/llvm/lib/Passes/PassBuilderBindings.cpp
+++ b/llvm/lib/Passes/PassBuilderBindings.cpp
@@ -17,6 +17,7 @@
#include "llvm/IR/Verifier.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/StandardInstrumentations.h"
+#include "llvm/Plugins/PassPlugin.h"
#include "llvm/Support/CBindingWrapping.h"
using namespace llvm;
@@ -48,6 +49,11 @@ static TargetMachine *unwrap(LLVMTargetMachineRef P) {
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMPassBuilderOptions,
LLVMPassBuilderOptionsRef)
+#define HANDLE_EXTENSION(Ext) \
+ llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
+#include "llvm/Support/Extension.def"
+#undef HANDLE_EXTENSION
+
static LLVMErrorRef runPasses(Module *Mod, Function *Fun, const char *Passes,
TargetMachine *Machine,
LLVMPassBuilderOptions *PassOpts) {
@@ -57,6 +63,11 @@ static LLVMErrorRef runPasses(Module *Mod, Function *Fun, const char *Passes,
PassInstrumentationCallbacks PIC;
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC);
+#define HANDLE_EXTENSION(Ext) \
+ get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
+#include "llvm/Support/Extension.def"
+#undef HANDLE_EXTENSION
+
LoopAnalysisManager LAM;
FunctionAnalysisManager FAM;
CGSCCAnalysisManager CGAM;
diff --git a/llvm/unittests/Passes/PassBuilderBindings/CMakeLists.txt b/llvm/unittests/Passes/PassBuilderBindings/CMakeLists.txt
index e3b2ecee6313a..a839da215f0d8 100644
--- a/llvm/unittests/Passes/PassBuilderBindings/CMakeLists.txt
+++ b/llvm/unittests/Passes/PassBuilderBindings/CMakeLists.txt
@@ -1,5 +1,8 @@
-set(LLVM_LINK_COMPONENTS Support Passes Core Target native AllTargetsInfos)
+set(LLVM_LINK_COMPONENTS Support Passes Core Target native AllTargetsInfos Extensions)
add_llvm_unittest(PassesBindingsTests
PassBuilderBindingsTest.cpp
)
target_link_libraries(PassesBindingsTests PRIVATE LLVMTestingSupport)
+if(LLVM_BYE_LINK_INTO_TOOLS AND TARGET Bye)
+ target_compile_definitions(PassesBindingsTests PRIVATE PASSBUILDER_HAS_BYE_PLUGIN=1)
+endif()
diff --git a/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp b/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
index 4e17b1ad09e2b..3f37d6b0b4f60 100644
--- a/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
+++ b/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
@@ -94,3 +94,24 @@ TEST_F(PassBuilderCTest, Function) {
}
LLVMDisposePassBuilderOptions(Options);
}
+
+#ifdef PASSBUILDER_HAS_BYE_PLUGIN
+TEST_F(PassBuilderCTest, StaticPassExtension) {
+ LLVMPassBuilderOptionsRef Options = LLVMCreatePassBuilderOptions();
+ if (LLVMErrorRef E = LLVMRunPasses(Module, "function(goodbye)", TM,
+ Options)) {
+ char *Msg = LLVMGetErrorMessage(E);
+ LLVMDisposePassBuilderOptions(Options);
+ FAIL() << "Failed to run statically linked extension pass on module: "
+ << Msg;
+ }
+ if (LLVMErrorRef E =
+ LLVMRunPassesOnFunction(Function, "goodbye", TM, Options)) {
+ char *Msg = LLVMGetErrorMessage(E);
+ LLVMDisposePassBuilderOptions(Options);
+ FAIL() << "Failed to run statically linked extension pass on function: "
+ << Msg;
+ }
+ LLVMDisposePassBuilderOptions(Options);
+}
+#endif
diff --git a/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn b/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn
index 1a1a6dfe59a6c..346e5cc9577d1 100644
--- a/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn
@@ -4,6 +4,7 @@ unittest("PassesBindingsTests") {
"//llvm/include/llvm/Config:config",
"//llvm/lib/IR",
"//llvm/lib/Passes",
+ "//llvm/lib/Extensions",
"//llvm/lib/Support",
"//llvm/lib/Target:TargetsToBuild",
"//llvm/lib/Testing/Support",
>From 41ff563e3a2929c0da07b8ef2c67ce46999879d7 Mon Sep 17 00:00:00 2001
From: Vadmeme <invalid at example.com>
Date: Sat, 9 May 2026 16:12:37 -0700
Subject: [PATCH 2/6] fixup! [LLVM] Register static pass plugins in
LLVMRunPasses C-API
---
.../Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp b/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
index 3f37d6b0b4f60..b9b90415097f2 100644
--- a/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
+++ b/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
@@ -98,8 +98,8 @@ TEST_F(PassBuilderCTest, Function) {
#ifdef PASSBUILDER_HAS_BYE_PLUGIN
TEST_F(PassBuilderCTest, StaticPassExtension) {
LLVMPassBuilderOptionsRef Options = LLVMCreatePassBuilderOptions();
- if (LLVMErrorRef E = LLVMRunPasses(Module, "function(goodbye)", TM,
- Options)) {
+ if (LLVMErrorRef E =
+ LLVMRunPasses(Module, "function(goodbye)", TM, Options)) {
char *Msg = LLVMGetErrorMessage(E);
LLVMDisposePassBuilderOptions(Options);
FAIL() << "Failed to run statically linked extension pass on module: "
>From acfda802dc4cf9752566d4ced5d8937be2795c34 Mon Sep 17 00:00:00 2001
From: Vadmeme <invalid at example.com>
Date: Sat, 9 May 2026 16:23:45 -0700
Subject: [PATCH 3/6] fixup! [LLVM] Register static pass plugins in
LLVMRunPasses C-API
---
llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt b/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt
index 3784ca290cb08..f536c6e96114b 100644
--- a/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt
+++ b/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt
@@ -2,6 +2,7 @@ set(LLVM_LINK_COMPONENTS
Analysis
Core
ExecutionEngine
+ Extensions
MC
MCJIT
Passes
>From ff47d9dd71df4575a5e889804a636c2e61fbac62 Mon Sep 17 00:00:00 2001
From: Vadmeme <invalid at example.com>
Date: Wed, 20 May 2026 13:14:52 -0700
Subject: [PATCH 4/6] fixup! [LLVM] Register static pass plugins in
LLVMRunPasses C-API
---
llvm/lib/Passes/CMakeLists.txt | 1 +
llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt | 1 -
.../secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn | 1 -
3 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/lib/Passes/CMakeLists.txt b/llvm/lib/Passes/CMakeLists.txt
index 5d7cd3689f3ff..4db5d0ca71dfc 100644
--- a/llvm/lib/Passes/CMakeLists.txt
+++ b/llvm/lib/Passes/CMakeLists.txt
@@ -21,6 +21,7 @@ add_llvm_component_library(LLVMPasses
GlobalISel
Core
Coroutines
+ Extensions
HipStdPar
IPO
InstCombine
diff --git a/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt b/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt
index f536c6e96114b..3784ca290cb08 100644
--- a/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt
+++ b/llvm/unittests/ExecutionEngine/MCJIT/CMakeLists.txt
@@ -2,7 +2,6 @@ set(LLVM_LINK_COMPONENTS
Analysis
Core
ExecutionEngine
- Extensions
MC
MCJIT
Passes
diff --git a/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn b/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn
index 346e5cc9577d1..1a1a6dfe59a6c 100644
--- a/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/unittests/Passes/PassBuilderBindings/BUILD.gn
@@ -4,7 +4,6 @@ unittest("PassesBindingsTests") {
"//llvm/include/llvm/Config:config",
"//llvm/lib/IR",
"//llvm/lib/Passes",
- "//llvm/lib/Extensions",
"//llvm/lib/Support",
"//llvm/lib/Target:TargetsToBuild",
"//llvm/lib/Testing/Support",
>From e36afa8754732cecd43927475c467039f1f28110 Mon Sep 17 00:00:00 2001
From: Vadmeme <invalid at example.com>
Date: Mon, 15 Jun 2026 20:29:57 -0700
Subject: [PATCH 5/6] fixup! [LLVM] Register static pass plugins in
LLVMRunPasses C-API
---
flang/lib/Optimizer/Builder/CMakeLists.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/flang/lib/Optimizer/Builder/CMakeLists.txt b/flang/lib/Optimizer/Builder/CMakeLists.txt
index 19738f52de22c..6b0d2fcf73ede 100644
--- a/flang/lib/Optimizer/Builder/CMakeLists.txt
+++ b/flang/lib/Optimizer/Builder/CMakeLists.txt
@@ -54,6 +54,7 @@ add_flang_library(FIRBuilder
FIRDialectSupport
FIRSupport
FortranEvaluate
+ FortranSemantics
FortranSupport
HLFIRDialect
MIFDialect
>From 6e4529a9c667b816eb949fa4cd67d1d398e1bcfe Mon Sep 17 00:00:00 2001
From: Vadmeme <invalid at example.com>
Date: Tue, 16 Jun 2026 14:43:51 -0700
Subject: [PATCH 6/6] fixup! [LLVM] Register static pass plugins in
LLVMRunPasses C-API
---
flang/lib/Optimizer/Builder/CMakeLists.txt | 1 -
1 file changed, 1 deletion(-)
diff --git a/flang/lib/Optimizer/Builder/CMakeLists.txt b/flang/lib/Optimizer/Builder/CMakeLists.txt
index 6b0d2fcf73ede..19738f52de22c 100644
--- a/flang/lib/Optimizer/Builder/CMakeLists.txt
+++ b/flang/lib/Optimizer/Builder/CMakeLists.txt
@@ -54,7 +54,6 @@ add_flang_library(FIRBuilder
FIRDialectSupport
FIRSupport
FortranEvaluate
- FortranSemantics
FortranSupport
HLFIRDialect
MIFDialect
More information about the flang-commits
mailing list