testsuite: add testsuite for aarch64 floating point

Message ID 1412770717-18290-1-git-send-email-catalin.udma@freescale.com
State New, archived
Headers

Commit Message

Catalin Udma Oct. 8, 2014, 12:18 p.m. UTC
  Bug 17457: validate correct floating point registers index
and fpsr/fpcr registers

gdb/testsuite/
2014-10-08  Catalin Udma  <catalin.udma@freescale.com>

        * gdb.arch/aarch64-fp.c: New file.
        * gdb.arch/aarch64-fp.exp: New file.

Signed-off-by: Catalin Udma <catalin.udma@freescale.com>
---
 gdb/testsuite/gdb.arch/aarch64-fp.c   |   39 ++++++++++++++
 gdb/testsuite/gdb.arch/aarch64-fp.exp |   89 +++++++++++++++++++++++++++++++++
 2 files changed, 128 insertions(+), 0 deletions(-)
 create mode 100644 gdb/testsuite/gdb.arch/aarch64-fp.c
 create mode 100644 gdb/testsuite/gdb.arch/aarch64-fp.exp
  

Comments

Pedro Alves Oct. 8, 2014, 2:37 p.m. UTC | #1
> [PATCH] testsuite: add testsuite for aarch64 floating point

s/add testsuite/add test/


> Bug 17457: validate correct floating point registers index
> and fpsr/fpcr registers
> 
> gdb/testsuite/
> 2014-10-08  Catalin Udma  <catalin.udma@freescale.com>
> 
>         * gdb.arch/aarch64-fp.c: New file.
>         * gdb.arch/aarch64-fp.exp: New file.

Please add the PR number to the ChangeLog entry, like:

gdb/testsuite/
2014-10-08  Catalin Udma  <catalin.udma@freescale.com>

	PR server/17457
	* gdb.arch/aarch64-fp.c: New file.
	* gdb.arch/aarch64-fp.exp: New file.

Once this is final, please merge it with the patch that fixes the
bug, and push them as a single commit.  (Remember to put the PR
line in the ChangeLog entry of the other patch as well.)

> diff --git a/gdb/testsuite/gdb.arch/aarch64-fp.c b/gdb/testsuite/gdb.arch/aarch64-fp.c
> new file mode 100644
> index 0000000..d217784
> --- /dev/null
> +++ b/gdb/testsuite/gdb.arch/aarch64-fp.c
> @@ -0,0 +1,39 @@
> +/* This file is part of GDB, the GNU debugger.
> +
> +   Copyright 2008-2014 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/>.  */
> +
> +#include <stdio.h>

This seems unnecessary.

> +
> +int main (void)

We try to follow formatting conventions in the tests too, so:

int
main (void)

