LLVM 22.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"
26#include "llvm/IR/PassManager.h"
27#include "llvm/IR/Verifier.h"
28#include "llvm/LTO/LTO.h"
34#include "llvm/Support/Error.h"
37#include "llvm/Support/Path.h"
47#include <optional>
48
49using namespace llvm;
50using namespace lto;
51
52#define DEBUG_TYPE "lto-backend"
53
59
61 "lto-embed-bitcode", cl::init(LTOBitcodeEmbedding::DoNotEmbed),
63 "Do not embed"),
65 "Embed after all optimization passes"),
67 "post-merge-pre-opt",
68 "Embed post merge, but before optimizations")),
69 cl::desc("Embed LLVM bitcode in object files produced by LTO"));
70
72 "thinlto-assume-merged", cl::init(false),
73 cl::desc("Assume the input has already undergone ThinLTO function "
74 "importing and the other pre-optimization pipeline changes."));
75
76namespace llvm {
78}
79
80[[noreturn]] static void reportOpenError(StringRef Path, Twine Msg) {
81 errs() << "failed to open " << Path << ": " << Msg << '\n';
82 errs().flush();
83 exit(1);
84}
85
86Error Config::addSaveTemps(std::string OutputFileName, bool UseInputModulePath,
87 const DenseSet<StringRef> &SaveTempsArgs) {
89
90 std::error_code EC;
91 if (SaveTempsArgs.empty() || SaveTempsArgs.contains("resolution")) {
93 std::make_unique<raw_fd_ostream>(OutputFileName + "resolution.txt", EC,
95 if (EC) {
96 ResolutionFile.reset();
97 return errorCodeToError(EC);
98 }
99 }
100
101 auto setHook = [&](std::string PathSuffix, ModuleHookFn &Hook) {
102 // Keep track of the hook provided by the linker, which also needs to run.
103 ModuleHookFn LinkerHook = Hook;
104 Hook = [=](unsigned Task, const Module &M) {
105 // If the linker's hook returned false, we need to pass that result
106 // through.
107 if (LinkerHook && !LinkerHook(Task, M))
108 return false;
109
110 std::string PathPrefix;
111 // If this is the combined module (not a ThinLTO backend compile) or the
112 // user hasn't requested using the input module's path, emit to a file
113 // named from the provided OutputFileName with the Task ID appended.
114 if (M.getModuleIdentifier() == "ld-temp.o" || !UseInputModulePath) {
115 PathPrefix = OutputFileName;
116 if (Task != (unsigned)-1)
117 PathPrefix += utostr(Task) + ".";
118 } else
119 PathPrefix = M.getModuleIdentifier() + ".";
120 std::string Path = PathPrefix + PathSuffix + ".bc";
121 std::error_code EC;
123 // Because -save-temps is a debugging feature, we report the error
124 // directly and exit.
125 if (EC)
126 reportOpenError(Path, EC.message());
127 WriteBitcodeToFile(M, OS, /*ShouldPreserveUseListOrder=*/false);
128 return true;
129 };
130 };
131
132 auto SaveCombinedIndex =
133 [=](const ModuleSummaryIndex &Index,
134 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
135 std::string Path = OutputFileName + "index.bc";
136 std::error_code EC;
138 // Because -save-temps is a debugging feature, we report the error
139 // directly and exit.
140 if (EC)
141 reportOpenError(Path, EC.message());
142 writeIndexToFile(Index, OS);
143
144 Path = OutputFileName + "index.dot";
146 if (EC)
147 reportOpenError(Path, EC.message());
148 Index.exportToDot(OSDot, GUIDPreservedSymbols);
149 return true;
150 };
151
152 if (SaveTempsArgs.empty()) {
153 setHook("0.preopt", PreOptModuleHook);
154 setHook("1.promote", PostPromoteModuleHook);
155 setHook("2.internalize", PostInternalizeModuleHook);
156 setHook("3.import", PostImportModuleHook);
157 setHook("4.opt", PostOptModuleHook);
158 setHook("5.precodegen", PreCodeGenModuleHook);
159 CombinedIndexHook = SaveCombinedIndex;
160 } else {
161 if (SaveTempsArgs.contains("preopt"))
162 setHook("0.preopt", PreOptModuleHook);
163 if (SaveTempsArgs.contains("promote"))
164 setHook("1.promote", PostPromoteModuleHook);
165 if (SaveTempsArgs.contains("internalize"))
166 setHook("2.internalize", PostInternalizeModuleHook);
167 if (SaveTempsArgs.contains("import"))
168 setHook("3.import", PostImportModuleHook);
169 if (SaveTempsArgs.contains("opt"))
170 setHook("4.opt", PostOptModuleHook);
171 if (SaveTempsArgs.contains("precodegen"))
172 setHook("5.precodegen", PreCodeGenModuleHook);
173 if (SaveTempsArgs.contains("combinedindex"))
174 CombinedIndexHook = SaveCombinedIndex;
175 }
176
177 return Error::success();
178}
179
180#define HANDLE_EXTENSION(Ext) \
181 llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
182#include "llvm/Support/Extension.def"
183#undef HANDLE_EXTENSION
184
186 PassBuilder &PB) {
187#define HANDLE_EXTENSION(Ext) \
188 get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
189#include "llvm/Support/Extension.def"
190#undef HANDLE_EXTENSION
191
192 // Load requested pass plugins and let them register pass builder callbacks
193 for (auto &PluginFN : PassPlugins) {
194 auto PassPlugin = PassPlugin::Load(PluginFN);
195 if (!PassPlugin)
198 }
199}
200
201static std::unique_ptr<TargetMachine>
202createTargetMachine(const Config &Conf, const Target *TheTarget, Module &M) {
203 const Triple &TheTriple = M.getTargetTriple();
204 SubtargetFeatures Features;
205 Features.getDefaultSubtargetFeatures(TheTriple);
206 for (const std::string &A : Conf.MAttrs)
207 Features.AddFeature(A);
208
209 std::optional<Reloc::Model> RelocModel;
210 if (Conf.RelocModel)
211 RelocModel = *Conf.RelocModel;
212 else if (M.getModuleFlag("PIC Level"))
213 RelocModel =
214 M.getPICLevel() == PICLevel::NotPIC ? Reloc::Static : Reloc::PIC_;
215
216 std::optional<CodeModel::Model> CodeModel;
217 if (Conf.CodeModel)
218 CodeModel = *Conf.CodeModel;
219 else
220 CodeModel = M.getCodeModel();
221
222 TargetOptions TargetOpts = Conf.Options;
223 if (TargetOpts.MCOptions.ABIName.empty()) {
224 TargetOpts.MCOptions.ABIName = M.getTargetABIFromMD();
225 }
226
227 std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine(
228 TheTriple, Conf.CPU, Features.getString(), TargetOpts, RelocModel,
229 CodeModel, Conf.CGOptLevel));
230
231 assert(TM && "Failed to create target machine");
232
233 if (std::optional<uint64_t> LargeDataThreshold = M.getLargeDataThreshold())
234 TM->setLargeDataThreshold(*LargeDataThreshold);
235
236 return TM;
237}
238
239static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
240 unsigned OptLevel, bool IsThinLTO,
241 ModuleSummaryIndex *ExportSummary,
242 const ModuleSummaryIndex *ImportSummary) {
243 auto FS = vfs::getRealFileSystem();
244 std::optional<PGOOptions> PGOOpt;
245 if (!Conf.SampleProfile.empty())
246 PGOOpt = PGOOptions(Conf.SampleProfile, "", Conf.ProfileRemapping,
247 /*MemoryProfile=*/"", FS, PGOOptions::SampleUse,
250 else if (Conf.RunCSIRInstr) {
251 PGOOpt = PGOOptions("", Conf.CSIRProfile, Conf.ProfileRemapping,
252 /*MemoryProfile=*/"", FS, PGOOptions::IRUse,
254 Conf.AddFSDiscriminator);
255 } else if (!Conf.CSIRProfile.empty()) {
256 PGOOpt = PGOOptions(Conf.CSIRProfile, "", Conf.ProfileRemapping,
257 /*MemoryProfile=*/"", FS, PGOOptions::IRUse,
259 Conf.AddFSDiscriminator);
261 } else if (Conf.AddFSDiscriminator) {
262 PGOOpt = PGOOptions("", "", "", /*MemoryProfile=*/"", nullptr,
265 }
266 TM->setPGOOption(PGOOpt);
267
272
275 Conf.VerifyEach);
276 SI.registerCallbacks(PIC, &MAM);
277 PassBuilder PB(TM, Conf.PTO, PGOOpt, &PIC);
278
280
281 std::unique_ptr<TargetLibraryInfoImpl> TLII(
282 new TargetLibraryInfoImpl(TM->getTargetTriple()));
283 if (Conf.Freestanding)
284 TLII->disableAllFunctions();
285 FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
286
287 // Parse a custom AA pipeline if asked to.
288 if (!Conf.AAPipeline.empty()) {
290 if (auto Err = PB.parseAAPipeline(AA, Conf.AAPipeline)) {
291 report_fatal_error(Twine("unable to parse AA pipeline description '") +
292 Conf.AAPipeline + "': " + toString(std::move(Err)));
293 }
294 // Register the AA manager first so that our version is the one used.
295 FAM.registerPass([&] { return std::move(AA); });
296 }
297
298 // Register all the basic analyses with the managers.
299 PB.registerModuleAnalyses(MAM);
300 PB.registerCGSCCAnalyses(CGAM);
301 PB.registerFunctionAnalyses(FAM);
302 PB.registerLoopAnalyses(LAM);
303 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
304
306
307 if (!Conf.DisableVerify)
308 MPM.addPass(VerifierPass());
309
311
312 switch (OptLevel) {
313 default:
314 llvm_unreachable("Invalid optimization level");
315 case 0:
317 break;
318 case 1:
320 break;
321 case 2:
323 break;
324 case 3:
326 break;
327 }
328
329 // Parse a custom pipeline if asked to.
330 if (!Conf.OptPipeline.empty()) {
331 if (auto Err = PB.parsePassPipeline(MPM, Conf.OptPipeline)) {
332 report_fatal_error(Twine("unable to parse pass pipeline description '") +
333 Conf.OptPipeline + "': " + toString(std::move(Err)));
334 }
335 } else if (IsThinLTO) {
336 MPM.addPass(PB.buildThinLTODefaultPipeline(OL, ImportSummary));
337 } else {
338 MPM.addPass(PB.buildLTODefaultPipeline(OL, ExportSummary));
339 }
340
341 if (!Conf.DisableVerify)
342 MPM.addPass(VerifierPass());
343
345 std::string PipelineStr;
346 raw_string_ostream OS(PipelineStr);
347 MPM.printPipeline(OS, [&PIC](StringRef ClassName) {
348 auto PassName = PIC.getPassNameForClassName(ClassName);
349 return PassName.empty() ? ClassName : PassName;
350 });
351 outs() << "pipeline-passes: " << PipelineStr << '\n';
352 }
353
354 MPM.run(Mod, MAM);
355}
356
357static bool isEmptyModule(const Module &Mod) {
358 // Module is empty if it has no functions, no globals, no inline asm and no
359 // named metadata (aliases and ifuncs require functions or globals so we
360 // don't need to check those explicitly).
361 return Mod.empty() && Mod.global_empty() && Mod.named_metadata_empty() &&
362 Mod.getModuleInlineAsm().empty();
363}
364
365bool lto::opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod,
366 bool IsThinLTO, ModuleSummaryIndex *ExportSummary,
367 const ModuleSummaryIndex *ImportSummary,
368 const std::vector<uint8_t> &CmdArgs) {
369 llvm::TimeTraceScope timeScope("opt");
371 // FIXME: the motivation for capturing post-merge bitcode and command line
372 // is replicating the compilation environment from bitcode, without needing
373 // to understand the dependencies (the functions to be imported). This
374 // assumes a clang - based invocation, case in which we have the command
375 // line.
376 // It's not very clear how the above motivation would map in the
377 // linker-based case, so we currently don't plumb the command line args in
378 // that case.
379 if (CmdArgs.empty())
381 dbgs() << "Post-(Thin)LTO merge bitcode embedding was requested, but "
382 "command line arguments are not available");
384 /*EmbedBitcode*/ true, /*EmbedCmdline*/ true,
385 /*Cmdline*/ CmdArgs);
386 }
387 // No need to run any opt passes if the module is empty.
388 // In theory these passes should take almost no time for an empty
389 // module, however, this guards against doing any unnecessary summary-based
390 // analysis in the case of a ThinLTO build where this might be an empty
391 // regular LTO combined module, with a large combined index from ThinLTO.
392 if (!isEmptyModule(Mod)) {
393 // FIXME: Plumb the combined index into the new pass manager.
394 runNewPMPasses(Conf, Mod, TM, Conf.OptLevel, IsThinLTO, ExportSummary,
395 ImportSummary);
396 }
397 return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod);
398}
399
400static void codegen(const Config &Conf, TargetMachine *TM,
401 AddStreamFn AddStream, unsigned Task, Module &Mod,
402 const ModuleSummaryIndex &CombinedIndex) {
403 llvm::TimeTraceScope timeScope("codegen");
404 if (Conf.PreCodeGenModuleHook && !Conf.PreCodeGenModuleHook(Task, Mod))
405 return;
406
409 /*EmbedBitcode*/ true,
410 /*EmbedCmdline*/ false,
411 /*CmdArgs*/ std::vector<uint8_t>());
412
413 std::unique_ptr<ToolOutputFile> DwoOut;
415 if (!Conf.DwoDir.empty()) {
416 std::error_code EC;
417 if (auto EC = llvm::sys::fs::create_directories(Conf.DwoDir))
418 report_fatal_error(Twine("Failed to create directory ") + Conf.DwoDir +
419 ": " + EC.message());
420
421 DwoFile = Conf.DwoDir;
422 sys::path::append(DwoFile, std::to_string(Task) + ".dwo");
423 TM->Options.MCOptions.SplitDwarfFile = std::string(DwoFile);
424 } else
425 TM->Options.MCOptions.SplitDwarfFile = Conf.SplitDwarfFile;
426
427 if (!DwoFile.empty()) {
428 std::error_code EC;
429 DwoOut = std::make_unique<ToolOutputFile>(DwoFile, EC, sys::fs::OF_None);
430 if (EC)
431 report_fatal_error(Twine("Failed to open ") + DwoFile + ": " +
432 EC.message());
433 }
434
436 AddStream(Task, Mod.getModuleIdentifier());
437 if (Error Err = StreamOrErr.takeError())
438 report_fatal_error(std::move(Err));
439 std::unique_ptr<CachedFileStream> &Stream = *StreamOrErr;
440 TM->Options.ObjectFilenameForDebug = Stream->ObjectPathName;
441
442 // Create the codegen pipeline in its own scope so it gets deleted before
443 // Stream->commit() is called. The commit function of CacheStream deletes
444 // the raw stream, which is too early as streamers (e.g. MCAsmStreamer)
445 // keep the pointer and may use it until their destruction. See #138194.
446 {
447 legacy::PassManager CodeGenPasses;
448 TargetLibraryInfoImpl TLII(Mod.getTargetTriple());
449 CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
450 // No need to make index available if the module is empty.
451 // In theory these passes should not use the index for an empty
452 // module, however, this guards against doing any unnecessary summary-based
453 // analysis in the case of a ThinLTO build where this might be an empty
454 // regular LTO combined module, with a large combined index from ThinLTO.
455 if (!isEmptyModule(Mod))
456 CodeGenPasses.add(
458 if (Conf.PreCodeGenPassesHook)
459 Conf.PreCodeGenPassesHook(CodeGenPasses);
460 if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS,
461 DwoOut ? &DwoOut->os() : nullptr,
462 Conf.CGFileType))
463 report_fatal_error("Failed to setup codegen");
464 CodeGenPasses.run(Mod);
465
466 if (DwoOut)
467 DwoOut->keep();
468 }
469
470 if (Error Err = Stream->commit())
471 report_fatal_error(std::move(Err));
472}
473
474static void splitCodeGen(const Config &C, TargetMachine *TM,
475 AddStreamFn AddStream,
476 unsigned ParallelCodeGenParallelismLevel, Module &Mod,
477 const ModuleSummaryIndex &CombinedIndex) {
478 DefaultThreadPool CodegenThreadPool(
479 heavyweight_hardware_concurrency(ParallelCodeGenParallelismLevel));
480 unsigned ThreadCount = 0;
481 const Target *T = &TM->getTarget();
482
483 const auto HandleModulePartition =
484 [&](std::unique_ptr<Module> MPart) {
485 // We want to clone the module in a new context to multi-thread the
486 // codegen. We do it by serializing partition modules to bitcode
487 // (while still on the main thread, in order to avoid data races) and
488 // spinning up new threads which deserialize the partitions into
489 // separate contexts.
490 // FIXME: Provide a more direct way to do this in LLVM.
492 raw_svector_ostream BCOS(BC);
493 WriteBitcodeToFile(*MPart, BCOS);
494
495 // Enqueue the task
496 CodegenThreadPool.async(
497 [&](const SmallString<0> &BC, unsigned ThreadId) {
498 LTOLLVMContext Ctx(C);
500 parseBitcodeFile(MemoryBufferRef(BC.str(), "ld-temp.o"), Ctx);
501 if (!MOrErr)
502 report_fatal_error("Failed to read bitcode");
503 std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.get());
504
505 std::unique_ptr<TargetMachine> TM =
506 createTargetMachine(C, T, *MPartInCtx);
507
508 codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx,
509 CombinedIndex);
510 },
511 // Pass BC using std::move to ensure that it get moved rather than
512 // copied into the thread's context.
513 std::move(BC), ThreadCount++);
514 };
515
516 // Try target-specific module splitting first, then fallback to the default.
517 if (!TM->splitModule(Mod, ParallelCodeGenParallelismLevel,
518 HandleModulePartition)) {
519 SplitModule(Mod, ParallelCodeGenParallelismLevel, HandleModulePartition,
520 false);
521 }
522
523 // Because the inner lambda (which runs in a worker thread) captures our local
524 // variables, we need to wait for the worker threads to terminate before we
525 // can leave the function scope.
526 CodegenThreadPool.wait();
527}
528
530 Module &Mod) {
531 if (!C.OverrideTriple.empty())
532 Mod.setTargetTriple(Triple(C.OverrideTriple));
533 else if (Mod.getTargetTriple().empty())
534 Mod.setTargetTriple(Triple(C.DefaultTriple));
535
536 std::string Msg;
537 const Target *T = TargetRegistry::lookupTarget(Mod.getTargetTriple(), Msg);
538 if (!T)
540 return T;
541}
542
544 std::unique_ptr<ToolOutputFile> DiagOutputFile) {
545 // Make sure we flush the diagnostic remarks file in case the linker doesn't
546 // call the global destructors before exiting.
547 if (!DiagOutputFile)
548 return Error::success();
549 DiagOutputFile->keep();
550 DiagOutputFile->os().flush();
551 return Error::success();
552}
553
555 unsigned ParallelCodeGenParallelismLevel, Module &Mod,
556 ModuleSummaryIndex &CombinedIndex) {
557 llvm::TimeTraceScope timeScope("LTO backend");
559 if (!TOrErr)
560 return TOrErr.takeError();
561
562 std::unique_ptr<TargetMachine> TM = createTargetMachine(C, *TOrErr, Mod);
563
564 LLVM_DEBUG(dbgs() << "Running regular LTO\n");
565 if (!C.CodeGenOnly) {
566 if (!opt(C, TM.get(), 0, Mod, /*IsThinLTO=*/false,
567 /*ExportSummary=*/&CombinedIndex, /*ImportSummary=*/nullptr,
568 /*CmdArgs*/ std::vector<uint8_t>()))
569 return Error::success();
570 }
571
572 if (ParallelCodeGenParallelismLevel == 1) {
573 codegen(C, TM.get(), AddStream, 0, Mod, CombinedIndex);
574 } else {
575 splitCodeGen(C, TM.get(), AddStream, ParallelCodeGenParallelismLevel, Mod,
576 CombinedIndex);
577 }
578 return Error::success();
579}
580
581static void dropDeadSymbols(Module &Mod, const GVSummaryMapTy &DefinedGlobals,
582 const ModuleSummaryIndex &Index) {
583 llvm::TimeTraceScope timeScope("Drop dead symbols");
584 std::vector<GlobalValue*> DeadGVs;
585 for (auto &GV : Mod.global_values())
586 if (GlobalValueSummary *GVS = DefinedGlobals.lookup(GV.getGUID()))
587 if (!Index.isGlobalValueLive(GVS)) {
588 DeadGVs.push_back(&GV);
590 }
591
592 // Now that all dead bodies have been dropped, delete the actual objects
593 // themselves when possible.
594 for (GlobalValue *GV : DeadGVs) {
595 GV->removeDeadConstantUsers();
596 // Might reference something defined in native object (i.e. dropped a
597 // non-prevailing IR def, but we need to keep the declaration).
598 if (GV->use_empty())
599 GV->eraseFromParent();
600 }
601}
602
603Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream,
604 Module &Mod, const ModuleSummaryIndex &CombinedIndex,
605 const FunctionImporter::ImportMapTy &ImportList,
606 const GVSummaryMapTy &DefinedGlobals,
608 bool CodeGenOnly, AddStreamFn IRAddStream,
609 const std::vector<uint8_t> &CmdArgs) {
610 llvm::TimeTraceScope timeScope("Thin backend", Mod.getModuleIdentifier());
612 if (!TOrErr)
613 return TOrErr.takeError();
614
615 std::unique_ptr<TargetMachine> TM = createTargetMachine(Conf, *TOrErr, Mod);
616
617 // Setup optimization remarks.
618 auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
619 Mod.getContext(), Conf.RemarksFilename, Conf.RemarksPasses,
621 Task);
622 if (!DiagFileOrErr)
623 return DiagFileOrErr.takeError();
624 auto DiagnosticOutputFile = std::move(*DiagFileOrErr);
625
626 // Set the partial sample profile ratio in the profile summary module flag of
627 // the module, if applicable.
628 Mod.setPartialSampleProfileRatio(CombinedIndex);
629
630 LLVM_DEBUG(dbgs() << "Running ThinLTO\n");
631 if (CodeGenOnly) {
632 // If CodeGenOnly is set, we only perform code generation and skip
633 // optimization. This value may differ from Conf.CodeGenOnly.
634 codegen(Conf, TM.get(), AddStream, Task, Mod, CombinedIndex);
635 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
636 }
637
638 if (Conf.PreOptModuleHook && !Conf.PreOptModuleHook(Task, Mod))
639 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
640
641 auto OptimizeAndCodegen =
642 [&](Module &Mod, TargetMachine *TM,
643 std::unique_ptr<ToolOutputFile> DiagnosticOutputFile) {
644 // Perform optimization and code generation for ThinLTO.
645 if (!opt(Conf, TM, Task, Mod, /*IsThinLTO=*/true,
646 /*ExportSummary=*/nullptr, /*ImportSummary=*/&CombinedIndex,
647 CmdArgs))
648 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
649
650 // Save the current module before the first codegen round.
651 // Note that the second codegen round runs only `codegen()` without
652 // running `opt()`. We're not reaching here as it's bailed out earlier
653 // with `CodeGenOnly` which has been set in `SecondRoundThinBackend`.
654 if (IRAddStream)
655 cgdata::saveModuleForTwoRounds(Mod, Task, IRAddStream);
656
657 codegen(Conf, TM, AddStream, Task, Mod, CombinedIndex);
658 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
659 };
660
662 return OptimizeAndCodegen(Mod, TM.get(), std::move(DiagnosticOutputFile));
663
664 // When linking an ELF shared object, dso_local should be dropped. We
665 // conservatively do this for -fpic.
666 bool ClearDSOLocalOnDeclarations =
667 TM->getTargetTriple().isOSBinFormatELF() &&
668 TM->getRelocationModel() != Reloc::Static &&
669 Mod.getPIELevel() == PIELevel::Default;
670 renameModuleForThinLTO(Mod, CombinedIndex, ClearDSOLocalOnDeclarations);
671
672 dropDeadSymbols(Mod, DefinedGlobals, CombinedIndex);
673
674 thinLTOFinalizeInModule(Mod, DefinedGlobals, /*PropagateAttrs=*/true);
675
676 if (Conf.PostPromoteModuleHook && !Conf.PostPromoteModuleHook(Task, Mod))
677 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
678
679 if (!DefinedGlobals.empty())
680 thinLTOInternalizeModule(Mod, DefinedGlobals);
681
682 if (Conf.PostInternalizeModuleHook &&
683 !Conf.PostInternalizeModuleHook(Task, Mod))
684 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
685
686 auto ModuleLoader = [&](StringRef Identifier) {
687 llvm::TimeTraceScope moduleLoaderScope("Module loader", Identifier);
688 assert(Mod.getContext().isODRUniquingDebugTypes() &&
689 "ODR Type uniquing should be enabled on the context");
690 if (ModuleMap) {
691 auto I = ModuleMap->find(Identifier);
692 assert(I != ModuleMap->end());
693 return I->second.getLazyModule(Mod.getContext(),
694 /*ShouldLazyLoadMetadata=*/true,
695 /*IsImporting*/ true);
696 }
697
699 llvm::MemoryBuffer::getFile(Identifier);
700 if (!MBOrErr)
702 Twine("Error loading imported file ") + Identifier + " : ",
703 MBOrErr.getError()));
704
705 Expected<BitcodeModule> BMOrErr = findThinLTOModule(**MBOrErr);
706 if (!BMOrErr)
708 Twine("Error loading imported file ") + Identifier + " : " +
709 toString(BMOrErr.takeError()),
711
713 BMOrErr->getLazyModule(Mod.getContext(),
714 /*ShouldLazyLoadMetadata=*/true,
715 /*IsImporting*/ true);
716 if (MOrErr)
717 (*MOrErr)->setOwnedMemoryBuffer(std::move(*MBOrErr));
718 return MOrErr;
719 };
720
721 {
722 llvm::TimeTraceScope importScope("Import functions");
723 FunctionImporter Importer(CombinedIndex, ModuleLoader,
724 ClearDSOLocalOnDeclarations);
725 if (Error Err = Importer.importFunctions(Mod, ImportList).takeError())
726 return Err;
727 }
728
729 // Do this after any importing so that imported code is updated.
730 updateMemProfAttributes(Mod, CombinedIndex);
732
733 if (Conf.PostImportModuleHook && !Conf.PostImportModuleHook(Task, Mod))
734 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
735
736 return OptimizeAndCodegen(Mod, TM.get(), std::move(DiagnosticOutputFile));
737}
738
740 if (ThinLTOAssumeMerged && BMs.size() == 1)
741 return BMs.begin();
742
743 for (BitcodeModule &BM : BMs) {
744 Expected<BitcodeLTOInfo> LTOInfo = BM.getLTOInfo();
745 if (LTOInfo && LTOInfo->IsThinLTO)
746 return &BM;
747 }
748 return nullptr;
749}
750
753 if (!BMsOrErr)
754 return BMsOrErr.takeError();
755
756 // The bitcode file may contain multiple modules, we want the one that is
757 // marked as being the ThinLTO module.
758 if (const BitcodeModule *Bm = lto::findThinLTOModule(*BMsOrErr))
759 return *Bm;
760
761 return make_error<StringError>("Could not find module summary",
763}
764
766 const ModuleSummaryIndex &CombinedIndex,
767 FunctionImporter::ImportMapTy &ImportList) {
769 return true;
770 // We can simply import the values mentioned in the combined index, since
771 // we should only invoke this using the individual indexes written out
772 // via a WriteIndexesThinBackend.
773 for (const auto &GlobalList : CombinedIndex) {
774 // Ignore entries for undefined references.
775 if (GlobalList.second.SummaryList.empty())
776 continue;
777
778 auto GUID = GlobalList.first;
779 for (const auto &Summary : GlobalList.second.SummaryList) {
780 // Skip the summaries for the importing module. These are included to
781 // e.g. record required linkage changes.
782 if (Summary->modulePath() == M.getModuleIdentifier())
783 continue;
784 // Add an entry to provoke importing by thinBackend.
785 ImportList.addGUID(Summary->modulePath(), GUID, Summary->importType());
786 }
787 }
788 return true;
789}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
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)
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 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 bool isEmptyModule(const Module &Mod)
static void RegisterPassPlugins(ArrayRef< std::string > PassPlugins, PassBuilder &PB)
static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, unsigned OptLevel, bool IsThinLTO, ModuleSummaryIndex *ExportSummary, const ModuleSummaryIndex *ImportSummary)
#define I(x, y, z)
Definition MD5.cpp:58
#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:119
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:41
size_t size() const
size - Get the array size.
Definition ArrayRef.h:147
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:187
bool empty() const
Definition DenseMap.h:107
Implements a dense probed hash-table based set.
Definition DenseSet.h:261
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.
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:141
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:303
iterator begin() const
Definition ArrayRef.h:347
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 ...
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
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:60
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:82
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 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.
Primary interface to the complete machine description for the target machine.
MCTargetOptions MCOptions
Machine level options.
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:79
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
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:133
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:169
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 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)
Runs a regular LTO backend.
LLVM_ABI Error finalizeOptimizationRemarks(std::unique_ptr< ToolOutputFile > DiagOutputFile)
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...
LLVM_ABI Expected< std::unique_ptr< ToolOutputFile > > 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:2180
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)
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, AddStreamFn IRAddStream=nullptr, const std::vector< uint8_t > &CmdArgs=std::vector< uint8_t >())
Runs a ThinLTO backend.
LLVM_ABI void updateMemProfAttributes(Module &Mod, const ModuleSummaryIndex &Index)
Updates MemProf attributes (and metadata) based on whether the index has recorded that we are linking...
Definition LTO.cpp:1259
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition FileSystem.h:762
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
Definition FileSystem.h:771
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:967
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:456
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
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:162
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:98
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:167
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:250
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)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
Definition Error.cpp:111
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:59
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:180
A struct capturing PGO tunables.
Definition PGOOptions.h:28
static const Target * lookupTarget(StringRef TripleStr, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
LTO configuration.
Definition Config.h:42
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:225
bool DebugPassManager
Whether to emit the pass manager debuggging informations.
Definition Config.h:172
bool AddFSDiscriminator
Add FSAFDO discriminators.
Definition Config.h:190
std::optional< uint64_t > RemarksHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
Definition Config.h:166
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:229
CombinedIndexHookFn CombinedIndexHook
Definition Config.h:261
std::optional< CodeModel::Model > CodeModel
Definition Config.h:57
std::string AAPipeline
Definition Config.h:111
std::function< void(legacy::PassManager &)> PreCodeGenPassesHook
For adding passes that run right before codegen.
Definition Config.h:55
bool DisableVerify
Definition Config.h:62
std::vector< std::string > MAttrs
Definition Config.h:51
CodeGenOptLevel CGOptLevel
Definition Config.h:58
PipelineTuningOptions PTO
Tunable parameters for passes in the default pipelines.
Definition Config.h:199
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:196
std::string CPU
Definition Config.h:49
std::string DwoDir
The directory to store .dwo files.
Definition Config.h:131
std::string RemarksFilename
Optimization remarks file path.
Definition Config.h:145
ModuleHookFn PostPromoteModuleHook
This hook is called after promoting any internal functions (ThinLTO-specific).
Definition Config.h:233
std::string ProfileRemapping
Name remapping file for profile data.
Definition Config.h:128
TargetOptions Options
Definition Config.h:50
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:137
std::string SplitDwarfOutput
The path to write a .dwo file to.
Definition Config.h:142
ModuleHookFn PostOptModuleHook
This module hook is called after optimization is complete.
Definition Config.h:242
std::string RemarksPasses
Optimization remarks pass filter.
Definition Config.h:148
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:106
bool RunCSIRInstr
Run PGO context sensitive IR instrumentation.
Definition Config.h:72
ModuleHookFn PostInternalizeModuleHook
This hook is called after internalizing the module.
Definition Config.h:236
unsigned OptLevel
Definition Config.h:60
ModuleHookFn PostImportModuleHook
This hook is called after importing from other modules (ThinLTO-specific).
Definition Config.h:239
bool RemarksWithHotness
Whether to emit optimization remarks with hotness informations.
Definition Config.h:151
std::vector< std::string > PassPlugins
Definition Config.h:53
std::string CSIRProfile
Context Sensitive PGO profile path.
Definition Config.h:122
ModuleHookFn PreCodeGenModuleHook
This module hook is called before code generation.
Definition Config.h:247
std::optional< Reloc::Model > RelocModel
Definition Config.h:56
bool ShouldDiscardValueNames
Definition Config.h:186
bool PGOWarnMismatch
Turn on/off the warning about a hash mismatch in the PGO profile data.
Definition Config.h:75
CodeGenFileType CGFileType
Definition Config.h:59
bool Freestanding
Flag to indicate that the optimizer should not assume builtins are present on the target.
Definition Config.h:66
std::string SampleProfile
Sample PGO profile path.
Definition Config.h:125
std::string RemarksFormat
The format used for serializing remarks (default: YAML).
Definition Config.h:169
A derived class of LLVMContext that initializes itself according to a given Config object.
Definition Config.h:300