1 ; REQUIRES: object-emission
2 ; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s
4 ; Generated from the following source compiled with clang++ -gmlt:
6 ; void __attribute__((section("__TEXT,__bar"))) f2() {}
7 ; void __attribute__((always_inline)) f3() { f1(); }
11 ; * -gmlt includes no DW_TAG_subprograms for subprograms without inlined
13 ; * yet still produces DW_AT_ranges and a range list in debug_ranges that
14 ; describes those subprograms
16 ; CHECK: DW_TAG_compile_unit
17 ; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000)
18 ; CHECK-NOT: {{DW_TAG|NULL}}
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).
24 ; DARWIN: DW_TAG_subprogram
26 ; DARWIN: DW_AT_name {{.*}} "f1"
27 ; DARWIN-NOT: {{DW_TAG|NULL}}
28 ; DARWIN: DW_TAG_subprogram
30 ; DARWIN: DW_AT_name {{.*}} "f2"
31 ; DARWIN-NOT: {{DW_TAG|NULL}}
32 ; DARWIN: DW_TAG_subprogram
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}}
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.
46 ; CHECK: [[F3_ABS_DEF:.*]]: DW_TAG_subprogram
47 ; CHECK-NEXT: DW_AT_name {{.*}} "f3"
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
53 ; CHECK-NOT: {{DW_TAG|DW_AT|NULL}}
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
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
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
72 ; Make sure we don't have any other subprograms here (subprograms with no
73 ; inlined subroutines are omitted by design to save space)
75 ; CHECK-NOT: {{DW_TAG|DW_AT}}
77 ; CHECK-NOT: {{DW_TAG|DW_AT}}
81 ; CHECK: .debug_ranges contents:
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))
88 ; CHECK: 00000000 <End of list>
91 ; Check that we don't emit any pubnames or pubtypes under -gmlt
92 ; CHECK: .debug_pubnames contents:
95 ; CHECK: .debug_pubtypes contents:
98 ; Function Attrs: nounwind uwtable
99 define void @_Z2f1v() #0 {
104 ; Function Attrs: nounwind uwtable
105 define void @_Z2f2v() #0 section "__TEXT,__bar" {
110 ; Function Attrs: alwaysinline nounwind uwtable
111 define void @_Z2f3v() #1 {
113 call void @_Z2f1v(), !dbg !15
117 ; Function Attrs: nounwind uwtable
118 define void @_Z2f4v() #0 {
120 call void @_Z2f1v() #2, !dbg !17
124 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" }
125 attributes #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" }
126 attributes #2 = { nounwind }
129 !llvm.module.flags = !{!10, !11}
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"}
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}