[llvm-commits] [llvm] r146932 - in /llvm/trunk: lib/Linker/LinkModules.cpp test/Linker/link-type-names.ll

Chris Lattner sabre at nondot.org
Mon Dec 19 16:12:26 PST 2011


Author: lattner
Date: Mon Dec 19 18:12:26 2011
New Revision: 146932

URL: http://llvm.org/viewvc/llvm-project?rev=146932&view=rev
Log:
Now that PR11464 is fixed, reapply the patch to fix PR11464, 
merging types by name when we can.  We still don't guarantee type name linkage
but we do it when obviously the right thing to do.  This makes LTO type names 
easier to read, for example.


Added:
    llvm/trunk/test/Linker/link-type-names.ll
      - copied, changed from r146742, 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=146932&r1=146931&r2=146932&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/LinkModules.cpp (original)
+++ llvm/trunk/lib/Linker/LinkModules.cpp Mon Dec 19 18:12:26 2011
@@ -558,6 +558,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

Copied: llvm/trunk/test/Linker/link-type-names.ll (from r146742, llvm/trunk/test/Linker/link-type-names.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/link-type-names.ll?p2=llvm/trunk/test/Linker/link-type-names.ll&p1=llvm/trunk/test/Linker/link-type-names.ll&r1=146742&r2=146932&rev=146932&view=diff
==============================================================================
--- llvm/trunk/test/Linker/link-type-names.ll (original)
+++ llvm/trunk/test/Linker/link-type-names.ll Mon Dec 19 18:12:26 2011
@@ -1,5 +1,6 @@
 ; RUN: echo "%X = type { i32 } @G2 = global %X { i32 4 }" > %t.ll
 ; RUN: llvm-link %s %t.ll -S | FileCheck %s
+; PR11464
 
 %X = type { i32 }
 @G = global %X { i32 4 }





More information about the llvm-commits mailing list