Rollup merge of #101997 - cuviper:drop-legacy-pm, r=nikic
Remove support for legacy PM This removes support for optimizing with LLVM's legacy pass manager, as well as the unstable `-Znew-llvm-pass-manager` option. We have been defaulting to the new PM since LLVM 13 (except for s390x that waited for 14), and LLVM 15 removed support altogether. The only place we still use the legacy PM is for writing the output file, just like `llc` does. cc #74705 r? ``@nikic``
This commit is contained in:
commit
07467c5308
15 changed files with 28 additions and 685 deletions
|
@ -31,13 +31,12 @@
|
|||
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
|
||||
#include "llvm/Transforms/IPO/AlwaysInliner.h"
|
||||
#include "llvm/Transforms/IPO/FunctionImport.h"
|
||||
#if LLVM_VERSION_GE(15, 0)
|
||||
#include "llvm/Transforms/IPO/Internalize.h"
|
||||
#include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h"
|
||||
#endif
|
||||
#include "llvm/Transforms/Utils/AddDiscriminators.h"
|
||||
#include "llvm/Transforms/Utils/FunctionImportUtils.h"
|
||||
#include "llvm/LTO/LTO.h"
|
||||
#include "llvm/Bitcode/BitcodeWriterPass.h"
|
||||
#include "llvm/Bitcode/BitcodeWriter.h"
|
||||
#include "llvm-c/Transforms/PassManagerBuilder.h"
|
||||
|
||||
#include "llvm/Transforms/Instrumentation.h"
|
||||
|
@ -93,172 +92,6 @@ extern "C" void LLVMTimeTraceProfilerFinish(const char* FileName) {
|
|||
timeTraceProfilerCleanup();
|
||||
}
|
||||
|
||||
extern "C" LLVMPassRef LLVMRustFindAndCreatePass(const char *PassName) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
StringRef SR(PassName);
|
||||
PassRegistry *PR = PassRegistry::getPassRegistry();
|
||||
|
||||
const PassInfo *PI = PR->getPassInfo(SR);
|
||||
if (PI) {
|
||||
return wrap(PI->createPass());
|
||||
}
|
||||
return nullptr;
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" LLVMPassRef LLVMRustCreateAddressSanitizerFunctionPass(bool Recover) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
const bool CompileKernel = false;
|
||||
const bool UseAfterScope = true;
|
||||
|
||||
return wrap(createAddressSanitizerFunctionPass(CompileKernel, Recover, UseAfterScope));
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" LLVMPassRef LLVMRustCreateModuleAddressSanitizerPass(bool Recover) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
const bool CompileKernel = false;
|
||||
|
||||
return wrap(createModuleAddressSanitizerLegacyPassPass(CompileKernel, Recover));
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" LLVMPassRef LLVMRustCreateMemorySanitizerPass(int TrackOrigins, bool Recover) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
const bool CompileKernel = false;
|
||||
|
||||
return wrap(createMemorySanitizerLegacyPassPass(
|
||||
#if LLVM_VERSION_GE(14, 0)
|
||||
MemorySanitizerOptions{TrackOrigins, Recover, CompileKernel, /*EagerChecks=*/true}
|
||||
#else
|
||||
MemorySanitizerOptions{TrackOrigins, Recover, CompileKernel}
|
||||
#endif
|
||||
));
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" LLVMPassRef LLVMRustCreateThreadSanitizerPass() {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
return wrap(createThreadSanitizerLegacyPassPass());
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" LLVMPassRef LLVMRustCreateHWAddressSanitizerPass(bool Recover) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
const bool CompileKernel = false;
|
||||
|
||||
return wrap(createHWAddressSanitizerLegacyPassPass(CompileKernel, Recover));
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustAddPass(LLVMPassManagerRef PMR, LLVMPassRef RustPass) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
assert(RustPass);
|
||||
Pass *Pass = unwrap(RustPass);
|
||||
PassManagerBase *PMB = unwrap(PMR);
|
||||
PMB->add(Pass);
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" LLVMPassManagerBuilderRef LLVMRustPassManagerBuilderCreate() {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
return LLVMPassManagerBuilderCreate();
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustPassManagerBuilderDispose(LLVMPassManagerBuilderRef PMB) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
LLVMPassManagerBuilderDispose(PMB);
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustPassManagerBuilderPopulateFunctionPassManager(
|
||||
LLVMPassManagerBuilderRef PMB, LLVMPassManagerRef PM) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
LLVMPassManagerBuilderPopulateFunctionPassManager(PMB, PM);
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustPassManagerBuilderPopulateModulePassManager(
|
||||
LLVMPassManagerBuilderRef PMB, LLVMPassManagerRef PM) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
LLVMPassManagerBuilderPopulateModulePassManager(PMB, PM);
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustPassManagerBuilderPopulateLTOPassManager(
|
||||
LLVMPassManagerBuilderRef PMB, LLVMPassManagerRef PM, bool Internalize, bool RunInliner) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
LLVMPassManagerBuilderPopulateLTOPassManager(PMB, PM, Internalize, RunInliner);
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C"
|
||||
void LLVMRustPassManagerBuilderPopulateThinLTOPassManager(
|
||||
LLVMPassManagerBuilderRef PMBR,
|
||||
LLVMPassManagerRef PMR
|
||||
) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
unwrap(PMBR)->populateThinLTOPassManager(*unwrap(PMR));
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustPassManagerBuilderUseInlinerWithThreshold(
|
||||
LLVMPassManagerBuilderRef PMB, unsigned Threshold) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
LLVMPassManagerBuilderUseInlinerWithThreshold(PMB, Threshold);
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C"
|
||||
void LLVMRustAddLastExtensionPasses(
|
||||
LLVMPassManagerBuilderRef PMBR, LLVMPassRef *Passes, size_t NumPasses) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
auto AddExtensionPasses = [Passes, NumPasses](
|
||||
const PassManagerBuilder &Builder, PassManagerBase &PM) {
|
||||
for (size_t I = 0; I < NumPasses; I++) {
|
||||
PM.add(unwrap(Passes[I]));
|
||||
}
|
||||
};
|
||||
// Add the passes to both of the pre-finalization extension points,
|
||||
// so they are run for optimized and non-optimized builds.
|
||||
unwrap(PMBR)->addExtension(PassManagerBuilder::EP_OptimizerLast,
|
||||
AddExtensionPasses);
|
||||
unwrap(PMBR)->addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
|
||||
AddExtensionPasses);
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef LLVM_COMPONENT_X86
|
||||
#define SUBTARGET_X86 SUBTARGET(X86)
|
||||
#else
|
||||
|
@ -604,47 +437,6 @@ extern "C" void LLVMRustDisposeTargetMachine(LLVMTargetMachineRef TM) {
|
|||
delete unwrap(TM);
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustConfigurePassManagerBuilder(
|
||||
LLVMPassManagerBuilderRef PMBR, LLVMRustCodeGenOptLevel OptLevel,
|
||||
bool MergeFunctions, bool SLPVectorize, bool LoopVectorize, bool PrepareForThinLTO,
|
||||
const char* PGOGenPath, const char* PGOUsePath, const char* PGOSampleUsePath,
|
||||
int SizeLevel) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
unwrap(PMBR)->MergeFunctions = MergeFunctions;
|
||||
unwrap(PMBR)->SLPVectorize = SLPVectorize;
|
||||
unwrap(PMBR)->OptLevel = fromRust(OptLevel);
|
||||
unwrap(PMBR)->LoopVectorize = LoopVectorize;
|
||||
unwrap(PMBR)->PrepareForThinLTO = PrepareForThinLTO;
|
||||
unwrap(PMBR)->SizeLevel = SizeLevel;
|
||||
unwrap(PMBR)->DisableUnrollLoops = SizeLevel != 0;
|
||||
|
||||
if (PGOGenPath) {
|
||||
assert(!PGOUsePath && !PGOSampleUsePath);
|
||||
unwrap(PMBR)->EnablePGOInstrGen = true;
|
||||
unwrap(PMBR)->PGOInstrGen = PGOGenPath;
|
||||
} else if (PGOUsePath) {
|
||||
assert(!PGOSampleUsePath);
|
||||
unwrap(PMBR)->PGOInstrUse = PGOUsePath;
|
||||
} else if (PGOSampleUsePath) {
|
||||
unwrap(PMBR)->PGOSampleUse = PGOSampleUsePath;
|
||||
}
|
||||
#else
|
||||
report_fatal_error("Legacy PM not supported with LLVM 15");
|
||||
#endif
|
||||
}
|
||||
|
||||
// Unfortunately, the LLVM C API doesn't provide a way to set the `LibraryInfo`
|
||||
// field of a PassManagerBuilder, we expose our own method of doing so.
|
||||
extern "C" void LLVMRustAddBuilderLibraryInfo(LLVMPassManagerBuilderRef PMBR,
|
||||
LLVMModuleRef M,
|
||||
bool DisableSimplifyLibCalls) {
|
||||
Triple TargetTriple(unwrap(M)->getTargetTriple());
|
||||
TargetLibraryInfoImpl *TLI = new TargetLibraryInfoImpl(TargetTriple);
|
||||
if (DisableSimplifyLibCalls)
|
||||
TLI->disableAllFunctions();
|
||||
unwrap(PMBR)->LibraryInfo = TLI;
|
||||
}
|
||||
|
||||
// Unfortunately, the LLVM C API doesn't provide a way to create the
|
||||
// TargetLibraryInfo pass, so we use this method to do so.
|
||||
extern "C" void LLVMRustAddLibraryInfo(LLVMPassManagerRef PMR, LLVMModuleRef M,
|
||||
|
@ -656,27 +448,6 @@ extern "C" void LLVMRustAddLibraryInfo(LLVMPassManagerRef PMR, LLVMModuleRef M,
|
|||
unwrap(PMR)->add(new TargetLibraryInfoWrapperPass(TLII));
|
||||
}
|
||||
|
||||
// Unfortunately, the LLVM C API doesn't provide an easy way of iterating over
|
||||
// all the functions in a module, so we do that manually here. You'll find
|
||||
// similar code in clang's BackendUtil.cpp file.
|
||||
extern "C" void LLVMRustRunFunctionPassManager(LLVMPassManagerRef PMR,
|
||||
LLVMModuleRef M) {
|
||||
llvm::legacy::FunctionPassManager *P =
|
||||
unwrap<llvm::legacy::FunctionPassManager>(PMR);
|
||||
P->doInitialization();
|
||||
|
||||
// Upgrade all calls to old intrinsics first.
|
||||
for (Module::iterator I = unwrap(M)->begin(), E = unwrap(M)->end(); I != E;)
|
||||
UpgradeCallsToIntrinsic(&*I++); // must be post-increment, as we remove
|
||||
|
||||
for (Module::iterator I = unwrap(M)->begin(), E = unwrap(M)->end(); I != E;
|
||||
++I)
|
||||
if (!I->isDeclaration())
|
||||
P->run(*I);
|
||||
|
||||
P->doFinalization();
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustSetLLVMOptions(int Argc, char **Argv) {
|
||||
// Initializing the command-line options more than once is not allowed. So,
|
||||
// check if they've already been initialized. (This could happen if we're
|
||||
|
@ -820,7 +591,7 @@ struct LLVMRustSanitizerOptions {
|
|||
};
|
||||
|
||||
extern "C" LLVMRustResult
|
||||
LLVMRustOptimizeWithNewPassManager(
|
||||
LLVMRustOptimize(
|
||||
LLVMModuleRef ModuleRef,
|
||||
LLVMTargetMachineRef TMRef,
|
||||
LLVMRustPassBuilderOptLevel OptLevelRust,
|
||||
|
@ -1241,15 +1012,8 @@ extern "C" void LLVMRustPrintPasses() {
|
|||
PR->enumerateWith(&Listener);
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustAddAlwaysInlinePass(LLVMPassManagerBuilderRef PMBR,
|
||||
bool AddLifetimes) {
|
||||
unwrap(PMBR)->Inliner = llvm::createAlwaysInlinerLegacyPass(AddLifetimes);
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustRunRestrictionPass(LLVMModuleRef M, char **Symbols,
|
||||
size_t Len) {
|
||||
llvm::legacy::PassManager passes;
|
||||
|
||||
auto PreserveFunctions = [=](const GlobalValue &GV) {
|
||||
for (size_t I = 0; I < Len; I++) {
|
||||
if (GV.getName() == Symbols[I]) {
|
||||
|
@ -1259,9 +1023,7 @@ extern "C" void LLVMRustRunRestrictionPass(LLVMModuleRef M, char **Symbols,
|
|||
return false;
|
||||
};
|
||||
|
||||
passes.add(llvm::createInternalizePass(PreserveFunctions));
|
||||
|
||||
passes.run(*unwrap(M));
|
||||
internalizeModule(*unwrap(M), PreserveFunctions);
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
|
@ -1610,11 +1372,6 @@ LLVMRustThinLTOBufferCreate(LLVMModuleRef M, bool is_thin) {
|
|||
raw_string_ostream OS(Ret->data);
|
||||
{
|
||||
if (is_thin) {
|
||||
#if LLVM_VERSION_LT(15, 0)
|
||||
legacy::PassManager PM;
|
||||
PM.add(createWriteThinLTOBitcodePass(OS));
|
||||
PM.run(*unwrap(M));
|
||||
#else
|
||||
PassBuilder PB;
|
||||
LoopAnalysisManager LAM;
|
||||
FunctionAnalysisManager FAM;
|
||||
|
@ -1628,11 +1385,8 @@ LLVMRustThinLTOBufferCreate(LLVMModuleRef M, bool is_thin) {
|
|||
ModulePassManager MPM;
|
||||
MPM.addPass(ThinLTOBitcodeWriterPass(OS, nullptr));
|
||||
MPM.run(*unwrap(M), MAM);
|
||||
#endif
|
||||
} else {
|
||||
legacy::PassManager PM;
|
||||
PM.add(createBitcodeWriterPass(OS));
|
||||
PM.run(*unwrap(M));
|
||||
WriteBitcodeToFile(*unwrap(M), OS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "llvm/Object/COFFImportFile.h"
|
||||
#include "llvm/Object/ObjectFile.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Bitcode/BitcodeWriterPass.h"
|
||||
#include "llvm/Bitcode/BitcodeWriter.h"
|
||||
#include "llvm/Support/Signals.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
|
||||
|
@ -1670,11 +1670,7 @@ LLVMRustModuleBufferCreate(LLVMModuleRef M) {
|
|||
auto Ret = std::make_unique<LLVMRustModuleBuffer>();
|
||||
{
|
||||
raw_string_ostream OS(Ret->data);
|
||||
{
|
||||
legacy::PassManager PM;
|
||||
PM.add(createBitcodeWriterPass(OS));
|
||||
PM.run(*unwrap(M));
|
||||
}
|
||||
WriteBitcodeToFile(*unwrap(M), OS);
|
||||
}
|
||||
return Ret.release();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue