debug_line_invalid.test 8.13 KB
## 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> %t-reserved.err \
# RUN:   | FileCheck %s --check-prefixes=FIRST,FATAL
# RUN: FileCheck %s --input-file=%t-reserved.err --check-prefix=RESERVED
# RUN: llvm-dwarfdump -debug-line %t-reserved.o -verbose 2> %t-reserved-verbose.err \
# RUN:   | FileCheck %s --check-prefixes=FIRST,FATAL
# RUN: FileCheck %s --input-file=%t-reserved-verbose.err --check-prefix=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> %t-reserved-off-first.err \
# RUN:   | FileCheck %s --check-prefixes=FIRST,NOLATER
# RUN: FileCheck %s --input-file=%t-reserved-off-first.err --check-prefix=RESERVED

## Stop looking for the specified unit, if a fatally-bad prologue is detected.
# RUN: llvm-dwarfdump -debug-line=0x4b %t-reserved.o 2> %t-reserved-off-last.err \
# RUN:   | FileCheck %s --check-prefixes=NOFIRST,NOLATER
# RUN: FileCheck %s --input-file=%t-reserved-off-last.err --check-prefix=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> %t-malformed.err \
# RUN:   | FileCheck %s --check-prefixes=FIRST,NONFATAL,LAST --implicit-check-not='debug_line[{{.*}}]'
# RUN: FileCheck %s --input-file=%t-malformed.err --check-prefixes=ALL,OTHER
# RUN: llvm-dwarfdump -debug-line %t-malformed.o -verbose 2> %t-malformed-verbose.err \
# RUN:   | FileCheck %s --check-prefixes=FIRST,NONFATAL,LAST --implicit-check-not='debug_line[{{.*}}]'
# RUN: FileCheck %s --input-file=%t-malformed-verbose.err --check-prefixes=ALL,OTHER

## We should still produce warnings for malformed tables after the specified unit.
# RUN: llvm-dwarfdump -debug-line=0 %t-malformed.o 2> %t-malformed-off-first.err \
# RUN:   | FileCheck %s --check-prefixes=FIRST,NOLATER
# RUN: FileCheck %s --input-file=%t-malformed-off-first.err --check-prefix=ALL

## Don't stop looking for the later unit if non-fatal issues are found.
# RUN: llvm-dwarfdump -debug-line=0x2af %t-malformed.o 2> %t-malformed-off-last.err \
# RUN:   | FileCheck %s --check-prefix=LAST --implicit-check-not='debug_line[{{.*}}]'
# RUN: FileCheck %s --input-file=%t-malformed-off-last.err --check-prefix=ALL

# FIRST:       debug_line[0x00000000]
# FIRST:       0x000000000badbeef {{.*}} end_sequence
# 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]
# FATAL-NEXT: Line table prologue
# FATAL-NEXT: total_length: 0xfffffffe
# FATAL-NOT:  debug_line

## For non-fatal prologue issues, the table prologue should be dumped, and any
## subsequent tables should also be.
## Case 1: Version 0 table.
# NONFATAL:      debug_line[0x00000048]
# NONFATAL-NEXT: Line table prologue
# NONFATAL-NOT:  Address

## Case 2: Version 1 table.
# NONFATAL:      debug_line[0x0000004e]
# NONFATAL-NEXT: Line table prologue
# NONFATAL-NOT:  Address

## Case 3: Malformed directory format with no path component.
# NONFATAL:      debug_line[0x00000054]
# NONFATAL-NEXT: Line table prologue
# NONFATAL-NOT:  include_directories
# NONFATAL-NOT:  file_names
# NONFATAL-NOT:  Address

## Case 4: Prologue with length shorter than parsed.
# NONFATAL:      debug_line[0x00000081]
# 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
# NONFATAL-NOT:  Address

## Case 5: Prologue with length longer than parsed.
# NONFATAL:      debug_line[0x000000c9]
# 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
# NONFATAL-NOT:  Address

