diff --git a/include/llvm/Linker/Linker.h b/include/llvm/Linker/Linker.h index 88d41c1b0a0..c3b55c4b635 100644 --- a/include/llvm/Linker/Linker.h +++ b/include/llvm/Linker/Linker.h @@ -46,7 +46,6 @@ public: private: void init(Module *M, DiagnosticHandlerFunction DiagnosticHandler); Module *Composite; - SmallPtrSet IdentifiedStructTypes; DiagnosticHandlerFunction DiagnosticHandler; }; diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 8822a3ae0a5..e1dd2e12d72 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -58,9 +58,8 @@ class TypeMapTy : public ValueMapTypeRemapper { SmallPtrSet DstResolvedOpaqueTypes; public: - TypeMapTy(TypeSet &Set) : DstStructTypesSet(Set) {} + TypeMapTy() {} - TypeSet &DstStructTypesSet; /// Indicate that the specified type in the destination module is conceptually /// equivalent to the specified type in the source module. void addTypeMapping(Type *DstTy, Type *SrcTy); @@ -111,6 +110,11 @@ void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) { SpeculativeDstOpaqueTypes.size()); for (StructType *Ty : SpeculativeDstOpaqueTypes) DstResolvedOpaqueTypes.erase(Ty); + } else { + for (Type *Ty : SpeculativeTypes) + if (auto *STy = dyn_cast(Ty)) + if (STy->hasName()) + STy->setName(""); } SpeculativeTypes.clear(); SpeculativeDstOpaqueTypes.clear(); @@ -306,7 +310,6 @@ Type *TypeMapTy::get(Type *Ty) { if (STy->isOpaque()) { // A named structure type from src module is used. Add it to the Set of // identified structs in the destination module. - DstStructTypesSet.insert(STy); return *Entry = STy; } @@ -314,7 +317,6 @@ Type *TypeMapTy::get(Type *Ty) { StructType *DTy = StructType::create(STy->getContext()); // A new identified structure type was created. Add it to the set of // identified structs in the destination module. - DstStructTypesSet.insert(DTy); *Entry = DTy; SmallVector ElementTypes; @@ -400,9 +402,9 @@ class ModuleLinker { Linker::DiagnosticHandlerFunction DiagnosticHandler; public: - ModuleLinker(Module *dstM, TypeSet &Set, Module *srcM, + ModuleLinker(Module *dstM, Module *srcM, Linker::DiagnosticHandlerFunction DiagnosticHandler) - : DstM(dstM), SrcM(srcM), TypeMap(Set), + : DstM(dstM), SrcM(srcM), ValMaterializer(TypeMap, DstM, LazilyLinkFunctions), DiagnosticHandler(DiagnosticHandler) {} @@ -814,7 +816,7 @@ void ModuleLinker::computeTypeMapping() { // we prefer to take the '%C' version. So we are then left with both // '%C.1' and '%C' being used for the same types. This leads to some // variables using one type and some using the other. - if (!SrcStructTypesSet.count(DST) && TypeMap.DstStructTypesSet.count(DST)) + if (!SrcStructTypesSet.count(DST)) TypeMap.addTypeMapping(DST, ST); } @@ -1576,10 +1578,6 @@ bool ModuleLinker::run() { void Linker::init(Module *M, DiagnosticHandlerFunction DiagnosticHandler) { this->Composite = M; this->DiagnosticHandler = DiagnosticHandler; - - TypeFinder StructTypes; - StructTypes.run(*M, true); - IdentifiedStructTypes.insert(StructTypes.begin(), StructTypes.end()); } Linker::Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler) { @@ -1601,8 +1599,7 @@ void Linker::deleteModule() { } bool Linker::linkInModule(Module *Src) { - ModuleLinker TheLinker(Composite, IdentifiedStructTypes, Src, - DiagnosticHandler); + ModuleLinker TheLinker(Composite, Src, DiagnosticHandler); return TheLinker.run(); } diff --git a/test/Linker/type-unique-dst-types.ll b/test/Linker/type-unique-dst-types.ll index 6033cb4d501..30aecbb970c 100644 --- a/test/Linker/type-unique-dst-types.ll +++ b/test/Linker/type-unique-dst-types.ll @@ -9,7 +9,10 @@ ; CHECK: %A = type { %B } ; CHECK-NEXT: %B = type { i8 } -; CHECK-NEXT: %A.11.1 = type opaque + +; CHECK: @g3 = external global %A +; CHECK: @g1 = external global %A +; CHECK: @g2 = external global %A %A = type { %B } %B = type { i8 }