Blame SOURCES/gdb-rhbz1182151-ibm-z13-18of22.patch

0b42f8
commit e6c693af14c0488998a784d560b8cfbcf15db99a
0b42f8
Author: Andreas Arnez <arnez@linux.vnet.ibm.com>
0b42f8
Date:   Wed Jun 17 11:17:07 2015 +0200
0b42f8
0b42f8
    Add vector ABI tests to gnu_vector.exp
0b42f8
    
0b42f8
    So far the gnu_vector test was limited to "static" aspects of GDB's
0b42f8
    vector support, like evaluating vector-valued expressions.  This patch
0b42f8
    enriches the test and adds checks for GDB's vector ABI support as well.
0b42f8
    The new checks particularly verify inferior function calls with vector
0b42f8
    arguments and GDB's handling of vector return values.
0b42f8
    
0b42f8
    The test now attempts to compile for the target's "native" architecture,
0b42f8
    such that a hardware vector ABI is used if available.
0b42f8
    
0b42f8
    Since GDB has no vector ABI support for x86 and x86_64 targets, most of
0b42f8
    the new checks are KFAILed there.
0b42f8
    
0b42f8
    gdb/testsuite/ChangeLog:
0b42f8
    
0b42f8
    	* gdb.base/gnu_vector.c: Include stdarg.h and stdio.h.
0b42f8
    	(VECTOR): New macro.  Use it...
0b42f8
    	(int4, uint4, char4, float4, int2, longlong2, float2, double2):
0b42f8
    	...for these typedefs.
0b42f8
    	(int8, char1, int1, double1): New typedefs.
0b42f8
    	(struct just_int2, struct two_int2): New structures.
0b42f8
    	(add_some_intvecs, add_many_charvecs, add_various_floatvecs)
0b42f8
    	(add_structvecs, add_singlevecs): New functions.
0b42f8
    	(main): Call add_some_intvecs twice.
0b42f8
    	* gdb.base/gnu_vector.exp: Drop GCC version check; just attempt
0b42f8
    	the compile and exit upon failure.  Try compiling for the "native"
0b42f8
    	architecture.  Test inferior function calls with vector arguments
0b42f8
    	and vector return value handling with "finish" and "return".
0b42f8
0b42f8
### a/gdb/testsuite/ChangeLog
0b42f8
### b/gdb/testsuite/ChangeLog
0b42f8
## -1,3 +1,19 @@
0b42f8
+2015-06-17  Andreas Arnez  <arnez@linux.vnet.ibm.com>
0b42f8
+
0b42f8
+	* gdb.base/gnu_vector.c: Include stdarg.h and stdio.h.
0b42f8
+	(VECTOR): New macro.  Use it...
0b42f8
+	(int4, uint4, char4, float4, int2, longlong2, float2, double2):
0b42f8
+	...for these typedefs.
0b42f8
+	(int8, char1, int1, double1): New typedefs.
0b42f8
+	(struct just_int2, struct two_int2): New structures.
0b42f8
+	(add_some_intvecs, add_many_charvecs, add_various_floatvecs)
0b42f8
+	(add_structvecs, add_singlevecs): New functions.
0b42f8
+	(main): Call add_some_intvecs twice.
0b42f8
+	* gdb.base/gnu_vector.exp: Drop GCC version check; just attempt
0b42f8
+	the compile and exit upon failure.  Try compiling for the "native"
0b42f8
+	architecture.  Test inferior function calls with vector arguments
0b42f8
+	and vector return value handling with "finish" and "return".
0b42f8
+
0b42f8
 2015-06-10  Jon Turney  <jon.turney@dronecode.org.uk>
0b42f8
 
0b42f8
 	* gdb.base/sepdebug.exp: Add EXEEXT where needed.
0b42f8
Index: gdb-7.6.1/gdb/testsuite/gdb.base/gnu_vector.c
0b42f8
===================================================================
0b42f8
--- gdb-7.6.1.orig/gdb/testsuite/gdb.base/gnu_vector.c	2016-02-24 17:31:37.147569951 +0100
0b42f8
+++ gdb-7.6.1/gdb/testsuite/gdb.base/gnu_vector.c	2016-02-24 17:31:46.248638945 +0100
0b42f8
@@ -17,15 +17,27 @@
0b42f8
 
0b42f8
    Contributed by Ken Werner <ken.werner@de.ibm.com>  */
0b42f8
 
