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