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 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Linker/Linker.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm-c/Linker.h" 163ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola#include "llvm/ADT/Optional.h" 17d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling#include "llvm/ADT/SetVector.h" 1858890d52eb6f9ba44e70c8fc651201f1d429489eEli Bendersky#include "llvm/ADT/SmallString.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 214068e1af9ff68b6b5fdb3233f1304e53f1bf179aChandler Carruth#include "llvm/IR/TypeFinder.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/CommandLine.h" 23cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling#include "llvm/Support/Debug.h" 24cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling#include "llvm/Support/raw_ostream.h" 25f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner#include "llvm/Transforms/Utils/Cloning.h" 26e3ba15c794839abe076e3e2bdf6c626396a19d4dWill Dietz#include <cctype> 27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <tuple> 28f7703df4968084c18c248c1feea9961c19a32e6aChris Lattnerusing namespace llvm; 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner// TypeMap implementation. 331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 344c00e53b81de81ecf4ba0c4e287ea230c79e82aeChris Lattner 3562a81a1eba019ab570b002f8e1686494139785a1Chris Lattnernamespace { 36cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola typedef SmallPtrSet<StructType*, 32> TypeSet; 37cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola 381afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerclass TypeMapTy : public ValueMapTypeRemapper { 391afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// MappedTypes - This is a mapping from a source type to a destination type 401afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// to use. 411afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DenseMap<Type*, Type*> MappedTypes; 421afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 431afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// SpeculativeTypes - When checking to see if two subgraphs are isomorphic, 441afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// we speculatively add types to MappedTypes, but keep track of them here in 451afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// case we need to roll back. 461afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SmallVector<Type*, 16> SpeculativeTypes; 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4868910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner /// SrcDefinitionsToResolve - This is a list of non-opaque structs in the 4968910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner /// source module that are mapped to an opaque struct in the destination 5068910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner /// module. 5168910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner SmallVector<StructType*, 16> SrcDefinitionsToResolve; 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 5368910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner /// DstResolvedOpaqueTypes - This is the set of opaque types in the 5468910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner /// destination modules who are getting a body from the source module. 5568910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner SmallPtrSet<StructType*, 16> DstResolvedOpaqueTypes; 566d6c6d7d2ce42af78ffa4e84a30f14e4404f5985Bill Wendling 57fc196f9ee909ac35837f6f771a42aa0dec817584Chris Lattnerpublic: 58cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola TypeMapTy(TypeSet &Set) : DstStructTypesSet(Set) {} 59cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola 60cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola TypeSet &DstStructTypesSet; 611afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// addTypeMapping - Indicate that the specified type in the destination 621afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// module is conceptually equivalent to the specified type in the source 631afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// module. 641afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void addTypeMapping(Type *DstTy, Type *SrcTy); 651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// linkDefinedTypeBodies - Produce a body for an opaque type in the dest 671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// module from a type definition in the source module. 681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void linkDefinedTypeBodies(); 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// get - Return the mapped type to use for the specified input type from the 711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// source module. 721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *get(Type *SrcTy); 731afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner FunctionType *get(FunctionType *T) {return cast<FunctionType>(get((Type*)T));} 751afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 76cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling /// dump - Dump out the type map for debugging purposes. 77cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling void dump() const { 78cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling for (DenseMap<Type*, Type*>::const_iterator 79cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling I = MappedTypes.begin(), E = MappedTypes.end(); I != E; ++I) { 80cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling dbgs() << "TypeMap: "; 81cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling I->first->dump(); 82cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling dbgs() << " => "; 83cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling I->second->dump(); 84cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling dbgs() << '\n'; 85cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling } 86cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling } 87cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling 881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerprivate: 891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *getImpl(Type *T); 901afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// remapType - Implement the ValueMapTypeRemapper interface. 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *remapType(Type *SrcTy) override { 921afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return get(SrcTy); 9362a81a1eba019ab570b002f8e1686494139785a1Chris Lattner } 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 951afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool areTypesIsomorphic(Type *DstTy, Type *SrcTy); 961afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner}; 971afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 98eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov 991afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) { 1001afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *&Entry = MappedTypes[SrcTy]; 1011afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (Entry) return; 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1031afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstTy == SrcTy) { 1041afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Entry = DstTy; 1051afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return; 10662a81a1eba019ab570b002f8e1686494139785a1Chris Lattner } 107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1081afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Check to see if these types are recursively isomorphic and establish a 1091afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // mapping between them if so. 110601c094734cc5920a4e937c74447dd6922770a2dBill Wendling if (!areTypesIsomorphic(DstTy, SrcTy)) { 1111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Oops, they aren't isomorphic. Just discard this request by rolling out 1121afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // any speculative mappings we've established. 1131afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (unsigned i = 0, e = SpeculativeTypes.size(); i != e; ++i) 1141afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner MappedTypes.erase(SpeculativeTypes[i]); 115601c094734cc5920a4e937c74447dd6922770a2dBill Wendling } 1161afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SpeculativeTypes.clear(); 11762a81a1eba019ab570b002f8e1686494139785a1Chris Lattner} 11862a81a1eba019ab570b002f8e1686494139785a1Chris Lattner 1191afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// areTypesIsomorphic - Recursively walk this pair of types, returning true 1201afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// if they are isomorphic, false if they are not. 1211afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool TypeMapTy::areTypesIsomorphic(Type *DstTy, Type *SrcTy) { 1221afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Two types with differing kinds are clearly not isomorphic. 1231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstTy->getTypeID() != SrcTy->getTypeID()) return false; 1241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If we have an entry in the MappedTypes table, then we have our answer. 1261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *&Entry = MappedTypes[SrcTy]; 1271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (Entry) 1281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return Entry == DstTy; 1291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Two identical types are clearly isomorphic. Remember this 1311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // non-speculatively. 1321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstTy == SrcTy) { 1331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Entry = DstTy; 13456539659eb1b192d493aa333b60213889129b9f1Chris Lattner return true; 135e76c57ad467ed57f09f2a3ef51628d4b6eb2b304Chris Lattner } 136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1371afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Okay, we have two types with identical kinds that we haven't seen before. 1381afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1391afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If this is an opaque struct type, special case it. 1401afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (StructType *SSTy = dyn_cast<StructType>(SrcTy)) { 1411afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Mapping an opaque type to any struct, just keep the dest struct. 1421afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (SSTy->isOpaque()) { 1431afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Entry = DstTy; 1441afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SpeculativeTypes.push_back(SrcTy); 145f6f4f7a149e2864cc0441afcbed5fd99ff4b9587Chris Lattner return true; 1461afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 147eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov 14868910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner // Mapping a non-opaque source type to an opaque dest. If this is the first 14968910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner // type that we're mapping onto this destination type then we succeed. Keep 15068910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner // the dest, but fill it in later. This doesn't need to be speculative. If 15168910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner // this is the second (different) type that we're trying to map onto the 15268910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner // same opaque type then we fail. 1531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (cast<StructType>(DstTy)->isOpaque()) { 15468910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner // We can only map one source type onto the opaque destination type. 15568910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner if (!DstResolvedOpaqueTypes.insert(cast<StructType>(DstTy))) 15668910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner return false; 15768910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner SrcDefinitionsToResolve.push_back(SSTy); 1581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Entry = DstTy; 1591afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 160a4477f9b31ce0b6fadc5365ff9355679c1ecb954Chris Lattner } 161e3092c94ad2e3af96f37a0a8186149acbbd9700aChris Lattner } 162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1631afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If the number of subtypes disagree between the two types, then we fail. 1641afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (SrcTy->getNumContainedTypes() != DstTy->getNumContainedTypes()) 1651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Fail if any of the extra properties (e.g. array size) of the type disagree. 1681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (isa<IntegerType>(DstTy)) 1691afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; // bitwidth disagrees. 1701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (PointerType *PT = dyn_cast<PointerType>(DstTy)) { 1711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (PT->getAddressSpace() != cast<PointerType>(SrcTy)->getAddressSpace()) 1721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } else if (FunctionType *FT = dyn_cast<FunctionType>(DstTy)) { 1751afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (FT->isVarArg() != cast<FunctionType>(SrcTy)->isVarArg()) 1761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 1771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } else if (StructType *DSTy = dyn_cast<StructType>(DstTy)) { 1781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StructType *SSTy = cast<StructType>(SrcTy); 1791bcbf8582e94eee6f151e5e2db2d04f417abf5f7Chris Lattner if (DSTy->isLiteral() != SSTy->isLiteral() || 1801afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DSTy->isPacked() != SSTy->isPacked()) 1811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 1821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } else if (ArrayType *DATy = dyn_cast<ArrayType>(DstTy)) { 1831afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DATy->getNumElements() != cast<ArrayType>(SrcTy)->getNumElements()) 1841afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 1851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } else if (VectorType *DVTy = dyn_cast<VectorType>(DstTy)) { 1862b8f6ae6b791099ceff8ad87bcca7f165655c5c7Joey Gouly if (DVTy->getNumElements() != cast<VectorType>(SrcTy)->getNumElements()) 1871afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 188f6f4f7a149e2864cc0441afcbed5fd99ff4b9587Chris Lattner } 189eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov 1901afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Otherwise, we speculate that these two types will line up and recursively 1911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // check the subelements. 1921afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Entry = DstTy; 1931afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SpeculativeTypes.push_back(SrcTy); 1941afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 195601c094734cc5920a4e937c74447dd6922770a2dBill Wendling for (unsigned i = 0, e = SrcTy->getNumContainedTypes(); i != e; ++i) 196601c094734cc5920a4e937c74447dd6922770a2dBill Wendling if (!areTypesIsomorphic(DstTy->getContainedType(i), 197601c094734cc5920a4e937c74447dd6922770a2dBill Wendling SrcTy->getContainedType(i))) 1981afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2001afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If everything seems to have lined up, then everything is great. 2011afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 2021afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 203eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov 2041afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// linkDefinedTypeBodies - Produce a body for an opaque type in the dest 2051afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// module from a type definition in the source module. 2061afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid TypeMapTy::linkDefinedTypeBodies() { 2071afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SmallVector<Type*, 16> Elements; 2081afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SmallString<16> TmpName; 209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2101afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Note that processing entries in this loop (calling 'get') can add new 21168910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner // entries to the SrcDefinitionsToResolve vector. 21268910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner while (!SrcDefinitionsToResolve.empty()) { 21368910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner StructType *SrcSTy = SrcDefinitionsToResolve.pop_back_val(); 2141afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StructType *DstSTy = cast<StructType>(MappedTypes[SrcSTy]); 215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2161afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // TypeMap is a many-to-one mapping, if there were multiple types that 2171afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // provide a body for DstSTy then previous iterations of this loop may have 2181afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // already handled it. Just ignore this case. 2191afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!DstSTy->isOpaque()) continue; 2201afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner assert(!SrcSTy->isOpaque() && "Not resolving a definition?"); 221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2221afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Map the body of the source type over to a new body for the dest type. 2231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Elements.resize(SrcSTy->getNumElements()); 2241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (unsigned i = 0, e = Elements.size(); i != e; ++i) 2251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Elements[i] = getImpl(SrcSTy->getElementType(i)); 226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstSTy->setBody(Elements, SrcSTy->isPacked()); 228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If DstSTy has no name or has a longer name than STy, then viciously steal 2301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // STy's name. 2311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!SrcSTy->hasName()) continue; 2321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StringRef SrcName = SrcSTy->getName(); 233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!DstSTy->hasName() || DstSTy->getName().size() > SrcName.size()) { 2351afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner TmpName.insert(TmpName.end(), SrcName.begin(), SrcName.end()); 2361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SrcSTy->setName(""); 2371afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstSTy->setName(TmpName.str()); 2381afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner TmpName.clear(); 2391afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 240f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman } 241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 24268910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner DstResolvedOpaqueTypes.clear(); 243e76c57ad467ed57f09f2a3ef51628d4b6eb2b304Chris Lattner} 244e76c57ad467ed57f09f2a3ef51628d4b6eb2b304Chris Lattner 2451afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// get - Return the mapped type to use for the specified input type from the 2461afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// source module. 2471afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris LattnerType *TypeMapTy::get(Type *Ty) { 2481afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *Result = getImpl(Ty); 249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2501afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If this caused a reference to any struct type, resolve it before returning. 25168910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner if (!SrcDefinitionsToResolve.empty()) 2521afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner linkDefinedTypeBodies(); 2531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return Result; 2541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 255e76c57ad467ed57f09f2a3ef51628d4b6eb2b304Chris Lattner 2561afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// getImpl - This is the recursive version of get(). 2571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris LattnerType *TypeMapTy::getImpl(Type *Ty) { 2581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If we already have an entry for this type, return it. 2591afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type **Entry = &MappedTypes[Ty]; 2601afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (*Entry) return *Entry; 261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2621afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If this is not a named struct type, then just map all of the elements and 2631afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // then rebuild the type from inside out. 2641bcbf8582e94eee6f151e5e2db2d04f417abf5f7Chris Lattner if (!isa<StructType>(Ty) || cast<StructType>(Ty)->isLiteral()) { 2651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If there are no element types to map, then the type is itself. This is 2661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // true for the anonymous {} struct, things like 'float', integers, etc. 2671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (Ty->getNumContainedTypes() == 0) 2681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = Ty; 269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Remap all of the elements, keeping track of whether any of them change. 2711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool AnyChange = false; 2721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SmallVector<Type*, 4> ElementTypes; 2731afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ElementTypes.resize(Ty->getNumContainedTypes()); 2741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (unsigned i = 0, e = Ty->getNumContainedTypes(); i != e; ++i) { 2751afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ElementTypes[i] = getImpl(Ty->getContainedType(i)); 2761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner AnyChange |= ElementTypes[i] != Ty->getContainedType(i); 2771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2791afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If we found our type while recursively processing stuff, just use it. 2801afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Entry = &MappedTypes[Ty]; 2811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (*Entry) return *Entry; 282dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2831afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If all of the element types mapped directly over, then the type is usable 2841afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // as-is. 2851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!AnyChange) 2861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = Ty; 287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Otherwise, rebuild a modified type. 2891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner switch (Ty->getTypeID()) { 290858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("unknown derived type to remap"); 2911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner case Type::ArrayTyID: 2921afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = ArrayType::get(ElementTypes[0], 2931afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner cast<ArrayType>(Ty)->getNumElements()); 294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case Type::VectorTyID: 2951afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = VectorType::get(ElementTypes[0], 2961afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner cast<VectorType>(Ty)->getNumElements()); 2971afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner case Type::PointerTyID: 2981afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = PointerType::get(ElementTypes[0], 2991afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner cast<PointerType>(Ty)->getAddressSpace()); 3001afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner case Type::FunctionTyID: 3011afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = FunctionType::get(ElementTypes[0], 30239b5abf507b43da6b92f68b86406e0015ead18e9Frits van Bommel makeArrayRef(ElementTypes).slice(1), 3031afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner cast<FunctionType>(Ty)->isVarArg()); 3041afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner case Type::StructTyID: 3051afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Note that this is only reached for anonymous structs. 3061afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = StructType::get(Ty->getContext(), ElementTypes, 3071afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner cast<StructType>(Ty)->isPacked()); 3084c00e53b81de81ecf4ba0c4e287ea230c79e82aeChris Lattner } 3094c00e53b81de81ecf4ba0c4e287ea230c79e82aeChris Lattner } 3104c00e53b81de81ecf4ba0c4e287ea230c79e82aeChris Lattner 3111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Otherwise, this is an unmapped named struct. If the struct can be directly 3121afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // mapped over, just use it as-is. This happens in a case when the linked-in 3131afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // module has something like: 3141afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // %T = type {%T*, i32} 3151afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // @GV = global %T* null 3161afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // where T does not exist at all in the destination module. 3171afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // 3181afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // The other case we watch for is when the type is not in the destination 3191afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // module, but that it has to be rebuilt because it refers to something that 3201afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // is already mapped. For example, if the destination module has: 3211afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // %A = type { i32 } 3221afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // and the source module has something like 3231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // %A' = type { i32 } 3241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // %B = type { %A'* } 3251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // @GV = global %B* null 3261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // then we want to create a new type: "%B = type { %A*}" and have it take the 3271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // pristine "%B" name from the source module. 3281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // 3291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // To determine which case this is, we have to recursively walk the type graph 3301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // speculating that we'll be able to reuse it unmodified. Only if this is 3311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // safe would we map the entire thing over. Because this is an optimization, 3321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // and is not required for the prettiness of the linked module, we just skip 3331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // it and always rebuild a type here. 3341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StructType *STy = cast<StructType>(Ty); 335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If the type is opaque, we can just use it directly. 337cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola if (STy->isOpaque()) { 338cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola // A named structure type from src module is used. Add it to the Set of 339cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola // identified structs in the destination module. 340cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola DstStructTypesSet.insert(STy); 3411afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return *Entry = STy; 342cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola } 343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3441afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Otherwise we create a new type and resolve its body later. This will be 3451afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // resolved by the top level of get(). 34668910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner SrcDefinitionsToResolve.push_back(STy); 34768910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner StructType *DTy = StructType::create(STy->getContext()); 348cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola // A new identified structure type was created. Add it to the set of 349cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola // identified structs in the destination module. 350cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola DstStructTypesSet.insert(DTy); 35168910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner DstResolvedOpaqueTypes.insert(DTy); 35268910509fdd638727ce2f244ab7c0e4346671de1Chris Lattner return *Entry = DTy; 3531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 3542f6bb2bce13084dfc4c8acf47f9eae0578267aaaChris Lattner 3551afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 3561afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner// ModuleLinker implementation. 3571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 3584c00e53b81de81ecf4ba0c4e287ea230c79e82aeChris Lattner 3591afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnernamespace { 360a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy class ModuleLinker; 361a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 362a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy /// ValueMaterializerTy - Creates prototypes for functions that are lazily 363a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy /// linked on the fly. This speeds up linking for modules with many 364a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy /// lazily linked functions of which few get used. 365a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy class ValueMaterializerTy : public ValueMaterializer { 366a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy TypeMapTy &TypeMap; 367a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy Module *DstM; 368a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy std::vector<Function*> &LazilyLinkFunctions; 369a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy public: 370a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy ValueMaterializerTy(TypeMapTy &TypeMap, Module *DstM, 371a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy std::vector<Function*> &LazilyLinkFunctions) : 372a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy ValueMaterializer(), TypeMap(TypeMap), DstM(DstM), 373a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy LazilyLinkFunctions(LazilyLinkFunctions) { 374a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy } 375a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Value *materializeValueFor(Value *V) override; 377a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy }; 378a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 3791afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// ModuleLinker - This is an implementation class for the LinkModules 3801afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// function, which is the entrypoint for this file. 3811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner class ModuleLinker { 3821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Module *DstM, *SrcM; 383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TypeMapTy TypeMap; 385a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy ValueMaterializerTy ValMaterializer; 3861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 3871afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// ValueMap - Mapping of values from what they used to be in Src, to what 3881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// they are now in DstM. ValueToValueMapTy is a ValueMap, which involves 3891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// some overhead due to the use of Value handles which the Linker doesn't 3901afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// actually need, but this allows us to reuse the ValueMapper code. 3911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueToValueMapTy ValueMap; 392dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3931afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner struct AppendingVarInfo { 3941afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalVariable *NewGV; // New aggregate global in dest module. 3951afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Constant *DstInit; // Old initializer from dest module. 3961afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Constant *SrcInit; // Old initializer from src module. 3971afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner }; 398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3991afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::vector<AppendingVarInfo> AppendingVars; 400dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 401f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner unsigned Mode; // Mode to treat source module. 402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 403f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // Set of items not to link in from source. 404f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner SmallPtrSet<const Value*, 16> DoNotLinkFromSource; 405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4069af37a3de8c8688adae383471379f0216287ce28Tanya Lattner // Vector of functions to lazily link in. 407d99a29e9847815d628791e246dbdd50c6371c43dBill Wendling std::vector<Function*> LazilyLinkFunctions; 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool SuppressWarnings; 410dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner public: 4121afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::string ErrorMsg; 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ModuleLinker(Module *dstM, TypeSet &Set, Module *srcM, unsigned mode, 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool SuppressWarnings=false) 41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : DstM(dstM), SrcM(srcM), TypeMap(Set), 41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ValMaterializer(TypeMap, DstM, LazilyLinkFunctions), Mode(mode), 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SuppressWarnings(SuppressWarnings) {} 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4201afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool run(); 421dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4221afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner private: 4231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// emitError - Helper method for setting a message and returning an error 4241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// code. 4251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool emitError(const Twine &Message) { 4261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ErrorMsg = Message.str(); 4271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 4281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 429dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 430cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool getComdatLeader(Module *M, StringRef ComdatName, 431cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const GlobalVariable *&GVar); 432cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool computeResultingSelectionKind(StringRef ComdatName, 433cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind Src, 434cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind Dst, 435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind &Result, 436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool &LinkFromSrc); 437cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 438cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ComdatsChosen; 439cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool &LinkFromSrc); 441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 4421afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// getLinkageResult - This analyzes the two global values and determines 4431afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// what the result will look like in the destination module. 4441afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool getLinkageResult(GlobalValue *Dest, const GlobalValue *Src, 4453ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola GlobalValue::LinkageTypes <, 4463ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola GlobalValue::VisibilityTypes &Vis, 4473ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola bool &LinkFromSrc); 4481afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 4491afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// getLinkedToGlobal - Given a global in the source module, return the 4501afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner /// global in the destination module that is being linked to, if any. 4511afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalValue *getLinkedToGlobal(GlobalValue *SrcGV) { 4521afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If the source has no name it can't link. If it has local linkage, 4531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // there is no name match-up going on. 4541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!SrcGV->hasName() || SrcGV->hasLocalLinkage()) 455dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 456dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Otherwise see if we have a match in the destination module's symtab. 4581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalValue *DGV = DstM->getNamedValue(SrcGV->getName()); 459dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!DGV) return nullptr; 460dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4611afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If we found a global with the same name in the dest module, but it has 4621afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // internal linkage, we are really not doing any linkage here. 4631afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DGV->hasLocalLinkage()) 464dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 4651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 4661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Otherwise, we do in fact link to the destination global. 4671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return DGV; 4681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 469dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void computeTypeMapping(); 471dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool linkAppendingVarProto(GlobalVariable *DstGV, GlobalVariable *SrcGV); 4731afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool linkGlobalProto(GlobalVariable *SrcGV); 4741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool linkFunctionProto(Function *SrcF); 4751afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool linkAliasProto(GlobalAlias *SrcA); 476d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling bool linkModuleFlagsMetadata(); 477dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void linkAppendingVarInit(const AppendingVarInfo &AVI); 4791afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void linkGlobalInits(); 4801afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void linkFunctionBody(Function *Dst, Function *Src); 4811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void linkAliasBodies(); 4821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner void linkNamedMDNodes(); 4831afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner }; 484601c094734cc5920a4e937c74447dd6922770a2dBill Wendling} 485601c094734cc5920a4e937c74447dd6922770a2dBill Wendling 4861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// forceRenaming - The LLVM SymbolTable class autorenames globals that conflict 4878bef0373f1b8fab20b9acd277377ca01d72bac7eReid Spencer/// in the symbol table. This is good for all clients except for us. Go 4888bef0373f1b8fab20b9acd277377ca01d72bac7eReid Spencer/// through the trouble to force this back. 4891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerstatic void forceRenaming(GlobalValue *GV, StringRef Name) { 4901afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If the global doesn't force its name or if it already has the right name, 4911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // there is nothing for us to do. 4921afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (GV->hasLocalLinkage() || GV->getName() == Name) 4931afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return; 4941afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 4951afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Module *M = GV->getParent(); 496c003628a612d3687fb77088a5894314210a65385Chris Lattner 497c003628a612d3687fb77088a5894314210a65385Chris Lattner // If there is a conflict, rename the conflict. 4981afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (GlobalValue *ConflictGV = M->getNamedValue(Name)) { 49933f294930e0affa51c3818405741abd80cc90316Chris Lattner GV->takeName(ConflictGV); 50033f294930e0affa51c3818405741abd80cc90316Chris Lattner ConflictGV->setName(Name); // This will cause ConflictGV to get renamed 5011afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner assert(ConflictGV->getName() != Name && "forceRenaming didn't work"); 50233f294930e0affa51c3818405741abd80cc90316Chris Lattner } else { 50333f294930e0affa51c3818405741abd80cc90316Chris Lattner GV->setName(Name); // Force the name back 504ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer } 505ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer} 506ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer 507cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// copyGVAttributes - copy additional attributes (those not needed to construct 508eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov/// a GlobalValue) from the SrcGV to the DestGV. 509cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendlingstatic void copyGVAttributes(GlobalValue *DestGV, const GlobalValue *SrcGV) { 51028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands // Use the maximum alignment, rather than just copying the alignment of SrcGV. 511dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto *DestGO = dyn_cast<GlobalObject>(DestGV); 512dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned Alignment; 513dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DestGO) 514dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Alignment = std::max(DestGO->getAlignment(), SrcGV->getAlignment()); 515dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 51628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands DestGV->copyAttributesFrom(SrcGV); 517dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 518dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DestGO) 519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DestGO->setAlignment(Alignment); 520dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 5211afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner forceRenaming(DestGV, SrcGV->getName()); 522c003628a612d3687fb77088a5894314210a65385Chris Lattner} 523c003628a612d3687fb77088a5894314210a65385Chris Lattner 5243ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindolastatic bool isLessConstraining(GlobalValue::VisibilityTypes a, 5253ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola GlobalValue::VisibilityTypes b) { 5263ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola if (a == GlobalValue::HiddenVisibility) 5273ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola return false; 5283ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola if (b == GlobalValue::HiddenVisibility) 5293ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola return true; 5303ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola if (a == GlobalValue::ProtectedVisibility) 5313ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola return false; 5323ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola if (b == GlobalValue::ProtectedVisibility) 5333ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola return true; 5343ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola return false; 5353ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola} 5363ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola 537a84a83bbcdfaecadfc6574094272fd3edc429a23James MolloyValue *ValueMaterializerTy::materializeValueFor(Value *V) { 538a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy Function *SF = dyn_cast<Function>(V); 539a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy if (!SF) 540dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 541a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 542a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy Function *DF = Function::Create(TypeMap.get(SF->getFunctionType()), 543a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy SF->getLinkage(), SF->getName(), DstM); 544a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy copyGVAttributes(DF, SF); 545a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 546a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy LazilyLinkFunctions.push_back(SF); 547a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy return DF; 548a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy} 549a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 550cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ModuleLinker::getComdatLeader(Module *M, StringRef ComdatName, 551cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const GlobalVariable *&GVar) { 552cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const GlobalValue *GVal = M->getNamedValue(ComdatName); 553cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 554cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GVal = GA->getBaseObject(); 555cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!GVal) 556cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // We cannot resolve the size of the aliasee yet. 557cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return emitError("Linking COMDATs named '" + ComdatName + 558cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "': COMDAT key involves incomputable alias size."); 559cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 560cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 561cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GVar = dyn_cast_or_null<GlobalVariable>(GVal); 562cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!GVar) 563cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return emitError( 564cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "Linking COMDATs named '" + ComdatName + 565cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "': GlobalVariable required for data dependent selection!"); 566cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 567cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 568cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 569cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 570cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 571cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind Src, 572cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind Dst, 573cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind &Result, 574cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool &LinkFromSrc) { 575cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // The ability to mix Comdat::SelectionKind::Any with 576cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 577cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 578cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Dst == Comdat::SelectionKind::Largest; 579cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 580cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Src == Comdat::SelectionKind::Largest; 581cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DstAnyOrLargest && SrcAnyOrLargest) { 582cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (Dst == Comdat::SelectionKind::Largest || 583cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Src == Comdat::SelectionKind::Largest) 584cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Result = Comdat::SelectionKind::Largest; 585cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines else 586cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Result = Comdat::SelectionKind::Any; 587cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } else if (Src == Dst) { 588cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Result = Dst; 589cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } else { 590cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return emitError("Linking COMDATs named '" + ComdatName + 591cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "': invalid selection kinds!"); 592cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 593cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 594cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines switch (Result) { 595cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Comdat::SelectionKind::Any: 596cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Go with Dst. 597cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LinkFromSrc = false; 598cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 599cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Comdat::SelectionKind::NoDuplicates: 600cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return emitError("Linking COMDATs named '" + ComdatName + 601cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "': noduplicates has been violated!"); 602cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Comdat::SelectionKind::ExactMatch: 603cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Comdat::SelectionKind::Largest: 604cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Comdat::SelectionKind::SameSize: { 605cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const GlobalVariable *DstGV; 606cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const GlobalVariable *SrcGV; 607cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (getComdatLeader(DstM, ComdatName, DstGV) || 608cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines getComdatLeader(SrcM, ComdatName, SrcGV)) 609cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 610cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 611cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout *DstDL = DstM->getDataLayout(); 612cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout *SrcDL = SrcM->getDataLayout(); 613cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!DstDL || !SrcDL) { 614cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return emitError( 615cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "Linking COMDATs named '" + ComdatName + 616cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "': can't do size dependent selection without DataLayout!"); 617cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 618cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uint64_t DstSize = 619cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DstDL->getTypeAllocSize(DstGV->getType()->getPointerElementType()); 620cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uint64_t SrcSize = 621cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SrcDL->getTypeAllocSize(SrcGV->getType()->getPointerElementType()); 622cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (Result == Comdat::SelectionKind::ExactMatch) { 623cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (SrcGV->getInitializer() != DstGV->getInitializer()) 624cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return emitError("Linking COMDATs named '" + ComdatName + 625cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "': ExactMatch violated!"); 626cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LinkFromSrc = false; 627cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } else if (Result == Comdat::SelectionKind::Largest) { 628cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LinkFromSrc = SrcSize > DstSize; 629cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } else if (Result == Comdat::SelectionKind::SameSize) { 630cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (SrcSize != DstSize) 631cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return emitError("Linking COMDATs named '" + ComdatName + 632cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "': SameSize violated!"); 633cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LinkFromSrc = false; 634cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } else { 635cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines llvm_unreachable("unknown selection kind"); 636cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 637cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 638cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 639cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 640cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 641cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 642cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 643cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 644cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ModuleLinker::getComdatResult(const Comdat *SrcC, 645cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind &Result, 646cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool &LinkFromSrc) { 647cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef ComdatName = SrcC->getName(); 648cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Module::ComdatSymTabType &ComdatSymTab = DstM->getComdatSymbolTable(); 649cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 650cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DstCI != ComdatSymTab.end()) { 651cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const Comdat *DstC = &DstCI->second; 652cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 653cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind DSK = DstC->getSelectionKind(); 654cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (computeResultingSelectionKind(ComdatName, SSK, DSK, Result, LinkFromSrc)) 655cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 656cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 657cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 658cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 659a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 6601afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// getLinkageResult - This analyzes the two global values and determines what 661aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner/// the result will look like in the destination module. In particular, it 6623ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola/// computes the resultant linkage type and visibility, computes whether the 6633ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola/// global in the source should be copied over to the destination (replacing 6643ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola/// the existing one), and computes whether this linkage is an error or not. 6651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::getLinkageResult(GlobalValue *Dest, const GlobalValue *Src, 6663ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola GlobalValue::LinkageTypes <, 6673ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola GlobalValue::VisibilityTypes &Vis, 6681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner bool &LinkFromSrc) { 6691afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner assert(Dest && "Must have two globals being queried"); 6701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner assert(!Src->hasLocalLinkage() && 671aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner "If Src has internal linkage, Dest shouldn't be set!"); 672dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 6738895316d0489e2353c0dce289b49f5cdd41085d7Peter Collingbourne bool SrcIsDeclaration = Src->isDeclaration() && !Src->isMaterializable(); 674f84c59d1100af416a70e475eb25741e27f3bb832Chris Lattner bool DestIsDeclaration = Dest->isDeclaration(); 675dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 6761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (SrcIsDeclaration) { 6772b48ef0450944c2c46633aec9baf6be835a3b503Anton Korobeynikov // If Src is external or if both Src & Dest are external.. Just link the 678aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner // external globals, we aren't adding anything. 67936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Src->hasDLLImportStorageClass()) { 68036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If one of GVs is marked as DLLImport, result should be dllimport'ed. 6811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DestIsDeclaration) { 682b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov LinkFromSrc = true; 683b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov LT = Src->getLinkage(); 684eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov } 6858753c447a5f8eec1421331c40ffbb72c6d411f78Andrew Lenharth } else if (Dest->hasExternalWeakLinkage()) { 686667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands // If the Dest is weak, use the source linkage. 6878753c447a5f8eec1421331c40ffbb72c6d411f78Andrew Lenharth LinkFromSrc = true; 6888753c447a5f8eec1421331c40ffbb72c6d411f78Andrew Lenharth LT = Src->getLinkage(); 689b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov } else { 690b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov LinkFromSrc = false; 691b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov LT = Dest->getLinkage(); 692b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov } 69336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else if (DestIsDeclaration && !Dest->hasDLLImportStorageClass()) { 694aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner // If Dest is external but Src is not: 695aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LinkFromSrc = true; 696aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LT = Src->getLinkage(); 697a05ef5e107943478ad02bc0cd5170a3894076bc4Duncan Sands } else if (Src->isWeakForLinker()) { 698aafce77b17d340aace52bcd49d1944109d82f14aDale Johannesen // At this point we know that Dest has LinkOnce, External*, Weak, Common, 699aafce77b17d340aace52bcd49d1944109d82f14aDale Johannesen // or DLL* linkage. 700266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner if (Dest->hasExternalWeakLinkage() || 701266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner Dest->hasAvailableExternallyLinkage() || 702266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner (Dest->hasLinkOnceLinkage() && 703266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner (Src->hasWeakLinkage() || Src->hasCommonLinkage()))) { 704aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LinkFromSrc = true; 705aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LT = Src->getLinkage(); 706aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner } else { 707aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LinkFromSrc = false; 708aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner LT = Dest->getLinkage(); 709aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner } 710a05ef5e107943478ad02bc0cd5170a3894076bc4Duncan Sands } else if (Dest->isWeakForLinker()) { 71178ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov // At this point we know that Src has External* or DLL* linkage. 71278ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov if (Src->hasExternalWeakLinkage()) { 71378ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov LinkFromSrc = false; 71478ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov LT = Dest->getLinkage(); 71578ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov } else { 71678ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov LinkFromSrc = true; 71778ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov LT = GlobalValue::ExternalLinkage; 71878ee7b78c3c47b71c4b7a1475438d6574216a64bAnton Korobeynikov } 719aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner } else { 72036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((Dest->hasExternalLinkage() || Dest->hasExternalWeakLinkage()) && 72136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (Src->hasExternalLinkage() || Src->hasExternalWeakLinkage()) && 722aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner "Unexpected linkage type!"); 7231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return emitError("Linking globals named '" + Src->getName() + 724aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner "': symbol multiply defined!"); 725aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner } 7269cd3ccf5065a8a139e458d016c88a8512471598bAnton Korobeynikov 7273ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola // Compute the visibility. We follow the rules in the System V Application 7283ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola // Binary Interface. 729dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(!GlobalValue::isLocalLinkage(LT) && 730dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines "Symbols with local linkage should not be merged"); 7313ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola Vis = isLessConstraining(Src->getVisibility(), Dest->getVisibility()) ? 7323ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola Dest->getVisibility() : Src->getVisibility(); 733aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner return false; 734aee38ea5698fd770bb41d01d06542cb849e131a4Chris Lattner} 7355c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 7361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// computeTypeMapping - Loop over all of the linked values to compute type 7371afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// mappings. For example, if we link "extern Foo *x" and "Foo *x = NULL", then 7381afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// we have two struct types 'Foo' but one got renamed when the module was 7391afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// loaded into the same LLVMContext. 7401afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid ModuleLinker::computeTypeMapping() { 7411afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Incorporate globals. 7421afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::global_iterator I = SrcM->global_begin(), 7431afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner E = SrcM->global_end(); I != E; ++I) { 7441afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalValue *DGV = getLinkedToGlobal(I); 745dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!DGV) continue; 746dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 7471afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!DGV->hasAppendingLinkage() || !I->hasAppendingLinkage()) { 7481afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner TypeMap.addTypeMapping(DGV->getType(), I->getType()); 749dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines continue; 7501afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 751dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 7521afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Unify the element type of appending arrays. 7531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ArrayType *DAT = cast<ArrayType>(DGV->getType()->getElementType()); 7541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ArrayType *SAT = cast<ArrayType>(I->getType()->getElementType()); 7551afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner TypeMap.addTypeMapping(DAT->getElementType(), SAT->getElementType()); 756ab67e705f59d567afded845465f358b8a66ab62eDevang Patel } 757dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 7581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Incorporate functions. 7591afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::iterator I = SrcM->begin(), E = SrcM->end(); I != E; ++I) { 7601afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (GlobalValue *DGV = getLinkedToGlobal(I)) 7611afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner TypeMap.addTypeMapping(DGV->getType(), I->getType()); 7621afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 763c68d127b2c5a233c5e3f9dd59ca4ab335419d9ddBill Wendling 764601c094734cc5920a4e937c74447dd6922770a2dBill Wendling // Incorporate types by name, scanning all the types in the source module. 765601c094734cc5920a4e937c74447dd6922770a2dBill Wendling // At this point, the destination module may have a type "%foo = { i32 }" for 766348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling // example. When the source module got loaded into the same LLVMContext, if 767348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling // it had the same type, it would have been renamed to "%foo.42 = { i32 }". 768573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling TypeFinder SrcStructTypes; 769573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling SrcStructTypes.run(*SrcM, true); 770348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling SmallPtrSet<StructType*, 32> SrcStructTypesSet(SrcStructTypes.begin(), 771348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling SrcStructTypes.end()); 772a20689fd7e7fa095276491ff238f248339d28800Bill Wendling 773348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling for (unsigned i = 0, e = SrcStructTypes.size(); i != e; ++i) { 774348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling StructType *ST = SrcStructTypes[i]; 775348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling if (!ST->hasName()) continue; 776dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 777348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling // Check to see if there is a dot in the name followed by a digit. 778601c094734cc5920a4e937c74447dd6922770a2dBill Wendling size_t DotPos = ST->getName().rfind('.'); 779601c094734cc5920a4e937c74447dd6922770a2dBill Wendling if (DotPos == 0 || DotPos == StringRef::npos || 78087d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei ST->getName().back() == '.' || 78187d0b9ed1462705dd9bf1cb7f67d0bf03af776c8Guy Benyei !isdigit(static_cast<unsigned char>(ST->getName()[DotPos+1]))) 782601c094734cc5920a4e937c74447dd6922770a2dBill Wendling continue; 783dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 784348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling // Check to see if the destination module has a struct with the prefix name. 785601c094734cc5920a4e937c74447dd6922770a2dBill Wendling if (StructType *DST = DstM->getTypeByName(ST->getName().substr(0, DotPos))) 786a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // Don't use it if this actually came from the source module. They're in 787a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // the same LLVMContext after all. Also don't use it unless the type is 788a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // actually used in the destination module. This can happen in situations 789a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // like this: 790a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // 791a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // Module A Module B 792a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // -------- -------- 793a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // %Z = type { %A } %B = type { %C.1 } 794a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // %A = type { %B.1, [7 x i8] } %C.1 = type { i8* } 795a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // %B.1 = type { %C } %A.2 = type { %B.3, [5 x i8] } 796a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // %C = type { i8* } %B.3 = type { %C.1 } 797a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // 798a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // When we link Module B with Module A, the '%B' in Module B is 799a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // used. However, that would then use '%C.1'. But when we process '%C.1', 800a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // we prefer to take the '%C' version. So we are then left with both 801a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // '%C.1' and '%C' being used for the same types. This leads to some 802a20689fd7e7fa095276491ff238f248339d28800Bill Wendling // variables using one type and some using the other. 803cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola if (!SrcStructTypesSet.count(DST) && TypeMap.DstStructTypesSet.count(DST)) 804348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling TypeMap.addTypeMapping(DST, ST); 805348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling } 806348e5e763e1297870878c5cb11aadfab2e8e5e7aBill Wendling 8071afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Don't bother incorporating aliases, they aren't generally typed well. 808dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8091afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Now that we have discovered all of the type equivalences, get a body for 810dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // any 'opaque' types in the dest module that are now resolved. 8111afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner TypeMap.linkDefinedTypeBodies(); 812ab67e705f59d567afded845465f358b8a66ab62eDevang Patel} 813ab67e705f59d567afded845465f358b8a66ab62eDevang Patel 8141afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// linkAppendingVarProto - If there were any appending global variables, link 8151afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// them together now. Return true on error. 8161afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV, 8171afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalVariable *SrcGV) { 818dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8191afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!SrcGV->hasAppendingLinkage() || !DstGV->hasAppendingLinkage()) 8201afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return emitError("Linking globals named '" + SrcGV->getName() + 8211afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner "': can only link appending global with another appending global!"); 822dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ArrayType *DstTy = cast<ArrayType>(DstGV->getType()->getElementType()); 8241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ArrayType *SrcTy = 8251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner cast<ArrayType>(TypeMap.get(SrcGV->getType()->getElementType())); 8261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *EltTy = DstTy->getElementType(); 827dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Check to see that they two arrays agree on type. 8291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (EltTy != SrcTy->getElementType()) 8301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return emitError("Appending variables with different element types!"); 8311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstGV->isConstant() != SrcGV->isConstant()) 8321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return emitError("Appending variables linked with different const'ness!"); 833dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstGV->getAlignment() != SrcGV->getAlignment()) 8351afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return emitError( 8361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner "Appending variables with different alignment need to be linked!"); 837dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8381afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstGV->getVisibility() != SrcGV->getVisibility()) 8391afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return emitError( 8401afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner "Appending variables with different visibility need to be linked!"); 8419127334dade7fa36cb5cb999fc116ceaa4f52ac9Rafael Espindola 8429127334dade7fa36cb5cb999fc116ceaa4f52ac9Rafael Espindola if (DstGV->hasUnnamedAddr() != SrcGV->hasUnnamedAddr()) 8439127334dade7fa36cb5cb999fc116ceaa4f52ac9Rafael Espindola return emitError( 8449127334dade7fa36cb5cb999fc116ceaa4f52ac9Rafael Espindola "Appending variables with different unnamed_addr need to be linked!"); 8459127334dade7fa36cb5cb999fc116ceaa4f52ac9Rafael Espindola 846cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (StringRef(DstGV->getSection()) != SrcGV->getSection()) 8471afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return emitError( 8481afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner "Appending variables with different section name need to be linked!"); 849dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8501afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner uint64_t NewSize = DstTy->getNumElements() + SrcTy->getNumElements(); 8511afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ArrayType *NewType = ArrayType::get(EltTy, NewSize); 852dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8531afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Create the new global variable. 8541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalVariable *NG = 8551afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner new GlobalVariable(*DstGV->getParent(), NewType, SrcGV->isConstant(), 856dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DstGV->getLinkage(), /*init*/nullptr, /*name*/"", DstGV, 857ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg DstGV->getThreadLocalMode(), 8581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstGV->getType()->getAddressSpace()); 859dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8601afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Propagate alignment, visibility and section info. 861cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling copyGVAttributes(NG, DstGV); 862dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8631afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner AppendingVarInfo AVI; 8641afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner AVI.NewGV = NG; 8651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner AVI.DstInit = DstGV->getInitializer(); 8661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner AVI.SrcInit = SrcGV->getInitializer(); 8671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner AppendingVars.push_back(AVI); 8681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 8691afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Replace any uses of the two global variables with uses of the new 8701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // global. 8711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueMap[SrcGV] = ConstantExpr::getBitCast(NG, TypeMap.get(SrcGV->getType())); 8721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 8731afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstGV->replaceAllUsesWith(ConstantExpr::getBitCast(NG, DstGV->getType())); 8741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstGV->eraseFromParent(); 875dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 876f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // Track the source variable so we don't try to link it. 877f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner DoNotLinkFromSource.insert(SrcGV); 878dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 8791afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 8801afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 8815c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 8821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// linkGlobalProto - Loop through the global variables in the src module and 8831afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// merge them into the dest module. 8841afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) { 8851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalValue *DGV = getLinkedToGlobal(SGV); 8863ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility; 8873acfb58b178d25b0671cbfb4fb20194e62b01a98Rafael Espindola bool HasUnnamedAddr = SGV->hasUnnamedAddr(); 8881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 889cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool LinkFromSrc = false; 890cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat *DC = nullptr; 891cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (const Comdat *SC = SGV->getComdat()) { 892cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind SK; 893cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 894cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DC = DstM->getOrInsertComdat(SC->getName()); 895cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DC->setSelectionKind(SK); 896cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 897cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 8981afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DGV) { 899cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!DC) { 900cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Concatenation of appending linkage variables is magic and handled later. 901cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DGV->hasAppendingLinkage() || SGV->hasAppendingLinkage()) 902cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return linkAppendingVarProto(cast<GlobalVariable>(DGV), SGV); 903cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 904cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Determine whether linkage of these two globals follows the source 905cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // module's definition or the destination module's definition. 906cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage; 907cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GlobalValue::VisibilityTypes NV; 908cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (getLinkageResult(DGV, SGV, NewLinkage, NV, LinkFromSrc)) 909cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 910cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NewVisibility = NV; 911cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr(); 912cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 913cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // If we're not linking from the source, then keep the definition that we 914cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // have. 915cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!LinkFromSrc) { 916cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Special case for const propagation. 917cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV)) 918cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DGVar->isDeclaration() && SGV->isConstant() && 919cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines !DGVar->isConstant()) 920cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGVar->setConstant(true); 921cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 922cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Set calculated linkage, visibility and unnamed_addr. 923cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setLinkage(NewLinkage); 924cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setVisibility(*NewVisibility); 925cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setUnnamedAddr(HasUnnamedAddr); 926cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 927cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 9280fec08eb58dd9fffeb72c584aa61a59d71111c8dChris Lattner 9291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!LinkFromSrc) { 9306157e383c4a15ffb6e7f27cdb153daa9caa15ca5Chris Lattner // Make sure to remember this mapping. 9311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueMap[SGV] = ConstantExpr::getBitCast(DGV,TypeMap.get(SGV->getType())); 932dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 933dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Track the source global so that we don't attempt to copy it over when 934f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // processing global initializers. 935f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner DoNotLinkFromSource.insert(SGV); 936dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 9371afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 9386157e383c4a15ffb6e7f27cdb153daa9caa15ca5Chris Lattner } 9395c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner } 940dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 941cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // If the Comdat this variable was inside of wasn't selected, skip it. 942cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DC && !DGV && !LinkFromSrc) { 943cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DoNotLinkFromSource.insert(SGV); 944cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 945cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 946cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 9471afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // No linking to be performed or linking from the source: simply create an 9481afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // identical version of the symbol over in the dest module... the 9491afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // initializer will be filled in later by LinkGlobalInits. 9501afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalVariable *NewDGV = 9511afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner new GlobalVariable(*DstM, TypeMap.get(SGV->getType()->getElementType()), 952dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SGV->isConstant(), SGV->getLinkage(), /*init*/nullptr, 953dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SGV->getName(), /*insertbefore*/nullptr, 954ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg SGV->getThreadLocalMode(), 9551afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SGV->getType()->getAddressSpace()); 9561afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Propagate alignment, visibility and section info. 957cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling copyGVAttributes(NewDGV, SGV); 9583ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola if (NewVisibility) 9593ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola NewDGV->setVisibility(*NewVisibility); 9603acfb58b178d25b0671cbfb4fb20194e62b01a98Rafael Espindola NewDGV->setUnnamedAddr(HasUnnamedAddr); 9611afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 962cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DC) 963cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NewDGV->setComdat(DC); 964cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 9651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DGV) { 9661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDGV, DGV->getType())); 9671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DGV->eraseFromParent(); 96858887bc59316bcaf0c0675a45ddecd6994f3fbc6Anton Korobeynikov } 969dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 9701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Make sure to remember this mapping. 9711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueMap[SGV] = NewDGV; 97231ed0fb804dd86fb15093e114701932119914400Lauro Ramos Venancio return false; 97331ed0fb804dd86fb15093e114701932119914400Lauro Ramos Venancio} 97431ed0fb804dd86fb15093e114701932119914400Lauro Ramos Venancio 9751afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// linkFunctionProto - Link the function in the source module into the 9761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// destination module if needed, setting up mapping information. 9771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::linkFunctionProto(Function *SF) { 9781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalValue *DGV = getLinkedToGlobal(SF); 9793ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility; 9806947f10ec467eb89d606bc96450c35864e1b4f10Rafael Espindola bool HasUnnamedAddr = SF->hasUnnamedAddr(); 9815c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 982cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool LinkFromSrc = false; 983cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat *DC = nullptr; 984cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (const Comdat *SC = SF->getComdat()) { 985cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind SK; 986cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 987cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DC = DstM->getOrInsertComdat(SC->getName()); 988cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DC->setSelectionKind(SK); 989cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 990cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 9911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DGV) { 992cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!DC) { 993cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage; 994cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GlobalValue::VisibilityTypes NV; 995cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (getLinkageResult(DGV, SF, NewLinkage, NV, LinkFromSrc)) 996cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 997cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NewVisibility = NV; 998cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr(); 999cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 1000cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!LinkFromSrc) { 1001cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Set calculated linkage 1002cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setLinkage(NewLinkage); 1003cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setVisibility(*NewVisibility); 1004cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setUnnamedAddr(HasUnnamedAddr); 1005cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 1006cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 10073ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola 10081afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!LinkFromSrc) { 10091afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Make sure to remember this mapping. 10101afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueMap[SF] = ConstantExpr::getBitCast(DGV, TypeMap.get(SF->getType())); 1011dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1012dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Track the function from the source module so we don't attempt to remap 1013f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // it. 1014f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner DoNotLinkFromSource.insert(SF); 1015dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 10161afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 10178d2de8a82cce67513debee7a3fa5aca0189b4105Chris Lattner } 10188d2de8a82cce67513debee7a3fa5aca0189b4105Chris Lattner } 1019dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1020a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // If the function is to be lazily linked, don't create it just yet. 1021a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // The ValueMaterializerTy will deal with creating it if it's used. 1022a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy if (!DGV && (SF->hasLocalLinkage() || SF->hasLinkOnceLinkage() || 1023a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy SF->hasAvailableExternallyLinkage())) { 1024a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy DoNotLinkFromSource.insert(SF); 1025a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy return false; 1026a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy } 1027a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 1028cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // If the Comdat this function was inside of wasn't selected, skip it. 1029cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DC && !DGV && !LinkFromSrc) { 1030cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DoNotLinkFromSource.insert(SF); 1031cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 1032cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 1033cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 10341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If there is no linkage to be performed or we are linking from the source, 10351afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // bring SF over. 10361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Function *NewDF = Function::Create(TypeMap.get(SF->getFunctionType()), 10371afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SF->getLinkage(), SF->getName(), DstM); 1038cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling copyGVAttributes(NewDF, SF); 10393ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola if (NewVisibility) 10403ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola NewDF->setVisibility(*NewVisibility); 10416947f10ec467eb89d606bc96450c35864e1b4f10Rafael Espindola NewDF->setUnnamedAddr(HasUnnamedAddr); 10421afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1043cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DC) 1044cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NewDF->setComdat(DC); 1045cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 10461afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DGV) { 10471afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Any uses of DF need to change to NewDF, with cast. 10481afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDF, DGV->getType())); 10491afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DGV->eraseFromParent(); 10501afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 1051dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 10521afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueMap[SF] = NewDF; 10538d2de8a82cce67513debee7a3fa5aca0189b4105Chris Lattner return false; 10548d2de8a82cce67513debee7a3fa5aca0189b4105Chris Lattner} 10555c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 10561afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// LinkAliasProto - Set up prototypes for any aliases that come over from the 10571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// source module. 10581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::linkAliasProto(GlobalAlias *SGA) { 10591afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalValue *DGV = getLinkedToGlobal(SGA); 10603ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility; 1061cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool HasUnnamedAddr = SGA->hasUnnamedAddr(); 1062cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 1063cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool LinkFromSrc = false; 1064cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat *DC = nullptr; 1065cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (const Comdat *SC = SGA->getComdat()) { 1066cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind SK; 1067cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 1068cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DC = DstM->getOrInsertComdat(SC->getName()); 1069cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DC->setSelectionKind(SK); 1070cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 10713ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola 10721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DGV) { 1073cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!DC) { 1074cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage; 1075cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GlobalValue::VisibilityTypes NV; 1076cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (getLinkageResult(DGV, SGA, NewLinkage, NV, LinkFromSrc)) 1077cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 1078cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NewVisibility = NV; 1079cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr(); 1080cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 1081cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!LinkFromSrc) { 1082cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Set calculated linkage. 1083cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setLinkage(NewLinkage); 1084cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setVisibility(*NewVisibility); 1085cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->setUnnamedAddr(HasUnnamedAddr); 1086cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 1087cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 10883ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola 10891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!LinkFromSrc) { 10901afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Make sure to remember this mapping. 10911afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueMap[SGA] = ConstantExpr::getBitCast(DGV,TypeMap.get(SGA->getType())); 1092dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1093f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // Track the alias from the source module so we don't attempt to remap it. 1094f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner DoNotLinkFromSource.insert(SGA); 1095dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 10961afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 1097822143e6f7271c6546434d2d0b3da7a29711020dChris Lattner } 10981afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 1099dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // If the Comdat this alias was inside of wasn't selected, skip it. 1101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DC && !DGV && !LinkFromSrc) { 1102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DoNotLinkFromSource.insert(SGA); 1103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 1104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 1105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 11061afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If there is no linkage to be performed or we're linking from the source, 11071afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // bring over SGA. 1108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto *PTy = cast<PointerType>(TypeMap.get(SGA->getType())); 1109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto *NewDA = 1110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines GlobalAlias::create(PTy->getElementType(), PTy->getAddressSpace(), 1111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SGA->getLinkage(), SGA->getName(), DstM); 1112cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling copyGVAttributes(NewDA, SGA); 11133ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola if (NewVisibility) 11143ed8815541d2118728a91bbd5bee054fbcfba71fRafael Espindola NewDA->setVisibility(*NewVisibility); 1115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NewDA->setUnnamedAddr(HasUnnamedAddr); 11161afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (DGV) { 1118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Any uses of DGV need to change to NewDA, with cast. 1119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDA, DGV->getType())); 1120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DGV->eraseFromParent(); 1121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 1122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 11231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ValueMap[SGA] = NewDA; 11241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return false; 11251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 1126eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov 11271ee0ecf84a07693c3a517ba030fac8ac1f9f3fbcChris Lattnerstatic void getArrayElements(Constant *C, SmallVectorImpl<Constant*> &Dest) { 1128a1f00f4d488eb5daff52faaf99c62ee652fd3b85Chris Lattner unsigned NumElements = cast<ArrayType>(C->getType())->getNumElements(); 1129a1f00f4d488eb5daff52faaf99c62ee652fd3b85Chris Lattner 1130a1f00f4d488eb5daff52faaf99c62ee652fd3b85Chris Lattner for (unsigned i = 0; i != NumElements; ++i) 1131a1f00f4d488eb5daff52faaf99c62ee652fd3b85Chris Lattner Dest.push_back(C->getAggregateElement(i)); 11321ee0ecf84a07693c3a517ba030fac8ac1f9f3fbcChris Lattner} 1133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 11341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid ModuleLinker::linkAppendingVarInit(const AppendingVarInfo &AVI) { 11351afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Merge the initializer. 11361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SmallVector<Constant*, 16> Elements; 11371ee0ecf84a07693c3a517ba030fac8ac1f9f3fbcChris Lattner getArrayElements(AVI.DstInit, Elements); 1138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1139a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy Constant *SrcInit = MapValue(AVI.SrcInit, ValueMap, RF_None, &TypeMap, &ValMaterializer); 11401ee0ecf84a07693c3a517ba030fac8ac1f9f3fbcChris Lattner getArrayElements(SrcInit, Elements); 1141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 11421afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner ArrayType *NewType = cast<ArrayType>(AVI.NewGV->getType()->getElementType()); 11431afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner AVI.NewGV->setInitializer(ConstantArray::get(NewType, Elements)); 11441afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 11456157e383c4a15ffb6e7f27cdb153daa9caa15ca5Chris Lattner 1146cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// linkGlobalInits - Update the initializers in the Dest module now that all 1147cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// globals that may be referenced are in Dest. 11481afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid ModuleLinker::linkGlobalInits() { 11491afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Loop over all of the globals in the src module, mapping them over as we go 11501afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::const_global_iterator I = SrcM->global_begin(), 11511afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner E = SrcM->global_end(); I != E; ++I) { 1152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1153f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // Only process initialized GV's or ones not already in dest. 1154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!I->hasInitializer() || DoNotLinkFromSource.count(I)) continue; 1155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 11561afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Grab destination global variable. 11571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalVariable *DGV = cast<GlobalVariable>(ValueMap[I]); 11581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Figure out what the initializer looks like in the dest module. 11591afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DGV->setInitializer(MapValue(I->getInitializer(), ValueMap, 1160a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy RF_None, &TypeMap, &ValMaterializer)); 11615c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner } 11625c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner} 11635c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 1164cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// linkFunctionBody - Copy the source function over into the dest function and 1165cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// fix up references to values. At this point we know that Dest is an external 1166cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// function, and that Src is not. 11671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid ModuleLinker::linkFunctionBody(Function *Dst, Function *Src) { 11681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner assert(Src && Dst && Dst->isDeclaration() && !Src->isDeclaration()); 11695c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 11700033baf94e049e075f3ba4700c109779e2d7c131Chris Lattner // Go through and convert function arguments over, remembering the mapping. 11711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Function::arg_iterator DI = Dst->arg_begin(); 1172e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end(); 117369da5cf26143e4542d4bf8c78ffac6d079efe5c9Chris Lattner I != E; ++I, ++DI) { 11741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DI->setName(I->getName()); // Copy the name over. 11755c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 11761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Add a mapping to our mapping. 1177817bf2aeb22db13d03beb15e9bf17c425d0c694dAnton Korobeynikov ValueMap[I] = DI; 11785c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner } 11795c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 1180f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner if (Mode == Linker::DestroySource) { 1181f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // Splice the body of the source function into the dest function. 1182f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner Dst->getBasicBlockList().splice(Dst->end(), Src->getBasicBlockList()); 1183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1184f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // At this point, all of the instructions and values of the function are now 1185f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // copied over. The only problem is that they are still referencing values in 1186f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // the Source function as operands. Loop through all of the operands of the 1187f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // functions and patch them up to point to the local versions. 1188f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner for (Function::iterator BB = Dst->begin(), BE = Dst->end(); BB != BE; ++BB) 1189f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) 1190a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy RemapInstruction(I, ValueMap, RF_IgnoreMissingEntries, 1191a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy &TypeMap, &ValMaterializer); 1192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1193f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner } else { 1194f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner // Clone the body of the function into the dest function. 1195f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner SmallVector<ReturnInst*, 8> Returns; // Ignore returns. 1196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CloneFunctionInto(Dst, Src, ValueMap, false, Returns, "", nullptr, 1197a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy &TypeMap, &ValMaterializer); 1198f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner } 1199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 12000033baf94e049e075f3ba4700c109779e2d7c131Chris Lattner // There is no need to map the arguments anymore. 12011127315562b221010040925980040fd4f65bdb1cChris Lattner for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end(); 12021127315562b221010040925980040fd4f65bdb1cChris Lattner I != E; ++I) 1203ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer ValueMap.erase(I); 1204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 1206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1207cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// linkAliasBodies - Insert all of the aliases in Src into the Dest module. 12081afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid ModuleLinker::linkAliasBodies() { 12091afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::alias_iterator I = SrcM->alias_begin(), E = SrcM->alias_end(); 1210f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner I != E; ++I) { 1211f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner if (DoNotLinkFromSource.count(I)) 1212f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner continue; 12131afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (Constant *Aliasee = I->getAliasee()) { 12141afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner GlobalAlias *DA = cast<GlobalAlias>(ValueMap[I]); 1215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Constant *Val = 1216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MapValue(Aliasee, ValueMap, RF_None, &TypeMap, &ValMaterializer); 1217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DA->setAliasee(Val); 1218c2d774b6c1d38421c435b6d3cfaa10402c900aebChris Lattner } 1219f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner } 12205c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner} 12215c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 1222cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// linkNamedMDNodes - Insert all of the named MDNodes in Src into the Dest 12231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner/// module. 12241afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnervoid ModuleLinker::linkNamedMDNodes() { 1225d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata(); 12261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::const_named_metadata_iterator I = SrcM->named_metadata_begin(), 12271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner E = SrcM->named_metadata_end(); I != E; ++I) { 1228d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling // Don't link module flags here. Do them separately. 1229d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling if (&*I == SrcModFlags) continue; 12301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner NamedMDNode *DestNMD = DstM->getOrInsertNamedMetadata(I->getName()); 12311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Add Src elements into Dest node. 12321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) 12331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DestNMD->addOperand(MapValue(I->getOperand(i), ValueMap, 1234a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy RF_None, &TypeMap, &ValMaterializer)); 12358166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner } 12368166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner} 1237d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 1238d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// linkModuleFlagsMetadata - Merge the linker flags in Src into the Dest 1239d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// module. 1240d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendlingbool ModuleLinker::linkModuleFlagsMetadata() { 12411e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // If the source module has no module flags, we are done. 1242d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata(); 1243d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling if (!SrcModFlags) return false; 1244d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 1245d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling // If the destination module doesn't have module flags yet, then just copy 1246d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling // over the source module's flags. 12471e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar NamedMDNode *DstModFlags = DstM->getOrInsertModuleFlagsMetadata(); 1248d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling if (DstModFlags->getNumOperands() == 0) { 1249d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling for (unsigned I = 0, E = SrcModFlags->getNumOperands(); I != E; ++I) 1250d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling DstModFlags->addOperand(SrcModFlags->getOperand(I)); 1251d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 1252d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling return false; 1253d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling } 1254d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 12551e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // First build a map of the existing module flags and requirements. 12561e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar DenseMap<MDString*, MDNode*> Flags; 12571e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar SmallSetVector<MDNode*, 16> Requirements; 12581e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar for (unsigned I = 0, E = DstModFlags->getNumOperands(); I != E; ++I) { 12591e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDNode *Op = DstModFlags->getOperand(I); 12601e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar ConstantInt *Behavior = cast<ConstantInt>(Op->getOperand(0)); 12611e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDString *ID = cast<MDString>(Op->getOperand(1)); 1262d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 12631e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (Behavior->getZExtValue() == Module::Require) { 12641e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar Requirements.insert(cast<MDNode>(Op->getOperand(2))); 12651e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } else { 12661e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar Flags[ID] = Op; 12671e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 1268d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling } 1269d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 12701e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Merge in the flags from the source module, and also collect its set of 12711e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // requirements. 12721e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar bool HasErr = false; 12731e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar for (unsigned I = 0, E = SrcModFlags->getNumOperands(); I != E; ++I) { 12741e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDNode *SrcOp = SrcModFlags->getOperand(I); 12751e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar ConstantInt *SrcBehavior = cast<ConstantInt>(SrcOp->getOperand(0)); 12761e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDString *ID = cast<MDString>(SrcOp->getOperand(1)); 12771e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDNode *DstOp = Flags.lookup(ID); 12781e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar unsigned SrcBehaviorValue = SrcBehavior->getZExtValue(); 12791e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar 12801e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // If this is a requirement, add it and continue. 12811e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (SrcBehaviorValue == Module::Require) { 12821e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // If the destination module does not already have this requirement, add 12831e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // it. 12841e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (Requirements.insert(cast<MDNode>(SrcOp->getOperand(2)))) { 12851e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar DstModFlags->addOperand(SrcOp); 12861e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 12871e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 12881e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 12891e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar 12901e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // If there is no existing flag with this ID, just add it. 12911e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (!DstOp) { 12921e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar Flags[ID] = SrcOp; 12931e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar DstModFlags->addOperand(SrcOp); 12941e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 1295d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling } 1296d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 12971e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Otherwise, perform a merge. 12981e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar ConstantInt *DstBehavior = cast<ConstantInt>(DstOp->getOperand(0)); 12991e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar unsigned DstBehaviorValue = DstBehavior->getZExtValue(); 13001e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar 13011e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // If either flag has override behavior, handle it first. 13021e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (DstBehaviorValue == Module::Override) { 13031e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Diagnose inconsistent flags which both have override behavior. 13041e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (SrcBehaviorValue == Module::Override && 13051e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar SrcOp->getOperand(2) != DstOp->getOperand(2)) { 13061e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar HasErr |= emitError("linking module flags '" + ID->getString() + 13071e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar "': IDs have conflicting override values"); 13081e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 13091e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 13101e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } else if (SrcBehaviorValue == Module::Override) { 13111e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Update the destination flag to that of the source. 13121e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar DstOp->replaceOperandWith(0, SrcBehavior); 13131e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar DstOp->replaceOperandWith(2, SrcOp->getOperand(2)); 13141e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 13151e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 13161e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar 13171e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Diagnose inconsistent merge behavior types. 13181e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (SrcBehaviorValue != DstBehaviorValue) { 13191e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar HasErr |= emitError("linking module flags '" + ID->getString() + 13201e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar "': IDs have conflicting behaviors"); 13211e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 13221e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 1323d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 13241e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Perform the merge for standard behavior types. 13251e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar switch (SrcBehaviorValue) { 13261e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar case Module::Require: 1327cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Module::Override: llvm_unreachable("not possible"); 13281e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar case Module::Error: { 13291e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Emit an error if the values differ. 13301e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (SrcOp->getOperand(2) != DstOp->getOperand(2)) { 13311e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar HasErr |= emitError("linking module flags '" + ID->getString() + 13321e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar "': IDs have conflicting values"); 13331e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 13341e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 13351e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 13361e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar case Module::Warning: { 13371e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Emit a warning if the values differ. 13381e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (SrcOp->getOperand(2) != DstOp->getOperand(2)) { 133936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!SuppressWarnings) { 134036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines errs() << "WARNING: linking module flags '" << ID->getString() 134136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << "': IDs have conflicting values"; 134236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 1343d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling } 13441e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 13451e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 13465db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar case Module::Append: { 13475db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar MDNode *DstValue = cast<MDNode>(DstOp->getOperand(2)); 13485db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar MDNode *SrcValue = cast<MDNode>(SrcOp->getOperand(2)); 13495db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar unsigned NumOps = DstValue->getNumOperands() + SrcValue->getNumOperands(); 13505db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar Value **VP, **Values = VP = new Value*[NumOps]; 13515db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar for (unsigned i = 0, e = DstValue->getNumOperands(); i != e; ++i, ++VP) 13525db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar *VP = DstValue->getOperand(i); 13535db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar for (unsigned i = 0, e = SrcValue->getNumOperands(); i != e; ++i, ++VP) 13545db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar *VP = SrcValue->getOperand(i); 13555db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar DstOp->replaceOperandWith(2, MDNode::get(DstM->getContext(), 13565db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar ArrayRef<Value*>(Values, 13575db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar NumOps))); 13585db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar delete[] Values; 13595db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar break; 13605db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar } 13615db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar case Module::AppendUnique: { 13625db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar SmallSetVector<Value*, 16> Elts; 13635db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar MDNode *DstValue = cast<MDNode>(DstOp->getOperand(2)); 13645db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar MDNode *SrcValue = cast<MDNode>(SrcOp->getOperand(2)); 13655db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar for (unsigned i = 0, e = DstValue->getNumOperands(); i != e; ++i) 13665db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar Elts.insert(DstValue->getOperand(i)); 13675db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar for (unsigned i = 0, e = SrcValue->getNumOperands(); i != e; ++i) 13685db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar Elts.insert(SrcValue->getOperand(i)); 13695db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar DstOp->replaceOperandWith(2, MDNode::get(DstM->getContext(), 13705db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar ArrayRef<Value*>(Elts.begin(), 13715db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar Elts.end()))); 13725db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar break; 13735db391c67d0922f4ab2ba57c07def19759c801a4Daniel Dunbar } 13741e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 13751e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar } 13761e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar 13771e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar // Check all of the requirements. 13781e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar for (unsigned I = 0, E = Requirements.size(); I != E; ++I) { 13791e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDNode *Requirement = Requirements[I]; 13801e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDString *Flag = cast<MDString>(Requirement->getOperand(0)); 13811e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar Value *ReqValue = Requirement->getOperand(1); 1382d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 13831e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar MDNode *Op = Flags[Flag]; 13841e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar if (!Op || Op->getOperand(2) != ReqValue) { 13851e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar HasErr |= emitError("linking module flags '" + Flag->getString() + 13861e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar "': does not have the required value"); 13871e08165ae9ee3a7b654d9030bc5c86333fe6673fDaniel Dunbar continue; 1388d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling } 1389d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling } 1390d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 1391d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling return HasErr; 1392d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling} 1393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 13941afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerbool ModuleLinker::run() { 1395d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling assert(DstM && "Null destination module"); 1396d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling assert(SrcM && "Null source module"); 139752f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner 13981afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Inherit the target data from the source module if the destination module 13991afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // doesn't have one already. 140036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!DstM->getDataLayout() && SrcM->getDataLayout()) 14011afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstM->setDataLayout(SrcM->getDataLayout()); 1402873c5e7859c1534bf92c9e2747f2b70685059598Chris Lattner 1403f27dfcb210fec571d79bc881f5463e0b405707c0Chris Lattner // Copy the target triple from the source to dest if the dest's is empty. 14041afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstM->getTargetTriple().empty() && !SrcM->getTargetTriple().empty()) 14051afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstM->setTargetTriple(SrcM->getTargetTriple()); 1406eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov 140736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (SrcM->getDataLayout() && DstM->getDataLayout() && 140836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *SrcM->getDataLayout() != *DstM->getDataLayout()) { 140936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!SuppressWarnings) { 141036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines errs() << "WARNING: Linking two modules of different data layouts: '" 141136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << SrcM->getModuleIdentifier() << "' is '" 141236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << SrcM->getDataLayoutStr() << "' whereas '" 141336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << DstM->getModuleIdentifier() << "' is '" 141436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << DstM->getDataLayoutStr() << "'\n"; 141536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 141636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 14171afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!SrcM->getTargetTriple().empty() && 14181afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstM->getTargetTriple() != SrcM->getTargetTriple()) { 141936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!SuppressWarnings) { 142036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines errs() << "WARNING: Linking two modules of different target triples: " 142136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << SrcM->getModuleIdentifier() << "' is '" 142236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << SrcM->getTargetTriple() << "' whereas '" 142336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << DstM->getModuleIdentifier() << "' is '" 142436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << DstM->getTargetTriple() << "'\n"; 142536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 1426a797ee0210902669833720f9df7c3be5e58c1401Chris Lattner } 1427f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman 1428f27dfcb210fec571d79bc881f5463e0b405707c0Chris Lattner // Append the module inline asm string. 14291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (!SrcM->getModuleInlineAsm().empty()) { 14301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (DstM->getModuleInlineAsm().empty()) 14311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstM->setModuleInlineAsm(SrcM->getModuleInlineAsm()); 1432e1b2e14f92e8e9da1eb4854511a881cf9c22af3cChris Lattner else 14331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner DstM->setModuleInlineAsm(DstM->getModuleInlineAsm()+"\n"+ 14341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner SrcM->getModuleInlineAsm()); 1435e1b2e14f92e8e9da1eb4854511a881cf9c22af3cChris Lattner } 1436eba2cb0d5aef5a8229facae5624c65d9fd65e9d1Mikhail Glushenkov 14371afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Loop over all of the linked values to compute type mappings. 14381afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner computeTypeMapping(); 14392c236f3e20a0fb84b5948efa6bb7bb60d759cb32Chris Lattner 1440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ComdatsChosen.clear(); 1441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (const StringMapEntry<llvm::Comdat> &SMEC : SrcM->getComdatSymbolTable()) { 1442cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const Comdat &C = SMEC.getValue(); 1443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ComdatsChosen.count(&C)) 1444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines continue; 1445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat::SelectionKind SK; 1446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool LinkFromSrc; 1447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (getComdatResult(&C, SK, LinkFromSrc)) 1448cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 1449cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 1450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 1451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 14521afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Insert all of the globals in src into the DstM module... without linking 14538166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner // initializers (which could refer to functions not yet mapped over). 14541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::global_iterator I = SrcM->global_begin(), 14551afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner E = SrcM->global_end(); I != E; ++I) 14561afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (linkGlobalProto(I)) 14571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 14585c377c524a6929cdaa683f3f034b3fc01526b264Chris Lattner 1459c8cc4cb03bd90f89be7fe1649542a2d5ae689632Chris Lattner // Link the functions together between the two modules, without doing function 14601afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // bodies... this just adds external function prototypes to the DstM 1461c8cc4cb03bd90f89be7fe1649542a2d5ae689632Chris Lattner // function... We do this so that when we begin processing function bodies, 1462c8cc4cb03bd90f89be7fe1649542a2d5ae689632Chris Lattner // all of the global values that may be referenced are available in our 1463c8cc4cb03bd90f89be7fe1649542a2d5ae689632Chris Lattner // ValueMap. 14641afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::iterator I = SrcM->begin(), E = SrcM->end(); I != E; ++I) 14651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (linkFunctionProto(I)) 14661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 14676cdf1971bdf88ddd9a7d46b5f5f975497d68c38eChris Lattner 14681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // If there were any aliases, link them now. 14691afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::alias_iterator I = SrcM->alias_begin(), 14701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner E = SrcM->alias_end(); I != E; ++I) 14711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (linkAliasProto(I)) 14721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return true; 147352f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner 14741afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (unsigned i = 0, e = AppendingVars.size(); i != e; ++i) 14751afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner linkAppendingVarInit(AppendingVars[i]); 1476dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 14771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Link in the function bodies that are defined in the source module into 14781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // DstM. 14791afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (Module::iterator SF = SrcM->begin(), E = SrcM->end(); SF != E; ++SF) { 14802b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner // Skip if not linking from source. 14812b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner if (DoNotLinkFromSource.count(SF)) continue; 1482dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 14831e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne Function *DF = cast<Function>(ValueMap[SF]); 14841e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne if (SF->hasPrefixData()) { 14851e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne // Link in the prefix data. 14861e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne DF->setPrefixData(MapValue( 14871e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne SF->getPrefixData(), ValueMap, RF_None, &TypeMap, &ValMaterializer)); 14881e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne } 14891e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne 14902b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner // Skip if no body (function is external) or materialize. 14912b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner if (SF->isDeclaration()) { 14922b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner if (!SF->isMaterializable()) 14932b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner continue; 14942b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner if (SF->Materialize(&ErrorMsg)) 14952b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner return true; 14962b28a74bc69e33eedc60f438e4fe9ef9ae606f3cTanya Lattner } 1497dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 14981e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne linkFunctionBody(DF, SF); 1499208b6f69441293d27b61b9d16a69c9bba4d097cbBill Wendling SF->Dematerialize(); 15001afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner } 15018166e6eef6518da6f1f805e0d5e2bb22c15dd49cChris Lattner 15021afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Resolve all uses of aliases with aliasees. 15031afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner linkAliasBodies(); 15043db9191baf5f5229a2f4d204c6332ba27fff81d0Anton Korobeynikov 1505d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling // Remap all of the named MDNodes in Src into the DstM module. We do this 1506211da8f7a96e26cc8d53a0c2ea34f6b791513021Devang Patel // after linking GlobalValues so that MDNodes that reference GlobalValues 1507211da8f7a96e26cc8d53a0c2ea34f6b791513021Devang Patel // are properly remapped. 1508211da8f7a96e26cc8d53a0c2ea34f6b791513021Devang Patel linkNamedMDNodes(); 1509211da8f7a96e26cc8d53a0c2ea34f6b791513021Devang Patel 1510d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling // Merge the module flags into the DstM module. 1511d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling if (linkModuleFlagsMetadata()) 1512d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling return true; 1513d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 151436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Update the initializers in the DstM module now that all globals that may 151536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // be referenced are in DstM. 151636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines linkGlobalInits(); 151736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15189af37a3de8c8688adae383471379f0216287ce28Tanya Lattner // Process vector of lazily linked in functions. 15199af37a3de8c8688adae383471379f0216287ce28Tanya Lattner bool LinkedInAnyFunctions; 15209af37a3de8c8688adae383471379f0216287ce28Tanya Lattner do { 15219af37a3de8c8688adae383471379f0216287ce28Tanya Lattner LinkedInAnyFunctions = false; 1522dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1523d99a29e9847815d628791e246dbdd50c6371c43dBill Wendling for(std::vector<Function*>::iterator I = LazilyLinkFunctions.begin(), 1524dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines E = LazilyLinkFunctions.end(); I != E; ++I) { 1525d99a29e9847815d628791e246dbdd50c6371c43dBill Wendling Function *SF = *I; 1526a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy if (!SF) 1527a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy continue; 1528a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 1529d99a29e9847815d628791e246dbdd50c6371c43dBill Wendling Function *DF = cast<Function>(ValueMap[SF]); 15301e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne if (SF->hasPrefixData()) { 15311e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne // Link in the prefix data. 15321e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne DF->setPrefixData(MapValue(SF->getPrefixData(), 15331e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne ValueMap, 15341e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne RF_None, 15351e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne &TypeMap, 15361e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne &ValMaterializer)); 15371e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne } 1538208b6f69441293d27b61b9d16a69c9bba4d097cbBill Wendling 1539a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // Materialize if necessary. 1540a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy if (SF->isDeclaration()) { 1541a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy if (!SF->isMaterializable()) 1542a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy continue; 1543a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy if (SF->Materialize(&ErrorMsg)) 1544a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy return true; 15459af37a3de8c8688adae383471379f0216287ce28Tanya Lattner } 1546dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1547a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // Erase from vector *before* the function body is linked - linkFunctionBody could 1548a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // invalidate I. 1549a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy LazilyLinkFunctions.erase(I); 1550a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 1551a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // Link in function body. 1552a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy linkFunctionBody(DF, SF); 1553a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy SF->Dematerialize(); 1554a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy 1555a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // Set flag to indicate we may have more functions to lazily link in 1556a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy // since we linked in a function. 1557a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy LinkedInAnyFunctions = true; 1558a84a83bbcdfaecadfc6574094272fd3edc429a23James Molloy break; 15599af37a3de8c8688adae383471379f0216287ce28Tanya Lattner } 15609af37a3de8c8688adae383471379f0216287ce28Tanya Lattner } while (LinkedInAnyFunctions); 1561dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 15621afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // Now that all of the types from the source are used, resolve any structs 15631afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner // copied over to the dest that didn't exist there. 15641afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner TypeMap.linkDefinedTypeBodies(); 1565dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 156652f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner return false; 156752f7e908cb634f9b9b539d5c6670b8a065478915Chris Lattner} 15689466f5113ba859677a28887c3c7143065e702019Vikram S. Adve 156936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLinker::Linker(Module *M, bool SuppressWarnings) 157036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : Composite(M), SuppressWarnings(SuppressWarnings) { 1571cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola TypeFinder StructTypes; 1572cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola StructTypes.run(*M, true); 1573cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola IdentifiedStructTypes.insert(StructTypes.begin(), StructTypes.end()); 1574cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola} 1575c7c35a9b8692ca7ac7a6b4b3f46ddb234ae159c7Rafael Espindola 1576c7c35a9b8692ca7ac7a6b4b3f46ddb234ae159c7Rafael EspindolaLinker::~Linker() { 1577c7c35a9b8692ca7ac7a6b4b3f46ddb234ae159c7Rafael Espindola} 1578c7c35a9b8692ca7ac7a6b4b3f46ddb234ae159c7Rafael Espindola 1579b4a0ba17183e1b4aa385e81e896c2a95671a40b2Bill Wendlingvoid Linker::deleteModule() { 1580b4a0ba17183e1b4aa385e81e896c2a95671a40b2Bill Wendling delete Composite; 1581dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Composite = nullptr; 1582b4a0ba17183e1b4aa385e81e896c2a95671a40b2Bill Wendling} 1583b4a0ba17183e1b4aa385e81e896c2a95671a40b2Bill Wendling 1584c7c35a9b8692ca7ac7a6b4b3f46ddb234ae159c7Rafael Espindolabool Linker::linkInModule(Module *Src, unsigned Mode, std::string *ErrorMsg) { 158536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ModuleLinker TheLinker(Composite, IdentifiedStructTypes, Src, Mode, 158636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SuppressWarnings); 15872e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola if (TheLinker.run()) { 15882e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola if (ErrorMsg) 15892e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola *ErrorMsg = TheLinker.ErrorMsg; 15902e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola return true; 15912e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola } 15922e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola return false; 1593c7c35a9b8692ca7ac7a6b4b3f46ddb234ae159c7Rafael Espindola} 1594c7c35a9b8692ca7ac7a6b4b3f46ddb234ae159c7Rafael Espindola 15951afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 15961afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner// LinkModules entrypoint. 15971afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner//===----------------------------------------------------------------------===// 15981afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1599cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// LinkModules - This function links two modules together, with the resulting 1600d25c05efd55fe190a50965b31e04db69bd8e19deEli Bendersky/// Dest module modified to be the composite of the two input modules. If an 1601cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// error occurs, true is returned and ErrorMsg (if not null) is set to indicate 1602cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// the problem. Upon failure, the Dest module could be in a modified state, 1603cd7193fbce32e8ed3a63e8b76672cdf9956891caBill Wendling/// and shouldn't be relied on to be consistent. 1604dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool Linker::LinkModules(Module *Dest, Module *Src, unsigned Mode, 1605f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner std::string *ErrorMsg) { 16062e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola Linker L(Dest); 16072e013028f2dd99527044d50808a44ae89d6ba537Rafael Espindola return L.linkInModule(Src, Mode, ErrorMsg); 16081afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner} 1609f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling 1610f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling//===----------------------------------------------------------------------===// 1611f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling// C API. 1612f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling//===----------------------------------------------------------------------===// 1613f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling 1614f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill WendlingLLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src, 1615f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling LLVMLinkerMode Mode, char **OutMessages) { 1616f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling std::string Messages; 1617f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling LLVMBool Result = Linker::LinkModules(unwrap(Dest), unwrap(Src), 1618dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Mode, OutMessages? &Messages : nullptr); 1619f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling if (OutMessages) 1620f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling *OutMessages = strdup(Messages.c_str()); 1621f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling return Result; 1622f24fde20c8d6db5a52b50a010e831c9159d3fec7Bill Wendling} 1623