From: Bill Wendling Date: Mon, 27 Feb 2012 23:48:30 +0000 (+0000) Subject: Add back removed code. It still causes LLVM to miscompile. But not having it breaks... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=348e5e763e1297870878c5cb11aadfab2e8e5e7a;p=oota-llvm.git Add back removed code. It still causes LLVM to miscompile. But not having it breaks other things. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151594 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index e87d6dd4168..8af2c88db03 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -581,6 +581,36 @@ 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); + + SmallPtrSet SrcStructTypesSet(SrcStructTypes.begin(), + SrcStructTypes.end()); + + 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))) + // Don't use it if this actually came from the source module. They're in + // the same LLVMContext after all. + if (!SrcStructTypesSet.count(DST)) + 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 index a97b3527385..bfc3b64361d 100644 --- a/test/Linker/link-type-names.ll +++ b/test/Linker/link-type-names.ll @@ -1,10 +1,7 @@ ; RUN: echo "%X = type { i32 } @G2 = global %X { i32 4 }" > %t.ll ; RUN: llvm-link %s %t.ll -S | FileCheck %s -; XFAIL: * ; PR11464 -; FIXME: XFAIL until is addressed. - %X = type { i32 } @G = global %X { i32 4 }