https://github.com/aengelke updated https://github.com/llvm/llvm-project/pull/171868
>From 7169c9eef2da43c0e9d79dad32c55797ef31ac27 Mon Sep 17 00:00:00 2001 From: Alexis Engelke <[email protected]> Date: Fri, 12 Dec 2025 10:57:24 +0000 Subject: [PATCH] load plugins in FrontendTool to avoid CodeGen dependencies in Frontend Created using spr 1.3.5-bogner --- clang/include/clang/Basic/CodeGenOptions.h | 4 ++-- clang/lib/CodeGen/BackendUtil.cpp | 4 ++-- clang/lib/Frontend/CompilerInstance.cpp | 9 --------- clang/lib/FrontendTool/CMakeLists.txt | 1 + .../FrontendTool/ExecuteCompilerInvocation.cpp | 15 +++++++++++++++ 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index 10808f3aba45c..149e7f46491f6 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -20,7 +20,6 @@ #include "llvm/ADT/FloatingPointMode.h" #include "llvm/Frontend/Debug/Options.h" #include "llvm/Frontend/Driver/CodeGenOptions.h" -#include "llvm/Passes/PassPlugin.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Hash.h" #include "llvm/Support/Regex.h" @@ -33,6 +32,7 @@ namespace llvm { class PassBuilder; +class PassPlugin; } namespace clang { @@ -479,7 +479,7 @@ class CodeGenOptions : public CodeGenOptionsBase { std::vector<std::string> PassPluginNames; /// List of loaded pass plugins. - std::vector<llvm::PassPlugin> PassPlugins; + std::vector<llvm::PassPlugin *> PassPlugins; /// List of pass builder callbacks. std::vector<std::function<void(llvm::PassBuilder &)>> PassBuilderCallbacks; diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index b39e303d13994..92e4d99ddea48 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1018,8 +1018,8 @@ void EmitAssemblyHelper::RunOptimizationPipeline( #endif } // Register plugin callbacks with PB. - for (auto &Plugin : CodeGenOpts.PassPlugins) - Plugin.registerPassBuilderCallbacks(PB); + for (llvm::PassPlugin *Plugin : CodeGenOpts.PassPlugins) + Plugin->registerPassBuilderCallbacks(PB); for (const auto &PassCallback : CodeGenOpts.PassBuilderCallbacks) PassCallback(PB); #define HANDLE_EXTENSION(Ext) \ diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index c69be4fea232c..884e7b52483a1 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -1077,15 +1077,6 @@ void CompilerInstance::LoadRequestedPlugins() { << Path << Error; } - // Load and store pass plugins for back-end. - for (const std::string &Path : getCodeGenOpts().PassPluginNames) { - if (auto PassPlugin = llvm::PassPlugin::Load(Path)) - getCodeGenOpts().PassPlugins.push_back(*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/lib/FrontendTool/CMakeLists.txt b/clang/lib/FrontendTool/CMakeLists.txt index 66213f76eb968..d851eba629926 100644 --- a/clang/lib/FrontendTool/CMakeLists.txt +++ b/clang/lib/FrontendTool/CMakeLists.txt @@ -1,5 +1,6 @@ set(LLVM_LINK_COMPONENTS Option + Passes Support ) diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index 05f646b43e3c4..0779d7b683092 100644 --- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -26,6 +26,7 @@ #include "clang/StaticAnalyzer/Frontend/AnalyzerHelpFlags.h" #include "clang/StaticAnalyzer/Frontend/FrontendActions.h" #include "llvm/Option/OptTable.h" +#include "llvm/Passes/PassPlugin.h" #include "llvm/Support/BuryPointer.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/ErrorHandling.h" @@ -233,6 +234,20 @@ bool ExecuteCompilerInvocation(CompilerInstance *Clang) { Clang->LoadRequestedPlugins(); + // Load and store pass plugins for the back-end. Store the loaded pass plugins + // here and store references to these in CodeGenOpts to avoid pulling in the + // entire PassPlugin dependency chain in CodeGenOpts. + std::vector<std::unique_ptr<llvm::PassPlugin>> PassPlugins; + for (const std::string &Path : Clang->getCodeGenOpts().PassPluginNames) { + if (auto PassPlugin = llvm::PassPlugin::Load(Path)) { + PassPlugins.emplace_back(std::make_unique<llvm::PassPlugin>(*PassPlugin)); + Clang->getCodeGenOpts().PassPlugins.push_back(PassPlugins.back().get()); + } else { + Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin) + << Path << toString(PassPlugin.takeError()); + } + } + // Honor -mllvm. // // FIXME: Remove this, one day. _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
