53#define DEBUG_TYPE "lto-backend"
66 "Embed after all optimization passes"),
69 "Embed post merge, but before optimizations")),
70 cl::desc(
"Embed LLVM bitcode in object files produced by LTO"));
73 "thinlto-assume-merged",
cl::init(
false),
74 cl::desc(
"Assume the input has already undergone ThinLTO function "
75 "importing and the other pre-optimization pipeline changes."));
82 errs() <<
"failed to open " << Path <<
": " << Msg <<
'\n';
92 if (SaveTempsArgs.
empty() || SaveTempsArgs.
contains(
"resolution")) {
94 std::make_unique<raw_fd_ostream>(OutputFileName +
"resolution.txt", EC,
102 auto setHook = [&](std::string PathSuffix,
ModuleHookFn &Hook) {
105 Hook = [=](
unsigned Task,
const Module &M) {
108 if (LinkerHook && !LinkerHook(Task, M))
111 std::string PathPrefix;
115 if (M.getModuleIdentifier() ==
"ld-temp.o" || !UseInputModulePath) {
116 PathPrefix = OutputFileName;
117 if (Task != (
unsigned)-1)
118 PathPrefix += utostr(Task) +
".";
120 PathPrefix = M.getModuleIdentifier() +
".";
121 std::string Path = PathPrefix + PathSuffix +
".bc";
133 auto SaveCombinedIndex =
136 std::string Path = OutputFileName +
"index.bc";
145 Path = OutputFileName +
"index.dot";
149 Index.exportToDot(OSDot, GUIDPreservedSymbols);
153 if (SaveTempsArgs.
empty()) {
162 if (SaveTempsArgs.
contains(
"preopt"))
164 if (SaveTempsArgs.
contains(
"promote"))
166 if (SaveTempsArgs.
contains(
"internalize"))
168 if (SaveTempsArgs.
contains(
"import"))
172 if (SaveTempsArgs.
contains(
"precodegen"))
174 if (SaveTempsArgs.
contains(
"combinedindex"))
181#define HANDLE_EXTENSION(Ext) \
182 llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
183#include "llvm/Support/Extension.def"
187#define HANDLE_EXTENSION(Ext) \
188 get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
189#include "llvm/Support/Extension.def"
192 for (
auto &PluginFN : PassPlugins) {
200static std::unique_ptr<TargetMachine>
202 StringRef TheTriple = M.getTargetTriple();
205 for (
const std::string &
A : Conf.
MAttrs)
208 std::optional<Reloc::Model> RelocModel;
211 else if (M.getModuleFlag(
"PIC Level"))
215 std::optional<CodeModel::Model> CodeModel;
219 CodeModel = M.getCodeModel();
225 assert(TM &&
"Failed to create target machine");
227 if (std::optional<uint64_t> LargeDataThreshold = M.getLargeDataThreshold())
228 TM->setLargeDataThreshold(*LargeDataThreshold);
234 unsigned OptLevel,
bool IsThinLTO,
238 std::optional<PGOOptions> PGOOpt;
260 TM->setPGOOption(PGOOpt);
270 SI.registerCallbacks(
PIC, &
MAM);
275 std::unique_ptr<TargetLibraryInfoImpl> TLII(
278 TLII->disableAllFunctions();
329 }
else if (IsThinLTO) {
339 std::string PipelineStr;
345 outs() <<
"pipeline-passes: " << PipelineStr <<
'\n';
354 const std::vector<uint8_t> &CmdArgs) {
355 if (
EmbedBitcode == LTOBitcodeEmbedding::EmbedPostMergePreOptimized) {
366 dbgs() <<
"Post-(Thin)LTO merge bitcode embedding was requested, but "
367 "command line arguments are not available");
384 if (
EmbedBitcode == LTOBitcodeEmbedding::EmbedOptimized)
388 std::vector<uint8_t>());
390 std::unique_ptr<ToolOutputFile> DwoOut;
392 if (!Conf.
DwoDir.empty()) {
396 ": " + EC.message());
400 TM->Options.MCOptions.SplitDwarfFile = std::string(DwoFile);
404 if (!DwoFile.
empty()) {
413 AddStream(Task,
Mod.getModuleIdentifier());
416 std::unique_ptr<CachedFileStream> &Stream = *StreamOrErr;
417 TM->Options.ObjectFilenameForDebug = Stream->ObjectPathName;
426 if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS,
427 DwoOut ? &DwoOut->os() :
nullptr,
438 unsigned ParallelCodeGenParallelismLevel,
Module &
Mod,
442 unsigned ThreadCount = 0;
443 const Target *
T = &TM->getTarget();
445 const auto HandleModulePartition =
446 [&](std::unique_ptr<Module> MPart) {
458 CodegenThreadPool.
async(
465 std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.
get());
467 std::unique_ptr<TargetMachine> TM =
470 codegen(
C, TM.get(), AddStream, ThreadId, *MPartInCtx,
475 std::move(BC), ThreadCount++);
479 if (!TM->splitModule(
Mod, ParallelCodeGenParallelismLevel,
480 HandleModulePartition)) {
481 SplitModule(
Mod, ParallelCodeGenParallelismLevel, HandleModulePartition,
488 CodegenThreadPool.
wait();
493 if (!
C.OverrideTriple.empty())
494 Mod.setTargetTriple(
C.OverrideTriple);
495 else if (
Mod.getTargetTriple().empty())
496 Mod.setTargetTriple(
C.DefaultTriple);
506 std::unique_ptr<ToolOutputFile> DiagOutputFile) {
511 DiagOutputFile->keep();
512 DiagOutputFile->os().flush();
517 unsigned ParallelCodeGenParallelismLevel,
Module &
Mod,
526 if (!
C.CodeGenOnly) {
527 if (!
opt(
C, TM.get(), 0,
Mod,
false,
528 &CombinedIndex,
nullptr,
529 std::vector<uint8_t>()))
533 if (ParallelCodeGenParallelismLevel == 1) {
534 codegen(
C, TM.get(), AddStream, 0,
Mod, CombinedIndex);
544 std::vector<GlobalValue*> DeadGVs;
545 for (
auto &GV :
Mod.global_values())
547 if (!
Index.isGlobalValueLive(GVS)) {
548 DeadGVs.push_back(&GV);
555 GV->removeDeadConstantUsers();
559 GV->eraseFromParent();
568 const std::vector<uint8_t> &CmdArgs) {
581 return DiagFileOrErr.takeError();
582 auto DiagnosticOutputFile = std::move(*DiagFileOrErr);
586 Mod.setPartialSampleProfileRatio(CombinedIndex);
590 codegen(Conf, TM.get(), AddStream, Task,
Mod, CombinedIndex);
597 auto OptimizeAndCodegen =
599 std::unique_ptr<ToolOutputFile> DiagnosticOutputFile) {
600 if (!
opt(Conf, TM, Task,
Mod,
true,
601 nullptr, &CombinedIndex,
605 codegen(Conf, TM, AddStream, Task,
Mod, CombinedIndex);
610 return OptimizeAndCodegen(
Mod, TM.get(), std::move(DiagnosticOutputFile));
614 bool ClearDSOLocalOnDeclarations =
615 TM->getTargetTriple().isOSBinFormatELF() &&
627 if (!DefinedGlobals.
empty())
634 auto ModuleLoader = [&](
StringRef Identifier) {
635 assert(
Mod.getContext().isODRUniquingDebugTypes() &&
636 "ODR Type uniquing should be enabled on the context");
638 auto I = ModuleMap->
find(Identifier);
640 return I->second.getLazyModule(
Mod.getContext(),
649 Twine(
"Error loading imported file ") + Identifier +
" : ",
655 Twine(
"Error loading imported file ") + Identifier +
" : " +
660 BMOrErr->getLazyModule(
Mod.getContext(),
664 (*MOrErr)->setOwnedMemoryBuffer(std::move(*MBOrErr));
669 ClearDSOLocalOnDeclarations);
680 return OptimizeAndCodegen(
Mod, TM.get(), std::move(DiagnosticOutputFile));
689 if (LTOInfo && LTOInfo->IsThinLTO)
705 return make_error<StringError>(
"Could not find module summary",
717 for (
const auto &GlobalList : CombinedIndex) {
719 if (GlobalList.second.SummaryList.empty())
722 auto GUID = GlobalList.first;
723 for (
const auto &Summary : GlobalList.second.SummaryList) {
726 if (Summary->modulePath() == M.getModuleIdentifier())
732 auto [Iter, Inserted] = ImportList[Summary->modulePath()].
try_emplace(
733 GUID, Summary->importType());
736 Iter->second = std::min(Iter->second, Summary->importType());
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This header provides classes for managing passes over SCCs of the call graph.
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
static cl::opt< bool > ThinLTOAssumeMerged("thinlto-assume-merged", cl::init(false), cl::desc("Assume the input has already undergone ThinLTO function " "importing and the other pre-optimization pipeline changes."))
static void reportOpenError(StringRef Path, Twine Msg)
@ EmbedPostMergePreOptimized
static cl::opt< LTOBitcodeEmbedding > EmbedBitcode("lto-embed-bitcode", cl::init(LTOBitcodeEmbedding::DoNotEmbed), cl::values(clEnumValN(LTOBitcodeEmbedding::DoNotEmbed, "none", "Do not embed"), clEnumValN(LTOBitcodeEmbedding::EmbedOptimized, "optimized", "Embed after all optimization passes"), clEnumValN(LTOBitcodeEmbedding::EmbedPostMergePreOptimized, "post-merge-pre-opt", "Embed post merge, but before optimizations")), cl::desc("Embed LLVM bitcode in object files produced by LTO"))
static void splitCodeGen(const Config &C, TargetMachine *TM, AddStreamFn AddStream, unsigned ParallelCodeGenParallelismLevel, Module &Mod, const ModuleSummaryIndex &CombinedIndex)
static void dropDeadSymbols(Module &Mod, const GVSummaryMapTy &DefinedGlobals, const ModuleSummaryIndex &Index)
static Expected< const Target * > initAndLookupTarget(const Config &C, Module &Mod)
static void codegen(const Config &Conf, TargetMachine *TM, AddStreamFn AddStream, unsigned Task, Module &Mod, const ModuleSummaryIndex &CombinedIndex)
static void RegisterPassPlugins(ArrayRef< std::string > PassPlugins, PassBuilder &PB)
static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, unsigned OptLevel, bool IsThinLTO, ModuleSummaryIndex *ExportSummary, const ModuleSummaryIndex *ImportSummary)
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
This is the interface to build a ModuleSummaryIndex for a module.
static std::unique_ptr< TargetMachine > createTargetMachine(Function *F, CodeGenOptLevel OptLevel)
Create the TargetMachine object to query the backend for optimization preferences.
CGSCCAnalysisManager CGAM
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
This header defines various interfaces for pass management in LLVM.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This header defines a class that provides bookkeeping for all standard (i.e in-tree) pass instrumenta...
Defines the virtual file system interface vfs::FileSystem.
static const char PassName[]
A manager for alias analyses.
A container for analyses that lazily runs them and caches their results.
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Represents a module in a bitcode file.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&... Args)
Implements a dense probed hash-table based set.
Represents either an error or a value T.
std::error_code getError() const
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 function importer is automatically importing function from other modules based on the provided su...
Expected< bool > importFunctions(Module &M, const ImportMapTy &ImportList)
Import functions in Module M based on the supplied import list.
Function and variable summary information to aid decisions and implementation of importing.
This class implements a map that also provides access to all stored values in a deterministic order.
iterator find(const KeyT &Key)
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
Class to hold module path string table and global value map, and encapsulate methods for operating on...
bool withWholeProgramVisibility() const
A Module instance is used to store all the information related to an LLVM module.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
static const OptimizationLevel O3
Optimize for fast execution as much as possible.
static const OptimizationLevel O0
Disable as many optimizations as possible.
static const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static const OptimizationLevel O1
Optimize quickly without destroying debuggability.
This class provides access to building LLVM's passes.
Error parseAAPipeline(AAManager &AA, StringRef PipelineText)
Parse a textual alias analysis pipeline into the provided AA manager.
void registerLoopAnalyses(LoopAnalysisManager &LAM)
Registers all available loop analysis passes.
void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM, MachineFunctionAnalysisManager *MFAM=nullptr)
Cross register the analysis managers through their proxies.
Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText)
Parse a textual pass pipeline description into a ModulePassManager.
ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level, ModuleSummaryIndex *ExportSummary)
Build an LTO default optimization pipeline to a pass manager.
ModulePassManager buildThinLTODefaultPipeline(OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary)
Build a ThinLTO default optimization pipeline to a pass manager.
void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
void registerFunctionAnalyses(FunctionAnalysisManager &FAM)
Registers all available function analysis passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
StringRef getPassNameForClassName(StringRef ClassName)
Get the pass name for a given pass class name.
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
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.
static Expected< PassPlugin > Load(const std::string &Filename)
Attempts to load a pass plugin from a given file.
void registerPassBuilderCallbacks(PassBuilder &PB) const
Invoke the PassBuilder callback registration.
A non-threaded implementation.
void wait() override
Blocking wait for all the tasks to execute first.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
StringRef str() const
Explicit conversion to StringRef.
This class provides an interface to register all the standard pass instrumentations and manages their...
StringRef - Represent a constant reference to a string, i.e.
Manages the enabling and disabling of subtarget specific features.
void getDefaultSubtargetFeatures(const Triple &Triple)
Adds the default features for the specified target triple.
std::string getString() const
Returns features as a string.
void AddFeature(StringRef String, bool Enable=true)
Adds Features.
Analysis pass providing the TargetLibraryInfo.
Implementation of the target library information.
Primary interface to the complete machine description for the target machine.
Target - Wrapper for Target specific information.
TargetMachine * createTargetMachine(StringRef TT, StringRef CPU, StringRef Features, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM=std::nullopt, CodeGenOptLevel OL=CodeGenOptLevel::Default, bool JIT=false) const
createTargetMachine - Create a target specific machine implementation for the specified Triple.
auto async(Function &&F, Args &&...ArgList)
Asynchronous submission of a task to the pool.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
PassManager manages ModulePassManagers.
void add(Pass *P) override
Add a pass to the queue of passes to run.
bool run(Module &M)
run - Execute all of the passes scheduled for execution.
A raw_ostream that writes to a file descriptor.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
Interfaces for registering analysis passes, producing common pass manager configurations,...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
std::optional< const char * > toString(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract a string value from it.
Error thinBackend(const Config &C, unsigned Task, AddStreamFn AddStream, Module &M, const ModuleSummaryIndex &CombinedIndex, const FunctionImporter::ImportMapTy &ImportList, const GVSummaryMapTy &DefinedGlobals, MapVector< StringRef, BitcodeModule > *ModuleMap, const std::vector< uint8_t > &CmdArgs=std::vector< uint8_t >())
Runs a ThinLTO backend.
BitcodeModule * findThinLTOModule(MutableArrayRef< BitcodeModule > BMs)
Returns the BitcodeModule that is ThinLTO.
Error backend(const Config &C, AddStreamFn AddStream, unsigned ParallelCodeGenParallelismLevel, Module &M, ModuleSummaryIndex &CombinedIndex)
Runs a regular LTO backend.
Error finalizeOptimizationRemarks(std::unique_ptr< ToolOutputFile > DiagOutputFile)
bool initImportList(const Module &M, const ModuleSummaryIndex &CombinedIndex, FunctionImporter::ImportMapTy &ImportList)
Distributed ThinLTO: collect the referenced modules based on module summary and initialize ImportList...
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.
bool opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod, bool IsThinLTO, ModuleSummaryIndex *ExportSummary, const ModuleSummaryIndex *ImportSummary, const std::vector< uint8_t > &CmdArgs)
Runs middle-end LTO optimizations on Mod.
void updateMemProfAttributes(Module &Mod, const ModuleSummaryIndex &Index)
Updates MemProf attributes (and metadata) based on whether the index has recorded that we are linking...
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
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.
void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
ThreadPoolStrategy heavyweight_hardware_concurrency(unsigned ThreadCount=0)
Returns a thread strategy for tasks requiring significant memory or other resources.
Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
void WriteBitcodeToFile(const Module &M, raw_ostream &Out, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the specified raw output stream.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
std::function< Expected< std::unique_ptr< CachedFileStream > >(unsigned Task, const Twine &ModuleName)> AddStreamFn
This type defines the callback to add a file that is generated on the fly.
bool convertToDeclaration(GlobalValue &GV)
Converts value GV to declaration, or replaces with a declaration if it is an alias.
bool renameModuleForThinLTO(Module &M, const ModuleSummaryIndex &Index, bool ClearDSOLocalOnDeclarations, SetVector< GlobalValue * > *GlobalsToImport=nullptr)
Perform in-place global value handling on the given Module for exported local functions renamed and p...
void embedBitcodeInModule(Module &M, MemoryBufferRef Buf, bool EmbedBitcode, bool EmbedCmdline, const std::vector< uint8_t > &CmdArgs)
If EmbedBitcode is set, save a copy of the llvm IR as data in the __LLVM,__bitcode section (....
void SplitModule(Module &M, unsigned N, function_ref< void(std::unique_ptr< Module > MPart)> ModuleCallback, bool PreserveLocals=false, bool RoundRobin=false)
Splits the module M into N linkable partitions.
void updatePublicTypeTestCalls(Module &M, bool WholeProgramVisibilityEnabledInLTO)
void writeIndexToFile(const ModuleSummaryIndex &Index, raw_ostream &Out, const std::map< std::string, GVSummaryMapTy > *ModuleToSummariesForIndex=nullptr, const GVSummaryPtrSet *DecSummaries=nullptr)
Write the specified module summary index to the given raw output stream, where it will be written in ...
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
cl::opt< bool > NoPGOWarnMismatch
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Mod
The access may modify the value stored in memory.
void thinLTOInternalizeModule(Module &TheModule, const GVSummaryMapTy &DefinedGlobals)
Internalize TheModule based on the information recorded in the summaries during global summary-based ...
cl::opt< bool > PrintPipelinePasses
Common option used by multiple tools to print pipeline passes.
ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)
Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
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.
static const Target * lookupTarget(StringRef Triple, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
std::function< bool(unsigned Task, const Module &)> ModuleHookFn
The following callbacks deal with tasks, which normally represent the entire optimization and code ge...
bool DebugPassManager
Whether to emit the pass manager debuggging informations.
bool AddFSDiscriminator
Add FSAFDO discriminators.
std::optional< uint64_t > RemarksHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
Error addSaveTemps(std::string OutputFileName, bool UseInputModulePath=false, const DenseSet< StringRef > &SaveTempsArgs={})
This is a convenience function that configures this Config object to write temporary files named afte...
ModuleHookFn PreOptModuleHook
This module hook is called after linking (regular LTO) or loading (ThinLTO) the module,...
CombinedIndexHookFn CombinedIndexHook
std::optional< CodeModel::Model > CodeModel
std::function< void(legacy::PassManager &)> PreCodeGenPassesHook
For adding passes that run right before codegen.
bool CodeGenOnly
Disable entirely the optimizer, including importing for ThinLTO.
std::vector< std::string > MAttrs
CodeGenOptLevel CGOptLevel
PipelineTuningOptions PTO
Tunable parameters for passes in the default pipelines.
std::unique_ptr< raw_ostream > ResolutionFile
If this field is set, LTO will write input file paths and symbol resolutions here in llvm-lto2 comman...
std::string DwoDir
The directory to store .dwo files.
std::string RemarksFilename
Optimization remarks file path.
ModuleHookFn PostPromoteModuleHook
This hook is called after promoting any internal functions (ThinLTO-specific).
std::string ProfileRemapping
Name remapping file for profile data.
std::string SplitDwarfFile
The name for the split debug info file used for the DW_AT_[GNU_]dwo_name attribute in the skeleton CU...
std::string SplitDwarfOutput
The path to write a .dwo file to.
ModuleHookFn PostOptModuleHook
This module hook is called after optimization is complete.
std::string RemarksPasses
Optimization remarks pass filter.
std::string OptPipeline
If this field is set, the set of passes run in the middle-end optimizer will be the one specified by ...
bool RunCSIRInstr
Run PGO context sensitive IR instrumentation.
ModuleHookFn PostInternalizeModuleHook
This hook is called after internalizing the module.
ModuleHookFn PostImportModuleHook
This hook is called after importing from other modules (ThinLTO-specific).
bool RemarksWithHotness
Whether to emit optimization remarks with hotness informations.
std::vector< std::string > PassPlugins
std::string CSIRProfile
Context Sensitive PGO profile path.
ModuleHookFn PreCodeGenModuleHook
This module hook is called before code generation.
std::optional< Reloc::Model > RelocModel
bool ShouldDiscardValueNames
bool PGOWarnMismatch
Turn on/off the warning about a hash mismatch in the PGO profile data.
CodeGenFileType CGFileType
bool Freestanding
Flag to indicate that the optimizer should not assume builtins are present on the target.
std::string SampleProfile
Sample PGO profile path.
std::string RemarksFormat
The format used for serializing remarks (default: YAML).
A derived class of LLVMContext that initializes itself according to a given Config object.