1 ; REQUIRES: object-emission
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 -debug-dump=info %t | FileCheck %s
17 ; namespace capybara {
18 ; namespace mongoose {
46 ; Check that we generate a hash for bar and the value.
47 ; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x200520c0d5b90eff)
48 ; CHECK: DW_TAG_structure_type
49 ; CHECK-NEXT: debug_str{{.*}}"bar"
51 ; Check that we generate a hash for fluffy and the value.
52 ; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x9a0124d5a0c21c52)
53 ; CHECK: DW_TAG_namespace
54 ; CHECK-NEXT: debug_str{{.*}}"echidna"
55 ; CHECK: DW_TAG_namespace
56 ; CHECK-NEXT: debug_str{{.*}}"capybara"
57 ; CHECK: DW_TAG_namespace
58 ; CHECK-NEXT: debug_str{{.*}}"mongoose"
59 ; CHECK: DW_TAG_class_type
60 ; CHECK-NEXT: debug_str{{.*}}"fluffy"
62 ; We emit no hash for walrus since the type is contained in an anonymous
63 ; namespace and won't violate any ODR-ness.
64 ; CHECK: DW_TAG_type_unit
66 ; CHECK-NOT: DW_AT_GNU_odr_signature
67 ; CHECK: DW_TAG_structure_type
68 ; CHECK-NEXT: debug_str{{.*}}"walrus"
69 ; CHECK-NEXT: DW_AT_byte_size
70 ; CHECK-NEXT: DW_AT_decl_file
71 ; CHECK-NEXT: DW_AT_decl_line
72 ; CHECK: DW_TAG_subprogram
75 ; Check that we generate a hash for wombat and the value, but not for the
76 ; anonymous type contained within.
77 ; CHECK: DW_TAG_type_unit
78 ; CHECK: DW_TAG_structure_type
79 ; The signature for the outer 'wombat' type - this can be FileChecked once the
80 ; type units are moved to their own section with the full type unit header
81 ; including the signature
82 ; CHECK: DW_AT_signature [DW_FORM_ref_sig8] (0x73776f130648b986)
83 ; CHECK: DW_TAG_structure_type
84 ; CHECK-NOT: DW_AT_name
85 ; CHECK-NOT: DW_AT_GNU_odr_signature
86 ; CHECK: DW_TAG_member
87 ; CHECK-NEXT: debug_str{{.*}}"a"
88 ; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7)
89 ; CHECK: DW_TAG_structure_type
90 ; CHECK-NEXT: debug_str{{.*}}"wombat"
92 %struct.bar = type { i8 }
93 %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
94 %"struct.<anonymous namespace>::walrus" = type { i8 }
95 %struct.wombat = type { %struct.anon }
96 %struct.anon = type { i32, i32 }
97 %struct.baz = type { i8 }
99 @b = global %struct.bar zeroinitializer, align 1
100 @_ZN7echidna8capybara8mongoose6animalE = global %"class.echidna::capybara::mongoose::fluffy" zeroinitializer, align 4
101 @w = internal global %"struct.<anonymous namespace>::walrus" zeroinitializer, align 1
102 @wom = global %struct.wombat zeroinitializer, align 4
103 @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
105 @_ZN12_GLOBAL__N_16walrusC1Ev = alias internal void (%"struct.<anonymous namespace>::walrus"*)* @_ZN12_GLOBAL__N_16walrusC2Ev
107 ; Function Attrs: nounwind uwtable
108 define void @_Z3foov() #0 {
110 %b = alloca %struct.baz, align 1
111 call void @llvm.dbg.declare(metadata !{%struct.baz* %b}, metadata !44), !dbg !46
115 ; Function Attrs: nounwind readnone
116 declare void @llvm.dbg.declare(metadata, metadata) #1
118 define internal void @__cxx_global_var_init() section ".text.startup" {
120 call void @_ZN12_GLOBAL__N_16walrusC1Ev(%"struct.<anonymous namespace>::walrus"* @w), !dbg !48
124 ; Function Attrs: nounwind uwtable
125 define internal void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* %this) unnamed_addr #0 align 2 {
127 %this.addr = alloca %"struct.<anonymous namespace>::walrus"*, align 8
128 store %"struct.<anonymous namespace>::walrus"* %this, %"struct.<anonymous namespace>::walrus"** %this.addr, align 8
129 call void @llvm.dbg.declare(metadata !{%"struct.<anonymous namespace>::walrus"** %this.addr}, metadata !49), !dbg !51
130 %this1 = load %"struct.<anonymous namespace>::walrus"** %this.addr
134 define internal void @_GLOBAL__I_a() section ".text.startup" {
136 call void @__cxx_global_var_init(), !dbg !53
140 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" }
141 attributes #1 = { nounwind readnone }
144 !llvm.module.flags = !{!42}
147 !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]
148 !1 = metadata !{metadata !"bar.cpp", metadata !"/tmp/dbginfo"}
149 !2 = metadata !{i32 0}
150 !3 = metadata !{metadata !4, metadata !5, metadata !13, metadata !16}
151 !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 ]
152 !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 ]
153 !6 = metadata !{i32 786489, metadata !1, metadata !7, metadata !"mongoose", i32 12} ; [ DW_TAG_namespace ] [mongoose] [line 12]
154 !7 = metadata !{i32 786489, metadata !1, metadata !8, metadata !"capybara", i32 11} ; [ DW_TAG_namespace ] [capybara] [line 11]
155 !8 = metadata !{i32 786489, metadata !1, null, metadata !"echidna", i32 10} ; [ DW_TAG_namespace ] [echidna] [line 10]
156 !9 = metadata !{metadata !10, metadata !12}
157 !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]
158 !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]
159 !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]
160 !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 ]
161 !14 = metadata !{metadata !15}
162 !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]
163 !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 ]
164 !17 = metadata !{metadata !18, metadata !19}
165 !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]
166 !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]
167 !20 = metadata !{metadata !21, metadata !25, metadata !26, metadata !35}
168 !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]
169 !22 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/bar.cpp]
170 !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 ]
171 !24 = metadata !{null}
172 !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]
173 !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]
174 !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 ]
175 !28 = metadata !{i32 786489, metadata !1, null, metadata !"", i32 23} ; [ DW_TAG_namespace ] [line 23]
176 !29 = metadata !{metadata !30}
177 !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]
178 !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 ]
179 !32 = metadata !{null, metadata !33}
180 !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]
181 !34 = metadata !{i32 786468}
182 !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]
183 !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 ]
184 !37 = metadata !{metadata !38, metadata !39, metadata !40, metadata !41}
185 !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]
186 !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]
187 !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]
188 !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]
189 !42 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
190 !43 = metadata !{metadata !"clang version 3.4 "}
191 !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]
192 !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 ]
193 !46 = metadata !{i32 7, i32 0, metadata !21, null}
194 !47 = metadata !{i32 8, i32 0, metadata !21, null} ; [ DW_TAG_imported_declaration ]
195 !48 = metadata !{i32 29, i32 0, metadata !25, null}
196 !49 = metadata !{i32 786689, metadata !26, metadata !"this", null, i32 16777216, metadata !50, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0]
197 !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]
198 !51 = metadata !{i32 0, i32 0, metadata !26, null}
199 !52 = metadata !{i32 25, i32 0, metadata !26, null}
200 !53 = metadata !{i32 25, i32 0, metadata !35, null}