From 7a551b7c6dd012d67ddf27ab8d87c3e8742c5f11 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 1 Dec 2014 04:15:59 +0000 Subject: [PATCH] Change how we keep track of which types are in the dest module. Instead of keeping an explicit set, just drop the names of types we choose to map to some other type. This has the advantage that the name of the unused will not cause the context to rename types on module read. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222986 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Linker/Linker.h | 1 - lib/Linker/LinkModules.cpp | 23 ++++++++++------------- test/Linker/type-unique-dst-types.ll | 5 ++++- 3 files changed, 14 insertions(+), 15 deletions(-) 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 } -- 2.34.1