LLVM 22.0.0git
LTO.cpp
Go to the documentation of this file.
1//===-LTO.cpp - LLVM Link Time Optimizer ----------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements functions and classes used to support LTO.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/LTO/LTO.h"
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/ADT/ScopeExit.h"
16#include "llvm/ADT/SmallSet.h"
18#include "llvm/ADT/Statistic.h"
28#include "llvm/Config/llvm-config.h"
29#include "llvm/IR/AutoUpgrade.h"
31#include "llvm/IR/Intrinsics.h"
34#include "llvm/IR/Mangler.h"
35#include "llvm/IR/Metadata.h"
37#include "llvm/LTO/LTOBackend.h"
38#include "llvm/Linker/IRMover.h"
44#include "llvm/Support/Error.h"
46#include "llvm/Support/JSON.h"
48#include "llvm/Support/Path.h"
50#include "llvm/Support/SHA1.h"
56#include "llvm/Support/VCSRevision.h"
59#include "llvm/Transforms/IPO.h"
64
65#include <optional>
66#include <set>
67
68using namespace llvm;
69using namespace lto;
70using namespace object;
71
72#define DEBUG_TYPE "lto"
73
74static cl::opt<bool>
75 DumpThinCGSCCs("dump-thin-cg-sccs", cl::init(false), cl::Hidden,
76 cl::desc("Dump the SCCs in the ThinLTO index's callgraph"));
77
78namespace llvm {
81} // end namespace llvm
82
83namespace llvm {
84/// Enable global value internalization in LTO.
86 "enable-lto-internalization", cl::init(true), cl::Hidden,
87 cl::desc("Enable global value internalization in LTO"));
88
89static cl::opt<bool>
90 LTOKeepSymbolCopies("lto-keep-symbol-copies", cl::init(false), cl::Hidden,
91 cl::desc("Keep copies of symbols in LTO indexing"));
92
93/// Indicate we are linking with an allocator that supports hot/cold operator
94/// new interfaces.
96
97/// Enable MemProf context disambiguation for thin link.
99} // namespace llvm
100
101// Computes a unique hash for the Module considering the current list of
102// export/import and other global analysis results.
103// Returns the hash in its hexadecimal representation.
105 const Config &Conf, const ModuleSummaryIndex &Index, StringRef ModuleID,
106 const FunctionImporter::ImportMapTy &ImportList,
107 const FunctionImporter::ExportSetTy &ExportList,
108 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
109 const GVSummaryMapTy &DefinedGlobals,
110 const DenseSet<GlobalValue::GUID> &CfiFunctionDefs,
111 const DenseSet<GlobalValue::GUID> &CfiFunctionDecls) {
112 // Compute the unique hash for this entry.
113 // This is based on the current compiler version, the module itself, the
114 // export list, the hash for every single module in the import list, the
115 // list of ResolvedODR for the module, and the list of preserved symbols.
116 SHA1 Hasher;
117
118 // Start with the compiler revision
119 Hasher.update(LLVM_VERSION_STRING);
120#ifdef LLVM_REVISION
121 Hasher.update(LLVM_REVISION);
122#endif
123
124 // Include the parts of the LTO configuration that affect code generation.
125 auto AddString = [&](StringRef Str) {
126 Hasher.update(Str);
127 Hasher.update(ArrayRef<uint8_t>{0});
128 };
129 auto AddUnsigned = [&](unsigned I) {
130 uint8_t Data[4];
132 Hasher.update(Data);
133 };
134 auto AddUint64 = [&](uint64_t I) {
135 uint8_t Data[8];
137 Hasher.update(Data);
138 };
139 auto AddUint8 = [&](const uint8_t I) {
140 Hasher.update(ArrayRef<uint8_t>(&I, 1));
141 };
142 AddString(Conf.CPU);
143 // FIXME: Hash more of Options. For now all clients initialize Options from
144 // command-line flags (which is unsupported in production), but may set
145 // X86RelaxRelocations. The clang driver can also pass FunctionSections,
146 // DataSections and DebuggerTuning via command line flags.
147 AddUnsigned(Conf.Options.MCOptions.X86RelaxRelocations);
148 AddUnsigned(Conf.Options.FunctionSections);
149 AddUnsigned(Conf.Options.DataSections);
150 AddUnsigned((unsigned)Conf.Options.DebuggerTuning);
151 for (auto &A : Conf.MAttrs)
152 AddString(A);
153 if (Conf.RelocModel)
154 AddUnsigned(*Conf.RelocModel);
155 else
156 AddUnsigned(-1);
157 if (Conf.CodeModel)
158 AddUnsigned(*Conf.CodeModel);
159 else
160 AddUnsigned(-1);
161 for (const auto &S : Conf.MllvmArgs)
162 AddString(S);
163 AddUnsigned(static_cast<int>(Conf.CGOptLevel));
164 AddUnsigned(static_cast<int>(Conf.CGFileType));
165 AddUnsigned(Conf.OptLevel);
166 AddUnsigned(Conf.Freestanding);
167 AddString(Conf.OptPipeline);
168 AddString(Conf.AAPipeline);
169 AddString(Conf.OverrideTriple);
170 AddString(Conf.DefaultTriple);
171 AddString(Conf.DwoDir);
172
173 // Include the hash for the current module
174 auto ModHash = Index.getModuleHash(ModuleID);
175 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
176
177 // TODO: `ExportList` is determined by `ImportList`. Since `ImportList` is
178 // used to compute cache key, we could omit hashing `ExportList` here.
179 std::vector<uint64_t> ExportsGUID;
180 ExportsGUID.reserve(ExportList.size());
181 for (const auto &VI : ExportList)
182 ExportsGUID.push_back(VI.getGUID());
183
184 // Sort the export list elements GUIDs.
185 llvm::sort(ExportsGUID);
186 for (auto GUID : ExportsGUID)
187 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&GUID, sizeof(GUID)));
188
189 // Order using module hash, to be both independent of module name and
190 // module order.
191 auto Comp = [&](const std::pair<StringRef, GlobalValue::GUID> &L,
192 const std::pair<StringRef, GlobalValue::GUID> &R) {
193 return std::make_pair(Index.getModule(L.first)->second, L.second) <
194 std::make_pair(Index.getModule(R.first)->second, R.second);
195 };
196 FunctionImporter::SortedImportList SortedImportList(ImportList, Comp);
197
198 // Count the number of imports for each source module.
199 DenseMap<StringRef, unsigned> ModuleToNumImports;
200 for (const auto &[FromModule, GUID, Type] : SortedImportList)
201 ++ModuleToNumImports[FromModule];
202
203 std::optional<StringRef> LastModule;
204 for (const auto &[FromModule, GUID, Type] : SortedImportList) {
205 if (LastModule != FromModule) {
206 // Include the hash for every module we import functions from. The set of
207 // imported symbols for each module may affect code generation and is
208 // sensitive to link order, so include that as well.
209 LastModule = FromModule;
210 auto ModHash = Index.getModule(FromModule)->second;
211 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
212 AddUint64(ModuleToNumImports[FromModule]);
213 }
214 AddUint64(GUID);
215 AddUint8(Type);
216 }
217
218 // Include the hash for the resolved ODR.
219 for (auto &Entry : ResolvedODR) {
220 Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.first,
221 sizeof(GlobalValue::GUID)));
222 Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.second,
224 }
225
226 // Members of CfiFunctionDefs and CfiFunctionDecls that are referenced or
227 // defined in this module.
228 std::set<GlobalValue::GUID> UsedCfiDefs;
229 std::set<GlobalValue::GUID> UsedCfiDecls;
230
231 // Typeids used in this module.
232 std::set<GlobalValue::GUID> UsedTypeIds;
233
234 auto AddUsedCfiGlobal = [&](GlobalValue::GUID ValueGUID) {
235 if (CfiFunctionDefs.contains(ValueGUID))
236 UsedCfiDefs.insert(ValueGUID);
237 if (CfiFunctionDecls.contains(ValueGUID))
238 UsedCfiDecls.insert(ValueGUID);
239 };
240
241 auto AddUsedThings = [&](GlobalValueSummary *GS) {
242 if (!GS) return;
243 AddUnsigned(GS->getVisibility());
244 AddUnsigned(GS->isLive());
245 AddUnsigned(GS->canAutoHide());
246 for (const ValueInfo &VI : GS->refs()) {
247 AddUnsigned(VI.isDSOLocal(Index.withDSOLocalPropagation()));
248 AddUsedCfiGlobal(VI.getGUID());
249 }
250 if (auto *GVS = dyn_cast<GlobalVarSummary>(GS)) {
251 AddUnsigned(GVS->maybeReadOnly());
252 AddUnsigned(GVS->maybeWriteOnly());
253 }
254 if (auto *FS = dyn_cast<FunctionSummary>(GS)) {
255 for (auto &TT : FS->type_tests())
256 UsedTypeIds.insert(TT);
257 for (auto &TT : FS->type_test_assume_vcalls())
258 UsedTypeIds.insert(TT.GUID);
259 for (auto &TT : FS->type_checked_load_vcalls())
260 UsedTypeIds.insert(TT.GUID);
261 for (auto &TT : FS->type_test_assume_const_vcalls())
262 UsedTypeIds.insert(TT.VFunc.GUID);
263 for (auto &TT : FS->type_checked_load_const_vcalls())
264 UsedTypeIds.insert(TT.VFunc.GUID);
265 for (auto &ET : FS->calls()) {
266 AddUnsigned(ET.first.isDSOLocal(Index.withDSOLocalPropagation()));
267 AddUsedCfiGlobal(ET.first.getGUID());
268 }
269 }
270 };
271
272 // Include the hash for the linkage type to reflect internalization and weak
273 // resolution, and collect any used type identifier resolutions.
274 for (auto &GS : DefinedGlobals) {
275 GlobalValue::LinkageTypes Linkage = GS.second->linkage();
276 Hasher.update(
277 ArrayRef<uint8_t>((const uint8_t *)&Linkage, sizeof(Linkage)));
278 AddUsedCfiGlobal(GS.first);
279 AddUsedThings(GS.second);
280 }
281
282 // Imported functions may introduce new uses of type identifier resolutions,
283 // so we need to collect their used resolutions as well.
284 for (const auto &[FromModule, GUID, Type] : SortedImportList) {
285 GlobalValueSummary *S = Index.findSummaryInModule(GUID, FromModule);
286 AddUsedThings(S);
287 // If this is an alias, we also care about any types/etc. that the aliasee
288 // may reference.
289 if (auto *AS = dyn_cast_or_null<AliasSummary>(S))
290 AddUsedThings(AS->getBaseObject());
291 }
292
293 auto AddTypeIdSummary = [&](StringRef TId, const TypeIdSummary &S) {
294 AddString(TId);
295
296 AddUnsigned(S.TTRes.TheKind);
297 AddUnsigned(S.TTRes.SizeM1BitWidth);
298
299 AddUint64(S.TTRes.AlignLog2);
300 AddUint64(S.TTRes.SizeM1);
301 AddUint64(S.TTRes.BitMask);
302 AddUint64(S.TTRes.InlineBits);
303
304 AddUint64(S.WPDRes.size());
305 for (auto &WPD : S.WPDRes) {
306 AddUnsigned(WPD.first);
307 AddUnsigned(WPD.second.TheKind);
308 AddString(WPD.second.SingleImplName);
309
310 AddUint64(WPD.second.ResByArg.size());
311 for (auto &ByArg : WPD.second.ResByArg) {
312 AddUint64(ByArg.first.size());
313 for (uint64_t Arg : ByArg.first)
314 AddUint64(Arg);
315 AddUnsigned(ByArg.second.TheKind);
316 AddUint64(ByArg.second.Info);
317 AddUnsigned(ByArg.second.Byte);
318 AddUnsigned(ByArg.second.Bit);
319 }
320 }
321 };
322
323 // Include the hash for all type identifiers used by this module.
324 for (GlobalValue::GUID TId : UsedTypeIds) {
325 auto TidIter = Index.typeIds().equal_range(TId);
326 for (const auto &I : make_range(TidIter))
327 AddTypeIdSummary(I.second.first, I.second.second);
328 }
329
330 AddUnsigned(UsedCfiDefs.size());
331 for (auto &V : UsedCfiDefs)
332 AddUint64(V);
333
334 AddUnsigned(UsedCfiDecls.size());
335 for (auto &V : UsedCfiDecls)
336 AddUint64(V);
337
338 if (!Conf.SampleProfile.empty()) {
339 auto FileOrErr = MemoryBuffer::getFile(Conf.SampleProfile);
340 if (FileOrErr) {
341 Hasher.update(FileOrErr.get()->getBuffer());
342
343 if (!Conf.ProfileRemapping.empty()) {
344 FileOrErr = MemoryBuffer::getFile(Conf.ProfileRemapping);
345 if (FileOrErr)
346 Hasher.update(FileOrErr.get()->getBuffer());
347 }
348 }
349 }
350
351 return toHex(Hasher.result());
352}
353
354std::string llvm::recomputeLTOCacheKey(const std::string &Key,
355 StringRef ExtraID) {
356 SHA1 Hasher;
357
358 auto AddString = [&](StringRef Str) {
359 Hasher.update(Str);
360 Hasher.update(ArrayRef<uint8_t>{0});
361 };
362 AddString(Key);
363 AddString(ExtraID);
364
365 return toHex(Hasher.result());
366}
367
369 const Config &C, ValueInfo VI,
370 DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias,
372 isPrevailing,
374 recordNewLinkage,
375 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
377 C.VisibilityScheme == Config::ELF ? VI.getELFVisibility()
379 for (auto &S : VI.getSummaryList()) {
380 GlobalValue::LinkageTypes OriginalLinkage = S->linkage();
381 // Ignore local and appending linkage values since the linker
382 // doesn't resolve them.
383 if (GlobalValue::isLocalLinkage(OriginalLinkage) ||
385 continue;
386 // We need to emit only one of these. The prevailing module will keep it,
387 // but turned into a weak, while the others will drop it when possible.
388 // This is both a compile-time optimization and a correctness
389 // transformation. This is necessary for correctness when we have exported
390 // a reference - we need to convert the linkonce to weak to
391 // ensure a copy is kept to satisfy the exported reference.
392 // FIXME: We may want to split the compile time and correctness
393 // aspects into separate routines.
394 if (isPrevailing(VI.getGUID(), S.get())) {
395 if (GlobalValue::isLinkOnceLinkage(OriginalLinkage)) {
396 S->setLinkage(GlobalValue::getWeakLinkage(
397 GlobalValue::isLinkOnceODRLinkage(OriginalLinkage)));
398 // The kept copy is eligible for auto-hiding (hidden visibility) if all
399 // copies were (i.e. they were all linkonce_odr global unnamed addr).
400 // If any copy is not (e.g. it was originally weak_odr), then the symbol
401 // must remain externally available (e.g. a weak_odr from an explicitly
402 // instantiated template). Additionally, if it is in the
403 // GUIDPreservedSymbols set, that means that it is visibile outside
404 // the summary (e.g. in a native object or a bitcode file without
405 // summary), and in that case we cannot hide it as it isn't possible to
406 // check all copies.
407 S->setCanAutoHide(VI.canAutoHide() &&
408 !GUIDPreservedSymbols.count(VI.getGUID()));
409 }
410 if (C.VisibilityScheme == Config::FromPrevailing)
411 Visibility = S->getVisibility();
412 }
413 // Alias and aliasee can't be turned into available_externally.
414 // When force-import-all is used, it indicates that object linking is not
415 // supported by the target. In this case, we can't change the linkage as
416 // well in case the global is converted to declaration.
417 else if (!isa<AliasSummary>(S.get()) &&
418 !GlobalInvolvedWithAlias.count(S.get()) && !ForceImportAll)
420
421 // For ELF, set visibility to the computed visibility from summaries. We
422 // don't track visibility from declarations so this may be more relaxed than
423 // the most constraining one.
424 if (C.VisibilityScheme == Config::ELF)
425 S->setVisibility(Visibility);
426
427 if (S->linkage() != OriginalLinkage)
428 recordNewLinkage(S->modulePath(), VI.getGUID(), S->linkage());
429 }
430
431 if (C.VisibilityScheme == Config::FromPrevailing) {
432 for (auto &S : VI.getSummaryList()) {
433 GlobalValue::LinkageTypes OriginalLinkage = S->linkage();
434 if (GlobalValue::isLocalLinkage(OriginalLinkage) ||
436 continue;
437 S->setVisibility(Visibility);
438 }
439 }
440}
441
442/// Resolve linkage for prevailing symbols in the \p Index.
443//
444// We'd like to drop these functions if they are no longer referenced in the
445// current module. However there is a chance that another module is still
446// referencing them because of the import. We make sure we always emit at least
447// one copy.
449 const Config &C, ModuleSummaryIndex &Index,
451 isPrevailing,
453 recordNewLinkage,
454 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
455 // We won't optimize the globals that are referenced by an alias for now
456 // Ideally we should turn the alias into a global and duplicate the definition
457 // when needed.
458 DenseSet<GlobalValueSummary *> GlobalInvolvedWithAlias;
459 for (auto &I : Index)
460 for (auto &S : I.second.getSummaryList())
461 if (auto AS = dyn_cast<AliasSummary>(S.get()))
462 GlobalInvolvedWithAlias.insert(&AS->getAliasee());
463
464 for (auto &I : Index)
465 thinLTOResolvePrevailingGUID(C, Index.getValueInfo(I),
466 GlobalInvolvedWithAlias, isPrevailing,
467 recordNewLinkage, GUIDPreservedSymbols);
468}
469
471 ValueInfo VI, function_ref<bool(StringRef, ValueInfo)> isExported,
473 isPrevailing) {
474 // Before performing index-based internalization and promotion for this GUID,
475 // the local flag should be consistent with the summary list linkage types.
476 VI.verifyLocal();
477
478 const bool SingleExternallyVisibleCopy =
479 VI.getSummaryList().size() == 1 &&
480 !GlobalValue::isLocalLinkage(VI.getSummaryList().front()->linkage());
481
482 for (auto &S : VI.getSummaryList()) {
483 // First see if we need to promote an internal value because it is not
484 // exported.
485 if (isExported(S->modulePath(), VI)) {
486 if (GlobalValue::isLocalLinkage(S->linkage()))
487 S->setLinkage(GlobalValue::ExternalLinkage);
488 continue;
489 }
490
491 // Otherwise, see if we can internalize.
493 continue;
494
495 // Non-exported values with external linkage can be internalized.
496 if (GlobalValue::isExternalLinkage(S->linkage())) {
497 S->setLinkage(GlobalValue::InternalLinkage);
498 continue;
499 }
500
501 // Non-exported function and variable definitions with a weak-for-linker
502 // linkage can be internalized in certain cases. The minimum legality
503 // requirements would be that they are not address taken to ensure that we
504 // don't break pointer equality checks, and that variables are either read-
505 // or write-only. For functions, this is the case if either all copies are
506 // [local_]unnamed_addr, or we can propagate reference edge attributes
507 // (which is how this is guaranteed for variables, when analyzing whether
508 // they are read or write-only).
509 //
510 // However, we only get to this code for weak-for-linkage values in one of
511 // two cases:
512 // 1) The prevailing copy is not in IR (it is in native code).
513 // 2) The prevailing copy in IR is not exported from its module.
514 // Additionally, at least for the new LTO API, case 2 will only happen if
515 // there is exactly one definition of the value (i.e. in exactly one
516 // module), as duplicate defs are result in the value being marked exported.
517 // Likely, users of the legacy LTO API are similar, however, currently there
518 // are llvm-lto based tests of the legacy LTO API that do not mark
519 // duplicate linkonce_odr copies as exported via the tool, so we need
520 // to handle that case below by checking the number of copies.
521 //
522 // Generally, we only want to internalize a weak-for-linker value in case
523 // 2, because in case 1 we cannot see how the value is used to know if it
524 // is read or write-only. We also don't want to bloat the binary with
525 // multiple internalized copies of non-prevailing linkonce/weak functions.
526 // Note if we don't internalize, we will convert non-prevailing copies to
527 // available_externally anyway, so that we drop them after inlining. The
528 // only reason to internalize such a function is if we indeed have a single
529 // copy, because internalizing it won't increase binary size, and enables
530 // use of inliner heuristics that are more aggressive in the face of a
531 // single call to a static (local). For variables, internalizing a read or
532 // write only variable can enable more aggressive optimization. However, we
533 // already perform this elsewhere in the ThinLTO backend handling for
534 // read or write-only variables (processGlobalForThinLTO).
535 //
536 // Therefore, only internalize linkonce/weak if there is a single copy, that
537 // is prevailing in this IR module. We can do so aggressively, without
538 // requiring the address to be insignificant, or that a variable be read or
539 // write-only.
540 if (!GlobalValue::isWeakForLinker(S->linkage()) ||
542 continue;
543
544 // We may have a single summary copy that is externally visible but not
545 // prevailing if the prevailing copy is in a native object.
546 if (SingleExternallyVisibleCopy && isPrevailing(VI.getGUID(), S.get()))
547 S->setLinkage(GlobalValue::InternalLinkage);
548 }
549}
550
551// Update the linkages in the given \p Index to mark exported values
552// as external and non-exported values as internal.
554 ModuleSummaryIndex &Index,
555 function_ref<bool(StringRef, ValueInfo)> isExported,
557 isPrevailing) {
558 assert(!Index.withInternalizeAndPromote());
559 for (auto &I : Index)
560 thinLTOInternalizeAndPromoteGUID(Index.getValueInfo(I), isExported,
561 isPrevailing);
562 Index.setWithInternalizeAndPromote();
563}
564
565// Requires a destructor for std::vector<InputModule>.
566InputFile::~InputFile() = default;
567
569 std::unique_ptr<InputFile> File(new InputFile);
570
571 Expected<IRSymtabFile> FOrErr = readIRSymtab(Object);
572 if (!FOrErr)
573 return FOrErr.takeError();
574
575 File->TargetTriple = FOrErr->TheReader.getTargetTriple();
576 File->SourceFileName = FOrErr->TheReader.getSourceFileName();
577 File->COFFLinkerOpts = FOrErr->TheReader.getCOFFLinkerOpts();
578 File->DependentLibraries = FOrErr->TheReader.getDependentLibraries();
579 File->ComdatTable = FOrErr->TheReader.getComdatTable();
580
581 for (unsigned I = 0; I != FOrErr->Mods.size(); ++I) {
582 size_t Begin = File->Symbols.size();
583 for (const irsymtab::Reader::SymbolRef &Sym :
584 FOrErr->TheReader.module_symbols(I))
585 // Skip symbols that are irrelevant to LTO. Note that this condition needs
586 // to match the one in Skip() in LTO::addRegularLTO().
587 if (Sym.isGlobal() && !Sym.isFormatSpecific())
588 File->Symbols.push_back(Sym);
589 File->ModuleSymIndices.push_back({Begin, File->Symbols.size()});
590 }
591
592 File->Mods = FOrErr->Mods;
593 File->Strtab = std::move(FOrErr->Strtab);
594 return std::move(File);
595}
596
598 return Mods[0].getModuleIdentifier();
599}
600
602 assert(Mods.size() == 1 && "Expect only one bitcode module");
603 return Mods[0];
604}
605
606LTO::RegularLTOState::RegularLTOState(unsigned ParallelCodeGenParallelismLevel,
607 const Config &Conf)
608 : ParallelCodeGenParallelismLevel(ParallelCodeGenParallelismLevel),
609 Ctx(Conf), CombinedModule(std::make_unique<Module>("ld-temp.o", Ctx)),
610 Mover(std::make_unique<IRMover>(*CombinedModule)) {}
611
612LTO::ThinLTOState::ThinLTOState(ThinBackend BackendParam)
613 : Backend(std::move(BackendParam)), CombinedIndex(/*HaveGVs*/ false) {
614 if (!Backend.isValid())
615 Backend =
617}
618
620 unsigned ParallelCodeGenParallelismLevel, LTOKind LTOMode)
621 : Conf(std::move(Conf)),
622 RegularLTO(ParallelCodeGenParallelismLevel, this->Conf),
623 ThinLTO(std::move(Backend)),
624 GlobalResolutions(
625 std::make_unique<DenseMap<StringRef, GlobalResolution>>()),
626 LTOMode(LTOMode) {
627 if (Conf.KeepSymbolNameCopies || LTOKeepSymbolCopies) {
628 Alloc = std::make_unique<BumpPtrAllocator>();
629 GlobalResolutionSymbolSaver = std::make_unique<llvm::StringSaver>(*Alloc);
630 }
631}
632
633// Requires a destructor for MapVector<BitcodeModule>.
634LTO::~LTO() = default;
635
636// Add the symbols in the given module to the GlobalResolutions map, and resolve
637// their partitions.
638void LTO::addModuleToGlobalRes(ArrayRef<InputFile::Symbol> Syms,
640 unsigned Partition, bool InSummary) {
641 llvm::TimeTraceScope timeScope("LTO add module to global resolution");
642 auto *ResI = Res.begin();
643 auto *ResE = Res.end();
644 (void)ResE;
645 for (const InputFile::Symbol &Sym : Syms) {
646 assert(ResI != ResE);
647 SymbolResolution Res = *ResI++;
648
649 StringRef SymbolName = Sym.getName();
650 // Keep copies of symbols if the client of LTO says so.
651 if (GlobalResolutionSymbolSaver && !GlobalResolutions->contains(SymbolName))
652 SymbolName = GlobalResolutionSymbolSaver->save(SymbolName);
653
654 auto &GlobalRes = (*GlobalResolutions)[SymbolName];
655 GlobalRes.UnnamedAddr &= Sym.isUnnamedAddr();
656 if (Res.Prevailing) {
657 assert(!GlobalRes.Prevailing &&
658 "Multiple prevailing defs are not allowed");
659 GlobalRes.Prevailing = true;
660 GlobalRes.IRName = std::string(Sym.getIRName());
661 } else if (!GlobalRes.Prevailing && GlobalRes.IRName.empty()) {
662 // Sometimes it can be two copies of symbol in a module and prevailing
663 // symbol can have no IR name. That might happen if symbol is defined in
664 // module level inline asm block. In case we have multiple modules with
665 // the same symbol we want to use IR name of the prevailing symbol.
666 // Otherwise, if we haven't seen a prevailing symbol, set the name so that
667 // we can later use it to check if there is any prevailing copy in IR.
668 GlobalRes.IRName = std::string(Sym.getIRName());
669 }
670
671 // In rare occasion, the symbol used to initialize GlobalRes has a different
672 // IRName from the inspected Symbol. This can happen on macOS + iOS, when a
673 // symbol is referenced through its mangled name, say @"\01_symbol" while
674 // the IRName is @symbol (the prefix underscore comes from MachO mangling).
675 // In that case, we have the same actual Symbol that can get two different
676 // GUID, leading to some invalid internalization. Workaround this by marking
677 // the GlobalRes external.
678
679 // FIXME: instead of this check, it would be desirable to compute GUIDs
680 // based on mangled name, but this requires an access to the Target Triple
681 // and would be relatively invasive on the codebase.
682 if (GlobalRes.IRName != Sym.getIRName()) {
683 GlobalRes.Partition = GlobalResolution::External;
684 GlobalRes.VisibleOutsideSummary = true;
685 }
686
687 // Set the partition to external if we know it is re-defined by the linker
688 // with -defsym or -wrap options, used elsewhere, e.g. it is visible to a
689 // regular object, is referenced from llvm.compiler.used/llvm.used, or was
690 // already recorded as being referenced from a different partition.
691 if (Res.LinkerRedefined || Res.VisibleToRegularObj || Sym.isUsed() ||
692 (GlobalRes.Partition != GlobalResolution::Unknown &&
693 GlobalRes.Partition != Partition)) {
694 GlobalRes.Partition = GlobalResolution::External;
695 } else
696 // First recorded reference, save the current partition.
697 GlobalRes.Partition = Partition;
698
699 // Flag as visible outside of summary if visible from a regular object or
700 // from a module that does not have a summary.
701 GlobalRes.VisibleOutsideSummary |=
702 (Res.VisibleToRegularObj || Sym.isUsed() || !InSummary);
703
704 GlobalRes.ExportDynamic |= Res.ExportDynamic;
705 }
706}
707
708void LTO::releaseGlobalResolutionsMemory() {
709 // Release GlobalResolutions dense-map itself.
710 GlobalResolutions.reset();
711 // Release the string saver memory.
712 GlobalResolutionSymbolSaver.reset();
713 Alloc.reset();
714}
715
718 StringRef Path = Input->getName();
719 OS << Path << '\n';
720 auto ResI = Res.begin();
721 for (const InputFile::Symbol &Sym : Input->symbols()) {
722 assert(ResI != Res.end());
723 SymbolResolution Res = *ResI++;
724
725 OS << "-r=" << Path << ',' << Sym.getName() << ',';
726 if (Res.Prevailing)
727 OS << 'p';
729 OS << 'l';
730 if (Res.VisibleToRegularObj)
731 OS << 'x';
732 if (Res.LinkerRedefined)
733 OS << 'r';
734 OS << '\n';
735 }
736 OS.flush();
737 assert(ResI == Res.end());
738}
739
740Error LTO::add(std::unique_ptr<InputFile> Input,
742 llvm::TimeTraceScope timeScope("LTO add input", Input->getName());
743 assert(!CalledGetMaxTasks);
744
745 if (Conf.ResolutionFile)
746 writeToResolutionFile(*Conf.ResolutionFile, Input.get(), Res);
747
748 if (RegularLTO.CombinedModule->getTargetTriple().empty()) {
749 Triple InputTriple(Input->getTargetTriple());
750 RegularLTO.CombinedModule->setTargetTriple(InputTriple);
751 if (InputTriple.isOSBinFormatELF())
752 Conf.VisibilityScheme = Config::ELF;
753 }
754
755 ArrayRef<SymbolResolution> InputRes = Res;
756 for (unsigned I = 0; I != Input->Mods.size(); ++I) {
757 if (auto Err = addModule(*Input, InputRes, I, Res).moveInto(Res))
758 return Err;
759 }
760
761 assert(Res.empty());
762 return Error::success();
763}
764
766LTO::addModule(InputFile &Input, ArrayRef<SymbolResolution> InputRes,
767 unsigned ModI, ArrayRef<SymbolResolution> Res) {
768 llvm::TimeTraceScope timeScope("LTO add module", Input.getName());
769 Expected<BitcodeLTOInfo> LTOInfo = Input.Mods[ModI].getLTOInfo();
770 if (!LTOInfo)
771 return LTOInfo.takeError();
772
773 if (EnableSplitLTOUnit) {
774 // If only some modules were split, flag this in the index so that
775 // we can skip or error on optimizations that need consistently split
776 // modules (whole program devirt and lower type tests).
777 if (*EnableSplitLTOUnit != LTOInfo->EnableSplitLTOUnit)
778 ThinLTO.CombinedIndex.setPartiallySplitLTOUnits();
779 } else
780 EnableSplitLTOUnit = LTOInfo->EnableSplitLTOUnit;
781
782 BitcodeModule BM = Input.Mods[ModI];
783
784 if ((LTOMode == LTOK_UnifiedRegular || LTOMode == LTOK_UnifiedThin) &&
785 !LTOInfo->UnifiedLTO)
787 "unified LTO compilation must use "
788 "compatible bitcode modules (use -funified-lto)",
790
791 if (LTOInfo->UnifiedLTO && LTOMode == LTOK_Default)
792 LTOMode = LTOK_UnifiedThin;
793
794 bool IsThinLTO = LTOInfo->IsThinLTO && (LTOMode != LTOK_UnifiedRegular);
795
796 auto ModSyms = Input.module_symbols(ModI);
797 addModuleToGlobalRes(ModSyms, Res,
798 IsThinLTO ? ThinLTO.ModuleMap.size() + 1 : 0,
799 LTOInfo->HasSummary);
800
801 if (IsThinLTO)
802 return addThinLTO(BM, ModSyms, Res);
803
804 RegularLTO.EmptyCombinedModule = false;
805 auto ModOrErr = addRegularLTO(Input, InputRes, BM, ModSyms, Res);
806 if (!ModOrErr)
807 return ModOrErr.takeError();
808 Res = ModOrErr->second;
809
810 if (!LTOInfo->HasSummary) {
811 if (Error Err = linkRegularLTO(std::move(ModOrErr->first),
812 /*LivenessFromIndex=*/false))
813 return Err;
814 return Res;
815 }
816
817 // Regular LTO module summaries are added to a dummy module that represents
818 // the combined regular LTO module.
819 if (Error Err = BM.readSummary(ThinLTO.CombinedIndex, ""))
820 return Err;
821 RegularLTO.ModsWithSummaries.push_back(std::move(ModOrErr->first));
822 return Res;
823}
824
825// Checks whether the given global value is in a non-prevailing comdat
826// (comdat containing values the linker indicated were not prevailing,
827// which we then dropped to available_externally), and if so, removes
828// it from the comdat. This is called for all global values to ensure the
829// comdat is empty rather than leaving an incomplete comdat. It is needed for
830// regular LTO modules, in case we are in a mixed-LTO mode (both regular
831// and thin LTO modules) compilation. Since the regular LTO module will be
832// linked first in the final native link, we want to make sure the linker
833// doesn't select any of these incomplete comdats that would be left
834// in the regular LTO module without this cleanup.
835static void
837 std::set<const Comdat *> &NonPrevailingComdats) {
838 Comdat *C = GV.getComdat();
839 if (!C)
840 return;
841
842 if (!NonPrevailingComdats.count(C))
843 return;
844
845 // Additionally need to drop all global values from the comdat to
846 // available_externally, to satisfy the COMDAT requirement that all members
847 // are discarded as a unit. The non-local linkage global values avoid
848 // duplicate definition linker errors.
850
851 if (auto GO = dyn_cast<GlobalObject>(&GV))
852 GO->setComdat(nullptr);
853}
854
855// Add a regular LTO object to the link.
856// The resulting module needs to be linked into the combined LTO module with
857// linkRegularLTO.
858Expected<
859 std::pair<LTO::RegularLTOState::AddedModule, ArrayRef<SymbolResolution>>>
860LTO::addRegularLTO(InputFile &Input, ArrayRef<SymbolResolution> InputRes,
861 BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
863 llvm::TimeTraceScope timeScope("LTO add regular LTO");
865 Expected<std::unique_ptr<Module>> MOrErr =
866 BM.getLazyModule(RegularLTO.Ctx, /*ShouldLazyLoadMetadata*/ true,
867 /*IsImporting*/ false);
868 if (!MOrErr)
869 return MOrErr.takeError();
870 Module &M = **MOrErr;
871 Mod.M = std::move(*MOrErr);
872
873 if (Error Err = M.materializeMetadata())
874 return std::move(Err);
875
876 if (LTOMode == LTOK_UnifiedRegular) {
877 // cfi.functions metadata is intended to be used with ThinLTO and may
878 // trigger invalid IR transformations if they are present when doing regular
879 // LTO, so delete it.
880 if (NamedMDNode *CfiFunctionsMD = M.getNamedMetadata("cfi.functions"))
881 M.eraseNamedMetadata(CfiFunctionsMD);
882 } else if (NamedMDNode *AliasesMD = M.getNamedMetadata("aliases")) {
883 // Delete aliases entries for non-prevailing symbols on the ThinLTO side of
884 // this input file.
885 DenseSet<StringRef> Prevailing;
886 for (auto [I, R] : zip(Input.symbols(), InputRes))
887 if (R.Prevailing && !I.getIRName().empty())
888 Prevailing.insert(I.getIRName());
889 std::vector<MDNode *> AliasGroups;
890 for (MDNode *AliasGroup : AliasesMD->operands()) {
891 std::vector<Metadata *> Aliases;
892 for (Metadata *Alias : AliasGroup->operands()) {
893 if (isa<MDString>(Alias) &&
894 Prevailing.count(cast<MDString>(Alias)->getString()))
895 Aliases.push_back(Alias);
896 }
897 if (Aliases.size() > 1)
898 AliasGroups.push_back(MDTuple::get(RegularLTO.Ctx, Aliases));
899 }
900 AliasesMD->clearOperands();
901 for (MDNode *G : AliasGroups)
902 AliasesMD->addOperand(G);
903 }
904
906
907 ModuleSymbolTable SymTab;
908 SymTab.addModule(&M);
909
910 for (GlobalVariable &GV : M.globals())
911 if (GV.hasAppendingLinkage())
912 Mod.Keep.push_back(&GV);
913
914 DenseSet<GlobalObject *> AliasedGlobals;
915 for (auto &GA : M.aliases())
916 if (GlobalObject *GO = GA.getAliaseeObject())
917 AliasedGlobals.insert(GO);
918
919 // In this function we need IR GlobalValues matching the symbols in Syms
920 // (which is not backed by a module), so we need to enumerate them in the same
921 // order. The symbol enumeration order of a ModuleSymbolTable intentionally
922 // matches the order of an irsymtab, but when we read the irsymtab in
923 // InputFile::create we omit some symbols that are irrelevant to LTO. The
924 // Skip() function skips the same symbols from the module as InputFile does
925 // from the symbol table.
926 auto MsymI = SymTab.symbols().begin(), MsymE = SymTab.symbols().end();
927 auto Skip = [&]() {
928 while (MsymI != MsymE) {
929 auto Flags = SymTab.getSymbolFlags(*MsymI);
930 if ((Flags & object::BasicSymbolRef::SF_Global) &&
932 return;
933 ++MsymI;
934 }
935 };
936 Skip();
937
938 std::set<const Comdat *> NonPrevailingComdats;
939 SmallSet<StringRef, 2> NonPrevailingAsmSymbols;
940 for (const InputFile::Symbol &Sym : Syms) {
941 assert(!Res.empty());
942 const SymbolResolution &R = Res.consume_front();
943
944 assert(MsymI != MsymE);
945 ModuleSymbolTable::Symbol Msym = *MsymI++;
946 Skip();
947
948 if (GlobalValue *GV = dyn_cast_if_present<GlobalValue *>(Msym)) {
949 if (R.Prevailing) {
950 if (Sym.isUndefined())
951 continue;
952 Mod.Keep.push_back(GV);
953 // For symbols re-defined with linker -wrap and -defsym options,
954 // set the linkage to weak to inhibit IPO. The linkage will be
955 // restored by the linker.
956 if (R.LinkerRedefined)
957 GV->setLinkage(GlobalValue::WeakAnyLinkage);
958
959 GlobalValue::LinkageTypes OriginalLinkage = GV->getLinkage();
960 if (GlobalValue::isLinkOnceLinkage(OriginalLinkage))
961 GV->setLinkage(GlobalValue::getWeakLinkage(
962 GlobalValue::isLinkOnceODRLinkage(OriginalLinkage)));
963 } else if (isa<GlobalObject>(GV) &&
964 (GV->hasLinkOnceODRLinkage() || GV->hasWeakODRLinkage() ||
965 GV->hasAvailableExternallyLinkage()) &&
966 !AliasedGlobals.count(cast<GlobalObject>(GV))) {
967 // Any of the above three types of linkage indicates that the
968 // chosen prevailing symbol will have the same semantics as this copy of
969 // the symbol, so we may be able to link it with available_externally
970 // linkage. We will decide later whether to do that when we link this
971 // module (in linkRegularLTO), based on whether it is undefined.
972 Mod.Keep.push_back(GV);
974 if (GV->hasComdat())
975 NonPrevailingComdats.insert(GV->getComdat());
976 cast<GlobalObject>(GV)->setComdat(nullptr);
977 }
978
979 // Set the 'local' flag based on the linker resolution for this symbol.
980 if (R.FinalDefinitionInLinkageUnit) {
981 GV->setDSOLocal(true);
982 if (GV->hasDLLImportStorageClass())
983 GV->setDLLStorageClass(GlobalValue::DLLStorageClassTypes::
984 DefaultStorageClass);
985 }
986 } else if (auto *AS =
988 // Collect non-prevailing symbols.
989 if (!R.Prevailing)
990 NonPrevailingAsmSymbols.insert(AS->first);
991 } else {
992 llvm_unreachable("unknown symbol type");
993 }
994
995 // Common resolution: collect the maximum size/alignment over all commons.
996 // We also record if we see an instance of a common as prevailing, so that
997 // if none is prevailing we can ignore it later.
998 if (Sym.isCommon()) {
999 // FIXME: We should figure out what to do about commons defined by asm.
1000 // For now they aren't reported correctly by ModuleSymbolTable.
1001 auto &CommonRes = RegularLTO.Commons[std::string(Sym.getIRName())];
1002 CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize());
1003 if (uint32_t SymAlignValue = Sym.getCommonAlignment()) {
1004 CommonRes.Alignment =
1005 std::max(Align(SymAlignValue), CommonRes.Alignment);
1006 }
1007 CommonRes.Prevailing |= R.Prevailing;
1008 }
1009 }
1010
1011 if (!M.getComdatSymbolTable().empty())
1012 for (GlobalValue &GV : M.global_values())
1013 handleNonPrevailingComdat(GV, NonPrevailingComdats);
1014
1015 // Prepend ".lto_discard <sym>, <sym>*" directive to each module inline asm
1016 // block.
1017 if (!M.getModuleInlineAsm().empty()) {
1018 std::string NewIA = ".lto_discard";
1019 if (!NonPrevailingAsmSymbols.empty()) {
1020 // Don't dicard a symbol if there is a live .symver for it.
1022 M, [&](StringRef Name, StringRef Alias) {
1023 if (!NonPrevailingAsmSymbols.count(Alias))
1024 NonPrevailingAsmSymbols.erase(Name);
1025 });
1026 NewIA += " " + llvm::join(NonPrevailingAsmSymbols, ", ");
1027 }
1028 NewIA += "\n";
1029 M.setModuleInlineAsm(NewIA + M.getModuleInlineAsm());
1030 }
1031
1032 assert(MsymI == MsymE);
1033 return std::make_pair(std::move(Mod), Res);
1034}
1035
1036Error LTO::linkRegularLTO(RegularLTOState::AddedModule Mod,
1037 bool LivenessFromIndex) {
1038 llvm::TimeTraceScope timeScope("LTO link regular LTO");
1039 std::vector<GlobalValue *> Keep;
1040 for (GlobalValue *GV : Mod.Keep) {
1041 if (LivenessFromIndex && !ThinLTO.CombinedIndex.isGUIDLive(GV->getGUID())) {
1042 if (Function *F = dyn_cast<Function>(GV)) {
1043 if (DiagnosticOutputFile) {
1044 if (Error Err = F->materialize())
1045 return Err;
1046 OptimizationRemarkEmitter ORE(F, nullptr);
1047 ORE.emit(OptimizationRemark(DEBUG_TYPE, "deadfunction", F)
1048 << ore::NV("Function", F)
1049 << " not added to the combined module ");
1050 }
1051 }
1052 continue;
1053 }
1054
1055 if (!GV->hasAvailableExternallyLinkage()) {
1056 Keep.push_back(GV);
1057 continue;
1058 }
1059
1060 // Only link available_externally definitions if we don't already have a
1061 // definition.
1062 GlobalValue *CombinedGV =
1063 RegularLTO.CombinedModule->getNamedValue(GV->getName());
1064 if (CombinedGV && !CombinedGV->isDeclaration())
1065 continue;
1066
1067 Keep.push_back(GV);
1068 }
1069
1070 return RegularLTO.Mover->move(std::move(Mod.M), Keep, nullptr,
1071 /* IsPerformingImport */ false);
1072}
1073
1074// Add a ThinLTO module to the link.
1075Expected<ArrayRef<SymbolResolution>>
1076LTO::addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
1078 llvm::TimeTraceScope timeScope("LTO add thin LTO");
1079 ArrayRef<SymbolResolution> ResTmp = Res;
1080 for (const InputFile::Symbol &Sym : Syms) {
1081 assert(!ResTmp.empty());
1082 const SymbolResolution &R = ResTmp.consume_front();
1083
1084 if (!Sym.getIRName().empty()) {
1086 GlobalValue::getGlobalIdentifier(Sym.getIRName(),
1088 if (R.Prevailing)
1089 ThinLTO.setPrevailingModuleForGUID(GUID, BM.getModuleIdentifier());
1090 }
1091 }
1092
1093 if (Error Err =
1094 BM.readSummary(ThinLTO.CombinedIndex, BM.getModuleIdentifier(),
1095 [&](GlobalValue::GUID GUID) {
1096 return ThinLTO.isPrevailingModuleForGUID(
1097 GUID, BM.getModuleIdentifier());
1098 }))
1099 return Err;
1100 LLVM_DEBUG(dbgs() << "Module " << BM.getModuleIdentifier() << "\n");
1101
1102 for (const InputFile::Symbol &Sym : Syms) {
1103 assert(!Res.empty());
1104 const SymbolResolution &R = Res.consume_front();
1105
1106 if (!Sym.getIRName().empty()) {
1108 GlobalValue::getGlobalIdentifier(Sym.getIRName(),
1110 if (R.Prevailing) {
1111 assert(
1112 ThinLTO.isPrevailingModuleForGUID(GUID, BM.getModuleIdentifier()));
1113
1114 // For linker redefined symbols (via --wrap or --defsym) we want to
1115 // switch the linkage to `weak` to prevent IPOs from happening.
1116 // Find the summary in the module for this very GV and record the new
1117 // linkage so that we can switch it when we import the GV.
1118 if (R.LinkerRedefined)
1119 if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
1120 GUID, BM.getModuleIdentifier()))
1121 S->setLinkage(GlobalValue::WeakAnyLinkage);
1122 }
1123
1124 // If the linker resolved the symbol to a local definition then mark it
1125 // as local in the summary for the module we are adding.
1126 if (R.FinalDefinitionInLinkageUnit) {
1127 if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
1128 GUID, BM.getModuleIdentifier())) {
1129 S->setDSOLocal(true);
1130 }
1131 }
1132 }
1133 }
1134
1135 if (!ThinLTO.ModuleMap.insert({BM.getModuleIdentifier(), BM}).second)
1137 "Expected at most one ThinLTO module per bitcode file",
1139
1140 if (!Conf.ThinLTOModulesToCompile.empty()) {
1141 if (!ThinLTO.ModulesToCompile)
1142 ThinLTO.ModulesToCompile = ModuleMapType();
1143 // This is a fuzzy name matching where only modules with name containing the
1144 // specified switch values are going to be compiled.
1145 for (const std::string &Name : Conf.ThinLTOModulesToCompile) {
1146 if (BM.getModuleIdentifier().contains(Name)) {
1147 ThinLTO.ModulesToCompile->insert({BM.getModuleIdentifier(), BM});
1148 LLVM_DEBUG(dbgs() << "[ThinLTO] Selecting " << BM.getModuleIdentifier()
1149 << " to compile\n");
1150 }
1151 }
1152 }
1153
1154 return Res;
1155}
1156
1157unsigned LTO::getMaxTasks() const {
1158 CalledGetMaxTasks = true;
1159 auto ModuleCount = ThinLTO.ModulesToCompile ? ThinLTO.ModulesToCompile->size()
1160 : ThinLTO.ModuleMap.size();
1161 return RegularLTO.ParallelCodeGenParallelismLevel + ModuleCount;
1162}
1163
1164// If only some of the modules were split, we cannot correctly handle
1165// code that contains type tests or type checked loads.
1166Error LTO::checkPartiallySplit() {
1167 if (!ThinLTO.CombinedIndex.partiallySplitLTOUnits())
1168 return Error::success();
1169
1170 const Module *Combined = RegularLTO.CombinedModule.get();
1171 Function *TypeTestFunc =
1172 Intrinsic::getDeclarationIfExists(Combined, Intrinsic::type_test);
1173 Function *TypeCheckedLoadFunc =
1174 Intrinsic::getDeclarationIfExists(Combined, Intrinsic::type_checked_load);
1175 Function *TypeCheckedLoadRelativeFunc = Intrinsic::getDeclarationIfExists(
1176 Combined, Intrinsic::type_checked_load_relative);
1177
1178 // First check if there are type tests / type checked loads in the
1179 // merged regular LTO module IR.
1180 if ((TypeTestFunc && !TypeTestFunc->use_empty()) ||
1181 (TypeCheckedLoadFunc && !TypeCheckedLoadFunc->use_empty()) ||
1182 (TypeCheckedLoadRelativeFunc &&
1183 !TypeCheckedLoadRelativeFunc->use_empty()))
1185 "inconsistent LTO Unit splitting (recompile with -fsplit-lto-unit)",
1187
1188 // Otherwise check if there are any recorded in the combined summary from the
1189 // ThinLTO modules.
1190 for (auto &P : ThinLTO.CombinedIndex) {
1191 for (auto &S : P.second.getSummaryList()) {
1192 auto *FS = dyn_cast<FunctionSummary>(S.get());
1193 if (!FS)
1194 continue;
1195 if (!FS->type_test_assume_vcalls().empty() ||
1196 !FS->type_checked_load_vcalls().empty() ||
1197 !FS->type_test_assume_const_vcalls().empty() ||
1198 !FS->type_checked_load_const_vcalls().empty() ||
1199 !FS->type_tests().empty())
1201 "inconsistent LTO Unit splitting (recompile with -fsplit-lto-unit)",
1203 }
1204 }
1205 return Error::success();
1206}
1207
1209 // Compute "dead" symbols, we don't want to import/export these!
1210 DenseSet<GlobalValue::GUID> GUIDPreservedSymbols;
1211 DenseMap<GlobalValue::GUID, PrevailingType> GUIDPrevailingResolutions;
1212 for (auto &Res : *GlobalResolutions) {
1213 // Normally resolution have IR name of symbol. We can do nothing here
1214 // otherwise. See comments in GlobalResolution struct for more details.
1215 if (Res.second.IRName.empty())
1216 continue;
1217
1219 GlobalValue::dropLLVMManglingEscape(Res.second.IRName));
1220
1221 if (Res.second.VisibleOutsideSummary && Res.second.Prevailing)
1222 GUIDPreservedSymbols.insert(GUID);
1223
1224 if (Res.second.ExportDynamic)
1225 DynamicExportSymbols.insert(GUID);
1226
1227 GUIDPrevailingResolutions[GUID] =
1228 Res.second.Prevailing ? PrevailingType::Yes : PrevailingType::No;
1229 }
1230
1231 auto isPrevailing = [&](GlobalValue::GUID G) {
1232 auto It = GUIDPrevailingResolutions.find(G);
1233 if (It == GUIDPrevailingResolutions.end())
1235 return It->second;
1236 };
1237 computeDeadSymbolsWithConstProp(ThinLTO.CombinedIndex, GUIDPreservedSymbols,
1238 isPrevailing, Conf.OptLevel > 0);
1239
1240 // Setup output file to emit statistics.
1241 auto StatsFileOrErr = setupStatsFile(Conf.StatsFile);
1242 if (!StatsFileOrErr)
1243 return StatsFileOrErr.takeError();
1244 std::unique_ptr<ToolOutputFile> StatsFile = std::move(StatsFileOrErr.get());
1245
1246 // TODO: Ideally this would be controlled automatically by detecting that we
1247 // are linking with an allocator that supports these interfaces, rather than
1248 // an internal option (which would still be needed for tests, however). For
1249 // example, if the library exported a symbol like __malloc_hot_cold the linker
1250 // could recognize that and set a flag in the lto::Config.
1252 ThinLTO.CombinedIndex.setWithSupportsHotColdNew();
1253
1254 Error Result = runRegularLTO(AddStream);
1255 if (!Result)
1256 // This will reset the GlobalResolutions optional once done with it to
1257 // reduce peak memory before importing.
1258 Result = runThinLTO(AddStream, Cache, GUIDPreservedSymbols);
1259
1260 if (StatsFile)
1261 PrintStatisticsJSON(StatsFile->os());
1262
1263 return Result;
1264}
1265
1266Error LTO::runRegularLTO(AddStreamFn AddStream) {
1267 llvm::TimeTraceScope timeScope("Run regular LTO");
1268 LLVMContext &CombinedCtx = RegularLTO.CombinedModule->getContext();
1269 // Setup optimization remarks.
1270 auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
1271 CombinedCtx, Conf.RemarksFilename, Conf.RemarksPasses, Conf.RemarksFormat,
1273 LLVM_DEBUG(dbgs() << "Running regular LTO\n");
1274 if (!DiagFileOrErr)
1275 return DiagFileOrErr.takeError();
1276 DiagnosticOutputFile = std::move(*DiagFileOrErr);
1277
1278 // Finalize linking of regular LTO modules containing summaries now that
1279 // we have computed liveness information.
1280 {
1281 llvm::TimeTraceScope timeScope("Link regular LTO");
1282 for (auto &M : RegularLTO.ModsWithSummaries)
1283 if (Error Err = linkRegularLTO(std::move(M), /*LivenessFromIndex=*/true))
1284 return Err;
1285 }
1286
1287 // Ensure we don't have inconsistently split LTO units with type tests.
1288 // FIXME: this checks both LTO and ThinLTO. It happens to work as we take
1289 // this path both cases but eventually this should be split into two and
1290 // do the ThinLTO checks in `runThinLTO`.
1291 if (Error Err = checkPartiallySplit())
1292 return Err;
1293
1294 // Make sure commons have the right size/alignment: we kept the largest from
1295 // all the prevailing when adding the inputs, and we apply it here.
1296 const DataLayout &DL = RegularLTO.CombinedModule->getDataLayout();
1297 for (auto &I : RegularLTO.Commons) {
1298 if (!I.second.Prevailing)
1299 // Don't do anything if no instance of this common was prevailing.
1300 continue;
1301 GlobalVariable *OldGV = RegularLTO.CombinedModule->getNamedGlobal(I.first);
1302 if (OldGV && DL.getTypeAllocSize(OldGV->getValueType()) == I.second.Size) {
1303 // Don't create a new global if the type is already correct, just make
1304 // sure the alignment is correct.
1305 OldGV->setAlignment(I.second.Alignment);
1306 continue;
1307 }
1308 ArrayType *Ty =
1309 ArrayType::get(Type::getInt8Ty(RegularLTO.Ctx), I.second.Size);
1310 auto *GV = new GlobalVariable(*RegularLTO.CombinedModule, Ty, false,
1313 GV->setAlignment(I.second.Alignment);
1314 if (OldGV) {
1315 OldGV->replaceAllUsesWith(GV);
1316 GV->takeName(OldGV);
1317 OldGV->eraseFromParent();
1318 } else {
1319 GV->setName(I.first);
1320 }
1321 }
1322
1323 bool WholeProgramVisibilityEnabledInLTO =
1324 Conf.HasWholeProgramVisibility &&
1325 // If validation is enabled, upgrade visibility only when all vtables
1326 // have typeinfos.
1327 (!Conf.ValidateAllVtablesHaveTypeInfos || Conf.AllVtablesHaveTypeInfos);
1328
1329 // This returns true when the name is local or not defined. Locals are
1330 // expected to be handled separately.
1331 auto IsVisibleToRegularObj = [&](StringRef name) {
1332 auto It = GlobalResolutions->find(name);
1333 return (It == GlobalResolutions->end() ||
1334 It->second.VisibleOutsideSummary || !It->second.Prevailing);
1335 };
1336
1337 // If allowed, upgrade public vcall visibility metadata to linkage unit
1338 // visibility before whole program devirtualization in the optimizer.
1340 *RegularLTO.CombinedModule, WholeProgramVisibilityEnabledInLTO,
1341 DynamicExportSymbols, Conf.ValidateAllVtablesHaveTypeInfos,
1342 IsVisibleToRegularObj);
1343 updatePublicTypeTestCalls(*RegularLTO.CombinedModule,
1344 WholeProgramVisibilityEnabledInLTO);
1345
1346 if (Conf.PreOptModuleHook &&
1347 !Conf.PreOptModuleHook(0, *RegularLTO.CombinedModule))
1348 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
1349
1350 if (!Conf.CodeGenOnly) {
1351 for (const auto &R : *GlobalResolutions) {
1352 GlobalValue *GV =
1353 RegularLTO.CombinedModule->getNamedValue(R.second.IRName);
1354 if (!R.second.isPrevailingIRSymbol())
1355 continue;
1356 if (R.second.Partition != 0 &&
1357 R.second.Partition != GlobalResolution::External)
1358 continue;
1359
1360 // Ignore symbols defined in other partitions.
1361 // Also skip declarations, which are not allowed to have internal linkage.
1362 if (!GV || GV->hasLocalLinkage() || GV->isDeclaration())
1363 continue;
1364
1365 // Symbols that are marked DLLImport or DLLExport should not be
1366 // internalized, as they are either externally visible or referencing
1367 // external symbols. Symbols that have AvailableExternally or Appending
1368 // linkage might be used by future passes and should be kept as is.
1369 // These linkages are seen in Unified regular LTO, because the process
1370 // of creating split LTO units introduces symbols with that linkage into
1371 // one of the created modules. Normally, only the ThinLTO backend would
1372 // compile this module, but Unified Regular LTO processes both
1373 // modules created by the splitting process as regular LTO modules.
1374 if ((LTOMode == LTOKind::LTOK_UnifiedRegular) &&
1377 continue;
1378
1379 GV->setUnnamedAddr(R.second.UnnamedAddr ? GlobalValue::UnnamedAddr::Global
1381 if (EnableLTOInternalization && R.second.Partition == 0)
1383 }
1384
1385 if (Conf.PostInternalizeModuleHook &&
1386 !Conf.PostInternalizeModuleHook(0, *RegularLTO.CombinedModule))
1387 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
1388 }
1389
1390 if (!RegularLTO.EmptyCombinedModule || Conf.AlwaysEmitRegularLTOObj) {
1391 if (Error Err =
1392 backend(Conf, AddStream, RegularLTO.ParallelCodeGenParallelismLevel,
1393 *RegularLTO.CombinedModule, ThinLTO.CombinedIndex))
1394 return Err;
1395 }
1396
1397 return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
1398}
1399
1401 RTLIB::RuntimeLibcallsInfo Libcalls(TT);
1402 SmallVector<const char *> LibcallSymbols;
1403 ArrayRef<RTLIB::LibcallImpl> LibcallImpls = Libcalls.getLibcallImpls();
1404 LibcallSymbols.reserve(LibcallImpls.size());
1405
1406 for (RTLIB::LibcallImpl Impl : LibcallImpls) {
1407 if (Impl != RTLIB::Unsupported)
1408 LibcallSymbols.push_back(Libcalls.getLibcallImplName(Impl).data());
1409 }
1410
1411 return LibcallSymbols;
1412}
1413
1415 const FunctionImporter::ImportMapTy &ImportList, llvm::StringRef ModulePath,
1416 const std::string &NewModulePath) const {
1417 return emitFiles(ImportList, ModulePath, NewModulePath,
1418 NewModulePath + ".thinlto.bc",
1419 /*ImportsFiles=*/std::nullopt);
1420}
1421
1423 const FunctionImporter::ImportMapTy &ImportList, llvm::StringRef ModulePath,
1424 const std::string &NewModulePath, StringRef SummaryPath,
1425 std::optional<std::reference_wrapper<ImportsFilesContainer>> ImportsFiles)
1426 const {
1427 ModuleToSummariesForIndexTy ModuleToSummariesForIndex;
1428 GVSummaryPtrSet DeclarationSummaries;
1429
1430 std::error_code EC;
1432 ImportList, ModuleToSummariesForIndex,
1433 DeclarationSummaries);
1434
1435 raw_fd_ostream OS(SummaryPath, EC, sys::fs::OpenFlags::OF_None);
1436 if (EC)
1437 return createFileError("cannot open " + Twine(SummaryPath), EC);
1438
1439 writeIndexToFile(CombinedIndex, OS, &ModuleToSummariesForIndex,
1440 &DeclarationSummaries);
1441
1443 Error ImportsFilesError = EmitImportsFiles(
1444 ModulePath, NewModulePath + ".imports", ModuleToSummariesForIndex);
1445 if (ImportsFilesError)
1446 return ImportsFilesError;
1447 }
1448
1449 // Optionally, store the imports files.
1450 if (ImportsFiles)
1452 ModulePath, ModuleToSummariesForIndex,
1453 [&](StringRef M) { ImportsFiles->get().push_back(M.str()); });
1454
1455 return Error::success();
1456}
1457
1458namespace {
1459/// Base class for ThinLTO backends that perform code generation and insert the
1460/// generated files back into the link.
1461class CGThinBackend : public ThinBackendProc {
1462protected:
1463 AddStreamFn AddStream;
1464 DenseSet<GlobalValue::GUID> CfiFunctionDefs;
1465 DenseSet<GlobalValue::GUID> CfiFunctionDecls;
1466 bool ShouldEmitIndexFiles;
1467
1468public:
1469 CGThinBackend(
1470 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1471 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1472 AddStreamFn AddStream, lto::IndexWriteCallback OnWrite,
1473 bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles,
1474 ThreadPoolStrategy ThinLTOParallelism)
1475 : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries,
1476 OnWrite, ShouldEmitImportsFiles, ThinLTOParallelism),
1477 AddStream(std::move(AddStream)),
1478 ShouldEmitIndexFiles(ShouldEmitIndexFiles) {
1479 auto &Defs = CombinedIndex.cfiFunctionDefs();
1480 CfiFunctionDefs.insert_range(Defs.guids());
1481 auto &Decls = CombinedIndex.cfiFunctionDecls();
1482 CfiFunctionDecls.insert_range(Decls.guids());
1483 }
1484};
1485
1486/// This backend performs code generation by scheduling a job to run on
1487/// an in-process thread when invoked for each task.
1488class InProcessThinBackend : public CGThinBackend {
1489protected:
1490 FileCache Cache;
1491
1492public:
1493 InProcessThinBackend(
1494 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1495 ThreadPoolStrategy ThinLTOParallelism,
1496 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1497 AddStreamFn AddStream, FileCache Cache, lto::IndexWriteCallback OnWrite,
1498 bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles)
1499 : CGThinBackend(Conf, CombinedIndex, ModuleToDefinedGVSummaries,
1500 AddStream, OnWrite, ShouldEmitIndexFiles,
1501 ShouldEmitImportsFiles, ThinLTOParallelism),
1502 Cache(std::move(Cache)) {}
1503
1504 virtual Error runThinLTOBackendThread(
1505 AddStreamFn AddStream, FileCache Cache, unsigned Task, BitcodeModule BM,
1506 ModuleSummaryIndex &CombinedIndex,
1507 const FunctionImporter::ImportMapTy &ImportList,
1508 const FunctionImporter::ExportSetTy &ExportList,
1509 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1510 const GVSummaryMapTy &DefinedGlobals,
1511 MapVector<StringRef, BitcodeModule> &ModuleMap) {
1512 auto ModuleID = BM.getModuleIdentifier();
1513 llvm::TimeTraceScope timeScope("Run ThinLTO backend thread (in-process)",
1514 ModuleID);
1515 auto RunThinBackend = [&](AddStreamFn AddStream) {
1516 LTOLLVMContext BackendContext(Conf);
1517 Expected<std::unique_ptr<Module>> MOrErr = BM.parseModule(BackendContext);
1518 if (!MOrErr)
1519 return MOrErr.takeError();
1520
1521 return thinBackend(Conf, Task, AddStream, **MOrErr, CombinedIndex,
1522 ImportList, DefinedGlobals, &ModuleMap,
1523 Conf.CodeGenOnly);
1524 };
1525 if (ShouldEmitIndexFiles) {
1526 if (auto E = emitFiles(ImportList, ModuleID, ModuleID.str()))
1527 return E;
1528 }
1529
1530 if (!Cache.isValid() || !CombinedIndex.modulePaths().count(ModuleID) ||
1531 all_of(CombinedIndex.getModuleHash(ModuleID),
1532 [](uint32_t V) { return V == 0; }))
1533 // Cache disabled or no entry for this module in the combined index or
1534 // no module hash.
1535 return RunThinBackend(AddStream);
1536
1537 // The module may be cached, this helps handling it.
1538 std::string Key = computeLTOCacheKey(
1539 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1540 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1541 Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task, Key, ModuleID);
1542 if (Error Err = CacheAddStreamOrErr.takeError())
1543 return Err;
1544 AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
1545 if (CacheAddStream)
1546 return RunThinBackend(CacheAddStream);
1547
1548 return Error::success();
1549 }
1550
1551 Error start(
1552 unsigned Task, BitcodeModule BM,
1553 const FunctionImporter::ImportMapTy &ImportList,
1554 const FunctionImporter::ExportSetTy &ExportList,
1555 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1556 MapVector<StringRef, BitcodeModule> &ModuleMap) override {
1557 StringRef ModulePath = BM.getModuleIdentifier();
1558 assert(ModuleToDefinedGVSummaries.count(ModulePath));
1559 const GVSummaryMapTy &DefinedGlobals =
1560 ModuleToDefinedGVSummaries.find(ModulePath)->second;
1561 BackendThreadPool.async(
1562 [=](BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
1563 const FunctionImporter::ImportMapTy &ImportList,
1564 const FunctionImporter::ExportSetTy &ExportList,
1565 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>
1566 &ResolvedODR,
1567 const GVSummaryMapTy &DefinedGlobals,
1568 MapVector<StringRef, BitcodeModule> &ModuleMap) {
1569 if (LLVM_ENABLE_THREADS && Conf.TimeTraceEnabled)
1571 "thin backend");
1572 Error E = runThinLTOBackendThread(
1573 AddStream, Cache, Task, BM, CombinedIndex, ImportList, ExportList,
1574 ResolvedODR, DefinedGlobals, ModuleMap);
1575 if (E) {
1576 std::unique_lock<std::mutex> L(ErrMu);
1577 if (Err)
1578 Err = joinErrors(std::move(*Err), std::move(E));
1579 else
1580 Err = std::move(E);
1581 }
1582 if (LLVM_ENABLE_THREADS && Conf.TimeTraceEnabled)
1584 },
1585 BM, std::ref(CombinedIndex), std::ref(ImportList), std::ref(ExportList),
1586 std::ref(ResolvedODR), std::ref(DefinedGlobals), std::ref(ModuleMap));
1587
1588 if (OnWrite)
1589 OnWrite(std::string(ModulePath));
1590 return Error::success();
1591 }
1592};
1593
1594/// This backend is utilized in the first round of a two-codegen round process.
1595/// It first saves optimized bitcode files to disk before the codegen process
1596/// begins. After codegen, it stores the resulting object files in a scratch
1597/// buffer. Note the codegen data stored in the scratch buffer will be extracted
1598/// and merged in the subsequent step.
1599class FirstRoundThinBackend : public InProcessThinBackend {
1600 AddStreamFn IRAddStream;
1601 FileCache IRCache;
1602
1603public:
1604 FirstRoundThinBackend(
1605 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1606 ThreadPoolStrategy ThinLTOParallelism,
1607 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1608 AddStreamFn CGAddStream, FileCache CGCache, AddStreamFn IRAddStream,
1609 FileCache IRCache)
1610 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
1611 ModuleToDefinedGVSummaries, std::move(CGAddStream),
1612 std::move(CGCache), /*OnWrite=*/nullptr,
1613 /*ShouldEmitIndexFiles=*/false,
1614 /*ShouldEmitImportsFiles=*/false),
1615 IRAddStream(std::move(IRAddStream)), IRCache(std::move(IRCache)) {}
1616
1617 Error runThinLTOBackendThread(
1618 AddStreamFn CGAddStream, FileCache CGCache, unsigned Task,
1619 BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
1620 const FunctionImporter::ImportMapTy &ImportList,
1621 const FunctionImporter::ExportSetTy &ExportList,
1622 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1623 const GVSummaryMapTy &DefinedGlobals,
1624 MapVector<StringRef, BitcodeModule> &ModuleMap) override {
1625 auto ModuleID = BM.getModuleIdentifier();
1626 llvm::TimeTraceScope timeScope("Run ThinLTO backend thread (first round)",
1627 ModuleID);
1628 auto RunThinBackend = [&](AddStreamFn CGAddStream,
1629 AddStreamFn IRAddStream) {
1630 LTOLLVMContext BackendContext(Conf);
1631 Expected<std::unique_ptr<Module>> MOrErr = BM.parseModule(BackendContext);
1632 if (!MOrErr)
1633 return MOrErr.takeError();
1634
1635 return thinBackend(Conf, Task, CGAddStream, **MOrErr, CombinedIndex,
1636 ImportList, DefinedGlobals, &ModuleMap,
1637 Conf.CodeGenOnly, IRAddStream);
1638 };
1639 // Like InProcessThinBackend, we produce index files as needed for
1640 // FirstRoundThinBackend. However, these files are not generated for
1641 // SecondRoundThinBackend.
1642 if (ShouldEmitIndexFiles) {
1643 if (auto E = emitFiles(ImportList, ModuleID, ModuleID.str()))
1644 return E;
1645 }
1646
1647 assert((CGCache.isValid() == IRCache.isValid()) &&
1648 "Both caches for CG and IR should have matching availability");
1649 if (!CGCache.isValid() || !CombinedIndex.modulePaths().count(ModuleID) ||
1650 all_of(CombinedIndex.getModuleHash(ModuleID),
1651 [](uint32_t V) { return V == 0; }))
1652 // Cache disabled or no entry for this module in the combined index or
1653 // no module hash.
1654 return RunThinBackend(CGAddStream, IRAddStream);
1655
1656 // Get CGKey for caching object in CGCache.
1657 std::string CGKey = computeLTOCacheKey(
1658 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1659 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1660 Expected<AddStreamFn> CacheCGAddStreamOrErr =
1661 CGCache(Task, CGKey, ModuleID);
1662 if (Error Err = CacheCGAddStreamOrErr.takeError())
1663 return Err;
1664 AddStreamFn &CacheCGAddStream = *CacheCGAddStreamOrErr;
1665
1666 // Get IRKey for caching (optimized) IR in IRCache with an extra ID.
1667 std::string IRKey = recomputeLTOCacheKey(CGKey, /*ExtraID=*/"IR");
1668 Expected<AddStreamFn> CacheIRAddStreamOrErr =
1669 IRCache(Task, IRKey, ModuleID);
1670 if (Error Err = CacheIRAddStreamOrErr.takeError())
1671 return Err;
1672 AddStreamFn &CacheIRAddStream = *CacheIRAddStreamOrErr;
1673
1674 // Ideally, both CG and IR caching should be synchronized. However, in
1675 // practice, their availability may differ due to different expiration
1676 // times. Therefore, if either cache is missing, the backend process is
1677 // triggered.
1678 if (CacheCGAddStream || CacheIRAddStream) {
1679 LLVM_DEBUG(dbgs() << "[FirstRound] Cache Miss for "
1680 << BM.getModuleIdentifier() << "\n");
1681 return RunThinBackend(CacheCGAddStream ? CacheCGAddStream : CGAddStream,
1682 CacheIRAddStream ? CacheIRAddStream : IRAddStream);
1683 }
1684
1685 return Error::success();
1686 }
1687};
1688
1689/// This backend operates in the second round of a two-codegen round process.
1690/// It starts by reading the optimized bitcode files that were saved during the
1691/// first round. The backend then executes the codegen only to further optimize
1692/// the code, utilizing the codegen data merged from the first round. Finally,
1693/// it writes the resulting object files as usual.
1694class SecondRoundThinBackend : public InProcessThinBackend {
1695 std::unique_ptr<SmallVector<StringRef>> IRFiles;
1696 stable_hash CombinedCGDataHash;
1697
1698public:
1699 SecondRoundThinBackend(
1700 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1701 ThreadPoolStrategy ThinLTOParallelism,
1702 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1703 AddStreamFn AddStream, FileCache Cache,
1704 std::unique_ptr<SmallVector<StringRef>> IRFiles,
1705 stable_hash CombinedCGDataHash)
1706 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
1707 ModuleToDefinedGVSummaries, std::move(AddStream),
1708 std::move(Cache),
1709 /*OnWrite=*/nullptr,
1710 /*ShouldEmitIndexFiles=*/false,
1711 /*ShouldEmitImportsFiles=*/false),
1712 IRFiles(std::move(IRFiles)), CombinedCGDataHash(CombinedCGDataHash) {}
1713
1714 Error runThinLTOBackendThread(
1715 AddStreamFn AddStream, FileCache Cache, unsigned Task, BitcodeModule BM,
1716 ModuleSummaryIndex &CombinedIndex,
1717 const FunctionImporter::ImportMapTy &ImportList,
1718 const FunctionImporter::ExportSetTy &ExportList,
1719 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1720 const GVSummaryMapTy &DefinedGlobals,
1721 MapVector<StringRef, BitcodeModule> &ModuleMap) override {
1722 auto ModuleID = BM.getModuleIdentifier();
1723 llvm::TimeTraceScope timeScope("Run ThinLTO backend thread (second round)",
1724 ModuleID);
1725 auto RunThinBackend = [&](AddStreamFn AddStream) {
1726 LTOLLVMContext BackendContext(Conf);
1727 std::unique_ptr<Module> LoadedModule =
1728 cgdata::loadModuleForTwoRounds(BM, Task, BackendContext, *IRFiles);
1729
1730 return thinBackend(Conf, Task, AddStream, *LoadedModule, CombinedIndex,
1731 ImportList, DefinedGlobals, &ModuleMap,
1732 /*CodeGenOnly=*/true);
1733 };
1734 if (!Cache.isValid() || !CombinedIndex.modulePaths().count(ModuleID) ||
1735 all_of(CombinedIndex.getModuleHash(ModuleID),
1736 [](uint32_t V) { return V == 0; }))
1737 // Cache disabled or no entry for this module in the combined index or
1738 // no module hash.
1739 return RunThinBackend(AddStream);
1740
1741 // Get Key for caching the final object file in Cache with the combined
1742 // CGData hash.
1743 std::string Key = computeLTOCacheKey(
1744 Conf, CombinedIndex, ModuleID, ImportList, ExportList, ResolvedODR,
1745 DefinedGlobals, CfiFunctionDefs, CfiFunctionDecls);
1747 /*ExtraID=*/std::to_string(CombinedCGDataHash));
1748 Expected<AddStreamFn> CacheAddStreamOrErr = Cache(Task, Key, ModuleID);
1749 if (Error Err = CacheAddStreamOrErr.takeError())
1750 return Err;
1751 AddStreamFn &CacheAddStream = *CacheAddStreamOrErr;
1752
1753 if (CacheAddStream) {
1754 LLVM_DEBUG(dbgs() << "[SecondRound] Cache Miss for "
1755 << BM.getModuleIdentifier() << "\n");
1756 return RunThinBackend(CacheAddStream);
1757 }
1758
1759 return Error::success();
1760 }
1761};
1762} // end anonymous namespace
1763
1766 bool ShouldEmitIndexFiles,
1767 bool ShouldEmitImportsFiles) {
1768 auto Func =
1769 [=](const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1770 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1771 AddStreamFn AddStream, FileCache Cache) {
1772 return std::make_unique<InProcessThinBackend>(
1773 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
1774 AddStream, Cache, OnWrite, ShouldEmitIndexFiles,
1775 ShouldEmitImportsFiles);
1776 };
1777 return ThinBackend(Func, Parallelism);
1778}
1779
1781 if (!TheTriple.isOSDarwin())
1782 return "";
1783 if (TheTriple.getArch() == Triple::x86_64)
1784 return "core2";
1785 if (TheTriple.getArch() == Triple::x86)
1786 return "yonah";
1787 if (TheTriple.isArm64e())
1788 return "apple-a12";
1789 if (TheTriple.getArch() == Triple::aarch64 ||
1790 TheTriple.getArch() == Triple::aarch64_32)
1791 return "cyclone";
1792 return "";
1793}
1794
1795// Given the original \p Path to an output file, replace any path
1796// prefix matching \p OldPrefix with \p NewPrefix. Also, create the
1797// resulting directory if it does not yet exist.
1799 StringRef NewPrefix) {
1800 if (OldPrefix.empty() && NewPrefix.empty())
1801 return std::string(Path);
1802 SmallString<128> NewPath(Path);
1803 llvm::sys::path::replace_path_prefix(NewPath, OldPrefix, NewPrefix);
1804 StringRef ParentPath = llvm::sys::path::parent_path(NewPath.str());
1805 if (!ParentPath.empty()) {
1806 // Make sure the new directory exists, creating it if necessary.
1807 if (std::error_code EC = llvm::sys::fs::create_directories(ParentPath))
1808 llvm::errs() << "warning: could not create directory '" << ParentPath
1809 << "': " << EC.message() << '\n';
1810 }
1811 return std::string(NewPath);
1812}
1813
1814namespace {
1815class WriteIndexesThinBackend : public ThinBackendProc {
1816 std::string OldPrefix, NewPrefix, NativeObjectPrefix;
1817 raw_fd_ostream *LinkedObjectsFile;
1818
1819public:
1820 WriteIndexesThinBackend(
1821 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1822 ThreadPoolStrategy ThinLTOParallelism,
1823 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1824 std::string OldPrefix, std::string NewPrefix,
1825 std::string NativeObjectPrefix, bool ShouldEmitImportsFiles,
1826 raw_fd_ostream *LinkedObjectsFile, lto::IndexWriteCallback OnWrite)
1827 : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries,
1828 OnWrite, ShouldEmitImportsFiles, ThinLTOParallelism),
1829 OldPrefix(OldPrefix), NewPrefix(NewPrefix),
1830 NativeObjectPrefix(NativeObjectPrefix),
1831 LinkedObjectsFile(LinkedObjectsFile) {}
1832
1833 Error start(
1834 unsigned Task, BitcodeModule BM,
1835 const FunctionImporter::ImportMapTy &ImportList,
1836 const FunctionImporter::ExportSetTy &ExportList,
1837 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
1838 MapVector<StringRef, BitcodeModule> &ModuleMap) override {
1839 StringRef ModulePath = BM.getModuleIdentifier();
1840
1841 // The contents of this file may be used as input to a native link, and must
1842 // therefore contain the processed modules in a determinstic order that
1843 // match the order they are provided on the command line. For that reason,
1844 // we cannot include this in the asynchronously executed lambda below.
1845 if (LinkedObjectsFile) {
1846 std::string ObjectPrefix =
1847 NativeObjectPrefix.empty() ? NewPrefix : NativeObjectPrefix;
1848 std::string LinkedObjectsFilePath =
1849 getThinLTOOutputFile(ModulePath, OldPrefix, ObjectPrefix);
1850 *LinkedObjectsFile << LinkedObjectsFilePath << '\n';
1851 }
1852
1853 BackendThreadPool.async(
1854 [this](const StringRef ModulePath,
1855 const FunctionImporter::ImportMapTy &ImportList,
1856 const std::string &OldPrefix, const std::string &NewPrefix) {
1857 std::string NewModulePath =
1858 getThinLTOOutputFile(ModulePath, OldPrefix, NewPrefix);
1859 auto E = emitFiles(ImportList, ModulePath, NewModulePath);
1860 if (E) {
1861 std::unique_lock<std::mutex> L(ErrMu);
1862 if (Err)
1863 Err = joinErrors(std::move(*Err), std::move(E));
1864 else
1865 Err = std::move(E);
1866 return;
1867 }
1868 },
1869 ModulePath, ImportList, OldPrefix, NewPrefix);
1870
1871 if (OnWrite)
1872 OnWrite(std::string(ModulePath));
1873 return Error::success();
1874 }
1875
1876 bool isSensitiveToInputOrder() override {
1877 // The order which modules are written to LinkedObjectsFile should be
1878 // deterministic and match the order they are passed on the command line.
1879 return true;
1880 }
1881};
1882} // end anonymous namespace
1883
1885 ThreadPoolStrategy Parallelism, std::string OldPrefix,
1886 std::string NewPrefix, std::string NativeObjectPrefix,
1887 bool ShouldEmitImportsFiles, raw_fd_ostream *LinkedObjectsFile,
1888 IndexWriteCallback OnWrite) {
1889 auto Func =
1890 [=](const Config &Conf, ModuleSummaryIndex &CombinedIndex,
1891 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1892 AddStreamFn AddStream, FileCache Cache) {
1893 return std::make_unique<WriteIndexesThinBackend>(
1894 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
1895 OldPrefix, NewPrefix, NativeObjectPrefix, ShouldEmitImportsFiles,
1896 LinkedObjectsFile, OnWrite);
1897 };
1898 return ThinBackend(Func, Parallelism);
1899}
1900
1901Error LTO::runThinLTO(AddStreamFn AddStream, FileCache Cache,
1902 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
1903 llvm::TimeTraceScope timeScope("Run ThinLTO");
1904 LLVM_DEBUG(dbgs() << "Running ThinLTO\n");
1905 ThinLTO.CombinedIndex.releaseTemporaryMemory();
1906 timeTraceProfilerBegin("ThinLink", StringRef(""));
1907 auto TimeTraceScopeExit = llvm::make_scope_exit([]() {
1910 });
1911 if (ThinLTO.ModuleMap.empty())
1912 return Error::success();
1913
1914 if (ThinLTO.ModulesToCompile && ThinLTO.ModulesToCompile->empty()) {
1915 llvm::errs() << "warning: [ThinLTO] No module compiled\n";
1916 return Error::success();
1917 }
1918
1919 if (Conf.CombinedIndexHook &&
1920 !Conf.CombinedIndexHook(ThinLTO.CombinedIndex, GUIDPreservedSymbols))
1921 return Error::success();
1922
1923 // Collect for each module the list of function it defines (GUID ->
1924 // Summary).
1925 DenseMap<StringRef, GVSummaryMapTy> ModuleToDefinedGVSummaries(
1926 ThinLTO.ModuleMap.size());
1927 ThinLTO.CombinedIndex.collectDefinedGVSummariesPerModule(
1928 ModuleToDefinedGVSummaries);
1929 // Create entries for any modules that didn't have any GV summaries
1930 // (either they didn't have any GVs to start with, or we suppressed
1931 // generation of the summaries because they e.g. had inline assembly
1932 // uses that couldn't be promoted/renamed on export). This is so
1933 // InProcessThinBackend::start can still launch a backend thread, which
1934 // is passed the map of summaries for the module, without any special
1935 // handling for this case.
1936 for (auto &Mod : ThinLTO.ModuleMap)
1937 if (!ModuleToDefinedGVSummaries.count(Mod.first))
1938 ModuleToDefinedGVSummaries.try_emplace(Mod.first);
1939
1940 FunctionImporter::ImportListsTy ImportLists(ThinLTO.ModuleMap.size());
1941 DenseMap<StringRef, FunctionImporter::ExportSetTy> ExportLists(
1942 ThinLTO.ModuleMap.size());
1943 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
1944
1945 if (DumpThinCGSCCs)
1946 ThinLTO.CombinedIndex.dumpSCCs(outs());
1947
1948 std::set<GlobalValue::GUID> ExportedGUIDs;
1949
1950 bool WholeProgramVisibilityEnabledInLTO =
1951 Conf.HasWholeProgramVisibility &&
1952 // If validation is enabled, upgrade visibility only when all vtables
1953 // have typeinfos.
1954 (!Conf.ValidateAllVtablesHaveTypeInfos || Conf.AllVtablesHaveTypeInfos);
1955 if (hasWholeProgramVisibility(WholeProgramVisibilityEnabledInLTO))
1956 ThinLTO.CombinedIndex.setWithWholeProgramVisibility();
1957
1958 // If we're validating, get the vtable symbols that should not be
1959 // upgraded because they correspond to typeIDs outside of index-based
1960 // WPD info.
1961 DenseSet<GlobalValue::GUID> VisibleToRegularObjSymbols;
1962 if (WholeProgramVisibilityEnabledInLTO &&
1963 Conf.ValidateAllVtablesHaveTypeInfos) {
1964 // This returns true when the name is local or not defined. Locals are
1965 // expected to be handled separately.
1966 auto IsVisibleToRegularObj = [&](StringRef name) {
1967 auto It = GlobalResolutions->find(name);
1968 return (It == GlobalResolutions->end() ||
1969 It->second.VisibleOutsideSummary || !It->second.Prevailing);
1970 };
1971
1972 getVisibleToRegularObjVtableGUIDs(ThinLTO.CombinedIndex,
1973 VisibleToRegularObjSymbols,
1974 IsVisibleToRegularObj);
1975 }
1976
1977 // If allowed, upgrade public vcall visibility to linkage unit visibility in
1978 // the summaries before whole program devirtualization below.
1980 ThinLTO.CombinedIndex, WholeProgramVisibilityEnabledInLTO,
1981 DynamicExportSymbols, VisibleToRegularObjSymbols);
1982
1983 // Perform index-based WPD. This will return immediately if there are
1984 // no index entries in the typeIdMetadata map (e.g. if we are instead
1985 // performing IR-based WPD in hybrid regular/thin LTO mode).
1986 std::map<ValueInfo, std::vector<VTableSlotSummary>> LocalWPDTargetsMap;
1987 runWholeProgramDevirtOnIndex(ThinLTO.CombinedIndex, ExportedGUIDs,
1988 LocalWPDTargetsMap);
1989
1990 auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) {
1991 return ThinLTO.isPrevailingModuleForGUID(GUID, S->modulePath());
1992 };
1994 MemProfContextDisambiguation ContextDisambiguation;
1995 ContextDisambiguation.run(ThinLTO.CombinedIndex, isPrevailing);
1996 }
1997
1998 // Figure out which symbols need to be internalized. This also needs to happen
1999 // at -O0 because summary-based DCE is implemented using internalization, and
2000 // we must apply DCE consistently with the full LTO module in order to avoid
2001 // undefined references during the final link.
2002 for (auto &Res : *GlobalResolutions) {
2003 // If the symbol does not have external references or it is not prevailing,
2004 // then not need to mark it as exported from a ThinLTO partition.
2005 if (Res.second.Partition != GlobalResolution::External ||
2006 !Res.second.isPrevailingIRSymbol())
2007 continue;
2009 GlobalValue::dropLLVMManglingEscape(Res.second.IRName));
2010 // Mark exported unless index-based analysis determined it to be dead.
2011 if (ThinLTO.CombinedIndex.isGUIDLive(GUID))
2012 ExportedGUIDs.insert(GUID);
2013 }
2014
2015 // Reset the GlobalResolutions to deallocate the associated memory, as there
2016 // are no further accesses. We specifically want to do this before computing
2017 // cross module importing, which adds to peak memory via the computed import
2018 // and export lists.
2019 releaseGlobalResolutionsMemory();
2020
2021 if (Conf.OptLevel > 0)
2022 ComputeCrossModuleImport(ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries,
2023 isPrevailing, ImportLists, ExportLists);
2024
2025 // Any functions referenced by the jump table in the regular LTO object must
2026 // be exported.
2027 auto &Defs = ThinLTO.CombinedIndex.cfiFunctionDefs();
2028 ExportedGUIDs.insert(Defs.guid_begin(), Defs.guid_end());
2029 auto &Decls = ThinLTO.CombinedIndex.cfiFunctionDecls();
2030 ExportedGUIDs.insert(Decls.guid_begin(), Decls.guid_end());
2031
2032 auto isExported = [&](StringRef ModuleIdentifier, ValueInfo VI) {
2033 const auto &ExportList = ExportLists.find(ModuleIdentifier);
2034 return (ExportList != ExportLists.end() && ExportList->second.count(VI)) ||
2035 ExportedGUIDs.count(VI.getGUID());
2036 };
2037
2038 // Update local devirtualized targets that were exported by cross-module
2039 // importing or by other devirtualizations marked in the ExportedGUIDs set.
2040 updateIndexWPDForExports(ThinLTO.CombinedIndex, isExported,
2041 LocalWPDTargetsMap);
2042
2043 thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported,
2044 isPrevailing);
2045
2046 auto recordNewLinkage = [&](StringRef ModuleIdentifier,
2048 GlobalValue::LinkageTypes NewLinkage) {
2049 ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
2050 };
2051 thinLTOResolvePrevailingInIndex(Conf, ThinLTO.CombinedIndex, isPrevailing,
2052 recordNewLinkage, GUIDPreservedSymbols);
2053
2054 thinLTOPropagateFunctionAttrs(ThinLTO.CombinedIndex, isPrevailing);
2055
2056 generateParamAccessSummary(ThinLTO.CombinedIndex);
2057
2060
2061 TimeTraceScopeExit.release();
2062
2063 auto &ModuleMap =
2064 ThinLTO.ModulesToCompile ? *ThinLTO.ModulesToCompile : ThinLTO.ModuleMap;
2065
2066 auto RunBackends = [&](ThinBackendProc *BackendProcess) -> Error {
2067 auto ProcessOneModule = [&](int I) -> Error {
2068 auto &Mod = *(ModuleMap.begin() + I);
2069 // Tasks 0 through ParallelCodeGenParallelismLevel-1 are reserved for
2070 // combined module and parallel code generation partitions.
2071 return BackendProcess->start(
2072 RegularLTO.ParallelCodeGenParallelismLevel + I, Mod.second,
2073 ImportLists[Mod.first], ExportLists[Mod.first],
2074 ResolvedODR[Mod.first], ThinLTO.ModuleMap);
2075 };
2076
2077 BackendProcess->setup(ModuleMap.size(),
2078 RegularLTO.ParallelCodeGenParallelismLevel,
2079 RegularLTO.CombinedModule->getTargetTriple());
2080
2081 if (BackendProcess->getThreadCount() == 1 ||
2082 BackendProcess->isSensitiveToInputOrder()) {
2083 // Process the modules in the order they were provided on the
2084 // command-line. It is important for this codepath to be used for
2085 // WriteIndexesThinBackend, to ensure the emitted LinkedObjectsFile lists
2086 // ThinLTO objects in the same order as the inputs, which otherwise would
2087 // affect the final link order.
2088 for (int I = 0, E = ModuleMap.size(); I != E; ++I)
2089 if (Error E = ProcessOneModule(I))
2090 return E;
2091 } else {
2092 // When executing in parallel, process largest bitsize modules first to
2093 // improve parallelism, and avoid starving the thread pool near the end.
2094 // This saves about 15 sec on a 36-core machine while link `clang.exe`
2095 // (out of 100 sec).
2096 std::vector<BitcodeModule *> ModulesVec;
2097 ModulesVec.reserve(ModuleMap.size());
2098 for (auto &Mod : ModuleMap)
2099 ModulesVec.push_back(&Mod.second);
2100 for (int I : generateModulesOrdering(ModulesVec))
2101 if (Error E = ProcessOneModule(I))
2102 return E;
2103 }
2104 return BackendProcess->wait();
2105 };
2106
2108 std::unique_ptr<ThinBackendProc> BackendProc =
2109 ThinLTO.Backend(Conf, ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries,
2110 AddStream, Cache);
2111 return RunBackends(BackendProc.get());
2112 }
2113
2114 // Perform two rounds of code generation for ThinLTO:
2115 // 1. First round: Perform optimization and code generation, outputting to
2116 // temporary scratch objects.
2117 // 2. Merge code generation data extracted from the temporary scratch objects.
2118 // 3. Second round: Execute code generation again using the merged data.
2119 LLVM_DEBUG(dbgs() << "[TwoRounds] Initializing ThinLTO two-codegen rounds\n");
2120
2121 unsigned MaxTasks = getMaxTasks();
2122 auto Parallelism = ThinLTO.Backend.getParallelism();
2123 // Set up two additional streams and caches for storing temporary scratch
2124 // objects and optimized IRs, using the same cache directory as the original.
2125 cgdata::StreamCacheData CG(MaxTasks, Cache, "CG"), IR(MaxTasks, Cache, "IR");
2126
2127 // First round: Execute optimization and code generation, outputting to
2128 // temporary scratch objects. Serialize the optimized IRs before initiating
2129 // code generation.
2130 LLVM_DEBUG(dbgs() << "[TwoRounds] Running the first round of codegen\n");
2131 auto FirstRoundLTO = std::make_unique<FirstRoundThinBackend>(
2132 Conf, ThinLTO.CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2133 CG.AddStream, CG.Cache, IR.AddStream, IR.Cache);
2134 if (Error E = RunBackends(FirstRoundLTO.get()))
2135 return E;
2136
2137 LLVM_DEBUG(dbgs() << "[TwoRounds] Merging codegen data\n");
2138 auto CombinedHashOrErr = cgdata::mergeCodeGenData(*CG.getResult());
2139 if (Error E = CombinedHashOrErr.takeError())
2140 return E;
2141 auto CombinedHash = *CombinedHashOrErr;
2142 LLVM_DEBUG(dbgs() << "[TwoRounds] CGData hash: " << CombinedHash << "\n");
2143
2144 // Second round: Read the optimized IRs and execute code generation using the
2145 // merged data.
2146 LLVM_DEBUG(dbgs() << "[TwoRounds] Running the second round of codegen\n");
2147 auto SecondRoundLTO = std::make_unique<SecondRoundThinBackend>(
2148 Conf, ThinLTO.CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2149 AddStream, Cache, IR.getResult(), CombinedHash);
2150 return RunBackends(SecondRoundLTO.get());
2151}
2152
2156 std::optional<uint64_t> RemarksHotnessThreshold, int Count) {
2157 std::string Filename = std::string(RemarksFilename);
2158 // For ThinLTO, file.opt.<format> becomes
2159 // file.opt.<format>.thin.<num>.<format>.
2160 if (!Filename.empty() && Count != -1)
2161 Filename =
2162 (Twine(Filename) + ".thin." + llvm::utostr(Count) + "." + RemarksFormat)
2163 .str();
2164
2165 auto ResultOrErr = llvm::setupLLVMOptimizationRemarks(
2166 Context, Filename, RemarksPasses, RemarksFormat, RemarksWithHotness,
2168 if (Error E = ResultOrErr.takeError())
2169 return std::move(E);
2170
2171 if (*ResultOrErr)
2172 (*ResultOrErr)->keep();
2173
2174 return ResultOrErr;
2175}
2176
2179 // Setup output file to emit statistics.
2180 if (StatsFilename.empty())
2181 return nullptr;
2182
2184 std::error_code EC;
2185 auto StatsFile =
2186 std::make_unique<ToolOutputFile>(StatsFilename, EC, sys::fs::OF_None);
2187 if (EC)
2188 return errorCodeToError(EC);
2189
2190 StatsFile->keep();
2191 return std::move(StatsFile);
2192}
2193
2194// Compute the ordering we will process the inputs: the rough heuristic here
2195// is to sort them per size so that the largest module get schedule as soon as
2196// possible. This is purely a compile-time optimization.
2198 auto Seq = llvm::seq<int>(0, R.size());
2199 std::vector<int> ModulesOrdering(Seq.begin(), Seq.end());
2200 llvm::sort(ModulesOrdering, [&](int LeftIndex, int RightIndex) {
2201 auto LSize = R[LeftIndex]->getBuffer().size();
2202 auto RSize = R[RightIndex]->getBuffer().size();
2203 return LSize > RSize;
2204 });
2205 return ModulesOrdering;
2206}
2207
2208namespace {
2209/// This out-of-process backend does not perform code generation when invoked
2210/// for each task. Instead, it generates the necessary information (e.g., the
2211/// summary index shard, import list, etc.) to enable code generation to be
2212/// performed externally, similar to WriteIndexesThinBackend. The backend's
2213/// `wait` function then invokes an external distributor process to carry out
2214/// the backend compilations.
2215class OutOfProcessThinBackend : public CGThinBackend {
2216 using SString = SmallString<128>;
2217
2219 StringSaver Saver{Alloc};
2220
2221 SString LinkerOutputFile;
2222
2223 SString DistributorPath;
2224 ArrayRef<StringRef> DistributorArgs;
2225
2226 SString RemoteCompiler;
2227 ArrayRef<StringRef> RemoteCompilerPrependArgs;
2228 ArrayRef<StringRef> RemoteCompilerArgs;
2229
2230 bool SaveTemps;
2231
2232 SmallVector<StringRef, 0> CodegenOptions;
2233 DenseSet<StringRef> CommonInputs;
2234
2235 // Information specific to individual backend compilation job.
2236 struct Job {
2237 unsigned Task;
2238 StringRef ModuleID;
2239 StringRef NativeObjectPath;
2240 StringRef SummaryIndexPath;
2241 ImportsFilesContainer ImportsFiles;
2242 };
2243 // The set of backend compilations jobs.
2244 SmallVector<Job> Jobs;
2245
2246 // A unique string to identify the current link.
2247 SmallString<8> UID;
2248
2249 // The offset to the first ThinLTO task.
2250 unsigned ThinLTOTaskOffset;
2251
2252 // The target triple to supply for backend compilations.
2253 llvm::Triple Triple;
2254
2255public:
2256 OutOfProcessThinBackend(
2257 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
2258 ThreadPoolStrategy ThinLTOParallelism,
2259 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
2260 AddStreamFn AddStream, lto::IndexWriteCallback OnWrite,
2261 bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles,
2262 StringRef LinkerOutputFile, StringRef Distributor,
2263 ArrayRef<StringRef> DistributorArgs, StringRef RemoteCompiler,
2264 ArrayRef<StringRef> RemoteCompilerPrependArgs,
2265 ArrayRef<StringRef> RemoteCompilerArgs, bool SaveTemps)
2266 : CGThinBackend(Conf, CombinedIndex, ModuleToDefinedGVSummaries,
2267 AddStream, OnWrite, ShouldEmitIndexFiles,
2268 ShouldEmitImportsFiles, ThinLTOParallelism),
2269 LinkerOutputFile(LinkerOutputFile), DistributorPath(Distributor),
2270 DistributorArgs(DistributorArgs), RemoteCompiler(RemoteCompiler),
2271 RemoteCompilerPrependArgs(RemoteCompilerPrependArgs),
2272 RemoteCompilerArgs(RemoteCompilerArgs), SaveTemps(SaveTemps) {}
2273
2274 void setup(unsigned ThinLTONumTasks, unsigned ThinLTOTaskOffset,
2275 llvm::Triple Triple) override {
2277 Jobs.resize((size_t)ThinLTONumTasks);
2278 this->ThinLTOTaskOffset = ThinLTOTaskOffset;
2279 this->Triple = Triple;
2280 }
2281
2282 Error start(
2283 unsigned Task, BitcodeModule BM,
2284 const FunctionImporter::ImportMapTy &ImportList,
2285 const FunctionImporter::ExportSetTy &ExportList,
2286 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
2287 MapVector<StringRef, BitcodeModule> &ModuleMap) override {
2288
2289 StringRef ModulePath = BM.getModuleIdentifier();
2290
2291 SString ObjFilePath = sys::path::parent_path(LinkerOutputFile);
2292 sys::path::append(ObjFilePath, sys::path::stem(ModulePath) + "." +
2293 itostr(Task) + "." + UID + ".native.o");
2294
2295 Job &J = Jobs[Task - ThinLTOTaskOffset];
2296 J = {
2297 Task,
2298 ModulePath,
2299 Saver.save(ObjFilePath.str()),
2300 Saver.save(ObjFilePath.str() + ".thinlto.bc"),
2301 {} // Filled in by emitFiles below.
2302 };
2303
2304 assert(ModuleToDefinedGVSummaries.count(ModulePath));
2305
2306 // The BackendThreadPool is only used here to write the sharded index files
2307 // (similar to WriteIndexesThinBackend).
2308 BackendThreadPool.async(
2309 [=](Job &J, const FunctionImporter::ImportMapTy &ImportList) {
2310 if (auto E = emitFiles(ImportList, J.ModuleID, J.ModuleID.str(),
2311 J.SummaryIndexPath, J.ImportsFiles)) {
2312 std::unique_lock<std::mutex> L(ErrMu);
2313 if (Err)
2314 Err = joinErrors(std::move(*Err), std::move(E));
2315 else
2316 Err = std::move(E);
2317 }
2318 },
2319 std::ref(J), std::ref(ImportList));
2320
2321 return Error::success();
2322 }
2323
2324 // Derive a set of Clang options that will be shared/common for all DTLTO
2325 // backend compilations. We are intentionally minimal here as these options
2326 // must remain synchronized with the behavior of Clang. DTLTO does not support
2327 // all the features available with in-process LTO. More features are expected
2328 // to be added over time. Users can specify Clang options directly if a
2329 // feature is not supported. Note that explicitly specified options that imply
2330 // additional input or output file dependencies must be communicated to the
2331 // distribution system, potentially by setting extra options on the
2332 // distributor program.
2333 void buildCommonRemoteCompilerOptions() {
2334 const lto::Config &C = Conf;
2335 auto &Ops = CodegenOptions;
2336
2337 Ops.push_back(Saver.save("-O" + Twine(C.OptLevel)));
2338
2339 if (C.Options.EmitAddrsig)
2340 Ops.push_back("-faddrsig");
2341 if (C.Options.FunctionSections)
2342 Ops.push_back("-ffunction-sections");
2343 if (C.Options.DataSections)
2344 Ops.push_back("-fdata-sections");
2345
2346 if (C.RelocModel == Reloc::PIC_)
2347 // Clang doesn't have -fpic for all triples.
2348 if (!Triple.isOSBinFormatCOFF())
2349 Ops.push_back("-fpic");
2350
2351 // Turn on/off warnings about profile cfg mismatch (default on)
2352 // --lto-pgo-warn-mismatch.
2353 if (!C.PGOWarnMismatch) {
2354 Ops.push_back("-mllvm");
2355 Ops.push_back("-no-pgo-warn-mismatch");
2356 }
2357
2358 // Enable sample-based profile guided optimizations.
2359 // Sample profile file path --lto-sample-profile=<value>.
2360 if (!C.SampleProfile.empty()) {
2361 Ops.push_back(
2362 Saver.save("-fprofile-sample-use=" + Twine(C.SampleProfile)));
2363 CommonInputs.insert(C.SampleProfile);
2364 }
2365
2366 // We don't know which of options will be used by Clang.
2367 Ops.push_back("-Wno-unused-command-line-argument");
2368
2369 // Forward any supplied options.
2370 if (!RemoteCompilerArgs.empty())
2371 for (auto &a : RemoteCompilerArgs)
2372 Ops.push_back(a);
2373 }
2374
2375 // Generates a JSON file describing the backend compilations, for the
2376 // distributor.
2377 bool emitDistributorJson(StringRef DistributorJson) {
2378 using json::Array;
2379 std::error_code EC;
2380 raw_fd_ostream OS(DistributorJson, EC);
2381 if (EC)
2382 return false;
2383
2384 json::OStream JOS(OS);
2385 JOS.object([&]() {
2386 // Information common to all jobs.
2387 JOS.attributeObject("common", [&]() {
2388 JOS.attribute("linker_output", LinkerOutputFile);
2389
2390 JOS.attributeArray("args", [&]() {
2391 JOS.value(RemoteCompiler);
2392
2393 // Forward any supplied prepend options.
2394 if (!RemoteCompilerPrependArgs.empty())
2395 for (auto &A : RemoteCompilerPrependArgs)
2396 JOS.value(A);
2397
2398 JOS.value("-c");
2399
2400 JOS.value(Saver.save("--target=" + Triple.str()));
2401
2402 for (const auto &A : CodegenOptions)
2403 JOS.value(A);
2404 });
2405
2406 JOS.attribute("inputs", Array(CommonInputs));
2407 });
2408
2409 // Per-compilation-job information.
2410 JOS.attributeArray("jobs", [&]() {
2411 for (const auto &J : Jobs) {
2412 assert(J.Task != 0);
2413
2415 SmallVector<StringRef, 1> Outputs;
2416
2417 JOS.object([&]() {
2418 JOS.attributeArray("args", [&]() {
2419 JOS.value(J.ModuleID);
2420 Inputs.push_back(J.ModuleID);
2421
2422 JOS.value(
2423 Saver.save("-fthinlto-index=" + Twine(J.SummaryIndexPath)));
2424 Inputs.push_back(J.SummaryIndexPath);
2425
2426 JOS.value("-o");
2427 JOS.value(J.NativeObjectPath);
2428 Outputs.push_back(J.NativeObjectPath);
2429 });
2430
2431 // Add the bitcode files from which imports will be made. These do
2432 // not explicitly appear on the backend compilation command lines
2433 // but are recorded in the summary index shards.
2434 llvm::append_range(Inputs, J.ImportsFiles);
2435 JOS.attribute("inputs", Array(Inputs));
2436
2437 JOS.attribute("outputs", Array(Outputs));
2438 });
2439 }
2440 });
2441 });
2442
2443 return true;
2444 }
2445
2446 void removeFile(StringRef FileName) {
2447 std::error_code EC = sys::fs::remove(FileName, true);
2448 if (EC && EC != std::make_error_code(std::errc::no_such_file_or_directory))
2449 errs() << "warning: could not remove the file '" << FileName
2450 << "': " << EC.message() << "\n";
2451 }
2452
2453 Error wait() override {
2454 // Wait for the information on the required backend compilations to be
2455 // gathered.
2456 BackendThreadPool.wait();
2457 if (Err)
2458 return std::move(*Err);
2459
2460 auto CleanPerJobFiles = llvm::make_scope_exit([&] {
2461 if (!SaveTemps)
2462 for (auto &Job : Jobs) {
2463 removeFile(Job.NativeObjectPath);
2464 if (!ShouldEmitIndexFiles)
2465 removeFile(Job.SummaryIndexPath);
2466 }
2467 });
2468
2469 const StringRef BCError = "DTLTO backend compilation: ";
2470
2471 buildCommonRemoteCompilerOptions();
2472
2473 SString JsonFile = sys::path::parent_path(LinkerOutputFile);
2474 sys::path::append(JsonFile, sys::path::stem(LinkerOutputFile) + "." + UID +
2475 ".dist-file.json");
2476 if (!emitDistributorJson(JsonFile))
2478 BCError + "failed to generate distributor JSON script: " + JsonFile,
2480 auto CleanJson = llvm::make_scope_exit([&] {
2481 if (!SaveTemps)
2482 removeFile(JsonFile);
2483 });
2484
2485 SmallVector<StringRef, 3> Args = {DistributorPath};
2486 llvm::append_range(Args, DistributorArgs);
2487 Args.push_back(JsonFile);
2488 std::string ErrMsg;
2489 if (sys::ExecuteAndWait(Args[0], Args,
2490 /*Env=*/std::nullopt, /*Redirects=*/{},
2491 /*SecondsToWait=*/0, /*MemoryLimit=*/0, &ErrMsg)) {
2493 BCError + "distributor execution failed" +
2494 (!ErrMsg.empty() ? ": " + ErrMsg + Twine(".") : Twine(".")),
2496 }
2497
2498 for (auto &Job : Jobs) {
2499 // Load the native object from a file into a memory buffer
2500 // and store its contents in the output buffer.
2501 auto ObjFileMbOrErr =
2502 MemoryBuffer::getFile(Job.NativeObjectPath, /*IsText=*/false,
2503 /*RequiresNullTerminator=*/false);
2504 if (std::error_code EC = ObjFileMbOrErr.getError())
2506 BCError + "cannot open native object file: " +
2507 Job.NativeObjectPath + ": " + EC.message(),
2509 auto StreamOrErr = AddStream(Job.Task, Job.ModuleID);
2510 if (Error Err = StreamOrErr.takeError())
2511 report_fatal_error(std::move(Err));
2512 auto &Stream = *StreamOrErr->get();
2513 *Stream.OS << ObjFileMbOrErr->get()->getMemBufferRef().getBuffer();
2514 if (Error Err = Stream.commit())
2515 report_fatal_error(std::move(Err));
2516 }
2517
2518 return Error::success();
2519 }
2520};
2521} // end anonymous namespace
2522
2524 ThreadPoolStrategy Parallelism, lto::IndexWriteCallback OnWrite,
2525 bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles,
2526 StringRef LinkerOutputFile, StringRef Distributor,
2527 ArrayRef<StringRef> DistributorArgs, StringRef RemoteCompiler,
2528 ArrayRef<StringRef> RemoteCompilerPrependArgs,
2529 ArrayRef<StringRef> RemoteCompilerArgs, bool SaveTemps) {
2530 auto Func =
2531 [=](const Config &Conf, ModuleSummaryIndex &CombinedIndex,
2532 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
2533 AddStreamFn AddStream, FileCache /*Cache*/) {
2534 return std::make_unique<OutOfProcessThinBackend>(
2535 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
2536 AddStream, OnWrite, ShouldEmitIndexFiles, ShouldEmitImportsFiles,
2537 LinkerOutputFile, Distributor, DistributorArgs, RemoteCompiler,
2538 RemoteCompilerPrependArgs, RemoteCompilerArgs, SaveTemps);
2539 };
2540 return ThinBackend(Func, Parallelism);
2541}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis false
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
dxil translate DXIL Translate Metadata
#define DEBUG_TYPE
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
This file supports working with JSON data.
static void writeToResolutionFile(raw_ostream &OS, InputFile *Input, ArrayRef< SymbolResolution > Res)
Definition LTO.cpp:716
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)
Definition LTO.cpp:368
static void handleNonPrevailingComdat(GlobalValue &GV, std::set< const Comdat * > &NonPrevailingComdats)
Definition LTO.cpp:836
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"))
static void thinLTOInternalizeAndPromoteGUID(ValueInfo VI, function_ref< bool(StringRef, ValueInfo)> isExported, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing)
Definition LTO.cpp:470
Legalize the Machine IR a function s Machine IR
Definition Legalizer.cpp:80
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
#define G(x, y, z)
Definition MD5.cpp:56
Machine Check Debug Module
This file contains the declarations for metadata subclasses.
#define P(N)
Provides a library for accessing information about this process and other processes on the operating ...
static const char * name
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallSet class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
This pass exposes codegen information to IR-level passes.
The Input class is used to parse a yaml document into in-memory structs and vectors.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
iterator end() const
Definition ArrayRef.h:136
size_t size() const
size - Get the array size.
Definition ArrayRef.h:147
iterator begin() const
Definition ArrayRef.h:135
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:142
const T & consume_front()
consume_front() - Returns the first element and drops it from ArrayRef.
Definition ArrayRef.h:162
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 Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(GlobalValue::GUID)> IsPrevailing=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
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.
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:248
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition DenseMap.h:174
iterator end()
Definition DenseMap.h:81
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
Error takeError()
Take ownership of the stored error.
Definition Error.h:612
The map maintains the list of imports.
DenseSet< ValueInfo > ExportSetTy
The set contains an entry for every global value that the module exports.
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.
Definition Globals.cpp:77
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...
Definition Globals.cpp:328
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
LLVM_ABI const Comdat * getComdat() const
Definition Globals.cpp:201
static bool isLinkOnceLinkage(LinkageTypes Linkage)
void setLinkage(LinkageTypes LT)
DLLStorageClassTypes
Storage classes of global values for PE targets.
Definition GlobalValue.h:74
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
static bool isExternalLinkage(LinkageTypes Linkage)
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition GlobalValue.h:67
@ DefaultVisibility
The GV is visible.
Definition GlobalValue.h:68
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....
Definition Globals.cpp:161
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.
Definition GlobalValue.h:52
@ CommonLinkage
Tentative definitions.
Definition GlobalValue.h:63
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition GlobalValue.h:57
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
DLLStorageClassTypes getDLLStorageClass() const
Type * getValueType() const
static bool isLinkOnceODRLinkage(LinkageTypes Linkage)
LLVM_ABI void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Globals.cpp:520
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1526
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
bool empty() const
Definition MapVector.h:77
iterator begin()
Definition MapVector.h:65
size_type size() const
Definition MapVector.h:56
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()
const ModuleHash & getModuleHash(const StringRef ModPath) const
Get the module SHA1 hash recorded for the given module path.
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.
Definition Module.h:67
A class that wrap the SHA1 algorithm.
Definition SHA1.h:27
LLVM_ABI void update(ArrayRef< uint8_t > Data)
Digest more data.
Definition SHA1.cpp:208
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().
Definition SHA1.cpp:288
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
Definition SmallSet.h:175
bool empty() const
Definition SmallSet.h:168
bool erase(const T &V)
Definition SmallSet.h:199
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition SmallSet.h:183
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
StringRef str() const
Explicit conversion to StringRef.
void reserve(size_type N)
void resize(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...
Definition StringRef.h:854
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
Definition StringMap.h:285
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:140
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:426
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition StringSaver.h:22
StringRef save(const char *S)
Definition StringSaver.h:31
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.
Definition Threading.h:115
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.
Definition Triple.h:47
bool isArm64e() const
Tests whether the target is the Apple "arm64e" AArch64 subarch.
Definition Triple.h:1138
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition Triple.h:413
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:776
const std::string & str() const
Definition Triple.h:480
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:613
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition Triple.h:771
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:295
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:390
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:546
bool use_empty() const
Definition Value.h:346
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
iterator find(const_arg_type_t< ValueT > V)
Definition DenseSet.h:167
void insert_range(Range &&R)
Definition DenseSet.h:228
size_type size() const
Definition DenseSet.h:87
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:175
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:180
An efficient, type-erasing, non-owning reference to a callable.
Ephemeral symbols produced by Reader::symbols() and Reader::module_symbols().
Definition IRSymtab.h:316
An input file.
Definition LTO.h:113
static LLVM_ABI Expected< std::unique_ptr< InputFile > > create(MemoryBufferRef Object)
Create an InputFile.
Definition LTO.cpp:568
ArrayRef< Symbol > symbols() const
A range over the symbols in this InputFile.
Definition LTO.h:167
LLVM_ABI StringRef getName() const
Returns the path to the InputFile.
Definition LTO.cpp:597
LLVM_ABI BitcodeModule & getSingleBitcodeModule()
Definition LTO.cpp:601
LLVM_ABI LTO(Config Conf, ThinBackend Backend={}, unsigned ParallelCodeGenParallelismLevel=1, LTOKind LTOMode=LTOK_Default)
Create an LTO object.
Definition LTO.cpp:619
LLVM_ABI Error add(std::unique_ptr< InputFile > Obj, ArrayRef< SymbolResolution > Res)
Add an input file to the LTO link, using the provided symbol resolutions.
Definition LTO.cpp:740
static LLVM_ABI 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...
Definition LTO.cpp:1400
LTOKind
Unified LTO modes.
Definition LTO.h:376
@ LTOK_UnifiedRegular
Regular LTO, with Unified LTO enabled.
Definition LTO.h:381
@ LTOK_Default
Any LTO mode without Unified LTO. The default mode.
Definition LTO.h:378
@ LTOK_UnifiedThin
ThinLTO, with Unified LTO enabled.
Definition LTO.h:384
LLVM_ABI ~LTO()
LLVM_ABI unsigned getMaxTasks() const
Returns an upper bound on the number of tasks that the client may expect.
Definition LTO.cpp:1157
LLVM_ABI Error run(AddStreamFn AddStream, FileCache Cache={})
Runs the LTO pipeline.
Definition LTO.cpp:1208
This class defines the interface to the ThinLTO backend.
Definition LTO.h:204
const DenseMap< StringRef, GVSummaryMapTy > & ModuleToDefinedGVSummaries
Definition LTO.h:208
LLVM_ABI Error emitFiles(const FunctionImporter::ImportMapTy &ImportList, StringRef ModulePath, const std::string &NewModulePath) const
Definition LTO.cpp:1414
ModuleSummaryIndex & CombinedIndex
Definition LTO.h:207
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.
Definition raw_ostream.h:53
static LLVM_ABI Pid getProcessId()
Get the process's identifier.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
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.
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.
Definition LTO.cpp:1764
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.
Definition LTO.cpp:1798
LLVM_ABI StringLiteral getThinLTODefaultCPU(const Triple &TheTriple)
Definition LTO.cpp:1780
LLVM_ABI Expected< std::unique_ptr< ToolOutputFile > > setupStatsFile(StringRef StatsFilename)
Setups the output file for saving statistics.
Definition LTO.cpp:2178
LLVM_ABI ThinBackend createOutOfProcessThinBackend(ThreadPoolStrategy Parallelism, IndexWriteCallback OnWrite, bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles, StringRef LinkerOutputFile, StringRef Distributor, ArrayRef< StringRef > DistributorArgs, StringRef RemoteCompiler, ArrayRef< StringRef > RemoteCompilerPrependArgs, ArrayRef< StringRef > RemoteCompilerArgs, bool SaveTemps)
This ThinBackend generates the index shards and then runs the individual backend jobs via an external...
Definition LTO.cpp:2523
LLVM_ABI Error backend(const Config &C, AddStreamFn AddStream, unsigned ParallelCodeGenParallelismLevel, Module &M, ModuleSummaryIndex &CombinedIndex)
Runs a regular LTO backend.
std::function< void(const std::string &)> IndexWriteCallback
Definition LTO.h:199
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...
Definition LTO.cpp:1884
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.
Definition LTO.cpp:2153
LLVM_ABI std::vector< int > generateModulesOrdering(ArrayRef< BitcodeModule * > R)
Produces a container ordering for optimal multi-threaded processing.
Definition LTO.cpp:2197
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, AddStreamFn IRAddStream=nullptr, const std::vector< uint8_t > &CmdArgs=std::vector< uint8_t >())
Runs a ThinLTO backend.
llvm::SmallVector< std::string > ImportsFilesContainer
Definition LTO.h:201
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)
Definition Endian.h:478
void write32le(void *P, uint32_t V)
Definition Endian.h:475
LLVM_ABI std::error_code remove(const Twine &path, bool IgnoreNonExisting=true)
Remove path.
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.
Definition Path.cpp:967
LLVM_ABI StringRef stem(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get stem.
Definition Path.cpp:579
LLVM_ABI StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
Definition Path.cpp:467
LLVM_ABI bool replace_path_prefix(SmallVectorImpl< char > &Path, StringRef OldPrefix, StringRef NewPrefix, Style style=Style::native)
Replace matching path prefix with another path.
Definition Path.cpp:518
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
Definition Path.cpp:456
LLVM_ABI int ExecuteAndWait(StringRef Program, ArrayRef< StringRef > Args, std::optional< ArrayRef< StringRef > > Env=std::nullopt, ArrayRef< std::optional< StringRef > > Redirects={}, unsigned SecondsToWait=0, unsigned MemoryLimit=0, std::string *ErrMsg=nullptr, bool *ExecutionFailed=nullptr, std::optional< ProcessStatistics > *ProcStat=nullptr, BitVector *AffinityMask=nullptr)
This function executes the program using the arguments provided.
Definition Program.cpp:32
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.
Definition Threading.h:167
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:829
cl::opt< std::string > RemarksFormat("lto-pass-remarks-format", cl::desc("The format used for serializing remarks (default: YAML)"), cl::value_desc("format"), cl::init("yaml"))
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1725
Error createFileError(const Twine &F, Error E)
Concatenate a source file path and/or name with an Error.
Definition Error.h:1399
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition ScopeExit.h:59
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
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."))
Definition LTO.cpp:79
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...
Definition Error.cpp:98
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 ...
Definition Casting.h:732
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2136
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)
Definition Casting.h:753
LLVM_ABI void EnableStatistics(bool DoPrintOnExit=true)
Enable the collection and printing of statistics.
LLVM_ABI void thinLTOInternalizeAndPromoteInIndex(ModuleSummaryIndex &Index, function_ref< bool(StringRef, ValueInfo)> isExported, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing)
Update the linkages in the given Index to mark exported values as external and non-exported values as...
Definition LTO.cpp:553
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.
Definition LTO.cpp:354
Error joinErrors(Error E1, Error E2)
Concatenate errors.
Definition Error.h:442
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)
Definition STLExtras.h:1622
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.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
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"))
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
cl::opt< bool > SupportsHotColdNew
Indicate we are linking with an allocator that supports hot/cold operator new interfaces.
LLVM_ABI void updateIndexWPDForExports(ModuleSummaryIndex &Summary, function_ref< bool(StringRef, ValueInfo)> isExported, std::map< ValueInfo, std::vector< VTableSlotSummary > > &LocalWPDTargetsMap)
Call after cross-module importing to update the recorded single impl devirt target names for any loca...
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.
Definition LTO.cpp:448
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...
Definition Casting.h:547
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.
Definition Error.h:340
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.
Definition ModRef.h:34
std::string join(IteratorT Begin, IteratorT End, StringRef Separator)
Joins the strings in the range [Begin, End), adding Separator between the elements.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
cl::opt< bool > EnableMemProfContextDisambiguation
Enable MemProf context disambiguation for thin link.
LLVM_ABI void runWholeProgramDevirtOnIndex(ModuleSummaryIndex &Summary, std::set< GlobalValue::GUID > &ExportedGUIDs, std::map< ValueInfo, std::vector< VTableSlotSummary > > &LocalWPDTargetsMap)
Perform index-based whole program devirtualization on the Summary index.
cl::opt< bool > ForceImportAll
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.
Definition STLExtras.h:1867
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.
Definition Casting.h:559
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 ...
Definition LTO.cpp:104
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
Definition Error.cpp:111
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.
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:305
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.
Definition Caching.h:58
LLVM_ABI void PrintStatisticsJSON(raw_ostream &OS)
Print statistics in JSON format.
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.
Definition CodeGen.h:156
std::string itostr(int64_t X)
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 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.
Definition BitVector.h:867
This type represents a file cache system that manages caching of files.
Definition Caching.h:84
bool isValid() const
Definition Caching.h:97
A simple container for information about the supported runtime calls.
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
ArrayRef< RTLIB::LibcallImpl > getLibcallImpls() const
Struct that holds a reference to a particular GUID in a global value summary.
LTO configuration.
Definition Config.h:42
std::optional< uint64_t > RemarksHotnessThreshold
The minimum hotness value a diagnostic needs in order to be included in optimization diagnostics.
Definition Config.h:166
std::optional< CodeModel::Model > CodeModel
Definition Config.h:57
std::string AAPipeline
Definition Config.h:111
bool CodeGenOnly
Disable entirely the optimizer, including importing for ThinLTO.
Definition Config.h:69
std::vector< std::string > MAttrs
Definition Config.h:51
std::vector< std::string > MllvmArgs
Definition Config.h:52
CodeGenOptLevel CGOptLevel
Definition Config.h:58
std::string DefaultTriple
Setting this field will replace unspecified target triples in input files with this triple.
Definition Config.h:119
std::string CPU
Definition Config.h:49
std::string DwoDir
The directory to store .dwo files.
Definition Config.h:131
std::string RemarksFilename
Optimization remarks file path.
Definition Config.h:145
std::string OverrideTriple
Setting this field will replace target triples in input files with this triple.
Definition Config.h:115
std::string ProfileRemapping
Name remapping file for profile data.
Definition Config.h:128
TargetOptions Options
Definition Config.h:50
bool TimeTraceEnabled
Time trace enabled.
Definition Config.h:181
std::string RemarksPasses
Optimization remarks pass filter.
Definition Config.h:148
std::string OptPipeline
If this field is set, the set of passes run in the middle-end optimizer will be the one specified by ...
Definition Config.h:106
unsigned TimeTraceGranularity
Time trace granularity.
Definition Config.h:184
unsigned OptLevel
Definition Config.h:60
bool RemarksWithHotness
Whether to emit optimization remarks with hotness informations.
Definition Config.h:151
std::optional< Reloc::Model > RelocModel
Definition Config.h:56
CodeGenFileType CGFileType
Definition Config.h:59
bool Freestanding
Flag to indicate that the optimizer should not assume builtins are present on the target.
Definition Config.h:66
std::string SampleProfile
Sample PGO profile path.
Definition Config.h:125
std::string RemarksFormat
The format used for serializing remarks (default: YAML).
Definition Config.h:169
The purpose of this struct is to only expose the symbol information that an LTO client should need in...
Definition LTO.h:142
The resolution for a symbol.
Definition LTO.h:598
unsigned FinalDefinitionInLinkageUnit
The definition of this symbol is unpreemptable at runtime and is known to be in this linkage unit.
Definition LTO.h:608
unsigned ExportDynamic
The symbol was exported dynamically, and therefore could be referenced by a shared library not visibl...
Definition LTO.h:615
unsigned Prevailing
The linker has chosen this definition of the symbol.
Definition LTO.h:604
unsigned LinkerRedefined
Linker redefined version of the symbol which appeared in -wrap or -defsym linker option.
Definition LTO.h:619
unsigned VisibleToRegularObj
The definition of this symbol is visible outside of the LTO unit.
Definition LTO.h:611
This type defines the behavior following the thin-link phase during ThinLTO.
Definition LTO.h:274