27#include "llvm/Config/llvm-config.h"
57#include "llvm/Support/VCSRevision.h"
73#define DEBUG_TYPE "lto"
75Error LTO::setupOptimizationRemarks() {
82 return DiagFileOrErr.takeError();
84 DiagnosticOutputFile = std::move(*DiagFileOrErr);
91 if (!LinkerRemarkFunction) {
92 DummyModule = std::make_unique<Module>(
"remark_dummy",
RegularLTO.
Ctx);
110 cl::desc(
"Dump the SCCs in the ThinLTO index's callgraph"));
121 cl::desc(
"Enable global value internalization in LTO"));
125 cl::desc(
"Keep copies of symbols in LTO indexing"));
142 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
153 Hasher.
update(LLVM_VERSION_STRING);
155 Hasher.
update(LLVM_REVISION);
163 auto AddUnsigned = [&](
unsigned I) {
168 auto AddUint64 = [&](uint64_t
I) {
173 auto AddUint8 = [&](
const uint8_t I) {
197 AddUnsigned(
static_cast<int>(Conf.
CGOptLevel));
198 AddUnsigned(
static_cast<int>(Conf.
CGFileType));
206 AddUint8(Conf.
Dtlto);
209 auto ModHash = Index.getModuleHash(ModuleID);
214 std::vector<uint64_t> ExportsGUID;
215 ExportsGUID.reserve(ExportList.
size());
216 for (
const auto &VI : ExportList)
217 ExportsGUID.push_back(VI.getGUID());
221 for (
auto GUID : ExportsGUID)
226 auto Comp = [&](
const std::pair<StringRef, GlobalValue::GUID> &L,
227 const std::pair<StringRef, GlobalValue::GUID> &R) {
228 return std::make_pair(Index.getModule(L.first)->second, L.second) <
229 std::make_pair(Index.getModule(R.first)->second, R.second);
235 for (
const auto &[FromModule, GUID,
Type] : SortedImportList)
236 ++ModuleToNumImports[FromModule];
238 std::optional<StringRef> LastModule;
239 for (
const auto &[FromModule, GUID,
Type] : SortedImportList) {
240 if (LastModule != FromModule) {
244 LastModule = FromModule;
245 auto ModHash = Index.getModule(FromModule)->second;
247 AddUint64(ModuleToNumImports[FromModule]);
254 for (
auto &Entry : ResolvedODR) {
263 std::set<GlobalValue::GUID> UsedCfiDefs;
264 std::set<GlobalValue::GUID> UsedCfiDecls;
267 std::set<GlobalValue::GUID> UsedTypeIds;
270 if (CfiFunctionDefs.
contains(ValueGUID))
271 UsedCfiDefs.insert(ValueGUID);
272 if (CfiFunctionDecls.
contains(ValueGUID))
273 UsedCfiDecls.insert(ValueGUID);
278 AddUnsigned(GS->getVisibility());
279 AddUnsigned(GS->isLive());
280 AddUnsigned(GS->canAutoHide());
282 AddUnsigned(VI.isDSOLocal(Index.withDSOLocalPropagation()));
283 AddUsedCfiGlobal(VI.getGUID());
286 AddUnsigned(GVS->maybeReadOnly());
287 AddUnsigned(GVS->maybeWriteOnly());
290 for (
auto &TT : FS->type_tests())
291 UsedTypeIds.insert(TT);
292 for (
auto &TT : FS->type_test_assume_vcalls())
293 UsedTypeIds.insert(TT.GUID);
294 for (
auto &TT : FS->type_checked_load_vcalls())
295 UsedTypeIds.insert(TT.GUID);
296 for (
auto &TT : FS->type_test_assume_const_vcalls())
297 UsedTypeIds.insert(TT.VFunc.GUID);
298 for (
auto &TT : FS->type_checked_load_const_vcalls())
299 UsedTypeIds.insert(TT.VFunc.GUID);
300 for (
auto &ET : FS->calls()) {
301 AddUnsigned(ET.first.isDSOLocal(Index.withDSOLocalPropagation()));
302 AddUsedCfiGlobal(ET.first.getGUID());
310 SortedDefinedGlobals(DefinedGlobals.
begin(), DefinedGlobals.
end());
312 for (
auto &GS : SortedDefinedGlobals) {
318 AddUsedCfiGlobal(GS.first);
319 AddUsedThings(GS.second);
324 for (
const auto &[FromModule, GUID,
Type] : SortedImportList) {
330 AddUsedThings(AS->getBaseObject());
336 AddUnsigned(S.TTRes.TheKind);
337 AddUnsigned(S.TTRes.SizeM1BitWidth);
339 AddUint64(S.TTRes.AlignLog2);
340 AddUint64(S.TTRes.SizeM1);
341 AddUint64(S.TTRes.BitMask);
342 AddUint64(S.TTRes.InlineBits);
344 AddUint64(S.WPDRes.size());
345 for (
auto &WPD : S.WPDRes) {
346 AddUnsigned(WPD.first);
347 AddUnsigned(WPD.second.TheKind);
348 AddString(WPD.second.SingleImplName);
350 AddUint64(WPD.second.ResByArg.size());
351 for (
auto &ByArg : WPD.second.ResByArg) {
352 AddUint64(ByArg.first.size());
353 for (uint64_t Arg : ByArg.first)
355 AddUnsigned(ByArg.second.TheKind);
356 AddUint64(ByArg.second.Info);
357 AddUnsigned(ByArg.second.Byte);
358 AddUnsigned(ByArg.second.Bit);
365 auto TidIter = Index.typeIds().equal_range(TId);
367 AddTypeIdSummary(
I.second.first,
I.second.second);
370 AddUnsigned(UsedCfiDefs.size());
371 for (
auto &V : UsedCfiDefs)
374 AddUnsigned(UsedCfiDecls.size());
375 for (
auto &V : UsedCfiDecls)
381 Hasher.
update(FileOrErr.get()->getBuffer());
386 Hasher.
update(FileOrErr.get()->getBuffer());
417 C.VisibilityScheme ==
Config::ELF ? VI.getELFVisibility()
419 for (
auto &S : VI.getSummaryList()) {
434 if (isPrevailing(VI.getGUID(), S.get())) {
435 assert(!S->wasPromoted() &&
436 "promoted symbols used to be internal linkage and shouldn't have "
437 "a prevailing variant");
450 S->setCanAutoHide(VI.canAutoHide() &&
451 !GUIDPreservedSymbols.
count(VI.getGUID()));
454 Visibility = S->getVisibility();
471 S->setVisibility(Visibility);
473 if (S->linkage() != OriginalLinkage)
474 recordNewLinkage(S->modulePath(), VI.getGUID(), S->linkage());
478 for (
auto &S : VI.getSummaryList()) {
483 S->setVisibility(Visibility);
505 for (
auto &
I : Index)
506 for (
auto &S :
I.second.getSummaryList())
508 GlobalInvolvedWithAlias.
insert(&AS->getAliasee());
510 for (
auto &
I : Index)
512 GlobalInvolvedWithAlias, isPrevailing,
513 recordNewLinkage, GUIDPreservedSymbols);
525 const bool SingleExternallyVisibleCopy =
526 VI.getSummaryList().size() == 1 &&
529 bool NameRecorded =
false;
530 for (
auto &S : VI.getSummaryList()) {
533 if (isExported(S->modulePath(), VI)) {
539 if (ExternallyVisibleSymbolNamesPtr && !NameRecorded) {
541 if (ExternallyVisibleSymbolNamesPtr->
insert(VI.name()).second)
542 S->setNoRenameOnPromotion(
true);
605 if (SingleExternallyVisibleCopy && isPrevailing(VI.getGUID(), S.get()))
618 assert(!Index.withInternalizeAndPromote());
620 for (
auto &
I : Index)
623 ExternallyVisibleSymbolNamesPtr);
624 Index.setWithInternalizeAndPromote();
631 std::unique_ptr<InputFile> File(
new InputFile);
637 File->TargetTriple = FOrErr->TheReader.getTargetTriple();
638 File->SourceFileName = FOrErr->TheReader.getSourceFileName();
639 File->COFFLinkerOpts = FOrErr->TheReader.getCOFFLinkerOpts();
640 File->DependentLibraries = FOrErr->TheReader.getDependentLibraries();
641 File->ComdatTable = FOrErr->TheReader.getComdatTable();
645 for (
unsigned I = 0;
I != FOrErr->Mods.size(); ++
I) {
646 size_t Begin = File->Symbols.size();
648 FOrErr->TheReader.module_symbols(
I))
651 if (Sym.isGlobal() && !Sym.isFormatSpecific())
652 File->Symbols.push_back(Sym);
653 File->ModuleSymIndices.push_back({Begin, File->Symbols.size()});
656 File->Mods = FOrErr->Mods;
657 File->Strtab = std::move(FOrErr->Strtab);
658 return std::move(File);
670 return Mods[0].getModuleIdentifier();
674 assert(Mods.size() == 1 &&
"Expect only one bitcode module");
702 Alloc = std::make_unique<BumpPtrAllocator>();
703 GlobalResolutionSymbolSaver = std::make_unique<llvm::StringSaver>(*Alloc);
712 LinkerRemarkFunction =
nullptr;
720 unsigned Partition,
bool InSummary,
723 auto *ResI = Res.
begin();
724 auto *ResE = Res.
end();
735 if (GlobalResolutionSymbolSaver && !GlobalResolutions->contains(SymbolName))
736 SymbolName = GlobalResolutionSymbolSaver->save(SymbolName);
738 auto &GlobalRes = (*GlobalResolutions)[SymbolName];
739 GlobalRes.UnnamedAddr &= Sym.isUnnamedAddr();
741 assert(!GlobalRes.Prevailing &&
742 "Multiple prevailing defs are not allowed");
743 GlobalRes.Prevailing =
true;
744 GlobalRes.IRName = std::string(Sym.getIRName());
745 }
else if (!GlobalRes.Prevailing && GlobalRes.IRName.empty()) {
752 GlobalRes.IRName = std::string(Sym.getIRName());
767 if (GlobalRes.IRName != Sym.getIRName()) {
768 GlobalRes.Partition = GlobalResolution::External;
769 GlobalRes.VisibleOutsideSummary =
true;
772 bool IsLibcall = Sym.isLibcall(TLI, Libcalls);
780 (GlobalRes.Partition != GlobalResolution::Unknown &&
781 GlobalRes.Partition != Partition)) {
782 GlobalRes.Partition = GlobalResolution::External;
785 GlobalRes.Partition = Partition;
789 GlobalRes.VisibleOutsideSummary |=
796void LTO::releaseGlobalResolutionsMemory() {
798 GlobalResolutions.reset();
800 GlobalResolutionSymbolSaver.reset();
808 auto ResI = Res.
begin();
813 OS <<
"-r=" << Path <<
',' << Sym.getName() <<
',';
831 assert(!CalledGetMaxTasks);
837 InputFile *
Input = (*InputOrErr).get();
839 if (
Conf.ResolutionFile)
842 if (
RegularLTO.CombinedModule->getTargetTriple().empty()) {
844 RegularLTO.CombinedModule->setTargetTriple(InputTriple);
850 for (
unsigned I = 0;
I !=
Input->Mods.size(); ++
I) {
851 if (
auto Err = addModule(*
Input, InputRes,
I, Res).moveInto(Res))
861 "bitcode libfuncs were set twice; maybe accidentally clobbered?");
862 this->BitcodeLibFuncs.append(BitcodeLibFuncs.begin(), BitcodeLibFuncs.end());
873 if (EnableSplitLTOUnit) {
877 if (*EnableSplitLTOUnit != LTOInfo->EnableSplitLTOUnit)
880 EnableSplitLTOUnit = LTOInfo->EnableSplitLTOUnit;
885 !LTOInfo->UnifiedLTO)
887 "unified LTO compilation must use "
888 "compatible bitcode modules (use -funified-lto)",
898 Input.IsThinLTO |= IsThinLTO;
900 auto ModSyms =
Input.module_symbols(ModI);
901 addModuleToGlobalRes(ModSyms, Res,
903 LTOInfo->HasSummary,
Triple(
Input.getTargetTriple()));
906 return addThinLTO(BM, ModSyms, Res);
909 auto ModOrErr = addRegularLTO(
Input, InputRes, BM, ModSyms, Res);
911 return ModOrErr.takeError();
912 Res = ModOrErr->second;
914 if (!LTOInfo->HasSummary) {
915 if (
Error Err = linkRegularLTO(std::move(ModOrErr->first),
941 std::set<const Comdat *> &NonPrevailingComdats) {
946 if (!NonPrevailingComdats.count(
C))
956 GO->setComdat(
nullptr);
963 std::pair<LTO::RegularLTOState::AddedModule, ArrayRef<SymbolResolution>>>
967 llvm::TimeTraceScope timeScope(
"LTO add regular LTO");
969 Expected<std::unique_ptr<Module>> MOrErr =
975 Mod.M = std::move(*MOrErr);
977 if (
Error Err =
M.materializeMetadata())
978 return std::move(Err);
984 if (NamedMDNode *CfiFunctionsMD =
M.getNamedMetadata(
"cfi.functions"))
985 M.eraseNamedMetadata(CfiFunctionsMD);
986 }
else if (NamedMDNode *AliasesMD =
M.getNamedMetadata(
"aliases")) {
989 DenseSet<StringRef> Prevailing;
991 if (
R.Prevailing && !
I.getIRName().empty())
992 Prevailing.
insert(
I.getIRName());
993 std::vector<MDNode *> AliasGroups;
994 for (MDNode *AliasGroup : AliasesMD->operands()) {
995 std::vector<Metadata *> Aliases;
996 for (
Metadata *Alias : AliasGroup->operands()) {
999 Aliases.push_back(Alias);
1001 if (Aliases.size() > 1)
1004 AliasesMD->clearOperands();
1005 for (MDNode *
G : AliasGroups)
1006 AliasesMD->addOperand(
G);
1011 ModuleSymbolTable SymTab;
1014 for (GlobalVariable &GV :
M.globals())
1015 if (GV.hasAppendingLinkage())
1016 Mod.Keep.push_back(&GV);
1018 DenseSet<GlobalObject *> AliasedGlobals;
1019 for (
auto &GA :
M.aliases())
1020 if (GlobalObject *GO = GA.getAliaseeObject())
1021 AliasedGlobals.
insert(GO);
1030 auto MsymI = SymTab.
symbols().begin(), MsymE = SymTab.
symbols().end();
1032 while (MsymI != MsymE) {
1042 std::set<const Comdat *> NonPrevailingComdats;
1043 SmallSet<StringRef, 2> NonPrevailingAsmSymbols;
1044 for (
const InputFile::Symbol &Sym : Syms) {
1054 if (Sym.isUndefined())
1056 Mod.Keep.push_back(GV);
1060 if (
R.LinkerRedefined)
1068 (GV->hasLinkOnceODRLinkage() || GV->hasWeakODRLinkage() ||
1069 GV->hasAvailableExternallyLinkage()) &&
1076 Mod.Keep.push_back(GV);
1078 if (GV->hasComdat())
1079 NonPrevailingComdats.insert(GV->getComdat());
1084 if (
R.FinalDefinitionInLinkageUnit) {
1085 GV->setDSOLocal(
true);
1086 if (GV->hasDLLImportStorageClass())
1088 DefaultStorageClass);
1090 }
else if (
auto *AS =
1094 NonPrevailingAsmSymbols.
insert(AS->first);
1102 if (Sym.isCommon()) {
1105 auto &CommonRes =
RegularLTO.Commons[std::string(Sym.getIRName())];
1106 CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize());
1107 if (uint32_t SymAlignValue = Sym.getCommonAlignment()) {
1108 CommonRes.Alignment =
1109 std::max(
Align(SymAlignValue), CommonRes.Alignment);
1111 CommonRes.Prevailing |=
R.Prevailing;
1115 if (!
M.getComdatSymbolTable().empty())
1116 for (GlobalValue &GV :
M.global_values())
1121 if (
M.hasModuleInlineAsm()) {
1122 std::string NewIA =
".lto_discard";
1123 if (!NonPrevailingAsmSymbols.
empty()) {
1126 M, [&](StringRef Name, StringRef Alias) {
1127 if (!NonPrevailingAsmSymbols.
count(Alias))
1128 NonPrevailingAsmSymbols.
erase(Name);
1130 NewIA +=
" " +
llvm::join(NonPrevailingAsmSymbols,
", ");
1133 M.prependModuleInlineAsm(NewIA);
1137 return std::make_pair(std::move(
Mod), Res);
1140Error LTO::linkRegularLTO(RegularLTOState::AddedModule
Mod,
1141 bool LivenessFromIndex) {
1142 llvm::TimeTraceScope timeScope(
"LTO link regular LTO");
1143 std::vector<GlobalValue *>
Keep;
1144 for (GlobalValue *GV :
Mod.Keep) {
1145 if (LivenessFromIndex) {
1147 if (!
ThinLTO.CombinedIndex.isGUIDLive(GUID)) {
1149 if (DiagnosticOutputFile) {
1150 if (
Error Err =
F->materialize())
1152 auto R = OptimizationRemark(
DEBUG_TYPE,
"deadfunction",
F);
1153 R <<
ore::NV(
"Function",
F) <<
" not added to the combined module ";
1168 GlobalValue *CombinedGV =
1181Expected<ArrayRef<SymbolResolution>>
1184 llvm::TimeTraceScope timeScope(
"LTO add thin LTO");
1187 DenseSet<StringRef> Prevailing;
1188 for (
const InputFile::Symbol &Sym : Syms) {
1191 if (!Sym.getIRName().empty() &&
R.Prevailing)
1192 Prevailing.
insert(Sym.getIRName());
1196 StringMap<GlobalValue::GUID> IRSpecifiedGUIDs;
1199 [&](StringRef Name) { return (Prevailing.count(Name) > 0); },
1201 auto IT = IRSpecifiedGUIDs.insert({VI.name(), VI.getGUID()});
1204 if (
auto GRIt = GlobalResolutions->find(
VI.name());
1205 GRIt != GlobalResolutions->end() &&
1206 Prevailing.
count(
VI.name())) {
1207 GRIt->second.setGUID(VI.getGUID());
1216 auto GUIDIter = IRSpecifiedGUIDs.
find(Sym.getIRName());
1221 GUIDIter == IRSpecifiedGUIDs.
end()
1226 if (!Sym.getIRName().empty() &&
1227 (
R.Prevailing ||
R.FinalDefinitionInLinkageUnit)) {
1229 ThinLTO.setPrevailingModuleForGUID(GUID, BMID);
1234 if (
R.LinkerRedefined)
1235 if (
auto *S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID))
1241 if (
R.FinalDefinitionInLinkageUnit) {
1242 if (
auto *S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID)) {
1243 S->setDSOLocal(
true);
1249 if (!ThinLTO.ModuleMap.insert({BMID, BM}).second)
1251 "Expected at most one ThinLTO module per bitcode file",
1254 if (!Conf.ThinLTOModulesToCompile.empty()) {
1255 if (!ThinLTO.ModulesToCompile)
1256 ThinLTO.ModulesToCompile = ModuleMapType();
1259 for (
const std::string &Name : Conf.ThinLTOModulesToCompile) {
1260 if (BMID.contains(Name)) {
1261 ThinLTO.ModulesToCompile->insert({BMID, BM});
1262 LLVM_DEBUG(
dbgs() <<
"[ThinLTO] Selecting " << BMID <<
" to compile\n");
1272 CalledGetMaxTasks =
true;
1273 auto ModuleCount =
ThinLTO.ModulesToCompile ?
ThinLTO.ModulesToCompile->size()
1275 return RegularLTO.ParallelCodeGenParallelismLevel + ModuleCount;
1280Error LTO::checkPartiallySplit() {
1290 Combined, Intrinsic::type_checked_load_relative);
1294 if ((TypeTestFunc && !TypeTestFunc->
use_empty()) ||
1295 (TypeCheckedLoadFunc && !TypeCheckedLoadFunc->
use_empty()) ||
1296 (TypeCheckedLoadRelativeFunc &&
1297 !TypeCheckedLoadRelativeFunc->
use_empty()))
1299 "inconsistent LTO Unit splitting (recompile with -fsplit-lto-unit)",
1305 for (
auto &S :
P.second.getSummaryList()) {
1309 if (!FS->type_test_assume_vcalls().empty() ||
1310 !FS->type_checked_load_vcalls().empty() ||
1311 !FS->type_test_assume_const_vcalls().empty() ||
1312 !FS->type_checked_load_const_vcalls().empty() ||
1313 !FS->type_tests().empty())
1315 "inconsistent LTO Unit splitting (recompile with -fsplit-lto-unit)",
1330 for (
auto &Res : *GlobalResolutions) {
1333 if (Res.second.IRName.
empty())
1338 if (Res.second.VisibleOutsideSummary && Res.second.Prevailing)
1339 GUIDPreservedSymbols.insert(GUID);
1341 if (Res.second.ExportDynamic)
1342 DynamicExportSymbols.insert(GUID);
1344 GUIDPrevailingResolutions[GUID] =
1349 auto It = GUIDPrevailingResolutions.
find(
G);
1350 if (It == GUIDPrevailingResolutions.
end())
1355 isPrevailing,
Conf.OptLevel > 0);
1359 if (!StatsFileOrErr)
1360 return StatsFileOrErr.takeError();
1361 std::unique_ptr<ToolOutputFile> StatsFile = std::move(StatsFileOrErr.get());
1363 if (
Error Err = setupOptimizationRemarks())
1372 ThinLTO.CombinedIndex.setWithSupportsHotColdNew();
1374 Error Result = runRegularLTO(AddStream);
1378 Result = runThinLTO(AddStream, Cache, GUIDPreservedSymbols);
1395 if (
Error Err = linkRegularLTO(std::move(M),
true))
1403 if (
Error Err = checkPartiallySplit())
1410 if (!
I.second.Prevailing)
1425 GV->setAlignment(
I.second.Alignment);
1435 bool WholeProgramVisibilityEnabledInLTO =
1436 Conf.HasWholeProgramVisibility &&
1439 (!
Conf.ValidateAllVtablesHaveTypeInfos ||
Conf.AllVtablesHaveTypeInfos);
1443 auto IsVisibleToRegularObj = [&](StringRef
name) {
1444 auto It = GlobalResolutions->find(
name);
1445 return (It == GlobalResolutions->end() ||
1446 It->second.VisibleOutsideSummary || !It->second.Prevailing);
1452 *
RegularLTO.CombinedModule, WholeProgramVisibilityEnabledInLTO,
1453 DynamicExportSymbols,
Conf.ValidateAllVtablesHaveTypeInfos,
1454 IsVisibleToRegularObj);
1456 WholeProgramVisibilityEnabledInLTO);
1458 if (
Conf.PreOptModuleHook &&
1462 if (!
Conf.CodeGenOnly) {
1463 for (
const auto &R : *GlobalResolutions) {
1465 RegularLTO.CombinedModule->getNamedValue(
R.second.IRName);
1466 if (!
R.second.isPrevailingIRSymbol())
1468 if (
R.second.Partition != 0 &&
1469 R.second.Partition != GlobalResolution::External)
1497 if (
Conf.PostInternalizeModuleHook &&
1502 if (!
RegularLTO.EmptyCombinedModule ||
Conf.AlwaysEmitRegularLTOObj) {
1522 return LibcallSymbols;
1527 auto TLII = std::make_unique<TargetLibraryInfoImpl>(TT);
1530 LibFuncSymbols.
reserve(LibFunc::NumLibFuncs);
1531 for (
unsigned I = LibFunc::Begin_LibFunc;
I != LibFunc::End_LibFunc; ++
I) {
1532 LibFunc
F =
static_cast<LibFunc
>(
I);
1536 return LibFuncSymbols;
1542 return emitFiles(ImportList, Task, ModulePath, NewModulePath,
1543 NewModulePath +
".thinlto.bc");
1555 ImportList, ModuleToSummariesForIndex,
1556 DeclarationSummaries);
1559 std::unique_ptr<raw_pwrite_stream> OS;
1560 if (
Conf.GetSummaryIndexOutputStream) {
1561 OS =
Conf.GetSummaryIndexOutputStream(Task);
1562 assert(OS &&
"GetSummaryIndexOutputStream returned null");
1564 auto FileOS = std::make_unique<raw_fd_ostream>(SummaryPath, EC,
1568 OS = std::move(FileOS);
1572 &DeclarationSummaries);
1575 if (
Conf.GetImportsListOutputArray) {
1576 std::vector<std::string> &ImportsListRef =
1577 Conf.GetImportsListOutputArray(Task);
1579 ModulePath, ModuleToSummariesForIndex,
1580 [&](
StringRef M) { ImportsListRef.push_back(M.str()); });
1583 ModuleToSummariesForIndex))
1596 bool ShouldEmitIndexFiles;
1605 OnWrite, ShouldEmitImportsFiles, ThinLTOParallelism),
1606 ShouldEmitIndexFiles(ShouldEmitIndexFiles) {
1608 CfiFunctionDefs.
insert_range(Defs.getExportedThinLTOGUIDs());
1610 CfiFunctionDecls.
insert_range(Decls.getExportedThinLTOGUIDs());
1616class InProcessThinBackend :
public CGThinBackend {
1625 InProcessThinBackend(
1630 bool ShouldEmitIndexFiles,
bool ShouldEmitImportsFiles,
1632 : CGThinBackend(Conf, CombinedIndex, ModuleToDefinedGVSummaries, OnWrite,
1633 ShouldEmitIndexFiles, ShouldEmitImportsFiles,
1634 ThinLTOParallelism),
1636 BitcodeLibFuncs(BitcodeLibFuncs) {}
1638 virtual Error runThinLTOBackendThread(
1639 AddStreamFn AddStream, FileCache Cache,
unsigned Task, BitcodeModule BM,
1640 ModuleSummaryIndex &CombinedIndex,
1641 const FunctionImporter::ImportMapTy &ImportList,
1643 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1645 MapVector<StringRef, BitcodeModule> &ModuleMap) {
1647 llvm::TimeTraceScope timeScope(
"Run ThinLTO backend thread (in-process)",
1649 auto RunThinBackend = [&](
AddStreamFn AddStream) {
1650 LTOLLVMContext BackendContext(Conf);
1651 Expected<std::unique_ptr<Module>> MOrErr = BM.
parseModule(BackendContext);
1655 return thinBackend(Conf, Task, AddStream, **MOrErr, CombinedIndex,
1656 ImportList, DefinedGlobals, &ModuleMap,
1659 if (ShouldEmitIndexFiles) {
1660 if (
auto E = emitFiles(ImportList, Task, ModuleID, ModuleID.str()))
1666 [](uint32_t V) { return V == 0; }))
1669 return RunThinBackend(AddStream);
1673 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1674 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1675 Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task,
Key, ModuleID);
1678 AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
1680 return RunThinBackend(CacheAddStream);
1686 unsigned Task, BitcodeModule BM,
1687 const FunctionImporter::ImportMapTy &ImportList,
1689 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1690 MapVector<StringRef, BitcodeModule> &ModuleMap)
override {
1692 assert(ModuleToDefinedGVSummaries.
count(ModulePath));
1694 ModuleToDefinedGVSummaries.
find(ModulePath)->second;
1695 BackendThreadPool.async(
1696 [=](BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
1697 const FunctionImporter::ImportMapTy &ImportList,
1699 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>
1702 MapVector<StringRef, BitcodeModule> &ModuleMap) {
1706 Error E = runThinLTOBackendThread(
1707 AddStream, Cache, Task, BM, CombinedIndex, ImportList, ExportList,
1708 ResolvedODR, DefinedGlobals, ModuleMap);
1710 std::unique_lock<std::mutex>
L(ErrMu);
1719 BM, std::ref(CombinedIndex), std::ref(ImportList), std::ref(ExportList),
1720 std::ref(ResolvedODR), std::ref(DefinedGlobals), std::ref(ModuleMap));
1723 OnWrite(std::string(ModulePath));
1733class FirstRoundThinBackend :
public InProcessThinBackend {
1738 FirstRoundThinBackend(
1739 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1740 ThreadPoolStrategy ThinLTOParallelism,
1741 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1745 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
1746 ModuleToDefinedGVSummaries, std::
move(CGAddStream),
1747 std::
move(CGCache), nullptr,
1749 false, BitcodeLibFuncs),
1750 IRAddStream(std::
move(IRAddStream)), IRCache(std::
move(IRCache)) {}
1752 Error runThinLTOBackendThread(
1753 AddStreamFn CGAddStream, FileCache CGCache,
unsigned Task,
1754 BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
1755 const FunctionImporter::ImportMapTy &ImportList,
1757 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1759 MapVector<StringRef, BitcodeModule> &ModuleMap)
override {
1761 llvm::TimeTraceScope timeScope(
"Run ThinLTO backend thread (first round)",
1763 auto RunThinBackend = [&](
AddStreamFn CGAddStream,
1765 LTOLLVMContext BackendContext(Conf);
1766 Expected<std::unique_ptr<Module>> MOrErr = BM.
parseModule(BackendContext);
1770 return thinBackend(Conf, Task, CGAddStream, **MOrErr, CombinedIndex,
1771 ImportList, DefinedGlobals, &ModuleMap,
1777 if (ShouldEmitIndexFiles) {
1778 if (
auto E = emitFiles(ImportList, Task, ModuleID, ModuleID.str()))
1783 "Both caches for CG and IR should have matching availability");
1786 [](uint32_t V) { return V == 0; }))
1789 return RunThinBackend(CGAddStream, IRAddStream);
1793 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1794 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1795 Expected<AddStreamFn> CacheCGAddStreamOrErr =
1796 CGCache(Task, CGKey, ModuleID);
1799 AddStreamFn &CacheCGAddStream = *CacheCGAddStreamOrErr;
1803 Expected<AddStreamFn> CacheIRAddStreamOrErr =
1804 IRCache(Task, IRKey, ModuleID);
1807 AddStreamFn &CacheIRAddStream = *CacheIRAddStreamOrErr;
1813 if (CacheCGAddStream || CacheIRAddStream) {
1816 return RunThinBackend(CacheCGAddStream ? CacheCGAddStream : CGAddStream,
1817 CacheIRAddStream ? CacheIRAddStream : IRAddStream);
1829class SecondRoundThinBackend :
public InProcessThinBackend {
1830 std::unique_ptr<SmallVector<StringRef>> IRFiles;
1834 SecondRoundThinBackend(
1835 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1836 ThreadPoolStrategy ThinLTOParallelism,
1837 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1842 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
1843 ModuleToDefinedGVSummaries, std::
move(AddStream),
1847 false, BitcodeLibFuncs),
1848 IRFiles(std::
move(IRFiles)), CombinedCGDataHash(CombinedCGDataHash) {}
1850 Error runThinLTOBackendThread(
1851 AddStreamFn AddStream, FileCache Cache,
unsigned Task, BitcodeModule BM,
1852 ModuleSummaryIndex &CombinedIndex,
1853 const FunctionImporter::ImportMapTy &ImportList,
1855 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1857 MapVector<StringRef, BitcodeModule> &ModuleMap)
override {
1859 llvm::TimeTraceScope timeScope(
"Run ThinLTO backend thread (second round)",
1861 auto RunThinBackend = [&](
AddStreamFn AddStream) {
1862 LTOLLVMContext BackendContext(Conf);
1863 std::unique_ptr<Module> LoadedModule =
1866 return thinBackend(Conf, Task, AddStream, *LoadedModule, CombinedIndex,
1867 ImportList, DefinedGlobals, &ModuleMap,
1868 true, BitcodeLibFuncs);
1872 [](uint32_t V) { return V == 0; }))
1875 return RunThinBackend(AddStream);
1880 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1881 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1883 std::to_string(CombinedCGDataHash));
1884 Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task,
Key, ModuleID);
1887 AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
1889 if (CacheAddStream) {
1892 return RunThinBackend(CacheAddStream);
1902 bool ShouldEmitIndexFiles,
1903 bool ShouldEmitImportsFiles) {
1909 return std::make_unique<InProcessThinBackend>(
1910 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
1911 AddStream, Cache, OnWrite, ShouldEmitIndexFiles,
1912 ShouldEmitImportsFiles, BitcodeLibFuncs);
1938 return std::string(Path);
1942 if (!ParentPath.
empty()) {
1945 llvm::errs() <<
"warning: could not create directory '" << ParentPath
1946 <<
"': " << EC.message() <<
'\n';
1948 return std::string(NewPath);
1953 std::string OldPrefix, NewPrefix, NativeObjectPrefix;
1959 WriteIndexesThinBackend(
1963 std::string OldPrefix, std::string NewPrefix,
1964 std::string NativeObjectPrefix,
bool ShouldEmitImportsFiles,
1967 OnWrite, ShouldEmitImportsFiles, ThinLTOParallelism),
1968 OldPrefix(OldPrefix), NewPrefix(NewPrefix),
1969 NativeObjectPrefix(NativeObjectPrefix),
1970 LinkedObjectsFile(LinkedObjectsFile) {
1971 auto Defs = CombinedIndex.
cfiFunctionDefs().getExportedThinLTOGUIDs();
1972 CfiFunctionDefs.
insert(Defs.begin(), Defs.end());
1974 CfiFunctionDecls.
insert(Decls.begin(), Decls.end());
1981 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1989 if (LinkedObjectsFile) {
1990 std::string ObjectPrefix =
1991 NativeObjectPrefix.empty() ? NewPrefix : NativeObjectPrefix;
1992 std::string LinkedObjectsFilePath =
1994 *LinkedObjectsFile << LinkedObjectsFilePath <<
'\n';
1997 BackendThreadPool.async(
1998 [
this](
unsigned Task,
const StringRef ModulePath,
1999 const FunctionImporter::ImportMapTy &ImportList,
2001 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>
2003 const std::string &OldPrefix,
const std::string &NewPrefix) {
2004 std::string NewModulePath =
2006 auto E = emitFiles(ImportList, Task, ModulePath, NewModulePath);
2008 std::unique_lock<std::mutex>
L(ErrMu);
2014 assert(ModuleToDefinedGVSummaries.
count(ModulePath));
2016 ModuleToDefinedGVSummaries.
find(ModulePath)->second;
2022 Conf, CombinedIndex, ModulePath, ImportList, ExportList,
2023 ResolvedODR, DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
2026 Task, ModulePath, ImportList, ExportList, ResolvedODR, OldPrefix,
2030 OnWrite(std::string(ModulePath));
2034 bool isSensitiveToInputOrder()
override {
2044 std::string NewPrefix, std::string NativeObjectPrefix,
2052 return std::make_unique<WriteIndexesThinBackend>(
2053 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2054 OldPrefix, NewPrefix, NativeObjectPrefix, ShouldEmitImportsFiles,
2055 LinkedObjectsFile, OnWrite);
2074 llvm::errs() <<
"warning: [ThinLTO] No module compiled\n";
2078 if (
Conf.CombinedIndexHook &&
2079 !
Conf.CombinedIndexHook(
ThinLTO.CombinedIndex, GUIDPreservedSymbols))
2084 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(
2086 ThinLTO.CombinedIndex.collectDefinedGVSummariesPerModule(
2087 ModuleToDefinedGVSummaries);
2096 if (!ModuleToDefinedGVSummaries.
count(
Mod.first))
2099 FunctionImporter::ImportListsTy ImportLists(
ThinLTO.ModuleMap.size());
2100 DenseMap<StringRef, FunctionImporter::ExportSetTy> ExportLists(
2102 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
2107 std::set<GlobalValue::GUID> ExportedGUIDs;
2109 bool WholeProgramVisibilityEnabledInLTO =
2110 Conf.HasWholeProgramVisibility &&
2113 (!
Conf.ValidateAllVtablesHaveTypeInfos ||
Conf.AllVtablesHaveTypeInfos);
2115 ThinLTO.CombinedIndex.setWithWholeProgramVisibility();
2120 DenseSet<GlobalValue::GUID> VisibleToRegularObjSymbols;
2121 if (WholeProgramVisibilityEnabledInLTO &&
2122 Conf.ValidateAllVtablesHaveTypeInfos) {
2125 auto IsVisibleToRegularObj = [&](StringRef
name) {
2126 auto It = GlobalResolutions->find(
name);
2127 return (It == GlobalResolutions->end() ||
2128 It->second.VisibleOutsideSummary || !It->second.Prevailing);
2132 VisibleToRegularObjSymbols,
2133 IsVisibleToRegularObj);
2139 ThinLTO.CombinedIndex, WholeProgramVisibilityEnabledInLTO,
2140 DynamicExportSymbols, VisibleToRegularObjSymbols);
2145 std::map<ValueInfo, std::vector<VTableSlotSummary>> LocalWPDTargetsMap;
2146 DenseSet<StringRef> ExternallyVisibleSymbolNames;
2152 DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr =
2154 ? &ExternallyVisibleSymbolNames
2158 ExternallyVisibleSymbolNamesPtr);
2161 return ThinLTO.isPrevailingModuleForGUID(GUID, S->modulePath());
2164 MemProfContextDisambiguation ContextDisambiguation;
2165 ContextDisambiguation.
run(
2167 [&](StringRef
PassName, StringRef RemarkName,
const Twine &
Msg) {
2168 auto R = OptimizationRemark(PassName.data(), RemarkName,
2169 LinkerRemarkFunction);
2179 for (
auto &Res : *GlobalResolutions) {
2182 if (Res.second.Partition != GlobalResolution::External ||
2183 !Res.second.isPrevailingIRSymbol())
2185 auto GUID = Res.second.getGUID();
2187 if (
ThinLTO.CombinedIndex.isGUIDLive(GUID))
2188 ExportedGUIDs.insert(GUID);
2195 releaseGlobalResolutionsMemory();
2197 if (
Conf.OptLevel > 0)
2199 isPrevailing, ImportLists, ExportLists);
2203 auto Defs =
ThinLTO.CombinedIndex.cfiFunctionDefs().getExportedThinLTOGUIDs();
2204 ExportedGUIDs.insert(Defs.begin(), Defs.end());
2206 ThinLTO.CombinedIndex.cfiFunctionDecls().getExportedThinLTOGUIDs();
2207 ExportedGUIDs.insert(Decls.begin(), Decls.end());
2209 auto isExported = [&](StringRef ModuleIdentifier, ValueInfo
VI) {
2210 const auto &ExportList = ExportLists.
find(ModuleIdentifier);
2211 return (ExportList != ExportLists.end() && ExportList->second.
count(VI)) ||
2212 ExportedGUIDs.count(
VI.getGUID());
2218 LocalWPDTargetsMap, ExternallyVisibleSymbolNamesPtr);
2220 if (ExternallyVisibleSymbolNamesPtr) {
2223 for (
auto &
I :
ThinLTO.CombinedIndex) {
2224 ValueInfo
VI =
ThinLTO.CombinedIndex.getValueInfo(
I);
2225 for (
const auto &Summary :
VI.getSummaryList()) {
2226 const GlobalValueSummary *
Base =
Summary->getBaseObject();
2230 ExternallyVisibleSymbolNamesPtr->
insert(
VI.name());
2238 ExternallyVisibleSymbolNamesPtr);
2240 auto recordNewLinkage = [&](StringRef ModuleIdentifier,
2243 ResolvedODR[ModuleIdentifier][
GUID] = NewLinkage;
2246 recordNewLinkage, GUIDPreservedSymbols);
2255 TimeTraceScopeExit.release();
2260 auto RunBackends = [&](ThinBackendProc *BackendProcess) ->
Error {
2261 auto ProcessOneModule = [&](
int I) ->
Error {
2265 return BackendProcess->start(
2267 ImportLists[
Mod.first], ExportLists[
Mod.first],
2271 BackendProcess->setup(ModuleMap.
size(),
2273 RegularLTO.CombinedModule->getTargetTriple());
2275 if (BackendProcess->getThreadCount() == 1 ||
2276 BackendProcess->isSensitiveToInputOrder()) {
2282 for (
int I = 0,
E = ModuleMap.
size();
I !=
E; ++
I)
2283 if (
Error E = ProcessOneModule(
I))
2290 std::vector<BitcodeModule *> ModulesVec;
2291 ModulesVec.reserve(ModuleMap.
size());
2292 for (
auto &
Mod : ModuleMap)
2293 ModulesVec.push_back(&
Mod.second);
2295 if (
Error E = ProcessOneModule(
I))
2298 return BackendProcess->wait();
2302 std::unique_ptr<ThinBackendProc> BackendProc =
2304 AddStream, Cache, BitcodeLibFuncs);
2305 return RunBackends(BackendProc.get());
2313 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] Initializing ThinLTO two-codegen rounds\n");
2316 auto Parallelism =
ThinLTO.Backend.getParallelism();
2319 cgdata::StreamCacheData CG(MaxTasks, Cache,
"CG"),
IR(MaxTasks, Cache,
"IR");
2324 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] Running the first round of codegen\n");
2325 auto FirstRoundLTO = std::make_unique<FirstRoundThinBackend>(
2326 Conf,
ThinLTO.CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2327 CG.AddStream, CG.Cache, BitcodeLibFuncs,
IR.AddStream,
IR.Cache);
2328 if (
Error E = RunBackends(FirstRoundLTO.get()))
2333 if (
Error E = CombinedHashOrErr.takeError())
2335 auto CombinedHash = *CombinedHashOrErr;
2336 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] CGData hash: " << CombinedHash <<
"\n");
2340 LLVM_DEBUG(
dbgs() <<
"[TwoRounds] Running the second round of codegen\n");
2341 auto SecondRoundLTO = std::make_unique<SecondRoundThinBackend>(
2342 Conf,
ThinLTO.CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2343 AddStream, Cache, BitcodeLibFuncs,
IR.getResult(), CombinedHash);
2344 return RunBackends(SecondRoundLTO.get());
2362 if (
Error E = ResultOrErr.takeError())
2363 return std::move(E);
2366 (*ResultOrErr)->keep();
2374 if (StatsFilename.
empty())
2385 return std::move(StatsFile);
2393 std::vector<int> ModulesOrdering(Seq.begin(), Seq.end());
2394 llvm::sort(ModulesOrdering, [&](
int LeftIndex,
int RightIndex) {
2395 auto LSize = R[LeftIndex]->getBuffer().size();
2396 auto RSize = R[RightIndex]->getBuffer().size();
2397 return LSize > RSize;
2399 return ModulesOrdering;
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")
This file supports working with JSON data.
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.
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
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.
bool has(LibFunc F) const
Tests whether a library function is available.
StringRef getName(LibFunc F) const
LibFunc getLibFunc(StringRef funcName) const
Searches for a particular function name.
MCTargetOptions MCOptions
Machine level options.
DebuggerKind DebuggerTuning
Which debugger to tune for.
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 Expected< stable_hash > mergeCodeGenData(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 void generateParamAccessSummary(ModuleSummaryIndex &Index)
cl::opt< bool > CodeGenDataThinLTOTwoRounds("codegen-data-thinlto-two-rounds", cl::init(false), cl::Hidden, cl::desc("Enable two-round ThinLTO code generation. The first round " "emits codegen data, while the second round uses the emitted " "codegen data for further optimizations."))
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)
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.
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.
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.