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 | |
| 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')
| -rw-r--r-- | llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/1.o | bin | 0 -> 2148 bytes | |||
| -rw-r--r-- | llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/2.o | bin | 0 -> 2276 bytes | |||
| -rw-r--r-- | llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/3.o | bin | 0 -> 2148 bytes | |||
| -rw-r--r-- | llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/1.o | bin | 0 -> 2252 bytes | |||
| -rw-r--r-- | llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/2.o | bin | 0 -> 2292 bytes | |||
| -rw-r--r-- | llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/3.o | bin | 0 -> 2292 bytes | |||
| -rw-r--r-- | llvm/test/tools/dsymutil/X86/odr-fwd-declaration.cpp | 127 | ||||
| -rw-r--r-- | llvm/test/tools/dsymutil/X86/odr-fwd-declaration2.cpp | 151 |
8 files changed, 278 insertions, 0 deletions
diff --git a/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/1.o b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/1.o Binary files differnew file mode 100644 index 00000000000..609a8a517be --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/1.o diff --git a/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/2.o b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/2.o Binary files differnew file mode 100644 index 00000000000..c5167109d69 --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/2.o diff --git a/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/3.o b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/3.o Binary files differnew file mode 100644 index 00000000000..609a8a517be --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration/3.o diff --git a/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/1.o b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/1.o Binary files differnew file mode 100644 index 00000000000..4597864bc97 --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/1.o diff --git a/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/2.o b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/2.o Binary files differnew file mode 100644 index 00000000000..e061c62db73 --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/2.o diff --git a/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/3.o b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/3.o Binary files differnew file mode 100644 index 00000000000..e061c62db73 --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/odr-fwd-declaration2/3.o 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 diff --git a/llvm/test/tools/dsymutil/X86/odr-fwd-declaration2.cpp b/llvm/test/tools/dsymutil/X86/odr-fwd-declaration2.cpp new file mode 100644 index 00000000000..1b0d261b5bd --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/odr-fwd-declaration2.cpp @@ -0,0 +1,151 @@ +/* Compile with: + for FILE in `seq 3`; do + clang -g -c X86/odr-fwd-declaration2.cpp -DFILE$FILE -o Inputs/odr-fwd-declaration2/$FILE.o + done + */ + +// RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/odr-fwd-declaration2 -y %p/dummy-debug-map.map -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +#ifdef FILE1 +# 1 "Header.h" 1 +struct A { + struct B; + B *bPtr; + B &bRef; + int B::*bPtrToField; +}; +# 3 "Source1.cpp" 2 +void foo() { + A *ptr1 = 0; +} + +// First we confirm that bPtr, bRef and bPtrToField reference the forward +// declaration of the struct B. +// +// CHECK: DW_TAG_member +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "bPtr" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTR1:[a-f0-9]*]] +// +// CHECK: [[STRUCT1:[a-f0-9]*]]:{{.*}}TAG_structure_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "B" +// CHECK-NOT: AT_byte_size +// CHECK: DW_AT_declaration +// +// CHECK: DW_TAG_member +// CHECK: AT_name{{.*}} "bRef" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[REF1:[a-f0-9]*]] +// +// CHECK: TAG_member +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "bPtrToField" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER1:[a-f0-9]*]] +// +// CHECK: [[PTR1]]:{{.*}}TAG_pointer_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]] +// +// CHECK: [[REF1]]:{{.*}}TAG_reference_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT1]] +// +// CHECK: [[PTRTOMEMBER1]]:{{.*}}TAG_ptr_to_member_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT1]] + +#elif defined(FILE2) +# 1 "Header.h" 1 +struct A { + struct B; + B *bPtr; + B &bRef; + int B::*bPtrToField; +}; +# 3 "Source2.cpp" 2 +struct A::B { + int x; +}; +void bar() { + A *ptr2 = 0; +} + +// Next we confirm that bPtr, bRef and bPtrToField reference the definition of +// B, rather than its declaration. +// +// CHECK: [[STRUCTA:[a-f0-9]*]]:{{.*}}TAG_structure_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "A" +// CHECK-NOT: AT_byte_size +// CHECK: DW_AT_byte_size +// +// CHECK: DW_TAG_member +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "bPtr" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTR2:[a-f0-9]*]] +// +// CHECK: [[STRUCT2:[a-f0-9]*]]:{{.*}}TAG_structure_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "B" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: DW_AT_byte_size +// +// CHECK: DW_TAG_member +// CHECK: AT_name{{.*}} "bRef" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[REF2:[a-f0-9]*]] +// +// CHECK: TAG_member +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "bPtrToField" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTRTOMEMBER2:[a-f0-9]*]] +// +// CHECK: [[PTR2]]:{{.*}}TAG_pointer_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]] +// +// CHECK: [[REF2]]:{{.*}}TAG_reference_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCT2]] +// +// CHECK: [[PTRTOMEMBER2]]:{{.*}}TAG_ptr_to_member_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_containing_type{{.*}}0x{{0*}}[[STRUCT2:[a-f0-9]*]] + +#elif defined(FILE3) +# 1 "Header.h" 1 +struct A { + struct B; + B *bPtr; + B &bRef; + int B::*bPtrToField; +}; +# 3 "Source2.cpp" 2 +struct A::B { + int x; +}; +void bar() { + A *ptr2 = 0; +} + +// Finally we confirm that uniquing isn't broken by checking that further +// references to 'struct A' point to its now complete definition. +// +// CHECK: TAG_variable +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_name{{.*}} "ptr2" +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[PTR3:[a-f0-9]*]] +// +// CHECK: [[PTR3]]:{{.*}}TAG_pointer_type +// CHECK-NOT: {{DW_TAG|NULL}} +// CHECK: AT_type{{.*}}0x{{0*}}[[STRUCTA]] + +#else +#error "You must define which file you generate" +#endif |

