1*9880d681SAndroid Build Coastguard Worker //===- llvm-link.cpp - Low-level LLVM linker ------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This utility may be invoked in the following manner:
11*9880d681SAndroid Build Coastguard Worker // llvm-link a.bc b.bc c.bc -o x.bc
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/ReaderWriter.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/AutoUpgrade.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DiagnosticInfo.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DiagnosticPrinter.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ModuleSummaryIndex.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Verifier.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/IRReader/IRReader.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Linker/Linker.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ModuleSummaryIndexObjectFile.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FileSystem.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ManagedStatic.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Path.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/PrettyStackTrace.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Signals.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SystemUtils.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ToolOutputFile.h"
36*9880d681SAndroid Build Coastguard Worker #include "llvm/Transforms/Utils/FunctionImportUtils.h"
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker #include <memory>
39*9880d681SAndroid Build Coastguard Worker #include <utility>
40*9880d681SAndroid Build Coastguard Worker using namespace llvm;
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
43*9880d681SAndroid Build Coastguard Worker InputFilenames(cl::Positional, cl::OneOrMore,
44*9880d681SAndroid Build Coastguard Worker cl::desc("<input bitcode files>"));
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker static cl::list<std::string> OverridingInputs(
47*9880d681SAndroid Build Coastguard Worker "override", cl::ZeroOrMore, cl::value_desc("filename"),
48*9880d681SAndroid Build Coastguard Worker cl::desc(
49*9880d681SAndroid Build Coastguard Worker "input bitcode file which can override previously defined symbol(s)"));
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker // Option to simulate function importing for testing. This enables using
52*9880d681SAndroid Build Coastguard Worker // llvm-link to simulate ThinLTO backend processes.
53*9880d681SAndroid Build Coastguard Worker static cl::list<std::string> Imports(
54*9880d681SAndroid Build Coastguard Worker "import", cl::ZeroOrMore, cl::value_desc("function:filename"),
55*9880d681SAndroid Build Coastguard Worker cl::desc("Pair of function name and filename, where function should be "
56*9880d681SAndroid Build Coastguard Worker "imported from bitcode in filename"));
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker // Option to support testing of function importing. The module summary
59*9880d681SAndroid Build Coastguard Worker // must be specified in the case were we request imports via the -import
60*9880d681SAndroid Build Coastguard Worker // option, as well as when compiling any module with functions that may be
61*9880d681SAndroid Build Coastguard Worker // exported (imported by a different llvm-link -import invocation), to ensure
62*9880d681SAndroid Build Coastguard Worker // consistent promotion and renaming of locals.
63*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
64*9880d681SAndroid Build Coastguard Worker SummaryIndex("summary-index", cl::desc("Module summary index filename"),
65*9880d681SAndroid Build Coastguard Worker cl::init(""), cl::value_desc("filename"));
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
68*9880d681SAndroid Build Coastguard Worker OutputFilename("o", cl::desc("Override output filename"), cl::init("-"),
69*9880d681SAndroid Build Coastguard Worker cl::value_desc("filename"));
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
72*9880d681SAndroid Build Coastguard Worker Internalize("internalize", cl::desc("Internalize linked symbols"));
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
75*9880d681SAndroid Build Coastguard Worker DisableDITypeMap("disable-debug-info-type-map",
76*9880d681SAndroid Build Coastguard Worker cl::desc("Don't use a uniquing type map for debug info"));
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
79*9880d681SAndroid Build Coastguard Worker OnlyNeeded("only-needed", cl::desc("Link only needed symbols"));
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
82*9880d681SAndroid Build Coastguard Worker Force("f", cl::desc("Enable binary output on terminals"));
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
85*9880d681SAndroid Build Coastguard Worker OutputAssembly("S",
86*9880d681SAndroid Build Coastguard Worker cl::desc("Write output as LLVM assembly"), cl::Hidden);
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
89*9880d681SAndroid Build Coastguard Worker Verbose("v", cl::desc("Print information about actions taken"));
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
92*9880d681SAndroid Build Coastguard Worker DumpAsm("d", cl::desc("Print assembly as linked"), cl::Hidden);
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
95*9880d681SAndroid Build Coastguard Worker SuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"),
96*9880d681SAndroid Build Coastguard Worker cl::init(false));
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> PreserveBitcodeUseListOrder(
99*9880d681SAndroid Build Coastguard Worker "preserve-bc-uselistorder",
100*9880d681SAndroid Build Coastguard Worker cl::desc("Preserve use-list order when writing LLVM bitcode."),
101*9880d681SAndroid Build Coastguard Worker cl::init(true), cl::Hidden);
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> PreserveAssemblyUseListOrder(
104*9880d681SAndroid Build Coastguard Worker "preserve-ll-uselistorder",
105*9880d681SAndroid Build Coastguard Worker cl::desc("Preserve use-list order when writing LLVM assembly."),
106*9880d681SAndroid Build Coastguard Worker cl::init(false), cl::Hidden);
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker // Read the specified bitcode file in and return it. This routine searches the
109*9880d681SAndroid Build Coastguard Worker // link path for the specified file to try to find it...
110*9880d681SAndroid Build Coastguard Worker //
loadFile(const char * argv0,const std::string & FN,LLVMContext & Context,bool MaterializeMetadata=true)111*9880d681SAndroid Build Coastguard Worker static std::unique_ptr<Module> loadFile(const char *argv0,
112*9880d681SAndroid Build Coastguard Worker const std::string &FN,
113*9880d681SAndroid Build Coastguard Worker LLVMContext &Context,
114*9880d681SAndroid Build Coastguard Worker bool MaterializeMetadata = true) {
115*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err;
116*9880d681SAndroid Build Coastguard Worker if (Verbose) errs() << "Loading '" << FN << "'\n";
117*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> Result =
118*9880d681SAndroid Build Coastguard Worker getLazyIRFileModule(FN, Err, Context, !MaterializeMetadata);
119*9880d681SAndroid Build Coastguard Worker if (!Result) {
120*9880d681SAndroid Build Coastguard Worker Err.print(argv0, errs());
121*9880d681SAndroid Build Coastguard Worker return nullptr;
122*9880d681SAndroid Build Coastguard Worker }
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker if (MaterializeMetadata) {
125*9880d681SAndroid Build Coastguard Worker Result->materializeMetadata();
126*9880d681SAndroid Build Coastguard Worker UpgradeDebugInfo(*Result);
127*9880d681SAndroid Build Coastguard Worker }
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker return Result;
130*9880d681SAndroid Build Coastguard Worker }
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker namespace {
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker /// Helper to load on demand a Module from file and cache it for subsequent
135*9880d681SAndroid Build Coastguard Worker /// queries during function importing.
136*9880d681SAndroid Build Coastguard Worker class ModuleLazyLoaderCache {
137*9880d681SAndroid Build Coastguard Worker /// Cache of lazily loaded module for import.
138*9880d681SAndroid Build Coastguard Worker StringMap<std::unique_ptr<Module>> ModuleMap;
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker /// Retrieve a Module from the cache or lazily load it on demand.
141*9880d681SAndroid Build Coastguard Worker std::function<std::unique_ptr<Module>(const char *argv0,
142*9880d681SAndroid Build Coastguard Worker const std::string &FileName)>
143*9880d681SAndroid Build Coastguard Worker createLazyModule;
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker public:
146*9880d681SAndroid Build Coastguard Worker /// Create the loader, Module will be initialized in \p Context.
ModuleLazyLoaderCache(std::function<std::unique_ptr<Module> (const char * argv0,const std::string & FileName)> createLazyModule)147*9880d681SAndroid Build Coastguard Worker ModuleLazyLoaderCache(std::function<std::unique_ptr<Module>(
148*9880d681SAndroid Build Coastguard Worker const char *argv0, const std::string &FileName)>
149*9880d681SAndroid Build Coastguard Worker createLazyModule)
150*9880d681SAndroid Build Coastguard Worker : createLazyModule(std::move(createLazyModule)) {}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker /// Retrieve a Module from the cache or lazily load it on demand.
153*9880d681SAndroid Build Coastguard Worker Module &operator()(const char *argv0, const std::string &FileName);
154*9880d681SAndroid Build Coastguard Worker
takeModule(const std::string & FileName)155*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> takeModule(const std::string &FileName) {
156*9880d681SAndroid Build Coastguard Worker auto I = ModuleMap.find(FileName);
157*9880d681SAndroid Build Coastguard Worker assert(I != ModuleMap.end());
158*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> Ret = std::move(I->second);
159*9880d681SAndroid Build Coastguard Worker ModuleMap.erase(I);
160*9880d681SAndroid Build Coastguard Worker return Ret;
161*9880d681SAndroid Build Coastguard Worker }
162*9880d681SAndroid Build Coastguard Worker };
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker // Get a Module for \p FileName from the cache, or load it lazily.
operator ()(const char * argv0,const std::string & Identifier)165*9880d681SAndroid Build Coastguard Worker Module &ModuleLazyLoaderCache::operator()(const char *argv0,
166*9880d681SAndroid Build Coastguard Worker const std::string &Identifier) {
167*9880d681SAndroid Build Coastguard Worker auto &Module = ModuleMap[Identifier];
168*9880d681SAndroid Build Coastguard Worker if (!Module)
169*9880d681SAndroid Build Coastguard Worker Module = createLazyModule(argv0, Identifier);
170*9880d681SAndroid Build Coastguard Worker return *Module;
171*9880d681SAndroid Build Coastguard Worker }
172*9880d681SAndroid Build Coastguard Worker } // anonymous namespace
173*9880d681SAndroid Build Coastguard Worker
diagnosticHandler(const DiagnosticInfo & DI)174*9880d681SAndroid Build Coastguard Worker static void diagnosticHandler(const DiagnosticInfo &DI) {
175*9880d681SAndroid Build Coastguard Worker unsigned Severity = DI.getSeverity();
176*9880d681SAndroid Build Coastguard Worker switch (Severity) {
177*9880d681SAndroid Build Coastguard Worker case DS_Error:
178*9880d681SAndroid Build Coastguard Worker errs() << "ERROR: ";
179*9880d681SAndroid Build Coastguard Worker break;
180*9880d681SAndroid Build Coastguard Worker case DS_Warning:
181*9880d681SAndroid Build Coastguard Worker if (SuppressWarnings)
182*9880d681SAndroid Build Coastguard Worker return;
183*9880d681SAndroid Build Coastguard Worker errs() << "WARNING: ";
184*9880d681SAndroid Build Coastguard Worker break;
185*9880d681SAndroid Build Coastguard Worker case DS_Remark:
186*9880d681SAndroid Build Coastguard Worker case DS_Note:
187*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Only expecting warnings and errors");
188*9880d681SAndroid Build Coastguard Worker }
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker DiagnosticPrinterRawOStream DP(errs());
191*9880d681SAndroid Build Coastguard Worker DI.print(DP);
192*9880d681SAndroid Build Coastguard Worker errs() << '\n';
193*9880d681SAndroid Build Coastguard Worker }
194*9880d681SAndroid Build Coastguard Worker
diagnosticHandlerWithContext(const DiagnosticInfo & DI,void * C)195*9880d681SAndroid Build Coastguard Worker static void diagnosticHandlerWithContext(const DiagnosticInfo &DI, void *C) {
196*9880d681SAndroid Build Coastguard Worker diagnosticHandler(DI);
197*9880d681SAndroid Build Coastguard Worker }
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker /// Import any functions requested via the -import option.
importFunctions(const char * argv0,LLVMContext & Context,Linker & L)200*9880d681SAndroid Build Coastguard Worker static bool importFunctions(const char *argv0, LLVMContext &Context,
201*9880d681SAndroid Build Coastguard Worker Linker &L) {
202*9880d681SAndroid Build Coastguard Worker if (SummaryIndex.empty())
203*9880d681SAndroid Build Coastguard Worker return true;
204*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<ModuleSummaryIndex>> IndexOrErr =
205*9880d681SAndroid Build Coastguard Worker llvm::getModuleSummaryIndexForFile(SummaryIndex, diagnosticHandler);
206*9880d681SAndroid Build Coastguard Worker std::error_code EC = IndexOrErr.getError();
207*9880d681SAndroid Build Coastguard Worker if (EC) {
208*9880d681SAndroid Build Coastguard Worker errs() << EC.message() << '\n';
209*9880d681SAndroid Build Coastguard Worker return false;
210*9880d681SAndroid Build Coastguard Worker }
211*9880d681SAndroid Build Coastguard Worker auto Index = std::move(IndexOrErr.get());
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker // Map of Module -> List of globals to import from the Module
214*9880d681SAndroid Build Coastguard Worker std::map<StringRef, DenseSet<const GlobalValue *>> ModuleToGlobalsToImportMap;
215*9880d681SAndroid Build Coastguard Worker auto ModuleLoader = [&Context](const char *argv0,
216*9880d681SAndroid Build Coastguard Worker const std::string &Identifier) {
217*9880d681SAndroid Build Coastguard Worker return loadFile(argv0, Identifier, Context, false);
218*9880d681SAndroid Build Coastguard Worker };
219*9880d681SAndroid Build Coastguard Worker ModuleLazyLoaderCache ModuleLoaderCache(ModuleLoader);
220*9880d681SAndroid Build Coastguard Worker for (const auto &Import : Imports) {
221*9880d681SAndroid Build Coastguard Worker // Identify the requested function and its bitcode source file.
222*9880d681SAndroid Build Coastguard Worker size_t Idx = Import.find(':');
223*9880d681SAndroid Build Coastguard Worker if (Idx == std::string::npos) {
224*9880d681SAndroid Build Coastguard Worker errs() << "Import parameter bad format: " << Import << "\n";
225*9880d681SAndroid Build Coastguard Worker return false;
226*9880d681SAndroid Build Coastguard Worker }
227*9880d681SAndroid Build Coastguard Worker std::string FunctionName = Import.substr(0, Idx);
228*9880d681SAndroid Build Coastguard Worker std::string FileName = Import.substr(Idx + 1, std::string::npos);
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker // Load the specified source module.
231*9880d681SAndroid Build Coastguard Worker auto &SrcModule = ModuleLoaderCache(argv0, FileName);
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker if (verifyModule(SrcModule, &errs())) {
234*9880d681SAndroid Build Coastguard Worker errs() << argv0 << ": " << FileName
235*9880d681SAndroid Build Coastguard Worker << ": error: input module is broken!\n";
236*9880d681SAndroid Build Coastguard Worker return false;
237*9880d681SAndroid Build Coastguard Worker }
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker Function *F = SrcModule.getFunction(FunctionName);
240*9880d681SAndroid Build Coastguard Worker if (!F) {
241*9880d681SAndroid Build Coastguard Worker errs() << "Ignoring import request for non-existent function "
242*9880d681SAndroid Build Coastguard Worker << FunctionName << " from " << FileName << "\n";
243*9880d681SAndroid Build Coastguard Worker continue;
244*9880d681SAndroid Build Coastguard Worker }
245*9880d681SAndroid Build Coastguard Worker // We cannot import weak_any functions without possibly affecting the
246*9880d681SAndroid Build Coastguard Worker // order they are seen and selected by the linker, changing program
247*9880d681SAndroid Build Coastguard Worker // semantics.
248*9880d681SAndroid Build Coastguard Worker if (F->hasWeakAnyLinkage()) {
249*9880d681SAndroid Build Coastguard Worker errs() << "Ignoring import request for weak-any function " << FunctionName
250*9880d681SAndroid Build Coastguard Worker << " from " << FileName << "\n";
251*9880d681SAndroid Build Coastguard Worker continue;
252*9880d681SAndroid Build Coastguard Worker }
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker if (Verbose)
255*9880d681SAndroid Build Coastguard Worker errs() << "Importing " << FunctionName << " from " << FileName << "\n";
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker auto &Entry = ModuleToGlobalsToImportMap[SrcModule.getModuleIdentifier()];
258*9880d681SAndroid Build Coastguard Worker Entry.insert(F);
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker F->materialize();
261*9880d681SAndroid Build Coastguard Worker }
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker // Do the actual import of globals now, one Module at a time
264*9880d681SAndroid Build Coastguard Worker for (auto &GlobalsToImportPerModule : ModuleToGlobalsToImportMap) {
265*9880d681SAndroid Build Coastguard Worker // Get the module for the import
266*9880d681SAndroid Build Coastguard Worker auto &GlobalsToImport = GlobalsToImportPerModule.second;
267*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> SrcModule =
268*9880d681SAndroid Build Coastguard Worker ModuleLoaderCache.takeModule(GlobalsToImportPerModule.first);
269*9880d681SAndroid Build Coastguard Worker assert(&Context == &SrcModule->getContext() && "Context mismatch");
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker // If modules were created with lazy metadata loading, materialize it
272*9880d681SAndroid Build Coastguard Worker // now, before linking it (otherwise this will be a noop).
273*9880d681SAndroid Build Coastguard Worker SrcModule->materializeMetadata();
274*9880d681SAndroid Build Coastguard Worker UpgradeDebugInfo(*SrcModule);
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker // Linkage Promotion and renaming
277*9880d681SAndroid Build Coastguard Worker if (renameModuleForThinLTO(*SrcModule, *Index, &GlobalsToImport))
278*9880d681SAndroid Build Coastguard Worker return true;
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Worker // Instruct the linker to not automatically import linkonce defintion.
281*9880d681SAndroid Build Coastguard Worker unsigned Flags = Linker::Flags::DontForceLinkLinkonceODR;
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker if (L.linkInModule(std::move(SrcModule), Flags, &GlobalsToImport))
284*9880d681SAndroid Build Coastguard Worker return false;
285*9880d681SAndroid Build Coastguard Worker }
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker return true;
288*9880d681SAndroid Build Coastguard Worker }
289*9880d681SAndroid Build Coastguard Worker
linkFiles(const char * argv0,LLVMContext & Context,Linker & L,const cl::list<std::string> & Files,unsigned Flags)290*9880d681SAndroid Build Coastguard Worker static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L,
291*9880d681SAndroid Build Coastguard Worker const cl::list<std::string> &Files,
292*9880d681SAndroid Build Coastguard Worker unsigned Flags) {
293*9880d681SAndroid Build Coastguard Worker // Filter out flags that don't apply to the first file we load.
294*9880d681SAndroid Build Coastguard Worker unsigned ApplicableFlags = Flags & Linker::Flags::OverrideFromSrc;
295*9880d681SAndroid Build Coastguard Worker for (const auto &File : Files) {
296*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M = loadFile(argv0, File, Context);
297*9880d681SAndroid Build Coastguard Worker if (!M.get()) {
298*9880d681SAndroid Build Coastguard Worker errs() << argv0 << ": error loading file '" << File << "'\n";
299*9880d681SAndroid Build Coastguard Worker return false;
300*9880d681SAndroid Build Coastguard Worker }
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker // Note that when ODR merging types cannot verify input files in here When
303*9880d681SAndroid Build Coastguard Worker // doing that debug metadata in the src module might already be pointing to
304*9880d681SAndroid Build Coastguard Worker // the destination.
305*9880d681SAndroid Build Coastguard Worker if (DisableDITypeMap && verifyModule(*M, &errs())) {
306*9880d681SAndroid Build Coastguard Worker errs() << argv0 << ": " << File << ": error: input module is broken!\n";
307*9880d681SAndroid Build Coastguard Worker return false;
308*9880d681SAndroid Build Coastguard Worker }
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker // If a module summary index is supplied, load it so linkInModule can treat
311*9880d681SAndroid Build Coastguard Worker // local functions/variables as exported and promote if necessary.
312*9880d681SAndroid Build Coastguard Worker if (!SummaryIndex.empty()) {
313*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<ModuleSummaryIndex>> IndexOrErr =
314*9880d681SAndroid Build Coastguard Worker llvm::getModuleSummaryIndexForFile(SummaryIndex, diagnosticHandler);
315*9880d681SAndroid Build Coastguard Worker std::error_code EC = IndexOrErr.getError();
316*9880d681SAndroid Build Coastguard Worker if (EC) {
317*9880d681SAndroid Build Coastguard Worker errs() << EC.message() << '\n';
318*9880d681SAndroid Build Coastguard Worker return false;
319*9880d681SAndroid Build Coastguard Worker }
320*9880d681SAndroid Build Coastguard Worker auto Index = std::move(IndexOrErr.get());
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker // Promotion
323*9880d681SAndroid Build Coastguard Worker if (renameModuleForThinLTO(*M, *Index))
324*9880d681SAndroid Build Coastguard Worker return true;
325*9880d681SAndroid Build Coastguard Worker }
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker if (Verbose)
328*9880d681SAndroid Build Coastguard Worker errs() << "Linking in '" << File << "'\n";
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker if (L.linkInModule(std::move(M), ApplicableFlags))
331*9880d681SAndroid Build Coastguard Worker return false;
332*9880d681SAndroid Build Coastguard Worker // All linker flags apply to linking of subsequent files.
333*9880d681SAndroid Build Coastguard Worker ApplicableFlags = Flags;
334*9880d681SAndroid Build Coastguard Worker }
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker return true;
337*9880d681SAndroid Build Coastguard Worker }
338*9880d681SAndroid Build Coastguard Worker
main(int argc,char ** argv)339*9880d681SAndroid Build Coastguard Worker int main(int argc, char **argv) {
340*9880d681SAndroid Build Coastguard Worker // Print a stack trace if we signal out.
341*9880d681SAndroid Build Coastguard Worker sys::PrintStackTraceOnErrorSignal(argv[0]);
342*9880d681SAndroid Build Coastguard Worker PrettyStackTraceProgram X(argc, argv);
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
345*9880d681SAndroid Build Coastguard Worker Context.setDiagnosticHandler(diagnosticHandlerWithContext, nullptr, true);
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
348*9880d681SAndroid Build Coastguard Worker cl::ParseCommandLineOptions(argc, argv, "llvm linker\n");
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker if (!DisableDITypeMap)
351*9880d681SAndroid Build Coastguard Worker Context.enableDebugTypeODRUniquing();
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker auto Composite = make_unique<Module>("llvm-link", Context);
354*9880d681SAndroid Build Coastguard Worker Linker L(*Composite);
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker unsigned Flags = Linker::Flags::None;
357*9880d681SAndroid Build Coastguard Worker if (Internalize)
358*9880d681SAndroid Build Coastguard Worker Flags |= Linker::Flags::InternalizeLinkedSymbols;
359*9880d681SAndroid Build Coastguard Worker if (OnlyNeeded)
360*9880d681SAndroid Build Coastguard Worker Flags |= Linker::Flags::LinkOnlyNeeded;
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Worker // First add all the regular input files
363*9880d681SAndroid Build Coastguard Worker if (!linkFiles(argv[0], Context, L, InputFilenames, Flags))
364*9880d681SAndroid Build Coastguard Worker return 1;
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker // Next the -override ones.
367*9880d681SAndroid Build Coastguard Worker if (!linkFiles(argv[0], Context, L, OverridingInputs,
368*9880d681SAndroid Build Coastguard Worker Flags | Linker::Flags::OverrideFromSrc))
369*9880d681SAndroid Build Coastguard Worker return 1;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker // Import any functions requested via -import
372*9880d681SAndroid Build Coastguard Worker if (!importFunctions(argv[0], Context, L))
373*9880d681SAndroid Build Coastguard Worker return 1;
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite;
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker std::error_code EC;
378*9880d681SAndroid Build Coastguard Worker tool_output_file Out(OutputFilename, EC, sys::fs::F_None);
379*9880d681SAndroid Build Coastguard Worker if (EC) {
380*9880d681SAndroid Build Coastguard Worker errs() << EC.message() << '\n';
381*9880d681SAndroid Build Coastguard Worker return 1;
382*9880d681SAndroid Build Coastguard Worker }
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker if (verifyModule(*Composite, &errs())) {
385*9880d681SAndroid Build Coastguard Worker errs() << argv[0] << ": error: linked module is broken!\n";
386*9880d681SAndroid Build Coastguard Worker return 1;
387*9880d681SAndroid Build Coastguard Worker }
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker if (Verbose) errs() << "Writing bitcode...\n";
390*9880d681SAndroid Build Coastguard Worker if (OutputAssembly) {
391*9880d681SAndroid Build Coastguard Worker Composite->print(Out.os(), nullptr, PreserveAssemblyUseListOrder);
392*9880d681SAndroid Build Coastguard Worker } else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true))
393*9880d681SAndroid Build Coastguard Worker WriteBitcodeToFile(Composite.get(), Out.os(), PreserveBitcodeUseListOrder);
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker // Declare success.
396*9880d681SAndroid Build Coastguard Worker Out.keep();
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard Worker return 0;
399*9880d681SAndroid Build Coastguard Worker }
400