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 -cc1 -emit-obj -fmodules -fmodule-map-file=modules.modulemap \ 15 -fmodule-format=obj -g -dwarf-ext-refs -fmodules-cache-path=. \ 16 -fdisable-module-hash modules.m -o 1.o 17 */ 18 19 // RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/modules \ 20 // RUN: -y %p/dummy-debug-map.map -o - \ 21 // RUN: | llvm-dwarfdump --debug-dump=info - | FileCheck %s 22 23 // RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/modules -y \ 24 // RUN: %p/dummy-debug-map.map -o %t 2>&1 | FileCheck --check-prefix=WARN %s 25 26 // WARN-NOT: warning: hash mismatch 27 28 // --------------------------------------------------------------------- 29 #ifdef BAR_H 30 // --------------------------------------------------------------------- 31 // CHECK: DW_TAG_compile_unit 32 // CHECK-NOT: DW_TAG 33 // CHECK: DW_TAG_module 34 // CHECK-NEXT: DW_AT_name{{.*}}"Bar" 35 // CHECK: 0x0[[BAR:.*]]: DW_TAG_structure_type 36 // CHECK-NOT: DW_TAG 37 // CHECK: DW_AT_name {{.*}}"Bar" 38 // CHECK-NOT: DW_TAG 39 // CHECK: DW_TAG_member 40 // CHECK: DW_AT_name {{.*}}"value" 41 // CHECK: DW_TAG_structure_type 42 // CHECK-NOT: DW_TAG 43 // CHECK: DW_AT_name {{.*}}"PruneMeNot" 44 45 struct Bar { 46 int value; 47 }; 48 49 struct PruneMeNot; 50 51 #else 52 // --------------------------------------------------------------------- 53 #ifdef FOO_H 54 // --------------------------------------------------------------------- 55 // CHECK: DW_TAG_compile_unit 56 // CHECK-NOT: DW_TAG 57 // CHECK: 0x0[[FOO:.*]]: DW_TAG_module 58 // CHECK-NEXT: DW_AT_name{{.*}}"Foo" 59 // CHECK-NOT: DW_TAG 60 // CHECK: DW_TAG_typedef 61 // CHECK-NOT: DW_TAG 62 // CHECK: DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[BAR]]) 63 // CHECK: DW_TAG_structure_type 64 // CHECK-NEXT: DW_AT_name{{.*}}"S" 65 // CHECK-NOT: DW_TAG 66 // CHECK: 0x0[[INTERFACE:.*]]: DW_TAG_structure_type 67 // CHECK-NEXT: DW_AT_name{{.*}}"Foo" 68 69 @import Bar; 70 typedef struct Bar Bar; 71 struct S {}; 72 73 @interface Foo { 74 int ivar; 75 } 76 @end 77 78 // --------------------------------------------------------------------- 79 #else 80 // --------------------------------------------------------------------- 81 82 // CHECK: DW_TAG_compile_unit 83 // CHECK: DW_AT_low_pc 84 // CHECK-NOT:DW_TAG 85 // CHECK: DW_TAG_module 86 // CHECK-NEXT: DW_AT_name{{.*}}"Foo" 87 // CHECK-NOT: DW_TAG 88 // CHECK: DW_TAG_typedef 89 // CHECK-NOT: DW_TAG 90 // CHECK: NULL 91 // 92 // CHECK: DW_TAG_imported_declaration 93 // CHECK-NOT: DW_TAG 94 // CHECK: DW_AT_import [DW_FORM_ref_addr] (0x{{0*}}[[FOO]] 95 // 96 // CHECK: DW_TAG_subprogram 97 // CHECK: DW_AT_name {{.*}}"main" 98 // 99 // CHECK: DW_TAG_variable 100 // CHECK: DW_TAG_variable 101 // CHECK-NOT: DW_TAG 102 // CHECK: DW_AT_name{{.*}}"foo" 103 // CHECK-NOT: DW_TAG 104 // CHECK: DW_AT_type {{.*}}{0x{{0*}}[[PTR:.*]]} 105 // 106 // CHECK: 0x{{0*}}[[PTR]]: DW_TAG_pointer_type 107 // CHECK-NEXT DW_AT_type [DW_FORM_ref_addr] {0x{{0*}}[[INTERFACE]]) 108 109 @import Foo; 110 int main(int argc, char **argv) { 111 Bar bar; 112 Foo *foo = 0; 113 bar.value = 42; 114 return bar.value; 115 } 116 #endif 117 #endif 118