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