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}}
21 ; FIXME: Emitting separate abstract definitions is inefficient when we could
22 ; just attach the DW_AT_name to the inlined_subroutine directly. Except that
23 ; would produce many string relocations. Implement string indexing in the
24 ; skeleton CU to address the relocation problem, then remove abstract
25 ; definitions from -gmlt here.
27 ; CHECK: [[F3_ABS_DEF:.*]]: DW_TAG_subprogram
28 ; CHECK-NEXT: DW_AT_name {{.*}} "f3"
30 ; FIXME: We don't really need DW_AT_inline, consumers can ignore this due to
31 ; the absence of high_pc/low_pc/ranges and know that they just need it for
32 ; retrieving the name of a concrete inlined instance
34 ; CHECK-NEXT: DW_AT_inline
35 ; CHECK-NOT: {{DW_TAG|DW_AT|NULL}}
37 ; Check that we only provide the minimal attributes on a subprogram to save space.
38 ; CHECK: DW_TAG_subprogram
39 ; CHECK-NEXT: DW_AT_low_pc
40 ; CHECK-NEXT: DW_AT_high_pc
41 ; CHECK-NEXT: DW_AT_name
42 ; CHECK-NOT: {{DW_TAG|DW_AT}}
43 ; CHECK: DW_TAG_inlined_subroutine
45 ; As mentioned above - replace DW_AT_abstract_origin with DW_AT_name to save
46 ; space once we have support for string indexing in non-dwo sections
48 ; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[F3_ABS_DEF]]}
49 ; CHECK-NEXT: DW_AT_low_pc
50 ; CHECK-NEXT: DW_AT_high_pc
51 ; CHECK-NEXT: DW_AT_call_file
52 ; CHECK-NEXT: DW_AT_call_line
54 ; Make sure we don't have any other subprograms here (subprograms with no
55 ; inlined subroutines are omitted by design to save space)
57 ; CHECK-NOT: {{DW_TAG|DW_AT}}
59 ; CHECK-NOT: {{DW_TAG|DW_AT}}
63 ; CHECK: .debug_ranges contents:
65 ; ... some addresses (depends on platform (such as platforms with function
66 ; reordering in the linker), and looks wonky on platforms with zero values
67 ; written in relocation places (dumper needs to be fixed to read the
68 ; relocations rather than interpret that as the end of a range list))
70 ; CHECK: 00000000 <End of list>
73 ; Check that we don't emit any pubnames or pubtypes under -gmlt
74 ; CHECK: .debug_pubnames contents:
77 ; CHECK: .debug_pubtypes contents:
80 ; Function Attrs: nounwind uwtable
81 define void @_Z2f1v() #0 {
86 ; Function Attrs: nounwind uwtable
87 define void @_Z2f2v() #0 section "__TEXT,__bar" {
92 ; Function Attrs: alwaysinline nounwind uwtable
93 define void @_Z2f3v() #1 {
95 call void @_Z2f1v(), !dbg !15
99 ; Function Attrs: nounwind uwtable
100 define void @_Z2f4v() #0 {
102 call void @_Z2f1v() #2, !dbg !17
106 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" }
107 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" }
108 attributes #2 = { nounwind }
111 !llvm.module.flags = !{!10, !11}
114 !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]
115 !1 = metadata !{metadata !"gmlt.cpp", metadata !"/tmp/dbginfo"}
117 !3 = metadata !{metadata !4, metadata !7, metadata !8, metadata !9}
118 !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]
119 !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/gmlt.cpp]
120 !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 ]
121 !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]
122 !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]
123 !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]
124 !10 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
125 !11 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
126 !12 = metadata !{metadata !"clang version 3.6.0 "}
127 !13 = metadata !{i32 1, i32 12, metadata !4, null}
128 !14 = metadata !{i32 2, i32 53, metadata !7, null}
129 !15 = metadata !{i32 3, i32 44, metadata !8, null}
130 !16 = metadata !{i32 3, i32 50, metadata !8, null}
131 !17 = metadata !{i32 3, i32 44, metadata !8, metadata !18}
132 !18 = metadata !{i32 4, i32 13, metadata !9, null}
133 !19 = metadata !{i32 4, i32 19, metadata !9, null}