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