diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Linker/IRMover.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/Linker/type-unique-dst-types.ll | 6 |
2 files changed, 11 insertions, 1 deletions
diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index f7170e714b9..6863a895cb1 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -95,6 +95,12 @@ void TypeMapTy::addTypeMapping(Type *DstTy, Type *SrcTy) { for (StructType *Ty : SpeculativeDstOpaqueTypes) DstResolvedOpaqueTypes.erase(Ty); } else { + // SrcTy and DstTy are recursively ismorphic. We clear names of SrcTy + // and all its descendants to lower amount of renaming in LLVM context + // Renaming occurs because we load all source modules to the same context + // and declaration with existing name gets renamed (i.e Foo -> Foo.42). + // As a result we may get several different types in the destination + // module, which are in fact the same. for (Type *Ty : SpeculativeTypes) if (auto *STy = dyn_cast<StructType>(Ty)) if (STy->hasName()) diff --git a/llvm/test/Linker/type-unique-dst-types.ll b/llvm/test/Linker/type-unique-dst-types.ll index 1adad49de91..cfcad130e6a 100644 --- a/llvm/test/Linker/type-unique-dst-types.ll +++ b/llvm/test/Linker/type-unique-dst-types.ll @@ -1,6 +1,8 @@ ; RUN: llvm-link %p/type-unique-dst-types.ll \ ; RUN: %p/Inputs/type-unique-dst-types2.ll \ -; RUN: %p/Inputs/type-unique-dst-types3.ll -S -o - | FileCheck %s +; RUN: %p/Inputs/type-unique-dst-types3.ll -S -o %t1.ll +; RUN: cat %t1.ll | FileCheck %s +; RUN: cat %t1.ll | FileCheck --check-prefix=RENAMED %s ; This tests the importance of keeping track of which types are part of the ; destination module. @@ -14,6 +16,8 @@ ; CHECK: @g1 = external global %A ; CHECK: @g2 = external global %A +; RENAMED-NOT: A.11 + %A = type { %B } %B = type { i8 } @g3 = external global %A |

