aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.opencl
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2011-02-08 13:30:10 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2011-02-08 13:30:10 +0000
commit54fcddd0ace6123d9dadc3040c39acd1b42ffd09 (patch)
tree52b8f2892f032070d495dd00b396659f1a88edb8 /gdb/testsuite/gdb.opencl
parentd6dafb7c8efcd4625de119bffece9907e5b69a8e (diff)
downloadbinutils-54fcddd0ace6123d9dadc3040c39acd1b42ffd09.zip
binutils-54fcddd0ace6123d9dadc3040c39acd1b42ffd09.tar.gz
binutils-54fcddd0ace6123d9dadc3040c39acd1b42ffd09.tar.bz2
include/ChangeLog:
* dwarf2.h (enum dwarf_calling_convention): Add DW_CC_GDB_IBM_OpenCL. gdb/ChangeLog: * dwarf2read.c (read_subroutine_type): Set special calling convention flag for functions compiled by IBM XL C for OpenCL. * ppc-sysv-tdep.c: Include "dwarf2.h" (ppc_sysv_abi_push_dummy_call): Implement IBM OpenCL vector types calling convention. (do_ppc_sysv_return_value): Add FUNC_TYPE argument. Implement IBM OpenCL vector types calling convention. (ppc_sysv_abi_return_value): Pass through FUNC_TYPE. (ppc_sysv_abi_broken_return_value): Likewise. (ppc64_sysv_abi_push_dummy_call): Implement IBM OpenCL vector types calling convention. (ppc64_sysv_abi_return_value): Likewise. * spu-tdep.c: Include "dwarf2.h" (spu_return_value): Implement IBM OpenCL vector types calling convention. gdb/testsuite/ChangeLog: * gdb.opencl/callfuncs.cl: New file. * gdb.opencl/callfuncs.exp: New test. * gdb.opencl/Makefile.in (EXECUTABLES): Add callfuncs.
Diffstat (limited to 'gdb/testsuite/gdb.opencl')
-rw-r--r--gdb/testsuite/gdb.opencl/Makefile.in2
-rw-r--r--gdb/testsuite/gdb.opencl/callfuncs.cl218
-rw-r--r--gdb/testsuite/gdb.opencl/callfuncs.exp102
3 files changed, 321 insertions, 1 deletions
diff --git a/gdb/testsuite/gdb.opencl/Makefile.in b/gdb/testsuite/gdb.opencl/Makefile.in
index c12aef3..7dec34c 100644
--- a/gdb/testsuite/gdb.opencl/Makefile.in
+++ b/gdb/testsuite/gdb.opencl/Makefile.in
@@ -1,7 +1,7 @@
VPATH = @srcdir@
srcdir = @srcdir@
-EXECUTABLES = datatypes vec_comps convs_casts operators
+EXECUTABLES = callfuncs datatypes vec_comps convs_casts operators
all info install-info dvi install uninstall installcheck check:
@echo "Nothing to be done for $@..."
diff --git a/gdb/testsuite/gdb.opencl/callfuncs.cl b/gdb/testsuite/gdb.opencl/callfuncs.cl
new file mode 100644
index 0000000..6d53ee0
--- /dev/null
+++ b/gdb/testsuite/gdb.opencl/callfuncs.cl
@@ -0,0 +1,218 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011 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/>.
+
+ Contributed by Ulrich Weigand <ulrich.weigand.ibm.com> */
+
+__constant int opencl_version = __OPENCL_VERSION__;
+
+#ifdef HAVE_cl_khr_fp64
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+__constant int have_cl_khr_fp64 = 1;
+#else
+__constant int have_cl_khr_fp64 = 0;
+#endif
+
+#ifdef HAVE_cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+__constant int have_cl_khr_fp16 = 1;
+#else
+__constant int have_cl_khr_fp16 = 0;
+#endif
+
+#define def_call_func(type) \
+ type call_##type (type a, type b) { return a + b; }
+
+#ifdef CL_VERSION_1_1
+#define def_call_family(type) \
+ def_call_func(type) \
+ def_call_func(type##2) \
+ def_call_func(type##3) \
+ def_call_func(type##4) \
+ def_call_func(type##8) \
+ def_call_func(type##16)
+#else
+#define def_call_family(type) \
+ def_call_func(type) \
+ def_call_func(type##2) \
+ def_call_func(type##4) \
+ def_call_func(type##8) \
+ def_call_func(type##16)
+#endif
+
+def_call_family(char)
+def_call_family(uchar)
+def_call_family(short)
+def_call_family(ushort)
+def_call_family(int)
+def_call_family(uint)
+def_call_family(long)
+def_call_family(ulong)
+#ifdef cl_khr_fp16
+def_call_family(half)
+#endif
+def_call_family(float)
+#ifdef cl_khr_fp64
+def_call_family(double)
+#endif
+
+#define call_func(type, var) \
+ var = call_##type (var, var);
+
+#ifdef CL_VERSION_1_1
+#define call_family(type, var) \
+ call_func(type, var) \
+ call_func(type##2, var##2) \
+ call_func(type##3, var##3) \
+ call_func(type##4, var##4) \
+ call_func(type##8, var##8) \
+ call_func(type##16, var##16)
+#else
+#define call_family(type, var) \
+ call_func(type, var) \
+ call_func(type##2, var##2) \
+ call_func(type##4, var##4) \
+ call_func(type##8, var##8) \
+ call_func(type##16, var##16)
+#endif
+
+__kernel void testkernel (__global int *data)
+{
+ bool b = 0;
+
+ char c = 1;
+ char2 c2 = (char2) (1, 2);
+#ifdef CL_VERSION_1_1
+ char3 c3 = (char3) (1, 2, 3);
+#endif
+ char4 c4 = (char4) (1, 2, 3, 4);
+ char8 c8 = (char8) (1, 2, 3, 4, 5, 6, 7, 8);
+ char16 c16 = (char16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+ uchar uc = 1;
+ uchar2 uc2 = (uchar2) (1, 2);
+#ifdef CL_VERSION_1_1
+ uchar3 uc3 = (uchar3) (1, 2, 3);
+#endif
+ uchar4 uc4 = (uchar4) (1, 2, 3, 4);
+ uchar8 uc8 = (uchar8) (1, 2, 3, 4, 5, 6, 7, 8);
+ uchar16 uc16 = (uchar16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+ short s = 1;
+ short2 s2 = (short2) (1, 2);
+#ifdef CL_VERSION_1_1
+ short3 s3 = (short3) (1, 2, 3);
+#endif
+ short4 s4 = (short4) (1, 2, 3, 4);
+ short8 s8 = (short8) (1, 2, 3, 4, 5, 6, 7, 8);
+ short16 s16 = (short16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+ ushort us = 1;
+ ushort2 us2 = (ushort2) (1, 2);
+#ifdef CL_VERSION_1_1
+ ushort3 us3 = (ushort3) (1, 2, 3);
+#endif
+ ushort4 us4 = (ushort4) (1, 2, 3, 4);
+ ushort8 us8 = (ushort8) (1, 2, 3, 4, 5, 6, 7, 8);
+ ushort16 us16 = (ushort16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+ int i = 1;
+ int2 i2 = (int2) (1, 2);
+#ifdef CL_VERSION_1_1
+ int3 i3 = (int3) (1, 2, 3);
+#endif
+ int4 i4 = (int4) (1, 2, 3, 4);
+ int8 i8 = (int8) (1, 2, 3, 4, 5, 6, 7, 8);
+ int16 i16 = (int16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+ uint ui = 1;
+ uint2 ui2 = (uint2) (1, 2);
+#ifdef CL_VERSION_1_1
+ uint3 ui3 = (uint3) (1, 2, 3);
+#endif
+ uint4 ui4 = (uint4) (1, 2, 3, 4);
+ uint8 ui8 = (uint8) (1, 2, 3, 4, 5, 6, 7, 8);
+ uint16 ui16 = (uint16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+ long l = 1;
+ long2 l2 = (long2) (1, 2);
+#ifdef CL_VERSION_1_1
+ long3 l3 = (long3) (1, 2, 3);
+#endif
+ long4 l4 = (long4) (1, 2, 3, 4);
+ long8 l8 = (long8) (1, 2, 3, 4, 5, 6, 7, 8);
+ long16 l16 = (long16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+ ulong ul = 1;
+ ulong2 ul2 = (ulong2) (1, 2);
+#ifdef CL_VERSION_1_1
+ ulong3 ul3 = (ulong3) (1, 2, 3);
+#endif
+ ulong4 ul4 = (ulong4) (1, 2, 3, 4);
+ ulong8 ul8 = (ulong8) (1, 2, 3, 4, 5, 6, 7, 8);
+ ulong16 ul16 = (ulong16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+
+#ifdef cl_khr_fp16
+ half h = 1.0;
+ half2 h2 = (half2) (1.0, 2.0);
+#ifdef CL_VERSION_1_1
+ half3 h3 = (half3) (1.0, 2.0, 3.0);
+#endif
+ half4 h4 = (half4) (1.0, 2.0, 3.0, 4.0);
+ half8 h8 = (half8) (1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
+ half16 h16 = (half16)(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0);
+#endif
+
+ float f = 1.0;
+ float2 f2 = (float2) (1.0, 2.0);
+#ifdef CL_VERSION_1_1
+ float3 f3 = (float3) (1.0, 2.0, 3.0);
+#endif
+ float4 f4 = (float4) (1.0, 2.0, 3.0, 4.0);
+ float8 f8 = (float8) (1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
+ float16 f16 = (float16)(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0);
+
+#ifdef cl_khr_fp64
+ double d = 1.0;
+ double2 d2 = (double2) (1.0, 2.0);
+#ifdef CL_VERSION_1_1
+ double3 d3 = (double3) (1.0, 2.0, 3.0);
+#endif
+ double4 d4 = (double4) (1.0, 2.0, 3.0, 4.0);
+ double8 d8 = (double8) (1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
+ double16 d16 = (double16)(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0);
+#endif
+
+ /* marker! */
+
+ call_family (char, c);
+ call_family (uchar, uc);
+ call_family (short, s);
+ call_family (ushort, us);
+ call_family (int, i);
+ call_family (uint, ui);
+ call_family (long, l);
+ call_family (ulong, ul);
+#ifdef cl_khr_fp16
+ call_family (half, h);
+#endif
+ call_family (float, f);
+#ifdef cl_khr_fp64
+ call_family (double, d);
+#endif
+
+ data[get_global_id(0)] = 1;
+}
diff --git a/gdb/testsuite/gdb.opencl/callfuncs.exp b/gdb/testsuite/gdb.opencl/callfuncs.exp
new file mode 100644
index 0000000..f435589
--- /dev/null
+++ b/gdb/testsuite/gdb.opencl/callfuncs.exp
@@ -0,0 +1,102 @@
+# Copyright 2011 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/>. */
+#
+# Contributed by Ulrich Weigand <ulrich.weigand@de.ibm.com>.
+#
+# Tests OpenCL function calling conventions.
+
+if $tracelevel {
+ strace $tracelevel
+}
+
+load_lib opencl.exp
+
+if { [skip_opencl_tests] } {
+ return 0
+}
+
+set testfile "callfuncs"
+set clprogram [remote_download target ${srcdir}/${subdir}/${testfile}.cl]
+
+# Compile the generic OpenCL host app
+if { [gdb_compile_opencl_hostapp "${clprogram}" "${testfile}" "" ] != "" } {
+ untested ${testfile}.exp
+ return -1
+}
+
+gdb_exit
+gdb_start
+
+# Load the OpenCL app
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${objdir}/${subdir}/${testfile}
+
+# Set breakpoint at the OpenCL kernel
+gdb_test "tbreak testkernel" \
+ "" \
+ "Set pending breakpoint" \
+ ".*Function \"testkernel\" not defined.*Make breakpoint pending.*y or \\\[n\\\]. $" \
+ "y"
+
+gdb_run_cmd
+gdb_test "" ".*reakpoint.*1.*testkernel.*" "run"
+
+# Continue to the marker
+gdb_breakpoint [gdb_get_line_number "marker" "${clprogram}"]
+gdb_continue_to_breakpoint "marker"
+
+# Check if the language was switched to opencl
+gdb_test "show language" "The current source language is \"auto; currently opencl\"\."
+
+# Prevent multi-threaded execution during inferior calls
+gdb_test_no_output "set scheduler-locking on"
+
+# Retrieve some information about the OpenCL version and the availability of extensions
+set opencl_version [get_integer_valueof "opencl_version" 0]
+set have_cl_khr_fp64 [get_integer_valueof "have_cl_khr_fp64" 0]
+set have_cl_khr_fp16 [get_integer_valueof "have_cl_khr_fp16" 0]
+
+# Check function call / return sequence
+proc call_test { type var } {
+ global opencl_version
+
+ gdb_test "print/d call_${type} (${var}, ${var})" " = 2"
+ gdb_test "print/d call_${type}2 (${var}2, ${var}2)" " = \\{2, 4\\}"
+ if { ${opencl_version} >= 110 } {
+ gdb_test "print/d call_${type}3 (${var}3, ${var}3)" " = \\{2, 4, 6\\}"
+ }
+ gdb_test "print/d call_${type}4 (${var}4, ${var}4)" " = \\{2, 4, 6, 8\\}"
+ gdb_test "print/d call_${type}8 (${var}8, ${var}8)" " = \\{2, 4, 6, 8, 10, 12, 14, 16\\}"
+ gdb_test "print/d call_${type}16 (${var}16, ${var}16)" " = \\{2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32\\}"
+}
+
+call_test "char" "c"
+call_test "uchar" "uc"
+call_test "short" "s"
+call_test "ushort" "us"
+call_test "int" "i"
+call_test "uint" "ui"
+call_test "long" "l"
+call_test "ulong" "ul"
+if { ${have_cl_khr_fp16} } {
+ call_test "half" "h"
+}
+call_test "float" "f"
+if { ${have_cl_khr_fp64} } {
+ call_test "double" "d"
+}
+
+# Delete the OpenCL program source
+remote_file target delete ${clprogram}