blob: 7e0dc2ea9123c42738f95a05b86cce955b93fec2 [file] [log] [blame]
# Copyright 2018-2021 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/>.
# Test MIPS Floating Point General Register handling in core files.
if { ![istarget "mips*-*-*"] } then {
verbose "Skipping MIPS Floating Point General Register tests."
return
}
standard_testfile
if { [prepare_for_testing "failed to prepare" ${testfile}] } {
return
}
# Procedure to get current content of all floating-point registers.
proc mips_fpregset_core_fetch_float_registers { test } {
global gdb_prompt
set all_registers_lines {}
set bad -1
# Former trailing `\[\r\n\]+' may eat just \r leaving \n in the buffer
# corrupting the next matches.
if { [gdb_test_multiple "info registers float" $test {
-re "info registers float\r\n" {
exp_continue
}
-ex "The program has no registers now" {
set bad 1
exp_continue
}
-re "^\(?:fcsr\|fir\):\[ \t\]+\[^\r\n\]+\r\n" {
# Filter out control registers. They may or may not be a part
# of the float group depending on whether XML descriptions are
# used or not.
exp_continue
}
-re "^\[^ \t\]+\[ \t\]+\[^\r\n\]+\r\n" {
lappend all_registers_lines $expect_out(0,string)
exp_continue
}
-re "$gdb_prompt $" {
incr bad
}
-re "^\[^\r\n\]+\r\n" {
if { !$bad } {
warning "Unrecognized output: $expect_out(0,string)"
set bad 1
}
exp_continue
}
}] != 0 } {
return {}
}
if { $bad } {
fail $test
return {}
}
pass $test
return $all_registers_lines
}
# Generate a native core file.
set corefile [core_find $binfile]
set core_supported [expr {$corefile != ""}]
# Generate a core file with "gcore".
clean_restart ${binfile}
runto break_here
# Check if we have an FPU available.
gdb_test_multiple "show mipsfpu" "check for MIPS floating-point coprocessor" {
-re "The MIPS floating-point coprocessor\
.*\(absent\|unknown\).*$gdb_prompt $" {
unsupported "no MIPS floating-point coprocessor in the processor"
return
}
-re "The MIPS floating-point coprocessor .*$gdb_prompt $" {
verbose "MIPS floating-point coprocessor check successful."
}
default {
fail
return
}
}
# Save live FGR register contents.
set live_fgr_contents [mips_fpregset_core_fetch_float_registers \
"retrieve live FGR register contents"]
set gcorefile [standard_output_file gcore.test]
set gcore_supported [gdb_gcore_cmd "$gcorefile" "gcore"]
# Restart gdb and load COREFILE as a core file. SUPPORTED is true iff
# the core was generated successfully; otherwise, the tests are marked
# unsupported.
#
proc mips_fpregset_core_test { supported corefile } {
upvar live_fgr_contents live_fgr_contents
upvar target_triplet target_triplet
upvar host_triplet host_triplet
upvar binfile binfile
clean_restart ${binfile}
set test "load core file"
if { $supported } {
set core_loaded [gdb_core_cmd $corefile $test]
} else {
set core_loaded 0
unsupported $test
}
if { $core_loaded == 1 } {
set test "core file FGR register contents"
set core_fgr_contents \
[mips_fpregset_core_fetch_float_registers "retrieve $test"]
if { $core_fgr_contents == $live_fgr_contents } then {
pass $test
} else {
fail $test
}
} else {
unsupported $test
}
}
with_test_prefix "native" {
mips_fpregset_core_test $core_supported $corefile
}
with_test_prefix "gcore" {
mips_fpregset_core_test $gcore_supported $gcorefile
}
gdb_exit