Home | History | Annotate | Download | only in COFF
      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