## 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: