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