159a5afa9SMikhail Glushenkov //===- lib/Linker/LinkModules.cpp - Module Linker Implementation ----------===//
2361e513dSReid Spencer //
3361e513dSReid Spencer //                     The LLVM Compiler Infrastructure
4361e513dSReid Spencer //
5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source
6f3ebc3f3SChris Lattner // License. See LICENSE.TXT for details.
7361e513dSReid Spencer //
8361e513dSReid Spencer //===----------------------------------------------------------------------===//
9361e513dSReid Spencer //
10361e513dSReid Spencer // This file implements the LLVM module linker.
11361e513dSReid Spencer //
12361e513dSReid Spencer //===----------------------------------------------------------------------===//
13361e513dSReid Spencer 
146cc07df4SChandler Carruth #include "llvm/Linker/Linker.h"
15caabe228SRafael Espindola #include "LinkDiagnosticInfo.h"
16ed0881b2SChandler Carruth #include "llvm-c/Linker.h"
1766f02413SBill Wendling #include "llvm/ADT/SetVector.h"
18caabe228SRafael Espindola #include "llvm/ADT/StringSet.h"
19d12b4a33SRafael Espindola #include "llvm/IR/DiagnosticPrinter.h"
209d2bfc48SRafael Espindola #include "llvm/IR/LLVMContext.h"
21361e513dSReid Spencer using namespace llvm;
22361e513dSReid Spencer 
23b1ed91f3SChris Lattner namespace {
24d12b4a33SRafael Espindola 
2518c89411SRafael Espindola /// This is an implementation class for the LinkModules function, which is the
2618c89411SRafael Espindola /// entrypoint for this file.
27b1ed91f3SChris Lattner class ModuleLinker {
28caabe228SRafael Espindola   IRMover &Mover;
290e309fe8SRafael Espindola   Module &SrcM;
30b1ed91f3SChris Lattner 
314b5ec263SRafael Espindola   SetVector<GlobalValue *> ValuesToLink;
32caabe228SRafael Espindola   StringSet<> Internalize;
334160f5d3SRafael Espindola 
34e868123dSDuncan P. N. Exon Smith   /// For symbol clashes, prefer those from Src.
35020d4fb1SArtem Belevich   unsigned Flags;
36e868123dSDuncan P. N. Exon Smith 
37c7ed52f2STeresa Johnson   /// Function index passed into ModuleLinker for using in function
38c7ed52f2STeresa Johnson   /// importing/exporting handling.
398220e8a8SMehdi Amini   const FunctionInfoIndex *ImportIndex;
40c7ed52f2STeresa Johnson 
41*4f04d85fSTeresa Johnson   /// Functions to import from source module, all other functions are
42c7ed52f2STeresa Johnson   /// imported as declarations instead of definitions.
43*4f04d85fSTeresa Johnson   DenseSet<const GlobalValue *> *FunctionsToImport;
44c7ed52f2STeresa Johnson 
45c7ed52f2STeresa Johnson   /// Set to true if the given FunctionInfoIndex contains any functions
46c7ed52f2STeresa Johnson   /// from this source module, in which case we must conservatively assume
47c7ed52f2STeresa Johnson   /// that any of its functions may be imported into another module
48c7ed52f2STeresa Johnson   /// as part of a different backend compilation process.
49af714765SRafael Espindola   bool HasExportedFunctions = false;
50c7ed52f2STeresa Johnson 
51e5a61917STeresa Johnson   /// Association between metadata value id and temporary metadata that
52e5a61917STeresa Johnson   /// remains unmapped after function importing. Saved during function
53e5a61917STeresa Johnson   /// importing and consumed during the metadata linking postpass.
54e5a61917STeresa Johnson   DenseMap<unsigned, MDNode *> *ValIDToTempMDMap;
55e5a61917STeresa Johnson 
56caabe228SRafael Espindola   /// Used as the callback for lazy linking.
57caabe228SRafael Espindola   /// The mover has just hit GV and we have to decide if it, and other members
58caabe228SRafael Espindola   /// of the same comdat, should be linked. Every member to be linked is passed
59caabe228SRafael Espindola   /// to Add.
60caabe228SRafael Espindola   void addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add);
61baa3bf8fSRafael Espindola 
62020d4fb1SArtem Belevich   bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; }
63020d4fb1SArtem Belevich   bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; }
64020d4fb1SArtem Belevich   bool shouldInternalizeLinkedSymbols() {
65020d4fb1SArtem Belevich     return Flags & Linker::InternalizeLinkedSymbols;
66020d4fb1SArtem Belevich   }
67020d4fb1SArtem Belevich 
68c7ed52f2STeresa Johnson   /// Check if we should promote the given local value to global scope.
69c7ed52f2STeresa Johnson   bool doPromoteLocalToGlobal(const GlobalValue *SGV);
70c7ed52f2STeresa Johnson 
71d12b4a33SRafael Espindola   bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest,
72d12b4a33SRafael Espindola                             const GlobalValue &Src);
73dbb0bd1aSRafael Espindola 
74caabe228SRafael Espindola   /// Should we have mover and linker error diag info?
75b1ed91f3SChris Lattner   bool emitError(const Twine &Message) {
769d2bfc48SRafael Espindola     SrcM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message));
77b1ed91f3SChris Lattner     return true;
78b1ed91f3SChris Lattner   }
79b1ed91f3SChris Lattner 
800e309fe8SRafael Espindola   bool getComdatLeader(Module &M, StringRef ComdatName,
81dad0a645SDavid Majnemer                        const GlobalVariable *&GVar);
82dad0a645SDavid Majnemer   bool computeResultingSelectionKind(StringRef ComdatName,
83dad0a645SDavid Majnemer                                      Comdat::SelectionKind Src,
84dad0a645SDavid Majnemer                                      Comdat::SelectionKind Dst,
85dad0a645SDavid Majnemer                                      Comdat::SelectionKind &Result,
86dad0a645SDavid Majnemer                                      bool &LinkFromSrc);
87dad0a645SDavid Majnemer   std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>>
88dad0a645SDavid Majnemer       ComdatsChosen;
89dad0a645SDavid Majnemer   bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK,
90dad0a645SDavid Majnemer                        bool &LinkFromSrc);
912d5fb8caSTeresa Johnson   // Keep track of the global value members of each comdat in source.
922d5fb8caSTeresa Johnson   DenseMap<const Comdat *, std::vector<GlobalValue *>> ComdatMembers;
93dad0a645SDavid Majnemer 
9418c89411SRafael Espindola   /// Given a global in the source module, return the global in the
9518c89411SRafael Espindola   /// destination module that is being linked to, if any.
963e8bc6a8SRafael Espindola   GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) {
97caabe228SRafael Espindola     Module &DstM = Mover.getModule();
98b1ed91f3SChris Lattner     // If the source has no name it can't link.  If it has local linkage,
99b1ed91f3SChris Lattner     // there is no name match-up going on.
100b098f0c1STeresa Johnson     if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(getLinkage(SrcGV)))
1012617dcceSCraig Topper       return nullptr;
102b1ed91f3SChris Lattner 
103b1ed91f3SChris Lattner     // Otherwise see if we have a match in the destination module's symtab.
1040e309fe8SRafael Espindola     GlobalValue *DGV = DstM.getNamedValue(getName(SrcGV));
105c84f608bSRafael Espindola     if (!DGV)
106c84f608bSRafael Espindola       return nullptr;
107b1ed91f3SChris Lattner 
108b1ed91f3SChris Lattner     // If we found a global with the same name in the dest module, but it has
109b1ed91f3SChris Lattner     // internal linkage, we are really not doing any linkage here.
110b1ed91f3SChris Lattner     if (DGV->hasLocalLinkage())
1112617dcceSCraig Topper       return nullptr;
112b1ed91f3SChris Lattner 
113b1ed91f3SChris Lattner     // Otherwise, we do in fact link to the destination global.
114b1ed91f3SChris Lattner     return DGV;
115b1ed91f3SChris Lattner   }
116b1ed91f3SChris Lattner 
117baa3bf8fSRafael Espindola   bool linkIfNeeded(GlobalValue &GV);
118c7ed52f2STeresa Johnson 
119c7ed52f2STeresa Johnson   /// Helper methods to check if we are importing from or potentially
120c7ed52f2STeresa Johnson   /// exporting from the current source module.
121*4f04d85fSTeresa Johnson   bool isPerformingImport() const { return FunctionsToImport != nullptr; }
1224a9bf587STeresa Johnson   bool isModuleExporting() const { return HasExportedFunctions; }
123c7ed52f2STeresa Johnson 
124c7ed52f2STeresa Johnson   /// If we are importing from the source module, checks if we should
125c7ed52f2STeresa Johnson   /// import SGV as a definition, otherwise import as a declaration.
126c7ed52f2STeresa Johnson   bool doImportAsDefinition(const GlobalValue *SGV);
127c7ed52f2STeresa Johnson 
128c7ed52f2STeresa Johnson   /// Get the name for SGV that should be used in the linked destination
129c7ed52f2STeresa Johnson   /// module. Specifically, this handles the case where we need to rename
130c7ed52f2STeresa Johnson   /// a local that is being promoted to global scope.
131c7ed52f2STeresa Johnson   std::string getName(const GlobalValue *SGV);
132c7ed52f2STeresa Johnson 
133caabe228SRafael Espindola   /// Process globals so that they can be used in ThinLTO. This includes
134caabe228SRafael Espindola   /// promoting local variables so that they can be reference externally by
135caabe228SRafael Espindola   /// thin lto imported globals and converting strong external globals to
136caabe228SRafael Espindola   /// available_externally.
137caabe228SRafael Espindola   void processGlobalsForThinLTO();
138caabe228SRafael Espindola   void processGlobalForThinLTO(GlobalValue &GV);
139caabe228SRafael Espindola 
140c7ed52f2STeresa Johnson   /// Get the new linkage for SGV that should be used in the linked destination
141c7ed52f2STeresa Johnson   /// module. Specifically, for ThinLTO importing or exporting it may need
142c7ed52f2STeresa Johnson   /// to be adjusted.
143c7ed52f2STeresa Johnson   GlobalValue::LinkageTypes getLinkage(const GlobalValue *SGV);
144c7ed52f2STeresa Johnson 
145d57f9f0cSRafael Espindola public:
146caabe228SRafael Espindola   ModuleLinker(IRMover &Mover, Module &SrcM, unsigned Flags,
147d57f9f0cSRafael Espindola                const FunctionInfoIndex *Index = nullptr,
148e5a61917STeresa Johnson                DenseSet<const GlobalValue *> *FunctionsToImport = nullptr,
149e5a61917STeresa Johnson                DenseMap<unsigned, MDNode *> *ValIDToTempMDMap = nullptr)
150caabe228SRafael Espindola       : Mover(Mover), SrcM(SrcM), Flags(Flags), ImportIndex(Index),
151*4f04d85fSTeresa Johnson         FunctionsToImport(FunctionsToImport),
152*4f04d85fSTeresa Johnson         ValIDToTempMDMap(ValIDToTempMDMap) {
153*4f04d85fSTeresa Johnson     assert((ImportIndex || !FunctionsToImport) &&
154d57f9f0cSRafael Espindola            "Expect a FunctionInfoIndex when importing");
155d57f9f0cSRafael Espindola     // If we have a FunctionInfoIndex but no function to import,
156d57f9f0cSRafael Espindola     // then this is the primary module being compiled in a ThinLTO
157d57f9f0cSRafael Espindola     // backend compilation, and we need to see if it has functions that
158d57f9f0cSRafael Espindola     // may be exported to another backend compilation.
159*4f04d85fSTeresa Johnson     if (ImportIndex && !FunctionsToImport)
160d57f9f0cSRafael Espindola       HasExportedFunctions = ImportIndex->hasExportedFunctions(SrcM);
161*4f04d85fSTeresa Johnson     assert((ValIDToTempMDMap || !FunctionsToImport) &&
162e5a61917STeresa Johnson            "Function importing must provide a ValIDToTempMDMap");
163d57f9f0cSRafael Espindola   }
164d57f9f0cSRafael Espindola 
165d57f9f0cSRafael Espindola   bool run();
166eee6f995SChris Lattner };
167f00654e3SAlexander Kornienko }
168d48b7783SBill Wendling 
169c7ed52f2STeresa Johnson bool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) {
170c7ed52f2STeresa Johnson   if (!isPerformingImport())
171c7ed52f2STeresa Johnson     return false;
1723cd8161cSTeresa Johnson   auto *GA = dyn_cast<GlobalAlias>(SGV);
1733cd8161cSTeresa Johnson   if (GA) {
1743cd8161cSTeresa Johnson     if (GA->hasWeakAnyLinkage())
1753cd8161cSTeresa Johnson       return false;
17689345771SRafael Espindola     const GlobalObject *GO = GA->getBaseObject();
17789345771SRafael Espindola     if (!GO->hasLinkOnceODRLinkage())
17889345771SRafael Espindola       return false;
17989345771SRafael Espindola     return doImportAsDefinition(GO);
1803cd8161cSTeresa Johnson   }
181dfbebc37STeresa Johnson   // Always import GlobalVariable definitions, except for the special
182dfbebc37STeresa Johnson   // case of WeakAny which are imported as ExternalWeak declarations
183dfbebc37STeresa Johnson   // (see comments in ModuleLinker::getLinkage). The linkage changes
184c7ed52f2STeresa Johnson   // described in ModuleLinker::getLinkage ensure the correct behavior (e.g.
185c7ed52f2STeresa Johnson   // global variables with external linkage are transformed to
1863cd8161cSTeresa Johnson   // available_externally definitions, which are ultimately turned into
1873cd8161cSTeresa Johnson   // declarations after the EliminateAvailableExternally pass).
18866059c9fSCraig Topper   if (isa<GlobalVariable>(SGV) && !SGV->isDeclaration() &&
1893cd8161cSTeresa Johnson       !SGV->hasWeakAnyLinkage())
190c7ed52f2STeresa Johnson     return true;
191c7ed52f2STeresa Johnson   // Only import the function requested for importing.
192c7ed52f2STeresa Johnson   auto *SF = dyn_cast<Function>(SGV);
193*4f04d85fSTeresa Johnson   if (SF && FunctionsToImport->count(SF))
194c7ed52f2STeresa Johnson     return true;
195c7ed52f2STeresa Johnson   // Otherwise no.
196c7ed52f2STeresa Johnson   return false;
197c7ed52f2STeresa Johnson }
198c7ed52f2STeresa Johnson 
199c7ed52f2STeresa Johnson bool ModuleLinker::doPromoteLocalToGlobal(const GlobalValue *SGV) {
200c7ed52f2STeresa Johnson   assert(SGV->hasLocalLinkage());
201c7ed52f2STeresa Johnson   // Both the imported references and the original local variable must
202c7ed52f2STeresa Johnson   // be promoted.
203c7ed52f2STeresa Johnson   if (!isPerformingImport() && !isModuleExporting())
204c7ed52f2STeresa Johnson     return false;
205c7ed52f2STeresa Johnson 
206c7ed52f2STeresa Johnson   // Local const variables never need to be promoted unless they are address
207c7ed52f2STeresa Johnson   // taken. The imported uses can simply use the clone created in this module.
208c7ed52f2STeresa Johnson   // For now we are conservative in determining which variables are not
209c7ed52f2STeresa Johnson   // address taken by checking the unnamed addr flag. To be more aggressive,
210c7ed52f2STeresa Johnson   // the address taken information must be checked earlier during parsing
211c7ed52f2STeresa Johnson   // of the module and recorded in the function index for use when importing
212c7ed52f2STeresa Johnson   // from that module.
213c7ed52f2STeresa Johnson   auto *GVar = dyn_cast<GlobalVariable>(SGV);
214c7ed52f2STeresa Johnson   if (GVar && GVar->isConstant() && GVar->hasUnnamedAddr())
215c7ed52f2STeresa Johnson     return false;
216c7ed52f2STeresa Johnson 
217c7ed52f2STeresa Johnson   // Eventually we only need to promote functions in the exporting module that
218c7ed52f2STeresa Johnson   // are referenced by a potentially exported function (i.e. one that is in the
219c7ed52f2STeresa Johnson   // function index).
220c7ed52f2STeresa Johnson   return true;
221c7ed52f2STeresa Johnson }
222c7ed52f2STeresa Johnson 
223c7ed52f2STeresa Johnson std::string ModuleLinker::getName(const GlobalValue *SGV) {
224c7ed52f2STeresa Johnson   // For locals that must be promoted to global scope, ensure that
225c7ed52f2STeresa Johnson   // the promoted name uniquely identifies the copy in the original module,
226c7ed52f2STeresa Johnson   // using the ID assigned during combined index creation. When importing,
227c7ed52f2STeresa Johnson   // we rename all locals (not just those that are promoted) in order to
228c7ed52f2STeresa Johnson   // avoid naming conflicts between locals imported from different modules.
229c7ed52f2STeresa Johnson   if (SGV->hasLocalLinkage() &&
230c7ed52f2STeresa Johnson       (doPromoteLocalToGlobal(SGV) || isPerformingImport()))
231c7ed52f2STeresa Johnson     return FunctionInfoIndex::getGlobalNameForLocal(
232c7ed52f2STeresa Johnson         SGV->getName(),
233c7ed52f2STeresa Johnson         ImportIndex->getModuleId(SGV->getParent()->getModuleIdentifier()));
234c7ed52f2STeresa Johnson   return SGV->getName();
235c7ed52f2STeresa Johnson }
236c7ed52f2STeresa Johnson 
237c7ed52f2STeresa Johnson GlobalValue::LinkageTypes ModuleLinker::getLinkage(const GlobalValue *SGV) {
238c7ed52f2STeresa Johnson   // Any local variable that is referenced by an exported function needs
239c7ed52f2STeresa Johnson   // to be promoted to global scope. Since we don't currently know which
240c7ed52f2STeresa Johnson   // functions reference which local variables/functions, we must treat
241c7ed52f2STeresa Johnson   // all as potentially exported if this module is exporting anything.
242c7ed52f2STeresa Johnson   if (isModuleExporting()) {
243c7ed52f2STeresa Johnson     if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV))
244c7ed52f2STeresa Johnson       return GlobalValue::ExternalLinkage;
245c7ed52f2STeresa Johnson     return SGV->getLinkage();
246c7ed52f2STeresa Johnson   }
247c7ed52f2STeresa Johnson 
248c7ed52f2STeresa Johnson   // Otherwise, if we aren't importing, no linkage change is needed.
249c7ed52f2STeresa Johnson   if (!isPerformingImport())
250c7ed52f2STeresa Johnson     return SGV->getLinkage();
251c7ed52f2STeresa Johnson 
252c7ed52f2STeresa Johnson   switch (SGV->getLinkage()) {
253c7ed52f2STeresa Johnson   case GlobalValue::ExternalLinkage:
254c7ed52f2STeresa Johnson     // External defnitions are converted to available_externally
255c7ed52f2STeresa Johnson     // definitions upon import, so that they are available for inlining
256c7ed52f2STeresa Johnson     // and/or optimization, but are turned into declarations later
257c7ed52f2STeresa Johnson     // during the EliminateAvailableExternally pass.
2583cd8161cSTeresa Johnson     if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
259c7ed52f2STeresa Johnson       return GlobalValue::AvailableExternallyLinkage;
260c7ed52f2STeresa Johnson     // An imported external declaration stays external.
261c7ed52f2STeresa Johnson     return SGV->getLinkage();
262c7ed52f2STeresa Johnson 
263c7ed52f2STeresa Johnson   case GlobalValue::AvailableExternallyLinkage:
264c7ed52f2STeresa Johnson     // An imported available_externally definition converts
265c7ed52f2STeresa Johnson     // to external if imported as a declaration.
266c7ed52f2STeresa Johnson     if (!doImportAsDefinition(SGV))
267c7ed52f2STeresa Johnson       return GlobalValue::ExternalLinkage;
268c7ed52f2STeresa Johnson     // An imported available_externally declaration stays that way.
269c7ed52f2STeresa Johnson     return SGV->getLinkage();
270c7ed52f2STeresa Johnson 
271c7ed52f2STeresa Johnson   case GlobalValue::LinkOnceAnyLinkage:
272c7ed52f2STeresa Johnson   case GlobalValue::LinkOnceODRLinkage:
273c7ed52f2STeresa Johnson     // These both stay the same when importing the definition.
274c7ed52f2STeresa Johnson     // The ThinLTO pass will eventually force-import their definitions.
275c7ed52f2STeresa Johnson     return SGV->getLinkage();
276c7ed52f2STeresa Johnson 
277c7ed52f2STeresa Johnson   case GlobalValue::WeakAnyLinkage:
278c7ed52f2STeresa Johnson     // Can't import weak_any definitions correctly, or we might change the
279c7ed52f2STeresa Johnson     // program semantics, since the linker will pick the first weak_any
280c7ed52f2STeresa Johnson     // definition and importing would change the order they are seen by the
281c7ed52f2STeresa Johnson     // linker. The module linking caller needs to enforce this.
282c7ed52f2STeresa Johnson     assert(!doImportAsDefinition(SGV));
283c7ed52f2STeresa Johnson     // If imported as a declaration, it becomes external_weak.
284c7ed52f2STeresa Johnson     return GlobalValue::ExternalWeakLinkage;
285c7ed52f2STeresa Johnson 
286c7ed52f2STeresa Johnson   case GlobalValue::WeakODRLinkage:
287c7ed52f2STeresa Johnson     // For weak_odr linkage, there is a guarantee that all copies will be
288c7ed52f2STeresa Johnson     // equivalent, so the issue described above for weak_any does not exist,
289c7ed52f2STeresa Johnson     // and the definition can be imported. It can be treated similarly
290c7ed52f2STeresa Johnson     // to an imported externally visible global value.
2913cd8161cSTeresa Johnson     if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
292c7ed52f2STeresa Johnson       return GlobalValue::AvailableExternallyLinkage;
293c7ed52f2STeresa Johnson     else
294c7ed52f2STeresa Johnson       return GlobalValue::ExternalLinkage;
295c7ed52f2STeresa Johnson 
296c7ed52f2STeresa Johnson   case GlobalValue::AppendingLinkage:
297c7ed52f2STeresa Johnson     // It would be incorrect to import an appending linkage variable,
298c7ed52f2STeresa Johnson     // since it would cause global constructors/destructors to be
299c7ed52f2STeresa Johnson     // executed multiple times. This should have already been handled
3001e20a652STeresa Johnson     // by linkIfNeeded, and we will assert in shouldLinkFromSource
3011e20a652STeresa Johnson     // if we try to import, so we simply return AppendingLinkage here
3021e20a652STeresa Johnson     // as this helper is called more widely in getLinkedToGlobal.
3031e20a652STeresa Johnson     return GlobalValue::AppendingLinkage;
304c7ed52f2STeresa Johnson 
305c7ed52f2STeresa Johnson   case GlobalValue::InternalLinkage:
306c7ed52f2STeresa Johnson   case GlobalValue::PrivateLinkage:
307c7ed52f2STeresa Johnson     // If we are promoting the local to global scope, it is handled
308c7ed52f2STeresa Johnson     // similarly to a normal externally visible global.
309c7ed52f2STeresa Johnson     if (doPromoteLocalToGlobal(SGV)) {
3103cd8161cSTeresa Johnson       if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
311c7ed52f2STeresa Johnson         return GlobalValue::AvailableExternallyLinkage;
312c7ed52f2STeresa Johnson       else
313c7ed52f2STeresa Johnson         return GlobalValue::ExternalLinkage;
314c7ed52f2STeresa Johnson     }
315c7ed52f2STeresa Johnson     // A non-promoted imported local definition stays local.
316c7ed52f2STeresa Johnson     // The ThinLTO pass will eventually force-import their definitions.
317c7ed52f2STeresa Johnson     return SGV->getLinkage();
318c7ed52f2STeresa Johnson 
319c7ed52f2STeresa Johnson   case GlobalValue::ExternalWeakLinkage:
320c7ed52f2STeresa Johnson     // External weak doesn't apply to definitions, must be a declaration.
321c7ed52f2STeresa Johnson     assert(!doImportAsDefinition(SGV));
322c7ed52f2STeresa Johnson     // Linkage stays external_weak.
323c7ed52f2STeresa Johnson     return SGV->getLinkage();
324c7ed52f2STeresa Johnson 
325c7ed52f2STeresa Johnson   case GlobalValue::CommonLinkage:
326c7ed52f2STeresa Johnson     // Linkage stays common on definitions.
327c7ed52f2STeresa Johnson     // The ThinLTO pass will eventually force-import their definitions.
328c7ed52f2STeresa Johnson     return SGV->getLinkage();
329c7ed52f2STeresa Johnson   }
330c7ed52f2STeresa Johnson 
331c7ed52f2STeresa Johnson   llvm_unreachable("unknown linkage type");
332c7ed52f2STeresa Johnson }
333c7ed52f2STeresa Johnson 
334eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes
335eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A,
336eb5e0a77SRafael Espindola                  GlobalValue::VisibilityTypes B) {
337eb5e0a77SRafael Espindola   if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility)
338eb5e0a77SRafael Espindola     return GlobalValue::HiddenVisibility;
339eb5e0a77SRafael Espindola   if (A == GlobalValue::ProtectedVisibility ||
340eb5e0a77SRafael Espindola       B == GlobalValue::ProtectedVisibility)
341eb5e0a77SRafael Espindola     return GlobalValue::ProtectedVisibility;
342eb5e0a77SRafael Espindola   return GlobalValue::DefaultVisibility;
343eb5e0a77SRafael Espindola }
344eb5e0a77SRafael Espindola 
3450e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName,
346dad0a645SDavid Majnemer                                    const GlobalVariable *&GVar) {
3470e309fe8SRafael Espindola   const GlobalValue *GVal = M.getNamedValue(ComdatName);
348dad0a645SDavid Majnemer   if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) {
349dad0a645SDavid Majnemer     GVal = GA->getBaseObject();
350dad0a645SDavid Majnemer     if (!GVal)
351dad0a645SDavid Majnemer       // We cannot resolve the size of the aliasee yet.
352dad0a645SDavid Majnemer       return emitError("Linking COMDATs named '" + ComdatName +
353dad0a645SDavid Majnemer                        "': COMDAT key involves incomputable alias size.");
354dad0a645SDavid Majnemer   }
355dad0a645SDavid Majnemer 
356dad0a645SDavid Majnemer   GVar = dyn_cast_or_null<GlobalVariable>(GVal);
357dad0a645SDavid Majnemer   if (!GVar)
358dad0a645SDavid Majnemer     return emitError(
359dad0a645SDavid Majnemer         "Linking COMDATs named '" + ComdatName +
360dad0a645SDavid Majnemer         "': GlobalVariable required for data dependent selection!");
361dad0a645SDavid Majnemer 
362dad0a645SDavid Majnemer   return false;
363dad0a645SDavid Majnemer }
364dad0a645SDavid Majnemer 
365dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName,
366dad0a645SDavid Majnemer                                                  Comdat::SelectionKind Src,
367dad0a645SDavid Majnemer                                                  Comdat::SelectionKind Dst,
368dad0a645SDavid Majnemer                                                  Comdat::SelectionKind &Result,
369dad0a645SDavid Majnemer                                                  bool &LinkFromSrc) {
370caabe228SRafael Espindola   Module &DstM = Mover.getModule();
371dad0a645SDavid Majnemer   // The ability to mix Comdat::SelectionKind::Any with
372dad0a645SDavid Majnemer   // Comdat::SelectionKind::Largest is a behavior that comes from COFF.
373dad0a645SDavid Majnemer   bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any ||
374dad0a645SDavid Majnemer                          Dst == Comdat::SelectionKind::Largest;
375dad0a645SDavid Majnemer   bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any ||
376dad0a645SDavid Majnemer                          Src == Comdat::SelectionKind::Largest;
377dad0a645SDavid Majnemer   if (DstAnyOrLargest && SrcAnyOrLargest) {
378dad0a645SDavid Majnemer     if (Dst == Comdat::SelectionKind::Largest ||
379dad0a645SDavid Majnemer         Src == Comdat::SelectionKind::Largest)
380dad0a645SDavid Majnemer       Result = Comdat::SelectionKind::Largest;
381dad0a645SDavid Majnemer     else
382dad0a645SDavid Majnemer       Result = Comdat::SelectionKind::Any;
383dad0a645SDavid Majnemer   } else if (Src == Dst) {
384dad0a645SDavid Majnemer     Result = Dst;
385dad0a645SDavid Majnemer   } else {
386dad0a645SDavid Majnemer     return emitError("Linking COMDATs named '" + ComdatName +
387dad0a645SDavid Majnemer                      "': invalid selection kinds!");
388dad0a645SDavid Majnemer   }
389dad0a645SDavid Majnemer 
390dad0a645SDavid Majnemer   switch (Result) {
391dad0a645SDavid Majnemer   case Comdat::SelectionKind::Any:
392dad0a645SDavid Majnemer     // Go with Dst.
393dad0a645SDavid Majnemer     LinkFromSrc = false;
394dad0a645SDavid Majnemer     break;
395dad0a645SDavid Majnemer   case Comdat::SelectionKind::NoDuplicates:
396dad0a645SDavid Majnemer     return emitError("Linking COMDATs named '" + ComdatName +
397dad0a645SDavid Majnemer                      "': noduplicates has been violated!");
398dad0a645SDavid Majnemer   case Comdat::SelectionKind::ExactMatch:
399dad0a645SDavid Majnemer   case Comdat::SelectionKind::Largest:
400dad0a645SDavid Majnemer   case Comdat::SelectionKind::SameSize: {
401dad0a645SDavid Majnemer     const GlobalVariable *DstGV;
402dad0a645SDavid Majnemer     const GlobalVariable *SrcGV;
403dad0a645SDavid Majnemer     if (getComdatLeader(DstM, ComdatName, DstGV) ||
404dad0a645SDavid Majnemer         getComdatLeader(SrcM, ComdatName, SrcGV))
405dad0a645SDavid Majnemer       return true;
406dad0a645SDavid Majnemer 
4070e309fe8SRafael Espindola     const DataLayout &DstDL = DstM.getDataLayout();
4080e309fe8SRafael Espindola     const DataLayout &SrcDL = SrcM.getDataLayout();
409dad0a645SDavid Majnemer     uint64_t DstSize =
41046a43556SMehdi Amini         DstDL.getTypeAllocSize(DstGV->getType()->getPointerElementType());
411dad0a645SDavid Majnemer     uint64_t SrcSize =
41246a43556SMehdi Amini         SrcDL.getTypeAllocSize(SrcGV->getType()->getPointerElementType());
413dad0a645SDavid Majnemer     if (Result == Comdat::SelectionKind::ExactMatch) {
414dad0a645SDavid Majnemer       if (SrcGV->getInitializer() != DstGV->getInitializer())
415dad0a645SDavid Majnemer         return emitError("Linking COMDATs named '" + ComdatName +
416dad0a645SDavid Majnemer                          "': ExactMatch violated!");
417dad0a645SDavid Majnemer       LinkFromSrc = false;
418dad0a645SDavid Majnemer     } else if (Result == Comdat::SelectionKind::Largest) {
419dad0a645SDavid Majnemer       LinkFromSrc = SrcSize > DstSize;
420dad0a645SDavid Majnemer     } else if (Result == Comdat::SelectionKind::SameSize) {
421dad0a645SDavid Majnemer       if (SrcSize != DstSize)
422dad0a645SDavid Majnemer         return emitError("Linking COMDATs named '" + ComdatName +
423dad0a645SDavid Majnemer                          "': SameSize violated!");
424dad0a645SDavid Majnemer       LinkFromSrc = false;
425dad0a645SDavid Majnemer     } else {
426dad0a645SDavid Majnemer       llvm_unreachable("unknown selection kind");
427dad0a645SDavid Majnemer     }
428dad0a645SDavid Majnemer     break;
429dad0a645SDavid Majnemer   }
430dad0a645SDavid Majnemer   }
431dad0a645SDavid Majnemer 
432dad0a645SDavid Majnemer   return false;
433dad0a645SDavid Majnemer }
434dad0a645SDavid Majnemer 
435dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC,
436dad0a645SDavid Majnemer                                    Comdat::SelectionKind &Result,
437dad0a645SDavid Majnemer                                    bool &LinkFromSrc) {
438caabe228SRafael Espindola   Module &DstM = Mover.getModule();
439b16196a3SRafael Espindola   Comdat::SelectionKind SSK = SrcC->getSelectionKind();
440dad0a645SDavid Majnemer   StringRef ComdatName = SrcC->getName();
4410e309fe8SRafael Espindola   Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable();
442dad0a645SDavid Majnemer   Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName);
4432ef3f299SRafael Espindola 
444b16196a3SRafael Espindola   if (DstCI == ComdatSymTab.end()) {
445b16196a3SRafael Espindola     // Use the comdat if it is only available in one of the modules.
446b16196a3SRafael Espindola     LinkFromSrc = true;
447b16196a3SRafael Espindola     Result = SSK;
4482ef3f299SRafael Espindola     return false;
449b16196a3SRafael Espindola   }
4502ef3f299SRafael Espindola 
451dad0a645SDavid Majnemer   const Comdat *DstC = &DstCI->second;
452dad0a645SDavid Majnemer   Comdat::SelectionKind DSK = DstC->getSelectionKind();
4532ef3f299SRafael Espindola   return computeResultingSelectionKind(ComdatName, SSK, DSK, Result,
4542ef3f299SRafael Espindola                                        LinkFromSrc);
455dad0a645SDavid Majnemer }
456f6f121e2SJames Molloy 
457d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc,
458d12b4a33SRafael Espindola                                         const GlobalValue &Dest,
459dbb0bd1aSRafael Espindola                                         const GlobalValue &Src) {
460e5a61917STeresa Johnson 
461e868123dSDuncan P. N. Exon Smith   // Should we unconditionally use the Src?
462020d4fb1SArtem Belevich   if (shouldOverrideFromSrc()) {
463e868123dSDuncan P. N. Exon Smith     LinkFromSrc = true;
464e868123dSDuncan P. N. Exon Smith     return false;
465e868123dSDuncan P. N. Exon Smith   }
466e868123dSDuncan P. N. Exon Smith 
467778fcc77SRafael Espindola   // We always have to add Src if it has appending linkage.
468778fcc77SRafael Espindola   if (Src.hasAppendingLinkage()) {
4691e20a652STeresa Johnson     // Should have prevented importing for appending linkage in linkIfNeeded.
470c7ed52f2STeresa Johnson     assert(!isPerformingImport());
471778fcc77SRafael Espindola     LinkFromSrc = true;
472778fcc77SRafael Espindola     return false;
473778fcc77SRafael Espindola   }
474778fcc77SRafael Espindola 
475d4bcefc7SRafael Espindola   bool SrcIsDeclaration = Src.isDeclarationForLinker();
476d4bcefc7SRafael Espindola   bool DestIsDeclaration = Dest.isDeclarationForLinker();
477dbb0bd1aSRafael Espindola 
478c7ed52f2STeresa Johnson   if (isPerformingImport()) {
479c7ed52f2STeresa Johnson     if (isa<Function>(&Src)) {
480*4f04d85fSTeresa Johnson       // For functions, LinkFromSrc iff this is a function requested
481c7ed52f2STeresa Johnson       // for importing. For variables, decide below normally.
482*4f04d85fSTeresa Johnson       LinkFromSrc = FunctionsToImport->count(&Src);
483c7ed52f2STeresa Johnson       return false;
484c7ed52f2STeresa Johnson     }
485c7ed52f2STeresa Johnson 
486c7ed52f2STeresa Johnson     // Check if this is an alias with an already existing definition
487c7ed52f2STeresa Johnson     // in Dest, which must have come from a prior importing pass from
488c7ed52f2STeresa Johnson     // the same Src module. Unlike imported function and variable
489c7ed52f2STeresa Johnson     // definitions, which are imported as available_externally and are
490c7ed52f2STeresa Johnson     // not definitions for the linker, that is not a valid linkage for
491c7ed52f2STeresa Johnson     // imported aliases which must be definitions. Simply use the existing
492c7ed52f2STeresa Johnson     // Dest copy.
493c7ed52f2STeresa Johnson     if (isa<GlobalAlias>(&Src) && !DestIsDeclaration) {
494c7ed52f2STeresa Johnson       assert(isa<GlobalAlias>(&Dest));
495c7ed52f2STeresa Johnson       LinkFromSrc = false;
496c7ed52f2STeresa Johnson       return false;
497c7ed52f2STeresa Johnson     }
498c7ed52f2STeresa Johnson   }
499c7ed52f2STeresa Johnson 
500dbb0bd1aSRafael Espindola   if (SrcIsDeclaration) {
501dbb0bd1aSRafael Espindola     // If Src is external or if both Src & Dest are external..  Just link the
502dbb0bd1aSRafael Espindola     // external globals, we aren't adding anything.
503d12b4a33SRafael Espindola     if (Src.hasDLLImportStorageClass()) {
504dbb0bd1aSRafael Espindola       // If one of GVs is marked as DLLImport, result should be dllimport'ed.
505d12b4a33SRafael Espindola       LinkFromSrc = DestIsDeclaration;
506d12b4a33SRafael Espindola       return false;
507d12b4a33SRafael Espindola     }
508dbb0bd1aSRafael Espindola     // If the Dest is weak, use the source linkage.
509ed11bd28SRafael Espindola     if (Dest.hasExternalWeakLinkage()) {
510ed11bd28SRafael Espindola       LinkFromSrc = true;
511ed11bd28SRafael Espindola       return false;
512ed11bd28SRafael Espindola     }
513ed11bd28SRafael Espindola     // Link an available_externally over a declaration.
514ed11bd28SRafael Espindola     LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration();
515d12b4a33SRafael Espindola     return false;
516dbb0bd1aSRafael Espindola   }
517dbb0bd1aSRafael Espindola 
518d12b4a33SRafael Espindola   if (DestIsDeclaration) {
519dbb0bd1aSRafael Espindola     // If Dest is external but Src is not:
520d12b4a33SRafael Espindola     LinkFromSrc = true;
521d12b4a33SRafael Espindola     return false;
522d12b4a33SRafael Espindola   }
523dbb0bd1aSRafael Espindola 
5240910605aSRafael Espindola   if (Src.hasCommonLinkage()) {
525d12b4a33SRafael Espindola     if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) {
526d12b4a33SRafael Espindola       LinkFromSrc = true;
5270910605aSRafael Espindola       return false;
528d12b4a33SRafael Espindola     }
529d12b4a33SRafael Espindola 
530d12b4a33SRafael Espindola     if (!Dest.hasCommonLinkage()) {
531d12b4a33SRafael Espindola       LinkFromSrc = false;
532d12b4a33SRafael Espindola       return false;
533d12b4a33SRafael Espindola     }
5340910605aSRafael Espindola 
535a28d91d8SMehdi Amini     const DataLayout &DL = Dest.getParent()->getDataLayout();
5360910605aSRafael Espindola     uint64_t DestSize = DL.getTypeAllocSize(Dest.getType()->getElementType());
5370910605aSRafael Espindola     uint64_t SrcSize = DL.getTypeAllocSize(Src.getType()->getElementType());
538d12b4a33SRafael Espindola     LinkFromSrc = SrcSize > DestSize;
539d12b4a33SRafael Espindola     return false;
5400910605aSRafael Espindola   }
5410910605aSRafael Espindola 
542dbb0bd1aSRafael Espindola   if (Src.isWeakForLinker()) {
543dbb0bd1aSRafael Espindola     assert(!Dest.hasExternalWeakLinkage());
544dbb0bd1aSRafael Espindola     assert(!Dest.hasAvailableExternallyLinkage());
5450910605aSRafael Espindola 
546d12b4a33SRafael Espindola     if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) {
547d12b4a33SRafael Espindola       LinkFromSrc = true;
548d12b4a33SRafael Espindola       return false;
549d12b4a33SRafael Espindola     }
550dbb0bd1aSRafael Espindola 
551d12b4a33SRafael Espindola     LinkFromSrc = false;
5520910605aSRafael Espindola     return false;
553dbb0bd1aSRafael Espindola   }
554dbb0bd1aSRafael Espindola 
555dbb0bd1aSRafael Espindola   if (Dest.isWeakForLinker()) {
556dbb0bd1aSRafael Espindola     assert(Src.hasExternalLinkage());
557d12b4a33SRafael Espindola     LinkFromSrc = true;
558d12b4a33SRafael Espindola     return false;
559dbb0bd1aSRafael Espindola   }
560dbb0bd1aSRafael Espindola 
561dbb0bd1aSRafael Espindola   assert(!Src.hasExternalWeakLinkage());
562dbb0bd1aSRafael Espindola   assert(!Dest.hasExternalWeakLinkage());
563dbb0bd1aSRafael Espindola   assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() &&
564dbb0bd1aSRafael Espindola          "Unexpected linkage type!");
565dbb0bd1aSRafael Espindola   return emitError("Linking globals named '" + Src.getName() +
566dbb0bd1aSRafael Espindola                    "': symbol multiply defined!");
567dbb0bd1aSRafael Espindola }
568dbb0bd1aSRafael Espindola 
569baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) {
570baa3bf8fSRafael Espindola   GlobalValue *DGV = getLinkedToGlobal(&GV);
571baa3bf8fSRafael Espindola 
572baa3bf8fSRafael Espindola   if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration()))
573baa3bf8fSRafael Espindola     return false;
574baa3bf8fSRafael Espindola 
5754b5ec263SRafael Espindola   if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) {
5764b5ec263SRafael Espindola     auto *DGVar = dyn_cast<GlobalVariable>(DGV);
5774b5ec263SRafael Espindola     auto *SGVar = dyn_cast<GlobalVariable>(&GV);
5784b5ec263SRafael Espindola     if (DGVar && SGVar) {
5794b5ec263SRafael Espindola       if (DGVar->isDeclaration() && SGVar->isDeclaration() &&
5804b5ec263SRafael Espindola           (!DGVar->isConstant() || !SGVar->isConstant())) {
5814b5ec263SRafael Espindola         DGVar->setConstant(false);
5824b5ec263SRafael Espindola         SGVar->setConstant(false);
5834b5ec263SRafael Espindola       }
5844b5ec263SRafael Espindola       if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) {
5854b5ec263SRafael Espindola         unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment());
5864b5ec263SRafael Espindola         SGVar->setAlignment(Align);
5874b5ec263SRafael Espindola         DGVar->setAlignment(Align);
5884b5ec263SRafael Espindola       }
5894b5ec263SRafael Espindola     }
5904b5ec263SRafael Espindola 
591baa3bf8fSRafael Espindola     GlobalValue::VisibilityTypes Visibility =
592baa3bf8fSRafael Espindola         getMinVisibility(DGV->getVisibility(), GV.getVisibility());
593baa3bf8fSRafael Espindola     DGV->setVisibility(Visibility);
594baa3bf8fSRafael Espindola     GV.setVisibility(Visibility);
5954b5ec263SRafael Espindola 
5964b5ec263SRafael Espindola     bool HasUnnamedAddr = GV.hasUnnamedAddr() && DGV->hasUnnamedAddr();
5974b5ec263SRafael Espindola     DGV->setUnnamedAddr(HasUnnamedAddr);
5984b5ec263SRafael Espindola     GV.setUnnamedAddr(HasUnnamedAddr);
599baa3bf8fSRafael Espindola   }
600baa3bf8fSRafael Espindola 
6014b5ec263SRafael Espindola   // Don't want to append to global_ctors list, for example, when we
6024b5ec263SRafael Espindola   // are importing for ThinLTO, otherwise the global ctors and dtors
6034b5ec263SRafael Espindola   // get executed multiple times for local variables (the latter causing
6044b5ec263SRafael Espindola   // double frees).
6054b5ec263SRafael Espindola   if (GV.hasAppendingLinkage() && isPerformingImport())
6064b5ec263SRafael Espindola     return false;
6074b5ec263SRafael Espindola 
6084b5ec263SRafael Espindola   if (isPerformingImport() && !doImportAsDefinition(&GV))
6094b5ec263SRafael Espindola     return false;
6104b5ec263SRafael Espindola 
6114b5ec263SRafael Espindola   if (!DGV && !shouldOverrideFromSrc() &&
6124b5ec263SRafael Espindola       (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() ||
6134b5ec263SRafael Espindola        GV.hasAvailableExternallyLinkage()))
6144b5ec263SRafael Espindola     return false;
6154b5ec263SRafael Espindola 
616bd03c503SRafael Espindola   if (GV.isDeclaration())
617bd03c503SRafael Espindola     return false;
618bd03c503SRafael Espindola 
619baa3bf8fSRafael Espindola   if (const Comdat *SC = GV.getComdat()) {
620baa3bf8fSRafael Espindola     bool LinkFromSrc;
621baa3bf8fSRafael Espindola     Comdat::SelectionKind SK;
622baa3bf8fSRafael Espindola     std::tie(SK, LinkFromSrc) = ComdatsChosen[SC];
6234b5ec263SRafael Espindola     if (LinkFromSrc)
6244b5ec263SRafael Espindola       ValuesToLink.insert(&GV);
625baa3bf8fSRafael Espindola     return false;
626baa3bf8fSRafael Espindola   }
627baa3bf8fSRafael Espindola 
6284b5ec263SRafael Espindola   bool LinkFromSrc = true;
6294b5ec263SRafael Espindola   if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV))
6304b5ec263SRafael Espindola     return true;
6314b5ec263SRafael Espindola   if (LinkFromSrc)
6324b5ec263SRafael Espindola     ValuesToLink.insert(&GV);
633baa3bf8fSRafael Espindola   return false;
634baa3bf8fSRafael Espindola }
635baa3bf8fSRafael Espindola 
636caabe228SRafael Espindola void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) {
637caabe228SRafael Espindola   // Add these to the internalize list
638caabe228SRafael Espindola   if (!GV.hasLinkOnceLinkage())
639caabe228SRafael Espindola     return;
640caabe228SRafael Espindola 
641caabe228SRafael Espindola   if (shouldInternalizeLinkedSymbols())
642caabe228SRafael Espindola     Internalize.insert(GV.getName());
643caabe228SRafael Espindola   Add(GV);
644caabe228SRafael Espindola 
645caabe228SRafael Espindola   const Comdat *SC = GV.getComdat();
646caabe228SRafael Espindola   if (!SC)
647caabe228SRafael Espindola     return;
648caabe228SRafael Espindola   for (GlobalValue *GV2 : ComdatMembers[SC]) {
649caabe228SRafael Espindola     if (!GV2->hasLocalLinkage() && shouldInternalizeLinkedSymbols())
650caabe228SRafael Espindola       Internalize.insert(GV2->getName());
651caabe228SRafael Espindola     Add(*GV2);
652caabe228SRafael Espindola   }
653caabe228SRafael Espindola }
654caabe228SRafael Espindola 
655caabe228SRafael Espindola void ModuleLinker::processGlobalForThinLTO(GlobalValue &GV) {
656caabe228SRafael Espindola   if (GV.hasLocalLinkage() &&
657caabe228SRafael Espindola       (doPromoteLocalToGlobal(&GV) || isPerformingImport())) {
658caabe228SRafael Espindola     GV.setName(getName(&GV));
659caabe228SRafael Espindola     GV.setLinkage(getLinkage(&GV));
660caabe228SRafael Espindola     if (!GV.hasLocalLinkage())
661caabe228SRafael Espindola       GV.setVisibility(GlobalValue::HiddenVisibility);
662caabe228SRafael Espindola     if (isModuleExporting())
663caabe228SRafael Espindola       ValuesToLink.insert(&GV);
664caabe228SRafael Espindola     return;
665caabe228SRafael Espindola   }
666caabe228SRafael Espindola   GV.setLinkage(getLinkage(&GV));
667caabe228SRafael Espindola }
668caabe228SRafael Espindola 
669caabe228SRafael Espindola void ModuleLinker::processGlobalsForThinLTO() {
670caabe228SRafael Espindola   for (GlobalVariable &GV : SrcM.globals())
671caabe228SRafael Espindola     processGlobalForThinLTO(GV);
672caabe228SRafael Espindola   for (Function &SF : SrcM)
673caabe228SRafael Espindola     processGlobalForThinLTO(SF);
674caabe228SRafael Espindola   for (GlobalAlias &GA : SrcM.aliases())
675caabe228SRafael Espindola     processGlobalForThinLTO(GA);
676caabe228SRafael Espindola }
677caabe228SRafael Espindola 
678b1ed91f3SChris Lattner bool ModuleLinker::run() {
6790e309fe8SRafael Espindola   for (const auto &SMEC : SrcM.getComdatSymbolTable()) {
680dad0a645SDavid Majnemer     const Comdat &C = SMEC.getValue();
681dad0a645SDavid Majnemer     if (ComdatsChosen.count(&C))
682dad0a645SDavid Majnemer       continue;
683dad0a645SDavid Majnemer     Comdat::SelectionKind SK;
684dad0a645SDavid Majnemer     bool LinkFromSrc;
685dad0a645SDavid Majnemer     if (getComdatResult(&C, SK, LinkFromSrc))
686dad0a645SDavid Majnemer       return true;
687dad0a645SDavid Majnemer     ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc);
688dad0a645SDavid Majnemer   }
689dad0a645SDavid Majnemer 
6900e309fe8SRafael Espindola   for (GlobalVariable &GV : SrcM.globals())
691baa3bf8fSRafael Espindola     if (const Comdat *SC = GV.getComdat())
692baa3bf8fSRafael Espindola       ComdatMembers[SC].push_back(&GV);
693baa3bf8fSRafael Espindola 
6940e309fe8SRafael Espindola   for (Function &SF : SrcM)
695baa3bf8fSRafael Espindola     if (const Comdat *SC = SF.getComdat())
696baa3bf8fSRafael Espindola       ComdatMembers[SC].push_back(&SF);
697baa3bf8fSRafael Espindola 
6980e309fe8SRafael Espindola   for (GlobalAlias &GA : SrcM.aliases())
699baa3bf8fSRafael Espindola     if (const Comdat *SC = GA.getComdat())
700baa3bf8fSRafael Espindola       ComdatMembers[SC].push_back(&GA);
701baa3bf8fSRafael Espindola 
702b1ed91f3SChris Lattner   // Insert all of the globals in src into the DstM module... without linking
703b1ed91f3SChris Lattner   // initializers (which could refer to functions not yet mapped over).
7040e309fe8SRafael Espindola   for (GlobalVariable &GV : SrcM.globals())
705baa3bf8fSRafael Espindola     if (linkIfNeeded(GV))
706b1ed91f3SChris Lattner       return true;
707b1ed91f3SChris Lattner 
7080e309fe8SRafael Espindola   for (Function &SF : SrcM)
709baa3bf8fSRafael Espindola     if (linkIfNeeded(SF))
710b1ed91f3SChris Lattner       return true;
711b1ed91f3SChris Lattner 
7120e309fe8SRafael Espindola   for (GlobalAlias &GA : SrcM.aliases())
713baa3bf8fSRafael Espindola     if (linkIfNeeded(GA))
714b1ed91f3SChris Lattner       return true;
715b1ed91f3SChris Lattner 
716caabe228SRafael Espindola   processGlobalsForThinLTO();
717caabe228SRafael Espindola 
718caabe228SRafael Espindola   for (unsigned I = 0; I < ValuesToLink.size(); ++I) {
719caabe228SRafael Espindola     GlobalValue *GV = ValuesToLink[I];
720caabe228SRafael Espindola     const Comdat *SC = GV->getComdat();
721caabe228SRafael Espindola     if (!SC)
722caabe228SRafael Espindola       continue;
723caabe228SRafael Espindola     for (GlobalValue *GV2 : ComdatMembers[SC])
724caabe228SRafael Espindola       ValuesToLink.insert(GV2);
725caabe228SRafael Espindola   }
726caabe228SRafael Espindola 
727caabe228SRafael Espindola   if (shouldInternalizeLinkedSymbols()) {
728caabe228SRafael Espindola     for (GlobalValue *GV : ValuesToLink)
729caabe228SRafael Espindola       Internalize.insert(GV->getName());
730caabe228SRafael Espindola   }
731caabe228SRafael Espindola 
732f81c7b03SRafael Espindola   if (Mover.move(SrcM, ValuesToLink.getArrayRef(),
733caabe228SRafael Espindola                  [this](GlobalValue &GV, IRMover::ValueAdder Add) {
734caabe228SRafael Espindola                    addLazyFor(GV, Add);
735e5a61917STeresa Johnson                  },
736e5a61917STeresa Johnson                  ValIDToTempMDMap, false))
7374b5ec263SRafael Espindola     return true;
738caabe228SRafael Espindola   Module &DstM = Mover.getModule();
739caabe228SRafael Espindola   for (auto &P : Internalize) {
740caabe228SRafael Espindola     GlobalValue *GV = DstM.getNamedValue(P.first());
741caabe228SRafael Espindola     GV->setLinkage(GlobalValue::InternalLinkage);
742beadd56aSRafael Espindola   }
743beadd56aSRafael Espindola 
7442609888fSAnton Korobeynikov   return false;
7452609888fSAnton Korobeynikov }
746361e513dSReid Spencer 
7479d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {}
7483df61b7bSRafael Espindola 
749434e9561SRafael Espindola bool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags,
7508220e8a8SMehdi Amini                           const FunctionInfoIndex *Index,
751e5a61917STeresa Johnson                           DenseSet<const GlobalValue *> *FunctionsToImport,
752e5a61917STeresa Johnson                           DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) {
753bef54363STeresa Johnson   ModuleLinker ModLinker(Mover, *Src, Flags, Index, FunctionsToImport,
754e5a61917STeresa Johnson                          ValIDToTempMDMap);
755bef54363STeresa Johnson   return ModLinker.run();
756434e9561SRafael Espindola }
757434e9561SRafael Espindola 
758434e9561SRafael Espindola bool Linker::linkInModuleForCAPI(Module &Src) {
759bef54363STeresa Johnson   ModuleLinker ModLinker(Mover, Src, 0, nullptr, nullptr);
760bef54363STeresa Johnson   return ModLinker.run();
7613df61b7bSRafael Espindola }
7623df61b7bSRafael Espindola 
763e5a61917STeresa Johnson bool Linker::linkInMetadata(Module &Src,
764e5a61917STeresa Johnson                             DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) {
765e5a61917STeresa Johnson   SetVector<GlobalValue *> ValuesToLink;
766e5a61917STeresa Johnson   if (Mover.move(
767e5a61917STeresa Johnson           Src, ValuesToLink.getArrayRef(),
768e5a61917STeresa Johnson           [this](GlobalValue &GV, IRMover::ValueAdder Add) { assert(false); },
769e5a61917STeresa Johnson           ValIDToTempMDMap, true))
770e5a61917STeresa Johnson     return true;
771e5a61917STeresa Johnson   return false;
772e5a61917STeresa Johnson }
773e5a61917STeresa Johnson 
774b1ed91f3SChris Lattner //===----------------------------------------------------------------------===//
775b1ed91f3SChris Lattner // LinkModules entrypoint.
776b1ed91f3SChris Lattner //===----------------------------------------------------------------------===//
777b1ed91f3SChris Lattner 
77818c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module
77918c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs,
78018c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem.
78118c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be
78218c89411SRafael Espindola /// relied on to be consistent.
783434e9561SRafael Espindola bool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src,
784434e9561SRafael Espindola                          unsigned Flags) {
7859d2bfc48SRafael Espindola   Linker L(Dest);
786434e9561SRafael Espindola   return L.linkInModule(std::move(Src), Flags);
7874160f5d3SRafael Espindola }
7884160f5d3SRafael Espindola 
789bae7e759STeresa Johnson std::unique_ptr<Module>
790434e9561SRafael Espindola llvm::renameModuleForThinLTO(std::unique_ptr<Module> M,
7919d2bfc48SRafael Espindola                              const FunctionInfoIndex *Index) {
792bae7e759STeresa Johnson   std::unique_ptr<llvm::Module> RenamedModule(
793bae7e759STeresa Johnson       new llvm::Module(M->getModuleIdentifier(), M->getContext()));
7949d2bfc48SRafael Espindola   Linker L(*RenamedModule.get());
795434e9561SRafael Espindola   if (L.linkInModule(std::move(M), llvm::Linker::Flags::None, Index))
796bae7e759STeresa Johnson     return nullptr;
797bae7e759STeresa Johnson   return RenamedModule;
798bae7e759STeresa Johnson }
799bae7e759STeresa Johnson 
800a3aeb980SBill Wendling //===----------------------------------------------------------------------===//
801a3aeb980SBill Wendling // C API.
802a3aeb980SBill Wendling //===----------------------------------------------------------------------===//
803a3aeb980SBill Wendling 
8049d2bfc48SRafael Espindola static void diagnosticHandler(const DiagnosticInfo &DI, void *C) {
8059d2bfc48SRafael Espindola   auto *Message = reinterpret_cast<std::string *>(C);
8069d2bfc48SRafael Espindola   raw_string_ostream Stream(*Message);
8079d2bfc48SRafael Espindola   DiagnosticPrinterRawOStream DP(Stream);
8089d2bfc48SRafael Espindola   DI.print(DP);
8099d2bfc48SRafael Espindola }
8109d2bfc48SRafael Espindola 
811a3aeb980SBill Wendling LLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src,
812a57d588cSJuergen Ributzka                          LLVMLinkerMode Unused, char **OutMessages) {
81398ab63ceSRafael Espindola   Module *D = unwrap(Dest);
8149d2bfc48SRafael Espindola   LLVMContext &Ctx = D->getContext();
8159d2bfc48SRafael Espindola 
8169d2bfc48SRafael Espindola   LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler =
8179d2bfc48SRafael Espindola       Ctx.getDiagnosticHandler();
8189d2bfc48SRafael Espindola   void *OldDiagnosticContext = Ctx.getDiagnosticContext();
81998ab63ceSRafael Espindola   std::string Message;
8209d2bfc48SRafael Espindola   Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true);
8214160f5d3SRafael Espindola 
822434e9561SRafael Espindola   Linker L(*D);
823434e9561SRafael Espindola   Module *M = unwrap(Src);
824434e9561SRafael Espindola   LLVMBool Result = L.linkInModuleForCAPI(*M);
82598ab63ceSRafael Espindola 
8269d2bfc48SRafael Espindola   Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true);
8279d2bfc48SRafael Espindola 
8289d2bfc48SRafael Espindola   if (OutMessages && Result)
82998ab63ceSRafael Espindola     *OutMessages = strdup(Message.c_str());
830a3aeb980SBill Wendling   return Result;
831a3aeb980SBill Wendling }
832434e9561SRafael Espindola 
833434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) {
834434e9561SRafael Espindola   Module *D = unwrap(Dest);
835434e9561SRafael Espindola   std::unique_ptr<Module> M(unwrap(Src));
836434e9561SRafael Espindola   return Linker::linkModules(*D, std::move(M));
837434e9561SRafael Espindola }
838