ca5cf808d180a7d566280346e87b63ddd94c0d95
[oota-llvm.git] / test / DebugInfo / namespace.ll
1 ; REQUIRES: object-emission
2
3 ; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
4 ; RUN: llvm-dwarfdump %t | FileCheck %s
5 ; CHECK: debug_info contents
6 ; CHECK: [[NS1:0x[0-9a-f]*]]:{{ *}}DW_TAG_namespace
7 ; CHECK-NEXT: DW_AT_name{{.*}} = "A"
8 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F1:[0-9]]])
9 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x03)
10 ; CHECK-NOT: NULL
11 ; CHECK: [[NS2:0x[0-9a-f]*]]:{{ *}}DW_TAG_namespace
12 ; CHECK-NEXT: DW_AT_name{{.*}} = "B"
13 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2:[0-9]]])
14 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x01)
15 ; CHECK-NOT: NULL
16 ; CHECK: [[I:0x[0-9a-f]*]]:{{ *}}DW_TAG_variable
17 ; CHECK-NEXT: DW_AT_name{{.*}}= "i"
18 ; CHECK-NOT: NULL
19 ; CHECK: DW_TAG_subprogram
20 ; CHECK-NOT: DW_TAG
21 ; CHECK: DW_AT_MIPS_linkage_name
22 ; CHECK-NOT: DW_TAG
23 ; CHECK: DW_AT_name{{.*}}= "f1"
24 ; CHECK: [[FUNC1:0x[0-9a-f]*]]:{{ *}}DW_TAG_subprogram
25 ; CHECK-NOT: DW_TAG
26 ; CHECK: DW_AT_MIPS_linkage_name
27 ; CHECK-NOT: DW_TAG
28 ; CHECK: DW_AT_name{{.*}}= "f1"
29 ; CHECK: NULL
30 ; CHECK-NOT: NULL
31 ; CHECK: [[FOO:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type
32 ; CHECK-NEXT: DW_AT_name{{.*}}= "foo"
33 ; CHECK-NEXT: DW_AT_declaration
34 ; CHECK-NOT: NULL
35 ; CHECK: [[BAR:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type
36 ; CHECK-NEXT: DW_AT_name{{.*}}= "bar"
37 ; CHECK: NULL
38 ; CHECK: NULL
39 ; CHECK: NULL
40
41 ; CHECK-NOT: NULL
42 ; CHECK: DW_TAG_imported_module
43 ; This is a bug, it should be in F2 but it inherits the file from its
44 ; enclosing scope
45 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F1]])
46 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x08)
47 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS2]]})
48 ; CHECK: NULL
49 ; CHECK-NOT: NULL
50
51 ; CHECK: DW_TAG_subprogram
52 ; CHECK-NOT: DW_TAG
53 ; CHECK: DW_AT_MIPS_linkage_name
54 ; CHECK-NOT: DW_TAG
55 ; CHECK: DW_AT_name{{.*}}= "func"
56 ; CHECK-NOT: NULL
57 ; CHECK: DW_TAG_imported_module
58 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
59 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x12)
60 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]})
61 ; CHECK-NOT: NULL
62 ; CHECK: DW_TAG_imported_declaration
63 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
64 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x13)
65 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[FOO]]})
66 ; CHECK-NOT: NULL
67 ; CHECK: DW_TAG_imported_declaration
68 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
69 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x14)
70 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[BAR]]})
71 ; CHECK-NOT: NULL
72 ; CHECK: DW_TAG_imported_declaration
73 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
74 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x15)
75 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[FUNC1]]})
76 ; CHECK-NOT: NULL
77 ; CHECK: DW_TAG_imported_declaration
78 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
79 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x16)
80 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[I]]})
81 ; CHECK-NOT: NULL
82 ; CHECK: [[X:0x[0-9a-f]*]]:{{ *}}DW_TAG_imported_declaration
83 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
84 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x18)
85 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]})
86 ; CHECK-NEXT: DW_AT_name{{.*}}"X"
87 ; CHECK-NOT: NULL
88 ; CHECK: DW_TAG_imported_declaration
89 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
90 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x19)
91 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[X]]})
92 ; CHECK-NEXT: DW_AT_name{{.*}}"Y"
93 ; CHECK-NOT: NULL
94 ; CHECK: DW_TAG_lexical_block
95 ; CHECK-NOT: NULL
96 ; CHECK: DW_TAG_imported_module
97 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
98 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x0f)
99 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS2]]})
100 ; CHECK: NULL
101 ; CHECK: NULL
102 ; CHECK-NOT: NULL
103
104 ; CHECK: DW_TAG_imported_module
105 ; Same bug as above, this should be F2, not F1
106 ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F1]])
107 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x0b)
108 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]})
109
110 ; CHECK: file_names[  [[F1]]]{{.*}}debug-info-namespace.cpp
111 ; CHECK: file_names[  [[F2]]]{{.*}}foo.cpp
112
113 ; IR generated from clang/test/CodeGenCXX/debug-info-namespace.cpp, file paths
114 ; changed to protect the guilty. The C++ source code is:
115 ; namespace A {
116 ; #line 1 "foo.cpp"
117 ; namespace B {
118 ; int i;
119 ; void f1() { }
120 ; void f1(int) { }
121 ; struct foo;
122 ; struct bar { };
123 ; }
124 ; using namespace B;
125 ; }
126 ;
127 ; using namespace A;
128 ;
129 ; int func(bool b) {
130 ;   if (b) {
131 ;     using namespace A::B;
132 ;     return i;
133 ;   }
134 ;   using namespace A;
135 ;   using B::foo;
136 ;   using B::bar;
137 ;   using B::f1;
138 ;   using B::i;
139 ;   bar x;
140 ;   namespace X = A;
141 ;   namespace Y = X;
142 ;   return i + X::B::i + Y::B::i;
143 ; }
144
145 %"struct.A::B::bar" = type { i8 }
146
147 @_ZN1A1B1iE = global i32 0, align 4
148
149 ; Function Attrs: nounwind uwtable
150 define void @_ZN1A1B2f1Ev() #0 {
151 entry:
152   ret void, !dbg !41
153 }
154
155 ; Function Attrs: nounwind uwtable
156 define void @_ZN1A1B2f1Ei(i32) #0 {
157 entry:
158   %.addr = alloca i32, align 4
159   store i32 %0, i32* %.addr, align 4
160   call void @llvm.dbg.declare(metadata !{i32* %.addr}, metadata !42), !dbg !43
161   ret void, !dbg !43
162 }
163
164 ; Function Attrs: nounwind readnone
165 declare void @llvm.dbg.declare(metadata, metadata) #1
166
167 ; Function Attrs: nounwind uwtable
168 define i32 @_Z4funcb(i1 zeroext %b) #0 {
169 entry:
170   %retval = alloca i32, align 4
171   %b.addr = alloca i8, align 1
172   %x = alloca %"struct.A::B::bar", align 1
173   %frombool = zext i1 %b to i8
174   store i8 %frombool, i8* %b.addr, align 1
175   call void @llvm.dbg.declare(metadata !{i8* %b.addr}, metadata !44), !dbg !45
176   %0 = load i8* %b.addr, align 1, !dbg !46
177   %tobool = trunc i8 %0 to i1, !dbg !46
178   br i1 %tobool, label %if.then, label %if.end, !dbg !46
179
180 if.then:                                          ; preds = %entry
181   %1 = load i32* @_ZN1A1B1iE, align 4, !dbg !47
182   store i32 %1, i32* %retval, !dbg !47
183   br label %return, !dbg !47
184
185 if.end:                                           ; preds = %entry
186   call void @llvm.dbg.declare(metadata !{%"struct.A::B::bar"* %x}, metadata !48), !dbg !49
187   %2 = load i32* @_ZN1A1B1iE, align 4, !dbg !50
188   %3 = load i32* @_ZN1A1B1iE, align 4, !dbg !50
189   %add = add nsw i32 %2, %3, !dbg !50
190   %4 = load i32* @_ZN1A1B1iE, align 4, !dbg !50
191   %add1 = add nsw i32 %add, %4, !dbg !50
192   store i32 %add1, i32* %retval, !dbg !50
193   br label %return, !dbg !50
194
195 return:                                           ; preds = %if.end, %if.then
196   %5 = load i32* %retval, !dbg !51
197   ret i32 %5, !dbg !51
198 }
199
200 attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
201 attributes #1 = { nounwind readnone }
202
203 !llvm.dbg.cu = !{!0}
204 !llvm.module.flags = !{!52}
205
206 !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !19, metadata !21, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/llvm/build/clang/debug//usr/local/google/home/blaikie/dev/llvm/src/tools/clang/test/CodeGenCXX/debug-info-namespace.cpp] [DW_LANG_C_plus_plus]
207 !1 = metadata !{metadata !"/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/test/CodeGenCXX/debug-info-namespace.cpp", metadata !"/usr/local/google/home/blaikie/dev/llvm/build/clang/debug"}
208 !2 = metadata !{}
209 !3 = metadata !{metadata !4, metadata !10, metadata !14}
210 !4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f1", metadata !"f1", metadata !"_ZN1A1B2f1Ev", i32 3, metadata !8, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN1A1B2f1Ev, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f1]
211 !5 = metadata !{metadata !"foo.cpp", metadata !"/usr/local/google/home/blaikie/dev/llvm/build/clang/debug"}
212 !6 = metadata !{i32 786489, metadata !5, metadata !7, metadata !"B", i32 1} ; [ DW_TAG_namespace ] [B] [line 1]
213 !7 = metadata !{i32 786489, metadata !1, null, metadata !"A", i32 3} ; [ DW_TAG_namespace ] [A] [line 3]
214 !8 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !9, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
215 !9 = metadata !{null}
216 !10 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f1", metadata !"f1", metadata !"_ZN1A1B2f1Ei", i32 4, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32)* @_ZN1A1B2f1Ei, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [f1]
217 !11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
218 !12 = metadata !{null, metadata !13}
219 !13 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
220 !14 = metadata !{i32 786478, metadata !5, metadata !15, metadata !"func", metadata !"func", metadata !"_Z4funcb", i32 13, metadata !16, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i1)* @_Z4funcb, null, null, metadata !2, i32 13} ; [ DW_TAG_subprogram ] [line 13] [def] [func]
221 !15 = metadata !{i32 786473, metadata !5}         ; [ DW_TAG_file_type ] [/usr/local/google/home/blaikie/dev/llvm/build/clang/debug/foo.cpp]
222 !16 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !17, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
223 !17 = metadata !{metadata !13, metadata !18}
224 !18 = metadata !{i32 786468, null, null, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] [bool] [line 0, size 8, align 8, offset 0, enc DW_ATE_boolean]
225 !19 = metadata !{metadata !20}
226 !20 = metadata !{i32 786484, i32 0, metadata !6, metadata !"i", metadata !"i", metadata !"_ZN1A1B1iE", metadata !15, i32 2, metadata !13, i32 0, i32 1, i32* @_ZN1A1B1iE, null} ; [ DW_TAG_variable ] [i] [line 2] [def]
227 !21 = metadata !{metadata !22, metadata !23, metadata !24, metadata !26, metadata !27, metadata !29, metadata !37, metadata !38, metadata !39, metadata !40}
228 !22 = metadata !{i32 786490, metadata !7, metadata !6, i32 8} ; [ DW_TAG_imported_module ]
229 !23 = metadata !{i32 786490, metadata !0, metadata !7, i32 11} ; [ DW_TAG_imported_module ]
230 !24 = metadata !{i32 786490, metadata !25, metadata !6, i32 15} ; [ DW_TAG_imported_module ]
231 !25 = metadata !{i32 786443, metadata !5, metadata !14, i32 14, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/blaikie/dev/llvm/build/clang/debug/foo.cpp]
232 !26 = metadata !{i32 786490, metadata !14, metadata !7, i32 18} ; [ DW_TAG_imported_module ]
233 !27 = metadata !{i32 786440, metadata !14, metadata !28, i32 19} ; [ DW_TAG_imported_declaration ]
234 !28 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"foo", i32 5, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [foo] [line 5, size 0, align 0, offset 0] [decl] [from ]
235 !29 = metadata !{i32 786440, metadata !14, metadata !30, i32 20} ; [ DW_TAG_imported_declaration ]
236 !30 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"bar", i32 6, i64 8, i64 8, i32 0, i32 0, null, metadata !31, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [bar] [line 6, size 8, align 8, offset 0] [def] [from ]
237 !31 = metadata !{metadata !32}
238 !32 = metadata !{i32 786478, metadata !5, metadata !30, metadata !"bar", metadata !"bar", metadata !"", i32 6, metadata !33, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !36, i32 6} ; [ DW_TAG_subprogram ] [line 6] [bar]
239 !33 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !34, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
240 !34 = metadata !{null, metadata !35}
241 !35 = metadata !{i32 786447, i32 0, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !30} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from bar]
242 !36 = metadata !{i32 786468}
243 !37 = metadata !{i32 786440, metadata !14, metadata !10, i32 21} ; [ DW_TAG_imported_declaration ]
244 !38 = metadata !{i32 786440, metadata !14, metadata !20, i32 22} ; [ DW_TAG_imported_declaration ]
245 !39 = metadata !{i32 786440, metadata !14, metadata !7, i32 24, metadata !"X"} ; [ DW_TAG_imported_declaration ]
246 !40 = metadata !{i32 786440, metadata !14, metadata !39, i32 25, metadata !"Y"} ; [ DW_TAG_imported_declaration ]
247 !41 = metadata !{i32 3, i32 0, metadata !4, null}
248 !42 = metadata !{i32 786689, metadata !10, metadata !"", metadata !15, i32 16777220, metadata !13, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [line 4]
249 !43 = metadata !{i32 4, i32 0, metadata !10, null}
250 !44 = metadata !{i32 786689, metadata !14, metadata !"b", metadata !15, i32 16777229, metadata !18, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 13]
251 !45 = metadata !{i32 13, i32 0, metadata !14, null}
252 !46 = metadata !{i32 14, i32 0, metadata !14, null}
253 !47 = metadata !{i32 16, i32 0, metadata !25, null}
254 !48 = metadata !{i32 786688, metadata !14, metadata !"x", metadata !15, i32 23, metadata !30, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [x] [line 23]
255 !49 = metadata !{i32 23, i32 0, metadata !14, null}
256 !50 = metadata !{i32 26, i32 0, metadata !14, null}
257 !51 = metadata !{i32 27, i32 0, metadata !14, null}
258 !52 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}