0b42f8
-typedef int __attribute__ ((vector_size (4 * sizeof(int)))) int4;
0b42f8
-typedef unsigned int __attribute__ ((vector_size (4 * sizeof(unsigned int)))) uint4;
0b42f8
-typedef char __attribute__ ((vector_size (4 * sizeof(char)))) char4;
0b42f8
-typedef float __attribute__ ((vector_size (4 * sizeof(float)))) float4;
0b42f8
-
0b42f8
-typedef int __attribute__ ((vector_size (2 * sizeof(int)))) int2;
0b42f8
-typedef long long __attribute__ ((vector_size (2 * sizeof(long long)))) longlong2;
0b42f8
-typedef float __attribute__ ((vector_size (2 * sizeof(float)))) float2;
0b42f8
-typedef double __attribute__ ((vector_size (2 * sizeof(double)))) double2;
0b42f8
+#include <stdarg.h>
0b42f8
+#include <stdio.h>
0b42f8
+
0b42f8
+#define VECTOR(n, type)					\
0b42f8
+  type __attribute__ ((vector_size (n * sizeof(type))))
0b42f8
+
0b42f8
+typedef VECTOR (8, int) int8;
0b42f8
+
0b42f8
+typedef VECTOR (4, int) int4;
0b42f8
+typedef VECTOR (4, unsigned int) uint4;
0b42f8
+typedef VECTOR (4, char) char4;
0b42f8
+typedef VECTOR (4, float) float4;
0b42f8
+
0b42f8
+typedef VECTOR (2, int) int2;
0b42f8
+typedef VECTOR (2, long long) longlong2;
0b42f8
+typedef VECTOR (2, float) float2;
0b42f8
+typedef VECTOR (2, double) double2;
0b42f8
+
0b42f8
+typedef VECTOR (1, char) char1;
0b42f8
+typedef VECTOR (1, int) int1;
0b42f8
+typedef VECTOR (1, double) double1;
0b42f8
 
0b42f8
 int ia = 2;
0b42f8
 int ib = 1;
0b42f8
@@ -46,18 +58,91 @@
0b42f8
 union
0b42f8
 {
0b42f8
   int i;
0b42f8
-  char cv __attribute__ ((vector_size (sizeof (int))));
0b42f8
+  VECTOR (sizeof(int), char) cv;
0b42f8
 } union_with_vector_1;
0b42f8
 
0b42f8
 struct
0b42f8
 {
0b42f8
   int i;
0b42f8
-  char cv __attribute__ ((vector_size (sizeof (int))));
0b42f8
+  VECTOR (sizeof(int), char) cv;
0b42f8
   float4 f4;
0b42f8
 } struct_with_vector_1;
0b42f8
 
0b42f8
+struct just_int2
0b42f8
+{
0b42f8
+  int2 i;
0b42f8
+};
0b42f8
+
0b42f8
+struct two_int2
0b42f8
+{
0b42f8
+  int2 i, j;
0b42f8
+};
0b42f8
+
0b42f8
+
0b42f8
+/* Simple vector-valued function with a few 16-byte vector
0b42f8
+   arguments.  */
0b42f8
+
0b42f8
+int4
0b42f8
+add_some_intvecs (int4 a, int4 b, int4 c)
0b42f8
+{
0b42f8
+  return a + b + c;
0b42f8
+}
0b42f8
+
0b42f8
+/* Many small vector arguments, 4 bytes each.  */
0b42f8
+
0b42f8
+char4
0b42f8
+add_many_charvecs (char4 a, char4 b, char4 c, char4 d, char4 e,
0b42f8
+		   char4 f, char4 g, char4 h, char4 i, char4 j)
0b42f8
+{
0b42f8
+  return (a + b + c + d + e + f + g + h + i + j);
0b42f8
+}
0b42f8
+
0b42f8
+/* Varargs: One fixed and N-1 variable vector arguments.  */
0b42f8
+
0b42f8
+float4
0b42f8
+add_various_floatvecs (int n, float4 a, ...)
0b42f8
+{
0b42f8
+  int i;
0b42f8
+  va_list argp;
0b42f8
+
0b42f8
+  va_start (argp, a);
0b42f8
+  for (i = 1; i < n; i++)
0b42f8
+    a += va_arg (argp, float4);
0b42f8
+  va_end (argp);
0b42f8
+
0b42f8
+  return a;
0b42f8
+}
0b42f8
+
0b42f8
+/* Struct-wrapped vectors (might be passed as if not wrapped).  */
0b42f8
+
0b42f8
+struct just_int2
0b42f8
+add_structvecs (int2 a, struct just_int2 b, struct two_int2 c)
0b42f8
+{
0b42f8
+  struct just_int2 res;
0b42f8
+
0b42f8
+  res.i = a + b.i + c.i + c.j;
0b42f8
+  return res;
0b42f8
+}
0b42f8
+
0b42f8
+/* Single-element vectors (might be treated like scalars).  */
0b42f8
+
0b42f8
+double1
0b42f8
+add_singlevecs (char1 a, int1 b, double1 c)
0b42f8
+{
0b42f8
+  return (double1) {a[0] + b[0] + c[0]};
0b42f8
+}
0b42f8
+
0b42f8
+
0b42f8
 int
0b42f8
 main ()
