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