# REQUIRES: x86 # RUN: split-file %s %t # RUN: llvm-mc --triple=x86_64-pc-linux -filetype=obj %t/a.s -o %t/a.o # RUN: %lldb %t/a.o -o "settings set target.source-map . %t" \ # RUN: -o "settings set interpreter.stop-command-source-on-error false" \ # RUN: -s %t/commands -o exit 2>&1 | FileCheck %s #--- commands # CASE 0: function at the start of the file source list -n func0 # CHECK-LABEL: source list -n func0 # CHECK-NEXT: File: file0.c # CHECK-NEXT: 1 content of file0.c:1 # CHECK-NEXT: 2 content of file0.c:2 # CHECK-NEXT: 3 content of file0.c:3 # CHECK-NEXT: 4 content of file0.c:4 # CHECK-NEXT: 5 content of file0.c:5 # CHECK-NEXT: 6 content of file0.c:6 # CHECK-NEXT: 7 content of file0.c:7 # CHECK-NEXT: 8 content of file0.c:8 # CHECK-NEXT: 9 content of file0.c:9 # CHECK-NEXT: 10 content of file0.c:10 # CASE 1: function in the middle of the file source list -n func1 # CHECK-NEXT: source list -n func1 # CHECK-NEXT: File: file0.c # CHECK-NEXT: 5 content of file0.c:5 # CHECK-NEXT: 6 content of file0.c:6 # CHECK-NEXT: 7 content of file0.c:7 # CHECK-NEXT: 8 content of file0.c:8 # CHECK-NEXT: 9 content of file0.c:9 # CHECK-NEXT: 10 content of file0.c:10 # CHECK-NEXT: 11 content of file0.c:11 # CHECK-NEXT: 12 content of file0.c:12 # CHECK-NEXT: 13 content of file0.c:13 # CHECK-NEXT: 14 content of file0.c:14 # CHECK-NEXT: 15 content of file0.c:15 # CHECK-NEXT: 16 content of file0.c:16 # CHECK-NEXT: 17 content of file0.c:17 # CASE 2: function at the end of the file source list -n func2 # CHECK-NEXT: source list -n func2 # CHECK-NEXT: File: file0.c # CHECK-NEXT: 20 content of file0.c:20 # CHECK-NEXT: 21 content of file0.c:21 # CHECK-NEXT: 22 content of file0.c:22 # CHECK-NEXT: 23 content of file0.c:23 # CHECK-NEXT: 24 content of file0.c:24 # CHECK-NEXT: 25 content of file0.c:25 # CHECK-NEXT: 26 content of file0.c:26 # CHECK-NEXT: 27 content of file0.c:27 # CHECK-NEXT: 28 content of file0.c:28 # CHECK-NEXT: 29 content of file0.c:29 # CHECK-NEXT: 30 content of file0.c:30 # CASE 3: function ends in a different file source list -n func3 # CHECK-NEXT: source list -n func3 # CHECK-NEXT: File: file0.c # CHECK-NEXT: 1 content of file0.c:1 # CHECK-NEXT: 2 content of file0.c:2 # CHECK-NEXT: 3 content of file0.c:3 # CHECK-NEXT: 4 content of file0.c:4 # CHECK-NEXT: 5 content of file0.c:5 # CHECK-NEXT: 6 content of file0.c:6 # CHECK-NEXT: 7 content of file0.c:7 # CHECK-NEXT: 8 content of file0.c:8 # CHECK-NEXT: 9 content of file0.c:9 # CHECK-NEXT: 10 content of file0.c:10 # CASE 4: function has no line entry with line!=0 source list -n func4 # CHECK-LABEL: source list -n func4 # CHECK: error: Could not find line information for function "func4". # CASE 5: discontinuous function source list -n func5 # CHECK-LABEL: source list -n func5 # CHECK-NEXT: File: file0.c # CHECK-NEXT: 1 content of file0.c:1 # CHECK-NEXT: 2 content of file0.c:2 # CHECK-NEXT: 3 content of file0.c:3 # CHECK-NEXT: 4 content of file0.c:4 # CHECK-NEXT: 5 content of file0.c:5 # CHECK-NEXT: 6 content of file0.c:6 # CHECK-NEXT: 7 content of file0.c:7 # CHECK-NEXT: 8 content of file0.c:8 # CHECK-NEXT: 9 content of file0.c:9 # CHECK-NEXT: 10 content of file0.c:10 #--- a.s .file 0 "." "file0.c" .file 1 "." "file1.c" .text func0: .loc 0 1 nop .loc 0 5 nop .Lfunc0_end: func1: .loc 0 10 nop .loc 0 12 nop .Lfunc1_end: func2: .loc 0 25 nop .loc 0 30 nop .Lfunc2_end: func3: .loc 0 1 nop .loc 0 5 nop .loc 1 5 nop .Lfunc3_end: func4: .loc 0 0 nop .Lfunc4_end: func5.__part.1: .loc 0 1 nop .Lfunc5.__part.1_end: .Lpadding: nop func5: .loc 0 5 nop .Lfunc5_end: .Ltext_end: .section .debug_abbrev,"",@progbits .byte 1 # Abbreviation Code .byte 17 # DW_TAG_compile_unit .byte 1 # DW_CHILDREN_yes .byte 3 # DW_AT_name .byte 8 # DW_FORM_string .byte 37 # DW_AT_producer .byte 8 # DW_FORM_string .byte 19 # DW_AT_language .byte 5 # DW_FORM_data2 .byte 17 # DW_AT_low_pc .byte 1 # DW_FORM_addr .byte 18 # DW_AT_high_pc .byte 1 # DW_FORM_addr .byte 16 # DW_AT_stmt_list .byte 23 # DW_FORM_sec_offset .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 2 # Abbreviation Code .byte 46 # DW_TAG_subprogram .byte 0 # DW_CHILDREN_no .byte 17 # DW_AT_low_pc .byte 1 # DW_FORM_addr .byte 18 # DW_AT_high_pc .byte 1 # DW_FORM_addr .byte 3 # DW_AT_name .byte 8 # DW_FORM_string .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 3 # Abbreviation Code .byte 46 # DW_TAG_subprogram .byte 0 # DW_CHILDREN_no .byte 85 # DW_AT_ranges .byte 23 # DW_FORM_sec_offset .byte 3 # DW_AT_name .byte 8 # DW_FORM_string .byte 0 # EOM(1) .byte 0 # EOM(2) .byte 0 # EOM(3) .section .debug_info,"",@progbits .Lcu_begin0: .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit .Ldebug_info_start0: .short 5 # DWARF version number .byte 1 # DWARF Unit Type .byte 8 # Address Size (in bytes) .long .debug_abbrev # Offset Into Abbrev. Section .byte 1 # Abbrev DW_TAG_compile_unit .asciz "file0.c" # DW_AT_producer .asciz "Hand-written DWARF" # DW_AT_producer .short 29 # DW_AT_language .quad .text # DW_AT_low_pc .quad .Ltext_end # DW_AT_high_pc .long .Lline_table_start0 # DW_AT_stmt_list .rept 5 .byte 2 # Abbrev DW_TAG_subprogram .quad func\+ # DW_AT_low_pc .quad .Lfunc\+_end # DW_AT_high_pc .asciz "func\+" # DW_AT_name .endr .byte 3 # Abbrev DW_TAG_subprogram .long .Ldebug_ranges0 .asciz "func5" # DW_AT_name .byte 0 # End Of Children Mark .Ldebug_info_end0: .section .debug_rnglists,"",@progbits .long .Ldebug_list_header_end0-.Ldebug_list_header_start0 # Length .Ldebug_list_header_start0: .short 5 # Version .byte 8 # Address size .byte 0 # Segment selector size .long 2 # Offset entry count .Lrnglists_table_base0: .long .Ldebug_ranges0-.Lrnglists_table_base0 .Ldebug_ranges0: .byte 6 # DW_RLE_start_end .quad func5 .quad .Lfunc5_end .byte 6 # DW_RLE_start_end .quad func5.__part.1 .quad .Lfunc5.__part.1_end .byte 0 # DW_RLE_end_of_list .Ldebug_list_header_end0: .section .debug_line,"",@progbits .Lline_table_start0: #--- file0.c content of file0.c:1 content of file0.c:2 content of file0.c:3 content of file0.c:4 content of file0.c:5 content of file0.c:6 content of file0.c:7 content of file0.c:8 content of file0.c:9 content of file0.c:10 content of file0.c:11 content of file0.c:12 content of file0.c:13 content of file0.c:14 content of file0.c:15 content of file0.c:16 content of file0.c:17 content of file0.c:18 content of file0.c:19 content of file0.c:20 content of file0.c:21 content of file0.c:22 content of file0.c:23 content of file0.c:24 content of file0.c:25 content of file0.c:26 content of file0.c:27 content of file0.c:28 content of file0.c:29 content of file0.c:30 #--- file1.c content of file1.c:1 content of file1.c:2 content of file1.c:3 content of file1.c:4 content of file1.c:5 content of file1.c:6 content of file1.c:7 content of file1.c:8 content of file1.c:9 content of file1.c:10