| # 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 |