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 146cc07df4SChandler Carruth #include "llvm/Linker/Linker.h" 15caabe228SRafael Espindola #include "LinkDiagnosticInfo.h" 16ed0881b2SChandler Carruth #include "llvm-c/Linker.h" 1766f02413SBill Wendling #include "llvm/ADT/SetVector.h" 18caabe228SRafael Espindola #include "llvm/ADT/StringSet.h" 19d12b4a33SRafael Espindola #include "llvm/IR/DiagnosticPrinter.h" 209d2bfc48SRafael Espindola #include "llvm/IR/LLVMContext.h" 21361e513dSReid Spencer using namespace llvm; 22361e513dSReid Spencer 23b1ed91f3SChris Lattner namespace { 24d12b4a33SRafael Espindola 2518c89411SRafael Espindola /// This is an implementation class for the LinkModules function, which is the 2618c89411SRafael Espindola /// entrypoint for this file. 27b1ed91f3SChris Lattner class ModuleLinker { 28caabe228SRafael Espindola IRMover &Mover; 290e309fe8SRafael Espindola Module &SrcM; 30b1ed91f3SChris Lattner 314b5ec263SRafael Espindola SetVector<GlobalValue *> ValuesToLink; 32caabe228SRafael Espindola StringSet<> Internalize; 334160f5d3SRafael Espindola 34e868123dSDuncan P. N. Exon Smith /// For symbol clashes, prefer those from Src. 35020d4fb1SArtem Belevich unsigned Flags; 36e868123dSDuncan P. N. Exon Smith 37c7ed52f2STeresa Johnson /// Function index passed into ModuleLinker for using in function 38c7ed52f2STeresa Johnson /// importing/exporting handling. 398220e8a8SMehdi Amini const FunctionInfoIndex *ImportIndex; 40c7ed52f2STeresa Johnson 41*4f04d85fSTeresa Johnson /// Functions to import from source module, all other functions are 42c7ed52f2STeresa Johnson /// imported as declarations instead of definitions. 43*4f04d85fSTeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport; 44c7ed52f2STeresa Johnson 45c7ed52f2STeresa Johnson /// Set to true if the given FunctionInfoIndex contains any functions 46c7ed52f2STeresa Johnson /// from this source module, in which case we must conservatively assume 47c7ed52f2STeresa Johnson /// that any of its functions may be imported into another module 48c7ed52f2STeresa Johnson /// as part of a different backend compilation process. 49af714765SRafael Espindola bool HasExportedFunctions = false; 50c7ed52f2STeresa Johnson 51e5a61917STeresa Johnson /// Association between metadata value id and temporary metadata that 52e5a61917STeresa Johnson /// remains unmapped after function importing. Saved during function 53e5a61917STeresa Johnson /// importing and consumed during the metadata linking postpass. 54e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap; 55e5a61917STeresa Johnson 56caabe228SRafael Espindola /// Used as the callback for lazy linking. 57caabe228SRafael Espindola /// The mover has just hit GV and we have to decide if it, and other members 58caabe228SRafael Espindola /// of the same comdat, should be linked. Every member to be linked is passed 59caabe228SRafael Espindola /// to Add. 60caabe228SRafael Espindola void addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add); 61baa3bf8fSRafael Espindola 62020d4fb1SArtem Belevich bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 63020d4fb1SArtem Belevich bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 64020d4fb1SArtem Belevich bool shouldInternalizeLinkedSymbols() { 65020d4fb1SArtem Belevich return Flags & Linker::InternalizeLinkedSymbols; 66020d4fb1SArtem Belevich } 67020d4fb1SArtem Belevich 68c7ed52f2STeresa Johnson /// Check if we should promote the given local value to global scope. 69c7ed52f2STeresa Johnson bool doPromoteLocalToGlobal(const GlobalValue *SGV); 70c7ed52f2STeresa Johnson 71d12b4a33SRafael Espindola bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 72d12b4a33SRafael Espindola const GlobalValue &Src); 73dbb0bd1aSRafael Espindola 74caabe228SRafael Espindola /// Should we have mover and linker error diag info? 75b1ed91f3SChris Lattner bool emitError(const Twine &Message) { 769d2bfc48SRafael Espindola SrcM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 77b1ed91f3SChris Lattner return true; 78b1ed91f3SChris Lattner } 79b1ed91f3SChris Lattner 800e309fe8SRafael Espindola bool getComdatLeader(Module &M, StringRef ComdatName, 81dad0a645SDavid Majnemer const GlobalVariable *&GVar); 82dad0a645SDavid Majnemer bool computeResultingSelectionKind(StringRef ComdatName, 83dad0a645SDavid Majnemer Comdat::SelectionKind Src, 84dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 85dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 86dad0a645SDavid Majnemer bool &LinkFromSrc); 87dad0a645SDavid Majnemer std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 88dad0a645SDavid Majnemer ComdatsChosen; 89dad0a645SDavid Majnemer bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 90dad0a645SDavid Majnemer bool &LinkFromSrc); 912d5fb8caSTeresa Johnson // Keep track of the global value members of each comdat in source. 922d5fb8caSTeresa Johnson DenseMap<const Comdat *, std::vector<GlobalValue *>> ComdatMembers; 93dad0a645SDavid Majnemer 9418c89411SRafael Espindola /// Given a global in the source module, return the global in the 9518c89411SRafael Espindola /// destination module that is being linked to, if any. 963e8bc6a8SRafael Espindola GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 97caabe228SRafael Espindola Module &DstM = Mover.getModule(); 98b1ed91f3SChris Lattner // If the source has no name it can't link. If it has local linkage, 99b1ed91f3SChris Lattner // there is no name match-up going on. 100b098f0c1STeresa Johnson if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(getLinkage(SrcGV))) 1012617dcceSCraig Topper return nullptr; 102b1ed91f3SChris Lattner 103b1ed91f3SChris Lattner // Otherwise see if we have a match in the destination module's symtab. 1040e309fe8SRafael Espindola GlobalValue *DGV = DstM.getNamedValue(getName(SrcGV)); 105c84f608bSRafael Espindola if (!DGV) 106c84f608bSRafael Espindola return nullptr; 107b1ed91f3SChris Lattner 108b1ed91f3SChris Lattner // If we found a global with the same name in the dest module, but it has 109b1ed91f3SChris Lattner // internal linkage, we are really not doing any linkage here. 110b1ed91f3SChris Lattner if (DGV->hasLocalLinkage()) 1112617dcceSCraig Topper return nullptr; 112b1ed91f3SChris Lattner 113b1ed91f3SChris Lattner // Otherwise, we do in fact link to the destination global. 114b1ed91f3SChris Lattner return DGV; 115b1ed91f3SChris Lattner } 116b1ed91f3SChris Lattner 117baa3bf8fSRafael Espindola bool linkIfNeeded(GlobalValue &GV); 118c7ed52f2STeresa Johnson 119c7ed52f2STeresa Johnson /// Helper methods to check if we are importing from or potentially 120c7ed52f2STeresa Johnson /// exporting from the current source module. 121*4f04d85fSTeresa Johnson bool isPerformingImport() const { return FunctionsToImport != nullptr; } 1224a9bf587STeresa Johnson bool isModuleExporting() const { return HasExportedFunctions; } 123c7ed52f2STeresa Johnson 124c7ed52f2STeresa Johnson /// If we are importing from the source module, checks if we should 125c7ed52f2STeresa Johnson /// import SGV as a definition, otherwise import as a declaration. 126c7ed52f2STeresa Johnson bool doImportAsDefinition(const GlobalValue *SGV); 127c7ed52f2STeresa Johnson 128c7ed52f2STeresa Johnson /// Get the name for SGV that should be used in the linked destination 129c7ed52f2STeresa Johnson /// module. Specifically, this handles the case where we need to rename 130c7ed52f2STeresa Johnson /// a local that is being promoted to global scope. 131c7ed52f2STeresa Johnson std::string getName(const GlobalValue *SGV); 132c7ed52f2STeresa Johnson 133caabe228SRafael Espindola /// Process globals so that they can be used in ThinLTO. This includes 134caabe228SRafael Espindola /// promoting local variables so that they can be reference externally by 135caabe228SRafael Espindola /// thin lto imported globals and converting strong external globals to 136caabe228SRafael Espindola /// available_externally. 137caabe228SRafael Espindola void processGlobalsForThinLTO(); 138caabe228SRafael Espindola void processGlobalForThinLTO(GlobalValue &GV); 139caabe228SRafael Espindola 140c7ed52f2STeresa Johnson /// Get the new linkage for SGV that should be used in the linked destination 141c7ed52f2STeresa Johnson /// module. Specifically, for ThinLTO importing or exporting it may need 142c7ed52f2STeresa Johnson /// to be adjusted. 143c7ed52f2STeresa Johnson GlobalValue::LinkageTypes getLinkage(const GlobalValue *SGV); 144c7ed52f2STeresa Johnson 145d57f9f0cSRafael Espindola public: 146caabe228SRafael Espindola ModuleLinker(IRMover &Mover, Module &SrcM, unsigned Flags, 147d57f9f0cSRafael Espindola const FunctionInfoIndex *Index = nullptr, 148e5a61917STeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport = nullptr, 149e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap = nullptr) 150caabe228SRafael Espindola : Mover(Mover), SrcM(SrcM), Flags(Flags), ImportIndex(Index), 151*4f04d85fSTeresa Johnson FunctionsToImport(FunctionsToImport), 152*4f04d85fSTeresa Johnson ValIDToTempMDMap(ValIDToTempMDMap) { 153*4f04d85fSTeresa Johnson assert((ImportIndex || !FunctionsToImport) && 154d57f9f0cSRafael Espindola "Expect a FunctionInfoIndex when importing"); 155d57f9f0cSRafael Espindola // If we have a FunctionInfoIndex but no function to import, 156d57f9f0cSRafael Espindola // then this is the primary module being compiled in a ThinLTO 157d57f9f0cSRafael Espindola // backend compilation, and we need to see if it has functions that 158d57f9f0cSRafael Espindola // may be exported to another backend compilation. 159*4f04d85fSTeresa Johnson if (ImportIndex && !FunctionsToImport) 160d57f9f0cSRafael Espindola HasExportedFunctions = ImportIndex->hasExportedFunctions(SrcM); 161*4f04d85fSTeresa Johnson assert((ValIDToTempMDMap || !FunctionsToImport) && 162e5a61917STeresa Johnson "Function importing must provide a ValIDToTempMDMap"); 163d57f9f0cSRafael Espindola } 164d57f9f0cSRafael Espindola 165d57f9f0cSRafael Espindola bool run(); 166eee6f995SChris Lattner }; 167f00654e3SAlexander Kornienko } 168d48b7783SBill Wendling 169c7ed52f2STeresa Johnson bool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) { 170c7ed52f2STeresa Johnson if (!isPerformingImport()) 171c7ed52f2STeresa Johnson return false; 1723cd8161cSTeresa Johnson auto *GA = dyn_cast<GlobalAlias>(SGV); 1733cd8161cSTeresa Johnson if (GA) { 1743cd8161cSTeresa Johnson if (GA->hasWeakAnyLinkage()) 1753cd8161cSTeresa Johnson return false; 17689345771SRafael Espindola const GlobalObject *GO = GA->getBaseObject(); 17789345771SRafael Espindola if (!GO->hasLinkOnceODRLinkage()) 17889345771SRafael Espindola return false; 17989345771SRafael Espindola return doImportAsDefinition(GO); 1803cd8161cSTeresa Johnson } 181dfbebc37STeresa Johnson // Always import GlobalVariable definitions, except for the special 182dfbebc37STeresa Johnson // case of WeakAny which are imported as ExternalWeak declarations 183dfbebc37STeresa Johnson // (see comments in ModuleLinker::getLinkage). The linkage changes 184c7ed52f2STeresa Johnson // described in ModuleLinker::getLinkage ensure the correct behavior (e.g. 185c7ed52f2STeresa Johnson // global variables with external linkage are transformed to 1863cd8161cSTeresa Johnson // available_externally definitions, which are ultimately turned into 1873cd8161cSTeresa Johnson // declarations after the EliminateAvailableExternally pass). 18866059c9fSCraig Topper if (isa<GlobalVariable>(SGV) && !SGV->isDeclaration() && 1893cd8161cSTeresa Johnson !SGV->hasWeakAnyLinkage()) 190c7ed52f2STeresa Johnson return true; 191c7ed52f2STeresa Johnson // Only import the function requested for importing. 192c7ed52f2STeresa Johnson auto *SF = dyn_cast<Function>(SGV); 193*4f04d85fSTeresa Johnson if (SF && FunctionsToImport->count(SF)) 194c7ed52f2STeresa Johnson return true; 195c7ed52f2STeresa Johnson // Otherwise no. 196c7ed52f2STeresa Johnson return false; 197c7ed52f2STeresa Johnson } 198c7ed52f2STeresa Johnson 199c7ed52f2STeresa Johnson bool ModuleLinker::doPromoteLocalToGlobal(const GlobalValue *SGV) { 200c7ed52f2STeresa Johnson assert(SGV->hasLocalLinkage()); 201c7ed52f2STeresa Johnson // Both the imported references and the original local variable must 202c7ed52f2STeresa Johnson // be promoted. 203c7ed52f2STeresa Johnson if (!isPerformingImport() && !isModuleExporting()) 204c7ed52f2STeresa Johnson return false; 205c7ed52f2STeresa Johnson 206c7ed52f2STeresa Johnson // Local const variables never need to be promoted unless they are address 207c7ed52f2STeresa Johnson // taken. The imported uses can simply use the clone created in this module. 208c7ed52f2STeresa Johnson // For now we are conservative in determining which variables are not 209c7ed52f2STeresa Johnson // address taken by checking the unnamed addr flag. To be more aggressive, 210c7ed52f2STeresa Johnson // the address taken information must be checked earlier during parsing 211c7ed52f2STeresa Johnson // of the module and recorded in the function index for use when importing 212c7ed52f2STeresa Johnson // from that module. 213c7ed52f2STeresa Johnson auto *GVar = dyn_cast<GlobalVariable>(SGV); 214c7ed52f2STeresa Johnson if (GVar && GVar->isConstant() && GVar->hasUnnamedAddr()) 215c7ed52f2STeresa Johnson return false; 216c7ed52f2STeresa Johnson 217c7ed52f2STeresa Johnson // Eventually we only need to promote functions in the exporting module that 218c7ed52f2STeresa Johnson // are referenced by a potentially exported function (i.e. one that is in the 219c7ed52f2STeresa Johnson // function index). 220c7ed52f2STeresa Johnson return true; 221c7ed52f2STeresa Johnson } 222c7ed52f2STeresa Johnson 223c7ed52f2STeresa Johnson std::string ModuleLinker::getName(const GlobalValue *SGV) { 224c7ed52f2STeresa Johnson // For locals that must be promoted to global scope, ensure that 225c7ed52f2STeresa Johnson // the promoted name uniquely identifies the copy in the original module, 226c7ed52f2STeresa Johnson // using the ID assigned during combined index creation. When importing, 227c7ed52f2STeresa Johnson // we rename all locals (not just those that are promoted) in order to 228c7ed52f2STeresa Johnson // avoid naming conflicts between locals imported from different modules. 229c7ed52f2STeresa Johnson if (SGV->hasLocalLinkage() && 230c7ed52f2STeresa Johnson (doPromoteLocalToGlobal(SGV) || isPerformingImport())) 231c7ed52f2STeresa Johnson return FunctionInfoIndex::getGlobalNameForLocal( 232c7ed52f2STeresa Johnson SGV->getName(), 233c7ed52f2STeresa Johnson ImportIndex->getModuleId(SGV->getParent()->getModuleIdentifier())); 234c7ed52f2STeresa Johnson return SGV->getName(); 235c7ed52f2STeresa Johnson } 236c7ed52f2STeresa Johnson 237c7ed52f2STeresa Johnson GlobalValue::LinkageTypes ModuleLinker::getLinkage(const GlobalValue *SGV) { 238c7ed52f2STeresa Johnson // Any local variable that is referenced by an exported function needs 239c7ed52f2STeresa Johnson // to be promoted to global scope. Since we don't currently know which 240c7ed52f2STeresa Johnson // functions reference which local variables/functions, we must treat 241c7ed52f2STeresa Johnson // all as potentially exported if this module is exporting anything. 242c7ed52f2STeresa Johnson if (isModuleExporting()) { 243c7ed52f2STeresa Johnson if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV)) 244c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 245c7ed52f2STeresa Johnson return SGV->getLinkage(); 246c7ed52f2STeresa Johnson } 247c7ed52f2STeresa Johnson 248c7ed52f2STeresa Johnson // Otherwise, if we aren't importing, no linkage change is needed. 249c7ed52f2STeresa Johnson if (!isPerformingImport()) 250c7ed52f2STeresa Johnson return SGV->getLinkage(); 251c7ed52f2STeresa Johnson 252c7ed52f2STeresa Johnson switch (SGV->getLinkage()) { 253c7ed52f2STeresa Johnson case GlobalValue::ExternalLinkage: 254c7ed52f2STeresa Johnson // External defnitions are converted to available_externally 255c7ed52f2STeresa Johnson // definitions upon import, so that they are available for inlining 256c7ed52f2STeresa Johnson // and/or optimization, but are turned into declarations later 257c7ed52f2STeresa Johnson // during the EliminateAvailableExternally pass. 2583cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 259c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 260c7ed52f2STeresa Johnson // An imported external declaration stays external. 261c7ed52f2STeresa Johnson return SGV->getLinkage(); 262c7ed52f2STeresa Johnson 263c7ed52f2STeresa Johnson case GlobalValue::AvailableExternallyLinkage: 264c7ed52f2STeresa Johnson // An imported available_externally definition converts 265c7ed52f2STeresa Johnson // to external if imported as a declaration. 266c7ed52f2STeresa Johnson if (!doImportAsDefinition(SGV)) 267c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 268c7ed52f2STeresa Johnson // An imported available_externally declaration stays that way. 269c7ed52f2STeresa Johnson return SGV->getLinkage(); 270c7ed52f2STeresa Johnson 271c7ed52f2STeresa Johnson case GlobalValue::LinkOnceAnyLinkage: 272c7ed52f2STeresa Johnson case GlobalValue::LinkOnceODRLinkage: 273c7ed52f2STeresa Johnson // These both stay the same when importing the definition. 274c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 275c7ed52f2STeresa Johnson return SGV->getLinkage(); 276c7ed52f2STeresa Johnson 277c7ed52f2STeresa Johnson case GlobalValue::WeakAnyLinkage: 278c7ed52f2STeresa Johnson // Can't import weak_any definitions correctly, or we might change the 279c7ed52f2STeresa Johnson // program semantics, since the linker will pick the first weak_any 280c7ed52f2STeresa Johnson // definition and importing would change the order they are seen by the 281c7ed52f2STeresa Johnson // linker. The module linking caller needs to enforce this. 282c7ed52f2STeresa Johnson assert(!doImportAsDefinition(SGV)); 283c7ed52f2STeresa Johnson // If imported as a declaration, it becomes external_weak. 284c7ed52f2STeresa Johnson return GlobalValue::ExternalWeakLinkage; 285c7ed52f2STeresa Johnson 286c7ed52f2STeresa Johnson case GlobalValue::WeakODRLinkage: 287c7ed52f2STeresa Johnson // For weak_odr linkage, there is a guarantee that all copies will be 288c7ed52f2STeresa Johnson // equivalent, so the issue described above for weak_any does not exist, 289c7ed52f2STeresa Johnson // and the definition can be imported. It can be treated similarly 290c7ed52f2STeresa Johnson // to an imported externally visible global value. 2913cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 292c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 293c7ed52f2STeresa Johnson else 294c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 295c7ed52f2STeresa Johnson 296c7ed52f2STeresa Johnson case GlobalValue::AppendingLinkage: 297c7ed52f2STeresa Johnson // It would be incorrect to import an appending linkage variable, 298c7ed52f2STeresa Johnson // since it would cause global constructors/destructors to be 299c7ed52f2STeresa Johnson // executed multiple times. This should have already been handled 3001e20a652STeresa Johnson // by linkIfNeeded, and we will assert in shouldLinkFromSource 3011e20a652STeresa Johnson // if we try to import, so we simply return AppendingLinkage here 3021e20a652STeresa Johnson // as this helper is called more widely in getLinkedToGlobal. 3031e20a652STeresa Johnson return GlobalValue::AppendingLinkage; 304c7ed52f2STeresa Johnson 305c7ed52f2STeresa Johnson case GlobalValue::InternalLinkage: 306c7ed52f2STeresa Johnson case GlobalValue::PrivateLinkage: 307c7ed52f2STeresa Johnson // If we are promoting the local to global scope, it is handled 308c7ed52f2STeresa Johnson // similarly to a normal externally visible global. 309c7ed52f2STeresa Johnson if (doPromoteLocalToGlobal(SGV)) { 3103cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 311c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 312c7ed52f2STeresa Johnson else 313c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 314c7ed52f2STeresa Johnson } 315c7ed52f2STeresa Johnson // A non-promoted imported local definition stays local. 316c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 317c7ed52f2STeresa Johnson return SGV->getLinkage(); 318c7ed52f2STeresa Johnson 319c7ed52f2STeresa Johnson case GlobalValue::ExternalWeakLinkage: 320c7ed52f2STeresa Johnson // External weak doesn't apply to definitions, must be a declaration. 321c7ed52f2STeresa Johnson assert(!doImportAsDefinition(SGV)); 322c7ed52f2STeresa Johnson // Linkage stays external_weak. 323c7ed52f2STeresa Johnson return SGV->getLinkage(); 324c7ed52f2STeresa Johnson 325c7ed52f2STeresa Johnson case GlobalValue::CommonLinkage: 326c7ed52f2STeresa Johnson // Linkage stays common on definitions. 327c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 328c7ed52f2STeresa Johnson return SGV->getLinkage(); 329c7ed52f2STeresa Johnson } 330c7ed52f2STeresa Johnson 331c7ed52f2STeresa Johnson llvm_unreachable("unknown linkage type"); 332c7ed52f2STeresa Johnson } 333c7ed52f2STeresa Johnson 334eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes 335eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A, 336eb5e0a77SRafael Espindola GlobalValue::VisibilityTypes B) { 337eb5e0a77SRafael Espindola if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 338eb5e0a77SRafael Espindola return GlobalValue::HiddenVisibility; 339eb5e0a77SRafael Espindola if (A == GlobalValue::ProtectedVisibility || 340eb5e0a77SRafael Espindola B == GlobalValue::ProtectedVisibility) 341eb5e0a77SRafael Espindola return GlobalValue::ProtectedVisibility; 342eb5e0a77SRafael Espindola return GlobalValue::DefaultVisibility; 343eb5e0a77SRafael Espindola } 344eb5e0a77SRafael Espindola 3450e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 346dad0a645SDavid Majnemer const GlobalVariable *&GVar) { 3470e309fe8SRafael Espindola const GlobalValue *GVal = M.getNamedValue(ComdatName); 348dad0a645SDavid Majnemer if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 349dad0a645SDavid Majnemer GVal = GA->getBaseObject(); 350dad0a645SDavid Majnemer if (!GVal) 351dad0a645SDavid Majnemer // We cannot resolve the size of the aliasee yet. 352dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 353dad0a645SDavid Majnemer "': COMDAT key involves incomputable alias size."); 354dad0a645SDavid Majnemer } 355dad0a645SDavid Majnemer 356dad0a645SDavid Majnemer GVar = dyn_cast_or_null<GlobalVariable>(GVal); 357dad0a645SDavid Majnemer if (!GVar) 358dad0a645SDavid Majnemer return emitError( 359dad0a645SDavid Majnemer "Linking COMDATs named '" + ComdatName + 360dad0a645SDavid Majnemer "': GlobalVariable required for data dependent selection!"); 361dad0a645SDavid Majnemer 362dad0a645SDavid Majnemer return false; 363dad0a645SDavid Majnemer } 364dad0a645SDavid Majnemer 365dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 366dad0a645SDavid Majnemer Comdat::SelectionKind Src, 367dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 368dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 369dad0a645SDavid Majnemer bool &LinkFromSrc) { 370caabe228SRafael Espindola Module &DstM = Mover.getModule(); 371dad0a645SDavid Majnemer // The ability to mix Comdat::SelectionKind::Any with 372dad0a645SDavid Majnemer // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 373dad0a645SDavid Majnemer bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 374dad0a645SDavid Majnemer Dst == Comdat::SelectionKind::Largest; 375dad0a645SDavid Majnemer bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 376dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest; 377dad0a645SDavid Majnemer if (DstAnyOrLargest && SrcAnyOrLargest) { 378dad0a645SDavid Majnemer if (Dst == Comdat::SelectionKind::Largest || 379dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest) 380dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Largest; 381dad0a645SDavid Majnemer else 382dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Any; 383dad0a645SDavid Majnemer } else if (Src == Dst) { 384dad0a645SDavid Majnemer Result = Dst; 385dad0a645SDavid Majnemer } else { 386dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 387dad0a645SDavid Majnemer "': invalid selection kinds!"); 388dad0a645SDavid Majnemer } 389dad0a645SDavid Majnemer 390dad0a645SDavid Majnemer switch (Result) { 391dad0a645SDavid Majnemer case Comdat::SelectionKind::Any: 392dad0a645SDavid Majnemer // Go with Dst. 393dad0a645SDavid Majnemer LinkFromSrc = false; 394dad0a645SDavid Majnemer break; 395dad0a645SDavid Majnemer case Comdat::SelectionKind::NoDuplicates: 396dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 397dad0a645SDavid Majnemer "': noduplicates has been violated!"); 398dad0a645SDavid Majnemer case Comdat::SelectionKind::ExactMatch: 399dad0a645SDavid Majnemer case Comdat::SelectionKind::Largest: 400dad0a645SDavid Majnemer case Comdat::SelectionKind::SameSize: { 401dad0a645SDavid Majnemer const GlobalVariable *DstGV; 402dad0a645SDavid Majnemer const GlobalVariable *SrcGV; 403dad0a645SDavid Majnemer if (getComdatLeader(DstM, ComdatName, DstGV) || 404dad0a645SDavid Majnemer getComdatLeader(SrcM, ComdatName, SrcGV)) 405dad0a645SDavid Majnemer return true; 406dad0a645SDavid Majnemer 4070e309fe8SRafael Espindola const DataLayout &DstDL = DstM.getDataLayout(); 4080e309fe8SRafael Espindola const DataLayout &SrcDL = SrcM.getDataLayout(); 409dad0a645SDavid Majnemer uint64_t DstSize = 41046a43556SMehdi Amini DstDL.getTypeAllocSize(DstGV->getType()->getPointerElementType()); 411dad0a645SDavid Majnemer uint64_t SrcSize = 41246a43556SMehdi Amini SrcDL.getTypeAllocSize(SrcGV->getType()->getPointerElementType()); 413dad0a645SDavid Majnemer if (Result == Comdat::SelectionKind::ExactMatch) { 414dad0a645SDavid Majnemer if (SrcGV->getInitializer() != DstGV->getInitializer()) 415dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 416dad0a645SDavid Majnemer "': ExactMatch violated!"); 417dad0a645SDavid Majnemer LinkFromSrc = false; 418dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::Largest) { 419dad0a645SDavid Majnemer LinkFromSrc = SrcSize > DstSize; 420dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::SameSize) { 421dad0a645SDavid Majnemer if (SrcSize != DstSize) 422dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 423dad0a645SDavid Majnemer "': SameSize violated!"); 424dad0a645SDavid Majnemer LinkFromSrc = false; 425dad0a645SDavid Majnemer } else { 426dad0a645SDavid Majnemer llvm_unreachable("unknown selection kind"); 427dad0a645SDavid Majnemer } 428dad0a645SDavid Majnemer break; 429dad0a645SDavid Majnemer } 430dad0a645SDavid Majnemer } 431dad0a645SDavid Majnemer 432dad0a645SDavid Majnemer return false; 433dad0a645SDavid Majnemer } 434dad0a645SDavid Majnemer 435dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC, 436dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 437dad0a645SDavid Majnemer bool &LinkFromSrc) { 438caabe228SRafael Espindola Module &DstM = Mover.getModule(); 439b16196a3SRafael Espindola Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 440dad0a645SDavid Majnemer StringRef ComdatName = SrcC->getName(); 4410e309fe8SRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 442dad0a645SDavid Majnemer Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 4432ef3f299SRafael Espindola 444b16196a3SRafael Espindola if (DstCI == ComdatSymTab.end()) { 445b16196a3SRafael Espindola // Use the comdat if it is only available in one of the modules. 446b16196a3SRafael Espindola LinkFromSrc = true; 447b16196a3SRafael Espindola Result = SSK; 4482ef3f299SRafael Espindola return false; 449b16196a3SRafael Espindola } 4502ef3f299SRafael Espindola 451dad0a645SDavid Majnemer const Comdat *DstC = &DstCI->second; 452dad0a645SDavid Majnemer Comdat::SelectionKind DSK = DstC->getSelectionKind(); 4532ef3f299SRafael Espindola return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 4542ef3f299SRafael Espindola LinkFromSrc); 455dad0a645SDavid Majnemer } 456f6f121e2SJames Molloy 457d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 458d12b4a33SRafael Espindola const GlobalValue &Dest, 459dbb0bd1aSRafael Espindola const GlobalValue &Src) { 460e5a61917STeresa Johnson 461e868123dSDuncan P. N. Exon Smith // Should we unconditionally use the Src? 462020d4fb1SArtem Belevich if (shouldOverrideFromSrc()) { 463e868123dSDuncan P. N. Exon Smith LinkFromSrc = true; 464e868123dSDuncan P. N. Exon Smith return false; 465e868123dSDuncan P. N. Exon Smith } 466e868123dSDuncan P. N. Exon Smith 467778fcc77SRafael Espindola // We always have to add Src if it has appending linkage. 468778fcc77SRafael Espindola if (Src.hasAppendingLinkage()) { 4691e20a652STeresa Johnson // Should have prevented importing for appending linkage in linkIfNeeded. 470c7ed52f2STeresa Johnson assert(!isPerformingImport()); 471778fcc77SRafael Espindola LinkFromSrc = true; 472778fcc77SRafael Espindola return false; 473778fcc77SRafael Espindola } 474778fcc77SRafael Espindola 475d4bcefc7SRafael Espindola bool SrcIsDeclaration = Src.isDeclarationForLinker(); 476d4bcefc7SRafael Espindola bool DestIsDeclaration = Dest.isDeclarationForLinker(); 477dbb0bd1aSRafael Espindola 478c7ed52f2STeresa Johnson if (isPerformingImport()) { 479c7ed52f2STeresa Johnson if (isa<Function>(&Src)) { 480*4f04d85fSTeresa Johnson // For functions, LinkFromSrc iff this is a function requested 481c7ed52f2STeresa Johnson // for importing. For variables, decide below normally. 482*4f04d85fSTeresa Johnson LinkFromSrc = FunctionsToImport->count(&Src); 483c7ed52f2STeresa Johnson return false; 484c7ed52f2STeresa Johnson } 485c7ed52f2STeresa Johnson 486c7ed52f2STeresa Johnson // Check if this is an alias with an already existing definition 487c7ed52f2STeresa Johnson // in Dest, which must have come from a prior importing pass from 488c7ed52f2STeresa Johnson // the same Src module. Unlike imported function and variable 489c7ed52f2STeresa Johnson // definitions, which are imported as available_externally and are 490c7ed52f2STeresa Johnson // not definitions for the linker, that is not a valid linkage for 491c7ed52f2STeresa Johnson // imported aliases which must be definitions. Simply use the existing 492c7ed52f2STeresa Johnson // Dest copy. 493c7ed52f2STeresa Johnson if (isa<GlobalAlias>(&Src) && !DestIsDeclaration) { 494c7ed52f2STeresa Johnson assert(isa<GlobalAlias>(&Dest)); 495c7ed52f2STeresa Johnson LinkFromSrc = false; 496c7ed52f2STeresa Johnson return false; 497c7ed52f2STeresa Johnson } 498c7ed52f2STeresa Johnson } 499c7ed52f2STeresa Johnson 500dbb0bd1aSRafael Espindola if (SrcIsDeclaration) { 501dbb0bd1aSRafael Espindola // If Src is external or if both Src & Dest are external.. Just link the 502dbb0bd1aSRafael Espindola // external globals, we aren't adding anything. 503d12b4a33SRafael Espindola if (Src.hasDLLImportStorageClass()) { 504dbb0bd1aSRafael Espindola // If one of GVs is marked as DLLImport, result should be dllimport'ed. 505d12b4a33SRafael Espindola LinkFromSrc = DestIsDeclaration; 506d12b4a33SRafael Espindola return false; 507d12b4a33SRafael Espindola } 508dbb0bd1aSRafael Espindola // If the Dest is weak, use the source linkage. 509ed11bd28SRafael Espindola if (Dest.hasExternalWeakLinkage()) { 510ed11bd28SRafael Espindola LinkFromSrc = true; 511ed11bd28SRafael Espindola return false; 512ed11bd28SRafael Espindola } 513ed11bd28SRafael Espindola // Link an available_externally over a declaration. 514ed11bd28SRafael Espindola LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 515d12b4a33SRafael Espindola return false; 516dbb0bd1aSRafael Espindola } 517dbb0bd1aSRafael Espindola 518d12b4a33SRafael Espindola if (DestIsDeclaration) { 519dbb0bd1aSRafael Espindola // If Dest is external but Src is not: 520d12b4a33SRafael Espindola LinkFromSrc = true; 521d12b4a33SRafael Espindola return false; 522d12b4a33SRafael Espindola } 523dbb0bd1aSRafael Espindola 5240910605aSRafael Espindola if (Src.hasCommonLinkage()) { 525d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 526d12b4a33SRafael Espindola LinkFromSrc = true; 5270910605aSRafael Espindola return false; 528d12b4a33SRafael Espindola } 529d12b4a33SRafael Espindola 530d12b4a33SRafael Espindola if (!Dest.hasCommonLinkage()) { 531d12b4a33SRafael Espindola LinkFromSrc = false; 532d12b4a33SRafael Espindola return false; 533d12b4a33SRafael Espindola } 5340910605aSRafael Espindola 535a28d91d8SMehdi Amini const DataLayout &DL = Dest.getParent()->getDataLayout(); 5360910605aSRafael Espindola uint64_t DestSize = DL.getTypeAllocSize(Dest.getType()->getElementType()); 5370910605aSRafael Espindola uint64_t SrcSize = DL.getTypeAllocSize(Src.getType()->getElementType()); 538d12b4a33SRafael Espindola LinkFromSrc = SrcSize > DestSize; 539d12b4a33SRafael Espindola return false; 5400910605aSRafael Espindola } 5410910605aSRafael Espindola 542dbb0bd1aSRafael Espindola if (Src.isWeakForLinker()) { 543dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 544dbb0bd1aSRafael Espindola assert(!Dest.hasAvailableExternallyLinkage()); 5450910605aSRafael Espindola 546d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 547d12b4a33SRafael Espindola LinkFromSrc = true; 548d12b4a33SRafael Espindola return false; 549d12b4a33SRafael Espindola } 550dbb0bd1aSRafael Espindola 551d12b4a33SRafael Espindola LinkFromSrc = false; 5520910605aSRafael Espindola return false; 553dbb0bd1aSRafael Espindola } 554dbb0bd1aSRafael Espindola 555dbb0bd1aSRafael Espindola if (Dest.isWeakForLinker()) { 556dbb0bd1aSRafael Espindola assert(Src.hasExternalLinkage()); 557d12b4a33SRafael Espindola LinkFromSrc = true; 558d12b4a33SRafael Espindola return false; 559dbb0bd1aSRafael Espindola } 560dbb0bd1aSRafael Espindola 561dbb0bd1aSRafael Espindola assert(!Src.hasExternalWeakLinkage()); 562dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 563dbb0bd1aSRafael Espindola assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 564dbb0bd1aSRafael Espindola "Unexpected linkage type!"); 565dbb0bd1aSRafael Espindola return emitError("Linking globals named '" + Src.getName() + 566dbb0bd1aSRafael Espindola "': symbol multiply defined!"); 567dbb0bd1aSRafael Espindola } 568dbb0bd1aSRafael Espindola 569baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 570baa3bf8fSRafael Espindola GlobalValue *DGV = getLinkedToGlobal(&GV); 571baa3bf8fSRafael Espindola 572baa3bf8fSRafael Espindola if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 573baa3bf8fSRafael Espindola return false; 574baa3bf8fSRafael Espindola 5754b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 5764b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 5774b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 5784b5ec263SRafael Espindola if (DGVar && SGVar) { 5794b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 5804b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 5814b5ec263SRafael Espindola DGVar->setConstant(false); 5824b5ec263SRafael Espindola SGVar->setConstant(false); 5834b5ec263SRafael Espindola } 5844b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 5854b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 5864b5ec263SRafael Espindola SGVar->setAlignment(Align); 5874b5ec263SRafael Espindola DGVar->setAlignment(Align); 5884b5ec263SRafael Espindola } 5894b5ec263SRafael Espindola } 5904b5ec263SRafael Espindola 591baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 592baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 593baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 594baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 5954b5ec263SRafael Espindola 5964b5ec263SRafael Espindola bool HasUnnamedAddr = GV.hasUnnamedAddr() && DGV->hasUnnamedAddr(); 5974b5ec263SRafael Espindola DGV->setUnnamedAddr(HasUnnamedAddr); 5984b5ec263SRafael Espindola GV.setUnnamedAddr(HasUnnamedAddr); 599baa3bf8fSRafael Espindola } 600baa3bf8fSRafael Espindola 6014b5ec263SRafael Espindola // Don't want to append to global_ctors list, for example, when we 6024b5ec263SRafael Espindola // are importing for ThinLTO, otherwise the global ctors and dtors 6034b5ec263SRafael Espindola // get executed multiple times for local variables (the latter causing 6044b5ec263SRafael Espindola // double frees). 6054b5ec263SRafael Espindola if (GV.hasAppendingLinkage() && isPerformingImport()) 6064b5ec263SRafael Espindola return false; 6074b5ec263SRafael Espindola 6084b5ec263SRafael Espindola if (isPerformingImport() && !doImportAsDefinition(&GV)) 6094b5ec263SRafael Espindola return false; 6104b5ec263SRafael Espindola 6114b5ec263SRafael Espindola if (!DGV && !shouldOverrideFromSrc() && 6124b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 6134b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 6144b5ec263SRafael Espindola return false; 6154b5ec263SRafael Espindola 616bd03c503SRafael Espindola if (GV.isDeclaration()) 617bd03c503SRafael Espindola return false; 618bd03c503SRafael Espindola 619baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 620baa3bf8fSRafael Espindola bool LinkFromSrc; 621baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 622baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 6234b5ec263SRafael Espindola if (LinkFromSrc) 6244b5ec263SRafael Espindola ValuesToLink.insert(&GV); 625baa3bf8fSRafael Espindola return false; 626baa3bf8fSRafael Espindola } 627baa3bf8fSRafael Espindola 6284b5ec263SRafael Espindola bool LinkFromSrc = true; 6294b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 6304b5ec263SRafael Espindola return true; 6314b5ec263SRafael Espindola if (LinkFromSrc) 6324b5ec263SRafael Espindola ValuesToLink.insert(&GV); 633baa3bf8fSRafael Espindola return false; 634baa3bf8fSRafael Espindola } 635baa3bf8fSRafael Espindola 636caabe228SRafael Espindola void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) { 637caabe228SRafael Espindola // Add these to the internalize list 638caabe228SRafael Espindola if (!GV.hasLinkOnceLinkage()) 639caabe228SRafael Espindola return; 640caabe228SRafael Espindola 641caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) 642caabe228SRafael Espindola Internalize.insert(GV.getName()); 643caabe228SRafael Espindola Add(GV); 644caabe228SRafael Espindola 645caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 646caabe228SRafael Espindola if (!SC) 647caabe228SRafael Espindola return; 648caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) { 649caabe228SRafael Espindola if (!GV2->hasLocalLinkage() && shouldInternalizeLinkedSymbols()) 650caabe228SRafael Espindola Internalize.insert(GV2->getName()); 651caabe228SRafael Espindola Add(*GV2); 652caabe228SRafael Espindola } 653caabe228SRafael Espindola } 654caabe228SRafael Espindola 655caabe228SRafael Espindola void ModuleLinker::processGlobalForThinLTO(GlobalValue &GV) { 656caabe228SRafael Espindola if (GV.hasLocalLinkage() && 657caabe228SRafael Espindola (doPromoteLocalToGlobal(&GV) || isPerformingImport())) { 658caabe228SRafael Espindola GV.setName(getName(&GV)); 659caabe228SRafael Espindola GV.setLinkage(getLinkage(&GV)); 660caabe228SRafael Espindola if (!GV.hasLocalLinkage()) 661caabe228SRafael Espindola GV.setVisibility(GlobalValue::HiddenVisibility); 662caabe228SRafael Espindola if (isModuleExporting()) 663caabe228SRafael Espindola ValuesToLink.insert(&GV); 664caabe228SRafael Espindola return; 665caabe228SRafael Espindola } 666caabe228SRafael Espindola GV.setLinkage(getLinkage(&GV)); 667caabe228SRafael Espindola } 668caabe228SRafael Espindola 669caabe228SRafael Espindola void ModuleLinker::processGlobalsForThinLTO() { 670caabe228SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 671caabe228SRafael Espindola processGlobalForThinLTO(GV); 672caabe228SRafael Espindola for (Function &SF : SrcM) 673caabe228SRafael Espindola processGlobalForThinLTO(SF); 674caabe228SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 675caabe228SRafael Espindola processGlobalForThinLTO(GA); 676caabe228SRafael Espindola } 677caabe228SRafael Espindola 678b1ed91f3SChris Lattner bool ModuleLinker::run() { 6790e309fe8SRafael Espindola for (const auto &SMEC : SrcM.getComdatSymbolTable()) { 680dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 681dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 682dad0a645SDavid Majnemer continue; 683dad0a645SDavid Majnemer Comdat::SelectionKind SK; 684dad0a645SDavid Majnemer bool LinkFromSrc; 685dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 686dad0a645SDavid Majnemer return true; 687dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 688dad0a645SDavid Majnemer } 689dad0a645SDavid Majnemer 6900e309fe8SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 691baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 692baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GV); 693baa3bf8fSRafael Espindola 6940e309fe8SRafael Espindola for (Function &SF : SrcM) 695baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 696baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&SF); 697baa3bf8fSRafael Espindola 6980e309fe8SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 699baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 700baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GA); 701baa3bf8fSRafael Espindola 702b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 703b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 7040e309fe8SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 705baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 706b1ed91f3SChris Lattner return true; 707b1ed91f3SChris Lattner 7080e309fe8SRafael Espindola for (Function &SF : SrcM) 709baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 710b1ed91f3SChris Lattner return true; 711b1ed91f3SChris Lattner 7120e309fe8SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 713baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 714b1ed91f3SChris Lattner return true; 715b1ed91f3SChris Lattner 716caabe228SRafael Espindola processGlobalsForThinLTO(); 717caabe228SRafael Espindola 718caabe228SRafael Espindola for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 719caabe228SRafael Espindola GlobalValue *GV = ValuesToLink[I]; 720caabe228SRafael Espindola const Comdat *SC = GV->getComdat(); 721caabe228SRafael Espindola if (!SC) 722caabe228SRafael Espindola continue; 723caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) 724caabe228SRafael Espindola ValuesToLink.insert(GV2); 725caabe228SRafael Espindola } 726caabe228SRafael Espindola 727caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) { 728caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 729caabe228SRafael Espindola Internalize.insert(GV->getName()); 730caabe228SRafael Espindola } 731caabe228SRafael Espindola 732f81c7b03SRafael Espindola if (Mover.move(SrcM, ValuesToLink.getArrayRef(), 733caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 734caabe228SRafael Espindola addLazyFor(GV, Add); 735e5a61917STeresa Johnson }, 736e5a61917STeresa Johnson ValIDToTempMDMap, false)) 7374b5ec263SRafael Espindola return true; 738caabe228SRafael Espindola Module &DstM = Mover.getModule(); 739caabe228SRafael Espindola for (auto &P : Internalize) { 740caabe228SRafael Espindola GlobalValue *GV = DstM.getNamedValue(P.first()); 741caabe228SRafael Espindola GV->setLinkage(GlobalValue::InternalLinkage); 742beadd56aSRafael Espindola } 743beadd56aSRafael Espindola 7442609888fSAnton Korobeynikov return false; 7452609888fSAnton Korobeynikov } 746361e513dSReid Spencer 7479d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {} 7483df61b7bSRafael Espindola 749434e9561SRafael Espindola bool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags, 7508220e8a8SMehdi Amini const FunctionInfoIndex *Index, 751e5a61917STeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport, 752e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) { 753bef54363STeresa Johnson ModuleLinker ModLinker(Mover, *Src, Flags, Index, FunctionsToImport, 754e5a61917STeresa Johnson ValIDToTempMDMap); 755bef54363STeresa Johnson return ModLinker.run(); 756434e9561SRafael Espindola } 757434e9561SRafael Espindola 758434e9561SRafael Espindola bool Linker::linkInModuleForCAPI(Module &Src) { 759bef54363STeresa Johnson ModuleLinker ModLinker(Mover, Src, 0, nullptr, nullptr); 760bef54363STeresa Johnson return ModLinker.run(); 7613df61b7bSRafael Espindola } 7623df61b7bSRafael Espindola 763e5a61917STeresa Johnson bool Linker::linkInMetadata(Module &Src, 764e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) { 765e5a61917STeresa Johnson SetVector<GlobalValue *> ValuesToLink; 766e5a61917STeresa Johnson if (Mover.move( 767e5a61917STeresa Johnson Src, ValuesToLink.getArrayRef(), 768e5a61917STeresa Johnson [this](GlobalValue &GV, IRMover::ValueAdder Add) { assert(false); }, 769e5a61917STeresa Johnson ValIDToTempMDMap, true)) 770e5a61917STeresa Johnson return true; 771e5a61917STeresa Johnson return false; 772e5a61917STeresa Johnson } 773e5a61917STeresa Johnson 774b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 775b1ed91f3SChris Lattner // LinkModules entrypoint. 776b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 777b1ed91f3SChris Lattner 77818c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 77918c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 78018c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 78118c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 78218c89411SRafael Espindola /// relied on to be consistent. 783434e9561SRafael Espindola bool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src, 784434e9561SRafael Espindola unsigned Flags) { 7859d2bfc48SRafael Espindola Linker L(Dest); 786434e9561SRafael Espindola return L.linkInModule(std::move(Src), Flags); 7874160f5d3SRafael Espindola } 7884160f5d3SRafael Espindola 789bae7e759STeresa Johnson std::unique_ptr<Module> 790434e9561SRafael Espindola llvm::renameModuleForThinLTO(std::unique_ptr<Module> M, 7919d2bfc48SRafael Espindola const FunctionInfoIndex *Index) { 792bae7e759STeresa Johnson std::unique_ptr<llvm::Module> RenamedModule( 793bae7e759STeresa Johnson new llvm::Module(M->getModuleIdentifier(), M->getContext())); 7949d2bfc48SRafael Espindola Linker L(*RenamedModule.get()); 795434e9561SRafael Espindola if (L.linkInModule(std::move(M), llvm::Linker::Flags::None, Index)) 796bae7e759STeresa Johnson return nullptr; 797bae7e759STeresa Johnson return RenamedModule; 798bae7e759STeresa Johnson } 799bae7e759STeresa Johnson 800a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 801a3aeb980SBill Wendling // C API. 802a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 803a3aeb980SBill Wendling 8049d2bfc48SRafael Espindola static void diagnosticHandler(const DiagnosticInfo &DI, void *C) { 8059d2bfc48SRafael Espindola auto *Message = reinterpret_cast<std::string *>(C); 8069d2bfc48SRafael Espindola raw_string_ostream Stream(*Message); 8079d2bfc48SRafael Espindola DiagnosticPrinterRawOStream DP(Stream); 8089d2bfc48SRafael Espindola DI.print(DP); 8099d2bfc48SRafael Espindola } 8109d2bfc48SRafael Espindola 811a3aeb980SBill Wendling LLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src, 812a57d588cSJuergen Ributzka LLVMLinkerMode Unused, char **OutMessages) { 81398ab63ceSRafael Espindola Module *D = unwrap(Dest); 8149d2bfc48SRafael Espindola LLVMContext &Ctx = D->getContext(); 8159d2bfc48SRafael Espindola 8169d2bfc48SRafael Espindola LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler = 8179d2bfc48SRafael Espindola Ctx.getDiagnosticHandler(); 8189d2bfc48SRafael Espindola void *OldDiagnosticContext = Ctx.getDiagnosticContext(); 81998ab63ceSRafael Espindola std::string Message; 8209d2bfc48SRafael Espindola Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true); 8214160f5d3SRafael Espindola 822434e9561SRafael Espindola Linker L(*D); 823434e9561SRafael Espindola Module *M = unwrap(Src); 824434e9561SRafael Espindola LLVMBool Result = L.linkInModuleForCAPI(*M); 82598ab63ceSRafael Espindola 8269d2bfc48SRafael Espindola Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true); 8279d2bfc48SRafael Espindola 8289d2bfc48SRafael Espindola if (OutMessages && Result) 82998ab63ceSRafael Espindola *OutMessages = strdup(Message.c_str()); 830a3aeb980SBill Wendling return Result; 831a3aeb980SBill Wendling } 832434e9561SRafael Espindola 833434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 834434e9561SRafael Espindola Module *D = unwrap(Dest); 835434e9561SRafael Espindola std::unique_ptr<Module> M(unwrap(Src)); 836434e9561SRafael Espindola return Linker::linkModules(*D, std::move(M)); 837434e9561SRafael Espindola } 838