diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -549,6 +549,7 @@ switch (Die.getTag()) { case dwarf::DW_TAG_structure_type: case dwarf::DW_TAG_class_type: + case dwarf::DW_TAG_union_type: break; default: return; diff --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/union/a.out b/llvm/test/tools/dsymutil/Inputs/private/tmp/union/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@ + +struct Container_ivars { + // real definition here +}; + +ContainerPtr allocateContainer() { + Container *c = (Container *)malloc(sizeof(Container)); + c->ivars = (Container_ivars *)malloc(sizeof(Container_ivars)); + return c; +} + +extern void doSomething(ContainerPtr); + +int main() { + ContainerPtr c = allocateContainer(); + doSomething(c); + return 0; +} + +$ cat container.h +struct Container_ivars; + +struct Container { + union { + struct Container_ivars *ivars; + }; +}; + +typedef Container *ContainerPtr; + +$ cat use.cpp +#include "container.h" + +void doSomething(ContainerPtr c) {} + + +$ clang++ -O0 -g container.cpp -c -o container.o +$ clang++ -O0 -g use.cpp -c -o use.o +$ clang++ use.o container.o -o a.out + +Note that the link order in the last command matters for this test. + +RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/union/a.out -o %t.dSYM +RUN: llvm-dwarfdump %t.dSYM | FileCheck %s + +CHECK: DW_TAG_compile_unit + +CHECK: DW_AT_name ("Container_ivars") +CHECK-NEXT: DW_AT_declaration (true) + +CHECK: DW_TAG_compile_unit + +CHECK: DW_AT_name ("Container_ivars") +CHECK-NEXT: DW_AT_byte_size (0x01) +CHECK-NEXT: DW_AT_decl_file ("/tmp/union/container.cpp") +CHECK-NEXT: DW_AT_decl_line (4)