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

load_lib gdb-python.exp
standard_testfile

foreach func_name { foo bar } {
    if {[build_executable "build binary with ${func_name} function" \
	     "$testfile-${func_name}" $srcfile \
	     [list debug \
		  nopie \
		  additional_flags=-DFUNCTION_NAME=${func_name}]] == -1} {
	return -1
    }
}

set binary_foo [standard_output_file "${testfile}-foo"]
set binary_bar [standard_output_file "${testfile}-bar"]

clean_restart $binary_foo

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

if ![runto_main] {
   return -1
}

# Check the gdb.format_address method when using the default values
# for the program space and architecture (these will be selected based
# on the current inferior).
set main_addr [get_hexadecimal_valueof "&main" "UNKNOWN"]
set next_addr [format 0x%x [expr $main_addr + 1]]

foreach_with_prefix symbol_filename { on off } {
    gdb_test_no_output "set print symbol-filename ${symbol_filename}"

    if { $symbol_filename == "on" } {
	set filename_pattern " at \[^\r\n\]+/${srcfile}:$decimal"
    } else {
	set filename_pattern ""
    }

    gdb_test "python print(\"Got: \" + gdb.format_address($main_addr))" \
	"Got: $main_addr <main${filename_pattern}>" \
	"gdb.format_address, result should have no offset"

    gdb_test "python print(\"Got: \" + gdb.format_address($next_addr))" \
	"Got: $next_addr <main\\+1${filename_pattern}>" \
	"gdb.format_address, result should have an offset"
}

if {![is_address_zero_readable]} {
    gdb_test "python print(\"Got: \" + gdb.format_address(0))" \
	"Got: 0x0" \
	"gdb.format_address for address 0"
}

# Now check that gdb.format_address will accept the program space and
# architecture arguments correctly.
gdb_test_no_output "python inf = gdb.selected_inferior()"

# First, pass both arguments, this should be fine.
gdb_test "python print(\"Got: \" + gdb.format_address($main_addr, inf.progspace, inf.architecture()))" \
    "Got: $main_addr <main>" \
    "gdb.format_address passing program space and architecture"

# Now pass the program space and architecture as None.
# First, pass both arguments, this should be fine.
gdb_test "python print(\"Got: \" + gdb.format_address($main_addr, None, None))" \
    "Got: $main_addr <main>" \
    "gdb.format_address passing program space and architecture as None"

# Now forget the architecture, this should fail.
gdb_test "python print(\"Got: \" + gdb.format_address($main_addr, inf.progspace))" \
    [multi_line \
	 "ValueError: The architecture and progspace arguments must both be supplied" \
	 "Error while executing Python code\\."] \
    "gdb.format_address passing program space only"

gdb_test "python print(\"Got: \" + gdb.format_address($main_addr, inf.progspace, None))" \
    [multi_line \
	 "ValueError: The architecture and progspace arguments must both be supplied" \
	 "Error while executing Python code\\."] \
    "gdb.format_address passing real program space, but architecture is None"

# Now skip the program space argument.
gdb_test "python print(\"Got: \" + gdb.format_address($main_addr, architecture=inf.architecture()))" \
    [multi_line \
	 "ValueError: The architecture and progspace arguments must both be supplied" \
	 "Error while executing Python code\\."] \
    "gdb.format_address passing architecture only"

gdb_test "python print(\"Got: \" + gdb.format_address($main_addr, None, inf.architecture()))" \
    [multi_line \
	 "ValueError: The architecture and progspace arguments must both be supplied" \
	 "Error while executing Python code\\."] \
    "gdb.format_address passing real architecture, but progspace is None"

# Now, before we add a second inferior, lets just check we can format
# the address of 'foo' correctly.
set foo_addr [get_hexadecimal_valueof "&foo" "UNKNOWN"]

gdb_test "python print(\"Got: \" + gdb.format_address($foo_addr, inf.progspace, inf.architecture()))" \
    "Got: $foo_addr <foo>" \
    "gdb.format_address for foo, with just one inferior"

# Now lets add a second inferior, using a slightly different
# executable, select that inferior, and capture a reference to the
# inferior in a Python object.
gdb_test "add-inferior -exec ${binary_bar}" ".*" \
    "add a second inferior running the bar executable"
gdb_test "inferior 2" ".*"
gdb_test_no_output "python inf2 = gdb.selected_inferior()"

# Now we can test formatting an address from inferior 1.
gdb_test "python print(\"Got: \" + gdb.format_address($foo_addr, inf.progspace, inf.architecture()))" \
    "Got: $foo_addr <foo>" \
    "gdb.format_address for foo, while inferior 2 is selected"

# Grab the address of 'bar'.  Hopefully this will be the same address
# as 'foo', but if not, that's not the end of the world, the test just
# wont be quite as tough.
set bar_addr [get_hexadecimal_valueof "&bar" "UNKNOWN"]

# Now format the address of bar using the default inferior and
# architecture, this should display the 'bar' symbol rather than
# 'foo'.
gdb_test "python print(\"Got: \" + gdb.format_address($bar_addr))" \
    "Got: $bar_addr <bar>" \
    "gdb.format_address for bar, while inferior 2 is selected"

# And again, but this time, specificy the program space and
# architecture.
gdb_test "python print(\"Got: \" + gdb.format_address($bar_addr, inf2.progspace, inf2.architecture()))" \
    "Got: $bar_addr <bar>" \
    "gdb.format_address for bar, while inferior 2 is selected, pass progspace and architecture"

# Reselect inferior 1, and then format an address from inferior 2.
gdb_test "inferior 1" ".*"
gdb_test "python print(\"Got: \" + gdb.format_address($bar_addr, inf2.progspace, inf2.architecture()))" \
    "Got: $bar_addr <bar>" \
    "gdb.format_address for bar, while inferior 1 is selected, pass progspace and architecture"

# Try pasing incorrect object types for program space and architecture.
gdb_test "python print(\"Got: \" + gdb.format_address($bar_addr, inf2.progspace, inf2.progspace))" \
    [multi_line \
	 "TypeError: The architecture argument is not a gdb.Architecture object" \
	 "Error while executing Python code\\."] \
    "gdb.format_address pass wrong object type for architecture"

gdb_test "python print(\"Got: \" + gdb.format_address($bar_addr, inf2.architecture(), inf2.architecture()))" \
    [multi_line \
	 "TypeError: The progspace argument is not a gdb.Progspace object" \
	 "Error while executing Python code\\."] \
    "gdb.format_address pass wrong object type for progspace"

# Now invalidate inferior 2's program space, and try using that.
gdb_test "python pspace = inf2.progspace"
gdb_test "python arch = inf2.architecture()"
gdb_test "remove-inferior 2"
gdb_test "python print(\"Got: \" + gdb.format_address($bar_addr, pspace, arch))" \
    [multi_line \
	 "ValueError: The progspace argument is not valid" \
	 "Error while executing Python code\\."] \
    "gdb.format_address called with an invalid program space"
