[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