From: Pierre Muller Date: Wed, 6 Feb 2008 22:24:43 +0000 (+0000) Subject: * gdb.pascal/floats.pas: New test program. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b1c32d3564a29b3342d97bcf7569d2811868df9c;p=binutils-gdb.git * gdb.pascal/floats.pas: New test program. * gdb.pascal/floats.exp: New testcase. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 86c00686c16..15bcc864ace 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-02-06 Pierre Muller + + * gdb.pascal/floats.pas: New test program. + * gdb.pascal/floats.exp: New testcase. + 2008-02-06 Thiago Jung Bauermann * gdb.base/callfuncs.c (t_float_many_args): New function. diff --git a/gdb/testsuite/gdb.pascal/floats.exp b/gdb/testsuite/gdb.pascal/floats.exp new file mode 100644 index 00000000000..d63ee5dbf9c --- /dev/null +++ b/gdb/testsuite/gdb.pascal/floats.exp @@ -0,0 +1,159 @@ +# 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 . + +if $tracelevel then { + strace $tracelevel +} + +load_lib "pascal.exp" + +set testfile "floats" +set srcfile ${testfile}.pas +set binfile ${objdir}/${subdir}/${testfile}$EXEEXT + +if {[gdb_compile_pascal "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ]] != "" } { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] +set bp_location2 [gdb_get_line_number "set breakpoint 2 here"] + +if { [gdb_breakpoint ${srcfile}:${bp_location1}] } { + pass "setting breakpoint 1" +} +if { [gdb_breakpoint ${srcfile}:${bp_location2}] } { + pass "setting breakpoint 2" +} + +# Verify that "start" lands inside the right procedure. +if { [gdb_start_cmd] < 0 } { + untested start + return -1 +} + +gdb_test "" ".* at .*${srcfile}.*" "start" + +gdb_test "cont" "Breakpoint .*:${bp_location1}.*" "Going to first breakpoint" +gdb_test "print r" ".* = 0" "Print r before assigned to 1.25" + +gdb_test "next" "r := 1\\.25;" "Next to 'r := 1.25' line" +gdb_test "next" "s := 2\\.2;" "Next to 's := 2.2' line" +gdb_test "next" "t := -3\\.2;" "Next to 't := -3.2' line" +gdb_test "next" "u := 78\\.3;" "Next to 'u := 78.3' line" +gdb_test "next" "l := 1;" "Next to 'l := 1' line" +gdb_test "next" "i := 1;" "Next to 'i := 1' line" + +# At that point, +# r should be equal to 1.25 +gdb_test "print r" " = 1\\.25" +# s should be equal to 2.2 +gdb_test "print s" " = 2\\.(199.*|2|200.*)" +# t should be equal to -3.2 +gdb_test "print t" " = -3\\.(199.*|2|200.*)" +# u should be equal to 78.3 +gdb_test "print u" " = 78\\.(3|300.*|299.*)" + +# Test addition +gdb_test "print r + s" " = 3\\.4(499.*|5|500.*)" +gdb_test "print r + t" " = -1\\.9(499.*|5|500.*)" + +#Test addition with float constants +gdb_test "print r + 1.5" " = 2\\.7(499.*|5|500.*)" +gdb_test "print r + 0.03" " = 1\\.2(799.*|8|800.*)" +gdb_test "print r + (-0.2)" " = 1\\.0(499|5|500.*)" +gdb_test "print r + 1.5E+3" " = 1501\\.2(499.*|5|500.*)" +gdb_test "print r + 1.5E+2" " = 151\\.2(499.*|5|500.*)" +gdb_test "print r + 1.5E+1" " = 16\\.2(499|5|500.*)" +gdb_test "print r + 1.5E+0" " = 2\\.7(499.*|5|500.*)" +gdb_test "print r + 1.5E-1" " = 1\\.(399.*|4|400.*)" +gdb_test "print r + 1.5E-2" " = 1\\.26(499.*|5|500.*)" +gdb_test "print r + 1.5E-3" " = 1\\.251(499.*|5|500.*)" + +# Test addition with integer variables +gdb_test "print r + l" " = 2\\.2(499.*|5|500.*)" +gdb_test "print l + t" " = -2\\.(199.*|2|200.*)" + +# Test addition with integer constants +gdb_test "print r + 10" " = 11\\.2(499.*|5|500.*)" +gdb_test "print r + 5" " = 6\\.2(499.*|5|500.*)" +gdb_test "print r + 1" " = 2\\.2(499.*|5|500.*)" +gdb_test "print r + 0" " = 1\\.2(499|5|500.*)" +gdb_test "print r + (-1)" " = 0\\.2(499.*|5|500.*)" +gdb_test "print r + (-5)" " = -3\\.7(499.*|5|500.*)" +gdb_test "print r + (-10)" " = -8\\.7(499.*|5|500.*)" + +# Test substraction +gdb_test "print r - s" " = -0\\.9(499.*|5|500.*)" +gdb_test "print r - t" " = 4\\.4(499.*|5|500.*)" + +# Test unany minus +gdb_test "print -r" " = -1\\.2(499.*|5|500.*)" +gdb_test "print (-r)" " = -1\\.2(499.*|5|500.*)" +gdb_test "print -(r)" " = -1.2(499.*|5|500.*)" +gdb_test "print -(r + s)" " = -3\\.4(499.*|5|500.*)" + +# Test multiplication +gdb_test "print 2 * r" " = 2\\.(499.*|5|500.*)" +gdb_test "print 2.0 * r" " = 2\\.(499.*|5|500.*)" +gdb_test "print 1000*r" " = 12(49\\.99.*|50|50\\.00.*)" + +#Test division +gdb_test "print r / 2" " = 0\\.62(499.*|5|500.*)" +gdb_test "print 35 / 2" " = 17\\.(499.*|5|500.*)" + +# 'set r' does not work, as there are set sub-commands starting with 'r' +# Thus we need to use 'set var r' +gdb_test "set var r := 2.56" " := 2\\.56" +gdb_test "print r" " = 2\\.56.*" "Testing new r value" + +gdb_test "cont" \ + "Breakpoint .*:${bp_location2}.*" \ + "Going to second breakpoint" +gdb_test "next" "r := cos\\(u\\);" "Advance to 'r := cos(u)' line" +gdb_test "print u" " = 3\\.14159.*" "Test pi value" +gdb_test "next" "s := sin\\(u\\);" "Advance to 's := sin(u)' line" +gdb_test "print r" " = -1" "Test cos(pi) is equal to -1" +gdb_test "next" "" "Go past 's := sin(u)' line" + +set msg "Test sin(pi) is equal to 0" + +gdb_test_multiple "print s" $msg { + -re ".* = (0|-?\[0-9\]\\.\[0-9\]*\[eE\](-?\[0-9\]*))\[\r\n\]+$gdb_prompt $" { + set value "$expect_out(1,string)" + verbose "value is $value" 1 + if [info exists expect_out(2,string)] { + set expo $expect_out(2,string) + verbose "expo found: $expo" 1 + } else { + set expo "0" + regsub ".*\[eE\]" "$value" "" expo; + } + regsub "^-" "$expo" "" mexpo; + verbose "expo is $expo" 1 + verbose "mexpo is $mexpo" 1 + if { $value == 0 } { + pass $msg + } elseif {$mexpo > 8} { + pass "$msg '$value' is close to zero" + } else { + fail "$msg '$value' too large" + } + verbose "Still here" 1 + } +} diff --git a/gdb/testsuite/gdb.pascal/floats.pas b/gdb/testsuite/gdb.pascal/floats.pas new file mode 100644 index 00000000000..c1d0f4b0961 --- /dev/null +++ b/gdb/testsuite/gdb.pascal/floats.pas @@ -0,0 +1,47 @@ +{ + Copyright 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 . +} + + +program floats; + +var + i, j, k, l : integer; + r, s, t, u : real; + +begin + i := 0; + j := 0; + k := 0; + r := 0.0; + s := 0.0; + t := 0.0; + u := 0.0; + l := 0; + i := 1; { set breakpoint 1 here } + r := 1.25; + s := 2.2; + t := -3.2; + u := 78.3; + l := 1; + i := 1; + u := pi; { set breakpoint 2 here } + r := cos(u); + s := sin(u); + u := pi / 2; + r := cos(u); + s := sin(u); +end.