159a5afa9SMikhail Glushenkov //===- lib/Linker/LinkModules.cpp - Module Linker Implementation ----------===// 2361e513dSReid Spencer // 3361e513dSReid Spencer // The LLVM Compiler Infrastructure 4361e513dSReid Spencer // 5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source 6f3ebc3f3SChris Lattner // License. See LICENSE.TXT for details. 7361e513dSReid Spencer // 8361e513dSReid Spencer //===----------------------------------------------------------------------===// 9361e513dSReid Spencer // 10361e513dSReid Spencer // This file implements the LLVM module linker. 11361e513dSReid Spencer // 12361e513dSReid Spencer //===----------------------------------------------------------------------===// 13361e513dSReid Spencer 14caabe228SRafael Espindola #include "LinkDiagnosticInfo.h" 15ed0881b2SChandler Carruth #include "llvm-c/Linker.h" 1666f02413SBill Wendling #include "llvm/ADT/SetVector.h" 17caabe228SRafael Espindola #include "llvm/ADT/StringSet.h" 18d12b4a33SRafael Espindola #include "llvm/IR/DiagnosticPrinter.h" 199d2bfc48SRafael Espindola #include "llvm/IR/LLVMContext.h" 20488a800aSTeresa Johnson #include "llvm/Linker/Linker.h" 21488a800aSTeresa Johnson #include "llvm/Transforms/Utils/FunctionImportUtils.h" 22361e513dSReid Spencer using namespace llvm; 23361e513dSReid Spencer 24b1ed91f3SChris Lattner namespace { 25d12b4a33SRafael Espindola 2618c89411SRafael Espindola /// This is an implementation class for the LinkModules function, which is the 2718c89411SRafael Espindola /// entrypoint for this file. 28b1ed91f3SChris Lattner class ModuleLinker { 29caabe228SRafael Espindola IRMover &Mover; 30*40358fb8SRafael Espindola std::unique_ptr<Module> SrcM; 31b1ed91f3SChris Lattner 324b5ec263SRafael Espindola SetVector<GlobalValue *> ValuesToLink; 33caabe228SRafael Espindola StringSet<> Internalize; 344160f5d3SRafael Espindola 35e868123dSDuncan P. N. Exon Smith /// For symbol clashes, prefer those from Src. 36020d4fb1SArtem Belevich unsigned Flags; 37e868123dSDuncan P. N. Exon Smith 38c7ed52f2STeresa Johnson /// Function index passed into ModuleLinker for using in function 39c7ed52f2STeresa Johnson /// importing/exporting handling. 408220e8a8SMehdi Amini const FunctionInfoIndex *ImportIndex; 41c7ed52f2STeresa Johnson 424f04d85fSTeresa Johnson /// Functions to import from source module, all other functions are 43c7ed52f2STeresa Johnson /// imported as declarations instead of definitions. 444f04d85fSTeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport; 45c7ed52f2STeresa Johnson 46c7ed52f2STeresa Johnson /// Set to true if the given FunctionInfoIndex contains any functions 47c7ed52f2STeresa Johnson /// from this source module, in which case we must conservatively assume 48c7ed52f2STeresa Johnson /// that any of its functions may be imported into another module 49c7ed52f2STeresa Johnson /// as part of a different backend compilation process. 50af714765SRafael Espindola bool HasExportedFunctions = false; 51c7ed52f2STeresa Johnson 52e5a61917STeresa Johnson /// Association between metadata value id and temporary metadata that 53e5a61917STeresa Johnson /// remains unmapped after function importing. Saved during function 54e5a61917STeresa Johnson /// importing and consumed during the metadata linking postpass. 55e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap; 56e5a61917STeresa Johnson 57caabe228SRafael Espindola /// Used as the callback for lazy linking. 58caabe228SRafael Espindola /// The mover has just hit GV and we have to decide if it, and other members 59caabe228SRafael Espindola /// of the same comdat, should be linked. Every member to be linked is passed 60caabe228SRafael Espindola /// to Add. 61caabe228SRafael Espindola void addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add); 62baa3bf8fSRafael Espindola 63020d4fb1SArtem Belevich bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 64020d4fb1SArtem Belevich bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 65020d4fb1SArtem Belevich bool shouldInternalizeLinkedSymbols() { 66020d4fb1SArtem Belevich return Flags & Linker::InternalizeLinkedSymbols; 67020d4fb1SArtem Belevich } 68020d4fb1SArtem Belevich 69d12b4a33SRafael Espindola bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 70d12b4a33SRafael Espindola const GlobalValue &Src); 71dbb0bd1aSRafael Espindola 72caabe228SRafael Espindola /// Should we have mover and linker error diag info? 73b1ed91f3SChris Lattner bool emitError(const Twine &Message) { 74*40358fb8SRafael Espindola SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 75b1ed91f3SChris Lattner return true; 76b1ed91f3SChris Lattner } 77b1ed91f3SChris Lattner 780e309fe8SRafael Espindola bool getComdatLeader(Module &M, StringRef ComdatName, 79dad0a645SDavid Majnemer const GlobalVariable *&GVar); 80dad0a645SDavid Majnemer bool computeResultingSelectionKind(StringRef ComdatName, 81dad0a645SDavid Majnemer Comdat::SelectionKind Src, 82dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 83dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 84dad0a645SDavid Majnemer bool &LinkFromSrc); 85dad0a645SDavid Majnemer std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 86dad0a645SDavid Majnemer ComdatsChosen; 87dad0a645SDavid Majnemer bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 88dad0a645SDavid Majnemer bool &LinkFromSrc); 892d5fb8caSTeresa Johnson // Keep track of the global value members of each comdat in source. 902d5fb8caSTeresa Johnson DenseMap<const Comdat *, std::vector<GlobalValue *>> ComdatMembers; 91dad0a645SDavid Majnemer 9218c89411SRafael Espindola /// Given a global in the source module, return the global in the 9318c89411SRafael Espindola /// destination module that is being linked to, if any. 943e8bc6a8SRafael Espindola GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 95caabe228SRafael Espindola Module &DstM = Mover.getModule(); 96b1ed91f3SChris Lattner // If the source has no name it can't link. If it has local linkage, 97b1ed91f3SChris Lattner // there is no name match-up going on. 984504c1bcSTeresa Johnson if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage())) 992617dcceSCraig Topper return nullptr; 100b1ed91f3SChris Lattner 101b1ed91f3SChris Lattner // Otherwise see if we have a match in the destination module's symtab. 1024504c1bcSTeresa Johnson GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 103c84f608bSRafael Espindola if (!DGV) 104c84f608bSRafael Espindola return nullptr; 105b1ed91f3SChris Lattner 106b1ed91f3SChris Lattner // If we found a global with the same name in the dest module, but it has 107b1ed91f3SChris Lattner // internal linkage, we are really not doing any linkage here. 108b1ed91f3SChris Lattner if (DGV->hasLocalLinkage()) 1092617dcceSCraig Topper return nullptr; 110b1ed91f3SChris Lattner 111b1ed91f3SChris Lattner // Otherwise, we do in fact link to the destination global. 112b1ed91f3SChris Lattner return DGV; 113b1ed91f3SChris Lattner } 114b1ed91f3SChris Lattner 115baa3bf8fSRafael Espindola bool linkIfNeeded(GlobalValue &GV); 116c7ed52f2STeresa Johnson 1174504c1bcSTeresa Johnson /// Helper method to check if we are importing from the current source 1184504c1bcSTeresa Johnson /// module. 1194504c1bcSTeresa Johnson bool isPerformingImport() const { return FunctionsToImport != nullptr; } 1204504c1bcSTeresa Johnson 1214504c1bcSTeresa Johnson /// If we are importing from the source module, checks if we should 1224504c1bcSTeresa Johnson /// import SGV as a definition, otherwise import as a declaration. 1234504c1bcSTeresa Johnson bool doImportAsDefinition(const GlobalValue *SGV); 1244504c1bcSTeresa Johnson 1254504c1bcSTeresa Johnson public: 126*40358fb8SRafael Espindola ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags, 1274504c1bcSTeresa Johnson const FunctionInfoIndex *Index = nullptr, 1284504c1bcSTeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport = nullptr, 1294504c1bcSTeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap = nullptr) 130*40358fb8SRafael Espindola : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags), ImportIndex(Index), 1314504c1bcSTeresa Johnson FunctionsToImport(FunctionsToImport), 1324504c1bcSTeresa Johnson ValIDToTempMDMap(ValIDToTempMDMap) { 1334504c1bcSTeresa Johnson assert((ImportIndex || !FunctionsToImport) && 1344504c1bcSTeresa Johnson "Expect a FunctionInfoIndex when importing"); 1354504c1bcSTeresa Johnson // If we have a FunctionInfoIndex but no function to import, 1364504c1bcSTeresa Johnson // then this is the primary module being compiled in a ThinLTO 1374504c1bcSTeresa Johnson // backend compilation, and we need to see if it has functions that 1384504c1bcSTeresa Johnson // may be exported to another backend compilation. 1394504c1bcSTeresa Johnson if (ImportIndex && !FunctionsToImport) 140*40358fb8SRafael Espindola HasExportedFunctions = ImportIndex->hasExportedFunctions(*this->SrcM); 1414504c1bcSTeresa Johnson } 1424504c1bcSTeresa Johnson 1434504c1bcSTeresa Johnson bool run(); 1444504c1bcSTeresa Johnson }; 1454504c1bcSTeresa Johnson } 1464504c1bcSTeresa Johnson 1474504c1bcSTeresa Johnson bool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) { 1484504c1bcSTeresa Johnson if (!isPerformingImport()) 1494504c1bcSTeresa Johnson return false; 150488a800aSTeresa Johnson return FunctionImportGlobalProcessing::doImportAsDefinition( 151488a800aSTeresa Johnson SGV, FunctionsToImport); 152c7ed52f2STeresa Johnson } 153c7ed52f2STeresa Johnson 154eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes 155eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A, 156eb5e0a77SRafael Espindola GlobalValue::VisibilityTypes B) { 157eb5e0a77SRafael Espindola if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 158eb5e0a77SRafael Espindola return GlobalValue::HiddenVisibility; 159eb5e0a77SRafael Espindola if (A == GlobalValue::ProtectedVisibility || 160eb5e0a77SRafael Espindola B == GlobalValue::ProtectedVisibility) 161eb5e0a77SRafael Espindola return GlobalValue::ProtectedVisibility; 162eb5e0a77SRafael Espindola return GlobalValue::DefaultVisibility; 163eb5e0a77SRafael Espindola } 164eb5e0a77SRafael Espindola 1650e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 166dad0a645SDavid Majnemer const GlobalVariable *&GVar) { 1670e309fe8SRafael Espindola const GlobalValue *GVal = M.getNamedValue(ComdatName); 168dad0a645SDavid Majnemer if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 169dad0a645SDavid Majnemer GVal = GA->getBaseObject(); 170dad0a645SDavid Majnemer if (!GVal) 171dad0a645SDavid Majnemer // We cannot resolve the size of the aliasee yet. 172dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 173dad0a645SDavid Majnemer "': COMDAT key involves incomputable alias size."); 174dad0a645SDavid Majnemer } 175dad0a645SDavid Majnemer 176dad0a645SDavid Majnemer GVar = dyn_cast_or_null<GlobalVariable>(GVal); 177dad0a645SDavid Majnemer if (!GVar) 178dad0a645SDavid Majnemer return emitError( 179dad0a645SDavid Majnemer "Linking COMDATs named '" + ComdatName + 180dad0a645SDavid Majnemer "': GlobalVariable required for data dependent selection!"); 181dad0a645SDavid Majnemer 182dad0a645SDavid Majnemer return false; 183dad0a645SDavid Majnemer } 184dad0a645SDavid Majnemer 185dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 186dad0a645SDavid Majnemer Comdat::SelectionKind Src, 187dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 188dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 189dad0a645SDavid Majnemer bool &LinkFromSrc) { 190caabe228SRafael Espindola Module &DstM = Mover.getModule(); 191dad0a645SDavid Majnemer // The ability to mix Comdat::SelectionKind::Any with 192dad0a645SDavid Majnemer // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 193dad0a645SDavid Majnemer bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 194dad0a645SDavid Majnemer Dst == Comdat::SelectionKind::Largest; 195dad0a645SDavid Majnemer bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 196dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest; 197dad0a645SDavid Majnemer if (DstAnyOrLargest && SrcAnyOrLargest) { 198dad0a645SDavid Majnemer if (Dst == Comdat::SelectionKind::Largest || 199dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest) 200dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Largest; 201dad0a645SDavid Majnemer else 202dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Any; 203dad0a645SDavid Majnemer } else if (Src == Dst) { 204dad0a645SDavid Majnemer Result = Dst; 205dad0a645SDavid Majnemer } else { 206dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 207dad0a645SDavid Majnemer "': invalid selection kinds!"); 208dad0a645SDavid Majnemer } 209dad0a645SDavid Majnemer 210dad0a645SDavid Majnemer switch (Result) { 211dad0a645SDavid Majnemer case Comdat::SelectionKind::Any: 212dad0a645SDavid Majnemer // Go with Dst. 213dad0a645SDavid Majnemer LinkFromSrc = false; 214dad0a645SDavid Majnemer break; 215dad0a645SDavid Majnemer case Comdat::SelectionKind::NoDuplicates: 216dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 217dad0a645SDavid Majnemer "': noduplicates has been violated!"); 218dad0a645SDavid Majnemer case Comdat::SelectionKind::ExactMatch: 219dad0a645SDavid Majnemer case Comdat::SelectionKind::Largest: 220dad0a645SDavid Majnemer case Comdat::SelectionKind::SameSize: { 221dad0a645SDavid Majnemer const GlobalVariable *DstGV; 222dad0a645SDavid Majnemer const GlobalVariable *SrcGV; 223dad0a645SDavid Majnemer if (getComdatLeader(DstM, ComdatName, DstGV) || 224*40358fb8SRafael Espindola getComdatLeader(*SrcM, ComdatName, SrcGV)) 225dad0a645SDavid Majnemer return true; 226dad0a645SDavid Majnemer 2270e309fe8SRafael Espindola const DataLayout &DstDL = DstM.getDataLayout(); 228*40358fb8SRafael Espindola const DataLayout &SrcDL = SrcM->getDataLayout(); 2295f6eaac6SManuel Jacob uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType()); 2305f6eaac6SManuel Jacob uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType()); 231dad0a645SDavid Majnemer if (Result == Comdat::SelectionKind::ExactMatch) { 232dad0a645SDavid Majnemer if (SrcGV->getInitializer() != DstGV->getInitializer()) 233dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 234dad0a645SDavid Majnemer "': ExactMatch violated!"); 235dad0a645SDavid Majnemer LinkFromSrc = false; 236dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::Largest) { 237dad0a645SDavid Majnemer LinkFromSrc = SrcSize > DstSize; 238dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::SameSize) { 239dad0a645SDavid Majnemer if (SrcSize != DstSize) 240dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 241dad0a645SDavid Majnemer "': SameSize violated!"); 242dad0a645SDavid Majnemer LinkFromSrc = false; 243dad0a645SDavid Majnemer } else { 244dad0a645SDavid Majnemer llvm_unreachable("unknown selection kind"); 245dad0a645SDavid Majnemer } 246dad0a645SDavid Majnemer break; 247dad0a645SDavid Majnemer } 248dad0a645SDavid Majnemer } 249dad0a645SDavid Majnemer 250dad0a645SDavid Majnemer return false; 251dad0a645SDavid Majnemer } 252dad0a645SDavid Majnemer 253dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC, 254dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 255dad0a645SDavid Majnemer bool &LinkFromSrc) { 256caabe228SRafael Espindola Module &DstM = Mover.getModule(); 257b16196a3SRafael Espindola Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 258dad0a645SDavid Majnemer StringRef ComdatName = SrcC->getName(); 2590e309fe8SRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 260dad0a645SDavid Majnemer Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 2612ef3f299SRafael Espindola 262b16196a3SRafael Espindola if (DstCI == ComdatSymTab.end()) { 263b16196a3SRafael Espindola // Use the comdat if it is only available in one of the modules. 264b16196a3SRafael Espindola LinkFromSrc = true; 265b16196a3SRafael Espindola Result = SSK; 2662ef3f299SRafael Espindola return false; 267b16196a3SRafael Espindola } 2682ef3f299SRafael Espindola 269dad0a645SDavid Majnemer const Comdat *DstC = &DstCI->second; 270dad0a645SDavid Majnemer Comdat::SelectionKind DSK = DstC->getSelectionKind(); 2712ef3f299SRafael Espindola return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 2722ef3f299SRafael Espindola LinkFromSrc); 273dad0a645SDavid Majnemer } 274f6f121e2SJames Molloy 275d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 276d12b4a33SRafael Espindola const GlobalValue &Dest, 277dbb0bd1aSRafael Espindola const GlobalValue &Src) { 278e5a61917STeresa Johnson 279e868123dSDuncan P. N. Exon Smith // Should we unconditionally use the Src? 280020d4fb1SArtem Belevich if (shouldOverrideFromSrc()) { 281e868123dSDuncan P. N. Exon Smith LinkFromSrc = true; 282e868123dSDuncan P. N. Exon Smith return false; 283e868123dSDuncan P. N. Exon Smith } 284e868123dSDuncan P. N. Exon Smith 285778fcc77SRafael Espindola // We always have to add Src if it has appending linkage. 286778fcc77SRafael Espindola if (Src.hasAppendingLinkage()) { 2871e20a652STeresa Johnson // Should have prevented importing for appending linkage in linkIfNeeded. 288c7ed52f2STeresa Johnson assert(!isPerformingImport()); 289778fcc77SRafael Espindola LinkFromSrc = true; 290778fcc77SRafael Espindola return false; 291778fcc77SRafael Espindola } 292778fcc77SRafael Espindola 293d4bcefc7SRafael Espindola bool SrcIsDeclaration = Src.isDeclarationForLinker(); 294d4bcefc7SRafael Espindola bool DestIsDeclaration = Dest.isDeclarationForLinker(); 295dbb0bd1aSRafael Espindola 296c7ed52f2STeresa Johnson if (isPerformingImport()) { 297c7ed52f2STeresa Johnson if (isa<Function>(&Src)) { 2984f04d85fSTeresa Johnson // For functions, LinkFromSrc iff this is a function requested 299c7ed52f2STeresa Johnson // for importing. For variables, decide below normally. 3004f04d85fSTeresa Johnson LinkFromSrc = FunctionsToImport->count(&Src); 301c7ed52f2STeresa Johnson return false; 302c7ed52f2STeresa Johnson } 303c7ed52f2STeresa Johnson 304c7ed52f2STeresa Johnson // Check if this is an alias with an already existing definition 305c7ed52f2STeresa Johnson // in Dest, which must have come from a prior importing pass from 306c7ed52f2STeresa Johnson // the same Src module. Unlike imported function and variable 307c7ed52f2STeresa Johnson // definitions, which are imported as available_externally and are 308c7ed52f2STeresa Johnson // not definitions for the linker, that is not a valid linkage for 309c7ed52f2STeresa Johnson // imported aliases which must be definitions. Simply use the existing 310c7ed52f2STeresa Johnson // Dest copy. 311c7ed52f2STeresa Johnson if (isa<GlobalAlias>(&Src) && !DestIsDeclaration) { 312c7ed52f2STeresa Johnson assert(isa<GlobalAlias>(&Dest)); 313c7ed52f2STeresa Johnson LinkFromSrc = false; 314c7ed52f2STeresa Johnson return false; 315c7ed52f2STeresa Johnson } 316c7ed52f2STeresa Johnson } 317c7ed52f2STeresa Johnson 318dbb0bd1aSRafael Espindola if (SrcIsDeclaration) { 319dbb0bd1aSRafael Espindola // If Src is external or if both Src & Dest are external.. Just link the 320dbb0bd1aSRafael Espindola // external globals, we aren't adding anything. 321d12b4a33SRafael Espindola if (Src.hasDLLImportStorageClass()) { 322dbb0bd1aSRafael Espindola // If one of GVs is marked as DLLImport, result should be dllimport'ed. 323d12b4a33SRafael Espindola LinkFromSrc = DestIsDeclaration; 324d12b4a33SRafael Espindola return false; 325d12b4a33SRafael Espindola } 326dbb0bd1aSRafael Espindola // If the Dest is weak, use the source linkage. 327ed11bd28SRafael Espindola if (Dest.hasExternalWeakLinkage()) { 328ed11bd28SRafael Espindola LinkFromSrc = true; 329ed11bd28SRafael Espindola return false; 330ed11bd28SRafael Espindola } 331ed11bd28SRafael Espindola // Link an available_externally over a declaration. 332ed11bd28SRafael Espindola LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 333d12b4a33SRafael Espindola return false; 334dbb0bd1aSRafael Espindola } 335dbb0bd1aSRafael Espindola 336d12b4a33SRafael Espindola if (DestIsDeclaration) { 337dbb0bd1aSRafael Espindola // If Dest is external but Src is not: 338d12b4a33SRafael Espindola LinkFromSrc = true; 339d12b4a33SRafael Espindola return false; 340d12b4a33SRafael Espindola } 341dbb0bd1aSRafael Espindola 3420910605aSRafael Espindola if (Src.hasCommonLinkage()) { 343d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 344d12b4a33SRafael Espindola LinkFromSrc = true; 3450910605aSRafael Espindola return false; 346d12b4a33SRafael Espindola } 347d12b4a33SRafael Espindola 348d12b4a33SRafael Espindola if (!Dest.hasCommonLinkage()) { 349d12b4a33SRafael Espindola LinkFromSrc = false; 350d12b4a33SRafael Espindola return false; 351d12b4a33SRafael Espindola } 3520910605aSRafael Espindola 353a28d91d8SMehdi Amini const DataLayout &DL = Dest.getParent()->getDataLayout(); 3545f6eaac6SManuel Jacob uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType()); 3555f6eaac6SManuel Jacob uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType()); 356d12b4a33SRafael Espindola LinkFromSrc = SrcSize > DestSize; 357d12b4a33SRafael Espindola return false; 3580910605aSRafael Espindola } 3590910605aSRafael Espindola 360dbb0bd1aSRafael Espindola if (Src.isWeakForLinker()) { 361dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 362dbb0bd1aSRafael Espindola assert(!Dest.hasAvailableExternallyLinkage()); 3630910605aSRafael Espindola 364d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 365d12b4a33SRafael Espindola LinkFromSrc = true; 366d12b4a33SRafael Espindola return false; 367d12b4a33SRafael Espindola } 368dbb0bd1aSRafael Espindola 369d12b4a33SRafael Espindola LinkFromSrc = false; 3700910605aSRafael Espindola return false; 371dbb0bd1aSRafael Espindola } 372dbb0bd1aSRafael Espindola 373dbb0bd1aSRafael Espindola if (Dest.isWeakForLinker()) { 374dbb0bd1aSRafael Espindola assert(Src.hasExternalLinkage()); 375d12b4a33SRafael Espindola LinkFromSrc = true; 376d12b4a33SRafael Espindola return false; 377dbb0bd1aSRafael Espindola } 378dbb0bd1aSRafael Espindola 379dbb0bd1aSRafael Espindola assert(!Src.hasExternalWeakLinkage()); 380dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 381dbb0bd1aSRafael Espindola assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 382dbb0bd1aSRafael Espindola "Unexpected linkage type!"); 383dbb0bd1aSRafael Espindola return emitError("Linking globals named '" + Src.getName() + 384dbb0bd1aSRafael Espindola "': symbol multiply defined!"); 385dbb0bd1aSRafael Espindola } 386dbb0bd1aSRafael Espindola 387baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 388baa3bf8fSRafael Espindola GlobalValue *DGV = getLinkedToGlobal(&GV); 389baa3bf8fSRafael Espindola 390baa3bf8fSRafael Espindola if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 391baa3bf8fSRafael Espindola return false; 392baa3bf8fSRafael Espindola 3934b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 3944b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 3954b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 3964b5ec263SRafael Espindola if (DGVar && SGVar) { 3974b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 3984b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 3994b5ec263SRafael Espindola DGVar->setConstant(false); 4004b5ec263SRafael Espindola SGVar->setConstant(false); 4014b5ec263SRafael Espindola } 4024b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 4034b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 4044b5ec263SRafael Espindola SGVar->setAlignment(Align); 4054b5ec263SRafael Espindola DGVar->setAlignment(Align); 4064b5ec263SRafael Espindola } 4074b5ec263SRafael Espindola } 4084b5ec263SRafael Espindola 409baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 410baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 411baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 412baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 4134b5ec263SRafael Espindola 4144b5ec263SRafael Espindola bool HasUnnamedAddr = GV.hasUnnamedAddr() && DGV->hasUnnamedAddr(); 4154b5ec263SRafael Espindola DGV->setUnnamedAddr(HasUnnamedAddr); 4164b5ec263SRafael Espindola GV.setUnnamedAddr(HasUnnamedAddr); 417baa3bf8fSRafael Espindola } 418baa3bf8fSRafael Espindola 4194b5ec263SRafael Espindola // Don't want to append to global_ctors list, for example, when we 4204b5ec263SRafael Espindola // are importing for ThinLTO, otherwise the global ctors and dtors 4214b5ec263SRafael Espindola // get executed multiple times for local variables (the latter causing 4224b5ec263SRafael Espindola // double frees). 4234b5ec263SRafael Espindola if (GV.hasAppendingLinkage() && isPerformingImport()) 4244b5ec263SRafael Espindola return false; 4254b5ec263SRafael Espindola 4264b5ec263SRafael Espindola if (isPerformingImport() && !doImportAsDefinition(&GV)) 4274b5ec263SRafael Espindola return false; 4284b5ec263SRafael Espindola 4294b5ec263SRafael Espindola if (!DGV && !shouldOverrideFromSrc() && 4304b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 4314b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 4324b5ec263SRafael Espindola return false; 4334b5ec263SRafael Espindola 434bd03c503SRafael Espindola if (GV.isDeclaration()) 435bd03c503SRafael Espindola return false; 436bd03c503SRafael Espindola 437baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 438baa3bf8fSRafael Espindola bool LinkFromSrc; 439baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 440baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 4414b5ec263SRafael Espindola if (LinkFromSrc) 4424b5ec263SRafael Espindola ValuesToLink.insert(&GV); 443baa3bf8fSRafael Espindola return false; 444baa3bf8fSRafael Espindola } 445baa3bf8fSRafael Espindola 4464b5ec263SRafael Espindola bool LinkFromSrc = true; 4474b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 4484b5ec263SRafael Espindola return true; 4494b5ec263SRafael Espindola if (LinkFromSrc) 4504b5ec263SRafael Espindola ValuesToLink.insert(&GV); 451baa3bf8fSRafael Espindola return false; 452baa3bf8fSRafael Espindola } 453baa3bf8fSRafael Espindola 454caabe228SRafael Espindola void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) { 455caabe228SRafael Espindola // Add these to the internalize list 456caabe228SRafael Espindola if (!GV.hasLinkOnceLinkage()) 457caabe228SRafael Espindola return; 458caabe228SRafael Espindola 459caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) 460caabe228SRafael Espindola Internalize.insert(GV.getName()); 461caabe228SRafael Espindola Add(GV); 462caabe228SRafael Espindola 463caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 464caabe228SRafael Espindola if (!SC) 465caabe228SRafael Espindola return; 466caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) { 467caabe228SRafael Espindola if (!GV2->hasLocalLinkage() && shouldInternalizeLinkedSymbols()) 468caabe228SRafael Espindola Internalize.insert(GV2->getName()); 469caabe228SRafael Espindola Add(*GV2); 470caabe228SRafael Espindola } 471caabe228SRafael Espindola } 472caabe228SRafael Espindola 473b1ed91f3SChris Lattner bool ModuleLinker::run() { 474*40358fb8SRafael Espindola for (const auto &SMEC : SrcM->getComdatSymbolTable()) { 475dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 476dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 477dad0a645SDavid Majnemer continue; 478dad0a645SDavid Majnemer Comdat::SelectionKind SK; 479dad0a645SDavid Majnemer bool LinkFromSrc; 480dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 481dad0a645SDavid Majnemer return true; 482dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 483dad0a645SDavid Majnemer } 484dad0a645SDavid Majnemer 485*40358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 486baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 487baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GV); 488baa3bf8fSRafael Espindola 489*40358fb8SRafael Espindola for (Function &SF : *SrcM) 490baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 491baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&SF); 492baa3bf8fSRafael Espindola 493*40358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 494baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 495baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GA); 496baa3bf8fSRafael Espindola 497b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 498b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 499*40358fb8SRafael Espindola for (GlobalVariable &GV : SrcM->globals()) 500baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 501b1ed91f3SChris Lattner return true; 502b1ed91f3SChris Lattner 503*40358fb8SRafael Espindola for (Function &SF : *SrcM) 504baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 505b1ed91f3SChris Lattner return true; 506b1ed91f3SChris Lattner 507*40358fb8SRafael Espindola for (GlobalAlias &GA : SrcM->aliases()) 508baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 509b1ed91f3SChris Lattner return true; 510b1ed91f3SChris Lattner 5114504c1bcSTeresa Johnson if (ImportIndex) { 512*40358fb8SRafael Espindola FunctionImportGlobalProcessing ThinLTOProcessing(*SrcM, ImportIndex, 5134504c1bcSTeresa Johnson FunctionsToImport); 5144504c1bcSTeresa Johnson if (ThinLTOProcessing.run()) 5154504c1bcSTeresa Johnson return true; 5164504c1bcSTeresa Johnson for (auto *GV : ThinLTOProcessing.getNewExportedValues()) 5174504c1bcSTeresa Johnson ValuesToLink.insert(GV); 5184504c1bcSTeresa Johnson } 519caabe228SRafael Espindola 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; 525caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) 526caabe228SRafael Espindola ValuesToLink.insert(GV2); 527caabe228SRafael Espindola } 528caabe228SRafael Espindola 529caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) { 530caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 531caabe228SRafael Espindola Internalize.insert(GV->getName()); 532caabe228SRafael Espindola } 533caabe228SRafael Espindola 534*40358fb8SRafael Espindola if (Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(), 535caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 536caabe228SRafael Espindola addLazyFor(GV, Add); 537e5a61917STeresa Johnson }, 538e5a61917STeresa Johnson ValIDToTempMDMap, false)) 5394b5ec263SRafael Espindola return true; 540caabe228SRafael Espindola Module &DstM = Mover.getModule(); 541caabe228SRafael Espindola for (auto &P : Internalize) { 542caabe228SRafael Espindola GlobalValue *GV = DstM.getNamedValue(P.first()); 543caabe228SRafael Espindola GV->setLinkage(GlobalValue::InternalLinkage); 544beadd56aSRafael Espindola } 545beadd56aSRafael Espindola 5462609888fSAnton Korobeynikov return false; 5472609888fSAnton Korobeynikov } 548361e513dSReid Spencer 5499d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {} 5503df61b7bSRafael Espindola 551434e9561SRafael Espindola bool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags, 5528220e8a8SMehdi Amini const FunctionInfoIndex *Index, 553e5a61917STeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport, 554e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) { 555*40358fb8SRafael Espindola ModuleLinker ModLinker(Mover, std::move(Src), Flags, Index, FunctionsToImport, 556e5a61917STeresa Johnson ValIDToTempMDMap); 557bef54363STeresa Johnson return ModLinker.run(); 558434e9561SRafael Espindola } 559434e9561SRafael Espindola 560*40358fb8SRafael Espindola bool Linker::linkInMetadata(std::unique_ptr<Module> Src, 561e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) { 562e5a61917STeresa Johnson SetVector<GlobalValue *> ValuesToLink; 563e5a61917STeresa Johnson if (Mover.move( 564*40358fb8SRafael Espindola std::move(Src), ValuesToLink.getArrayRef(), 565e5a61917STeresa Johnson [this](GlobalValue &GV, IRMover::ValueAdder Add) { assert(false); }, 566e5a61917STeresa Johnson ValIDToTempMDMap, true)) 567e5a61917STeresa Johnson return true; 568e5a61917STeresa Johnson return false; 569e5a61917STeresa Johnson } 570e5a61917STeresa Johnson 571b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 572b1ed91f3SChris Lattner // LinkModules entrypoint. 573b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 574b1ed91f3SChris Lattner 57518c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 57618c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 57718c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 57818c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 57918c89411SRafael Espindola /// relied on to be consistent. 580434e9561SRafael Espindola bool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src, 581434e9561SRafael Espindola unsigned Flags) { 5829d2bfc48SRafael Espindola Linker L(Dest); 583434e9561SRafael Espindola return L.linkInModule(std::move(Src), Flags); 5844160f5d3SRafael Espindola } 5854160f5d3SRafael Espindola 586a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 587a3aeb980SBill Wendling // C API. 588a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 589a3aeb980SBill Wendling 590434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 591434e9561SRafael Espindola Module *D = unwrap(Dest); 592434e9561SRafael Espindola std::unique_ptr<Module> M(unwrap(Src)); 593434e9561SRafael Espindola return Linker::linkModules(*D, std::move(M)); 594434e9561SRafael Espindola } 595