reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
# 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