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 14caabe228SRafael Espindola #include "LinkDiagnosticInfo.h" 15ed0881b2SChandler Carruth #include "llvm-c/Linker.h" 1666f02413SBill Wendling #include "llvm/ADT/SetVector.h" 17caabe228SRafael Espindola #include "llvm/ADT/StringSet.h" 18d12b4a33SRafael Espindola #include "llvm/IR/DiagnosticPrinter.h" 199d2bfc48SRafael Espindola #include "llvm/IR/LLVMContext.h" 20488a800aSTeresa Johnson #include "llvm/Linker/Linker.h" 211eaa97f4SPeter Collingbourne #include "llvm/Support/Error.h" 22488a800aSTeresa Johnson #include "llvm/Transforms/Utils/FunctionImportUtils.h" 23361e513dSReid Spencer using namespace llvm; 24361e513dSReid Spencer 25b1ed91f3SChris Lattner namespace { 26d12b4a33SRafael Espindola 2718c89411SRafael Espindola /// This is an implementation class for the LinkModules function, which is the 2818c89411SRafael Espindola /// entrypoint for this file. 29b1ed91f3SChris Lattner class ModuleLinker { 30caabe228SRafael Espindola IRMover &Mover; 3140358fb8SRafael Espindola std::unique_ptr<Module> SrcM; 32b1ed91f3SChris Lattner 334b5ec263SRafael Espindola SetVector<GlobalValue *> ValuesToLink; 34caabe228SRafael Espindola StringSet<> Internalize; 354160f5d3SRafael Espindola 36e868123dSDuncan P. N. Exon Smith /// For symbol clashes, prefer those from Src. 37020d4fb1SArtem Belevich unsigned Flags; 38e868123dSDuncan P. N. Exon Smith 394f04d85fSTeresa Johnson /// Functions to import from source module, all other functions are 40c7ed52f2STeresa Johnson /// imported as declarations instead of definitions. 418d05185aSMehdi Amini DenseSet<const GlobalValue *> *GlobalsToImport; 42c7ed52f2STeresa Johnson 43caabe228SRafael Espindola /// Used as the callback for lazy linking. 44caabe228SRafael Espindola /// The mover has just hit GV and we have to decide if it, and other members 45caabe228SRafael Espindola /// of the same comdat, should be linked. Every member to be linked is passed 46caabe228SRafael Espindola /// to Add. 47c321e534SBenjamin Kramer void addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add); 48baa3bf8fSRafael Espindola 49bda3c97cSMehdi Amini bool shouldLinkReferencedLinkOnce() { 50bda3c97cSMehdi Amini return !(Flags & Linker::DontForceLinkLinkonceODR); 51bda3c97cSMehdi Amini } 52020d4fb1SArtem Belevich bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 53020d4fb1SArtem Belevich bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 54020d4fb1SArtem Belevich bool shouldInternalizeLinkedSymbols() { 55020d4fb1SArtem Belevich return Flags & Linker::InternalizeLinkedSymbols; 56020d4fb1SArtem Belevich } 57020d4fb1SArtem Belevich 58d12b4a33SRafael Espindola bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 59d12b4a33SRafael Espindola const GlobalValue &Src); 60dbb0bd1aSRafael Espindola 61caabe228SRafael Espindola /// Should we have mover and linker error diag info? 62b1ed91f3SChris Lattner bool emitError(const Twine &Message) { 6340358fb8SRafael Espindola SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 64b1ed91f3SChris Lattner return true; 65b1ed91f3SChris Lattner } 66b1ed91f3SChris Lattner 670e309fe8SRafael Espindola bool getComdatLeader(Module &M, StringRef ComdatName, 68dad0a645SDavid Majnemer const GlobalVariable *&GVar); 69dad0a645SDavid Majnemer bool computeResultingSelectionKind(StringRef ComdatName, 70dad0a645SDavid Majnemer Comdat::SelectionKind Src, 71dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 72dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 73dad0a645SDavid Majnemer bool &LinkFromSrc); 74dad0a645SDavid Majnemer std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 75dad0a645SDavid Majnemer ComdatsChosen; 76dad0a645SDavid Majnemer bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 77dad0a645SDavid Majnemer bool &LinkFromSrc); 781ee9fbd8SRafael Espindola // Keep track of the lazy linked global members of each comdat in source. 791ee9fbd8SRafael Espindola DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers; 80dad0a645SDavid Majnemer 8118c89411SRafael Espindola /// Given a global in the source module, return the global in the 8218c89411SRafael Espindola /// destination module that is being linked to, if any. 833e8bc6a8SRafael Espindola GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 84caabe228SRafael Espindola Module &DstM = Mover.getModule(); 85b1ed91f3SChris Lattner // If the source has no name it can't link. If it has local linkage, 86b1ed91f3SChris Lattner // there is no name match-up going on. 874504c1bcSTeresa Johnson if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage())) 882617dcceSCraig Topper return nullptr; 89b1ed91f3SChris Lattner 90b1ed91f3SChris Lattner // Otherwise see if we have a match in the destination module's symtab. 914504c1bcSTeresa Johnson GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 92c84f608bSRafael Espindola if (!DGV) 93c84f608bSRafael Espindola return nullptr; 94b1ed91f3SChris Lattner 95b1ed91f3SChris Lattner // If we found a global with the same name in the dest module, but it has 96b1ed91f3SChris Lattner // internal linkage, we are really not doing any linkage here. 97b1ed91f3SChris Lattner if (DGV->hasLocalLinkage()) 982617dcceSCraig Topper return nullptr; 99b1ed91f3SChris Lattner 100b1ed91f3SChris Lattner // Otherwise, we do in fact link to the destination global. 101b1ed91f3SChris Lattner return DGV; 102b1ed91f3SChris Lattner } 103b1ed91f3SChris Lattner 104370d528aSRafael Espindola /// Drop GV if it is a member of a comdat that we are dropping. 105370d528aSRafael Espindola /// This can happen with COFF's largest selection kind. 106370d528aSRafael Espindola void dropReplacedComdat(GlobalValue &GV, 107370d528aSRafael Espindola const DenseSet<const Comdat *> &ReplacedDstComdats); 108370d528aSRafael Espindola 109baa3bf8fSRafael Espindola bool linkIfNeeded(GlobalValue &GV); 110c7ed52f2STeresa Johnson 1114504c1bcSTeresa Johnson /// Helper method to check if we are importing from the current source 1124504c1bcSTeresa Johnson /// module. 1138d05185aSMehdi Amini bool isPerformingImport() const { return GlobalsToImport != nullptr; } 1144504c1bcSTeresa Johnson 1154504c1bcSTeresa Johnson /// If we are importing from the source module, checks if we should 1164504c1bcSTeresa Johnson /// import SGV as a definition, otherwise import as a declaration. 1174504c1bcSTeresa Johnson bool doImportAsDefinition(const GlobalValue *SGV); 1184504c1bcSTeresa Johnson 1194504c1bcSTeresa Johnson public: 12040358fb8SRafael Espindola ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags, 121b703c77bSTeresa Johnson DenseSet<const GlobalValue *> *GlobalsToImport = nullptr) 1228d05185aSMehdi Amini : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags), 123b703c77bSTeresa Johnson GlobalsToImport(GlobalsToImport) {} 1244504c1bcSTeresa Johnson 1254504c1bcSTeresa Johnson bool run(); 1264504c1bcSTeresa Johnson }; 1274504c1bcSTeresa Johnson } 1284504c1bcSTeresa Johnson 1294504c1bcSTeresa Johnson bool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) { 1304504c1bcSTeresa Johnson if (!isPerformingImport()) 1314504c1bcSTeresa Johnson return false; 1328d05185aSMehdi Amini return FunctionImportGlobalProcessing::doImportAsDefinition(SGV, 1338d05185aSMehdi Amini GlobalsToImport); 134c7ed52f2STeresa Johnson } 135c7ed52f2STeresa Johnson 136eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes 137eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A, 138eb5e0a77SRafael Espindola GlobalValue::VisibilityTypes B) { 139eb5e0a77SRafael Espindola if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 140eb5e0a77SRafael Espindola return GlobalValue::HiddenVisibility; 141eb5e0a77SRafael Espindola if (A == GlobalValue::ProtectedVisibility || 142eb5e0a77SRafael Espindola B == GlobalValue::ProtectedVisibility) 143eb5e0a77SRafael Espindola return GlobalValue::ProtectedVisibility; 144eb5e0a77SRafael Espindola return GlobalValue::DefaultVisibility; 145eb5e0a77SRafael Espindola } 146eb5e0a77SRafael Espindola 1470e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 148dad0a645SDavid Majnemer const GlobalVariable *&GVar) { 1490e309fe8SRafael Espindola const GlobalValue *GVal = M.getNamedValue(ComdatName); 150dad0a645SDavid Majnemer if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 151dad0a645SDavid Majnemer GVal = GA->getBaseObject(); 152dad0a645SDavid Majnemer if (!GVal) 153dad0a645SDavid Majnemer // We cannot resolve the size of the aliasee yet. 154dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 155dad0a645SDavid Majnemer "': COMDAT key involves incomputable alias size."); 156dad0a645SDavid Majnemer } 157dad0a645SDavid Majnemer 158dad0a645SDavid Majnemer GVar = dyn_cast_or_null<GlobalVariable>(GVal); 159dad0a645SDavid Majnemer if (!GVar) 160dad0a645SDavid Majnemer return emitError( 161dad0a645SDavid Majnemer "Linking COMDATs named '" + ComdatName + 162dad0a645SDavid Majnemer "': GlobalVariable required for data dependent selection!"); 163dad0a645SDavid Majnemer 164dad0a645SDavid Majnemer return false; 165dad0a645SDavid Majnemer } 166dad0a645SDavid Majnemer 167dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 168dad0a645SDavid Majnemer Comdat::SelectionKind Src, 169dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 170dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 171dad0a645SDavid Majnemer bool &LinkFromSrc) { 172caabe228SRafael Espindola Module &DstM = Mover.getModule(); 173dad0a645SDavid Majnemer // The ability to mix Comdat::SelectionKind::Any with 174dad0a645SDavid Majnemer // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 175dad0a645SDavid Majnemer bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 176dad0a645SDavid Majnemer Dst == Comdat::SelectionKind::Largest; 177dad0a645SDavid Majnemer bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 178dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest; 179dad0a645SDavid Majnemer if (DstAnyOrLargest && SrcAnyOrLargest) { 180dad0a645SDavid Majnemer if (Dst == Comdat::SelectionKind::Largest || 181dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest) 182dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Largest; 183dad0a645SDavid Majnemer else 184dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Any; 185dad0a645SDavid Majnemer } else if (Src == Dst) { 186dad0a645SDavid Majnemer Result = Dst; 187dad0a645SDavid Majnemer } else { 188dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 189dad0a645SDavid Majnemer "': invalid selection kinds!"); 190dad0a645SDavid Majnemer } 191dad0a645SDavid Majnemer 192dad0a645SDavid Majnemer switch (Result) { 193dad0a645SDavid Majnemer case Comdat::SelectionKind::Any: 194dad0a645SDavid Majnemer // Go with Dst. 195dad0a645SDavid Majnemer LinkFromSrc = false; 196dad0a645SDavid Majnemer break; 197dad0a645SDavid Majnemer case Comdat::SelectionKind::NoDuplicates: 198dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 199dad0a645SDavid Majnemer "': noduplicates has been violated!"); 200dad0a645SDavid Majnemer case Comdat::SelectionKind::ExactMatch: 201dad0a645SDavid Majnemer case Comdat::SelectionKind::Largest: 202dad0a645SDavid Majnemer case Comdat::SelectionKind::SameSize: { 203dad0a645SDavid Majnemer const GlobalVariable *DstGV; 204dad0a645SDavid Majnemer const GlobalVariable *SrcGV; 205dad0a645SDavid Majnemer if (getComdatLeader(DstM, ComdatName, DstGV) || 20640358fb8SRafael Espindola getComdatLeader(*SrcM, ComdatName, SrcGV)) 207dad0a645SDavid Majnemer return true; 208dad0a645SDavid Majnemer 2090e309fe8SRafael Espindola const DataLayout &DstDL = DstM.getDataLayout(); 21040358fb8SRafael Espindola const DataLayout &SrcDL = SrcM->getDataLayout(); 2115f6eaac6SManuel Jacob uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType()); 2125f6eaac6SManuel Jacob uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType()); 213dad0a645SDavid Majnemer if (Result == Comdat::SelectionKind::ExactMatch) { 214dad0a645SDavid Majnemer if (SrcGV->getInitializer() != DstGV->getInitializer()) 215dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 216dad0a645SDavid Majnemer "': ExactMatch violated!"); 217dad0a645SDavid Majnemer LinkFromSrc = false; 218dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::Largest) { 219dad0a645SDavid Majnemer LinkFromSrc = SrcSize > DstSize; 220dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::SameSize) { 221dad0a645SDavid Majnemer if (SrcSize != DstSize) 222dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 223dad0a645SDavid Majnemer "': SameSize violated!"); 224dad0a645SDavid Majnemer LinkFromSrc = false; 225dad0a645SDavid Majnemer } else { 226dad0a645SDavid Majnemer llvm_unreachable("unknown selection kind"); 227dad0a645SDavid Majnemer } 228dad0a645SDavid Majnemer break; 229dad0a645SDavid Majnemer } 230dad0a645SDavid Majnemer } 231dad0a645SDavid Majnemer 232dad0a645SDavid Majnemer return false; 233dad0a645SDavid Majnemer } 234dad0a645SDavid Majnemer 235dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC, 236dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 237dad0a645SDavid Majnemer bool &LinkFromSrc) { 238caabe228SRafael Espindola Module &DstM = Mover.getModule(); 239b16196a3SRafael Espindola Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 240dad0a645SDavid Majnemer StringRef ComdatName = SrcC->getName(); 2410e309fe8SRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 242dad0a645SDavid Majnemer Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 2432ef3f299SRafael Espindola 244b16196a3SRafael Espindola if (DstCI == ComdatSymTab.end()) { 245b16196a3SRafael Espindola // Use the comdat if it is only available in one of the modules. 246b16196a3SRafael Espindola LinkFromSrc = true; 247b16196a3SRafael Espindola Result = SSK; 2482ef3f299SRafael Espindola return false; 249b16196a3SRafael Espindola } 2502ef3f299SRafael Espindola 251dad0a645SDavid Majnemer const Comdat *DstC = &DstCI->second; 252dad0a645SDavid Majnemer Comdat::SelectionKind DSK = DstC->getSelectionKind(); 2532ef3f299SRafael Espindola return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 2542ef3f299SRafael Espindola LinkFromSrc); 255dad0a645SDavid Majnemer } 256f6f121e2SJames Molloy 257d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 258d12b4a33SRafael Espindola const GlobalValue &Dest, 259dbb0bd1aSRafael Espindola const GlobalValue &Src) { 260e5a61917STeresa Johnson 261e868123dSDuncan P. N. Exon Smith // Should we unconditionally use the Src? 262020d4fb1SArtem Belevich if (shouldOverrideFromSrc()) { 263e868123dSDuncan P. N. Exon Smith LinkFromSrc = true; 264e868123dSDuncan P. N. Exon Smith return false; 265e868123dSDuncan P. N. Exon Smith } 266e868123dSDuncan P. N. Exon Smith 267778fcc77SRafael Espindola // We always have to add Src if it has appending linkage. 268778fcc77SRafael Espindola if (Src.hasAppendingLinkage()) { 2691e20a652STeresa Johnson // Should have prevented importing for appending linkage in linkIfNeeded. 270c7ed52f2STeresa Johnson assert(!isPerformingImport()); 271778fcc77SRafael Espindola LinkFromSrc = true; 272778fcc77SRafael Espindola return false; 273778fcc77SRafael Espindola } 274778fcc77SRafael Espindola 275c7ed52f2STeresa Johnson if (isPerformingImport()) { 276d826bbbbSMehdi Amini // LinkFromSrc iff this is a global requested for importing. 2778d05185aSMehdi Amini LinkFromSrc = GlobalsToImport->count(&Src); 278c7ed52f2STeresa Johnson return false; 279c7ed52f2STeresa Johnson } 280c7ed52f2STeresa Johnson 281d826bbbbSMehdi Amini bool SrcIsDeclaration = Src.isDeclarationForLinker(); 282d826bbbbSMehdi Amini bool DestIsDeclaration = Dest.isDeclarationForLinker(); 283c7ed52f2STeresa Johnson 284dbb0bd1aSRafael Espindola if (SrcIsDeclaration) { 285dbb0bd1aSRafael Espindola // If Src is external or if both Src & Dest are external.. Just link the 286dbb0bd1aSRafael Espindola // external globals, we aren't adding anything. 287d12b4a33SRafael Espindola if (Src.hasDLLImportStorageClass()) { 288dbb0bd1aSRafael Espindola // If one of GVs is marked as DLLImport, result should be dllimport'ed. 289d12b4a33SRafael Espindola LinkFromSrc = DestIsDeclaration; 290d12b4a33SRafael Espindola return false; 291d12b4a33SRafael Espindola } 292dbb0bd1aSRafael Espindola // If the Dest is weak, use the source linkage. 293ed11bd28SRafael Espindola if (Dest.hasExternalWeakLinkage()) { 294ed11bd28SRafael Espindola LinkFromSrc = true; 295ed11bd28SRafael Espindola return false; 296ed11bd28SRafael Espindola } 297ed11bd28SRafael Espindola // Link an available_externally over a declaration. 298ed11bd28SRafael Espindola LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 299d12b4a33SRafael Espindola return false; 300dbb0bd1aSRafael Espindola } 301dbb0bd1aSRafael Espindola 302d12b4a33SRafael Espindola if (DestIsDeclaration) { 303dbb0bd1aSRafael Espindola // If Dest is external but Src is not: 304d12b4a33SRafael Espindola LinkFromSrc = true; 305d12b4a33SRafael Espindola return false; 306d12b4a33SRafael Espindola } 307dbb0bd1aSRafael Espindola 3080910605aSRafael Espindola if (Src.hasCommonLinkage()) { 309d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 310d12b4a33SRafael Espindola LinkFromSrc = true; 3110910605aSRafael Espindola return false; 312d12b4a33SRafael Espindola } 313d12b4a33SRafael Espindola 314d12b4a33SRafael Espindola if (!Dest.hasCommonLinkage()) { 315d12b4a33SRafael Espindola LinkFromSrc = false; 316d12b4a33SRafael Espindola return false; 317d12b4a33SRafael Espindola } 3180910605aSRafael Espindola 319a28d91d8SMehdi Amini const DataLayout &DL = Dest.getParent()->getDataLayout(); 3205f6eaac6SManuel Jacob uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType()); 3215f6eaac6SManuel Jacob uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType()); 322d12b4a33SRafael Espindola LinkFromSrc = SrcSize > DestSize; 323d12b4a33SRafael Espindola return false; 3240910605aSRafael Espindola } 3250910605aSRafael Espindola 326dbb0bd1aSRafael Espindola if (Src.isWeakForLinker()) { 327dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 328dbb0bd1aSRafael Espindola assert(!Dest.hasAvailableExternallyLinkage()); 3290910605aSRafael Espindola 330d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 331d12b4a33SRafael Espindola LinkFromSrc = true; 332d12b4a33SRafael Espindola return false; 333d12b4a33SRafael Espindola } 334dbb0bd1aSRafael Espindola 335d12b4a33SRafael Espindola LinkFromSrc = false; 3360910605aSRafael Espindola return false; 337dbb0bd1aSRafael Espindola } 338dbb0bd1aSRafael Espindola 339dbb0bd1aSRafael Espindola if (Dest.isWeakForLinker()) { 340dbb0bd1aSRafael Espindola assert(Src.hasExternalLinkage()); 341d12b4a33SRafael Espindola LinkFromSrc = true; 342d12b4a33SRafael Espindola return false; 343dbb0bd1aSRafael Espindola } 344dbb0bd1aSRafael Espindola 345dbb0bd1aSRafael Espindola assert(!Src.hasExternalWeakLinkage()); 346dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 347dbb0bd1aSRafael Espindola assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 348dbb0bd1aSRafael Espindola "Unexpected linkage type!"); 349dbb0bd1aSRafael Espindola return emitError("Linking globals named '" + Src.getName() + 350dbb0bd1aSRafael Espindola "': symbol multiply defined!"); 351dbb0bd1aSRafael Espindola } 352dbb0bd1aSRafael Espindola 353baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 354baa3bf8fSRafael Espindola GlobalValue *DGV = getLinkedToGlobal(&GV); 355baa3bf8fSRafael Espindola 356baa3bf8fSRafael Espindola if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 357baa3bf8fSRafael Espindola return false; 358baa3bf8fSRafael Espindola 3594b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 3604b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 3614b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 3624b5ec263SRafael Espindola if (DGVar && SGVar) { 3634b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 3644b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 3654b5ec263SRafael Espindola DGVar->setConstant(false); 3664b5ec263SRafael Espindola SGVar->setConstant(false); 3674b5ec263SRafael Espindola } 3684b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 3694b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 3704b5ec263SRafael Espindola SGVar->setAlignment(Align); 3714b5ec263SRafael Espindola DGVar->setAlignment(Align); 3724b5ec263SRafael Espindola } 3734b5ec263SRafael Espindola } 3744b5ec263SRafael Espindola 375baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 376baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 377baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 378baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 3794b5ec263SRafael Espindola 380*96efdd61SPeter Collingbourne GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::getMinUnnamedAddr( 381*96efdd61SPeter Collingbourne DGV->getUnnamedAddr(), GV.getUnnamedAddr()); 382*96efdd61SPeter Collingbourne DGV->setUnnamedAddr(UnnamedAddr); 383*96efdd61SPeter Collingbourne GV.setUnnamedAddr(UnnamedAddr); 384baa3bf8fSRafael Espindola } 385baa3bf8fSRafael Espindola 3864b5ec263SRafael Espindola // Don't want to append to global_ctors list, for example, when we 3874b5ec263SRafael Espindola // are importing for ThinLTO, otherwise the global ctors and dtors 3884b5ec263SRafael Espindola // get executed multiple times for local variables (the latter causing 3894b5ec263SRafael Espindola // double frees). 3904b5ec263SRafael Espindola if (GV.hasAppendingLinkage() && isPerformingImport()) 3914b5ec263SRafael Espindola return false; 3924b5ec263SRafael Espindola 3938d05185aSMehdi Amini if (isPerformingImport()) { 3948d05185aSMehdi Amini if (!doImportAsDefinition(&GV)) 3954b5ec263SRafael Espindola return false; 3968d05185aSMehdi Amini } else if (!DGV && !shouldOverrideFromSrc() && 3974b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 3984b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 3994b5ec263SRafael Espindola return false; 4004b5ec263SRafael Espindola 401bd03c503SRafael Espindola if (GV.isDeclaration()) 402bd03c503SRafael Espindola return false; 403bd03c503SRafael Espindola 404baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 405baa3bf8fSRafael Espindola bool LinkFromSrc; 406baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 407baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 408f2e71244SRafael Espindola if (!LinkFromSrc) 409baa3bf8fSRafael Espindola return false; 410baa3bf8fSRafael Espindola } 411baa3bf8fSRafael Espindola 4124b5ec263SRafael Espindola bool LinkFromSrc = true; 4134b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 4144b5ec263SRafael Espindola return true; 4154b5ec263SRafael Espindola if (LinkFromSrc) 4164b5ec263SRafael Espindola ValuesToLink.insert(&GV); 417baa3bf8fSRafael Espindola return false; 418baa3bf8fSRafael Espindola } 419baa3bf8fSRafael Espindola 420c321e534SBenjamin Kramer void ModuleLinker::addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add) { 421bda3c97cSMehdi Amini if (!shouldLinkReferencedLinkOnce()) 422bda3c97cSMehdi Amini // For ThinLTO we don't import more than what was required. 423bda3c97cSMehdi Amini // The client has to guarantee that the linkonce will be availabe at link 424bda3c97cSMehdi Amini // time (by promoting it to weak for instance). 425bda3c97cSMehdi Amini return; 426bda3c97cSMehdi Amini 427caabe228SRafael Espindola // Add these to the internalize list 42815ca14c0SRafael Espindola if (!GV.hasLinkOnceLinkage() && !shouldLinkOnlyNeeded()) 429caabe228SRafael Espindola return; 430caabe228SRafael Espindola 431caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) 432caabe228SRafael Espindola Internalize.insert(GV.getName()); 433caabe228SRafael Espindola Add(GV); 434caabe228SRafael Espindola 435caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 436caabe228SRafael Espindola if (!SC) 437caabe228SRafael Espindola return; 4381ee9fbd8SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 439e1c42ac1SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 440e1c42ac1SRafael Espindola bool LinkFromSrc = true; 441e1c42ac1SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 442e1c42ac1SRafael Espindola return; 443e1c42ac1SRafael Espindola if (!LinkFromSrc) 444e1c42ac1SRafael Espindola continue; 4451ee9fbd8SRafael Espindola if (shouldInternalizeLinkedSymbols()) 446caabe228SRafael Espindola Internalize.insert(GV2->getName()); 447caabe228SRafael Espindola Add(*GV2); 448caabe228SRafael Espindola } 449caabe228SRafael Espindola } 450caabe228SRafael Espindola 451370d528aSRafael Espindola void ModuleLinker::dropReplacedComdat( 452370d528aSRafael Espindola GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) { 453370d528aSRafael Espindola Comdat *C = GV.getComdat(); 454370d528aSRafael Espindola if (!C) 455370d528aSRafael Espindola return; 456370d528aSRafael Espindola if (!ReplacedDstComdats.count(C)) 457370d528aSRafael Espindola return; 458370d528aSRafael Espindola if (GV.use_empty()) { 459370d528aSRafael Espindola GV.eraseFromParent(); 460370d528aSRafael Espindola return; 461370d528aSRafael Espindola } 462370d528aSRafael Espindola 463370d528aSRafael Espindola if (auto *F = dyn_cast<Function>(&GV)) { 464370d528aSRafael Espindola F->deleteBody(); 465370d528aSRafael Espindola } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) { 466370d528aSRafael Espindola Var->setInitializer(nullptr); 467370d528aSRafael Espindola } else { 468370d528aSRafael Espindola auto &Alias = cast<GlobalAlias>(GV); 469370d528aSRafael Espindola Module &M = *Alias.getParent(); 470370d528aSRafael Espindola PointerType &Ty = *cast<PointerType>(Alias.getType()); 471370d528aSRafael Espindola GlobalValue *Declaration; 472370d528aSRafael Espindola if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) { 473370d528aSRafael Espindola Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M); 474370d528aSRafael Espindola } else { 475370d528aSRafael Espindola Declaration = 476370d528aSRafael Espindola new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false, 477370d528aSRafael Espindola GlobalValue::ExternalLinkage, 478370d528aSRafael Espindola /*Initializer*/ nullptr); 479370d528aSRafael Espindola } 480370d528aSRafael Espindola Declaration->takeName(&Alias); 481370d528aSRafael Espindola Alias.replaceAllUsesWith(Declaration); 482370d528aSRafael Espindola Alias.eraseFromParent(); 483370d528aSRafael Espindola } 484370d528aSRafael Espindola } 485370d528aSRafael Espindola 486b1ed91f3SChris Lattner bool ModuleLinker::run() { 487370d528aSRafael Espindola Module &DstM = Mover.getModule(); 488370d528aSRafael Espindola DenseSet<const Comdat *> ReplacedDstComdats; 489370d528aSRafael Espindola 49040358fb8SRafael Espindola for (const auto &SMEC : SrcM->getComdatSymbolTable()) { 491dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 492dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 493dad0a645SDavid Majnemer continue; 494dad0a645SDavid Majnemer Comdat::SelectionKind SK; 495dad0a645SDavid Majnemer bool LinkFromSrc; 496dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 497dad0a645SDavid Majnemer return true; 498dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 499370d528aSRafael Espindola 500370d528aSRafael Espindola if (!LinkFromSrc) 501370d528aSRafael Espindola continue; 502370d528aSRafael Espindola 503370d528aSRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 504370d528aSRafael Espindola Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName()); 505370d528aSRafael Espindola if (DstCI == ComdatSymTab.end()) 506370d528aSRafael Espindola continue; 507370d528aSRafael Espindola 508370d528aSRafael Espindola // The source comdat is replacing the dest one. 509370d528aSRafael Espindola const Comdat *DstC = &DstCI->second; 510370d528aSRafael Espindola ReplacedDstComdats.insert(DstC); 511370d528aSRafael Espindola } 512370d528aSRafael Espindola 513370d528aSRafael Espindola // Alias have to go first, since we are not able to find their comdats 514370d528aSRafael Espindola // otherwise. 515370d528aSRafael Espindola for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) { 516370d528aSRafael Espindola GlobalAlias &GV = *I++; 517370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 518370d528aSRafael Espindola } 519370d528aSRafael Espindola 520370d528aSRafael Espindola for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) { 521370d528aSRafael Espindola GlobalVariable &GV = *I++; 522370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 523370d528aSRafael Espindola } 524370d528aSRafael Espindola 525370d528aSRafael Espindola for (auto I = DstM.begin(), E = DstM.end(); I != E;) { 526370d528aSRafael Espindola Function &GV = *I++; 527370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 528dad0a645SDavid Majnemer } 529dad0a645SDavid Majnemer 53040358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 5311ee9fbd8SRafael Espindola if (GV.hasLinkOnceLinkage()) 532baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 5331ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GV); 534baa3bf8fSRafael Espindola 53540358fb8SRafael Espindola for (Function &SF : *SrcM) 5361ee9fbd8SRafael Espindola if (SF.hasLinkOnceLinkage()) 537baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 5381ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&SF); 539baa3bf8fSRafael Espindola 54040358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 5411ee9fbd8SRafael Espindola if (GA.hasLinkOnceLinkage()) 542baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 5431ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GA); 544baa3bf8fSRafael Espindola 545b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 546b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 54740358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 548baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 549b1ed91f3SChris Lattner return true; 550b1ed91f3SChris Lattner 55140358fb8SRafael Espindola for (Function &SF : *SrcM) 552baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 553b1ed91f3SChris Lattner return true; 554b1ed91f3SChris Lattner 55540358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 556baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 557b1ed91f3SChris Lattner return true; 558b1ed91f3SChris Lattner 559caabe228SRafael Espindola for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 560caabe228SRafael Espindola GlobalValue *GV = ValuesToLink[I]; 561caabe228SRafael Espindola const Comdat *SC = GV->getComdat(); 562caabe228SRafael Espindola if (!SC) 563caabe228SRafael Espindola continue; 56442e03237SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 56542e03237SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 56642e03237SRafael Espindola bool LinkFromSrc = true; 56742e03237SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 56842e03237SRafael Espindola return true; 56942e03237SRafael Espindola if (LinkFromSrc) 570caabe228SRafael Espindola ValuesToLink.insert(GV2); 571caabe228SRafael Espindola } 57242e03237SRafael Espindola } 573caabe228SRafael Espindola 574caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) { 575caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 576caabe228SRafael Espindola Internalize.insert(GV->getName()); 577caabe228SRafael Espindola } 578caabe228SRafael Espindola 5791eaa97f4SPeter Collingbourne // FIXME: Propagate Errors through to the caller instead of emitting 5801eaa97f4SPeter Collingbourne // diagnostics. 5811eaa97f4SPeter Collingbourne bool HasErrors = false; 5821eaa97f4SPeter Collingbourne if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(), 583caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 584caabe228SRafael Espindola addLazyFor(GV, Add); 5851eaa97f4SPeter Collingbourne })) { 5861eaa97f4SPeter Collingbourne handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { 5871eaa97f4SPeter Collingbourne DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message())); 5881eaa97f4SPeter Collingbourne HasErrors = true; 5891eaa97f4SPeter Collingbourne }); 5901eaa97f4SPeter Collingbourne } 5911eaa97f4SPeter Collingbourne if (HasErrors) 5924b5ec263SRafael Espindola return true; 5931eaa97f4SPeter Collingbourne 594caabe228SRafael Espindola for (auto &P : Internalize) { 595caabe228SRafael Espindola GlobalValue *GV = DstM.getNamedValue(P.first()); 596caabe228SRafael Espindola GV->setLinkage(GlobalValue::InternalLinkage); 597beadd56aSRafael Espindola } 598beadd56aSRafael Espindola 5992609888fSAnton Korobeynikov return false; 6002609888fSAnton Korobeynikov } 601361e513dSReid Spencer 6029d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {} 6033df61b7bSRafael Espindola 604434e9561SRafael Espindola bool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags, 605b703c77bSTeresa Johnson DenseSet<const GlobalValue *> *GlobalsToImport) { 606b703c77bSTeresa Johnson ModuleLinker ModLinker(Mover, std::move(Src), Flags, GlobalsToImport); 607bef54363STeresa Johnson return ModLinker.run(); 608434e9561SRafael Espindola } 609434e9561SRafael Espindola 610b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 611b1ed91f3SChris Lattner // LinkModules entrypoint. 612b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 613b1ed91f3SChris Lattner 61418c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 61518c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 61618c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 61718c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 61818c89411SRafael Espindola /// relied on to be consistent. 619434e9561SRafael Espindola bool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src, 620434e9561SRafael Espindola unsigned Flags) { 6219d2bfc48SRafael Espindola Linker L(Dest); 622434e9561SRafael Espindola return L.linkInModule(std::move(Src), Flags); 6234160f5d3SRafael Espindola } 6244160f5d3SRafael Espindola 625a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 626a3aeb980SBill Wendling // C API. 627a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 628a3aeb980SBill Wendling 629434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 630434e9561SRafael Espindola Module *D = unwrap(Dest); 631434e9561SRafael Espindola std::unique_ptr<Module> M(unwrap(Src)); 632434e9561SRafael Espindola return Linker::linkModules(*D, std::move(M)); 633434e9561SRafael Espindola } 634