DebugInfo: Implement DW_AT_stmt_list for type units
[oota-llvm.git] / test / DebugInfo / X86 / generate-odr-hash.ll
1 ; REQUIRES: object-emission
2
3 ; RUN: llc %s -o %t -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu
4 ; RUN: llvm-dwarfdump %t | FileCheck --check-prefix=CHECK --check-prefix=SINGLE %s
5
6 ; RUN: llc %s -split-dwarf=Enable -o %t -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu
7 ; RUN: llvm-dwarfdump %t | FileCheck --check-prefix=CHECK --check-prefix=FISSION %s
8
9 ; Generated from bar.cpp:
10
11 ; #line 1 "bar.h"
12 ; struct bar {};
13 ; #line 2 "bar.cpp"
14
15 ; struct bar b;
16
17 ; void foo(void) {
18 ;   struct baz {};
19 ;   baz b;
20 ; }
21
22 ; namespace echidna {
23 ; namespace capybara {
24 ; namespace mongoose {
25 ; class fluffy {
26 ;   int a;
27 ;   int b;
28 ; };
29
30 ; fluffy animal;
31 ; }
32 ; }
33 ; }
34
35 ; namespace {
36 ; struct walrus {
37 ;   walrus() {}
38 ; };
39 ; }
40
41 ; walrus w;
42
43 ; struct wombat {
44 ;   struct {
45 ;     int a;
46 ;     int b;
47 ;   } a_b;
48 ; };
49
50 ; wombat wom;
51
52 ; SINGLE-LABEL: .debug_info contents:
53 ; FISSION-LABEL: .debug_info.dwo contents:
54 ; CHECK: Compile Unit: length = [[CU_SIZE:[0-9a-f]+]]
55
56 ; CHECK: DW_TAG_structure_type
57 ; CHECK-NEXT: DW_AT_declaration
58 ; CHECK-NEXT: DW_AT_signature
59 ; CHECK: DW_TAG_class_type
60 ; CHECK-NEXT: DW_AT_declaration
61 ; CHECK-NEXT: DW_AT_signature
62
63 ; Ensure the CU-local type 'walrus' is not placed in a type unit.
64 ; CHECK: DW_TAG_structure_type
65 ; CHECK-NEXT: DW_AT_name{{.*}}"walrus"
66 ; CHECK-NEXT: DW_AT_byte_size
67 ; CHECK-NEXT: DW_AT_decl_file
68 ; CHECK-NEXT: DW_AT_decl_line
69
70 ; FISSION-LABEL: .debug_types contents:
71 ; FISSION-NOT: type_signature
72 ; FISSION-LABEL: type_signature = 0x1d02f3be30cc5688
73 ; FISSION: DW_TAG_type_unit
74 ; FISSION: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
75 ; FISSION: DW_AT_GNU_dwo_name{{.*}}"bar.dwo"
76 ; FISSION: DW_AT_comp_dir{{.*}}"/tmp/dbginfo"
77 ; FISSION-NOT: type_signature
78 ; FISSION-LABEL: type_signature = 0xb04af47397402e77
79 ; FISSION-NOT: type_signature
80 ; FISSION-LABEL: type_signature = 0xfd756cee88f8a118
81 ; FISSION-NOT: type_signature
82 ; FISSION-LABEL: type_signature = 0xe94f6d3843e62d6b
83
84 ; SINGLE-LABEL: .debug_types contents:
85 ; FISSION-LABEL: .debug_types.dwo contents:
86
87 ; Check that we generate a hash for bar and the value.
88 ; CHECK-NOT: type_signature
89 ; CHECK-LABEL: type_signature = 0x1d02f3be30cc5688
90 ; CHECK: DW_TAG_structure_type
91 ; CHECK-NEXT: DW_AT_name{{.*}}"bar"
92
93
94 ; Check that we generate a hash for fluffy and the value.
95 ; CHECK-NOT: type_signature
96 ; CHECK-LABEL: type_signature = 0xb04af47397402e77
97 ; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8]   (0x9a0124d5a0c21c52)
98 ; CHECK: DW_TAG_namespace
99 ; CHECK-NEXT: DW_AT_name{{.*}}"echidna"
100 ; CHECK: DW_TAG_namespace
101 ; CHECK-NEXT: DW_AT_name{{.*}}"capybara"
102 ; CHECK: DW_TAG_namespace
103 ; CHECK-NEXT: DW_AT_name{{.*}}"mongoose"
104 ; CHECK: DW_TAG_class_type
105 ; CHECK-NEXT: DW_AT_name{{.*}}"fluffy"
106
107 ; Check that we generate a hash for wombat and the value, but not for the
108 ; anonymous type contained within.
109 ; CHECK-NOT: type_signature
110 ; CHECK-LABEL: type_signature = 0xfd756cee88f8a118
111 ; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7)
112 ; CHECK: DW_TAG_structure_type
113 ; CHECK-NEXT: DW_AT_name{{.*}}"wombat"
114
115 ; CHECK-NOT: type_signature
116 ; CHECK-LABEL: type_signature = 0xe94f6d3843e62d6b
117 ; CHECK: DW_TAG_type_unit
118 ; SINGLE: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
119 ; FISSION-NOT: DW_AT_stmt_list
120 ; CHECK-NOT: NULL
121 ; CHECK-NOT: DW_AT_GNU_odr_signature
122 ; CHECK: DW_TAG_structure_type
123 ; The signature for the outer 'wombat' type
124 ; CHECK: DW_AT_signature [DW_FORM_ref_sig8] (0xfd756cee88f8a118)
125 ; CHECK: DW_TAG_structure_type
126 ; CHECK-NOT: DW_AT_name
127 ; CHECK-NOT: DW_AT_GNU_odr_signature
128 ; CHECK: DW_TAG_member
129 ; CHECK-NEXT: DW_AT_name{{.*}}"a"
130
131 ; CHECK-LABEL: .debug_line contents:
132 ; CHECK: Line table prologue
133 ; CHECK-NOT: file_names[
134 ; CHECK: file_names{{.*}} bar.h
135 ; CHECK: file_names{{.*}} bar.cpp
136 ; CHECK-NOT: file_names[
137 ; CHECK-LABEL: .debug_str contents:
138
139 ; Use the unit size as a rough hash/identifier for the unit we're dealing with
140 ; it happens to be unambiguous at the moment, but it's hardly ideal.
141 ; CHECK-LABEL: .debug_pubtypes contents:
142 ; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit.
143 ; CHECK-NEXT: unit_size = [[CU_SIZE]]
144 ; CHECK-NEXT: Offset Name
145 ; CHECK-NEXT: "walrus"
146 ; Type unit for 'bar'
147 ; SINGLE-NEXT: unit_size = 0x00000027
148 ; FISSION-NEXT: unit_size = 0x00000028
149 ; CHECK-NEXT: Offset Name
150 ; CHECK-NEXT: "bar"
151 ; SINGLE-NEXT: unit_size = 0x00000061
152 ; FISSION-NEXT: unit_size = 0x00000028
153 ; CHECK-NEXT: Offset Name
154 ; CHECK-NEXT: "int"
155 ; CHECK-NEXT: "echidna::capybara::mongoose::fluffy"
156 ; SINGLE-NEXT: unit_size = 0x0000003e
157 ; FISSION-NEXT: unit_size = 0x00000028
158 ; CHECK-NEXT: Offset Name
159 ; CHECK-NEXT: "wombat"
160 ; SINGLE-NEXT: unit_size = 0x0000004f
161 ; FISSION-NEXT: unit_size = 0x00000028
162 ; CHECK-NEXT: Offset Name
163 ; CHECK-NEXT: "int"
164
165 %struct.bar = type { i8 }
166 %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
167 %"struct.<anonymous namespace>::walrus" = type { i8 }
168 %struct.wombat = type { %struct.anon }
169 %struct.anon = type { i32, i32 }
170 %struct.baz = type { i8 }
171
172 @b = global %struct.bar zeroinitializer, align 1
173 @_ZN7echidna8capybara8mongoose6animalE = global %"class.echidna::capybara::mongoose::fluffy" zeroinitializer, align 4
174 @w = internal global %"struct.<anonymous namespace>::walrus" zeroinitializer, align 1
175 @wom = global %struct.wombat zeroinitializer, align 4
176 @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
177
178 ; Function Attrs: nounwind uwtable
179 define void @_Z3foov() #0 {
180 entry:
181   %b = alloca %struct.baz, align 1
182   call void @llvm.dbg.declare(metadata !{%struct.baz* %b}, metadata !46), !dbg !48
183   ret void, !dbg !49
184 }
185
186 ; Function Attrs: nounwind readnone
187 declare void @llvm.dbg.declare(metadata, metadata) #1
188
189 define internal void @__cxx_global_var_init() section ".text.startup" {
190 entry:
191   call void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* @w), !dbg !50
192   ret void, !dbg !50
193 }
194
195 ; Function Attrs: nounwind uwtable
196 define internal void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* %this) unnamed_addr #0 align 2 {
197 entry:
198   %this.addr = alloca %"struct.<anonymous namespace>::walrus"*, align 8
199   store %"struct.<anonymous namespace>::walrus"* %this, %"struct.<anonymous namespace>::walrus"** %this.addr, align 8
200   call void @llvm.dbg.declare(metadata !{%"struct.<anonymous namespace>::walrus"** %this.addr}, metadata !51), !dbg !53
201   %this1 = load %"struct.<anonymous namespace>::walrus"** %this.addr
202   ret void, !dbg !54
203 }
204
205 define internal void @_GLOBAL__I_a() section ".text.startup" {
206 entry:
207   call void @__cxx_global_var_init(), !dbg !55
208   ret void, !dbg !55
209 }
210
211 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" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
212 attributes #1 = { nounwind readnone }
213
214 !llvm.dbg.cu = !{!0}
215 !llvm.module.flags = !{!43, !44}
216 !llvm.ident = !{!45}
217
218 !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !21, metadata !38, metadata !2, metadata !"bar.dwo"} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/bar.cpp] [DW_LANG_C_plus_plus]
219 !1 = metadata !{metadata !"bar.cpp", metadata !"/tmp/dbginfo"}
220 !2 = metadata !{}
221 !3 = metadata !{metadata !4, metadata !6, metadata !14, metadata !17}
222 !4 = metadata !{i32 786451, metadata !5, null, metadata !"bar", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, metadata !"_ZTS3bar"} ; [ DW_TAG_structure_type ] [bar] [line 1, size 8, align 8, offset 0] [def] [from ]
223 !5 = metadata !{metadata !"bar.h", metadata !"/tmp/dbginfo"}
224 !6 = metadata !{i32 786434, metadata !1, metadata !7, metadata !"fluffy", i32 13, i64 64, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE"} ; [ DW_TAG_class_type ] [fluffy] [line 13, size 64, align 32, offset 0] [def] [from ]
225 !7 = metadata !{i32 786489, metadata !1, metadata !8, metadata !"mongoose", i32 12} ; [ DW_TAG_namespace ] [mongoose] [line 12]
226 !8 = metadata !{i32 786489, metadata !1, metadata !9, metadata !"capybara", i32 11} ; [ DW_TAG_namespace ] [capybara] [line 11]
227 !9 = metadata !{i32 786489, metadata !1, null, metadata !"echidna", i32 10} ; [ DW_TAG_namespace ] [echidna] [line 10]
228 !10 = metadata !{metadata !11, metadata !13}
229 !11 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE", metadata !"a", i32 14, i64 32, i64 32, i64 0, i32 1, metadata !12} ; [ DW_TAG_member ] [a] [line 14, size 32, align 32, offset 0] [private] [from int]
230 !12 = 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]
231 !13 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE", metadata !"b", i32 15, i64 32, i64 32, i64 32, i32 1, metadata !12} ; [ DW_TAG_member ] [b] [line 15, size 32, align 32, offset 32] [private] [from int]
232 !14 = metadata !{i32 786451, metadata !1, null, metadata !"wombat", i32 31, i64 64, i64 32, i32 0, i32 0, null, metadata !15, i32 0, null, null, metadata !"_ZTS6wombat"} ; [ DW_TAG_structure_type ] [wombat] [line 31, size 64, align 32, offset 0] [def] [from ]
233 !15 = metadata !{metadata !16}
234 !16 = metadata !{i32 786445, metadata !1, metadata !"_ZTS6wombat", metadata !"a_b", i32 35, i64 64, i64 32, i64 0, i32 0, metadata !"_ZTSN6wombatUt_E"} ; [ DW_TAG_member ] [a_b] [line 35, size 64, align 32, offset 0] [from _ZTSN6wombatUt_E]
235 !17 = metadata !{i32 786451, metadata !1, metadata !"_ZTS6wombat", metadata !"", i32 32, i64 64, i64 32, i32 0, i32 0, null, metadata !18, i32 0, null, null, metadata !"_ZTSN6wombatUt_E"} ; [ DW_TAG_structure_type ] [line 32, size 64, align 32, offset 0] [def] [from ]
236 !18 = metadata !{metadata !19, metadata !20}
237 !19 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN6wombatUt_E", metadata !"a", i32 33, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ] [a] [line 33, size 32, align 32, offset 0] [from int]
238 !20 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN6wombatUt_E", metadata !"b", i32 34, i64 32, i64 32, i64 32, i32 0, metadata !12} ; [ DW_TAG_member ] [b] [line 34, size 32, align 32, offset 32] [from int]
239 !21 = metadata !{metadata !22, metadata !26, metadata !27, metadata !36}
240 !22 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"foo", metadata !"foo", metadata !"_Z3foov", i32 5, metadata !24, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3foov, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [foo]
241 !23 = metadata !{i32 786473, metadata !1}         ; [ DW_TAG_file_type ] [/tmp/dbginfo/bar.cpp]
242 !24 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !25, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
243 !25 = metadata !{null}
244 !26 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"__cxx_global_var_init", metadata !"__cxx_global_var_init", metadata !"", i32 29, metadata !24, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @__cxx_global_var_init, null, null, metadata !2, i32 29} ; [ DW_TAG_subprogram ] [line 29] [local] [def] [__cxx_global_var_init]
245 !27 = metadata !{i32 786478, metadata !1, metadata !28, metadata !"walrus", metadata !"walrus", metadata !"_ZN12_GLOBAL__N_16walrusC2Ev", i32 25, metadata !32, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%"struct.<anonymous namespace>::walrus"*)* @_ZN12_GLOBAL__N_16walrusC2Ev, null, metadata !31, metadata !2, i32 25} ; [ DW_TAG_subprogram ] [line 25] [local] [def] [walrus]
246 !28 = metadata !{i32 786451, metadata !1, metadata !29, metadata !"walrus", i32 24, i64 8, i64 8, i32 0, i32 0, null, metadata !30, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [walrus] [line 24, size 8, align 8, offset 0] [def] [from ]
247 !29 = metadata !{i32 786489, metadata !1, null, metadata !"", i32 23} ; [ DW_TAG_namespace ] [line 23]
248 !30 = metadata !{metadata !31}
249 !31 = metadata !{i32 786478, metadata !1, metadata !28, metadata !"walrus", metadata !"walrus", metadata !"", i32 25, metadata !32, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !35, i32 25} ; [ DW_TAG_subprogram ] [line 25] [walrus]
250 !32 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !33, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
251 !33 = metadata !{null, metadata !34}
252 !34 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !28} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from walrus]
253 !35 = metadata !{i32 786468}
254 !36 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"", metadata !"", metadata !"_GLOBAL__I_a", i32 25, metadata !37, i1 true, i1 true, i32 0, i32 0, null, i32 64, i1 false, void ()* @_GLOBAL__I_a, null, null, metadata !2, i32 25} ; [ DW_TAG_subprogram ] [line 25] [local] [def]
255 !37 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
256 !38 = metadata !{metadata !39, metadata !40, metadata !41, metadata !42}
257 !39 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !23, i32 3, metadata !4, i32 0, i32 1, %struct.bar* @b, null} ; [ DW_TAG_variable ] [b] [line 3] [def]
258 !40 = metadata !{i32 786484, i32 0, metadata !7, metadata !"animal", metadata !"animal", metadata !"_ZN7echidna8capybara8mongoose6animalE", metadata !23, i32 18, metadata !6, i32 0, i32 1, %"class.echidna::capybara::mongoose::fluffy"* @_ZN7echidna8capybara8mongoose6animalE, null} ; [ DW_TAG_variable ] [animal] [line 18] [def]
259 !41 = metadata !{i32 786484, i32 0, null, metadata !"w", metadata !"w", metadata !"", metadata !23, i32 29, metadata !28, i32 1, i32 1, %"struct.<anonymous namespace>::walrus"* @w, null} ; [ DW_TAG_variable ] [w] [line 29] [local] [def]
260 !42 = metadata !{i32 786484, i32 0, null, metadata !"wom", metadata !"wom", metadata !"", metadata !23, i32 38, metadata !14, i32 0, i32 1, %struct.wombat* @wom, null} ; [ DW_TAG_variable ] [wom] [line 38] [def]
261 !43 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
262 !44 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
263 !45 = metadata !{metadata !"clang version 3.5 "}
264 !46 = metadata !{i32 786688, metadata !22, metadata !"b", metadata !23, i32 7, metadata !47, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 7]
265 !47 = metadata !{i32 786451, metadata !1, metadata !22, metadata !"baz", i32 6, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [baz] [line 6, size 8, align 8, offset 0] [def] [from ]
266 !48 = metadata !{i32 7, i32 0, metadata !22, null}
267 !49 = metadata !{i32 8, i32 0, metadata !22, null} ; [ DW_TAG_imported_declaration ]
268 !50 = metadata !{i32 29, i32 0, metadata !26, null}
269 !51 = metadata !{i32 786689, metadata !27, metadata !"this", null, i32 16777216, metadata !52, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0]
270 !52 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !28} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from walrus]
271 !53 = metadata !{i32 0, i32 0, metadata !27, null}
272 !54 = metadata !{i32 25, i32 0, metadata !27, null}
273 !55 = metadata !{i32 25, i32 0, metadata !36, null}