xref: /llvm-project-15.0.7/llvm/lib/LTO/LTO.cpp (revision f8764e30)
1 //===-LTO.cpp - LLVM Link Time Optimizer ----------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements functions and classes used to support LTO.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "llvm/LTO/LTO.h"
15 #include "llvm/Analysis/TargetLibraryInfo.h"
16 #include "llvm/Analysis/TargetTransformInfo.h"
17 #include "llvm/Bitcode/BitcodeReader.h"
18 #include "llvm/Bitcode/BitcodeWriter.h"
19 #include "llvm/CodeGen/Analysis.h"
20 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
21 #include "llvm/IR/AutoUpgrade.h"
22 #include "llvm/IR/DiagnosticPrinter.h"
23 #include "llvm/IR/LegacyPassManager.h"
24 #include "llvm/IR/Mangler.h"
25 #include "llvm/IR/Metadata.h"
26 #include "llvm/LTO/LTOBackend.h"
27 #include "llvm/Linker/IRMover.h"
28 #include "llvm/Object/ModuleSummaryIndexObjectFile.h"
29 #include "llvm/Support/Error.h"
30 #include "llvm/Support/ManagedStatic.h"
31 #include "llvm/Support/MemoryBuffer.h"
32 #include "llvm/Support/Path.h"
33 #include "llvm/Support/SHA1.h"
34 #include "llvm/Support/SourceMgr.h"
35 #include "llvm/Support/TargetRegistry.h"
36 #include "llvm/Support/ThreadPool.h"
37 #include "llvm/Support/Threading.h"
38 #include "llvm/Support/raw_ostream.h"
39 #include "llvm/Target/TargetMachine.h"
40 #include "llvm/Target/TargetOptions.h"
41 #include "llvm/Transforms/IPO.h"
42 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
43 #include "llvm/Transforms/Utils/SplitModule.h"
44 
45 #include <set>
46 
47 using namespace llvm;
48 using namespace lto;
49 using namespace object;
50 
51 #define DEBUG_TYPE "lto"
52 
53 // The values are (type identifier, summary) pairs.
54 typedef DenseMap<
55     GlobalValue::GUID,
56     TinyPtrVector<const std::pair<const std::string, TypeIdSummary> *>>
57     TypeIdSummariesByGuidTy;
58 
59 // Returns a unique hash for the Module considering the current list of
60 // export/import and other global analysis results.
61 // The hash is produced in \p Key.
62 static void computeCacheKey(
63     SmallString<40> &Key, const Config &Conf, const ModuleSummaryIndex &Index,
64     StringRef ModuleID, const FunctionImporter::ImportMapTy &ImportList,
65     const FunctionImporter::ExportSetTy &ExportList,
66     const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
67     const GVSummaryMapTy &DefinedGlobals,
68     const TypeIdSummariesByGuidTy &TypeIdSummariesByGuid) {
69   // Compute the unique hash for this entry.
70   // This is based on the current compiler version, the module itself, the
71   // export list, the hash for every single module in the import list, the
72   // list of ResolvedODR for the module, and the list of preserved symbols.
73   SHA1 Hasher;
74 
75   // Start with the compiler revision
76   Hasher.update(LLVM_VERSION_STRING);
77 #ifdef HAVE_LLVM_REVISION
78   Hasher.update(LLVM_REVISION);
79 #endif
80 
81   // Include the parts of the LTO configuration that affect code generation.
82   auto AddString = [&](StringRef Str) {
83     Hasher.update(Str);
84     Hasher.update(ArrayRef<uint8_t>{0});
85   };
86   auto AddUnsigned = [&](unsigned I) {
87     uint8_t Data[4];
88     Data[0] = I;
89     Data[1] = I >> 8;
90     Data[2] = I >> 16;
91     Data[3] = I >> 24;
92     Hasher.update(ArrayRef<uint8_t>{Data, 4});
93   };
94   auto AddUint64 = [&](uint64_t I) {
95     uint8_t Data[8];
96     Data[0] = I;
97     Data[1] = I >> 8;
98     Data[2] = I >> 16;
99     Data[3] = I >> 24;
100     Data[4] = I >> 32;
101     Data[5] = I >> 40;
102     Data[6] = I >> 48;
103     Data[7] = I >> 56;
104     Hasher.update(ArrayRef<uint8_t>{Data, 8});
105   };
106   AddString(Conf.CPU);
107   // FIXME: Hash more of Options. For now all clients initialize Options from
108   // command-line flags (which is unsupported in production), but may set
109   // RelaxELFRelocations. The clang driver can also pass FunctionSections,
110   // DataSections and DebuggerTuning via command line flags.
111   AddUnsigned(Conf.Options.RelaxELFRelocations);
112   AddUnsigned(Conf.Options.FunctionSections);
113   AddUnsigned(Conf.Options.DataSections);
114   AddUnsigned((unsigned)Conf.Options.DebuggerTuning);
115   for (auto &A : Conf.MAttrs)
116     AddString(A);
117   AddUnsigned(Conf.RelocModel);
118   AddUnsigned(Conf.CodeModel);
119   AddUnsigned(Conf.CGOptLevel);
120   AddUnsigned(Conf.CGFileType);
121   AddUnsigned(Conf.OptLevel);
122   AddString(Conf.OptPipeline);
123   AddString(Conf.AAPipeline);
124   AddString(Conf.OverrideTriple);
125   AddString(Conf.DefaultTriple);
126 
127   // Include the hash for the current module
128   auto ModHash = Index.getModuleHash(ModuleID);
129   Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
130   for (auto F : ExportList)
131     // The export list can impact the internalization, be conservative here
132     Hasher.update(ArrayRef<uint8_t>((uint8_t *)&F, sizeof(F)));
133 
134   // Include the hash for every module we import functions from. The set of
135   // imported symbols for each module may affect code generation and is
136   // sensitive to link order, so include that as well.
137   for (auto &Entry : ImportList) {
138     auto ModHash = Index.getModuleHash(Entry.first());
139     Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
140 
141     AddUint64(Entry.second.size());
142     for (auto &Fn : Entry.second)
143       AddUint64(Fn.first);
144   }
145 
146   // Include the hash for the resolved ODR.
147   for (auto &Entry : ResolvedODR) {
148     Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.first,
149                                     sizeof(GlobalValue::GUID)));
150     Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.second,
151                                     sizeof(GlobalValue::LinkageTypes)));
152   }
153 
154   std::set<GlobalValue::GUID> UsedTypeIds;
155 
156   auto AddUsedTypeIds = [&](GlobalValueSummary *GS) {
157     auto *FS = dyn_cast_or_null<FunctionSummary>(GS);
158     if (!FS)
159       return;
160     for (auto &TT : FS->type_tests())
161       UsedTypeIds.insert(TT);
162     for (auto &TT : FS->type_test_assume_vcalls())
163       UsedTypeIds.insert(TT.GUID);
164     for (auto &TT : FS->type_checked_load_vcalls())
165       UsedTypeIds.insert(TT.GUID);
166     for (auto &TT : FS->type_test_assume_const_vcalls())
167       UsedTypeIds.insert(TT.VFunc.GUID);
168     for (auto &TT : FS->type_checked_load_const_vcalls())
169       UsedTypeIds.insert(TT.VFunc.GUID);
170   };
171 
172   // Include the hash for the linkage type to reflect internalization and weak
173   // resolution, and collect any used type identifier resolutions.
174   for (auto &GS : DefinedGlobals) {
175     GlobalValue::LinkageTypes Linkage = GS.second->linkage();
176     Hasher.update(
177         ArrayRef<uint8_t>((const uint8_t *)&Linkage, sizeof(Linkage)));
178     AddUsedTypeIds(GS.second);
179   }
180 
181   // Imported functions may introduce new uses of type identifier resolutions,
182   // so we need to collect their used resolutions as well.
183   for (auto &ImpM : ImportList)
184     for (auto &ImpF : ImpM.second)
185       AddUsedTypeIds(Index.findSummaryInModule(ImpF.first, ImpM.first()));
186 
187   auto AddTypeIdSummary = [&](StringRef TId, const TypeIdSummary &S) {
188     AddString(TId);
189 
190     AddUnsigned(S.TTRes.TheKind);
191     AddUnsigned(S.TTRes.SizeM1BitWidth);
192 
193     AddUint64(S.WPDRes.size());
194     for (auto &WPD : S.WPDRes) {
195       AddUnsigned(WPD.first);
196       AddUnsigned(WPD.second.TheKind);
197       AddString(WPD.second.SingleImplName);
198 
199       AddUint64(WPD.second.ResByArg.size());
200       for (auto &ByArg : WPD.second.ResByArg) {
201         AddUint64(ByArg.first.size());
202         for (uint64_t Arg : ByArg.first)
203           AddUint64(Arg);
204         AddUnsigned(ByArg.second.TheKind);
205         AddUint64(ByArg.second.Info);
206       }
207     }
208   };
209 
210   // Include the hash for all type identifiers used by this module.
211   for (GlobalValue::GUID TId : UsedTypeIds) {
212     auto SummariesI = TypeIdSummariesByGuid.find(TId);
213     if (SummariesI != TypeIdSummariesByGuid.end())
214       for (auto *Summary : SummariesI->second)
215         AddTypeIdSummary(Summary->first, Summary->second);
216   }
217 
218   if (!Conf.SampleProfile.empty()) {
219     auto FileOrErr = MemoryBuffer::getFile(Conf.SampleProfile);
220     if (FileOrErr)
221       Hasher.update(FileOrErr.get()->getBuffer());
222   }
223 
224   Key = toHex(Hasher.result());
225 }
226 
227 static void thinLTOResolveWeakForLinkerGUID(
228     GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID,
229     DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias,
230     function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
231         isPrevailing,
232     function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
233         recordNewLinkage) {
234   for (auto &S : GVSummaryList) {
235     GlobalValue::LinkageTypes OriginalLinkage = S->linkage();
236     if (!GlobalValue::isWeakForLinker(OriginalLinkage))
237       continue;
238     // We need to emit only one of these. The prevailing module will keep it,
239     // but turned into a weak, while the others will drop it when possible.
240     // This is both a compile-time optimization and a correctness
241     // transformation. This is necessary for correctness when we have exported
242     // a reference - we need to convert the linkonce to weak to
243     // ensure a copy is kept to satisfy the exported reference.
244     // FIXME: We may want to split the compile time and correctness
245     // aspects into separate routines.
246     if (isPrevailing(GUID, S.get())) {
247       if (GlobalValue::isLinkOnceLinkage(OriginalLinkage))
248         S->setLinkage(GlobalValue::getWeakLinkage(
249             GlobalValue::isLinkOnceODRLinkage(OriginalLinkage)));
250     }
251     // Alias and aliasee can't be turned into available_externally.
252     else if (!isa<AliasSummary>(S.get()) &&
253              !GlobalInvolvedWithAlias.count(S.get()))
254       S->setLinkage(GlobalValue::AvailableExternallyLinkage);
255     if (S->linkage() != OriginalLinkage)
256       recordNewLinkage(S->modulePath(), GUID, S->linkage());
257   }
258 }
259 
260 // Resolve Weak and LinkOnce values in the \p Index.
261 //
262 // We'd like to drop these functions if they are no longer referenced in the
263 // current module. However there is a chance that another module is still
264 // referencing them because of the import. We make sure we always emit at least
265 // one copy.
266 void llvm::thinLTOResolveWeakForLinkerInIndex(
267     ModuleSummaryIndex &Index,
268     function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
269         isPrevailing,
270     function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
271         recordNewLinkage) {
272   // We won't optimize the globals that are referenced by an alias for now
273   // Ideally we should turn the alias into a global and duplicate the definition
274   // when needed.
275   DenseSet<GlobalValueSummary *> GlobalInvolvedWithAlias;
276   for (auto &I : Index)
277     for (auto &S : I.second)
278       if (auto AS = dyn_cast<AliasSummary>(S.get()))
279         GlobalInvolvedWithAlias.insert(&AS->getAliasee());
280 
281   for (auto &I : Index)
282     thinLTOResolveWeakForLinkerGUID(I.second, I.first, GlobalInvolvedWithAlias,
283                                     isPrevailing, recordNewLinkage);
284 }
285 
286 static void thinLTOInternalizeAndPromoteGUID(
287     GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID,
288     function_ref<bool(StringRef, GlobalValue::GUID)> isExported) {
289   for (auto &S : GVSummaryList) {
290     if (isExported(S->modulePath(), GUID)) {
291       if (GlobalValue::isLocalLinkage(S->linkage()))
292         S->setLinkage(GlobalValue::ExternalLinkage);
293     } else if (!GlobalValue::isLocalLinkage(S->linkage()))
294       S->setLinkage(GlobalValue::InternalLinkage);
295   }
296 }
297 
298 // Update the linkages in the given \p Index to mark exported values
299 // as external and non-exported values as internal.
300 void llvm::thinLTOInternalizeAndPromoteInIndex(
301     ModuleSummaryIndex &Index,
302     function_ref<bool(StringRef, GlobalValue::GUID)> isExported) {
303   for (auto &I : Index)
304     thinLTOInternalizeAndPromoteGUID(I.second, I.first, isExported);
305 }
306 
307 struct InputFile::InputModule {
308   BitcodeModule BM;
309   std::unique_ptr<Module> Mod;
310 
311   // The range of ModuleSymbolTable entries for this input module.
312   size_t SymBegin, SymEnd;
313 };
314 
315 // Requires a destructor for std::vector<InputModule>.
316 InputFile::~InputFile() = default;
317 
318 Expected<std::unique_ptr<InputFile>> InputFile::create(MemoryBufferRef Object) {
319   std::unique_ptr<InputFile> File(new InputFile);
320 
321   ErrorOr<MemoryBufferRef> BCOrErr =
322       IRObjectFile::findBitcodeInMemBuffer(Object);
323   if (!BCOrErr)
324     return errorCodeToError(BCOrErr.getError());
325 
326   Expected<std::vector<BitcodeModule>> BMsOrErr =
327       getBitcodeModuleList(*BCOrErr);
328   if (!BMsOrErr)
329     return BMsOrErr.takeError();
330 
331   if (BMsOrErr->empty())
332     return make_error<StringError>("Bitcode file does not contain any modules",
333                                    inconvertibleErrorCode());
334 
335   // Create an InputModule for each module in the InputFile, and add it to the
336   // ModuleSymbolTable.
337   for (auto BM : *BMsOrErr) {
338     Expected<std::unique_ptr<Module>> MOrErr =
339         BM.getLazyModule(File->Ctx, /*ShouldLazyLoadMetadata*/ true,
340                          /*IsImporting*/ false);
341     if (!MOrErr)
342       return MOrErr.takeError();
343 
344     size_t SymBegin = File->SymTab.symbols().size();
345     File->SymTab.addModule(MOrErr->get());
346     size_t SymEnd = File->SymTab.symbols().size();
347 
348     for (const auto &C : (*MOrErr)->getComdatSymbolTable()) {
349       auto P = File->ComdatMap.insert(
350           std::make_pair(&C.second, File->Comdats.size()));
351       assert(P.second);
352       (void)P;
353       File->Comdats.push_back(C.first());
354     }
355 
356     File->Mods.push_back({BM, std::move(*MOrErr), SymBegin, SymEnd});
357   }
358 
359   return std::move(File);
360 }
361 
362 Expected<int> InputFile::Symbol::getComdatIndex() const {
363   if (!isGV())
364     return -1;
365   const GlobalObject *GO = getGV()->getBaseObject();
366   if (!GO)
367     return make_error<StringError>("Unable to determine comdat of alias!",
368                                    inconvertibleErrorCode());
369   if (const Comdat *C = GO->getComdat()) {
370     auto I = File->ComdatMap.find(C);
371     assert(I != File->ComdatMap.end());
372     return I->second;
373   }
374   return -1;
375 }
376 
377 Expected<std::string> InputFile::getLinkerOpts() {
378   std::string LinkerOpts;
379   raw_string_ostream LOS(LinkerOpts);
380   // Extract linker options from module metadata.
381   for (InputModule &Mod : Mods) {
382     std::unique_ptr<Module> &M = Mod.Mod;
383     if (auto E = M->materializeMetadata())
384       return std::move(E);
385     if (Metadata *Val = M->getModuleFlag("Linker Options")) {
386       MDNode *LinkerOptions = cast<MDNode>(Val);
387       for (const MDOperand &MDOptions : LinkerOptions->operands())
388         for (const MDOperand &MDOption : cast<MDNode>(MDOptions)->operands())
389           LOS << " " << cast<MDString>(MDOption)->getString();
390     }
391   }
392 
393   // Synthesize export flags for symbols with dllexport storage.
394   const Triple TT(Mods[0].Mod->getTargetTriple());
395   Mangler M;
396   for (const ModuleSymbolTable::Symbol &Sym : SymTab.symbols())
397     if (auto *GV = Sym.dyn_cast<GlobalValue*>())
398       emitLinkerFlagsForGlobalCOFF(LOS, GV, TT, M);
399   LOS.flush();
400   return LinkerOpts;
401 }
402 
403 StringRef InputFile::getName() const {
404   return Mods[0].BM.getModuleIdentifier();
405 }
406 
407 StringRef InputFile::getSourceFileName() const {
408   return Mods[0].Mod->getSourceFileName();
409 }
410 
411 iterator_range<InputFile::symbol_iterator>
412 InputFile::module_symbols(InputModule &IM) {
413   return llvm::make_range(
414       symbol_iterator(SymTab.symbols().data() + IM.SymBegin, SymTab, this),
415       symbol_iterator(SymTab.symbols().data() + IM.SymEnd, SymTab, this));
416 }
417 
418 LTO::RegularLTOState::RegularLTOState(unsigned ParallelCodeGenParallelismLevel,
419                                       Config &Conf)
420     : ParallelCodeGenParallelismLevel(ParallelCodeGenParallelismLevel),
421       Ctx(Conf) {}
422 
423 LTO::ThinLTOState::ThinLTOState(ThinBackend Backend) : Backend(Backend) {
424   if (!Backend)
425     this->Backend =
426         createInProcessThinBackend(llvm::heavyweight_hardware_concurrency());
427 }
428 
429 LTO::LTO(Config Conf, ThinBackend Backend,
430          unsigned ParallelCodeGenParallelismLevel)
431     : Conf(std::move(Conf)),
432       RegularLTO(ParallelCodeGenParallelismLevel, this->Conf),
433       ThinLTO(std::move(Backend)) {}
434 
435 // Requires a destructor for MapVector<BitcodeModule>.
436 LTO::~LTO() = default;
437 
438 // Add the given symbol to the GlobalResolutions map, and resolve its partition.
439 void LTO::addSymbolToGlobalRes(SmallPtrSet<GlobalValue *, 8> &Used,
440                                const InputFile::Symbol &Sym,
441                                SymbolResolution Res, unsigned Partition) {
442   GlobalValue *GV = Sym.isGV() ? Sym.getGV() : nullptr;
443 
444   auto &GlobalRes = GlobalResolutions[Sym.getName()];
445   if (GV) {
446     GlobalRes.UnnamedAddr &= GV->hasGlobalUnnamedAddr();
447     if (Res.Prevailing)
448       GlobalRes.IRName = GV->getName();
449   }
450   // Set the partition to external if we know it is used elsewhere, e.g.
451   // it is visible to a regular object, is referenced from llvm.compiler_used,
452   // or was already recorded as being referenced from a different partition.
453   if (Res.VisibleToRegularObj || (GV && Used.count(GV)) ||
454       (GlobalRes.Partition != GlobalResolution::Unknown &&
455        GlobalRes.Partition != Partition)) {
456     GlobalRes.Partition = GlobalResolution::External;
457   } else
458     // First recorded reference, save the current partition.
459     GlobalRes.Partition = Partition;
460 
461   // Flag as visible outside of ThinLTO if visible from a regular object or
462   // if this is a reference in the regular LTO partition.
463   GlobalRes.VisibleOutsideThinLTO |=
464       (Res.VisibleToRegularObj || (Partition == GlobalResolution::RegularLTO));
465 }
466 
467 static void writeToResolutionFile(raw_ostream &OS, InputFile *Input,
468                                   ArrayRef<SymbolResolution> Res) {
469   StringRef Path = Input->getName();
470   OS << Path << '\n';
471   auto ResI = Res.begin();
472   for (const InputFile::Symbol &Sym : Input->symbols()) {
473     assert(ResI != Res.end());
474     SymbolResolution Res = *ResI++;
475 
476     OS << "-r=" << Path << ',' << Sym.getName() << ',';
477     if (Res.Prevailing)
478       OS << 'p';
479     if (Res.FinalDefinitionInLinkageUnit)
480       OS << 'l';
481     if (Res.VisibleToRegularObj)
482       OS << 'x';
483     OS << '\n';
484   }
485   OS.flush();
486   assert(ResI == Res.end());
487 }
488 
489 Error LTO::add(std::unique_ptr<InputFile> Input,
490                ArrayRef<SymbolResolution> Res) {
491   assert(!CalledGetMaxTasks);
492 
493   if (Conf.ResolutionFile)
494     writeToResolutionFile(*Conf.ResolutionFile, Input.get(), Res);
495 
496   const SymbolResolution *ResI = Res.begin();
497   for (InputFile::InputModule &IM : Input->Mods)
498     if (Error Err = addModule(*Input, IM, ResI, Res.end()))
499       return Err;
500 
501   assert(ResI == Res.end());
502   return Error::success();
503 }
504 
505 Error LTO::addModule(InputFile &Input, InputFile::InputModule &IM,
506                      const SymbolResolution *&ResI,
507                      const SymbolResolution *ResE) {
508   // FIXME: move to backend
509   Module &M = *IM.Mod;
510 
511   if (M.getDataLayoutStr().empty())
512     return make_error<StringError>("input module has no datalayout",
513                                     inconvertibleErrorCode());
514 
515   if (!Conf.OverrideTriple.empty())
516     M.setTargetTriple(Conf.OverrideTriple);
517   else if (M.getTargetTriple().empty())
518     M.setTargetTriple(Conf.DefaultTriple);
519 
520   Expected<bool> HasThinLTOSummary = IM.BM.hasSummary();
521   if (!HasThinLTOSummary)
522     return HasThinLTOSummary.takeError();
523 
524   if (*HasThinLTOSummary)
525     return addThinLTO(IM.BM, M, Input.module_symbols(IM), ResI, ResE);
526   else
527     return addRegularLTO(IM.BM, ResI, ResE);
528 }
529 
530 // Add a regular LTO object to the link.
531 Error LTO::addRegularLTO(BitcodeModule BM, const SymbolResolution *&ResI,
532                          const SymbolResolution *ResE) {
533   if (!RegularLTO.CombinedModule) {
534     RegularLTO.CombinedModule =
535         llvm::make_unique<Module>("ld-temp.o", RegularLTO.Ctx);
536     RegularLTO.Mover = llvm::make_unique<IRMover>(*RegularLTO.CombinedModule);
537   }
538   Expected<std::unique_ptr<Module>> MOrErr =
539       BM.getLazyModule(RegularLTO.Ctx, /*ShouldLazyLoadMetadata*/ true,
540                        /*IsImporting*/ false);
541   if (!MOrErr)
542     return MOrErr.takeError();
543 
544   Module &M = **MOrErr;
545   if (Error Err = M.materializeMetadata())
546     return Err;
547   UpgradeDebugInfo(M);
548 
549   ModuleSymbolTable SymTab;
550   SymTab.addModule(&M);
551 
552   SmallPtrSet<GlobalValue *, 8> Used;
553   collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);
554 
555   std::vector<GlobalValue *> Keep;
556 
557   for (GlobalVariable &GV : M.globals())
558     if (GV.hasAppendingLinkage())
559       Keep.push_back(&GV);
560 
561   DenseSet<GlobalObject *> AliasedGlobals;
562   for (auto &GA : M.aliases())
563     if (GlobalObject *GO = GA.getBaseObject())
564       AliasedGlobals.insert(GO);
565 
566   for (const InputFile::Symbol &Sym :
567        make_range(InputFile::symbol_iterator(SymTab.symbols().begin(), SymTab,
568                                              nullptr),
569                   InputFile::symbol_iterator(SymTab.symbols().end(), SymTab,
570                                              nullptr))) {
571     assert(ResI != ResE);
572     SymbolResolution Res = *ResI++;
573     addSymbolToGlobalRes(Used, Sym, Res, 0);
574 
575     if (Sym.isGV()) {
576       GlobalValue *GV = Sym.getGV();
577       if (Res.Prevailing) {
578         if (Sym.getFlags() & object::BasicSymbolRef::SF_Undefined)
579           continue;
580         Keep.push_back(GV);
581         switch (GV->getLinkage()) {
582         default:
583           break;
584         case GlobalValue::LinkOnceAnyLinkage:
585           GV->setLinkage(GlobalValue::WeakAnyLinkage);
586           break;
587         case GlobalValue::LinkOnceODRLinkage:
588           GV->setLinkage(GlobalValue::WeakODRLinkage);
589           break;
590         }
591       } else if (isa<GlobalObject>(GV) &&
592                  (GV->hasLinkOnceODRLinkage() || GV->hasWeakODRLinkage() ||
593                   GV->hasAvailableExternallyLinkage()) &&
594                  !AliasedGlobals.count(cast<GlobalObject>(GV))) {
595         // Either of the above three types of linkage indicates that the
596         // chosen prevailing symbol will have the same semantics as this copy of
597         // the symbol, so we can link it with available_externally linkage. We
598         // only need to do this if the symbol is undefined.
599         GlobalValue *CombinedGV =
600             RegularLTO.CombinedModule->getNamedValue(GV->getName());
601         if (!CombinedGV || CombinedGV->isDeclaration()) {
602           Keep.push_back(GV);
603           GV->setLinkage(GlobalValue::AvailableExternallyLinkage);
604           cast<GlobalObject>(GV)->setComdat(nullptr);
605         }
606       }
607     }
608     // Common resolution: collect the maximum size/alignment over all commons.
609     // We also record if we see an instance of a common as prevailing, so that
610     // if none is prevailing we can ignore it later.
611     if (Sym.getFlags() & object::BasicSymbolRef::SF_Common) {
612       // FIXME: We should figure out what to do about commons defined by asm.
613       // For now they aren't reported correctly by ModuleSymbolTable.
614       auto &CommonRes = RegularLTO.Commons[Sym.getGV()->getName()];
615       CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize());
616       CommonRes.Align = std::max(CommonRes.Align, Sym.getCommonAlignment());
617       CommonRes.Prevailing |= Res.Prevailing;
618     }
619 
620     // FIXME: use proposed local attribute for FinalDefinitionInLinkageUnit.
621   }
622 
623   return RegularLTO.Mover->move(std::move(*MOrErr), Keep,
624                                 [](GlobalValue &, IRMover::ValueAdder) {},
625                                 /* IsPerformingImport */ false);
626 }
627 
628 // Add a ThinLTO object to the link.
629 // FIXME: This function should not need to take as many parameters once we have
630 // a bitcode symbol table.
631 Error LTO::addThinLTO(BitcodeModule BM, Module &M,
632                       iterator_range<InputFile::symbol_iterator> Syms,
633                       const SymbolResolution *&ResI,
634                       const SymbolResolution *ResE) {
635   SmallPtrSet<GlobalValue *, 8> Used;
636   collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);
637 
638   Expected<std::unique_ptr<ModuleSummaryIndex>> SummaryOrErr = BM.getSummary();
639   if (!SummaryOrErr)
640     return SummaryOrErr.takeError();
641   ThinLTO.CombinedIndex.mergeFrom(std::move(*SummaryOrErr),
642                                   ThinLTO.ModuleMap.size());
643 
644   for (const InputFile::Symbol &Sym : Syms) {
645     assert(ResI != ResE);
646     SymbolResolution Res = *ResI++;
647     addSymbolToGlobalRes(Used, Sym, Res, ThinLTO.ModuleMap.size() + 1);
648 
649     if (Res.Prevailing && Sym.isGV())
650       ThinLTO.PrevailingModuleForGUID[Sym.getGV()->getGUID()] =
651           BM.getModuleIdentifier();
652   }
653 
654   if (!ThinLTO.ModuleMap.insert({BM.getModuleIdentifier(), BM}).second)
655     return make_error<StringError>(
656         "Expected at most one ThinLTO module per bitcode file",
657         inconvertibleErrorCode());
658 
659   return Error::success();
660 }
661 
662 unsigned LTO::getMaxTasks() const {
663   CalledGetMaxTasks = true;
664   return RegularLTO.ParallelCodeGenParallelismLevel + ThinLTO.ModuleMap.size();
665 }
666 
667 Error LTO::run(AddStreamFn AddStream, NativeObjectCache Cache) {
668   // Save the status of having a regularLTO combined module, as
669   // this is needed for generating the ThinLTO Task ID, and
670   // the CombinedModule will be moved at the end of runRegularLTO.
671   bool HasRegularLTO = RegularLTO.CombinedModule != nullptr;
672   // Invoke regular LTO if there was a regular LTO module to start with.
673   if (HasRegularLTO)
674     if (auto E = runRegularLTO(AddStream))
675       return E;
676   return runThinLTO(AddStream, Cache, HasRegularLTO);
677 }
678 
679 Error LTO::runRegularLTO(AddStreamFn AddStream) {
680   // Make sure commons have the right size/alignment: we kept the largest from
681   // all the prevailing when adding the inputs, and we apply it here.
682   const DataLayout &DL = RegularLTO.CombinedModule->getDataLayout();
683   for (auto &I : RegularLTO.Commons) {
684     if (!I.second.Prevailing)
685       // Don't do anything if no instance of this common was prevailing.
686       continue;
687     GlobalVariable *OldGV = RegularLTO.CombinedModule->getNamedGlobal(I.first);
688     if (OldGV && DL.getTypeAllocSize(OldGV->getValueType()) == I.second.Size) {
689       // Don't create a new global if the type is already correct, just make
690       // sure the alignment is correct.
691       OldGV->setAlignment(I.second.Align);
692       continue;
693     }
694     ArrayType *Ty =
695         ArrayType::get(Type::getInt8Ty(RegularLTO.Ctx), I.second.Size);
696     auto *GV = new GlobalVariable(*RegularLTO.CombinedModule, Ty, false,
697                                   GlobalValue::CommonLinkage,
698                                   ConstantAggregateZero::get(Ty), "");
699     GV->setAlignment(I.second.Align);
700     if (OldGV) {
701       OldGV->replaceAllUsesWith(ConstantExpr::getBitCast(GV, OldGV->getType()));
702       GV->takeName(OldGV);
703       OldGV->eraseFromParent();
704     } else {
705       GV->setName(I.first);
706     }
707   }
708 
709   if (Conf.PreOptModuleHook &&
710       !Conf.PreOptModuleHook(0, *RegularLTO.CombinedModule))
711     return Error::success();
712 
713   if (!Conf.CodeGenOnly) {
714     for (const auto &R : GlobalResolutions) {
715       if (R.second.IRName.empty())
716         continue;
717       if (R.second.Partition != 0 &&
718           R.second.Partition != GlobalResolution::External)
719         continue;
720 
721       GlobalValue *GV =
722           RegularLTO.CombinedModule->getNamedValue(R.second.IRName);
723       // Ignore symbols defined in other partitions.
724       if (!GV || GV->hasLocalLinkage())
725         continue;
726       GV->setUnnamedAddr(R.second.UnnamedAddr ? GlobalValue::UnnamedAddr::Global
727                                               : GlobalValue::UnnamedAddr::None);
728       if (R.second.Partition == 0)
729         GV->setLinkage(GlobalValue::InternalLinkage);
730     }
731 
732     if (Conf.PostInternalizeModuleHook &&
733         !Conf.PostInternalizeModuleHook(0, *RegularLTO.CombinedModule))
734       return Error::success();
735   }
736   return backend(Conf, AddStream, RegularLTO.ParallelCodeGenParallelismLevel,
737                  std::move(RegularLTO.CombinedModule), ThinLTO.CombinedIndex);
738 }
739 
740 /// This class defines the interface to the ThinLTO backend.
741 class lto::ThinBackendProc {
742 protected:
743   Config &Conf;
744   ModuleSummaryIndex &CombinedIndex;
745   const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries;
746 
747 public:
748   ThinBackendProc(Config &Conf, ModuleSummaryIndex &CombinedIndex,
749                   const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries)
750       : Conf(Conf), CombinedIndex(CombinedIndex),
751         ModuleToDefinedGVSummaries(ModuleToDefinedGVSummaries) {}
752 
753   virtual ~ThinBackendProc() {}
754   virtual Error start(
755       unsigned Task, BitcodeModule BM,
756       const FunctionImporter::ImportMapTy &ImportList,
757       const FunctionImporter::ExportSetTy &ExportList,
758       const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
759       MapVector<StringRef, BitcodeModule> &ModuleMap) = 0;
760   virtual Error wait() = 0;
761 };
762 
763 namespace {
764 class InProcessThinBackend : public ThinBackendProc {
765   ThreadPool BackendThreadPool;
766   AddStreamFn AddStream;
767   NativeObjectCache Cache;
768   TypeIdSummariesByGuidTy TypeIdSummariesByGuid;
769 
770   Optional<Error> Err;
771   std::mutex ErrMu;
772 
773 public:
774   InProcessThinBackend(
775       Config &Conf, ModuleSummaryIndex &CombinedIndex,
776       unsigned ThinLTOParallelismLevel,
777       const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries,
778       AddStreamFn AddStream, NativeObjectCache Cache)
779       : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries),
780         BackendThreadPool(ThinLTOParallelismLevel),
781         AddStream(std::move(AddStream)), Cache(std::move(Cache)) {
782     // Create a mapping from type identifier GUIDs to type identifier summaries.
783     // This allows backends to use the type identifier GUIDs stored in the
784     // function summaries to determine which type identifier summaries affect
785     // each function without needing to compute GUIDs in each backend.
786     for (auto &TId : CombinedIndex.typeIds())
787       TypeIdSummariesByGuid[GlobalValue::getGUID(TId.first)].push_back(&TId);
788   }
789 
790   Error runThinLTOBackendThread(
791       AddStreamFn AddStream, NativeObjectCache Cache, unsigned Task,
792       BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
793       const FunctionImporter::ImportMapTy &ImportList,
794       const FunctionImporter::ExportSetTy &ExportList,
795       const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
796       const GVSummaryMapTy &DefinedGlobals,
797       MapVector<StringRef, BitcodeModule> &ModuleMap,
798       const TypeIdSummariesByGuidTy &TypeIdSummariesByGuid) {
799     auto RunThinBackend = [&](AddStreamFn AddStream) {
800       LTOLLVMContext BackendContext(Conf);
801       Expected<std::unique_ptr<Module>> MOrErr = BM.parseModule(BackendContext);
802       if (!MOrErr)
803         return MOrErr.takeError();
804 
805       return thinBackend(Conf, Task, AddStream, **MOrErr, CombinedIndex,
806                          ImportList, DefinedGlobals, ModuleMap);
807     };
808 
809     auto ModuleID = BM.getModuleIdentifier();
810 
811     if (!Cache || !CombinedIndex.modulePaths().count(ModuleID) ||
812         all_of(CombinedIndex.getModuleHash(ModuleID),
813                [](uint32_t V) { return V == 0; }))
814       // Cache disabled or no entry for this module in the combined index or
815       // no module hash.
816       return RunThinBackend(AddStream);
817 
818     SmallString<40> Key;
819     // The module may be cached, this helps handling it.
820     computeCacheKey(Key, Conf, CombinedIndex, ModuleID, ImportList, ExportList,
821                     ResolvedODR, DefinedGlobals, TypeIdSummariesByGuid);
822     if (AddStreamFn CacheAddStream = Cache(Task, Key))
823       return RunThinBackend(CacheAddStream);
824 
825     return Error::success();
826   }
827 
828   Error start(
829       unsigned Task, BitcodeModule BM,
830       const FunctionImporter::ImportMapTy &ImportList,
831       const FunctionImporter::ExportSetTy &ExportList,
832       const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
833       MapVector<StringRef, BitcodeModule> &ModuleMap) override {
834     StringRef ModulePath = BM.getModuleIdentifier();
835     assert(ModuleToDefinedGVSummaries.count(ModulePath));
836     const GVSummaryMapTy &DefinedGlobals =
837         ModuleToDefinedGVSummaries.find(ModulePath)->second;
838     BackendThreadPool.async(
839         [=](BitcodeModule BM, ModuleSummaryIndex &CombinedIndex,
840             const FunctionImporter::ImportMapTy &ImportList,
841             const FunctionImporter::ExportSetTy &ExportList,
842             const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>
843                 &ResolvedODR,
844             const GVSummaryMapTy &DefinedGlobals,
845             MapVector<StringRef, BitcodeModule> &ModuleMap,
846             const TypeIdSummariesByGuidTy &TypeIdSummariesByGuid) {
847           Error E = runThinLTOBackendThread(
848               AddStream, Cache, Task, BM, CombinedIndex, ImportList, ExportList,
849               ResolvedODR, DefinedGlobals, ModuleMap, TypeIdSummariesByGuid);
850           if (E) {
851             std::unique_lock<std::mutex> L(ErrMu);
852             if (Err)
853               Err = joinErrors(std::move(*Err), std::move(E));
854             else
855               Err = std::move(E);
856           }
857         },
858         BM, std::ref(CombinedIndex), std::ref(ImportList), std::ref(ExportList),
859         std::ref(ResolvedODR), std::ref(DefinedGlobals), std::ref(ModuleMap),
860         std::ref(TypeIdSummariesByGuid));
861     return Error::success();
862   }
863 
864   Error wait() override {
865     BackendThreadPool.wait();
866     if (Err)
867       return std::move(*Err);
868     else
869       return Error::success();
870   }
871 };
872 } // end anonymous namespace
873 
874 ThinBackend lto::createInProcessThinBackend(unsigned ParallelismLevel) {
875   return [=](Config &Conf, ModuleSummaryIndex &CombinedIndex,
876              const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries,
877              AddStreamFn AddStream, NativeObjectCache Cache) {
878     return llvm::make_unique<InProcessThinBackend>(
879         Conf, CombinedIndex, ParallelismLevel, ModuleToDefinedGVSummaries,
880         AddStream, Cache);
881   };
882 }
883 
884 // Given the original \p Path to an output file, replace any path
885 // prefix matching \p OldPrefix with \p NewPrefix. Also, create the
886 // resulting directory if it does not yet exist.
887 std::string lto::getThinLTOOutputFile(const std::string &Path,
888                                       const std::string &OldPrefix,
889                                       const std::string &NewPrefix) {
890   if (OldPrefix.empty() && NewPrefix.empty())
891     return Path;
892   SmallString<128> NewPath(Path);
893   llvm::sys::path::replace_path_prefix(NewPath, OldPrefix, NewPrefix);
894   StringRef ParentPath = llvm::sys::path::parent_path(NewPath.str());
895   if (!ParentPath.empty()) {
896     // Make sure the new directory exists, creating it if necessary.
897     if (std::error_code EC = llvm::sys::fs::create_directories(ParentPath))
898       llvm::errs() << "warning: could not create directory '" << ParentPath
899                    << "': " << EC.message() << '\n';
900   }
901   return NewPath.str();
902 }
903 
904 namespace {
905 class WriteIndexesThinBackend : public ThinBackendProc {
906   std::string OldPrefix, NewPrefix;
907   bool ShouldEmitImportsFiles;
908 
909   std::string LinkedObjectsFileName;
910   std::unique_ptr<llvm::raw_fd_ostream> LinkedObjectsFile;
911 
912 public:
913   WriteIndexesThinBackend(
914       Config &Conf, ModuleSummaryIndex &CombinedIndex,
915       const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries,
916       std::string OldPrefix, std::string NewPrefix, bool ShouldEmitImportsFiles,
917       std::string LinkedObjectsFileName)
918       : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries),
919         OldPrefix(OldPrefix), NewPrefix(NewPrefix),
920         ShouldEmitImportsFiles(ShouldEmitImportsFiles),
921         LinkedObjectsFileName(LinkedObjectsFileName) {}
922 
923   Error start(
924       unsigned Task, BitcodeModule BM,
925       const FunctionImporter::ImportMapTy &ImportList,
926       const FunctionImporter::ExportSetTy &ExportList,
927       const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
928       MapVector<StringRef, BitcodeModule> &ModuleMap) override {
929     StringRef ModulePath = BM.getModuleIdentifier();
930     std::string NewModulePath =
931         getThinLTOOutputFile(ModulePath, OldPrefix, NewPrefix);
932 
933     std::error_code EC;
934     if (!LinkedObjectsFileName.empty()) {
935       if (!LinkedObjectsFile) {
936         LinkedObjectsFile = llvm::make_unique<raw_fd_ostream>(
937             LinkedObjectsFileName, EC, sys::fs::OpenFlags::F_None);
938         if (EC)
939           return errorCodeToError(EC);
940       }
941       *LinkedObjectsFile << NewModulePath << '\n';
942     }
943 
944     std::map<std::string, GVSummaryMapTy> ModuleToSummariesForIndex;
945     gatherImportedSummariesForModule(ModulePath, ModuleToDefinedGVSummaries,
946                                      ImportList, ModuleToSummariesForIndex);
947 
948     raw_fd_ostream OS(NewModulePath + ".thinlto.bc", EC,
949                       sys::fs::OpenFlags::F_None);
950     if (EC)
951       return errorCodeToError(EC);
952     WriteIndexToFile(CombinedIndex, OS, &ModuleToSummariesForIndex);
953 
954     if (ShouldEmitImportsFiles)
955       return errorCodeToError(
956           EmitImportsFiles(ModulePath, NewModulePath + ".imports", ImportList));
957     return Error::success();
958   }
959 
960   Error wait() override { return Error::success(); }
961 };
962 } // end anonymous namespace
963 
964 ThinBackend lto::createWriteIndexesThinBackend(std::string OldPrefix,
965                                                std::string NewPrefix,
966                                                bool ShouldEmitImportsFiles,
967                                                std::string LinkedObjectsFile) {
968   return [=](Config &Conf, ModuleSummaryIndex &CombinedIndex,
969              const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries,
970              AddStreamFn AddStream, NativeObjectCache Cache) {
971     return llvm::make_unique<WriteIndexesThinBackend>(
972         Conf, CombinedIndex, ModuleToDefinedGVSummaries, OldPrefix, NewPrefix,
973         ShouldEmitImportsFiles, LinkedObjectsFile);
974   };
975 }
976 
977 Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
978                       bool HasRegularLTO) {
979   if (ThinLTO.ModuleMap.empty())
980     return Error::success();
981 
982   if (Conf.CombinedIndexHook && !Conf.CombinedIndexHook(ThinLTO.CombinedIndex))
983     return Error::success();
984 
985   // Collect for each module the list of function it defines (GUID ->
986   // Summary).
987   StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>>
988       ModuleToDefinedGVSummaries(ThinLTO.ModuleMap.size());
989   ThinLTO.CombinedIndex.collectDefinedGVSummariesPerModule(
990       ModuleToDefinedGVSummaries);
991   // Create entries for any modules that didn't have any GV summaries
992   // (either they didn't have any GVs to start with, or we suppressed
993   // generation of the summaries because they e.g. had inline assembly
994   // uses that couldn't be promoted/renamed on export). This is so
995   // InProcessThinBackend::start can still launch a backend thread, which
996   // is passed the map of summaries for the module, without any special
997   // handling for this case.
998   for (auto &Mod : ThinLTO.ModuleMap)
999     if (!ModuleToDefinedGVSummaries.count(Mod.first))
1000       ModuleToDefinedGVSummaries.try_emplace(Mod.first);
1001 
1002   StringMap<FunctionImporter::ImportMapTy> ImportLists(
1003       ThinLTO.ModuleMap.size());
1004   StringMap<FunctionImporter::ExportSetTy> ExportLists(
1005       ThinLTO.ModuleMap.size());
1006   StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
1007 
1008   if (Conf.OptLevel > 0) {
1009     // Compute "dead" symbols, we don't want to import/export these!
1010     DenseSet<GlobalValue::GUID> GUIDPreservedSymbols;
1011     for (auto &Res : GlobalResolutions) {
1012       if (Res.second.VisibleOutsideThinLTO &&
1013           // IRName will be defined if we have seen the prevailing copy of
1014           // this value. If not, no need to preserve any ThinLTO copies.
1015           !Res.second.IRName.empty())
1016         GUIDPreservedSymbols.insert(GlobalValue::getGUID(Res.second.IRName));
1017     }
1018 
1019     auto DeadSymbols =
1020         computeDeadSymbols(ThinLTO.CombinedIndex, GUIDPreservedSymbols);
1021 
1022     ComputeCrossModuleImport(ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries,
1023                              ImportLists, ExportLists, &DeadSymbols);
1024 
1025     std::set<GlobalValue::GUID> ExportedGUIDs;
1026     for (auto &Res : GlobalResolutions) {
1027       // First check if the symbol was flagged as having external references.
1028       if (Res.second.Partition != GlobalResolution::External)
1029         continue;
1030       // IRName will be defined if we have seen the prevailing copy of
1031       // this value. If not, no need to mark as exported from a ThinLTO
1032       // partition (and we can't get the GUID).
1033       if (Res.second.IRName.empty())
1034         continue;
1035       auto GUID = GlobalValue::getGUID(Res.second.IRName);
1036       // Mark exported unless index-based analysis determined it to be dead.
1037       if (!DeadSymbols.count(GUID))
1038         ExportedGUIDs.insert(GlobalValue::getGUID(Res.second.IRName));
1039     }
1040 
1041     auto isPrevailing = [&](GlobalValue::GUID GUID,
1042                             const GlobalValueSummary *S) {
1043       return ThinLTO.PrevailingModuleForGUID[GUID] == S->modulePath();
1044     };
1045     auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) {
1046       const auto &ExportList = ExportLists.find(ModuleIdentifier);
1047       return (ExportList != ExportLists.end() &&
1048               ExportList->second.count(GUID)) ||
1049              ExportedGUIDs.count(GUID);
1050     };
1051     thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported);
1052 
1053     auto recordNewLinkage = [&](StringRef ModuleIdentifier,
1054                                 GlobalValue::GUID GUID,
1055                                 GlobalValue::LinkageTypes NewLinkage) {
1056       ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
1057     };
1058 
1059     thinLTOResolveWeakForLinkerInIndex(ThinLTO.CombinedIndex, isPrevailing,
1060                                        recordNewLinkage);
1061   }
1062 
1063   std::unique_ptr<ThinBackendProc> BackendProc =
1064       ThinLTO.Backend(Conf, ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries,
1065                       AddStream, Cache);
1066 
1067   // Task numbers start at ParallelCodeGenParallelismLevel if an LTO
1068   // module is present, as tasks 0 through ParallelCodeGenParallelismLevel-1
1069   // are reserved for parallel code generation partitions.
1070   unsigned Task =
1071       HasRegularLTO ? RegularLTO.ParallelCodeGenParallelismLevel : 0;
1072   for (auto &Mod : ThinLTO.ModuleMap) {
1073     if (Error E = BackendProc->start(Task, Mod.second, ImportLists[Mod.first],
1074                                      ExportLists[Mod.first],
1075                                      ResolvedODR[Mod.first], ThinLTO.ModuleMap))
1076       return E;
1077     ++Task;
1078   }
1079 
1080   return BackendProc->wait();
1081 }
1082 
1083 Expected<std::unique_ptr<tool_output_file>>
1084 lto::setupOptimizationRemarks(LLVMContext &Context,
1085                               StringRef LTORemarksFilename,
1086                               bool LTOPassRemarksWithHotness, int Count) {
1087   if (LTORemarksFilename.empty())
1088     return nullptr;
1089 
1090   std::string Filename = LTORemarksFilename;
1091   if (Count != -1)
1092     Filename += ".thin." + llvm::utostr(Count) + ".yaml";
1093 
1094   std::error_code EC;
1095   auto DiagnosticFile =
1096       llvm::make_unique<tool_output_file>(Filename, EC, sys::fs::F_None);
1097   if (EC)
1098     return errorCodeToError(EC);
1099   Context.setDiagnosticsOutputFile(
1100       llvm::make_unique<yaml::Output>(DiagnosticFile->os()));
1101   if (LTOPassRemarksWithHotness)
1102     Context.setDiagnosticHotnessRequested(true);
1103   DiagnosticFile->keep();
1104   return std::move(DiagnosticFile);
1105 }
1106