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