https://github.com/aengelke created https://github.com/llvm/llvm-project/pull/173287
This permits pass plugins to use llvm::cl::opt. Additionally, add a test of -fpass-plugin, this was previously not tested at all. I'm not sure whether using the LLVM Bye.so in the tests is possible this way (e.g., if Clang is built standalone). Reland after #173279. >From a0901f01052900aa20b6fe001c4608c5c3283e7b Mon Sep 17 00:00:00 2001 From: Alexis Engelke <[email protected]> Date: Mon, 22 Dec 2025 17:15:59 +0000 Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?= =?UTF-8?q?l=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.5-bogner --- clang/include/clang/Frontend/CompilerInstance.h | 12 ++++++++++++ clang/lib/CodeGen/BackendUtil.cpp | 13 +++---------- clang/lib/Frontend/CMakeLists.txt | 1 + clang/lib/Frontend/CompilerInstance.cpp | 11 +++++++++++ clang/test/CMakeLists.txt | 8 +++++++- clang/test/CodeGen/pass-plugins.c | 10 ++++++++++ clang/test/lit.cfg.py | 2 ++ clang/test/lit.site.cfg.py.in | 1 + 8 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 clang/test/CodeGen/pass-plugins.c diff --git a/clang/include/clang/Frontend/CompilerInstance.h b/clang/include/clang/Frontend/CompilerInstance.h index a8e8461b9b5a9..ded5f55d180aa 100644 --- a/clang/include/clang/Frontend/CompilerInstance.h +++ b/clang/include/clang/Frontend/CompilerInstance.h @@ -36,6 +36,7 @@ namespace llvm { class raw_fd_ostream; +class PassPlugin; class Timer; class TimerGroup; } @@ -131,6 +132,9 @@ class CompilerInstance : public ModuleLoader { /// The semantic analysis object. std::unique_ptr<Sema> TheSema; + /// Back-end pass plugins. + std::vector<std::unique_ptr<llvm::PassPlugin>> PassPlugins; + /// The frontend timer group. std::unique_ptr<llvm::TimerGroup> timerGroup; @@ -644,6 +648,14 @@ class CompilerInstance : public ModuleLoader { /// the compiler instance takes ownership of \p Value. void setCodeCompletionConsumer(CodeCompleteConsumer *Value); + /// } + /// @name Back-end Pass Plugins + /// @{ + + llvm::ArrayRef<std::unique_ptr<llvm::PassPlugin>> getPassPlugins() const { + return PassPlugins; + } + /// @} /// @name Frontend timer /// @{ diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index a014b5e982cc3..f365fa03cd930 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1019,16 +1019,9 @@ void EmitAssemblyHelper::RunOptimizationPipeline( } #endif } - // Attempt to load pass plugins and register their callbacks with PB. - for (auto &PluginFN : CodeGenOpts.PassPlugins) { - auto PassPlugin = PassPlugin::Load(PluginFN); - if (PassPlugin) { - PassPlugin->registerPassBuilderCallbacks(PB); - } else { - Diags.Report(diag::err_fe_unable_to_load_plugin) - << PluginFN << toString(PassPlugin.takeError()); - } - } + // Register plugin callbacks with PB. + for (const std::unique_ptr<PassPlugin> &Plugin : CI.getPassPlugins()) + Plugin->registerPassBuilderCallbacks(PB); for (const auto &PassCallback : CodeGenOpts.PassBuilderCallbacks) PassCallback(PB); #define HANDLE_EXTENSION(Ext) \ diff --git a/clang/lib/Frontend/CMakeLists.txt b/clang/lib/Frontend/CMakeLists.txt index 634f239933605..c40baa3657fe1 100644 --- a/clang/lib/Frontend/CMakeLists.txt +++ b/clang/lib/Frontend/CMakeLists.txt @@ -4,6 +4,7 @@ set(LLVM_LINK_COMPONENTS BitReader BitstreamReader Option + Plugins ProfileData Support TargetParser diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 5db3c8fa16988..39e20f371dcab 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -46,6 +46,7 @@ #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/Statistic.h" #include "llvm/Config/llvm-config.h" +#include "llvm/Plugins/PassPlugin.h" #include "llvm/Support/AdvisoryLock.h" #include "llvm/Support/BuryPointer.h" #include "llvm/Support/CrashRecoveryContext.h" @@ -1076,6 +1077,16 @@ void CompilerInstance::LoadRequestedPlugins() { << Path << Error; } + // Load and store pass plugins for the back-end. + for (const std::string &Path : getCodeGenOpts().PassPlugins) { + if (auto PassPlugin = llvm::PassPlugin::Load(Path)) { + PassPlugins.emplace_back(std::make_unique<llvm::PassPlugin>(*PassPlugin)); + } else { + getDiagnostics().Report(diag::err_fe_unable_to_load_plugin) + << Path << toString(PassPlugin.takeError()); + } + } + // Check if any of the loaded plugins replaces the main AST action for (const FrontendPluginRegistry::entry &Plugin : FrontendPluginRegistry::entries()) { diff --git a/clang/test/CMakeLists.txt b/clang/test/CMakeLists.txt index bcb6bd68fafc2..3faf3d7d5f2aa 100644 --- a/clang/test/CMakeLists.txt +++ b/clang/test/CMakeLists.txt @@ -13,7 +13,6 @@ llvm_canonicalize_cmake_booleans( CLANG_ENABLE_OBJC_REWRITER CLANG_LINK_CLANG_DYLIB ENABLE_BACKTRACES - LLVM_BUILD_EXAMPLES LLVM_BYE_LINK_INTO_TOOLS LLVM_ENABLE_PLUGINS LLVM_ENABLE_ZLIB @@ -21,6 +20,7 @@ llvm_canonicalize_cmake_booleans( LLVM_ENABLE_PER_TARGET_RUNTIME_DIR LLVM_ENABLE_THREADS LLVM_ENABLE_REVERSE_ITERATION + LLVM_INCLUDE_EXAMPLES LLVM_LINK_LLVM_DYLIB LLVM_WITH_Z3 PPC_LINUX_DEFAULT_IEEELONGDOUBLE @@ -134,6 +134,12 @@ if(CLANG_BUILD_EXAMPLES AND CLANG_PLUGIN_SUPPORT) ) endif () +if(LLVM_INCLUDE_EXAMPLES AND NOT WIN32 AND NOT CYGWIN) + list(APPEND CLANG_TEST_DEPS + Bye + ) +endif() + if(LLVM_INCLUDE_SPIRV_TOOLS_TESTS) list(APPEND CLANG_TEST_DEPS spirv-dis diff --git a/clang/test/CodeGen/pass-plugins.c b/clang/test/CodeGen/pass-plugins.c new file mode 100644 index 0000000000000..9a8ca7b49dff4 --- /dev/null +++ b/clang/test/CodeGen/pass-plugins.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -S < %s -fpass-plugin=%llvmshlibdir/Bye%pluginext -O2 2>&1 | FileCheck %s --check-prefix=CHECK-INACTIVE +// RUN: %clang_cc1 -S < %s -fpass-plugin=%llvmshlibdir/Bye%pluginext -O2 -mllvm -wave-goodbye 2>&1 | FileCheck %s --check-prefix=CHECK-ACTIVE +// REQUIRES: plugins, llvm-examples +// UNSUPPORTED: target={{.*windows.*}} +// CHECK-INACTIVE-NOT: Bye +// CHECK-ACTIVE: Bye: f + +int f(int x) { + return x; +} diff --git a/clang/test/lit.cfg.py b/clang/test/lit.cfg.py index 52b275c095475..a622f5335354a 100644 --- a/clang/test/lit.cfg.py +++ b/clang/test/lit.cfg.py @@ -126,6 +126,8 @@ if config.clang_examples: config.available_features.add("examples") +if config.llvm_examples: + config.available_features.add("llvm-examples") def have_host_out_of_process_jit_feature_support(): diff --git a/clang/test/lit.site.cfg.py.in b/clang/test/lit.site.cfg.py.in index f50953a93a412..3bdff42262164 100644 --- a/clang/test/lit.site.cfg.py.in +++ b/clang/test/lit.site.cfg.py.in @@ -28,6 +28,7 @@ config.clang_staticanalyzer_z3 = @LLVM_WITH_Z3@ config.clang_staticanalyzer_z3_mock = @TEST_WITH_Z3_MOCK@ config.clang_enable_cir = @CLANG_ENABLE_CIR@ config.clang_examples = @CLANG_BUILD_EXAMPLES@ +config.llvm_examples = @LLVM_INCLUDE_EXAMPLES@ config.enable_shared = @ENABLE_SHARED@ config.enable_backtrace = @ENABLE_BACKTRACES@ config.enable_threads = @LLVM_ENABLE_THREADS@ _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
