forked from OSchip/llvm-project
[NewPM] Add support for new-PM plugins to clang
Summary: This adds support for new-PM plugin loading to clang. The option `-fpass-plugin=` may be used to specify a dynamic shared object file that adheres to the PassPlugin API. Tested: created simple plugin that registers an EP callback; with optimization level > 0, the pass is run as expected. Committed on behalf of Marco Elver Differential Revision: https://reviews.llvm.org/D56935 llvm-svn: 352972
This commit is contained in:
parent
c16cc77917
commit
e3f105c651
|
@ -287,6 +287,9 @@ public:
|
|||
|
||||
std::vector<std::string> DefaultFunctionAttrs;
|
||||
|
||||
/// List of dynamic shared object files to be loaded as pass plugins.
|
||||
std::vector<std::string> PassPlugins;
|
||||
|
||||
public:
|
||||
// Define accessors/mutators for code generation options of enumeration type.
|
||||
#define CODEGENOPT(Name, Bits, Default)
|
||||
|
|
|
@ -1612,6 +1612,9 @@ def frwpi : Flag<["-"], "frwpi">, Group<f_Group>;
|
|||
def fno_rwpi : Flag<["-"], "fno-rwpi">, Group<f_Group>;
|
||||
def fplugin_EQ : Joined<["-"], "fplugin=">, Group<f_Group>, Flags<[DriverOption]>, MetaVarName<"<dsopath>">,
|
||||
HelpText<"Load the named plugin (dynamic shared object)">;
|
||||
def fpass_plugin_EQ : Joined<["-"], "fpass-plugin=">,
|
||||
Group<f_Group>, Flags<[CC1Option]>, MetaVarName<"<dsopath>">,
|
||||
HelpText<"Load pass plugin from a dynamic shared object file (only with new pass manager).">;
|
||||
def fpreserve_as_comments : Flag<["-"], "fpreserve-as-comments">, Group<f_Group>;
|
||||
def fno_preserve_as_comments : Flag<["-"], "fno-preserve-as-comments">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Do not preserve comments in inline assembly">;
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/SubtargetFeature.h"
|
||||
#include "llvm/Passes/PassBuilder.h"
|
||||
#include "llvm/Passes/PassPlugin.h"
|
||||
#include "llvm/Support/BuryPointer.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
|
@ -961,6 +962,17 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
|
|||
|
||||
PassBuilder PB(TM.get(), PGOOpt);
|
||||
|
||||
// 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());
|
||||
}
|
||||
}
|
||||
|
||||
LoopAnalysisManager LAM(CodeGenOpts.DebugPassManager);
|
||||
FunctionAnalysisManager FAM(CodeGenOpts.DebugPassManager);
|
||||
CGSCCAnalysisManager CGAM(CodeGenOpts.DebugPassManager);
|
||||
|
|
|
@ -5077,6 +5077,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
A->claim();
|
||||
}
|
||||
|
||||
// Forward -fpass-plugin=name.so to -cc1.
|
||||
for (const Arg *A : Args.filtered(options::OPT_fpass_plugin_EQ)) {
|
||||
CmdArgs.push_back(
|
||||
Args.MakeArgString(Twine("-fpass-plugin=") + A->getValue()));
|
||||
A->claim();
|
||||
}
|
||||
|
||||
// Setup statistics file output.
|
||||
SmallString<128> StatsFile = getStatsFileName(Args, Output, Input, D);
|
||||
if (!StatsFile.empty())
|
||||
|
|
|
@ -1322,6 +1322,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
|
||||
Opts.DefaultFunctionAttrs = Args.getAllArgValues(OPT_default_function_attr);
|
||||
|
||||
Opts.PassPlugins = Args.getAllArgValues(OPT_fpass_plugin_EQ);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue