LLVM 23.0.0git
LTOBackend.cpp
Go to the documentation of this file.
1//===-LTOBackend.cpp - LLVM Link Time Optimizer Backend -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the "backend" phase of LTO, i.e. it performs
10// optimization and code generation on a loaded module. It is generally used
11// internally by the LTO class but can also be used independently, for example
12// to implement a standalone ThinLTO backend.
13//
14//===----------------------------------------------------------------------===//
15
16#include "llvm/LTO/LTOBackend.h"
27#include "llvm/IR/PassManager.h"
28#include "llvm/IR/Verifier.h"
29#include "llvm/LTO/LTO.h"
35#include "llvm/Support/Error.h"
38#include "llvm/Support/Path.h"
48#include <optional>
49
50using namespace llvm;
51using namespace lto;
52
53#define DEBUG_TYPE "lto-backend"
54
60
62 "lto-embed-bitcode", cl::init(LTOBitcodeEmbedding::DoNotEmbed),
64 "Do not embed"),
66 "Embed after all optimization passes"),
68 "post-merge-pre-opt",
69 "Embed post merge, but before optimizations")),
70 cl::desc("Embed LLVM bitcode in object files produced by LTO"));
71
73 "thinlto-assume-merged", cl::init(false),
74 cl::desc("Assume the input has already undergone ThinLTO function "
75 "importing and the other pre-optimization pipeline changes."));
76
78 SaveModulesList("filter-save-modules", cl::value_desc("module names"),
79 cl::desc("Only save bitcode for module whose name without "
80 "path matches this for -save-temps options"),
82
83namespace llvm {
85}
86
87[[noreturn]] static void reportOpenError(StringRef Path, Twine Msg) {
88 errs() << "failed to open " << Path << ": " << Msg << '\n';
89 errs().flush();
90 exit(1);
91}
92
93Error Config::addSaveTemps(std::string OutputFileName, bool UseInputModulePath,
94 const DenseSet<StringRef> &SaveTempsArgs) {
96
97 std::error_code EC;
98 if (SaveTempsArgs.empty() || SaveTempsArgs.contains("resolution")) {
100 std::make_unique<raw_fd_ostream>(OutputFileName + "resolution.txt", EC,
102 if (EC) {
103 ResolutionFile.reset();
104 return errorCodeToError(EC);
105 }
106 }
107
108 auto setHook = [&](std::string PathSuffix, ModuleHookFn &Hook) {
109 // Keep track of the hook provided by the linker, which also needs to run.
110 ModuleHookFn LinkerHook = Hook;
111 Hook = [=, SaveModNames = llvm::SmallVector<std::string, 1>(
112 SaveModulesList.begin(), SaveModulesList.end())](
113 unsigned Task, const Module &M) {
114 // If SaveModulesList is not empty, only do save-temps if the module's
115 // filename (without path) matches a name in the list.
116 if (!SaveModNames.empty() &&
118 SaveModNames,
119 std::string(llvm::sys::path::filename(M.getName()))))
120 return false;
121
122 // If the linker's hook returned false, we need to pass that result
123 // through.
124 if (LinkerHook && !LinkerHook(Task, M))
125 return false;
126
127 std::string PathPrefix;
128 // If this is the combined module (not a ThinLTO backend compile) or the
129 // user hasn't requested using the input module's path, emit to a file
130 // named from the provided OutputFileName with the Task ID appended.
131 if (M.getModuleIdentifier() == "ld-temp.o" || !UseInputModulePath) {
132 PathPrefix = OutputFileName;
133 if (Task != (unsigned)-1)
134 PathPrefix += utostr(Task) + ".";
135 } else
136 PathPrefix = M.getModuleIdentifier() + ".";
137 std::string Path = PathPrefix + PathSuffix + ".bc";
138 std::error_code EC;
140 // Because -save-temps is a debugging feature, we report the error
141 // directly and exit.
142 if (EC)
143 reportOpenError(Path, EC.message());
144 WriteBitcodeToFile(M, OS, /*ShouldPreserveUseListOrder=*/false);
145 return true;
146 };
147 };
148
149 auto SaveCombinedIndex =
150 [=](const ModuleSummaryIndex &Index,
151 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
152 std::string Path = OutputFileName + "index.bc";
153 std::error_code EC;
155 // Because -save-temps is a debugging feature, we report the error
156 // directly and exit.
157 if (EC)
158 reportOpenError(Path, EC.message());
159 writeIndexToFile(Index, OS);
160
161 Path = OutputFileName + "index.dot";
163 if (EC)
164 reportOpenError(Path, EC.message());
165 Index.exportToDot(OSDot, GUIDPreservedSymbols);
166 return true;
167 };
168
169 if (SaveTempsArgs.empty()) {
170 setHook("0.preopt", PreOptModuleHook);
171 setHook("1.promote", PostPromoteModuleHook);
172 setHook("2.internalize", PostInternalizeModuleHook);
173 setHook("3.import", PostImportModuleHook);
174 setHook("4.opt", PostOptModuleHook);
175 setHook("5.precodegen", PreCodeGenModuleHook);
176 CombinedIndexHook = SaveCombinedIndex;
177 } else {
178 if (SaveTempsArgs.contains("preopt"))
179 setHook("0.preopt", PreOptModuleHook);
180 if (SaveTempsArgs.contains("promote"))
181 setHook("1.promote", PostPromoteModuleHook);
182 if (SaveTempsArgs.contains("internalize"))
183 setHook("2.internalize", PostInternalizeModuleHook);
184 if (SaveTempsArgs.contains("import"))
185 setHook("3.import", PostImportModuleHook);
186 if (SaveTempsArgs.contains("opt"))
187 setHook("4.opt", PostOptModuleHook);
188 if (SaveTempsArgs.contains("precodegen"))
189 setHook("5.precodegen", PreCodeGenModuleHook);
190 if (SaveTempsArgs.contains("combinedindex"))
191 CombinedIndexHook = SaveCombinedIndex;
192 }
193
194 return Error::success();
195}
196
197#define HANDLE_EXTENSION(Ext) \
198 llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
199#include "llvm/Support/Extension.def"
200#undef HANDLE_EXTENSION
201
202static void RegisterPassPlugins(const Config &Conf, PassBuilder &PB) {
203#define HANDLE_EXTENSION(Ext) \
204 get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
205#include "llvm/Support/Extension.def"
206#undef HANDLE_EXTENSION
207
208 // Load requested pass plugins and let them register pass builder callbacks
209 for (auto &PluginFN : Conf.PassPluginFilenames) {
210 auto PassPlugin = PassPlugin::Load(PluginFN);
211 if (!PassPlugin)
214 }
215
216 // Register already loaded plugins
217 for (auto *LoadedPlugin : Conf.LoadedPassPlugins)
218 LoadedPlugin->registerPassBuilderCallbacks(PB);
219}
220
221static std::unique_ptr<TargetMachine>
222createTargetMachine(const Config &Conf, const Target *TheTarget, Module &M) {
223 const Triple &TheTriple = M.getTargetTriple();
224 SubtargetFeatures Features;
225 Features.getDefaultSubtargetFeatures(TheTriple);
226 for (const std::string &A : Conf.MAttrs)
227 Features.AddFeature(A);
228
229 std::optional<Reloc::Model> RelocModel;
230 if (Conf.RelocModel)
231 RelocModel = *Conf.RelocModel;
232 else if (M.getModuleFlag("PIC Level"))
233 RelocModel =
234 M.getPICLevel() == PICLevel::NotPIC ? Reloc::Static : Reloc::PIC_;
235
236 std::optional<CodeModel::Model> CodeModel;
237 if (Conf.CodeModel)
238 CodeModel = *Conf.CodeModel;
239 else
240 CodeModel = M.getCodeModel();
241
242 TargetOptions TargetOpts = Conf.Options;
243 if (TargetOpts.MCOptions.ABIName.empty()) {
244 TargetOpts.MCOptions.ABIName = M.getTargetABIFromMD();
245 }
246
247 std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine(
248 TheTriple, Conf.CPU, Features.getString(), TargetOpts, RelocModel,
249 CodeModel, Conf.CGOptLevel));
250
251 assert(TM && "Failed to create target machine");
252
253 if (std::optional<uint64_t> LargeDataThreshold = M.getLargeDataThreshold())
254 TM->setLargeDataThreshold(*LargeDataThreshold);
255
256 return TM;
257}
258
259static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
260 unsigned OptLevel, bool IsThinLTO,
261 ModuleSummaryIndex *ExportSummary,
262 const ModuleSummaryIndex *ImportSummary,
263 const DenseSet<StringRef> &BitcodeLibFuncs) {
264 std::optional<PGOOptions> PGOOpt;
265 if (!Conf.SampleProfile.empty())
266 PGOOpt = PGOOptions(Conf.SampleProfile, "", Conf.ProfileRemapping,
267 /*MemoryProfile=*/"", PGOOptions::SampleUse,
270 else if (Conf.RunCSIRInstr) {
271 PGOOpt = PGOOptions("", Conf.CSIRProfile, Conf.ProfileRemapping,
272 /*MemoryProfile=*/"", PGOOptions::IRUse,
274 Conf.AddFSDiscriminator);
275 } else if (!Conf.CSIRProfile.empty()) {
276 PGOOpt =
278 /*MemoryProfile=*/"", PGOOptions::IRUse, PGOOptions::CSIRUse,
281 } else if (Conf.AddFSDiscriminator) {
282 PGOOpt = PGOOptions("", "", "", /*MemoryProfile=*/"", PGOOptions::NoAction,
285 }
286 TM->setPGOOption(PGOOpt);
287
292
295 Conf.VerifyEach);
296 SI.registerCallbacks(PIC, &MAM);
297 PassBuilder PB(TM, Conf.PTO, PGOOpt, &PIC);
298
299 RegisterPassPlugins(Conf, PB);
300
301 std::unique_ptr<TargetLibraryInfoImpl> TLII(
303 if (Conf.Freestanding)
304 TLII->disableAllFunctions();
305
306 // Determine whether or not its safe to emit calls to each libfunc. Libfuncs
307 // that might have been present in the current LTO unit, but are not, have
308 // lost their only opportunity to be defined, and calls must not be emitted to
309 // them.
310 // FIXME: BitcodeLibFuncs isn't yet set for distributed ThinLTO.
311 TargetLibraryInfo TLI(*TLII);
312 for (unsigned I = 0, E = static_cast<unsigned>(LibFunc::NumLibFuncs); I != E;
313 ++I) {
314 LibFunc F = static_cast<LibFunc>(I);
315 if (BitcodeLibFuncs.contains(TLI.getName(F)))
316 TLII->setUnavailable(F);
317 }
318
319 FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
320
321 // Parse a custom AA pipeline if asked to.
322 if (!Conf.AAPipeline.empty()) {
324 if (auto Err = PB.parseAAPipeline(AA, Conf.AAPipeline)) {
325 report_fatal_error(Twine("unable to parse AA pipeline description '") +
326 Conf.AAPipeline + "': " + toString(std::move(Err)));
327 }
328 // Register the AA manager first so that our version is the one used.
329 FAM.registerPass([&] { return std::move(AA); });
330 }
331
332 // Register all the basic analyses with the managers.
333 PB.registerModuleAnalyses(MAM);
334 PB.registerCGSCCAnalyses(CGAM);
335 PB.registerFunctionAnalyses(FAM);
336 PB.registerLoopAnalyses(LAM);
337 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
338
340
341 if (!Conf.DisableVerify)
342 MPM.addPass(VerifierPass());
343
345
346 switch (OptLevel) {
347 default:
348 llvm_unreachable("Invalid optimization level");
349 case 0:
351 break;
352 case 1:
354 break;
355 case 2:
357 break;
358 case 3:
360 break;
361 }
362
363 // Parse a custom pipeline if asked to.
364 if (!Conf.OptPipeline.empty()) {
365 if (auto Err = PB.parsePassPipeline(MPM, Conf.OptPipeline)) {
366 report_fatal_error(Twine("unable to parse pass pipeline description '") +
367 Conf.OptPipeline + "': " + toString(std::move(Err)));
368 }
369 } else if (IsThinLTO) {
370 MPM.addPass(PB.buildThinLTODefaultPipeline(OL, ImportSummary));
371 } else {
372 MPM.addPass(PB.buildLTODefaultPipeline(OL, ExportSummary));
373 }
374
375 if (!Conf.DisableVerify)
376 MPM.addPass(VerifierPass());
377
379 std::string PipelineStr;
380 raw_string_ostream OS(PipelineStr);
381 MPM.printPipeline(OS, [&PIC](StringRef ClassName) {
382 auto PassName = PIC.getPassNameForClassName(ClassName);
383 return PassName.empty() ? ClassName : PassName;
384 });
385 outs() << "pipeline-passes: " << PipelineStr << '\n';
386 }
387
388 MPM.run(Mod, MAM);
389}
390
391static bool isEmptyModule(const Module &Mod) {
392 // Module is empty if it has no functions, no globals, no inline asm and no
393 // named metadata (aliases and ifuncs require functions or globals so we
394 // don't need to check those explicitly).
395 return Mod.empty() && Mod.global_empty() && Mod.named_metadata_empty() &&
396 Mod.getModuleInlineAsm().empty();
397}
398
399bool lto::opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod,
400 bool IsThinLTO, ModuleSummaryIndex *ExportSummary,
401 const ModuleSummaryIndex *ImportSummary,
402 const std::vector<uint8_t> &CmdArgs,
403 ArrayRef<StringRef> BitcodeLibFuncs) {
404 llvm::TimeTraceScope timeScope("opt");
406 // FIXME: the motivation for capturing post-merge bitcode and command line
407 // is replicating the compilation environment from bitcode, without needing
408 // to understand the dependencies (the functions to be imported). This
409 // assumes a clang - based invocation, case in which we have the command
410 // line.
411 // It's not very clear how the above motivation would map in the
412 // linker-based case, so we currently don't plumb the command line args in
413 // that case.
414 if (CmdArgs.empty())
416 dbgs() << "Post-(Thin)LTO merge bitcode embedding was requested, but "
417 "command line arguments are not available");
419 /*EmbedBitcode*/ true, /*EmbedCmdline*/ true,
420 /*Cmdline*/ CmdArgs);
421 }
422 // No need to run any opt passes if the module is empty.
423 // In theory these passes should take almost no time for an empty
424 // module, however, this guards against doing any unnecessary summary-based
425 // analysis in the case of a ThinLTO build where this might be an empty
426 // regular LTO combined module, with a large combined index from ThinLTO.
427 if (!isEmptyModule(Mod)) {
428 DenseSet<StringRef> BitcodeLibFuncsSet(BitcodeLibFuncs.begin(),
429 BitcodeLibFuncs.end());
430 // FIXME: Plumb the combined index into the new pass manager.
431 runNewPMPasses(Conf, Mod, TM, Conf.OptLevel, IsThinLTO, ExportSummary,
432 ImportSummary, BitcodeLibFuncsSet);
433 }
434 return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod);
435}
436
437static void codegen(const Config &Conf, TargetMachine *TM,
438 AddStreamFn AddStream, unsigned Task, Module &Mod,
439 const ModuleSummaryIndex &CombinedIndex) {
440 llvm::TimeTraceScope timeScope("codegen");
441 if (Conf.PreCodeGenModuleHook && !Conf.PreCodeGenModuleHook(Task, Mod))
442 return;
443
446 /*EmbedBitcode*/ true,
447 /*EmbedCmdline*/ false,
448 /*CmdArgs*/ std::vector<uint8_t>());
449
450 std::unique_ptr<ToolOutputFile> DwoOut;
452 if (!Conf.DwoDir.empty()) {
453 std::error_code EC;
454 if (auto EC = llvm::sys::fs::create_directories(Conf.DwoDir))
455 report_fatal_error(Twine("Failed to create directory ") + Conf.DwoDir +
456 ": " + EC.message());
457
458 DwoFile = Conf.DwoDir;
459 sys::path::append(DwoFile, std::to_string(Task) + ".dwo");
460 TM->Options.MCOptions.SplitDwarfFile = std::string(DwoFile);
461 } else
463
464 if (!DwoFile.empty()) {
465 std::error_code EC;
466 DwoOut = std::make_unique<ToolOutputFile>(DwoFile, EC, sys::fs::OF_None);
467 if (EC)
468 report_fatal_error(Twine("Failed to open ") + DwoFile + ": " +
469 EC.message());
470 }
471
473 AddStream(Task, Mod.getModuleIdentifier());
474 if (Error Err = StreamOrErr.takeError())
475 report_fatal_error(std::move(Err));
476 std::unique_ptr<CachedFileStream> &Stream = *StreamOrErr;
477 TM->Options.ObjectFilenameForDebug = Stream->ObjectPathName;
478
479 // Create the codegen pipeline in its own scope so it gets deleted before
480 // Stream->commit() is called. The commit function of CacheStream deletes
481 // the raw stream, which is too early as streamers (e.g. MCAsmStreamer)
482 // keep the pointer and may use it until their destruction. See #138194.
483 {
484 legacy::PassManager CodeGenPasses;
485 TargetLibraryInfoImpl TLII(Mod.getTargetTriple(), TM->Options.VecLib);
486 CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
487 CodeGenPasses.add(new RuntimeLibraryInfoWrapper(
488 Mod.getTargetTriple(), TM->Options.ExceptionModel,
491
492 // No need to make index available if the module is empty.
493 // In theory these passes should not use the index for an empty
494 // module, however, this guards against doing any unnecessary summary-based
495 // analysis in the case of a ThinLTO build where this might be an empty
496 // regular LTO combined module, with a large combined index from ThinLTO.
497 if (!isEmptyModule(Mod))
498 CodeGenPasses.add(
500 if (Conf.PreCodeGenPassesHook)
501 Conf.PreCodeGenPassesHook(CodeGenPasses);
502 if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS,
503 DwoOut ? &DwoOut->os() : nullptr,
504 Conf.CGFileType))
505 report_fatal_error("Failed to setup codegen");
506 CodeGenPasses.run(Mod);
507
508 if (DwoOut)
509 DwoOut->keep();
510 }
511
512 if (Error Err = Stream->commit())
513 report_fatal_error(std::move(Err));
514}
515
516static void splitCodeGen(const Config &C, TargetMachine *TM,
517 AddStreamFn AddStream,
518 unsigned ParallelCodeGenParallelismLevel, Module &Mod,
519 const ModuleSummaryIndex &CombinedIndex) {
520 DefaultThreadPool CodegenThreadPool(
521 heavyweight_hardware_concurrency(ParallelCodeGenParallelismLevel));
522 unsigned ThreadCount = 0;
523 const Target *T = &TM->getTarget();
524
525 const auto HandleModulePartition =
526 [&](std::unique_ptr<Module> MPart) {
527 // We want to clone the module in a new context to multi-thread the
528 // codegen. We do it by serializing partition modules to bitcode
529 // (while still on the main thread, in order to avoid data races) and
530 // spinning up new threads which deserialize the partitions into
531 // separate contexts.
532 // FIXME: Provide a more direct way to do this in LLVM.
534 raw_svector_ostream BCOS(BC);
535 WriteBitcodeToFile(*MPart, BCOS);
536
537 // Enqueue the task
538 CodegenThreadPool.async(
539 [&](const SmallString<0> &BC, unsigned ThreadId) {
540 LTOLLVMContext Ctx(C);
542 parseBitcodeFile(MemoryBufferRef(BC.str(), "ld-temp.o"), Ctx);
543 if (!MOrErr)
544 report_fatal_error("Failed to read bitcode");
545 std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.get());
546
547 std::unique_ptr<TargetMachine> TM =
548 createTargetMachine(C, T, *MPartInCtx);
549
550 codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx,
551 CombinedIndex);
552 },
553 // Pass BC using std::move to ensure that it get moved rather than
554 // copied into the thread's context.
555 std::move(BC), ThreadCount++);
556 };
557
558 // Try target-specific module splitting first, then fallback to the default.
559 if (!TM->splitModule(Mod, ParallelCodeGenParallelismLevel,
560 HandleModulePartition)) {
561 SplitModule(Mod, ParallelCodeGenParallelismLevel, HandleModulePartition,
562 false);
563 }
564
565 // Because the inner lambda (which runs in a worker thread) captures our local
566 // variables, we need to wait for the worker threads to terminate before we
567 // can leave the function scope.
568 CodegenThreadPool.wait();
569}
570
572 Module &Mod) {
573 if (!C.OverrideTriple.empty())
574 Mod.setTargetTriple(Triple(C.OverrideTriple));
575 else if (Mod.getTargetTriple().empty())
576 Mod.setTargetTriple(Triple(C.DefaultTriple));
577
578 std::string Msg;
579 const Target *T = TargetRegistry::lookupTarget(Mod.getTargetTriple(), Msg);
580 if (!T)
582 return T;
583}
584
586 // Make sure we flush the diagnostic remarks file in case the linker doesn't
587 // call the global destructors before exiting.
588 if (!DiagOutputFile)
589 return Error::success();
590 DiagOutputFile.finalize();
591 DiagOutputFile->keep();
592 DiagOutputFile->os().flush();
593 return Error::success();
594}
595
597 unsigned ParallelCodeGenParallelismLevel, Module &Mod,
598 ModuleSummaryIndex &CombinedIndex,
599 ArrayRef<StringRef> BitcodeLibFuncs) {
600 llvm::TimeTraceScope timeScope("LTO backend");
602 if (!TOrErr)
603 return TOrErr.takeError();
604
605 std::unique_ptr<TargetMachine> TM = createTargetMachine(C, *TOrErr, Mod);
606
607 LLVM_DEBUG(dbgs() << "Running regular LTO\n");
608 if (!C.CodeGenOnly) {
609 if (!opt(C, TM.get(), 0, Mod, /*IsThinLTO=*/false,
610 /*ExportSummary=*/&CombinedIndex, /*ImportSummary=*/nullptr,
611 /*CmdArgs*/ std::vector<uint8_t>(), BitcodeLibFuncs))
612 return Error::success();
613 }
614
615 if (ParallelCodeGenParallelismLevel == 1) {
616 codegen(C, TM.get(), AddStream, 0, Mod, CombinedIndex);
617 } else {
618 splitCodeGen(C, TM.get(), AddStream, ParallelCodeGenParallelismLevel, Mod,
619 CombinedIndex);
620 }
621 return Error::success();
622}
623
624static void dropDeadSymbols(Module &Mod, const GVSummaryMapTy &DefinedGlobals,
625 const ModuleSummaryIndex &Index) {
626 llvm::TimeTraceScope timeScope("Drop dead symbols");
627 std::vector<GlobalValue*> DeadGVs;
628 for (auto &GV : Mod.global_values())
629 if (GlobalValueSummary *GVS = DefinedGlobals.lookup(GV.getGUID()))
630 if (!Index.isGlobalValueLive(GVS)) {
631 DeadGVs.push_back(&GV);
633 }
634
635 // Now that all dead bodies have been dropped, delete the actual objects
636 // themselves when possible.
637 for (GlobalValue *GV : DeadGVs) {
638 GV->removeDeadConstantUsers();
639 // Might reference something defined in native object (i.e. dropped a
640 // non-prevailing IR def, but we need to keep the declaration).
641 if (GV->use_empty())
642 GV->eraseFromParent();
643 }
644}
645
646Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream,
647 Module &Mod, const ModuleSummaryIndex &CombinedIndex,
648 const FunctionImporter::ImportMapTy &ImportList,
649 const GVSummaryMapTy &DefinedGlobals,
651 bool CodeGenOnly, ArrayRef<StringRef> BitcodeLibFuncs,
652 AddStreamFn IRAddStream,
653 const std::vector<uint8_t> &CmdArgs) {
654 llvm::TimeTraceScope timeScope("Thin backend", Mod.getModuleIdentifier());
656 if (!TOrErr)
657 return TOrErr.takeError();
658
659 std::unique_ptr<TargetMachine> TM = createTargetMachine(Conf, *TOrErr, Mod);
660
661 // Setup optimization remarks.
662 auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
663 Mod.getContext(), Conf.RemarksFilename, Conf.RemarksPasses,
665 Task);
666 if (!DiagFileOrErr)
667 return DiagFileOrErr.takeError();
668 auto DiagnosticOutputFile = std::move(*DiagFileOrErr);
669
670 // Set the partial sample profile ratio in the profile summary module flag of
671 // the module, if applicable.
672 Mod.setPartialSampleProfileRatio(CombinedIndex);
673
674 LLVM_DEBUG(dbgs() << "Running ThinLTO\n");
675 if (CodeGenOnly) {
676 // If CodeGenOnly is set, we only perform code generation and skip
677 // optimization. This value may differ from Conf.CodeGenOnly.
678 codegen(Conf, TM.get(), AddStream, Task, Mod, CombinedIndex);
679 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
680 }
681
682 if (Conf.PreOptModuleHook && !Conf.PreOptModuleHook(Task, Mod))
683 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
684
685 auto OptimizeAndCodegen =
686 [&](Module &Mod, TargetMachine *TM,
687 LLVMRemarkFileHandle DiagnosticOutputFile) {
688 // Perform optimization and code generation for ThinLTO.
689 if (!opt(Conf, TM, Task, Mod, /*IsThinLTO=*/true,
690 /*ExportSummary=*/nullptr, /*ImportSummary=*/&CombinedIndex,
691 CmdArgs, BitcodeLibFuncs))
692 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
693
694 // Save the current module before the first codegen round.
695 // Note that the second codegen round runs only `codegen()` without
696 // running `opt()`. We're not reaching here as it's bailed out earlier
697 // with `CodeGenOnly` which has been set in `SecondRoundThinBackend`.
698 if (IRAddStream)
699 cgdata::saveModuleForTwoRounds(Mod, Task, IRAddStream);
700
701 codegen(Conf, TM, AddStream, Task, Mod, CombinedIndex);
702 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
703 };
704
706 return OptimizeAndCodegen(Mod, TM.get(), std::move(DiagnosticOutputFile));
707
708 // When linking an ELF shared object, dso_local should be dropped. We
709 // conservatively do this for -fpic.
710 bool ClearDSOLocalOnDeclarations =
711 TM->getTargetTriple().isOSBinFormatELF() &&
712 TM->getRelocationModel() != Reloc::Static &&
713 Mod.getPIELevel() == PIELevel::Default;
714 renameModuleForThinLTO(Mod, CombinedIndex, ClearDSOLocalOnDeclarations);
715
716 dropDeadSymbols(Mod, DefinedGlobals, CombinedIndex);
717
718 thinLTOFinalizeInModule(Mod, DefinedGlobals, /*PropagateAttrs=*/true);
719
720 if (Conf.PostPromoteModuleHook && !Conf.PostPromoteModuleHook(Task, Mod))
721 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
722
723 if (!DefinedGlobals.empty())
724 thinLTOInternalizeModule(Mod, DefinedGlobals);
725
726 if (Conf.PostInternalizeModuleHook &&
727 !Conf.PostInternalizeModuleHook(Task, Mod))
728 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
729
730 auto ModuleLoader = [&](StringRef Identifier) {
731 llvm::TimeTraceScope moduleLoaderScope("Module loader", Identifier);
732 assert(Mod.getContext().isODRUniquingDebugTypes() &&
733 "ODR Type uniquing should be enabled on the context");
734 if (ModuleMap) {
735 auto I = ModuleMap->find(Identifier);
736 assert(I != ModuleMap->end());
737 return I->second.getLazyModule(Mod.getContext(),
738 /*ShouldLazyLoadMetadata=*/true,
739 /*IsImporting*/ true);
740 }
741
743 llvm::MemoryBuffer::getFile(Identifier);
744 if (!MBOrErr)
746 Twine("Error loading imported file ") + Identifier + " : ",
747 MBOrErr.getError()));
748
749 Expected<BitcodeModule> BMOrErr = findThinLTOModule(**MBOrErr);
750 if (!BMOrErr)
752 Twine("Error loading imported file ") + Identifier + " : " +
753 toString(BMOrErr.takeError()),
755
757 BMOrErr->getLazyModule(Mod.getContext(),
758 /*ShouldLazyLoadMetadata=*/true,
759 /*IsImporting*/ true);
760 if (MOrErr)
761 (*MOrErr)->setOwnedMemoryBuffer(std::move(*MBOrErr));
762 return MOrErr;
763 };
764
765 {
766 llvm::TimeTraceScope importScope("Import functions");
767 FunctionImporter Importer(CombinedIndex, ModuleLoader,
768 ClearDSOLocalOnDeclarations);
769 if (Error Err = Importer.importFunctions(Mod, ImportList).takeError())
770 return Err;
771 }
772
773 // Do this after any importing so that imported code is updated.
775
776 if (Conf.PostImportModuleHook && !Conf.PostImportModuleHook(Task, Mod))
777 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
778
779 return OptimizeAndCodegen(Mod, TM.get(), std::move(DiagnosticOutputFile));
780}
781
783 if (ThinLTOAssumeMerged && BMs.size() == 1)
784 return BMs.begin();
785
786 for (BitcodeModule &BM : BMs) {
787 Expected<BitcodeLTOInfo> LTOInfo = BM.getLTOInfo();
788 if (LTOInfo && LTOInfo->IsThinLTO)
789 return &BM;
790 }
791 return nullptr;
792}
793
796 if (!BMsOrErr)
797 return BMsOrErr.takeError();
798
799 // The bitcode file may contain multiple modules, we want the one that is
800 // marked as being the ThinLTO module.
801 if (const BitcodeModule *Bm = lto::findThinLTOModule(*BMsOrErr))
802 return *Bm;
803
804 return make_error<StringError>("Could not find module summary",
806}
807
809 const ModuleSummaryIndex &CombinedIndex,
810 FunctionImporter::ImportMapTy &ImportList) {
812 return true;
813 // We can simply import the values mentioned in the combined index, since
814 // we should only invoke this using the individual indexes written out
815 // via a WriteIndexesThinBackend.
816 for (const auto &GlobalList : CombinedIndex) {
817 // Ignore entries for undefined references.
818 if (GlobalList.second.getSummaryList().empty())
819 continue;
820
821 auto GUID = GlobalList.first;
822 for (const auto &Summary : GlobalList.second.getSummaryList()) {
823 // Skip the summaries for the importing module. These are included to
824 // e.g. record required linkage changes.
825 if (Summary->modulePath() == M.getModuleIdentifier())
826 continue;
827 // Add an entry to provoke importing by thinBackend.
828 ImportList.addGUID(Summary->modulePath(), GUID, Summary->importType());
829 }
830 }
831 return true;
832}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This header provides classes for managing passes over SCCs of the call graph.
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This header defines various interfaces for pass management in LLVM.
static cl::opt< bool > ThinLTOAssumeMerged("thinlto-assume-merged", cl::init(false), cl::desc("Assume the input has already undergone ThinLTO function " "importing and the other pre-optimization pipeline changes."))
static void reportOpenError(StringRef Path, Twine Msg)
static cl::list< std::string > SaveModulesList("filter-save-modules", cl::value_desc("module names"), cl::desc("Only save bitcode for module whose name without " "path matches this for -save-temps options"), cl::CommaSeparated, cl::Hidden)
LTOBitcodeEmbedding
static cl::opt< LTOBitcodeEmbedding > EmbedBitcode("lto-embed-bitcode", cl::init(LTOBitcodeEmbedding::DoNotEmbed), cl::values(clEnumValN(LTOBitcodeEmbedding::DoNotEmbed, "none", "Do not embed"), clEnumValN(LTOBitcodeEmbedding::EmbedOptimized, "optimized", "Embed after all optimization passes"), clEnumValN(LTOBitcodeEmbedding::EmbedPostMergePreOptimized, "post-merge-pre-opt", "Embed post merge, but before optimizations")), cl::desc("Embed LLVM bitcode in object files produced by LTO"))
static void RegisterPassPlugins(const Config &Conf, PassBuilder &PB)
static void splitCodeGen(const Config &C, TargetMachine *TM, AddStreamFn AddStream, unsigned ParallelCodeGenParallelismLevel, Module &Mod, const ModuleSummaryIndex &CombinedIndex)
static void dropDeadSymbols(Module &Mod, const GVSummaryMapTy &DefinedGlobals, const ModuleSummaryIndex &Index)
static Expected< const Target * > initAndLookupTarget(const Config &C, Module &Mod)
static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, unsigned OptLevel, bool IsThinLTO, ModuleSummaryIndex *ExportSummary, const ModuleSummaryIndex *ImportSummary, const DenseSet< StringRef > &BitcodeLibFuncs)
static bool isEmptyModule(const Module &Mod)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
This is the interface to build a ModuleSummaryIndex for a module.
static std::unique_ptr< TargetMachine > createTargetMachine(Function *F, CodeGenOptLevel OptLevel)
Create the TargetMachine object to query the backend for optimization preferences.
CGSCCAnalysisManager CGAM
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
LoopAnalysisManager LAM
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
This header defines a class that provides bookkeeping for all standard (i.e in-tree) pass instrumenta...
#define LLVM_DEBUG(...)
Definition Debug.h:114
static cl::opt< int > ThreadCount("threads", cl::init(0))
Defines the virtual file system interface vfs::FileSystem.
static const char PassName[]
A manager for alias analyses.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
Represents a module in a bitcode file.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition DenseMap.h:205
bool empty() const
Definition DenseMap.h:109
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
Represents either an error or a value T.
Definition ErrorOr.h:56
std::error_code getError() const
Definition ErrorOr.h:152
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
Error takeError()
Take ownership of the stored error.
Definition Error.h:612
reference get()
Returns a reference to the stored T value.
Definition Error.h:582
The map maintains the list of imports.
void addGUID(StringRef FromModule, GlobalValue::GUID GUID, GlobalValueSummary::ImportKind ImportKind)
The function importer is automatically importing function from other modules based on the provided su...
LLVM_ABI Expected< bool > importFunctions(Module &M, const ImportMapTy &ImportList)
Import functions in Module M based on the supplied import list.
Function and variable summary information to aid decisions and implementation of importing.
RAII handle that manages the lifetime of the ToolOutputFile used to output remarks.
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
iterator end()
Definition MapVector.h:67
iterator find(const KeyT &Key)
Definition MapVector.h:154
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
Class to hold module path string table and global value map, and encapsulate methods for operating on...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
iterator begin() const
Definition ArrayRef.h:342
static LLVM_ABI const OptimizationLevel O3
Optimize for fast execution as much as possible.
static LLVM_ABI const OptimizationLevel O0
Disable as many optimizations as possible.
static LLVM_ABI const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static LLVM_ABI const OptimizationLevel O1
Optimize quickly without destroying debuggability.
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs)
Run all of the passes in this manager over the given unit of IR.
A loaded pass plugin.
Definition PassPlugin.h:71
static LLVM_ABI Expected< PassPlugin > Load(const std::string &Filename)
Attempts to load a pass plugin from a given file.
void registerPassBuilderCallbacks(PassBuilder &PB) const
Invoke the PassBuilder callback registration.
Definition PassPlugin.h:93
void wait() override
Blocking wait for all the tasks to execute first.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
StringRef str() const
Explicit conversion to StringRef.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class provides an interface to register all the standard pass instrumentations and manages their...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Manages the enabling and disabling of subtarget specific features.
LLVM_ABI void getDefaultSubtargetFeatures(const Triple &Triple)
Adds the default features for the specified target triple.
LLVM_ABI std::string getString() const
Returns features as a string.
LLVM_ABI void AddFeature(StringRef String, bool Enable=true)
Adds Features.
Analysis pass providing the TargetLibraryInfo.
Implementation of the target library information.
Provides information about what library functions are available for the current target.
StringRef getName(LibFunc F) const
Primary interface to the complete machine description for the target machine.
virtual bool addPassesToEmitFile(PassManagerBase &, raw_pwrite_stream &, raw_pwrite_stream *, CodeGenFileType, bool=true, MachineModuleInfoWrapperPass *MMIWP=nullptr)
Add passes to the specified pass manager to get the specified file emitted.
const Triple & getTargetTriple() const
virtual bool splitModule(Module &M, unsigned NumParts, function_ref< void(std::unique_ptr< Module > MPart)> ModuleCallback)
Entry point for module splitting.
TargetOptions Options
const Target & getTarget() const
void setPGOOption(std::optional< PGOOptions > PGOOpt)
MCTargetOptions MCOptions
Machine level options.
FloatABI::ABIType FloatABIType
FloatABIType - This setting is set by -float-abi=xxx option is specfied on the command line.
VectorLibrary VecLib
Vector math library to use.
std::string ObjectFilenameForDebug
Stores the filename/path of the final .o/.obj file, to be written in the debug information.
EABI EABIVersion
EABIVersion - This flag specifies the EABI version.
ExceptionHandling ExceptionModel
What exception model to use.
Target - Wrapper for Target specific information.
TargetMachine * createTargetMachine(const Triple &TT, StringRef CPU, StringRef Features, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM=std::nullopt, CodeGenOptLevel OL=CodeGenOptLevel::Default, bool JIT=false) const
createTargetMachine - Create a target specific machine implementation for the specified Triple.
auto async(Function &&F, Args &&...ArgList)
Asynchronous submission of a task to the pool.
Definition ThreadPool.h:80
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
void keep()
Indicate that the tool's job wrt this output file has been successful and the file should not be dele...
raw_fd_ostream & os()
Return the contained raw_fd_ostream.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
Create a verifier pass.
Definition Verifier.h:134
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:175
PassManager manages ModulePassManagers.
void add(Pass *P) override
Add a pass to the queue of passes to run.
bool run(Module &M)
run - Execute all of the passes scheduled for execution.
A raw_ostream that writes to a file descriptor.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
Interfaces for registering analysis passes, producing common pass manager configurations,...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
Definition Attributor.h:165
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI void saveModuleForTwoRounds(const Module &TheModule, unsigned Task, AddStreamFn AddStream)
Save TheModule before the first codegen round.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
LLVM_ABI bool opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod, bool IsThinLTO, ModuleSummaryIndex *ExportSummary, const ModuleSummaryIndex *ImportSummary, const std::vector< uint8_t > &CmdArgs, ArrayRef< StringRef > BitcodeLibFuncs)
Runs middle-end LTO optimizations on Mod.
LLVM_ABI Error thinBackend(const Config &C, unsigned Task, AddStreamFn AddStream, Module &M, const ModuleSummaryIndex &CombinedIndex, const FunctionImporter::ImportMapTy &ImportList, const GVSummaryMapTy &DefinedGlobals, MapVector< StringRef, BitcodeModule > *ModuleMap, bool CodeGenOnly, ArrayRef< StringRef > BitcodeLibFuncs, AddStreamFn IRAddStream=nullptr, const std::vector< uint8_t > &CmdArgs=std::vector< uint8_t >())
Runs a ThinLTO backend.
LLVM_ABI BitcodeModule * findThinLTOModule(MutableArrayRef< BitcodeModule > BMs)
Returns the BitcodeModule that is ThinLTO.
LLVM_ABI Error backend(const Config &C, AddStreamFn AddStream, unsigned ParallelCodeGenParallelismLevel, Module &M, ModuleSummaryIndex &CombinedIndex, ArrayRef< StringRef > BitcodeLibFuncs)
Runs a regular LTO backend.
LLVM_ABI Error finalizeOptimizationRemarks(LLVMRemarkFileHandle DiagOutputFile)
LLVM_ABI Expected< LLVMRemarkFileHandle > setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses, StringRef RemarksFormat, bool RemarksWithHotness, std::optional< uint64_t > RemarksHotnessThreshold=0, int Count=-1)
Setup optimization remarks.
Definition LTO.cpp:2301
LLVM_ABI bool initImportList(const Module &M, const ModuleSummaryIndex &CombinedIndex, FunctionImporter::ImportMapTy &ImportList)
Distributed ThinLTO: collect the referenced modules based on module summary and initialize ImportList...
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition FileSystem.h:777
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
Definition FileSystem.h:786
LLVM_ABI std::error_code create_directories(const Twine &path, bool IgnoreExisting=true, perms Perms=owner_all|group_all)
Create all the non-existent directories in path.
Definition Path.cpp:977
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
Definition Path.cpp:578
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
Definition Path.cpp:457
This is an optimization pass for GlobalISel generic memory operations.
ThreadPoolStrategy heavyweight_hardware_concurrency(unsigned ThreadCount=0)
Returns a thread strategy for tasks requiring significant memory or other resources.
Definition Threading.h:167
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI void WriteBitcodeToFile(const Module &M, raw_ostream &Out, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the specified raw output stream.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition Error.cpp:94
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
DenseMap< GlobalValue::GUID, GlobalValueSummary * > GVSummaryMapTy
Map of global value GUID to its summary, used to identify values defined in a particular module,...
LLVM_ABI bool convertToDeclaration(GlobalValue &GV)
Converts value GV to declaration, or replaces with a declaration if it is an alias.
std::string utostr(uint64_t X, bool isNeg=false)
LLVM_ABI void renameModuleForThinLTO(Module &M, const ModuleSummaryIndex &Index, bool ClearDSOLocalOnDeclarations, SetVector< GlobalValue * > *GlobalsToImport=nullptr)
Perform in-place global value handling on the given Module for exported local functions renamed and p...
AnalysisManager< LazyCallGraph::SCC, LazyCallGraph & > CGSCCAnalysisManager
The CGSCC analysis manager.
LLVM_ABI void writeIndexToFile(const ModuleSummaryIndex &Index, raw_ostream &Out, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex=nullptr, const GVSummaryPtrSet *DecSummaries=nullptr)
Write the specified module summary index to the given raw output stream, where it will be written in ...
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
LLVM_ABI void embedBitcodeInModule(Module &M, MemoryBufferRef Buf, bool EmbedBitcode, bool EmbedCmdline, const std::vector< uint8_t > &CmdArgs)
If EmbedBitcode is set, save a copy of the llvm IR as data in the __LLVM,__bitcode section (....
LLVM_ABI void SplitModule(Module &M, unsigned N, function_ref< void(std::unique_ptr< Module > MPart)> ModuleCallback, bool PreserveLocals=false, bool RoundRobin=false)
Splits the module M into N linkable partitions.
LLVM_ABI cl::opt< bool > PrintPipelinePasses
Common option used by multiple tools to print pipeline passes.
LLVM_ABI void updatePublicTypeTestCalls(Module &M, bool WholeProgramVisibilityEnabledInLTO)
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
cl::opt< bool > NoPGOWarnMismatch
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
Definition Error.h:340
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
LLVM_ABI void thinLTOInternalizeModule(Module &TheModule, const GVSummaryMapTy &DefinedGlobals)
Internalize TheModule based on the information recorded in the summaries during global summary-based ...
SingleThreadExecutor DefaultThreadPool
Definition ThreadPool.h:262
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
LLVM_ABI ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
Definition Error.cpp:107
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
std::function< Expected< std::unique_ptr< CachedFileStream > >( unsigned Task, const Twine &ModuleName)> AddStreamFn
This type defines the callback to add a file that is generated on the fly.
Definition Caching.h:58
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
LLVM_ABI void thinLTOFinalizeInModule(Module &TheModule, const GVSummaryMapTy &DefinedGlobals, bool PropagateAttrs)
Based on the information recorded in the summaries during global summary-based analysis:
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
A struct capturing PGO tunables.
Definition PGOOptions.h:22
static const Target * lookupTarget(StringRef TripleStr, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
LTO configuration.
Definition Config.h:43
std::function< bool(unsigned Task, const Module &)> ModuleHookFn
The following callbacks deal with tasks, which normally represent the entire optimization and code ge...
Definition Config.h:236
bool DebugPassManager
Whether to emit the pass manager debuggging informations.
Definition Config.h:183
bool AddFSDiscriminator
Add FSAFDO discriminators.
Definition Config.h:201
std::optional< uint64_t > RemarksHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
Definition Config.h:177
LLVM_ABI Error addSaveTemps(std::string OutputFileName, bool UseInputModulePath=false, const DenseSet< StringRef > &SaveTempsArgs={})
This is a convenience function that configures this Config object to write temporary files named afte...
ModuleHookFn PreOptModuleHook
This module hook is called after linking (regular LTO) or loading (ThinLTO) the module,...
Definition Config.h:240
CombinedIndexHookFn CombinedIndexHook
Definition Config.h:272
std::optional< CodeModel::Model > CodeModel
Definition Config.h:63
std::string AAPipeline
Definition Config.h:122
std::function< void(legacy::PassManager &)> PreCodeGenPassesHook
For adding passes that run right before codegen.
Definition Config.h:61
bool DisableVerify
Definition Config.h:68
std::vector< std::string > MAttrs
Definition Config.h:52
CodeGenOptLevel CGOptLevel
Definition Config.h:64
PipelineTuningOptions PTO
Tunable parameters for passes in the default pipelines.
Definition Config.h:210
std::vector< llvm::PassPlugin * > LoadedPassPlugins
Definition Config.h:58
std::unique_ptr< raw_ostream > ResolutionFile
If this field is set, LTO will write input file paths and symbol resolutions here in llvm-lto2 comman...
Definition Config.h:207
std::string CPU
Definition Config.h:50
std::string DwoDir
The directory to store .dwo files.
Definition Config.h:142
std::string RemarksFilename
Optimization remarks file path.
Definition Config.h:156
std::vector< std::string > PassPluginFilenames
Definition Config.h:59
ModuleHookFn PostPromoteModuleHook
This hook is called after promoting any internal functions (ThinLTO-specific).
Definition Config.h:244
std::string ProfileRemapping
Name remapping file for profile data.
Definition Config.h:139
TargetOptions Options
Definition Config.h:51
std::string SplitDwarfFile
The name for the split debug info file used for the DW_AT_[GNU_]dwo_name attribute in the skeleton CU...
Definition Config.h:148
std::string SplitDwarfOutput
The path to write a .dwo file to.
Definition Config.h:153
ModuleHookFn PostOptModuleHook
This module hook is called after optimization is complete.
Definition Config.h:253
std::string RemarksPasses
Optimization remarks pass filter.
Definition Config.h:159
std::string OptPipeline
If this field is set, the set of passes run in the middle-end optimizer will be the one specified by ...
Definition Config.h:117
bool RunCSIRInstr
Run PGO context sensitive IR instrumentation.
Definition Config.h:78
ModuleHookFn PostInternalizeModuleHook
This hook is called after internalizing the module.
Definition Config.h:247
unsigned OptLevel
Definition Config.h:66
ModuleHookFn PostImportModuleHook
This hook is called after importing from other modules (ThinLTO-specific).
Definition Config.h:250
bool RemarksWithHotness
Whether to emit optimization remarks with hotness informations.
Definition Config.h:162
std::string CSIRProfile
Context Sensitive PGO profile path.
Definition Config.h:133
ModuleHookFn PreCodeGenModuleHook
This module hook is called before code generation.
Definition Config.h:258
std::optional< Reloc::Model > RelocModel
Definition Config.h:62
bool ShouldDiscardValueNames
Definition Config.h:197
bool PGOWarnMismatch
Turn on/off the warning about a hash mismatch in the PGO profile data.
Definition Config.h:81
CodeGenFileType CGFileType
Definition Config.h:65
bool Freestanding
Flag to indicate that the optimizer should not assume builtins are present on the target.
Definition Config.h:72
std::string SampleProfile
Sample PGO profile path.
Definition Config.h:136
std::string RemarksFormat
The format used for serializing remarks (default: YAML).
Definition Config.h:180
A derived class of LLVMContext that initializes itself according to a given Config object.
Definition Config.h:311