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" 20361e513dSReid Spencer using namespace llvm; 21361e513dSReid Spencer 22b1ed91f3SChris Lattner namespace { 23d12b4a33SRafael Espindola 2418c89411SRafael Espindola /// This is an implementation class for the LinkModules function, which is the 2518c89411SRafael Espindola /// entrypoint for this file. 26b1ed91f3SChris Lattner class ModuleLinker { 27caabe228SRafael Espindola IRMover &Mover; 280e309fe8SRafael Espindola Module &SrcM; 29b1ed91f3SChris Lattner 304b5ec263SRafael Espindola SetVector<GlobalValue *> ValuesToLink; 31caabe228SRafael Espindola StringSet<> Internalize; 324160f5d3SRafael Espindola 33e868123dSDuncan P. N. Exon Smith /// For symbol clashes, prefer those from Src. 34020d4fb1SArtem Belevich unsigned Flags; 35e868123dSDuncan P. N. Exon Smith 36c7ed52f2STeresa Johnson /// Function index passed into ModuleLinker for using in function 37c7ed52f2STeresa Johnson /// importing/exporting handling. 388220e8a8SMehdi Amini const FunctionInfoIndex *ImportIndex; 39c7ed52f2STeresa Johnson 40c7ed52f2STeresa Johnson /// Function to import from source module, all other functions are 41c7ed52f2STeresa Johnson /// imported as declarations instead of definitions. 42ffe2e4aaSMehdi Amini DenseSet<const GlobalValue *> *ImportFunction; 43c7ed52f2STeresa Johnson 44c7ed52f2STeresa Johnson /// Set to true if the given FunctionInfoIndex contains any functions 45c7ed52f2STeresa Johnson /// from this source module, in which case we must conservatively assume 46c7ed52f2STeresa Johnson /// that any of its functions may be imported into another module 47c7ed52f2STeresa Johnson /// as part of a different backend compilation process. 48af714765SRafael Espindola bool HasExportedFunctions = false; 49c7ed52f2STeresa Johnson 50caabe228SRafael Espindola /// Used as the callback for lazy linking. 51caabe228SRafael Espindola /// The mover has just hit GV and we have to decide if it, and other members 52caabe228SRafael Espindola /// of the same comdat, should be linked. Every member to be linked is passed 53caabe228SRafael Espindola /// to Add. 54caabe228SRafael Espindola void addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add); 55baa3bf8fSRafael Espindola 56020d4fb1SArtem Belevich bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 57020d4fb1SArtem Belevich bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 58020d4fb1SArtem Belevich bool shouldInternalizeLinkedSymbols() { 59020d4fb1SArtem Belevich return Flags & Linker::InternalizeLinkedSymbols; 60020d4fb1SArtem Belevich } 61020d4fb1SArtem Belevich 62c7ed52f2STeresa Johnson /// Check if we should promote the given local value to global scope. 63c7ed52f2STeresa Johnson bool doPromoteLocalToGlobal(const GlobalValue *SGV); 64c7ed52f2STeresa Johnson 65d12b4a33SRafael Espindola bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 66d12b4a33SRafael Espindola const GlobalValue &Src); 67dbb0bd1aSRafael Espindola 68caabe228SRafael Espindola /// Should we have mover and linker error diag info? 69b1ed91f3SChris Lattner bool emitError(const Twine &Message) { 70caabe228SRafael Espindola Mover.getDiagnosticHandler()(LinkDiagnosticInfo(DS_Error, Message)); 71b1ed91f3SChris Lattner return true; 72b1ed91f3SChris Lattner } 73b1ed91f3SChris Lattner 740e309fe8SRafael Espindola bool getComdatLeader(Module &M, StringRef ComdatName, 75dad0a645SDavid Majnemer const GlobalVariable *&GVar); 76dad0a645SDavid Majnemer bool computeResultingSelectionKind(StringRef ComdatName, 77dad0a645SDavid Majnemer Comdat::SelectionKind Src, 78dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 79dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 80dad0a645SDavid Majnemer bool &LinkFromSrc); 81dad0a645SDavid Majnemer std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 82dad0a645SDavid Majnemer ComdatsChosen; 83dad0a645SDavid Majnemer bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 84dad0a645SDavid Majnemer bool &LinkFromSrc); 852d5fb8caSTeresa Johnson // Keep track of the global value members of each comdat in source. 862d5fb8caSTeresa Johnson DenseMap<const Comdat *, std::vector<GlobalValue *>> ComdatMembers; 87dad0a645SDavid Majnemer 8818c89411SRafael Espindola /// Given a global in the source module, return the global in the 8918c89411SRafael Espindola /// destination module that is being linked to, if any. 903e8bc6a8SRafael Espindola GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 91caabe228SRafael Espindola Module &DstM = Mover.getModule(); 92b1ed91f3SChris Lattner // If the source has no name it can't link. If it has local linkage, 93b1ed91f3SChris Lattner // there is no name match-up going on. 94b098f0c1STeresa Johnson if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(getLinkage(SrcGV))) 952617dcceSCraig Topper return nullptr; 96b1ed91f3SChris Lattner 97b1ed91f3SChris Lattner // Otherwise see if we have a match in the destination module's symtab. 980e309fe8SRafael Espindola GlobalValue *DGV = DstM.getNamedValue(getName(SrcGV)); 99c84f608bSRafael Espindola if (!DGV) 100c84f608bSRafael Espindola return nullptr; 101b1ed91f3SChris Lattner 102b1ed91f3SChris Lattner // If we found a global with the same name in the dest module, but it has 103b1ed91f3SChris Lattner // internal linkage, we are really not doing any linkage here. 104b1ed91f3SChris Lattner if (DGV->hasLocalLinkage()) 1052617dcceSCraig Topper return nullptr; 106b1ed91f3SChris Lattner 107b1ed91f3SChris Lattner // Otherwise, we do in fact link to the destination global. 108b1ed91f3SChris Lattner return DGV; 109b1ed91f3SChris Lattner } 110b1ed91f3SChris Lattner 111baa3bf8fSRafael Espindola bool linkIfNeeded(GlobalValue &GV); 112c7ed52f2STeresa Johnson 113c7ed52f2STeresa Johnson /// Helper methods to check if we are importing from or potentially 114c7ed52f2STeresa Johnson /// exporting from the current source module. 115c7ed52f2STeresa Johnson bool isPerformingImport() { return ImportFunction != nullptr; } 116c7ed52f2STeresa Johnson bool isModuleExporting() { return HasExportedFunctions; } 117c7ed52f2STeresa Johnson 118c7ed52f2STeresa Johnson /// If we are importing from the source module, checks if we should 119c7ed52f2STeresa Johnson /// import SGV as a definition, otherwise import as a declaration. 120c7ed52f2STeresa Johnson bool doImportAsDefinition(const GlobalValue *SGV); 121c7ed52f2STeresa Johnson 122c7ed52f2STeresa Johnson /// Get the name for SGV that should be used in the linked destination 123c7ed52f2STeresa Johnson /// module. Specifically, this handles the case where we need to rename 124c7ed52f2STeresa Johnson /// a local that is being promoted to global scope. 125c7ed52f2STeresa Johnson std::string getName(const GlobalValue *SGV); 126c7ed52f2STeresa Johnson 127caabe228SRafael Espindola /// Process globals so that they can be used in ThinLTO. This includes 128caabe228SRafael Espindola /// promoting local variables so that they can be reference externally by 129caabe228SRafael Espindola /// thin lto imported globals and converting strong external globals to 130caabe228SRafael Espindola /// available_externally. 131caabe228SRafael Espindola void processGlobalsForThinLTO(); 132caabe228SRafael Espindola void processGlobalForThinLTO(GlobalValue &GV); 133caabe228SRafael Espindola 134c7ed52f2STeresa Johnson /// Get the new linkage for SGV that should be used in the linked destination 135c7ed52f2STeresa Johnson /// module. Specifically, for ThinLTO importing or exporting it may need 136c7ed52f2STeresa Johnson /// to be adjusted. 137c7ed52f2STeresa Johnson GlobalValue::LinkageTypes getLinkage(const GlobalValue *SGV); 138c7ed52f2STeresa Johnson 139c7ed52f2STeresa Johnson /// Copies the necessary global value attributes and name from the source 140c7ed52f2STeresa Johnson /// to the newly cloned global value. 141c7ed52f2STeresa Johnson void copyGVAttributes(GlobalValue *NewGV, const GlobalValue *SrcGV); 142c7ed52f2STeresa Johnson 143c7ed52f2STeresa Johnson /// Updates the visibility for the new global cloned from the source 144c7ed52f2STeresa Johnson /// and, if applicable, linked with an existing destination global. 145c7ed52f2STeresa Johnson /// Handles visibility change required for promoted locals. 146c7ed52f2STeresa Johnson void setVisibility(GlobalValue *NewGV, const GlobalValue *SGV, 147c7ed52f2STeresa Johnson const GlobalValue *DGV = nullptr); 148c7ed52f2STeresa Johnson 149d57f9f0cSRafael Espindola public: 150caabe228SRafael Espindola ModuleLinker(IRMover &Mover, Module &SrcM, unsigned Flags, 151d57f9f0cSRafael Espindola const FunctionInfoIndex *Index = nullptr, 152d57f9f0cSRafael Espindola DenseSet<const GlobalValue *> *FunctionsToImport = nullptr) 153caabe228SRafael Espindola : Mover(Mover), SrcM(SrcM), Flags(Flags), ImportIndex(Index), 154d57f9f0cSRafael Espindola ImportFunction(FunctionsToImport) { 155d57f9f0cSRafael Espindola assert((ImportIndex || !ImportFunction) && 156d57f9f0cSRafael Espindola "Expect a FunctionInfoIndex when importing"); 157d57f9f0cSRafael Espindola // If we have a FunctionInfoIndex but no function to import, 158d57f9f0cSRafael Espindola // then this is the primary module being compiled in a ThinLTO 159d57f9f0cSRafael Espindola // backend compilation, and we need to see if it has functions that 160d57f9f0cSRafael Espindola // may be exported to another backend compilation. 161d57f9f0cSRafael Espindola if (ImportIndex && !ImportFunction) 162d57f9f0cSRafael Espindola HasExportedFunctions = ImportIndex->hasExportedFunctions(SrcM); 163d57f9f0cSRafael Espindola } 164d57f9f0cSRafael Espindola 165d57f9f0cSRafael Espindola bool run(); 166eee6f995SChris Lattner }; 167f00654e3SAlexander Kornienko } 168d48b7783SBill Wendling 16918c89411SRafael Espindola /// The LLVM SymbolTable class autorenames globals that conflict in the symbol 17018c89411SRafael Espindola /// table. This is good for all clients except for us. Go through the trouble 17118c89411SRafael Espindola /// to force this back. 172b1ed91f3SChris Lattner static void forceRenaming(GlobalValue *GV, StringRef Name) { 173b1ed91f3SChris Lattner // If the global doesn't force its name or if it already has the right name, 174b1ed91f3SChris Lattner // there is nothing for us to do. 175c7ed52f2STeresa Johnson // Note that any required local to global promotion should already be done, 176c7ed52f2STeresa Johnson // so promoted locals will not skip this handling as their linkage is no 177c7ed52f2STeresa Johnson // longer local. 178b1ed91f3SChris Lattner if (GV->hasLocalLinkage() || GV->getName() == Name) 179b1ed91f3SChris Lattner return; 180b1ed91f3SChris Lattner 181b1ed91f3SChris Lattner Module *M = GV->getParent(); 182361e513dSReid Spencer 183361e513dSReid Spencer // If there is a conflict, rename the conflict. 184b1ed91f3SChris Lattner if (GlobalValue *ConflictGV = M->getNamedValue(Name)) { 1852a8d2e0eSChris Lattner GV->takeName(ConflictGV); 186361e513dSReid Spencer ConflictGV->setName(Name); // This will cause ConflictGV to get renamed 187b1ed91f3SChris Lattner assert(ConflictGV->getName() != Name && "forceRenaming didn't work"); 1882a8d2e0eSChris Lattner } else { 1892a8d2e0eSChris Lattner GV->setName(Name); // Force the name back 1903aaaa0b2SReid Spencer } 1913aaaa0b2SReid Spencer } 1923aaaa0b2SReid Spencer 19318c89411SRafael Espindola /// copy additional attributes (those not needed to construct a GlobalValue) 19418c89411SRafael Espindola /// from the SrcGV to the DestGV. 195c7ed52f2STeresa Johnson void ModuleLinker::copyGVAttributes(GlobalValue *NewGV, 196c7ed52f2STeresa Johnson const GlobalValue *SrcGV) { 197c7ed52f2STeresa Johnson NewGV->copyAttributesFrom(SrcGV); 198c7ed52f2STeresa Johnson forceRenaming(NewGV, getName(SrcGV)); 199361e513dSReid Spencer } 200361e513dSReid Spencer 201c7ed52f2STeresa Johnson bool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) { 202c7ed52f2STeresa Johnson if (!isPerformingImport()) 203c7ed52f2STeresa Johnson return false; 2043cd8161cSTeresa Johnson auto *GA = dyn_cast<GlobalAlias>(SGV); 2053cd8161cSTeresa Johnson if (GA) { 2063cd8161cSTeresa Johnson if (GA->hasWeakAnyLinkage()) 2073cd8161cSTeresa Johnson return false; 20889345771SRafael Espindola const GlobalObject *GO = GA->getBaseObject(); 20989345771SRafael Espindola if (!GO->hasLinkOnceODRLinkage()) 21089345771SRafael Espindola return false; 21189345771SRafael Espindola return doImportAsDefinition(GO); 2123cd8161cSTeresa Johnson } 213dfbebc37STeresa Johnson // Always import GlobalVariable definitions, except for the special 214dfbebc37STeresa Johnson // case of WeakAny which are imported as ExternalWeak declarations 215dfbebc37STeresa Johnson // (see comments in ModuleLinker::getLinkage). The linkage changes 216c7ed52f2STeresa Johnson // described in ModuleLinker::getLinkage ensure the correct behavior (e.g. 217c7ed52f2STeresa Johnson // global variables with external linkage are transformed to 2183cd8161cSTeresa Johnson // available_externally definitions, which are ultimately turned into 2193cd8161cSTeresa Johnson // declarations after the EliminateAvailableExternally pass). 22066059c9fSCraig Topper if (isa<GlobalVariable>(SGV) && !SGV->isDeclaration() && 2213cd8161cSTeresa Johnson !SGV->hasWeakAnyLinkage()) 222c7ed52f2STeresa Johnson return true; 223c7ed52f2STeresa Johnson // Only import the function requested for importing. 224c7ed52f2STeresa Johnson auto *SF = dyn_cast<Function>(SGV); 225ffe2e4aaSMehdi Amini if (SF && ImportFunction->count(SF)) 226c7ed52f2STeresa Johnson return true; 227c7ed52f2STeresa Johnson // Otherwise no. 228c7ed52f2STeresa Johnson return false; 229c7ed52f2STeresa Johnson } 230c7ed52f2STeresa Johnson 231c7ed52f2STeresa Johnson bool ModuleLinker::doPromoteLocalToGlobal(const GlobalValue *SGV) { 232c7ed52f2STeresa Johnson assert(SGV->hasLocalLinkage()); 233c7ed52f2STeresa Johnson // Both the imported references and the original local variable must 234c7ed52f2STeresa Johnson // be promoted. 235c7ed52f2STeresa Johnson if (!isPerformingImport() && !isModuleExporting()) 236c7ed52f2STeresa Johnson return false; 237c7ed52f2STeresa Johnson 238c7ed52f2STeresa Johnson // Local const variables never need to be promoted unless they are address 239c7ed52f2STeresa Johnson // taken. The imported uses can simply use the clone created in this module. 240c7ed52f2STeresa Johnson // For now we are conservative in determining which variables are not 241c7ed52f2STeresa Johnson // address taken by checking the unnamed addr flag. To be more aggressive, 242c7ed52f2STeresa Johnson // the address taken information must be checked earlier during parsing 243c7ed52f2STeresa Johnson // of the module and recorded in the function index for use when importing 244c7ed52f2STeresa Johnson // from that module. 245c7ed52f2STeresa Johnson auto *GVar = dyn_cast<GlobalVariable>(SGV); 246c7ed52f2STeresa Johnson if (GVar && GVar->isConstant() && GVar->hasUnnamedAddr()) 247c7ed52f2STeresa Johnson return false; 248c7ed52f2STeresa Johnson 249c7ed52f2STeresa Johnson // Eventually we only need to promote functions in the exporting module that 250c7ed52f2STeresa Johnson // are referenced by a potentially exported function (i.e. one that is in the 251c7ed52f2STeresa Johnson // function index). 252c7ed52f2STeresa Johnson return true; 253c7ed52f2STeresa Johnson } 254c7ed52f2STeresa Johnson 255c7ed52f2STeresa Johnson std::string ModuleLinker::getName(const GlobalValue *SGV) { 256c7ed52f2STeresa Johnson // For locals that must be promoted to global scope, ensure that 257c7ed52f2STeresa Johnson // the promoted name uniquely identifies the copy in the original module, 258c7ed52f2STeresa Johnson // using the ID assigned during combined index creation. When importing, 259c7ed52f2STeresa Johnson // we rename all locals (not just those that are promoted) in order to 260c7ed52f2STeresa Johnson // avoid naming conflicts between locals imported from different modules. 261c7ed52f2STeresa Johnson if (SGV->hasLocalLinkage() && 262c7ed52f2STeresa Johnson (doPromoteLocalToGlobal(SGV) || isPerformingImport())) 263c7ed52f2STeresa Johnson return FunctionInfoIndex::getGlobalNameForLocal( 264c7ed52f2STeresa Johnson SGV->getName(), 265c7ed52f2STeresa Johnson ImportIndex->getModuleId(SGV->getParent()->getModuleIdentifier())); 266c7ed52f2STeresa Johnson return SGV->getName(); 267c7ed52f2STeresa Johnson } 268c7ed52f2STeresa Johnson 269c7ed52f2STeresa Johnson GlobalValue::LinkageTypes ModuleLinker::getLinkage(const GlobalValue *SGV) { 270c7ed52f2STeresa Johnson // Any local variable that is referenced by an exported function needs 271c7ed52f2STeresa Johnson // to be promoted to global scope. Since we don't currently know which 272c7ed52f2STeresa Johnson // functions reference which local variables/functions, we must treat 273c7ed52f2STeresa Johnson // all as potentially exported if this module is exporting anything. 274c7ed52f2STeresa Johnson if (isModuleExporting()) { 275c7ed52f2STeresa Johnson if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV)) 276c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 277c7ed52f2STeresa Johnson return SGV->getLinkage(); 278c7ed52f2STeresa Johnson } 279c7ed52f2STeresa Johnson 280c7ed52f2STeresa Johnson // Otherwise, if we aren't importing, no linkage change is needed. 281c7ed52f2STeresa Johnson if (!isPerformingImport()) 282c7ed52f2STeresa Johnson return SGV->getLinkage(); 283c7ed52f2STeresa Johnson 284c7ed52f2STeresa Johnson switch (SGV->getLinkage()) { 285c7ed52f2STeresa Johnson case GlobalValue::ExternalLinkage: 286c7ed52f2STeresa Johnson // External defnitions are converted to available_externally 287c7ed52f2STeresa Johnson // definitions upon import, so that they are available for inlining 288c7ed52f2STeresa Johnson // and/or optimization, but are turned into declarations later 289c7ed52f2STeresa Johnson // during the EliminateAvailableExternally pass. 2903cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 291c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 292c7ed52f2STeresa Johnson // An imported external declaration stays external. 293c7ed52f2STeresa Johnson return SGV->getLinkage(); 294c7ed52f2STeresa Johnson 295c7ed52f2STeresa Johnson case GlobalValue::AvailableExternallyLinkage: 296c7ed52f2STeresa Johnson // An imported available_externally definition converts 297c7ed52f2STeresa Johnson // to external if imported as a declaration. 298c7ed52f2STeresa Johnson if (!doImportAsDefinition(SGV)) 299c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 300c7ed52f2STeresa Johnson // An imported available_externally declaration stays that way. 301c7ed52f2STeresa Johnson return SGV->getLinkage(); 302c7ed52f2STeresa Johnson 303c7ed52f2STeresa Johnson case GlobalValue::LinkOnceAnyLinkage: 304c7ed52f2STeresa Johnson case GlobalValue::LinkOnceODRLinkage: 305c7ed52f2STeresa Johnson // These both stay the same when importing the definition. 306c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 307c7ed52f2STeresa Johnson return SGV->getLinkage(); 308c7ed52f2STeresa Johnson 309c7ed52f2STeresa Johnson case GlobalValue::WeakAnyLinkage: 310c7ed52f2STeresa Johnson // Can't import weak_any definitions correctly, or we might change the 311c7ed52f2STeresa Johnson // program semantics, since the linker will pick the first weak_any 312c7ed52f2STeresa Johnson // definition and importing would change the order they are seen by the 313c7ed52f2STeresa Johnson // linker. The module linking caller needs to enforce this. 314c7ed52f2STeresa Johnson assert(!doImportAsDefinition(SGV)); 315c7ed52f2STeresa Johnson // If imported as a declaration, it becomes external_weak. 316c7ed52f2STeresa Johnson return GlobalValue::ExternalWeakLinkage; 317c7ed52f2STeresa Johnson 318c7ed52f2STeresa Johnson case GlobalValue::WeakODRLinkage: 319c7ed52f2STeresa Johnson // For weak_odr linkage, there is a guarantee that all copies will be 320c7ed52f2STeresa Johnson // equivalent, so the issue described above for weak_any does not exist, 321c7ed52f2STeresa Johnson // and the definition can be imported. It can be treated similarly 322c7ed52f2STeresa Johnson // to an imported externally visible global value. 3233cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 324c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 325c7ed52f2STeresa Johnson else 326c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 327c7ed52f2STeresa Johnson 328c7ed52f2STeresa Johnson case GlobalValue::AppendingLinkage: 329c7ed52f2STeresa Johnson // It would be incorrect to import an appending linkage variable, 330c7ed52f2STeresa Johnson // since it would cause global constructors/destructors to be 331c7ed52f2STeresa Johnson // executed multiple times. This should have already been handled 3321e20a652STeresa Johnson // by linkIfNeeded, and we will assert in shouldLinkFromSource 3331e20a652STeresa Johnson // if we try to import, so we simply return AppendingLinkage here 3341e20a652STeresa Johnson // as this helper is called more widely in getLinkedToGlobal. 3351e20a652STeresa Johnson return GlobalValue::AppendingLinkage; 336c7ed52f2STeresa Johnson 337c7ed52f2STeresa Johnson case GlobalValue::InternalLinkage: 338c7ed52f2STeresa Johnson case GlobalValue::PrivateLinkage: 339c7ed52f2STeresa Johnson // If we are promoting the local to global scope, it is handled 340c7ed52f2STeresa Johnson // similarly to a normal externally visible global. 341c7ed52f2STeresa Johnson if (doPromoteLocalToGlobal(SGV)) { 3423cd8161cSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 343c7ed52f2STeresa Johnson return GlobalValue::AvailableExternallyLinkage; 344c7ed52f2STeresa Johnson else 345c7ed52f2STeresa Johnson return GlobalValue::ExternalLinkage; 346c7ed52f2STeresa Johnson } 347c7ed52f2STeresa Johnson // A non-promoted imported local definition stays local. 348c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 349c7ed52f2STeresa Johnson return SGV->getLinkage(); 350c7ed52f2STeresa Johnson 351c7ed52f2STeresa Johnson case GlobalValue::ExternalWeakLinkage: 352c7ed52f2STeresa Johnson // External weak doesn't apply to definitions, must be a declaration. 353c7ed52f2STeresa Johnson assert(!doImportAsDefinition(SGV)); 354c7ed52f2STeresa Johnson // Linkage stays external_weak. 355c7ed52f2STeresa Johnson return SGV->getLinkage(); 356c7ed52f2STeresa Johnson 357c7ed52f2STeresa Johnson case GlobalValue::CommonLinkage: 358c7ed52f2STeresa Johnson // Linkage stays common on definitions. 359c7ed52f2STeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 360c7ed52f2STeresa Johnson return SGV->getLinkage(); 361c7ed52f2STeresa Johnson } 362c7ed52f2STeresa Johnson 363c7ed52f2STeresa Johnson llvm_unreachable("unknown linkage type"); 364c7ed52f2STeresa Johnson } 365c7ed52f2STeresa Johnson 366eb5e0a77SRafael Espindola static GlobalValue::VisibilityTypes 367eb5e0a77SRafael Espindola getMinVisibility(GlobalValue::VisibilityTypes A, 368eb5e0a77SRafael Espindola GlobalValue::VisibilityTypes B) { 369eb5e0a77SRafael Espindola if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 370eb5e0a77SRafael Espindola return GlobalValue::HiddenVisibility; 371eb5e0a77SRafael Espindola if (A == GlobalValue::ProtectedVisibility || 372eb5e0a77SRafael Espindola B == GlobalValue::ProtectedVisibility) 373eb5e0a77SRafael Espindola return GlobalValue::ProtectedVisibility; 374eb5e0a77SRafael Espindola return GlobalValue::DefaultVisibility; 375eb5e0a77SRafael Espindola } 376eb5e0a77SRafael Espindola 377c7ed52f2STeresa Johnson void ModuleLinker::setVisibility(GlobalValue *NewGV, const GlobalValue *SGV, 378c7ed52f2STeresa Johnson const GlobalValue *DGV) { 379c7ed52f2STeresa Johnson GlobalValue::VisibilityTypes Visibility = SGV->getVisibility(); 380c7ed52f2STeresa Johnson if (DGV) 381eb5e0a77SRafael Espindola Visibility = getMinVisibility(DGV->getVisibility(), Visibility); 382c7ed52f2STeresa Johnson // For promoted locals, mark them hidden so that they can later be 383c7ed52f2STeresa Johnson // stripped from the symbol table to reduce bloat. 384c7ed52f2STeresa Johnson if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV)) 385c7ed52f2STeresa Johnson Visibility = GlobalValue::HiddenVisibility; 386c7ed52f2STeresa Johnson NewGV->setVisibility(Visibility); 387c7ed52f2STeresa Johnson } 388c7ed52f2STeresa Johnson 3890e309fe8SRafael Espindola bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 390dad0a645SDavid Majnemer const GlobalVariable *&GVar) { 3910e309fe8SRafael Espindola const GlobalValue *GVal = M.getNamedValue(ComdatName); 392dad0a645SDavid Majnemer if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 393dad0a645SDavid Majnemer GVal = GA->getBaseObject(); 394dad0a645SDavid Majnemer if (!GVal) 395dad0a645SDavid Majnemer // We cannot resolve the size of the aliasee yet. 396dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 397dad0a645SDavid Majnemer "': COMDAT key involves incomputable alias size."); 398dad0a645SDavid Majnemer } 399dad0a645SDavid Majnemer 400dad0a645SDavid Majnemer GVar = dyn_cast_or_null<GlobalVariable>(GVal); 401dad0a645SDavid Majnemer if (!GVar) 402dad0a645SDavid Majnemer return emitError( 403dad0a645SDavid Majnemer "Linking COMDATs named '" + ComdatName + 404dad0a645SDavid Majnemer "': GlobalVariable required for data dependent selection!"); 405dad0a645SDavid Majnemer 406dad0a645SDavid Majnemer return false; 407dad0a645SDavid Majnemer } 408dad0a645SDavid Majnemer 409dad0a645SDavid Majnemer bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 410dad0a645SDavid Majnemer Comdat::SelectionKind Src, 411dad0a645SDavid Majnemer Comdat::SelectionKind Dst, 412dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 413dad0a645SDavid Majnemer bool &LinkFromSrc) { 414caabe228SRafael Espindola Module &DstM = Mover.getModule(); 415dad0a645SDavid Majnemer // The ability to mix Comdat::SelectionKind::Any with 416dad0a645SDavid Majnemer // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 417dad0a645SDavid Majnemer bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 418dad0a645SDavid Majnemer Dst == Comdat::SelectionKind::Largest; 419dad0a645SDavid Majnemer bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 420dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest; 421dad0a645SDavid Majnemer if (DstAnyOrLargest && SrcAnyOrLargest) { 422dad0a645SDavid Majnemer if (Dst == Comdat::SelectionKind::Largest || 423dad0a645SDavid Majnemer Src == Comdat::SelectionKind::Largest) 424dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Largest; 425dad0a645SDavid Majnemer else 426dad0a645SDavid Majnemer Result = Comdat::SelectionKind::Any; 427dad0a645SDavid Majnemer } else if (Src == Dst) { 428dad0a645SDavid Majnemer Result = Dst; 429dad0a645SDavid Majnemer } else { 430dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 431dad0a645SDavid Majnemer "': invalid selection kinds!"); 432dad0a645SDavid Majnemer } 433dad0a645SDavid Majnemer 434dad0a645SDavid Majnemer switch (Result) { 435dad0a645SDavid Majnemer case Comdat::SelectionKind::Any: 436dad0a645SDavid Majnemer // Go with Dst. 437dad0a645SDavid Majnemer LinkFromSrc = false; 438dad0a645SDavid Majnemer break; 439dad0a645SDavid Majnemer case Comdat::SelectionKind::NoDuplicates: 440dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 441dad0a645SDavid Majnemer "': noduplicates has been violated!"); 442dad0a645SDavid Majnemer case Comdat::SelectionKind::ExactMatch: 443dad0a645SDavid Majnemer case Comdat::SelectionKind::Largest: 444dad0a645SDavid Majnemer case Comdat::SelectionKind::SameSize: { 445dad0a645SDavid Majnemer const GlobalVariable *DstGV; 446dad0a645SDavid Majnemer const GlobalVariable *SrcGV; 447dad0a645SDavid Majnemer if (getComdatLeader(DstM, ComdatName, DstGV) || 448dad0a645SDavid Majnemer getComdatLeader(SrcM, ComdatName, SrcGV)) 449dad0a645SDavid Majnemer return true; 450dad0a645SDavid Majnemer 4510e309fe8SRafael Espindola const DataLayout &DstDL = DstM.getDataLayout(); 4520e309fe8SRafael Espindola const DataLayout &SrcDL = SrcM.getDataLayout(); 453dad0a645SDavid Majnemer uint64_t DstSize = 45446a43556SMehdi Amini DstDL.getTypeAllocSize(DstGV->getType()->getPointerElementType()); 455dad0a645SDavid Majnemer uint64_t SrcSize = 45646a43556SMehdi Amini SrcDL.getTypeAllocSize(SrcGV->getType()->getPointerElementType()); 457dad0a645SDavid Majnemer if (Result == Comdat::SelectionKind::ExactMatch) { 458dad0a645SDavid Majnemer if (SrcGV->getInitializer() != DstGV->getInitializer()) 459dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 460dad0a645SDavid Majnemer "': ExactMatch violated!"); 461dad0a645SDavid Majnemer LinkFromSrc = false; 462dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::Largest) { 463dad0a645SDavid Majnemer LinkFromSrc = SrcSize > DstSize; 464dad0a645SDavid Majnemer } else if (Result == Comdat::SelectionKind::SameSize) { 465dad0a645SDavid Majnemer if (SrcSize != DstSize) 466dad0a645SDavid Majnemer return emitError("Linking COMDATs named '" + ComdatName + 467dad0a645SDavid Majnemer "': SameSize violated!"); 468dad0a645SDavid Majnemer LinkFromSrc = false; 469dad0a645SDavid Majnemer } else { 470dad0a645SDavid Majnemer llvm_unreachable("unknown selection kind"); 471dad0a645SDavid Majnemer } 472dad0a645SDavid Majnemer break; 473dad0a645SDavid Majnemer } 474dad0a645SDavid Majnemer } 475dad0a645SDavid Majnemer 476dad0a645SDavid Majnemer return false; 477dad0a645SDavid Majnemer } 478dad0a645SDavid Majnemer 479dad0a645SDavid Majnemer bool ModuleLinker::getComdatResult(const Comdat *SrcC, 480dad0a645SDavid Majnemer Comdat::SelectionKind &Result, 481dad0a645SDavid Majnemer bool &LinkFromSrc) { 482caabe228SRafael Espindola Module &DstM = Mover.getModule(); 483b16196a3SRafael Espindola Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 484dad0a645SDavid Majnemer StringRef ComdatName = SrcC->getName(); 4850e309fe8SRafael Espindola Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 486dad0a645SDavid Majnemer Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 4872ef3f299SRafael Espindola 488b16196a3SRafael Espindola if (DstCI == ComdatSymTab.end()) { 489b16196a3SRafael Espindola // Use the comdat if it is only available in one of the modules. 490b16196a3SRafael Espindola LinkFromSrc = true; 491b16196a3SRafael Espindola Result = SSK; 4922ef3f299SRafael Espindola return false; 493b16196a3SRafael Espindola } 4942ef3f299SRafael Espindola 495dad0a645SDavid Majnemer const Comdat *DstC = &DstCI->second; 496dad0a645SDavid Majnemer Comdat::SelectionKind DSK = DstC->getSelectionKind(); 4972ef3f299SRafael Espindola return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 4982ef3f299SRafael Espindola LinkFromSrc); 499dad0a645SDavid Majnemer } 500f6f121e2SJames Molloy 501d12b4a33SRafael Espindola bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 502d12b4a33SRafael Espindola const GlobalValue &Dest, 503dbb0bd1aSRafael Espindola const GlobalValue &Src) { 504e868123dSDuncan P. N. Exon Smith // Should we unconditionally use the Src? 505020d4fb1SArtem Belevich if (shouldOverrideFromSrc()) { 506e868123dSDuncan P. N. Exon Smith LinkFromSrc = true; 507e868123dSDuncan P. N. Exon Smith return false; 508e868123dSDuncan P. N. Exon Smith } 509e868123dSDuncan P. N. Exon Smith 510778fcc77SRafael Espindola // We always have to add Src if it has appending linkage. 511778fcc77SRafael Espindola if (Src.hasAppendingLinkage()) { 5121e20a652STeresa Johnson // Should have prevented importing for appending linkage in linkIfNeeded. 513c7ed52f2STeresa Johnson assert(!isPerformingImport()); 514778fcc77SRafael Espindola LinkFromSrc = true; 515778fcc77SRafael Espindola return false; 516778fcc77SRafael Espindola } 517778fcc77SRafael Espindola 518d4bcefc7SRafael Espindola bool SrcIsDeclaration = Src.isDeclarationForLinker(); 519d4bcefc7SRafael Espindola bool DestIsDeclaration = Dest.isDeclarationForLinker(); 520dbb0bd1aSRafael Espindola 521c7ed52f2STeresa Johnson if (isPerformingImport()) { 522c7ed52f2STeresa Johnson if (isa<Function>(&Src)) { 523c7ed52f2STeresa Johnson // For functions, LinkFromSrc iff this is the function requested 524c7ed52f2STeresa Johnson // for importing. For variables, decide below normally. 525ffe2e4aaSMehdi Amini LinkFromSrc = ImportFunction->count(&Src); 526c7ed52f2STeresa Johnson return false; 527c7ed52f2STeresa Johnson } 528c7ed52f2STeresa Johnson 529c7ed52f2STeresa Johnson // Check if this is an alias with an already existing definition 530c7ed52f2STeresa Johnson // in Dest, which must have come from a prior importing pass from 531c7ed52f2STeresa Johnson // the same Src module. Unlike imported function and variable 532c7ed52f2STeresa Johnson // definitions, which are imported as available_externally and are 533c7ed52f2STeresa Johnson // not definitions for the linker, that is not a valid linkage for 534c7ed52f2STeresa Johnson // imported aliases which must be definitions. Simply use the existing 535c7ed52f2STeresa Johnson // Dest copy. 536c7ed52f2STeresa Johnson if (isa<GlobalAlias>(&Src) && !DestIsDeclaration) { 537c7ed52f2STeresa Johnson assert(isa<GlobalAlias>(&Dest)); 538c7ed52f2STeresa Johnson LinkFromSrc = false; 539c7ed52f2STeresa Johnson return false; 540c7ed52f2STeresa Johnson } 541c7ed52f2STeresa Johnson } 542c7ed52f2STeresa Johnson 543dbb0bd1aSRafael Espindola if (SrcIsDeclaration) { 544dbb0bd1aSRafael Espindola // If Src is external or if both Src & Dest are external.. Just link the 545dbb0bd1aSRafael Espindola // external globals, we aren't adding anything. 546d12b4a33SRafael Espindola if (Src.hasDLLImportStorageClass()) { 547dbb0bd1aSRafael Espindola // If one of GVs is marked as DLLImport, result should be dllimport'ed. 548d12b4a33SRafael Espindola LinkFromSrc = DestIsDeclaration; 549d12b4a33SRafael Espindola return false; 550d12b4a33SRafael Espindola } 551dbb0bd1aSRafael Espindola // If the Dest is weak, use the source linkage. 552ed11bd28SRafael Espindola if (Dest.hasExternalWeakLinkage()) { 553ed11bd28SRafael Espindola LinkFromSrc = true; 554ed11bd28SRafael Espindola return false; 555ed11bd28SRafael Espindola } 556ed11bd28SRafael Espindola // Link an available_externally over a declaration. 557ed11bd28SRafael Espindola LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 558d12b4a33SRafael Espindola return false; 559dbb0bd1aSRafael Espindola } 560dbb0bd1aSRafael Espindola 561d12b4a33SRafael Espindola if (DestIsDeclaration) { 562dbb0bd1aSRafael Espindola // If Dest is external but Src is not: 563d12b4a33SRafael Espindola LinkFromSrc = true; 564d12b4a33SRafael Espindola return false; 565d12b4a33SRafael Espindola } 566dbb0bd1aSRafael Espindola 5670910605aSRafael Espindola if (Src.hasCommonLinkage()) { 568d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 569d12b4a33SRafael Espindola LinkFromSrc = true; 5700910605aSRafael Espindola return false; 571d12b4a33SRafael Espindola } 572d12b4a33SRafael Espindola 573d12b4a33SRafael Espindola if (!Dest.hasCommonLinkage()) { 574d12b4a33SRafael Espindola LinkFromSrc = false; 575d12b4a33SRafael Espindola return false; 576d12b4a33SRafael Espindola } 5770910605aSRafael Espindola 578a28d91d8SMehdi Amini const DataLayout &DL = Dest.getParent()->getDataLayout(); 5790910605aSRafael Espindola uint64_t DestSize = DL.getTypeAllocSize(Dest.getType()->getElementType()); 5800910605aSRafael Espindola uint64_t SrcSize = DL.getTypeAllocSize(Src.getType()->getElementType()); 581d12b4a33SRafael Espindola LinkFromSrc = SrcSize > DestSize; 582d12b4a33SRafael Espindola return false; 5830910605aSRafael Espindola } 5840910605aSRafael Espindola 585dbb0bd1aSRafael Espindola if (Src.isWeakForLinker()) { 586dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 587dbb0bd1aSRafael Espindola assert(!Dest.hasAvailableExternallyLinkage()); 5880910605aSRafael Espindola 589d12b4a33SRafael Espindola if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 590d12b4a33SRafael Espindola LinkFromSrc = true; 591d12b4a33SRafael Espindola return false; 592d12b4a33SRafael Espindola } 593dbb0bd1aSRafael Espindola 594d12b4a33SRafael Espindola LinkFromSrc = false; 5950910605aSRafael Espindola return false; 596dbb0bd1aSRafael Espindola } 597dbb0bd1aSRafael Espindola 598dbb0bd1aSRafael Espindola if (Dest.isWeakForLinker()) { 599dbb0bd1aSRafael Espindola assert(Src.hasExternalLinkage()); 600d12b4a33SRafael Espindola LinkFromSrc = true; 601d12b4a33SRafael Espindola return false; 602dbb0bd1aSRafael Espindola } 603dbb0bd1aSRafael Espindola 604dbb0bd1aSRafael Espindola assert(!Src.hasExternalWeakLinkage()); 605dbb0bd1aSRafael Espindola assert(!Dest.hasExternalWeakLinkage()); 606dbb0bd1aSRafael Espindola assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 607dbb0bd1aSRafael Espindola "Unexpected linkage type!"); 608dbb0bd1aSRafael Espindola return emitError("Linking globals named '" + Src.getName() + 609dbb0bd1aSRafael Espindola "': symbol multiply defined!"); 610dbb0bd1aSRafael Espindola } 611dbb0bd1aSRafael Espindola 612baa3bf8fSRafael Espindola bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 613baa3bf8fSRafael Espindola GlobalValue *DGV = getLinkedToGlobal(&GV); 614baa3bf8fSRafael Espindola 615baa3bf8fSRafael Espindola if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 616baa3bf8fSRafael Espindola return false; 617baa3bf8fSRafael Espindola 6184b5ec263SRafael Espindola if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 6194b5ec263SRafael Espindola auto *DGVar = dyn_cast<GlobalVariable>(DGV); 6204b5ec263SRafael Espindola auto *SGVar = dyn_cast<GlobalVariable>(&GV); 6214b5ec263SRafael Espindola if (DGVar && SGVar) { 6224b5ec263SRafael Espindola if (DGVar->isDeclaration() && SGVar->isDeclaration() && 6234b5ec263SRafael Espindola (!DGVar->isConstant() || !SGVar->isConstant())) { 6244b5ec263SRafael Espindola DGVar->setConstant(false); 6254b5ec263SRafael Espindola SGVar->setConstant(false); 6264b5ec263SRafael Espindola } 6274b5ec263SRafael Espindola if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 6284b5ec263SRafael Espindola unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 6294b5ec263SRafael Espindola SGVar->setAlignment(Align); 6304b5ec263SRafael Espindola DGVar->setAlignment(Align); 6314b5ec263SRafael Espindola } 6324b5ec263SRafael Espindola } 6334b5ec263SRafael Espindola 634baa3bf8fSRafael Espindola GlobalValue::VisibilityTypes Visibility = 635baa3bf8fSRafael Espindola getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 636baa3bf8fSRafael Espindola DGV->setVisibility(Visibility); 637baa3bf8fSRafael Espindola GV.setVisibility(Visibility); 6384b5ec263SRafael Espindola 6394b5ec263SRafael Espindola bool HasUnnamedAddr = GV.hasUnnamedAddr() && DGV->hasUnnamedAddr(); 6404b5ec263SRafael Espindola DGV->setUnnamedAddr(HasUnnamedAddr); 6414b5ec263SRafael Espindola GV.setUnnamedAddr(HasUnnamedAddr); 642baa3bf8fSRafael Espindola } 643baa3bf8fSRafael Espindola 6444b5ec263SRafael Espindola // Don't want to append to global_ctors list, for example, when we 6454b5ec263SRafael Espindola // are importing for ThinLTO, otherwise the global ctors and dtors 6464b5ec263SRafael Espindola // get executed multiple times for local variables (the latter causing 6474b5ec263SRafael Espindola // double frees). 6484b5ec263SRafael Espindola if (GV.hasAppendingLinkage() && isPerformingImport()) 6494b5ec263SRafael Espindola return false; 6504b5ec263SRafael Espindola 6514b5ec263SRafael Espindola if (isPerformingImport() && !doImportAsDefinition(&GV)) 6524b5ec263SRafael Espindola return false; 6534b5ec263SRafael Espindola 6544b5ec263SRafael Espindola if (!DGV && !shouldOverrideFromSrc() && 6554b5ec263SRafael Espindola (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 6564b5ec263SRafael Espindola GV.hasAvailableExternallyLinkage())) 6574b5ec263SRafael Espindola return false; 6584b5ec263SRafael Espindola 659bd03c503SRafael Espindola if (GV.isDeclaration()) 660bd03c503SRafael Espindola return false; 661bd03c503SRafael Espindola 662baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) { 663baa3bf8fSRafael Espindola bool LinkFromSrc; 664baa3bf8fSRafael Espindola Comdat::SelectionKind SK; 665baa3bf8fSRafael Espindola std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 6664b5ec263SRafael Espindola if (LinkFromSrc) 6674b5ec263SRafael Espindola ValuesToLink.insert(&GV); 668baa3bf8fSRafael Espindola return false; 669baa3bf8fSRafael Espindola } 670baa3bf8fSRafael Espindola 6714b5ec263SRafael Espindola bool LinkFromSrc = true; 6724b5ec263SRafael Espindola if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 6734b5ec263SRafael Espindola return true; 6744b5ec263SRafael Espindola if (LinkFromSrc) 6754b5ec263SRafael Espindola ValuesToLink.insert(&GV); 676baa3bf8fSRafael Espindola return false; 677baa3bf8fSRafael Espindola } 678baa3bf8fSRafael Espindola 679caabe228SRafael Espindola void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) { 680caabe228SRafael Espindola // Add these to the internalize list 681caabe228SRafael Espindola if (!GV.hasLinkOnceLinkage()) 682caabe228SRafael Espindola return; 683caabe228SRafael Espindola 684caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) 685caabe228SRafael Espindola Internalize.insert(GV.getName()); 686caabe228SRafael Espindola Add(GV); 687caabe228SRafael Espindola 688caabe228SRafael Espindola const Comdat *SC = GV.getComdat(); 689caabe228SRafael Espindola if (!SC) 690caabe228SRafael Espindola return; 691caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) { 692caabe228SRafael Espindola if (!GV2->hasLocalLinkage() && shouldInternalizeLinkedSymbols()) 693caabe228SRafael Espindola Internalize.insert(GV2->getName()); 694caabe228SRafael Espindola Add(*GV2); 695caabe228SRafael Espindola } 696caabe228SRafael Espindola } 697caabe228SRafael Espindola 698caabe228SRafael Espindola void ModuleLinker::processGlobalForThinLTO(GlobalValue &GV) { 699caabe228SRafael Espindola if (GV.hasLocalLinkage() && 700caabe228SRafael Espindola (doPromoteLocalToGlobal(&GV) || isPerformingImport())) { 701caabe228SRafael Espindola GV.setName(getName(&GV)); 702caabe228SRafael Espindola GV.setLinkage(getLinkage(&GV)); 703caabe228SRafael Espindola if (!GV.hasLocalLinkage()) 704caabe228SRafael Espindola GV.setVisibility(GlobalValue::HiddenVisibility); 705caabe228SRafael Espindola if (isModuleExporting()) 706caabe228SRafael Espindola ValuesToLink.insert(&GV); 707caabe228SRafael Espindola return; 708caabe228SRafael Espindola } 709caabe228SRafael Espindola GV.setLinkage(getLinkage(&GV)); 710caabe228SRafael Espindola } 711caabe228SRafael Espindola 712caabe228SRafael Espindola void ModuleLinker::processGlobalsForThinLTO() { 713caabe228SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 714caabe228SRafael Espindola processGlobalForThinLTO(GV); 715caabe228SRafael Espindola for (Function &SF : SrcM) 716caabe228SRafael Espindola processGlobalForThinLTO(SF); 717caabe228SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 718caabe228SRafael Espindola processGlobalForThinLTO(GA); 719caabe228SRafael Espindola } 720caabe228SRafael Espindola 721b1ed91f3SChris Lattner bool ModuleLinker::run() { 7220e309fe8SRafael Espindola for (const auto &SMEC : SrcM.getComdatSymbolTable()) { 723dad0a645SDavid Majnemer const Comdat &C = SMEC.getValue(); 724dad0a645SDavid Majnemer if (ComdatsChosen.count(&C)) 725dad0a645SDavid Majnemer continue; 726dad0a645SDavid Majnemer Comdat::SelectionKind SK; 727dad0a645SDavid Majnemer bool LinkFromSrc; 728dad0a645SDavid Majnemer if (getComdatResult(&C, SK, LinkFromSrc)) 729dad0a645SDavid Majnemer return true; 730dad0a645SDavid Majnemer ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 731dad0a645SDavid Majnemer } 732dad0a645SDavid Majnemer 7330e309fe8SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 734baa3bf8fSRafael Espindola if (const Comdat *SC = GV.getComdat()) 735baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GV); 736baa3bf8fSRafael Espindola 7370e309fe8SRafael Espindola for (Function &SF : SrcM) 738baa3bf8fSRafael Espindola if (const Comdat *SC = SF.getComdat()) 739baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&SF); 740baa3bf8fSRafael Espindola 7410e309fe8SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 742baa3bf8fSRafael Espindola if (const Comdat *SC = GA.getComdat()) 743baa3bf8fSRafael Espindola ComdatMembers[SC].push_back(&GA); 744baa3bf8fSRafael Espindola 745b1ed91f3SChris Lattner // Insert all of the globals in src into the DstM module... without linking 746b1ed91f3SChris Lattner // initializers (which could refer to functions not yet mapped over). 7470e309fe8SRafael Espindola for (GlobalVariable &GV : SrcM.globals()) 748baa3bf8fSRafael Espindola if (linkIfNeeded(GV)) 749b1ed91f3SChris Lattner return true; 750b1ed91f3SChris Lattner 7510e309fe8SRafael Espindola for (Function &SF : SrcM) 752baa3bf8fSRafael Espindola if (linkIfNeeded(SF)) 753b1ed91f3SChris Lattner return true; 754b1ed91f3SChris Lattner 7550e309fe8SRafael Espindola for (GlobalAlias &GA : SrcM.aliases()) 756baa3bf8fSRafael Espindola if (linkIfNeeded(GA)) 757b1ed91f3SChris Lattner return true; 758b1ed91f3SChris Lattner 759caabe228SRafael Espindola processGlobalsForThinLTO(); 760caabe228SRafael Espindola 761caabe228SRafael Espindola for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 762caabe228SRafael Espindola GlobalValue *GV = ValuesToLink[I]; 763caabe228SRafael Espindola const Comdat *SC = GV->getComdat(); 764caabe228SRafael Espindola if (!SC) 765caabe228SRafael Espindola continue; 766caabe228SRafael Espindola for (GlobalValue *GV2 : ComdatMembers[SC]) 767caabe228SRafael Espindola ValuesToLink.insert(GV2); 768caabe228SRafael Espindola } 769caabe228SRafael Espindola 770caabe228SRafael Espindola if (shouldInternalizeLinkedSymbols()) { 771caabe228SRafael Espindola for (GlobalValue *GV : ValuesToLink) 772caabe228SRafael Espindola Internalize.insert(GV->getName()); 773caabe228SRafael Espindola } 774caabe228SRafael Espindola 775*f81c7b03SRafael Espindola if (Mover.move(SrcM, ValuesToLink.getArrayRef(), 776caabe228SRafael Espindola [this](GlobalValue &GV, IRMover::ValueAdder Add) { 777caabe228SRafael Espindola addLazyFor(GV, Add); 778caabe228SRafael Espindola })) 7794b5ec263SRafael Espindola return true; 780caabe228SRafael Espindola Module &DstM = Mover.getModule(); 781caabe228SRafael Espindola for (auto &P : Internalize) { 782caabe228SRafael Espindola GlobalValue *GV = DstM.getNamedValue(P.first()); 783caabe228SRafael Espindola GV->setLinkage(GlobalValue::InternalLinkage); 784beadd56aSRafael Espindola } 785beadd56aSRafael Espindola 7862609888fSAnton Korobeynikov return false; 7872609888fSAnton Korobeynikov } 788361e513dSReid Spencer 7890e309fe8SRafael Espindola Linker::Linker(Module &M, DiagnosticHandlerFunction DiagnosticHandler) 790caabe228SRafael Espindola : Mover(M, DiagnosticHandler) {} 7913df61b7bSRafael Espindola 7920e309fe8SRafael Espindola bool Linker::linkInModule(Module &Src, unsigned Flags, 7938220e8a8SMehdi Amini const FunctionInfoIndex *Index, 7947471cf81SMehdi Amini DenseSet<const GlobalValue *> *FunctionsToImport) { 795caabe228SRafael Espindola ModuleLinker TheLinker(Mover, Src, Flags, Index, FunctionsToImport); 796caabe228SRafael Espindola return TheLinker.run(); 7973df61b7bSRafael Espindola } 7983df61b7bSRafael Espindola 799b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 800b1ed91f3SChris Lattner // LinkModules entrypoint. 801b1ed91f3SChris Lattner //===----------------------------------------------------------------------===// 802b1ed91f3SChris Lattner 80318c89411SRafael Espindola /// This function links two modules together, with the resulting Dest module 80418c89411SRafael Espindola /// modified to be the composite of the two input modules. If an error occurs, 80518c89411SRafael Espindola /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 80618c89411SRafael Espindola /// Upon failure, the Dest module could be in a modified state, and shouldn't be 80718c89411SRafael Espindola /// relied on to be consistent. 8080e309fe8SRafael Espindola bool Linker::linkModules(Module &Dest, Module &Src, 809020d4fb1SArtem Belevich DiagnosticHandlerFunction DiagnosticHandler, 810020d4fb1SArtem Belevich unsigned Flags) { 8114160f5d3SRafael Espindola Linker L(Dest, DiagnosticHandler); 812020d4fb1SArtem Belevich return L.linkInModule(Src, Flags); 8134160f5d3SRafael Espindola } 8144160f5d3SRafael Espindola 815bae7e759STeresa Johnson std::unique_ptr<Module> 816bae7e759STeresa Johnson llvm::renameModuleForThinLTO(std::unique_ptr<Module> &M, 817bae7e759STeresa Johnson const FunctionInfoIndex *Index, 818bae7e759STeresa Johnson DiagnosticHandlerFunction DiagnosticHandler) { 819bae7e759STeresa Johnson std::unique_ptr<llvm::Module> RenamedModule( 820bae7e759STeresa Johnson new llvm::Module(M->getModuleIdentifier(), M->getContext())); 821bae7e759STeresa Johnson Linker L(*RenamedModule.get(), DiagnosticHandler); 822bae7e759STeresa Johnson if (L.linkInModule(*M.get(), llvm::Linker::Flags::None, Index)) 823bae7e759STeresa Johnson return nullptr; 824bae7e759STeresa Johnson return RenamedModule; 825bae7e759STeresa Johnson } 826bae7e759STeresa Johnson 827a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 828a3aeb980SBill Wendling // C API. 829a3aeb980SBill Wendling //===----------------------------------------------------------------------===// 830a3aeb980SBill Wendling 831a3aeb980SBill Wendling LLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src, 832a57d588cSJuergen Ributzka LLVMLinkerMode Unused, char **OutMessages) { 83398ab63ceSRafael Espindola Module *D = unwrap(Dest); 83498ab63ceSRafael Espindola std::string Message; 8354160f5d3SRafael Espindola raw_string_ostream Stream(Message); 8364160f5d3SRafael Espindola DiagnosticPrinterRawOStream DP(Stream); 8374160f5d3SRafael Espindola 8380e309fe8SRafael Espindola LLVMBool Result = Linker::linkModules( 8390e309fe8SRafael Espindola *D, *unwrap(Src), [&](const DiagnosticInfo &DI) { DI.print(DP); }); 84098ab63ceSRafael Espindola 841ff715e2dSEli Bendersky if (OutMessages && Result) { 842ff715e2dSEli Bendersky Stream.flush(); 84398ab63ceSRafael Espindola *OutMessages = strdup(Message.c_str()); 844ff715e2dSEli Bendersky } 845a3aeb980SBill Wendling return Result; 846a3aeb980SBill Wendling } 847