Home | History | Annotate | Download | only in X86
      1 /* Compile with:
      2    cat >modules.modulemap <<EOF
      3      module Foo {
      4        header "Foo.h"
      5        export *
      6      }
      7      module Bar {
      8        header "Bar.h"
      9        export *
     10      }
     11 EOF
     12    clang -D BAR_H -E -o Bar.h modules.m
     13    clang -D FOO_H -E -o Foo.h modules.m
     14    clang -D ODR_VIOLATION_C -E -o odr_violation.c modules.m
     15    clang -c -fmodules -fmodule-map-file=modules.modulemap \
     16      -g -gmodules -fmodules-cache-path=. \
     17      -Xclang -fdisable-module-hash modules.m -o 1.o
     18    clang -c -g odr_violation.c -o 2.o
     19 */
     20 
     21 // RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/modules \
     22 // RUN:   -y %p/dummy-debug-map.map -o - \
     23 // RUN:     | llvm-dwarfdump -v --debug-info - | FileCheck %s
     24 
     25 // RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/modules -y \
     26 // RUN:   %p/dummy-debug-map.map -o %t 2>&1 | FileCheck --check-prefix=WARN %s
     27 
     28 // WARN-NOT: warning: hash mismatch
     29 
     30 // ---------------------------------------------------------------------
     31 #ifdef BAR_H
     32 // ---------------------------------------------------------------------
     33 // CHECK:            DW_TAG_compile_unit
     34 // CHECK-NOT:        DW_TAG
     35 // CHECK:              DW_TAG_module
     36 // CHECK-NEXT:           DW_AT_name{{.*}}"Bar"
     37 // CHECK: 0x0[[BAR:.*]]: DW_TAG_structure_type
     38 // CHECK-NOT:              DW_TAG
     39 // CHECK:                  DW_AT_name {{.*}}"Bar"
     40 // CHECK-NOT:              DW_TAG
     41 // CHECK:                  DW_TAG_member
     42 // CHECK:                    DW_AT_name {{.*}}"value"
     43 // CHECK:                DW_TAG_structure_type
     44 // CHECK-NOT:              DW_TAG
     45 // CHECK:                  DW_AT_name {{.*}}"PruneMeNot"
     46 
     47 struct Bar {
     48   int value;
     49 };
     50 
     51 struct PruneMeNot;
     52 
     53 #else
     54 // ---------------------------------------------------------------------
     55 #ifdef FOO_H
     56 // ---------------------------------------------------------------------
     57 // CHECK:               DW_TAG_compile_unit
     58 // CHECK-NOT:             DW_TAG
     59 // CHECK: 0x0[[FOO:.*]]:  DW_TAG_module
     60 // CHECK-NEXT:              DW_AT_name{{.*}}"Foo"
     61 // CHECK-NOT:               DW_TAG
     62 // CHECK: 0x0[[BARTD:.*]]: DW_TAG_typedef
     63 // CHECK-NOT:                 DW_TAG
     64 // CHECK:                     DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[BAR]]
     65 // CHECK:                   DW_TAG_structure_type
     66 // CHECK-NEXT:                DW_AT_name{{.*}}"S"
     67 // CHECK-NOT:                 DW_TAG
     68 // CHECK: 0x0[[INTERFACE:.*]]: DW_TAG_structure_type
     69 // CHECK-NEXT:                DW_AT_name{{.*}}"Foo"
     70 
     71 @import Bar;
     72 typedef struct Bar Bar;
     73 struct S {};
     74 
     75 @interface Foo {
     76   int ivar;
     77 }
     78 @end
     79 
     80 #else
     81 // ---------------------------------------------------------------------
     82 #ifdef ODR_VIOLATION_C
     83 // ---------------------------------------------------------------------
     84 
     85 struct Bar {
     86   int i;
     87 };
     88 typedef struct Bar Bar;
     89 Bar odr_violation = { 42 };
     90 
     91 // ---------------------------------------------------------------------
     92 #else
     93 // ---------------------------------------------------------------------
     94 
     95 // CHECK:  DW_TAG_compile_unit
     96 // CHECK:    DW_AT_low_pc
     97 // CHECK-NOT:  DW_TAG_module
     98 // CHECK-NOT:  DW_TAG_typedef
     99 //
    100 // CHECK:   DW_TAG_imported_declaration
    101 // CHECK-NOT: DW_TAG
    102 // CHECK:     DW_AT_import [DW_FORM_ref_addr] (0x{{0*}}[[FOO]]
    103 //
    104 // CHECK:   DW_TAG_subprogram
    105 // CHECK:     DW_AT_name {{.*}}"main"
    106 //
    107 // CHECK:     DW_TAG_variable
    108 // CHECK-NOT:   DW_TAG
    109 // CHECK:       DW_AT_name{{.*}}"bar"
    110 // CHECK-NOT:   DW_TAG
    111 // CHECK:       DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[BARTD]]
    112 // CHECK:     DW_TAG_variable
    113 // CHECK-NOT:   DW_TAG
    114 // CHECK:       DW_AT_name{{.*}}"foo"
    115 // CHECK-NOT:   DW_TAG
    116 // CHECK:       DW_AT_type {{.*}}{0x{{0*}}[[PTR:.*]]}
    117 //
    118 // CHECK: 0x{{0*}}[[PTR]]: DW_TAG_pointer_type
    119 // CHECK-NEXT   DW_AT_type [DW_FORM_ref_addr] {0x{{0*}}[[INTERFACE]]
    120 extern int odr_violation;
    121 
    122 @import Foo;
    123 int main(int argc, char **argv) {
    124   Bar bar;
    125   Foo *foo = 0;
    126   bar.value = odr_violation;
    127   return bar.value;
    128 }
    129 #endif
    130 #endif
    131 #endif
    132 
    133 // CHECK: DW_TAG_compile_unit
    134 // CHECK:   DW_AT_name {{.*}}"odr_violation.c"
    135 // CHECK: DW_TAG_variable
    136 // CHECK:   DW_AT_name {{.*}}"odr_violation"
    137 // CHECK:   DW_AT_type [DW_FORM_ref4] ({{.*}}{0x{{0*}}[[BAR2:.*]]}
    138 // CHECK: 0x{{0*}}[[BAR2]]: DW_TAG_typedef
    139 // CHECK:   DW_AT_type [DW_FORM_ref4] ({{.*}}{0x{{0*}}[[BAR3:.*]]}
    140 // CHECK:   DW_AT_name {{.*}}"Bar"
    141 // CHECK: 0x{{0*}}[[BAR3]]: DW_TAG_structure_type
    142 // CHECK-NEXT:   DW_AT_name {{.*}}"Bar"
    143