Auto merge of #116486 - van-ema:master, r=nikic
Fix to register analysis passes with -Zllvm-plugins at link-time This PR fixes an unexpected behavior of the `-Zllvm-plugins` flag. It allows to run an out-of-tree pass as part of LTO. However, analysis passes are registered before the plugin is loaded. As a result an analysis pass, which is passed as a plugin, is not registered. This causes the LLVM PassManager to fail when the analysis pass is queried from a transformation pass [(here)](https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/IR/PassManager.h#L776). This fix mimics the bahavior in [LLVM LTOBackend.cpp](https://github.com/llvm/llvm-project/blob/main/llvm/lib/LTO/LTOBackend.cpp#L273) by loading the plugin before the analysis passes are registered. Tested with rustc 1.60 and 1.65 and LLVM-13.0.1.
This commit is contained in:
commit
1516ca1bc0
@ -795,6 +795,20 @@ LLVMRustOptimize(
|
|||||||
CGSCCAnalysisManager CGAM;
|
CGSCCAnalysisManager CGAM;
|
||||||
ModuleAnalysisManager MAM;
|
ModuleAnalysisManager MAM;
|
||||||
|
|
||||||
|
if (LLVMPluginsLen) {
|
||||||
|
auto PluginsStr = StringRef(LLVMPlugins, LLVMPluginsLen);
|
||||||
|
SmallVector<StringRef> Plugins;
|
||||||
|
PluginsStr.split(Plugins, ',', -1, false);
|
||||||
|
for (auto PluginPath: Plugins) {
|
||||||
|
auto Plugin = PassPlugin::Load(PluginPath.str());
|
||||||
|
if (!Plugin) {
|
||||||
|
LLVMRustSetLastError(("Failed to load pass plugin" + PluginPath.str()).c_str());
|
||||||
|
return LLVMRustResult::Failure;
|
||||||
|
}
|
||||||
|
Plugin->registerPassBuilderCallbacks(PB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FAM.registerPass([&] { return PB.buildDefaultAAPipeline(); });
|
FAM.registerPass([&] { return PB.buildDefaultAAPipeline(); });
|
||||||
|
|
||||||
Triple TargetTriple(TheModule->getTargetTriple());
|
Triple TargetTriple(TheModule->getTargetTriple());
|
||||||
@ -918,20 +932,6 @@ LLVMRustOptimize(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LLVMPluginsLen) {
|
|
||||||
auto PluginsStr = StringRef(LLVMPlugins, LLVMPluginsLen);
|
|
||||||
SmallVector<StringRef> Plugins;
|
|
||||||
PluginsStr.split(Plugins, ',', -1, false);
|
|
||||||
for (auto PluginPath: Plugins) {
|
|
||||||
auto Plugin = PassPlugin::Load(PluginPath.str());
|
|
||||||
if (!Plugin) {
|
|
||||||
LLVMRustSetLastError(("Failed to load pass plugin" + PluginPath.str()).c_str());
|
|
||||||
return LLVMRustResult::Failure;
|
|
||||||
}
|
|
||||||
Plugin->registerPassBuilderCallbacks(PB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ModulePassManager MPM;
|
ModulePassManager MPM;
|
||||||
bool NeedThinLTOBufferPasses = UseThinLTOBuffers;
|
bool NeedThinLTOBufferPasses = UseThinLTOBuffers;
|
||||||
if (!NoPrepopulatePasses) {
|
if (!NoPrepopulatePasses) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user