10b57cec5SDimitry Andric //===- lib/Linker/IRMover.cpp ---------------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "llvm/Linker/IRMover.h" 100b57cec5SDimitry Andric #include "LinkDiagnosticInfo.h" 11*0fca6ea1SDimitry Andric #include "llvm/ADT/ScopeExit.h" 120b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h" 1381ad6265SDimitry Andric #include "llvm/ADT/SmallPtrSet.h" 140b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h" 1581ad6265SDimitry Andric #include "llvm/IR/AutoUpgrade.h" 160b57cec5SDimitry Andric #include "llvm/IR/Constants.h" 1781ad6265SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 180b57cec5SDimitry Andric #include "llvm/IR/DiagnosticPrinter.h" 1981ad6265SDimitry Andric #include "llvm/IR/Function.h" 200b57cec5SDimitry Andric #include "llvm/IR/GVMaterializer.h" 2181ad6265SDimitry Andric #include "llvm/IR/GlobalValue.h" 22bdd1243dSDimitry Andric #include "llvm/IR/Instruction.h" 23bdd1243dSDimitry Andric #include "llvm/IR/Instructions.h" 240b57cec5SDimitry Andric #include "llvm/IR/Intrinsics.h" 2581ad6265SDimitry Andric #include "llvm/IR/Module.h" 26fe6060f1SDimitry Andric #include "llvm/IR/PseudoProbe.h" 270b57cec5SDimitry Andric #include "llvm/IR/TypeFinder.h" 28e8d8bef9SDimitry Andric #include "llvm/Object/ModuleSymbolTable.h" 290b57cec5SDimitry Andric #include "llvm/Support/Error.h" 30349cc55cSDimitry Andric #include "llvm/Support/Path.h" 3106c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h" 3281ad6265SDimitry Andric #include "llvm/Transforms/Utils/ValueMapper.h" 33bdd1243dSDimitry Andric #include <optional> 340b57cec5SDimitry Andric #include <utility> 350b57cec5SDimitry Andric using namespace llvm; 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 380b57cec5SDimitry Andric // TypeMap implementation. 390b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric namespace { 420b57cec5SDimitry Andric class TypeMapTy : public ValueMapTypeRemapper { 430b57cec5SDimitry Andric /// This is a mapping from a source type to a destination type to use. 440b57cec5SDimitry Andric DenseMap<Type *, Type *> MappedTypes; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric /// When checking to see if two subgraphs are isomorphic, we speculatively 470b57cec5SDimitry Andric /// add types to MappedTypes, but keep track of them here in case we need to 480b57cec5SDimitry Andric /// roll back. 490b57cec5SDimitry Andric SmallVector<Type *, 16> SpeculativeTypes; 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric SmallVector<StructType *, 16> SpeculativeDstOpaqueTypes; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric /// This is a list of non-opaque structs in the source module that are mapped 540b57cec5SDimitry Andric /// to an opaque struct in the destination module. 550b57cec5SDimitry Andric SmallVector<StructType *, 16> SrcDefinitionsToResolve; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric /// This is the set of opaque types in the destination modules who are 580b57cec5SDimitry Andric /// getting a body from the source module. 590b57cec5SDimitry Andric SmallPtrSet<StructType *, 16> DstResolvedOpaqueTypes; 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric public: 620b57cec5SDimitry Andric TypeMapTy(IRMover::IdentifiedStructTypeSet &DstStructTypesSet) 630b57cec5SDimitry Andric : DstStructTypesSet(DstStructTypesSet) {} 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric IRMover::IdentifiedStructTypeSet &DstStructTypesSet; 660b57cec5SDimitry Andric /// Indicate that the specified type in the destination module is conceptually 670b57cec5SDimitry Andric /// equivalent to the specified type in the source module. 680b57cec5SDimitry Andric void addTypeMapping(Type *DstTy, Type *SrcTy); 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric /// Produce a body for an opaque type in the dest module from a type 710b57cec5SDimitry Andric /// definition in the source module. 720b57cec5SDimitry Andric void linkDefinedTypeBodies(); 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric /// Return the mapped type to use for the specified input type from the 750b57cec5SDimitry Andric /// source module. 760b57cec5SDimitry Andric Type *get(Type *SrcTy); 770b57cec5SDimitry Andric Type *get(Type *SrcTy, SmallPtrSet<StructType *, 8> &Visited); 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric void finishType(StructType *DTy, StructType *STy, ArrayRef<Type *> ETypes); 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric FunctionType *get(FunctionType *T) { 820b57cec5SDimitry Andric return cast<FunctionType>(get((Type *)T)); 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric private: 860b57cec5SDimitry Andric Type *remapType(Type *SrcTy) override { return get(SrcTy); } 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric bool areTypesIsomorphic(Type *DstTy, Type *SrcTy); 890b57cec5SDimitry Andric }; 900b57cec5SDimitry Andric } 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) { 930b57cec5SDimitry Andric assert(SpeculativeTypes.empty()); 940b57cec5SDimitry Andric assert(SpeculativeDstOpaqueTypes.empty()); 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric // Check to see if these types are recursively isomorphic and establish a 970b57cec5SDimitry Andric // mapping between them if so. 980b57cec5SDimitry Andric if (!areTypesIsomorphic(DstTy, SrcTy)) { 990b57cec5SDimitry Andric // Oops, they aren't isomorphic. Just discard this request by rolling out 1000b57cec5SDimitry Andric // any speculative mappings we've established. 1010b57cec5SDimitry Andric for (Type *Ty : SpeculativeTypes) 1020b57cec5SDimitry Andric MappedTypes.erase(Ty); 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric SrcDefinitionsToResolve.resize(SrcDefinitionsToResolve.size() - 1050b57cec5SDimitry Andric SpeculativeDstOpaqueTypes.size()); 1060b57cec5SDimitry Andric for (StructType *Ty : SpeculativeDstOpaqueTypes) 1070b57cec5SDimitry Andric DstResolvedOpaqueTypes.erase(Ty); 1080b57cec5SDimitry Andric } else { 1090b57cec5SDimitry Andric // SrcTy and DstTy are recursively ismorphic. We clear names of SrcTy 1100b57cec5SDimitry Andric // and all its descendants to lower amount of renaming in LLVM context 1110b57cec5SDimitry Andric // Renaming occurs because we load all source modules to the same context 1120b57cec5SDimitry Andric // and declaration with existing name gets renamed (i.e Foo -> Foo.42). 1130b57cec5SDimitry Andric // As a result we may get several different types in the destination 1140b57cec5SDimitry Andric // module, which are in fact the same. 1150b57cec5SDimitry Andric for (Type *Ty : SpeculativeTypes) 1160b57cec5SDimitry Andric if (auto *STy = dyn_cast<StructType>(Ty)) 1170b57cec5SDimitry Andric if (STy->hasName()) 1180b57cec5SDimitry Andric STy->setName(""); 1190b57cec5SDimitry Andric } 1200b57cec5SDimitry Andric SpeculativeTypes.clear(); 1210b57cec5SDimitry Andric SpeculativeDstOpaqueTypes.clear(); 1220b57cec5SDimitry Andric } 1230b57cec5SDimitry Andric 1240b57cec5SDimitry Andric /// Recursively walk this pair of types, returning true if they are isomorphic, 1250b57cec5SDimitry Andric /// false if they are not. 1260b57cec5SDimitry Andric bool TypeMapTy::areTypesIsomorphic(Type *DstTy, Type *SrcTy) { 1270b57cec5SDimitry Andric // Two types with differing kinds are clearly not isomorphic. 1280b57cec5SDimitry Andric if (DstTy->getTypeID() != SrcTy->getTypeID()) 1290b57cec5SDimitry Andric return false; 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric // If we have an entry in the MappedTypes table, then we have our answer. 1320b57cec5SDimitry Andric Type *&Entry = MappedTypes[SrcTy]; 1330b57cec5SDimitry Andric if (Entry) 1340b57cec5SDimitry Andric return Entry == DstTy; 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric // Two identical types are clearly isomorphic. Remember this 1370b57cec5SDimitry Andric // non-speculatively. 1380b57cec5SDimitry Andric if (DstTy == SrcTy) { 1390b57cec5SDimitry Andric Entry = DstTy; 1400b57cec5SDimitry Andric return true; 1410b57cec5SDimitry Andric } 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric // Okay, we have two types with identical kinds that we haven't seen before. 1440b57cec5SDimitry Andric 1450b57cec5SDimitry Andric // If this is an opaque struct type, special case it. 1460b57cec5SDimitry Andric if (StructType *SSTy = dyn_cast<StructType>(SrcTy)) { 1470b57cec5SDimitry Andric // Mapping an opaque type to any struct, just keep the dest struct. 1480b57cec5SDimitry Andric if (SSTy->isOpaque()) { 1490b57cec5SDimitry Andric Entry = DstTy; 1500b57cec5SDimitry Andric SpeculativeTypes.push_back(SrcTy); 1510b57cec5SDimitry Andric return true; 1520b57cec5SDimitry Andric } 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric // Mapping a non-opaque source type to an opaque dest. If this is the first 1550b57cec5SDimitry Andric // type that we're mapping onto this destination type then we succeed. Keep 1560b57cec5SDimitry Andric // the dest, but fill it in later. If this is the second (different) type 1570b57cec5SDimitry Andric // that we're trying to map onto the same opaque type then we fail. 1580b57cec5SDimitry Andric if (cast<StructType>(DstTy)->isOpaque()) { 1590b57cec5SDimitry Andric // We can only map one source type onto the opaque destination type. 1600b57cec5SDimitry Andric if (!DstResolvedOpaqueTypes.insert(cast<StructType>(DstTy)).second) 1610b57cec5SDimitry Andric return false; 1620b57cec5SDimitry Andric SrcDefinitionsToResolve.push_back(SSTy); 1630b57cec5SDimitry Andric SpeculativeTypes.push_back(SrcTy); 1640b57cec5SDimitry Andric SpeculativeDstOpaqueTypes.push_back(cast<StructType>(DstTy)); 1650b57cec5SDimitry Andric Entry = DstTy; 1660b57cec5SDimitry Andric return true; 1670b57cec5SDimitry Andric } 1680b57cec5SDimitry Andric } 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric // If the number of subtypes disagree between the two types, then we fail. 1710b57cec5SDimitry Andric if (SrcTy->getNumContainedTypes() != DstTy->getNumContainedTypes()) 1720b57cec5SDimitry Andric return false; 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric // Fail if any of the extra properties (e.g. array size) of the type disagree. 1750b57cec5SDimitry Andric if (isa<IntegerType>(DstTy)) 1760b57cec5SDimitry Andric return false; // bitwidth disagrees. 1770b57cec5SDimitry Andric if (PointerType *PT = dyn_cast<PointerType>(DstTy)) { 1780b57cec5SDimitry Andric if (PT->getAddressSpace() != cast<PointerType>(SrcTy)->getAddressSpace()) 1790b57cec5SDimitry Andric return false; 1800b57cec5SDimitry Andric } else if (FunctionType *FT = dyn_cast<FunctionType>(DstTy)) { 1810b57cec5SDimitry Andric if (FT->isVarArg() != cast<FunctionType>(SrcTy)->isVarArg()) 1820b57cec5SDimitry Andric return false; 1830b57cec5SDimitry Andric } else if (StructType *DSTy = dyn_cast<StructType>(DstTy)) { 1840b57cec5SDimitry Andric StructType *SSTy = cast<StructType>(SrcTy); 1850b57cec5SDimitry Andric if (DSTy->isLiteral() != SSTy->isLiteral() || 1860b57cec5SDimitry Andric DSTy->isPacked() != SSTy->isPacked()) 1870b57cec5SDimitry Andric return false; 1885ffd83dbSDimitry Andric } else if (auto *DArrTy = dyn_cast<ArrayType>(DstTy)) { 1895ffd83dbSDimitry Andric if (DArrTy->getNumElements() != cast<ArrayType>(SrcTy)->getNumElements()) 1905ffd83dbSDimitry Andric return false; 1915ffd83dbSDimitry Andric } else if (auto *DVecTy = dyn_cast<VectorType>(DstTy)) { 1925ffd83dbSDimitry Andric if (DVecTy->getElementCount() != cast<VectorType>(SrcTy)->getElementCount()) 1930b57cec5SDimitry Andric return false; 1940b57cec5SDimitry Andric } 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric // Otherwise, we speculate that these two types will line up and recursively 1970b57cec5SDimitry Andric // check the subelements. 1980b57cec5SDimitry Andric Entry = DstTy; 1990b57cec5SDimitry Andric SpeculativeTypes.push_back(SrcTy); 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andric for (unsigned I = 0, E = SrcTy->getNumContainedTypes(); I != E; ++I) 2020b57cec5SDimitry Andric if (!areTypesIsomorphic(DstTy->getContainedType(I), 2030b57cec5SDimitry Andric SrcTy->getContainedType(I))) 2040b57cec5SDimitry Andric return false; 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andric // If everything seems to have lined up, then everything is great. 2070b57cec5SDimitry Andric return true; 2080b57cec5SDimitry Andric } 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andric void TypeMapTy::linkDefinedTypeBodies() { 2110b57cec5SDimitry Andric SmallVector<Type *, 16> Elements; 2120b57cec5SDimitry Andric for (StructType *SrcSTy : SrcDefinitionsToResolve) { 2130b57cec5SDimitry Andric StructType *DstSTy = cast<StructType>(MappedTypes[SrcSTy]); 2140b57cec5SDimitry Andric assert(DstSTy->isOpaque()); 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andric // Map the body of the source type over to a new body for the dest type. 2170b57cec5SDimitry Andric Elements.resize(SrcSTy->getNumElements()); 2180b57cec5SDimitry Andric for (unsigned I = 0, E = Elements.size(); I != E; ++I) 2190b57cec5SDimitry Andric Elements[I] = get(SrcSTy->getElementType(I)); 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andric DstSTy->setBody(Elements, SrcSTy->isPacked()); 2220b57cec5SDimitry Andric DstStructTypesSet.switchToNonOpaque(DstSTy); 2230b57cec5SDimitry Andric } 2240b57cec5SDimitry Andric SrcDefinitionsToResolve.clear(); 2250b57cec5SDimitry Andric DstResolvedOpaqueTypes.clear(); 2260b57cec5SDimitry Andric } 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric void TypeMapTy::finishType(StructType *DTy, StructType *STy, 2290b57cec5SDimitry Andric ArrayRef<Type *> ETypes) { 2300b57cec5SDimitry Andric DTy->setBody(ETypes, STy->isPacked()); 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric // Steal STy's name. 2330b57cec5SDimitry Andric if (STy->hasName()) { 2340b57cec5SDimitry Andric SmallString<16> TmpName = STy->getName(); 2350b57cec5SDimitry Andric STy->setName(""); 2360b57cec5SDimitry Andric DTy->setName(TmpName); 2370b57cec5SDimitry Andric } 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andric DstStructTypesSet.addNonOpaque(DTy); 2400b57cec5SDimitry Andric } 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric Type *TypeMapTy::get(Type *Ty) { 2430b57cec5SDimitry Andric SmallPtrSet<StructType *, 8> Visited; 2440b57cec5SDimitry Andric return get(Ty, Visited); 2450b57cec5SDimitry Andric } 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andric Type *TypeMapTy::get(Type *Ty, SmallPtrSet<StructType *, 8> &Visited) { 2480b57cec5SDimitry Andric // If we already have an entry for this type, return it. 2490b57cec5SDimitry Andric Type **Entry = &MappedTypes[Ty]; 2500b57cec5SDimitry Andric if (*Entry) 2510b57cec5SDimitry Andric return *Entry; 2520b57cec5SDimitry Andric 2530b57cec5SDimitry Andric // These are types that LLVM itself will unique. 2540b57cec5SDimitry Andric bool IsUniqued = !isa<StructType>(Ty) || cast<StructType>(Ty)->isLiteral(); 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric if (!IsUniqued) { 2570b57cec5SDimitry Andric #ifndef NDEBUG 2580b57cec5SDimitry Andric for (auto &Pair : MappedTypes) { 2590b57cec5SDimitry Andric assert(!(Pair.first != Ty && Pair.second == Ty) && 2600b57cec5SDimitry Andric "mapping to a source type"); 2610b57cec5SDimitry Andric } 2620b57cec5SDimitry Andric #endif 2630b57cec5SDimitry Andric 264e8d8bef9SDimitry Andric if (!Visited.insert(cast<StructType>(Ty)).second) { 2650b57cec5SDimitry Andric StructType *DTy = StructType::create(Ty->getContext()); 2660b57cec5SDimitry Andric return *Entry = DTy; 2670b57cec5SDimitry Andric } 2680b57cec5SDimitry Andric } 2690b57cec5SDimitry Andric 2700b57cec5SDimitry Andric // If this is not a recursive type, then just map all of the elements and 2710b57cec5SDimitry Andric // then rebuild the type from inside out. 2720b57cec5SDimitry Andric SmallVector<Type *, 4> ElementTypes; 2730b57cec5SDimitry Andric 2740b57cec5SDimitry Andric // If there are no element types to map, then the type is itself. This is 2750b57cec5SDimitry Andric // true for the anonymous {} struct, things like 'float', integers, etc. 2760b57cec5SDimitry Andric if (Ty->getNumContainedTypes() == 0 && IsUniqued) 2770b57cec5SDimitry Andric return *Entry = Ty; 2780b57cec5SDimitry Andric 2790b57cec5SDimitry Andric // Remap all of the elements, keeping track of whether any of them change. 2800b57cec5SDimitry Andric bool AnyChange = false; 2810b57cec5SDimitry Andric ElementTypes.resize(Ty->getNumContainedTypes()); 2820b57cec5SDimitry Andric for (unsigned I = 0, E = Ty->getNumContainedTypes(); I != E; ++I) { 2830b57cec5SDimitry Andric ElementTypes[I] = get(Ty->getContainedType(I), Visited); 2840b57cec5SDimitry Andric AnyChange |= ElementTypes[I] != Ty->getContainedType(I); 2850b57cec5SDimitry Andric } 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andric // If we found our type while recursively processing stuff, just use it. 2880b57cec5SDimitry Andric Entry = &MappedTypes[Ty]; 2890b57cec5SDimitry Andric if (*Entry) { 2900b57cec5SDimitry Andric if (auto *DTy = dyn_cast<StructType>(*Entry)) { 2910b57cec5SDimitry Andric if (DTy->isOpaque()) { 2920b57cec5SDimitry Andric auto *STy = cast<StructType>(Ty); 2930b57cec5SDimitry Andric finishType(DTy, STy, ElementTypes); 2940b57cec5SDimitry Andric } 2950b57cec5SDimitry Andric } 2960b57cec5SDimitry Andric return *Entry; 2970b57cec5SDimitry Andric } 2980b57cec5SDimitry Andric 2990b57cec5SDimitry Andric // If all of the element types mapped directly over and the type is not 3000b57cec5SDimitry Andric // a named struct, then the type is usable as-is. 3010b57cec5SDimitry Andric if (!AnyChange && IsUniqued) 3020b57cec5SDimitry Andric return *Entry = Ty; 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric // Otherwise, rebuild a modified type. 3050b57cec5SDimitry Andric switch (Ty->getTypeID()) { 3060b57cec5SDimitry Andric default: 3070b57cec5SDimitry Andric llvm_unreachable("unknown derived type to remap"); 3080b57cec5SDimitry Andric case Type::ArrayTyID: 3090b57cec5SDimitry Andric return *Entry = ArrayType::get(ElementTypes[0], 3100b57cec5SDimitry Andric cast<ArrayType>(Ty)->getNumElements()); 3115ffd83dbSDimitry Andric case Type::ScalableVectorTyID: 3125ffd83dbSDimitry Andric case Type::FixedVectorTyID: 313fe6060f1SDimitry Andric return *Entry = VectorType::get(ElementTypes[0], 314fe6060f1SDimitry Andric cast<VectorType>(Ty)->getElementCount()); 3150b57cec5SDimitry Andric case Type::PointerTyID: 3160b57cec5SDimitry Andric return *Entry = PointerType::get(ElementTypes[0], 3170b57cec5SDimitry Andric cast<PointerType>(Ty)->getAddressSpace()); 3180b57cec5SDimitry Andric case Type::FunctionTyID: 3190b57cec5SDimitry Andric return *Entry = FunctionType::get(ElementTypes[0], 320bdd1243dSDimitry Andric ArrayRef(ElementTypes).slice(1), 3210b57cec5SDimitry Andric cast<FunctionType>(Ty)->isVarArg()); 3220b57cec5SDimitry Andric case Type::StructTyID: { 3230b57cec5SDimitry Andric auto *STy = cast<StructType>(Ty); 3240b57cec5SDimitry Andric bool IsPacked = STy->isPacked(); 3250b57cec5SDimitry Andric if (IsUniqued) 3260b57cec5SDimitry Andric return *Entry = StructType::get(Ty->getContext(), ElementTypes, IsPacked); 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andric // If the type is opaque, we can just use it directly. 3290b57cec5SDimitry Andric if (STy->isOpaque()) { 3300b57cec5SDimitry Andric DstStructTypesSet.addOpaque(STy); 3310b57cec5SDimitry Andric return *Entry = Ty; 3320b57cec5SDimitry Andric } 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric if (StructType *OldT = 3350b57cec5SDimitry Andric DstStructTypesSet.findNonOpaque(ElementTypes, IsPacked)) { 3360b57cec5SDimitry Andric STy->setName(""); 3370b57cec5SDimitry Andric return *Entry = OldT; 3380b57cec5SDimitry Andric } 3390b57cec5SDimitry Andric 3400b57cec5SDimitry Andric if (!AnyChange) { 3410b57cec5SDimitry Andric DstStructTypesSet.addNonOpaque(STy); 3420b57cec5SDimitry Andric return *Entry = Ty; 3430b57cec5SDimitry Andric } 3440b57cec5SDimitry Andric 3450b57cec5SDimitry Andric StructType *DTy = StructType::create(Ty->getContext()); 3460b57cec5SDimitry Andric finishType(DTy, STy, ElementTypes); 3470b57cec5SDimitry Andric return *Entry = DTy; 3480b57cec5SDimitry Andric } 3490b57cec5SDimitry Andric } 3500b57cec5SDimitry Andric } 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andric LinkDiagnosticInfo::LinkDiagnosticInfo(DiagnosticSeverity Severity, 3530b57cec5SDimitry Andric const Twine &Msg) 3540b57cec5SDimitry Andric : DiagnosticInfo(DK_Linker, Severity), Msg(Msg) {} 3550b57cec5SDimitry Andric void LinkDiagnosticInfo::print(DiagnosticPrinter &DP) const { DP << Msg; } 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3580b57cec5SDimitry Andric // IRLinker implementation. 3590b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3600b57cec5SDimitry Andric 3610b57cec5SDimitry Andric namespace { 3620b57cec5SDimitry Andric class IRLinker; 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andric /// Creates prototypes for functions that are lazily linked on the fly. This 3650b57cec5SDimitry Andric /// speeds up linking for modules with many/ lazily linked functions of which 3660b57cec5SDimitry Andric /// few get used. 3670b57cec5SDimitry Andric class GlobalValueMaterializer final : public ValueMaterializer { 3680b57cec5SDimitry Andric IRLinker &TheIRLinker; 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric public: 3710b57cec5SDimitry Andric GlobalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {} 3720b57cec5SDimitry Andric Value *materialize(Value *V) override; 3730b57cec5SDimitry Andric }; 3740b57cec5SDimitry Andric 3750b57cec5SDimitry Andric class LocalValueMaterializer final : public ValueMaterializer { 3760b57cec5SDimitry Andric IRLinker &TheIRLinker; 3770b57cec5SDimitry Andric 3780b57cec5SDimitry Andric public: 3790b57cec5SDimitry Andric LocalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {} 3800b57cec5SDimitry Andric Value *materialize(Value *V) override; 3810b57cec5SDimitry Andric }; 3820b57cec5SDimitry Andric 3830b57cec5SDimitry Andric /// Type of the Metadata map in \a ValueToValueMapTy. 3840b57cec5SDimitry Andric typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT; 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andric /// This is responsible for keeping track of the state used for moving data 3870b57cec5SDimitry Andric /// from SrcM to DstM. 3880b57cec5SDimitry Andric class IRLinker { 3890b57cec5SDimitry Andric Module &DstM; 3900b57cec5SDimitry Andric std::unique_ptr<Module> SrcM; 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andric /// See IRMover::move(). 39381ad6265SDimitry Andric IRMover::LazyCallback AddLazyFor; 3940b57cec5SDimitry Andric 3950b57cec5SDimitry Andric TypeMapTy TypeMap; 3960b57cec5SDimitry Andric GlobalValueMaterializer GValMaterializer; 3970b57cec5SDimitry Andric LocalValueMaterializer LValMaterializer; 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andric /// A metadata map that's shared between IRLinker instances. 4000b57cec5SDimitry Andric MDMapT &SharedMDs; 4010b57cec5SDimitry Andric 4020b57cec5SDimitry Andric /// Mapping of values from what they used to be in Src, to what they are now 4030b57cec5SDimitry Andric /// in DstM. ValueToValueMapTy is a ValueMap, which involves some overhead 4040b57cec5SDimitry Andric /// due to the use of Value handles which the Linker doesn't actually need, 4050b57cec5SDimitry Andric /// but this allows us to reuse the ValueMapper code. 4060b57cec5SDimitry Andric ValueToValueMapTy ValueMap; 4078bcb0991SDimitry Andric ValueToValueMapTy IndirectSymbolValueMap; 4080b57cec5SDimitry Andric 4090b57cec5SDimitry Andric DenseSet<GlobalValue *> ValuesToLink; 4100b57cec5SDimitry Andric std::vector<GlobalValue *> Worklist; 4110b57cec5SDimitry Andric std::vector<std::pair<GlobalValue *, Value*>> RAUWWorklist; 4120b57cec5SDimitry Andric 41306c3fb27SDimitry Andric /// Set of globals with eagerly copied metadata that may require remapping. 41406c3fb27SDimitry Andric /// This remapping is performed after metadata linking. 41506c3fb27SDimitry Andric DenseSet<GlobalObject *> UnmappedMetadata; 41606c3fb27SDimitry Andric 4170b57cec5SDimitry Andric void maybeAdd(GlobalValue *GV) { 4180b57cec5SDimitry Andric if (ValuesToLink.insert(GV).second) 4190b57cec5SDimitry Andric Worklist.push_back(GV); 4200b57cec5SDimitry Andric } 4210b57cec5SDimitry Andric 4220b57cec5SDimitry Andric /// Whether we are importing globals for ThinLTO, as opposed to linking the 4230b57cec5SDimitry Andric /// source module. If this flag is set, it means that we can rely on some 4240b57cec5SDimitry Andric /// other object file to define any non-GlobalValue entities defined by the 4250b57cec5SDimitry Andric /// source module. This currently causes us to not link retained types in 4260b57cec5SDimitry Andric /// debug info metadata and module inline asm. 4270b57cec5SDimitry Andric bool IsPerformingImport; 4280b57cec5SDimitry Andric 4290b57cec5SDimitry Andric /// Set to true when all global value body linking is complete (including 4300b57cec5SDimitry Andric /// lazy linking). Used to prevent metadata linking from creating new 4310b57cec5SDimitry Andric /// references. 4320b57cec5SDimitry Andric bool DoneLinkingBodies = false; 4330b57cec5SDimitry Andric 4340b57cec5SDimitry Andric /// The Error encountered during materialization. We use an Optional here to 4350b57cec5SDimitry Andric /// avoid needing to manage an unconsumed success value. 436bdd1243dSDimitry Andric std::optional<Error> FoundError; 4370b57cec5SDimitry Andric void setError(Error E) { 4380b57cec5SDimitry Andric if (E) 4390b57cec5SDimitry Andric FoundError = std::move(E); 4400b57cec5SDimitry Andric } 4410b57cec5SDimitry Andric 4420b57cec5SDimitry Andric /// Most of the errors produced by this module are inconvertible StringErrors. 4430b57cec5SDimitry Andric /// This convenience function lets us return one of those more easily. 4440b57cec5SDimitry Andric Error stringErr(const Twine &T) { 4450b57cec5SDimitry Andric return make_error<StringError>(T, inconvertibleErrorCode()); 4460b57cec5SDimitry Andric } 4470b57cec5SDimitry Andric 4480b57cec5SDimitry Andric /// Entry point for mapping values and alternate context for mapping aliases. 4490b57cec5SDimitry Andric ValueMapper Mapper; 4508bcb0991SDimitry Andric unsigned IndirectSymbolMCID; 4510b57cec5SDimitry Andric 4520b57cec5SDimitry Andric /// Handles cloning of a global values from the source module into 4530b57cec5SDimitry Andric /// the destination module, including setting the attributes and visibility. 4540b57cec5SDimitry Andric GlobalValue *copyGlobalValueProto(const GlobalValue *SGV, bool ForDefinition); 4550b57cec5SDimitry Andric 4560b57cec5SDimitry Andric void emitWarning(const Twine &Message) { 4570b57cec5SDimitry Andric SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Warning, Message)); 4580b57cec5SDimitry Andric } 4590b57cec5SDimitry Andric 4600b57cec5SDimitry Andric /// Given a global in the source module, return the global in the 4610b57cec5SDimitry Andric /// destination module that is being linked to, if any. 4620b57cec5SDimitry Andric GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 4630b57cec5SDimitry Andric // If the source has no name it can't link. If it has local linkage, 4640b57cec5SDimitry Andric // there is no name match-up going on. 4650b57cec5SDimitry Andric if (!SrcGV->hasName() || SrcGV->hasLocalLinkage()) 4660b57cec5SDimitry Andric return nullptr; 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andric // Otherwise see if we have a match in the destination module's symtab. 4690b57cec5SDimitry Andric GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 4700b57cec5SDimitry Andric if (!DGV) 4710b57cec5SDimitry Andric return nullptr; 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andric // If we found a global with the same name in the dest module, but it has 4740b57cec5SDimitry Andric // internal linkage, we are really not doing any linkage here. 4750b57cec5SDimitry Andric if (DGV->hasLocalLinkage()) 4760b57cec5SDimitry Andric return nullptr; 4770b57cec5SDimitry Andric 478fe6060f1SDimitry Andric // If we found an intrinsic declaration with mismatching prototypes, we 479fe6060f1SDimitry Andric // probably had a nameclash. Don't use that version. 480fe6060f1SDimitry Andric if (auto *FDGV = dyn_cast<Function>(DGV)) 481fe6060f1SDimitry Andric if (FDGV->isIntrinsic()) 482fe6060f1SDimitry Andric if (const auto *FSrcGV = dyn_cast<Function>(SrcGV)) 483fe6060f1SDimitry Andric if (FDGV->getFunctionType() != TypeMap.get(FSrcGV->getFunctionType())) 484fe6060f1SDimitry Andric return nullptr; 485fe6060f1SDimitry Andric 4860b57cec5SDimitry Andric // Otherwise, we do in fact link to the destination global. 4870b57cec5SDimitry Andric return DGV; 4880b57cec5SDimitry Andric } 4890b57cec5SDimitry Andric 4900b57cec5SDimitry Andric void computeTypeMapping(); 4910b57cec5SDimitry Andric 4920b57cec5SDimitry Andric Expected<Constant *> linkAppendingVarProto(GlobalVariable *DstGV, 4930b57cec5SDimitry Andric const GlobalVariable *SrcGV); 4940b57cec5SDimitry Andric 4950b57cec5SDimitry Andric /// Given the GlobaValue \p SGV in the source module, and the matching 4960b57cec5SDimitry Andric /// GlobalValue \p DGV (if any), return true if the linker will pull \p SGV 4970b57cec5SDimitry Andric /// into the destination module. 4980b57cec5SDimitry Andric /// 4990b57cec5SDimitry Andric /// Note this code may call the client-provided \p AddLazyFor. 5000b57cec5SDimitry Andric bool shouldLink(GlobalValue *DGV, GlobalValue &SGV); 5018bcb0991SDimitry Andric Expected<Constant *> linkGlobalValueProto(GlobalValue *GV, 5028bcb0991SDimitry Andric bool ForIndirectSymbol); 5030b57cec5SDimitry Andric 5040b57cec5SDimitry Andric Error linkModuleFlagsMetadata(); 5050b57cec5SDimitry Andric 5060b57cec5SDimitry Andric void linkGlobalVariable(GlobalVariable &Dst, GlobalVariable &Src); 5070b57cec5SDimitry Andric Error linkFunctionBody(Function &Dst, Function &Src); 508349cc55cSDimitry Andric void linkAliasAliasee(GlobalAlias &Dst, GlobalAlias &Src); 509349cc55cSDimitry Andric void linkIFuncResolver(GlobalIFunc &Dst, GlobalIFunc &Src); 5100b57cec5SDimitry Andric Error linkGlobalValueBody(GlobalValue &Dst, GlobalValue &Src); 5110b57cec5SDimitry Andric 5120b57cec5SDimitry Andric /// Replace all types in the source AttributeList with the 5130b57cec5SDimitry Andric /// corresponding destination type. 5140b57cec5SDimitry Andric AttributeList mapAttributeTypes(LLVMContext &C, AttributeList Attrs); 5150b57cec5SDimitry Andric 5160b57cec5SDimitry Andric /// Functions that take care of cloning a specific global value type 5170b57cec5SDimitry Andric /// into the destination module. 5180b57cec5SDimitry Andric GlobalVariable *copyGlobalVariableProto(const GlobalVariable *SGVar); 5190b57cec5SDimitry Andric Function *copyFunctionProto(const Function *SF); 520349cc55cSDimitry Andric GlobalValue *copyIndirectSymbolProto(const GlobalValue *SGV); 5210b57cec5SDimitry Andric 5220b57cec5SDimitry Andric /// Perform "replace all uses with" operations. These work items need to be 5230b57cec5SDimitry Andric /// performed as part of materialization, but we postpone them to happen after 5240b57cec5SDimitry Andric /// materialization is done. The materializer called by ValueMapper is not 5250b57cec5SDimitry Andric /// expected to delete constants, as ValueMapper is holding pointers to some 5260b57cec5SDimitry Andric /// of them, but constant destruction may be indirectly triggered by RAUW. 5270b57cec5SDimitry Andric /// Hence, the need to move this out of the materialization call chain. 5280b57cec5SDimitry Andric void flushRAUWWorklist(); 5290b57cec5SDimitry Andric 5300b57cec5SDimitry Andric /// When importing for ThinLTO, prevent importing of types listed on 5310b57cec5SDimitry Andric /// the DICompileUnit that we don't need a copy of in the importing 5320b57cec5SDimitry Andric /// module. 5330b57cec5SDimitry Andric void prepareCompileUnitsForImport(); 5340b57cec5SDimitry Andric void linkNamedMDNodes(); 5350b57cec5SDimitry Andric 536bdd1243dSDimitry Andric /// Update attributes while linking. 537bdd1243dSDimitry Andric void updateAttributes(GlobalValue &GV); 538bdd1243dSDimitry Andric 5390b57cec5SDimitry Andric public: 5400b57cec5SDimitry Andric IRLinker(Module &DstM, MDMapT &SharedMDs, 5410b57cec5SDimitry Andric IRMover::IdentifiedStructTypeSet &Set, std::unique_ptr<Module> SrcM, 5420b57cec5SDimitry Andric ArrayRef<GlobalValue *> ValuesToLink, 54381ad6265SDimitry Andric IRMover::LazyCallback AddLazyFor, bool IsPerformingImport) 5440b57cec5SDimitry Andric : DstM(DstM), SrcM(std::move(SrcM)), AddLazyFor(std::move(AddLazyFor)), 5450b57cec5SDimitry Andric TypeMap(Set), GValMaterializer(*this), LValMaterializer(*this), 5460b57cec5SDimitry Andric SharedMDs(SharedMDs), IsPerformingImport(IsPerformingImport), 547fe6060f1SDimitry Andric Mapper(ValueMap, RF_ReuseAndMutateDistinctMDs | RF_IgnoreMissingLocals, 548fe6060f1SDimitry Andric &TypeMap, &GValMaterializer), 5498bcb0991SDimitry Andric IndirectSymbolMCID(Mapper.registerAlternateMappingContext( 5508bcb0991SDimitry Andric IndirectSymbolValueMap, &LValMaterializer)) { 5510b57cec5SDimitry Andric ValueMap.getMDMap() = std::move(SharedMDs); 5520b57cec5SDimitry Andric for (GlobalValue *GV : ValuesToLink) 5530b57cec5SDimitry Andric maybeAdd(GV); 5540b57cec5SDimitry Andric if (IsPerformingImport) 5550b57cec5SDimitry Andric prepareCompileUnitsForImport(); 5560b57cec5SDimitry Andric } 5570b57cec5SDimitry Andric ~IRLinker() { SharedMDs = std::move(*ValueMap.getMDMap()); } 5580b57cec5SDimitry Andric 5590b57cec5SDimitry Andric Error run(); 5608bcb0991SDimitry Andric Value *materialize(Value *V, bool ForIndirectSymbol); 5610b57cec5SDimitry Andric }; 5620b57cec5SDimitry Andric } 5630b57cec5SDimitry Andric 5640b57cec5SDimitry Andric /// The LLVM SymbolTable class autorenames globals that conflict in the symbol 5650b57cec5SDimitry Andric /// table. This is good for all clients except for us. Go through the trouble 5660b57cec5SDimitry Andric /// to force this back. 5670b57cec5SDimitry Andric static void forceRenaming(GlobalValue *GV, StringRef Name) { 5680b57cec5SDimitry Andric // If the global doesn't force its name or if it already has the right name, 5690b57cec5SDimitry Andric // there is nothing for us to do. 5700b57cec5SDimitry Andric if (GV->hasLocalLinkage() || GV->getName() == Name) 5710b57cec5SDimitry Andric return; 5720b57cec5SDimitry Andric 5730b57cec5SDimitry Andric Module *M = GV->getParent(); 5740b57cec5SDimitry Andric 5750b57cec5SDimitry Andric // If there is a conflict, rename the conflict. 5760b57cec5SDimitry Andric if (GlobalValue *ConflictGV = M->getNamedValue(Name)) { 5770b57cec5SDimitry Andric GV->takeName(ConflictGV); 5780b57cec5SDimitry Andric ConflictGV->setName(Name); // This will cause ConflictGV to get renamed 5790b57cec5SDimitry Andric assert(ConflictGV->getName() != Name && "forceRenaming didn't work"); 5800b57cec5SDimitry Andric } else { 5810b57cec5SDimitry Andric GV->setName(Name); // Force the name back 5820b57cec5SDimitry Andric } 5830b57cec5SDimitry Andric } 5840b57cec5SDimitry Andric 5850b57cec5SDimitry Andric Value *GlobalValueMaterializer::materialize(Value *SGV) { 5860b57cec5SDimitry Andric return TheIRLinker.materialize(SGV, false); 5870b57cec5SDimitry Andric } 5880b57cec5SDimitry Andric 5890b57cec5SDimitry Andric Value *LocalValueMaterializer::materialize(Value *SGV) { 5900b57cec5SDimitry Andric return TheIRLinker.materialize(SGV, true); 5910b57cec5SDimitry Andric } 5920b57cec5SDimitry Andric 5938bcb0991SDimitry Andric Value *IRLinker::materialize(Value *V, bool ForIndirectSymbol) { 5940b57cec5SDimitry Andric auto *SGV = dyn_cast<GlobalValue>(V); 5950b57cec5SDimitry Andric if (!SGV) 5960b57cec5SDimitry Andric return nullptr; 5970b57cec5SDimitry Andric 598e8d8bef9SDimitry Andric // When linking a global from other modules than source & dest, skip 599e8d8bef9SDimitry Andric // materializing it because it would be mapped later when its containing 600e8d8bef9SDimitry Andric // module is linked. Linking it now would potentially pull in many types that 601e8d8bef9SDimitry Andric // may not be mapped properly. 602e8d8bef9SDimitry Andric if (SGV->getParent() != &DstM && SGV->getParent() != SrcM.get()) 603e8d8bef9SDimitry Andric return nullptr; 604e8d8bef9SDimitry Andric 6058bcb0991SDimitry Andric Expected<Constant *> NewProto = linkGlobalValueProto(SGV, ForIndirectSymbol); 6060b57cec5SDimitry Andric if (!NewProto) { 6070b57cec5SDimitry Andric setError(NewProto.takeError()); 6080b57cec5SDimitry Andric return nullptr; 6090b57cec5SDimitry Andric } 6100b57cec5SDimitry Andric if (!*NewProto) 6110b57cec5SDimitry Andric return nullptr; 6120b57cec5SDimitry Andric 6130b57cec5SDimitry Andric GlobalValue *New = dyn_cast<GlobalValue>(*NewProto); 6140b57cec5SDimitry Andric if (!New) 6150b57cec5SDimitry Andric return *NewProto; 6160b57cec5SDimitry Andric 6170b57cec5SDimitry Andric // If we already created the body, just return. 6180b57cec5SDimitry Andric if (auto *F = dyn_cast<Function>(New)) { 6190b57cec5SDimitry Andric if (!F->isDeclaration()) 6200b57cec5SDimitry Andric return New; 6210b57cec5SDimitry Andric } else if (auto *V = dyn_cast<GlobalVariable>(New)) { 6220b57cec5SDimitry Andric if (V->hasInitializer() || V->hasAppendingLinkage()) 6230b57cec5SDimitry Andric return New; 624349cc55cSDimitry Andric } else if (auto *GA = dyn_cast<GlobalAlias>(New)) { 625349cc55cSDimitry Andric if (GA->getAliasee()) 6260b57cec5SDimitry Andric return New; 627349cc55cSDimitry Andric } else if (auto *GI = dyn_cast<GlobalIFunc>(New)) { 628349cc55cSDimitry Andric if (GI->getResolver()) 629349cc55cSDimitry Andric return New; 630349cc55cSDimitry Andric } else { 631349cc55cSDimitry Andric llvm_unreachable("Invalid GlobalValue type"); 6320b57cec5SDimitry Andric } 6330b57cec5SDimitry Andric 634fe6060f1SDimitry Andric // If the global is being linked for an indirect symbol, it may have already 635fe6060f1SDimitry Andric // been scheduled to satisfy a regular symbol. Similarly, a global being linked 636fe6060f1SDimitry Andric // for a regular symbol may have already been scheduled for an indirect 637fe6060f1SDimitry Andric // symbol. Check for these cases by looking in the other value map and 638fe6060f1SDimitry Andric // confirming the same value has been scheduled. If there is an entry in the 6398bcb0991SDimitry Andric // ValueMap but the value is different, it means that the value already had a 6408bcb0991SDimitry Andric // definition in the destination module (linkonce for instance), but we need a 641fe6060f1SDimitry Andric // new definition for the indirect symbol ("New" will be different). 642fe6060f1SDimitry Andric if ((ForIndirectSymbol && ValueMap.lookup(SGV) == New) || 643fe6060f1SDimitry Andric (!ForIndirectSymbol && IndirectSymbolValueMap.lookup(SGV) == New)) 6440b57cec5SDimitry Andric return New; 6450b57cec5SDimitry Andric 6468bcb0991SDimitry Andric if (ForIndirectSymbol || shouldLink(New, *SGV)) 6470b57cec5SDimitry Andric setError(linkGlobalValueBody(*New, *SGV)); 6480b57cec5SDimitry Andric 649bdd1243dSDimitry Andric updateAttributes(*New); 6500b57cec5SDimitry Andric return New; 6510b57cec5SDimitry Andric } 6520b57cec5SDimitry Andric 6530b57cec5SDimitry Andric /// Loop through the global variables in the src module and merge them into the 6540b57cec5SDimitry Andric /// dest module. 6550b57cec5SDimitry Andric GlobalVariable *IRLinker::copyGlobalVariableProto(const GlobalVariable *SGVar) { 6560b57cec5SDimitry Andric // No linking to be performed or linking from the source: simply create an 6570b57cec5SDimitry Andric // identical version of the symbol over in the dest module... the 6580b57cec5SDimitry Andric // initializer will be filled in later by LinkGlobalInits. 6590b57cec5SDimitry Andric GlobalVariable *NewDGV = 6600b57cec5SDimitry Andric new GlobalVariable(DstM, TypeMap.get(SGVar->getValueType()), 6610b57cec5SDimitry Andric SGVar->isConstant(), GlobalValue::ExternalLinkage, 6620b57cec5SDimitry Andric /*init*/ nullptr, SGVar->getName(), 6630b57cec5SDimitry Andric /*insertbefore*/ nullptr, SGVar->getThreadLocalMode(), 664480093f4SDimitry Andric SGVar->getAddressSpace()); 6650eae32dcSDimitry Andric NewDGV->setAlignment(SGVar->getAlign()); 6660b57cec5SDimitry Andric NewDGV->copyAttributesFrom(SGVar); 6670b57cec5SDimitry Andric return NewDGV; 6680b57cec5SDimitry Andric } 6690b57cec5SDimitry Andric 6700b57cec5SDimitry Andric AttributeList IRLinker::mapAttributeTypes(LLVMContext &C, AttributeList Attrs) { 6710b57cec5SDimitry Andric for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) { 672349cc55cSDimitry Andric for (int AttrIdx = Attribute::FirstTypeAttr; 673349cc55cSDimitry Andric AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) { 674349cc55cSDimitry Andric Attribute::AttrKind TypedAttr = (Attribute::AttrKind)AttrIdx; 675349cc55cSDimitry Andric if (Attrs.hasAttributeAtIndex(i, TypedAttr)) { 676349cc55cSDimitry Andric if (Type *Ty = 677349cc55cSDimitry Andric Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) { 678349cc55cSDimitry Andric Attrs = Attrs.replaceAttributeTypeAtIndex(C, i, TypedAttr, 679349cc55cSDimitry Andric TypeMap.get(Ty)); 680e8d8bef9SDimitry Andric break; 681e8d8bef9SDimitry Andric } 682e8d8bef9SDimitry Andric } 6830b57cec5SDimitry Andric } 6840b57cec5SDimitry Andric } 6850b57cec5SDimitry Andric return Attrs; 6860b57cec5SDimitry Andric } 6870b57cec5SDimitry Andric 6880b57cec5SDimitry Andric /// Link the function in the source module into the destination module if 6890b57cec5SDimitry Andric /// needed, setting up mapping information. 6900b57cec5SDimitry Andric Function *IRLinker::copyFunctionProto(const Function *SF) { 6910b57cec5SDimitry Andric // If there is no linkage to be performed or we are linking from the source, 6920b57cec5SDimitry Andric // bring SF over. 693480093f4SDimitry Andric auto *F = Function::Create(TypeMap.get(SF->getFunctionType()), 694480093f4SDimitry Andric GlobalValue::ExternalLinkage, 695480093f4SDimitry Andric SF->getAddressSpace(), SF->getName(), &DstM); 6960b57cec5SDimitry Andric F->copyAttributesFrom(SF); 6970b57cec5SDimitry Andric F->setAttributes(mapAttributeTypes(F->getContext(), F->getAttributes())); 698*0fca6ea1SDimitry Andric F->IsNewDbgInfoFormat = SF->IsNewDbgInfoFormat; 6990b57cec5SDimitry Andric return F; 7000b57cec5SDimitry Andric } 7010b57cec5SDimitry Andric 7028bcb0991SDimitry Andric /// Set up prototypes for any indirect symbols that come over from the source 7038bcb0991SDimitry Andric /// module. 704349cc55cSDimitry Andric GlobalValue *IRLinker::copyIndirectSymbolProto(const GlobalValue *SGV) { 7050b57cec5SDimitry Andric // If there is no linkage to be performed or we're linking from the source, 7060b57cec5SDimitry Andric // bring over SGA. 707349cc55cSDimitry Andric auto *Ty = TypeMap.get(SGV->getValueType()); 708349cc55cSDimitry Andric 709349cc55cSDimitry Andric if (auto *GA = dyn_cast<GlobalAlias>(SGV)) { 710349cc55cSDimitry Andric auto *DGA = GlobalAlias::create(Ty, SGV->getAddressSpace(), 711349cc55cSDimitry Andric GlobalValue::ExternalLinkage, 712349cc55cSDimitry Andric SGV->getName(), &DstM); 713349cc55cSDimitry Andric DGA->copyAttributesFrom(GA); 714349cc55cSDimitry Andric return DGA; 715349cc55cSDimitry Andric } 716349cc55cSDimitry Andric 717349cc55cSDimitry Andric if (auto *GI = dyn_cast<GlobalIFunc>(SGV)) { 718349cc55cSDimitry Andric auto *DGI = GlobalIFunc::create(Ty, SGV->getAddressSpace(), 719349cc55cSDimitry Andric GlobalValue::ExternalLinkage, 720349cc55cSDimitry Andric SGV->getName(), nullptr, &DstM); 721349cc55cSDimitry Andric DGI->copyAttributesFrom(GI); 722349cc55cSDimitry Andric return DGI; 723349cc55cSDimitry Andric } 724349cc55cSDimitry Andric 725349cc55cSDimitry Andric llvm_unreachable("Invalid source global value type"); 7260b57cec5SDimitry Andric } 7270b57cec5SDimitry Andric 7280b57cec5SDimitry Andric GlobalValue *IRLinker::copyGlobalValueProto(const GlobalValue *SGV, 7290b57cec5SDimitry Andric bool ForDefinition) { 7300b57cec5SDimitry Andric GlobalValue *NewGV; 7310b57cec5SDimitry Andric if (auto *SGVar = dyn_cast<GlobalVariable>(SGV)) { 7320b57cec5SDimitry Andric NewGV = copyGlobalVariableProto(SGVar); 7330b57cec5SDimitry Andric } else if (auto *SF = dyn_cast<Function>(SGV)) { 7340b57cec5SDimitry Andric NewGV = copyFunctionProto(SF); 7350b57cec5SDimitry Andric } else { 7360b57cec5SDimitry Andric if (ForDefinition) 737349cc55cSDimitry Andric NewGV = copyIndirectSymbolProto(SGV); 7380b57cec5SDimitry Andric else if (SGV->getValueType()->isFunctionTy()) 7390b57cec5SDimitry Andric NewGV = 7400b57cec5SDimitry Andric Function::Create(cast<FunctionType>(TypeMap.get(SGV->getValueType())), 741480093f4SDimitry Andric GlobalValue::ExternalLinkage, SGV->getAddressSpace(), 742480093f4SDimitry Andric SGV->getName(), &DstM); 7430b57cec5SDimitry Andric else 744480093f4SDimitry Andric NewGV = 745480093f4SDimitry Andric new GlobalVariable(DstM, TypeMap.get(SGV->getValueType()), 7460b57cec5SDimitry Andric /*isConstant*/ false, GlobalValue::ExternalLinkage, 7470b57cec5SDimitry Andric /*init*/ nullptr, SGV->getName(), 748480093f4SDimitry Andric /*insertbefore*/ nullptr, 749480093f4SDimitry Andric SGV->getThreadLocalMode(), SGV->getAddressSpace()); 7500b57cec5SDimitry Andric } 7510b57cec5SDimitry Andric 7520b57cec5SDimitry Andric if (ForDefinition) 7530b57cec5SDimitry Andric NewGV->setLinkage(SGV->getLinkage()); 7540b57cec5SDimitry Andric else if (SGV->hasExternalWeakLinkage()) 7550b57cec5SDimitry Andric NewGV->setLinkage(GlobalValue::ExternalWeakLinkage); 7560b57cec5SDimitry Andric 7570b57cec5SDimitry Andric if (auto *NewGO = dyn_cast<GlobalObject>(NewGV)) { 7580b57cec5SDimitry Andric // Metadata for global variables and function declarations is copied eagerly. 75906c3fb27SDimitry Andric if (isa<GlobalVariable>(SGV) || SGV->isDeclaration()) { 7600b57cec5SDimitry Andric NewGO->copyMetadata(cast<GlobalObject>(SGV), 0); 76106c3fb27SDimitry Andric if (SGV->isDeclaration() && NewGO->hasMetadata()) 76206c3fb27SDimitry Andric UnmappedMetadata.insert(NewGO); 76306c3fb27SDimitry Andric } 7640b57cec5SDimitry Andric } 7650b57cec5SDimitry Andric 7660b57cec5SDimitry Andric // Remove these copied constants in case this stays a declaration, since 7670b57cec5SDimitry Andric // they point to the source module. If the def is linked the values will 7680b57cec5SDimitry Andric // be mapped in during linkFunctionBody. 7690b57cec5SDimitry Andric if (auto *NewF = dyn_cast<Function>(NewGV)) { 7700b57cec5SDimitry Andric NewF->setPersonalityFn(nullptr); 7710b57cec5SDimitry Andric NewF->setPrefixData(nullptr); 7720b57cec5SDimitry Andric NewF->setPrologueData(nullptr); 7730b57cec5SDimitry Andric } 7740b57cec5SDimitry Andric 7750b57cec5SDimitry Andric return NewGV; 7760b57cec5SDimitry Andric } 7770b57cec5SDimitry Andric 7780b57cec5SDimitry Andric static StringRef getTypeNamePrefix(StringRef Name) { 7790b57cec5SDimitry Andric size_t DotPos = Name.rfind('.'); 7800b57cec5SDimitry Andric return (DotPos == 0 || DotPos == StringRef::npos || Name.back() == '.' || 7810b57cec5SDimitry Andric !isdigit(static_cast<unsigned char>(Name[DotPos + 1]))) 7820b57cec5SDimitry Andric ? Name 7830b57cec5SDimitry Andric : Name.substr(0, DotPos); 7840b57cec5SDimitry Andric } 7850b57cec5SDimitry Andric 7860b57cec5SDimitry Andric /// Loop over all of the linked values to compute type mappings. For example, 7870b57cec5SDimitry Andric /// if we link "extern Foo *x" and "Foo *x = NULL", then we have two struct 7880b57cec5SDimitry Andric /// types 'Foo' but one got renamed when the module was loaded into the same 7890b57cec5SDimitry Andric /// LLVMContext. 7900b57cec5SDimitry Andric void IRLinker::computeTypeMapping() { 7910b57cec5SDimitry Andric for (GlobalValue &SGV : SrcM->globals()) { 7920b57cec5SDimitry Andric GlobalValue *DGV = getLinkedToGlobal(&SGV); 7930b57cec5SDimitry Andric if (!DGV) 7940b57cec5SDimitry Andric continue; 7950b57cec5SDimitry Andric 7960b57cec5SDimitry Andric if (!DGV->hasAppendingLinkage() || !SGV.hasAppendingLinkage()) { 7970b57cec5SDimitry Andric TypeMap.addTypeMapping(DGV->getType(), SGV.getType()); 7980b57cec5SDimitry Andric continue; 7990b57cec5SDimitry Andric } 8000b57cec5SDimitry Andric 8010b57cec5SDimitry Andric // Unify the element type of appending arrays. 8020b57cec5SDimitry Andric ArrayType *DAT = cast<ArrayType>(DGV->getValueType()); 8030b57cec5SDimitry Andric ArrayType *SAT = cast<ArrayType>(SGV.getValueType()); 8040b57cec5SDimitry Andric TypeMap.addTypeMapping(DAT->getElementType(), SAT->getElementType()); 8050b57cec5SDimitry Andric } 8060b57cec5SDimitry Andric 8070b57cec5SDimitry Andric for (GlobalValue &SGV : *SrcM) 8088bcb0991SDimitry Andric if (GlobalValue *DGV = getLinkedToGlobal(&SGV)) { 8098bcb0991SDimitry Andric if (DGV->getType() == SGV.getType()) { 8108bcb0991SDimitry Andric // If the types of DGV and SGV are the same, it means that DGV is from 8118bcb0991SDimitry Andric // the source module and got added to DstM from a shared metadata. We 8128bcb0991SDimitry Andric // shouldn't map this type to itself in case the type's components get 8138bcb0991SDimitry Andric // remapped to a new type from DstM (for instance, during the loop over 8148bcb0991SDimitry Andric // SrcM->getIdentifiedStructTypes() below). 8158bcb0991SDimitry Andric continue; 8168bcb0991SDimitry Andric } 8178bcb0991SDimitry Andric 8180b57cec5SDimitry Andric TypeMap.addTypeMapping(DGV->getType(), SGV.getType()); 8198bcb0991SDimitry Andric } 8200b57cec5SDimitry Andric 8210b57cec5SDimitry Andric for (GlobalValue &SGV : SrcM->aliases()) 8220b57cec5SDimitry Andric if (GlobalValue *DGV = getLinkedToGlobal(&SGV)) 8230b57cec5SDimitry Andric TypeMap.addTypeMapping(DGV->getType(), SGV.getType()); 8240b57cec5SDimitry Andric 8250b57cec5SDimitry Andric // Incorporate types by name, scanning all the types in the source module. 8260b57cec5SDimitry Andric // At this point, the destination module may have a type "%foo = { i32 }" for 8270b57cec5SDimitry Andric // example. When the source module got loaded into the same LLVMContext, if 8280b57cec5SDimitry Andric // it had the same type, it would have been renamed to "%foo.42 = { i32 }". 8290b57cec5SDimitry Andric std::vector<StructType *> Types = SrcM->getIdentifiedStructTypes(); 8300b57cec5SDimitry Andric for (StructType *ST : Types) { 8310b57cec5SDimitry Andric if (!ST->hasName()) 8320b57cec5SDimitry Andric continue; 8330b57cec5SDimitry Andric 8340b57cec5SDimitry Andric if (TypeMap.DstStructTypesSet.hasType(ST)) { 8350b57cec5SDimitry Andric // This is actually a type from the destination module. 8360b57cec5SDimitry Andric // getIdentifiedStructTypes() can have found it by walking debug info 8370b57cec5SDimitry Andric // metadata nodes, some of which get linked by name when ODR Type Uniquing 8380b57cec5SDimitry Andric // is enabled on the Context, from the source to the destination module. 8390b57cec5SDimitry Andric continue; 8400b57cec5SDimitry Andric } 8410b57cec5SDimitry Andric 8420b57cec5SDimitry Andric auto STTypePrefix = getTypeNamePrefix(ST->getName()); 8430b57cec5SDimitry Andric if (STTypePrefix.size() == ST->getName().size()) 8440b57cec5SDimitry Andric continue; 8450b57cec5SDimitry Andric 8460b57cec5SDimitry Andric // Check to see if the destination module has a struct with the prefix name. 847e8d8bef9SDimitry Andric StructType *DST = StructType::getTypeByName(ST->getContext(), STTypePrefix); 8480b57cec5SDimitry Andric if (!DST) 8490b57cec5SDimitry Andric continue; 8500b57cec5SDimitry Andric 8510b57cec5SDimitry Andric // Don't use it if this actually came from the source module. They're in 8520b57cec5SDimitry Andric // the same LLVMContext after all. Also don't use it unless the type is 8530b57cec5SDimitry Andric // actually used in the destination module. This can happen in situations 8540b57cec5SDimitry Andric // like this: 8550b57cec5SDimitry Andric // 8560b57cec5SDimitry Andric // Module A Module B 8570b57cec5SDimitry Andric // -------- -------- 8580b57cec5SDimitry Andric // %Z = type { %A } %B = type { %C.1 } 8590b57cec5SDimitry Andric // %A = type { %B.1, [7 x i8] } %C.1 = type { i8* } 8600b57cec5SDimitry Andric // %B.1 = type { %C } %A.2 = type { %B.3, [5 x i8] } 8610b57cec5SDimitry Andric // %C = type { i8* } %B.3 = type { %C.1 } 8620b57cec5SDimitry Andric // 8630b57cec5SDimitry Andric // When we link Module B with Module A, the '%B' in Module B is 8640b57cec5SDimitry Andric // used. However, that would then use '%C.1'. But when we process '%C.1', 8650b57cec5SDimitry Andric // we prefer to take the '%C' version. So we are then left with both 8660b57cec5SDimitry Andric // '%C.1' and '%C' being used for the same types. This leads to some 8670b57cec5SDimitry Andric // variables using one type and some using the other. 8680b57cec5SDimitry Andric if (TypeMap.DstStructTypesSet.hasType(DST)) 8690b57cec5SDimitry Andric TypeMap.addTypeMapping(DST, ST); 8700b57cec5SDimitry Andric } 8710b57cec5SDimitry Andric 8720b57cec5SDimitry Andric // Now that we have discovered all of the type equivalences, get a body for 8730b57cec5SDimitry Andric // any 'opaque' types in the dest module that are now resolved. 8740b57cec5SDimitry Andric TypeMap.linkDefinedTypeBodies(); 8750b57cec5SDimitry Andric } 8760b57cec5SDimitry Andric 8770b57cec5SDimitry Andric static void getArrayElements(const Constant *C, 8780b57cec5SDimitry Andric SmallVectorImpl<Constant *> &Dest) { 8790b57cec5SDimitry Andric unsigned NumElements = cast<ArrayType>(C->getType())->getNumElements(); 8800b57cec5SDimitry Andric 8810b57cec5SDimitry Andric for (unsigned i = 0; i != NumElements; ++i) 8820b57cec5SDimitry Andric Dest.push_back(C->getAggregateElement(i)); 8830b57cec5SDimitry Andric } 8840b57cec5SDimitry Andric 8850b57cec5SDimitry Andric /// If there were any appending global variables, link them together now. 8860b57cec5SDimitry Andric Expected<Constant *> 8870b57cec5SDimitry Andric IRLinker::linkAppendingVarProto(GlobalVariable *DstGV, 8880b57cec5SDimitry Andric const GlobalVariable *SrcGV) { 889e8d8bef9SDimitry Andric // Check that both variables have compatible properties. 890e8d8bef9SDimitry Andric if (DstGV && !DstGV->isDeclaration() && !SrcGV->isDeclaration()) { 891e8d8bef9SDimitry Andric if (!SrcGV->hasAppendingLinkage() || !DstGV->hasAppendingLinkage()) 892e8d8bef9SDimitry Andric return stringErr( 893e8d8bef9SDimitry Andric "Linking globals named '" + SrcGV->getName() + 894e8d8bef9SDimitry Andric "': can only link appending global with another appending " 895e8d8bef9SDimitry Andric "global!"); 896e8d8bef9SDimitry Andric 897e8d8bef9SDimitry Andric if (DstGV->isConstant() != SrcGV->isConstant()) 898e8d8bef9SDimitry Andric return stringErr("Appending variables linked with different const'ness!"); 899e8d8bef9SDimitry Andric 9000eae32dcSDimitry Andric if (DstGV->getAlign() != SrcGV->getAlign()) 901e8d8bef9SDimitry Andric return stringErr( 902e8d8bef9SDimitry Andric "Appending variables with different alignment need to be linked!"); 903e8d8bef9SDimitry Andric 904e8d8bef9SDimitry Andric if (DstGV->getVisibility() != SrcGV->getVisibility()) 905e8d8bef9SDimitry Andric return stringErr( 906e8d8bef9SDimitry Andric "Appending variables with different visibility need to be linked!"); 907e8d8bef9SDimitry Andric 908e8d8bef9SDimitry Andric if (DstGV->hasGlobalUnnamedAddr() != SrcGV->hasGlobalUnnamedAddr()) 909e8d8bef9SDimitry Andric return stringErr( 910e8d8bef9SDimitry Andric "Appending variables with different unnamed_addr need to be linked!"); 911e8d8bef9SDimitry Andric 912e8d8bef9SDimitry Andric if (DstGV->getSection() != SrcGV->getSection()) 913e8d8bef9SDimitry Andric return stringErr( 914e8d8bef9SDimitry Andric "Appending variables with different section name need to be linked!"); 915bdd1243dSDimitry Andric 916bdd1243dSDimitry Andric if (DstGV->getAddressSpace() != SrcGV->getAddressSpace()) 917bdd1243dSDimitry Andric return stringErr("Appending variables with different address spaces need " 918bdd1243dSDimitry Andric "to be linked!"); 919e8d8bef9SDimitry Andric } 920e8d8bef9SDimitry Andric 921e8d8bef9SDimitry Andric // Do not need to do anything if source is a declaration. 922e8d8bef9SDimitry Andric if (SrcGV->isDeclaration()) 923e8d8bef9SDimitry Andric return DstGV; 924e8d8bef9SDimitry Andric 9250b57cec5SDimitry Andric Type *EltTy = cast<ArrayType>(TypeMap.get(SrcGV->getValueType())) 9260b57cec5SDimitry Andric ->getElementType(); 9270b57cec5SDimitry Andric 9280b57cec5SDimitry Andric // FIXME: This upgrade is done during linking to support the C API. Once the 9290b57cec5SDimitry Andric // old form is deprecated, we should move this upgrade to 9300b57cec5SDimitry Andric // llvm::UpgradeGlobalVariable() and simplify the logic here and in 9310b57cec5SDimitry Andric // Mapper::mapAppendingVariable() in ValueMapper.cpp. 9320b57cec5SDimitry Andric StringRef Name = SrcGV->getName(); 9330b57cec5SDimitry Andric bool IsNewStructor = false; 9340b57cec5SDimitry Andric bool IsOldStructor = false; 9350b57cec5SDimitry Andric if (Name == "llvm.global_ctors" || Name == "llvm.global_dtors") { 9360b57cec5SDimitry Andric if (cast<StructType>(EltTy)->getNumElements() == 3) 9370b57cec5SDimitry Andric IsNewStructor = true; 9380b57cec5SDimitry Andric else 9390b57cec5SDimitry Andric IsOldStructor = true; 9400b57cec5SDimitry Andric } 9410b57cec5SDimitry Andric 9425f757f3fSDimitry Andric PointerType *VoidPtrTy = PointerType::get(SrcGV->getContext(), 0); 9430b57cec5SDimitry Andric if (IsOldStructor) { 9440b57cec5SDimitry Andric auto &ST = *cast<StructType>(EltTy); 9450b57cec5SDimitry Andric Type *Tys[3] = {ST.getElementType(0), ST.getElementType(1), VoidPtrTy}; 9460b57cec5SDimitry Andric EltTy = StructType::get(SrcGV->getContext(), Tys, false); 9470b57cec5SDimitry Andric } 9480b57cec5SDimitry Andric 9490b57cec5SDimitry Andric uint64_t DstNumElements = 0; 950e8d8bef9SDimitry Andric if (DstGV && !DstGV->isDeclaration()) { 9510b57cec5SDimitry Andric ArrayType *DstTy = cast<ArrayType>(DstGV->getValueType()); 9520b57cec5SDimitry Andric DstNumElements = DstTy->getNumElements(); 9530b57cec5SDimitry Andric 9540b57cec5SDimitry Andric // Check to see that they two arrays agree on type. 9550b57cec5SDimitry Andric if (EltTy != DstTy->getElementType()) 9560b57cec5SDimitry Andric return stringErr("Appending variables with different element types!"); 9570b57cec5SDimitry Andric } 9580b57cec5SDimitry Andric 9590b57cec5SDimitry Andric SmallVector<Constant *, 16> SrcElements; 9600b57cec5SDimitry Andric getArrayElements(SrcGV->getInitializer(), SrcElements); 9610b57cec5SDimitry Andric 9620b57cec5SDimitry Andric if (IsNewStructor) { 963e8d8bef9SDimitry Andric erase_if(SrcElements, [this](Constant *E) { 9640b57cec5SDimitry Andric auto *Key = 9650b57cec5SDimitry Andric dyn_cast<GlobalValue>(E->getAggregateElement(2)->stripPointerCasts()); 9660b57cec5SDimitry Andric if (!Key) 9670b57cec5SDimitry Andric return false; 9680b57cec5SDimitry Andric GlobalValue *DGV = getLinkedToGlobal(Key); 9690b57cec5SDimitry Andric return !shouldLink(DGV, *Key); 9700b57cec5SDimitry Andric }); 9710b57cec5SDimitry Andric } 9720b57cec5SDimitry Andric uint64_t NewSize = DstNumElements + SrcElements.size(); 9730b57cec5SDimitry Andric ArrayType *NewType = ArrayType::get(EltTy, NewSize); 9740b57cec5SDimitry Andric 9750b57cec5SDimitry Andric // Create the new global variable. 9760b57cec5SDimitry Andric GlobalVariable *NG = new GlobalVariable( 9770b57cec5SDimitry Andric DstM, NewType, SrcGV->isConstant(), SrcGV->getLinkage(), 9780b57cec5SDimitry Andric /*init*/ nullptr, /*name*/ "", DstGV, SrcGV->getThreadLocalMode(), 979480093f4SDimitry Andric SrcGV->getAddressSpace()); 9800b57cec5SDimitry Andric 9810b57cec5SDimitry Andric NG->copyAttributesFrom(SrcGV); 9820b57cec5SDimitry Andric forceRenaming(NG, SrcGV->getName()); 9830b57cec5SDimitry Andric 9840b57cec5SDimitry Andric Constant *Ret = ConstantExpr::getBitCast(NG, TypeMap.get(SrcGV->getType())); 9850b57cec5SDimitry Andric 986e8d8bef9SDimitry Andric Mapper.scheduleMapAppendingVariable( 987e8d8bef9SDimitry Andric *NG, 988e8d8bef9SDimitry Andric (DstGV && !DstGV->isDeclaration()) ? DstGV->getInitializer() : nullptr, 9890b57cec5SDimitry Andric IsOldStructor, SrcElements); 9900b57cec5SDimitry Andric 9910b57cec5SDimitry Andric // Replace any uses of the two global variables with uses of the new 9920b57cec5SDimitry Andric // global. 9930b57cec5SDimitry Andric if (DstGV) { 9945f757f3fSDimitry Andric RAUWWorklist.push_back(std::make_pair(DstGV, NG)); 9950b57cec5SDimitry Andric } 9960b57cec5SDimitry Andric 9970b57cec5SDimitry Andric return Ret; 9980b57cec5SDimitry Andric } 9990b57cec5SDimitry Andric 10000b57cec5SDimitry Andric bool IRLinker::shouldLink(GlobalValue *DGV, GlobalValue &SGV) { 10010b57cec5SDimitry Andric if (ValuesToLink.count(&SGV) || SGV.hasLocalLinkage()) 10020b57cec5SDimitry Andric return true; 10030b57cec5SDimitry Andric 10040b57cec5SDimitry Andric if (DGV && !DGV->isDeclarationForLinker()) 10050b57cec5SDimitry Andric return false; 10060b57cec5SDimitry Andric 10070b57cec5SDimitry Andric if (SGV.isDeclaration() || DoneLinkingBodies) 10080b57cec5SDimitry Andric return false; 10090b57cec5SDimitry Andric 10100b57cec5SDimitry Andric // Callback to the client to give a chance to lazily add the Global to the 10110b57cec5SDimitry Andric // list of value to link. 10120b57cec5SDimitry Andric bool LazilyAdded = false; 101381ad6265SDimitry Andric if (AddLazyFor) 10140b57cec5SDimitry Andric AddLazyFor(SGV, [this, &LazilyAdded](GlobalValue &GV) { 10150b57cec5SDimitry Andric maybeAdd(&GV); 10160b57cec5SDimitry Andric LazilyAdded = true; 10170b57cec5SDimitry Andric }); 10180b57cec5SDimitry Andric return LazilyAdded; 10190b57cec5SDimitry Andric } 10200b57cec5SDimitry Andric 10210b57cec5SDimitry Andric Expected<Constant *> IRLinker::linkGlobalValueProto(GlobalValue *SGV, 10228bcb0991SDimitry Andric bool ForIndirectSymbol) { 10230b57cec5SDimitry Andric GlobalValue *DGV = getLinkedToGlobal(SGV); 10240b57cec5SDimitry Andric 10250b57cec5SDimitry Andric bool ShouldLink = shouldLink(DGV, *SGV); 10260b57cec5SDimitry Andric 10270b57cec5SDimitry Andric // just missing from map 10280b57cec5SDimitry Andric if (ShouldLink) { 10290b57cec5SDimitry Andric auto I = ValueMap.find(SGV); 10300b57cec5SDimitry Andric if (I != ValueMap.end()) 10310b57cec5SDimitry Andric return cast<Constant>(I->second); 10320b57cec5SDimitry Andric 10338bcb0991SDimitry Andric I = IndirectSymbolValueMap.find(SGV); 10348bcb0991SDimitry Andric if (I != IndirectSymbolValueMap.end()) 10350b57cec5SDimitry Andric return cast<Constant>(I->second); 10360b57cec5SDimitry Andric } 10370b57cec5SDimitry Andric 10388bcb0991SDimitry Andric if (!ShouldLink && ForIndirectSymbol) 10390b57cec5SDimitry Andric DGV = nullptr; 10400b57cec5SDimitry Andric 10410b57cec5SDimitry Andric // Handle the ultra special appending linkage case first. 1042e8d8bef9SDimitry Andric if (SGV->hasAppendingLinkage() || (DGV && DGV->hasAppendingLinkage())) 10430b57cec5SDimitry Andric return linkAppendingVarProto(cast_or_null<GlobalVariable>(DGV), 10440b57cec5SDimitry Andric cast<GlobalVariable>(SGV)); 10450b57cec5SDimitry Andric 1046fe6060f1SDimitry Andric bool NeedsRenaming = false; 10470b57cec5SDimitry Andric GlobalValue *NewGV; 10480b57cec5SDimitry Andric if (DGV && !ShouldLink) { 10490b57cec5SDimitry Andric NewGV = DGV; 10500b57cec5SDimitry Andric } else { 10510b57cec5SDimitry Andric // If we are done linking global value bodies (i.e. we are performing 10520b57cec5SDimitry Andric // metadata linking), don't link in the global value due to this 10530b57cec5SDimitry Andric // reference, simply map it to null. 10540b57cec5SDimitry Andric if (DoneLinkingBodies) 10550b57cec5SDimitry Andric return nullptr; 10560b57cec5SDimitry Andric 10578bcb0991SDimitry Andric NewGV = copyGlobalValueProto(SGV, ShouldLink || ForIndirectSymbol); 10588bcb0991SDimitry Andric if (ShouldLink || !ForIndirectSymbol) 1059fe6060f1SDimitry Andric NeedsRenaming = true; 10600b57cec5SDimitry Andric } 10610b57cec5SDimitry Andric 10620b57cec5SDimitry Andric // Overloaded intrinsics have overloaded types names as part of their 10630b57cec5SDimitry Andric // names. If we renamed overloaded types we should rename the intrinsic 10640b57cec5SDimitry Andric // as well. 10650b57cec5SDimitry Andric if (Function *F = dyn_cast<Function>(NewGV)) 1066fe6060f1SDimitry Andric if (auto Remangled = Intrinsic::remangleIntrinsicFunction(F)) { 106706c3fb27SDimitry Andric // Note: remangleIntrinsicFunction does not copy metadata and as such 106806c3fb27SDimitry Andric // F should not occur in the set of objects with unmapped metadata. 106906c3fb27SDimitry Andric // If this assertion fails then remangleIntrinsicFunction needs updating. 107006c3fb27SDimitry Andric assert(!UnmappedMetadata.count(F) && "intrinsic has unmapped metadata"); 1071fe6060f1SDimitry Andric NewGV->eraseFromParent(); 107281ad6265SDimitry Andric NewGV = *Remangled; 1073fe6060f1SDimitry Andric NeedsRenaming = false; 1074fe6060f1SDimitry Andric } 1075fe6060f1SDimitry Andric 1076fe6060f1SDimitry Andric if (NeedsRenaming) 1077fe6060f1SDimitry Andric forceRenaming(NewGV, SGV->getName()); 10780b57cec5SDimitry Andric 10798bcb0991SDimitry Andric if (ShouldLink || ForIndirectSymbol) { 10800b57cec5SDimitry Andric if (const Comdat *SC = SGV->getComdat()) { 10810b57cec5SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(NewGV)) { 10820b57cec5SDimitry Andric Comdat *DC = DstM.getOrInsertComdat(SC->getName()); 10830b57cec5SDimitry Andric DC->setSelectionKind(SC->getSelectionKind()); 10840b57cec5SDimitry Andric GO->setComdat(DC); 10850b57cec5SDimitry Andric } 10860b57cec5SDimitry Andric } 10870b57cec5SDimitry Andric } 10880b57cec5SDimitry Andric 10898bcb0991SDimitry Andric if (!ShouldLink && ForIndirectSymbol) 10900b57cec5SDimitry Andric NewGV->setLinkage(GlobalValue::InternalLinkage); 10910b57cec5SDimitry Andric 10920b57cec5SDimitry Andric Constant *C = NewGV; 10930b57cec5SDimitry Andric // Only create a bitcast if necessary. In particular, with 10940b57cec5SDimitry Andric // DebugTypeODRUniquing we may reach metadata in the destination module 10950b57cec5SDimitry Andric // containing a GV from the source module, in which case SGV will be 10960b57cec5SDimitry Andric // the same as DGV and NewGV, and TypeMap.get() will assert since it 10970b57cec5SDimitry Andric // assumes it is being invoked on a type in the source module. 10980b57cec5SDimitry Andric if (DGV && NewGV != SGV) { 10990b57cec5SDimitry Andric C = ConstantExpr::getPointerBitCastOrAddrSpaceCast( 11000b57cec5SDimitry Andric NewGV, TypeMap.get(SGV->getType())); 11010b57cec5SDimitry Andric } 11020b57cec5SDimitry Andric 11030b57cec5SDimitry Andric if (DGV && NewGV != DGV) { 11040b57cec5SDimitry Andric // Schedule "replace all uses with" to happen after materializing is 11050b57cec5SDimitry Andric // done. It is not safe to do it now, since ValueMapper may be holding 11060b57cec5SDimitry Andric // pointers to constants that will get deleted if RAUW runs. 11070b57cec5SDimitry Andric RAUWWorklist.push_back(std::make_pair( 11080b57cec5SDimitry Andric DGV, 11090b57cec5SDimitry Andric ConstantExpr::getPointerBitCastOrAddrSpaceCast(NewGV, DGV->getType()))); 11100b57cec5SDimitry Andric } 11110b57cec5SDimitry Andric 11120b57cec5SDimitry Andric return C; 11130b57cec5SDimitry Andric } 11140b57cec5SDimitry Andric 11150b57cec5SDimitry Andric /// Update the initializers in the Dest module now that all globals that may be 11160b57cec5SDimitry Andric /// referenced are in Dest. 11170b57cec5SDimitry Andric void IRLinker::linkGlobalVariable(GlobalVariable &Dst, GlobalVariable &Src) { 11180b57cec5SDimitry Andric // Figure out what the initializer looks like in the dest module. 11190b57cec5SDimitry Andric Mapper.scheduleMapGlobalInitializer(Dst, *Src.getInitializer()); 11200b57cec5SDimitry Andric } 11210b57cec5SDimitry Andric 11220b57cec5SDimitry Andric /// Copy the source function over into the dest function and fix up references 11230b57cec5SDimitry Andric /// to values. At this point we know that Dest is an external function, and 11240b57cec5SDimitry Andric /// that Src is not. 11250b57cec5SDimitry Andric Error IRLinker::linkFunctionBody(Function &Dst, Function &Src) { 11260b57cec5SDimitry Andric assert(Dst.isDeclaration() && !Src.isDeclaration()); 11270b57cec5SDimitry Andric 11280b57cec5SDimitry Andric // Materialize if needed. 11290b57cec5SDimitry Andric if (Error Err = Src.materialize()) 11300b57cec5SDimitry Andric return Err; 11310b57cec5SDimitry Andric 11320b57cec5SDimitry Andric // Link in the operands without remapping. 11330b57cec5SDimitry Andric if (Src.hasPrefixData()) 11340b57cec5SDimitry Andric Dst.setPrefixData(Src.getPrefixData()); 11350b57cec5SDimitry Andric if (Src.hasPrologueData()) 11360b57cec5SDimitry Andric Dst.setPrologueData(Src.getPrologueData()); 11370b57cec5SDimitry Andric if (Src.hasPersonalityFn()) 11380b57cec5SDimitry Andric Dst.setPersonalityFn(Src.getPersonalityFn()); 11395f757f3fSDimitry Andric assert(Src.IsNewDbgInfoFormat == Dst.IsNewDbgInfoFormat); 11400b57cec5SDimitry Andric 11410b57cec5SDimitry Andric // Copy over the metadata attachments without remapping. 11420b57cec5SDimitry Andric Dst.copyMetadata(&Src, 0); 11430b57cec5SDimitry Andric 11440b57cec5SDimitry Andric // Steal arguments and splice the body of Src into Dst. 11450b57cec5SDimitry Andric Dst.stealArgumentListFrom(Src); 1146bdd1243dSDimitry Andric Dst.splice(Dst.end(), &Src); 11470b57cec5SDimitry Andric 11480b57cec5SDimitry Andric // Everything has been moved over. Remap it. 11490b57cec5SDimitry Andric Mapper.scheduleRemapFunction(Dst); 11500b57cec5SDimitry Andric return Error::success(); 11510b57cec5SDimitry Andric } 11520b57cec5SDimitry Andric 1153349cc55cSDimitry Andric void IRLinker::linkAliasAliasee(GlobalAlias &Dst, GlobalAlias &Src) { 1154349cc55cSDimitry Andric Mapper.scheduleMapGlobalAlias(Dst, *Src.getAliasee(), IndirectSymbolMCID); 1155349cc55cSDimitry Andric } 1156349cc55cSDimitry Andric 1157349cc55cSDimitry Andric void IRLinker::linkIFuncResolver(GlobalIFunc &Dst, GlobalIFunc &Src) { 1158349cc55cSDimitry Andric Mapper.scheduleMapGlobalIFunc(Dst, *Src.getResolver(), IndirectSymbolMCID); 11590b57cec5SDimitry Andric } 11600b57cec5SDimitry Andric 11610b57cec5SDimitry Andric Error IRLinker::linkGlobalValueBody(GlobalValue &Dst, GlobalValue &Src) { 11620b57cec5SDimitry Andric if (auto *F = dyn_cast<Function>(&Src)) 11630b57cec5SDimitry Andric return linkFunctionBody(cast<Function>(Dst), *F); 11640b57cec5SDimitry Andric if (auto *GVar = dyn_cast<GlobalVariable>(&Src)) { 11650b57cec5SDimitry Andric linkGlobalVariable(cast<GlobalVariable>(Dst), *GVar); 11660b57cec5SDimitry Andric return Error::success(); 11670b57cec5SDimitry Andric } 1168349cc55cSDimitry Andric if (auto *GA = dyn_cast<GlobalAlias>(&Src)) { 1169349cc55cSDimitry Andric linkAliasAliasee(cast<GlobalAlias>(Dst), *GA); 1170349cc55cSDimitry Andric return Error::success(); 1171349cc55cSDimitry Andric } 1172349cc55cSDimitry Andric linkIFuncResolver(cast<GlobalIFunc>(Dst), cast<GlobalIFunc>(Src)); 11730b57cec5SDimitry Andric return Error::success(); 11740b57cec5SDimitry Andric } 11750b57cec5SDimitry Andric 11760b57cec5SDimitry Andric void IRLinker::flushRAUWWorklist() { 1177480093f4SDimitry Andric for (const auto &Elem : RAUWWorklist) { 11780b57cec5SDimitry Andric GlobalValue *Old; 11790b57cec5SDimitry Andric Value *New; 11800b57cec5SDimitry Andric std::tie(Old, New) = Elem; 11810b57cec5SDimitry Andric 11820b57cec5SDimitry Andric Old->replaceAllUsesWith(New); 11830b57cec5SDimitry Andric Old->eraseFromParent(); 11840b57cec5SDimitry Andric } 11850b57cec5SDimitry Andric RAUWWorklist.clear(); 11860b57cec5SDimitry Andric } 11870b57cec5SDimitry Andric 11880b57cec5SDimitry Andric void IRLinker::prepareCompileUnitsForImport() { 11890b57cec5SDimitry Andric NamedMDNode *SrcCompileUnits = SrcM->getNamedMetadata("llvm.dbg.cu"); 11900b57cec5SDimitry Andric if (!SrcCompileUnits) 11910b57cec5SDimitry Andric return; 11920b57cec5SDimitry Andric // When importing for ThinLTO, prevent importing of types listed on 11930b57cec5SDimitry Andric // the DICompileUnit that we don't need a copy of in the importing 11940b57cec5SDimitry Andric // module. They will be emitted by the originating module. 1195*0fca6ea1SDimitry Andric for (MDNode *N : SrcCompileUnits->operands()) { 1196*0fca6ea1SDimitry Andric auto *CU = cast<DICompileUnit>(N); 11970b57cec5SDimitry Andric assert(CU && "Expected valid compile unit"); 11980b57cec5SDimitry Andric // Enums, macros, and retained types don't need to be listed on the 11990b57cec5SDimitry Andric // imported DICompileUnit. This means they will only be imported 1200e8d8bef9SDimitry Andric // if reached from the mapped IR. 1201e8d8bef9SDimitry Andric CU->replaceEnumTypes(nullptr); 1202e8d8bef9SDimitry Andric CU->replaceMacros(nullptr); 1203e8d8bef9SDimitry Andric CU->replaceRetainedTypes(nullptr); 1204e8d8bef9SDimitry Andric 12050b57cec5SDimitry Andric // The original definition (or at least its debug info - if the variable is 1206e8d8bef9SDimitry Andric // internalized and optimized away) will remain in the source module, so 12070b57cec5SDimitry Andric // there's no need to import them. 12080b57cec5SDimitry Andric // If LLVM ever does more advanced optimizations on global variables 12090b57cec5SDimitry Andric // (removing/localizing write operations, for instance) that can track 12100b57cec5SDimitry Andric // through debug info, this decision may need to be revisited - but do so 12110b57cec5SDimitry Andric // with care when it comes to debug info size. Emitting small CUs containing 12120b57cec5SDimitry Andric // only a few imported entities into every destination module may be very 12130b57cec5SDimitry Andric // size inefficient. 1214e8d8bef9SDimitry Andric CU->replaceGlobalVariables(nullptr); 12150b57cec5SDimitry Andric 1216e8d8bef9SDimitry Andric CU->replaceImportedEntities(nullptr); 12170b57cec5SDimitry Andric } 12180b57cec5SDimitry Andric } 12190b57cec5SDimitry Andric 12200b57cec5SDimitry Andric /// Insert all of the named MDNodes in Src into the Dest module. 12210b57cec5SDimitry Andric void IRLinker::linkNamedMDNodes() { 12220b57cec5SDimitry Andric const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata(); 12230b57cec5SDimitry Andric for (const NamedMDNode &NMD : SrcM->named_metadata()) { 12240b57cec5SDimitry Andric // Don't link module flags here. Do them separately. 12250b57cec5SDimitry Andric if (&NMD == SrcModFlags) 12260b57cec5SDimitry Andric continue; 1227fe6060f1SDimitry Andric // Don't import pseudo probe descriptors here for thinLTO. They will be 1228fe6060f1SDimitry Andric // emitted by the originating module. 122981ad6265SDimitry Andric if (IsPerformingImport && NMD.getName() == PseudoProbeDescMetadataName) { 123081ad6265SDimitry Andric if (!DstM.getNamedMetadata(NMD.getName())) 123181ad6265SDimitry Andric emitWarning("Pseudo-probe ignored: source module '" + 123281ad6265SDimitry Andric SrcM->getModuleIdentifier() + 123381ad6265SDimitry Andric "' is compiled with -fpseudo-probe-for-profiling while " 123481ad6265SDimitry Andric "destination module '" + 123581ad6265SDimitry Andric DstM.getModuleIdentifier() + "' is not\n"); 1236fe6060f1SDimitry Andric continue; 123781ad6265SDimitry Andric } 1238bdd1243dSDimitry Andric // The stats are computed per module and will all be merged in the binary. 1239bdd1243dSDimitry Andric // Importing the metadata will cause duplication of the stats. 1240bdd1243dSDimitry Andric if (IsPerformingImport && NMD.getName() == "llvm.stats") 1241bdd1243dSDimitry Andric continue; 1242bdd1243dSDimitry Andric 12430b57cec5SDimitry Andric NamedMDNode *DestNMD = DstM.getOrInsertNamedMetadata(NMD.getName()); 12440b57cec5SDimitry Andric // Add Src elements into Dest node. 12450b57cec5SDimitry Andric for (const MDNode *Op : NMD.operands()) 12460b57cec5SDimitry Andric DestNMD->addOperand(Mapper.mapMDNode(*Op)); 12470b57cec5SDimitry Andric } 12480b57cec5SDimitry Andric } 12490b57cec5SDimitry Andric 12500b57cec5SDimitry Andric /// Merge the linker flags in Src into the Dest module. 12510b57cec5SDimitry Andric Error IRLinker::linkModuleFlagsMetadata() { 12520b57cec5SDimitry Andric // If the source module has no module flags, we are done. 12530b57cec5SDimitry Andric const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata(); 12540b57cec5SDimitry Andric if (!SrcModFlags) 12550b57cec5SDimitry Andric return Error::success(); 12560b57cec5SDimitry Andric 125781ad6265SDimitry Andric // Check for module flag for updates before do anything. 125881ad6265SDimitry Andric UpgradeModuleFlags(*SrcM); 125981ad6265SDimitry Andric 12600b57cec5SDimitry Andric // If the destination module doesn't have module flags yet, then just copy 12610b57cec5SDimitry Andric // over the source module's flags. 12620b57cec5SDimitry Andric NamedMDNode *DstModFlags = DstM.getOrInsertModuleFlagsMetadata(); 12630b57cec5SDimitry Andric if (DstModFlags->getNumOperands() == 0) { 12640b57cec5SDimitry Andric for (unsigned I = 0, E = SrcModFlags->getNumOperands(); I != E; ++I) 12650b57cec5SDimitry Andric DstModFlags->addOperand(SrcModFlags->getOperand(I)); 12660b57cec5SDimitry Andric 12670b57cec5SDimitry Andric return Error::success(); 12680b57cec5SDimitry Andric } 12690b57cec5SDimitry Andric 12700b57cec5SDimitry Andric // First build a map of the existing module flags and requirements. 12710b57cec5SDimitry Andric DenseMap<MDString *, std::pair<MDNode *, unsigned>> Flags; 12720b57cec5SDimitry Andric SmallSetVector<MDNode *, 16> Requirements; 1273fcaf7f86SDimitry Andric SmallVector<unsigned, 0> Mins; 1274fcaf7f86SDimitry Andric DenseSet<MDString *> SeenMin; 12750b57cec5SDimitry Andric for (unsigned I = 0, E = DstModFlags->getNumOperands(); I != E; ++I) { 12760b57cec5SDimitry Andric MDNode *Op = DstModFlags->getOperand(I); 1277fcaf7f86SDimitry Andric uint64_t Behavior = 1278fcaf7f86SDimitry Andric mdconst::extract<ConstantInt>(Op->getOperand(0))->getZExtValue(); 12790b57cec5SDimitry Andric MDString *ID = cast<MDString>(Op->getOperand(1)); 12800b57cec5SDimitry Andric 1281fcaf7f86SDimitry Andric if (Behavior == Module::Require) { 12820b57cec5SDimitry Andric Requirements.insert(cast<MDNode>(Op->getOperand(2))); 12830b57cec5SDimitry Andric } else { 1284fcaf7f86SDimitry Andric if (Behavior == Module::Min) 1285fcaf7f86SDimitry Andric Mins.push_back(I); 12860b57cec5SDimitry Andric Flags[ID] = std::make_pair(Op, I); 12870b57cec5SDimitry Andric } 12880b57cec5SDimitry Andric } 12890b57cec5SDimitry Andric 12900b57cec5SDimitry Andric // Merge in the flags from the source module, and also collect its set of 12910b57cec5SDimitry Andric // requirements. 12920b57cec5SDimitry Andric for (unsigned I = 0, E = SrcModFlags->getNumOperands(); I != E; ++I) { 12930b57cec5SDimitry Andric MDNode *SrcOp = SrcModFlags->getOperand(I); 12940b57cec5SDimitry Andric ConstantInt *SrcBehavior = 12950b57cec5SDimitry Andric mdconst::extract<ConstantInt>(SrcOp->getOperand(0)); 12960b57cec5SDimitry Andric MDString *ID = cast<MDString>(SrcOp->getOperand(1)); 12970b57cec5SDimitry Andric MDNode *DstOp; 12980b57cec5SDimitry Andric unsigned DstIndex; 12990b57cec5SDimitry Andric std::tie(DstOp, DstIndex) = Flags.lookup(ID); 13000b57cec5SDimitry Andric unsigned SrcBehaviorValue = SrcBehavior->getZExtValue(); 1301fcaf7f86SDimitry Andric SeenMin.insert(ID); 13020b57cec5SDimitry Andric 13030b57cec5SDimitry Andric // If this is a requirement, add it and continue. 13040b57cec5SDimitry Andric if (SrcBehaviorValue == Module::Require) { 13050b57cec5SDimitry Andric // If the destination module does not already have this requirement, add 13060b57cec5SDimitry Andric // it. 13070b57cec5SDimitry Andric if (Requirements.insert(cast<MDNode>(SrcOp->getOperand(2)))) { 13080b57cec5SDimitry Andric DstModFlags->addOperand(SrcOp); 13090b57cec5SDimitry Andric } 13100b57cec5SDimitry Andric continue; 13110b57cec5SDimitry Andric } 13120b57cec5SDimitry Andric 13130b57cec5SDimitry Andric // If there is no existing flag with this ID, just add it. 13140b57cec5SDimitry Andric if (!DstOp) { 1315fcaf7f86SDimitry Andric if (SrcBehaviorValue == Module::Min) { 1316fcaf7f86SDimitry Andric Mins.push_back(DstModFlags->getNumOperands()); 1317fcaf7f86SDimitry Andric SeenMin.erase(ID); 1318fcaf7f86SDimitry Andric } 13190b57cec5SDimitry Andric Flags[ID] = std::make_pair(SrcOp, DstModFlags->getNumOperands()); 13200b57cec5SDimitry Andric DstModFlags->addOperand(SrcOp); 13210b57cec5SDimitry Andric continue; 13220b57cec5SDimitry Andric } 13230b57cec5SDimitry Andric 13240b57cec5SDimitry Andric // Otherwise, perform a merge. 13250b57cec5SDimitry Andric ConstantInt *DstBehavior = 13260b57cec5SDimitry Andric mdconst::extract<ConstantInt>(DstOp->getOperand(0)); 13270b57cec5SDimitry Andric unsigned DstBehaviorValue = DstBehavior->getZExtValue(); 13280b57cec5SDimitry Andric 13290b57cec5SDimitry Andric auto overrideDstValue = [&]() { 13300b57cec5SDimitry Andric DstModFlags->setOperand(DstIndex, SrcOp); 13310b57cec5SDimitry Andric Flags[ID].first = SrcOp; 13320b57cec5SDimitry Andric }; 13330b57cec5SDimitry Andric 13340b57cec5SDimitry Andric // If either flag has override behavior, handle it first. 13350b57cec5SDimitry Andric if (DstBehaviorValue == Module::Override) { 13360b57cec5SDimitry Andric // Diagnose inconsistent flags which both have override behavior. 13370b57cec5SDimitry Andric if (SrcBehaviorValue == Module::Override && 13380b57cec5SDimitry Andric SrcOp->getOperand(2) != DstOp->getOperand(2)) 13390b57cec5SDimitry Andric return stringErr("linking module flags '" + ID->getString() + 13400b57cec5SDimitry Andric "': IDs have conflicting override values in '" + 13410b57cec5SDimitry Andric SrcM->getModuleIdentifier() + "' and '" + 13420b57cec5SDimitry Andric DstM.getModuleIdentifier() + "'"); 13430b57cec5SDimitry Andric continue; 13440b57cec5SDimitry Andric } else if (SrcBehaviorValue == Module::Override) { 13450b57cec5SDimitry Andric // Update the destination flag to that of the source. 13460b57cec5SDimitry Andric overrideDstValue(); 13470b57cec5SDimitry Andric continue; 13480b57cec5SDimitry Andric } 13490b57cec5SDimitry Andric 13500b57cec5SDimitry Andric // Diagnose inconsistent merge behavior types. 135113138422SDimitry Andric if (SrcBehaviorValue != DstBehaviorValue) { 135281ad6265SDimitry Andric bool MinAndWarn = (SrcBehaviorValue == Module::Min && 135381ad6265SDimitry Andric DstBehaviorValue == Module::Warning) || 135481ad6265SDimitry Andric (DstBehaviorValue == Module::Min && 135581ad6265SDimitry Andric SrcBehaviorValue == Module::Warning); 135613138422SDimitry Andric bool MaxAndWarn = (SrcBehaviorValue == Module::Max && 135713138422SDimitry Andric DstBehaviorValue == Module::Warning) || 135813138422SDimitry Andric (DstBehaviorValue == Module::Max && 135913138422SDimitry Andric SrcBehaviorValue == Module::Warning); 136081ad6265SDimitry Andric if (!(MaxAndWarn || MinAndWarn)) 13610b57cec5SDimitry Andric return stringErr("linking module flags '" + ID->getString() + 13620b57cec5SDimitry Andric "': IDs have conflicting behaviors in '" + 13630b57cec5SDimitry Andric SrcM->getModuleIdentifier() + "' and '" + 13640b57cec5SDimitry Andric DstM.getModuleIdentifier() + "'"); 136513138422SDimitry Andric } 13660b57cec5SDimitry Andric 1367753f127fSDimitry Andric auto ensureDistinctOp = [&](MDNode *DstValue) { 1368753f127fSDimitry Andric assert(isa<MDTuple>(DstValue) && 1369753f127fSDimitry Andric "Expected MDTuple when appending module flags"); 1370753f127fSDimitry Andric if (DstValue->isDistinct()) 1371753f127fSDimitry Andric return dyn_cast<MDTuple>(DstValue); 1372fcaf7f86SDimitry Andric ArrayRef<MDOperand> DstOperands = DstValue->operands(); 1373753f127fSDimitry Andric MDTuple *New = MDTuple::getDistinct( 1374fcaf7f86SDimitry Andric DstM.getContext(), 1375fcaf7f86SDimitry Andric SmallVector<Metadata *, 4>(DstOperands.begin(), DstOperands.end())); 13760b57cec5SDimitry Andric Metadata *FlagOps[] = {DstOp->getOperand(0), ID, New}; 1377753f127fSDimitry Andric MDNode *Flag = MDTuple::getDistinct(DstM.getContext(), FlagOps); 13780b57cec5SDimitry Andric DstModFlags->setOperand(DstIndex, Flag); 13790b57cec5SDimitry Andric Flags[ID].first = Flag; 1380753f127fSDimitry Andric return New; 13810b57cec5SDimitry Andric }; 13820b57cec5SDimitry Andric 138313138422SDimitry Andric // Emit a warning if the values differ and either source or destination 138413138422SDimitry Andric // request Warning behavior. 138513138422SDimitry Andric if ((DstBehaviorValue == Module::Warning || 138613138422SDimitry Andric SrcBehaviorValue == Module::Warning) && 138713138422SDimitry Andric SrcOp->getOperand(2) != DstOp->getOperand(2)) { 138813138422SDimitry Andric std::string Str; 138913138422SDimitry Andric raw_string_ostream(Str) 139013138422SDimitry Andric << "linking module flags '" << ID->getString() 139113138422SDimitry Andric << "': IDs have conflicting values ('" << *SrcOp->getOperand(2) 139213138422SDimitry Andric << "' from " << SrcM->getModuleIdentifier() << " with '" 139313138422SDimitry Andric << *DstOp->getOperand(2) << "' from " << DstM.getModuleIdentifier() 139413138422SDimitry Andric << ')'; 139513138422SDimitry Andric emitWarning(Str); 139613138422SDimitry Andric } 139713138422SDimitry Andric 139881ad6265SDimitry Andric // Choose the minimum if either source or destination request Min behavior. 139981ad6265SDimitry Andric if (DstBehaviorValue == Module::Min || SrcBehaviorValue == Module::Min) { 140081ad6265SDimitry Andric ConstantInt *DstValue = 140181ad6265SDimitry Andric mdconst::extract<ConstantInt>(DstOp->getOperand(2)); 140281ad6265SDimitry Andric ConstantInt *SrcValue = 140381ad6265SDimitry Andric mdconst::extract<ConstantInt>(SrcOp->getOperand(2)); 140481ad6265SDimitry Andric 140581ad6265SDimitry Andric // The resulting flag should have a Min behavior, and contain the minimum 140681ad6265SDimitry Andric // value from between the source and destination values. 140781ad6265SDimitry Andric Metadata *FlagOps[] = { 140881ad6265SDimitry Andric (DstBehaviorValue != Module::Min ? SrcOp : DstOp)->getOperand(0), ID, 140981ad6265SDimitry Andric (SrcValue->getZExtValue() < DstValue->getZExtValue() ? SrcOp : DstOp) 141081ad6265SDimitry Andric ->getOperand(2)}; 141181ad6265SDimitry Andric MDNode *Flag = MDNode::get(DstM.getContext(), FlagOps); 141281ad6265SDimitry Andric DstModFlags->setOperand(DstIndex, Flag); 141381ad6265SDimitry Andric Flags[ID].first = Flag; 141481ad6265SDimitry Andric continue; 141581ad6265SDimitry Andric } 141681ad6265SDimitry Andric 141713138422SDimitry Andric // Choose the maximum if either source or destination request Max behavior. 141813138422SDimitry Andric if (DstBehaviorValue == Module::Max || SrcBehaviorValue == Module::Max) { 141913138422SDimitry Andric ConstantInt *DstValue = 142013138422SDimitry Andric mdconst::extract<ConstantInt>(DstOp->getOperand(2)); 142113138422SDimitry Andric ConstantInt *SrcValue = 142213138422SDimitry Andric mdconst::extract<ConstantInt>(SrcOp->getOperand(2)); 142313138422SDimitry Andric 142413138422SDimitry Andric // The resulting flag should have a Max behavior, and contain the maximum 142513138422SDimitry Andric // value from between the source and destination values. 142613138422SDimitry Andric Metadata *FlagOps[] = { 142713138422SDimitry Andric (DstBehaviorValue != Module::Max ? SrcOp : DstOp)->getOperand(0), ID, 142813138422SDimitry Andric (SrcValue->getZExtValue() > DstValue->getZExtValue() ? SrcOp : DstOp) 142913138422SDimitry Andric ->getOperand(2)}; 143013138422SDimitry Andric MDNode *Flag = MDNode::get(DstM.getContext(), FlagOps); 143113138422SDimitry Andric DstModFlags->setOperand(DstIndex, Flag); 143213138422SDimitry Andric Flags[ID].first = Flag; 143313138422SDimitry Andric continue; 143413138422SDimitry Andric } 143513138422SDimitry Andric 14360b57cec5SDimitry Andric // Perform the merge for standard behavior types. 14370b57cec5SDimitry Andric switch (SrcBehaviorValue) { 14380b57cec5SDimitry Andric case Module::Require: 14390b57cec5SDimitry Andric case Module::Override: 14400b57cec5SDimitry Andric llvm_unreachable("not possible"); 14410b57cec5SDimitry Andric case Module::Error: { 14420b57cec5SDimitry Andric // Emit an error if the values differ. 14430b57cec5SDimitry Andric if (SrcOp->getOperand(2) != DstOp->getOperand(2)) 14440b57cec5SDimitry Andric return stringErr("linking module flags '" + ID->getString() + 14450b57cec5SDimitry Andric "': IDs have conflicting values in '" + 14460b57cec5SDimitry Andric SrcM->getModuleIdentifier() + "' and '" + 14470b57cec5SDimitry Andric DstM.getModuleIdentifier() + "'"); 14480b57cec5SDimitry Andric continue; 14490b57cec5SDimitry Andric } 14500b57cec5SDimitry Andric case Module::Warning: { 145113138422SDimitry Andric break; 14520b57cec5SDimitry Andric } 14530b57cec5SDimitry Andric case Module::Max: { 14540b57cec5SDimitry Andric break; 14550b57cec5SDimitry Andric } 14560b57cec5SDimitry Andric case Module::Append: { 1457753f127fSDimitry Andric MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(DstOp->getOperand(2))); 14580b57cec5SDimitry Andric MDNode *SrcValue = cast<MDNode>(SrcOp->getOperand(2)); 1459753f127fSDimitry Andric for (const auto &O : SrcValue->operands()) 1460753f127fSDimitry Andric DstValue->push_back(O); 14610b57cec5SDimitry Andric break; 14620b57cec5SDimitry Andric } 14630b57cec5SDimitry Andric case Module::AppendUnique: { 14640b57cec5SDimitry Andric SmallSetVector<Metadata *, 16> Elts; 1465753f127fSDimitry Andric MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(DstOp->getOperand(2))); 14660b57cec5SDimitry Andric MDNode *SrcValue = cast<MDNode>(SrcOp->getOperand(2)); 14670b57cec5SDimitry Andric Elts.insert(DstValue->op_begin(), DstValue->op_end()); 14680b57cec5SDimitry Andric Elts.insert(SrcValue->op_begin(), SrcValue->op_end()); 1469753f127fSDimitry Andric for (auto I = DstValue->getNumOperands(); I < Elts.size(); I++) 1470753f127fSDimitry Andric DstValue->push_back(Elts[I]); 14710b57cec5SDimitry Andric break; 14720b57cec5SDimitry Andric } 14730b57cec5SDimitry Andric } 147413138422SDimitry Andric 14750b57cec5SDimitry Andric } 14760b57cec5SDimitry Andric 1477fcaf7f86SDimitry Andric // For the Min behavior, set the value to 0 if either module does not have the 1478fcaf7f86SDimitry Andric // flag. 1479fcaf7f86SDimitry Andric for (auto Idx : Mins) { 1480fcaf7f86SDimitry Andric MDNode *Op = DstModFlags->getOperand(Idx); 1481fcaf7f86SDimitry Andric MDString *ID = cast<MDString>(Op->getOperand(1)); 1482fcaf7f86SDimitry Andric if (!SeenMin.count(ID)) { 1483fcaf7f86SDimitry Andric ConstantInt *V = mdconst::extract<ConstantInt>(Op->getOperand(2)); 1484fcaf7f86SDimitry Andric Metadata *FlagOps[] = { 1485fcaf7f86SDimitry Andric Op->getOperand(0), ID, 1486fcaf7f86SDimitry Andric ConstantAsMetadata::get(ConstantInt::get(V->getType(), 0))}; 1487fcaf7f86SDimitry Andric DstModFlags->setOperand(Idx, MDNode::get(DstM.getContext(), FlagOps)); 1488fcaf7f86SDimitry Andric } 1489fcaf7f86SDimitry Andric } 1490fcaf7f86SDimitry Andric 14910b57cec5SDimitry Andric // Check all of the requirements. 1492*0fca6ea1SDimitry Andric for (MDNode *Requirement : Requirements) { 14930b57cec5SDimitry Andric MDString *Flag = cast<MDString>(Requirement->getOperand(0)); 14940b57cec5SDimitry Andric Metadata *ReqValue = Requirement->getOperand(1); 14950b57cec5SDimitry Andric 14960b57cec5SDimitry Andric MDNode *Op = Flags[Flag].first; 14970b57cec5SDimitry Andric if (!Op || Op->getOperand(2) != ReqValue) 14980b57cec5SDimitry Andric return stringErr("linking module flags '" + Flag->getString() + 14990b57cec5SDimitry Andric "': does not have the required value"); 15000b57cec5SDimitry Andric } 15010b57cec5SDimitry Andric return Error::success(); 15020b57cec5SDimitry Andric } 15030b57cec5SDimitry Andric 15040b57cec5SDimitry Andric /// Return InlineAsm adjusted with target-specific directives if required. 15050b57cec5SDimitry Andric /// For ARM and Thumb, we have to add directives to select the appropriate ISA 15060b57cec5SDimitry Andric /// to support mixing module-level inline assembly from ARM and Thumb modules. 15070b57cec5SDimitry Andric static std::string adjustInlineAsm(const std::string &InlineAsm, 15080b57cec5SDimitry Andric const Triple &Triple) { 15090b57cec5SDimitry Andric if (Triple.getArch() == Triple::thumb || Triple.getArch() == Triple::thumbeb) 15100b57cec5SDimitry Andric return ".text\n.balign 2\n.thumb\n" + InlineAsm; 15110b57cec5SDimitry Andric if (Triple.getArch() == Triple::arm || Triple.getArch() == Triple::armeb) 15120b57cec5SDimitry Andric return ".text\n.balign 4\n.arm\n" + InlineAsm; 15130b57cec5SDimitry Andric return InlineAsm; 15140b57cec5SDimitry Andric } 15150b57cec5SDimitry Andric 1516bdd1243dSDimitry Andric void IRLinker::updateAttributes(GlobalValue &GV) { 1517bdd1243dSDimitry Andric /// Remove nocallback attribute while linking, because nocallback attribute 1518bdd1243dSDimitry Andric /// indicates that the function is only allowed to jump back into caller's 1519bdd1243dSDimitry Andric /// module only by a return or an exception. When modules are linked, this 1520bdd1243dSDimitry Andric /// property cannot be guaranteed anymore. For example, the nocallback 1521bdd1243dSDimitry Andric /// function may contain a call to another module. But if we merge its caller 1522bdd1243dSDimitry Andric /// and callee module here, and not the module containing the nocallback 1523bdd1243dSDimitry Andric /// function definition itself, the nocallback property will be violated 1524bdd1243dSDimitry Andric /// (since the nocallback function will call back into the newly merged module 1525bdd1243dSDimitry Andric /// containing both its caller and callee). This could happen if the module 1526bdd1243dSDimitry Andric /// containing the nocallback function definition is native code, so it does 1527bdd1243dSDimitry Andric /// not participate in the LTO link. Note if the nocallback function does 1528bdd1243dSDimitry Andric /// participate in the LTO link, and thus ends up in the merged module 1529bdd1243dSDimitry Andric /// containing its caller and callee, removing the attribute doesn't hurt as 1530bdd1243dSDimitry Andric /// it has no effect on definitions in the same module. 1531bdd1243dSDimitry Andric if (auto *F = dyn_cast<Function>(&GV)) { 1532bdd1243dSDimitry Andric if (!F->isIntrinsic()) 1533bdd1243dSDimitry Andric F->removeFnAttr(llvm::Attribute::NoCallback); 1534bdd1243dSDimitry Andric 1535bdd1243dSDimitry Andric // Remove nocallback attribute when it is on a call-site. 1536bdd1243dSDimitry Andric for (BasicBlock &BB : *F) 1537bdd1243dSDimitry Andric for (Instruction &I : BB) 1538bdd1243dSDimitry Andric if (CallBase *CI = dyn_cast<CallBase>(&I)) 1539bdd1243dSDimitry Andric CI->removeFnAttr(Attribute::NoCallback); 1540bdd1243dSDimitry Andric } 1541bdd1243dSDimitry Andric } 1542bdd1243dSDimitry Andric 15430b57cec5SDimitry Andric Error IRLinker::run() { 15440b57cec5SDimitry Andric // Ensure metadata materialized before value mapping. 15450b57cec5SDimitry Andric if (SrcM->getMaterializer()) 15460b57cec5SDimitry Andric if (Error Err = SrcM->getMaterializer()->materializeMetadata()) 15470b57cec5SDimitry Andric return Err; 15480b57cec5SDimitry Andric 1549*0fca6ea1SDimitry Andric // Convert source module to match dest for the duration of the link. 1550*0fca6ea1SDimitry Andric ScopedDbgInfoFormatSetter FormatSetter(*SrcM, DstM.IsNewDbgInfoFormat); 15515f757f3fSDimitry Andric 1552*0fca6ea1SDimitry Andric // Inherit the target data from the source module if the destination 1553*0fca6ea1SDimitry Andric // module doesn't have one already. 15540b57cec5SDimitry Andric if (DstM.getDataLayout().isDefault()) 15550b57cec5SDimitry Andric DstM.setDataLayout(SrcM->getDataLayout()); 15560b57cec5SDimitry Andric 1557349cc55cSDimitry Andric // Copy the target triple from the source to dest if the dest's is empty. 1558349cc55cSDimitry Andric if (DstM.getTargetTriple().empty() && !SrcM->getTargetTriple().empty()) 1559349cc55cSDimitry Andric DstM.setTargetTriple(SrcM->getTargetTriple()); 1560349cc55cSDimitry Andric 1561349cc55cSDimitry Andric Triple SrcTriple(SrcM->getTargetTriple()), DstTriple(DstM.getTargetTriple()); 1562349cc55cSDimitry Andric 1563349cc55cSDimitry Andric // During CUDA compilation we have to link with the bitcode supplied with 1564349cc55cSDimitry Andric // CUDA. libdevice bitcode either has no data layout set (pre-CUDA-11), or has 1565349cc55cSDimitry Andric // the layout that is different from the one used by LLVM/clang (it does not 1566349cc55cSDimitry Andric // include i128). Issuing a warning is not very helpful as there's not much 1567349cc55cSDimitry Andric // the user can do about it. 1568349cc55cSDimitry Andric bool EnableDLWarning = true; 1569349cc55cSDimitry Andric bool EnableTripleWarning = true; 1570349cc55cSDimitry Andric if (SrcTriple.isNVPTX() && DstTriple.isNVPTX()) { 1571349cc55cSDimitry Andric std::string ModuleId = SrcM->getModuleIdentifier(); 1572349cc55cSDimitry Andric StringRef FileName = llvm::sys::path::filename(ModuleId); 1573349cc55cSDimitry Andric bool SrcIsLibDevice = 15745f757f3fSDimitry Andric FileName.starts_with("libdevice") && FileName.ends_with(".10.bc"); 1575349cc55cSDimitry Andric bool SrcHasLibDeviceDL = 1576349cc55cSDimitry Andric (SrcM->getDataLayoutStr().empty() || 1577349cc55cSDimitry Andric SrcM->getDataLayoutStr() == "e-i64:64-v16:16-v32:32-n16:32:64"); 1578349cc55cSDimitry Andric // libdevice bitcode uses nvptx64-nvidia-gpulibs or just 1579349cc55cSDimitry Andric // 'nvptx-unknown-unknown' triple (before CUDA-10.x) and is compatible with 1580349cc55cSDimitry Andric // all NVPTX variants. 1581349cc55cSDimitry Andric bool SrcHasLibDeviceTriple = (SrcTriple.getVendor() == Triple::NVIDIA && 1582349cc55cSDimitry Andric SrcTriple.getOSName() == "gpulibs") || 1583349cc55cSDimitry Andric (SrcTriple.getVendorName() == "unknown" && 1584349cc55cSDimitry Andric SrcTriple.getOSName() == "unknown"); 1585349cc55cSDimitry Andric EnableTripleWarning = !(SrcIsLibDevice && SrcHasLibDeviceTriple); 1586349cc55cSDimitry Andric EnableDLWarning = !(SrcIsLibDevice && SrcHasLibDeviceDL); 1587349cc55cSDimitry Andric } 1588349cc55cSDimitry Andric 1589349cc55cSDimitry Andric if (EnableDLWarning && (SrcM->getDataLayout() != DstM.getDataLayout())) { 15900b57cec5SDimitry Andric emitWarning("Linking two modules of different data layouts: '" + 15910b57cec5SDimitry Andric SrcM->getModuleIdentifier() + "' is '" + 15920b57cec5SDimitry Andric SrcM->getDataLayoutStr() + "' whereas '" + 15930b57cec5SDimitry Andric DstM.getModuleIdentifier() + "' is '" + 15940b57cec5SDimitry Andric DstM.getDataLayoutStr() + "'\n"); 15950b57cec5SDimitry Andric } 15960b57cec5SDimitry Andric 1597349cc55cSDimitry Andric if (EnableTripleWarning && !SrcM->getTargetTriple().empty() && 15980b57cec5SDimitry Andric !SrcTriple.isCompatibleWith(DstTriple)) 1599e8d8bef9SDimitry Andric emitWarning("Linking two modules of different target triples: '" + 16000b57cec5SDimitry Andric SrcM->getModuleIdentifier() + "' is '" + 16010b57cec5SDimitry Andric SrcM->getTargetTriple() + "' whereas '" + 16020b57cec5SDimitry Andric DstM.getModuleIdentifier() + "' is '" + DstM.getTargetTriple() + 16030b57cec5SDimitry Andric "'\n"); 16040b57cec5SDimitry Andric 16050b57cec5SDimitry Andric DstM.setTargetTriple(SrcTriple.merge(DstTriple)); 16060b57cec5SDimitry Andric 16070b57cec5SDimitry Andric // Loop over all of the linked values to compute type mappings. 16080b57cec5SDimitry Andric computeTypeMapping(); 16090b57cec5SDimitry Andric 16100b57cec5SDimitry Andric std::reverse(Worklist.begin(), Worklist.end()); 16110b57cec5SDimitry Andric while (!Worklist.empty()) { 16120b57cec5SDimitry Andric GlobalValue *GV = Worklist.back(); 16130b57cec5SDimitry Andric Worklist.pop_back(); 16140b57cec5SDimitry Andric 16150b57cec5SDimitry Andric // Already mapped. 16160b57cec5SDimitry Andric if (ValueMap.find(GV) != ValueMap.end() || 16178bcb0991SDimitry Andric IndirectSymbolValueMap.find(GV) != IndirectSymbolValueMap.end()) 16180b57cec5SDimitry Andric continue; 16190b57cec5SDimitry Andric 16200b57cec5SDimitry Andric assert(!GV->isDeclaration()); 16210b57cec5SDimitry Andric Mapper.mapValue(*GV); 16220b57cec5SDimitry Andric if (FoundError) 16230b57cec5SDimitry Andric return std::move(*FoundError); 16240b57cec5SDimitry Andric flushRAUWWorklist(); 16250b57cec5SDimitry Andric } 16260b57cec5SDimitry Andric 16270b57cec5SDimitry Andric // Note that we are done linking global value bodies. This prevents 16280b57cec5SDimitry Andric // metadata linking from creating new references. 16290b57cec5SDimitry Andric DoneLinkingBodies = true; 16300b57cec5SDimitry Andric Mapper.addFlags(RF_NullMapMissingGlobalValues); 16310b57cec5SDimitry Andric 16320b57cec5SDimitry Andric // Remap all of the named MDNodes in Src into the DstM module. We do this 16330b57cec5SDimitry Andric // after linking GlobalValues so that MDNodes that reference GlobalValues 16340b57cec5SDimitry Andric // are properly remapped. 16350b57cec5SDimitry Andric linkNamedMDNodes(); 16360b57cec5SDimitry Andric 163706c3fb27SDimitry Andric // Clean up any global objects with potentially unmapped metadata. 163806c3fb27SDimitry Andric // Specifically declarations which did not become definitions. 163906c3fb27SDimitry Andric for (GlobalObject *NGO : UnmappedMetadata) { 164006c3fb27SDimitry Andric if (NGO->isDeclaration()) 164106c3fb27SDimitry Andric Mapper.remapGlobalObjectMetadata(*NGO); 164206c3fb27SDimitry Andric } 164306c3fb27SDimitry Andric 1644e8d8bef9SDimitry Andric if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) { 1645e8d8bef9SDimitry Andric // Append the module inline asm string. 1646e8d8bef9SDimitry Andric DstM.appendModuleInlineAsm(adjustInlineAsm(SrcM->getModuleInlineAsm(), 1647e8d8bef9SDimitry Andric SrcTriple)); 1648e8d8bef9SDimitry Andric } else if (IsPerformingImport) { 1649e8d8bef9SDimitry Andric // Import any symver directives for symbols in DstM. 1650e8d8bef9SDimitry Andric ModuleSymbolTable::CollectAsmSymvers(*SrcM, 1651e8d8bef9SDimitry Andric [&](StringRef Name, StringRef Alias) { 1652e8d8bef9SDimitry Andric if (DstM.getNamedValue(Name)) { 1653e8d8bef9SDimitry Andric SmallString<256> S(".symver "); 1654e8d8bef9SDimitry Andric S += Name; 1655e8d8bef9SDimitry Andric S += ", "; 1656e8d8bef9SDimitry Andric S += Alias; 1657e8d8bef9SDimitry Andric DstM.appendModuleInlineAsm(S); 1658e8d8bef9SDimitry Andric } 1659e8d8bef9SDimitry Andric }); 1660e8d8bef9SDimitry Andric } 1661e8d8bef9SDimitry Andric 1662fe6060f1SDimitry Andric // Reorder the globals just added to the destination module to match their 1663fe6060f1SDimitry Andric // original order in the source module. 1664fe6060f1SDimitry Andric for (GlobalVariable &GV : SrcM->globals()) { 1665fe6060f1SDimitry Andric if (GV.hasAppendingLinkage()) 1666fe6060f1SDimitry Andric continue; 1667fe6060f1SDimitry Andric Value *NewValue = Mapper.mapValue(GV); 1668fe6060f1SDimitry Andric if (NewValue) { 1669fe6060f1SDimitry Andric auto *NewGV = dyn_cast<GlobalVariable>(NewValue->stripPointerCasts()); 167006c3fb27SDimitry Andric if (NewGV) { 167106c3fb27SDimitry Andric NewGV->removeFromParent(); 167206c3fb27SDimitry Andric DstM.insertGlobalVariable(NewGV); 167306c3fb27SDimitry Andric } 1674fe6060f1SDimitry Andric } 1675fe6060f1SDimitry Andric } 1676fe6060f1SDimitry Andric 16770b57cec5SDimitry Andric // Merge the module flags into the DstM module. 16780b57cec5SDimitry Andric return linkModuleFlagsMetadata(); 16790b57cec5SDimitry Andric } 16800b57cec5SDimitry Andric 16810b57cec5SDimitry Andric IRMover::StructTypeKeyInfo::KeyTy::KeyTy(ArrayRef<Type *> E, bool P) 16820b57cec5SDimitry Andric : ETypes(E), IsPacked(P) {} 16830b57cec5SDimitry Andric 16840b57cec5SDimitry Andric IRMover::StructTypeKeyInfo::KeyTy::KeyTy(const StructType *ST) 16850b57cec5SDimitry Andric : ETypes(ST->elements()), IsPacked(ST->isPacked()) {} 16860b57cec5SDimitry Andric 16870b57cec5SDimitry Andric bool IRMover::StructTypeKeyInfo::KeyTy::operator==(const KeyTy &That) const { 16880b57cec5SDimitry Andric return IsPacked == That.IsPacked && ETypes == That.ETypes; 16890b57cec5SDimitry Andric } 16900b57cec5SDimitry Andric 16910b57cec5SDimitry Andric bool IRMover::StructTypeKeyInfo::KeyTy::operator!=(const KeyTy &That) const { 16920b57cec5SDimitry Andric return !this->operator==(That); 16930b57cec5SDimitry Andric } 16940b57cec5SDimitry Andric 16950b57cec5SDimitry Andric StructType *IRMover::StructTypeKeyInfo::getEmptyKey() { 16960b57cec5SDimitry Andric return DenseMapInfo<StructType *>::getEmptyKey(); 16970b57cec5SDimitry Andric } 16980b57cec5SDimitry Andric 16990b57cec5SDimitry Andric StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() { 17000b57cec5SDimitry Andric return DenseMapInfo<StructType *>::getTombstoneKey(); 17010b57cec5SDimitry Andric } 17020b57cec5SDimitry Andric 17030b57cec5SDimitry Andric unsigned IRMover::StructTypeKeyInfo::getHashValue(const KeyTy &Key) { 17040b57cec5SDimitry Andric return hash_combine(hash_combine_range(Key.ETypes.begin(), Key.ETypes.end()), 17050b57cec5SDimitry Andric Key.IsPacked); 17060b57cec5SDimitry Andric } 17070b57cec5SDimitry Andric 17080b57cec5SDimitry Andric unsigned IRMover::StructTypeKeyInfo::getHashValue(const StructType *ST) { 17090b57cec5SDimitry Andric return getHashValue(KeyTy(ST)); 17100b57cec5SDimitry Andric } 17110b57cec5SDimitry Andric 17120b57cec5SDimitry Andric bool IRMover::StructTypeKeyInfo::isEqual(const KeyTy &LHS, 17130b57cec5SDimitry Andric const StructType *RHS) { 17140b57cec5SDimitry Andric if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 17150b57cec5SDimitry Andric return false; 17160b57cec5SDimitry Andric return LHS == KeyTy(RHS); 17170b57cec5SDimitry Andric } 17180b57cec5SDimitry Andric 17190b57cec5SDimitry Andric bool IRMover::StructTypeKeyInfo::isEqual(const StructType *LHS, 17200b57cec5SDimitry Andric const StructType *RHS) { 17210b57cec5SDimitry Andric if (RHS == getEmptyKey() || RHS == getTombstoneKey()) 17220b57cec5SDimitry Andric return LHS == RHS; 17230b57cec5SDimitry Andric return KeyTy(LHS) == KeyTy(RHS); 17240b57cec5SDimitry Andric } 17250b57cec5SDimitry Andric 17260b57cec5SDimitry Andric void IRMover::IdentifiedStructTypeSet::addNonOpaque(StructType *Ty) { 17270b57cec5SDimitry Andric assert(!Ty->isOpaque()); 17280b57cec5SDimitry Andric NonOpaqueStructTypes.insert(Ty); 17290b57cec5SDimitry Andric } 17300b57cec5SDimitry Andric 17310b57cec5SDimitry Andric void IRMover::IdentifiedStructTypeSet::switchToNonOpaque(StructType *Ty) { 17320b57cec5SDimitry Andric assert(!Ty->isOpaque()); 17330b57cec5SDimitry Andric NonOpaqueStructTypes.insert(Ty); 17340b57cec5SDimitry Andric bool Removed = OpaqueStructTypes.erase(Ty); 17350b57cec5SDimitry Andric (void)Removed; 17360b57cec5SDimitry Andric assert(Removed); 17370b57cec5SDimitry Andric } 17380b57cec5SDimitry Andric 17390b57cec5SDimitry Andric void IRMover::IdentifiedStructTypeSet::addOpaque(StructType *Ty) { 17400b57cec5SDimitry Andric assert(Ty->isOpaque()); 17410b57cec5SDimitry Andric OpaqueStructTypes.insert(Ty); 17420b57cec5SDimitry Andric } 17430b57cec5SDimitry Andric 17440b57cec5SDimitry Andric StructType * 17450b57cec5SDimitry Andric IRMover::IdentifiedStructTypeSet::findNonOpaque(ArrayRef<Type *> ETypes, 17460b57cec5SDimitry Andric bool IsPacked) { 17470b57cec5SDimitry Andric IRMover::StructTypeKeyInfo::KeyTy Key(ETypes, IsPacked); 17480b57cec5SDimitry Andric auto I = NonOpaqueStructTypes.find_as(Key); 17490b57cec5SDimitry Andric return I == NonOpaqueStructTypes.end() ? nullptr : *I; 17500b57cec5SDimitry Andric } 17510b57cec5SDimitry Andric 17520b57cec5SDimitry Andric bool IRMover::IdentifiedStructTypeSet::hasType(StructType *Ty) { 17530b57cec5SDimitry Andric if (Ty->isOpaque()) 17540b57cec5SDimitry Andric return OpaqueStructTypes.count(Ty); 17550b57cec5SDimitry Andric auto I = NonOpaqueStructTypes.find(Ty); 17560b57cec5SDimitry Andric return I == NonOpaqueStructTypes.end() ? false : *I == Ty; 17570b57cec5SDimitry Andric } 17580b57cec5SDimitry Andric 17590b57cec5SDimitry Andric IRMover::IRMover(Module &M) : Composite(M) { 17600b57cec5SDimitry Andric TypeFinder StructTypes; 17610b57cec5SDimitry Andric StructTypes.run(M, /* OnlyNamed */ false); 17620b57cec5SDimitry Andric for (StructType *Ty : StructTypes) { 17630b57cec5SDimitry Andric if (Ty->isOpaque()) 17640b57cec5SDimitry Andric IdentifiedStructTypes.addOpaque(Ty); 17650b57cec5SDimitry Andric else 17660b57cec5SDimitry Andric IdentifiedStructTypes.addNonOpaque(Ty); 17670b57cec5SDimitry Andric } 17680b57cec5SDimitry Andric // Self-map metadatas in the destination module. This is needed when 17690b57cec5SDimitry Andric // DebugTypeODRUniquing is enabled on the LLVMContext, since metadata in the 17700b57cec5SDimitry Andric // destination module may be reached from the source module. 1771bdd1243dSDimitry Andric for (const auto *MD : StructTypes.getVisitedMetadata()) { 17720b57cec5SDimitry Andric SharedMDs[MD].reset(const_cast<MDNode *>(MD)); 17730b57cec5SDimitry Andric } 17740b57cec5SDimitry Andric } 17750b57cec5SDimitry Andric 177681ad6265SDimitry Andric Error IRMover::move(std::unique_ptr<Module> Src, 177781ad6265SDimitry Andric ArrayRef<GlobalValue *> ValuesToLink, 177881ad6265SDimitry Andric LazyCallback AddLazyFor, bool IsPerformingImport) { 17790b57cec5SDimitry Andric IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes, 17800b57cec5SDimitry Andric std::move(Src), ValuesToLink, std::move(AddLazyFor), 17810b57cec5SDimitry Andric IsPerformingImport); 17820b57cec5SDimitry Andric Error E = TheIRLinker.run(); 17830b57cec5SDimitry Andric Composite.dropTriviallyDeadConstantArrays(); 17840b57cec5SDimitry Andric return E; 17850b57cec5SDimitry Andric } 1786