1 ; REQUIRES: object-emission
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 ; RUN: llvm-readobj -s -t %t | FileCheck --check-prefix=OBJ_SINGLE %s
7 ; RUN: llc < %s -split-dwarf=Enable -o %t -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu
8 ; RUN: llvm-dwarfdump %t | FileCheck --check-prefix=CHECK --check-prefix=FISSION %s
9 ; RUN: llvm-readobj -s -t %t | FileCheck --check-prefix=OBJ_FISSION %s
11 ; Generated from bar.cpp:
25 ; namespace capybara {
26 ; namespace mongoose {
54 ; SINGLE-LABEL: .debug_info contents:
55 ; FISSION-LABEL: .debug_info.dwo contents:
56 ; CHECK: Compile Unit: length = [[CU_SIZE:[0-9a-f]+]]
58 ; CHECK: [[BAR:^0x........]]: DW_TAG_structure_type
59 ; CHECK-NEXT: DW_AT_declaration
60 ; CHECK-NEXT: DW_AT_signature {{.*}} (0x1d02f3be30cc5688)
61 ; CHECK: [[FLUFFY:^0x........]]: DW_TAG_class_type
62 ; CHECK-NEXT: DW_AT_declaration
63 ; CHECK-NEXT: DW_AT_signature {{.*}} (0xb04af47397402e77)
65 ; Ensure the CU-local type 'walrus' is not placed in a type unit.
66 ; CHECK: [[WALRUS:^0x........]]: DW_TAG_structure_type
67 ; CHECK-NEXT: DW_AT_name{{.*}}"walrus"
68 ; CHECK-NEXT: DW_AT_byte_size
69 ; CHECK-NEXT: DW_AT_decl_file
70 ; CHECK-NEXT: DW_AT_decl_line
73 ; CHECK: [[WOMBAT:^0x........]]: DW_TAG_structure_type
74 ; CHECK-NEXT: DW_AT_declaration
75 ; CHECK-NEXT: DW_AT_signature {{.*}} (0xfd756cee88f8a118)
77 ; SINGLE-LABEL: .debug_types contents:
78 ; FISSION-NOT: .debug_types contents:
79 ; FISSION-LABEL: .debug_types.dwo contents:
81 ; Check that we generate a hash for bar and the value.
82 ; CHECK-NOT: type_signature
83 ; CHECK-LABEL: type_signature = 0x1d02f3be30cc5688
84 ; CHECK: DW_TAG_structure_type
85 ; CHECK-NEXT: DW_AT_name{{.*}}"bar"
88 ; Check that we generate a hash for fluffy and the value.
89 ; CHECK-NOT: type_signature
90 ; CHECK-LABEL: type_signature = 0xb04af47397402e77
91 ; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x9a0124d5a0c21c52)
92 ; CHECK: DW_TAG_namespace
93 ; CHECK-NEXT: DW_AT_name{{.*}}"echidna"
94 ; CHECK: DW_TAG_namespace
95 ; CHECK-NEXT: DW_AT_name{{.*}}"capybara"
96 ; CHECK: DW_TAG_namespace
97 ; CHECK-NEXT: DW_AT_name{{.*}}"mongoose"
98 ; CHECK: DW_TAG_class_type
99 ; CHECK-NEXT: DW_AT_name{{.*}}"fluffy"
101 ; Check that we generate a hash for wombat and the value, but not for the
102 ; anonymous type contained within.
103 ; CHECK-NOT: type_signature
104 ; CHECK-LABEL: type_signature = 0xfd756cee88f8a118
105 ; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7)
106 ; CHECK: DW_TAG_structure_type
107 ; CHECK-NEXT: DW_AT_name{{.*}}"wombat"
109 ; CHECK-NOT: type_signature
110 ; CHECK-LABEL: type_signature = 0xe94f6d3843e62d6b
111 ; CHECK: DW_TAG_type_unit
112 ; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
114 ; CHECK-NOT: DW_AT_GNU_odr_signature
115 ; CHECK: DW_TAG_structure_type
116 ; The signature for the outer 'wombat' type
117 ; CHECK: DW_AT_signature [DW_FORM_ref_sig8] (0xfd756cee88f8a118)
118 ; CHECK: DW_TAG_structure_type
119 ; CHECK-NOT: DW_AT_name
120 ; CHECK-NOT: DW_AT_GNU_odr_signature
121 ; CHECK: DW_TAG_member
122 ; CHECK-NEXT: DW_AT_name{{.*}}"a"
124 ; CHECK-LABEL: .debug_line contents:
125 ; CHECK: Line table prologue
126 ; CHECK-NOT: file_names[
127 ; SINGLE: file_names{{.*}} bar.h
128 ; CHECK: file_names{{.*}} bar.cpp
129 ; CHECK-NOT: file_names[
131 ; CHECK-LABEL: .debug_line.dwo contents:
132 ; FISSION: Line table prologue
133 ; FISSION: opcode_base: 1
134 ; FISSION-NOT: standard_opcode_lengths
135 ; FISSION-NOT: include_directories
136 ; FISSION-NOT: file_names[
137 ; FISSION: file_names{{.*}} bar.h
138 ; FISSION: file_names{{.*}} bar.cpp
139 ; FISSION-NOT: file_names[
141 ; CHECK-LABEL: .debug_str contents:
143 ; Use the unit size as a rough hash/identifier for the unit we're dealing with
144 ; it happens to be unambiguous at the moment, but it's hardly ideal.
145 ; CHECK-LABEL: .debug_pubtypes contents:
146 ; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit.
147 ; CHECK-NEXT: unit_size = [[CU_SIZE]]
148 ; CHECK-NEXT: Offset Name
149 ; CHECK-DAG: [[BAR]] "bar"
150 ; CHECK-DAG: [[WALRUS]] "(anonymous namespace)::walrus"
151 ; CHECK-DAG: [[WOMBAT]] "wombat"
152 ; CHECK-DAG: [[FLUFFY]] "echidna::capybara::mongoose::fluffy"
154 ; Make sure debug_types are in comdat groups. This could be more rigid to check
155 ; that they're the right comdat groups (each type in a separate comdat group,
157 ; OBJ_SINGLE: Name: .debug_types (
159 ; OBJ_SINGLE: SHF_GROUP
161 ; Fission type units don't go in comdat groups, since their linker is debug
162 ; aware it's handled using the debug info semantics rather than raw ELF object
164 ; OBJ_FISSION: Name: .debug_types.dwo (
165 ; OBJ_FISSION-NOT: SHF_GROUP
168 %struct.bar = type { i8 }
169 %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
170 %"struct.<anonymous namespace>::walrus" = type { i8 }
171 %struct.wombat = type { %struct.anon }
172 %struct.anon = type { i32, i32 }
173 %struct.baz = type { i8 }
175 @b = global %struct.bar zeroinitializer, align 1
176 @_ZN7echidna8capybara8mongoose6animalE = global %"class.echidna::capybara::mongoose::fluffy" zeroinitializer, align 4
177 @w = internal global %"struct.<anonymous namespace>::walrus" zeroinitializer, align 1
178 @wom = global %struct.wombat zeroinitializer, align 4
179 @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
181 ; Function Attrs: nounwind uwtable
182 define void @_Z3foov() #0 {
184 %b = alloca %struct.baz, align 1
185 call void @llvm.dbg.declare(metadata !{%struct.baz* %b}, metadata !46, metadata !{i32 786690}), !dbg !48
189 ; Function Attrs: nounwind readnone
190 declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
192 define internal void @__cxx_global_var_init() section ".text.startup" {
194 call void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* @w), !dbg !50
198 ; Function Attrs: nounwind uwtable
199 define internal void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* %this) unnamed_addr #0 align 2 {
201 %this.addr = alloca %"struct.<anonymous namespace>::walrus"*, align 8
202 store %"struct.<anonymous namespace>::walrus"* %this, %"struct.<anonymous namespace>::walrus"** %this.addr, align 8
203 call void @llvm.dbg.declare(metadata !{%"struct.<anonymous namespace>::walrus"** %this.addr}, metadata !51, metadata !{i32 786690}), !dbg !53
204 %this1 = load %"struct.<anonymous namespace>::walrus"** %this.addr
208 define internal void @_GLOBAL__I_a() section ".text.startup" {
210 call void @__cxx_global_var_init(), !dbg !55
214 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" }
215 attributes #1 = { nounwind readnone }
218 !llvm.module.flags = !{!43, !44}
221 !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]
222 !1 = metadata !{metadata !"bar.cpp", metadata !"/tmp/dbginfo"}
224 !3 = metadata !{metadata !4, metadata !6, metadata !14, metadata !17}
225 !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 ]
226 !5 = metadata !{metadata !"bar.h", metadata !"/tmp/dbginfo"}
227 !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 ]
228 !7 = metadata !{i32 786489, metadata !1, metadata !8, metadata !"mongoose", i32 12} ; [ DW_TAG_namespace ] [mongoose] [line 12]
229 !8 = metadata !{i32 786489, metadata !1, metadata !9, metadata !"capybara", i32 11} ; [ DW_TAG_namespace ] [capybara] [line 11]
230 !9 = metadata !{i32 786489, metadata !1, null, metadata !"echidna", i32 10} ; [ DW_TAG_namespace ] [echidna] [line 10]
231 !10 = metadata !{metadata !11, metadata !13}
232 !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]
233 !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]
234 !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]
235 !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 ]
236 !15 = metadata !{metadata !16}
237 !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]
238 !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 ]
239 !18 = metadata !{metadata !19, metadata !20}
240 !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]
241 !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]
242 !21 = metadata !{metadata !22, metadata !26, metadata !27, metadata !36}
243 !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]
244 !23 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/bar.cpp]
245 !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 ]
246 !25 = metadata !{null}
247 !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]
248 !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]
249 !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 ]
250 !29 = metadata !{i32 786489, metadata !1, null, metadata !"", i32 23} ; [ DW_TAG_namespace ] [line 23]
251 !30 = metadata !{metadata !31}
252 !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]
253 !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 ]
254 !33 = metadata !{null, metadata !34}
255 !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]
256 !35 = metadata !{i32 786468}
257 !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]
258 !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 ]
259 !38 = metadata !{metadata !39, metadata !40, metadata !41, metadata !42}
260 !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]
261 !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]
262 !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]
263 !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]
264 !43 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
265 !44 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
266 !45 = metadata !{metadata !"clang version 3.5 "}
267 !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]
268 !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 ]
269 !48 = metadata !{i32 7, i32 0, metadata !22, null}
270 !49 = metadata !{i32 8, i32 0, metadata !22, null} ; [ DW_TAG_imported_declaration ]
271 !50 = metadata !{i32 29, i32 0, metadata !26, null}
272 !51 = metadata !{i32 786689, metadata !27, metadata !"this", null, i32 16777216, metadata !52, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0]
273 !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]
274 !53 = metadata !{i32 0, i32 0, metadata !27, null}
275 !54 = metadata !{i32 25, i32 0, metadata !27, null}
276 !55 = metadata !{i32 25, i32 0, metadata !36, null}