public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Add vector ABI tests to gnu_vector.exp
@ 2015-05-13 15:33 Andreas Arnez
  2015-06-12 15:48 ` Ulrich Weigand
  0 siblings, 1 reply; 4+ messages in thread
From: Andreas Arnez @ 2015-05-13 15:33 UTC (permalink / raw)
  To: gdb-patches; +Cc: Sergio Durigan Junior

So far the gnu_vector test was limited to "static" aspects of GDB's
vector support, like evaluating vector-valued expressions.  This patch
enriches the test and adds checks for GDB's vector ABI support as well.
The new checks particularly verify inferior function calls with vector
arguments and GDB's handling of vector return values.

The test now attempts to compile for the target's "native" architecture,
such that a hardware vector ABI is used if available.

Since GDB has no vector ABI support for x86 and x86_64 targets, most of
the new checks are XFAILed there.

gdb/testsuite/ChangeLog:

	* gdb.base/gnu_vector.c: Include stdarg.h and stdio.h.
	(VECTOR): New macro.  Use it...
	(int4, uint4, char4, float4, int2, longlong2, float2, double2):
	...for these typedefs.
	(int8, char1, int1, double1): New typedefs.
	(struct just_int2, struct two_int2): New structures.
	(add_some_intvecs, add_many_charvecs, add_various_floatvecs,
	(add_structvecs, add_singlevecs): New functions.
	(main): Call add_some_intvecs twice.
	* gdb.base/gnu_vector.exp: Drop GCC version check; just attempt
	the compile and exit upon failure.  Try compiling for the "native"
	architecture.  Test inferior function calls with vector arguments
	and vector return value handling with "finish" and "return".
---
 gdb/testsuite/gdb.base/gnu_vector.c   |  105 +++++++++++++++++++++++++++++----
 gdb/testsuite/gdb.base/gnu_vector.exp |   52 ++++++++++++----
 2 files changed, 136 insertions(+), 21 deletions(-)

diff --git a/gdb/testsuite/gdb.base/gnu_vector.c b/gdb/testsuite/gdb.base/gnu_vector.c
index 4ad07dd..4e505d1 100644
--- a/gdb/testsuite/gdb.base/gnu_vector.c
+++ b/gdb/testsuite/gdb.base/gnu_vector.c
@@ -17,15 +17,27 @@
 
    Contributed by Ken Werner <ken.werner@de.ibm.com>  */
 
-typedef int __attribute__ ((vector_size (4 * sizeof(int)))) int4;
-typedef unsigned int __attribute__ ((vector_size (4 * sizeof(unsigned int)))) uint4;
-typedef char __attribute__ ((vector_size (4 * sizeof(char)))) char4;
-typedef float __attribute__ ((vector_size (4 * sizeof(float)))) float4;
+#include <stdarg.h>
+#include <stdio.h>
 
-typedef int __attribute__ ((vector_size (2 * sizeof(int)))) int2;
-typedef long long __attribute__ ((vector_size (2 * sizeof(long long)))) longlong2;
-typedef float __attribute__ ((vector_size (2 * sizeof(float)))) float2;
-typedef double __attribute__ ((vector_size (2 * sizeof(double)))) double2;
+#define VECTOR(n, type)					\
+  type __attribute__ ((vector_size (n * sizeof(type))))
+
+typedef VECTOR (8, int) int8;
+
+typedef VECTOR (4, int) int4;
+typedef VECTOR (4, unsigned int) uint4;
+typedef VECTOR (4, char) char4;
+typedef VECTOR (4, float) float4;
+
+typedef VECTOR (2, int) int2;
+typedef VECTOR (2, long long) longlong2;
+typedef VECTOR (2, float) float2;
+typedef VECTOR (2, double) double2;
+
+typedef VECTOR (1, char) char1;
+typedef VECTOR (1, int) int1;
+typedef VECTOR (1, double) double1;
 
 int ia = 2;
 int ib = 1;
@@ -46,18 +58,91 @@ double2 d2 = {1, 2};
 union
 {
   int i;
-  char cv __attribute__ ((vector_size (sizeof (int))));
+  VECTOR (sizeof(int), char) cv;
 } union_with_vector_1;
 
 struct
 {
   int i;
-  char cv __attribute__ ((vector_size (sizeof (int))));
+  VECTOR (sizeof(int), char) cv;
   float4 f4;
 } struct_with_vector_1;
 
+struct just_int2
+{
+  int2 i;
+};
+
+struct two_int2
+{
+  int2 i, j;
+};
+
+
+/* Simple vector-valued function with a few 16-byte vector
+   arguments.  */
+
+int4
+add_some_intvecs (int4 a, int4 b, int4 c)
+{
+  return a + b + c;
+}
+
+/* Many small vector arguments, 4 bytes each.  */
+
+char4
+add_many_charvecs (char4 a, char4 b, char4 c, char4 d, char4 e,
+		   char4 f, char4 g, char4 h, char4 i, char4 j)
+{
+  return (a + b + c + d + e + f + g + h + i + j);
+}
+
+/* Varargs: One fixed and N-1 variable vector arguments.  */
+
+float4
+add_various_floatvecs (int n, float4 a, ...)
+{
+  int i;
+  va_list argp;
+
+  va_start (argp, a);
+  for (i = 1; i < n; i++)
+    a += va_arg (argp, float4);
+  va_end (argp);
+
+  return a;
+}
+
+/* Struct-wrapped vectors (might be passed as if not wrapped).  */
+
+struct just_int2
+add_structvecs (int2 a, struct just_int2 b, struct two_int2 c)
+{
+  struct just_int2 res;
+
+  res.i = a + b.i + c.i + c.j;
+  return res;
+}
+
+/* Single-element vectors (might be treated like scalars).  */
+
+double1
+add_singlevecs (char1 a, int1 b, double1 c)
+{
+  return (double1) {a[0] + b[0] + c[0]};
+}
+
+
 int
 main ()
 {
+  int4 res;
+
+  res = add_some_intvecs (i4a, i4a + i4b, i4b);
+  printf ("%d %d %d %d\n", res[0], res[1], res[2], res[3]);
+
+  res = add_some_intvecs (i4a, i4a + i4b, i4b);
+  printf ("%d %d %d %d\n", res[0], res[1], res[2], res[3]);
+
   return 0;
 }
diff --git a/gdb/testsuite/gdb.base/gnu_vector.exp b/gdb/testsuite/gdb.base/gnu_vector.exp
index 352fec0..9fe3a27 100644
--- a/gdb/testsuite/gdb.base/gnu_vector.exp
+++ b/gdb/testsuite/gdb.base/gnu_vector.exp
@@ -20,20 +20,19 @@
 
 standard_testfile .c
 
-if [get_compiler_info] {
+# If supported by the compiler, "-mcpu=native" or "-march=native"
+# should enable the highest available vector ABI.  Try both, then try
+# without a CPU option.  If all variants fail, assume that the
+# compiler can not handle GNU vectors.
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable {debug quiet additional_flags=-mcpu=native}] != ""
+     && [gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable {debug quiet additional_flags=-march=native}] != ""
+     && [gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable {debug quiet}] != ""} {
+    untested "compiler can't handle the vector_size attribute?"
     return -1
 }
 
-# Check if our compiler is a GCC that suppports the vector extension
-if { ![test_compiler_info gcc-4-*] } {
-    setup_xfail "*-*-*"
-    fail "This compiler can not handle GNU vectors"
-    return 0
-}
-
-if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug}] } {
-    return -1
-}
+clean_restart ${binfile}
 
 if { ![runto main] } {
     fail "runto main"
@@ -175,3 +174,34 @@ gdb_test "ptype float4" "type = float __attribute__ \\(\\(vector_size\\(4\\)\\)\
 
 gdb_test "ptype union_with_vector_1" "type = union {\r\n\[\t \]+int i;\r\n\[\t \]+char cv __attribute__ \\(\\(vector_size\\(4\\)\\)\\);\r\n}"
 gdb_test "ptype struct_with_vector_1" "type = struct {\r\n\[\t \]+int i;\r\n\[\t \]+char cv __attribute__ \\(\\(vector_size\\(4\\)\\)\\);\r\n\[\t \]+float4 f4;\r\n}"
+
+# Test inferior function calls with vector arguments and/or vector
+# return values.
+setup_xfail "i?86-*-*" "x86_64-*-*"
+gdb_test "print add_some_intvecs(i4a, i4b, 3 * i4a)" "= \\{17, 34, 72, 132\\}" \
+    "call add_some_intvecs"
+setup_xfail "i?86-*-*" "x86_64-*-*"
+gdb_test "print add_many_charvecs(c4, c4, c4, c4, c4, c4, c4, c4, c4, c4)" \
+    "= \\{10, 20, 30, 40\\}" "call add_many_charvecs"
+setup_xfail "i?86-*-*" "x86_64-*-*"
+gdb_test "print add_various_floatvecs(2, f4a, f4b)" "= \\{3, 6, 16, 20\\}" \
+    "call add_various_floatvecs"
+setup_xfail "i?86-*-*" "x86_64-*-*"
+gdb_test "print add_structvecs(i2, (struct just_int2)\{2*i2\}, (struct two_int2)\{3*i2, 4*i2\})" \
+    "= \\{i = \\{10, 20\\}\\}" "call add_structvecs"
+gdb_test "print add_singlevecs((char1) \{6\}, (int1) \{12\}, (double1) \{24\})" "= \\{42\\}" \
+    "call add_singlevecs"
+
+# Test vector return value handling with "finish" and "return".
+gdb_breakpoint "add_some_intvecs"
+gdb_continue "add_some_intvecs"
+setup_xfail "i?86-*-*" "x86_64-*-*"
+gdb_test "finish" "Value returned is .* = \\{10, 20, 48, 72\\}" \
+    "finish shows vector return value"
+gdb_continue "add_some_intvecs"
+gdb_test "return (int4) \{4, 2, 7, 6\}" \
+    "#0 .* main .*" \
+    "set vector return value" \
+    "Make add_some_intvecs return now. .y or n.*" "y"
+setup_xfail "i?86-*-*" "x86_64-*-*"
+gdb_test "continue" "4 2 7 6\r\n.*" "verify vector return value"
-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add vector ABI tests to gnu_vector.exp
  2015-05-13 15:33 [PATCH] Add vector ABI tests to gnu_vector.exp Andreas Arnez
@ 2015-06-12 15:48 ` Ulrich Weigand
  2015-06-15 16:05   ` Andreas Arnez
  0 siblings, 1 reply; 4+ messages in thread
From: Ulrich Weigand @ 2015-06-12 15:48 UTC (permalink / raw)
  To: Andreas Arnez; +Cc: gdb-patches, Sergio Durigan Junior

Andreas Arnez wrote:

> So far the gnu_vector test was limited to "static" aspects of GDB's
> vector support, like evaluating vector-valued expressions.  This patch
> enriches the test and adds checks for GDB's vector ABI support as well.
> The new checks particularly verify inferior function calls with vector
> arguments and GDB's handling of vector return values.
> 
> The test now attempts to compile for the target's "native" architecture,
> such that a hardware vector ABI is used if available.

This is certainly a good idea.  (In fact, the tests uncovered a bug in
the ABI implementation on PowerPC.  I've just committed a fix for that.)

> Since GDB has no vector ABI support for x86 and x86_64 targets, most of
> the new checks are XFAILed there.

As this due to a known GDB problem and not something in the environment,
that should be a KFAIL, not an XFAIL.

> gdb/testsuite/ChangeLog:
> 
> 	* gdb.base/gnu_vector.c: Include stdarg.h and stdio.h.
> 	(VECTOR): New macro.  Use it...
> 	(int4, uint4, char4, float4, int2, longlong2, float2, double2):
> 	...for these typedefs.
> 	(int8, char1, int1, double1): New typedefs.
> 	(struct just_int2, struct two_int2): New structures.
> 	(add_some_intvecs, add_many_charvecs, add_various_floatvecs,
> 	(add_structvecs, add_singlevecs): New functions.
> 	(main): Call add_some_intvecs twice.
> 	* gdb.base/gnu_vector.exp: Drop GCC version check; just attempt
> 	the compile and exit upon failure.  Try compiling for the "native"
> 	architecture.  Test inferior function calls with vector arguments
> 	and vector return value handling with "finish" and "return".

Otherwise, this looks good.

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add vector ABI tests to gnu_vector.exp
  2015-06-12 15:48 ` Ulrich Weigand
