[llvm-branch-commits] [clang] [Clang] Load pass plugins before parsing LLVM options (PR #171868)
Alexis Engelke via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Dec 12 02:57:36 PST 2025
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 <engelke at in.tum.de>
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.
More information about the llvm-branch-commits
mailing list