> +{


> +
> +send_gdb "show endian\n"
> +gdb_expect {
> +    -re "(.* )(big|little)( endian.*)$gdb_prompt $" {
> +        pass "endianness"
> +        set endianness $expect_out(2,string)
> +    }
> +    -re ".*$gdb_prompt $" {
> +        fail "couldn't get endianness"
> +    }
> +    timeout { fail "(timeout) endianness" }
> +}

Please use gdb_test and gdb_test_multiple unless really
necessary.  Write:

set endianness "little"
set test "show endian"
gdb_test_multiple $test $test {
    -re "(.* )(big|little)( endian.*)$gdb_prompt $" {
        set endianness $expect_out(2,string)
        pass "endianness"
    }
}

Defaulting endianness also makes sure that if GDB fails
that test for some reason, we won't get tcl errors due to
using unset variables.  Usually, we'll do

set endianness ""
gdb_test_multiple $test $test {
...
}
if { $endianness=="" } {
   return -1
}

but defaulting here seems a little better to at least
try a few more tests.

> +
> +
> +gdb_test "break ${srcfile}:37" \
> +    "Breakpoint $decimal at 0x\[0-9a-fA-F\]+: file .*${srcfile}, line 37\\\." \
> +    "Set the breakpoint after setting the fp registers"

Use gdb_get_line_number instead of hard coding line numbers.

Also, please use lowercase in the test messages.  "set" ...

> +
> +gdb_test "continue" \
> +    "Continuing.*Breakpoint $decimal.*" \
> +    "Continue until breakpoint"

... "continue", etc., throughout.

> +
> +if {$endianness == "little"} {
> +    set reg_value0 "0x1f1e1d1c1b1a19181716151413121110"
> +    set reg_value1 "0x2f2e2d2c2b2a29282726252423222120"
> +} else {
> +    set reg_value0 "0x101112131415161718191a1b1c1d1e1f"
> +    set reg_value1 "0x202122232425262728292a2b2c2d2e2f"
> +}
> +
> +gdb_test "info registers q0" \
> +    "q0.*{u = $reg_value0, s = $reg_value0.*" \
> +    "Check register q0 value"
> +
> +gdb_test "info registers q1" \
> +    "q1.*{u = $reg_value1, s = $reg_value1.*" \
> +    "Check register q1 value"
> +
> +gdb_test "info registers v0" \
> +    "v0.*$reg_value0}}}" \
> +    "Check register v0 value"
> +
> +gdb_test "info registers v1" \
> +    "v1.*$reg_value1}}}" \
> +    "Check register v1 value"
> +
> +gdb_test "info registers fpsr" \
> +    "fpsr.*0x\[0-9a-fA-F\].*" \
> +    "Check register fpsr value"
> +
> +gdb_test "info registers fpcr" \
> +    "fpcr.*0x\[0-9a-fA-F\].*" \
> +    "Check register fpcr value"
> +

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/testsuite/gdb.arch/aarch64-fp.c b/gdb/testsuite/gdb.arch/aarch64-fp.c
new file mode 100644
index 0000000..d217784
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/aarch64-fp.c
@@ -0,0 +1,39 @@ 
+/* This file is part of GDB, the GNU debugger.
+
+   Copyright 2008-2014 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/>.  */
+
+#include <stdio.h>
+
+int main (void)
+{
+  char buf0[] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+                 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};
+  char buf1[] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+                 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f};
+  long val;
+  void *addr;
+    
+  addr = &buf0[0];
+  __asm __volatile ("ldr %x0, [%1]" : "=r" (val) : "r" (&addr));
+  __asm __volatile ("ldr q0, [x0]");
+   
+  addr = &buf1[0];
+  __asm __volatile ("ldr %x0, [%1]" : "=r" (val) : "r" (&addr));
+  __asm __volatile ("ldr q1, [x0]");
+  
+  return 1;
+}
+
diff --git a/gdb/testsuite/gdb.arch/aarch64-fp.exp b/gdb/testsuite/gdb.arch/aarch64-fp.exp
new file mode 100644
index 0000000..7bd2804
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/aarch64-fp.exp
@@ -0,0 +1,89 @@ 
+# Copyright 2008-2014 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# This file is part of the gdb testsuite.
+
+# Bug 17457
+# Test aarch64 floating point registers q0, q1, v0, v1, fpsr, fpcr
+
+if {![istarget "aarch64*"]} {
+    verbose "Skipping ${gdb_test_file_name}."
+    return
+}
+
+standard_testfile
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+    return -1
+}
+
+if ![runto_main] {
+    untested "could not run to main"
+    return -1
+}
+
+send_gdb "show endian\n"
+gdb_expect {
+    -re "(.* )(big|little)( endian.*)$gdb_prompt $" {
+        pass "endianness"
+        set endianness $expect_out(2,string)
+    }
+    -re ".*$gdb_prompt $" {
+        fail "couldn't get endianness"
+    }
+    timeout { fail "(timeout) endianness" }
+}
+
+
+gdb_test "break ${srcfile}:37" \
+    "Breakpoint $decimal at 0x\[0-9a-fA-F\]+: file .*${srcfile}, line 37\\\." \
+    "Set the breakpoint after setting the fp registers"
+
+gdb_test "continue" \
+    "Continuing.*Breakpoint $decimal.*" \
+    "Continue until breakpoint"
+
+if {$endianness == "little"} {
+    set reg_value0 "0x1f1e1d1c1b1a19181716151413121110"
+    set reg_value1 "0x2f2e2d2c2b2a29282726252423222120"
+} else {
+    set reg_value0 "0x101112131415161718191a1b1c1d1e1f"
+    set reg_value1 "0x202122232425262728292a2b2c2d2e2f"
+}
+
+gdb_test "info registers q0" \
+    "q0.*{u = $reg_value0, s = $reg_value0.*" \
+    "Check register q0 value"
+
+gdb_test "info registers q1" \
+    "q1.*{u = $reg_value1, s = $reg_value1.*" \
+    "Check register q1 value"
+
+gdb_test "info registers v0" \
+    "v0.*$reg_value0}}}" \
+    "Check register v0 value"
+
+gdb_test "info registers v1" \
+    "v1.*$reg_value1}}}" \
+    "Check register v1 value"
+
+gdb_test "info registers fpsr" \
+    "fpsr.*0x\[0-9a-fA-F\].*" \
+    "Check register fpsr value"
+
+gdb_test "info registers fpcr" \
+    "fpcr.*0x\[0-9a-fA-F\].*" \
+    "Check register fpcr value"
+