Disable the -gmlt optimization implemented in r218129 under Darwin due to issues...
[oota-llvm.git] / test / DebugInfo / gmlt.ll
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
5
6 ; Generated from the following source compiled with clang++ -gmlt:
7 ; void f1() {}
8 ; void __attribute__((section("__TEXT,__bar"))) f2() {}
9 ; void __attribute__((always_inline)) f3() { f1(); }
10 ; void f4() { f3(); }
11
12 ; Check that
13 ;  * -gmlt includes no DW_TAG_subprograms for subprograms without inlined
14 ;    subroutines.
15 ;  * yet still produces DW_AT_ranges and a range list in debug_ranges that
16 ;    describes those subprograms
17
18 ; CHECK: DW_TAG_compile_unit
19 ; CHECK:   DW_AT_ranges [DW_FORM_sec_offset] (0x00000000)
20 ; CHECK-NOT: {{DW_TAG|NULL}}
21
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).
25
26 ; DARWIN:  DW_TAG_subprogram
27 ; DARWIN-NOT: DW_TAG
28 ; DARWIN:    DW_AT_name {{.*}} "f1"
29 ; DARWIN-NOT: {{DW_TAG|NULL}}
30 ; DARWIN:  DW_TAG_subprogram
31 ; DARWIN-NOT: DW_TAG
32 ; DARWIN:    DW_AT_name {{.*}} "f2"
33 ; DARWIN-NOT: {{DW_TAG|NULL}}
34 ; DARWIN:  DW_TAG_subprogram
35 ; DARWIN-NOT: DW_TAG
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}}
40
41
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.
47
48 ; CHECK: [[F3_ABS_DEF:.*]]:  DW_TAG_subprogram
49 ; CHECK-NEXT:     DW_AT_name {{.*}} "f3"
50
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
54
55 ; CHECK-NEXT:     DW_AT_inline
56 ; CHECK-NOT: {{DW_TAG|DW_AT|NULL}}
57
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
65
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
68
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
74
75 ; Make sure we don't have any other subprograms here (subprograms with no
76 ; inlined subroutines are omitted by design to save space)
77
78 ; CHECK-NOT: {{DW_TAG|DW_AT}}
79 ; CHECK: NULL
80 ; CHECK-NOT: {{DW_TAG|DW_AT}}
81 ; CHECK: NULL
82
83
84 ; CHECK: .debug_ranges contents:
85
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))
90
91 ; CHECK: 00000000 <End of list>
92
93
94 ; Check that we don't emit any pubnames or pubtypes under -gmlt
95 ; CHECK: .debug_pubnames contents:
96 ; CHECK-NOT: Offset
97
98 ; CHECK: .debug_pubtypes contents:
99 ; CHECK-NOT: Offset
100
101 ; Function Attrs: nounwind uwtable
102 define void @_Z2f1v() #0 {
103 entry:
104   ret void, !dbg !13
105 }
106
107 ; Function Attrs: nounwind uwtable
108 define void @_Z2f2v() #0 section "__TEXT,__bar" {
109 entry:
110   ret void, !dbg !14
111 }
112
113 ; Function Attrs: alwaysinline nounwind uwtable
114 define void @_Z2f3v() #1 {
115 entry:
116   call void @_Z2f1v(), !dbg !15
117   ret void, !dbg !16
118 }
119
120 ; Function Attrs: nounwind uwtable
121 define void @_Z2f4v() #0 {
122 entry:
123   call void @_Z2f1v() #2, !dbg !17
124   ret void, !dbg !19
125 }
126
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 }
130
131 !llvm.dbg.cu = !{!0}
132 !llvm.module.flags = !{!10, !11}
133 !llvm.ident = !{!12}
134
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"}
137 !2 = metadata !{}
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}