mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
9704b8b4bc
It is not necessary to call get_compiler_info before calling test_compiler_info, and, after recent commits that removed setting up the gcc_compiled, true, and false globals from get_compiler_info, there is now no longer any need for any test script to call get_compiler_info directly. As a result every call to get_compiler_info outside of lib/gdb.exp is redundant, and this commit removes them all. There should be no change in what is tested after this commit.
282 lines
8.3 KiB
Plaintext
282 lines
8.3 KiB
Plaintext
# Copyright 1998-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/>.
|
|
|
|
# This file was written by Elena Zannoni (ezannoni@cygnus.com)
|
|
|
|
# This file is part of the gdb testsuite
|
|
#
|
|
# tests for pointer arithmetic and pointer dereferencing
|
|
# with integer type variables and pointers to integers
|
|
#
|
|
|
|
#
|
|
# test running programs
|
|
#
|
|
|
|
standard_testfile .c
|
|
|
|
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
|
|
untested "failed to compile"
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${binfile}
|
|
|
|
|
|
#
|
|
# set it up at a breakpoint so we can play with the variable values
|
|
#
|
|
|
|
if ![runto_main] then {
|
|
perror "couldn't run to breakpoint"
|
|
return
|
|
}
|
|
|
|
# These are used as expected result values.
|
|
set false 0
|
|
set true 1
|
|
|
|
gdb_test "next " "more_code.*;" "continuing after dummy()"
|
|
|
|
|
|
#
|
|
# let's see if gdb catches some illegal operations on pointers
|
|
#
|
|
# I must comment these out because strict type checking is not
|
|
# supported in this version of GDB. I do not really know
|
|
# what the expected gdb reply is.
|
|
#
|
|
|
|
#send_gdb "print v_int_pointer2 = &v_int_pointer\n"
|
|
#gdb_expect {
|
|
# -re ".*.*$gdb_prompt $" {
|
|
# pass "illegal pointer assignment rejected"
|
|
# }
|
|
# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" }
|
|
# timeout { fail "(timeout) illegal pointer assignment rejected" }
|
|
# }
|
|
|
|
|
|
#send_gdb "print v_unsigned_int_pointer = &v_int\n"
|
|
#gdb_expect {
|
|
# -re ".*.*$gdb_prompt $" {
|
|
# pass "illegal pointer assignment rejected"
|
|
# }
|
|
# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" }
|
|
# timeout { fail "(timeout) ilegal pointer assignment rejected" }
|
|
# }
|
|
|
|
#send_gdb "print v_unsigned_int_pointer == v_double_pointer\n"
|
|
#gdb_expect {
|
|
# -re ".*.*$gdb_prompt $" {
|
|
# pass "illegal pointer operation (+) rejected"
|
|
# }
|
|
# -re ".*$gdb_prompt $" { fail "illegal pointer operation (+) rejected" }
|
|
# timeout { fail "(timeout) illegal pointer operation (+) rejected" }
|
|
# }
|
|
|
|
|
|
#send_gdb "print v_unsigned_int_pointer * v_double_pointer\n"
|
|
#gdb_expect {
|
|
# -re ".*Argument to arithmetic operation not a number or boolean.*$gdb_prompt $" {
|
|
# pass "illegal pointer operation (*) rejected"
|
|
# }
|
|
# -re ".*$gdb_prompt $" { fail "illegal pointer operation (*) rejected" }
|
|
# timeout { fail "(timeout) illegal pointer operation (*) rejected" }
|
|
# }
|
|
|
|
|
|
#send_gdb "print v_unsigned_int_pointer = v_double_pointer\n"
|
|
#gdb_expect {
|
|
# -re ".*.*$gdb_prompt $" {
|
|
# pass "ilegal pointer assignment rejected"
|
|
# }
|
|
# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" }
|
|
# timeout { fail "(timeout) illegal pointer assignment rejected" }
|
|
# }
|
|
|
|
|
|
#send_gdb "print v_unsigned_int_pointer = v_unsigned_int\n"
|
|
#gdb_expect {
|
|
# -re ".*.*$gdb_prompt $" {
|
|
# pass "illegal pointer assignment rejected"
|
|
# }
|
|
# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" }
|
|
# timeout { fail "(timeout) illegal pointer assignment rejected" }
|
|
# }
|
|
|
|
gdb_test_no_output "set variable v_int_pointer=&v_int_array\[0\]" \
|
|
"set pointer to beginning of array"
|
|
gdb_test_no_output "set variable v_int_pointer2=&v_int_array\[1\]" \
|
|
"set pointer to end of array"
|
|
|
|
|
|
gdb_test "print *v_int_pointer" " = 6" "print object pointed to"
|
|
|
|
gdb_test "print *v_int_pointer2" " = 18" "print object pointed to \#2"
|
|
|
|
gdb_test "print v_int_pointer == v_int_pointer2" " = $false" \
|
|
"pointer1==pointer2"
|
|
|
|
gdb_test "print v_int_pointer != v_int_pointer2" " = $true" \
|
|
"pointer1!=pointer2"
|
|
|
|
gdb_test "print v_int_pointer <= v_int_pointer2" " = $true" \
|
|
"pointer1<=pointer2"
|
|
|
|
gdb_test "print v_int_pointer >= v_int_pointer2" " = $false" \
|
|
"pointer1>=pointer2"
|
|
|
|
gdb_test "print v_int_pointer < v_int_pointer2" " = $true" \
|
|
"pointer1<pointer2"
|
|
|
|
gdb_test "print v_int_pointer > v_int_pointer2" " = $false" \
|
|
"pointer1>pointer2"
|
|
|
|
with_test_prefix "post-increment" {
|
|
gdb_test_no_output "set variable y = *v_int_pointer++" \
|
|
"set y = *v_int_pointer++"
|
|
gdb_test "print y" " = 6" "pointer assignment"
|
|
gdb_test "print *v_int_pointer" " = 18" "and post-increment"
|
|
}
|
|
|
|
|
|
with_test_prefix "pre-decrement" {
|
|
gdb_test_no_output "set variable y = *--v_int_pointer2" \
|
|
"set y = *--v_int_pointer2"
|
|
gdb_test "print y" " = 6" "pointer assignment"
|
|
gdb_test "print *v_int_pointer2" " = 6" "and pre-decrement"
|
|
}
|
|
|
|
|
|
gdb_test_no_output "set variable y =v_int_pointer-v_int_pointer2" \
|
|
"set y =v_int_pointer-v_int_pointer2"
|
|
gdb_test "print y" " = 1" "pointer1-pointer2"
|
|
|
|
|
|
gdb_test_no_output "set variable v_int_pointer=v_int_array" \
|
|
"set v_int_pointer=v_int_array"
|
|
gdb_test "print *v_int_pointer" " = 6" \
|
|
"print array element through pointer"
|
|
|
|
gdb_test "print *(v_int_pointer+1)" " = 18" \
|
|
"print array element through pointer \#2"
|
|
|
|
|
|
# test print elements of array through pointers
|
|
|
|
gdb_test "print (*rptr)\[0\]" " = 0" \
|
|
"print array element through pointer \#3"
|
|
|
|
gdb_test "print (*rptr)\[1\]" " = 1" \
|
|
"print array element through pointer \#4"
|
|
|
|
gdb_test "print (*rptr)\[2\]" " = 2" \
|
|
"print array element through pointer \#5"
|
|
|
|
gdb_test_no_output "set variable rptr = rptr+1" "increment rptr"
|
|
|
|
gdb_test "print (*rptr)\[0\]" " = 3" \
|
|
"print array element through pointer \#6"
|
|
|
|
gdb_test "print (*rptr)\[1\]" " = 4" \
|
|
"print array element through pointer \#7"
|
|
|
|
gdb_test "print (*rptr)\[2\]" " = 5" \
|
|
"print array element through pointer \#8"
|
|
|
|
gdb_test "print *( *(matrix+1) +2)" " = 5" \
|
|
"print array element w/ pointer arithmetic"
|
|
|
|
gdb_test "print **ptr_to_ptr_to_float" " = 100" \
|
|
"print through ptr to ptr"
|
|
|
|
# tests for pointers
|
|
# with elementary type variables and pointers.
|
|
#
|
|
|
|
gdb_test "break marker1" ".*" ""
|
|
gdb_test "cont" "Break.* marker1 \\(\\) at .*:$decimal.*" \
|
|
"continue to marker1"
|
|
gdb_test "up" "more_code.*" "up from marker1"
|
|
|
|
gdb_test "print *pUC" " = 21 \'.025\'.*" "print value of *pUC"
|
|
|
|
gdb_test "ptype pUC" "type = unsigned char \\*"
|
|
|
|
gdb_test "print *pS" " = -14" "print value of *pS"
|
|
|
|
gdb_test_multiple "ptype pS" "ptype pS" {
|
|
-re "type = short \\*.*$gdb_prompt $" { pass "ptype pS" }
|
|
-re "type = short int \\*.*$gdb_prompt $" { pass "ptype pS" }
|
|
}
|
|
|
|
gdb_test "print *pUS" " = 7" "print value of *pUS"
|
|
|
|
gdb_test_multiple "ptype pUS" "ptype pUS" {
|
|
-re "type = unsigned short \\*.*$gdb_prompt $" { pass "ptype pUS" }
|
|
-re "type = short unsigned int \\*.*$gdb_prompt $" { pass "ptype pUS" }
|
|
}
|
|
|
|
gdb_test "print *pI" " = 102" "print value of *pI"
|
|
|
|
gdb_test "ptype pI" "type = int \\*"
|
|
|
|
gdb_test "print *pUI" " = 1002" "print value of *pUI"
|
|
|
|
gdb_test "ptype pUI" "type = unsigned int \\*"
|
|
|
|
gdb_test "print *pL" " = -234" "print value of *pL"
|
|
|
|
gdb_test_multiple "ptype pL" "ptype pL" {
|
|
-re "type = long \\*.*$gdb_prompt $" { pass "ptype pL" }
|
|
-re "type = long int \\*.*$gdb_prompt $" { pass "ptype pL" }
|
|
}
|
|
|
|
gdb_test "print *pUL" " = 234" "print value of *pUL"
|
|
|
|
gdb_test_multiple "ptype pUL" "ptype pUL" {
|
|
-re "type = unsigned long \\*.*$gdb_prompt $" { pass "ptype pUL" }
|
|
-re "type = long unsigned int \\*.*$gdb_prompt $" { pass "ptype pUL" }
|
|
}
|
|
|
|
gdb_test "print *pF" " = 1.2\[0-9\]*e\\+0?10" "print value of *pF"
|
|
|
|
gdb_test "ptype pF" "type = float \\*"
|
|
|
|
gdb_test "print *pD" " = -1.2\[0-9\]*e\\-0?37" "print value of *pD"
|
|
|
|
gdb_test "ptype pD" "type = double \\*"
|
|
|
|
gdb_test "print ******ppppppC" " = 65 \'A\'" \
|
|
"print value of ******ppppppC"
|
|
|
|
gdb_test "ptype pC" "type = char \\*"
|
|
|
|
gdb_test "ptype ppC" "type = char \\*\\*"
|
|
|
|
gdb_test "ptype pppC" "type = char \\*\\*\\*"
|
|
|
|
gdb_test "ptype ppppC" "type = char \\*\\*\\*\\*"
|
|
|
|
gdb_test "ptype pppppC" "type = char \\*\\*\\*\\*\\*"
|
|
|
|
gdb_test "ptype ppppppC" "type = char \\*\\*\\*\\*\\*\\*"
|
|
|
|
# Regression test for a crash.
|
|
|
|
gdb_test "p instance.array_variable + 0" \
|
|
" = \\(long (int )?\\*\\) 0x\[0-9a-f\]* <instance>"
|