[llvm] r231442 - Remember to move a type to the correct set when setting the body.

Rafael Espindola rafael.espindola at gmail.com
Thu Mar 5 16:50:21 PST 2015


Author: rafael
Date: Thu Mar  5 18:50:21 2015
New Revision: 231442

URL: http://llvm.org/viewvc/llvm-project?rev=231442&view=rev
Log:
Remember to move a type to the correct set when setting the body.

We would set the body of a struct type (therefore making it non-opaque)
but were forgetting to move it to the non-opaque set.

Fixes pr22807.

Added:
    llvm/trunk/test/Linker/Inputs/pr22807-1.ll
    llvm/trunk/test/Linker/Inputs/pr22807-2.ll
    llvm/trunk/test/Linker/pr22807.ll
Modified:
    llvm/trunk/include/llvm/Linker/Linker.h
    llvm/trunk/lib/Linker/LinkModules.cpp

Modified: llvm/trunk/include/llvm/Linker/Linker.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Linker/Linker.h?rev=231442&r1=231441&r2=231442&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Linker/Linker.h (original)
+++ llvm/trunk/include/llvm/Linker/Linker.h Thu Mar  5 18:50:21 2015
@@ -54,6 +54,7 @@ public:
     NonOpaqueStructTypeSet NonOpaqueStructTypes;
 
     void addNonOpaque(StructType *Ty);
+    void switchToNonOpaque(StructType *Ty);
     void addOpaque(StructType *Ty);
     StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
     bool hasType(StructType *Ty);

Modified: llvm/trunk/lib/Linker/LinkModules.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=231442&r1=231441&r2=231442&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/LinkModules.cpp (original)
+++ llvm/trunk/lib/Linker/LinkModules.cpp Thu Mar  5 18:50:21 2015
@@ -226,6 +226,7 @@ void TypeMapTy::linkDefinedTypeBodies()
       Elements[I] = get(SrcSTy->getElementType(I));
 
     DstSTy->setBody(Elements, SrcSTy->isPacked());
+    DstStructTypesSet.switchToNonOpaque(DstSTy);
   }
   SrcDefinitionsToResolve.clear();
   DstResolvedOpaqueTypes.clear();
@@ -1678,6 +1679,14 @@ void Linker::IdentifiedStructTypeSet::ad
   NonOpaqueStructTypes.insert(Ty);
 }
 
+void Linker::IdentifiedStructTypeSet::switchToNonOpaque(StructType *Ty) {
+  assert(!Ty->isOpaque());
+  NonOpaqueStructTypes.insert(Ty);
+  bool Removed = OpaqueStructTypes.erase(Ty);
+  (void)Removed;
+  assert(Removed);
+}
+
 void Linker::IdentifiedStructTypeSet::addOpaque(StructType *Ty) {
   assert(Ty->isOpaque());
   OpaqueStructTypes.insert(Ty);

Added: llvm/trunk/test/Linker/Inputs/pr22807-1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/pr22807-1.ll?rev=231442&view=auto
==============================================================================
--- llvm/trunk/test/Linker/Inputs/pr22807-1.ll (added)
+++ llvm/trunk/test/Linker/Inputs/pr22807-1.ll Thu Mar  5 18:50:21 2015
@@ -0,0 +1,6 @@
+%struct.A = type { %struct.B* }
+%struct.B = type opaque
+
+define i32 @foo(%struct.A** %A) {
+  ret i32 0
+}

Added: llvm/trunk/test/Linker/Inputs/pr22807-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/pr22807-2.ll?rev=231442&view=auto
==============================================================================
--- llvm/trunk/test/Linker/Inputs/pr22807-2.ll (added)
+++ llvm/trunk/test/Linker/Inputs/pr22807-2.ll Thu Mar  5 18:50:21 2015
@@ -0,0 +1,6 @@
+%struct.A = type { %struct.B* }
+%struct.B = type opaque
+
+define i32 @bar(%struct.A* %A) {
+   ret i32 0
+}

Added: llvm/trunk/test/Linker/pr22807.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/pr22807.ll?rev=231442&view=auto
==============================================================================
--- llvm/trunk/test/Linker/pr22807.ll (added)
+++ llvm/trunk/test/Linker/pr22807.ll Thu Mar  5 18:50:21 2015
@@ -0,0 +1,13 @@
+; RUN: llvm-link -S -o - %p/pr22807.ll %p/Inputs/pr22807-1.ll %p/Inputs/pr22807-2.ll | FileCheck %s
+
+; CHECK-NOT: type
+; CHECK: %struct.B = type { %struct.A* }
+; CHECK-NEXT: %struct.A = type { %struct.B* }
+; CHECK-NOT: type
+
+%struct.B = type { %struct.A* }
+%struct.A = type opaque
+
+define i32 @baz(%struct.B* %BB) {
+  ret i32 0
+}





More information about the llvm-commits mailing list