LLVM 20.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"
25#include "llvm/IR/PassManager.h"
26#include "llvm/IR/Verifier.h"
27#include "llvm/LTO/LTO.h"
33#include "llvm/Support/Error.h"
36#include "llvm/Support/Path.h"
48#include <optional>
49
50using namespace llvm;
51using namespace lto;
52
53#define DEBUG_TYPE "lto-backend"
54
56 DoNotEmbed = 0,
59};
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
77namespace llvm {
79}
80
81[[noreturn]] static void reportOpenError(StringRef Path, Twine Msg) {
82 errs() << "failed to open " << Path << ": " << Msg << '\n';
83 errs().flush();
84 exit(1);
85}
86
87Error Config::addSaveTemps(std::string OutputFileName, bool UseInputModulePath,
88 const DenseSet<StringRef> &SaveTempsArgs) {
90
91 std::error_code EC;
92 if (SaveTempsArgs.empty() || SaveTempsArgs.contains("resolution")) {
94 std::make_unique<raw_fd_ostream>(OutputFileName + "resolution.txt", EC,
96 if (EC) {
97 ResolutionFile.reset();
98 return errorCodeToError(EC);
99 }
100 }
101
102 auto setHook = [&](std::string PathSuffix, ModuleHookFn &Hook) {
103 // Keep track of the hook provided by the linker, which also needs to run.
104 ModuleHookFn LinkerHook = Hook;
105 Hook = [=](unsigned Task, const Module &M) {
106 // If the linker's hook returned false, we need to pass that result
107 // through.
108 if (LinkerHook && !LinkerHook(Task, M))
109 return false;
110
111 std::string PathPrefix;
112 // If this is the combined module (not a ThinLTO backend compile) or the
113 // user hasn't requested using the input module's path, emit to a file
114 // named from the provided OutputFileName with the Task ID appended.
115 if (M.getModuleIdentifier() == "ld-temp.o" || !UseInputModulePath) {
116 PathPrefix = OutputFileName;
117 if (Task != (unsigned)-1)
118 PathPrefix += utostr(Task) + ".";
119 } else
120 PathPrefix = M.getModuleIdentifier() + ".";
121 std::string Path = PathPrefix + PathSuffix + ".bc";
122 std::error_code EC;
124 // Because -save-temps is a debugging feature, we report the error
125 // directly and exit.
126 if (EC)
127 reportOpenError(Path, EC.message());
128 WriteBitcodeToFile(M, OS, /*ShouldPreserveUseListOrder=*/false);
129 return true;
130 };
131 };
132
133 auto SaveCombinedIndex =
134 [=](const ModuleSummaryIndex &Index,
135 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
136 std::string Path = OutputFileName + "index.bc";
137 std::error_code EC;
139 // Because -save-temps is a debugging feature, we report the error
140 // directly and exit.
141 if (EC)
142 reportOpenError(Path, EC.message());
144
145 Path = OutputFileName + "index.dot";
147 if (EC)
148 reportOpenError(Path, EC.message());
149 Index.exportToDot(OSDot, GUIDPreservedSymbols);
150 return true;
151 };
152
153 if (SaveTempsArgs.empty()) {
154 setHook("0.preopt", PreOptModuleHook);
155 setHook("1.promote", PostPromoteModuleHook);
156 setHook("2.internalize", PostInternalizeModuleHook);
157 setHook("3.import", PostImportModuleHook);
158 setHook("4.opt", PostOptModuleHook);
159 setHook("5.precodegen", PreCodeGenModuleHook);
160 CombinedIndexHook = SaveCombinedIndex;
161 } else {
162 if (SaveTempsArgs.contains("preopt"))
163 setHook("0.preopt", PreOptModuleHook);
164 if (SaveTempsArgs.contains("promote"))
165 setHook("1.promote", PostPromoteModuleHook);
166 if (SaveTempsArgs.contains("internalize"))
167 setHook("2.internalize", PostInternalizeModuleHook);
168 if (SaveTempsArgs.contains("import"))
169 setHook("3.import", PostImportModuleHook);
170 if (SaveTempsArgs.contains("opt"))
171 setHook("4.opt", PostOptModuleHook);
172 if (SaveTempsArgs.contains("precodegen"))
173 setHook("5.precodegen", PreCodeGenModuleHook);
174 if (SaveTempsArgs.contains("combinedindex"))
175 CombinedIndexHook = SaveCombinedIndex;
176 }
177
178 return Error::success();
179}
180
181#define HANDLE_EXTENSION(Ext) \
182 llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
183#include "llvm/Support/Extension.def"
184
186 PassBuilder &PB) {
187#define HANDLE_EXTENSION(Ext) \
188 get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
189#include "llvm/Support/Extension.def"
190
191 // Load requested pass plugins and let them register pass builder callbacks
192 for (auto &PluginFN : PassPlugins) {
193 auto PassPlugin = PassPlugin::Load(PluginFN);
194 if (!PassPlugin)
195 report_fatal_error(PassPlugin.takeError(), /*gen_crash_diag=*/false);
197 }
198}
199
200static std::unique_ptr<TargetMachine>
201createTargetMachine(const Config &Conf, const Target *TheTarget, Module &M) {
202 StringRef TheTriple = M.getTargetTriple();
203 SubtargetFeatures Features;
204 Features.getDefaultSubtargetFeatures(Triple(TheTriple));
205 for (const std::string &A : Conf.MAttrs)
206 Features.AddFeature(A);
207
208 std::optional<Reloc::Model> RelocModel;
209 if (Conf.RelocModel)
210 RelocModel = *Conf.RelocModel;
211 else if (M.getModuleFlag("PIC Level"))
212 RelocModel =
213 M.getPICLevel() == PICLevel::NotPIC ? Reloc::Static : Reloc::PIC_;
214
215 std::optional<CodeModel::Model> CodeModel;
216 if (Conf.CodeModel)
217 CodeModel = *Conf.CodeModel;
218 else
219 CodeModel = M.getCodeModel();
220
221 std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine(
222 TheTriple, Conf.CPU, Features.getString(), Conf.Options, RelocModel,
223 CodeModel, Conf.CGOptLevel));
224
225 assert(TM && "Failed to create target machine");
226
227 if (std::optional<uint64_t> LargeDataThreshold = M.getLargeDataThreshold())
228 TM->setLargeDataThreshold(*LargeDataThreshold);
229
230 return TM;
231}
232
233static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
234 unsigned OptLevel, bool IsThinLTO,
235 ModuleSummaryIndex *ExportSummary,
236 const ModuleSummaryIndex *ImportSummary) {
237 auto FS = vfs::getRealFileSystem();
238 std::optional<PGOOptions> PGOOpt;
239 if (!Conf.SampleProfile.empty())
240 PGOOpt = PGOOptions(Conf.SampleProfile, "", Conf.ProfileRemapping,
241 /*MemoryProfile=*/"", FS, PGOOptions::SampleUse,
244 else if (Conf.RunCSIRInstr) {
245 PGOOpt = PGOOptions("", Conf.CSIRProfile, Conf.ProfileRemapping,
246 /*MemoryProfile=*/"", FS, PGOOptions::IRUse,
248 Conf.AddFSDiscriminator);
249 } else if (!Conf.CSIRProfile.empty()) {
250 PGOOpt = PGOOptions(Conf.CSIRProfile, "", Conf.ProfileRemapping,
251 /*MemoryProfile=*/"", FS, PGOOptions::IRUse,
253 Conf.AddFSDiscriminator);
255 } else if (Conf.AddFSDiscriminator) {
256 PGOOpt = PGOOptions("", "", "", /*MemoryProfile=*/"", nullptr,
259 }
260 TM->setPGOOption(PGOOpt);
261
266
268 StandardInstrumentations SI(Mod.getContext(), Conf.DebugPassManager,
269 Conf.VerifyEach);
270 SI.registerCallbacks(PIC, &MAM);
271 PassBuilder PB(TM, Conf.PTO, PGOOpt, &PIC);
272
274
275 std::unique_ptr<TargetLibraryInfoImpl> TLII(
276 new TargetLibraryInfoImpl(Triple(TM->getTargetTriple())));
277 if (Conf.Freestanding)
278 TLII->disableAllFunctions();
279 FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
280
281 // Parse a custom AA pipeline if asked to.
282 if (!Conf.AAPipeline.empty()) {
283 AAManager AA;
284 if (auto Err = PB.parseAAPipeline(AA, Conf.AAPipeline)) {
285 report_fatal_error(Twine("unable to parse AA pipeline description '") +
286 Conf.AAPipeline + "': " + toString(std::move(Err)));
287 }
288 // Register the AA manager first so that our version is the one used.
289 FAM.registerPass([&] { return std::move(AA); });
290 }
291
292 // Register all the basic analyses with the managers.
298
300
301 if (!Conf.DisableVerify)
302 MPM.addPass(VerifierPass());
303
305
306 switch (OptLevel) {
307 default:
308 llvm_unreachable("Invalid optimization level");
309 case 0:
311 break;
312 case 1:
314 break;
315 case 2:
317 break;
318 case 3:
320 break;
321 }
322
323 // Parse a custom pipeline if asked to.
324 if (!Conf.OptPipeline.empty()) {
325 if (auto Err = PB.parsePassPipeline(MPM, Conf.OptPipeline)) {
326 report_fatal_error(Twine("unable to parse pass pipeline description '") +
327 Conf.OptPipeline + "': " + toString(std::move(Err)));
328 }
329 } else if (IsThinLTO) {
330 MPM.addPass(PB.buildThinLTODefaultPipeline(OL, ImportSummary));
331 } else {
332 MPM.addPass(PB.buildLTODefaultPipeline(OL, ExportSummary));
333 }
334
335 if (!Conf.DisableVerify)
336 MPM.addPass(VerifierPass());
337
339 std::string PipelineStr;
340 raw_string_ostream OS(PipelineStr);
341 MPM.printPipeline(OS, [&PIC](StringRef ClassName) {
342 auto PassName = PIC.getPassNameForClassName(ClassName);
343 return PassName.empty() ? ClassName : PassName;
344 });
345 outs() << "pipeline-passes: " << PipelineStr << '\n';
346 }
347
348 MPM.run(Mod, MAM);
349}
350
351bool lto::opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod,
352 bool IsThinLTO, ModuleSummaryIndex *ExportSummary,
353 const ModuleSummaryIndex *ImportSummary,
354 const std::vector<uint8_t> &CmdArgs) {
355 if (EmbedBitcode == LTOBitcodeEmbedding::EmbedPostMergePreOptimized) {
356 // FIXME: the motivation for capturing post-merge bitcode and command line
357 // is replicating the compilation environment from bitcode, without needing
358 // to understand the dependencies (the functions to be imported). This
359 // assumes a clang - based invocation, case in which we have the command
360 // line.
361 // It's not very clear how the above motivation would map in the
362 // linker-based case, so we currently don't plumb the command line args in
363 // that case.
364 if (CmdArgs.empty())
366 dbgs() << "Post-(Thin)LTO merge bitcode embedding was requested, but "
367 "command line arguments are not available");
369 /*EmbedBitcode*/ true, /*EmbedCmdline*/ true,
370 /*Cmdline*/ CmdArgs);
371 }
372 // FIXME: Plumb the combined index into the new pass manager.
373 runNewPMPasses(Conf, Mod, TM, Conf.OptLevel, IsThinLTO, ExportSummary,
374 ImportSummary);
375 return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod);
376}
377
378static void codegen(const Config &Conf, TargetMachine *TM,
379 AddStreamFn AddStream, unsigned Task, Module &Mod,
380 const ModuleSummaryIndex &CombinedIndex) {
381 if (Conf.PreCodeGenModuleHook && !Conf.PreCodeGenModuleHook(Task, Mod))
382 return;
383
384 if (EmbedBitcode == LTOBitcodeEmbedding::EmbedOptimized)
386 /*EmbedBitcode*/ true,
387 /*EmbedCmdline*/ false,
388 /*CmdArgs*/ std::vector<uint8_t>());
389
390 std::unique_ptr<ToolOutputFile> DwoOut;
392 if (!Conf.DwoDir.empty()) {
393 std::error_code EC;
394 if (auto EC = llvm::sys::fs::create_directories(Conf.DwoDir))
395 report_fatal_error(Twine("Failed to create directory ") + Conf.DwoDir +
396 ": " + EC.message());
397
398 DwoFile = Conf.DwoDir;
399 sys::path::append(DwoFile, std::to_string(Task) + ".dwo");
400 TM->Options.MCOptions.SplitDwarfFile = std::string(DwoFile);
401 } else
402 TM->Options.MCOptions.SplitDwarfFile = Conf.SplitDwarfFile;
403
404 if (!DwoFile.empty()) {
405 std::error_code EC;
406 DwoOut = std::make_unique<ToolOutputFile>(DwoFile, EC, sys::fs::OF_None);
407 if (EC)
408 report_fatal_error(Twine("Failed to open ") + DwoFile + ": " +
409 EC.message());
410 }
411
413 AddStream(Task, Mod.getModuleIdentifier());
414 if (Error Err = StreamOrErr.takeError())
415 report_fatal_error(std::move(Err));
416 std::unique_ptr<CachedFileStream> &Stream = *StreamOrErr;
417 TM->Options.ObjectFilenameForDebug = Stream->ObjectPathName;
418
419 legacy::PassManager CodeGenPasses;
420 TargetLibraryInfoImpl TLII(Triple(Mod.getTargetTriple()));
421 CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
422 CodeGenPasses.add(
424 if (Conf.PreCodeGenPassesHook)
425 Conf.PreCodeGenPassesHook(CodeGenPasses);
426 if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS,
427 DwoOut ? &DwoOut->os() : nullptr,
428 Conf.CGFileType))
429 report_fatal_error("Failed to setup codegen");
430 CodeGenPasses.run(Mod);
431
432 if (DwoOut)
433 DwoOut->keep();
434}
435
436static void splitCodeGen(const Config &C, TargetMachine *TM,
437 AddStreamFn AddStream,
438 unsigned ParallelCodeGenParallelismLevel, Module &Mod,
439 const ModuleSummaryIndex &CombinedIndex) {
440 DefaultThreadPool CodegenThreadPool(
441 heavyweight_hardware_concurrency(ParallelCodeGenParallelismLevel));
442 unsigned ThreadCount = 0;
443 const Target *T = &TM->getTarget();
444
445 const auto HandleModulePartition =
446 [&](std::unique_ptr<Module> MPart) {
447 // We want to clone the module in a new context to multi-thread the
448 // codegen. We do it by serializing partition modules to bitcode
449 // (while still on the main thread, in order to avoid data races) and
450 // spinning up new threads which deserialize the partitions into
451 // separate contexts.
452 // FIXME: Provide a more direct way to do this in LLVM.
454 raw_svector_ostream BCOS(BC);
455 WriteBitcodeToFile(*MPart, BCOS);
456
457 // Enqueue the task
458 CodegenThreadPool.async(
459 [&](const SmallString<0> &BC, unsigned ThreadId) {
460 LTOLLVMContext Ctx(C);
462 parseBitcodeFile(MemoryBufferRef(BC.str(), "ld-temp.o"), Ctx);
463 if (!MOrErr)
464 report_fatal_error("Failed to read bitcode");
465 std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.get());
466
467 std::unique_ptr<TargetMachine> TM =
468 createTargetMachine(C, T, *MPartInCtx);
469
470 codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx,
471 CombinedIndex);
472 },
473 // Pass BC using std::move to ensure that it get moved rather than
474 // copied into the thread's context.
475 std::move(BC), ThreadCount++);
476 };
477
478 // Try target-specific module splitting first, then fallback to the default.
479 if (!TM->splitModule(Mod, ParallelCodeGenParallelismLevel,
480 HandleModulePartition)) {
481 SplitModule(Mod, ParallelCodeGenParallelismLevel, HandleModulePartition,
482 false);
483 }
484
485 // Because the inner lambda (which runs in a worker thread) captures our local
486 // variables, we need to wait for the worker threads to terminate before we
487 // can leave the function scope.
488 CodegenThreadPool.wait();
489}
490
492 Module &Mod) {
493 if (!C.OverrideTriple.empty())
494 Mod.setTargetTriple(C.OverrideTriple);
495 else if (Mod.getTargetTriple().empty())
496 Mod.setTargetTriple(C.DefaultTriple);
497
498 std::string Msg;
499 const Target *T = TargetRegistry::lookupTarget(Mod.getTargetTriple(), Msg);
500 if (!T)
501 return make_error<StringError>(Msg, inconvertibleErrorCode());
502 return T;
503}
504
506 std::unique_ptr<ToolOutputFile> DiagOutputFile) {
507 // Make sure we flush the diagnostic remarks file in case the linker doesn't
508 // call the global destructors before exiting.
509 if (!DiagOutputFile)
510 return Error::success();
511 DiagOutputFile->keep();
512 DiagOutputFile->os().flush();
513 return Error::success();
514}
515
517 unsigned ParallelCodeGenParallelismLevel, Module &Mod,
518 ModuleSummaryIndex &CombinedIndex) {
520 if (!TOrErr)
521 return TOrErr.takeError();
522
523 std::unique_ptr<TargetMachine> TM = createTargetMachine(C, *TOrErr, Mod);
524
525 LLVM_DEBUG(dbgs() << "Running regular LTO\n");
526 if (!C.CodeGenOnly) {
527 if (!opt(C, TM.get(), 0, Mod, /*IsThinLTO=*/false,
528 /*ExportSummary=*/&CombinedIndex, /*ImportSummary=*/nullptr,
529 /*CmdArgs*/ std::vector<uint8_t>()))
530 return Error::success();
531 }
532
533 if (ParallelCodeGenParallelismLevel == 1) {
534 codegen(C, TM.get(), AddStream, 0, Mod, CombinedIndex);
535 } else {
536 splitCodeGen(C, TM.get(), AddStream, ParallelCodeGenParallelismLevel, Mod,
537 CombinedIndex);
538 }
539 return Error::success();
540}
541
542static void dropDeadSymbols(Module &Mod, const GVSummaryMapTy &DefinedGlobals,
543 const ModuleSummaryIndex &Index) {
544 std::vector<GlobalValue*> DeadGVs;
545 for (auto &GV : Mod.global_values())
546 if (GlobalValueSummary *GVS = DefinedGlobals.lookup(GV.getGUID()))
547 if (!Index.isGlobalValueLive(GVS)) {
548 DeadGVs.push_back(&GV);
550 }
551
552 // Now that all dead bodies have been dropped, delete the actual objects
553 // themselves when possible.
554 for (GlobalValue *GV : DeadGVs) {
555 GV->removeDeadConstantUsers();
556 // Might reference something defined in native object (i.e. dropped a
557 // non-prevailing IR def, but we need to keep the declaration).
558 if (GV->use_empty())
559 GV->eraseFromParent();
560 }
561}
562
563Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream,
564 Module &Mod, const ModuleSummaryIndex &CombinedIndex,
565 const FunctionImporter::ImportMapTy &ImportList,
566 const GVSummaryMapTy &DefinedGlobals,
568 const std::vector<uint8_t> &CmdArgs) {
570 if (!TOrErr)
571 return TOrErr.takeError();
572
573 std::unique_ptr<TargetMachine> TM = createTargetMachine(Conf, *TOrErr, Mod);
574
575 // Setup optimization remarks.
576 auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
577 Mod.getContext(), Conf.RemarksFilename, Conf.RemarksPasses,
579 Task);
580 if (!DiagFileOrErr)
581 return DiagFileOrErr.takeError();
582 auto DiagnosticOutputFile = std::move(*DiagFileOrErr);
583
584 // Set the partial sample profile ratio in the profile summary module flag of
585 // the module, if applicable.
586 Mod.setPartialSampleProfileRatio(CombinedIndex);
587
588 LLVM_DEBUG(dbgs() << "Running ThinLTO\n");
589 if (Conf.CodeGenOnly) {
590 codegen(Conf, TM.get(), AddStream, Task, Mod, CombinedIndex);
591 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
592 }
593
594 if (Conf.PreOptModuleHook && !Conf.PreOptModuleHook(Task, Mod))
595 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
596
597 auto OptimizeAndCodegen =
598 [&](Module &Mod, TargetMachine *TM,
599 std::unique_ptr<ToolOutputFile> DiagnosticOutputFile) {
600 if (!opt(Conf, TM, Task, Mod, /*IsThinLTO=*/true,
601 /*ExportSummary=*/nullptr, /*ImportSummary=*/&CombinedIndex,
602 CmdArgs))
603 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
604
605 codegen(Conf, TM, AddStream, Task, Mod, CombinedIndex);
606 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
607 };
608
610 return OptimizeAndCodegen(Mod, TM.get(), std::move(DiagnosticOutputFile));
611
612 // When linking an ELF shared object, dso_local should be dropped. We
613 // conservatively do this for -fpic.
614 bool ClearDSOLocalOnDeclarations =
615 TM->getTargetTriple().isOSBinFormatELF() &&
616 TM->getRelocationModel() != Reloc::Static &&
617 Mod.getPIELevel() == PIELevel::Default;
618 renameModuleForThinLTO(Mod, CombinedIndex, ClearDSOLocalOnDeclarations);
619
620 dropDeadSymbols(Mod, DefinedGlobals, CombinedIndex);
621
622 thinLTOFinalizeInModule(Mod, DefinedGlobals, /*PropagateAttrs=*/true);
623
624 if (Conf.PostPromoteModuleHook && !Conf.PostPromoteModuleHook(Task, Mod))
625 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
626
627 if (!DefinedGlobals.empty())
628 thinLTOInternalizeModule(Mod, DefinedGlobals);
629
630 if (Conf.PostInternalizeModuleHook &&
631 !Conf.PostInternalizeModuleHook(Task, Mod))
632 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
633
634 auto ModuleLoader = [&](StringRef Identifier) {
635 assert(Mod.getContext().isODRUniquingDebugTypes() &&
636 "ODR Type uniquing should be enabled on the context");
637 if (ModuleMap) {
638 auto I = ModuleMap->find(Identifier);
639 assert(I != ModuleMap->end());
640 return I->second.getLazyModule(Mod.getContext(),
641 /*ShouldLazyLoadMetadata=*/true,
642 /*IsImporting*/ true);
643 }
644
646 llvm::MemoryBuffer::getFile(Identifier);
647 if (!MBOrErr)
648 return Expected<std::unique_ptr<llvm::Module>>(make_error<StringError>(
649 Twine("Error loading imported file ") + Identifier + " : ",
650 MBOrErr.getError()));
651
652 Expected<BitcodeModule> BMOrErr = findThinLTOModule(**MBOrErr);
653 if (!BMOrErr)
654 return Expected<std::unique_ptr<llvm::Module>>(make_error<StringError>(
655 Twine("Error loading imported file ") + Identifier + " : " +
656 toString(BMOrErr.takeError()),
658
660 BMOrErr->getLazyModule(Mod.getContext(),
661 /*ShouldLazyLoadMetadata=*/true,
662 /*IsImporting*/ true);
663 if (MOrErr)
664 (*MOrErr)->setOwnedMemoryBuffer(std::move(*MBOrErr));
665 return MOrErr;
666 };
667
668 FunctionImporter Importer(CombinedIndex, ModuleLoader,
669 ClearDSOLocalOnDeclarations);
670 if (Error Err = Importer.importFunctions(Mod, ImportList).takeError())
671 return Err;
672
673 // Do this after any importing so that imported code is updated.
674 updateMemProfAttributes(Mod, CombinedIndex);
676
677 if (Conf.PostImportModuleHook && !Conf.PostImportModuleHook(Task, Mod))
678 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
679
680 return OptimizeAndCodegen(Mod, TM.get(), std::move(DiagnosticOutputFile));
681}
682
684 if (ThinLTOAssumeMerged && BMs.size() == 1)
685 return BMs.begin();
686
687 for (BitcodeModule &BM : BMs) {
688 Expected<BitcodeLTOInfo> LTOInfo = BM.getLTOInfo();
689 if (LTOInfo && LTOInfo->IsThinLTO)
690 return &BM;
691 }
692 return nullptr;
693}
694
697 if (!BMsOrErr)
698 return BMsOrErr.takeError();
699
700 // The bitcode file may contain multiple modules, we want the one that is
701 // marked as being the ThinLTO module.
702 if (const BitcodeModule *Bm = lto::findThinLTOModule(*BMsOrErr))
703 return *Bm;
704
705 return make_error<StringError>("Could not find module summary",
707}
708
710 const ModuleSummaryIndex &CombinedIndex,
711 FunctionImporter::ImportMapTy &ImportList) {
713 return true;
714 // We can simply import the values mentioned in the combined index, since
715 // we should only invoke this using the individual indexes written out
716 // via a WriteIndexesThinBackend.
717 for (const auto &GlobalList : CombinedIndex) {
718 // Ignore entries for undefined references.
719 if (GlobalList.second.SummaryList.empty())
720 continue;
721
722 auto GUID = GlobalList.first;
723 for (const auto &Summary : GlobalList.second.SummaryList) {
724 // Skip the summaries for the importing module. These are included to
725 // e.g. record required linkage changes.
726 if (Summary->modulePath() == M.getModuleIdentifier())
727 continue;
728 // Add an entry to provoke importing by thinBackend.
729 // Try emplace the entry first. If an entry with the same key already
730 // exists, set the value to 'std::min(existing-value, new-value)' to make
731 // sure a definition takes precedence over a declaration.
732 auto [Iter, Inserted] = ImportList[Summary->modulePath()].try_emplace(
733 GUID, Summary->importType());
734
735 if (!Inserted)
736 Iter->second = std::min(Iter->second, Summary->importType());
737 }
738 }
739 return true;
740}
arm prera ldst opt
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)
Definition: CommandLine.h:686
#define LLVM_DEBUG(X)
Definition: Debug.h:101
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)
Definition: LTOBackend.cpp:81
LTOBitcodeEmbedding
Definition: LTOBackend.cpp:55
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)
Definition: LTOBackend.cpp:436
static void dropDeadSymbols(Module &Mod, const GVSummaryMapTy &DefinedGlobals, const ModuleSummaryIndex &Index)
Definition: LTOBackend.cpp:542
static Expected< const Target * > initAndLookupTarget(const Config &C, Module &Mod)
Definition: LTOBackend.cpp:491
static void codegen(const Config &Conf, TargetMachine *TM, AddStreamFn AddStream, unsigned Task, Module &Mod, const ModuleSummaryIndex &CombinedIndex)
Definition: LTOBackend.cpp:378
static void RegisterPassPlugins(ArrayRef< std::string > PassPlugins, PassBuilder &PB)
Definition: LTOBackend.cpp:185
static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, unsigned OptLevel, bool IsThinLTO, ModuleSummaryIndex *ExportSummary, const ModuleSummaryIndex *ImportSummary)
Definition: LTOBackend.cpp:233
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
#define I(x, y, z)
Definition: MD5.cpp:58
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
LoopAnalysisManager LAM
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
This header defines various interfaces for pass management in LLVM.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This header defines a class that provides bookkeeping for all standard (i.e in-tree) pass instrumenta...
Defines the virtual file system interface vfs::FileSystem.
static const char PassName[]
A manager for alias analyses.
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
Definition: PassManager.h:467
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:165
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:194
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&... Args)
Definition: DenseMap.h:226
bool empty() const
Definition: DenseMap.h:98
Implements a dense probed hash-table based set.
Definition: DenseSet.h:271
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:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:337
Tagged union holding either a T or a Error.
Definition: Error.h:481
Error takeError()
Take ownership of the stored error.
Definition: Error.h:608
reference get()
Returns a reference to the stored T value.
Definition: Error.h:578
The function importer is automatically importing function from other modules based on the provided su...
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:71
iterator find(const KeyT &Key)
Definition: MapVector.h:167
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:65
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
iterator begin() const
Definition: ArrayRef.h:356
static const OptimizationLevel O3
Optimize for fast execution as much as possible.
static const OptimizationLevel O0
Disable as many optimizations as possible.
static const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static const OptimizationLevel O1
Optimize quickly without destroying debuggability.
This class provides access to building LLVM's passes.
Definition: PassBuilder.h:106
Error parseAAPipeline(AAManager &AA, StringRef PipelineText)
Parse a textual alias analysis pipeline into the provided AA manager.
void registerLoopAnalyses(LoopAnalysisManager &LAM)
Registers all available loop analysis passes.
void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM, MachineFunctionAnalysisManager *MFAM=nullptr)
Cross register the analysis managers through their proxies.
Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText)
Parse a textual pass pipeline description into a ModulePassManager.
ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level, ModuleSummaryIndex *ExportSummary)
Build an LTO default optimization pipeline to a pass manager.
ModulePassManager buildThinLTODefaultPipeline(OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary)
Build a ThinLTO default optimization pipeline to a pass manager.
void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
void registerFunctionAnalyses(FunctionAnalysisManager &FAM)
Registers all available function analysis passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
StringRef getPassNameForClassName(StringRef ClassName)
Get the pass name for a given pass class name.
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition: PassManager.h:178
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
Definition: PassManager.h:195
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 Expected< PassPlugin > Load(const std::string &Filename)
Attempts to load a pass plugin from a given file.
Definition: PassPlugin.cpp:16
void registerPassBuilderCallbacks(PassBuilder &PB) const
Invoke the PassBuilder callback registration.
Definition: PassPlugin.h:82
A non-threaded implementation.
Definition: ThreadPool.h:218
void wait() override
Blocking wait for all the tasks to execute first.
Definition: ThreadPool.cpp:201
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.
Definition: SmallString.h:254
bool empty() const
Definition: SmallVector.h:94
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:50
Manages the enabling and disabling of subtarget specific features.
void getDefaultSubtargetFeatures(const Triple &Triple)
Adds the default features for the specified target triple.
std::string getString() const
Returns features as a string.
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.
Definition: TargetMachine.h:77
Target - Wrapper for Target specific information.
TargetMachine * createTargetMachine(StringRef 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:78
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
Create a verifier pass.
Definition: Verifier.h:132
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition: DenseSet.h:185
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.
Definition: raw_ostream.h:460
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:661
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:691
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.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:711
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
std::optional< const char * > toString(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract a string value from it.
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, const std::vector< uint8_t > &CmdArgs=std::vector< uint8_t >())
Runs a ThinLTO backend.
Definition: LTOBackend.cpp:563
BitcodeModule * findThinLTOModule(MutableArrayRef< BitcodeModule > BMs)
Returns the BitcodeModule that is ThinLTO.
Definition: LTOBackend.cpp:683
Error backend(const Config &C, AddStreamFn AddStream, unsigned ParallelCodeGenParallelismLevel, Module &M, ModuleSummaryIndex &CombinedIndex)
Runs a regular LTO backend.
Definition: LTOBackend.cpp:516
Error finalizeOptimizationRemarks(std::unique_ptr< ToolOutputFile > DiagOutputFile)
Definition: LTOBackend.cpp:505
bool initImportList(const Module &M, const ModuleSummaryIndex &CombinedIndex, FunctionImporter::ImportMapTy &ImportList)
Distributed ThinLTO: collect the referenced modules based on module summary and initialize ImportList...
Definition: LTOBackend.cpp:709
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:1886
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.
Definition: LTOBackend.cpp:351
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:1198
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition: FileSystem.h:758
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
Definition: FileSystem.h:767
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:968
void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
Definition: Path.cpp:457
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.
Definition: AddressRanges.h:18
ThreadPoolStrategy heavyweight_hardware_concurrency(unsigned ThreadCount=0)
Returns a thread strategy for tasks requiring significant memory or other resources.
Definition: Threading.h:162
Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
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.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition: Error.cpp:98
raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
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:42
bool convertToDeclaration(GlobalValue &GV)
Converts value GV to declaration, or replaces with a declaration if it is an alias.
bool 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...
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 (....
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.
void updatePublicTypeTestCalls(Module &M, bool WholeProgramVisibilityEnabledInLTO)
void writeIndexToFile(const ModuleSummaryIndex &Index, raw_ostream &Out, const std::map< std::string, GVSummaryMapTy > *ModuleToSummariesForIndex=nullptr, const GVSummaryPtrSet *DecSummaries=nullptr)
Write the specified module summary index to the given raw output stream, where it will be written in ...
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
cl::opt< bool > NoPGOWarnMismatch
Definition: MemProfiler.cpp:56
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.
void thinLTOInternalizeModule(Module &TheModule, const GVSummaryMapTy &DefinedGlobals)
Internalize TheModule based on the information recorded in the summaries during global summary-based ...
cl::opt< bool > PrintPipelinePasses
Common option used by multiple tools to print pipeline passes.
ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
Definition: Error.cpp:111
void thinLTOFinalizeInModule(Module &TheModule, const GVSummaryMapTy &DefinedGlobals, bool PropagateAttrs)
Based on the information recorded in the summaries during global summary-based analysis:
A struct capturing PGO tunables.
Definition: PGOOptions.h:27
static const Target * lookupTarget(StringRef Triple, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
LTO configuration.
Definition: Config.h:41
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:219
bool DebugPassManager
Whether to emit the pass manager debuggging informations.
Definition: Config.h:166
bool AddFSDiscriminator
Add FSAFDO discriminators.
Definition: Config.h:184
std::optional< uint64_t > RemarksHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
Definition: Config.h:160
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...
Definition: LTOBackend.cpp:87
ModuleHookFn PreOptModuleHook
This module hook is called after linking (regular LTO) or loading (ThinLTO) the module,...
Definition: Config.h:223
CombinedIndexHookFn CombinedIndexHook
Definition: Config.h:255
std::optional< CodeModel::Model > CodeModel
Definition: Config.h:56
std::string AAPipeline
Definition: Config.h:105
std::function< void(legacy::PassManager &)> PreCodeGenPassesHook
For adding passes that run right before codegen.
Definition: Config.h:54
bool CodeGenOnly
Disable entirely the optimizer, including importing for ThinLTO.
Definition: Config.h:68
bool DisableVerify
Definition: Config.h:61
std::vector< std::string > MAttrs
Definition: Config.h:50
bool VerifyEach
Definition: Config.h:60
CodeGenOptLevel CGOptLevel
Definition: Config.h:57
PipelineTuningOptions PTO
Tunable parameters for passes in the default pipelines.
Definition: Config.h:193
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:190
std::string CPU
Definition: Config.h:48
std::string DwoDir
The directory to store .dwo files.
Definition: Config.h:125
std::string RemarksFilename
Optimization remarks file path.
Definition: Config.h:139
ModuleHookFn PostPromoteModuleHook
This hook is called after promoting any internal functions (ThinLTO-specific).
Definition: Config.h:227
std::string ProfileRemapping
Name remapping file for profile data.
Definition: Config.h:122
TargetOptions Options
Definition: Config.h:49
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:131
std::string SplitDwarfOutput
The path to write a .dwo file to.
Definition: Config.h:136
ModuleHookFn PostOptModuleHook
This module hook is called after optimization is complete.
Definition: Config.h:236
std::string RemarksPasses
Optimization remarks pass filter.
Definition: Config.h:142
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:100
bool RunCSIRInstr
Run PGO context sensitive IR instrumentation.
Definition: Config.h:71
ModuleHookFn PostInternalizeModuleHook
This hook is called after internalizing the module.
Definition: Config.h:230
unsigned OptLevel
Definition: Config.h:59
ModuleHookFn PostImportModuleHook
This hook is called after importing from other modules (ThinLTO-specific).
Definition: Config.h:233
bool RemarksWithHotness
Whether to emit optimization remarks with hotness informations.
Definition: Config.h:145
std::vector< std::string > PassPlugins
Definition: Config.h:52
std::string CSIRProfile
Context Sensitive PGO profile path.
Definition: Config.h:116
ModuleHookFn PreCodeGenModuleHook
This module hook is called before code generation.
Definition: Config.h:241
std::optional< Reloc::Model > RelocModel
Definition: Config.h:55
bool ShouldDiscardValueNames
Definition: Config.h:180
bool PGOWarnMismatch
Turn on/off the warning about a hash mismatch in the PGO profile data.
Definition: Config.h:74
CodeGenFileType CGFileType
Definition: Config.h:58
bool Freestanding
Flag to indicate that the optimizer should not assume builtins are present on the target.
Definition: Config.h:65
std::string SampleProfile
Sample PGO profile path.
Definition: Config.h:119
std::string RemarksFormat
The format used for serializing remarks (default: YAML).
Definition: Config.h:163
A derived class of LLVMContext that initializes itself according to a given Config object.
Definition: Config.h:294