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