diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/formatted_ref.exp | 102 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/formatted_ref/defs.adb | 23 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/formatted_ref/defs.ads | 27 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/formatted_ref/formatted_ref.adb | 21 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/formatted-ref.cc | 48 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/formatted-ref.exp | 130 |
7 files changed, 359 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bdb58a9..b225f2f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-01-30 Paul Hilfinger <hilfinger@adacore.com> + + * gdb.ada/formatted_ref: New test program. + * gdb.ada/formatted_ref.exp: New testcase. + + * gdb.cp/formatted-ref.cc: New file. + * gdb.cp/formatted-ref.exp: New testcase. + 2008-01-30 Joel Brobecker <brobecker@adacore.com> * gdb.base/ptype.exp: Add testing of "ptype $pc". diff --git a/gdb/testsuite/gdb.ada/formatted_ref.exp b/gdb/testsuite/gdb.ada/formatted_ref.exp new file mode 100644 index 0000000..4029aeb --- /dev/null +++ b/gdb/testsuite/gdb.ada/formatted_ref.exp @@ -0,0 +1,102 @@ +# Copyright 2007, 2008 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/>. + +# Author: P. N. Hilfinger, AdaCore Inc. + +# Note: This test is essentially a transcription of gdb.cp/formatted-ref.exp, +# and is thus much more wordy than it needs to be. There are fewer +# tests because only a few parameter types in Ada are required to be +# passed by reference, and there is no equivalent of &(&x) for reference +# values. + +if $tracelevel then { + strace $tracelevel +} + +load_lib "ada.exp" + +set testdir "formatted_ref" +set testfile "${testdir}/formatted_ref" +set srcfile ${srcdir}/${subdir}/${testfile}.adb +set binfile ${objdir}/${subdir}/${testfile} + + +file mkdir ${objdir}/${subdir}/${testdir} +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } { + untested formatted-ref.exp + return -1 +} + +proc get_address { var } { + global expect_out + global gdb_prompt + + send_gdb "print $var'access\n" + gdb_expect { + -re "\\$\[0-9\]+ = \\(.*\\) (0x\[0-9a-f\]+).*$gdb_prompt $" { + return $expect_out(1,string) + } + timeout { + perror "couldn't find address of $var" + return "" + } + } +} + +proc test_p_x { var val addr } { + global gdb_prompt + + set test "print/x $var" + gdb_test_multiple "$test" $test { + -re "\\$\[0-9\]+ = [string_to_regexp $val].*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + fail "$test (prints just address)" + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +proc test_p_x_addr { var addr } { + global gdb_prompt + + set test "print/x $var'access" + gdb_test_multiple $test $test { + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +runto defs.adb:[gdb_get_line_number "marker here" ${testdir}/defs.adb ] + +set s1_address [get_address "s1"] + +test_p_x "s" "(x => 0xd, y => 0x13)" $s1_address + +test_p_x_addr "s" $s1_address diff --git a/gdb/testsuite/gdb.ada/formatted_ref/defs.adb b/gdb/testsuite/gdb.ada/formatted_ref/defs.adb new file mode 100644 index 0000000..ceceda1 --- /dev/null +++ b/gdb/testsuite/gdb.ada/formatted_ref/defs.adb @@ -0,0 +1,23 @@ +-- Copyright 2007, 2008 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/>. + +package body Defs is + + function F1 (S : Struct1) return Integer is + begin + return s.x; -- Set breakpoint marker here. + end F1; + +end Defs; diff --git a/gdb/testsuite/gdb.ada/formatted_ref/defs.ads b/gdb/testsuite/gdb.ada/formatted_ref/defs.ads new file mode 100644 index 0000000..8a75122 --- /dev/null +++ b/gdb/testsuite/gdb.ada/formatted_ref/defs.ads @@ -0,0 +1,27 @@ +-- Copyright 2007, 2008 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/>. + +package Defs is + + type Struct1 is limited record + X : Integer := 13; + Y : Integer := 19; + end record; + + function F1 (S : Struct1) return Integer; + + S1 : Struct1; + +end Defs; diff --git a/gdb/testsuite/gdb.ada/formatted_ref/formatted_ref.adb b/gdb/testsuite/gdb.ada/formatted_ref/formatted_ref.adb new file mode 100644 index 0000000..569b58f --- /dev/null +++ b/gdb/testsuite/gdb.ada/formatted_ref/formatted_ref.adb @@ -0,0 +1,21 @@ +-- Copyright 2007, 2008 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/>. + +with Defs; +procedure Formatted_Ref is + X : Integer; +begin + X := Defs.F1 (Defs.S1); +end Formatted_Ref; diff --git a/gdb/testsuite/gdb.cp/formatted-ref.cc b/gdb/testsuite/gdb.cp/formatted-ref.cc new file mode 100644 index 0000000..857c3ce --- /dev/null +++ b/gdb/testsuite/gdb.cp/formatted-ref.cc @@ -0,0 +1,48 @@ +/* Copyright 2007, 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + 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/>. */ + +/* Author: Paul N. Hilfinger, AdaCore Inc. */ + +enum Enum1 { Val10=10, Val11, Val12 }; + +struct Struct1 +{ + int x, y; +}; + +int f1 (Struct1& s, Enum1& e, int& i) +{ + return s.x; /* Set breakpoint marker here. */ +} + +Struct1 s1 = { 13, 19 }; + +int i1 = 23; + +Enum1 e1 = Val11; + +int main(void) +{ + + #ifdef usestubs + set_debug_traps(); + breakpoint(); + #endif + + f1 (s1, e1, i1); + +} diff --git a/gdb/testsuite/gdb.cp/formatted-ref.exp b/gdb/testsuite/gdb.cp/formatted-ref.exp new file mode 100644 index 0000000..f9c8ad3 --- /dev/null +++ b/gdb/testsuite/gdb.cp/formatted-ref.exp @@ -0,0 +1,130 @@ +# Copyright 2007, 2008 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/>. + +# Author: P. N. Hilfinger, AdaCore, Inc. + +# This test checks the behavior of formatted print when applied to a +# reference value. The intended behavior is that a formatted print of +# such a value should display the same value as a plain print, +# modulo format, of course. Older versions of GDB would instead print +# the reference's address value itself when doing a formatted print, +# rather than printing both that and the dereferenced value. We also +# check that the (non-standard) expression &(&x), where x is of type T&, +# yields an appropriate value. + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "formatted-ref" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + untested formatted-ref.exp + return -1 +} + +proc get_address { var } { + global expect_out + global gdb_prompt + + send_gdb "print &$var\n" + gdb_expect { + -re "\\$\[0-9\]+ = \\(.*\\) (0x\[0-9a-f\]+).*$gdb_prompt $" { + return $expect_out(1,string) + } + timeout { + perror "couldn't find address of $var" + return "" + } + } +} + +proc test_p_x { var type val addr } { + global gdb_prompt + + set test "print/x $var" + gdb_test_multiple $test $test { + -re "\\$\[0-9\]+ = \\([string_to_regexp $type]\\) @0x\[a-f0-9\]+: [string_to_regexp $val].*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + fail "$test (prints just address)" + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +proc test_p_x_addr { var addr } { + global gdb_prompt + + set test "print/x &$var" + gdb_test_multiple $test $test { + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +proc test_p_x_ref_addr { var addr } { + global gdb_prompt + + set test "print/x *(&(&$var))" + gdb_test_multiple $test $test { + -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" { + pass $test + } + -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" { + fail "$test (prints unexpected address)" + } + } + return 0 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +runto ${srcfile}:[gdb_get_line_number "marker here"] + +set s1_address [get_address "s1"] +set e1_address [get_address "e1"] +set i1_address [get_address "i1"] + +test_p_x "s" "Struct1 &" "{x = 0xd, y = 0x13}" $s1_address +test_p_x "e" "Enum1 &" "0xb" $e1_address +test_p_x "i" "int &" "0x17" $i1_address + +test_p_x_addr "s" $s1_address +test_p_x_addr "e" $e1_address +test_p_x_addr "i" $i1_address + +test_p_x_ref_addr "s" $s1_address +test_p_x_ref_addr "i" $i1_address +test_p_x_ref_addr "e" $e1_address |