| # Test object to verify dwarfdump handles a syntactically correct line-number | |
| # program containing unrecognized extended opcodes. | |
| # RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o | |
| # RUN: llvm-dwarfdump -v %t.o | FileCheck %s | |
| # RUN: llvm-dwarfdump -v %t.o 2>&1 | FileCheck %s --check-prefix=ERR | |
| .section .text | |
| # Dummy function | |
| foo: ret | |
| # FIXME: When we can dump a line-table without a unit, we could remove | |
| # the .debug_abbrev and .debug_info sections from this test. | |
| .section .debug_abbrev,"",@progbits | |
| .byte 0x01 # Abbrev code | |
| .byte 0x11 # DW_TAG_compile_unit | |
| .byte 0x00 # DW_CHILDREN_no | |
| .byte 0x10 # DW_AT_stmt_list | |
| .byte 0x17 # DW_FORM_sec_offset | |
| .byte 0x00 # EOM(1) | |
| .byte 0x00 # EOM(2) | |
| .section .debug_info,"",@progbits | |
| .long CU_end-CU_version # Length of Unit | |
| CU_version: | |
| .short 4 # DWARF version number | |
| .long .debug_abbrev # Offset Into Abbrev. Section | |
| .byte 8 # Address Size (in bytes) | |
| # The compile-unit DIE, with DW_AT_stmt_list. | |
| .byte 1 | |
| .long LT_start | |
| .byte 0 # NULL | |
| CU_end: | |
| .long CU2_end-CU2_version # Length of Unit | |
| CU2_version: | |
| .short 4 # DWARF version number | |
| .long .debug_abbrev # Offset Into Abbrev. Section | |
| .byte 8 # Address Size (in bytes) | |
| # The compile-unit DIE, with DW_AT_stmt_list. | |
| .byte 1 | |
| .long LT2_start | |
| .byte 0 # NULL | |
| CU2_end: | |
| .section .debug_line,"",@progbits | |
| # CHECK-LABEL: .debug_line contents: | |
| # DWARF v4 line-table header. | |
| LT_start: | |
| .long LT_end-LT_version # Length of Unit (DWARF-32 format) | |
| LT_version: | |
| .short 4 # DWARF version number | |
| .long LT_header_end-LT_params # Length of Prologue | |
| LT_params: | |
| .byte 1 # Minimum Instruction Length | |
| .byte 1 # Maximum Operations per Instruction | |
| .byte 1 # Default is_stmt | |
| .byte -5 # Line Base | |
| .byte 14 # Line Range | |
| .byte 13 # Opcode Base | |
| .byte 0 # Standard Opcode Lengths | |
| .byte 1 | |
| .byte 1 | |
| .byte 1 | |
| .byte 1 | |
| .byte 0 | |
| .byte 0 | |
| .byte 0 | |
| .byte 1 | |
| .byte 0 | |
| .byte 0 | |
| .byte 1 | |
| # No directories. | |
| .byte 0 | |
| # No files. | |
| .byte 0 | |
| LT_header_end: | |
| # Bogus extended opcode with zero length. | |
| .byte 0 # Extended opcode indicator. | |
| .byte 0 # LEB length of extended opcode + operands. | |
| # Real opcode and operand. | |
| .byte 0 | |
| .byte 9 | |
| .byte 2 # DW_LNE_set_address | |
| .quad .text | |
| # Bogus extended opcode with multibyte LEB length. | |
| .byte 0 | |
| .byte 0x82 # Length of 2 but with additional length byte. | |
| .byte 0 # Additional length byte. | |
| .byte 0x47 # Unrecognized opcode... | |
| .byte 0 # with its 1-byte operand. | |
| # Proper end-sequence opcode. | |
| .byte 0 | |
| .byte 1 | |
| .byte 1 # DW_LNE_end_sequence | |
| LT_end: | |
| # CHECK: Line table prologue: | |
| # CHECK: version: 4 | |
| # Exact prologue length isn't important but it tells us where to expect the | |
| # line-number program to start, and we do want to verify those offsets. | |
| # CHECK-NEXT: prologue_length: 0x00000014 | |
| # CHECK: 0x0000001e: 00 Badly formed extended line op | |
| # CHECK-NEXT: 0x00000020: 00 DW_LNE_set_address | |
| # CHECK-NEXT: 0x0000002b: 00 Unrecognized extended op 0x47 length 2 | |
| # CHECK-NEXT: 0x00000030: 00 DW_LNE_end_sequence | |
| # CHECK-NEXT: 0x0000000000000000 {{.*}} is_stmt end_sequence | |
| # DWARF v4 line-table header #2. | |
| LT2_start: | |
| .long LT2_end-LT2_version # Length of Unit (DWARF-32 format) | |
| LT2_version: | |
| .short 4 # DWARF version number | |
| .long LT2_header_end-LT2_params # Length of Prologue | |
| LT2_params: | |
| .byte 1 # Minimum Instruction Length | |
| .byte 1 # Maximum Operations per Instruction | |
| .byte 1 # Default is_stmt | |
| .byte -5 # Line Base | |
| .byte 14 # Line Range | |
| .byte 13 # Opcode Base | |
| .byte 0 # Standard Opcode Lengths | |
| .byte 1 | |
| .byte 1 | |
| .byte 1 | |
| .byte 1 | |
| .byte 0 | |
| .byte 0 | |
| .byte 0 | |
| .byte 1 | |
| .byte 0 | |
| .byte 0 | |
| .byte 1 | |
| # No directories. | |
| .byte 0 | |
| # No files. | |
| .byte 0 | |
| LT2_header_end: | |
| # Real opcode and operand. | |
| .byte 0 | |
| .byte 9 | |
| .byte 2 # DW_LNE_set_address | |
| .quad .text | |
| # Real opcode with incorrect length. | |
| .byte 0 | |
| .byte 2 # Wrong length, should be 1. | |
| .byte 1 # DW_LNE_end_sequence | |
| LT2_end: | |
| # ERR: warning: unexpected line op length at offset 0x0000005e | |
| # ERR-SAME: expected 0x02 found 0x01 |