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,"rnd" 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,"rnd" 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} 379