binutils-gdb/gdb/testsuite/gdb.dwarf2/dw2-is-stmt-2.exp
Andrew Burgess 1d506c26d9 Update copyright year range in header of all files managed by GDB
This commit is the result of the following actions:

  - Running gdb/copyright.py to update all of the copyright headers to
    include 2024,

  - Manually updating a few files the copyright.py script told me to
    update, these files had copyright headers embedded within the
    file,

  - Regenerating gdbsupport/Makefile.in to refresh it's copyright
    date,

  - Using grep to find other files that still mentioned 2023.  If
    these files were updated last year from 2022 to 2023 then I've
    updated them this year to 2024.

I'm sure I've probably missed some dates.  Feel free to fix them up as
you spot them.
2024-01-12 15:49:57 +00:00

218 lines
5.9 KiB
Plaintext

# Copyright 2020-2024 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This test shows the importance of not corrupting the order of line
# table information. When multiple lines are given for the same
# address the compiler usually lists these in the order in which we
# would expect to encounter them. When stepping through nested inline
# frames the last line given for an address is assumed by GDB to be
# the most inner frame, and this is what GDB displays.
#
# If we corrupt the order of the line table entries then GDB will
# display the wrong line as being the inner most frame.
load_lib dwarf.exp
# This test can only be run on targets which support DWARF-2 and use gas.
require dwarf2_support
# The .c files use __attribute__.
require is_c_compiler_gcc
standard_testfile .c .S
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
global srcdir subdir srcfile
declare_labels lines_label
get_func_info main
cu {} {
compile_unit {
{language @DW_LANG_C}
{name dw2-is-stmt.c}
{low_pc 0 addr}
{stmt_list ${lines_label} DW_FORM_sec_offset}
} {
subprogram {
{external 1 flag}
{name main}
{low_pc $main_start addr}
{high_pc "$main_start + $main_len" addr}
} {}
}
}
lines {version 2 default_is_stmt 1} lines_label {
include_dir "${srcdir}/${subdir}"
file_name "$srcfile" 1
program {
DW_LNE_set_address main
line [gdb_get_line_number "main prologue"]
DW_LNS_copy
DW_LNE_set_address line_label_0
line [gdb_get_line_number "main start"]
DW_LNS_copy
DW_LNE_set_address line_label_1
line [gdb_get_line_number "Line 1"]
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address line_label_2
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address line_label_3
line [gdb_get_line_number "Line 2"]
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address line_label_4
line [gdb_get_line_number "Line 1"]
DW_LNS_copy
DW_LNE_set_address line_label_5
line [gdb_get_line_number "Line 3"]
DW_LNS_copy
DW_LNE_set_address line_label_6
line [gdb_get_line_number "Line 4"]
DW_LNS_copy
DW_LNE_set_address line_label_7
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address line_label_8
line [gdb_get_line_number "Line 2"]
DW_LNS_copy
DW_LNE_set_address line_label_9
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address line_label_10
line [gdb_get_line_number "Line 3"]
DW_LNS_copy
DW_LNE_set_address line_label_11
line [gdb_get_line_number "Line 5"]
DW_LNS_copy
DW_LNE_set_address line_label_12
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address line_label_13
line [gdb_get_line_number "Line 3"]
DW_LNS_copy
DW_LNE_set_address line_label_14
line [gdb_get_line_number "Line 4"]
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address line_label_15
line [gdb_get_line_number "Line 5"]
DW_LNS_copy
DW_LNE_set_address line_label_16
line [gdb_get_line_number "main end"]
DW_LNS_negate_stmt
DW_LNS_copy
DW_LNE_set_address ${main_end}
DW_LNE_end_sequence
}
}
}
if { [prepare_for_testing "failed to prepare" ${testfile} \
[list $srcfile $asm_file] {nodebug}] } {
return -1
}
if ![runto_main] {
return -1
}
# Check stepping through the out of order lines gives the experience
# we expect; lines in the correct order, and stop at the correct
# labels.Q
set locs { { "Line 1." "line_label_2" } \
{ "Line 4." "line_label_7" } \
{ "Line 2." "line_label_8" } \
{ "Line 5." "line_label_12" } \
{ "Line 3." "line_label_13" } }
foreach entry $locs {
set pattern [lindex $entry 0]
set label [lindex $entry 1]
set linum [gdb_get_line_number "$pattern"]
gdb_test "step" "\r\n$linum\[ \t\]+/\\* $pattern \\*/" \
"step to $pattern"
set pc [get_hexadecimal_valueof "\$pc" "NO-PC" \
"read \$pc at $pattern"]
set val [get_hexadecimal_valueof "&${label}" "INVALID"]
gdb_assert { $pc == $val } \
"check pc at $pattern"
}
# Now restart the test, and this time, single instruction step
# through. This is checking that the is-stmt marked lines are
# displayed differently (without addresses) to addresses that are
# mid-way through a line, or not marked as is-stmt.
clean_restart $binfile
runto_main
foreach entry $locs {
set pattern [lindex $entry 0]
set label [lindex $entry 1]
with_test_prefix "stepi to $label" {
# If can take many instruction steps to get to the next label.
set i 0
set pc [get_hexadecimal_valueof "\$pc" "NO-PC" ]
set val [get_hexadecimal_valueof "&${label}" "INVALID"]
while { $pc < $val } {
incr i
set line_changed -1
gdb_test_multiple "stepi" "stepi $i" {
-re "\r\n$hex\[ \t\]+$decimal\[^\r\n\]+\r\n$gdb_prompt" {
set line_changed 0
}
-re "\r\n$decimal\[ \t\]+/\\* $pattern \\*/\r\n$gdb_prompt" {
set line_changed 1
}
}
gdb_assert { $line_changed != -1 } \
"ensure we saw a valid pattern, $i"
set pc [get_hexadecimal_valueof "\$pc" "NO-PC" \
"get pc inside stepi loop, $i"]
if { $pc == $val } {
gdb_assert { $line_changed } \
"line must change at $label"
} else {
gdb_assert { !$line_changed } "same line $i"
}
}
}
}