aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.python/py-arch.exp
blob: b55778b0b72b2616048e4a71906521237538de2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# 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 {"" ", True" ", False" ", None" ", \"blah\""} {
	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 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 }