LLVM 23.0.0git
ThinLTOCodeGenerator.cpp
Go to the documentation of this file.
1//===-ThinLTOCodeGenerator.cpp - LLVM Link Time Optimizer -----------------===//
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 Thin Link Time Optimization library. This library is
10// intended to be used by linker to optimize code at link time.
11//
12//===----------------------------------------------------------------------===//
13
16
17#include "llvm/ADT/ScopeExit.h"
18#include "llvm/ADT/Statistic.h"
26#include "llvm/Config/llvm-config.h"
27#include "llvm/IR/DebugInfo.h"
29#include "llvm/IR/LLVMContext.h"
32#include "llvm/IR/Mangler.h"
34#include "llvm/IR/Verifier.h"
36#include "llvm/LTO/LTO.h"
43#include "llvm/Support/Debug.h"
44#include "llvm/Support/Error.h"
47#include "llvm/Support/Path.h"
48#include "llvm/Support/SHA1.h"
61
62#if !defined(_MSC_VER) && !defined(__MINGW32__)
63#include <unistd.h>
64#else
65#include <io.h>
66#endif
67
68using namespace llvm;
69using namespace ThinLTOCodeGeneratorImpl;
70
71#define DEBUG_TYPE "thinlto"
72
73namespace llvm {
74// Flags -discard-value-names, defined in LTOCodeGenerator.cpp
84}
85
86// Default to using all available threads in the system, but using only one
87// thred per core, as indicated by the usage of
88// heavyweight_hardware_concurrency() below.
89static cl::opt<int> ThreadCount("threads", cl::init(0));
90
91// Simple helper to save temporary files for debug.
92static void saveTempBitcode(const Module &TheModule, StringRef TempDir,
93 unsigned count, StringRef Suffix) {
94 if (TempDir.empty())
95 return;
96 // User asked to save temps, let dump the bitcode file after import.
97 std::string SaveTempPath = (TempDir + llvm::Twine(count) + Suffix).str();
98 std::error_code EC;
99 raw_fd_ostream OS(SaveTempPath, EC, sys::fs::OF_None);
100 if (EC)
101 report_fatal_error(Twine("Failed to open ") + SaveTempPath +
102 " to save optimized bitcode\n");
103 WriteBitcodeToFile(TheModule, OS, /* ShouldPreserveUseListOrder */ true);
104}
105
107 ArrayRef<std::unique_ptr<GlobalValueSummary>> GVSummaryList) {
108 // If there is any strong definition anywhere, get it.
109 auto StrongDefForLinker = llvm::find_if(
110 GVSummaryList, [](const std::unique_ptr<GlobalValueSummary> &Summary) {
111 auto Linkage = Summary->linkage();
114 });
115 if (StrongDefForLinker != GVSummaryList.end())
116 return StrongDefForLinker->get();
117 // Get the first *linker visible* definition for this global in the summary
118 // list.
119 auto FirstDefForLinker = llvm::find_if(
120 GVSummaryList, [](const std::unique_ptr<GlobalValueSummary> &Summary) {
121 auto Linkage = Summary->linkage();
123 });
124 // Extern templates can be emitted as available_externally.
125 if (FirstDefForLinker == GVSummaryList.end())
126 return nullptr;
127 return FirstDefForLinker->get();
128}
129
130// Populate map of GUID to the prevailing copy for any multiply defined
131// symbols. Currently assume first copy is prevailing, or any strong
132// definition. Can be refined with Linker information in the future.
134 const ModuleSummaryIndex &Index,
136 auto HasMultipleCopies =
138 return GVSummaryList.size() > 1;
139 };
140
141 for (auto &I : Index) {
142 if (HasMultipleCopies(I.second.getSummaryList()))
143 PrevailingCopy[I.first] =
144 getFirstDefinitionForLinker(I.second.getSummaryList());
145 }
146}
147
149generateModuleMap(std::vector<std::unique_ptr<lto::InputFile>> &Modules) {
151 for (auto &M : Modules) {
152 LLVM_DEBUG(dbgs() << "Adding module " << M->getName() << " to ModuleMap\n");
153 assert(!ModuleMap.contains(M->getName()) &&
154 "Expect unique Buffer Identifier");
155 ModuleMap[M->getName()] = M.get();
156 }
157 return ModuleMap;
158}
159
160static void promoteModule(Module &TheModule, const ModuleSummaryIndex &Index,
161 bool ClearDSOLocalOnDeclarations) {
162 renameModuleForThinLTO(TheModule, Index, ClearDSOLocalOnDeclarations);
163}
164
165namespace {
166class ThinLTODiagnosticInfo : public DiagnosticInfo {
167 const Twine &Msg;
168public:
169 ThinLTODiagnosticInfo(const Twine &DiagMsg LLVM_LIFETIME_BOUND,
170 DiagnosticSeverity Severity = DS_Error)
171 : DiagnosticInfo(DK_Linker, Severity), Msg(DiagMsg) {}
172 void print(DiagnosticPrinter &DP) const override { DP << Msg; }
173};
174}
175
176/// Verify the module and strip broken debug info.
177static void verifyLoadedModule(Module &TheModule) {
178 bool BrokenDebugInfo = false;
179 if (verifyModule(TheModule, &dbgs(), &BrokenDebugInfo))
180 report_fatal_error("Broken module found, compilation aborted!");
181 if (BrokenDebugInfo) {
182 TheModule.getContext().diagnose(ThinLTODiagnosticInfo(
183 "Invalid debug info found, debug info will be stripped", DS_Warning));
184 StripDebugInfo(TheModule);
185 }
186}
187
188static std::unique_ptr<Module> loadModuleFromInput(lto::InputFile *Input,
189 LLVMContext &Context,
190 bool Lazy,
191 bool IsImporting) {
192 auto &Mod = Input->getSingleBitcodeModule();
193 SMDiagnostic Err;
195 Lazy ? Mod.getLazyModule(Context,
196 /* ShouldLazyLoadMetadata */ true, IsImporting)
197 : Mod.parseModule(Context);
198 if (!ModuleOrErr) {
199 handleAllErrors(ModuleOrErr.takeError(), [&](ErrorInfoBase &EIB) {
200 SMDiagnostic Err = SMDiagnostic(Mod.getModuleIdentifier(),
201 SourceMgr::DK_Error, EIB.message());
202 Err.print("ThinLTO", errs());
203 });
204 report_fatal_error("Can't load module, abort.");
205 }
206 if (!Lazy)
207 verifyLoadedModule(*ModuleOrErr.get());
208 return std::move(*ModuleOrErr);
209}
210
211static void
214 const FunctionImporter::ImportMapTy &ImportList,
215 bool ClearDSOLocalOnDeclarations) {
216 auto Loader = [&](StringRef Identifier) {
217 auto &Input = ModuleMap[Identifier];
218 return loadModuleFromInput(Input, TheModule.getContext(),
219 /*Lazy=*/true, /*IsImporting*/ true);
220 };
221
222 FunctionImporter Importer(Index, Loader, ClearDSOLocalOnDeclarations);
223 Expected<bool> Result = Importer.importFunctions(TheModule, ImportList);
224 if (!Result) {
225 handleAllErrors(Result.takeError(), [&](ErrorInfoBase &EIB) {
226 SMDiagnostic Err = SMDiagnostic(TheModule.getModuleIdentifier(),
227 SourceMgr::DK_Error, EIB.message());
228 Err.print("ThinLTO", errs());
229 });
230 report_fatal_error("importFunctions failed");
231 }
232 // Verify again after cross-importing.
233 verifyLoadedModule(TheModule);
234}
235
236static void optimizeModule(Module &TheModule, TargetMachine &TM,
237 unsigned OptLevel, bool Freestanding,
238 bool DebugPassManager, ModuleSummaryIndex *Index) {
239 std::optional<PGOOptions> PGOOpt;
240 if (LTORunCSIRInstr) {
241 PGOOpt =
243 /*MemoryProfile=*/"", PGOOptions::IRUse,
245 } else if (!LTOCSIRProfile.empty()) {
246 PGOOpt = PGOOptions(LTOCSIRProfile, "", "",
247 /*MemoryProfile=*/"", PGOOptions::IRUse,
249 }
254
256 StandardInstrumentations SI(TheModule.getContext(), DebugPassManager);
257 SI.registerCallbacks(PIC, &MAM);
259 PTO.LoopVectorization = true;
260 PTO.SLPVectorization = true;
261 PassBuilder PB(&TM, PTO, PGOOpt, &PIC);
262
263 std::unique_ptr<TargetLibraryInfoImpl> TLII(
265 if (Freestanding)
266 TLII->disableAllFunctions();
267 FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
268
269 // Register all the basic analyses with the managers.
270 PB.registerModuleAnalyses(MAM);
271 PB.registerCGSCCAnalyses(CGAM);
272 PB.registerFunctionAnalyses(FAM);
273 PB.registerLoopAnalyses(LAM);
274 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
275
277
279
280 switch (OptLevel) {
281 default:
282 llvm_unreachable("Invalid optimization level");
283 case 0:
285 break;
286 case 1:
288 break;
289 case 2:
291 break;
292 case 3:
294 break;
295 }
296
297 MPM.addPass(PB.buildThinLTODefaultPipeline(OL, Index));
298
299 MPM.run(TheModule, MAM);
300}
301
302static void
304 DenseSet<GlobalValue::GUID> &PreservedGUID) {
305 Triple TT(File.getTargetTriple());
306 RTLIB::RuntimeLibcallsInfo Libcalls(TT);
307 TargetLibraryInfoImpl TLII(TT);
308 TargetLibraryInfo TLI(TLII);
309 for (const auto &Sym : File.symbols())
310 if (Sym.isUsed() || Sym.isLibcall(TLI, Libcalls))
311 PreservedGUID.insert(
313}
314
315// Convert the PreservedSymbols map from "Name" based to "GUID" based.
317 const StringSet<> &PreservedSymbols,
318 const Triple &TheTriple,
320 // Iterate the symbols in the input file and if the input has preserved symbol
321 // compute the GUID for the symbol.
322 for (const auto &Sym : File.symbols()) {
323 if (PreservedSymbols.count(Sym.getName()) && !Sym.getIRName().empty())
325 GlobalValue::getGlobalIdentifier(Sym.getIRName(),
327 }
328}
329
332 const StringSet<> &PreservedSymbols,
333 const Triple &TheTriple) {
334 DenseSet<GlobalValue::GUID> GUIDPreservedSymbols(PreservedSymbols.size());
335 computeGUIDPreservedSymbols(File, PreservedSymbols, TheTriple,
336 GUIDPreservedSymbols);
337 return GUIDPreservedSymbols;
338}
339
340static std::unique_ptr<MemoryBuffer> codegenModule(Module &TheModule,
341 TargetMachine &TM) {
343
344 // CodeGen
345 {
348
349 // Setup the codegen now.
350 if (TM.addPassesToEmitFile(PM, OS, nullptr, CodeGenFileType::ObjectFile,
351 /* DisableVerify */ true))
352 report_fatal_error("Failed to setup codegen");
353
354 // Run codegen now. resulting binary is in OutputBuffer.
355 PM.run(TheModule);
356 }
357 return std::make_unique<SmallVectorMemoryBuffer>(
358 std::move(OutputBuffer), /*RequiresNullTerminator=*/false);
359}
360
361namespace {
362/// Manage caching for a single Module.
363class ModuleCacheEntry {
364 SmallString<128> EntryPath;
365
366public:
367 // Create a cache entry. This compute a unique hash for the Module considering
368 // the current list of export/import, and offer an interface to query to
369 // access the content in the cache.
370 ModuleCacheEntry(
371 StringRef CachePath, const ModuleSummaryIndex &Index, StringRef ModuleID,
372 const FunctionImporter::ImportMapTy &ImportList,
373 const FunctionImporter::ExportSetTy &ExportList,
374 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
375 const GVSummaryMapTy &DefinedGVSummaries, unsigned OptLevel,
376 bool Freestanding, const TargetMachineBuilder &TMBuilder) {
377 if (CachePath.empty())
378 return;
379
380 if (!Index.modulePaths().count(ModuleID))
381 // The module does not have an entry, it can't have a hash at all
382 return;
383
384 if (all_of(Index.getModuleHash(ModuleID),
385 [](uint32_t V) { return V == 0; }))
386 // No hash entry, no caching!
387 return;
388
389 llvm::lto::Config Conf;
390 Conf.OptLevel = OptLevel;
391 Conf.Options = TMBuilder.Options;
392 Conf.CPU = TMBuilder.MCpu;
393 Conf.MAttrs.push_back(TMBuilder.MAttr);
394 Conf.RelocModel = TMBuilder.RelocModel;
395 Conf.CGOptLevel = TMBuilder.CGOptLevel;
396 Conf.Freestanding = Freestanding;
397 std::string Key =
398 computeLTOCacheKey(Conf, Index, ModuleID, ImportList, ExportList,
399 ResolvedODR, DefinedGVSummaries);
400
401 // This choice of file name allows the cache to be pruned (see pruneCache()
402 // in include/llvm/Support/CachePruning.h).
403 sys::path::append(EntryPath, CachePath, Twine("llvmcache-", Key));
404 }
405
406 // Access the path to this entry in the cache.
407 StringRef getEntryPath() { return EntryPath; }
408
409 // Try loading the buffer for this cache entry.
410 ErrorOr<std::unique_ptr<MemoryBuffer>> tryLoadingBuffer() {
411 if (EntryPath.empty())
412 return std::error_code();
413 SmallString<64> ResultPath;
414 Expected<sys::fs::file_t> FDOrErr = sys::fs::openNativeFileForRead(
415 Twine(EntryPath), sys::fs::OF_UpdateAtime, &ResultPath);
416 if (!FDOrErr)
417 return errorToErrorCode(FDOrErr.takeError());
418 ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getOpenFile(
419 *FDOrErr, EntryPath, /*FileSize=*/-1, /*RequiresNullTerminator=*/false);
420 sys::fs::closeFile(*FDOrErr);
421 return MBOrErr;
422 }
423
424 // Cache the Produced object file
425 void write(const MemoryBuffer &OutputBuffer) {
426 if (EntryPath.empty())
427 return;
428
429 if (auto Err = llvm::writeToOutput(
430 EntryPath, [&OutputBuffer](llvm::raw_ostream &OS) -> llvm::Error {
431 OS << OutputBuffer.getBuffer();
432 return llvm::Error::success();
433 }))
434 report_fatal_error(llvm::formatv("ThinLTO: Can't write file {0}: {1}",
435 EntryPath,
436 toString(std::move(Err)).c_str()));
437 }
438};
439} // end anonymous namespace
440
441static std::unique_ptr<MemoryBuffer>
444 const FunctionImporter::ImportMapTy &ImportList,
445 const FunctionImporter::ExportSetTy &ExportList,
446 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols,
447 const GVSummaryMapTy &DefinedGlobals,
448 const ThinLTOCodeGenerator::CachingOptions &CacheOptions,
449 bool DisableCodeGen, StringRef SaveTempsDir,
450 bool Freestanding, unsigned OptLevel, unsigned count,
451 bool DebugPassManager) {
452 // "Benchmark"-like optimization: single-source case
453 bool SingleModule = (ModuleMap.size() == 1);
454
455 // When linking an ELF shared object, dso_local should be dropped. We
456 // conservatively do this for -fpic.
457 bool ClearDSOLocalOnDeclarations =
460 TheModule.getPIELevel() == PIELevel::Default;
461
462 if (!SingleModule) {
463 promoteModule(TheModule, Index, ClearDSOLocalOnDeclarations);
464
465 // Apply summary-based prevailing-symbol resolution decisions.
466 thinLTOFinalizeInModule(TheModule, DefinedGlobals, /*PropagateAttrs=*/true);
467
468 // Save temps: after promotion.
469 saveTempBitcode(TheModule, SaveTempsDir, count, ".1.promoted.bc");
470 }
471
472 // Be friendly and don't nuke totally the module when the client didn't
473 // supply anything to preserve.
474 if (!ExportList.empty() || !GUIDPreservedSymbols.empty()) {
475 // Apply summary-based internalization decisions.
476 thinLTOInternalizeModule(TheModule, DefinedGlobals);
477 }
478
479 // Save internalized bitcode
480 saveTempBitcode(TheModule, SaveTempsDir, count, ".2.internalized.bc");
481
482 if (!SingleModule)
483 crossImportIntoModule(TheModule, Index, ModuleMap, ImportList,
484 ClearDSOLocalOnDeclarations);
485
486 // Do this after any importing so that imported code is updated.
487 // See comment at call to updateVCallVisibilityInIndex() for why
488 // WholeProgramVisibilityEnabledInLTO is false.
490 /* WholeProgramVisibilityEnabledInLTO */ false);
491
492 // Save temps: after cross-module import.
493 saveTempBitcode(TheModule, SaveTempsDir, count, ".3.imported.bc");
494
495 optimizeModule(TheModule, TM, OptLevel, Freestanding, DebugPassManager,
496 &Index);
497
498 saveTempBitcode(TheModule, SaveTempsDir, count, ".4.opt.bc");
499
500 if (DisableCodeGen) {
501 // Configured to stop before CodeGen, serialize the bitcode and return.
503 {
505 ProfileSummaryInfo PSI(TheModule);
506 auto Index = buildModuleSummaryIndex(TheModule, nullptr, &PSI);
507 WriteBitcodeToFile(TheModule, OS, true, &Index);
508 }
509 return std::make_unique<SmallVectorMemoryBuffer>(
510 std::move(OutputBuffer), /*RequiresNullTerminator=*/false);
511 }
512
513 return codegenModule(TheModule, TM);
514}
515
516/// Resolve prevailing symbols. Record resolutions in the \p ResolvedODR map
517/// for caching, and in the \p Index for application during the ThinLTO
518/// backends. This is needed for correctness for exported symbols (ensure
519/// at least one copy kept) and a compile-time optimization (to drop duplicate
520/// copies when possible).
522 ModuleSummaryIndex &Index,
523 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>>
524 &ResolvedODR,
525 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols,
527 &PrevailingCopy) {
528
529 auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) {
530 const auto &Prevailing = PrevailingCopy.find(GUID);
531 // Not in map means that there was only one copy, which must be prevailing.
532 if (Prevailing == PrevailingCopy.end())
533 return true;
534 return Prevailing->second == S;
535 };
536
537 auto recordNewLinkage = [&](StringRef ModuleIdentifier,
539 GlobalValue::LinkageTypes NewLinkage) {
540 ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
541 };
542
543 // TODO Conf.VisibilityScheme can be lto::Config::ELF for ELF.
544 lto::Config Conf;
545 thinLTOResolvePrevailingInIndex(Conf, Index, isPrevailing, recordNewLinkage,
546 GUIDPreservedSymbols);
547}
548
549// Initialize the TargetMachine builder for a given Triple
550static void initTMBuilder(TargetMachineBuilder &TMBuilder,
551 const Triple &TheTriple) {
552 if (TMBuilder.MCpu.empty())
553 TMBuilder.MCpu = lto::getThinLTODefaultCPU(TheTriple);
554 TMBuilder.TheTriple = std::move(TheTriple);
555}
556
558 MemoryBufferRef Buffer(Data, Identifier);
559
560 auto InputOrError = lto::InputFile::create(Buffer);
561 if (!InputOrError)
562 report_fatal_error(Twine("ThinLTO cannot create input file: ") +
563 toString(InputOrError.takeError()));
564
565 auto TripleStr = (*InputOrError)->getTargetTriple();
566 Triple TheTriple(TripleStr);
567
568 if (Modules.empty())
569 initTMBuilder(TMBuilder, Triple(TheTriple));
570 else if (TMBuilder.TheTriple != TheTriple) {
571 if (!TMBuilder.TheTriple.isCompatibleWith(TheTriple))
572 report_fatal_error("ThinLTO modules with incompatible triples not "
573 "supported");
574 initTMBuilder(TMBuilder, Triple(TMBuilder.TheTriple.merge(TheTriple)));
575 }
576
577 Modules.emplace_back(std::move(*InputOrError));
578}
579
581 PreservedSymbols.insert(Name);
582}
583
585 // FIXME: At the moment, we don't take advantage of this extra information,
586 // we're conservatively considering cross-references as preserved.
587 // CrossReferencedSymbols.insert(Name);
588 PreservedSymbols.insert(Name);
589}
590
591// TargetMachine factory
592std::unique_ptr<TargetMachine> TargetMachineBuilder::create() const {
593 std::string ErrMsg;
594 const Target *TheTarget = TargetRegistry::lookupTarget(TheTriple, ErrMsg);
595 if (!TheTarget) {
596 report_fatal_error(Twine("Can't load target for this Triple: ") + ErrMsg);
597 }
598
599 // Use MAttr as the default set of features.
600 SubtargetFeatures Features(MAttr);
602 std::string FeatureStr = Features.getString();
603
604 std::unique_ptr<TargetMachine> TM(
605 TheTarget->createTargetMachine(TheTriple, MCpu, FeatureStr, Options,
606 RelocModel, std::nullopt, CGOptLevel));
607 assert(TM && "Cannot create target machine");
608
609 return TM;
610}
611
612/**
613 * Produce the combined summary index from all the bitcode files:
614 * "thin-link".
615 */
616std::unique_ptr<ModuleSummaryIndex> ThinLTOCodeGenerator::linkCombinedIndex() {
617 std::unique_ptr<ModuleSummaryIndex> CombinedIndex =
618 std::make_unique<ModuleSummaryIndex>(/*HaveGVs=*/false);
619 for (auto &Mod : Modules) {
620 auto &M = Mod->getSingleBitcodeModule();
621 if (Error Err = M.readSummary(*CombinedIndex, Mod->getName())) {
622 // FIXME diagnose
624 std::move(Err), errs(),
625 "error: can't create module summary index for buffer: ");
626 return nullptr;
627 }
628 }
629 return CombinedIndex;
630}
631
632namespace {
633struct IsExported {
635 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols;
636
637 IsExported(
639 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols)
640 : ExportLists(ExportLists), GUIDPreservedSymbols(GUIDPreservedSymbols) {}
641
642 bool operator()(StringRef ModuleIdentifier, ValueInfo VI) const {
643 const auto &ExportList = ExportLists.find(ModuleIdentifier);
644 return (ExportList != ExportLists.end() && ExportList->second.count(VI)) ||
645 GUIDPreservedSymbols.count(VI.getGUID());
646 }
647};
648
649struct IsPrevailing {
650 const DenseMap<GlobalValue::GUID, const GlobalValueSummary *> &PrevailingCopy;
651 IsPrevailing(const DenseMap<GlobalValue::GUID, const GlobalValueSummary *>
652 &PrevailingCopy)
653 : PrevailingCopy(PrevailingCopy) {}
654
655 bool operator()(GlobalValue::GUID GUID, const GlobalValueSummary *S) const {
656 const auto &Prevailing = PrevailingCopy.find(GUID);
657 // Not in map means that there was only one copy, which must be prevailing.
658 if (Prevailing == PrevailingCopy.end())
659 return true;
660 return Prevailing->second == S;
661 };
662};
663} // namespace
664
666 ModuleSummaryIndex &Index,
667 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
668 // We have no symbols resolution available. And can't do any better now in the
669 // case where the prevailing symbol is in a native object. It can be refined
670 // with linker information in the future.
671 auto isPrevailing = [&](GlobalValue::GUID G) {
673 };
674 computeDeadSymbolsWithConstProp(Index, GUIDPreservedSymbols, isPrevailing,
675 /* ImportEnabled = */ true);
676}
677
678/**
679 * Perform promotion and renaming of exported internal functions.
680 * Index is updated to reflect linkage changes from weak resolution.
681 */
683 const lto::InputFile &File) {
684 auto ModuleCount = Index.modulePaths().size();
685 auto ModuleIdentifier = TheModule.getModuleIdentifier();
686
687 // Collect for each module the list of function it defines (GUID -> Summary).
688 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries;
689 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
690
691 // Convert the preserved symbols set from string to GUID
692 auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(
693 File, PreservedSymbols, TheModule.getTargetTriple());
694
695 // Add used symbol to the preserved symbols.
696 addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols);
697
698 // Compute "dead" symbols, we don't want to import/export these!
699 computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols);
700
701 // Compute prevailing symbols
703 computePrevailingCopies(Index, PrevailingCopy);
704
705 // Generate import/export list
706 FunctionImporter::ImportListsTy ImportLists(ModuleCount);
708 ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries,
709 IsPrevailing(PrevailingCopy), ImportLists,
710 ExportLists);
711
712 // Resolve prevailing symbols
714 resolvePrevailingInIndex(Index, ResolvedODR, GUIDPreservedSymbols,
715 PrevailingCopy);
716
717 thinLTOFinalizeInModule(TheModule,
718 ModuleToDefinedGVSummaries[ModuleIdentifier],
719 /*PropagateAttrs=*/false);
720
721 // Promote the exported values in the index, so that they are promoted
722 // in the module.
724 Index, IsExported(ExportLists, GUIDPreservedSymbols),
725 IsPrevailing(PrevailingCopy));
726
727 // FIXME Set ClearDSOLocalOnDeclarations.
728 promoteModule(TheModule, Index, /*ClearDSOLocalOnDeclarations=*/false);
729}
730
731/**
732 * Perform cross-module importing for the module identified by ModuleIdentifier.
733 */
735 ModuleSummaryIndex &Index,
736 const lto::InputFile &File) {
737 auto ModuleMap = generateModuleMap(Modules);
738 auto ModuleCount = Index.modulePaths().size();
739
740 // Collect for each module the list of function it defines (GUID -> Summary).
741 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
742 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
743
744 // Convert the preserved symbols set from string to GUID
745 auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(
746 File, PreservedSymbols, TheModule.getTargetTriple());
747
748 addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols);
749
750 // Compute "dead" symbols, we don't want to import/export these!
751 computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols);
752
753 // Compute prevailing symbols
755 computePrevailingCopies(Index, PrevailingCopy);
756
757 // Generate import/export list
758 FunctionImporter::ImportListsTy ImportLists(ModuleCount);
760 ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries,
761 IsPrevailing(PrevailingCopy), ImportLists,
762 ExportLists);
763 auto &ImportList = ImportLists[TheModule.getModuleIdentifier()];
764
765 // FIXME Set ClearDSOLocalOnDeclarations.
766 crossImportIntoModule(TheModule, Index, ModuleMap, ImportList,
767 /*ClearDSOLocalOnDeclarations=*/false);
768}
769
770/**
771 * Compute the list of summaries needed for importing into module.
772 */
774 Module &TheModule, ModuleSummaryIndex &Index,
775 ModuleToSummariesForIndexTy &ModuleToSummariesForIndex,
776 GVSummaryPtrSet &DecSummaries, const lto::InputFile &File) {
777 auto ModuleCount = Index.modulePaths().size();
778 auto ModuleIdentifier = TheModule.getModuleIdentifier();
779
780 // Collect for each module the list of function it defines (GUID -> Summary).
781 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
782 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
783
784 // Convert the preserved symbols set from string to GUID
785 auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(
786 File, PreservedSymbols, TheModule.getTargetTriple());
787
788 addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols);
789
790 // Compute "dead" symbols, we don't want to import/export these!
791 computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols);
792
793 // Compute prevailing symbols
795 computePrevailingCopies(Index, PrevailingCopy);
796
797 // Generate import/export list
798 FunctionImporter::ImportListsTy ImportLists(ModuleCount);
800 ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries,
801 IsPrevailing(PrevailingCopy), ImportLists,
802 ExportLists);
803
805 ModuleIdentifier, ModuleToDefinedGVSummaries,
806 ImportLists[ModuleIdentifier], ModuleToSummariesForIndex, DecSummaries);
807}
808
809/**
810 * Emit the list of files needed for importing into module.
811 */
813 ModuleSummaryIndex &Index,
814 const lto::InputFile &File) {
815 auto ModuleCount = Index.modulePaths().size();
816 auto ModuleIdentifier = TheModule.getModuleIdentifier();
817
818 // Collect for each module the list of function it defines (GUID -> Summary).
819 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
820 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
821
822 // Convert the preserved symbols set from string to GUID
823 auto GUIDPreservedSymbols = computeGUIDPreservedSymbols(
824 File, PreservedSymbols, TheModule.getTargetTriple());
825
826 addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols);
827
828 // Compute "dead" symbols, we don't want to import/export these!
829 computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols);
830
831 // Compute prevailing symbols
833 computePrevailingCopies(Index, PrevailingCopy);
834
835 // Generate import/export list
836 FunctionImporter::ImportListsTy ImportLists(ModuleCount);
838 ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries,
839 IsPrevailing(PrevailingCopy), ImportLists,
840 ExportLists);
841
842 // 'EmitImportsFiles' emits the list of modules from which to import from, and
843 // the set of keys in `ModuleToSummariesForIndex` should be a superset of keys
844 // in `DecSummaries`, so no need to use `DecSummaries` in `EmitImportsFiles`.
845 GVSummaryPtrSet DecSummaries;
846 ModuleToSummariesForIndexTy ModuleToSummariesForIndex;
848 ModuleIdentifier, ModuleToDefinedGVSummaries,
849 ImportLists[ModuleIdentifier], ModuleToSummariesForIndex, DecSummaries);
850
851 if (Error EC = EmitImportsFiles(ModuleIdentifier, OutputName,
852 ModuleToSummariesForIndex))
853 report_fatal_error(Twine("Failed to open ") + OutputName +
854 " to save imports lists\n");
855}
856
857/**
858 * Perform internalization. Runs promote and internalization together.
859 * Index is updated to reflect linkage changes.
860 */
862 ModuleSummaryIndex &Index,
863 const lto::InputFile &File) {
864 initTMBuilder(TMBuilder, TheModule.getTargetTriple());
865 auto ModuleCount = Index.modulePaths().size();
866 auto ModuleIdentifier = TheModule.getModuleIdentifier();
867
868 // Convert the preserved symbols set from string to GUID
869 auto GUIDPreservedSymbols =
870 computeGUIDPreservedSymbols(File, PreservedSymbols, TMBuilder.TheTriple);
871
872 addUsedSymbolToPreservedGUID(File, GUIDPreservedSymbols);
873
874 // Collect for each module the list of function it defines (GUID -> Summary).
875 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
876 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
877
878 // Compute "dead" symbols, we don't want to import/export these!
879 computeDeadSymbolsInIndex(Index, GUIDPreservedSymbols);
880
881 // Compute prevailing symbols
883 computePrevailingCopies(Index, PrevailingCopy);
884
885 // Generate import/export list
886 FunctionImporter::ImportListsTy ImportLists(ModuleCount);
888 ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries,
889 IsPrevailing(PrevailingCopy), ImportLists,
890 ExportLists);
891 auto &ExportList = ExportLists[ModuleIdentifier];
892
893 // Be friendly and don't nuke totally the module when the client didn't
894 // supply anything to preserve.
895 if (ExportList.empty() && GUIDPreservedSymbols.empty())
896 return;
897
898 // Resolve prevailing symbols
900 resolvePrevailingInIndex(Index, ResolvedODR, GUIDPreservedSymbols,
901 PrevailingCopy);
902
903 // Promote the exported values in the index, so that they are promoted
904 // in the module.
906 Index, IsExported(ExportLists, GUIDPreservedSymbols),
907 IsPrevailing(PrevailingCopy));
908
909 // FIXME Set ClearDSOLocalOnDeclarations.
910 promoteModule(TheModule, Index, /*ClearDSOLocalOnDeclarations=*/false);
911
912 // Internalization
913 thinLTOFinalizeInModule(TheModule,
914 ModuleToDefinedGVSummaries[ModuleIdentifier],
915 /*PropagateAttrs=*/false);
916
917 thinLTOInternalizeModule(TheModule,
918 ModuleToDefinedGVSummaries[ModuleIdentifier]);
919}
920
921/**
922 * Perform post-importing ThinLTO optimizations.
923 */
925 initTMBuilder(TMBuilder, TheModule.getTargetTriple());
926
927 // Optimize now
928 optimizeModule(TheModule, *TMBuilder.create(), OptLevel, Freestanding,
929 DebugPassManager, nullptr);
930}
931
932/// Write out the generated object file, either from CacheEntryPath or from
933/// OutputBuffer, preferring hard-link when possible.
934/// Returns the path to the generated file in SavedObjectsDirectoryPath.
935std::string
937 const MemoryBuffer &OutputBuffer) {
938 auto ArchName = TMBuilder.TheTriple.getArchName();
939 SmallString<128> OutputPath(SavedObjectsDirectoryPath);
940 llvm::sys::path::append(OutputPath,
941 Twine(count) + "." + ArchName + ".thinlto.o");
942 OutputPath.c_str(); // Ensure the string is null terminated.
943 if (sys::fs::exists(OutputPath))
944 sys::fs::remove(OutputPath);
945
946 // We don't return a memory buffer to the linker, just a list of files.
947 if (!CacheEntryPath.empty()) {
948 // Cache is enabled, hard-link the entry (or copy if hard-link fails).
949 auto Err = sys::fs::create_hard_link(CacheEntryPath, OutputPath);
950 if (!Err)
951 return std::string(OutputPath);
952 // Hard linking failed, try to copy.
953 Err = sys::fs::copy_file(CacheEntryPath, OutputPath);
954 if (!Err)
955 return std::string(OutputPath);
956 // Copy failed (could be because the CacheEntry was removed from the cache
957 // in the meantime by another process), fall back and try to write down the
958 // buffer to the output.
959 errs() << "remark: can't link or copy from cached entry '" << CacheEntryPath
960 << "' to '" << OutputPath << "'\n";
961 }
962 // No cache entry, just write out the buffer.
963 std::error_code Err;
964 raw_fd_ostream OS(OutputPath, Err, sys::fs::OF_None);
965 if (Err)
966 report_fatal_error(Twine("Can't open output '") + OutputPath + "'\n");
967 OS << OutputBuffer.getBuffer();
968 return std::string(OutputPath);
969}
970
971// Main entry point for the ThinLTO processing
973 timeTraceProfilerBegin("ThinLink", StringRef(""));
974 llvm::scope_exit TimeTraceScopeExit([]() {
977 });
978 // Prepare the resulting object vector
979 assert(ProducedBinaries.empty() && "The generator should not be reused");
980 if (SavedObjectsDirectoryPath.empty())
981 ProducedBinaries.resize(Modules.size());
982 else {
983 sys::fs::create_directories(SavedObjectsDirectoryPath);
984 bool IsDir;
985 sys::fs::is_directory(SavedObjectsDirectoryPath, IsDir);
986 if (!IsDir)
987 report_fatal_error(Twine("Unexistent dir: '") + SavedObjectsDirectoryPath + "'");
988 ProducedBinaryFiles.resize(Modules.size());
989 }
990
991 if (CodeGenOnly) {
992 // Perform only parallel codegen and return.
994 int count = 0;
995 for (auto &Mod : Modules) {
996 Pool.async([&](int count) {
997 LLVMContext Context;
999
1000 // Parse module now
1001 auto TheModule = loadModuleFromInput(Mod.get(), Context, false,
1002 /*IsImporting*/ false);
1003
1004 // CodeGen
1005 auto OutputBuffer = codegenModule(*TheModule, *TMBuilder.create());
1006 if (SavedObjectsDirectoryPath.empty())
1007 ProducedBinaries[count] = std::move(OutputBuffer);
1008 else
1009 ProducedBinaryFiles[count] =
1011 }, count++);
1012 }
1013
1014 return;
1015 }
1016
1017 // Sequential linking phase
1018 auto Index = linkCombinedIndex();
1019
1020 // Save temps: index.
1021 if (!SaveTempsDir.empty()) {
1022 auto SaveTempPath = SaveTempsDir + "index.bc";
1023 std::error_code EC;
1024 raw_fd_ostream OS(SaveTempPath, EC, sys::fs::OF_None);
1025 if (EC)
1026 report_fatal_error(Twine("Failed to open ") + SaveTempPath +
1027 " to save optimized bitcode\n");
1028 writeIndexToFile(*Index, OS);
1029 }
1030
1031
1032 // Prepare the module map.
1033 auto ModuleMap = generateModuleMap(Modules);
1034 auto ModuleCount = Modules.size();
1035
1036 // Collect for each module the list of function it defines (GUID -> Summary).
1037 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
1038 Index->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
1039
1040 // Convert the preserved symbols set from string to GUID, this is needed for
1041 // computing the caching hash and the internalization.
1042 DenseSet<GlobalValue::GUID> GUIDPreservedSymbols;
1043 for (const auto &M : Modules)
1044 computeGUIDPreservedSymbols(*M, PreservedSymbols, TMBuilder.TheTriple,
1045 GUIDPreservedSymbols);
1046
1047 // Add used symbol from inputs to the preserved symbols.
1048 for (const auto &M : Modules)
1049 addUsedSymbolToPreservedGUID(*M, GUIDPreservedSymbols);
1050
1051 // Compute "dead" symbols, we don't want to import/export these!
1052 computeDeadSymbolsInIndex(*Index, GUIDPreservedSymbols);
1053
1054 // Currently there is no support for enabling whole program visibility via a
1055 // linker option in the old LTO API, but this call allows it to be specified
1056 // via the internal option. Must be done before WPD below.
1057 if (hasWholeProgramVisibility(/* WholeProgramVisibilityEnabledInLTO */ false))
1058 Index->setWithWholeProgramVisibility();
1059
1060 // FIXME: This needs linker information via a TBD new interface
1062 /*WholeProgramVisibilityEnabledInLTO=*/false,
1063 // FIXME: These need linker information via a
1064 // TBD new interface.
1065 /*DynamicExportSymbols=*/{},
1066 /*VisibleToRegularObjSymbols=*/{});
1067
1068 // Perform index-based WPD. This will return immediately if there are
1069 // no index entries in the typeIdMetadata map (e.g. if we are instead
1070 // performing IR-based WPD in hybrid regular/thin LTO mode).
1071 std::map<ValueInfo, std::vector<VTableSlotSummary>> LocalWPDTargetsMap;
1072 std::set<GlobalValue::GUID> ExportedGUIDs;
1073 runWholeProgramDevirtOnIndex(*Index, ExportedGUIDs, LocalWPDTargetsMap);
1074 GUIDPreservedSymbols.insert_range(ExportedGUIDs);
1075
1076 // Compute prevailing symbols
1078 computePrevailingCopies(*Index, PrevailingCopy);
1079
1080 // Collect the import/export lists for all modules from the call-graph in the
1081 // combined index.
1082 FunctionImporter::ImportListsTy ImportLists(ModuleCount);
1084 ComputeCrossModuleImport(*Index, ModuleToDefinedGVSummaries,
1085 IsPrevailing(PrevailingCopy), ImportLists,
1086 ExportLists);
1087
1088 // We use a std::map here to be able to have a defined ordering when
1089 // producing a hash for the cache entry.
1090 // FIXME: we should be able to compute the caching hash for the entry based
1091 // on the index, and nuke this map.
1093
1094 // Resolve prevailing symbols, this has to be computed early because it
1095 // impacts the caching.
1096 resolvePrevailingInIndex(*Index, ResolvedODR, GUIDPreservedSymbols,
1097 PrevailingCopy);
1098
1099 // Use global summary-based analysis to identify symbols that can be
1100 // internalized (because they aren't exported or preserved as per callback).
1101 // Changes are made in the index, consumed in the ThinLTO backends.
1103 IsExported(ExportLists, GUIDPreservedSymbols),
1104 LocalWPDTargetsMap);
1106 *Index, IsExported(ExportLists, GUIDPreservedSymbols),
1107 IsPrevailing(PrevailingCopy));
1108
1109 thinLTOPropagateFunctionAttrs(*Index, IsPrevailing(PrevailingCopy));
1110
1111 // Make sure that every module has an entry in the ExportLists, ImportList,
1112 // GVSummary and ResolvedODR maps to enable threaded access to these maps
1113 // below.
1114 for (auto &Module : Modules) {
1115 auto ModuleIdentifier = Module->getName();
1116 ExportLists[ModuleIdentifier];
1117 ImportLists[ModuleIdentifier];
1118 ResolvedODR[ModuleIdentifier];
1119 ModuleToDefinedGVSummaries[ModuleIdentifier];
1120 }
1121
1122 std::vector<BitcodeModule *> ModulesVec;
1123 ModulesVec.reserve(Modules.size());
1124 for (auto &Mod : Modules)
1125 ModulesVec.push_back(&Mod->getSingleBitcodeModule());
1126 std::vector<int> ModulesOrdering = lto::generateModulesOrdering(ModulesVec);
1127
1130
1131 TimeTraceScopeExit.release();
1132
1133 // Parallel optimizer + codegen
1134 {
1136 for (auto IndexCount : ModulesOrdering) {
1137 auto &Mod = Modules[IndexCount];
1138 Pool.async([&](int count) {
1139 auto ModuleIdentifier = Mod->getName();
1140 auto &ExportList = ExportLists[ModuleIdentifier];
1141
1142 auto &DefinedGVSummaries = ModuleToDefinedGVSummaries[ModuleIdentifier];
1143
1144 // The module may be cached, this helps handling it.
1145 ModuleCacheEntry CacheEntry(CacheOptions.Path, *Index, ModuleIdentifier,
1146 ImportLists[ModuleIdentifier], ExportList,
1147 ResolvedODR[ModuleIdentifier],
1148 DefinedGVSummaries, OptLevel, Freestanding,
1149 TMBuilder);
1150 auto CacheEntryPath = CacheEntry.getEntryPath();
1151
1152 {
1153 auto ErrOrBuffer = CacheEntry.tryLoadingBuffer();
1154 LLVM_DEBUG(dbgs() << "Cache " << (ErrOrBuffer ? "hit" : "miss")
1155 << " '" << CacheEntryPath << "' for buffer "
1156 << count << " " << ModuleIdentifier << "\n");
1157
1158 if (ErrOrBuffer) {
1159 // Cache Hit!
1160 if (SavedObjectsDirectoryPath.empty())
1161 ProducedBinaries[count] = std::move(ErrOrBuffer.get());
1162 else
1163 ProducedBinaryFiles[count] = writeGeneratedObject(
1164 count, CacheEntryPath, *ErrOrBuffer.get());
1165 return;
1166 }
1167 }
1168
1169 LLVMContext Context;
1171 Context.enableDebugTypeODRUniquing();
1172 auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
1175 if (!DiagFileOrErr) {
1176 errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";
1177 report_fatal_error("ThinLTO: Can't get an output file for the "
1178 "remarks");
1179 }
1180
1181 // Parse module now
1182 auto TheModule = loadModuleFromInput(Mod.get(), Context, false,
1183 /*IsImporting*/ false);
1184
1185 // Save temps: original file.
1186 saveTempBitcode(*TheModule, SaveTempsDir, count, ".0.original.bc");
1187
1188 auto &ImportList = ImportLists[ModuleIdentifier];
1189 // Run the main process now, and generates a binary
1191 *TheModule, *Index, ModuleMap, *TMBuilder.create(), ImportList,
1192 ExportList, GUIDPreservedSymbols,
1193 ModuleToDefinedGVSummaries[ModuleIdentifier], CacheOptions,
1194 DisableCodeGen, SaveTempsDir, Freestanding, OptLevel, count,
1195 DebugPassManager);
1196
1197 // Commit to the cache (if enabled)
1198 CacheEntry.write(*OutputBuffer);
1199
1200 if (SavedObjectsDirectoryPath.empty()) {
1201 // We need to generated a memory buffer for the linker.
1202 if (!CacheEntryPath.empty()) {
1203 // When cache is enabled, reload from the cache if possible.
1204 // Releasing the buffer from the heap and reloading it from the
1205 // cache file with mmap helps us to lower memory pressure.
1206 // The freed memory can be used for the next input file.
1207 // The final binary link will read from the VFS cache (hopefully!)
1208 // or from disk (if the memory pressure was too high).
1209 auto ReloadedBufferOrErr = CacheEntry.tryLoadingBuffer();
1210 if (auto EC = ReloadedBufferOrErr.getError()) {
1211 // On error, keep the preexisting buffer and print a diagnostic.
1212 errs() << "remark: can't reload cached file '" << CacheEntryPath
1213 << "': " << EC.message() << "\n";
1214 } else {
1215 OutputBuffer = std::move(*ReloadedBufferOrErr);
1216 }
1217 }
1218 ProducedBinaries[count] = std::move(OutputBuffer);
1219 return;
1220 }
1221 ProducedBinaryFiles[count] = writeGeneratedObject(
1222 count, CacheEntryPath, *OutputBuffer);
1223 }, IndexCount);
1224 }
1225 }
1226
1227 pruneCache(CacheOptions.Path, CacheOptions.Policy, ProducedBinaries);
1228
1229 // If statistics were requested, print them out now.
1233}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file provides a bitcode writing pass.
#define LLVM_LIFETIME_BOUND
Definition Compiler.h:435
DXIL Finalize Linkage
Provides passes for computing function attributes based on interprocedural analyses.
This file implements a simple parser to decode commandline option for remarks hotness threshold that ...
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This is the interface to build a ModuleSummaryIndex for a module.
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 classes/functions to handle pass execution timing information with interfaces for...
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This header defines a class that provides bookkeeping for all standard (i.e in-tree) pass instrumenta...
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static void crossImportIntoModule(Module &TheModule, const ModuleSummaryIndex &Index, StringMap< lto::InputFile * > &ModuleMap, const FunctionImporter::ImportMapTy &ImportList, bool ClearDSOLocalOnDeclarations)
static void computeDeadSymbolsInIndex(ModuleSummaryIndex &Index, const DenseSet< GlobalValue::GUID > &GUIDPreservedSymbols)
static StringMap< lto::InputFile * > generateModuleMap(std::vector< std::unique_ptr< lto::InputFile > > &Modules)
static void initTMBuilder(TargetMachineBuilder &TMBuilder, const Triple &TheTriple)
static void resolvePrevailingInIndex(ModuleSummaryIndex &Index, StringMap< std::map< GlobalValue::GUID, GlobalValue::LinkageTypes > > &ResolvedODR, const DenseSet< GlobalValue::GUID > &GUIDPreservedSymbols, const DenseMap< GlobalValue::GUID, const GlobalValueSummary * > &PrevailingCopy)
Resolve prevailing symbols.
static const GlobalValueSummary * getFirstDefinitionForLinker(ArrayRef< std::unique_ptr< GlobalValueSummary > > GVSummaryList)
static void computePrevailingCopies(const ModuleSummaryIndex &Index, DenseMap< GlobalValue::GUID, const GlobalValueSummary * > &PrevailingCopy)
static void saveTempBitcode(const Module &TheModule, StringRef TempDir, unsigned count, StringRef Suffix)
static void verifyLoadedModule(Module &TheModule)
Verify the module and strip broken debug info.
static void addUsedSymbolToPreservedGUID(const lto::InputFile &File, DenseSet< GlobalValue::GUID > &PreservedGUID)
static std::unique_ptr< MemoryBuffer > ProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index, StringMap< lto::InputFile * > &ModuleMap, TargetMachine &TM, const FunctionImporter::ImportMapTy &ImportList, const FunctionImporter::ExportSetTy &ExportList, const DenseSet< GlobalValue::GUID > &GUIDPreservedSymbols, const GVSummaryMapTy &DefinedGlobals, const ThinLTOCodeGenerator::CachingOptions &CacheOptions, bool DisableCodeGen, StringRef SaveTempsDir, bool Freestanding, unsigned OptLevel, unsigned count, bool DebugPassManager)
static cl::opt< int > ThreadCount("threads", cl::init(0))
static std::unique_ptr< MemoryBuffer > codegenModule(Module &TheModule, TargetMachine &TM)
static void optimizeModule(Module &TheModule, TargetMachine &TM, unsigned OptLevel, bool Freestanding, bool DebugPassManager, ModuleSummaryIndex *Index)
static void computeGUIDPreservedSymbols(const lto::InputFile &File, const StringSet<> &PreservedSymbols, const Triple &TheTriple, DenseSet< GlobalValue::GUID > &GUIDs)
static std::unique_ptr< Module > loadModuleFromInput(lto::InputFile *Input, LLVMContext &Context, bool Lazy, bool IsImporting)
static void promoteModule(Module &TheModule, const ModuleSummaryIndex &Index, bool ClearDSOLocalOnDeclarations)
The Input class is used to parse a yaml document into in-memory structs and vectors.
char * getBuffer()
Definition Utility.h:220
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
iterator end()
Definition DenseMap.h:81
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
This is the base abstract class for diagnostic reporting in the backend.
Base class for error info classes.
Definition Error.h:44
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.
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.
DenseSet< ValueInfo > ExportSetTy
The set contains an entry for every global value that the module exports.
Function and variable summary information to aid decisions and implementation of importing.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
Definition Globals.cpp:80
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
static bool isAvailableExternallyLinkage(LinkageTypes Linkage)
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
Definition Globals.cpp:170
bool isWeakForLinker() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition GlobalValue.h:52
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
LLVM_ABI void setDiscardValueNames(bool Discard)
Set the Context runtime configuration to discard all value name (but GlobalValue).
This interface provides simple read-only access to a block of memory, and provides simple methods for...
static ErrorOr< std::unique_ptr< MemoryBuffer > > getOpenFile(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Given an already-open file descriptor, read the file and return a MemoryBuffer.
StringRef getBuffer() const
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
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Definition Module.h:283
LLVMContext & getContext() const
Get the global data context.
Definition Module.h:287
StringRef getName() const
Get a short "name" for the module.
Definition Module.h:271
const std::string & getModuleIdentifier() const
Get the module identifier which is, essentially, the name of the module.
Definition Module.h:254
PIELevel::Level getPIELevel() const
Returns the PIE level (small or large model)
Definition Module.cpp:643
static LLVM_ABI const OptimizationLevel O3
Optimize for fast execution as much as possible.
static LLVM_ABI const OptimizationLevel O0
Disable as many optimizations as possible.
static LLVM_ABI const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static LLVM_ABI const OptimizationLevel O1
Optimize quickly without destroying debuggability.
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs)
Run all of the passes in this manager over the given unit of IR.
Tunable parameters for passes in the default pipelines.
Definition PassBuilder.h:41
bool SLPVectorization
Tuning option to enable/disable slp loop vectorization, set based on opt level.
Definition PassBuilder.h:56
bool LoopVectorization
Tuning option to enable/disable loop vectorization, set based on opt level.
Definition PassBuilder.h:52
Analysis providing profile information.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:298
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
const char * c_str()
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class provides an interface to register all the standard pass instrumentations and manages their...
unsigned size() const
Definition StringMap.h:109
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:133
bool contains(StringRef Key) const
contains - Return true if the element is in the map, false otherwise.
Definition StringMap.h:280
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
Definition StringMap.h:285
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
StringSet - A wrapper for StringMap that provides set-like functionality.
Definition StringSet.h:25
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.
Analysis pass providing the TargetLibraryInfo.
Implementation of the target library information.
Provides information about what library functions are available for the current target.
Primary interface to the complete machine description for the target machine.
virtual bool addPassesToEmitFile(PassManagerBase &, raw_pwrite_stream &, raw_pwrite_stream *, CodeGenFileType, bool=true, MachineModuleInfoWrapperPass *MMIWP=nullptr)
Add passes to the specified pass manager to get the specified file emitted.
const Triple & getTargetTriple() const
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
TargetOptions Options
VectorLibrary VecLib
Vector math library to use.
Target - Wrapper for Target specific information.
TargetMachine * createTargetMachine(const Triple &TT, StringRef CPU, StringRef Features, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM=std::nullopt, CodeGenOptLevel OL=CodeGenOptLevel::Default, bool JIT=false) const
createTargetMachine - Create a target specific machine implementation for the specified Triple.
LLVM_ABI void preserveSymbol(StringRef Name)
Adds to a list of all global symbols that must exist in the final generated code.
LLVM_ABI void run()
Process all the modules that were added to the code generator in parallel.
LLVM_ABI void crossReferenceSymbol(StringRef Name)
Adds to a list of all global symbols that are cross-referenced between ThinLTO files.
LLVM_ABI void addModule(StringRef Identifier, StringRef Data)
Add given module to the code generator.
auto async(Function &&F, Args &&...ArgList)
Asynchronous submission of a task to the pool.
Definition ThreadPool.h:80
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:782
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
void insert_range(Range &&R)
Definition DenseSet.h:228
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:180
PassManager manages ModulePassManagers.
bool run(Module &M)
run - Execute all of the passes scheduled for execution.
An input file.
Definition LTO.h:115
static LLVM_ABI Expected< std::unique_ptr< InputFile > > create(MemoryBufferRef Object)
Create an InputFile.
Definition LTO.cpp:624
A raw_ostream that writes to a file descriptor.
A raw_ostream that writes to an SmallVector or SmallString.
LLVM_ABI void optimize(Module &Module)
Perform post-importing ThinLTO optimizations.
LLVM_ABI std::unique_ptr< ModuleSummaryIndex > linkCombinedIndex()
Produce the combined summary index from all the bitcode files: "thin-link".
LLVM_ABI void crossModuleImport(Module &Module, ModuleSummaryIndex &Index, const lto::InputFile &File)
Perform cross-module importing for the module identified by ModuleIdentifier.
LLVM_ABI void emitImports(Module &Module, StringRef OutputName, ModuleSummaryIndex &Index, const lto::InputFile &File)
Compute and emit the imported files for module at ModulePath.
LLVM_ABI void internalize(Module &Module, ModuleSummaryIndex &Index, const lto::InputFile &File)
Perform internalization.
LLVM_ABI void gatherImportedSummariesForModule(Module &Module, ModuleSummaryIndex &Index, ModuleToSummariesForIndexTy &ModuleToSummariesForIndex, GVSummaryPtrSet &DecSummaries, const lto::InputFile &File)
Compute the list of summaries and the subset of declaration summaries needed for importing into modul...
LLVM_ABI void promote(Module &Module, ModuleSummaryIndex &Index, const lto::InputFile &File)
Perform promotion and renaming of exported internal functions, and additionally resolve weak and link...
LLVM_ABI std::string writeGeneratedObject(int count, StringRef CacheEntryPath, const MemoryBuffer &OutputBuffer)
Write temporary object file to SavedObjectDirectoryPath, write symlink to Cache directory if needed.
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.
ThinLTOCodeGeneratorImpl - Namespace used for ThinLTOCodeGenerator implementation details.
initializer< Ty > init(const Ty &Val)
LLVM_ABI StringLiteral getThinLTODefaultCPU(const Triple &TheTriple)
Definition LTO.cpp:1892
LLVM_ABI Expected< LLVMRemarkFileHandle > setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses, StringRef RemarksFormat, bool RemarksWithHotness, std::optional< uint64_t > RemarksHotnessThreshold=0, int Count=-1)
Setup optimization remarks.
Definition LTO.cpp:2301
LLVM_ABI std::vector< int > generateModulesOrdering(ArrayRef< BitcodeModule * > R)
Produces a container ordering for optimal multi-threaded processing.
Definition LTO.cpp:2345
LLVM_ABI std::error_code closeFile(file_t &F)
Close the file object.
LLVM_ABI std::error_code create_hard_link(const Twine &to, const Twine &from)
Create a hard link from from to to, or return an error.
LLVM_ABI bool exists(const basic_file_status &status)
Does file exist?
Definition Path.cpp:1097
@ OF_UpdateAtime
Force files Atime to be updated on access.
Definition FileSystem.h:801
LLVM_ABI std::error_code remove(const Twine &path, bool IgnoreNonExisting=true)
Remove path.
LLVM_ABI Expected< file_t > openNativeFileForRead(const Twine &Name, OpenFlags Flags=OF_None, SmallVectorImpl< char > *RealPath=nullptr)
Opens the file with the given name in a read-only mode, returning its open file descriptor.
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:983
LLVM_ABI std::error_code copy_file(const Twine &From, const Twine &To)
Copy the contents of From to To.
Definition Path.cpp:1032
LLVM_ABI bool is_directory(const basic_file_status &status)
Does status represent a directory?
Definition Path.cpp:1112
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
Definition Path.cpp:457
This is an optimization pass for GlobalISel generic memory operations.
ThreadPoolStrategy heavyweight_hardware_concurrency(unsigned ThreadCount=0)
Returns a thread strategy for tasks requiring significant memory or other resources.
Definition Threading.h:167
LLVM_ABI void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner={})
Log all errors (if any) in E to OS.
Definition Error.cpp:61
cl::opt< std::string > RemarksFormat("lto-pass-remarks-format", cl::desc("The format used for serializing remarks (default: YAML)"), cl::value_desc("format"), cl::init("yaml"))
LLVM_ABI void runWholeProgramDevirtOnIndex(ModuleSummaryIndex &Summary, std::set< GlobalValue::GUID > &ExportedGUIDs, std::map< ValueInfo, std::vector< VTableSlotSummary > > &LocalWPDTargetsMap, DenseSet< StringRef > *ExternallyVisibleSymbolNamesPtr=nullptr)
Perform index-based whole program devirtualization on the Summary index.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1738
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
cl::opt< bool > LTODiscardValueNames("lto-discard-value-names", cl::desc("Strip names from Value during LTO (other than GlobalValue)."), cl::init(false), cl::Hidden)
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.
cl::opt< std::string > RemarksPasses("lto-pass-remarks-filter", cl::desc("Only record optimization remarks from passes whose " "names match the given regular expression"), cl::value_desc("regex"))
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
Definition Error.h:1013
SmallVectorImpl< T >::const_pointer c_str(SmallVectorImpl< T > &str)
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 thinLTOPropagateFunctionAttrs(ModuleSummaryIndex &Index, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing)
Propagate function attributes for function summaries along the index's callgraph during thinlink.
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...
LLVM_ABI ModuleSummaryIndex buildModuleSummaryIndex(const Module &M, std::function< BlockFrequencyInfo *(const Function &F)> GetBFICallback, ProfileSummaryInfo *PSI, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback=[](const Function &F) -> const StackSafetyInfo *{ return nullptr;})
Direct function to compute a ModuleSummaryIndex from a given module.
LLVM_ABI void reportAndResetTimings(raw_ostream *OutStream=nullptr)
If -time-passes has been specified, report the timings immediately and then reset the timers to zero.
LLVM_ABI bool hasWholeProgramVisibility(bool WholeProgramVisibilityEnabledInLTO)
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 ComputeCrossModuleImport(const ModuleSummaryIndex &Index, const DenseMap< StringRef, GVSummaryMapTy > &ModuleToDefinedGVSummaries, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing, FunctionImporter::ImportListsTy &ImportLists, DenseMap< StringRef, FunctionImporter::ExportSetTy > &ExportLists)
Compute all the imports and exports for every module in the Index.
LLVM_ABI void updateIndexWPDForExports(ModuleSummaryIndex &Summary, function_ref< bool(StringRef, ValueInfo)> isExported, std::map< ValueInfo, std::vector< VTableSlotSummary > > &LocalWPDTargetsMap, DenseSet< StringRef > *ExternallyVisibleSymbolNamesPtr=nullptr)
Call after cross-module importing to update the recorded single impl devirt target names for any loca...
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
LLVM_ABI void updatePublicTypeTestCalls(Module &M, bool WholeProgramVisibilityEnabledInLTO)
cl::opt< std::string > LTOCSIRProfile("cs-profile-path", cl::desc("Context sensitive profile file path"))
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
bool timeTraceProfilerEnabled()
Is the time trace profiler enabled, i.e. initialized?
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
LLVM_ABI Error writeToOutput(StringRef OutputFileName, std::function< Error(raw_ostream &)> Write)
This helper creates an output stream and then passes it to Write.
LLVM_ABI bool AreStatisticsEnabled()
Check if statistics are enabled.
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
cl::opt< bool > RemarksWithHotness("lto-pass-remarks-with-hotness", cl::desc("With PGO, include profile count in optimization remarks"), cl::Hidden)
LLVM_ABI void timeTraceProfilerEnd()
Manually end the last time section.
cl::opt< std::string > RemarksFilename("lto-pass-remarks-output", cl::desc("Output filename for pass remarks"), cl::value_desc("filename"))
LLVM_ABI void thinLTOResolvePrevailingInIndex(const lto::Config &C, ModuleSummaryIndex &Index, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing, function_ref< void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)> recordNewLinkage, const DenseSet< GlobalValue::GUID > &GUIDPreservedSymbols)
Resolve linkage for prevailing symbols in the Index.
Definition LTO.cpp:488
cl::opt< bool > LTORunCSIRInstr("cs-profile-generate", cl::desc("Perform context sensitive PGO instrumentation"))
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:221
LLVM_ABI void PrintStatistics()
Print statistics to the file returned by CreateInfoOutputFile().
LLVM_ABI bool pruneCache(StringRef Path, CachePruningPolicy Policy, const std::vector< std::unique_ptr< MemoryBuffer > > &Files={})
Peform pruning using the supplied policy, returns true if pruning occurred, i.e.
LLVM_ABI void thinLTOInternalizeModule(Module &TheModule, const GVSummaryMapTy &DefinedGlobals)
Internalize TheModule based on the information recorded in the summaries during global summary-based ...
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition STLExtras.h:2011
SingleThreadExecutor DefaultThreadPool
Definition ThreadPool.h:262
LLVM_ABI void gatherImportedSummariesForModule(StringRef ModulePath, const DenseMap< StringRef, GVSummaryMapTy > &ModuleToDefinedGVSummaries, const FunctionImporter::ImportMapTy &ImportList, ModuleToSummariesForIndexTy &ModuleToSummariesForIndex, GVSummaryPtrSet &DecSummaries)
Compute the set of summaries needed for a ThinLTO backend compilation of ModulePath.
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
DiagnosticSeverity
Defines the different supported severity of a diagnostic.
cl::opt< std::optional< uint64_t >, false, remarks::HotnessThresholdParser > RemarksHotnessThreshold("lto-pass-remarks-hotness-threshold", cl::desc("Minimum profile count required for an " "optimization remark to be output." " Use 'auto' to apply the threshold from profile summary."), cl::value_desc("uint or 'auto'"), cl::init(0), cl::Hidden)
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1771
LLVM_ABI std::string computeLTOCacheKey(const lto::Config &Conf, const ModuleSummaryIndex &Index, StringRef ModuleID, const FunctionImporter::ImportMapTy &ImportList, const FunctionImporter::ExportSetTy &ExportList, const std::map< GlobalValue::GUID, GlobalValue::LinkageTypes > &ResolvedODR, const GVSummaryMapTy &DefinedGlobals, const DenseSet< GlobalValue::GUID > &CfiFunctionDefs={}, const DenseSet< GlobalValue::GUID > &CfiFunctionDecls={})
Computes a unique hash for the Module considering the current list of export/import and other global ...
Definition LTO.cpp:137
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI std::error_code errorToErrorCode(Error Err)
Helper for converting an ECError to a std::error_code.
Definition Error.cpp:113
LLVM_ABI void computeDeadSymbolsWithConstProp(ModuleSummaryIndex &Index, const DenseSet< GlobalValue::GUID > &GUIDPreservedSymbols, function_ref< PrevailingType(GlobalValue::GUID)> isPrevailing, bool ImportEnabled)
Compute dead symbols and run constant propagation in combined index after that.
LLVM_ABI Error write(DWPWriter &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue, Dwarf64StrOffsetsPromotion StrOffsetsOptValue, raw_pwrite_stream *OS=nullptr)
Definition DWP.cpp:720
LLVM_ABI Error EmitImportsFiles(StringRef ModulePath, StringRef OutputFilename, const ModuleToSummariesForIndexTy &ModuleToSummariesForIndex)
Emit into OutputFilename the files module ModulePath will import from.
LLVM_ABI bool verifyModule(const Module &M, raw_ostream *OS=nullptr, bool *BrokenDebugInfo=nullptr)
Check a module for errors.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
LLVM_ABI TimeTraceProfilerEntry * timeTraceProfilerBegin(StringRef Name, StringRef Detail)
Manually begin a time section, with the given Name and Detail.
LLVM_ABI void thinLTOInternalizeAndPromoteInIndex(ModuleSummaryIndex &Index, function_ref< bool(StringRef, ValueInfo)> isExported, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing, DenseSet< StringRef > *ExternallyVisibleSymbolNamesPtr=nullptr)
Update the linkages in the given Index to mark exported values as external and non-exported values as...
Definition LTO.cpp:606
LLVM_ABI void updateVCallVisibilityInIndex(ModuleSummaryIndex &Index, bool WholeProgramVisibilityEnabledInLTO, const DenseSet< GlobalValue::GUID > &DynamicExportSymbols, const DenseSet< GlobalValue::GUID > &VisibleToRegularObjSymbols)
If whole program visibility asserted, then upgrade all public vcall visibility metadata on vtable def...
LLVM_ABI 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:22
A simple container for information about the supported runtime calls.
static LLVM_ABI const Target * lookupTarget(const Triple &TheTriple, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
Helper to gather options relevant to the target machine creation.
LLVM_ABI std::unique_ptr< TargetMachine > create() const
Struct that holds a reference to a particular GUID in a global value summary.
LTO configuration.
Definition Config.h:43
std::vector< std::string > MAttrs
Definition Config.h:52
CodeGenOptLevel CGOptLevel
Definition Config.h:64
std::string CPU
Definition Config.h:50
TargetOptions Options
Definition Config.h:51
unsigned OptLevel
Definition Config.h:66
std::optional< Reloc::Model > RelocModel
Definition Config.h:62
bool Freestanding
Flag to indicate that the optimizer should not assume builtins are present on the target.
Definition Config.h:72