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

Reply via email to