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 414f04d85fSTeresa Johnson /// Functions to import from source module, all other functions are 42c7ed52f2STeresa Johnson /// imported as declarations instead of definitions. 434f04d85fSTeresa 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 68d12b4a33SRafael Espindola bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 69d12b4a33SRafael Espindola const GlobalValue &Src); 70dbb0bd1aSRafael Espindola 71caabe228SRafael Espindola /// Should we have mover and linker error diag info? 72b1ed91f3SChris Lattner bool emitError(const Twine &Message) { 739d2bfc48SRafael Espindola SrcM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 74b1ed91f3SChris Lattner return true; 75b1ed91f3SChris Lattner } 76b1ed91f3SChris Lattner 770e309fe8SRafael Espindola bool getComdatLeader(Module &M, StringRef ComdatName, 78dad0a645SDavid Majnemer const GlobalVariable *&GVar); 79dad0a645SDavid Majnemer bool computeResultingSelectionKind(StringRef ComdatName, 80dad0a645SDavid Majnemer Comdat::SelectionKind Src, 81dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 82dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 83dad0a645SDavid Majnemer bool &LinkFromSrc); 84dad0a645SDavid Majnemer std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 85dad0a645SDavid Majnemer ComdatsChosen; 86dad0a645SDavid Majnemer bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 87dad0a645SDavid Majnemer bool &LinkFromSrc); 882d5fb8caSTeresa Johnson // Keep track of the global value members of each comdat in source. 892d5fb8caSTeresa Johnson DenseMap<const Comdat *, std::vector<GlobalValue *>> ComdatMembers; 90dad0a645SDavid Majnemer 9118c89411SRafael Espindola /// Given a global in the source module, return the global in the 9218c89411SRafael Espindola /// destination module that is being linked to, if any. 933e8bc6a8SRafael Espindola GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 94caabe228SRafael Espindola Module &DstM = Mover.getModule(); 95b1ed91f3SChris Lattner // If the source has no name it can't link. If it has local linkage, 96b1ed91f3SChris Lattner // there is no name match-up going on. 974504c1bcSTeresa Johnson if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage())) 982617dcceSCraig Topper return nullptr; 99b1ed91f3SChris Lattner 100b1ed91f3SChris Lattner // Otherwise see if we have a match in the destination module's symtab. 1014504c1bcSTeresa Johnson GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 102c84f608bSRafael Espindola if (!DGV) 103c84f608bSRafael Espindola return nullptr; 104b1ed91f3SChris Lattner 105b1ed91f3SChris Lattner // If we found a global with the same name in the dest module, but it has 106b1ed91f3SChris Lattner // internal linkage, we are really not doing any linkage here. 107b1ed91f3SChris Lattner if (DGV->hasLocalLinkage()) 1082617dcceSCraig Topper return nullptr; 109b1ed91f3SChris Lattner 110b1ed91f3SChris Lattner // Otherwise, we do in fact link to the destination global. 111b1ed91f3SChris Lattner return DGV; 112b1ed91f3SChris Lattner } 113b1ed91f3SChris Lattner 114baa3bf8fSRafael Espindola bool linkIfNeeded(GlobalValue &GV); 115c7ed52f2STeresa Johnson 1164504c1bcSTeresa Johnson /// Helper method to check if we are importing from the current source 1174504c1bcSTeresa Johnson /// module. 1184504c1bcSTeresa Johnson bool isPerformingImport() const { return FunctionsToImport != nullptr; } 1194504c1bcSTeresa Johnson 1204504c1bcSTeresa Johnson /// If we are importing from the source module, checks if we should 1214504c1bcSTeresa Johnson /// import SGV as a definition, otherwise import as a declaration. 1224504c1bcSTeresa Johnson bool doImportAsDefinition(const GlobalValue *SGV); 1234504c1bcSTeresa Johnson 1244504c1bcSTeresa Johnson public: 1254504c1bcSTeresa Johnson ModuleLinker(IRMover &Mover, Module &SrcM, unsigned Flags, 1264504c1bcSTeresa Johnson const FunctionInfoIndex *Index = nullptr, 1274504c1bcSTeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport = nullptr, 1284504c1bcSTeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap = nullptr) 1294504c1bcSTeresa Johnson : Mover(Mover), SrcM(SrcM), Flags(Flags), ImportIndex(Index), 1304504c1bcSTeresa Johnson FunctionsToImport(FunctionsToImport), 1314504c1bcSTeresa Johnson ValIDToTempMDMap(ValIDToTempMDMap) { 1324504c1bcSTeresa Johnson assert((ImportIndex || !FunctionsToImport) && 1334504c1bcSTeresa Johnson "Expect a FunctionInfoIndex when importing"); 1344504c1bcSTeresa Johnson // If we have a FunctionInfoIndex but no function to import, 1354504c1bcSTeresa Johnson // then this is the primary module being compiled in a ThinLTO 1364504c1bcSTeresa Johnson // backend compilation, and we need to see if it has functions that 1374504c1bcSTeresa Johnson // may be exported to another backend compilation. 1384504c1bcSTeresa Johnson if (ImportIndex && !FunctionsToImport) 1394504c1bcSTeresa Johnson HasExportedFunctions = ImportIndex->hasExportedFunctions(SrcM); 1404504c1bcSTeresa Johnson assert((ValIDToTempMDMap || !FunctionsToImport) && 1414504c1bcSTeresa Johnson "Function importing must provide a ValIDToTempMDMap"); 1424504c1bcSTeresa Johnson } 1434504c1bcSTeresa Johnson 1444504c1bcSTeresa Johnson bool run(); 1454504c1bcSTeresa Johnson }; 1464504c1bcSTeresa Johnson 1474504c1bcSTeresa Johnson /// Class to handle necessary GlobalValue changes required by ThinLTO including 1484504c1bcSTeresa Johnson /// linkage changes and any necessary renaming. 1494504c1bcSTeresa Johnson class ThinLTOGlobalProcessing { 1504504c1bcSTeresa Johnson /// The Module which we are exporting or importing functions from. 1514504c1bcSTeresa Johnson Module &M; 1524504c1bcSTeresa Johnson 1534504c1bcSTeresa Johnson /// Function index passed in for function importing/exporting handling. 1544504c1bcSTeresa Johnson const FunctionInfoIndex *ImportIndex; 1554504c1bcSTeresa Johnson 1564504c1bcSTeresa Johnson /// Functions to import from this module, all other functions will be 1574504c1bcSTeresa Johnson /// imported as declarations instead of definitions. 1584504c1bcSTeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport; 1594504c1bcSTeresa Johnson 1604504c1bcSTeresa Johnson /// Set to true if the given FunctionInfoIndex contains any functions 1614504c1bcSTeresa Johnson /// from this source module, in which case we must conservatively assume 1624504c1bcSTeresa Johnson /// that any of its functions may be imported into another module 1634504c1bcSTeresa Johnson /// as part of a different backend compilation process. 1644504c1bcSTeresa Johnson bool HasExportedFunctions = false; 1654504c1bcSTeresa Johnson 1664504c1bcSTeresa Johnson /// Populated during ThinLTO global processing with locals promoted 1674504c1bcSTeresa Johnson /// to global scope in an exporting module, which now need to be linked 1684504c1bcSTeresa Johnson /// in if calling from the ModuleLinker. 1694504c1bcSTeresa Johnson SetVector<GlobalValue *> NewExportedValues; 1704504c1bcSTeresa Johnson 1714504c1bcSTeresa Johnson /// Check if we should promote the given local value to global scope. 1724504c1bcSTeresa Johnson bool doPromoteLocalToGlobal(const GlobalValue *SGV); 1734504c1bcSTeresa Johnson 174c7ed52f2STeresa Johnson /// Helper methods to check if we are importing from or potentially 175c7ed52f2STeresa Johnson /// exporting from the current source module. 1764f04d85fSTeresa Johnson bool isPerformingImport() const { return FunctionsToImport != nullptr; } 1774a9bf587STeresa Johnson bool isModuleExporting() const { return HasExportedFunctions; } 178c7ed52f2STeresa Johnson 179c7ed52f2STeresa Johnson /// If we are importing from the source module, checks if we should 180c7ed52f2STeresa Johnson /// import SGV as a definition, otherwise import as a declaration. 181c7ed52f2STeresa Johnson bool doImportAsDefinition(const GlobalValue *SGV); 182c7ed52f2STeresa Johnson 183c7ed52f2STeresa Johnson /// Get the name for SGV that should be used in the linked destination 184c7ed52f2STeresa Johnson /// module. Specifically, this handles the case where we need to rename 185c7ed52f2STeresa Johnson /// a local that is being promoted to global scope. 186c7ed52f2STeresa Johnson std::string getName(const GlobalValue *SGV); 187c7ed52f2STeresa Johnson 188caabe228SRafael Espindola /// Process globals so that they can be used in ThinLTO. This includes 189caabe228SRafael Espindola /// promoting local variables so that they can be reference externally by 190caabe228SRafael Espindola /// thin lto imported globals and converting strong external globals to 191caabe228SRafael Espindola /// available_externally. 192caabe228SRafael Espindola void processGlobalsForThinLTO(); 193caabe228SRafael Espindola void processGlobalForThinLTO(GlobalValue &GV); 194caabe228SRafael Espindola 195c7ed52f2STeresa Johnson /// Get the new linkage for SGV that should be used in the linked destination 196c7ed52f2STeresa Johnson /// module. Specifically, for ThinLTO importing or exporting it may need 197c7ed52f2STeresa Johnson /// to be adjusted. 198c7ed52f2STeresa Johnson GlobalValue::LinkageTypes getLinkage(const GlobalValue *SGV); 199c7ed52f2STeresa Johnson 200d57f9f0cSRafael Espindola public: 2014504c1bcSTeresa Johnson ThinLTOGlobalProcessing( 2024504c1bcSTeresa Johnson Module &M, const FunctionInfoIndex *Index, 2034504c1bcSTeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport = nullptr) 2044504c1bcSTeresa Johnson : M(M), ImportIndex(Index), FunctionsToImport(FunctionsToImport) { 205d57f9f0cSRafael Espindola // If we have a FunctionInfoIndex but no function to import, 206d57f9f0cSRafael Espindola // then this is the primary module being compiled in a ThinLTO 207d57f9f0cSRafael Espindola // backend compilation, and we need to see if it has functions that 208d57f9f0cSRafael Espindola // may be exported to another backend compilation. 2094504c1bcSTeresa Johnson if (!FunctionsToImport) 2104504c1bcSTeresa Johnson HasExportedFunctions = ImportIndex->hasExportedFunctions(M); 211d57f9f0cSRafael Espindola } 212d57f9f0cSRafael Espindola 213d57f9f0cSRafael Espindola bool run(); 2144504c1bcSTeresa Johnson 2154504c1bcSTeresa Johnson /// Access the promoted globals that are now exported and need to be linked. 2164504c1bcSTeresa Johnson SetVector<GlobalValue *> &getNewExportedValues() { return NewExportedValues; } 217eee6f995SChris Lattner }; 218f00654e3SAlexander Kornienko } 219d48b7783SBill Wendling 2204504c1bcSTeresa Johnson /// Checks if we should import SGV as a definition, otherwise import as a 2214504c1bcSTeresa Johnson /// declaration. 2224504c1bcSTeresa Johnson static bool 2234504c1bcSTeresa Johnson doImportAsDefinitionImpl(const GlobalValue *SGV, 2244504c1bcSTeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport) { 2253cd8161cSTeresa Johnson auto *GA = dyn_cast<GlobalAlias>(SGV); 2263cd8161cSTeresa Johnson if (GA) { 2273cd8161cSTeresa Johnson if (GA->hasWeakAnyLinkage()) 2283cd8161cSTeresa Johnson return false; 22989345771SRafael Espindola const GlobalObject *GO = GA->getBaseObject(); 23089345771SRafael Espindola if (!GO->hasLinkOnceODRLinkage()) 23189345771SRafael Espindola return false; 2324504c1bcSTeresa Johnson return doImportAsDefinitionImpl(GO, FunctionsToImport); 2333cd8161cSTeresa Johnson } 234dfbebc37STeresa Johnson // Always import GlobalVariable definitions, except for the special 235dfbebc37STeresa Johnson // case of WeakAny which are imported as ExternalWeak declarations 236dfbebc37STeresa Johnson // (see comments in ModuleLinker::getLinkage). The linkage changes 237c7ed52f2STeresa Johnson // described in ModuleLinker::getLinkage ensure the correct behavior (e.g. 238c7ed52f2STeresa Johnson // global variables with external linkage are transformed to 2393cd8161cSTeresa Johnson // available_externally definitions, which are ultimately turned into 2403cd8161cSTeresa Johnson // declarations after the EliminateAvailableExternally pass). 24166059c9fSCraig Topper if (isa<GlobalVariable>(SGV) && !SGV->isDeclaration() && 2423cd8161cSTeresa Johnson !SGV->hasWeakAnyLinkage()) 243c7ed52f2STeresa Johnson return true; 244c7ed52f2STeresa Johnson // Only import the function requested for importing. 245c7ed52f2STeresa Johnson auto *SF = dyn_cast<Function>(SGV); 2464f04d85fSTeresa Johnson if (SF && FunctionsToImport->count(SF)) 247c7ed52f2STeresa Johnson return true; 248c7ed52f2STeresa Johnson // Otherwise no. 249c7ed52f2STeresa Johnson return false; 250c7ed52f2STeresa Johnson } 251c7ed52f2STeresa Johnson 2524504c1bcSTeresa Johnson bool ThinLTOGlobalProcessing::doImportAsDefinition(const GlobalValue *SGV) { 2534504c1bcSTeresa Johnson if (!isPerformingImport()) 2544504c1bcSTeresa Johnson return false; 2554504c1bcSTeresa Johnson return doImportAsDefinitionImpl(SGV, FunctionsToImport); 2564504c1bcSTeresa Johnson } 2574504c1bcSTeresa Johnson 2584504c1bcSTeresa Johnson bool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) { 2594504c1bcSTeresa Johnson if (!isPerformingImport()) 2604504c1bcSTeresa Johnson return false; 2614504c1bcSTeresa Johnson return doImportAsDefinitionImpl(SGV, FunctionsToImport); 2624504c1bcSTeresa Johnson } 2634504c1bcSTeresa Johnson 2644504c1bcSTeresa Johnson bool ThinLTOGlobalProcessing::doPromoteLocalToGlobal(const GlobalValue *SGV) { 265c7ed52f2STeresa Johnson assert(SGV->hasLocalLinkage()); 266c7ed52f2STeresa Johnson // Both the imported references and the original local variable must 267c7ed52f2STeresa Johnson // be promoted. 268c7ed52f2STeresa Johnson if (!isPerformingImport() && !isModuleExporting()) 269c7ed52f2STeresa Johnson return false; 270c7ed52f2STeresa Johnson 271c7ed52f2STeresa Johnson // Local const variables never need to be promoted unless they are address 272c7ed52f2STeresa Johnson // taken. The imported uses can simply use the clone created in this module. 273c7ed52f2STeresa Johnson // For now we are conservative in determining which variables are not 274c7ed52f2STeresa Johnson // address taken by checking the unnamed addr flag. To be more aggressive, 275c7ed52f2STeresa Johnson // the address taken information must be checked earlier during parsing 276c7ed52f2STeresa Johnson // of the module and recorded in the function index for use when importing 277c7ed52f2STeresa Johnson // from that module. 278c7ed52f2STeresa Johnson auto *GVar = dyn_cast<GlobalVariable>(SGV); 279c7ed52f2STeresa Johnson if (GVar && GVar->isConstant() && GVar->hasUnnamedAddr()) 280c7ed52f2STeresa Johnson return false; 281c7ed52f2STeresa Johnson 282c7ed52f2STeresa Johnson // Eventually we only need to promote functions in the exporting module that 283c7ed52f2STeresa Johnson // are referenced by a potentially exported function (i.e. one that is in the 284c7ed52f2STeresa Johnson // function index). 285c7ed52f2STeresa Johnson return true; 286c7ed52f2STeresa Johnson } 287c7ed52f2STeresa Johnson 2884504c1bcSTeresa Johnson std::string ThinLTOGlobalProcessing::getName(const GlobalValue *SGV) { 289c7ed52f2STeresa Johnson // For locals that must be promoted to global scope, ensure that 290c7ed52f2STeresa Johnson // the promoted name uniquely identifies the copy in the original module, 291c7ed52f2STeresa Johnson // using the ID assigned during combined index creation. When importing, 292c7ed52f2STeresa Johnson // we rename all locals (not just those that are promoted) in order to 293c7ed52f2STeresa Johnson // avoid naming conflicts between locals imported from different modules. 294c7ed52f2STeresa Johnson if (SGV->hasLocalLinkage() && 295c7ed52f2STeresa Johnson (doPromoteLocalToGlobal(SGV) || isPerformingImport())) 296c7ed52f2STeresa Johnson return FunctionInfoIndex::getGlobalNameForLocal( 297c7ed52f2STeresa Johnson SGV->getName(), 298c7ed52f2STeresa Johnson ImportIndex->getModuleId(SGV->getParent()->getModuleIdentifier())); 299c7ed52f2STeresa Johnson return SGV->getName(); 300c7ed52f2STeresa Johnson } 301c7ed52f2STeresa Johnson 3024504c1bcSTeresa Johnson GlobalValue::LinkageTypes 3034504c1bcSTeresa Johnson ThinLTOGlobalProcessing::getLinkage(const GlobalValue *SGV) { 304c7ed52f2STeresa Johnson // Any local variable that is referenced by an exported function needs 305c7ed52f2STeresa Johnson // to be promoted to global scope. Since we don't currently know which 306c7ed52f2STeresa Johnson // functions reference which local variables/functions, we must treat 307c7ed52f2STeresa Johnson // all as potentially exported if this module is exporting anything. 308c7ed52f2STeresa Johnson if (isModuleExporting()) { 309c7ed52f2STeresa Johnson if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV)) 310c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 311c7ed52f2STeresa Johnson return SGV->getLinkage(); 312c7ed52f2STeresa Johnson } 313c7ed52f2STeresa Johnson 314c7ed52f2STeresa Johnson // Otherwise, if we aren't importing, no linkage change is needed. 315c7ed52f2STeresa Johnson if (!isPerformingImport()) 316c7ed52f2STeresa Johnson return SGV->getLinkage(); 317c7ed52f2STeresa Johnson 318c7ed52f2STeresa Johnson switch (SGV->getLinkage()) { 319c7ed52f2STeresa Johnson case GlobalValue::ExternalLinkage: 320c7ed52f2STeresa Johnson // External defnitions are converted to available_externally 321c7ed52f2STeresa Johnson // definitions upon import, so that they are available for inlining 322c7ed52f2STeresa Johnson // and/or optimization, but are turned into declarations later 323c7ed52f2STeresa Johnson // during the EliminateAvailableExternally pass. 3243cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 325c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 326c7ed52f2STeresa Johnson // An imported external declaration stays external. 327c7ed52f2STeresa Johnson return SGV->getLinkage(); 328c7ed52f2STeresa Johnson 329c7ed52f2STeresa Johnson case GlobalValue::AvailableExternallyLinkage: 330c7ed52f2STeresa Johnson // An imported available_externally definition converts 331c7ed52f2STeresa Johnson // to external if imported as a declaration. 332c7ed52f2STeresa Johnson if (!doImportAsDefinition(SGV)) 333c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 334c7ed52f2STeresa Johnson // An imported available_externally declaration stays that way. 335c7ed52f2STeresa Johnson return SGV->getLinkage(); 336c7ed52f2STeresa Johnson 337c7ed52f2STeresa Johnson case GlobalValue::LinkOnceAnyLinkage: 338c7ed52f2STeresa Johnson case GlobalValue::LinkOnceODRLinkage: 339c7ed52f2STeresa Johnson // These both stay the same when importing the definition. 340c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 341c7ed52f2STeresa Johnson return SGV->getLinkage(); 342c7ed52f2STeresa Johnson 343c7ed52f2STeresa Johnson case GlobalValue::WeakAnyLinkage: 344c7ed52f2STeresa Johnson // Can't import weak_any definitions correctly, or we might change the 345c7ed52f2STeresa Johnson // program semantics, since the linker will pick the first weak_any 346c7ed52f2STeresa Johnson // definition and importing would change the order they are seen by the 347c7ed52f2STeresa Johnson // linker. The module linking caller needs to enforce this. 348c7ed52f2STeresa Johnson assert(!doImportAsDefinition(SGV)); 349c7ed52f2STeresa Johnson // If imported as a declaration, it becomes external_weak. 350c7ed52f2STeresa Johnson return GlobalValue::ExternalWeakLinkage; 351c7ed52f2STeresa Johnson 352c7ed52f2STeresa Johnson case GlobalValue::WeakODRLinkage: 353c7ed52f2STeresa Johnson // For weak_odr linkage, there is a guarantee that all copies will be 354c7ed52f2STeresa Johnson // equivalent, so the issue described above for weak_any does not exist, 355c7ed52f2STeresa Johnson // and the definition can be imported. It can be treated similarly 356c7ed52f2STeresa Johnson // to an imported externally visible global value. 3573cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 358c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 359c7ed52f2STeresa Johnson else 360c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 361c7ed52f2STeresa Johnson 362c7ed52f2STeresa Johnson case GlobalValue::AppendingLinkage: 363c7ed52f2STeresa Johnson // It would be incorrect to import an appending linkage variable, 364c7ed52f2STeresa Johnson // since it would cause global constructors/destructors to be 365c7ed52f2STeresa Johnson // executed multiple times. This should have already been handled 3661e20a652STeresa Johnson // by linkIfNeeded, and we will assert in shouldLinkFromSource 3674504c1bcSTeresa Johnson // if we try to import, so we simply return AppendingLinkage. 3681e20a652STeresa Johnson return GlobalValue::AppendingLinkage; 369c7ed52f2STeresa Johnson 370c7ed52f2STeresa Johnson case GlobalValue::InternalLinkage: 371c7ed52f2STeresa Johnson case GlobalValue::PrivateLinkage: 372c7ed52f2STeresa Johnson // If we are promoting the local to global scope, it is handled 373c7ed52f2STeresa Johnson // similarly to a normal externally visible global. 374c7ed52f2STeresa Johnson if (doPromoteLocalToGlobal(SGV)) { 3753cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 376c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 377c7ed52f2STeresa Johnson else 378c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 379c7ed52f2STeresa Johnson } 380c7ed52f2STeresa Johnson // A non-promoted imported local definition stays local. 381c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 382c7ed52f2STeresa Johnson return SGV->getLinkage(); 383c7ed52f2STeresa Johnson 384c7ed52f2STeresa Johnson case GlobalValue::ExternalWeakLinkage: 385c7ed52f2STeresa Johnson // External weak doesn't apply to definitions, must be a declaration. 386c7ed52f2STeresa Johnson assert(!doImportAsDefinition(SGV)); 387c7ed52f2STeresa Johnson // Linkage stays external_weak. 388c7ed52f2STeresa Johnson return SGV->getLinkage(); 389c7ed52f2STeresa Johnson 390c7ed52f2STeresa Johnson case GlobalValue::CommonLinkage: 391c7ed52f2STeresa Johnson // Linkage stays common on definitions. 392c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 393c7ed52f2STeresa Johnson return SGV->getLinkage(); 394c7ed52f2STeresa Johnson } 395c7ed52f2STeresa Johnson 396c7ed52f2STeresa Johnson llvm_unreachable("unknown linkage type"); 397c7ed52f2STeresa Johnson } 398c7ed52f2STeresa Johnson 399eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes 400eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A, 401eb5e0a77SRafael Espindola GlobalValue::VisibilityTypes B) { 402eb5e0a77SRafael Espindola if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 403eb5e0a77SRafael Espindola return GlobalValue::HiddenVisibility; 404eb5e0a77SRafael Espindola if (A == GlobalValue::ProtectedVisibility || 405eb5e0a77SRafael Espindola B == GlobalValue::ProtectedVisibility) 406eb5e0a77SRafael Espindola return GlobalValue::ProtectedVisibility; 407eb5e0a77SRafael Espindola return GlobalValue::DefaultVisibility; 408eb5e0a77SRafael Espindola } 409eb5e0a77SRafael Espindola 4100e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 411dad0a645SDavid Majnemer const GlobalVariable *&GVar) { 4120e309fe8SRafael Espindola const GlobalValue *GVal = M.getNamedValue(ComdatName); 413dad0a645SDavid Majnemer if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 414dad0a645SDavid Majnemer GVal = GA->getBaseObject(); 415dad0a645SDavid Majnemer if (!GVal) 416dad0a645SDavid Majnemer // We cannot resolve the size of the aliasee yet. 417dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 418dad0a645SDavid Majnemer "': COMDAT key involves incomputable alias size."); 419dad0a645SDavid Majnemer } 420dad0a645SDavid Majnemer 421dad0a645SDavid Majnemer GVar = dyn_cast_or_null<GlobalVariable>(GVal); 422dad0a645SDavid Majnemer if (!GVar) 423dad0a645SDavid Majnemer return emitError( 424dad0a645SDavid Majnemer "Linking COMDATs named '" + ComdatName + 425dad0a645SDavid Majnemer "': GlobalVariable required for data dependent selection!"); 426dad0a645SDavid Majnemer 427dad0a645SDavid Majnemer return false; 428dad0a645SDavid Majnemer } 429dad0a645SDavid Majnemer 430dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 431dad0a645SDavid Majnemer Comdat::SelectionKind Src, 432dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 433dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 434dad0a645SDavid Majnemer bool &LinkFromSrc) { 435caabe228SRafael Espindola Module &DstM = Mover.getModule(); 436dad0a645SDavid Majnemer // The ability to mix Comdat::SelectionKind::Any with 437dad0a645SDavid Majnemer // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 438dad0a645SDavid Majnemer bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 439dad0a645SDavid Majnemer Dst == Comdat::SelectionKind::Largest; 440dad0a645SDavid Majnemer bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 441dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest; 442dad0a645SDavid Majnemer if (DstAnyOrLargest && SrcAnyOrLargest) { 443dad0a645SDavid Majnemer if (Dst == Comdat::SelectionKind::Largest || 444dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest) 445dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Largest; 446dad0a645SDavid Majnemer else 447dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Any; 448dad0a645SDavid Majnemer } else if (Src == Dst) { 449dad0a645SDavid Majnemer Result = Dst; 450dad0a645SDavid Majnemer } else { 451dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 452dad0a645SDavid Majnemer "': invalid selection kinds!"); 453dad0a645SDavid Majnemer } 454dad0a645SDavid Majnemer 455dad0a645SDavid Majnemer switch (Result) { 456dad0a645SDavid Majnemer case Comdat::SelectionKind::Any: 457dad0a645SDavid Majnemer // Go with Dst. 458dad0a645SDavid Majnemer LinkFromSrc = false; 459dad0a645SDavid Majnemer break; 460dad0a645SDavid Majnemer case Comdat::SelectionKind::NoDuplicates: 461dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 462dad0a645SDavid Majnemer "': noduplicates has been violated!"); 463dad0a645SDavid Majnemer case Comdat::SelectionKind::ExactMatch: 464dad0a645SDavid Majnemer case Comdat::SelectionKind::Largest: 465dad0a645SDavid Majnemer case Comdat::SelectionKind::SameSize: { 466dad0a645SDavid Majnemer const GlobalVariable *DstGV; 467dad0a645SDavid Majnemer const GlobalVariable *SrcGV; 468dad0a645SDavid Majnemer if (getComdatLeader(DstM, ComdatName, DstGV) || 469dad0a645SDavid Majnemer getComdatLeader(SrcM, ComdatName, SrcGV)) 470dad0a645SDavid Majnemer return true; 471dad0a645SDavid Majnemer 4720e309fe8SRafael Espindola const DataLayout &DstDL = DstM.getDataLayout(); 4730e309fe8SRafael Espindola const DataLayout &SrcDL = SrcM.getDataLayout(); 474dad0a645SDavid Majnemer uint64_t DstSize = 47546a43556SMehdi Amini DstDL.getTypeAllocSize(DstGV->getType()->getPointerElementType()); 476dad0a645SDavid Majnemer uint64_t SrcSize = 47746a43556SMehdi Amini SrcDL.getTypeAllocSize(SrcGV->getType()->getPointerElementType()); 478dad0a645SDavid Majnemer if (Result == Comdat::SelectionKind::ExactMatch) { 479dad0a645SDavid Majnemer if (SrcGV->getInitializer() != DstGV->getInitializer()) 480dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 481dad0a645SDavid Majnemer "': ExactMatch violated!"); 482dad0a645SDavid Majnemer LinkFromSrc = false; 483dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::Largest) { 484dad0a645SDavid Majnemer LinkFromSrc = SrcSize > DstSize; 485dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::SameSize) { 486dad0a645SDavid Majnemer if (SrcSize != DstSize) 487dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 488dad0a645SDavid Majnemer "': SameSize violated!"); 489dad0a645SDavid Majnemer LinkFromSrc = false; 490dad0a645SDavid Majnemer } else { 491dad0a645SDavid Majnemer llvm_unreachable("unknown selection kind"); 492dad0a645SDavid Majnemer } 493dad0a645SDavid Majnemer break; 494dad0a645SDavid Majnemer } 495dad0a645SDavid Majnemer } 496dad0a645SDavid Majnemer 497dad0a645SDavid Majnemer return false; 498dad0a645SDavid Majnemer } 499dad0a645SDavid Majnemer 500dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC, 501dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 502dad0a645SDavid Majnemer bool &LinkFromSrc) { 503caabe228SRafael Espindola Module &DstM = Mover.getModule(); 504b16196a3SRafael Espindola Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 505dad0a645SDavid Majnemer StringRef ComdatName = SrcC->getName(); 5060e309fe8SRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 507dad0a645SDavid Majnemer Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 5082ef3f299SRafael Espindola 509b16196a3SRafael Espindola if (DstCI == ComdatSymTab.end()) { 510b16196a3SRafael Espindola // Use the comdat if it is only available in one of the modules. 511b16196a3SRafael Espindola LinkFromSrc = true; 512b16196a3SRafael Espindola Result = SSK; 5132ef3f299SRafael Espindola return false; 514b16196a3SRafael Espindola } 5152ef3f299SRafael Espindola 516dad0a645SDavid Majnemer const Comdat *DstC = &DstCI->second; 517dad0a645SDavid Majnemer Comdat::SelectionKind DSK = DstC->getSelectionKind(); 5182ef3f299SRafael Espindola return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 5192ef3f299SRafael Espindola LinkFromSrc); 520dad0a645SDavid Majnemer } 521f6f121e2SJames Molloy 522d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 523d12b4a33SRafael Espindola const GlobalValue &Dest, 524dbb0bd1aSRafael Espindola const GlobalValue &Src) { 525e5a61917STeresa Johnson 526e868123dSDuncan P. N. Exon Smith // Should we unconditionally use the Src? 527020d4fb1SArtem Belevich if (shouldOverrideFromSrc()) { 528e868123dSDuncan P. N. Exon Smith LinkFromSrc = true; 529e868123dSDuncan P. N. Exon Smith return false; 530e868123dSDuncan P. N. Exon Smith } 531e868123dSDuncan P. N. Exon Smith 532778fcc77SRafael Espindola // We always have to add Src if it has appending linkage. 533778fcc77SRafael Espindola if (Src.hasAppendingLinkage()) { 5341e20a652STeresa Johnson // Should have prevented importing for appending linkage in linkIfNeeded. 535c7ed52f2STeresa Johnson assert(!isPerformingImport()); 536778fcc77SRafael Espindola LinkFromSrc = true; 537778fcc77SRafael Espindola return false; 538778fcc77SRafael Espindola } 539778fcc77SRafael Espindola 540d4bcefc7SRafael Espindola bool SrcIsDeclaration = Src.isDeclarationForLinker(); 541d4bcefc7SRafael Espindola bool DestIsDeclaration = Dest.isDeclarationForLinker(); 542dbb0bd1aSRafael Espindola 543c7ed52f2STeresa Johnson if (isPerformingImport()) { 544c7ed52f2STeresa Johnson if (isa<Function>(&Src)) { 5454f04d85fSTeresa Johnson // For functions, LinkFromSrc iff this is a function requested 546c7ed52f2STeresa Johnson // for importing. For variables, decide below normally. 5474f04d85fSTeresa Johnson LinkFromSrc = FunctionsToImport->count(&Src); 548c7ed52f2STeresa Johnson return false; 549c7ed52f2STeresa Johnson } 550c7ed52f2STeresa Johnson 551c7ed52f2STeresa Johnson // Check if this is an alias with an already existing definition 552c7ed52f2STeresa Johnson // in Dest, which must have come from a prior importing pass from 553c7ed52f2STeresa Johnson // the same Src module. Unlike imported function and variable 554c7ed52f2STeresa Johnson // definitions, which are imported as available_externally and are 555c7ed52f2STeresa Johnson // not definitions for the linker, that is not a valid linkage for 556c7ed52f2STeresa Johnson // imported aliases which must be definitions. Simply use the existing 557c7ed52f2STeresa Johnson // Dest copy. 558c7ed52f2STeresa Johnson if (isa<GlobalAlias>(&Src) && !DestIsDeclaration) { 559c7ed52f2STeresa Johnson assert(isa<GlobalAlias>(&Dest)); 560c7ed52f2STeresa Johnson LinkFromSrc = false; 561c7ed52f2STeresa Johnson return false; 562c7ed52f2STeresa Johnson } 563c7ed52f2STeresa Johnson } 564c7ed52f2STeresa Johnson 565dbb0bd1aSRafael Espindola if (SrcIsDeclaration) { 566dbb0bd1aSRafael Espindola // If Src is external or if both Src & Dest are external.. Just link the 567dbb0bd1aSRafael Espindola // external globals, we aren't adding anything. 568d12b4a33SRafael Espindola if (Src.hasDLLImportStorageClass()) { 569dbb0bd1aSRafael Espindola // If one of GVs is marked as DLLImport, result should be dllimport'ed. 570d12b4a33SRafael Espindola LinkFromSrc = DestIsDeclaration; 571d12b4a33SRafael Espindola return false; 572d12b4a33SRafael Espindola } 573dbb0bd1aSRafael Espindola // If the Dest is weak, use the source linkage. 574ed11bd28SRafael Espindola if (Dest.hasExternalWeakLinkage()) { 575ed11bd28SRafael Espindola LinkFromSrc = true; 576ed11bd28SRafael Espindola return false; 577ed11bd28SRafael Espindola } 578ed11bd28SRafael Espindola // Link an available_externally over a declaration. 579ed11bd28SRafael Espindola LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 580d12b4a33SRafael Espindola return false; 581dbb0bd1aSRafael Espindola } 582dbb0bd1aSRafael Espindola 583d12b4a33SRafael Espindola if (DestIsDeclaration) { 584dbb0bd1aSRafael Espindola // If Dest is external but Src is not: 585d12b4a33SRafael Espindola LinkFromSrc = true; 586d12b4a33SRafael Espindola return false; 587d12b4a33SRafael Espindola } 588dbb0bd1aSRafael Espindola 5890910605aSRafael Espindola if (Src.hasCommonLinkage()) { 590d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 591d12b4a33SRafael Espindola LinkFromSrc = true; 5920910605aSRafael Espindola return false; 593d12b4a33SRafael Espindola } 594d12b4a33SRafael Espindola 595d12b4a33SRafael Espindola if (!Dest.hasCommonLinkage()) { 596d12b4a33SRafael Espindola LinkFromSrc = false; 597d12b4a33SRafael Espindola return false; 598d12b4a33SRafael Espindola } 5990910605aSRafael Espindola 600a28d91d8SMehdi Amini const DataLayout &DL = Dest.getParent()->getDataLayout(); 6010910605aSRafael Espindola uint64_t DestSize = DL.getTypeAllocSize(Dest.getType()->getElementType()); 6020910605aSRafael Espindola uint64_t SrcSize = DL.getTypeAllocSize(Src.getType()->getElementType()); 603d12b4a33SRafael Espindola LinkFromSrc = SrcSize > DestSize; 604d12b4a33SRafael Espindola return false; 6050910605aSRafael Espindola } 6060910605aSRafael Espindola 607dbb0bd1aSRafael Espindola if (Src.isWeakForLinker()) { 608dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 609dbb0bd1aSRafael Espindola assert(!Dest.hasAvailableExternallyLinkage()); 6100910605aSRafael Espindola 611d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 612d12b4a33SRafael Espindola LinkFromSrc = true; 613d12b4a33SRafael Espindola return false; 614d12b4a33SRafael Espindola } 615dbb0bd1aSRafael Espindola 616d12b4a33SRafael Espindola LinkFromSrc = false; 6170910605aSRafael Espindola return false; 618dbb0bd1aSRafael Espindola } 619dbb0bd1aSRafael Espindola 620dbb0bd1aSRafael Espindola if (Dest.isWeakForLinker()) { 621dbb0bd1aSRafael Espindola assert(Src.hasExternalLinkage()); 622d12b4a33SRafael Espindola LinkFromSrc = true; 623d12b4a33SRafael Espindola return false; 624dbb0bd1aSRafael Espindola } 625dbb0bd1aSRafael Espindola 626dbb0bd1aSRafael Espindola assert(!Src.hasExternalWeakLinkage()); 627dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 628dbb0bd1aSRafael Espindola assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 629dbb0bd1aSRafael Espindola "Unexpected linkage type!"); 630dbb0bd1aSRafael Espindola return emitError("Linking globals named '" + Src.getName() + 631dbb0bd1aSRafael Espindola "': symbol multiply defined!"); 632dbb0bd1aSRafael Espindola } 633dbb0bd1aSRafael Espindola 634baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 635baa3bf8fSRafael Espindola GlobalValue *DGV = getLinkedToGlobal(&GV); 636baa3bf8fSRafael Espindola 637baa3bf8fSRafael Espindola if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 638baa3bf8fSRafael Espindola return false; 639baa3bf8fSRafael Espindola 6404b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 6414b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 6424b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 6434b5ec263SRafael Espindola if (DGVar && SGVar) { 6444b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 6454b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 6464b5ec263SRafael Espindola DGVar->setConstant(false); 6474b5ec263SRafael Espindola SGVar->setConstant(false); 6484b5ec263SRafael Espindola } 6494b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 6504b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 6514b5ec263SRafael Espindola SGVar->setAlignment(Align); 6524b5ec263SRafael Espindola DGVar->setAlignment(Align); 6534b5ec263SRafael Espindola } 6544b5ec263SRafael Espindola } 6554b5ec263SRafael Espindola 656baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 657baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 658baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 659baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 6604b5ec263SRafael Espindola 6614b5ec263SRafael Espindola bool HasUnnamedAddr = GV.hasUnnamedAddr() && DGV->hasUnnamedAddr(); 6624b5ec263SRafael Espindola DGV->setUnnamedAddr(HasUnnamedAddr); 6634b5ec263SRafael Espindola GV.setUnnamedAddr(HasUnnamedAddr); 664baa3bf8fSRafael Espindola } 665baa3bf8fSRafael Espindola 6664b5ec263SRafael Espindola // Don't want to append to global_ctors list, for example, when we 6674b5ec263SRafael Espindola // are importing for ThinLTO, otherwise the global ctors and dtors 6684b5ec263SRafael Espindola // get executed multiple times for local variables (the latter causing 6694b5ec263SRafael Espindola // double frees). 6704b5ec263SRafael Espindola if (GV.hasAppendingLinkage() && isPerformingImport()) 6714b5ec263SRafael Espindola return false; 6724b5ec263SRafael Espindola 6734b5ec263SRafael Espindola if (isPerformingImport() && !doImportAsDefinition(&GV)) 6744b5ec263SRafael Espindola return false; 6754b5ec263SRafael Espindola 6764b5ec263SRafael Espindola if (!DGV && !shouldOverrideFromSrc() && 6774b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 6784b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 6794b5ec263SRafael Espindola return false; 6804b5ec263SRafael Espindola 681bd03c503SRafael Espindola if (GV.isDeclaration()) 682bd03c503SRafael Espindola return false; 683bd03c503SRafael Espindola 684baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 685baa3bf8fSRafael Espindola bool LinkFromSrc; 686baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 687baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 6884b5ec263SRafael Espindola if (LinkFromSrc) 6894b5ec263SRafael Espindola ValuesToLink.insert(&GV); 690baa3bf8fSRafael Espindola return false; 691baa3bf8fSRafael Espindola } 692baa3bf8fSRafael Espindola 6934b5ec263SRafael Espindola bool LinkFromSrc = true; 6944b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 6954b5ec263SRafael Espindola return true; 6964b5ec263SRafael Espindola if (LinkFromSrc) 6974b5ec263SRafael Espindola ValuesToLink.insert(&GV); 698baa3bf8fSRafael Espindola return false; 699baa3bf8fSRafael Espindola } 700baa3bf8fSRafael Espindola 701caabe228SRafael Espindola void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) { 702caabe228SRafael Espindola // Add these to the internalize list 703caabe228SRafael Espindola if (!GV.hasLinkOnceLinkage()) 704caabe228SRafael Espindola return; 705caabe228SRafael Espindola 706caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) 707caabe228SRafael Espindola Internalize.insert(GV.getName()); 708caabe228SRafael Espindola Add(GV); 709caabe228SRafael Espindola 710caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 711caabe228SRafael Espindola if (!SC) 712caabe228SRafael Espindola return; 713caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) { 714caabe228SRafael Espindola if (!GV2->hasLocalLinkage() && shouldInternalizeLinkedSymbols()) 715caabe228SRafael Espindola Internalize.insert(GV2->getName()); 716caabe228SRafael Espindola Add(*GV2); 717caabe228SRafael Espindola } 718caabe228SRafael Espindola } 719caabe228SRafael Espindola 7204504c1bcSTeresa Johnson void ThinLTOGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) { 721caabe228SRafael Espindola if (GV.hasLocalLinkage() && 722caabe228SRafael Espindola (doPromoteLocalToGlobal(&GV) || isPerformingImport())) { 723caabe228SRafael Espindola GV.setName(getName(&GV)); 724caabe228SRafael Espindola GV.setLinkage(getLinkage(&GV)); 725caabe228SRafael Espindola if (!GV.hasLocalLinkage()) 726caabe228SRafael Espindola GV.setVisibility(GlobalValue::HiddenVisibility); 727caabe228SRafael Espindola if (isModuleExporting()) 7284504c1bcSTeresa Johnson NewExportedValues.insert(&GV); 729caabe228SRafael Espindola return; 730caabe228SRafael Espindola } 731caabe228SRafael Espindola GV.setLinkage(getLinkage(&GV)); 732caabe228SRafael Espindola } 733caabe228SRafael Espindola 7344504c1bcSTeresa Johnson void ThinLTOGlobalProcessing::processGlobalsForThinLTO() { 7354504c1bcSTeresa Johnson for (GlobalVariable &GV : M.globals()) 736caabe228SRafael Espindola processGlobalForThinLTO(GV); 7374504c1bcSTeresa Johnson for (Function &SF : M) 738caabe228SRafael Espindola processGlobalForThinLTO(SF); 7394504c1bcSTeresa Johnson for (GlobalAlias &GA : M.aliases()) 740caabe228SRafael Espindola processGlobalForThinLTO(GA); 741caabe228SRafael Espindola } 742caabe228SRafael Espindola 7434504c1bcSTeresa Johnson bool ThinLTOGlobalProcessing::run() { 7444504c1bcSTeresa Johnson processGlobalsForThinLTO(); 7454504c1bcSTeresa Johnson return false; 7464504c1bcSTeresa Johnson } 7474504c1bcSTeresa Johnson 748b1ed91f3SChris Lattner bool ModuleLinker::run() { 7490e309fe8SRafael Espindola for (const auto &SMEC : SrcM.getComdatSymbolTable()) { 750dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 751dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 752dad0a645SDavid Majnemer continue; 753dad0a645SDavid Majnemer Comdat::SelectionKind SK; 754dad0a645SDavid Majnemer bool LinkFromSrc; 755dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 756dad0a645SDavid Majnemer return true; 757dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 758dad0a645SDavid Majnemer } 759dad0a645SDavid Majnemer 7600e309fe8SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 761baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 762baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GV); 763baa3bf8fSRafael Espindola 7640e309fe8SRafael Espindola for (Function &SF : SrcM) 765baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 766baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&SF); 767baa3bf8fSRafael Espindola 7680e309fe8SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 769baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 770baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GA); 771baa3bf8fSRafael Espindola 772b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 773b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 7740e309fe8SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 775baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 776b1ed91f3SChris Lattner return true; 777b1ed91f3SChris Lattner 7780e309fe8SRafael Espindola for (Function &SF : SrcM) 779baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 780b1ed91f3SChris Lattner return true; 781b1ed91f3SChris Lattner 7820e309fe8SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 783baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 784b1ed91f3SChris Lattner return true; 785b1ed91f3SChris Lattner 7864504c1bcSTeresa Johnson if (ImportIndex) { 7874504c1bcSTeresa Johnson ThinLTOGlobalProcessing ThinLTOProcessing(SrcM, ImportIndex, 7884504c1bcSTeresa Johnson FunctionsToImport); 7894504c1bcSTeresa Johnson if (ThinLTOProcessing.run()) 7904504c1bcSTeresa Johnson return true; 7914504c1bcSTeresa Johnson for (auto *GV : ThinLTOProcessing.getNewExportedValues()) 7924504c1bcSTeresa Johnson ValuesToLink.insert(GV); 7934504c1bcSTeresa Johnson } 794caabe228SRafael Espindola 795caabe228SRafael Espindola for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 796caabe228SRafael Espindola GlobalValue *GV = ValuesToLink[I]; 797caabe228SRafael Espindola const Comdat *SC = GV->getComdat(); 798caabe228SRafael Espindola if (!SC) 799caabe228SRafael Espindola continue; 800caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) 801caabe228SRafael Espindola ValuesToLink.insert(GV2); 802caabe228SRafael Espindola } 803caabe228SRafael Espindola 804caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) { 805caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 806caabe228SRafael Espindola Internalize.insert(GV->getName()); 807caabe228SRafael Espindola } 808caabe228SRafael Espindola 809f81c7b03SRafael Espindola if (Mover.move(SrcM, ValuesToLink.getArrayRef(), 810caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 811caabe228SRafael Espindola addLazyFor(GV, Add); 812e5a61917STeresa Johnson }, 813e5a61917STeresa Johnson ValIDToTempMDMap, false)) 8144b5ec263SRafael Espindola return true; 815caabe228SRafael Espindola Module &DstM = Mover.getModule(); 816caabe228SRafael Espindola for (auto &P : Internalize) { 817caabe228SRafael Espindola GlobalValue *GV = DstM.getNamedValue(P.first()); 818caabe228SRafael Espindola GV->setLinkage(GlobalValue::InternalLinkage); 819beadd56aSRafael Espindola } 820beadd56aSRafael Espindola 8212609888fSAnton Korobeynikov return false; 8222609888fSAnton Korobeynikov } 823361e513dSReid Spencer 8249d2bfc48SRafael Espindola Linker::Linker(Module &M) : Mover(M) {} 8253df61b7bSRafael Espindola 826434e9561SRafael Espindola bool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags, 8278220e8a8SMehdi Amini const FunctionInfoIndex *Index, 828e5a61917STeresa Johnson DenseSet<const GlobalValue *> *FunctionsToImport, 829e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) { 830bef54363STeresa Johnson ModuleLinker ModLinker(Mover, *Src, Flags, Index, FunctionsToImport, 831e5a61917STeresa Johnson ValIDToTempMDMap); 832bef54363STeresa Johnson return ModLinker.run(); 833434e9561SRafael Espindola } 834434e9561SRafael Espindola 835434e9561SRafael Espindola bool Linker::linkInModuleForCAPI(Module &Src) { 836bef54363STeresa Johnson ModuleLinker ModLinker(Mover, Src, 0, nullptr, nullptr); 837bef54363STeresa Johnson return ModLinker.run(); 8383df61b7bSRafael Espindola } 8393df61b7bSRafael Espindola 840e5a61917STeresa Johnson bool Linker::linkInMetadata(Module &Src, 841e5a61917STeresa Johnson DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) { 842e5a61917STeresa Johnson SetVector<GlobalValue *> ValuesToLink; 843e5a61917STeresa Johnson if (Mover.move( 844e5a61917STeresa Johnson Src, ValuesToLink.getArrayRef(), 845e5a61917STeresa Johnson [this](GlobalValue &GV, IRMover::ValueAdder Add) { assert(false); }, 846e5a61917STeresa Johnson ValIDToTempMDMap, true)) 847e5a61917STeresa Johnson return true; 848e5a61917STeresa Johnson return false; 849e5a61917STeresa Johnson } 850e5a61917STeresa Johnson 851b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 852b1ed91f3SChris Lattner // LinkModules entrypoint. 853b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 854b1ed91f3SChris Lattner 85518c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 85618c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 85718c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 85818c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 85918c89411SRafael Espindola /// relied on to be consistent. 860434e9561SRafael Espindola bool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src, 861434e9561SRafael Espindola unsigned Flags) { 8629d2bfc48SRafael Espindola Linker L(Dest); 863434e9561SRafael Espindola return L.linkInModule(std::move(Src), Flags); 8644160f5d3SRafael Espindola } 8654160f5d3SRafael Espindola 866*1b00f2d9STeresa Johnson bool llvm::renameModuleForThinLTO(Module &M, const FunctionInfoIndex *Index) { 867*1b00f2d9STeresa Johnson ThinLTOGlobalProcessing ThinLTOProcessing(M, Index); 868*1b00f2d9STeresa Johnson return ThinLTOProcessing.run(); 869bae7e759STeresa Johnson } 870bae7e759STeresa Johnson 871a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 872a3aeb980SBill Wendling // C API. 873a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 874a3aeb980SBill Wendling 8759d2bfc48SRafael Espindola static void diagnosticHandler(const DiagnosticInfo &DI, void *C) { 8769d2bfc48SRafael Espindola auto *Message = reinterpret_cast<std::string *>(C); 8779d2bfc48SRafael Espindola raw_string_ostream Stream(*Message); 8789d2bfc48SRafael Espindola DiagnosticPrinterRawOStream DP(Stream); 8799d2bfc48SRafael Espindola DI.print(DP); 8809d2bfc48SRafael Espindola } 8819d2bfc48SRafael Espindola 882a3aeb980SBill Wendling LLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src, 883a57d588cSJuergen Ributzka LLVMLinkerMode Unused, char **OutMessages) { 88498ab63ceSRafael Espindola Module *D = unwrap(Dest); 8859d2bfc48SRafael Espindola LLVMContext &Ctx = D->getContext(); 8869d2bfc48SRafael Espindola 8879d2bfc48SRafael Espindola LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler = 8889d2bfc48SRafael Espindola Ctx.getDiagnosticHandler(); 8899d2bfc48SRafael Espindola void *OldDiagnosticContext = Ctx.getDiagnosticContext(); 89098ab63ceSRafael Espindola std::string Message; 8919d2bfc48SRafael Espindola Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true); 8924160f5d3SRafael Espindola 893434e9561SRafael Espindola Linker L(*D); 894434e9561SRafael Espindola Module *M = unwrap(Src); 895434e9561SRafael Espindola LLVMBool Result = L.linkInModuleForCAPI(*M); 89698ab63ceSRafael Espindola 8979d2bfc48SRafael Espindola Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true); 8989d2bfc48SRafael Espindola 8999d2bfc48SRafael Espindola if (OutMessages && Result) 90098ab63ceSRafael Espindola *OutMessages = strdup(Message.c_str()); 901a3aeb980SBill Wendling return Result; 902a3aeb980SBill Wendling } 903434e9561SRafael Espindola 904434e9561SRafael Espindola LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 905434e9561SRafael Espindola Module *D = unwrap(Dest); 906434e9561SRafael Espindola std::unique_ptr<Module> M(unwrap(Src)); 907434e9561SRafael Espindola return Linker::linkModules(*D, std::move(M)); 908434e9561SRafael Espindola } 909