Add back removed code. It still causes LLVM to miscompile. But not having it breaks other things.

llvm-svn: 151594
This commit is contained in:
Bill Wendling 2012-02-27 23:48:30 +00:00
parent 1387839a9f
commit 2b3f61af18
2 changed files with 30 additions and 3 deletions

View File

@ -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<StructType*> SrcStructTypes;
SrcM->findUsedStructTypes(SrcStructTypes);
SmallPtrSet<StructType*, 32> 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

View File

@ -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 <rdar://problem/10913281> is addressed.
%X = type { i32 }
@G = global %X { i32 4 }