# Copyright (C) 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/>.

# This file is part of the gdb testsuite.

# This tests checks that generating and loading a core file preserves
# the correct FPSCR size.

if {![istarget "powerpc*-*-linux*"]} then {
    verbose "Skipping PowerPC test for corefiles with FPSCR."
    return
}

standard_testfile .c

set gen_src [standard_output_file $srcfile]

gdb_produce_source $gen_src {
	int main() {
	    return 0;
	}
}

if {[build_executable "compile" $binfile $gen_src] == -1} {
    return -1
}

clean_restart $binfile

if ![runto_main] then {
    return -1
}

# Check if our target has FPSCR
proc check_fpscr_access {} {
    global gdb_prompt

    set test "fpscr register access"
    gdb_test_multiple "info reg fpscr" "$test" {
	-re "Invalid register.*\r\n$gdb_prompt $" {
	    unsupported "$test"
	    return 0
	}
	-re "\r\nfpscr.*\r\n$gdb_prompt $" {
	    pass "$test"
	    return 1
	}
    }
    return 0
}

if { ![check_fpscr_access] } {
    return -1
}

set fpscr_size_process [get_integer_valueof "sizeof(\$fpscr)" -1 "process size"]

set core_filename [standard_output_file "$testfile.core"]
set core_generated [gdb_gcore_cmd "$core_filename" "generate core file"]

if { !$core_generated } {
    return -1
}

clean_restart

set core_loaded [gdb_core_cmd "$core_filename" "load core file"]

if { $core_loaded != 1 } {
    return -1
}

set fpscr_size_corefile [get_integer_valueof "sizeof(\$fpscr)" -2 "corefile size" ]

set test "fpscr size matches"
if {$fpscr_size_process == $fpscr_size_corefile} {
    pass $test
} else {
    fail $test
}
