1c834bbf55832c45f90b1163f920472fefbf77bc1Mikhail Glushenkov//===- lib/Linker/LinkModules.cpp - Module Linker Implementation ----------===// 2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 952f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner// 1052f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner// This file implements the LLVM module linker. 1152f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner// 1252f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner//===----------------------------------------------------------------------===// 1352f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner 14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "LinkDiagnosticInfo.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm-c/Linker.h" 16d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling#include "llvm/ADT/SetVector.h" 17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/ADT/StringSet.h" 1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/DiagnosticPrinter.h" 1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/LLVMContext.h" 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Linker/Linker.h" 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Error.h" 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/Utils/FunctionImportUtils.h" 23f7703df4968084c18c248c1feea9961c19a32e6aChris Lattnerusing namespace llvm; 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2562a81a1eba019ab570b002f8e1686494139785a1Chris Lattnernamespace { 26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// This is an implementation class for the LinkModules function, which is the 28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// entrypoint for this file. 29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass ModuleLinker { 30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar IRMover &Mover; 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<Module> SrcM; 32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SetVector<GlobalValue *> ValuesToLink; 34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar StringSet<> Internalize; 35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// For symbol clashes, prefer those from Src. 37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned Flags; 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Functions to import from source module, all other functions are 40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// imported as declarations instead of definitions. 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseSet<const GlobalValue *> *GlobalsToImport; 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Used as the callback for lazy linking. 44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// The mover has just hit GV and we have to decide if it, and other members 45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// of the same comdat, should be linked. Every member to be linked is passed 46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// to Add. 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add); 486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool shouldLinkReferencedLinkOnce() { 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return !(Flags & Linker::DontForceLinkLinkonceODR); 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool shouldInternalizeLinkedSymbols() { 55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return Flags & Linker::InternalizeLinkedSymbols; 566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const GlobalValue &Src); 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Should we have mover and linker error diag info? 62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool emitError(const Twine &Message) { 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return true; 65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool getComdatLeader(Module &M, StringRef ComdatName, 68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const GlobalVariable *&GVar); 69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool computeResultingSelectionKind(StringRef ComdatName, 70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Comdat::SelectionKind Src, 71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Comdat::SelectionKind Dst, 72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Comdat::SelectionKind &Result, 73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool &LinkFromSrc); 74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ComdatsChosen; 76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool &LinkFromSrc); 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Keep track of the lazy linked global members of each comdat in source. 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers; 80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// Given a global in the source module, return the global in the 82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// destination module that is being linked to, if any. 83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module &DstM = Mover.getModule(); 85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // If the source has no name it can't link. If it has local linkage, 86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // there is no name match-up going on. 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage())) 88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return nullptr; 89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Otherwise see if we have a match in the destination module's symtab. 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!DGV) 93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return nullptr; 94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // If we found a global with the same name in the dest module, but it has 96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // internal linkage, we are really not doing any linkage here. 97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (DGV->hasLocalLinkage()) 98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return nullptr; 99ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Otherwise, we do in fact link to the destination global. 101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return DGV; 102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Drop GV if it is a member of a comdat that we are dropping. 105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// This can happen with COFF's largest selection kind. 106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void dropReplacedComdat(GlobalValue &GV, 107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const DenseSet<const Comdat *> &ReplacedDstComdats); 108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool linkIfNeeded(GlobalValue &GV); 11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Helper method to check if we are importing from the current source 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// module. 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isPerformingImport() const { return GlobalsToImport != nullptr; } 11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 115f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// If we are importing from the source module, checks if we should 116f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// import SGV as a definition, otherwise import as a declaration. 117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool doImportAsDefinition(const GlobalValue *SGV); 11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic: 120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags, 121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseSet<const GlobalValue *> *GlobalsToImport = nullptr) 122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags), 123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalsToImport(GlobalsToImport) {} 124ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer 125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool run(); 126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}; 127c003628a612d3687fb77088a5894314210a65385Chris Lattner} 128c003628a612d3687fb77088a5894314210a65385Chris Lattner 129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) { 130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (!isPerformingImport()) 1313ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola return false; 132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return FunctionImportGlobalProcessing::doImportAsDefinition(SGV, 133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalsToImport); 134a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy} 135a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic GlobalValue::VisibilityTypes 137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainargetMinVisibility(GlobalValue::VisibilityTypes A, 138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GlobalValue::VisibilityTypes B) { 139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return GlobalValue::HiddenVisibility; 141f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (A == GlobalValue::ProtectedVisibility || 142f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar B == GlobalValue::ProtectedVisibility) 143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return GlobalValue::ProtectedVisibility; 144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return GlobalValue::DefaultVisibility; 145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 148c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const GlobalVariable *&GVar) { 149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const GlobalValue *GVal = M.getNamedValue(ComdatName); 150c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines GVal = GA->getBaseObject(); 152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!GVal) 153c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines // We cannot resolve the size of the aliasee yet. 154c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return emitError("Linking COMDATs named '" + ComdatName + 155c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "': COMDAT key involves incomputable alias size."); 156c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 157c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines GVar = dyn_cast_or_null<GlobalVariable>(GVal); 159c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!GVar) 160c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return emitError( 161c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "Linking COMDATs named '" + ComdatName + 162c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "': GlobalVariable required for data dependent selection!"); 163c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 164c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 165c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines} 166c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesbool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 168c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Comdat::SelectionKind Src, 169c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Comdat::SelectionKind Dst, 170c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Comdat::SelectionKind &Result, 171c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool &LinkFromSrc) { 172f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module &DstM = Mover.getModule(); 173c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines // The ability to mix Comdat::SelectionKind::Any with 174c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 175c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 176c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Dst == Comdat::SelectionKind::Largest; 177c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 178c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Src == Comdat::SelectionKind::Largest; 179c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (DstAnyOrLargest && SrcAnyOrLargest) { 180c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (Dst == Comdat::SelectionKind::Largest || 181c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Src == Comdat::SelectionKind::Largest) 182c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Result = Comdat::SelectionKind::Largest; 183c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines else 184c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Result = Comdat::SelectionKind::Any; 185c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } else if (Src == Dst) { 186c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Result = Dst; 187c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } else { 188c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return emitError("Linking COMDATs named '" + ComdatName + 189c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "': invalid selection kinds!"); 190c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 191c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 192c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines switch (Result) { 193c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case Comdat::SelectionKind::Any: 194c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines // Go with Dst. 195c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LinkFromSrc = false; 196c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines break; 197c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case Comdat::SelectionKind::NoDuplicates: 198c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return emitError("Linking COMDATs named '" + ComdatName + 199c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "': noduplicates has been violated!"); 200c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case Comdat::SelectionKind::ExactMatch: 201c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case Comdat::SelectionKind::Largest: 202c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case Comdat::SelectionKind::SameSize: { 203c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const GlobalVariable *DstGV; 204c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const GlobalVariable *SrcGV; 205c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (getComdatLeader(DstM, ComdatName, DstGV) || 206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar getComdatLeader(*SrcM, ComdatName, SrcGV)) 207c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return true; 208c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 209f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const DataLayout &DstDL = DstM.getDataLayout(); 210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const DataLayout &SrcDL = SrcM->getDataLayout(); 211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType()); 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType()); 213c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (Result == Comdat::SelectionKind::ExactMatch) { 214c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (SrcGV->getInitializer() != DstGV->getInitializer()) 215c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return emitError("Linking COMDATs named '" + ComdatName + 216c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "': ExactMatch violated!"); 217c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LinkFromSrc = false; 218c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } else if (Result == Comdat::SelectionKind::Largest) { 219c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LinkFromSrc = SrcSize > DstSize; 220c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } else if (Result == Comdat::SelectionKind::SameSize) { 221c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (SrcSize != DstSize) 222c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return emitError("Linking COMDATs named '" + ComdatName + 223c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines "': SameSize violated!"); 224c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LinkFromSrc = false; 225c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } else { 226c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines llvm_unreachable("unknown selection kind"); 227c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 228c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines break; 229c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 230c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 231c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 232c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 233c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines} 234c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 235c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesbool ModuleLinker::getComdatResult(const Comdat *SrcC, 236c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Comdat::SelectionKind &Result, 237c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool &LinkFromSrc) { 238f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module &DstM = Mover.getModule(); 23937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 240c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines StringRef ComdatName = SrcC->getName(); 241f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 242c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 24337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 24437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (DstCI == ComdatSymTab.end()) { 24537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Use the comdat if it is only available in one of the modules. 24637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines LinkFromSrc = true; 24737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Result = SSK; 24837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 249c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 25037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 25137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const Comdat *DstC = &DstCI->second; 25237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Comdat::SelectionKind DSK = DstC->getSelectionKind(); 25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 25437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines LinkFromSrc); 255c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines} 256a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 25737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 25837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const GlobalValue &Dest, 25937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const GlobalValue &Src) { 260f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 2616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Should we unconditionally use the Src? 262f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (shouldOverrideFromSrc()) { 2636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LinkFromSrc = true; 2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return false; 2656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 26737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // We always have to add Src if it has appending linkage. 26837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Src.hasAppendingLinkage()) { 269f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // Should have prevented importing for appending linkage in linkIfNeeded. 270f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar assert(!isPerformingImport()); 27137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines LinkFromSrc = true; 27237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 27337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 27437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 275f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (isPerformingImport()) { 276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // LinkFromSrc iff this is a global requested for importing. 277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LinkFromSrc = GlobalsToImport->count(&Src); 278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return false; 279f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 280f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool SrcIsDeclaration = Src.isDeclarationForLinker(); 282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool DestIsDeclaration = Dest.isDeclarationForLinker(); 283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 2841afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (SrcIsDeclaration) { 2852b48ef0450944c2c46633aec9baf6be835a3b503Anton Korobeynikov // If Src is external or if both Src & Dest are external.. Just link the 286aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner // external globals, we aren't adding anything. 28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Src.hasDLLImportStorageClass()) { 28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If one of GVs is marked as DLLImport, result should be dllimport'ed. 28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines LinkFromSrc = DestIsDeclaration; 29037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 291b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov } 29237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // If the Dest is weak, use the source linkage. 293f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (Dest.hasExternalWeakLinkage()) { 294f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LinkFromSrc = true; 295f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return false; 296f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 297f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // Link an available_externally over a declaration. 298f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 29937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 30037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 30137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 30237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (DestIsDeclaration) { 303aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner // If Dest is external but Src is not: 304aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LinkFromSrc = true; 30537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 30637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 30737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 30837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Src.hasCommonLinkage()) { 30937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 310aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LinkFromSrc = true; 31137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 312aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner } 31337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 31437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!Dest.hasCommonLinkage()) { 31578ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov LinkFromSrc = false; 31637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 31737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 31837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const DataLayout &DL = Dest.getParent()->getDataLayout(); 320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType()); 321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType()); 32237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines LinkFromSrc = SrcSize > DestSize; 32337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 32437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 32537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Src.isWeakForLinker()) { 32737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!Dest.hasExternalWeakLinkage()); 32837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!Dest.hasAvailableExternallyLinkage()); 32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 33178ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov LinkFromSrc = true; 33237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 33378ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov } 33437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 33537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines LinkFromSrc = false; 33637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 337aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner } 3389cd3ccf5065a8a139e458d016c88a8512471598bAnton Korobeynikov 33937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Dest.isWeakForLinker()) { 34037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(Src.hasExternalLinkage()); 34137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines LinkFromSrc = true; 34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 34337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 34437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 34537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!Src.hasExternalWeakLinkage()); 34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!Dest.hasExternalWeakLinkage()); 34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 34837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "Unexpected linkage type!"); 34937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return emitError("Linking globals named '" + Src.getName() + 35037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "': symbol multiply defined!"); 351aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner} 3525c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 353f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 354f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GlobalValue *DGV = getLinkedToGlobal(&GV); 355348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling 356f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 357f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return false; 358ab67e705f59d567afded845465f358b8a66ab62eDevang Patel 359f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 360f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto *DGVar = dyn_cast<GlobalVariable>(DGV); 361f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto *SGVar = dyn_cast<GlobalVariable>(&GV); 362f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (DGVar && SGVar) { 363f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (DGVar->isDeclaration() && SGVar->isDeclaration() && 364f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar (!DGVar->isConstant() || !SGVar->isConstant())) { 365f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar DGVar->setConstant(false); 366f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SGVar->setConstant(false); 367f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 368f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 369f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 370f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SGVar->setAlignment(Align); 371f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar DGVar->setAlignment(Align); 372f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 37337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 37437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 375f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GlobalValue::VisibilityTypes Visibility = 376f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 377f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar DGV->setVisibility(Visibility); 378f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GV.setVisibility(Visibility); 37937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::getMinUnnamedAddr( 381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DGV->getUnnamedAddr(), GV.getUnnamedAddr()); 382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DGV->setUnnamedAddr(UnnamedAddr); 383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GV.setUnnamedAddr(UnnamedAddr); 38437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 3851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 386f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // Don't want to append to global_ctors list, for example, when we 387f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // are importing for ThinLTO, otherwise the global ctors and dtors 388f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // get executed multiple times for local variables (the latter causing 389f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // double frees). 390f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (GV.hasAppendingLinkage() && isPerformingImport()) 391f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return false; 3925c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (isPerformingImport()) { 394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!doImportAsDefinition(&GV)) 395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return false; 396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } else if (!DGV && !shouldOverrideFromSrc() && 397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GV.hasAvailableExternallyLinkage())) 399f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return false; 40037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 401f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (GV.isDeclaration()) 402f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return false; 4031afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 404f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (const Comdat *SC = GV.getComdat()) { 405f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool LinkFromSrc; 406c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Comdat::SelectionKind SK; 407c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!LinkFromSrc) 409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return false; 41037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 4116157e383c4a15ffb6e7f27cdb153daa9caa15ca5Chris Lattner 412f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool LinkFromSrc = true; 413f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 414f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return true; 415f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (LinkFromSrc) 416f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ValuesToLink.insert(&GV); 417ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return false; 4185c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner} 4195c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ModuleLinker::addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add) { 421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!shouldLinkReferencedLinkOnce()) 422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // For ThinLTO we don't import more than what was required. 423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // The client has to guarantee that the linkonce will be availabe at link 424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // time (by promoting it to weak for instance). 425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // Add these to the internalize list 428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!GV.hasLinkOnceLinkage() && !shouldLinkOnlyNeeded()) 429ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return; 430ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 431f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (shouldInternalizeLinkedSymbols()) 432f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Internalize.insert(GV.getName()); 433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Add(GV); 434ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 435f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const Comdat *SC = GV.getComdat(); 436f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (!SC) 437f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return; 438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue *DGV = getLinkedToGlobal(GV2); 440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool LinkFromSrc = true; 441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!LinkFromSrc) 444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar continue; 445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (shouldInternalizeLinkedSymbols()) 446f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Internalize.insert(GV2->getName()); 447f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Add(*GV2); 448f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 449f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 450f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ModuleLinker::dropReplacedComdat( 452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) { 453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Comdat *C = GV.getComdat(); 454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!C) 455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!ReplacedDstComdats.count(C)) 457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (GV.use_empty()) { 459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GV.eraseFromParent(); 460ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return; 461d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling } 462ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto *F = dyn_cast<Function>(&GV)) { 464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar F->deleteBody(); 465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) { 466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Var->setInitializer(nullptr); 467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } else { 468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto &Alias = cast<GlobalAlias>(GV); 469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Module &M = *Alias.getParent(); 470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PointerType &Ty = *cast<PointerType>(Alias.getType()); 471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue *Declaration; 472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) { 473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M); 474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } else { 475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Declaration = 476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false, 477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue::ExternalLinkage, 478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /*Initializer*/ nullptr); 479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Declaration->takeName(&Alias); 481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Alias.replaceAllUsesWith(Declaration); 482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Alias.eraseFromParent(); 483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 484ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 485ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 4861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::run() { 487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Module &DstM = Mover.getModule(); 488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseSet<const Comdat *> ReplacedDstComdats; 489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto &SMEC : SrcM->getComdatSymbolTable()) { 491c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const Comdat &C = SMEC.getValue(); 492c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (ComdatsChosen.count(&C)) 493c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines continue; 494c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Comdat::SelectionKind SK; 495c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool LinkFromSrc; 496c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (getComdatResult(&C, SK, LinkFromSrc)) 497c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return true; 498c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!LinkFromSrc) 501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar continue; 502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName()); 505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (DstCI == ComdatSymTab.end()) 506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar continue; 507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // The source comdat is replacing the dest one. 509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const Comdat *DstC = &DstCI->second; 510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ReplacedDstComdats.insert(DstC); 511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Alias have to go first, since we are not able to find their comdats 514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // otherwise. 515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) { 516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalAlias &GV = *I++; 517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar dropReplacedComdat(GV, ReplacedDstComdats); 518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) { 521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalVariable &GV = *I++; 522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar dropReplacedComdat(GV, ReplacedDstComdats); 523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto I = DstM.begin(), E = DstM.end(); I != E;) { 526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Function &GV = *I++; 527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar dropReplacedComdat(GV, ReplacedDstComdats); 528c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 529c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (GlobalVariable &GV : SrcM->globals()) 531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (GV.hasLinkOnceLinkage()) 532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (const Comdat *SC = GV.getComdat()) 533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LazyComdatMembers[SC].push_back(&GV); 534f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (Function &SF : *SrcM) 536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (SF.hasLinkOnceLinkage()) 537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (const Comdat *SC = SF.getComdat()) 538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LazyComdatMembers[SC].push_back(&SF); 539f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (GlobalAlias &GA : SrcM->aliases()) 541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (GA.hasLinkOnceLinkage()) 542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (const Comdat *SC = GA.getComdat()) 543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LazyComdatMembers[SC].push_back(&GA); 54437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 5451afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Insert all of the globals in src into the DstM module... without linking 5468166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner // initializers (which could refer to functions not yet mapped over). 547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (GlobalVariable &GV : SrcM->globals()) 548f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (linkIfNeeded(GV)) 5491afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 5505c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (Function &SF : *SrcM) 552f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (linkIfNeeded(SF)) 5531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 5546cdf1971bdf88ddd9a7d46b5f5f975497d68c38eChris Lattner 555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (GlobalAlias &GA : SrcM->aliases()) 556f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (linkIfNeeded(GA)) 5571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 55852f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner 559f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 560f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GlobalValue *GV = ValuesToLink[I]; 561f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const Comdat *SC = GV->getComdat(); 562f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (!SC) 563ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines continue; 564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue *DGV = getLinkedToGlobal(GV2); 566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool LinkFromSrc = true; 567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return true; 569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (LinkFromSrc) 570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ValuesToLink.insert(GV2); 571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 572ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 573ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 574f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (shouldInternalizeLinkedSymbols()) { 575f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar for (GlobalValue *GV : ValuesToLink) 576f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Internalize.insert(GV->getName()); 5771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 5788166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner 579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // FIXME: Propagate Errors through to the caller instead of emitting 580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // diagnostics. 581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool HasErrors = false; 582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(), 583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar [this](GlobalValue &GV, IRMover::ValueAdder Add) { 584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar addLazyFor(GV, Add); 585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar })) { 586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { 587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message())); 588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar HasErrors = true; 589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }); 590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (HasErrors) 592d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling return true; 593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 594f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar for (auto &P : Internalize) { 595f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GlobalValue *GV = DstM.getNamedValue(P.first()); 596f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GV->setLinkage(GlobalValue::InternalLinkage); 597ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 598ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 599ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return false; 600ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 601208b6f69441293d27b61b9d16a69c9bba4d097cbBill Wendling 602f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLinker::Linker(Module &M) : Mover(M) {} 6034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 604f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags, 605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseSet<const GlobalValue *> *GlobalsToImport) { 606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleLinker ModLinker(Mover, std::move(Src), Flags, GlobalsToImport); 607f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return ModLinker.run(); 608ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 609ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 6101afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 6111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner// LinkModules entrypoint. 6121afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 6131afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 61437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// This function links two modules together, with the resulting Dest module 61537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// modified to be the composite of the two input modules. If an error occurs, 61637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// true is returned and ErrorMsg (if not null) is set to indicate the problem. 61737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// Upon failure, the Dest module could be in a modified state, and shouldn't be 61837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// relied on to be consistent. 619f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src, 620f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned Flags) { 621f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Linker L(Dest); 622f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return L.linkInModule(std::move(Src), Flags); 62337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 62437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 625f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling//===----------------------------------------------------------------------===// 626f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling// C API. 627f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling//===----------------------------------------------------------------------===// 628f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling 629f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 630f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module *D = unwrap(Dest); 631f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar std::unique_ptr<Module> M(unwrap(Src)); 632f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return Linker::linkModules(*D, std::move(M)); 633f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 634