Omit DW_AT_inline under -gmlt to save a little more space.
[oota-llvm.git] / test / DebugInfo / Inputs / gmlt.ll
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
99 define void @_Z2f1v() #0 {
100 entry:
101   ret void, !dbg !13
102 }
103
104 ; Function Attrs: nounwind uwtable
105 define void @_Z2f2v() #0 section "__TEXT,__bar" {
106 entry:
107   ret void, !dbg !14
108 }
109
110 ; Function Attrs: alwaysinline nounwind uwtable
111 define void @_Z2f3v() #1 {
112 entry:
113   call void @_Z2f1v(), !dbg !15
114   ret void, !dbg !16
115 }
116
117 ; Function Attrs: nounwind uwtable
118 define void @_Z2f4v() #0 {
119 entry:
120   call void @_Z2f1v() #2, !dbg !17
121   ret void, !dbg !19
122 }
123
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 }
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}