0b42f8
 {
0b42f8
+  int4 res;
0b42f8
+
0b42f8
+  res = add_some_intvecs (i4a, i4a + i4b, i4b);
0b42f8
+  printf ("%d %d %d %d\n", res[0], res[1], res[2], res[3]);
0b42f8
+
0b42f8
+  res = add_some_intvecs (i4a, i4a + i4b, i4b);
0b42f8
+  printf ("%d %d %d %d\n", res[0], res[1], res[2], res[3]);
0b42f8
+
0b42f8
   return 0;
0b42f8
 }
0b42f8
Index: gdb-7.6.1/gdb/testsuite/gdb.base/gnu_vector.exp
0b42f8
===================================================================
0b42f8
--- gdb-7.6.1.orig/gdb/testsuite/gdb.base/gnu_vector.exp	2016-02-24 17:31:37.147569951 +0100
0b42f8
+++ gdb-7.6.1/gdb/testsuite/gdb.base/gnu_vector.exp	2016-02-24 17:31:46.248638945 +0100
0b42f8
@@ -22,20 +22,19 @@
0b42f8
 set srcfile ${testfile}.c
0b42f8
 set binfile ${objdir}/${subdir}/${testfile}
0b42f8
 
0b42f8
-if [get_compiler_info] {
0b42f8
+# If supported by the compiler, "-mcpu=native" or "-march=native"
0b42f8
+# should enable the highest available vector ABI.  Try both, then try
0b42f8
+# without a CPU option.  If all variants fail, assume that the
0b42f8
+# compiler can not handle GNU vectors.
0b42f8
+
0b42f8
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable {debug quiet additional_flags=-mcpu=native}] != ""
0b42f8
+     && [gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable {debug quiet additional_flags=-march=native}] != ""
0b42f8
+     && [gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable {debug quiet}] != ""} {
0b42f8
+    untested "compiler can't handle the vector_size attribute?"
0b42f8
     return -1
0b42f8
 }
0b42f8
 
0b42f8
-# Check if our compiler is a GCC that suppports the vector extension
0b42f8
-if { ![test_compiler_info gcc-4-*] } {
0b42f8
-    setup_xfail "*-*-*"
0b42f8
-    fail "This compiler can not handle GNU vectors"
0b42f8
-    return 0
0b42f8
-}
0b42f8
-
0b42f8
-if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug}] } {
0b42f8
-    return -1
0b42f8
-}
0b42f8
+clean_restart ${binfile}
0b42f8
 
0b42f8
 if { ![runto main] } {
0b42f8
     fail "runto main"
0b42f8
@@ -177,3 +176,34 @@
0b42f8
 
0b42f8
 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}"
0b42f8
 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}"
0b42f8
+
0b42f8
+# Test inferior function calls with vector arguments and/or vector
0b42f8
+# return values.
0b42f8
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
0b42f8
+gdb_test "print add_some_intvecs(i4a, i4b, 3 * i4a)" "= \\{17, 34, 72, 132\\}" \
0b42f8
+    "call add_some_intvecs"
0b42f8
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
0b42f8
+gdb_test "print add_many_charvecs(c4, c4, c4, c4, c4, c4, c4, c4, c4, c4)" \
0b42f8
+    "= \\{10, 20, 30, 40\\}" "call add_many_charvecs"
0b42f8
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
0b42f8
+gdb_test "print add_various_floatvecs(2, f4a, f4b)" "= \\{3, 6, 16, 20\\}" \
0b42f8
+    "call add_various_floatvecs"
0b42f8
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
0b42f8
+gdb_test "print add_structvecs(i2, (struct just_int2)\{2*i2\}, (struct two_int2)\{3*i2, 4*i2\})" \
0b42f8
+    "= \\{i = \\{10, 20\\}\\}" "call add_structvecs"
0b42f8
+gdb_test "print add_singlevecs((char1) \{6\}, (int1) \{12\}, (double1) \{24\})" "= \\{42\\}" \
0b42f8
+    "call add_singlevecs"
0b42f8
+
0b42f8
+# Test vector return value handling with "finish" and "return".
0b42f8
+gdb_breakpoint "add_some_intvecs"
0b42f8
+gdb_continue "add_some_intvecs"
0b42f8
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
0b42f8
+gdb_test "finish" "Value returned is .* = \\{10, 20, 48, 72\\}" \
0b42f8
+    "finish shows vector return value"
0b42f8
+gdb_continue "add_some_intvecs"
0b42f8
+gdb_test "return (int4) \{4, 2, 7, 6\}" \
0b42f8
+    "#0 .* main .*" \
0b42f8
+    "set vector return value" \
0b42f8
+    "Make add_some_intvecs return now. .y or n.*" "y"
0b42f8
+setup_kfail gdb/18537 "i?86-*-*" "x86_64-*-*"
0b42f8
+gdb_test "continue" "4 2 7 6\r\n.*" "verify vector return value"