26#include "llvm/Config/llvm-config.h"
62#if !defined(_MSC_VER) && !defined(__MINGW32__)
69using namespace ThinLTOCodeGeneratorImpl;
71#define DEBUG_TYPE "thinlto"
100 " to save optimized bitcode\n");
108 GVSummaryList, [](
const std::unique_ptr<GlobalValueSummary> &Summary) {
109 auto Linkage = Summary->linkage();
113 if (StrongDefForLinker != GVSummaryList.end())
114 return StrongDefForLinker->get();
118 GVSummaryList, [](
const std::unique_ptr<GlobalValueSummary> &Summary) {
119 auto Linkage = Summary->linkage();
123 if (FirstDefForLinker == GVSummaryList.end())
125 return FirstDefForLinker->get();
135 return GVSummaryList.size() > 1;
138 for (
auto &
I : Index) {
139 if (HasMultipleCopies(
I.second.SummaryList))
140 PrevailingCopy[
I.first] =
148 for (
auto &M : Modules) {
149 LLVM_DEBUG(
dbgs() <<
"Adding module " << M->getName() <<
" to ModuleMap\n");
151 "Expect unique Buffer Identifier");
152 ModuleMap[M->getName()] = M.get();
158 bool ClearDSOLocalOnDeclarations) {
175 bool BrokenDebugInfo =
false;
178 if (BrokenDebugInfo) {
180 "Invalid debug info found, debug info will be stripped",
DS_Warning));
197 SMDiagnostic Err = SMDiagnostic(Mod.getModuleIdentifier(),
198 SourceMgr::DK_Error, EIB.message());
199 Err.print(
"ThinLTO", errs());
205 return std::move(*ModuleOrErr);
212 bool ClearDSOLocalOnDeclarations) {
213 auto Loader = [&](
StringRef Identifier) {
214 auto &Input = ModuleMap[Identifier];
223 SMDiagnostic Err = SMDiagnostic(TheModule.getModuleIdentifier(),
224 SourceMgr::DK_Error, EIB.message());
225 Err.print(
"ThinLTO", errs());
234 unsigned OptLevel,
bool Freestanding,
236 std::optional<PGOOptions> PGOOpt;
244 SI.registerCallbacks(
PIC, &
MAM);
250 std::unique_ptr<TargetLibraryInfoImpl> TLII(
253 TLII->disableAllFunctions();
292 for (
const auto &
Sym : File.symbols()) {
306 for (
const auto &
Sym : File.symbols()) {
307 if (PreservedSymbols.
count(
Sym.getName()) && !
Sym.getIRName().empty())
309 GlobalValue::getGlobalIdentifier(
Sym.getIRName(),
317 const Triple &TheTriple) {
320 GUIDPreservedSymbols);
321 return GUIDPreservedSymbols;
334 if (TM.addPassesToEmitFile(PM,
OS,
nullptr, CodeGenFileType::ObjectFile,
341 return std::make_unique<SmallVectorMemoryBuffer>(
347class ModuleCacheEntry {
358 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
361 if (CachePath.
empty())
364 if (!
Index.modulePaths().count(ModuleID))
383 ResolvedODR, DefinedGVSummaries);
391 StringRef getEntryPath() {
return EntryPath; }
395 if (EntryPath.
empty())
396 return std::error_code();
403 *FDOrErr, EntryPath, -1,
false);
410 if (EntryPath.
empty())
425static std::unique_ptr<MemoryBuffer>
433 bool DisableCodeGen,
StringRef SaveTempsDir,
434 bool Freestanding,
unsigned OptLevel,
unsigned count,
435 bool DebugPassManager) {
437 bool SingleModule = (ModuleMap.
size() == 1);
441 bool ClearDSOLocalOnDeclarations =
442 TM.getTargetTriple().isOSBinFormatELF() &&
447 promoteModule(TheModule, Index, ClearDSOLocalOnDeclarations);
458 if (!ExportList.
empty() || !GUIDPreservedSymbols.
empty()) {
468 ClearDSOLocalOnDeclarations);
479 optimizeModule(TheModule, TM, OptLevel, Freestanding, DebugPassManager,
484 if (DisableCodeGen) {
493 return std::make_unique<SmallVectorMemoryBuffer>(
507 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>>
514 const auto &Prevailing = PrevailingCopy.
find(GUID);
516 if (Prevailing == PrevailingCopy.
end())
518 return Prevailing->second == S;
521 auto recordNewLinkage = [&](
StringRef ModuleIdentifier,
524 ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
530 GUIDPreservedSymbols);
535 const Triple &TheTriple) {
536 if (TMBuilder.
MCpu.empty())
538 TMBuilder.
TheTriple = std::move(TheTriple);
547 toString(InputOrError.takeError()));
549 auto TripleStr = (*InputOrError)->getTargetTriple();
550 Triple TheTriple(TripleStr);
554 else if (TMBuilder.
TheTriple != TheTriple) {
561 Modules.emplace_back(std::move(*InputOrError));
586 std::string FeatureStr = Features.
getString();
588 std::unique_ptr<TargetMachine> TM(
590 RelocModel, std::nullopt, CGOptLevel));
591 assert(TM &&
"Cannot create target machine");
601 std::unique_ptr<ModuleSummaryIndex> CombinedIndex =
602 std::make_unique<ModuleSummaryIndex>(
false);
603 for (
auto &
Mod : Modules) {
604 auto &M =
Mod->getSingleBitcodeModule();
605 if (
Error Err = M.readSummary(*CombinedIndex,
Mod->getName())) {
608 std::move(Err),
errs(),
609 "error: can't create module summary index for buffer: ");
613 return CombinedIndex;
624 : ExportLists(ExportLists), GUIDPreservedSymbols(GUIDPreservedSymbols) {}
627 const auto &ExportList = ExportLists.
find(ModuleIdentifier);
628 return (ExportList != ExportLists.
end() && ExportList->second.
count(VI)) ||
629 GUIDPreservedSymbols.
count(VI.getGUID());
637 : PrevailingCopy(PrevailingCopy) {}
640 const auto &Prevailing = PrevailingCopy.
find(GUID);
642 if (Prevailing == PrevailingCopy.
end())
644 return Prevailing->second == S;
668 auto ModuleCount = Index.modulePaths().size();
673 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
693 IsPrevailing(PrevailingCopy), ImportLists,
702 ModuleToDefinedGVSummaries[ModuleIdentifier],
708 Index, IsExported(ExportLists, GUIDPreservedSymbols),
709 IsPrevailing(PrevailingCopy));
722 auto ModuleCount = Index.modulePaths().size();
726 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
745 IsPrevailing(PrevailingCopy), ImportLists,
761 auto ModuleCount = Index.modulePaths().size();
766 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
785 IsPrevailing(PrevailingCopy), ImportLists,
789 ModuleIdentifier, ModuleToDefinedGVSummaries,
790 ImportLists[ModuleIdentifier], ModuleToSummariesForIndex, DecSummaries);
799 auto ModuleCount = Index.modulePaths().size();
804 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
823 IsPrevailing(PrevailingCopy), ImportLists,
832 ModuleIdentifier, ModuleToDefinedGVSummaries,
833 ImportLists[ModuleIdentifier], ModuleToSummariesForIndex, DecSummaries);
836 ModuleToSummariesForIndex))
838 " to save imports lists\n");
849 auto ModuleCount = Index.modulePaths().size();
853 auto GUIDPreservedSymbols =
860 Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
873 IsPrevailing(PrevailingCopy), ImportLists,
875 auto &ExportList = ExportLists[ModuleIdentifier];
879 if (ExportList.
empty() && GUIDPreservedSymbols.
empty())
890 Index, IsExported(ExportLists, GUIDPreservedSymbols),
891 IsPrevailing(PrevailingCopy));
898 ModuleToDefinedGVSummaries[ModuleIdentifier],
902 ModuleToDefinedGVSummaries[ModuleIdentifier]);
913 DebugPassManager,
nullptr);
925 Twine(
count) +
"." + ArchName +
".thinlto.o");
931 if (!CacheEntryPath.
empty()) {
935 return std::string(OutputPath);
939 return std::string(OutputPath);
943 errs() <<
"remark: can't link or copy from cached entry '" << CacheEntryPath
944 <<
"' to '" << OutputPath <<
"'\n";
952 return std::string(OutputPath);
963 assert(ProducedBinaries.empty() &&
"The generator should not be reused");
964 if (SavedObjectsDirectoryPath.empty())
965 ProducedBinaries.resize(Modules.size());
972 ProducedBinaryFiles.resize(Modules.size());
979 for (
auto &
Mod : Modules) {
990 if (SavedObjectsDirectoryPath.empty())
991 ProducedBinaries[
count] = std::move(OutputBuffer);
993 ProducedBinaryFiles[
count] =
1005 if (!SaveTempsDir.empty()) {
1006 auto SaveTempPath = SaveTempsDir +
"index.bc";
1011 " to save optimized bitcode\n");
1018 auto ModuleCount = Modules.size();
1022 Index->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
1027 for (
const auto &M : Modules)
1029 GUIDPreservedSymbols);
1032 for (
const auto &M : Modules)
1042 Index->setWithWholeProgramVisibility();
1055 std::map<ValueInfo, std::vector<VTableSlotSummary>> LocalWPDTargetsMap;
1056 std::set<GlobalValue::GUID> ExportedGUIDs;
1069 IsPrevailing(PrevailingCopy), ImportLists,
1087 IsExported(ExportLists, GUIDPreservedSymbols),
1088 LocalWPDTargetsMap);
1090 *Index, IsExported(ExportLists, GUIDPreservedSymbols),
1091 IsPrevailing(PrevailingCopy));
1098 for (
auto &
Module : Modules) {
1100 ExportLists[ModuleIdentifier];
1101 ImportLists[ModuleIdentifier];
1102 ResolvedODR[ModuleIdentifier];
1103 ModuleToDefinedGVSummaries[ModuleIdentifier];
1106 std::vector<BitcodeModule *> ModulesVec;
1107 ModulesVec.
reserve(Modules.size());
1108 for (
auto &
Mod : Modules)
1109 ModulesVec.push_back(&
Mod->getSingleBitcodeModule());
1115 TimeTraceScopeExit.release();
1120 for (
auto IndexCount : ModulesOrdering) {
1121 auto &
Mod = Modules[IndexCount];
1123 auto ModuleIdentifier =
Mod->getName();
1124 auto &ExportList = ExportLists[ModuleIdentifier];
1126 auto &DefinedGVSummaries = ModuleToDefinedGVSummaries[ModuleIdentifier];
1129 ModuleCacheEntry CacheEntry(CacheOptions.
Path, *Index, ModuleIdentifier,
1130 ImportLists[ModuleIdentifier], ExportList,
1131 ResolvedODR[ModuleIdentifier],
1132 DefinedGVSummaries, OptLevel, Freestanding,
1134 auto CacheEntryPath = CacheEntry.getEntryPath();
1137 auto ErrOrBuffer = CacheEntry.tryLoadingBuffer();
1139 <<
" '" << CacheEntryPath <<
"' for buffer "
1140 <<
count <<
" " << ModuleIdentifier <<
"\n");
1144 if (SavedObjectsDirectoryPath.empty())
1145 ProducedBinaries[
count] = std::move(ErrOrBuffer.get());
1148 count, CacheEntryPath, *ErrOrBuffer.get());
1155 Context.enableDebugTypeODRUniquing();
1159 if (!DiagFileOrErr) {
1160 errs() <<
"Error: " <<
toString(DiagFileOrErr.takeError()) <<
"\n";
1172 auto &ImportList = ImportLists[ModuleIdentifier];
1175 *TheModule, *Index, ModuleMap, *TMBuilder.
create(), ImportList,
1176 ExportList, GUIDPreservedSymbols,
1177 ModuleToDefinedGVSummaries[ModuleIdentifier], CacheOptions,
1178 DisableCodeGen, SaveTempsDir, Freestanding, OptLevel,
count,
1182 CacheEntry.write(*OutputBuffer);
1184 if (SavedObjectsDirectoryPath.empty()) {
1186 if (!CacheEntryPath.empty()) {
1193 auto ReloadedBufferOrErr = CacheEntry.tryLoadingBuffer();
1194 if (
auto EC = ReloadedBufferOrErr.getError()) {
1196 errs() <<
"remark: can't reload cached file '" << CacheEntryPath
1197 <<
"': " << EC.message() <<
"\n";
1199 OutputBuffer = std::move(*ReloadedBufferOrErr);
1202 ProducedBinaries[
count] = std::move(OutputBuffer);
1206 count, CacheEntryPath, *OutputBuffer);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file provides a bitcode writing pass.
#define LLVM_LIFETIME_BOUND
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 ...
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
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...
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 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 const GlobalValueSummary * getFirstDefinitionForLinker(const GlobalValueSummaryList &GVSummaryList)
static void promoteModule(Module &TheModule, const ModuleSummaryIndex &Index, bool ClearDSOLocalOnDeclarations)
A container for analyses that lazily runs them and caches their results.
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
iterator find(const_arg_type_t< KeyT > Val)
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Implements a dense probed hash-table based set.
This is the base abstract class for diagnostic reporting in the backend.
virtual void print(DiagnosticPrinter &DP) const =0
Print using the given DP a user-friendly message.
Interface for custom diagnostic printing.
Base class for error info classes.
Represents either an error or a value T.
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.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
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.
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.
static bool isAvailableExternallyLinkage(LinkageTypes Linkage)
bool isWeakForLinker() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ ExternalLinkage
Externally visible function.
This is an important class for using LLVM in a threaded context.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
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.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
LLVMContext & getContext() const
Get the global data context.
StringRef getName() const
Get a short "name" for the module.
const std::string & getModuleIdentifier() const
Get the module identifier which is, essentially, the name of the module.
PIELevel::Level getPIELevel() const
Returns the PIE level (small or large model)
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.
LLVM_ABI void registerLoopAnalyses(LoopAnalysisManager &LAM)
Registers all available loop analysis passes.
LLVM_ABI void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM, MachineFunctionAnalysisManager *MFAM=nullptr)
Cross register the analysis managers through their proxies.
LLVM_ABI ModulePassManager buildThinLTODefaultPipeline(OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary)
Build a ThinLTO default optimization pipeline to a pass manager.
LLVM_ABI void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
LLVM_ABI void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
LLVM_ABI void registerFunctionAnalyses(FunctionAnalysisManager &FAM)
Registers all available function analysis passes.
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.
bool SLPVectorization
Tuning option to enable/disable slp loop vectorization, set based on opt level.
bool LoopVectorization
Tuning option to enable/disable loop vectorization, set based on opt level.
Analysis providing profile information.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
A non-threaded implementation.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
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...
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
bool contains(StringRef Key) const
contains - Return true if the element is in the map, false otherwise.
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
StringSet - A wrapper for StringMap that provides set-like functionality.
std::pair< typename Base::iterator, bool > insert(StringRef key)
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.
Primary interface to the complete machine description for the target machine.
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.
Triple - Helper class for working with autoconf configuration names.
LLVM_ABI std::string merge(const Triple &Other) const
Merge target triples.
LLVM_ABI StringRef getArchName() const
Get the architecture (first) component of the triple.
LLVM_ABI bool isCompatibleWith(const Triple &Other) const
Test whether target triples are compatible.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
std::pair< iterator, bool > insert(const ValueT &V)
void insert_range(Range &&R)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
PassManager manages ModulePassManagers.
bool run(Module &M)
run - Execute all of the passes scheduled for execution.
A raw_ostream that writes to a file descriptor.
This class implements an extremely fast bulk output stream that can only output to a stream.
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.
initializer< Ty > init(const Ty &Val)
LLVM_ABI StringLiteral getThinLTODefaultCPU(const Triple &TheTriple)
LLVM_ABI std::vector< int > generateModulesOrdering(ArrayRef< BitcodeModule * > R)
Produces a container ordering for optimal multi-threaded processing.
LLVM_ABI Expected< std::unique_ptr< ToolOutputFile > > setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses, StringRef RemarksFormat, bool RemarksWithHotness, std::optional< uint64_t > RemarksHotnessThreshold=0, int Count=-1)
Setup optimization remarks.
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?
@ OF_UpdateAtime
Force files Atime to be updated on access.
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.
LLVM_ABI std::error_code copy_file(const Twine &From, const Twine &To)
Copy the contents of From to To.
LLVM_ABI bool is_directory(const basic_file_status &status)
Does status represent a directory?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
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.
LLVM_ABI void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner={})
Log all errors (if any) in E to OS.
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"))
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
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.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
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...
SmallVectorImpl< T >::const_pointer c_str(SmallVectorImpl< T > &str)
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)
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 ...
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 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...
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
LLVM_ABI void updatePublicTypeTestCalls(Module &M, bool WholeProgramVisibilityEnabledInLTO)
LLVM_ABI Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue)
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.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
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.
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 updateIndexWPDForExports(ModuleSummaryIndex &Summary, function_ref< bool(StringRef, ValueInfo)> isExported, std::map< ValueInfo, std::vector< VTableSlotSummary > > &LocalWPDTargetsMap)
Call after cross-module importing to update the recorded single impl devirt target names for any loca...
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.
std::vector< std::unique_ptr< GlobalValueSummary > > GlobalValueSummaryList
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.
LLVM_ABI void PrintStatistics()
Print statistics to the file returned by CreateInfoOutputFile().
LLVM_ABI void runWholeProgramDevirtOnIndex(ModuleSummaryIndex &Summary, std::set< GlobalValue::GUID > &ExportedGUIDs, std::map< ValueInfo, std::vector< VTableSlotSummary > > &LocalWPDTargetsMap)
Perform index-based whole program devirtualization on the Summary index.
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 ...
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
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...
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::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
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.
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 ...
const char * toString(DWARFSectionKind Kind)
LLVM_ABI std::error_code errorToErrorCode(Error Err)
Helper for converting an ECError to a std::error_code.
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 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.
LLVM_ABI TimeTraceProfilerEntry * timeTraceProfilerBegin(StringRef Name, StringRef Detail)
Manually begin a time section, with the given Name and Detail.
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:
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
static const Target * lookupTarget(StringRef TripleStr, 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
std::optional< Reloc::Model > RelocModel
CodeGenOptLevel CGOptLevel
CachePruningPolicy Policy
Struct that holds a reference to a particular GUID in a global value summary.
std::vector< std::string > MAttrs
CodeGenOptLevel CGOptLevel
std::optional< Reloc::Model > RelocModel
bool Freestanding
Flag to indicate that the optimizer should not assume builtins are present on the target.