| # 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(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 } |