mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-19 01:19:41 +08:00
[gdb/testsuite] Require DW_LNE_end_sequence
The dwarf standard requires that every line number program sequence ends with a DW_LNE_end_sequence instruction. Enforce this in the dwarf assembler for the last sequence in a line number program (we have no means to enforce this for earlier sequences), and fix a few test-case that don't have it. Tested on aarch64-linux. PR testsuite/31618 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31618
This commit is contained in:
@@ -203,6 +203,9 @@ Dwarf::assemble $asm_file {
|
||||
line [gdb_get_line_number "main start"]
|
||||
DW_LNS_set_prologue_end
|
||||
DW_LNS_copy
|
||||
|
||||
DW_LNE_set_address $main_end
|
||||
DW_LNE_end_sequence
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,6 +50,8 @@ Dwarf::assemble $asm_file {
|
||||
declare_labels partial_label lines_label
|
||||
global srcdir subdir srcfile
|
||||
|
||||
get_func_info main
|
||||
|
||||
cu {} {
|
||||
partial_label: partial_unit {
|
||||
{stmt_list ${lines_label} DW_FORM_sec_offset}
|
||||
@@ -77,7 +79,12 @@ Dwarf::assemble $asm_file {
|
||||
include_dir "${srcdir}/${subdir}"
|
||||
file_name "dw2-symtab-includes.h" 1
|
||||
program {
|
||||
DW_LNE_set_address $main_start
|
||||
DW_LNS_advance_line 1
|
||||
DW_LNS_copy
|
||||
|
||||
DW_LNE_set_address $main_end
|
||||
DW_LNE_end_sequence
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@ Dwarf::assemble $asm_file {
|
||||
declare_labels partial_label lines_label
|
||||
global srcdir subdir srcfile
|
||||
|
||||
get_func_info main
|
||||
|
||||
cu {} {
|
||||
partial_label: partial_unit {} {
|
||||
}
|
||||
@@ -49,7 +51,12 @@ Dwarf::assemble $asm_file {
|
||||
include_dir "${srcdir}/${subdir}"
|
||||
file_name "dw2-symtab-includes.h" 1
|
||||
program {
|
||||
DW_LNE_set_address $main_start
|
||||
DW_LNS_advance_line 1
|
||||
DW_LNS_copy
|
||||
|
||||
DW_LNE_set_address $main_end
|
||||
DW_LNE_end_sequence
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2546,16 +2546,20 @@ namespace eval Dwarf {
|
||||
variable _line_header_end_label
|
||||
variable _line
|
||||
variable _line_address_update
|
||||
variable _line_program_terminated
|
||||
|
||||
|
||||
set _line 1
|
||||
set _line_address_update 0
|
||||
set _line_program_terminated 0
|
||||
|
||||
_line_finalize_header
|
||||
|
||||
proc DW_LNE_set_address {addr} {
|
||||
variable _line_address_update
|
||||
set _line_address_update 1
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
_op .byte 0
|
||||
set start [new_label "set_address_start"]
|
||||
set end [new_label "set_address_end"]
|
||||
@@ -2576,6 +2580,8 @@ namespace eval Dwarf {
|
||||
error "Missing address update for end_sequence"
|
||||
}
|
||||
set _line_address_update 0
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 1
|
||||
variable _line
|
||||
_op .byte 0
|
||||
_op .uleb128 1
|
||||
@@ -2584,6 +2590,8 @@ namespace eval Dwarf {
|
||||
}
|
||||
|
||||
proc DW_LNE_user { len opcode } {
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
set DW_LNE_lo_usr 0x80
|
||||
set DW_LNE_hi_usr 0xff
|
||||
if { $DW_LNE_lo_usr <= $opcode
|
||||
@@ -2605,22 +2613,32 @@ namespace eval Dwarf {
|
||||
error "Missing address update for copy"
|
||||
}
|
||||
set _line_address_update 0
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
_op .byte 1
|
||||
}
|
||||
|
||||
proc DW_LNS_negate_stmt {} {
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
_op .byte 6
|
||||
}
|
||||
|
||||
proc DW_LNS_set_prologue_end {} {
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
_op .byte 0x0a
|
||||
}
|
||||
|
||||
proc DW_LNS_set_epilogue_begin {} {
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
_op .byte 0x0b
|
||||
}
|
||||
|
||||
proc DW_LNS_advance_pc {offset} {
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
variable _line_address_update
|
||||
set _line_address_update 1
|
||||
_op .byte 2
|
||||
@@ -2628,6 +2646,8 @@ namespace eval Dwarf {
|
||||
}
|
||||
|
||||
proc DW_LNS_advance_line {offset} {
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
variable _line
|
||||
_op .byte 3
|
||||
_op .sleb128 ${offset}
|
||||
@@ -2650,11 +2670,17 @@ namespace eval Dwarf {
|
||||
}
|
||||
|
||||
proc DW_LNS_set_file {num} {
|
||||
variable _line_program_terminated
|
||||
set _line_program_terminated 0
|
||||
_op .byte 4
|
||||
_op .sleb128 ${num}
|
||||
}
|
||||
|
||||
uplevel $body
|
||||
|
||||
if { $_line_program_terminated == 0 } {
|
||||
error "Missing end_seq"
|
||||
}
|
||||
}
|
||||
|
||||
uplevel $body
|
||||
|
||||
Reference in New Issue
Block a user