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" 18*7c702116SPeter Collingbourne #include "llvm/IR/Comdat.h" 19d12b4a33SRafael Espindola #include "llvm/IR/DiagnosticPrinter.h" 20*7c702116SPeter Collingbourne #include "llvm/IR/GlobalValue.h" 219d2bfc48SRafael Espindola #include "llvm/IR/LLVMContext.h" 22*7c702116SPeter Collingbourne #include "llvm/IR/Module.h" 23488a800aSTeresa Johnson #include "llvm/Linker/Linker.h" 241eaa97f4SPeter Collingbourne #include "llvm/Support/Error.h" 25361e513dSReid Spencer using namespace llvm; 26361e513dSReid Spencer 27b1ed91f3SChris Lattner namespace { 28d12b4a33SRafael Espindola 2918c89411SRafael Espindola /// This is an implementation class for the LinkModules function, which is the 3018c89411SRafael Espindola /// entrypoint for this file. 31b1ed91f3SChris Lattner class ModuleLinker { 32caabe228SRafael Espindola IRMover &Mover; 3340358fb8SRafael Espindola std::unique_ptr<Module> SrcM; 34b1ed91f3SChris Lattner 354b5ec263SRafael Espindola SetVector<GlobalValue *> ValuesToLink; 36caabe228SRafael Espindola StringSet<> Internalize; 374160f5d3SRafael Espindola 38e868123dSDuncan P. N. Exon Smith /// For symbol clashes, prefer those from Src. 39020d4fb1SArtem Belevich unsigned Flags; 40e868123dSDuncan P. N. Exon Smith 41caabe228SRafael Espindola /// Used as the callback for lazy linking. 42caabe228SRafael Espindola /// The mover has just hit GV and we have to decide if it, and other members 43caabe228SRafael Espindola /// of the same comdat, should be linked. Every member to be linked is passed 44caabe228SRafael Espindola /// to Add. 45c321e534SBenjamin Kramer void addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add); 46baa3bf8fSRafael Espindola 47020d4fb1SArtem Belevich bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 48020d4fb1SArtem Belevich bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 49020d4fb1SArtem Belevich bool shouldInternalizeLinkedSymbols() { 50020d4fb1SArtem Belevich return Flags & Linker::InternalizeLinkedSymbols; 51020d4fb1SArtem Belevich } 52020d4fb1SArtem Belevich 53d12b4a33SRafael Espindola bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 54d12b4a33SRafael Espindola const GlobalValue &Src); 55dbb0bd1aSRafael Espindola 56caabe228SRafael Espindola /// Should we have mover and linker error diag info? 57b1ed91f3SChris Lattner bool emitError(const Twine &Message) { 5840358fb8SRafael Espindola SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 59b1ed91f3SChris Lattner return true; 60b1ed91f3SChris Lattner } 61b1ed91f3SChris Lattner 620e309fe8SRafael Espindola bool getComdatLeader(Module &M, StringRef ComdatName, 63dad0a645SDavid Majnemer const GlobalVariable *&GVar); 64dad0a645SDavid Majnemer bool computeResultingSelectionKind(StringRef ComdatName, 65dad0a645SDavid Majnemer Comdat::SelectionKind Src, 66dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 67dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 68dad0a645SDavid Majnemer bool &LinkFromSrc); 69dad0a645SDavid Majnemer std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 70dad0a645SDavid Majnemer ComdatsChosen; 71dad0a645SDavid Majnemer bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 72dad0a645SDavid Majnemer bool &LinkFromSrc); 731ee9fbd8SRafael Espindola // Keep track of the lazy linked global members of each comdat in source. 741ee9fbd8SRafael Espindola DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers; 75dad0a645SDavid Majnemer 7618c89411SRafael Espindola /// Given a global in the source module, return the global in the 7718c89411SRafael Espindola /// destination module that is being linked to, if any. 783e8bc6a8SRafael Espindola GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 79caabe228SRafael Espindola Module &DstM = Mover.getModule(); 80b1ed91f3SChris Lattner // If the source has no name it can't link. If it has local linkage, 81b1ed91f3SChris Lattner // there is no name match-up going on. 824504c1bcSTeresa Johnson if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage())) 832617dcceSCraig Topper return nullptr; 84b1ed91f3SChris Lattner 85b1ed91f3SChris Lattner // Otherwise see if we have a match in the destination module's symtab. 864504c1bcSTeresa Johnson GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 87c84f608bSRafael Espindola if (!DGV) 88c84f608bSRafael Espindola return nullptr; 89b1ed91f3SChris Lattner 90b1ed91f3SChris Lattner // If we found a global with the same name in the dest module, but it has 91b1ed91f3SChris Lattner // internal linkage, we are really not doing any linkage here. 92b1ed91f3SChris Lattner if (DGV->hasLocalLinkage()) 932617dcceSCraig Topper return nullptr; 94b1ed91f3SChris Lattner 95b1ed91f3SChris Lattner // Otherwise, we do in fact link to the destination global. 96b1ed91f3SChris Lattner return DGV; 97b1ed91f3SChris Lattner } 98b1ed91f3SChris Lattner 99370d528aSRafael Espindola /// Drop GV if it is a member of a comdat that we are dropping. 100370d528aSRafael Espindola /// This can happen with COFF's largest selection kind. 101370d528aSRafael Espindola void dropReplacedComdat(GlobalValue &GV, 102370d528aSRafael Espindola const DenseSet<const Comdat *> &ReplacedDstComdats); 103370d528aSRafael Espindola 104baa3bf8fSRafael Espindola bool linkIfNeeded(GlobalValue &GV); 105c7ed52f2STeresa Johnson 1064504c1bcSTeresa Johnson public: 107*7c702116SPeter Collingbourne ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags) 108*7c702116SPeter Collingbourne : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags) {} 1094504c1bcSTeresa Johnson 1104504c1bcSTeresa Johnson bool run(); 1114504c1bcSTeresa Johnson }; 1124504c1bcSTeresa Johnson } 1134504c1bcSTeresa Johnson 114eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes 115eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A, 116eb5e0a77SRafael Espindola GlobalValue::VisibilityTypes B) { 117eb5e0a77SRafael Espindola if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 118eb5e0a77SRafael Espindola return GlobalValue::HiddenVisibility; 119eb5e0a77SRafael Espindola if (A == GlobalValue::ProtectedVisibility || 120eb5e0a77SRafael Espindola B == GlobalValue::ProtectedVisibility) 121eb5e0a77SRafael Espindola return GlobalValue::ProtectedVisibility; 122eb5e0a77SRafael Espindola return GlobalValue::DefaultVisibility; 123eb5e0a77SRafael Espindola } 124eb5e0a77SRafael Espindola 1250e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 126dad0a645SDavid Majnemer const GlobalVariable *&GVar) { 1270e309fe8SRafael Espindola const GlobalValue *GVal = M.getNamedValue(ComdatName); 128dad0a645SDavid Majnemer if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 129dad0a645SDavid Majnemer GVal = GA->getBaseObject(); 130dad0a645SDavid Majnemer if (!GVal) 131dad0a645SDavid Majnemer // We cannot resolve the size of the aliasee yet. 132dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 133dad0a645SDavid Majnemer "': COMDAT key involves incomputable alias size."); 134dad0a645SDavid Majnemer } 135dad0a645SDavid Majnemer 136dad0a645SDavid Majnemer GVar = dyn_cast_or_null<GlobalVariable>(GVal); 137dad0a645SDavid Majnemer if (!GVar) 138dad0a645SDavid Majnemer return emitError( 139dad0a645SDavid Majnemer "Linking COMDATs named '" + ComdatName + 140dad0a645SDavid Majnemer "': GlobalVariable required for data dependent selection!"); 141dad0a645SDavid Majnemer 142dad0a645SDavid Majnemer return false; 143dad0a645SDavid Majnemer } 144dad0a645SDavid Majnemer 145dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 146dad0a645SDavid Majnemer Comdat::SelectionKind Src, 147dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 148dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 149dad0a645SDavid Majnemer bool &LinkFromSrc) { 150caabe228SRafael Espindola Module &DstM = Mover.getModule(); 151dad0a645SDavid Majnemer // The ability to mix Comdat::SelectionKind::Any with 152dad0a645SDavid Majnemer // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 153dad0a645SDavid Majnemer bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 154dad0a645SDavid Majnemer Dst == Comdat::SelectionKind::Largest; 155dad0a645SDavid Majnemer bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 156dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest; 157dad0a645SDavid Majnemer if (DstAnyOrLargest && SrcAnyOrLargest) { 158dad0a645SDavid Majnemer if (Dst == Comdat::SelectionKind::Largest || 159dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest) 160dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Largest; 161dad0a645SDavid Majnemer else 162dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Any; 163dad0a645SDavid Majnemer } else if (Src == Dst) { 164dad0a645SDavid Majnemer Result = Dst; 165dad0a645SDavid Majnemer } else { 166dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 167dad0a645SDavid Majnemer "': invalid selection kinds!"); 168dad0a645SDavid Majnemer } 169dad0a645SDavid Majnemer 170dad0a645SDavid Majnemer switch (Result) { 171dad0a645SDavid Majnemer case Comdat::SelectionKind::Any: 172dad0a645SDavid Majnemer // Go with Dst. 173dad0a645SDavid Majnemer LinkFromSrc = false; 174dad0a645SDavid Majnemer break; 175dad0a645SDavid Majnemer case Comdat::SelectionKind::NoDuplicates: 176dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 177dad0a645SDavid Majnemer "': noduplicates has been violated!"); 178dad0a645SDavid Majnemer case Comdat::SelectionKind::ExactMatch: 179dad0a645SDavid Majnemer case Comdat::SelectionKind::Largest: 180dad0a645SDavid Majnemer case Comdat::SelectionKind::SameSize: { 181dad0a645SDavid Majnemer const GlobalVariable *DstGV; 182dad0a645SDavid Majnemer const GlobalVariable *SrcGV; 183dad0a645SDavid Majnemer if (getComdatLeader(DstM, ComdatName, DstGV) || 18440358fb8SRafael Espindola getComdatLeader(*SrcM, ComdatName, SrcGV)) 185dad0a645SDavid Majnemer return true; 186dad0a645SDavid Majnemer 1870e309fe8SRafael Espindola const DataLayout &DstDL = DstM.getDataLayout(); 18840358fb8SRafael Espindola const DataLayout &SrcDL = SrcM->getDataLayout(); 1895f6eaac6SManuel Jacob uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType()); 1905f6eaac6SManuel Jacob uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType()); 191dad0a645SDavid Majnemer if (Result == Comdat::SelectionKind::ExactMatch) { 192dad0a645SDavid Majnemer if (SrcGV->getInitializer() != DstGV->getInitializer()) 193dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 194dad0a645SDavid Majnemer "': ExactMatch violated!"); 195dad0a645SDavid Majnemer LinkFromSrc = false; 196dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::Largest) { 197dad0a645SDavid Majnemer LinkFromSrc = SrcSize > DstSize; 198dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::SameSize) { 199dad0a645SDavid Majnemer if (SrcSize != DstSize) 200dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 201dad0a645SDavid Majnemer "': SameSize violated!"); 202dad0a645SDavid Majnemer LinkFromSrc = false; 203dad0a645SDavid Majnemer } else { 204dad0a645SDavid Majnemer llvm_unreachable("unknown selection kind"); 205dad0a645SDavid Majnemer } 206dad0a645SDavid Majnemer break; 207dad0a645SDavid Majnemer } 208dad0a645SDavid Majnemer } 209dad0a645SDavid Majnemer 210dad0a645SDavid Majnemer return false; 211dad0a645SDavid Majnemer } 212dad0a645SDavid Majnemer 213dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC, 214dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 215dad0a645SDavid Majnemer bool &LinkFromSrc) { 216caabe228SRafael Espindola Module &DstM = Mover.getModule(); 217b16196a3SRafael Espindola Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 218dad0a645SDavid Majnemer StringRef ComdatName = SrcC->getName(); 2190e309fe8SRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 220dad0a645SDavid Majnemer Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 2212ef3f299SRafael Espindola 222b16196a3SRafael Espindola if (DstCI == ComdatSymTab.end()) { 223b16196a3SRafael Espindola // Use the comdat if it is only available in one of the modules. 224b16196a3SRafael Espindola LinkFromSrc = true; 225b16196a3SRafael Espindola Result = SSK; 2262ef3f299SRafael Espindola return false; 227b16196a3SRafael Espindola } 2282ef3f299SRafael Espindola 229dad0a645SDavid Majnemer const Comdat *DstC = &DstCI->second; 230dad0a645SDavid Majnemer Comdat::SelectionKind DSK = DstC->getSelectionKind(); 2312ef3f299SRafael Espindola return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 2322ef3f299SRafael Espindola LinkFromSrc); 233dad0a645SDavid Majnemer } 234f6f121e2SJames Molloy 235d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 236d12b4a33SRafael Espindola const GlobalValue &Dest, 237dbb0bd1aSRafael Espindola const GlobalValue &Src) { 238e5a61917STeresa Johnson 239e868123dSDuncan P. N. Exon Smith // Should we unconditionally use the Src? 240020d4fb1SArtem Belevich if (shouldOverrideFromSrc()) { 241e868123dSDuncan P. N. Exon Smith LinkFromSrc = true; 242e868123dSDuncan P. N. Exon Smith return false; 243e868123dSDuncan P. N. Exon Smith } 244e868123dSDuncan P. N. Exon Smith 245778fcc77SRafael Espindola // We always have to add Src if it has appending linkage. 246778fcc77SRafael Espindola if (Src.hasAppendingLinkage()) { 247778fcc77SRafael Espindola LinkFromSrc = true; 248778fcc77SRafael Espindola return false; 249778fcc77SRafael Espindola } 250778fcc77SRafael Espindola 251d826bbbbSMehdi Amini bool SrcIsDeclaration = Src.isDeclarationForLinker(); 252d826bbbbSMehdi Amini bool DestIsDeclaration = Dest.isDeclarationForLinker(); 253c7ed52f2STeresa Johnson 254dbb0bd1aSRafael Espindola if (SrcIsDeclaration) { 255dbb0bd1aSRafael Espindola // If Src is external or if both Src & Dest are external.. Just link the 256dbb0bd1aSRafael Espindola // external globals, we aren't adding anything. 257d12b4a33SRafael Espindola if (Src.hasDLLImportStorageClass()) { 258dbb0bd1aSRafael Espindola // If one of GVs is marked as DLLImport, result should be dllimport'ed. 259d12b4a33SRafael Espindola LinkFromSrc = DestIsDeclaration; 260d12b4a33SRafael Espindola return false; 261d12b4a33SRafael Espindola } 262dbb0bd1aSRafael Espindola // If the Dest is weak, use the source linkage. 263ed11bd28SRafael Espindola if (Dest.hasExternalWeakLinkage()) { 264ed11bd28SRafael Espindola LinkFromSrc = true; 265ed11bd28SRafael Espindola return false; 266ed11bd28SRafael Espindola } 267ed11bd28SRafael Espindola // Link an available_externally over a declaration. 268ed11bd28SRafael Espindola LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 269d12b4a33SRafael Espindola return false; 270dbb0bd1aSRafael Espindola } 271dbb0bd1aSRafael Espindola 272d12b4a33SRafael Espindola if (DestIsDeclaration) { 273dbb0bd1aSRafael Espindola // If Dest is external but Src is not: 274d12b4a33SRafael Espindola LinkFromSrc = true; 275d12b4a33SRafael Espindola return false; 276d12b4a33SRafael Espindola } 277dbb0bd1aSRafael Espindola 2780910605aSRafael Espindola if (Src.hasCommonLinkage()) { 279d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 280d12b4a33SRafael Espindola LinkFromSrc = true; 2810910605aSRafael Espindola return false; 282d12b4a33SRafael Espindola } 283d12b4a33SRafael Espindola 284d12b4a33SRafael Espindola if (!Dest.hasCommonLinkage()) { 285d12b4a33SRafael Espindola LinkFromSrc = false; 286d12b4a33SRafael Espindola return false; 287d12b4a33SRafael Espindola } 2880910605aSRafael Espindola 289a28d91d8SMehdi Amini const DataLayout &DL = Dest.getParent()->getDataLayout(); 2905f6eaac6SManuel Jacob uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType()); 2915f6eaac6SManuel Jacob uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType()); 292d12b4a33SRafael Espindola LinkFromSrc = SrcSize > DestSize; 293d12b4a33SRafael Espindola return false; 2940910605aSRafael Espindola } 2950910605aSRafael Espindola 296dbb0bd1aSRafael Espindola if (Src.isWeakForLinker()) { 297dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 298dbb0bd1aSRafael Espindola assert(!Dest.hasAvailableExternallyLinkage()); 2990910605aSRafael Espindola 300d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 301d12b4a33SRafael Espindola LinkFromSrc = true; 302d12b4a33SRafael Espindola return false; 303d12b4a33SRafael Espindola } 304dbb0bd1aSRafael Espindola 305d12b4a33SRafael Espindola LinkFromSrc = false; 3060910605aSRafael Espindola return false; 307dbb0bd1aSRafael Espindola } 308dbb0bd1aSRafael Espindola 309dbb0bd1aSRafael Espindola if (Dest.isWeakForLinker()) { 310dbb0bd1aSRafael Espindola assert(Src.hasExternalLinkage()); 311d12b4a33SRafael Espindola LinkFromSrc = true; 312d12b4a33SRafael Espindola return false; 313dbb0bd1aSRafael Espindola } 314dbb0bd1aSRafael Espindola 315dbb0bd1aSRafael Espindola assert(!Src.hasExternalWeakLinkage()); 316dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 317dbb0bd1aSRafael Espindola assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 318dbb0bd1aSRafael Espindola "Unexpected linkage type!"); 319dbb0bd1aSRafael Espindola return emitError("Linking globals named '" + Src.getName() + 320dbb0bd1aSRafael Espindola "': symbol multiply defined!"); 321dbb0bd1aSRafael Espindola } 322dbb0bd1aSRafael Espindola 323baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 324baa3bf8fSRafael Espindola GlobalValue *DGV = getLinkedToGlobal(&GV); 325baa3bf8fSRafael Espindola 326baa3bf8fSRafael Espindola if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 327baa3bf8fSRafael Espindola return false; 328baa3bf8fSRafael Espindola 3294b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 3304b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 3314b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 3324b5ec263SRafael Espindola if (DGVar && SGVar) { 3334b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 3344b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 3354b5ec263SRafael Espindola DGVar->setConstant(false); 3364b5ec263SRafael Espindola SGVar->setConstant(false); 3374b5ec263SRafael Espindola } 3384b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 3394b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 3404b5ec263SRafael Espindola SGVar->setAlignment(Align); 3414b5ec263SRafael Espindola DGVar->setAlignment(Align); 3424b5ec263SRafael Espindola } 3434b5ec263SRafael Espindola } 3444b5ec263SRafael Espindola 345baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 346baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 347baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 348baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 3494b5ec263SRafael Espindola 35096efdd61SPeter Collingbourne GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::getMinUnnamedAddr( 35196efdd61SPeter Collingbourne DGV->getUnnamedAddr(), GV.getUnnamedAddr()); 35296efdd61SPeter Collingbourne DGV->setUnnamedAddr(UnnamedAddr); 35396efdd61SPeter Collingbourne GV.setUnnamedAddr(UnnamedAddr); 354baa3bf8fSRafael Espindola } 355baa3bf8fSRafael Espindola 356*7c702116SPeter Collingbourne if (!DGV && !shouldOverrideFromSrc() && 3574b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 3584b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 3594b5ec263SRafael Espindola return false; 3604b5ec263SRafael Espindola 361bd03c503SRafael Espindola if (GV.isDeclaration()) 362bd03c503SRafael Espindola return false; 363bd03c503SRafael Espindola 364baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 365baa3bf8fSRafael Espindola bool LinkFromSrc; 366baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 367baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 368f2e71244SRafael Espindola if (!LinkFromSrc) 369baa3bf8fSRafael Espindola return false; 370baa3bf8fSRafael Espindola } 371baa3bf8fSRafael Espindola 3724b5ec263SRafael Espindola bool LinkFromSrc = true; 3734b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 3744b5ec263SRafael Espindola return true; 3754b5ec263SRafael Espindola if (LinkFromSrc) 3764b5ec263SRafael Espindola ValuesToLink.insert(&GV); 377baa3bf8fSRafael Espindola return false; 378baa3bf8fSRafael Espindola } 379baa3bf8fSRafael Espindola 380c321e534SBenjamin Kramer void ModuleLinker::addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add) { 381caabe228SRafael Espindola // Add these to the internalize list 382c387e70cSPeter Collingbourne if (!GV.hasLinkOnceLinkage() && !GV.hasAvailableExternallyLinkage() && 383c387e70cSPeter Collingbourne !shouldLinkOnlyNeeded()) 384caabe228SRafael Espindola return; 385caabe228SRafael Espindola 386caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) 387caabe228SRafael Espindola Internalize.insert(GV.getName()); 388caabe228SRafael Espindola Add(GV); 389caabe228SRafael Espindola 390caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 391caabe228SRafael Espindola if (!SC) 392caabe228SRafael Espindola return; 3931ee9fbd8SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 394e1c42ac1SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 395e1c42ac1SRafael Espindola bool LinkFromSrc = true; 396e1c42ac1SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 397e1c42ac1SRafael Espindola return; 398e1c42ac1SRafael Espindola if (!LinkFromSrc) 399e1c42ac1SRafael Espindola continue; 4001ee9fbd8SRafael Espindola if (shouldInternalizeLinkedSymbols()) 401caabe228SRafael Espindola Internalize.insert(GV2->getName()); 402caabe228SRafael Espindola Add(*GV2); 403caabe228SRafael Espindola } 404caabe228SRafael Espindola } 405caabe228SRafael Espindola 406370d528aSRafael Espindola void ModuleLinker::dropReplacedComdat( 407370d528aSRafael Espindola GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) { 408370d528aSRafael Espindola Comdat *C = GV.getComdat(); 409370d528aSRafael Espindola if (!C) 410370d528aSRafael Espindola return; 411370d528aSRafael Espindola if (!ReplacedDstComdats.count(C)) 412370d528aSRafael Espindola return; 413370d528aSRafael Espindola if (GV.use_empty()) { 414370d528aSRafael Espindola GV.eraseFromParent(); 415370d528aSRafael Espindola return; 416370d528aSRafael Espindola } 417370d528aSRafael Espindola 418370d528aSRafael Espindola if (auto *F = dyn_cast<Function>(&GV)) { 419370d528aSRafael Espindola F->deleteBody(); 420370d528aSRafael Espindola } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) { 421370d528aSRafael Espindola Var->setInitializer(nullptr); 422370d528aSRafael Espindola } else { 423370d528aSRafael Espindola auto &Alias = cast<GlobalAlias>(GV); 424370d528aSRafael Espindola Module &M = *Alias.getParent(); 425370d528aSRafael Espindola PointerType &Ty = *cast<PointerType>(Alias.getType()); 426370d528aSRafael Espindola GlobalValue *Declaration; 427370d528aSRafael Espindola if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) { 428370d528aSRafael Espindola Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M); 429370d528aSRafael Espindola } else { 430370d528aSRafael Espindola Declaration = 431370d528aSRafael Espindola new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false, 432370d528aSRafael Espindola GlobalValue::ExternalLinkage, 433370d528aSRafael Espindola /*Initializer*/ nullptr); 434370d528aSRafael Espindola } 435370d528aSRafael Espindola Declaration->takeName(&Alias); 436370d528aSRafael Espindola Alias.replaceAllUsesWith(Declaration); 437370d528aSRafael Espindola Alias.eraseFromParent(); 438370d528aSRafael Espindola } 439370d528aSRafael Espindola } 440370d528aSRafael Espindola 441b1ed91f3SChris Lattner bool ModuleLinker::run() { 442370d528aSRafael Espindola Module &DstM = Mover.getModule(); 443370d528aSRafael Espindola DenseSet<const Comdat *> ReplacedDstComdats; 444370d528aSRafael Espindola 44540358fb8SRafael Espindola for (const auto &SMEC : SrcM->getComdatSymbolTable()) { 446dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 447dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 448dad0a645SDavid Majnemer continue; 449dad0a645SDavid Majnemer Comdat::SelectionKind SK; 450dad0a645SDavid Majnemer bool LinkFromSrc; 451dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 452dad0a645SDavid Majnemer return true; 453dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 454370d528aSRafael Espindola 455370d528aSRafael Espindola if (!LinkFromSrc) 456370d528aSRafael Espindola continue; 457370d528aSRafael Espindola 458370d528aSRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 459370d528aSRafael Espindola Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName()); 460370d528aSRafael Espindola if (DstCI == ComdatSymTab.end()) 461370d528aSRafael Espindola continue; 462370d528aSRafael Espindola 463370d528aSRafael Espindola // The source comdat is replacing the dest one. 464370d528aSRafael Espindola const Comdat *DstC = &DstCI->second; 465370d528aSRafael Espindola ReplacedDstComdats.insert(DstC); 466370d528aSRafael Espindola } 467370d528aSRafael Espindola 468370d528aSRafael Espindola // Alias have to go first, since we are not able to find their comdats 469370d528aSRafael Espindola // otherwise. 470370d528aSRafael Espindola for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) { 471370d528aSRafael Espindola GlobalAlias &GV = *I++; 472370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 473370d528aSRafael Espindola } 474370d528aSRafael Espindola 475370d528aSRafael Espindola for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) { 476370d528aSRafael Espindola GlobalVariable &GV = *I++; 477370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 478370d528aSRafael Espindola } 479370d528aSRafael Espindola 480370d528aSRafael Espindola for (auto I = DstM.begin(), E = DstM.end(); I != E;) { 481370d528aSRafael Espindola Function &GV = *I++; 482370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 483dad0a645SDavid Majnemer } 484dad0a645SDavid Majnemer 48540358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 4861ee9fbd8SRafael Espindola if (GV.hasLinkOnceLinkage()) 487baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 4881ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GV); 489baa3bf8fSRafael Espindola 49040358fb8SRafael Espindola for (Function &SF : *SrcM) 4911ee9fbd8SRafael Espindola if (SF.hasLinkOnceLinkage()) 492baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 4931ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&SF); 494baa3bf8fSRafael Espindola 49540358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 4961ee9fbd8SRafael Espindola if (GA.hasLinkOnceLinkage()) 497baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 4981ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GA); 499baa3bf8fSRafael Espindola 500b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 501b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 50240358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 503baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 504b1ed91f3SChris Lattner return true; 505b1ed91f3SChris Lattner 50640358fb8SRafael Espindola for (Function &SF : *SrcM) 507baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 508b1ed91f3SChris Lattner return true; 509b1ed91f3SChris Lattner 51040358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 511baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 512b1ed91f3SChris Lattner return true; 513b1ed91f3SChris Lattner 514caabe228SRafael Espindola for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 515caabe228SRafael Espindola GlobalValue *GV = ValuesToLink[I]; 516caabe228SRafael Espindola const Comdat *SC = GV->getComdat(); 517caabe228SRafael Espindola if (!SC) 518caabe228SRafael Espindola continue; 51942e03237SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 52042e03237SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 52142e03237SRafael Espindola bool LinkFromSrc = true; 52242e03237SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 52342e03237SRafael Espindola return true; 52442e03237SRafael Espindola if (LinkFromSrc) 525caabe228SRafael Espindola ValuesToLink.insert(GV2); 526caabe228SRafael Espindola } 52742e03237SRafael Espindola } 528caabe228SRafael Espindola 529caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) { 530caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 531caabe228SRafael Espindola Internalize.insert(GV->getName()); 532caabe228SRafael Espindola } 533caabe228SRafael Espindola 5341eaa97f4SPeter Collingbourne // FIXME: Propagate Errors through to the caller instead of emitting 5351eaa97f4SPeter Collingbourne // diagnostics. 5361eaa97f4SPeter Collingbourne bool HasErrors = false; 5371eaa97f4SPeter Collingbourne if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(), 538caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 539caabe228SRafael Espindola addLazyFor(GV, Add); 5404b9b3791STeresa Johnson }, 541*7c702116SPeter Collingbourne /* LinkModuleInlineAsm */ true, 542*7c702116SPeter Collingbourne /* IsPerformingImport */ false)) { 5431eaa97f4SPeter Collingbourne handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { 5441eaa97f4SPeter Collingbourne DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message())); 5451eaa97f4SPeter Collingbourne HasErrors = true; 5461eaa97f4SPeter Collingbourne }); 5471eaa97f4SPeter Collingbourne } 5481eaa97f4SPeter Collingbourne if (HasErrors) 5494b5ec263SRafael Espindola return true; 5501eaa97f4SPeter Collingbourne 551caabe228SRafael Espindola for (auto &P : Internalize) { 552caabe228SRafael Espindola GlobalValue *GV = DstM.getNamedValue(P.first()); 553caabe228SRafael Espindola GV->setLinkage(GlobalValue::InternalLinkage); 554beadd56aSRafael Espindola } 555beadd56aSRafael Espindola 5562609888fSAnton Korobeynikov return false; 5572609888fSAnton Korobeynikov } 558361e513dSReid Spencer 5599d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {} 5603df61b7bSRafael Espindola 561*7c702116SPeter Collingbourne bool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags) { 562*7c702116SPeter Collingbourne ModuleLinker ModLinker(Mover, std::move(Src), Flags); 563bef54363STeresa Johnson return ModLinker.run(); 564434e9561SRafael Espindola } 565434e9561SRafael Espindola 566b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 567b1ed91f3SChris Lattner // LinkModules entrypoint. 568b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 569b1ed91f3SChris Lattner 57018c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 57118c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 57218c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 57318c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 57418c89411SRafael Espindola /// relied on to be consistent. 575434e9561SRafael Espindola bool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src, 576434e9561SRafael Espindola unsigned Flags) { 5779d2bfc48SRafael Espindola Linker L(Dest); 578434e9561SRafael Espindola return L.linkInModule(std::move(Src), Flags); 5794160f5d3SRafael Espindola } 5804160f5d3SRafael Espindola 581a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 582a3aeb980SBill Wendling // C API. 583a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 584a3aeb980SBill Wendling 585434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 586434e9561SRafael Espindola Module *D = unwrap(Dest); 587434e9561SRafael Espindola std::unique_ptr<Module> M(unwrap(Src)); 588434e9561SRafael Espindola return Linker::linkModules(*D, std::move(M)); 589434e9561SRafael Espindola } 590