diff options
| author | Jonas Devlieghere <jonas@devlieghere.com> | 2017-08-31 18:06:44 +0000 |
|---|---|---|
| committer | Jonas Devlieghere <jonas@devlieghere.com> | 2017-08-31 18:06:44 +0000 |
| commit | e200f9bae6d90773e260c8bfc5a81eef6441836f (patch) | |
| tree | 2a7960e020125b89dc9f14cead59a7e3d9bc9ca0 /llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp | |
| parent | 6f297ba8a915969b2ba529dd3ad79807cb190201 (diff) | |
| download | bcm5719-llvm-e200f9bae6d90773e260c8bfc5a81eef6441836f.tar.gz bcm5719-llvm-e200f9bae6d90773e260c8bfc5a81eef6441836f.zip | |
[dsymutil] Don't mark forward declarations as canonical.
This patch completes the work done by Frederic Riss to addresses
dsymutil incorrectly considering forward declaration as canonical during
uniquing. This resulted in references to the forward declaration even
after the definition was encountered.
In addition to the test provided by Alexander Shaposhnikov in D29609, I
added another test to cover several scenarios that were mentioned in his
conversation with Fred. We now also check that uniquing still occurs
after the definition was encountered.
For more context please refer to D29609
Differential revision: https://reviews.llvm.org/D37127
llvm-svn: 312264
Diffstat (limited to 'llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp')
| -rw-r--r-- | llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp b/llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp new file mode 100644 index 00000000000..7aef0057d21 --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp @@ -0,0 +1,127 @@ +/* Compile with: + for FILE in `seq 3`; do + clang -g -c X86/odr-fwd-declaration.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration/$FILE.o + done + */ + +// RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/odr-fwd-declaration -y %p/dummy-debug-map.map -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +#ifdef FILE1 +# 1 "Header.h" 1 +typedef struct S *Sptr; +typedef Sptr *Sptrptr; +# 3 "Source1.cpp" 2 +void foo() { + Sptrptr ptr1 = 0; +} + +// First we confirm that the typedefs reference the forward declaration of the +// struct S. +// +// CHECK: TAG_variable +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "ptr1" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF1:[a-f0-9]*]] +// +// CHECK: [[TYPEDEF1]]:{{.*}}TAG_typedef +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]] +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "Sptrptr" +// +// CHECK: [[PTR1]]:{{.*}}TAG_pointer_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF2:[a-f0-9]*]] +// +// CHECK: [[TYPEDEF2]]:{{.*}}TAG_typedef +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]] +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "Sptr" +// +// CHECK: [[PTR2]]:{{.*}}TAG_pointer_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[FWDSTRUCT:[a-f0-9]*]] +// +// CHECK: [[FWDSTRUCT]]:{{.*}}TAG_structure_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "S" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_declaration +// CHECK-NOT AT_byte_size + +#elif defined(FILE2) +# 1 "Header.h" 1 +typedef struct S *Sptr; +typedef Sptr *Sptrptr; +# 3 "Source2.cpp" 2 +struct S { + int field; +}; +void bar() { + Sptrptr ptr2 = 0; +} + +// Next we confirm that the typedefs reference the definition rather than the +// previous declaration of S. +// +// CHECK: TAG_variable +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "ptr2" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3:[a-f0-9]*]] +// +// CHECK: [[TYPEDEF3]]:{{.*}}TAG_typedef +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]] +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "Sptrptr" +// +// CHECK: [[PTR3]]:{{.*}}TAG_pointer_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF4:[a-f0-9]*]] +// +// CHECK: [[TYPEDEF4]]:{{.*}}TAG_typedef +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTR4:[a-f0-9]*]] +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "Sptr" +// +// CHECK: [[PTR4]]:{{.*}}TAG_pointer_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT:[a-f0-9]*]] +// +// CHECK: [[STRUCT]]:{{.*}}TAG_structure_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "S" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK-NOT: AT_declaration +// CHECK: AT_byte_size +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: TAG_member + +#elif defined(FILE3) +# 1 "Header.h" 1 +typedef struct S *Sptr; +typedef Sptr *Sptrptr; +# 3 "Source1.cpp" 2 +void foo() { + Sptrptr ptr1 = 0; +} + +// Finally we confirm that uniquing is not broken and the same typedef is +// referenced by ptr1. +// +// CHECK: TAG_variable +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "ptr1" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[TYPEDEF3]] +// CHECK-NOT: TAG_typedef +// CHECK-NOT: TAG_pointer +// CHECK-NOT: TAG_structure_type + +#else +#error "You must define which file you generate" +#endif |

