diff options
| -rw-r--r-- | llvm/include/llvm/Linker/Linker.h | 1 | ||||
| -rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 9 | ||||
| -rw-r--r-- | llvm/test/Linker/Inputs/pr22807-1.ll | 6 | ||||
| -rw-r--r-- | llvm/test/Linker/Inputs/pr22807-2.ll | 6 | ||||
| -rw-r--r-- | llvm/test/Linker/pr22807.ll | 13 | 
5 files changed, 35 insertions, 0 deletions
| diff --git a/llvm/include/llvm/Linker/Linker.h b/llvm/include/llvm/Linker/Linker.h index aac9dcdcb36..5ca815c325a 100644 --- a/llvm/include/llvm/Linker/Linker.h +++ b/llvm/include/llvm/Linker/Linker.h @@ -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); diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp index 7f0fdb32f7b..a81dce27ccc 100644 --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -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::addNonOpaque(StructType *Ty) {    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); diff --git a/llvm/test/Linker/Inputs/pr22807-1.ll b/llvm/test/Linker/Inputs/pr22807-1.ll new file mode 100644 index 00000000000..4081a9b00e4 --- /dev/null +++ b/llvm/test/Linker/Inputs/pr22807-1.ll @@ -0,0 +1,6 @@ +%struct.A = type { %struct.B* } +%struct.B = type opaque + +define i32 @foo(%struct.A** %A) { +  ret i32 0 +} diff --git a/llvm/test/Linker/Inputs/pr22807-2.ll b/llvm/test/Linker/Inputs/pr22807-2.ll new file mode 100644 index 00000000000..7739b77df25 --- /dev/null +++ b/llvm/test/Linker/Inputs/pr22807-2.ll @@ -0,0 +1,6 @@ +%struct.A = type { %struct.B* } +%struct.B = type opaque + +define i32 @bar(%struct.A* %A) { +   ret i32 0 +} diff --git a/llvm/test/Linker/pr22807.ll b/llvm/test/Linker/pr22807.ll new file mode 100644 index 00000000000..bb4ca2b4ccf --- /dev/null +++ b/llvm/test/Linker/pr22807.ll @@ -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 +} | 

