41class raw_pwrite_stream;
51 const lto::Config &
C, ModuleSummaryIndex &
Index,
56 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols);
62 ModuleSummaryIndex &
Index,
63 function_ref<
bool(StringRef, ValueInfo)> isExported,
70 const lto::Config &Conf,
const ModuleSummaryIndex &
Index,
71 StringRef ModuleID,
const FunctionImporter::ImportMapTy &ImportList,
73 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
75 const DenseSet<GlobalValue::GUID> &CfiFunctionDefs = {},
76 const DenseSet<GlobalValue::GUID> &CfiFunctionDecls = {});
98Expected<std::unique_ptr<ToolOutputFile>>
111struct SymbolResolution;
124 std::vector<BitcodeModule> Mods;
126 std::vector<Symbol> Symbols;
129 std::vector<std::pair<size_t, size_t>> ModuleSymIndices;
131 StringRef TargetTriple, SourceFileName, COFFLinkerOpts;
132 std::vector<StringRef> DependentLibraries;
133 std::vector<std::pair<StringRef, Comdat::SelectionKind>> ComdatTable;
195 const auto &Indices = ModuleSymIndices[
I];
196 return {Symbols.data() + Indices.first, Symbols.data() + Indices.second};
230 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
235 return std::move(*
Err);
244 const std::string &NewModulePath)
const;
273 return Func(Conf, CombinedIndex, ModuleToDefinedGVSummaries,
274 std::move(AddStream), std::move(Cache));
277 bool isValid()
const {
return static_cast<bool>(Func); }
294 bool ShouldEmitIndexFiles =
false,
295 bool ShouldEmitImportsFiles =
false);
313 std::string OldPrefix,
314 std::string NewPrefix,
315 std::string NativeObjectPrefix,
316 bool ShouldEmitImportsFiles,
358 unsigned ParallelCodeGenParallelismLevel = 1,
389 struct RegularLTOState {
390 RegularLTOState(
unsigned ParallelCodeGenParallelismLevel,
398 std::map<std::string, CommonResolution> Commons;
400 unsigned ParallelCodeGenParallelismLevel;
402 std::unique_ptr<Module> CombinedModule;
403 std::unique_ptr<IRMover> Mover;
410 std::unique_ptr<Module>
M;
411 std::vector<GlobalValue *>
Keep;
413 std::vector<AddedModule> ModsWithSummaries;
414 bool EmptyCombinedModule =
true;
419 struct ThinLTOState {
427 std::optional<ModuleMapType> ModulesToCompile;
438 struct GlobalResolution {
445 bool VisibleOutsideSummary =
false;
449 bool ExportDynamic =
false;
451 bool UnnamedAddr =
true;
454 bool Prevailing =
false;
459 bool isPrevailingIRSymbol()
const {
return Prevailing && !IRName.empty(); }
472 unsigned Partition = Unknown;
489 std::unique_ptr<llvm::BumpPtrAllocator> Alloc;
492 std::unique_ptr<llvm::StringSaver> GlobalResolutionSymbolSaver;
497 std::unique_ptr<llvm::DenseMap<StringRef, GlobalResolution>>
500 void releaseGlobalResolutionsMemory();
502 void addModuleToGlobalRes(ArrayRef<InputFile::Symbol> Syms,
503 ArrayRef<SymbolResolution> Res,
unsigned Partition,
510 Error addModule(InputFile &Input,
unsigned ModI,
511 const SymbolResolution *&ResI,
const SymbolResolution *ResE);
513 Expected<RegularLTOState::AddedModule>
514 addRegularLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
515 const SymbolResolution *&ResI,
const SymbolResolution *ResE);
516 Error linkRegularLTO(RegularLTOState::AddedModule
Mod,
517 bool LivenessFromIndex);
519 Error addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
520 const SymbolResolution *&ResI,
const SymbolResolution *ResE);
524 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols);
526 Error checkPartiallySplit();
528 mutable bool CalledGetMaxTasks =
false;
534 std::optional<bool> EnableSplitLTOUnit;
538 DenseSet<GlobalValue::GUID> DynamicExportSymbols;
541 std::unique_ptr<ToolOutputFile> DiagnosticOutputFile;
This file defines the DenseMap class.
Provides passes for computing function attributes based on interprocedural analyses.
Machine Check Debug Module
This file implements a map that provides insertion order iteration.
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Represents a module in a bitcode file.
Implements a dense probed hash-table based set.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
The map maintains the list of imports.
DenseSet< ValueInfo > ExportSetTy
The set contains an entry for every global value that the module exports.
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
LinkageTypes
An enumeration for the kinds of linkage for global values.
This class implements a map that also provides access to all stored values in a deterministic order.
Class to hold module path string table and global value map, and encapsulate methods for operating on...
A non-threaded implementation.
void wait() override
Blocking wait for all the tasks to execute first.
unsigned getMaxConcurrency() const override
Returns always 1: there is no concurrency.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
This tells how a thread pool will be used.
Triple - Helper class for working with autoconf configuration names.
This class implements a resolution-based interface to LLVM's LTO functionality.
Error add(std::unique_ptr< InputFile > Obj, ArrayRef< SymbolResolution > Res)
Add an input file to the LTO link, using the provided symbol resolutions.
static SmallVector< const char * > getRuntimeLibcallSymbols(const Triple &TT)
Static method that returns a list of libcall symbols that can be generated by LTO but might not be vi...
LTOKind
Unified LTO modes.
@ LTOK_UnifiedRegular
Regular LTO, with Unified LTO enabled.
@ LTOK_Default
Any LTO mode without Unified LTO. The default mode.
@ LTOK_UnifiedThin
ThinLTO, with Unified LTO enabled.
unsigned getMaxTasks() const
Returns an upper bound on the number of tasks that the client may expect.
Error run(AddStreamFn AddStream, FileCache Cache={})
Runs the LTO pipeline.
This class defines the interface to the ThinLTO backend.
DefaultThreadPool BackendThreadPool
Error emitFiles(const FunctionImporter::ImportMapTy &ImportList, llvm::StringRef ModulePath, const std::string &NewModulePath) const
bool ShouldEmitImportsFiles
std::optional< Error > Err
virtual bool isSensitiveToInputOrder()
unsigned getThreadCount()
const DenseMap< StringRef, GVSummaryMapTy > & ModuleToDefinedGVSummaries
ThinBackendProc(const Config &Conf, ModuleSummaryIndex &CombinedIndex, const DenseMap< StringRef, GVSummaryMapTy > &ModuleToDefinedGVSummaries, lto::IndexWriteCallback OnWrite, bool ShouldEmitImportsFiles, ThreadPoolStrategy ThinLTOParallelism)
ModuleSummaryIndex & CombinedIndex
virtual ~ThinBackendProc()=default
virtual Error start(unsigned Task, BitcodeModule BM, const FunctionImporter::ImportMapTy &ImportList, const FunctionImporter::ExportSetTy &ExportList, const std::map< GlobalValue::GUID, GlobalValue::LinkageTypes > &ResolvedODR, MapVector< StringRef, BitcodeModule > &ModuleMap)=0
IndexWriteCallback OnWrite
A raw_ostream that writes to a file descriptor.
@ C
The default llvm calling convention, compatible with C.
ThinBackend createInProcessThinBackend(ThreadPoolStrategy Parallelism, IndexWriteCallback OnWrite=nullptr, bool ShouldEmitIndexFiles=false, bool ShouldEmitImportsFiles=false)
This ThinBackend runs the individual backend jobs in-process.
std::string getThinLTOOutputFile(StringRef Path, StringRef OldPrefix, StringRef NewPrefix)
Given the original Path to an output file, replace any path prefix matching OldPrefix with NewPrefix.
std::function< std::unique_ptr< ThinBackendProc >(const Config &C, ModuleSummaryIndex &CombinedIndex, const DenseMap< StringRef, GVSummaryMapTy > &ModuleToDefinedGVSummaries, AddStreamFn AddStream, FileCache Cache)> ThinBackendFunction
This callable defines the behavior of a ThinLTO backend after the thin-link phase.
std::function< void(const std::string &)> IndexWriteCallback
StringLiteral getThinLTODefaultCPU(const Triple &TheTriple)
Expected< std::unique_ptr< ToolOutputFile > > setupStatsFile(StringRef StatsFilename)
Setups the output file for saving statistics.
ThinBackend createWriteIndexesThinBackend(ThreadPoolStrategy Parallelism, std::string OldPrefix, std::string NewPrefix, std::string NativeObjectPrefix, bool ShouldEmitImportsFiles, raw_fd_ostream *LinkedObjectsFile, IndexWriteCallback OnWrite)
This ThinBackend writes individual module indexes to files, instead of running the individual backend...
std::vector< int > generateModulesOrdering(ArrayRef< BitcodeModule * > R)
Produces a container ordering for optimal multi-threaded processing.
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.
void updateMemProfAttributes(Module &Mod, const ModuleSummaryIndex &Index)
Updates MemProf attributes (and metadata) based on whether the index has recorded that we are linking...
This is an optimization pass for GlobalISel generic memory operations.
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"))
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"))
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.
void thinLTOInternalizeAndPromoteInIndex(ModuleSummaryIndex &Index, function_ref< bool(StringRef, ValueInfo)> isExported, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing)
Update the linkages in the given Index to mark exported values as external and non-exported values as...
std::string recomputeLTOCacheKey(const std::string &Key, StringRef ExtraID)
Recomputes the LTO cache key for a given key with an extra identifier.
cl::opt< bool > RemarksWithHotness("lto-pass-remarks-with-hotness", cl::desc("With PGO, include profile count in optimization remarks"), cl::Hidden)
cl::opt< std::string > RemarksFilename("lto-pass-remarks-output", cl::desc("Output filename for pass remarks"), cl::value_desc("filename"))
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.
@ Mod
The access may modify the value stored in memory.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
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)
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 ...
DenseMap< GlobalValue::GUID, GlobalValueSummary * > GVSummaryMapTy
Map of global value GUID to its summary, used to identify values defined in a particular module,...
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This type represents a file cache system that manages caching of files.
This represents a symbol that has been read from a storage::Symbol and possibly a storage::Uncommon.
StringRef getName() const
Returns the mangled symbol name.
bool canBeOmittedFromSymbolTable() const
StringRef getSectionName() const
uint32_t getCommonAlignment() const
bool isExecutable() const
uint64_t getCommonSize() const
int getComdatIndex() const
Returns the index into the comdat table (see Reader::getComdatTable()), or -1 if not a comdat member.
GlobalValue::VisibilityTypes getVisibility() const
StringRef getIRName() const
Returns the unmangled symbol name, or the empty string if this is not an IR symbol.
StringRef getCOFFWeakExternalFallback() const
COFF-specific: for weak externals, returns the name of the symbol that is used as a fallback if the w...
Contains the information needed by linkers for symbol resolution, as well as by the LTO implementatio...
A derived class of LLVMContext that initializes itself according to a given Config object.
std::vector< GlobalValue * > Keep
std::unique_ptr< Module > M
bool Prevailing
Record if at least one instance of the common was marked as prevailing.
The resolution for a symbol.
unsigned FinalDefinitionInLinkageUnit
The definition of this symbol is unpreemptable at runtime and is known to be in this linkage unit.
unsigned ExportDynamic
The symbol was exported dynamically, and therefore could be referenced by a shared library not visibl...
unsigned Prevailing
The linker has chosen this definition of the symbol.
unsigned LinkerRedefined
Linker redefined version of the symbol which appeared in -wrap or -defsym linker option.
unsigned VisibleToRegularObj
The definition of this symbol is visible outside of the LTO unit.
This type defines the behavior following the thin-link phase during ThinLTO.
std::unique_ptr< ThinBackendProc > operator()(const Config &Conf, ModuleSummaryIndex &CombinedIndex, const DenseMap< StringRef, GVSummaryMapTy > &ModuleToDefinedGVSummaries, AddStreamFn AddStream, FileCache Cache)
ThreadPoolStrategy getParallelism() const
ThinBackend(ThinBackendFunction Func, ThreadPoolStrategy Parallelism)