diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
| commit | c0981da47d5696fe36474fcf86b4ce03ae3ff818 (patch) | |
| tree | f42add1021b9f2ac6a69ac7cf6c4499962739a45 /llvm/lib/LTO/LTOBackend.cpp | |
| parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) | |
Diffstat (limited to 'llvm/lib/LTO/LTOBackend.cpp')
| -rw-r--r-- | llvm/lib/LTO/LTOBackend.cpp | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp index 4e4ba4f3a58e..be06556b0c3b 100644 --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -27,6 +27,7 @@ #include "llvm/IR/Verifier.h" #include "llvm/LTO/LTO.h" #include "llvm/MC/SubtargetFeature.h" +#include "llvm/MC/TargetRegistry.h" #include "llvm/Object/ModuleSymbolTable.h" #include "llvm/Passes/PassBuilder.h" #include "llvm/Passes/PassPlugin.h" @@ -37,7 +38,6 @@ #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "llvm/Support/SmallVectorMemoryBuffer.h" -#include "llvm/Support/TargetRegistry.h" #include "llvm/Support/ThreadPool.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" @@ -74,7 +74,11 @@ static cl::opt<bool> ThinLTOAssumeMerged( cl::desc("Assume the input has already undergone ThinLTO function " "importing and the other pre-optimization pipeline changes.")); -LLVM_ATTRIBUTE_NORETURN static void reportOpenError(StringRef Path, Twine Msg) { +namespace llvm { +extern cl::opt<bool> NoPGOWarnMismatch; +} + +[[noreturn]] static void reportOpenError(StringRef Path, Twine Msg) { errs() << "failed to open " << Path << ": " << Msg << '\n'; errs().flush(); exit(1); @@ -221,10 +225,13 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, PGOOpt = PGOOptions(Conf.CSIRProfile, "", Conf.ProfileRemapping, PGOOptions::IRUse, PGOOptions::CSIRUse, Conf.AddFSDiscriminator); + NoPGOWarnMismatch = !Conf.PGOWarnMismatch; } else if (Conf.AddFSDiscriminator) { PGOOpt = PGOOptions("", "", "", PGOOptions::NoAction, PGOOptions::NoCSAction, true); } + if (TM) + TM->setPGOOption(PGOOpt); LoopAnalysisManager LAM; FunctionAnalysisManager FAM; @@ -244,18 +251,16 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, TLII->disableAllFunctions(); FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); }); - AAManager AA; // Parse a custom AA pipeline if asked to. if (!Conf.AAPipeline.empty()) { + AAManager AA; if (auto Err = PB.parseAAPipeline(AA, Conf.AAPipeline)) { - report_fatal_error("unable to parse AA pipeline description '" + + report_fatal_error(Twine("unable to parse AA pipeline description '") + Conf.AAPipeline + "': " + toString(std::move(Err))); } - } else { - AA = PB.buildDefaultAAPipeline(); + // Register the AA manager first so that our version is the one used. + FAM.registerPass([&] { return std::move(AA); }); } - // Register the AA manager first so that our version is the one used. - FAM.registerPass([&] { return std::move(AA); }); // Register all the basic analyses with the managers. PB.registerModuleAnalyses(MAM); @@ -269,29 +274,29 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, if (!Conf.DisableVerify) MPM.addPass(VerifierPass()); - PassBuilder::OptimizationLevel OL; + OptimizationLevel OL; switch (OptLevel) { default: llvm_unreachable("Invalid optimization level"); case 0: - OL = PassBuilder::OptimizationLevel::O0; + OL = OptimizationLevel::O0; break; case 1: - OL = PassBuilder::OptimizationLevel::O1; + OL = OptimizationLevel::O1; break; case 2: - OL = PassBuilder::OptimizationLevel::O2; + OL = OptimizationLevel::O2; break; case 3: - OL = PassBuilder::OptimizationLevel::O3; + OL = OptimizationLevel::O3; break; } // Parse a custom pipeline if asked to. if (!Conf.OptPipeline.empty()) { if (auto Err = PB.parsePassPipeline(MPM, Conf.OptPipeline)) { - report_fatal_error("unable to parse pass pipeline description '" + + report_fatal_error(Twine("unable to parse pass pipeline description '") + Conf.OptPipeline + "': " + toString(std::move(Err))); } } else if (IsThinLTO) { @@ -387,8 +392,8 @@ static void codegen(const Config &Conf, TargetMachine *TM, if (!Conf.DwoDir.empty()) { std::error_code EC; if (auto EC = llvm::sys::fs::create_directories(Conf.DwoDir)) - report_fatal_error("Failed to create directory " + Conf.DwoDir + ": " + - EC.message()); + report_fatal_error(Twine("Failed to create directory ") + Conf.DwoDir + + ": " + EC.message()); DwoFile = Conf.DwoDir; sys::path::append(DwoFile, std::to_string(Task) + ".dwo"); @@ -400,10 +405,14 @@ static void codegen(const Config &Conf, TargetMachine *TM, std::error_code EC; DwoOut = std::make_unique<ToolOutputFile>(DwoFile, EC, sys::fs::OF_None); if (EC) - report_fatal_error("Failed to open " + DwoFile + ": " + EC.message()); + report_fatal_error(Twine("Failed to open ") + DwoFile + ": " + + EC.message()); } - auto Stream = AddStream(Task); + Expected<std::unique_ptr<CachedFileStream>> StreamOrErr = AddStream(Task); + if (Error Err = StreamOrErr.takeError()) + report_fatal_error(std::move(Err)); + std::unique_ptr<CachedFileStream> &Stream = *StreamOrErr; legacy::PassManager CodeGenPasses; CodeGenPasses.add( createImmutableModuleSummaryIndexWrapperPass(&CombinedIndex)); @@ -599,7 +608,7 @@ Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream, dropDeadSymbols(Mod, DefinedGlobals, CombinedIndex); - thinLTOResolvePrevailingInModule(Mod, DefinedGlobals); + thinLTOFinalizeInModule(Mod, DefinedGlobals, /*PropagateAttrs=*/true); if (Conf.PostPromoteModuleHook && !Conf.PostPromoteModuleHook(Task, Mod)) return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile)); |
