# Copyright 2013-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

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

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

if ![runto_main] {
   return -1
}

# Test python/15461.  Invalid architectures should not trigger an
# internal GDB assert.
gdb_py_test_silent_cmd "python empty = gdb.Architecture()" "get empty arch" 0
gdb_test "python print(empty.name())" ".*Architecture is invalid.*" \
    "Test empty architecture.name does not trigger an assert"
gdb_test "python print(empty.disassemble())" ".*Architecture is invalid.*" \
    "Test empty architecture.disassemble does not trigger an assert"

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 pc = frame.pc()" "get pc" 0
gdb_py_test_silent_cmd "python insn_list1 = arch.disassemble(pc, pc, 1)" \
  "disassemble" 0
gdb_py_test_silent_cmd "python insn_list2 = arch.disassemble(pc, pc)" \
  "disassemble no count" 0
gdb_py_test_silent_cmd "python insn_list3 = arch.disassemble(pc, count=1)" \
  "disassemble no end" 0
gdb_py_test_silent_cmd "python insn_list4 = arch.disassemble(gdb.Value(pc))" \
  "disassemble no end no count" 0

gdb_test "python print (len(insn_list1))" "1" "test number of instructions 1"
gdb_test "python print (len(insn_list2))" "1" "test number of instructions 2"
gdb_test "python print (len(insn_list3))" "1" "test number of instructions 3"
gdb_test "python print (len(insn_list4))" "1" "test number of instructions 4"

gdb_py_test_silent_cmd "python insn = insn_list1\[0\]" "get instruction" 0

gdb_test "python print (\"addr\" in insn)" "True" "test key addr"
gdb_test "python print (\"asm\" in insn)" "True" "test key asm"
gdb_test "python print (\"length\" in insn)" "True" "test key length"

if { ![is_address_zero_readable] } {
    # Negative test
    gdb_test "python arch.disassemble(0, 0)" ".*gdb\.MemoryError.*" \
	"test bad memory access"
}

foreach size {0 1 2 3 4 8 16} {
    foreach sign_data {{"" True} \
			   {", True" True} \
			   {", False" False} \
			   {", None" False} \
			   {", \"blah\"" True}} {
	set sign [lindex $sign_data 0]
	# GDB's 0 bit type is always signed.
	if { $size == 0 } {
	    set sign_result True
	} else {
	    set sign_result [lindex $sign_data 1]
	}
	set fullsize [expr 8 * $size]
	gdb_test_no_output "python t = arch.integer_type($fullsize$sign)" \
	    "get integer type for $size$sign"
	gdb_test "python print(t.sizeof)" "$size" \
	    "print size of integer type for $size$sign"
	gdb_test "python print(t.is_signed == ${sign_result})" "True" \
	    "check signedness of type for $size$sign"
    }
}

gdb_test "python arch.integer_type(95)" \
    ".*ValueError: no integer type of that size is available.*" \
    "call integer_type with invalid size"

# Test for gdb.architecture_names().  First we're going to grab the
# complete list of architecture names using the 'complete' command.
set arch_names []
gdb_test_no_output "set max-completions unlimited"
gdb_test_multiple "complete set architecture " "" {
    -re "complete set architecture\[^\r\n\]+\r\n" {
	exp_continue
    }
    -re "^set architecture \(\[^\r\n\]+\)\r\n" {
	set arch $expect_out(1,string)
	if { "$arch" != "auto" } {
	    set arch_names [lappend arch_names $arch]
	}
	exp_continue
    }
    -re "^$gdb_prompt $" {
	gdb_assert { [llength $arch_names] > 0 }
    }
}

# Now find all of the architecture names using Python.
set py_arch_names []
gdb_test_no_output "python all_arch = gdb.architecture_names()"
gdb_test_no_output "python all_arch.sort()"
gdb_test_multiple "python print(\"\\n\".join((\"Arch: %s\" % a) for a in all_arch))" "" {
    -re "python \[^\r\n\]+\r\n" {
	exp_continue
    }
    -re "^Arch: \(\[^\r\n\]+\)\r\n" {
	set arch $expect_out(1,string)
	set py_arch_names [lappend py_arch_names $arch]
	exp_continue
    }
    -re "$gdb_prompt $" {
	gdb_assert { [llength $py_arch_names] > 0 }
    }
}

# Check the two lists of architecture names are the same length, and
# that the list contents all match.
gdb_assert { [llength $arch_names] == [llength $py_arch_names] }
set lists_match true
foreach a $arch_names b $py_arch_names {
    if { $a != $b } {
	set lists_match false
	verbose -log "Mismatch is architecture list '$a' != '$b'"
	break
    }
}
gdb_assert { $lists_match }
