This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[rfc] add ppc testcase to test fpscr


Hi,

I've been playing with GDB code related to powerpc's fpscr, and noticed
that there's nothing testing it in the testsuite. This patch adds basic
sanity checking of that register.

Also, this adds the function gdb_send_cmd to lib/gdb.exp. More than once
I've wanted to send a commad to GDB and wait to get the prompt back
(because send_gdb is too fast and can create racy testcases). This
function scratches that itch.

What do you think? OK to commit?
-- 
[]'s
Thiago Jung Bauermann
IBM Linux Technology Center

:ADDPATCH testsuite:

2008-08-21  Thiago Jung Bauermann  <bauerman@br.ibm.com>

    	* gdb.arch/ppc-fp.exp: New file.
    	* gdb.arch/ppc-fp.c: New file.
    	* lib/gdb.exp (gdb_send_cmd): New function.

diff --git a/gdb/testsuite/gdb.arch/ppc-fp.c b/gdb/testsuite/gdb.arch/ppc-fp.c
new file mode 100644
index 0000000..90563f4
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/ppc-fp.c
@@ -0,0 +1,42 @@
+/* Copyright 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/>.  */
+
+#include <stdio.h>
+
+int
+main (int argc, char *argv[])
+{
+  double result;
+
+  asm ("fdiv %0, %1, %1\n"	/* Invalid operation.  */
+       : "=f" (result)
+       : "f" (0.0));
+
+  printf ("result = %f\n", result);
+
+  asm ("mtfsf 0xff, %0\n"  /* Reset FPSCR.  */
+       :
+       : "f" (0.0));
+
+  asm ("fdiv %0, %1, %2\n"	/* Division by zero.  */
+       : "=f" (result)
+       : "f" (1.25), "f" (0.0));
+
+  printf ("result = %f\n", result);
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.arch/ppc-fp.exp b/gdb/testsuite/gdb.arch/ppc-fp.exp
new file mode 100644
index 0000000..38e033c
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/ppc-fp.exp
@@ -0,0 +1,94 @@
+# Copyright (C) 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/>.
+#
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@prep.ai.mit.edu
+#
+
+# Tests for Powerpc floating point register setting and fetching
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+if ![istarget "powerpc*"] then {
+    verbose "Skipping powerpc floating point register tests."
+    verbose -log "Skipping powerpc register tests."
+    return
+}
+
+set testfile "ppc-fp"
+set binfile ${objdir}/${subdir}/${testfile}
+set srcfile ${testfile}.c
+
+if [get_compiler_info $binfile] {
+    warning "get_compiler failed"
+    return -1
+}
+
+if ![test_compiler_info gcc*] {
+    # We use GCC's extended asm syntax
+    warning "unknown compiler"
+    return -1
+}
+
+# Try to compile the test case.  If we can't, assume the
+# toolchain does not yet provide DFP support and bail out.
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {quiet debug}] != "" } {
+    verbose "Skipping FPSCR tests."
+    return -1
+}
+
+# Start with a fresh gdb.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+gdb_breakpoint [gdb_get_line_number "Invalid operation."]
+gdb_breakpoint [gdb_get_line_number "Division by zero."]
+
+# Run the program, when the prompt comes back it will be for the invalid
+# operation breakpoint.
+gdb_send_cmd "run"
+
+# First, verify if FPSCR is all zeroes.
+gdb_test "print \$fpscr" " = 0\r" "FPSCR is all zeroes"
+
+# Step over invalid operation.
+gdb_send_cmd "next"
+
+# Verify that the following bits are set (See Power ISA for details):
+#
+# 32 - Floating-Point Exception Summary (FX)
+# 34 - Floating-Point Invalid Operation Summary (VX)
+# 42 - Floating-Point Invalid Operation Exception (VXZDZ)
+# 47 - Floating-Point Result Class Descriptor (C)
+# 51 - Floating-Point Unordered or NaN (FU or ?)
+gdb_test "print/t \$fpscr" " = 10100000001000010001000000000000\r" "FPSCR for invalid operation"
+
+gdb_continue_to_breakpoint "go to division by zero"
+
+# Step over division by zero.
+gdb_send_cmd "next"
+
+# Verify that the following bits are set (See Power ISA for details):
+#
+# 32 - Floating-Point Exception Summary (FX)
+# 37 - Floating-Point Zero Divide Exception (ZX)
+# 49 - Floating-Point Greater Than or Positive (FG or >)
+# 51 - Floating-Point Unordered or NaN (FU or ?)
+gdb_test "print/t \$fpscr" " = 10000100000000000101000000000000\r" "FPSCR for division by zero"
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 3761d7a..268feab 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -1922,6 +1922,30 @@ proc send_gdb { string } {
     return [remote_send host "$string"];
 }
 
+# gdb_send_cmd COMMAND
+#
+# Sends a command to GDB and waits for the prompt to come back.
+# It doesn't register a PASS if it succeeds, but it will register
+# a FAIL if waiting for the prompt times out.
+#
+# COMMAND: is the GDB command to be run.
+#
+# Returns whatever gdb_test_multiple returns, which is:
+#    1 if the test failed, according to a built-in failure pattern
+#    0 if only user-supplied patterns matched
+#   -1 if there was an internal error.
+#
+proc gdb_send_cmd { command } {
+  global gdb_prompt
+
+  return [gdb_test_multiple "$command" "" {
+    -re "\[\r\n]+$gdb_prompt $" {}
+    timeout { 
+	fail "$command (timeout)"
+    }
+  }]
+}
+
 #
 #
 



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]