1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===-ThinLTOCodeGenerator.cpp - LLVM Link Time Optimizer -----------------===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file implements the Thin Link Time Optimization library. This library is
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// intended to be used by linker to optimize code at link time.
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/LTO/legacy/ThinLTOCodeGenerator.h"
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifdef HAVE_LLVM_REVISION
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "LLVMLTORevision.h"
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/Statistic.h"
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringExtras.h"
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/ModuleSummaryAnalysis.h"
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/TargetLibraryInfo.h"
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/TargetTransformInfo.h"
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Bitcode/BitcodeWriterPass.h"
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Bitcode/ReaderWriter.h"
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/ObjectMemoryBuffer.h"
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/DiagnosticPrinter.h"
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/LLVMContext.h"
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/LegacyPassManager.h"
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/Mangler.h"
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IRReader/IRReader.h"
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/LTO/LTO.h"
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Linker/Linker.h"
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/SubtargetFeature.h"
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Object/IRObjectFile.h"
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Object/ModuleSummaryIndexObjectFile.h"
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/CachePruning.h"
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Debug.h"
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Path.h"
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/SHA1.h"
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/TargetRegistry.h"
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/ThreadPool.h"
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Target/TargetMachine.h"
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO.h"
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO/FunctionImport.h"
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO/Internalize.h"
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO/PassManagerBuilder.h"
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/ObjCARC.h"
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/Utils/FunctionImportUtils.h"
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <numeric>
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm;
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define DEBUG_TYPE "thinlto"
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm {
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Flags -discard-value-names, defined in LTOCodeGenerator.cpp
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarextern cl::opt<bool> LTODiscardValueNames;
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace {
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic cl::opt<int> ThreadCount("threads",
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                cl::init(std::thread::hardware_concurrency()));
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void diagnosticHandler(const DiagnosticInfo &DI) {
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DiagnosticPrinterRawOStream DP(errs());
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DI.print(DP);
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  errs() << '\n';
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Simple helper to save temporary files for debug.
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void saveTempBitcode(const Module &TheModule, StringRef TempDir,
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            unsigned count, StringRef Suffix) {
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (TempDir.empty())
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // User asked to save temps, let dump the bitcode file after import.
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto SaveTempPath = TempDir + llvm::utostr(count) + Suffix;
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::error_code EC;
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  raw_fd_ostream OS(SaveTempPath.str(), EC, sys::fs::F_None);
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (EC)
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error(Twine("Failed to open ") + SaveTempPath +
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       " to save optimized bitcode\n");
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  WriteBitcodeToFile(&TheModule, OS, /* ShouldPreserveUseListOrder */ true);
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const GlobalValueSummary *
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainargetFirstDefinitionForLinker(const GlobalValueSummaryList &GVSummaryList) {
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If there is any strong definition anywhere, get it.
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto StrongDefForLinker = llvm::find_if(
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      GVSummaryList, [](const std::unique_ptr<GlobalValueSummary> &Summary) {
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto Linkage = Summary->linkage();
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return !GlobalValue::isAvailableExternallyLinkage(Linkage) &&
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               !GlobalValue::isWeakForLinker(Linkage);
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      });
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (StrongDefForLinker != GVSummaryList.end())
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return StrongDefForLinker->get();
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Get the first *linker visible* definition for this global in the summary
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // list.
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto FirstDefForLinker = llvm::find_if(
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      GVSummaryList, [](const std::unique_ptr<GlobalValueSummary> &Summary) {
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto Linkage = Summary->linkage();
106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return !GlobalValue::isAvailableExternallyLinkage(Linkage);
107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      });
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Extern templates can be emitted as available_externally.
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (FirstDefForLinker == GVSummaryList.end())
110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return nullptr;
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return FirstDefForLinker->get();
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Populate map of GUID to the prevailing copy for any multiply defined
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// symbols. Currently assume first copy is prevailing, or any strong
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// definition. Can be refined with Linker information in the future.
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void computePrevailingCopies(
118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const ModuleSummaryIndex &Index,
119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DenseMap<GlobalValue::GUID, const GlobalValueSummary *> &PrevailingCopy) {
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto HasMultipleCopies = [&](const GlobalValueSummaryList &GVSummaryList) {
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return GVSummaryList.size() > 1;
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &I : Index) {
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (HasMultipleCopies(I.second))
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      PrevailingCopy[I.first] = getFirstDefinitionForLinker(I.second);
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic StringMap<MemoryBufferRef>
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainargenerateModuleMap(const std::vector<MemoryBufferRef> &Modules) {
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<MemoryBufferRef> ModuleMap;
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &ModuleBuffer : Modules) {
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    assert(ModuleMap.find(ModuleBuffer.getBufferIdentifier()) ==
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               ModuleMap.end() &&
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           "Expect unique Buffer Identifier");
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ModuleMap[ModuleBuffer.getBufferIdentifier()] = ModuleBuffer;
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ModuleMap;
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void promoteModule(Module &TheModule, const ModuleSummaryIndex &Index) {
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (renameModuleForThinLTO(TheModule, Index))
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("renameModuleForThinLTO failed");
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarcrossImportIntoModule(Module &TheModule, const ModuleSummaryIndex &Index,
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      StringMap<MemoryBufferRef> &ModuleMap,
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      const FunctionImporter::ImportMapTy &ImportList) {
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ModuleLoader Loader(TheModule.getContext(), ModuleMap);
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  FunctionImporter Importer(Index, Loader);
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Importer.importFunctions(TheModule, ImportList);
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void optimizeModule(Module &TheModule, TargetMachine &TM) {
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Populate the PassManager
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PassManagerBuilder PMB;
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.LibraryInfo = new TargetLibraryInfoImpl(TM.getTargetTriple());
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.Inliner = createFunctionInliningPass();
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // FIXME: should get it from the bitcode?
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.OptLevel = 3;
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.LoopVectorize = true;
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.SLPVectorize = true;
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.VerifyInput = true;
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.VerifyOutput = false;
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  legacy::PassManager PM;
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Add the TTI (required to inform the vectorizer about register size for
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // instance)
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PM.add(createTargetTransformInfoWrapperPass(TM.getTargetIRAnalysis()));
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Add optimizations
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PMB.populateThinLTOPassManager(PM);
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PM.run(TheModule);
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Convert the PreservedSymbols map from "Name" based to "GUID" based.
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DenseSet<GlobalValue::GUID>
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarcomputeGUIDPreservedSymbols(const StringSet<> &PreservedSymbols,
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            const Triple &TheTriple) {
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DenseSet<GlobalValue::GUID> GUIDPreservedSymbols(PreservedSymbols.size());
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &Entry : PreservedSymbols) {
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Name = Entry.first();
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (TheTriple.isOSBinFormatMachO() && Name.size() > 0 && Name[0] == '_')
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Name = Name.drop_front();
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GUIDPreservedSymbols.insert(GlobalValue::getGUID(Name));
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return GUIDPreservedSymbols;
192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<MemoryBuffer> codegenModule(Module &TheModule,
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            TargetMachine &TM) {
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallVector<char, 128> OutputBuffer;
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // CodeGen
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_svector_ostream OS(OutputBuffer);
201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    legacy::PassManager PM;
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // If the bitcode files contain ARC code and were compiled with optimization,
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // the ObjCARCContractPass must be run, so do it unconditionally here.
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    PM.add(createObjCARCContractPass());
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Setup the codegen now.
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (TM.addPassesToEmitFile(PM, OS, TargetMachine::CGFT_ObjectFile,
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                               /* DisableVerify */ true))
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      report_fatal_error("Failed to setup codegen");
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Run codegen now. resulting binary is in OutputBuffer.
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    PM.run(TheModule);
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return make_unique<ObjectMemoryBuffer>(std::move(OutputBuffer));
216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Manage caching for a single Module.
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ModuleCacheEntry {
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallString<128> EntryPath;
221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Create a cache entry. This compute a unique hash for the Module considering
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // the current list of export/import, and offer an interface to query to
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // access the content in the cache.
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ModuleCacheEntry(
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      StringRef CachePath, const ModuleSummaryIndex &Index, StringRef ModuleID,
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const FunctionImporter::ImportMapTy &ImportList,
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const FunctionImporter::ExportSetTy &ExportList,
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const GVSummaryMapTy &DefinedFunctions,
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      const DenseSet<GlobalValue::GUID> &PreservedSymbols) {
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (CachePath.empty())
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Compute the unique hash for this entry
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // This is based on the current compiler version, the module itself, the
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // export list, the hash for every single module in the import list, the
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // list of ResolvedODR for the module, and the list of preserved symbols.
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SHA1 Hasher;
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Start with the compiler revision
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Hasher.update(LLVM_VERSION_STRING);
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifdef HAVE_LLVM_REVISION
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Hasher.update(LLVM_REVISION);
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Include the hash for the current module
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto ModHash = Index.getModuleHash(ModuleID);
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto F : ExportList)
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // The export list can impact the internalization, be conservative here
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Hasher.update(ArrayRef<uint8_t>((uint8_t *)&F, sizeof(F)));
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Include the hash for every module we import functions from
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto &Entry : ImportList) {
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      auto ModHash = Index.getModuleHash(Entry.first());
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Include the hash for the resolved ODR.
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto &Entry : ResolvedODR) {
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.first,
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      sizeof(GlobalValue::GUID)));
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.second,
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      sizeof(GlobalValue::LinkageTypes)));
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Include the hash for the preserved symbols.
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto &Entry : PreservedSymbols) {
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (DefinedFunctions.count(Entry))
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Hasher.update(
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ArrayRef<uint8_t>((const uint8_t *)&Entry, sizeof(GlobalValue::GUID)));
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    sys::path::append(EntryPath, CachePath, toHex(Hasher.result()));
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Access the path to this entry in the cache.
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef getEntryPath() { return EntryPath; }
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Try loading the buffer for this cache entry.
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ErrorOr<std::unique_ptr<MemoryBuffer>> tryLoadingBuffer() {
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (EntryPath.empty())
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return std::error_code();
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MemoryBuffer::getFile(EntryPath);
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Cache the Produced object file
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::unique_ptr<MemoryBuffer>
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  write(std::unique_ptr<MemoryBuffer> OutputBuffer) {
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (EntryPath.empty())
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return OutputBuffer;
295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Write to a temporary to avoid race condition
297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SmallString<128> TempFilename;
298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    int TempFD;
299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::error_code EC =
300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        sys::fs::createTemporaryFile("Thin", "tmp.o", TempFD, TempFilename);
301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (EC) {
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      errs() << "Error: " << EC.message() << "\n";
303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      report_fatal_error("ThinLTO: Can't get a temporary file");
304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {
306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raw_fd_ostream OS(TempFD, /* ShouldClose */ true);
307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS << OutputBuffer->getBuffer();
308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Rename to final destination (hopefully race condition won't matter here)
310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    EC = sys::fs::rename(TempFilename, EntryPath);
311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (EC) {
312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      sys::fs::remove(TempFilename);
313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raw_fd_ostream OS(EntryPath, EC, sys::fs::F_None);
314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (EC)
315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        report_fatal_error(Twine("Failed to open ") + EntryPath +
316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           " to save cached entry\n");
317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      OS << OutputBuffer->getBuffer();
318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto ReloadedBufferOrErr = MemoryBuffer::getFile(EntryPath);
320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (auto EC = ReloadedBufferOrErr.getError()) {
321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // FIXME diagnose
322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      errs() << "error: can't reload cached file '" << EntryPath
323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             << "': " << EC.message() << "\n";
324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return OutputBuffer;
325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return std::move(*ReloadedBufferOrErr);
327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic std::unique_ptr<MemoryBuffer>
331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index,
332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     StringMap<MemoryBufferRef> &ModuleMap, TargetMachine &TM,
333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     const FunctionImporter::ImportMapTy &ImportList,
334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     const FunctionImporter::ExportSetTy &ExportList,
335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols,
336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     const GVSummaryMapTy &DefinedGlobals,
337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     const ThinLTOCodeGenerator::CachingOptions &CacheOptions,
338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     bool DisableCodeGen, StringRef SaveTempsDir,
339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     unsigned count) {
340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // "Benchmark"-like optimization: single-source case
342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool SingleModule = (ModuleMap.size() == 1);
343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!SingleModule) {
345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    promoteModule(TheModule, Index);
346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Apply summary-based LinkOnce/Weak resolution decisions.
348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    thinLTOResolveWeakForLinkerModule(TheModule, DefinedGlobals);
349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Save temps: after promotion.
351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    saveTempBitcode(TheModule, SaveTempsDir, count, ".1.promoted.bc");
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Be friendly and don't nuke totally the module when the client didn't
355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // supply anything to preserve.
356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!ExportList.empty() || !GUIDPreservedSymbols.empty()) {
357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Apply summary-based internalization decisions.
358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    thinLTOInternalizeModule(TheModule, DefinedGlobals);
359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Save internalized bitcode
362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  saveTempBitcode(TheModule, SaveTempsDir, count, ".2.internalized.bc");
363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!SingleModule) {
365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    crossImportIntoModule(TheModule, Index, ModuleMap, ImportList);
366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Save temps: after cross-module import.
368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    saveTempBitcode(TheModule, SaveTempsDir, count, ".3.imported.bc");
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  optimizeModule(TheModule, TM);
372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  saveTempBitcode(TheModule, SaveTempsDir, count, ".4.opt.bc");
374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (DisableCodeGen) {
376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Configured to stop before CodeGen, serialize the bitcode and return.
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SmallVector<char, 128> OutputBuffer;
378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    {
379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      raw_svector_ostream OS(OutputBuffer);
380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ModuleSummaryIndexBuilder IndexBuilder(&TheModule);
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      WriteBitcodeToFile(&TheModule, OS, true, &IndexBuilder.getIndex());
382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return make_unique<ObjectMemoryBuffer>(std::move(OutputBuffer));
384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return codegenModule(TheModule, TM);
387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Resolve LinkOnce/Weak symbols. Record resolutions in the \p ResolvedODR map
390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// for caching, and in the \p Index for application during the ThinLTO
391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// backends. This is needed for correctness for exported symbols (ensure
392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// at least one copy kept) and a compile-time optimization (to drop duplicate
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// copies when possible).
394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void resolveWeakForLinkerInIndex(
395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ModuleSummaryIndex &Index,
396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>>
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        &ResolvedODR) {
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DenseMap<GlobalValue::GUID, const GlobalValueSummary *> PrevailingCopy;
400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  computePrevailingCopies(Index, PrevailingCopy);
401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) {
403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const auto &Prevailing = PrevailingCopy.find(GUID);
404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Not in map means that there was only one copy, which must be prevailing.
405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Prevailing == PrevailingCopy.end())
406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return true;
407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Prevailing->second == S;
408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto recordNewLinkage = [&](StringRef ModuleIdentifier,
411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              GlobalValue::GUID GUID,
412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              GlobalValue::LinkageTypes NewLinkage) {
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  thinLTOResolveWeakForLinkerInIndex(Index, isPrevailing, recordNewLinkage);
417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Initialize the TargetMachine builder for a given Triple
420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void initTMBuilder(TargetMachineBuilder &TMBuilder,
421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          const Triple &TheTriple) {
422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Set a default CPU for Darwin triples (copied from LTOCodeGenerator).
423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // FIXME this looks pretty terrible...
424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (TMBuilder.MCpu.empty() && TheTriple.isOSDarwin()) {
425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (TheTriple.getArch() == llvm::Triple::x86_64)
426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TMBuilder.MCpu = "core2";
427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else if (TheTriple.getArch() == llvm::Triple::x86)
428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TMBuilder.MCpu = "yonah";
429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else if (TheTriple.getArch() == llvm::Triple::aarch64)
430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TMBuilder.MCpu = "cyclone";
431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TMBuilder.TheTriple = std::move(TheTriple);
433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end anonymous namespace
436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::addModule(StringRef Identifier, StringRef Data) {
438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MemoryBufferRef Buffer(Data, Identifier);
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Modules.empty()) {
440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // First module added, so initialize the triple and some options
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVMContext Context;
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Triple TheTriple(getBitcodeTargetTriple(Buffer, Context));
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    initTMBuilder(TMBuilder, Triple(TheTriple));
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef NDEBUG
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else {
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LLVMContext Context;
448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    assert(TMBuilder.TheTriple.str() ==
449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getBitcodeTargetTriple(Buffer, Context) &&
450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           "ThinLTO modules with different triple not supported");
451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Modules.push_back(Buffer);
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::preserveSymbol(StringRef Name) {
457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PreservedSymbols.insert(Name);
458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::crossReferenceSymbol(StringRef Name) {
461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // FIXME: At the moment, we don't take advantage of this extra information,
462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // we're conservatively considering cross-references as preserved.
463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  //  CrossReferencedSymbols.insert(Name);
464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PreservedSymbols.insert(Name);
465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// TargetMachine factory
468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<TargetMachine> TargetMachineBuilder::create() const {
469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string ErrMsg;
470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Target *TheTarget =
471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TargetRegistry::lookupTarget(TheTriple.str(), ErrMsg);
472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!TheTarget) {
473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error("Can't load target for this Triple: " + ErrMsg);
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Use MAttr as the default set of features.
477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SubtargetFeatures Features(MAttr);
478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Features.getDefaultSubtargetFeatures(TheTriple);
479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string FeatureStr = Features.getString();
480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine(
481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TheTriple.str(), MCpu, FeatureStr, Options, RelocModel,
482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      CodeModel::Default, CGOptLevel));
483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Produce the combined summary index from all the bitcode files:
487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * "thin-link".
488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<ModuleSummaryIndex> ThinLTOCodeGenerator::linkCombinedIndex() {
490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::unique_ptr<ModuleSummaryIndex> CombinedIndex;
491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t NextModuleId = 0;
492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &ModuleBuffer : Modules) {
493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ErrorOr<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> ObjOrErr =
494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        object::ModuleSummaryIndexObjectFile::create(ModuleBuffer,
495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                     diagnosticHandler);
496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (std::error_code EC = ObjOrErr.getError()) {
497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // FIXME diagnose
498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      errs() << "error: can't create ModuleSummaryIndexObjectFile for buffer: "
499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             << EC.message() << "\n";
500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return nullptr;
501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto Index = (*ObjOrErr)->takeIndex();
503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (CombinedIndex) {
504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      CombinedIndex->mergeFrom(std::move(Index), ++NextModuleId);
505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    } else {
506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      CombinedIndex = std::move(Index);
507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return CombinedIndex;
510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform promotion and renaming of exported internal functions.
514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Index is updated to reflect linkage changes from weak resolution.
515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::promote(Module &TheModule,
517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                   ModuleSummaryIndex &Index) {
518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleCount = Index.modulePaths().size();
519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleIdentifier = TheModule.getModuleIdentifier();
520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Collect for each module the list of function it defines (GUID -> Summary).
521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries;
522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Generate import/export list
525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);
526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists,
528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           ExportLists);
529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Resolve LinkOnce/Weak symbols.
531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  resolveWeakForLinkerInIndex(Index, ResolvedODR);
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  thinLTOResolveWeakForLinkerModule(
535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      TheModule, ModuleToDefinedGVSummaries[ModuleIdentifier]);
536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  promoteModule(TheModule, Index);
538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
539de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform cross-module importing for the module identified by ModuleIdentifier.
542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::crossModuleImport(Module &TheModule,
544de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             ModuleSummaryIndex &Index) {
545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleMap = generateModuleMap(Modules);
546de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleCount = Index.modulePaths().size();
547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
548de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Collect for each module the list of function it defines (GUID -> Summary).
549de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
550de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
552de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Generate import/export list
553de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);
554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);
555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists,
556de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           ExportLists);
557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto &ImportList = ImportLists[TheModule.getModuleIdentifier()];
558de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
559de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  crossImportIntoModule(TheModule, Index, ModuleMap, ImportList);
560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
561de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
562de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Compute the list of summaries needed for importing into module.
564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::gatherImportedSummariesForModule(
566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef ModulePath, ModuleSummaryIndex &Index,
567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::map<std::string, GVSummaryMapTy> &ModuleToSummariesForIndex) {
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleCount = Index.modulePaths().size();
569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Collect for each module the list of function it defines (GUID -> Summary).
571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
573de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
574de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Generate import/export list
575de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);
576de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);
577de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists,
578de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           ExportLists);
579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::gatherImportedSummariesForModule(ModulePath, ModuleToDefinedGVSummaries,
581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         ImportLists,
582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         ModuleToSummariesForIndex);
583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Emit the list of files needed for importing into module.
587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::emitImports(StringRef ModulePath,
589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       StringRef OutputName,
590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       ModuleSummaryIndex &Index) {
591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleCount = Index.modulePaths().size();
592de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Collect for each module the list of function it defines (GUID -> Summary).
594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
595de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
596de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Generate import/export list
598de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);
599de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);
600de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists,
601de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           ExportLists);
602de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
603de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::error_code EC;
604de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if ((EC = EmitImportsFiles(ModulePath, OutputName, ImportLists)))
605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    report_fatal_error(Twine("Failed to open ") + OutputName +
606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       " to save imports lists\n");
607de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
610de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform internalization. Index is updated to reflect linkage changes.
611de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
612de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::internalize(Module &TheModule,
613de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                       ModuleSummaryIndex &Index) {
614de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple()));
615de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleCount = Index.modulePaths().size();
616de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleIdentifier = TheModule.getModuleIdentifier();
617de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
618de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Convert the preserved symbols set from string to GUID
619de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto GUIDPreservedSymbols =
620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple);
621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
622de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Collect for each module the list of function it defines (GUID -> Summary).
623de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Generate import/export list
627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);
628de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);
629de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists,
630de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           ExportLists);
631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto &ExportList = ExportLists[ModuleIdentifier];
632de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
633de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Be friendly and don't nuke totally the module when the client didn't
634de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // supply anything to preserve.
635de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ExportList.empty() && GUIDPreservedSymbols.empty())
636de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Internalization
639de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) {
640de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const auto &ExportList = ExportLists.find(ModuleIdentifier);
641de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return (ExportList != ExportLists.end() &&
642de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ExportList->second.count(GUID)) ||
643de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           GUIDPreservedSymbols.count(GUID);
644de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
645de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  thinLTOInternalizeAndPromoteInIndex(Index, isExported);
646de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  thinLTOInternalizeModule(TheModule,
647de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           ModuleToDefinedGVSummaries[ModuleIdentifier]);
648de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
649de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
650de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
651de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform post-importing ThinLTO optimizations.
652de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
653de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::optimize(Module &TheModule) {
654de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple()));
655de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
656de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Optimize now
657de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  optimizeModule(TheModule, *TMBuilder.create());
658de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
659de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
660de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/**
661de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform ThinLTO CodeGen.
662de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */
663de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<MemoryBuffer> ThinLTOCodeGenerator::codegen(Module &TheModule) {
664de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple()));
665de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return codegenModule(TheModule, *TMBuilder.create());
666de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
667de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
668de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Main entry point for the ThinLTO processing
669de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::run() {
670de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (CodeGenOnly) {
671de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Perform only parallel codegen and return.
672de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ThreadPool Pool;
673de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    assert(ProducedBinaries.empty() && "The generator should not be reused");
674de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ProducedBinaries.resize(Modules.size());
675de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    int count = 0;
676de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto &ModuleBuffer : Modules) {
677de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Pool.async([&](int count) {
678de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LLVMContext Context;
679de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Context.setDiscardValueNames(LTODiscardValueNames);
680de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
681de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // Parse module now
682de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto TheModule = loadModuleFromBuffer(ModuleBuffer, Context, false);
683de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
684de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // CodeGen
685de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ProducedBinaries[count] = codegen(*TheModule);
686de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }, count++);
687de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
688de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
689de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
690de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
691de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
692de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Sequential linking phase
693de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto Index = linkCombinedIndex();
694de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
695de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Save temps: index.
696de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!SaveTempsDir.empty()) {
697de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto SaveTempPath = SaveTempsDir + "index.bc";
698de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::error_code EC;
699de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_fd_ostream OS(SaveTempPath, EC, sys::fs::F_None);
700de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (EC)
701de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      report_fatal_error(Twine("Failed to open ") + SaveTempPath +
702de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         " to save optimized bitcode\n");
703de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    WriteIndexToFile(*Index, OS);
704de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
705de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
706de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Prepare the resulting object vector
707de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  assert(ProducedBinaries.empty() && "The generator should not be reused");
708de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ProducedBinaries.resize(Modules.size());
709de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
710de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Prepare the module map.
711de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleMap = generateModuleMap(Modules);
712de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto ModuleCount = Modules.size();
713de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
714de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Collect for each module the list of function it defines (GUID -> Summary).
715de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount);
716de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Index->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
717de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
718de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Collect the import/export lists for all modules from the call-graph in the
719de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // combined index.
720de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount);
721de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount);
722de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ComputeCrossModuleImport(*Index, ModuleToDefinedGVSummaries, ImportLists,
723de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           ExportLists);
724de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
725de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Convert the preserved symbols set from string to GUID, this is needed for
726de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // computing the caching hash and the internalization.
727de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto GUIDPreservedSymbols =
728de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple);
729de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
730de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // We use a std::map here to be able to have a defined ordering when
731de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // producing a hash for the cache entry.
732de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // FIXME: we should be able to compute the caching hash for the entry based
733de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // on the index, and nuke this map.
734de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
735de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
736de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Resolve LinkOnce/Weak symbols, this has to be computed early because it
737de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // impacts the caching.
738de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  resolveWeakForLinkerInIndex(*Index, ResolvedODR);
739de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
740de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) {
741de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const auto &ExportList = ExportLists.find(ModuleIdentifier);
742de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return (ExportList != ExportLists.end() &&
743de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ExportList->second.count(GUID)) ||
744de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           GUIDPreservedSymbols.count(GUID);
745de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
746de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
747de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Use global summary-based analysis to identify symbols that can be
748de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // internalized (because they aren't exported or preserved as per callback).
749de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Changes are made in the index, consumed in the ThinLTO backends.
750de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  thinLTOInternalizeAndPromoteInIndex(*Index, isExported);
751de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
752de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Make sure that every module has an entry in the ExportLists and
753de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // ResolvedODR maps to enable threaded access to these maps below.
754de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &DefinedGVSummaries : ModuleToDefinedGVSummaries) {
755de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ExportLists[DefinedGVSummaries.first()];
756de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ResolvedODR[DefinedGVSummaries.first()];
757de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
758de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Compute the ordering we will process the inputs: the rough heuristic here
760de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // is to sort them per size so that the largest module get schedule as soon as
761de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // possible. This is purely a compile-time optimization.
762de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<int> ModulesOrdering;
763de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ModulesOrdering.resize(Modules.size());
764de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::iota(ModulesOrdering.begin(), ModulesOrdering.end(), 0);
765de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::sort(ModulesOrdering.begin(), ModulesOrdering.end(),
766de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            [&](int LeftIndex, int RightIndex) {
767de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              auto LSize = Modules[LeftIndex].getBufferSize();
768de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              auto RSize = Modules[RightIndex].getBufferSize();
769de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              return LSize > RSize;
770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            });
771de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
772de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Parallel optimizer + codegen
773de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
774de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ThreadPool Pool(ThreadCount);
775de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto IndexCount : ModulesOrdering) {
776de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      auto &ModuleBuffer = Modules[IndexCount];
777de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Pool.async([&](int count) {
778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto ModuleIdentifier = ModuleBuffer.getBufferIdentifier();
779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto &ExportList = ExportLists[ModuleIdentifier];
780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
781de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto &DefinedFunctions = ModuleToDefinedGVSummaries[ModuleIdentifier];
782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
783de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // The module may be cached, this helps handling it.
784de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ModuleCacheEntry CacheEntry(CacheOptions.Path, *Index, ModuleIdentifier,
785de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    ImportLists[ModuleIdentifier], ExportList,
786de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    ResolvedODR[ModuleIdentifier],
787de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    DefinedFunctions, GUIDPreservedSymbols);
788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
789de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        {
790de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          auto ErrOrBuffer = CacheEntry.tryLoadingBuffer();
791de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          DEBUG(dbgs() << "Cache " << (ErrOrBuffer ? "hit" : "miss") << " '"
792de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       << CacheEntry.getEntryPath() << "' for buffer " << count
793de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       << " " << ModuleIdentifier << "\n");
794de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          if (ErrOrBuffer) {
796de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            // Cache Hit!
797de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ProducedBinaries[count] = std::move(ErrOrBuffer.get());
798de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            return;
799de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          }
800de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        }
801de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
802de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LLVMContext Context;
803de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Context.setDiscardValueNames(LTODiscardValueNames);
804de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Context.enableDebugTypeODRUniquing();
805de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
806de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // Parse module now
807de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto TheModule = loadModuleFromBuffer(ModuleBuffer, Context, false);
808de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
809de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // Save temps: original file.
810de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        saveTempBitcode(*TheModule, SaveTempsDir, count, ".0.original.bc");
811de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
812de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto &ImportList = ImportLists[ModuleIdentifier];
813de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        // Run the main process now, and generates a binary
814de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        auto OutputBuffer = ProcessThinLTOModule(
815de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            *TheModule, *Index, ModuleMap, *TMBuilder.create(), ImportList,
816de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ExportList, GUIDPreservedSymbols,
817de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            ModuleToDefinedGVSummaries[ModuleIdentifier], CacheOptions,
818de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar            DisableCodeGen, SaveTempsDir, count);
819de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
820de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        OutputBuffer = CacheEntry.write(std::move(OutputBuffer));
821de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ProducedBinaries[count] = std::move(OutputBuffer);
822de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }, IndexCount);
823de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
824de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
825de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
826de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CachePruning(CacheOptions.Path)
827de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .setPruningInterval(CacheOptions.PruningInterval)
828de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .setEntryExpiration(CacheOptions.Expiration)
829de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .setMaxSize(CacheOptions.MaxPercentageOfAvailableSpace)
830de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .prune();
831de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
832de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If statistics were requested, print them out now.
833de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (llvm::AreStatisticsEnabled())
834de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    llvm::PrintStatistics();
835de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
836