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