1; REQUIRES: object-emission 2; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s 3 4; Generated from the following source compiled with clang++ -gmlt: 5; void f1() {} 6; void __attribute__((section("__TEXT,__bar"))) f2() {} 7; void __attribute__((always_inline)) f3() { f1(); } 8; void f4() { f3(); } 9 10; Check that 11; * -gmlt includes no DW_TAG_subprograms for subprograms without inlined 12; subroutines. 13; * yet still produces DW_AT_ranges and a range list in debug_ranges that 14; describes those subprograms 15 16; CHECK: DW_TAG_compile_unit 17; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000) 18; CHECK-NOT: {{DW_TAG|NULL}} 19 20; Omitting the subprograms without inlined subroutines is not possible 21; currently on Darwin as dsymutil will drop the whole CU if it has no subprograms 22; (which happens with this optimization if there are no inlined subroutines). 23 24; DARWIN: DW_TAG_subprogram 25; DARWIN-NOT: DW_TAG 26; DARWIN: DW_AT_name {{.*}} "f1" 27; DARWIN-NOT: {{DW_TAG|NULL}} 28; DARWIN: DW_TAG_subprogram 29; DARWIN-NOT: DW_TAG 30; DARWIN: DW_AT_name {{.*}} "f2" 31; DARWIN-NOT: {{DW_TAG|NULL}} 32; DARWIN: DW_TAG_subprogram 33; DARWIN-NOT: DW_TAG 34; Can't check the abstract_origin value across the DARWIN/CHECK checking and 35; ordering, so don't bother - just trust me, it refers to f3 down there. 36; DARWIN: DW_AT_abstract_origin 37; DARWIN-NOT: {{DW_TAG|NULL}} 38 39 40; FIXME: Emitting separate abstract definitions is inefficient when we could 41; just attach the DW_AT_name to the inlined_subroutine directly. Except that 42; would produce many string relocations. Implement string indexing in the 43; skeleton CU to address the relocation problem, then remove abstract 44; definitions from -gmlt here. 45 46; CHECK: [[F3_ABS_DEF:.*]]: DW_TAG_subprogram 47; CHECK-NEXT: DW_AT_name {{.*}} "f3" 48 49; FIXME: We don't really need DW_AT_inline, consumers can ignore this due to 50; the absence of high_pc/low_pc/ranges and know that they just need it for 51; retrieving the name of a concrete inlined instance 52 53; CHECK-NOT: {{DW_TAG|DW_AT|NULL}} 54 55; Check that we only provide the minimal attributes on a subprogram to save space. 56; CHECK: DW_TAG_subprogram 57; CHECK-NEXT: DW_AT_low_pc 58; CHECK-NEXT: DW_AT_high_pc 59; CHECK-NEXT: DW_AT_name 60; CHECK-NOT: {{DW_TAG|DW_AT}} 61; CHECK: DW_TAG_inlined_subroutine 62 63; As mentioned above - replace DW_AT_abstract_origin with DW_AT_name to save 64; space once we have support for string indexing in non-dwo sections 65 66; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[F3_ABS_DEF]]} 67; CHECK-NEXT: DW_AT_low_pc 68; CHECK-NEXT: DW_AT_high_pc 69; CHECK-NEXT: DW_AT_call_file 70; CHECK-NEXT: DW_AT_call_line 71 72; Make sure we don't have any other subprograms here (subprograms with no 73; inlined subroutines are omitted by design to save space) 74 75; CHECK-NOT: {{DW_TAG|DW_AT}} 76; CHECK: NULL 77; CHECK-NOT: {{DW_TAG|DW_AT}} 78; CHECK: NULL 79 80 81; CHECK: .debug_ranges contents: 82 83; ... some addresses (depends on platform (such as platforms with function 84; reordering in the linker), and looks wonky on platforms with zero values 85; written in relocation places (dumper needs to be fixed to read the 86; relocations rather than interpret that as the end of a range list)) 87 88; CHECK: 00000000 <End of list> 89 90 91; Check that we don't emit any pubnames or pubtypes under -gmlt 92; CHECK: .debug_pubnames contents: 93; CHECK-NOT: Offset 94 95; CHECK: .debug_pubtypes contents: 96; CHECK-NOT: Offset 97 98; Function Attrs: nounwind uwtable 99define void @_Z2f1v() #0 { 100entry: 101 ret void, !dbg !13 102} 103 104; Function Attrs: nounwind uwtable 105define void @_Z2f2v() #0 section "__TEXT,__bar" { 106entry: 107 ret void, !dbg !14 108} 109 110; Function Attrs: alwaysinline nounwind uwtable 111define void @_Z2f3v() #1 { 112entry: 113 call void @_Z2f1v(), !dbg !15 114 ret void, !dbg !16 115} 116 117; Function Attrs: nounwind uwtable 118define void @_Z2f4v() #0 { 119entry: 120 call void @_Z2f1v() #2, !dbg !17 121 ret void, !dbg !19 122} 123 124attributes #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" } 125attributes #1 = { alwaysinline 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" } 126attributes #2 = { nounwind } 127 128!llvm.dbg.cu = !{!0} 129!llvm.module.flags = !{!10, !11} 130!llvm.ident = !{!12} 131 132!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.6.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/gmlt.cpp] [DW_LANG_C_plus_plus] 133!1 = metadata !{metadata !"gmlt.cpp", metadata !"/tmp/dbginfo"} 134!2 = metadata !{} 135!3 = metadata !{metadata !4, metadata !7, metadata !8, metadata !9} 136!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f1", metadata !"f1", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z2f1v, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [f1] 137!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/gmlt.cpp] 138!6 = 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 ] 139!7 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f2", metadata !"f2", metadata !"", i32 2, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z2f2v, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [f2] 140!8 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f3", metadata !"f3", metadata !"", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z2f3v, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f3] 141!9 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f4", metadata !"f4", metadata !"", i32 4, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z2f4v, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [f4] 142!10 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} 143!11 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} 144!12 = metadata !{metadata !"clang version 3.6.0 "} 145!13 = metadata !{i32 1, i32 12, metadata !4, null} 146!14 = metadata !{i32 2, i32 53, metadata !7, null} 147!15 = metadata !{i32 3, i32 44, metadata !8, null} 148!16 = metadata !{i32 3, i32 50, metadata !8, null} 149!17 = metadata !{i32 3, i32 44, metadata !8, metadata !18} 150!18 = metadata !{i32 4, i32 13, metadata !9, null} 151!19 = metadata !{i32 4, i32 19, metadata !9, null} 152