@ 2015-06-15 16:05   ` Andreas Arnez
  2015-06-16 11:41     ` Ulrich Weigand
  0 siblings, 1 reply; 4+ messages in thread
From: Andreas Arnez @ 2015-06-15 16:05 UTC (permalink / raw)
  To: Ulrich Weigand; +Cc: gdb-patches, Sergio Durigan Junior

On Fri, Jun 12 2015, Ulrich Weigand wrote:

> Andreas Arnez wrote:
>
>> [...]
>> Since GDB has no vector ABI support for x86 and x86_64 targets, most of
>> the new checks are XFAILed there.
>
> As this due to a known GDB problem and not something in the environment,
> that should be a KFAIL, not an XFAIL.

OK, I've opened a bug:

    https://sourceware.org/bugzilla/show_bug.cgi?id=18537

and changed the XFAILs to KFAILs pointing to that bug, as shown by the
patch below.

--
diff --git a/gdb/testsuite/gdb.base/gnu_vector.exp b/gdb/testsuite/gdb.base/gnu_vector.exp
index 9fe3a27..cf91fbb 100644
--- a/gdb/testsuite/gdb.base/gnu_vector.exp
+++ b/gdb/testsuite/gdb.base/gnu_vector.exp
@@ -180 +180 @@ gdb_test "ptype struct_with_vector_1" "type = struct {\r\n\[\t \]+int i;\r\n\[\t
-setup_xfail "i?86-*-*" "x86_64-*-*"
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
@@ -183 +183 @@ gdb_test "print add_some_intvecs(i4a, i4b, 3 * i4a)" "= \\{17, 34, 72, 132\\}" \
-setup_xfail "i?86-*-*" "x86_64-*-*"
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
@@ -186 +186 @@ gdb_test "print add_many_charvecs(c4, c4, c4, c4, c4, c4, c4, c4, c4, c4)" \
-setup_xfail "i?86-*-*" "x86_64-*-*"
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
@@ -189 +189 @@ gdb_test "print add_various_floatvecs(2, f4a, f4b)" "= \\{3, 6, 16, 20\\}" \
-setup_xfail "i?86-*-*" "x86_64-*-*"
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
@@ -198 +198 @@ gdb_continue "add_some_intvecs"
-setup_xfail "i?86-*-*" "x86_64-*-*"
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
@@ -206 +206 @@ gdb_test "return (int4) \{4, 2, 7, 6\}" \
-setup_xfail "i?86-*-*" "x86_64-*-*"
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add vector ABI tests to gnu_vector.exp
  2015-06-15 16:05   ` Andreas Arnez
@ 2015-06-16 11:41     ` Ulrich Weigand
  0 siblings, 0 replies; 4+ messages in thread
From: Ulrich Weigand @ 2015-06-16 11:41 UTC (permalink / raw)
  To: Andreas Arnez; +Cc: gdb-patches, Sergio Durigan Junior

Andreas Arnez wrote:
> On Fri, Jun 12 2015, Ulrich Weigand wrote:
> 
> > Andreas Arnez wrote:
> >
> >> [...]
> >> Since GDB has no vector ABI support for x86 and x86_64 targets, most of
> >> the new checks are XFAILed there.
> >
> > As this due to a known GDB problem and not something in the environment,
> > that should be a KFAIL, not an XFAIL.
> 
> OK, I've opened a bug:
> 
>     https://sourceware.org/bugzilla/show_bug.cgi?id=18537
> 
> and changed the XFAILs to KFAILs pointing to that bug, as shown by the
> patch below.

Yes, that's what I meant, thanks.

The patch is OK with that change.

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-06-16 11:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-13 15:33 [PATCH] Add vector ABI tests to gnu_vector.exp Andreas Arnez
2015-06-12 15:48 ` Ulrich Weigand
2015-06-15 16:05   ` Andreas Arnez
2015-06-16 11:41     ` Ulrich Weigand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).