diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2011-02-08 13:30:10 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2011-02-08 13:30:10 +0000 |
commit | 54fcddd0ace6123d9dadc3040c39acd1b42ffd09 (patch) | |
tree | 52b8f2892f032070d495dd00b396659f1a88edb8 /gdb/testsuite/gdb.opencl | |
parent | d6dafb7c8efcd4625de119bffece9907e5b69a8e (diff) | |
download | gdb-54fcddd0ace6123d9dadc3040c39acd1b42ffd09.zip gdb-54fcddd0ace6123d9dadc3040c39acd1b42ffd09.tar.gz gdb-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.in | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.opencl/callfuncs.cl | 218 | ||||
-rw-r--r-- | gdb/testsuite/gdb.opencl/callfuncs.exp | 102 |
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} |