27#include "llvm/Config/llvm-config.h"
56#include "llvm/Support/VCSRevision.h"
72#define DEBUG_TYPE "lto"
74Error LTO::setupOptimizationRemarks() {
81 return DiagFileOrErr.takeError();
83 DiagnosticOutputFile = std::move(*DiagFileOrErr);
90 if (!LinkerRemarkFunction) {
91 DummyModule = std::make_unique<Module>(
"remark_dummy",
RegularLTO.
Ctx);
109 cl::desc(
"Dump the SCCs in the ThinLTO index's callgraph"));
119 cl::desc(
"Enable global value internalization in LTO"));
123 cl::desc(
"Keep copies of symbols in LTO indexing"));
140 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
151 Hasher.
update(LLVM_VERSION_STRING);
153 Hasher.
update(LLVM_REVISION);
161 auto AddUnsigned = [&](
unsigned I) {
166 auto AddUint64 = [&](uint64_t
I) {
171 auto AddUint8 = [&](
const uint8_t I) {
194 AddUnsigned(
static_cast<int>(Conf.
CGOptLevel));
195 AddUnsigned(
static_cast<int>(Conf.
CGFileType));
203 AddUint8(Conf.
Dtlto);
206 auto ModHash = Index.getModuleHash(ModuleID);
211 std::vector<uint64_t> ExportsGUID;
212 ExportsGUID.reserve(ExportList.
size());
213 for (
const auto &VI : ExportList)
214 ExportsGUID.push_back(VI.getGUID());
218 for (
auto GUID : ExportsGUID)
223 auto Comp = [&](
const std::pair<StringRef, GlobalValue::GUID> &L,
224 const std::pair<StringRef, GlobalValue::GUID> &R) {
225 return std::make_pair(Index.getModule(L.first)->second, L.second) <
226 std::make_pair(Index.getModule(R.first)->second, R.second);
232 for (
const auto &[FromModule, GUID,
Type] : SortedImportList)
233 ++ModuleToNumImports[FromModule];
235 std::optional<StringRef> LastModule;
236 for (
const auto &[FromModule, GUID,
Type] : SortedImportList) {
237 if (LastModule != FromModule) {
241 LastModule = FromModule;
242 auto ModHash = Index.getModule(FromModule)->second;
244 AddUint64(ModuleToNumImports[FromModule]);
251 for (
auto &Entry : ResolvedODR) {
260 std::set<GlobalValue::GUID> UsedCfiDefs;
261 std::set<GlobalValue::GUID> UsedCfiDecls;
264 std::set<GlobalValue::GUID> UsedTypeIds;
267 if (CfiFunctionDefs.
contains(ValueGUID))
268 UsedCfiDefs.insert(ValueGUID);
269 if (CfiFunctionDecls.
contains(ValueGUID))
270 UsedCfiDecls.insert(ValueGUID);
275 AddUnsigned(GS->getVisibility());
276 AddUnsigned(GS->isLive());
277 AddUnsigned(GS->canAutoHide());
279 AddUnsigned(VI.isDSOLocal(Index.withDSOLocalPropagation()));
280 AddUsedCfiGlobal(VI.getGUID());
283 AddUnsigned(GVS->maybeReadOnly());
284 AddUnsigned(GVS->maybeWriteOnly());
287 for (
auto &TT : FS->type_tests())
288 UsedTypeIds.insert(TT);
289 for (
auto &TT : FS->type_test_assume_vcalls())
290 UsedTypeIds.insert(TT.GUID);
291 for (
auto &TT : FS->type_checked_load_vcalls())
292 UsedTypeIds.insert(TT.GUID);
293 for (
auto &TT : FS->type_test_assume_const_vcalls())
294 UsedTypeIds.insert(TT.VFunc.GUID);
295 for (
auto &TT : FS->type_checked_load_const_vcalls())
296 UsedTypeIds.insert(TT.VFunc.GUID);
297 for (
auto &ET : FS->calls()) {
298 AddUnsigned(ET.first.isDSOLocal(Index.withDSOLocalPropagation()));
299 AddUsedCfiGlobal(ET.first.getGUID());
307 SortedDefinedGlobals(DefinedGlobals.
begin(), DefinedGlobals.
end());
309 for (
auto &GS : SortedDefinedGlobals) {
315 AddUsedCfiGlobal(GS.first);
316 AddUsedThings(GS.second);
321 for (
const auto &[FromModule, GUID,
Type] : SortedImportList) {
327 AddUsedThings(AS->getBaseObject());
333 AddUnsigned(S.TTRes.TheKind);
334 AddUnsigned(S.TTRes.SizeM1BitWidth);
336 AddUint64(S.TTRes.AlignLog2);
337 AddUint64(S.TTRes.SizeM1);
338 AddUint64(S.TTRes.BitMask);
339 AddUint64(S.TTRes.InlineBits);
341 AddUint64(S.WPDRes.size());
342 for (
auto &WPD : S.WPDRes) {
343 AddUnsigned(WPD.first);
344 AddUnsigned(WPD.second.TheKind);
345 AddString(WPD.second.SingleImplName);
347 AddUint64(WPD.second.ResByArg.size());
348 for (
auto &ByArg : WPD.second.ResByArg) {
349 AddUint64(ByArg.first.size());
350 for (uint64_t Arg : ByArg.first)
352 AddUnsigned(ByArg.second.TheKind);
353 AddUint64(ByArg.second.Info);
354 AddUnsigned(ByArg.second.Byte);
355 AddUnsigned(ByArg.second.Bit);
362 auto TidIter = Index.typeIds().equal_range(TId);
364 AddTypeIdSummary(
I.second.first,
I.second.second);
367 AddUnsigned(UsedCfiDefs.size());
368 for (
auto &V : UsedCfiDefs)
371 AddUnsigned(UsedCfiDecls.size());
372 for (
auto &V : UsedCfiDecls)
378 Hasher.
update(FileOrErr.get()->getBuffer());
383 Hasher.
update(FileOrErr.get()->getBuffer());
414 C.VisibilityScheme ==
Config::ELF ? VI.getELFVisibility()
416 for (
auto &S : VI.getSummaryList()) {
431 if (isPrevailing(VI.getGUID(), S.get())) {
432 assert(!S->wasPromoted() &&
433 "promoted symbols used to be internal linkage and shouldn't have "
434 "a prevailing variant");
447 S->setCanAutoHide(VI.canAutoHide() &&
448 !GUIDPreservedSymbols.
count(VI.getGUID()));
451 Visibility = S->getVisibility();
468 S->setVisibility(Visibility);
470 if (S->linkage() != OriginalLinkage)
471 recordNewLinkage(S->modulePath(), VI.getGUID(), S->linkage());
475 for (
auto &S : VI.getSummaryList()) {
480 S->setVisibility(Visibility);
502 for (
auto &
I : Index)
503 for (
auto &S :
I.second.getSummaryList())
505 GlobalInvolvedWithAlias.
insert(&AS->getAliasee());
507 for (
auto &
I : Index)
509 GlobalInvolvedWithAlias, isPrevailing,
510 recordNewLinkage, GUIDPreservedSymbols);
522 const bool SingleExternallyVisibleCopy =
523 VI.getSummaryList().size() == 1 &&
526 bool NameRecorded =
false;
527 for (
auto &S : VI.getSummaryList()) {
530 if (isExported(S->modulePath(), VI)) {
536 if (ExternallyVisibleSymbolNamesPtr && !NameRecorded) {
538 if (ExternallyVisibleSymbolNamesPtr->
insert(VI.name()).second)
539 S->setNoRenameOnPromotion(
true);
602 if (SingleExternallyVisibleCopy && isPrevailing(VI.getGUID(), S.get()))
615 assert(!Index.withInternalizeAndPromote());
617 for (
auto &
I : Index)
620 ExternallyVisibleSymbolNamesPtr);
621 Index.setWithInternalizeAndPromote();
628 std::unique_ptr<InputFile> File(
new InputFile);
634 File->TargetTriple = FOrErr->TheReader.getTargetTriple();
635 File->SourceFileName = FOrErr->TheReader.getSourceFileName();
636 File->COFFLinkerOpts = FOrErr->TheReader.getCOFFLinkerOpts();
637 File->DependentLibraries = FOrErr->TheReader.getDependentLibraries();
638 File->ComdatTable = FOrErr->TheReader.getComdatTable();
642 for (
unsigned I = 0;
I != FOrErr->Mods.size(); ++
I) {
643 size_t Begin = File->Symbols.size();
645 FOrErr->TheReader.module_symbols(
I))
648 if (Sym.isGlobal() && !Sym.isFormatSpecific())
649 File->Symbols.push_back(Sym);
650 File->ModuleSymIndices.push_back({Begin, File->Symbols.size()});
653 File->Mods = FOrErr->Mods;
654 File->Strtab = std::move(FOrErr->Strtab);
655 return std::move(File);
667 return Mods[0].getModuleIdentifier();
671 assert(Mods.size() == 1 &&
"Expect only one bitcode module");
699 Alloc = std::make_unique<BumpPtrAllocator>();
700 GlobalResolutionSymbolSaver = std::make_unique<llvm::StringSaver>(*Alloc);
709 LinkerRemarkFunction =
nullptr;
717 unsigned Partition,
bool InSummary,
720 auto *ResI = Res.
begin();
721 auto *ResE = Res.
end();
732 if (GlobalResolutionSymbolSaver && !GlobalResolutions->contains(SymbolName))
733 SymbolName = GlobalResolutionSymbolSaver->save(SymbolName);
735 auto &GlobalRes = (*GlobalResolutions)[SymbolName];
736 GlobalRes.UnnamedAddr &= Sym.isUnnamedAddr();
752 if ((GlobalRes.Prevailing || !GlobalRes.IRName.empty()) &&
753 GlobalRes.IRName != Sym.getIRName()) {
754 GlobalRes.Partition = GlobalResolution::External;
755 GlobalRes.VisibleOutsideSummary =
true;
759 assert(!GlobalRes.Prevailing &&
760 "Multiple prevailing defs are not allowed");
761 GlobalRes.Prevailing =
true;
762 GlobalRes.IRName = std::string(Sym.getIRName());
763 }
else if (!GlobalRes.Prevailing && GlobalRes.IRName.empty()) {
770 GlobalRes.IRName = std::string(Sym.getIRName());
773 bool IsLibcall = Sym.isLibcall(
TLI, Libcalls);
781 (GlobalRes.Partition != GlobalResolution::Unknown &&
782 GlobalRes.Partition != Partition)) {
783 GlobalRes.Partition = GlobalResolution::External;
786 GlobalRes.Partition = Partition;
790 GlobalRes.VisibleOutsideSummary |=
797void LTO::releaseGlobalResolutionsMemory() {
799 GlobalResolutions.reset();
801 GlobalResolutionSymbolSaver.reset();
809 auto ResI = Res.
begin();
814 OS <<
"-r=" << Path <<
',' << Sym.getName() <<
',';
832 assert(!CalledGetMaxTasks);
838 InputFile *
Input = (*InputOrErr).get();
840 if (
Conf.ResolutionFile)
843 if (
RegularLTO.CombinedModule->getTargetTriple().empty()) {
845 RegularLTO.CombinedModule->setTargetTriple(InputTriple);
851 for (
unsigned I = 0;
I !=
Input->Mods.size(); ++
I) {
852 if (
auto Err = addModule(*
Input, InputRes,
I, Res).moveInto(Res))
862 "bitcode libfuncs were set twice; maybe accidentally clobbered?");
863 this->BitcodeLibFuncs.append(BitcodeLibFuncs.begin(), BitcodeLibFuncs.end());
874 if (EnableSplitLTOUnit) {
878 if (*EnableSplitLTOUnit != LTOInfo->EnableSplitLTOUnit)
881 EnableSplitLTOUnit = LTOInfo->EnableSplitLTOUnit;
886 !LTOInfo->UnifiedLTO)
888 "unified LTO compilation must use "
889 "compatible bitcode modules (use -funified-lto)",
899 Input.IsThinLTO |= IsThinLTO;
901 auto ModSyms =
Input.module_symbols(ModI);
902 addModuleToGlobalRes(ModSyms, Res,
904 LTOInfo->HasSummary,
Triple(
Input.getTargetTriple()));
907 return addThinLTO(BM, ModSyms, Res);
910 auto ModOrErr = addRegularLTO(
Input, InputRes, BM, ModSyms, Res);
912 return ModOrErr.takeError();
913 Res = ModOrErr->second;
915 if (!LTOInfo->HasSummary) {
916 if (
Error Err = linkRegularLTO(std::move(ModOrErr->first),
942 std::set<const Comdat *> &NonPrevailingComdats) {
947 if (!NonPrevailingComdats.count(
C))
957 GO->setComdat(
nullptr);
964 std::pair<LTO::RegularLTOState::AddedModule, ArrayRef<SymbolResolution>>>
968 llvm::TimeTraceScope timeScope(
"LTO add regular LTO");
970 Expected<std::unique_ptr<Module>> MOrErr =
976 Mod.M = std::move(*MOrErr);
978 if (
Error Err =
M.materializeMetadata())
979 return std::move(Err);
985 if (NamedMDNode *CfiFunctionsMD =
M.getNamedMetadata(
"cfi.functions"))
986 M.eraseNamedMetadata(CfiFunctionsMD);
987 }
else if (NamedMDNode *AliasesMD =
M.getNamedMetadata(
"aliases")) {
990 DenseSet<StringRef> Prevailing;
991 for (
auto [
I, R] :
zip(
Input.symbols(), InputRes))
992 if (
R.Prevailing && !
I.getIRName().empty())
993 Prevailing.
insert(
I.getIRName());
994 std::vector<MDNode *> AliasGroups;
995 for (MDNode *AliasGroup : AliasesMD->operands()) {
996 std::vector<Metadata *> Aliases;
997 for (
Metadata *Alias : AliasGroup->operands()) {
1000 Aliases.push_back(Alias);
1002 if (Aliases.size() > 1)
1005 AliasesMD->clearOperands();
1006 for (MDNode *
G : AliasGroups)
1007 AliasesMD->addOperand(
G);
1012 ModuleSymbolTable SymTab;
1015 for (GlobalVariable &GV :
M.globals())
1016 if (GV.hasAppendingLinkage())
1017 Mod.Keep.push_back(&GV);
1019 DenseSet<GlobalObject *> AliasedGlobals;
1020 for (
auto &GA :
M.aliases())
1021 if (GlobalObject *GO = GA.getAliaseeObject())
1022 AliasedGlobals.
insert(GO);
1031 auto MsymI = SymTab.
symbols().begin(), MsymE = SymTab.
symbols().end();
1033 while (MsymI != MsymE) {
1043 std::set<const Comdat *> NonPrevailingComdats;
1044 SmallSet<StringRef, 2> NonPrevailingAsmSymbols;
1045 for (
const InputFile::Symbol &Sym : Syms) {
1055 if (Sym.isUndefined())
1057 Mod.Keep.push_back(GV);
1061 if (
R.LinkerRedefined)
1069 (GV->hasLinkOnceODRLinkage() || GV->hasWeakODRLinkage() ||
1070 GV->hasAvailableExternallyLinkage()) &&
1077 Mod.Keep.push_back(GV);
1079 if (GV->hasComdat())
1080 NonPrevailingComdats.insert(GV->getComdat());
1085 if (
R.FinalDefinitionInLinkageUnit) {
1086 GV->setDSOLocal(
true);
1087 if (GV->hasDLLImportStorageClass())
1089 DefaultStorageClass);
1091 }
else if (
auto *AS =
1095 NonPrevailingAsmSymbols.
insert(AS->first);
1103 if (Sym.isCommon()) {
1106 auto &CommonRes =
RegularLTO.Commons[std::string(Sym.getIRName())];
1107 CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize());
1108 if (uint32_t SymAlignValue = Sym.getCommonAlignment()) {
1109 CommonRes.Alignment =
1110 std::max(
Align(SymAlignValue), CommonRes.Alignment);
1112 CommonRes.Prevailing |=
R.Prevailing;
1116 if (!
M.getComdatSymbolTable().empty())
1117 for (GlobalValue &GV :
M.global_values())
1122 if (
M.hasModuleInlineAsm()) {
1123 std::string NewIA =
".lto_discard";
1124 if (!NonPrevailingAsmSymbols.
empty()) {
1127 M, [&](StringRef Name, StringRef Alias) {
1128 if (!NonPrevailingAsmSymbols.
count(Alias))
1129 NonPrevailingAsmSymbols.
erase(Name);
1131 NewIA +=
" " +
llvm::join(NonPrevailingAsmSymbols,
", ");
1134 M.prependModuleInlineAsm({NewIA,
M.getModuleInlineAsm().front().Props});
1138 return std::make_pair(std::move(
Mod), Res);
1141Error LTO::linkRegularLTO(RegularLTOState::AddedModule
Mod,
1142 bool LivenessFromIndex) {
1143 llvm::TimeTraceScope timeScope(
"LTO link regular LTO");
1144 std::vector<GlobalValue *>
Keep;
1145 for (GlobalValue *GV :
Mod.Keep) {
1146 if (LivenessFromIndex) {
1148 if (!
ThinLTO.CombinedIndex.isGUIDLive(GUID)) {
1150 if (DiagnosticOutputFile) {
1151 if (
Error Err =
F->materialize())
1153 auto R = OptimizationRemark(
DEBUG_TYPE,
"deadfunction",
F);
1154 R <<
ore::NV(
"Function",
F) <<
" not added to the combined module ";
1169 GlobalValue *CombinedGV =
1182Expected<ArrayRef<SymbolResolution>>
1185 llvm::TimeTraceScope timeScope(
"LTO add thin LTO");
1188 DenseSet<StringRef> Prevailing;
1189 for (
const InputFile::Symbol &Sym : Syms) {
1192 if (!Sym.getIRName().empty() &&
R.Prevailing)
1193 Prevailing.
insert(Sym.getIRName());
1197 StringMap<GlobalValue::GUID> IRSpecifiedGUIDs;
1200 [&](StringRef Name) { return (Prevailing.count(Name) > 0); },
1202 auto IT = IRSpecifiedGUIDs.insert({VI.name(), VI.getGUID()});
1212 auto GUIDIter = IRSpecifiedGUIDs.
find(Sym.getIRName());
1217 GUIDIter == IRSpecifiedGUIDs.
end()
1222 if (!Sym.getIRName().empty() &&
1223 (
R.Prevailing ||
R.FinalDefinitionInLinkageUnit)) {
1225 (*GlobalResolutions)[Sym.getName()].setGUID(GUID);
1226 ThinLTO.setPrevailingModuleForGUID(GUID, BMID);
1231 if (
R.LinkerRedefined)
1232 if (
auto *S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID))
1238 if (
R.FinalDefinitionInLinkageUnit) {
1239 if (
auto *S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID)) {
1240 S->setDSOLocal(
true);
1246 if (!ThinLTO.ModuleMap.insert({BMID, BM}).second)
1248 "Expected at most one ThinLTO module per bitcode file",
1251 if (!Conf.ThinLTOModulesToCompile.empty()) {
1252 if (!ThinLTO.ModulesToCompile)
1253 ThinLTO.ModulesToCompile = ModuleMapType();
1256 for (
const std::string &Name : Conf.ThinLTOModulesToCompile) {
1257 if (BMID.contains(Name)) {
1258 ThinLTO.ModulesToCompile->insert({BMID, BM});
1259 LLVM_DEBUG(
dbgs() <<
"[ThinLTO] Selecting " << BMID <<
" to compile\n");
1269 CalledGetMaxTasks =
true;
1270 auto ModuleCount =
ThinLTO.ModulesToCompile ?
ThinLTO.ModulesToCompile->size()
1272 return RegularLTO.ParallelCodeGenParallelismLevel + ModuleCount;
1277Error LTO::checkPartiallySplit() {
1287 Combined, Intrinsic::type_checked_load_relative);
1291 if ((TypeTestFunc && !TypeTestFunc->
use_empty()) ||
1292 (TypeCheckedLoadFunc && !TypeCheckedLoadFunc->
use_empty()) ||
1293 (TypeCheckedLoadRelativeFunc &&
1294 !TypeCheckedLoadRelativeFunc->
use_empty()))
1296 "inconsistent LTO Unit splitting (recompile with -fsplit-lto-unit)",
1302 for (
auto &S :
P.second.getSummaryList()) {
1306 if (!FS->type_test_assume_vcalls().empty() ||
1307 !FS->type_checked_load_vcalls().empty() ||
1308 !FS->type_test_assume_const_vcalls().empty() ||
1309 !FS->type_checked_load_const_vcalls().empty() ||
1310 !FS->type_tests().empty())
1312 "inconsistent LTO Unit splitting (recompile with -fsplit-lto-unit)",
1327 for (
auto &Res : *GlobalResolutions) {
1330 if (Res.second.IRName.
empty())
1335 if (Res.second.VisibleOutsideSummary && Res.second.Prevailing)
1336 GUIDPreservedSymbols.insert(GUID);
1338 if (Res.second.ExportDynamic)
1339 DynamicExportSymbols.insert(GUID);
1341 GUIDPrevailingResolutions[GUID] =
1346 auto It = GUIDPrevailingResolutions.
find(
G);
1347 if (It == GUIDPrevailingResolutions.
end())
1352 isPrevailing,
Conf.OptLevel > 0);
1356 if (!StatsFileOrErr)
1357 return StatsFileOrErr.takeError();
1358 std::unique_ptr<ToolOutputFile> StatsFile = std::move(StatsFileOrErr.get());
1360 if (
Error Err = setupOptimizationRemarks())
1369 ThinLTO.CombinedIndex.setWithSupportsHotColdNew();
1371 Error Result = runRegularLTO(AddStream);
1375 Result = runThinLTO(AddStream, Cache, GUIDPreservedSymbols);
1394 linkRegularLTO(std::move(M),
true))
1407 if (
Error Err = checkPartiallySplit())
1414 if (!
I.second.Prevailing)
1426 auto *GV =
new GlobalVariable(*
RegularLTO.CombinedModule, Ty,
false,
1429 GV->setAlignment(
I.second.Alignment);
1439 bool WholeProgramVisibilityEnabledInLTO =
1440 Conf.HasWholeProgramVisibility &&
1443 (!
Conf.ValidateAllVtablesHaveTypeInfos ||
Conf.AllVtablesHaveTypeInfos);
1447 auto IsVisibleToRegularObj = [&](StringRef
name) {
1448 auto It = GlobalResolutions->find(
name);
1449 return (It == GlobalResolutions->end() ||
1450 It->second.VisibleOutsideSummary || !It->second.Prevailing);
1456 *
RegularLTO.CombinedModule, WholeProgramVisibilityEnabledInLTO,
1457 DynamicExportSymbols,
Conf.ValidateAllVtablesHaveTypeInfos,
1458 IsVisibleToRegularObj);
1460 WholeProgramVisibilityEnabledInLTO);
1462 if (
Conf.PreOptModuleHook &&
1466 if (!
Conf.CodeGenOnly) {
1467 for (
const auto &R : *GlobalResolutions) {
1469 RegularLTO.CombinedModule->getNamedValue(
R.second.IRName);
1470 if (!
R.second.isPrevailingIRSymbol())
1472 if (
R.second.Partition != 0 &&
1473 R.second.Partition != GlobalResolution::External)
1501 if (
Conf.PostInternalizeModuleHook &&
1506 if (!
RegularLTO.EmptyCombinedModule ||
Conf.AlwaysEmitRegularLTOObj) {
1526 return LibcallSymbols;
1531 auto TLII = std::make_unique<TargetLibraryInfoImpl>(TT);
1534 LibFuncSymbols.
reserve(LibFunc::NumLibFuncs);
1535 for (
unsigned I = LibFunc::Begin_LibFunc;
I != LibFunc::End_LibFunc; ++
I) {
1536 LibFunc
F =
static_cast<LibFunc
>(
I);
1540 return LibFuncSymbols;
1546 return emitFiles(ImportList, Task, ModulePath, NewModulePath,
1547 NewModulePath +
".thinlto.bc");
1559 ImportList, ModuleToSummariesForIndex,
1560 DeclarationSummaries);
1563 std::unique_ptr<raw_pwrite_stream> OS;
1564 if (
Conf.GetSummaryIndexOutputStream) {
1565 OS =
Conf.GetSummaryIndexOutputStream(Task);
1566 assert(OS &&
"GetSummaryIndexOutputStream returned null");
1568 auto FileOS = std::make_unique<raw_fd_ostream>(SummaryPath, EC,
1572 OS = std::move(FileOS);
1576 &DeclarationSummaries);
1579 if (
Conf.GetImportsListOutputArray) {
1580 std::vector<std::string> &ImportsListRef =
1581 Conf.GetImportsListOutputArray(Task);
1583 ModulePath, ModuleToSummariesForIndex,
1584 [&](
StringRef M) { ImportsListRef.push_back(M.str()); });
1587 ModuleToSummariesForIndex))
1600 bool ShouldEmitIndexFiles;
1609 OnWrite, ShouldEmitImportsFiles, ThinLTOParallelism),
1610 ShouldEmitIndexFiles(ShouldEmitIndexFiles) {
1612 CfiFunctionDefs.
insert_range(Defs.getExportedThinLTOGUIDs());
1614 CfiFunctionDecls.
insert_range(Decls.getExportedThinLTOGUIDs());
1620class InProcessThinBackend :
public CGThinBackend {
1629 InProcessThinBackend(
1634 bool ShouldEmitIndexFiles,
bool ShouldEmitImportsFiles,
1636 : CGThinBackend(Conf, CombinedIndex, ModuleToDefinedGVSummaries, OnWrite,
1637 ShouldEmitIndexFiles, ShouldEmitImportsFiles,
1638 ThinLTOParallelism),
1640 BitcodeLibFuncs(BitcodeLibFuncs) {}
1642 virtual Error runThinLTOBackendThread(
1643 AddStreamFn AddStream, FileCache Cache,
unsigned Task, BitcodeModule BM,
1644 ModuleSummaryIndex &CombinedIndex,
1645 const FunctionImporter::ImportMapTy &ImportList,
1647 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1649 MapVector<StringRef, BitcodeModule> &ModuleMap) {
1651 llvm::TimeTraceScope timeScope(
"Run ThinLTO backend thread (in-process)",
1653 auto RunThinBackend = [&](
AddStreamFn AddStream) {
1654 LTOLLVMContext BackendContext(Conf);
1655 Expected<std::unique_ptr<Module>> MOrErr = BM.
parseModule(BackendContext);
1659 return thinBackend(Conf, Task, AddStream, **MOrErr, CombinedIndex,
1660 ImportList, DefinedGlobals, &ModuleMap,
1663 if (ShouldEmitIndexFiles) {
1664 if (
auto E = emitFiles(ImportList, Task, ModuleID, ModuleID.str()))
1670 [](uint32_t
V) { return V == 0; }))
1673 return RunThinBackend(AddStream);
1677 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1678 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1679 Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task,
Key, ModuleID);
1682 AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
1684 return RunThinBackend(CacheAddStream);
1690 unsigned Task, BitcodeModule BM,
1691 const FunctionImporter::ImportMapTy &ImportList,
1693 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1694 MapVector<StringRef, BitcodeModule> &ModuleMap)
override {
1696 assert(ModuleToDefinedGVSummaries.
count(ModulePath));
1698 ModuleToDefinedGVSummaries.
find(ModulePath)->second;
1699 BackendThreadPool.async(
1700 [=](BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
1701 const FunctionImporter::ImportMapTy &ImportList,
1703 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>
1706 MapVector<StringRef, BitcodeModule> &ModuleMap) {
1710 Error E = runThinLTOBackendThread(
1711 AddStream, Cache, Task, BM, CombinedIndex, ImportList, ExportList,
1712 ResolvedODR, DefinedGlobals, ModuleMap);
1714 std::unique_lock<std::mutex>
L(ErrMu);
1723 BM, std::ref(CombinedIndex), std::ref(ImportList), std::ref(ExportList),
1724 std::ref(ResolvedODR), std::ref(DefinedGlobals), std::ref(ModuleMap));
1727 OnWrite(std::string(ModulePath));
1737class FirstRoundThinBackend :
public InProcessThinBackend {
1742 FirstRoundThinBackend(
1743 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1744 ThreadPoolStrategy ThinLTOParallelism,
1745 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1749 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
1750 ModuleToDefinedGVSummaries, std::
move(CGAddStream),
1751 std::
move(CGCache), nullptr,
1753 false, BitcodeLibFuncs),
1754 IRAddStream(std::
move(IRAddStream)), IRCache(std::
move(IRCache)) {}
1756 Error runThinLTOBackendThread(
1757 AddStreamFn CGAddStream, FileCache CGCache,
unsigned Task,
1758 BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
1759 const FunctionImporter::ImportMapTy &ImportList,
1761 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1763 MapVector<StringRef, BitcodeModule> &ModuleMap)
override {
1765 llvm::TimeTraceScope timeScope(
"Run ThinLTO backend thread (first round)",
1767 auto RunThinBackend = [&](
AddStreamFn CGAddStream,
1769 LTOLLVMContext BackendContext(Conf);
1770 Expected<std::unique_ptr<Module>> MOrErr = BM.
parseModule(BackendContext);
1774 return thinBackend(Conf, Task, CGAddStream, **MOrErr, CombinedIndex,
1775 ImportList, DefinedGlobals, &ModuleMap,
1781 if (ShouldEmitIndexFiles) {
1782 if (
auto E = emitFiles(ImportList, Task, ModuleID, ModuleID.str()))
1787 "Both caches for CG and IR should have matching availability");
1790 [](uint32_t
V) { return V == 0; }))
1793 return RunThinBackend(CGAddStream, IRAddStream);
1797 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1798 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1799 Expected<AddStreamFn> CacheCGAddStreamOrErr =
1800 CGCache(Task, CGKey, ModuleID);
1803 AddStreamFn &CacheCGAddStream = *CacheCGAddStreamOrErr;
1807 Expected<AddStreamFn> CacheIRAddStreamOrErr =
1808 IRCache(Task, IRKey, ModuleID);
1811 AddStreamFn &CacheIRAddStream = *CacheIRAddStreamOrErr;
1817 if (CacheCGAddStream || CacheIRAddStream) {
1820 return RunThinBackend(CacheCGAddStream ? CacheCGAddStream : CGAddStream,
1821 CacheIRAddStream ? CacheIRAddStream : IRAddStream);
1833class SecondRoundThinBackend :
public InProcessThinBackend {
1834 std::unique_ptr<SmallVector<StringRef>> IRFiles;
1838 SecondRoundThinBackend(
1839 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1840 ThreadPoolStrategy ThinLTOParallelism,
1841 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1846 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
1847 ModuleToDefinedGVSummaries, std::
move(AddStream),
1851 false, BitcodeLibFuncs),
1852 IRFiles(std::
move(IRFiles)), CombinedCGDataHash(CombinedCGDataHash) {}
1854 Error runThinLTOBackendThread(
1855 AddStreamFn AddStream, FileCache Cache,
unsigned Task, BitcodeModule BM,
1856 ModuleSummaryIndex &CombinedIndex,
1857 const FunctionImporter::ImportMapTy &ImportList,
1859 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1861 MapVector<StringRef, BitcodeModule> &ModuleMap)
override {
1863 llvm::TimeTraceScope timeScope(
"Run ThinLTO backend thread (second round)",
1865 auto RunThinBackend = [&](
AddStreamFn AddStream) {
1866 LTOLLVMContext BackendContext(Conf);
1867 std::unique_ptr<Module> LoadedModule =
1870 return thinBackend(Conf, Task, AddStream, *LoadedModule, CombinedIndex,
1871 ImportList, DefinedGlobals, &ModuleMap,
1872 true, BitcodeLibFuncs);
1876 [](uint32_t
V) { return V == 0; }))
1879 return RunThinBackend(AddStream);
1884 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1885 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1887 std::to_string(CombinedCGDataHash));
1888 Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task,
Key, ModuleID);
1891 AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
1893 if (CacheAddStream) {
1896 return RunThinBackend(CacheAddStream);
1906 bool ShouldEmitIndexFiles,
1907 bool ShouldEmitImportsFiles) {
1913 return std::make_unique<InProcessThinBackend>(
1914 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
1915 AddStream, Cache, OnWrite, ShouldEmitIndexFiles,
1916 ShouldEmitImportsFiles, BitcodeLibFuncs);
1942 return std::string(Path);
1946 if (!ParentPath.
empty()) {
1949 llvm::errs() <<
"warning: could not create directory '" << ParentPath
1950 <<
"': " << EC.message() <<
'\n';
1952 return std::string(NewPath);
1957 std::string OldPrefix, NewPrefix, NativeObjectPrefix;
1963 WriteIndexesThinBackend(
1967 std::string OldPrefix, std::string NewPrefix,
1968 std::string NativeObjectPrefix,
bool ShouldEmitImportsFiles,
1971 OnWrite, ShouldEmitImportsFiles, ThinLTOParallelism),
1972 OldPrefix(OldPrefix), NewPrefix(NewPrefix),
1973 NativeObjectPrefix(NativeObjectPrefix),
1974 LinkedObjectsFile(LinkedObjectsFile) {
1975 auto Defs = CombinedIndex.
cfiFunctionDefs().getExportedThinLTOGUIDs();
1976 CfiFunctionDefs.
insert(Defs.begin(), Defs.end());
1978 CfiFunctionDecls.
insert(Decls.begin(), Decls.end());
1985 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1993 if (LinkedObjectsFile) {
1994 std::string ObjectPrefix =
1995 NativeObjectPrefix.empty() ? NewPrefix : NativeObjectPrefix;
1996 std::string LinkedObjectsFilePath =
1998 *LinkedObjectsFile << LinkedObjectsFilePath <<
'\n';
2001 BackendThreadPool.async(
2002 [
this](
unsigned Task,
const StringRef ModulePath,
2003 const FunctionImporter::ImportMapTy &ImportList,
2005 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>
2007 const std::string &OldPrefix,
const std::string &NewPrefix) {
2008 std::string NewModulePath =
2010 auto E = emitFiles(ImportList, Task, ModulePath, NewModulePath);
2012 std::unique_lock<std::mutex>
L(ErrMu);
2018 assert(ModuleToDefinedGVSummaries.
count(ModulePath));
2020 ModuleToDefinedGVSummaries.
find(ModulePath)->second;
2026 Conf, CombinedIndex, ModulePath, ImportList, ExportList,
2027 ResolvedODR, DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
2030 Task, ModulePath, ImportList, ExportList, ResolvedODR, OldPrefix,
2034 OnWrite(std::string(ModulePath));
2038 bool isSensitiveToInputOrder()
override {
2048 std::string NewPrefix, std::string NativeObjectPrefix,
2056 return std::make_unique<WriteIndexesThinBackend>(
2057 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2058 OldPrefix, NewPrefix, NativeObjectPrefix, ShouldEmitImportsFiles,
2059 LinkedObjectsFile, OnWrite);
2078 llvm::errs() <<
"warning: [ThinLTO] No module compiled\n";
2082 if (
Conf.CombinedIndexHook &&
2083 !
Conf.CombinedIndexHook(
ThinLTO.CombinedIndex, GUIDPreservedSymbols))
2088 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(
2090 ThinLTO.CombinedIndex.collectDefinedGVSummariesPerModule(
2091 ModuleToDefinedGVSummaries);
2100 if (!ModuleToDefinedGVSummaries.
count(
Mod.first))
2103 FunctionImporter::ImportListsTy ImportLists(
ThinLTO.ModuleMap.size());
2104 DenseMap<StringRef, FunctionImporter::ExportSetTy> ExportLists(
2106 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
2111 std::set<GlobalValue::GUID> ExportedGUIDs;
2113 bool WholeProgramVisibilityEnabledInLTO =
2114 Conf.HasWholeProgramVisibility &&
2117 (!
Conf.ValidateAllVtablesHaveTypeInfos ||
Conf.AllVtablesHaveTypeInfos);
2119 ThinLTO.CombinedIndex.setWithWholeProgramVisibility();
2124 DenseSet<GlobalValue::GUID> VisibleToRegularObjSymbols;
2125 if (WholeProgramVisibilityEnabledInLTO &&
2126 Conf.ValidateAllVtablesHaveTypeInfos) {
2129 auto IsVisibleToRegularObj = [&](StringRef
name) {
2130 auto It = GlobalResolutions->find(
name);
2131 return (It == GlobalResolutions->end() ||
2132 It->second.VisibleOutsideSummary || !It->second.Prevailing);
2136 VisibleToRegularObjSymbols,
2137 IsVisibleToRegularObj);
2143 ThinLTO.CombinedIndex, WholeProgramVisibilityEnabledInLTO,
2144 DynamicExportSymbols, VisibleToRegularObjSymbols);
2149 std::map<ValueInfo, std::vector<VTableSlotSummary>> LocalWPDTargetsMap;
2150 DenseSet<StringRef> ExternallyVisibleSymbolNames;
2156 DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr =
2158 ? &ExternallyVisibleSymbolNames
2162 ExternallyVisibleSymbolNamesPtr);
2165 return ThinLTO.isPrevailingModuleForGUID(GUID, S->modulePath());
2168 MemProfContextDisambiguation ContextDisambiguation;
2169 ContextDisambiguation.
run(
2171 [&](StringRef
PassName, StringRef RemarkName,
const Twine &
Msg) {
2172 auto R = OptimizationRemark(PassName.data(), RemarkName,
2173 LinkerRemarkFunction);
2183 for (
auto &Res : *GlobalResolutions) {
2186 if (Res.second.Partition != GlobalResolution::External ||
2187 !Res.second.isPrevailingIRSymbol())
2189 auto GUID = Res.second.getGUID();
2191 if (
ThinLTO.CombinedIndex.isGUIDLive(GUID))
2192 ExportedGUIDs.insert(GUID);
2199 releaseGlobalResolutionsMemory();
2201 if (
Conf.OptLevel > 0)
2203 isPrevailing, ImportLists, ExportLists);
2207 auto Defs =
ThinLTO.CombinedIndex.cfiFunctionDefs().getExportedThinLTOGUIDs();
2208 ExportedGUIDs.insert(Defs.begin(), Defs.end());
2210 ThinLTO.CombinedIndex.cfiFunctionDecls().getExportedThinLTOGUIDs();
2211 ExportedGUIDs.insert(Decls.begin(), Decls.end());
2213 auto isExported = [&](StringRef ModuleIdentifier, ValueInfo
VI) {
2214 const auto &ExportList = ExportLists.
find(ModuleIdentifier);
2215 return (ExportList != ExportLists.end() && ExportList->second.
count(VI)) ||
2216 ExportedGUIDs.count(
VI.getGUID());
2222 LocalWPDTargetsMap, ExternallyVisibleSymbolNamesPtr);
2224 if (ExternallyVisibleSymbolNamesPtr) {
2227 for (
auto &
I :
ThinLTO.CombinedIndex) {
2228 ValueInfo
VI =
ThinLTO.CombinedIndex.getValueInfo(
I);
2229 for (
const auto &Summary :
VI.getSummaryList()) {
2230 const GlobalValueSummary *
Base =
Summary->getBaseObject();
2234 ExternallyVisibleSymbolNamesPtr->
insert(
VI.name());
2242 ExternallyVisibleSymbolNamesPtr);
2244 auto recordNewLinkage = [&](StringRef ModuleIdentifier,
2247 ResolvedODR[ModuleIdentifier][
GUID] = NewLinkage;
2250 recordNewLinkage, GUIDPreservedSymbols);
2259 TimeTraceScopeExit.release();
2264 auto RunBackends = [&](ThinBackendProc *BackendProcess) ->
Error {
2265 auto ProcessOneModule = [&](
int I) ->
Error {
2269 return BackendProcess->start(
2271 ImportLists[
Mod.first], ExportLists[
Mod.first],
2275 BackendProcess->setup(ModuleMap.
size(),
2277 RegularLTO.CombinedModule->getTargetTriple());
2279 if (BackendProcess->getThreadCount() == 1 ||
2280 BackendProcess->isSensitiveToInputOrder()) {
2286 for (
int I = 0,
E = ModuleMap.
size();
I !=
E; ++
I)
2287 if (
Error E = ProcessOneModule(
I))
2294 std::vector<BitcodeModule *> ModulesVec;
2295 ModulesVec.reserve(ModuleMap.
size());
2296 for (
auto &
Mod : ModuleMap)
2297 ModulesVec.push_back(&
Mod.second);
2299 if (
Error E = ProcessOneModule(
I))
2302 return BackendProcess->wait();
2306 std::unique_ptr<ThinBackendProc> BackendProc =
2308 AddStream, Cache, BitcodeLibFuncs);
2309 return RunBackends(BackendProc.get());
2317 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] Initializing ThinLTO two-codegen rounds\n");
2320 auto Parallelism =
ThinLTO.Backend.getParallelism();
2323 cgdata::StreamCacheData CG(MaxTasks, Cache,
"CG"),
IR(MaxTasks, Cache,
"IR");
2328 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] Running the first round of codegen\n");
2329 auto FirstRoundLTO = std::make_unique<FirstRoundThinBackend>(
2330 Conf,
ThinLTO.CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2331 CG.AddStream, CG.Cache, BitcodeLibFuncs,
IR.AddStream,
IR.Cache);
2332 if (
Error E = RunBackends(FirstRoundLTO.get()))
2337 RegularLTO.Ctx.getLibraryOptions(), *CG.getResult());
2338 if (
Error E = CombinedHashOrErr.takeError())
2340 auto CombinedHash = *CombinedHashOrErr;
2341 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] CGData hash: " << CombinedHash <<
"\n");
2345 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] Running the second round of codegen\n");
2346 auto SecondRoundLTO = std::make_unique<SecondRoundThinBackend>(
2347 Conf,
ThinLTO.CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2348 AddStream, Cache, BitcodeLibFuncs,
IR.getResult(), CombinedHash);
2349 return RunBackends(SecondRoundLTO.get());
2367 if (
Error E = ResultOrErr.takeError())
2368 return std::move(E);
2371 (*ResultOrErr)->keep();
2379 if (StatsFilename.
empty())
2390 return std::move(StatsFile);
2398 std::vector<int> ModulesOrdering(Seq.begin(), Seq.end());
2399 llvm::sort(ModulesOrdering, [&](
int LeftIndex,
int RightIndex) {
2400 auto LSize = R[LeftIndex]->getBuffer().size();
2401 auto RSize = R[RightIndex]->getBuffer().size();
2402 return LSize > RSize;
2404 return ModulesOrdering;
const TargetLowering & TLI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
Function Alias Analysis false
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static void writeToResolutionFile(raw_ostream &OS, InputFile *Input, ArrayRef< SymbolResolution > Res)
static void thinLTOResolvePrevailingGUID(const Config &C, ValueInfo VI, DenseSet< GlobalValueSummary * > &GlobalInvolvedWithAlias, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing, function_ref< void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)> recordNewLinkage, const DenseSet< GlobalValue::GUID > &GUIDPreservedSymbols)
static void handleNonPrevailingComdat(GlobalValue &GV, std::set< const Comdat * > &NonPrevailingComdats)
static void thinLTOInternalizeAndPromoteGUID(ValueInfo VI, function_ref< bool(StringRef, ValueInfo)> isExported, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing, DenseSet< StringRef > *ExternallyVisibleSymbolNamesPtr)
static cl::opt< bool > DumpThinCGSCCs("dump-thin-cg-sccs", cl::init(false), cl::Hidden, cl::desc("Dump the SCCs in the ThinLTO index's callgraph"))
Legalize the Machine IR a function s Machine IR
static constexpr StringLiteral Filename
Provides a library for accessing information about this process and other processes on the operating ...
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
This file defines the SmallSet class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
static const char PassName[]
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
const T & consume_front()
consume_front() - Returns the first element and drops it from ArrayRef.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
Represents a module in a bitcode file.
StringRef getModuleIdentifier() const
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(StringRef)> IsPrevailing=nullptr, std::function< void(ValueInfo)> OnValueInfo=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
auto getExportedThinLTOGUIDs() const
get the set of GUIDs that should also be exported because they are the GUIDs of the cfi functions enc...
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
A parsed version of the target data layout string in and methods for querying it.
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
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.
Error takeError()
Take ownership of the stored error.
The map maintains the list of imports.
DenseSet< ValueInfo > ExportSetTy
The set contains an entry for every global value that the module exports.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Function and variable summary information to aid decisions and implementation of importing.
static bool isAppendingLinkage(LinkageTypes Linkage)
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isExternalWeakLinkage(LinkageTypes Linkage)
static bool isLocalLinkage(LinkageTypes Linkage)
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
LLVM_ABI GUID getGUIDOrFallback() const
Return the GUID for this value if it has been assigned, otherwise fall back to computing it based on ...
LLVM_ABI const Comdat * getComdat() const
static bool isLinkOnceLinkage(LinkageTypes Linkage)
void setLinkage(LinkageTypes LT)
DLLStorageClassTypes
Storage classes of global values for PE targets.
static bool isExternalLinkage(LinkageTypes Linkage)
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
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....
static LinkageTypes getWeakLinkage(bool ODR)
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
bool hasAppendingLinkage() const
bool hasAvailableExternallyLinkage() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AvailableExternallyLinkage
Available for inspection, not emission.
DLLStorageClassTypes getDLLStorageClass() const
static bool isLinkOnceODRLinkage(LinkageTypes Linkage)
LLVM_ABI uint64_t getGlobalSize(const DataLayout &DL) const
Get the size of this global variable in bytes.
LLVM_ABI void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
This is an important class for using LLVM in a threaded context.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
This class implements a map that also provides access to all stored values in a deterministic order.
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
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...
CfiFunctionIndex & cfiFunctionDecls()
void setPartiallySplitLTOUnits()
void releaseTemporaryMemory()
const ModuleHash & getModuleHash(const StringRef ModPath) const
Get the module SHA1 hash recorded for the given module path.
bool partiallySplitLTOUnits() const
const StringMap< ModuleHash > & modulePaths() const
Table of modules, containing module hash and id.
CfiFunctionIndex & cfiFunctionDefs()
LLVM_ABI void addModule(Module *M)
static LLVM_ABI void CollectAsmSymvers(const Module &M, function_ref< void(StringRef, StringRef)> AsmSymver)
Parse inline ASM and collect the symvers directives that are defined in the current module.
PointerUnion< GlobalValue *, AsmSymbol * > Symbol
LLVM_ABI uint32_t getSymbolFlags(Symbol S) const
ArrayRef< Symbol > symbols() const
A Module instance is used to store all the information related to an LLVM module.
A class that wrap the SHA1 algorithm.
LLVM_ABI void update(ArrayRef< uint8_t > Data)
Digest more data.
LLVM_ABI std::array< uint8_t, 20 > result()
Return the current raw 160-bits SHA1 for the digested data since the last call to init().
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
StringRef str() const
Explicit conversion to StringRef.
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
iterator find(StringRef Key)
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
StringRef save(const char *S)
Implementation of the target library information.
Provides information about what library functions are available for the current target.
MCTargetOptions MCOptions
Machine level options.
unsigned FunctionSections
Emit functions into separate sections.
unsigned DataSections
Emit data into separate sections.
This tells how a thread pool will be used.
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
Triple - Helper class for working with autoconf configuration names.
bool isArm64e() const
Tests whether the target is the Apple "arm64e" AArch64 subarch.
ArchType getArch() const
Get the parsed architecture type of this triple.
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
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.
iterator find(const_arg_type_t< ValueT > V)
An efficient, type-erasing, non-owning reference to a callable.
Ephemeral symbols produced by Reader::symbols() and Reader::module_symbols().
LTO(Config Conf, ThinBackend Backend={}, unsigned ParallelCodeGenParallelismLevel=1, LTOKind LTOMode=LTOK_Default)
Create an LTO object.
Error add(std::unique_ptr< InputFile > Obj, ArrayRef< SymbolResolution > Res)
Add an input file to the LTO link, using the provided symbol resolutions.
struct llvm::lto::LTO::RegularLTOState RegularLTO
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...
virtual Expected< std::shared_ptr< lto::InputFile > > addInput(std::unique_ptr< lto::InputFile > InputPtr)
void setBitcodeLibFuncs(ArrayRef< StringRef > BitcodeLibFuncs)
Set the list of functions implemented in bitcode that were not extracted from an archive.
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.
void emitRemark(OptimizationRemark &Remark)
Helper to emit an optimization remark during the LTO link when outside of the standard optimization p...
struct llvm::lto::LTO::ThinLTOState ThinLTO
unsigned getMaxTasks() const
Returns an upper bound on the number of tasks that the client may expect.
virtual Error run(AddStreamFn AddStream, FileCache Cache={})
Runs the LTO pipeline.
static SmallVector< StringRef > getLibFuncSymbols(const Triple &TT, llvm::StringSaver &Saver)
Static method that returns a list of library function symbols that can be generated by LTO but might ...
This class defines the interface to the ThinLTO backend.
bool ShouldEmitImportsFiles
const DenseMap< StringRef, GVSummaryMapTy > & ModuleToDefinedGVSummaries
ModuleSummaryIndex & CombinedIndex
LLVM_ABI Error emitFiles(const FunctionImporter::ImportMapTy &ImportList, unsigned Task, StringRef ModulePath, const std::string &NewModulePath) const
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.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
static auto libcall_impls()
LLVM_ABI bool thinLTOTwoRounds(const cl::LibraryOptionsContext &LibraryOptions)
Returns whether ThinLTO runs two rounds of code generation (-codegen-data-thinlto-two-rounds).
LLVM_ABI Expected< stable_hash > mergeCodeGenData(const cl::LibraryOptionsContext &LibraryOptions, ArrayRef< StringRef > ObjectFiles)
Merge the codegen data from the scratch objects ObjectFiles from the first codegen round.
LLVM_ABI std::unique_ptr< Module > loadModuleForTwoRounds(BitcodeModule &OrigModule, unsigned Task, LLVMContext &Context, ArrayRef< StringRef > IRFiles)
Load the optimized bitcode module for the second codegen round.
initializer< Ty > init(const Ty &Val)
LLVM_ABI ThinBackend createInProcessThinBackend(ThreadPoolStrategy Parallelism, IndexWriteCallback OnWrite=nullptr, bool ShouldEmitIndexFiles=false, bool ShouldEmitImportsFiles=false)
This ThinBackend runs the individual backend jobs in-process.
LLVM_ABI 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.
LLVM_ABI 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, bool CodeGenOnly, ArrayRef< StringRef > BitcodeLibFuncs, AddStreamFn IRAddStream=nullptr, const std::vector< uint8_t > &CmdArgs=std::vector< uint8_t >())
Runs a ThinLTO backend.
LLVM_ABI StringLiteral getThinLTODefaultCPU(const Triple &TheTriple)
LLVM_ABI Expected< std::unique_ptr< ToolOutputFile > > setupStatsFile(StringRef StatsFilename)
Setups the output file for saving statistics.
LLVM_ABI Error backend(const Config &C, AddStreamFn AddStream, unsigned ParallelCodeGenParallelismLevel, Module &M, ModuleSummaryIndex &CombinedIndex, ArrayRef< StringRef > BitcodeLibFuncs)
Runs a regular LTO backend.
std::function< void(const std::string &)> IndexWriteCallback
LLVM_ABI Error finalizeOptimizationRemarks(LLVMRemarkFileHandle DiagOutputFile)
LLVM_ABI 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...
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.
LLVM_ABI std::vector< int > generateModulesOrdering(ArrayRef< BitcodeModule * > R)
Produces a container ordering for optimal multi-threaded processing.
LLVM_ABI Expected< IRSymtabFile > readIRSymtab(MemoryBufferRef MBRef)
Reads a bitcode file, creating its irsymtab if necessary.
DiagnosticInfoOptimizationBase::Argument NV
void write64le(void *P, uint64_t V)
void write32le(void *P, uint32_t V)
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 StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
LLVM_ABI bool replace_path_prefix(SmallVectorImpl< char > &Path, StringRef OldPrefix, StringRef NewPrefix, Style style=Style::native)
Replace matching path prefix with another 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.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
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.
Error createFileError(const Twine &F, Error E)
Concatenate a source file path and/or name with an Error.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< LLVMRemarkFileHandle > setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses, StringRef RemarksFormat, bool RemarksWithHotness, std::optional< uint64_t > RemarksHotnessThreshold=0)
Set up optimization remarks that output to a file.
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"))
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
DenseMap< GlobalValue::GUID, GlobalValueSummary * > GVSummaryMapTy
Map of global value GUID to its summary, used to identify values defined in a particular module,...
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
uint64_t stable_hash
An opaque object representing a stable hash code.
std::string utostr(uint64_t X, bool isNeg=false)
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 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.
auto dyn_cast_or_null(const Y &Val)
LLVM_ABI void EnableStatistics(bool DoPrintOnExit=true)
Enable the collection and printing of statistics.
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...
LLVM_ABI void timeTraceProfilerInitialize(unsigned TimeTraceGranularity, StringRef ProcName, bool TimeTraceVerbose=false, TimeTraceCompression TimeTraceCompress=TimeTraceCompression::Infer)
Initialize the time trace profiler.
LLVM_ABI void timeTraceProfilerFinishThread()
Finish a time trace profiler running on a worker thread.
LLVM_ABI std::string recomputeLTOCacheKey(const std::string &Key, StringRef ExtraID)
Recomputes the LTO cache key for a given key with an extra identifier.
Error joinErrors(Error E1, Error E2)
Concatenate errors.
LLVM_ABI void updatePublicTypeTestCalls(Module &M, bool WholeProgramVisibilityEnabledInLTO)
LLVM_ABI void getVisibleToRegularObjVtableGUIDs(ModuleSummaryIndex &Index, DenseSet< GlobalValue::GUID > &VisibleToRegularObjSymbols, function_ref< bool(StringRef)> IsVisibleToRegularObj)
Based on typeID string, get all associated vtable GUIDS that are visible to regular objects.
void sort(IteratorTy Start, IteratorTy End)
cl::opt< bool > AlwaysRenamePromotedLocals("always-rename-promoted-locals", cl::init(true), cl::Hidden, cl::desc("Always rename promoted locals."))
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.
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
LLVM_ABI cl::opt< bool > EnableLTOInternalization
Enable global value internalization in LTO.
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"))
cl::opt< bool > SupportsHotColdNew
Indicate we are linking with an allocator that supports hot/cold operator new interfaces.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI 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.
std::string join(IteratorT Begin, IteratorT End, StringRef Separator)
Joins the strings in the range [Begin, End), adding Separator between the elements.
cl::opt< bool > EnableMemProfContextDisambiguation
Enable MemProf context disambiguation for thin link.
cl::opt< bool > ForceImportAll
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
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.
ArrayRef(const T &OneElt) -> ArrayRef< T >
void toHex(ArrayRef< uint8_t > Input, bool LowerCase, SmallVectorImpl< char > &Output)
Convert buffer Input to its hexadecimal representation. The returned string is double the size of Inp...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void processImportsFiles(StringRef ModulePath, const ModuleToSummariesForIndexTy &ModuleToSummariesForIndex, function_ref< void(const std::string &)> F)
Call F passing each of the files module ModulePath will import from.
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)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
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 ...
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
static cl::opt< bool > LTOKeepSymbolCopies("lto-keep-symbol-copies", cl::init(false), cl::Hidden, cl::desc("Keep copies of symbols in LTO indexing"))
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void generateParamAccessSummary(const cl::LibraryOptionsContext *LibraryOptions, ModuleSummaryIndex &Index)
Reads -stack-safety-max-iterations from LibraryOptions, or its global value if null.
SmallPtrSet< GlobalValueSummary *, 0 > GVSummaryPtrSet
A set of global value summary pointers.
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.
LLVM_ABI void PrintStatisticsJSON(raw_ostream &OS)
Print statistics in JSON format.
void consumeError(Error Err)
Consume a Error without doing anything.
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.
@ Keep
No function return thunk.
LLVM_ABI void updateVCallVisibilityInModule(Module &M, bool WholeProgramVisibilityEnabledInLTO, const DenseSet< GlobalValue::GUID > &DynamicExportSymbols, bool ValidateAllVtablesHaveTypeInfos, function_ref< bool(StringRef)> IsVisibleToRegularObj)
If whole program visibility asserted, then upgrade all public vcall visibility metadata on vtable def...
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...
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...
Implement std::hash so that hash_code can be used in STL containers.
This type represents a file cache system that manages caching of files.
A simple container for information about the supported runtime calls.
unsigned getNumAvailableLibcallImpls() const
bool isAvailable(RTLIB::LibcallImpl Impl) const
RTLIB::LibcallImpl getSupportedLibcallImpl(StringRef FuncName) const
Check if this is valid libcall for the current module, otherwise RTLIB::Unsupported.
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
Struct that holds a reference to a particular GUID in a global value summary.
Function object to check whether the first component of a container supported by std::get (like std::...
std::function< std::string &(size_t Task)> GetCacheKeyOutputString
Called by WriteIndexesThinBackend when it needs to store a bitcode module's cache key.
PostRegularLTOLinkHookFn PostRegularLTOLinkHook
std::optional< uint64_t > RemarksHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
std::optional< CodeModel::Model > CodeModel
bool CodeGenOnly
Disable entirely the optimizer, including importing for ThinLTO.
std::vector< std::string > MAttrs
std::vector< std::string > MllvmArgs
CodeGenOptLevel CGOptLevel
bool Dtlto
This flag is used as one of parameters to calculate cache entries and to ensure that in-process cache...
std::string DefaultTriple
Setting this field will replace unspecified target triples in input files with this triple.
std::string DwoDir
The directory to store .dwo files.
std::string RemarksFilename
Optimization remarks file path.
std::string OverrideTriple
Setting this field will replace target triples in input files with this triple.
std::string ProfileRemapping
Name remapping file for profile data.
bool TimeTraceEnabled
Time trace enabled.
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 ...
unsigned TimeTraceGranularity
Time trace granularity.
bool RemarksWithHotness
Whether to emit optimization remarks with hotness informations.
std::optional< Reloc::Model > RelocModel
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).
std::vector< AddedModule > ModsWithSummaries
std::unique_ptr< IRMover > Mover
unsigned ParallelCodeGenParallelismLevel
std::map< std::string, CommonResolution > Commons
std::unique_ptr< Module > CombinedModule
LLVM_ABI RegularLTOState(unsigned ParallelCodeGenParallelismLevel, const Config &Conf)
LLVM_ABI ThinLTOState(ThinBackend Backend)
std::optional< ModuleMapType > ModulesToCompile
ModuleSummaryIndex CombinedIndex
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.