## Case 6: Extended opcode with incorrect length versus expected.
# NONFATAL:      debug_line[0x00000111]
## Dumping prints the line table prologue and any valid operations up to the
## point causing the problem.
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      0x00000000abbadaba {{.*}} end_sequence
# NONFATAL-NOT:  is_stmt

## For minor issues, we can dump the whole table.
## Case 7: No end of sequence.
# NONFATAL:      debug_line[0x00000167]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      0x00000000deadfade {{.*}} is_stmt
# NONFATAL-NOT:  end_sequence

## Case 8: Very short prologue length for V5 (ends during parameters).
# NONFATAL:      debug_line[0x000001ad]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      standard_opcode_lengths[DW_LNS_set_isa] = 1
# NONFATAL-NEXT: include_directories[  0] = "/tmp"
# NONFATAL-NEXT: file_names[  0]:
# NONFATAL-NEXT:            name: "a.c"
# NONFATAL-NEXT:       dir_index: 1
# NONFATAL-NOT:  Address

## Case 9: V5 prologue ends during file table.
# NONFATAL:      debug_line[0x000001ed]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      include_directories[  0] = "/tmp"
# NONFATAL-NEXT: file_names[  0]:
# NONFATAL-NEXT:            name: "a.c"
# NONFATAL-NEXT:       dir_index: 1
# NONFATAL-NOT:  Address

## Case 10: V5 prologue ends during directory table.
# NONFATAL:      debug_line[0x0000022d]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      include_directories[  0] = "/tmp"
# NONFATAL-NEXT: file_names[  0]:
# NONFATAL-NEXT:            name: "a.c"
# NONFATAL-NEXT:       dir_index: 1
# NONFATAL-NOT:  Address

## Case 11: V5 invalid MD5 hash form.
# NONFATAL:      debug_line[0x0000026d]
# NONFATAL-NEXT: Line table prologue
# NONFATAL:      include_directories[  0] = "/tmp"
# NONFATAL-NOT:  file_names
# NONFATAL-NOT:  Address

# LAST:          debug_line[0x000002af]
# LAST:          0x00000000cafebabe {{.*}} end_sequence

# RESERVED: warning: parsing line table prologue at offset 0x00000048 unsupported reserved unit length found of value 0xfffffffe

# ALL-NOT:  warning:
# ALL:      warning: parsing line table prologue at offset 0x00000048 found unsupported version 0x00
# ALL-NEXT: warning: parsing line table prologue at offset 0x0000004e found unsupported version 0x01
# ALL-NEXT: warning: parsing line table prologue at 0x00000054 found an invalid directory or file table description at 0x00000073
# ALL-NEXT: warning: failed to parse entry content descriptions because no path was found
# FIXME - The latter offset in the next line should be 0xad. The filename parsing code does not notice a missing terminating byte.
# ALL-NEXT: warning: parsing line table prologue at 0x00000081 should have ended at 0x000000b9 but it ended at 0x000000ba
# ALL-NEXT: warning: parsing line table prologue at 0x000000c9 should have ended at 0x00000104 but it ended at 0x00000103
# OTHER-NEXT: warning: unexpected line op length at offset 0x00000158 expected 0x02 found 0x01
# OTHER-NEXT: warning: last sequence in debug line table at offset 0x00000167 is not terminated
# ALL-NEXT: warning: parsing line table prologue at 0x000001ad should have ended at 0x000001c8 but it ended at 0x000001df
# ALL-NEXT: warning: parsing line table prologue at 0x000001ed should have ended at 0x00000218 but it ended at 0x0000021f
# ALL-NEXT: warning: parsing line table prologue at 0x0000022d should have ended at 0x0000024f but it ended at 0x0000025f
# ALL-NEXT: warning: parsing line table prologue at 0x0000026d found an invalid directory or file table description at 0x000002a2
# ALL-NEXT: warning: failed to parse file entry because the MD5 hash is invalid
# ALL-NOT:  warning: