1c834bbf55832c45f90b1163f920472fefbf77bc1Mikhail Glushenkov//===- lib/Linker/LinkModules.cpp - Module Linker Implementation ----------===//
2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
952f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner//
1052f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner// This file implements the LLVM module linker.
1152f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner//
1252f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner//===----------------------------------------------------------------------===//
1352f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "LinkDiagnosticInfo.h"
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm-c/Linker.h"
16d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling#include "llvm/ADT/SetVector.h"
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/ADT/StringSet.h"
1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/DiagnosticPrinter.h"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/LLVMContext.h"
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Linker/Linker.h"
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Error.h"
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/Utils/FunctionImportUtils.h"
23f7703df4968084c18c248c1feea9961c19a32e6aChris Lattnerusing namespace llvm;
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2562a81a1eba019ab570b002f8e1686494139785a1Chris Lattnernamespace {
26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// This is an implementation class for the LinkModules function, which is the
28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// entrypoint for this file.
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass ModuleLinker {
30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  IRMover &Mover;
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::unique_ptr<Module> SrcM;
32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  SetVector<GlobalValue *> ValuesToLink;
34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  StringSet<> Internalize;
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// For symbol clashes, prefer those from Src.
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned Flags;
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Functions to import from source module, all other functions are
40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// imported as declarations instead of definitions.
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DenseSet<const GlobalValue *> *GlobalsToImport;
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Used as the callback for lazy linking.
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// The mover has just hit GV and we have to decide if it, and other members
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// of the same comdat, should be linked. Every member to be linked is passed
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// to Add.
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add);
486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool shouldLinkReferencedLinkOnce() {
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return !(Flags & Linker::DontForceLinkLinkonceODR);
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; }
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; }
54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool shouldInternalizeLinkedSymbols() {
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return Flags & Linker::InternalizeLinkedSymbols;
566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest,
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                            const GlobalValue &Src);
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Should we have mover and linker error diag info?
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool emitError(const Twine &Message) {
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message));
64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return true;
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool getComdatLeader(Module &M, StringRef ComdatName,
68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                       const GlobalVariable *&GVar);
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool computeResultingSelectionKind(StringRef ComdatName,
70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                     Comdat::SelectionKind Src,
71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                     Comdat::SelectionKind Dst,
72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                     Comdat::SelectionKind &Result,
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                     bool &LinkFromSrc);
74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>>
75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      ComdatsChosen;
76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK,
77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                       bool &LinkFromSrc);
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Keep track of the lazy linked global members of each comdat in source.
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers;
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Given a global in the source module, return the global in the
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// destination module that is being linked to, if any.
83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) {
84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Module &DstM = Mover.getModule();
85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // If the source has no name it can't link.  If it has local linkage,
86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // there is no name match-up going on.
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage()))
88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return nullptr;
89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Otherwise see if we have a match in the destination module's symtab.
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName());
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (!DGV)
93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return nullptr;
94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // If we found a global with the same name in the dest module, but it has
96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // internal linkage, we are really not doing any linkage here.
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (DGV->hasLocalLinkage())
98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return nullptr;
99ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Otherwise, we do in fact link to the destination global.
101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return DGV;
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Drop GV if it is a member of a comdat that we are dropping.
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// This can happen with COFF's largest selection kind.
106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void dropReplacedComdat(GlobalValue &GV,
107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          const DenseSet<const Comdat *> &ReplacedDstComdats);
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool linkIfNeeded(GlobalValue &GV);
11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Helper method to check if we are importing from the current source
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// module.
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool isPerformingImport() const { return GlobalsToImport != nullptr; }
11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
115f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// If we are importing from the source module, checks if we should
116f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// import SGV as a definition, otherwise import as a declaration.
117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool doImportAsDefinition(const GlobalValue *SGV);
11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags,
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               DenseSet<const GlobalValue *> *GlobalsToImport = nullptr)
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags),
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        GlobalsToImport(GlobalsToImport) {}
124ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer
125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool run();
126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
127c003628a612d3687fb77088a5894314210a65385Chris Lattner}
128c003628a612d3687fb77088a5894314210a65385Chris Lattner
129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) {
130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!isPerformingImport())
1313ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola    return false;
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return FunctionImportGlobalProcessing::doImportAsDefinition(SGV,
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                              GlobalsToImport);
134a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy}
135a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy
136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic GlobalValue::VisibilityTypes
137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainargetMinVisibility(GlobalValue::VisibilityTypes A,
138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                 GlobalValue::VisibilityTypes B) {
139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility)
140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return GlobalValue::HiddenVisibility;
141f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (A == GlobalValue::ProtectedVisibility ||
142f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      B == GlobalValue::ProtectedVisibility)
143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return GlobalValue::ProtectedVisibility;
144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return GlobalValue::DefaultVisibility;
145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName,
148c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                   const GlobalVariable *&GVar) {
149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const GlobalValue *GVal = M.getNamedValue(ComdatName);
150c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) {
151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    GVal = GA->getBaseObject();
152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (!GVal)
153c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      // We cannot resolve the size of the aliasee yet.
154c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      return emitError("Linking COMDATs named '" + ComdatName +
155c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                       "': COMDAT key involves incomputable alias size.");
156c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
157c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  GVar = dyn_cast_or_null<GlobalVariable>(GVal);
159c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (!GVar)
160c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return emitError(
161c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        "Linking COMDATs named '" + ComdatName +
162c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        "': GlobalVariable required for data dependent selection!");
163c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
164c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return false;
165c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
166c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesbool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName,
168c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                                 Comdat::SelectionKind Src,
169c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                                 Comdat::SelectionKind Dst,
170c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                                 Comdat::SelectionKind &Result,
171c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                                 bool &LinkFromSrc) {
172f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Module &DstM = Mover.getModule();
173c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // The ability to mix Comdat::SelectionKind::Any with
174c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Comdat::SelectionKind::Largest is a behavior that comes from COFF.
175c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any ||
176c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                         Dst == Comdat::SelectionKind::Largest;
177c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any ||
178c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                         Src == Comdat::SelectionKind::Largest;
179c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (DstAnyOrLargest && SrcAnyOrLargest) {
180c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (Dst == Comdat::SelectionKind::Largest ||
181c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        Src == Comdat::SelectionKind::Largest)
182c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      Result = Comdat::SelectionKind::Largest;
183c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    else
184c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      Result = Comdat::SelectionKind::Any;
185c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  } else if (Src == Dst) {
186c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Result = Dst;
187c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  } else {
188c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return emitError("Linking COMDATs named '" + ComdatName +
189c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                     "': invalid selection kinds!");
190c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
191c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
192c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  switch (Result) {
193c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  case Comdat::SelectionKind::Any:
194c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    // Go with Dst.
195c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    LinkFromSrc = false;
196c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    break;
197c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  case Comdat::SelectionKind::NoDuplicates:
198c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return emitError("Linking COMDATs named '" + ComdatName +
199c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                     "': noduplicates has been violated!");
200c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  case Comdat::SelectionKind::ExactMatch:
201c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  case Comdat::SelectionKind::Largest:
202c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  case Comdat::SelectionKind::SameSize: {
203c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    const GlobalVariable *DstGV;
204c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    const GlobalVariable *SrcGV;
205c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (getComdatLeader(DstM, ComdatName, DstGV) ||
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        getComdatLeader(*SrcM, ComdatName, SrcGV))
207c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      return true;
208c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
209f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const DataLayout &DstDL = DstM.getDataLayout();
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const DataLayout &SrcDL = SrcM->getDataLayout();
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType());
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType());
213c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (Result == Comdat::SelectionKind::ExactMatch) {
214c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (SrcGV->getInitializer() != DstGV->getInitializer())
215c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        return emitError("Linking COMDATs named '" + ComdatName +
216c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                         "': ExactMatch violated!");
217c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      LinkFromSrc = false;
218c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    } else if (Result == Comdat::SelectionKind::Largest) {
219c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      LinkFromSrc = SrcSize > DstSize;
220c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    } else if (Result == Comdat::SelectionKind::SameSize) {
221c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (SrcSize != DstSize)
222c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        return emitError("Linking COMDATs named '" + ComdatName +
223c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                         "': SameSize violated!");
224c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      LinkFromSrc = false;
225c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    } else {
226c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      llvm_unreachable("unknown selection kind");
227c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    }
228c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    break;
229c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
230c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
231c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
232c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return false;
233c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
234c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
235c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesbool ModuleLinker::getComdatResult(const Comdat *SrcC,
236c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                   Comdat::SelectionKind &Result,
237c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                   bool &LinkFromSrc) {
238f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Module &DstM = Mover.getModule();
23937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Comdat::SelectionKind SSK = SrcC->getSelectionKind();
240c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  StringRef ComdatName = SrcC->getName();
241f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable();
242c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName);
24337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
24437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (DstCI == ComdatSymTab.end()) {
24537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // Use the comdat if it is only available in one of the modules.
24637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    LinkFromSrc = true;
24737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Result = SSK;
24837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
249c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
25037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
25137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const Comdat *DstC = &DstCI->second;
25237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Comdat::SelectionKind DSK = DstC->getSelectionKind();
25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return computeResultingSelectionKind(ComdatName, SSK, DSK, Result,
25437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                       LinkFromSrc);
255c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
256a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy
25737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc,
25837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                        const GlobalValue &Dest,
25937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                        const GlobalValue &Src) {
260f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Should we unconditionally use the Src?
262f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (shouldOverrideFromSrc()) {
2636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LinkFromSrc = true;
2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return false;
2656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
26737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // We always have to add Src if it has appending linkage.
26837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Src.hasAppendingLinkage()) {
269f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Should have prevented importing for appending linkage in linkIfNeeded.
270f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    assert(!isPerformingImport());
27137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    LinkFromSrc = true;
27237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
27337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
27437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
275f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (isPerformingImport()) {
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // LinkFromSrc iff this is a global requested for importing.
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LinkFromSrc = GlobalsToImport->count(&Src);
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return false;
279f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
280f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool SrcIsDeclaration = Src.isDeclarationForLinker();
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool DestIsDeclaration = Dest.isDeclarationForLinker();
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
2841afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  if (SrcIsDeclaration) {
2852b48ef0450944c2c46633aec9baf6be835a3b503Anton Korobeynikov    // If Src is external or if both Src & Dest are external..  Just link the
286aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner    // external globals, we aren't adding anything.
28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Src.hasDLLImportStorageClass()) {
28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // If one of GVs is marked as DLLImport, result should be dllimport'ed.
28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      LinkFromSrc = DestIsDeclaration;
29037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return false;
291b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov    }
29237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // If the Dest is weak, use the source linkage.
293f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Dest.hasExternalWeakLinkage()) {
294f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      LinkFromSrc = true;
295f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return false;
296f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
297f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Link an available_externally over a declaration.
298f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration();
29937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
30037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
30137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
30237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (DestIsDeclaration) {
303aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner    // If Dest is external but Src is not:
304aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner    LinkFromSrc = true;
30537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
30637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
30737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
30837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Src.hasCommonLinkage()) {
30937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) {
310aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner      LinkFromSrc = true;
31137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return false;
312aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner    }
31337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
31437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (!Dest.hasCommonLinkage()) {
31578ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov      LinkFromSrc = false;
31637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return false;
31737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
31837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    const DataLayout &DL = Dest.getParent()->getDataLayout();
320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType());
321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType());
32237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    LinkFromSrc = SrcSize > DestSize;
32337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
32437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
32537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Src.isWeakForLinker()) {
32737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    assert(!Dest.hasExternalWeakLinkage());
32837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    assert(!Dest.hasAvailableExternallyLinkage());
32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) {
33178ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov      LinkFromSrc = true;
33237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return false;
33378ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov    }
33437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
33537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    LinkFromSrc = false;
33637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
337aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner  }
3389cd3ccf5065a8a139e458d016c88a8512471598bAnton Korobeynikov
33937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Dest.isWeakForLinker()) {
34037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    assert(Src.hasExternalLinkage());
34137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    LinkFromSrc = true;
34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
34337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
34437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
34537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  assert(!Src.hasExternalWeakLinkage());
34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  assert(!Dest.hasExternalWeakLinkage());
34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() &&
34837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines         "Unexpected linkage type!");
34937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return emitError("Linking globals named '" + Src.getName() +
35037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                   "': symbol multiply defined!");
351aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner}
3525c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner
353f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool ModuleLinker::linkIfNeeded(GlobalValue &GV) {
354f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  GlobalValue *DGV = getLinkedToGlobal(&GV);
355348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling
356f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration()))
357f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return false;
358ab67e705f59d567afded845465f358b8a66ab62eDevang Patel
359f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) {
360f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    auto *DGVar = dyn_cast<GlobalVariable>(DGV);
361f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    auto *SGVar = dyn_cast<GlobalVariable>(&GV);
362f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (DGVar && SGVar) {
363f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (DGVar->isDeclaration() && SGVar->isDeclaration() &&
364f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          (!DGVar->isConstant() || !SGVar->isConstant())) {
365f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        DGVar->setConstant(false);
366f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        SGVar->setConstant(false);
367f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
368f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) {
369f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment());
370f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        SGVar->setAlignment(Align);
371f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        DGVar->setAlignment(Align);
372f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
37337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
37437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
375f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    GlobalValue::VisibilityTypes Visibility =
376f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        getMinVisibility(DGV->getVisibility(), GV.getVisibility());
377f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    DGV->setVisibility(Visibility);
378f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    GV.setVisibility(Visibility);
37937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::getMinUnnamedAddr(
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        DGV->getUnnamedAddr(), GV.getUnnamedAddr());
382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DGV->setUnnamedAddr(UnnamedAddr);
383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GV.setUnnamedAddr(UnnamedAddr);
38437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
3851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
386f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Don't want to append to global_ctors list, for example, when we
387f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // are importing for ThinLTO, otherwise the global ctors and dtors
388f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // get executed multiple times for local variables (the latter causing
389f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // double frees).
390f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (GV.hasAppendingLinkage() && isPerformingImport())
391f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return false;
3925c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isPerformingImport()) {
394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!doImportAsDefinition(&GV))
395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return false;
396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else if (!DGV && !shouldOverrideFromSrc() &&
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() ||
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              GV.hasAvailableExternallyLinkage()))
399f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return false;
40037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
401f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (GV.isDeclaration())
402f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return false;
4031afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
404f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (const Comdat *SC = GV.getComdat()) {
405f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool LinkFromSrc;
406c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Comdat::SelectionKind SK;
407c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    std::tie(SK, LinkFromSrc) = ComdatsChosen[SC];
408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!LinkFromSrc)
409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return false;
41037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
4116157e383c4a15ffb6e7f27cdb153daa9caa15ca5Chris Lattner
412f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool LinkFromSrc = true;
413f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV))
414f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return true;
415f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (LinkFromSrc)
416f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ValuesToLink.insert(&GV);
417ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return false;
4185c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner}
4195c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner
420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ModuleLinker::addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add) {
421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!shouldLinkReferencedLinkOnce())
422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // For ThinLTO we don't import more than what was required.
423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // The client has to guarantee that the linkonce will be availabe at link
424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // time (by promoting it to weak for instance).
425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Add these to the internalize list
428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!GV.hasLinkOnceLinkage() && !shouldLinkOnlyNeeded())
429ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return;
430ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
431f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (shouldInternalizeLinkedSymbols())
432f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Internalize.insert(GV.getName());
433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Add(GV);
434ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
435f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Comdat *SC = GV.getComdat();
436f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!SC)
437f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (GlobalValue *GV2 : LazyComdatMembers[SC]) {
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GlobalValue *DGV = getLinkedToGlobal(GV2);
440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    bool LinkFromSrc = true;
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2))
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return;
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!LinkFromSrc)
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      continue;
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (shouldInternalizeLinkedSymbols())
446f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Internalize.insert(GV2->getName());
447f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Add(*GV2);
448f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
449f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
450f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ModuleLinker::dropReplacedComdat(
452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) {
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Comdat *C = GV.getComdat();
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!C)
455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!ReplacedDstComdats.count(C))
457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (GV.use_empty()) {
459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GV.eraseFromParent();
460ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return;
461d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling  }
462ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto *F = dyn_cast<Function>(&GV)) {
464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    F->deleteBody();
465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) {
466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Var->setInitializer(nullptr);
467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto &Alias = cast<GlobalAlias>(GV);
469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Module &M = *Alias.getParent();
470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    PointerType &Ty = *cast<PointerType>(Alias.getType());
471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GlobalValue *Declaration;
472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) {
473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M);
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    } else {
475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Declaration =
476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false,
477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             GlobalValue::ExternalLinkage,
478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             /*Initializer*/ nullptr);
479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Declaration->takeName(&Alias);
481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Alias.replaceAllUsesWith(Declaration);
482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Alias.eraseFromParent();
483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
484ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
485ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
4861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::run() {
487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Module &DstM = Mover.getModule();
488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DenseSet<const Comdat *> ReplacedDstComdats;
489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (const auto &SMEC : SrcM->getComdatSymbolTable()) {
491c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    const Comdat &C = SMEC.getValue();
492c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (ComdatsChosen.count(&C))
493c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      continue;
494c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Comdat::SelectionKind SK;
495c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    bool LinkFromSrc;
496c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (getComdatResult(&C, SK, LinkFromSrc))
497c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      return true;
498c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc);
499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!LinkFromSrc)
501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      continue;
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable();
504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName());
505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (DstCI == ComdatSymTab.end())
506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      continue;
507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // The source comdat is replacing the dest one.
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Comdat *DstC = &DstCI->second;
510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ReplacedDstComdats.insert(DstC);
511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Alias have to go first, since we are not able to find their comdats
514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // otherwise.
515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) {
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GlobalAlias &GV = *I++;
517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    dropReplacedComdat(GV, ReplacedDstComdats);
518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) {
521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    GlobalVariable &GV = *I++;
522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    dropReplacedComdat(GV, ReplacedDstComdats);
523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto I = DstM.begin(), E = DstM.end(); I != E;) {
526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Function &GV = *I++;
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    dropReplacedComdat(GV, ReplacedDstComdats);
528c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
529c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (GlobalVariable &GV : SrcM->globals())
531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (GV.hasLinkOnceLinkage())
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (const Comdat *SC = GV.getComdat())
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LazyComdatMembers[SC].push_back(&GV);
534f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (Function &SF : *SrcM)
536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SF.hasLinkOnceLinkage())
537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (const Comdat *SC = SF.getComdat())
538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LazyComdatMembers[SC].push_back(&SF);
539f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (GlobalAlias &GA : SrcM->aliases())
541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (GA.hasLinkOnceLinkage())
542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (const Comdat *SC = GA.getComdat())
543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        LazyComdatMembers[SC].push_back(&GA);
54437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5451afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  // Insert all of the globals in src into the DstM module... without linking
5468166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner  // initializers (which could refer to functions not yet mapped over).
547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (GlobalVariable &GV : SrcM->globals())
548f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (linkIfNeeded(GV))
5491afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner      return true;
5505c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (Function &SF : *SrcM)
552f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (linkIfNeeded(SF))
5531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner      return true;
5546cdf1971bdf88ddd9a7d46b5f5f975497d68c38eChris Lattner
555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (GlobalAlias &GA : SrcM->aliases())
556f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (linkIfNeeded(GA))
5571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner      return true;
55852f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner
559f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (unsigned I = 0; I < ValuesToLink.size(); ++I) {
560f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    GlobalValue *GV = ValuesToLink[I];
561f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Comdat *SC = GV->getComdat();
562f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!SC)
563ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      continue;
564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (GlobalValue *GV2 : LazyComdatMembers[SC]) {
565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      GlobalValue *DGV = getLinkedToGlobal(GV2);
566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      bool LinkFromSrc = true;
567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2))
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        return true;
569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (LinkFromSrc)
570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ValuesToLink.insert(GV2);
571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
572ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
573ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
574f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (shouldInternalizeLinkedSymbols()) {
575f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    for (GlobalValue *GV : ValuesToLink)
576f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Internalize.insert(GV->getName());
5771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  }
5788166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner
579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // FIXME: Propagate Errors through to the caller instead of emitting
580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // diagnostics.
581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool HasErrors = false;
582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(),
583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           [this](GlobalValue &GV, IRMover::ValueAdder Add) {
584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             addLazyFor(GV, Add);
585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           })) {
586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {
587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message()));
588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      HasErrors = true;
589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    });
590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (HasErrors)
592d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling    return true;
593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
594f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (auto &P : Internalize) {
595f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    GlobalValue *GV = DstM.getNamedValue(P.first());
596f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    GV->setLinkage(GlobalValue::InternalLinkage);
597ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
598ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
599ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return false;
600ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
601208b6f69441293d27b61b9d16a69c9bba4d097cbBill Wendling
602f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLinker::Linker(Module &M) : Mover(M) {}
6034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
604f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags,
605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                          DenseSet<const GlobalValue *> *GlobalsToImport) {
606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ModuleLinker ModLinker(Mover, std::move(Src), Flags, GlobalsToImport);
607f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return ModLinker.run();
608ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
609ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
6101afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===//
6111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner// LinkModules entrypoint.
6121afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===//
6131afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
61437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// This function links two modules together, with the resulting Dest module
61537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// modified to be the composite of the two input modules. If an error occurs,
61637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// true is returned and ErrorMsg (if not null) is set to indicate the problem.
61737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// Upon failure, the Dest module could be in a modified state, and shouldn't be
61837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// relied on to be consistent.
619f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src,
620f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                         unsigned Flags) {
621f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Linker L(Dest);
622f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return L.linkInModule(std::move(Src), Flags);
62337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
62437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
625f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling//===----------------------------------------------------------------------===//
626f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling// C API.
627f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling//===----------------------------------------------------------------------===//
628f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling
629f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) {
630f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Module *D = unwrap(Dest);
631f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::unique_ptr<Module> M(unwrap(Src));
632f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Linker::linkModules(*D, std::move(M));
633f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
634