1b61ac4a8Savl-llvm /* Compile with: 2b61ac4a8Savl-llvm for FILE in `seq 3`; do 3b61ac4a8Savl-llvm clang -g -c odr-member-functions.cpp -DFILE$FILE -o 4b61ac4a8Savl-llvm odr-member-functions/$FILE.o done 5b61ac4a8Savl-llvm */ 6b61ac4a8Savl-llvm 7*f1fdfe68SAlexey Lapshin // RUN: dsymutil --linker=parallel -f \ 8b61ac4a8Savl-llvm // RUN: -oso-prepend-path=%p/../../Inputs/odr-member-functions \ 9b61ac4a8Savl-llvm // RUN: -y %p/../dummy-debug-map.map -o %t1.out 10b61ac4a8Savl-llvm // RUN: llvm-dwarfdump -debug-info %t1.out | FileCheck %s 11b61ac4a8Savl-llvm 12b61ac4a8Savl-llvm struct S { fooS13b61ac4a8Savl-llvm __attribute__((always_inline)) void foo() { bar(); } fooS14b61ac4a8Savl-llvm __attribute__((always_inline)) void foo(int i) { 15b61ac4a8Savl-llvm if (i) 16b61ac4a8Savl-llvm bar(); 17b61ac4a8Savl-llvm } 18b61ac4a8Savl-llvm void bar(); 19b61ac4a8Savl-llvm bazS20b61ac4a8Savl-llvm template <typename T> void baz(T t) {} 21b61ac4a8Savl-llvm }; 22b61ac4a8Savl-llvm 23b61ac4a8Savl-llvm #ifdef FILE1 foo()24b61ac4a8Savl-llvmvoid foo() { S s; } 25b61ac4a8Savl-llvm 26b61ac4a8Savl-llvm // First chack that types are moved into the type table unit. 27b61ac4a8Savl-llvm 28b61ac4a8Savl-llvm // CHECK: TAG_compile_unit 29b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"__artificial_type_unit" 30b61ac4a8Savl-llvm 31b61ac4a8Savl-llvm // CHECK: 0x[[INT_BASE:[0-9a-f]*]]: DW_TAG_base_type 32b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"int" 33b61ac4a8Savl-llvm 34b61ac4a8Savl-llvm // CHECK: 0x[[PTR_S:[0-9a-f]*]]:{{.*}}DW_TAG_pointer_type 35b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[STRUCT_S:[0-9a-f]*]] "S") 36b61ac4a8Savl-llvm 37b61ac4a8Savl-llvm // CHECK: 0x[[STRUCT_S]]:{{.*}}DW_TAG_structure_type 38b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"S" 39b61ac4a8Savl-llvm 40b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram 41b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3barEv" 42b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"bar" 43b61ac4a8Savl-llvm 44b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 45b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *" 46b61ac4a8Savl-llvm 47b61ac4a8Savl-llvm // CHECK: 0x[[BAZ_SUBPROGRAM:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram 48b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3bazIiEEvT_" 49b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"baz<int>" 50b61ac4a8Savl-llvm 51b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 52b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *" 53b61ac4a8Savl-llvm 54b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 55b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int" 56b61ac4a8Savl-llvm 57b61ac4a8Savl-llvm // CHECK: DW_TAG_template_type_parameter 58b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int" 59b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"T" 60b61ac4a8Savl-llvm 61b61ac4a8Savl-llvm // CHECK: 0x[[FOO_Ei:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram 62b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEi" 63b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo" 64b61ac4a8Savl-llvm 65b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 66b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *" 67b61ac4a8Savl-llvm 68b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 69b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int" 70b61ac4a8Savl-llvm 71b61ac4a8Savl-llvm // CHECK: 0x[[FOO_Ev:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram 72b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEv" 73b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo" 74b61ac4a8Savl-llvm 75b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 76b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *" 77b61ac4a8Savl-llvm 78b61ac4a8Savl-llvm // For the second unit check that it references structure "S" 79b61ac4a8Savl-llvm 80b61ac4a8Savl-llvm // CHECK: TAG_compile_unit 81b61ac4a8Savl-llvm // CHECK-NOT: {{DW_TAG|NULL}} 82b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"odr-member-functions.cpp" 83b61ac4a8Savl-llvm 84b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram 85b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov" 86b61ac4a8Savl-llvm // CHECK-NEXT: AT_name{{.*}}"foo" 87b61ac4a8Savl-llvm 88b61ac4a8Savl-llvm // CHECK: DW_TAG_variable 89b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"s" 90b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S" 91b61ac4a8Savl-llvm 92b61ac4a8Savl-llvm #elif defined(FILE2) foo()93b61ac4a8Savl-llvmvoid foo() { 94b61ac4a8Savl-llvm S s; 95b61ac4a8Savl-llvm // Check that the overloaded member functions are resolved correctly 96b61ac4a8Savl-llvm s.foo(); 97b61ac4a8Savl-llvm s.foo(1); 98b61ac4a8Savl-llvm } 99b61ac4a8Savl-llvm 100b61ac4a8Savl-llvm // For the third unit check that it references member functions of structure S. 101b61ac4a8Savl-llvm // CHECK: TAG_compile_unit 102b61ac4a8Savl-llvm // CHECK-NOT: DW_TAG 103b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"odr-member-functions.cpp" 104b61ac4a8Savl-llvm 105b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ev:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram 106b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_specification {{.*}}(0x00000000[[FOO_Ev]] "_ZN1S3fooEv" 107b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_inline (DW_INL_inlined) 108b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_object_pointer {{.*}}(0x[[ABASE_FOO_Ev_PARAM1:[0-9a-f]*]] 109b61ac4a8Savl-llvm 110b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ev_PARAM1]]:{{.*}}DW_TAG_formal_parameter 111b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"this" 112b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *" 113b61ac4a8Savl-llvm 114b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ei:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram 115b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_specification {{.*}}(0x00000000[[FOO_Ei]] "_ZN1S3fooEi" 116b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_inline (DW_INL_inlined) 117b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_object_pointer {{.*}}(0x[[ABASE_FOO_Ei_PARAM1:[0-9a-f]*]] 118b61ac4a8Savl-llvm 119b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ei_PARAM1]]:{{.*}}DW_TAG_formal_parameter 120b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"this" 121b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *" 122b61ac4a8Savl-llvm 123b61ac4a8Savl-llvm // CHECK: 0x[[ABASE_FOO_Ei_PARAM2:[0-9a-f]*]]:{{.*}}DW_TAG_formal_parameter 124b61ac4a8Savl-llvm // CHECK-NEXT: DW_AT_name{{.*}}"i" 125b61ac4a8Savl-llvm // CHECK: DW_AT_type (0x00000000[[INT_BASE]] "int" 126b61ac4a8Savl-llvm 127b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram 128b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov" 129b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo" 130b61ac4a8Savl-llvm 131b61ac4a8Savl-llvm // CHECK: DW_TAG_variable 132b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"s" 133b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S" 134b61ac4a8Savl-llvm 135b61ac4a8Savl-llvm // CHECK: DW_TAG_inlined_subroutine 136b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ev]] "_ZN1S3fooEv" 137b61ac4a8Savl-llvm // CHECK: DW_AT_low_pc 138b61ac4a8Savl-llvm // CHECK: DW_AT_high_pc 139b61ac4a8Savl-llvm 140b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 141b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ev_PARAM1]] "this" 142b61ac4a8Savl-llvm 143b61ac4a8Savl-llvm // CHECK: DW_TAG_inlined_subroutine 144b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei]] "_ZN1S3fooEi" 145b61ac4a8Savl-llvm // CHECK: DW_AT_low_pc 146b61ac4a8Savl-llvm // CHECK: DW_AT_high_pc 147b61ac4a8Savl-llvm 148b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 149b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei_PARAM1]] "this" 150b61ac4a8Savl-llvm 151b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 152b61ac4a8Savl-llvm // CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei_PARAM2]] "i" 153b61ac4a8Savl-llvm 154b61ac4a8Savl-llvm #elif defined(FILE3) foo()155b61ac4a8Savl-llvmvoid foo() { 156b61ac4a8Savl-llvm S s; 157b61ac4a8Savl-llvm s.baz<int>(42); 158b61ac4a8Savl-llvm } 159b61ac4a8Savl-llvm 160b61ac4a8Savl-llvm // For the fourth unit check that it references member functions of structure S. 161b61ac4a8Savl-llvm 162b61ac4a8Savl-llvm // CHECK: TAG_compile_unit 163b61ac4a8Savl-llvm // CHECK-NOT: DW_TAG 164b61ac4a8Savl-llvm // CHECK: AT_name{{.*}}"odr-member-functions.cpp" 165b61ac4a8Savl-llvm 166b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram 167b61ac4a8Savl-llvm // CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov" 168b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"foo" 169b61ac4a8Savl-llvm 170b61ac4a8Savl-llvm // CHECK: DW_TAG_variable 171b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"s" 172b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S" 173b61ac4a8Savl-llvm 174b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram 175b61ac4a8Savl-llvm // CHECK: DW_AT_object_pointer{{.*}}(0x[[INST_PARAM2:[0-9a-f]*]] 176b61ac4a8Savl-llvm // CHECK: DW_AT_specification{{.*}}(0x00000000[[BAZ_SUBPROGRAM]] "_ZN1S3bazIiEEvT_" 177b61ac4a8Savl-llvm 178b61ac4a8Savl-llvm // CHECK: 0x[[INST_PARAM2]]:{{.*}}DW_TAG_formal_parameter 179b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"this" 180b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *" 181b61ac4a8Savl-llvm 182b61ac4a8Savl-llvm // CHECK: DW_TAG_formal_parameter 183b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"t" 184b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[INT_BASE]] "int" 185b61ac4a8Savl-llvm 186b61ac4a8Savl-llvm // CHECK: DW_TAG_template_type_parameter 187b61ac4a8Savl-llvm // CHECK: DW_AT_type{{.*}}(0x00000000[[INT_BASE]] "int" 188b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"T" 189b61ac4a8Savl-llvm 190b61ac4a8Savl-llvm #else 191b61ac4a8Savl-llvm #error "You must define which file you generate" 192b61ac4a8Savl-llvm #endif 193