[llvm-commits] [llvm] r146728 - in /llvm/trunk: lib/Linker/LinkModules.cpp test/Linker/link-type-names.ll
Chris Lattner
sabre at nondot.org
Fri Dec 16 00:36:07 PST 2011
Author: lattner
Date: Fri Dec 16 02:36:07 2011
New Revision: 146728
URL: http://llvm.org/viewvc/llvm-project?rev=146728&view=rev
Log:
By popular demand, link up types by name if they are isomorphic and one is an
autorenamed version of the other. This makes the IR easier to read, because
we don't end up with random renamed versions of the types after LTO'ing a large app.
Added:
llvm/trunk/test/Linker/link-type-names.ll
Modified:
llvm/trunk/lib/Linker/LinkModules.cpp
Modified: llvm/trunk/lib/Linker/LinkModules.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=146728&r1=146727&r2=146728&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/LinkModules.cpp (original)
+++ llvm/trunk/lib/Linker/LinkModules.cpp Fri Dec 16 02:36:07 2011
@@ -543,6 +543,31 @@
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);
+
+ 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
Added: llvm/trunk/test/Linker/link-type-names.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/link-type-names.ll?rev=146728&view=auto
==============================================================================
--- llvm/trunk/test/Linker/link-type-names.ll (added)
+++ llvm/trunk/test/Linker/link-type-names.ll Fri Dec 16 02:36:07 2011
@@ -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 }
+ at G = global %X { i32 4 }
+
+
+; CHECK: @G = global %X { i32 4 }
+; CHECK: @G2 = global %X { i32 4 }
More information about the llvm-commits
mailing list