diff options
author | Eli Friedman <efriedma@quicinc.com> | 2020-03-26 10:09:13 -0700 |
---|---|---|
committer | Eli Friedman <efriedma@quicinc.com> | 2020-04-14 15:07:07 -0700 |
commit | c285841a4fb7ab0ead76043649394c443b03e5fc (patch) | |
tree | 9de2e4102d91d65c63f09b54ec6a1dcd19d65c07 /llvm/lib/LTO/LTOBackend.cpp | |
parent | ca99a70237c0c762c5d9872625865a8ac19e6c10 (diff) | |
download | llvm-c285841a4fb7ab0ead76043649394c443b03e5fc.zip llvm-c285841a4fb7ab0ead76043649394c443b03e5fc.tar.gz llvm-c285841a4fb7ab0ead76043649394c443b03e5fc.tar.bz2 |
Enable new passmanager plugin support for LTO.
This should make both static and dynamic NewPM plugins work with LTO.
And as a bonus, it makes static linking of OldPM plugins more reliable
for plugins with both an OldPM and NewPM interface.
I only implemented the command-line flag to specify NewPM plugins in
llvm-lto2, to show it works. Support can be added for other tools later.
Differential Revision: https://reviews.llvm.org/D76866
Diffstat (limited to 'llvm/lib/LTO/LTOBackend.cpp')
-rw-r--r-- | llvm/lib/LTO/LTOBackend.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp index dbd6f8c..22019e4 100644 --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -28,6 +28,7 @@ #include "llvm/MC/SubtargetFeature.h" #include "llvm/Object/ModuleSymbolTable.h" #include "llvm/Passes/PassBuilder.h" +#include "llvm/Passes/PassPlugin.h" #include "llvm/Passes/StandardInstrumentations.h" #include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" @@ -127,6 +128,29 @@ Error Config::addSaveTemps(std::string OutputFileName, return Error::success(); } +#define HANDLE_EXTENSION(Ext) \ + llvm::PassPluginLibraryInfo get##Ext##PluginInfo(); +#include "llvm/Support/Extension.def" + +static void RegisterPassPlugins(ArrayRef<std::string> PassPlugins, + PassBuilder &PB) { +#define HANDLE_EXTENSION(Ext) \ + get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB); +#include "llvm/Support/Extension.def" + + // Load requested pass plugins and let them register pass builder callbacks + for (auto &PluginFN : PassPlugins) { + auto PassPlugin = PassPlugin::Load(PluginFN); + if (!PassPlugin) { + errs() << "Failed to load passes from '" << PluginFN + << "'. Request ignored.\n"; + continue; + } + + PassPlugin->registerPassBuilderCallbacks(PB); + } +} + namespace { std::unique_ptr<TargetMachine> @@ -181,6 +205,8 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, if (auto Err = PB.parseAAPipeline(AA, "default")) report_fatal_error("Error parsing default AA pipeline"); + RegisterPassPlugins(Conf.PassPlugins, PB); + LoopAnalysisManager LAM(Conf.DebugPassManager); FunctionAnalysisManager FAM(Conf.DebugPassManager); CGSCCAnalysisManager CGAM(Conf.DebugPassManager); @@ -228,8 +254,8 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, // FIXME (davide): verify the output. } -static void runNewPMCustomPasses(Module &Mod, TargetMachine *TM, - std::string PipelineDesc, +static void runNewPMCustomPasses(const Config &Conf, Module &Mod, + TargetMachine *TM, std::string PipelineDesc, std::string AAPipelineDesc, bool DisableVerify) { PassBuilder PB(TM); @@ -241,6 +267,8 @@ static void runNewPMCustomPasses(Module &Mod, TargetMachine *TM, report_fatal_error("unable to parse AA pipeline description '" + AAPipelineDesc + "': " + toString(std::move(Err))); + RegisterPassPlugins(Conf.PassPlugins, PB); + LoopAnalysisManager LAM; FunctionAnalysisManager FAM; CGSCCAnalysisManager CGAM; @@ -307,7 +335,7 @@ bool opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod, const ModuleSummaryIndex *ImportSummary) { // FIXME: Plumb the combined index into the new pass manager. if (!Conf.OptPipeline.empty()) - runNewPMCustomPasses(Mod, TM, Conf.OptPipeline, Conf.AAPipeline, + runNewPMCustomPasses(Conf, Mod, TM, Conf.OptPipeline, Conf.AAPipeline, Conf.DisableVerify); else if (Conf.UseNewPM) runNewPMPasses(Conf, Mod, TM, Conf.OptLevel, IsThinLTO, ExportSummary, |