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" 177c702116SPeter Collingbourne #include "llvm/IR/Comdat.h" 18d12b4a33SRafael Espindola #include "llvm/IR/DiagnosticPrinter.h" 197c702116SPeter Collingbourne #include "llvm/IR/GlobalValue.h" 209d2bfc48SRafael Espindola #include "llvm/IR/LLVMContext.h" 217c702116SPeter Collingbourne #include "llvm/IR/Module.h" 22488a800aSTeresa Johnson #include "llvm/Linker/Linker.h" 231eaa97f4SPeter Collingbourne #include "llvm/Support/Error.h" 24361e513dSReid Spencer using namespace llvm; 25361e513dSReid Spencer 26b1ed91f3SChris Lattner namespace { 27d12b4a33SRafael Espindola 2818c89411SRafael Espindola /// This is an implementation class for the LinkModules function, which is the 2918c89411SRafael Espindola /// entrypoint for this file. 30b1ed91f3SChris Lattner class ModuleLinker { 31caabe228SRafael Espindola IRMover &Mover; 3240358fb8SRafael Espindola std::unique_ptr<Module> SrcM; 33b1ed91f3SChris Lattner 344b5ec263SRafael Espindola SetVector<GlobalValue *> ValuesToLink; 354160f5d3SRafael Espindola 36e868123dSDuncan P. N. Exon Smith /// For symbol clashes, prefer those from Src. 37020d4fb1SArtem Belevich unsigned Flags; 38e868123dSDuncan P. N. Exon Smith 39*5eb9c81dSJonas Devlieghere /// List of global value names that should be internalized. 40*5eb9c81dSJonas Devlieghere StringSet<> Internalize; 41*5eb9c81dSJonas Devlieghere 42*5eb9c81dSJonas Devlieghere /// Function that will perform the actual internalization. The reason for a 43*5eb9c81dSJonas Devlieghere /// callback is that the linker cannot call internalizeModule without 44*5eb9c81dSJonas Devlieghere /// creating a circular dependency between IPO and the linker. 45*5eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> InternalizeCallback; 46*5eb9c81dSJonas Devlieghere 47caabe228SRafael Espindola /// Used as the callback for lazy linking. 48caabe228SRafael Espindola /// The mover has just hit GV and we have to decide if it, and other members 49caabe228SRafael Espindola /// of the same comdat, should be linked. Every member to be linked is passed 50caabe228SRafael Espindola /// to Add. 51c321e534SBenjamin Kramer void addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add); 52baa3bf8fSRafael Espindola 53020d4fb1SArtem Belevich bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 54020d4fb1SArtem Belevich bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 55020d4fb1SArtem Belevich 56d12b4a33SRafael Espindola bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 57d12b4a33SRafael Espindola const GlobalValue &Src); 58dbb0bd1aSRafael Espindola 59caabe228SRafael Espindola /// Should we have mover and linker error diag info? 60b1ed91f3SChris Lattner bool emitError(const Twine &Message) { 6140358fb8SRafael Espindola SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 62b1ed91f3SChris Lattner return true; 63b1ed91f3SChris Lattner } 64b1ed91f3SChris Lattner 650e309fe8SRafael Espindola bool getComdatLeader(Module &M, StringRef ComdatName, 66dad0a645SDavid Majnemer const GlobalVariable *&GVar); 67dad0a645SDavid Majnemer bool computeResultingSelectionKind(StringRef ComdatName, 68dad0a645SDavid Majnemer Comdat::SelectionKind Src, 69dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 70dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 71dad0a645SDavid Majnemer bool &LinkFromSrc); 72dad0a645SDavid Majnemer std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 73dad0a645SDavid Majnemer ComdatsChosen; 74dad0a645SDavid Majnemer bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 75dad0a645SDavid Majnemer bool &LinkFromSrc); 761ee9fbd8SRafael Espindola // Keep track of the lazy linked global members of each comdat in source. 771ee9fbd8SRafael Espindola DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers; 78dad0a645SDavid Majnemer 7918c89411SRafael Espindola /// Given a global in the source module, return the global in the 8018c89411SRafael Espindola /// destination module that is being linked to, if any. 813e8bc6a8SRafael Espindola GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 82caabe228SRafael Espindola Module &DstM = Mover.getModule(); 83b1ed91f3SChris Lattner // If the source has no name it can't link. If it has local linkage, 84b1ed91f3SChris Lattner // there is no name match-up going on. 854504c1bcSTeresa Johnson if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage())) 862617dcceSCraig Topper return nullptr; 87b1ed91f3SChris Lattner 88b1ed91f3SChris Lattner // Otherwise see if we have a match in the destination module's symtab. 894504c1bcSTeresa Johnson GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 90c84f608bSRafael Espindola if (!DGV) 91c84f608bSRafael Espindola return nullptr; 92b1ed91f3SChris Lattner 93b1ed91f3SChris Lattner // If we found a global with the same name in the dest module, but it has 94b1ed91f3SChris Lattner // internal linkage, we are really not doing any linkage here. 95b1ed91f3SChris Lattner if (DGV->hasLocalLinkage()) 962617dcceSCraig Topper return nullptr; 97b1ed91f3SChris Lattner 98b1ed91f3SChris Lattner // Otherwise, we do in fact link to the destination global. 99b1ed91f3SChris Lattner return DGV; 100b1ed91f3SChris Lattner } 101b1ed91f3SChris Lattner 102370d528aSRafael Espindola /// Drop GV if it is a member of a comdat that we are dropping. 103370d528aSRafael Espindola /// This can happen with COFF's largest selection kind. 104370d528aSRafael Espindola void dropReplacedComdat(GlobalValue &GV, 105370d528aSRafael Espindola const DenseSet<const Comdat *> &ReplacedDstComdats); 106370d528aSRafael Espindola 107baa3bf8fSRafael Espindola bool linkIfNeeded(GlobalValue &GV); 108c7ed52f2STeresa Johnson 1094504c1bcSTeresa Johnson public: 110*5eb9c81dSJonas Devlieghere ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags, 111*5eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> 112*5eb9c81dSJonas Devlieghere InternalizeCallback = {}) 113*5eb9c81dSJonas Devlieghere : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags), 114*5eb9c81dSJonas Devlieghere InternalizeCallback(std::move(InternalizeCallback)) {} 1154504c1bcSTeresa Johnson 1164504c1bcSTeresa Johnson bool run(); 1174504c1bcSTeresa Johnson }; 1184504c1bcSTeresa Johnson } 1194504c1bcSTeresa Johnson 120eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes 121eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A, 122eb5e0a77SRafael Espindola GlobalValue::VisibilityTypes B) { 123eb5e0a77SRafael Espindola if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 124eb5e0a77SRafael Espindola return GlobalValue::HiddenVisibility; 125eb5e0a77SRafael Espindola if (A == GlobalValue::ProtectedVisibility || 126eb5e0a77SRafael Espindola B == GlobalValue::ProtectedVisibility) 127eb5e0a77SRafael Espindola return GlobalValue::ProtectedVisibility; 128eb5e0a77SRafael Espindola return GlobalValue::DefaultVisibility; 129eb5e0a77SRafael Espindola } 130eb5e0a77SRafael Espindola 1310e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 132dad0a645SDavid Majnemer const GlobalVariable *&GVar) { 1330e309fe8SRafael Espindola const GlobalValue *GVal = M.getNamedValue(ComdatName); 134dad0a645SDavid Majnemer if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 135dad0a645SDavid Majnemer GVal = GA->getBaseObject(); 136dad0a645SDavid Majnemer if (!GVal) 137dad0a645SDavid Majnemer // We cannot resolve the size of the aliasee yet. 138dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 139dad0a645SDavid Majnemer "': COMDAT key involves incomputable alias size."); 140dad0a645SDavid Majnemer } 141dad0a645SDavid Majnemer 142dad0a645SDavid Majnemer GVar = dyn_cast_or_null<GlobalVariable>(GVal); 143dad0a645SDavid Majnemer if (!GVar) 144dad0a645SDavid Majnemer return emitError( 145dad0a645SDavid Majnemer "Linking COMDATs named '" + ComdatName + 146dad0a645SDavid Majnemer "': GlobalVariable required for data dependent selection!"); 147dad0a645SDavid Majnemer 148dad0a645SDavid Majnemer return false; 149dad0a645SDavid Majnemer } 150dad0a645SDavid Majnemer 151dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 152dad0a645SDavid Majnemer Comdat::SelectionKind Src, 153dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 154dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 155dad0a645SDavid Majnemer bool &LinkFromSrc) { 156caabe228SRafael Espindola Module &DstM = Mover.getModule(); 157dad0a645SDavid Majnemer // The ability to mix Comdat::SelectionKind::Any with 158dad0a645SDavid Majnemer // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 159dad0a645SDavid Majnemer bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 160dad0a645SDavid Majnemer Dst == Comdat::SelectionKind::Largest; 161dad0a645SDavid Majnemer bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 162dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest; 163dad0a645SDavid Majnemer if (DstAnyOrLargest && SrcAnyOrLargest) { 164dad0a645SDavid Majnemer if (Dst == Comdat::SelectionKind::Largest || 165dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest) 166dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Largest; 167dad0a645SDavid Majnemer else 168dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Any; 169dad0a645SDavid Majnemer } else if (Src == Dst) { 170dad0a645SDavid Majnemer Result = Dst; 171dad0a645SDavid Majnemer } else { 172dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 173dad0a645SDavid Majnemer "': invalid selection kinds!"); 174dad0a645SDavid Majnemer } 175dad0a645SDavid Majnemer 176dad0a645SDavid Majnemer switch (Result) { 177dad0a645SDavid Majnemer case Comdat::SelectionKind::Any: 178dad0a645SDavid Majnemer // Go with Dst. 179dad0a645SDavid Majnemer LinkFromSrc = false; 180dad0a645SDavid Majnemer break; 181dad0a645SDavid Majnemer case Comdat::SelectionKind::NoDuplicates: 182dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 183dad0a645SDavid Majnemer "': noduplicates has been violated!"); 184dad0a645SDavid Majnemer case Comdat::SelectionKind::ExactMatch: 185dad0a645SDavid Majnemer case Comdat::SelectionKind::Largest: 186dad0a645SDavid Majnemer case Comdat::SelectionKind::SameSize: { 187dad0a645SDavid Majnemer const GlobalVariable *DstGV; 188dad0a645SDavid Majnemer const GlobalVariable *SrcGV; 189dad0a645SDavid Majnemer if (getComdatLeader(DstM, ComdatName, DstGV) || 19040358fb8SRafael Espindola getComdatLeader(*SrcM, ComdatName, SrcGV)) 191dad0a645SDavid Majnemer return true; 192dad0a645SDavid Majnemer 1930e309fe8SRafael Espindola const DataLayout &DstDL = DstM.getDataLayout(); 19440358fb8SRafael Espindola const DataLayout &SrcDL = SrcM->getDataLayout(); 1955f6eaac6SManuel Jacob uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType()); 1965f6eaac6SManuel Jacob uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType()); 197dad0a645SDavid Majnemer if (Result == Comdat::SelectionKind::ExactMatch) { 198dad0a645SDavid Majnemer if (SrcGV->getInitializer() != DstGV->getInitializer()) 199dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 200dad0a645SDavid Majnemer "': ExactMatch violated!"); 201dad0a645SDavid Majnemer LinkFromSrc = false; 202dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::Largest) { 203dad0a645SDavid Majnemer LinkFromSrc = SrcSize > DstSize; 204dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::SameSize) { 205dad0a645SDavid Majnemer if (SrcSize != DstSize) 206dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 207dad0a645SDavid Majnemer "': SameSize violated!"); 208dad0a645SDavid Majnemer LinkFromSrc = false; 209dad0a645SDavid Majnemer } else { 210dad0a645SDavid Majnemer llvm_unreachable("unknown selection kind"); 211dad0a645SDavid Majnemer } 212dad0a645SDavid Majnemer break; 213dad0a645SDavid Majnemer } 214dad0a645SDavid Majnemer } 215dad0a645SDavid Majnemer 216dad0a645SDavid Majnemer return false; 217dad0a645SDavid Majnemer } 218dad0a645SDavid Majnemer 219dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC, 220dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 221dad0a645SDavid Majnemer bool &LinkFromSrc) { 222caabe228SRafael Espindola Module &DstM = Mover.getModule(); 223b16196a3SRafael Espindola Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 224dad0a645SDavid Majnemer StringRef ComdatName = SrcC->getName(); 2250e309fe8SRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 226dad0a645SDavid Majnemer Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 2272ef3f299SRafael Espindola 228b16196a3SRafael Espindola if (DstCI == ComdatSymTab.end()) { 229b16196a3SRafael Espindola // Use the comdat if it is only available in one of the modules. 230b16196a3SRafael Espindola LinkFromSrc = true; 231b16196a3SRafael Espindola Result = SSK; 2322ef3f299SRafael Espindola return false; 233b16196a3SRafael Espindola } 2342ef3f299SRafael Espindola 235dad0a645SDavid Majnemer const Comdat *DstC = &DstCI->second; 236dad0a645SDavid Majnemer Comdat::SelectionKind DSK = DstC->getSelectionKind(); 2372ef3f299SRafael Espindola return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 2382ef3f299SRafael Espindola LinkFromSrc); 239dad0a645SDavid Majnemer } 240f6f121e2SJames Molloy 241d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 242d12b4a33SRafael Espindola const GlobalValue &Dest, 243dbb0bd1aSRafael Espindola const GlobalValue &Src) { 244e5a61917STeresa Johnson 245e868123dSDuncan P. N. Exon Smith // Should we unconditionally use the Src? 246020d4fb1SArtem Belevich if (shouldOverrideFromSrc()) { 247e868123dSDuncan P. N. Exon Smith LinkFromSrc = true; 248e868123dSDuncan P. N. Exon Smith return false; 249e868123dSDuncan P. N. Exon Smith } 250e868123dSDuncan P. N. Exon Smith 251778fcc77SRafael Espindola // We always have to add Src if it has appending linkage. 252778fcc77SRafael Espindola if (Src.hasAppendingLinkage()) { 253778fcc77SRafael Espindola LinkFromSrc = true; 254778fcc77SRafael Espindola return false; 255778fcc77SRafael Espindola } 256778fcc77SRafael Espindola 257d826bbbbSMehdi Amini bool SrcIsDeclaration = Src.isDeclarationForLinker(); 258d826bbbbSMehdi Amini bool DestIsDeclaration = Dest.isDeclarationForLinker(); 259c7ed52f2STeresa Johnson 260dbb0bd1aSRafael Espindola if (SrcIsDeclaration) { 261dbb0bd1aSRafael Espindola // If Src is external or if both Src & Dest are external.. Just link the 262dbb0bd1aSRafael Espindola // external globals, we aren't adding anything. 263d12b4a33SRafael Espindola if (Src.hasDLLImportStorageClass()) { 264dbb0bd1aSRafael Espindola // If one of GVs is marked as DLLImport, result should be dllimport'ed. 265d12b4a33SRafael Espindola LinkFromSrc = DestIsDeclaration; 266d12b4a33SRafael Espindola return false; 267d12b4a33SRafael Espindola } 268dbb0bd1aSRafael Espindola // If the Dest is weak, use the source linkage. 269ed11bd28SRafael Espindola if (Dest.hasExternalWeakLinkage()) { 270ed11bd28SRafael Espindola LinkFromSrc = true; 271ed11bd28SRafael Espindola return false; 272ed11bd28SRafael Espindola } 273ed11bd28SRafael Espindola // Link an available_externally over a declaration. 274ed11bd28SRafael Espindola LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 275d12b4a33SRafael Espindola return false; 276dbb0bd1aSRafael Espindola } 277dbb0bd1aSRafael Espindola 278d12b4a33SRafael Espindola if (DestIsDeclaration) { 279dbb0bd1aSRafael Espindola // If Dest is external but Src is not: 280d12b4a33SRafael Espindola LinkFromSrc = true; 281d12b4a33SRafael Espindola return false; 282d12b4a33SRafael Espindola } 283dbb0bd1aSRafael Espindola 2840910605aSRafael Espindola if (Src.hasCommonLinkage()) { 285d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 286d12b4a33SRafael Espindola LinkFromSrc = true; 2870910605aSRafael Espindola return false; 288d12b4a33SRafael Espindola } 289d12b4a33SRafael Espindola 290d12b4a33SRafael Espindola if (!Dest.hasCommonLinkage()) { 291d12b4a33SRafael Espindola LinkFromSrc = false; 292d12b4a33SRafael Espindola return false; 293d12b4a33SRafael Espindola } 2940910605aSRafael Espindola 295a28d91d8SMehdi Amini const DataLayout &DL = Dest.getParent()->getDataLayout(); 2965f6eaac6SManuel Jacob uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType()); 2975f6eaac6SManuel Jacob uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType()); 298d12b4a33SRafael Espindola LinkFromSrc = SrcSize > DestSize; 299d12b4a33SRafael Espindola return false; 3000910605aSRafael Espindola } 3010910605aSRafael Espindola 302dbb0bd1aSRafael Espindola if (Src.isWeakForLinker()) { 303dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 304dbb0bd1aSRafael Espindola assert(!Dest.hasAvailableExternallyLinkage()); 3050910605aSRafael Espindola 306d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 307d12b4a33SRafael Espindola LinkFromSrc = true; 308d12b4a33SRafael Espindola return false; 309d12b4a33SRafael Espindola } 310dbb0bd1aSRafael Espindola 311d12b4a33SRafael Espindola LinkFromSrc = false; 3120910605aSRafael Espindola return false; 313dbb0bd1aSRafael Espindola } 314dbb0bd1aSRafael Espindola 315dbb0bd1aSRafael Espindola if (Dest.isWeakForLinker()) { 316dbb0bd1aSRafael Espindola assert(Src.hasExternalLinkage()); 317d12b4a33SRafael Espindola LinkFromSrc = true; 318d12b4a33SRafael Espindola return false; 319dbb0bd1aSRafael Espindola } 320dbb0bd1aSRafael Espindola 321dbb0bd1aSRafael Espindola assert(!Src.hasExternalWeakLinkage()); 322dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 323dbb0bd1aSRafael Espindola assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 324dbb0bd1aSRafael Espindola "Unexpected linkage type!"); 325dbb0bd1aSRafael Espindola return emitError("Linking globals named '" + Src.getName() + 326dbb0bd1aSRafael Espindola "': symbol multiply defined!"); 327dbb0bd1aSRafael Espindola } 328dbb0bd1aSRafael Espindola 329baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 330baa3bf8fSRafael Espindola GlobalValue *DGV = getLinkedToGlobal(&GV); 331baa3bf8fSRafael Espindola 332baa3bf8fSRafael Espindola if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 333baa3bf8fSRafael Espindola return false; 334baa3bf8fSRafael Espindola 3354b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 3364b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 3374b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 3384b5ec263SRafael Espindola if (DGVar && SGVar) { 3394b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 3404b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 3414b5ec263SRafael Espindola DGVar->setConstant(false); 3424b5ec263SRafael Espindola SGVar->setConstant(false); 3434b5ec263SRafael Espindola } 3444b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 3454b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 3464b5ec263SRafael Espindola SGVar->setAlignment(Align); 3474b5ec263SRafael Espindola DGVar->setAlignment(Align); 3484b5ec263SRafael Espindola } 3494b5ec263SRafael Espindola } 3504b5ec263SRafael Espindola 351baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 352baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 353baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 354baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 3554b5ec263SRafael Espindola 35696efdd61SPeter Collingbourne GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::getMinUnnamedAddr( 35796efdd61SPeter Collingbourne DGV->getUnnamedAddr(), GV.getUnnamedAddr()); 35896efdd61SPeter Collingbourne DGV->setUnnamedAddr(UnnamedAddr); 35996efdd61SPeter Collingbourne GV.setUnnamedAddr(UnnamedAddr); 360baa3bf8fSRafael Espindola } 361baa3bf8fSRafael Espindola 3627c702116SPeter Collingbourne if (!DGV && !shouldOverrideFromSrc() && 3634b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 3644b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 3654b5ec263SRafael Espindola return false; 3664b5ec263SRafael Espindola 367bd03c503SRafael Espindola if (GV.isDeclaration()) 368bd03c503SRafael Espindola return false; 369bd03c503SRafael Espindola 370baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 371baa3bf8fSRafael Espindola bool LinkFromSrc; 372baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 373baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 374f2e71244SRafael Espindola if (!LinkFromSrc) 375baa3bf8fSRafael Espindola return false; 376baa3bf8fSRafael Espindola } 377baa3bf8fSRafael Espindola 3784b5ec263SRafael Espindola bool LinkFromSrc = true; 3794b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 3804b5ec263SRafael Espindola return true; 3814b5ec263SRafael Espindola if (LinkFromSrc) 3824b5ec263SRafael Espindola ValuesToLink.insert(&GV); 383baa3bf8fSRafael Espindola return false; 384baa3bf8fSRafael Espindola } 385baa3bf8fSRafael Espindola 386c321e534SBenjamin Kramer void ModuleLinker::addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add) { 387caabe228SRafael Espindola // Add these to the internalize list 388c387e70cSPeter Collingbourne if (!GV.hasLinkOnceLinkage() && !GV.hasAvailableExternallyLinkage() && 389c387e70cSPeter Collingbourne !shouldLinkOnlyNeeded()) 390caabe228SRafael Espindola return; 391caabe228SRafael Espindola 392*5eb9c81dSJonas Devlieghere if (InternalizeCallback) 393caabe228SRafael Espindola Internalize.insert(GV.getName()); 394caabe228SRafael Espindola Add(GV); 395caabe228SRafael Espindola 396caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 397caabe228SRafael Espindola if (!SC) 398caabe228SRafael Espindola return; 3991ee9fbd8SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 400e1c42ac1SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 401e1c42ac1SRafael Espindola bool LinkFromSrc = true; 402e1c42ac1SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 403e1c42ac1SRafael Espindola return; 404e1c42ac1SRafael Espindola if (!LinkFromSrc) 405e1c42ac1SRafael Espindola continue; 406*5eb9c81dSJonas Devlieghere if (InternalizeCallback) 407caabe228SRafael Espindola Internalize.insert(GV2->getName()); 408caabe228SRafael Espindola Add(*GV2); 409caabe228SRafael Espindola } 410caabe228SRafael Espindola } 411caabe228SRafael Espindola 412370d528aSRafael Espindola void ModuleLinker::dropReplacedComdat( 413370d528aSRafael Espindola GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) { 414370d528aSRafael Espindola Comdat *C = GV.getComdat(); 415370d528aSRafael Espindola if (!C) 416370d528aSRafael Espindola return; 417370d528aSRafael Espindola if (!ReplacedDstComdats.count(C)) 418370d528aSRafael Espindola return; 419370d528aSRafael Espindola if (GV.use_empty()) { 420370d528aSRafael Espindola GV.eraseFromParent(); 421370d528aSRafael Espindola return; 422370d528aSRafael Espindola } 423370d528aSRafael Espindola 424370d528aSRafael Espindola if (auto *F = dyn_cast<Function>(&GV)) { 425370d528aSRafael Espindola F->deleteBody(); 426370d528aSRafael Espindola } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) { 427370d528aSRafael Espindola Var->setInitializer(nullptr); 428370d528aSRafael Espindola } else { 429370d528aSRafael Espindola auto &Alias = cast<GlobalAlias>(GV); 430370d528aSRafael Espindola Module &M = *Alias.getParent(); 431370d528aSRafael Espindola PointerType &Ty = *cast<PointerType>(Alias.getType()); 432370d528aSRafael Espindola GlobalValue *Declaration; 433370d528aSRafael Espindola if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) { 434370d528aSRafael Espindola Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M); 435370d528aSRafael Espindola } else { 436370d528aSRafael Espindola Declaration = 437370d528aSRafael Espindola new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false, 438370d528aSRafael Espindola GlobalValue::ExternalLinkage, 439370d528aSRafael Espindola /*Initializer*/ nullptr); 440370d528aSRafael Espindola } 441370d528aSRafael Espindola Declaration->takeName(&Alias); 442370d528aSRafael Espindola Alias.replaceAllUsesWith(Declaration); 443370d528aSRafael Espindola Alias.eraseFromParent(); 444370d528aSRafael Espindola } 445370d528aSRafael Espindola } 446370d528aSRafael Espindola 447b1ed91f3SChris Lattner bool ModuleLinker::run() { 448370d528aSRafael Espindola Module &DstM = Mover.getModule(); 449370d528aSRafael Espindola DenseSet<const Comdat *> ReplacedDstComdats; 450370d528aSRafael Espindola 45140358fb8SRafael Espindola for (const auto &SMEC : SrcM->getComdatSymbolTable()) { 452dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 453dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 454dad0a645SDavid Majnemer continue; 455dad0a645SDavid Majnemer Comdat::SelectionKind SK; 456dad0a645SDavid Majnemer bool LinkFromSrc; 457dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 458dad0a645SDavid Majnemer return true; 459dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 460370d528aSRafael Espindola 461370d528aSRafael Espindola if (!LinkFromSrc) 462370d528aSRafael Espindola continue; 463370d528aSRafael Espindola 464370d528aSRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 465370d528aSRafael Espindola Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName()); 466370d528aSRafael Espindola if (DstCI == ComdatSymTab.end()) 467370d528aSRafael Espindola continue; 468370d528aSRafael Espindola 469370d528aSRafael Espindola // The source comdat is replacing the dest one. 470370d528aSRafael Espindola const Comdat *DstC = &DstCI->second; 471370d528aSRafael Espindola ReplacedDstComdats.insert(DstC); 472370d528aSRafael Espindola } 473370d528aSRafael Espindola 474370d528aSRafael Espindola // Alias have to go first, since we are not able to find their comdats 475370d528aSRafael Espindola // otherwise. 476370d528aSRafael Espindola for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) { 477370d528aSRafael Espindola GlobalAlias &GV = *I++; 478370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 479370d528aSRafael Espindola } 480370d528aSRafael Espindola 481370d528aSRafael Espindola for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) { 482370d528aSRafael Espindola GlobalVariable &GV = *I++; 483370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 484370d528aSRafael Espindola } 485370d528aSRafael Espindola 486370d528aSRafael Espindola for (auto I = DstM.begin(), E = DstM.end(); I != E;) { 487370d528aSRafael Espindola Function &GV = *I++; 488370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 489dad0a645SDavid Majnemer } 490dad0a645SDavid Majnemer 49140358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 4921ee9fbd8SRafael Espindola if (GV.hasLinkOnceLinkage()) 493baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 4941ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GV); 495baa3bf8fSRafael Espindola 49640358fb8SRafael Espindola for (Function &SF : *SrcM) 4971ee9fbd8SRafael Espindola if (SF.hasLinkOnceLinkage()) 498baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 4991ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&SF); 500baa3bf8fSRafael Espindola 50140358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 5021ee9fbd8SRafael Espindola if (GA.hasLinkOnceLinkage()) 503baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 5041ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GA); 505baa3bf8fSRafael Espindola 506b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 507b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 50840358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 509baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 510b1ed91f3SChris Lattner return true; 511b1ed91f3SChris Lattner 51240358fb8SRafael Espindola for (Function &SF : *SrcM) 513baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 514b1ed91f3SChris Lattner return true; 515b1ed91f3SChris Lattner 51640358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 517baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 518b1ed91f3SChris Lattner return true; 519b1ed91f3SChris Lattner 520caabe228SRafael Espindola for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 521caabe228SRafael Espindola GlobalValue *GV = ValuesToLink[I]; 522caabe228SRafael Espindola const Comdat *SC = GV->getComdat(); 523caabe228SRafael Espindola if (!SC) 524caabe228SRafael Espindola continue; 52542e03237SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 52642e03237SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 52742e03237SRafael Espindola bool LinkFromSrc = true; 52842e03237SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 52942e03237SRafael Espindola return true; 53042e03237SRafael Espindola if (LinkFromSrc) 531caabe228SRafael Espindola ValuesToLink.insert(GV2); 532caabe228SRafael Espindola } 53342e03237SRafael Espindola } 534caabe228SRafael Espindola 535*5eb9c81dSJonas Devlieghere if (InternalizeCallback) { 536caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 537caabe228SRafael Espindola Internalize.insert(GV->getName()); 538caabe228SRafael Espindola } 539caabe228SRafael Espindola 5401eaa97f4SPeter Collingbourne // FIXME: Propagate Errors through to the caller instead of emitting 5411eaa97f4SPeter Collingbourne // diagnostics. 5421eaa97f4SPeter Collingbourne bool HasErrors = false; 5431eaa97f4SPeter Collingbourne if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(), 544caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 545caabe228SRafael Espindola addLazyFor(GV, Add); 5464b9b3791STeresa Johnson }, 5477c702116SPeter Collingbourne /* IsPerformingImport */ false)) { 5481eaa97f4SPeter Collingbourne handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { 5491eaa97f4SPeter Collingbourne DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message())); 5501eaa97f4SPeter Collingbourne HasErrors = true; 5511eaa97f4SPeter Collingbourne }); 5521eaa97f4SPeter Collingbourne } 5531eaa97f4SPeter Collingbourne if (HasErrors) 5544b5ec263SRafael Espindola return true; 5551eaa97f4SPeter Collingbourne 556*5eb9c81dSJonas Devlieghere if (InternalizeCallback) 557*5eb9c81dSJonas Devlieghere InternalizeCallback(DstM, Internalize); 558beadd56aSRafael Espindola 5592609888fSAnton Korobeynikov return false; 5602609888fSAnton Korobeynikov } 561361e513dSReid Spencer 5629d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {} 5633df61b7bSRafael Espindola 564*5eb9c81dSJonas Devlieghere bool Linker::linkInModule( 565*5eb9c81dSJonas Devlieghere std::unique_ptr<Module> Src, unsigned Flags, 566*5eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> InternalizeCallback) { 567*5eb9c81dSJonas Devlieghere ModuleLinker ModLinker(Mover, std::move(Src), Flags, 568*5eb9c81dSJonas Devlieghere std::move(InternalizeCallback)); 569bef54363STeresa Johnson return ModLinker.run(); 570434e9561SRafael Espindola } 571434e9561SRafael Espindola 572b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 573b1ed91f3SChris Lattner // LinkModules entrypoint. 574b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 575b1ed91f3SChris Lattner 57618c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 57718c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 57818c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 57918c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 58018c89411SRafael Espindola /// relied on to be consistent. 581*5eb9c81dSJonas Devlieghere bool Linker::linkModules( 582*5eb9c81dSJonas Devlieghere Module &Dest, std::unique_ptr<Module> Src, unsigned Flags, 583*5eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> InternalizeCallback) { 5849d2bfc48SRafael Espindola Linker L(Dest); 585*5eb9c81dSJonas Devlieghere return L.linkInModule(std::move(Src), Flags, std::move(InternalizeCallback)); 5864160f5d3SRafael Espindola } 5874160f5d3SRafael Espindola 588a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 589a3aeb980SBill Wendling // C API. 590a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 591a3aeb980SBill Wendling 592434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 593434e9561SRafael Espindola Module *D = unwrap(Dest); 594434e9561SRafael Espindola std::unique_ptr<Module> M(unwrap(Src)); 595434e9561SRafael Espindola return Linker::linkModules(*D, std::move(M)); 596434e9561SRafael Espindola } 597