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 Workervoid 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 Workervoid 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 Workervoid 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