]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Require DW_LNE_end_sequence
authorTom de Vries <tdevries@suse.de>
Wed, 17 Apr 2024 10:55:00 +0000 (12:55 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 17 Apr 2024 10:55:00 +0000 (12:55 +0200)
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

gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
gdb/testsuite/gdb.dwarf2/dw2-symtab-includes-lookup.exp
gdb/testsuite/gdb.dwarf2/dw2-symtab-includes.exp
gdb/testsuite/lib/dwarf.exp

index 8c96ab8b0c5430c0ef7e52eff1baef90fbfee32a..bd74760e29c3cd4b7027cc1ecd9369b2d0beaf12 100644 (file)
@@ -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
        }
     }
 }
index 14bc84882befb60a18d7ea83147f7f681f0b9513..96a528498da4fea461f54ee2bfa6c75643a1ac96 100644 (file)
@@ -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
        }
     }
 }
index 09007f22200bd14407fc932cd961983f20e77fca..dc4a788bd70aa73092bc97d89a47b097975783d2 100644 (file)
@@ -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
        }
     }
 }
index 254f88f1055733cf86998dfae64f0aff4f1d8a9e..c694375b5343e5e0198fb20973d92811d4cfb91e 100644 (file)
@@ -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