dsymutil: Prune module forward decl DIEs if a uniquable definition was
[oota-llvm.git] / test / tools / dsymutil / X86 / modules.m
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