mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
6f98470a43
Previously, the debug line parser would keep attempting to read data even if it had run out of data to read. This meant errors in parsing would often end up being reported as something else, such as an unknown version or malformed directory/filename table. This patch fixes the issues by using the Cursor API to capture errors. Reviewed by: labath Differential Revision: https://reviews.llvm.org/D83043
252 lines
12 KiB
Plaintext
252 lines
12 KiB
Plaintext
## Test the different error cases in the debug line parsing and how they prevent
|
|
## or don't prevent further dumping of section contents.
|
|
|
|
## Show that a bad length stops parsing of the section.
|
|
# RUN: llvm-mc -triple x86_64-pc-linux %S/Inputs/debug_line_reserved_length.s -filetype=obj -o %t-reserved.o
|
|
# RUN: llvm-dwarfdump -debug-line %t-reserved.o 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,FIRST,FATAL,RESERVED
|
|
# RUN: llvm-dwarfdump -debug-line %t-reserved.o -verbose 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,FIRST,FATAL,RESERVED
|
|
|
|
## We only produce warnings for malformed tables after the specified unit if
|
|
## parsing can continue.
|
|
# RUN: llvm-dwarfdump -debug-line=0 %t-reserved.o 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,FIRST,NOLATER,RESERVED
|
|
|
|
## Stop looking for the specified unit, if a fatally-bad prologue is detected.
|
|
# RUN: llvm-dwarfdump -debug-line=0x4b %t-reserved.o 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,NOFIRST,NOLATER,RESERVED
|
|
|
|
## Show that non-fatal errors do not prevent parsing the rest of the section.
|
|
# RUN: llvm-mc -triple x86_64-pc-linux %S/Inputs/debug_line_malformed.s -filetype=obj -o %t-malformed.o
|
|
# RUN: llvm-dwarfdump -debug-line %t-malformed.o 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,FIRST,NONFATAL,LAST,SOME-ERR,MORE-ERR \
|
|
# RUN: --implicit-check-not='debug_line[{{.*}}]' --implicit-check-not='warning:'
|
|
# RUN: llvm-dwarfdump -debug-line %t-malformed.o -verbose 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,FIRST,VERBOSE,NONFATAL,LAST,SOME-ERR,MORE-ERR \
|
|
# RUN: --implicit-check-not='debug_line[{{.*}}]' --implicit-check-not=' DW_LNS' \
|
|
# RUN: --implicit-check-not=' DW_LNE' --implicit-check-not='address +=' \
|
|
# RUN: --implicit-check-not='warning:'
|
|
|
|
## We should still produce warnings for malformed tables after the specified unit.
|
|
# RUN: llvm-dwarfdump -debug-line=0 %t-malformed.o 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,FIRST,NOLATER,SOME-ERR --implicit-check-not='warning:'
|
|
|
|
## Don't stop looking for the later unit if non-fatal issues are found.
|
|
# RUN: llvm-dwarfdump -debug-line=0x3ed %t-malformed.o 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefixes=HEADER,LAST,SOME-ERR --implicit-check-not='debug_line[{{.*}}]' \
|
|
# RUN: --implicit-check-not='warning:'
|
|
|
|
# HEADER: .debug_line contents:
|
|
|
|
# FIRST: debug_line[0x00000000]
|
|
# VERBOSE: Address Line Column File ISA Discriminator Flags
|
|
# VERBOSE-NEXT: ------------------ ------ ------ ------ --- ------------- -------------
|
|
# VERBOSE-NEXT: DW_LNE_set_address (0x000000000badbeef)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
# FIRST: 0x000000000badbeef {{.*}} end_sequence
|
|
# FIRST-EMPTY:
|
|
# NOFIRST-NOT: debug_line[0x00000000]
|
|
# NOFIRST-NOT: 0x000000000badbeef {{.*}} end_sequence
|
|
# NOLATER-NOT: debug_line[{{.*}}]
|
|
# NOLATER-NOT: end_sequence
|
|
|
|
## For fatal issues, the following table(s) should not be dumped:
|
|
# FATAL: debug_line[0x00000048]
|
|
# RESERVED-NOT: prologue
|
|
# RESERVED: warning: parsing line table prologue at offset 0x00000048: unsupported reserved unit length of value 0xfffffffe
|
|
# RESERVED-NOT: prologue
|
|
# RESERVED-NOT: Address
|
|
# FATAL-NOT: debug_line
|
|
|
|
## For non-fatal issues, the table data should be dumped:
|
|
|
|
## Version 0 table.
|
|
# NONFATAL: debug_line[0x00000048]
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL-NEXT: total_length: 0x00000002
|
|
# NONFATAL-NEXT: format: DWARF32
|
|
# NONFATAL-NEXT: version: 0
|
|
# NONFATAL-EMPTY:
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at offset 0x00000048: unsupported version 0
|
|
|
|
## Version 1 table.
|
|
# NONFATAL: debug_line[0x0000004e]
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL-NEXT: total_length: 0x00000002
|
|
# NONFATAL-NEXT: format: DWARF32
|
|
# NONFATAL-NEXT: version: 1
|
|
# NONFATAL-EMPTY:
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at offset 0x0000004e: unsupported version 1
|
|
|
|
## Malformed directory format with no path component.
|
|
# NONFATAL: debug_line[0x00000054]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x00000054 found an invalid directory or file table description at 0x00000073
|
|
# SOME-ERR-NEXT: warning: failed to parse entry content descriptions because no path was found
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: prologue_length: 0x00000013
|
|
# NONFATAL-NOT: include_directories
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0x8877665544332211)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## Prologue with length shorter than parsed.
|
|
# NONFATAL: debug_line[0x00000081]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x00000081 found an invalid directory or file table description at 0x000000b9
|
|
# SOME-ERR-NEXT: warning: file names table was not null terminated before the end of the prologue
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: file_names[ 1]:
|
|
# NONFATAL-NEXT: name: "file1"
|
|
# NONFATAL-NEXT: dir_index: 1
|
|
# NONFATAL-NEXT: mod_time: 0x00000002
|
|
# NONFATAL-NEXT: length: 0x00000003
|
|
# VERBOSE: DW_LNE_set_address (0x1122334455667788)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## Prologue with length longer than parsed.
|
|
# NONFATAL: debug_line[0x000000c7]
|
|
# SOME-ERR-NEXT: warning: unknown data in line table prologue at offset 0x000000c7: parsing ended (at offset 0x00000101) before reaching the prologue end at offset 0x00000102
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: file_names[ 2]:
|
|
# NONFATAL-NEXT: name: "file2"
|
|
# NONFATAL-NEXT: dir_index: 1
|
|
# NONFATAL-NEXT: mod_time: 0x00000002
|
|
# NONFATAL-NEXT: length: 0x00000003
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0x1111222233334444)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## Extended opcode with incorrect length versus expected.
|
|
# NONFATAL: debug_line[0x00000110]
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: prologue_length: 0x00000030
|
|
# VERBOSE: DW_LNE_set_address (0x00000000abbadaba)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
# MORE-ERR: warning: unexpected line op length at offset 0x00000157 expected 0x02 found 0x01
|
|
# VERBOSE: DW_LNE_set_discriminator (10)
|
|
# MORE-ERR: warning: unexpected line op length at offset 0x0000015b expected 0x01 found 0x02
|
|
# VERBOSE: DW_LNS_set_prologue_end
|
|
# VERBOSE-NEXT: DW_LNE_set_address (0x00000000babb1e45)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## No end of sequence.
|
|
# NONFATAL: debug_line[0x0000016b]
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: prologue_length: 0x00000030
|
|
# VERBOSE: DW_LNE_set_address (0x00000000deadfade)
|
|
# VERBOSE-NEXT: DW_LNS_copy
|
|
# MORE-ERR: warning: last sequence in debug line table at offset 0x0000016b is not terminated
|
|
|
|
## Very short prologue length for V5 (ends during parameters).
|
|
# NONFATAL: debug_line[0x000001b1]
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: standard_opcode_lengths[DW_LNS_set_prologue_end] = 1
|
|
# NONFATAL-NEXT: standard_opcode_lengths[DW_LNS_set_epilogue_begin] = 0
|
|
# NONFATAL-NEXT: standard_opcode_lengths[DW_LNS_set_isa] = 0
|
|
# NONFATAL-EMPTY:
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at offset 0x000001b1: unexpected end of data at offset 0x1cd while reading [0x1cd, 0x1ce)
|
|
|
|
## V5 prologue ends during file table.
|
|
# NONFATAL-NEXT: debug_line[0x000001db]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x000001db found an invalid directory or file table description at 0x00000206
|
|
# SOME-ERR-NEXT: warning: failed to parse entry content descriptors: unable to decode LEB128 at offset 0x00000206: malformed uleb128, extends past end
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: include_directories[ 0] = "/tmp"
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0x00000ab4acadab4a)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## V5 prologue ends during directory table.
|
|
# NONFATAL: debug_line[0x00000214]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x00000214 found an invalid directory or file table description at 0x00000236
|
|
# SOME-ERR-NEXT: warning: failed to parse directory entry because extracting the form value failed
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL-NOT: include_directories
|
|
# VERBOSE: DW_LNE_set_address (0x4444333322221111)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## V5 invalid MD5 hash form when there is still data to be read.
|
|
# NONFATAL: debug_line[0x00000244]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x00000244 found an invalid directory or file table description at 0x00000277
|
|
# SOME-ERR-NEXT: warning: failed to parse file entry because extracting the form value failed
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: include_directories[ 0] = "/tmp"
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0x1234123412341234)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## V5 prologue ends while reading an MD5 hash
|
|
# NONFATAL: debug_line[0x00000287]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x00000287 found an invalid directory or file table description at 0x000002b2
|
|
# SOME-ERR-NEXT: warning: failed to parse entry content descriptors: unable to decode LEB128 at offset 0x000002b2: malformed uleb128, extends past end
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: include_directories[ 0] = "/tmp"
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0x4321432143214321)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## V5 invalid directory content description has unsupported form.
|
|
# NONFATAL: debug_line[0x000002c0]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x000002c0 found an invalid directory or file table description at 0x000002e9
|
|
# SOME-ERR-NEXT: warning: failed to parse directory entry because skipping the form value failed
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: include_directories[ 0] = "/foo"
|
|
# NONFATAL-NOT: include_directories
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0xaaaabbbbccccdddd)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## Opcode base field of value zero.
|
|
# NONFATAL: debug_line[0x00000306]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at offset 0x00000306 found opcode base of 0. Assuming no standard opcodes
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: include_directories[ 1] = "dir1"
|
|
# NONFATAL-NEXT: file_names[ 1]:
|
|
# NONFATAL-NEXT: name: "file1"
|
|
# NONFATAL-NEXT: dir_index: 1
|
|
# NONFATAL-NEXT: mod_time: 0x00000002
|
|
# NONFATAL-NEXT: length: 0x00000003
|
|
# VERBOSE: DW_LNE_set_address (0xffffeeeeddddcccc)
|
|
# VERBOSE-NEXT: address += 1, line += 0
|
|
# VERBOSE: DW_LNE_end_sequence
|
|
|
|
## V4 table with unterminated include directory table.
|
|
# NONFATAL: debug_line[0x00000335]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x00000335 found an invalid directory or file table description at 0x00000356
|
|
# SOME-ERR-NEXT: warning: include directories table was not null terminated before the end of the prologue
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: include_directories[ 1] = "dir1"
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0xabcdef0123456789)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## V4 table with unterminated file name table.
|
|
# NONFATAL: debug_line[0x00000364]
|
|
# SOME-ERR-NEXT: warning: parsing line table prologue at 0x00000364 found an invalid directory or file table description at 0x0000038f
|
|
# SOME-ERR-NEXT: warning: file names table was not null terminated before the end of the prologue
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: file_names[ 1]:
|
|
# NONFATAL-NEXT: name: "foo.c"
|
|
# NONFATAL-NEXT: dir_index: 1
|
|
# NONFATAL-NEXT: mod_time: 0x00000002
|
|
# NONFATAL-NEXT: length: 0x00000003
|
|
# NONFATAL-NOT: file_names
|
|
# VERBOSE: DW_LNE_set_address (0xababcdcdefef0909)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|
|
|
|
## Table with extended opcode that overruns table end.
|
|
# NONFATAL: debug_line[0x0000039d]
|
|
# NONFATAL-NEXT: Line table prologue
|
|
# NONFATAL: Address
|
|
# NONFATAL-NEXT: ------------------
|
|
# VERBOSE-NEXT: DW_LNE_set_address (0x00000000feedfeed)
|
|
# VERBOSE-NEXT: DW_LNS_copy
|
|
# NONFATAL-NEXT: 0x00000000feedfeed
|
|
# VERBOSE-NEXT: DW_LNE_set_address (<parsing error> 00 f0 01 f0 f0 00 01)
|
|
# MORE-ERR-NEXT: warning: unexpected end of data at offset 0x3ed while reading [0x3e6, 0x3ee)
|
|
# MORE-ERR-NEXT: warning: last sequence in debug line table at offset 0x0000039d is not terminated
|
|
|
|
# LAST: debug_line[0x000003ed]
|
|
# VERBOSE: DW_LNE_set_address (0x00000000cafebabe)
|
|
# VERBOSE-NEXT: DW_LNE_end_sequence
|