a47a449f5ab08aa3c05e67f1bef2712f6b9b8161
[oota-llvm.git] / test / DebugInfo / COFF / multifunction.ll
1 ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s
2 ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s
3 ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s
4 ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s
5
6 ; This LL file was generated by running clang on the following code:
7 ; D:\source.c:
8 ;  1 void z(void);
9 ;  2
10 ;  3 void x(void) {
11 ;  4   z();
12 ;  5 }
13 ;  6
14 ;  7 void y(void) {
15 ;  8   z();
16 ;  9 }
17 ; 10
18 ; 11 void f(void) {
19 ; 12   x();
20 ; 13   y();
21 ; 14   z();
22 ; 15 }
23
24
25 ; X86-LABEL: _x:
26 ; X86-NEXT: # BB
27 ; X86-NEXT: [[X_CALL:.*]]:{{$}}
28 ; X86-NEXT: calll   _z
29 ; X86-NEXT: [[X_RETURN:.*]]:
30 ; X86-NEXT: ret
31 ; X86-NEXT: [[END_OF_X:.*]]:
32 ;
33 ; X86-LABEL: _y:
34 ; X86-NEXT: # BB
35 ; X86-NEXT: [[Y_CALL:.*]]:{{$}}
36 ; X86-NEXT: calll   _z
37 ; X86-NEXT: [[Y_RETURN:.*]]:
38 ; X86-NEXT: ret
39 ; X86-NEXT: [[END_OF_Y:.*]]:
40 ;
41 ; X86-LABEL: _f:
42 ; X86-NEXT: # BB
43 ; X86-NEXT: [[F_CALLS_X:.*]]:{{$}}
44 ; X86-NEXT: calll   _x
45 ; X86-NEXT: [[F_CALLS_Y:.*]]:
46 ; X86-NEXT: calll   _y
47 ; X86-NEXT: [[F_CALLS_Z:.*]]:
48 ; X86-NEXT: calll   _z
49 ; X86-NEXT: [[F_RETURN:.*]]:
50 ; X86-NEXT: ret
51 ; X86-NEXT: [[END_OF_F:.*]]:
52 ;
53 ; X86-LABEL: .section        .debug$S,"rd"
54 ; X86-NEXT: .long   4
55 ; Line table subsection for x
56 ; X86-NEXT: .long   242
57 ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
58 ; X86-NEXT: [[F2_START]]:
59 ; X86-NEXT: .secrel32       _x
60 ; X86-NEXT: .secidx _x
61 ; X86-NEXT: .long [[END_OF_X]]-_x
62 ; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
63 ; X86-NEXT: .long   0
64 ; X86-NEXT: .long   2
65 ; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
66 ; X86-NEXT: .long [[X_CALL]]-_x
67 ; X86-NEXT: .long   4
68 ; X86-NEXT: .long [[X_RETURN]]-_x
69 ; X86-NEXT: .long   5
70 ; X86-NEXT: [[FILE_SEGMENT_END]]:
71 ; X86-NEXT: [[F2_END]]:
72 ; Line table subsection for y
73 ; X86-NEXT: .long   242
74 ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
75 ; X86-NEXT: [[F2_START]]:
76 ; X86-NEXT: .secrel32       _y
77 ; X86-NEXT: .secidx _y
78 ; X86-NEXT: .long [[END_OF_Y]]-_y
79 ; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
80 ; X86-NEXT: .long   0
81 ; X86-NEXT: .long   2
82 ; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
83 ; X86-NEXT: .long [[Y_CALL]]-_y
84 ; X86-NEXT: .long   8
85 ; X86-NEXT: .long [[Y_RETURN]]-_y
86 ; X86-NEXT: .long   9
87 ; X86-NEXT: [[FILE_SEGMENT_END]]:
88 ; X86-NEXT: [[F2_END]]:
89 ; Line table subsection for f
90 ; X86-NEXT: .long   242
91 ; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
92 ; X86-NEXT: [[F2_START]]:
93 ; X86-NEXT: .secrel32 _f
94 ; X86-NEXT: .secidx _f
95 ; X86-NEXT: .long [[END_OF_F]]-_f
96 ; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
97 ; X86-NEXT: .long   0
98 ; X86-NEXT: .long   4
99 ; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
100 ; X86-NEXT: .long [[F_CALLS_X]]-_f
101 ; X86-NEXT: .long   12
102 ; X86-NEXT: .long [[F_CALLS_Y]]-_f
103 ; X86-NEXT: .long   13
104 ; X86-NEXT: .long [[F_CALLS_Z]]-_f
105 ; X86-NEXT: .long   14
106 ; X86-NEXT: .long [[F_RETURN]]-_f
107 ; X86-NEXT: .long   15
108 ; X86-NEXT: [[FILE_SEGMENT_END]]:
109 ; X86-NEXT: [[F2_END]]:
110 ; File index to string table offset subsection
111 ; X86-NEXT: .long   244
112 ; X86-NEXT: .long   8
113 ; X86-NEXT: .long   1
114 ; X86-NEXT: .long   0
115 ; String table
116 ; X86-NEXT: .long   243
117 ; X86-NEXT: .long   13
118 ; X86-NEXT: .byte   0
119 ; X86-NEXT: .ascii  "D:\\source.c"
120 ; X86-NEXT: .byte   0
121 ; X86-NEXT: .zero   3
122
123 ; OBJ32:    Section {
124 ; OBJ32:      Name: .debug$S (2E 64 65 62 75 67 24 53)
125 ; OBJ32:      Characteristics [ (0x42100040)
126 ; OBJ32:      ]
127 ; OBJ32:      Relocations [
128 ; OBJ32-NEXT:   0xC IMAGE_REL_I386_SECREL _x
129 ; OBJ32-NEXT:   0x10 IMAGE_REL_I386_SECTION _x
130 ; OBJ32-NEXT:   0x3C IMAGE_REL_I386_SECREL _y
131 ; OBJ32-NEXT:   0x40 IMAGE_REL_I386_SECTION _y
132 ; OBJ32-NEXT:   0x6C IMAGE_REL_I386_SECREL _f
133 ; OBJ32-NEXT:   0x70 IMAGE_REL_I386_SECTION _f
134 ; OBJ32-NEXT: ]
135 ; OBJ32:      FunctionLineTable [
136 ; OBJ32-NEXT:   Name: _x
137 ; OBJ32-NEXT:   CodeSize: 0x6
138 ; OBJ32-NEXT:   FilenameSegment [
139 ; OBJ32-NEXT:     Filename: D:\source.c
140 ; OBJ32-NEXT:     +0x0: 4
141 ; OBJ32-NEXT:     +0x5: 5
142 ; OBJ32-NEXT:   ]
143 ; OBJ32-NEXT: ]
144 ; OBJ32-NEXT: FunctionLineTable [
145 ; OBJ32-NEXT:   Name: _y
146 ; OBJ32-NEXT:   CodeSize: 0x6
147 ; OBJ32-NEXT:   FilenameSegment [
148 ; OBJ32-NEXT:     Filename: D:\source.c
149 ; OBJ32-NEXT:     +0x0: 8
150 ; OBJ32-NEXT:     +0x5: 9
151 ; OBJ32-NEXT:   ]
152 ; OBJ32-NEXT: ]
153 ; OBJ32-NEXT: FunctionLineTable [
154 ; OBJ32-NEXT:   Name: _f
155 ; OBJ32-NEXT:   CodeSize: 0x10
156 ; OBJ32-NEXT:   FilenameSegment [
157 ; OBJ32-NEXT:     Filename: D:\source.c
158 ; OBJ32-NEXT:     +0x0: 12
159 ; OBJ32-NEXT:     +0x5: 13
160 ; OBJ32-NEXT:     +0xA: 14
161 ; OBJ32-NEXT:     +0xF: 15
162 ; OBJ32-NEXT:   ]
163 ; OBJ32-NEXT: ]
164 ; OBJ32:    }
165
166 ; X64-LABEL: x:
167 ; X64-NEXT: [[X_START:.*]]:{{$}}
168 ; X64-NEXT: # BB
169 ; X64-NEXT: subq    $40, %rsp
170 ; X64-NEXT: [[X_CALL_LINE:.*]]:{{$}}
171 ; X64-NEXT: callq   z
172 ; X64-NEXT: [[X_EPILOG_AND_RET:.*]]:
173 ; X64-NEXT: addq    $40, %rsp
174 ; X64-NEXT: ret
175 ; X64-NEXT: [[END_OF_X:.*]]:
176 ;
177 ; X64-LABEL: y:
178 ; X64-NEXT: [[Y_START:.*]]:{{$}}
179 ; X64-NEXT: # BB
180 ; X64-NEXT: subq    $40, %rsp
181 ; X64-NEXT: [[Y_CALL_LINE:.*]]:{{$}}
182 ; X64-NEXT: callq   z
183 ; X64-NEXT: [[Y_EPILOG_AND_RET:.*]]:
184 ; X64-NEXT: addq    $40, %rsp
185 ; X64-NEXT: ret
186 ; X64-NEXT: [[END_OF_Y:.*]]:
187 ;
188 ; X64-LABEL: f:
189 ; X64-NEXT: [[F_START:.*]]:{{$}}
190 ; X64-NEXT: # BB
191 ; X64-NEXT: subq    $40, %rsp
192 ; X64-NEXT: [[F_CALLS_X:.*]]:{{$}}
193 ; X64-NEXT: callq   x
194 ; X64-NEXT: [[F_CALLS_Y:.*]]:
195 ; X64-NEXT: callq   y
196 ; X64-NEXT: [[F_CALLS_Z:.*]]:
197 ; X64-NEXT: callq   z
198 ; X64-NEXT: [[F_EPILOG_AND_RET:.*]]:
199 ; X64-NEXT: addq    $40, %rsp
200 ; X64-NEXT: ret
201 ; X64-NEXT: [[END_OF_F:.*]]:
202 ;
203 ; X64-LABEL: .section        .debug$S,"rd"
204 ; X64-NEXT: .long   4
205 ; Line table subsection for x
206 ; X64-NEXT: .long   242
207 ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
208 ; X64-NEXT: [[F2_START]]:
209 ; X64-NEXT: .secrel32 x
210 ; X64-NEXT: .secidx x
211 ; X64-NEXT: .long [[END_OF_X]]-x
212 ; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
213 ; X64-NEXT: .long   0
214 ; X64-NEXT: .long   3
215 ; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
216 ; X64-NEXT: .long [[X_START]]-x
217 ; X64-NEXT: .long   3
218 ; X64-NEXT: .long [[X_CALL_LINE]]-x
219 ; X64-NEXT: .long   4
220 ; X64-NEXT: .long [[X_EPILOG_AND_RET]]-x
221 ; X64-NEXT: .long   5
222 ; X64-NEXT: [[FILE_SEGMENT_END]]:
223 ; X64-NEXT: [[F2_END]]:
224 ; Line table subsection for y
225 ; X64-NEXT: .long   242
226 ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
227 ; X64-NEXT: [[F2_START]]:
228 ; X64-NEXT: .secrel32 y
229 ; X64-NEXT: .secidx y
230 ; X64-NEXT: .long [[END_OF_Y]]-y
231 ; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
232 ; X64-NEXT: .long   0
233 ; X64-NEXT: .long   3
234 ; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
235 ; X64-NEXT: .long [[Y_START]]-y
236 ; X64-NEXT: .long   7
237 ; X64-NEXT: .long [[Y_CALL_LINE]]-y
238 ; X64-NEXT: .long   8
239 ; X64-NEXT: .long [[Y_EPILOG_AND_RET]]-y
240 ; X64-NEXT: .long   9
241 ; X64-NEXT: [[FILE_SEGMENT_END]]:
242 ; X64-NEXT: [[F2_END]]:
243 ; Line table subsection for f
244 ; X64-NEXT: .long   242
245 ; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
246 ; X64-NEXT: [[F2_START]]:
247 ; X64-NEXT: .secrel32 f
248 ; X64-NEXT: .secidx f
249 ; X64-NEXT: .long [[END_OF_F]]-f
250 ; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
251 ; X64-NEXT: .long   0
252 ; X64-NEXT: .long   5
253 ; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
254 ; X64-NEXT: .long [[F_START]]-f
255 ; X64-NEXT: .long   11
256 ; X64-NEXT: .long [[F_CALLS_X]]-f
257 ; X64-NEXT: .long   12
258 ; X64-NEXT: .long [[F_CALLS_Y]]-f
259 ; X64-NEXT: .long   13
260 ; X64-NEXT: .long [[F_CALLS_Z]]-f
261 ; X64-NEXT: .long   14
262 ; X64-NEXT: .long [[F_EPILOG_AND_RET]]-f
263 ; X64-NEXT: .long   15
264 ; X64-NEXT: [[FILE_SEGMENT_END]]:
265 ; X64-NEXT: [[F2_END]]:
266 ; File index to string table offset subsection
267 ; X64-NEXT: .long   244
268 ; X64-NEXT: .long   8
269 ; X64-NEXT: .long   1
270 ; X64-NEXT: .long   0
271 ; String table
272 ; X64-NEXT: .long   243
273 ; X64-NEXT: .long   13
274 ; X64-NEXT: .byte   0
275 ; X64-NEXT: .ascii  "D:\\source.c"
276 ; X64-NEXT: .byte   0
277 ; X64-NEXT: .zero   3
278
279 ; OBJ64:    Section {
280 ; OBJ64:      Name: .debug$S (2E 64 65 62 75 67 24 53)
281 ; OBJ64:      Characteristics [ (0x42100040)
282 ; OBJ64:      ]
283 ; OBJ64:      Relocations [
284 ; OBJ64-NEXT:   0xC IMAGE_REL_AMD64_SECREL x
285 ; OBJ64-NEXT:   0x10 IMAGE_REL_AMD64_SECTION x
286 ; OBJ64-NEXT:   0x44 IMAGE_REL_AMD64_SECREL y
287 ; OBJ64-NEXT:   0x48 IMAGE_REL_AMD64_SECTION y
288 ; OBJ64-NEXT:   0x7C IMAGE_REL_AMD64_SECREL f
289 ; OBJ64-NEXT:   0x80 IMAGE_REL_AMD64_SECTION f
290 ; OBJ64-NEXT: ]
291 ; OBJ64:      FunctionLineTable [
292 ; OBJ64-NEXT:   Name: x
293 ; OBJ64-NEXT:   CodeSize: 0xE
294 ; OBJ64-NEXT:   FilenameSegment [
295 ; OBJ64-NEXT:     Filename: D:\source.c
296 ; OBJ64-NEXT:     +0x0: 3
297 ; OBJ64-NEXT:     +0x4: 4
298 ; OBJ64-NEXT:     +0x9: 5
299 ; OBJ64-NEXT:   ]
300 ; OBJ64-NEXT: ]
301 ; OBJ64-NEXT: FunctionLineTable [
302 ; OBJ64-NEXT:   Name: y
303 ; OBJ64-NEXT:   CodeSize: 0xE
304 ; OBJ64-NEXT:   FilenameSegment [
305 ; OBJ64-NEXT:     Filename: D:\source.c
306 ; OBJ64-NEXT:     +0x0: 7
307 ; OBJ64-NEXT:     +0x4: 8
308 ; OBJ64-NEXT:     +0x9: 9
309 ; OBJ64-NEXT:   ]
310 ; OBJ64-NEXT: ]
311 ; OBJ64-NEXT: FunctionLineTable [
312 ; OBJ64-NEXT:   Name: f
313 ; OBJ64-NEXT:   CodeSize: 0x18
314 ; OBJ64-NEXT:   FilenameSegment [
315 ; OBJ64-NEXT:     Filename: D:\source.c
316 ; OBJ64-NEXT:     +0x0: 11
317 ; OBJ64-NEXT:     +0x4: 12
318 ; OBJ64-NEXT:     +0x9: 13
319 ; OBJ64-NEXT:     +0xE: 14
320 ; OBJ64-NEXT:     +0x13: 15
321 ; OBJ64-NEXT:   ]
322 ; OBJ64-NEXT: ]
323 ; OBJ64:    }
324
325 ; Function Attrs: nounwind
326 define void @x() #0 {
327 entry:
328   call void @z(), !dbg !14
329   ret void, !dbg !15
330 }
331
332 declare void @z() #1
333
334 ; Function Attrs: nounwind
335 define void @y() #0 {
336 entry:
337   call void @z(), !dbg !16
338   ret void, !dbg !17
339 }
340
341 ; Function Attrs: nounwind
342 define void @f() #0 {
343 entry:
344   call void @x(), !dbg !18
345   call void @y(), !dbg !19
346   call void @z(), !dbg !20
347   ret void, !dbg !21
348 }
349
350 attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
351 attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
352
353 !llvm.dbg.cu = !{!0}
354 !llvm.module.flags = !{!11, !12}
355 !llvm.ident = !{!13}
356
357 !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99]
358 !1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"}
359 !2 = metadata !{i32 0}
360 !3 = metadata !{metadata !4, metadata !9, metadata !10}
361 !4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"x", metadata !"x", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @x, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [x]
362 !5 = metadata !{metadata !"source.c", metadata !"D:\5C"}
363 !6 = metadata !{i32 786473, metadata !5}          ; [ DW_TAG_file_type ] [D:\/source.c]
364 !7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
365 !8 = metadata !{null}
366 !9 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"y", metadata !"y", metadata !"", i32 7, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @y, null, null, metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [y]
367 !10 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 11, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32 11} ; [ DW_TAG_subprogram ] [line 11] [def] [f]
368 !11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
369 !12 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
370 !13 = metadata !{metadata !"clang version 3.5 "}
371 !14 = metadata !{i32 4, i32 0, metadata !4, null}
372 !15 = metadata !{i32 5, i32 0, metadata !4, null}
373 !16 = metadata !{i32 8, i32 0, metadata !9, null} ; [ DW_TAG_imported_declaration ]
374 !17 = metadata !{i32 9, i32 0, metadata !9, null}
375 !18 = metadata !{i32 12, i32 0, metadata !10, null}
376 !19 = metadata !{i32 13, i32 0, metadata !10, null}
377 !20 = metadata !{i32 14, i32 0, metadata !10, null}
378 !21 = metadata !{i32 15, i32 0, metadata !10, null}