xref: /llvm-project/llvm/test/tools/dsymutil/X86/odr-member-functions.cpp (revision a6ef1abc0970ff3ae49a643cf3575226e3c5e762)
1f8bcc0c6SFrederic Riss /* Compile with:
2f8bcc0c6SFrederic Riss    for FILE in `seq 3`; do
3f8bcc0c6SFrederic Riss      clang -g -c  odr-member-functions.cpp -DFILE$FILE -o odr-member-functions/$FILE.o
4f8bcc0c6SFrederic Riss    done
5f8bcc0c6SFrederic Riss  */
6f8bcc0c6SFrederic Riss 
7*a6ef1abcSJonas Devlieghere // RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/odr-member-functions -y %p/dummy-debug-map.map -o - | llvm-dwarfdump -debug-info - | FileCheck %s
8f8bcc0c6SFrederic Riss 
9f8bcc0c6SFrederic Riss struct S {
fooS10f8bcc0c6SFrederic Riss   __attribute__((always_inline)) void foo() { bar(); }
fooS11f8bcc0c6SFrederic Riss   __attribute__((always_inline)) void foo(int i) { if (i) bar(); }
12f8bcc0c6SFrederic Riss   void bar();
13f8bcc0c6SFrederic Riss 
bazS14f8bcc0c6SFrederic Riss   template<typename T> void baz(T t) {}
15f8bcc0c6SFrederic Riss };
16f8bcc0c6SFrederic Riss 
17f8bcc0c6SFrederic Riss #ifdef FILE1
foo()18f8bcc0c6SFrederic Riss void foo() {
19f8bcc0c6SFrederic Riss   S s;
20f8bcc0c6SFrederic Riss }
21f8bcc0c6SFrederic Riss 
22f8bcc0c6SFrederic Riss // CHECK: TAG_compile_unit
23f8bcc0c6SFrederic Riss // CHECK-NOT: {{DW_TAG|NULL}}
24f8bcc0c6SFrederic Riss // CHECK: AT_name{{.*}}"odr-member-functions.cpp"
25f8bcc0c6SFrederic Riss 
26f8bcc0c6SFrederic Riss // CHECK: 0x[[S:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
27f8bcc0c6SFrederic Riss // CHECK-NOT: {{DW_TAG|NULL}}
28f8bcc0c6SFrederic Riss // CHECK: DW_AT_name{{.*}}"S"
29f8bcc0c6SFrederic Riss // CHECK-NOT: NULL
30f8bcc0c6SFrederic Riss // CHECK: 0x[[FOO:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
31f8bcc0c6SFrederic Riss // CHECK-NEXT: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEv"
32f8bcc0c6SFrederic Riss // CHECK: NULL
33f8bcc0c6SFrederic Riss // CHECK: 0x[[FOOI:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
34f8bcc0c6SFrederic Riss // CHECK-NEXT: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEi"
35f8bcc0c6SFrederic Riss 
36f8bcc0c6SFrederic Riss #elif defined(FILE2)
foo()37f8bcc0c6SFrederic Riss void foo() {
38f8bcc0c6SFrederic Riss   S s;
39f8bcc0c6SFrederic Riss   // Check that the overloaded member functions are resolved correctly
40f8bcc0c6SFrederic Riss   s.foo();
41f8bcc0c6SFrederic Riss   s.foo(1);
42f8bcc0c6SFrederic Riss }
43f8bcc0c6SFrederic Riss 
44f8bcc0c6SFrederic Riss // CHECK: TAG_compile_unit
45f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
46f8bcc0c6SFrederic Riss // CHECK: AT_name{{.*}}"odr-member-functions.cpp"
47f8bcc0c6SFrederic Riss 
48f8bcc0c6SFrederic Riss // Normal member functions should be desribed by the type in the first
49f8bcc0c6SFrederic Riss // CU, thus we should be able to reuse its definition and avoid
50f8bcc0c6SFrederic Riss // reemiting it.
51f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG_structure_type
52f8bcc0c6SFrederic Riss 
53f8bcc0c6SFrederic Riss // CHECK: 0x[[FOO_SUB:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
54f8bcc0c6SFrederic Riss // CHECK-NEXT: DW_AT_specification{{.*}}[[FOO]]
55f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG_structure_type
56f8bcc0c6SFrederic Riss // CHECK: 0x[[FOOI_SUB:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
57f8bcc0c6SFrederic Riss // CHECK-NEXT: DW_AT_specification{{.*}}[[FOOI]]
58f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG_structure_type
59f8bcc0c6SFrederic Riss 
60f8bcc0c6SFrederic Riss // CHECK: DW_TAG_variable
61f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
62f8bcc0c6SFrederic Riss // CHECK: DW_AT_name {{.*}}"s"
63f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
64aa6be823SJonas Devlieghere // CHECK: DW_AT_type {{.*}}[[S]]
65f8bcc0c6SFrederic Riss // CHECK: DW_TAG_inlined_subroutine
66f8bcc0c6SFrederic Riss // CHECK-NEXT: DW_AT_abstract_origin{{.*}}[[FOO_SUB]]
67f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
68f8bcc0c6SFrederic Riss // CHECK: DW_AT_call_line{{.*}}40
69f8bcc0c6SFrederic Riss // CHECK: DW_TAG_inlined_subroutine
70f8bcc0c6SFrederic Riss // CHECK-NEXT: DW_AT_abstract_origin{{.*}}[[FOOI_SUB]]
71f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
72f8bcc0c6SFrederic Riss // CHECK: DW_AT_call_line{{.*}}41
73f8bcc0c6SFrederic Riss 
74f8bcc0c6SFrederic Riss #elif defined(FILE3)
foo()75f8bcc0c6SFrederic Riss void foo() {
76f8bcc0c6SFrederic Riss   S s;
77f8bcc0c6SFrederic Riss   s.baz<int>(42);
78f8bcc0c6SFrederic Riss }
79f8bcc0c6SFrederic Riss 
80f8bcc0c6SFrederic Riss // CHECK: TAG_compile_unit
81f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
82f8bcc0c6SFrederic Riss // CHECK: AT_name{{.*}}"odr-member-functions.cpp"
83f8bcc0c6SFrederic Riss 
84f8bcc0c6SFrederic Riss // Template or other implicit members will be included in the type
85f8bcc0c6SFrederic Riss // only if they are generated. Thus actually creating a new type.
86f8bcc0c6SFrederic Riss // CHECK: DW_TAG_structure_type
87f8bcc0c6SFrederic Riss 
88f8bcc0c6SFrederic Riss // Skip 'normal' member functions
89f8bcc0c6SFrederic Riss // CHECK: DW_TAG_subprogram
90f8bcc0c6SFrederic Riss // CHECK: DW_TAG_subprogram
91f8bcc0c6SFrederic Riss // CHECK: DW_TAG_subprogram
92f8bcc0c6SFrederic Riss 
93f8bcc0c6SFrederic Riss // This is the 'baz' member
94f8bcc0c6SFrederic Riss // CHECK: 0x[[BAZ:[0-9a-f]*]]: DW_TAG_subprogram
95f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
96f8bcc0c6SFrederic Riss // CHECK: DW_AT_MIPS_linkage_name {{.*}}"_ZN1S3bazIiEEvT_"
97f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
98f8bcc0c6SFrederic Riss // CHECK: DW_AT_name {{.*}}"baz<int>"
99f8bcc0c6SFrederic Riss 
100f8bcc0c6SFrederic Riss // Skip foo3
101f8bcc0c6SFrederic Riss // CHECK: DW_TAG_subprogram
102f8bcc0c6SFrederic Riss 
103f8bcc0c6SFrederic Riss // baz instanciation:
104f8bcc0c6SFrederic Riss // CHECK: DW_TAG_subprogram
105f8bcc0c6SFrederic Riss // CHECK-NOT: DW_TAG
106f8bcc0c6SFrederic Riss // CHECK: DW_AT_specification {{.*}}[[BAZ]] "_ZN1S3bazIiEEvT_"
107f8bcc0c6SFrederic Riss #else
108f8bcc0c6SFrederic Riss #error "You must define which file you generate"
109f8bcc0c6SFrederic Riss #endif
110