diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index ab099bbfaf8..c53b2067a29 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -543,6 +543,31 @@ void ModuleLinker::computeTypeMapping() { TypeMap.addTypeMapping(DGV->getType(), I->getType()); } + // Incorporate types by name, scanning all the types in the source module. + // At this point, the destination module may have a type "%foo = { i32 }" for + // example. When the source module got loaded into the same LLVMContext, if + // it had the same type, it would have been renamed to "%foo.42 = { i32 }". + // Though it isn't required for correctness, attempt to link these up to clean + // up the IR. + std::vector SrcStructTypes; + SrcM->findUsedStructTypes(SrcStructTypes); + + for (unsigned i = 0, e = SrcStructTypes.size(); i != e; ++i) { + StructType *ST = SrcStructTypes[i]; + if (!ST->hasName()) continue; + + // Check to see if there is a dot in the name followed by a digit. + size_t DotPos = ST->getName().rfind('.'); + if (DotPos == 0 || DotPos == StringRef::npos || + ST->getName().back() == '.' || !isdigit(ST->getName()[DotPos+1])) + continue; + + // Check to see if the destination module has a struct with the prefix name. + if (StructType *DST = DstM->getTypeByName(ST->getName().substr(0, DotPos))) + TypeMap.addTypeMapping(DST, ST); + } + + // Don't bother incorporating aliases, they aren't generally typed well. // Now that we have discovered all of the type equivalences, get a body for diff --git a/test/Linker/link-type-names.ll b/test/Linker/link-type-names.ll new file mode 100644 index 00000000000..b54c9db43dd --- /dev/null +++ b/test/Linker/link-type-names.ll @@ -0,0 +1,9 @@ +; RUN: echo "%X = type { i32 } @G2 = global %X { i32 4 }" > %t.ll +; RUN: llvm-link %s %t.ll -S | FileCheck %s + +%X = type { i32 } +@G = global %X { i32 4 } + + +; CHECK: @G = global %X { i32 4 } +; CHECK: @G2 = global %X { i32 4 }