dwarfdump-bogus-LNE.s 5.14 KB
# 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