| # Test handling of DWARF5 line tables. In particular, test that we handle files |
| # which are present in the line table more than once. |
| |
| # REQUIRES: x86 |
| |
| # RUN: llvm-mc -filetype=obj -o %t -triple x86_64-pc-linux %s |
| # RUN: %lldb %t -o "source info -f file0.c" -o "source info -f file1.c" \ |
| # RUN: -o "breakpoint set -f file0.c -l 42" \ |
| # RUN: -o "breakpoint set -f file0.c -l 47" \ |
| # RUN: -o exit | FileCheck %s |
| |
| # CHECK-LABEL: source info -f file0.c |
| # CHECK: [0x0000000000000000-0x0000000000000001): /file0.c:42 |
| # CHECK-LABEL: source info -f file1.c |
| # CHECK: [0x0000000000000001-0x0000000000000002): /file1.c:47 |
| # CHECK-LABEL: breakpoint set -f file0.c -l 42 |
| # CHECK: Breakpoint 1: {{.*}}`foo, |
| # CHECK-LABEL: breakpoint set -f file0.c -l 47 |
| # CHECK: Breakpoint 2: {{.*}}`foo + 2, |
| |
| .text |
| .globl foo |
| foo: |
| nop |
| nop |
| nop |
| .Lfoo_end: |
| |
| .section .debug_abbrev,"",@progbits |
| .byte 1 # Abbreviation Code |
| .byte 17 # DW_TAG_compile_unit |
| .byte 0 # DW_CHILDREN_no |
| .byte 37 # DW_AT_producer |
| .byte 8 # DW_FORM_string |
| .byte 19 # DW_AT_language |
| .byte 5 # DW_FORM_data2 |
| .byte 3 # DW_AT_name |
| .byte 8 # DW_FORM_string |
| .byte 16 # DW_AT_stmt_list |
| .byte 23 # DW_FORM_sec_offset |
| .byte 27 # DW_AT_comp_dir |
| .byte 8 # DW_FORM_string |
| .byte 17 # DW_AT_low_pc |
| .byte 1 # DW_FORM_addr |
| .byte 18 # DW_AT_high_pc |
| .byte 6 # DW_FORM_data4 |
| .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 [1] 0xc:0x23 DW_TAG_compile_unit |
| .asciz "Hand-written DWARF" # DW_AT_producer |
| .short 12 # DW_AT_language |
| .asciz "file0.c" # DW_AT_name |
| .long .Lline_table_begin # DW_AT_stmt_list |
| .asciz "/" # DW_AT_comp_dir |
| .quad foo # DW_AT_low_pc |
| .long .Lfoo_end-foo # DW_AT_high_pc |
| .Ldebug_info_end0: |
| |
| .section .debug_line,"",@progbits |
| .Lline_table_begin: |
| .long .Lline_end-.Lline_start |
| .Lline_start: |
| .short 5 # DWARF version number |
| .byte 8 # Address Size (in bytes) |
| .byte 0 # Segment Selector Size |
| .long .Lheader_end-.Lheader_start |
| .Lheader_start: |
| .byte 1 # Minimum Instruction Length |
| .byte 1 # Maximum Operations per Instruction |
| .byte 1 # Default is_stmt |
| .byte 0 # Line Base |
| .byte 0 # Line Range |
| .byte 5 # Opcode Base |
| .byte 0, 1, 1, 1 # Standard Opcode Lengths |
| |
| # Directory table format |
| .byte 1 # One element per directory entry |
| .byte 1 # DW_LNCT_path |
| .byte 0x08 # DW_FORM_string |
| |
| # Directory table entries |
| .byte 1 # 1 directory |
| .asciz "/" |
| |
| # File table format |
| .byte 2 # 2 elements per file entry |
| .byte 1 # DW_LNCT_path |
| .byte 0x08 # DW_FORM_string |
| .byte 2 # DW_LNCT_directory_index |
| .byte 0x0b # DW_FORM_data1 |
| |
| # File table entries |
| .byte 3 # 3 files |
| .asciz "file0.c" |
| .byte 0 |
| .asciz "file1.c" |
| .byte 0 |
| .asciz "file0.c" |
| .byte 0 |
| .Lheader_end: |
| |
| .byte 4, 0 # DW_LNS_set_file 0 |
| .byte 0, 9, 2 # DW_LNE_set_address |
| .quad foo |
| .byte 3, 41 # DW_LNS_advance_line 41 |
| .byte 1 # DW_LNS_copy |
| |
| .byte 4, 1 # DW_LNS_set_file 1 |
| .byte 2, 1 # DW_LNS_advance_pc 1 |
| .byte 3, 5 # DW_LNS_advance_line 5 |
| .byte 1 # DW_LNS_copy |
| |
| .byte 4, 2 # DW_LNS_set_file 2 |
| .byte 2, 1 # DW_LNS_advance_pc 1 |
| .byte 1 # DW_LNS_copy |
| |
| .byte 2, 1 # DW_LNS_advance_pc 1 |
| .byte 0, 1, 1 # DW_LNE_end_sequence |
| .Lline_end: |