# Copyright 2020-2025 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/>.

# Check the gdb.Architecture.registers functionality.

load_lib gdb-python.exp
require allow_python_tests
standard_testfile py-arch.c

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
    return -1
}

if ![runto_main] {
   return -1
}

# First, use 'info registers' to get a list of register names.
set regs {}
gdb_test_multiple "info registers general" "info registers general" {
    -re "^info registers general\r\n" {
	exp_continue
    }
    -re "^(\[^ \t\]+)\[ \t\]+\[^\r\n\]+\r\n" {
	set reg $expect_out(1,string)
	lappend regs $reg
	exp_continue
    }
    -re "^$gdb_prompt " {
    }
}
gdb_assert {[llength $regs] > 0} \
    "Found at least one register"

# Now get the same register names using Python API.
gdb_py_test_silent_cmd \
    "python frame = gdb.selected_frame()" "get frame" 0
gdb_py_test_silent_cmd \
    "python arch = frame.architecture()" "get arch" 0
gdb_py_test_silent_cmd \
    "python regs = list (arch.registers (\"general\"))" \
    "get general registers" 0
gdb_py_test_silent_cmd \
    "python regs = map (lambda r : r.name, regs)" \
    "get names of general registers" 0

set py_regs {}
gdb_test_multiple "python print (\"\\n\".join (regs))" \
    "general register from python" {
	-re "^python print \[^\r\n\]+\r\n" {
	    exp_continue
	}
	-re "^(\[^\r\n\]+)\r\n" {
	    set reg $expect_out(1,string)
	    lappend py_regs $reg
	    exp_continue
	}
	-re "^$gdb_prompt " {
	}
    }

gdb_assert {[llength $py_regs] > 0} \
    "Found at least one register from python"
gdb_assert {[llength $py_regs] == [llength $regs]} \
    "Same numnber of registers found"

set found_non_match 0
for { set i 0 } { $i < [llength $regs] } { incr i } {
    if {[lindex $regs $i] != [lindex $py_regs $i]} {
	set found_non_match 1
    }
}
gdb_assert { $found_non_match == 0 } "all registers match"

# Check that we get the same register descriptors from two different
# iterators.
gdb_py_test_silent_cmd \
    "python iter1 = arch.registers ()" \
    "get first all register iterator" 0
gdb_py_test_silent_cmd \
    "python iter2 = arch.registers ()" \
    "get second all register iterator" 0
gdb_py_test_silent_cmd \
    [multi_line_input \
	 "python" \
	 "for r1, r2 in zip(iter1, iter2):" \
	 "  if (r1.name != r2.name):"\
	 "    raise gdb.GdbError (\"miss-matched names\")" \
	 "  if (r1 != r2):" \
	 "    raise gdb.GdbError (\"miss-matched objects\")" \
	 "end" ] \
    "check names and objects match" 1

# Ensure that the '.find' method on the iterator returns the same
# Python object as we got from the iterator's list of descriptors.
gdb_py_test_silent_cmd \
    [multi_line \
	 "python" \
	 "def check_regs (arch, regs):" \
	 "   for r in (regs):" \
	 "     if (arch.registers ().find (r.name) != r):" \
	 "       raise gdb.GdbError (\"object miss-match\")" \
	 "end" ] \
    "build check_obj function" 0
gdb_py_test_silent_cmd \
    "python check_regs (arch, arch.registers (\"general\"))" \
    "ensure find gets expected descriptors" 1
