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 395eb9c81dSJonas Devlieghere /// List of global value names that should be internalized. 405eb9c81dSJonas Devlieghere StringSet<> Internalize; 415eb9c81dSJonas Devlieghere 425eb9c81dSJonas Devlieghere /// Function that will perform the actual internalization. The reason for a 435eb9c81dSJonas Devlieghere /// callback is that the linker cannot call internalizeModule without 445eb9c81dSJonas Devlieghere /// creating a circular dependency between IPO and the linker. 455eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> InternalizeCallback; 465eb9c81dSJonas 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: 1105eb9c81dSJonas Devlieghere ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags, 1115eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> 1125eb9c81dSJonas Devlieghere InternalizeCallback = {}) 1135eb9c81dSJonas Devlieghere : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags), 1145eb9c81dSJonas 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 332*b1a9ad81SBenoit Belley if (shouldLinkOnlyNeeded()) { 333*b1a9ad81SBenoit Belley // Always import variables with appending linkage. 334*b1a9ad81SBenoit Belley if (!GV.hasAppendingLinkage()) { 335*b1a9ad81SBenoit Belley // Don't import globals unless they are referenced by the destination 336*b1a9ad81SBenoit Belley // module. 337*b1a9ad81SBenoit Belley if (!DGV) 338baa3bf8fSRafael Espindola return false; 339*b1a9ad81SBenoit Belley // Don't import globals that are already defined in the destination module 340*b1a9ad81SBenoit Belley if (!DGV->isDeclaration()) 341*b1a9ad81SBenoit Belley return false; 342*b1a9ad81SBenoit Belley } 343*b1a9ad81SBenoit Belley } 344baa3bf8fSRafael Espindola 3454b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 3464b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 3474b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 3484b5ec263SRafael Espindola if (DGVar && SGVar) { 3494b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 3504b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 3514b5ec263SRafael Espindola DGVar->setConstant(false); 3524b5ec263SRafael Espindola SGVar->setConstant(false); 3534b5ec263SRafael Espindola } 3544b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 3554b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 3564b5ec263SRafael Espindola SGVar->setAlignment(Align); 3574b5ec263SRafael Espindola DGVar->setAlignment(Align); 3584b5ec263SRafael Espindola } 3594b5ec263SRafael Espindola } 3604b5ec263SRafael Espindola 361baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 362baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 363baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 364baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 3654b5ec263SRafael Espindola 36696efdd61SPeter Collingbourne GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::getMinUnnamedAddr( 36796efdd61SPeter Collingbourne DGV->getUnnamedAddr(), GV.getUnnamedAddr()); 36896efdd61SPeter Collingbourne DGV->setUnnamedAddr(UnnamedAddr); 36996efdd61SPeter Collingbourne GV.setUnnamedAddr(UnnamedAddr); 370baa3bf8fSRafael Espindola } 371baa3bf8fSRafael Espindola 3727c702116SPeter Collingbourne if (!DGV && !shouldOverrideFromSrc() && 3734b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 3744b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 3754b5ec263SRafael Espindola return false; 3764b5ec263SRafael Espindola 377bd03c503SRafael Espindola if (GV.isDeclaration()) 378bd03c503SRafael Espindola return false; 379bd03c503SRafael Espindola 380baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 381baa3bf8fSRafael Espindola bool LinkFromSrc; 382baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 383baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 384f2e71244SRafael Espindola if (!LinkFromSrc) 385baa3bf8fSRafael Espindola return false; 386baa3bf8fSRafael Espindola } 387baa3bf8fSRafael Espindola 3884b5ec263SRafael Espindola bool LinkFromSrc = true; 3894b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 3904b5ec263SRafael Espindola return true; 3914b5ec263SRafael Espindola if (LinkFromSrc) 3924b5ec263SRafael Espindola ValuesToLink.insert(&GV); 393baa3bf8fSRafael Espindola return false; 394baa3bf8fSRafael Espindola } 395baa3bf8fSRafael Espindola 396c321e534SBenjamin Kramer void ModuleLinker::addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add) { 397caabe228SRafael Espindola // Add these to the internalize list 398c387e70cSPeter Collingbourne if (!GV.hasLinkOnceLinkage() && !GV.hasAvailableExternallyLinkage() && 399c387e70cSPeter Collingbourne !shouldLinkOnlyNeeded()) 400caabe228SRafael Espindola return; 401caabe228SRafael Espindola 4025eb9c81dSJonas Devlieghere if (InternalizeCallback) 403caabe228SRafael Espindola Internalize.insert(GV.getName()); 404caabe228SRafael Espindola Add(GV); 405caabe228SRafael Espindola 406caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 407caabe228SRafael Espindola if (!SC) 408caabe228SRafael Espindola return; 4091ee9fbd8SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 410e1c42ac1SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 411e1c42ac1SRafael Espindola bool LinkFromSrc = true; 412e1c42ac1SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 413e1c42ac1SRafael Espindola return; 414e1c42ac1SRafael Espindola if (!LinkFromSrc) 415e1c42ac1SRafael Espindola continue; 4165eb9c81dSJonas Devlieghere if (InternalizeCallback) 417caabe228SRafael Espindola Internalize.insert(GV2->getName()); 418caabe228SRafael Espindola Add(*GV2); 419caabe228SRafael Espindola } 420caabe228SRafael Espindola } 421caabe228SRafael Espindola 422370d528aSRafael Espindola void ModuleLinker::dropReplacedComdat( 423370d528aSRafael Espindola GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) { 424370d528aSRafael Espindola Comdat *C = GV.getComdat(); 425370d528aSRafael Espindola if (!C) 426370d528aSRafael Espindola return; 427370d528aSRafael Espindola if (!ReplacedDstComdats.count(C)) 428370d528aSRafael Espindola return; 429370d528aSRafael Espindola if (GV.use_empty()) { 430370d528aSRafael Espindola GV.eraseFromParent(); 431370d528aSRafael Espindola return; 432370d528aSRafael Espindola } 433370d528aSRafael Espindola 434370d528aSRafael Espindola if (auto *F = dyn_cast<Function>(&GV)) { 435370d528aSRafael Espindola F->deleteBody(); 436370d528aSRafael Espindola } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) { 437370d528aSRafael Espindola Var->setInitializer(nullptr); 438370d528aSRafael Espindola } else { 439370d528aSRafael Espindola auto &Alias = cast<GlobalAlias>(GV); 440370d528aSRafael Espindola Module &M = *Alias.getParent(); 441370d528aSRafael Espindola PointerType &Ty = *cast<PointerType>(Alias.getType()); 442370d528aSRafael Espindola GlobalValue *Declaration; 443370d528aSRafael Espindola if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) { 444370d528aSRafael Espindola Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M); 445370d528aSRafael Espindola } else { 446370d528aSRafael Espindola Declaration = 447370d528aSRafael Espindola new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false, 448370d528aSRafael Espindola GlobalValue::ExternalLinkage, 449370d528aSRafael Espindola /*Initializer*/ nullptr); 450370d528aSRafael Espindola } 451370d528aSRafael Espindola Declaration->takeName(&Alias); 452370d528aSRafael Espindola Alias.replaceAllUsesWith(Declaration); 453370d528aSRafael Espindola Alias.eraseFromParent(); 454370d528aSRafael Espindola } 455370d528aSRafael Espindola } 456370d528aSRafael Espindola 457b1ed91f3SChris Lattner bool ModuleLinker::run() { 458370d528aSRafael Espindola Module &DstM = Mover.getModule(); 459370d528aSRafael Espindola DenseSet<const Comdat *> ReplacedDstComdats; 460370d528aSRafael Espindola 46140358fb8SRafael Espindola for (const auto &SMEC : SrcM->getComdatSymbolTable()) { 462dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 463dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 464dad0a645SDavid Majnemer continue; 465dad0a645SDavid Majnemer Comdat::SelectionKind SK; 466dad0a645SDavid Majnemer bool LinkFromSrc; 467dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 468dad0a645SDavid Majnemer return true; 469dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 470370d528aSRafael Espindola 471370d528aSRafael Espindola if (!LinkFromSrc) 472370d528aSRafael Espindola continue; 473370d528aSRafael Espindola 474370d528aSRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 475370d528aSRafael Espindola Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName()); 476370d528aSRafael Espindola if (DstCI == ComdatSymTab.end()) 477370d528aSRafael Espindola continue; 478370d528aSRafael Espindola 479370d528aSRafael Espindola // The source comdat is replacing the dest one. 480370d528aSRafael Espindola const Comdat *DstC = &DstCI->second; 481370d528aSRafael Espindola ReplacedDstComdats.insert(DstC); 482370d528aSRafael Espindola } 483370d528aSRafael Espindola 484370d528aSRafael Espindola // Alias have to go first, since we are not able to find their comdats 485370d528aSRafael Espindola // otherwise. 486370d528aSRafael Espindola for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) { 487370d528aSRafael Espindola GlobalAlias &GV = *I++; 488370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 489370d528aSRafael Espindola } 490370d528aSRafael Espindola 491370d528aSRafael Espindola for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) { 492370d528aSRafael Espindola GlobalVariable &GV = *I++; 493370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 494370d528aSRafael Espindola } 495370d528aSRafael Espindola 496370d528aSRafael Espindola for (auto I = DstM.begin(), E = DstM.end(); I != E;) { 497370d528aSRafael Espindola Function &GV = *I++; 498370d528aSRafael Espindola dropReplacedComdat(GV, ReplacedDstComdats); 499dad0a645SDavid Majnemer } 500dad0a645SDavid Majnemer 50140358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 5021ee9fbd8SRafael Espindola if (GV.hasLinkOnceLinkage()) 503baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 5041ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GV); 505baa3bf8fSRafael Espindola 50640358fb8SRafael Espindola for (Function &SF : *SrcM) 5071ee9fbd8SRafael Espindola if (SF.hasLinkOnceLinkage()) 508baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 5091ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&SF); 510baa3bf8fSRafael Espindola 51140358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 5121ee9fbd8SRafael Espindola if (GA.hasLinkOnceLinkage()) 513baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 5141ee9fbd8SRafael Espindola LazyComdatMembers[SC].push_back(&GA); 515baa3bf8fSRafael Espindola 516b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 517b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 51840358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 519baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 520b1ed91f3SChris Lattner return true; 521b1ed91f3SChris Lattner 52240358fb8SRafael Espindola for (Function &SF : *SrcM) 523baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 524b1ed91f3SChris Lattner return true; 525b1ed91f3SChris Lattner 52640358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 527baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 528b1ed91f3SChris Lattner return true; 529b1ed91f3SChris Lattner 530caabe228SRafael Espindola for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 531caabe228SRafael Espindola GlobalValue *GV = ValuesToLink[I]; 532caabe228SRafael Espindola const Comdat *SC = GV->getComdat(); 533caabe228SRafael Espindola if (!SC) 534caabe228SRafael Espindola continue; 53542e03237SRafael Espindola for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 53642e03237SRafael Espindola GlobalValue *DGV = getLinkedToGlobal(GV2); 53742e03237SRafael Espindola bool LinkFromSrc = true; 53842e03237SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 53942e03237SRafael Espindola return true; 54042e03237SRafael Espindola if (LinkFromSrc) 541caabe228SRafael Espindola ValuesToLink.insert(GV2); 542caabe228SRafael Espindola } 54342e03237SRafael Espindola } 544caabe228SRafael Espindola 5455eb9c81dSJonas Devlieghere if (InternalizeCallback) { 546caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 547caabe228SRafael Espindola Internalize.insert(GV->getName()); 548caabe228SRafael Espindola } 549caabe228SRafael Espindola 5501eaa97f4SPeter Collingbourne // FIXME: Propagate Errors through to the caller instead of emitting 5511eaa97f4SPeter Collingbourne // diagnostics. 5521eaa97f4SPeter Collingbourne bool HasErrors = false; 5531eaa97f4SPeter Collingbourne if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(), 554caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 555caabe228SRafael Espindola addLazyFor(GV, Add); 5564b9b3791STeresa Johnson }, 5577c702116SPeter Collingbourne /* IsPerformingImport */ false)) { 5581eaa97f4SPeter Collingbourne handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { 5591eaa97f4SPeter Collingbourne DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message())); 5601eaa97f4SPeter Collingbourne HasErrors = true; 5611eaa97f4SPeter Collingbourne }); 5621eaa97f4SPeter Collingbourne } 5631eaa97f4SPeter Collingbourne if (HasErrors) 5644b5ec263SRafael Espindola return true; 5651eaa97f4SPeter Collingbourne 5665eb9c81dSJonas Devlieghere if (InternalizeCallback) 5675eb9c81dSJonas Devlieghere InternalizeCallback(DstM, Internalize); 568beadd56aSRafael Espindola 5692609888fSAnton Korobeynikov return false; 5702609888fSAnton Korobeynikov } 571361e513dSReid Spencer 5729d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {} 5733df61b7bSRafael Espindola 5745eb9c81dSJonas Devlieghere bool Linker::linkInModule( 5755eb9c81dSJonas Devlieghere std::unique_ptr<Module> Src, unsigned Flags, 5765eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> InternalizeCallback) { 5775eb9c81dSJonas Devlieghere ModuleLinker ModLinker(Mover, std::move(Src), Flags, 5785eb9c81dSJonas Devlieghere std::move(InternalizeCallback)); 579bef54363STeresa Johnson return ModLinker.run(); 580434e9561SRafael Espindola } 581434e9561SRafael Espindola 582b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 583b1ed91f3SChris Lattner // LinkModules entrypoint. 584b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 585b1ed91f3SChris Lattner 58618c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 58718c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 58818c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 58918c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 59018c89411SRafael Espindola /// relied on to be consistent. 5915eb9c81dSJonas Devlieghere bool Linker::linkModules( 5925eb9c81dSJonas Devlieghere Module &Dest, std::unique_ptr<Module> Src, unsigned Flags, 5935eb9c81dSJonas Devlieghere std::function<void(Module &, const StringSet<> &)> InternalizeCallback) { 5949d2bfc48SRafael Espindola Linker L(Dest); 5955eb9c81dSJonas Devlieghere return L.linkInModule(std::move(Src), Flags, std::move(InternalizeCallback)); 5964160f5d3SRafael Espindola } 5974160f5d3SRafael Espindola 598a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 599a3aeb980SBill Wendling // C API. 600a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 601a3aeb980SBill Wendling 602434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 603434e9561SRafael Espindola Module *D = unwrap(Dest); 604434e9561SRafael Espindola std::unique_ptr<Module> M(unwrap(Src)); 605434e9561SRafael Espindola return Linker::linkModules(*D, std::move(M)); 606434e9561SRafael Espindola } 607