* NEWS: Mention OpenCL C language support.
	* Makefile.in (SFILES): Add opencl-lang.c.
	(COMMON_OBS): Add opencl-lang.o.
	* opencl-lang.c: New File
	* defs.h (enum language): Add language_opencl.
	* dwarf2read.c (read_file_scope): Handle DW_AT_producer for the
	IBM XL C OpenCL compiler.
	* c-lang.h: Include "parser-defs.h".
	(evaluate_subexp_c): Declare.
	* c-lang.c (evaluate_subexp_c): Remove the static qualifier.
	(c_op_print_tab): Add declaration.
	* eval.c (binop_promote): Handle language_opencl.
	* c-exp.y: Lookup the primitive types instead of referring to the
	builtins.

gdb/testsuite:
	* Makefile.in (ALL_SUBDIRS): Add gdb.opencl.
	* configure.ac (AC_OUTPUT): Add gdb.opencl/Makefile.
	* configure: Regenerate.
	* gdb.opencl/Makefile.in: New File.
	* gdb.opencl/datatypes.exp: Likewise.
	* gdb.opencl/datatypes.cl: Likewise.
	* gdb.opencl/operators.exp: Likewise.
	* gdb.opencl/operators.cl: Likewise.
	* gdb.opencl/vec_comps.exp: Likewise.
	* gdb.opencl/vec_comps.cl: Likewise.
	* gdb.opencl/convs_casts.exp: Likewise.
	* gdb.opencl/convs_casts.cl: Likewise.
	* lib/opencl.exp: Likewise.
	* lib/opencl_hostapp.c: Likewise.
	* lib/opencl_kernel.cl: Likewise.
	* lib/cl_util.c: Likewise.
	* lib/cl_util.c: Likewise.
	* gdb.base/default.exp (set language): Add "opencl" to the list of
	languages.

gdb/doc:
	* gdb.texinfo: (Summary) Add mention about OpenCL C language support.
	(OpenCL C): New node.
This commit is contained in:
Ken Werner 2010-11-05 14:31:30 +00:00
parent aa291e2d99
commit f4b8a18de7
31 changed files with 4550 additions and 43 deletions

View File

@ -1,3 +1,20 @@
2010-11-05 Ken Werner <ken.werner@de.ibm.com>
* NEWS: Mention OpenCL C language support.
* Makefile.in (SFILES): Add opencl-lang.c.
(COMMON_OBS): Add opencl-lang.o.
* opencl-lang.c: New File
* defs.h (enum language): Add language_opencl.
* dwarf2read.c (read_file_scope): Handle DW_AT_producer for the
IBM XL C OpenCL compiler.
* c-lang.h: Include "parser-defs.h".
(evaluate_subexp_c): Declare.
* c-lang.c (evaluate_subexp_c): Remove the static qualifier.
(c_op_print_tab): Add declaration.
* eval.c (binop_promote): Handle language_opencl.
* c-exp.y: Lookup the primitive types instead of referring to the
builtins.
2010-11-05 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix configure --enable-plugins --without-python.

View File

@ -689,6 +689,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
mi/mi-common.c \
objc-exp.y objc-lang.c \
objfiles.c osabi.c observer.c osdata.c \
opencl-lang.c \
p-exp.y p-lang.c p-typeprint.c p-valprint.c parse.c printcmd.c \
proc-service.list progspace.c \
prologue-value.c psymtab.c \
@ -845,7 +846,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
ui-out.o cli-out.o \
varobj.o vec.o wrapper.o \
jv-lang.o jv-valprint.o jv-typeprint.o \
m2-lang.o p-lang.o p-typeprint.o p-valprint.o \
m2-lang.o opencl-lang.o p-lang.o p-typeprint.o p-valprint.o \
sentinel-frame.o \
complaints.o typeprint.o \
ada-typeprint.o c-typeprint.o f-typeprint.o m2-typeprint.o \

View File

@ -3,6 +3,10 @@
*** Changes since GDB 7.2
* OpenCL C
Initial support for the OpenCL C language (http://www.khronos.org/opencl)
has been integrated into GDB.
* Python scripting
** GDB values in Python are now callable if the value represents a

View File

@ -612,7 +612,9 @@ exp : VARIABLE
exp : SIZEOF '(' type ')' %prec UNARY
{ write_exp_elt_opcode (OP_LONG);
write_exp_elt_type (parse_type->builtin_int);
write_exp_elt_type (lookup_signed_typename
(parse_language, parse_gdbarch,
"int"));
CHECK_TYPEDEF ($3);
write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
write_exp_elt_opcode (OP_LONG); }
@ -980,61 +982,117 @@ typebase /* Implements (approximately): (type-qualifier)* type-specifier */
: TYPENAME
{ $$ = $1.type; }
| INT_KEYWORD
{ $$ = parse_type->builtin_int; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"int"); }
| LONG
{ $$ = parse_type->builtin_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long"); }
| SHORT
{ $$ = parse_type->builtin_short; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"short"); }
| LONG INT_KEYWORD
{ $$ = parse_type->builtin_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long"); }
| LONG SIGNED_KEYWORD INT_KEYWORD
{ $$ = parse_type->builtin_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long"); }
| LONG SIGNED_KEYWORD
{ $$ = parse_type->builtin_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long"); }
| SIGNED_KEYWORD LONG INT_KEYWORD
{ $$ = parse_type->builtin_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long"); }
| UNSIGNED LONG INT_KEYWORD
{ $$ = parse_type->builtin_unsigned_long; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"long"); }
| LONG UNSIGNED INT_KEYWORD
{ $$ = parse_type->builtin_unsigned_long; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"long"); }
| LONG UNSIGNED
{ $$ = parse_type->builtin_unsigned_long; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"long"); }
| LONG LONG
{ $$ = parse_type->builtin_long_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long long"); }
| LONG LONG INT_KEYWORD
{ $$ = parse_type->builtin_long_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long long"); }
| LONG LONG SIGNED_KEYWORD INT_KEYWORD
{ $$ = parse_type->builtin_long_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long long"); }
| LONG LONG SIGNED_KEYWORD
{ $$ = parse_type->builtin_long_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long long"); }
| SIGNED_KEYWORD LONG LONG
{ $$ = parse_type->builtin_long_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long long"); }
| SIGNED_KEYWORD LONG LONG INT_KEYWORD
{ $$ = parse_type->builtin_long_long; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"long long"); }
| UNSIGNED LONG LONG
{ $$ = parse_type->builtin_unsigned_long_long; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"long long"); }
| UNSIGNED LONG LONG INT_KEYWORD
{ $$ = parse_type->builtin_unsigned_long_long; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"long long"); }
| LONG LONG UNSIGNED
{ $$ = parse_type->builtin_unsigned_long_long; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"long long"); }
| LONG LONG UNSIGNED INT_KEYWORD
{ $$ = parse_type->builtin_unsigned_long_long; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"long long"); }
| SHORT INT_KEYWORD
{ $$ = parse_type->builtin_short; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"short"); }
| SHORT SIGNED_KEYWORD INT_KEYWORD
{ $$ = parse_type->builtin_short; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"short"); }
| SHORT SIGNED_KEYWORD
{ $$ = parse_type->builtin_short; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"short"); }
| UNSIGNED SHORT INT_KEYWORD
{ $$ = parse_type->builtin_unsigned_short; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"short"); }
| SHORT UNSIGNED
{ $$ = parse_type->builtin_unsigned_short; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"short"); }
| SHORT UNSIGNED INT_KEYWORD
{ $$ = parse_type->builtin_unsigned_short; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"short"); }
| DOUBLE_KEYWORD
{ $$ = parse_type->builtin_double; }
{ $$ = lookup_typename (parse_language, parse_gdbarch,
"double", (struct block *) NULL,
0); }
| LONG DOUBLE_KEYWORD
{ $$ = parse_type->builtin_long_double; }
{ $$ = lookup_typename (parse_language, parse_gdbarch,
"long double",
(struct block *) NULL, 0); }
| STRUCT name
{ $$ = lookup_struct (copy_name ($2),
expression_context_block); }
@ -1052,13 +1110,17 @@ typebase /* Implements (approximately): (type-qualifier)* type-specifier */
parse_gdbarch,
TYPE_NAME($2.type)); }
| UNSIGNED
{ $$ = parse_type->builtin_unsigned_int; }
{ $$ = lookup_unsigned_typename (parse_language,
parse_gdbarch,
"int"); }
| SIGNED_KEYWORD typename
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
TYPE_NAME($2.type)); }
| SIGNED_KEYWORD
{ $$ = parse_type->builtin_int; }
{ $$ = lookup_signed_typename (parse_language,
parse_gdbarch,
"int"); }
/* It appears that this rule for templates is never
reduced; template recognition happens by lookahead
in the token processing code in yylex. */
@ -1077,19 +1139,25 @@ typename: TYPENAME
{
$$.stoken.ptr = "int";
$$.stoken.length = 3;
$$.type = parse_type->builtin_int;
$$.type = lookup_signed_typename (parse_language,
parse_gdbarch,
"int");
}
| LONG
{
$$.stoken.ptr = "long";
$$.stoken.length = 4;
$$.type = parse_type->builtin_long;
$$.type = lookup_signed_typename (parse_language,
parse_gdbarch,
"long");
}
| SHORT
{
$$.stoken.ptr = "short";
$$.stoken.length = 5;
$$.type = parse_type->builtin_short;
$$.type = lookup_signed_typename (parse_language,
parse_gdbarch,
"short");
}
;

View File

@ -933,7 +933,7 @@ parse_one_string (struct obstack *output, char *data, int len,
are delegated to evaluate_subexp_standard; see that function for a
description of the arguments. */
static struct value *
struct value *
evaluate_subexp_c (struct type *expect_type, struct expression *exp,
int *pos, enum noside noside)
{

View File

@ -27,6 +27,7 @@ struct language_arch_info;
#include "value.h"
#include "macroexp.h"
#include "parser-defs.h"
/* The various kinds of C string and character. Note that these
@ -78,6 +79,10 @@ extern int c_value_print (struct value *, struct ui_file *,
/* These are in c-lang.c: */
extern struct value *evaluate_subexp_c (struct type *expect_type,
struct expression *exp, int *pos,
enum noside noside);
extern void c_printchar (int, struct type *, struct ui_file *);
extern void c_printstr (struct ui_file * stream, struct type *elttype,
@ -93,6 +98,8 @@ extern const struct exp_descriptor exp_descriptor_c;
extern void c_emit_char (int c, struct type *type,
struct ui_file *stream, int quoter);
extern const struct op_print c_op_print_tab[];
/* These are in c-typeprint.c: */
extern void c_type_print_base (struct type *, struct ui_file *, int, int);

View File

@ -201,6 +201,7 @@ enum language
language_asm, /* Assembly language */
language_pascal, /* Pascal */
language_ada, /* Ada */
language_opencl, /* OpenCL */
language_minimal, /* All other languages, minimal support only */
nr_languages
};

View File

@ -1,3 +1,8 @@
2010-11-05 Ken Werner <ken.werner@de.ibm.com>
* gdb.texinfo: (Summary) Add mention about OpenCL C language support.
(OpenCL C): New node.
2010-11-02 Doug Evans <dje@google.com>
* gdb.texinfo (Pretty Printing): Expand into three sections,

View File

@ -221,6 +221,9 @@ Support for D is partial. For information on D, see
Support for Modula-2 is partial. For information on Modula-2, see
@ref{Modula-2,,Modula-2}.
Support for OpenCL C is partial. For information on OpenCL C, see
@ref{OpenCL C,,OpenCL C}.
@cindex Pascal
Debugging Pascal programs which use sets, subranges, file variables, or
nested functions does not currently work. @value{GDBN} does not support
@ -11611,7 +11614,7 @@ being set automatically by @value{GDBN}.
@node Supported Languages
@section Supported Languages
@value{GDBN} supports C, C@t{++}, D, Objective-C, Fortran, Java, Pascal,
@value{GDBN} supports C, C@t{++}, D, Objective-C, Fortran, Java, OpenCL C, Pascal,
assembly, Modula-2, and Ada.
@c This is false ...
Some @value{GDBN} features may be used in expressions regardless of the
@ -11632,6 +11635,7 @@ language reference or tutorial.
* C:: C and C@t{++}
* D:: D
* Objective-C:: Objective-C
* OpenCL C:: OpenCL C
* Fortran:: Fortran
* Pascal:: Pascal
* Modula-2:: Modula-2
@ -12278,6 +12282,42 @@ the description of an object. However, this command may only work
with certain Objective-C libraries that have a particular hook
function, @code{_NSPrintForDebugger}, defined.
@node OpenCL C
@subsection OpenCL C
@cindex OpenCL C
This section provides information about @value{GDBN}s OpenCL C support.
@menu
* OpenCL C Datatypes::
* OpenCL C Expressions::
* OpenCL C Operators::
@end menu
@node OpenCL C Datatypes
@subsubsection OpenCL C Datatypes
@cindex OpenCL C Datatypes
@value{GDBN} supports the builtin scalar and vector datatypes specified
by OpenCL 1.1. In addition the half- and double-precision floating point
data types of the @code{cl_khr_fp16} and @code{cl_khr_fp64} OpenCL
extensions are also known to @value{GDBN}.
@node OpenCL C Expressions
@subsubsection OpenCL C Expressions
@cindex OpenCL C Expressions
@value{GDBN} supports accesses to vector components including the access as
lvalue where possible. Since OpenCL C is based on C99 most C expressions
supported by @value{GDBN} can be used as well.
@node OpenCL C Operators
@subsubsection OpenCL C Operators
@cindex OpenCL C Operators
@value{GDBN} supports the operators specified by OpenCL 1.1 for scalar and
vector data types.
@node Fortran
@subsection Fortran
@cindex Fortran-specific support in @value{GDBN}

View File

@ -5089,6 +5089,12 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
if (attr)
cu->producer = DW_STRING (attr);
/* The XLCL doesn't generate DW_LANG_OpenCL because this attribute is not
standardised yet. As a workaround for the language detection we fall
back to the DW_AT_producer string. */
if (cu->producer && strstr (cu->producer, "IBM XL C for OpenCL") != NULL)
cu->language = language_opencl;
/* We assume that we're processing GCC output. */
processing_gcc_compilation = 2;

View File

@ -603,6 +603,7 @@ binop_promote (const struct language_defn *language, struct gdbarch *gdbarch,
case language_cplus:
case language_asm:
case language_objc:
case language_opencl:
/* No promotion required. */
break;
@ -690,7 +691,24 @@ binop_promote (const struct language_defn *language, struct gdbarch *gdbarch,
: builtin->builtin_long_long);
}
break;
case language_opencl:
if (result_len <= TYPE_LENGTH (lookup_signed_typename
(language, gdbarch, "int")))
{
promoted_type =
(unsigned_operation
? lookup_unsigned_typename (language, gdbarch, "int")
: lookup_signed_typename (language, gdbarch, "int"));
}
else if (result_len <= TYPE_LENGTH (lookup_signed_typename
(language, gdbarch, "long")))
{
promoted_type =
(unsigned_operation
? lookup_unsigned_typename (language, gdbarch, "long")
: lookup_signed_typename (language, gdbarch,"long"));
}
break;
default:
/* For other languages the result type is unchanged from gdb
version 6.7 for backward compatibility.

1162
gdb/opencl-lang.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,25 @@
2010-11-05 Ken Werner <ken.werner@de.ibm.com>
* Makefile.in (ALL_SUBDIRS): Add gdb.opencl.
* configure.ac (AC_OUTPUT): Add gdb.opencl/Makefile.
* configure: Regenerate.
* gdb.opencl/Makefile.in: New File.
* gdb.opencl/datatypes.exp: Likewise.
* gdb.opencl/datatypes.cl: Likewise.
* gdb.opencl/operators.exp: Likewise.
* gdb.opencl/operators.cl: Likewise.
* gdb.opencl/vec_comps.exp: Likewise.
* gdb.opencl/vec_comps.cl: Likewise.
* gdb.opencl/convs_casts.exp: Likewise.
* gdb.opencl/convs_casts.cl: Likewise.
* lib/opencl.exp: Likewise.
* lib/opencl_hostapp.c: Likewise.
* lib/opencl_kernel.cl: Likewise.
* lib/cl_util.c: Likewise.
* lib/cl_util.c: Likewise.
* gdb.base/default.exp (set language): Add "opencl" to the list of
languages.
2010-11-04 Sami Wagiaalla <swagiaal@redhat.com>
* gdb.cp/overload.exp: Added test for inheritance overload.

View File

@ -36,8 +36,8 @@ RPATH_ENVVAR = @RPATH_ENVVAR@
ALL_SUBDIRS = gdb.ada gdb.arch gdb.asm gdb.base gdb.cp gdb.disasm \
gdb.dwarf2 \
gdb.fortran gdb.server gdb.java gdb.mi gdb.multi \
gdb.objc gdb.opt gdb.pascal gdb.python gdb.threads gdb.trace \
gdb.xml \
gdb.objc gdb.opencl gdb.opt gdb.pascal gdb.python gdb.threads \
gdb.trace gdb.xml \
$(SUBDIRS)
EXPECT = `if [ -f $${rootme}/../../expect/expect ] ; then \

View File

@ -3515,7 +3515,7 @@ done
ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.modula2/Makefile gdb.multi/Makefile gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile gdb.python/Makefile gdb.reverse/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile"
ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.modula2/Makefile gdb.multi/Makefile gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile gdb.python/Makefile gdb.reverse/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile gdb.opencl/Makefile"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
@ -4237,6 +4237,7 @@ do
"gdb.threads/Makefile") CONFIG_FILES="$CONFIG_FILES gdb.threads/Makefile" ;;
"gdb.trace/Makefile") CONFIG_FILES="$CONFIG_FILES gdb.trace/Makefile" ;;
"gdb.xml/Makefile") CONFIG_FILES="$CONFIG_FILES gdb.xml/Makefile" ;;
"gdb.opencl/Makefile") CONFIG_FILES="$CONFIG_FILES gdb.opencl/Makefile" ;;
*) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac

View File

@ -144,6 +144,6 @@ AC_OUTPUT([Makefile \
gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile \
gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile \
gdb.mi/Makefile gdb.modula2/Makefile gdb.multi/Makefile \
gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile \
gdb.objc/Makefile gdb.opencl/Makefile gdb.opt/Makefile gdb.pascal/Makefile \
gdb.python/Makefile gdb.reverse/Makefile \
gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile])

View File

@ -527,7 +527,7 @@ gdb_test "set history size" "Argument required .integer to set it to.*" "set his
#test set history
gdb_test "set history" "\"set history\" must be followed by the name of a history subcommand.(\[^\r\n\]*\[\r\n\])+List of set history subcommands:(\[^\r\n\]*\[\r\n\])+set history expansion -- Set history expansion on command input(\[^\r\n\]*\[\r\n\])+set history filename -- Set the filename in which to record the command history(\[^\r\n\]*\[\r\n\])+set history save -- Set saving of the history record on exit(\[^\r\n\]*\[\r\n\])+set history size -- Set the size of the command history(\[^\r\n\]*\[\r\n\])+Type \"help set history\" followed by set history subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set history"
#test set language
gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, c, c.., asm, minimal, d, fortran, objective-c, java, modula-2, pascal." "set language"
gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, c, c.., asm, minimal, d, fortran, objective-c, java, modula-2, opencl, pascal." "set language"
#test set listsize
gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
#test set print "p" abbreviation

View File

@ -0,0 +1,17 @@
VPATH = @srcdir@
srcdir = @srcdir@
EXECUTABLES = datatypes vec_comps convs_casts operators
all info install-info dvi install uninstall installcheck check:
@echo "Nothing to be done for $@..."
clean mostlyclean:
-rm -f *~ *.o a.out core corefile gcore.test
-rm -f $(EXECUTABLES)
distclean maintainer-clean realclean: clean
-rm -f *~ core
-rm -f Makefile config.status config.log
-rm -f *-init.exp
-rm -fr *.log summary detail *.plog *.sum *.psum site.*

View File

@ -0,0 +1,55 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com> */
int opencl_version = __OPENCL_VERSION__;
#ifdef HAVE_cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
int have_cl_khr_fp64 = 1;
#else
int have_cl_khr_fp64 = 0;
#endif
#ifdef HAVE_cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
int have_cl_khr_fp16 = 1;
#else
int have_cl_khr_fp16 = 0;
#endif
char c = 123;
uchar uc = 123;
short s = 123;
ushort us = 123;
int i = 123;
uint ui = 123;
long l = 123;
ulong ul = 123;
#ifdef cl_khr_fp16
half h = 123.0;
#endif
float f = 123.0;
#ifdef cl_khr_fp64
double d = 123.0;
#endif
__kernel void testkernel (__global int *data)
{
data[get_global_id(0)] = 1;
}

View File

@ -0,0 +1,95 @@
# Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com>.
#
# Tests GDBs support for OpenCL type conversions and casts.
if $tracelevel {
strace $tracelevel
}
load_lib opencl.exp
if { [skip_opencl_tests] } {
return 0
}
set testfile "convs_casts"
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
}
# Load the OpenCL app
clean_restart ${testfile}
# Set breakpoint at the OpenCL kernel
gdb_test_multiple "break testkernel" "set pending breakpoint" {
-re ".*Function \"testkernel\" not defined.*Make breakpoint pending.*y or \\\[n\\\]. $" {
gdb_test "y" "Breakpoint.*testkernel.*pending." "set pending breakpoint (without symbols)"
}
}
gdb_run_cmd
gdb_test "" ".*Breakpoint.*1.*testkernel.*" "run"
# Retrieve some information about availability of OpenCL extensions
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]
proc vec_casts { name } {
global have_cl_khr_fp16 have_cl_khr_fp64
set types {"char" "uchar" "short" "ushort" "int" "uint" "long" "ulong" "half" "float" "double"}
set len [llength ${types}]
for {set i 0} {$i < ${len}} {incr i} {
set type [lindex ${types} $i]
gdb_test "print/d (${type}2)${name}" " = \\{123, 123\\}"
gdb_test "print/d (${type}3)${name}" " = \\{123, 123, 123\\}"
gdb_test "print/d (${type}4)${name}" " = \\{123, 123, 123, 123\\}"
gdb_test "print/d (${type}8)${name}" " = \\{123, 123, 123, 123, 123, 123, 123, 123\\}"
gdb_test "print/d (${type}16)${name}" " = \\{123 <repeats 16 times>\\}"
gdb_test "ptype (${type}2)${name}" "${type} \\\[2\\\]"
gdb_test "ptype (${type}3)${name}" "${type} \\\[3\\\]"
gdb_test "ptype (${type}4)${name}" "${type} \\\[4\\\]"
gdb_test "ptype (${type}8)${name}" "${type} \\\[8\\\]"
gdb_test "ptype (${type}16)${name}" "${type} \\\[16\\\]"
}
}
vec_casts "c"
vec_casts "uc"
vec_casts "s"
vec_casts "us"
vec_casts "i"
vec_casts "ui"
vec_casts "l"
vec_casts "ul"
if { ${have_cl_khr_fp16} } {
vec_casts "h"
}
vec_casts "f"
if { ${have_cl_khr_fp64} } {
vec_casts "d"
}
# Delete the OpenCL program source
remote_file target delete ${clprogram}

View File

@ -0,0 +1,145 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com> */
int opencl_version = __OPENCL_VERSION__;
#ifdef HAVE_cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
int have_cl_khr_fp64 = 1;
#else
int have_cl_khr_fp64 = 0;
#endif
#ifdef HAVE_cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
int have_cl_khr_fp16 = 1;
#else
int have_cl_khr_fp16 = 0;
#endif
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);
half *ph;
#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
__kernel void testkernel (__global int *data)
{
data[get_global_id(0)] = 1;
}

View File

@ -0,0 +1,471 @@
# Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com>.
#
# Tests OpenCL data types.
if $tracelevel {
strace $tracelevel
}
load_lib opencl.exp
if { [skip_opencl_tests] } {
return 0
}
set testfile "datatypes"
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
# Manually switch the language to opencl
gdb_test_no_output "set language opencl" "No prompt when setting the language to opencl"
# Check OpenCL data types (GDB)
gdb_test "whatis bool" "type = bool"
gdb_test "p sizeof(bool)" " = 4"
gdb_test "whatis char" "type = char"
gdb_test "p sizeof(char)" " = 1"
gdb_test "whatis char2" "type = char2"
gdb_test "p sizeof(char2)" " = 2"
gdb_test "whatis char3" "type = char3"
gdb_test "p sizeof(char3)" " = 4"
gdb_test "whatis char4" "type = char4"
gdb_test "p sizeof(char4)" " = 4"
gdb_test "whatis char8" "type = char8"
gdb_test "p sizeof(char8)" " = 8"
gdb_test "whatis char16" "type = char16"
gdb_test "p sizeof(char16)" " = 16"
gdb_test "whatis unsigned char" "type = unsigned char"
gdb_test "p sizeof(unsigned char)" " = 1"
gdb_test "whatis uchar" "type = uchar"
gdb_test "p sizeof(uchar)" " = 1"
gdb_test "whatis uchar2" "type = uchar2"
gdb_test "p sizeof(uchar2)" " = 2"
gdb_test "whatis uchar3" "type = uchar3"
gdb_test "p sizeof(uchar3)" " = 4"
gdb_test "whatis uchar4" "type = uchar4"
gdb_test "p sizeof(uchar4)" " = 4"
gdb_test "whatis uchar8" "type = uchar8"
gdb_test "p sizeof(uchar8)" " = 8"
gdb_test "whatis uchar16" "type = uchar16"
gdb_test "p sizeof(uchar16)" " = 16"
gdb_test "whatis short" "type = short"
gdb_test "p sizeof(short)" " = 2"
gdb_test "whatis short2" "type = short2"
gdb_test "p sizeof(short2)" " = 4"
gdb_test "whatis short3" "type = short3"
gdb_test "p sizeof(short3)" " = 8"
gdb_test "whatis short4" "type = short4"
gdb_test "p sizeof(short4)" " = 8"
gdb_test "whatis short8" "type = short8"
gdb_test "p sizeof(short8)" " = 16"
gdb_test "whatis short16" "type = short16"
gdb_test "p sizeof(short16)" " = 32"
gdb_test "whatis unsigned short" "type = unsigned short"
gdb_test "p sizeof(unsigned short)" " = 2"
gdb_test "whatis ushort" "type = ushort"
gdb_test "p sizeof(ushort)" " = 2"
gdb_test "whatis ushort2" "type = ushort2"
gdb_test "p sizeof(ushort2)" " = 4"
gdb_test "whatis ushort3" "type = ushort3"
gdb_test "p sizeof(ushort3)" " = 8"
gdb_test "whatis ushort4" "type = ushort4"
gdb_test "p sizeof(ushort4)" " = 8"
gdb_test "whatis ushort8" "type = ushort8"
gdb_test "p sizeof(ushort8)" " = 16"
gdb_test "whatis ushort16" "type = ushort16"
gdb_test "p sizeof(ushort16)" " = 32"
gdb_test "whatis int" "type = int"
gdb_test "p sizeof(int)" " = 4"
gdb_test "whatis int2" "type = int2"
gdb_test "p sizeof(int2)" " = 8"
gdb_test "whatis int3" "type = int3"
gdb_test "p sizeof(int3)" " = 16"
gdb_test "whatis int4" "type = int4"
gdb_test "p sizeof(int4)" " = 16"
gdb_test "whatis int8" "type = int8"
gdb_test "p sizeof(int8)" " = 32"
gdb_test "whatis int16" "type = int16"
gdb_test "p sizeof(int16)" " = 64"
gdb_test "whatis unsigned int" "type = unsigned int"
gdb_test "p sizeof(unsigned int)" " = 4"
gdb_test "whatis uint" "type = uint"
gdb_test "p sizeof(uint)" " = 4"
gdb_test "whatis uint2" "type = uint2"
gdb_test "p sizeof(uint2)" " = 8"
gdb_test "whatis uint3" "type = uint3"
gdb_test "p sizeof(uint3)" " = 16"
gdb_test "whatis uint4" "type = uint4"
gdb_test "p sizeof(uint4)" " = 16"
gdb_test "whatis uint8" "type = uint8"
gdb_test "p sizeof(uint8)" " = 32"
gdb_test "whatis uint16" "type = uint16"
gdb_test "p sizeof(uint16)" " = 64"
gdb_test "whatis long" "type = long"
gdb_test "p sizeof(long)" " = 8"
gdb_test "whatis long2" "type = long2"
gdb_test "p sizeof(long2)" " = 16"
gdb_test "whatis long3" "type = long3"
gdb_test "p sizeof(long3)" " = 32"
gdb_test "whatis long4" "type = long4"
gdb_test "p sizeof(long4)" " = 32"
gdb_test "whatis long8" "type = long8"
gdb_test "p sizeof(long8)" " = 64"
gdb_test "whatis long16" "type = long16"
gdb_test "p sizeof(long16)" " = 128"
gdb_test "whatis unsigned long" "type = unsigned long"
gdb_test "p sizeof(unsigned long)" " = 8"
gdb_test "whatis ulong" "type = ulong"
gdb_test "p sizeof(ulong)" " = 8"
gdb_test "whatis ulong2" "type = ulong2"
gdb_test "p sizeof(ulong2)" " = 16"
gdb_test "whatis ulong3" "type = ulong3"
gdb_test "p sizeof(ulong3)" " = 32"
gdb_test "whatis ulong4" "type = ulong4"
gdb_test "p sizeof(ulong4)" " = 32"
gdb_test "whatis ulong8" "type = ulong8"
gdb_test "p sizeof(ulong8)" " = 64"
gdb_test "whatis ulong16" "type = ulong16"
gdb_test "p sizeof(ulong16)" " = 128"
gdb_test "whatis half" "type = half"
gdb_test "p sizeof(half)" " = 2"
gdb_test "whatis half2" "type = half2"
gdb_test "p sizeof(half2)" " = 4"
gdb_test "whatis half3" "type = half3"
gdb_test "p sizeof(half3)" " = 8"
gdb_test "whatis half4" "type = half4"
gdb_test "p sizeof(half4)" " = 8"
gdb_test "whatis half8" "type = half8"
gdb_test "p sizeof(half8)" " = 16"
gdb_test "whatis half16" "type = half16"
gdb_test "p sizeof(half16)" " = 32"
gdb_test "whatis float" "type = float"
gdb_test "p sizeof(float)" " = 4"
gdb_test "whatis float2" "type = float2"
gdb_test "p sizeof(float2)" " = 8"
gdb_test "whatis float3" "type = float3"
gdb_test "p sizeof(float3)" " = 16"
gdb_test "whatis float4" "type = float4"
gdb_test "p sizeof(float4)" " = 16"
gdb_test "whatis float8" "type = float8"
gdb_test "p sizeof(float8)" " = 32"
gdb_test "whatis float16" "type = float16"
gdb_test "p sizeof(float16)" " = 64"
gdb_test "whatis double" "type = double"
gdb_test "p sizeof(double)" " = 8"
gdb_test "whatis double2" "type = double2"
gdb_test "p sizeof(double2)" " = 16"
gdb_test "whatis double3" "type = double3"
gdb_test "p sizeof(double3)" " = 32"
gdb_test "whatis double4" "type = double4"
gdb_test "p sizeof(double4)" " = 32"
gdb_test "whatis double8" "type = double8"
gdb_test "p sizeof(double8)" " = 64"
gdb_test "whatis double16" "type = double16"
gdb_test "p sizeof(double16)" " = 128"
# Set the language back to the default: "auto; currently c"
gdb_test_no_output "set language c" "No prompt when setting the language to c"
gdb_test_no_output "set language auto" "No prompt when setting the language to auto"
# Load the OpenCL app
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${objdir}/${subdir}/${testfile}
# Set breakpoint at the OpenCL kernel
gdb_test_multiple "break testkernel" "set pending breakpoint" {
-re ".*Function \"testkernel\" not defined.*Make breakpoint pending.*y or \\\[n\\\]. $" {
gdb_test "y" "Breakpoint.*testkernel.*pending." "set pending breakpoint (without symbols)"
}
}
gdb_run_cmd
gdb_test "" ".*Breakpoint.*1.*testkernel.*" "run"
# Check if the language was switched to opencl
gdb_test "show language" "The current source language is \"auto; currently opencl\"\."
# 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 OpenCL data types (DWARF)
gdb_test "whatis b" "type = bool"
gdb_test "p sizeof(b)" " = 4"
gdb_test "print b" " = 0"
gdb_test "whatis c" "type = char"
gdb_test "p sizeof(c)" " = 1"
gdb_test "print/d c" " = 1"
gdb_test "whatis c2" "type = char \\\[2\\\]"
gdb_test "p sizeof(c2)" " = 2"
gdb_test "print c2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis c3" "type = char \\\[3\\\]"
gdb_test "p sizeof(c3)" " = 4"
gdb_test "print c3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis c4" "type = char \\\[4\\\]"
gdb_test "p sizeof(c4)" " = 4"
gdb_test "print c4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis c8" "type = char \\\[8\\\]"
gdb_test "p sizeof(c8)" " = 8"
gdb_test "print c8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis c16" "type = char \\\[16\\\]"
gdb_test "p sizeof(c16)" " = 16"
gdb_test "print c16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
gdb_test "whatis uc" "type = (uchar|unsigned char)"
gdb_test "p sizeof(uc)" " = 1"
gdb_test "print/d uc" " = 1"
gdb_test "whatis uc2" "type = (uchar|unsigned char) \\\[2\\\]"
gdb_test "p sizeof(uc2)" " = 2"
gdb_test "print uc2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis uc3" "type = (uchar|unsigned char) \\\[3\\\]"
gdb_test "p sizeof(uchar3)" " = 4"
gdb_test "print uc3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis uc4" "type = (uchar|unsigned char) \\\[4\\\]"
gdb_test "p sizeof(uc4)" " = 4"
gdb_test "print uc4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis uc8" "type = (uchar|unsigned char) \\\[8\\\]"
gdb_test "p sizeof(uc8)" " = 8"
gdb_test "print uc8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis uc16" "type = (uchar|unsigned char) \\\[16\\\]"
gdb_test "p sizeof(uc16)" " = 16"
gdb_test "print uc16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
gdb_test "whatis s" "type = short"
gdb_test "p sizeof(s)" " = 2"
gdb_test "print s" " = -1"
gdb_test "whatis s2" "type = short \\\[2\\\]"
gdb_test "p sizeof(s2)" " = 4"
gdb_test "print s2" " = \\{-1, -2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis s3" "type = short \\\[3\\\]"
gdb_test "p sizeof(s3)" " = 8"
gdb_test "print s3" " = \\{-1, -2, -3\\}"
}
gdb_test "whatis s4" "type = short \\\[4\\\]"
gdb_test "p sizeof(s4)" " = 8"
gdb_test "print s4" " = \\{-1, -2, -3, -4\\}"
gdb_test "whatis s8" "type = short \\\[8\\\]"
gdb_test "p sizeof(s8)" " = 16"
gdb_test "print s8" " = \\{-1, -2, -3, -4, -5, -6, -7, -8\\}"
gdb_test "whatis s16" "type = short \\\[16\\\]"
gdb_test "p sizeof(s16)" " = 32"
gdb_test "print s16" " = \\{-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16\\}"
gdb_test "whatis us" "type = (ushort|unsigned short)"
gdb_test "p sizeof(us)" " = 2"
gdb_test "print us" " = 1"
gdb_test "whatis us2" "type = (ushort|unsigned short) \\\[2\\\]"
gdb_test "p sizeof(us2)" " = 4"
gdb_test "print us2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis us3" "type = (ushort|unsigned short) \\\[3\\\]"
gdb_test "p sizeof(us3)" " = 8"
gdb_test "print us3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis us4" "type = (ushort|unsigned short) \\\[4\\\]"
gdb_test "p sizeof(us4)" " = 8"
gdb_test "print us4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis us8" "type = (ushort|unsigned short) \\\[8\\\]"
gdb_test "p sizeof(us8)" " = 16"
gdb_test "print us8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis us16" "type = (ushort|unsigned short) \\\[16\\\]"
gdb_test "p sizeof(us16)" " = 32"
gdb_test "print us16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
gdb_test "whatis i" "type = int"
gdb_test "p sizeof(i)" " = 4"
gdb_test "print i" " = -1"
gdb_test "whatis i2" "type = int \\\[2\\\]"
gdb_test "p sizeof(i2)" " = 8"
gdb_test "print i2" " = \\{-1, -2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis i3" "type = int \\\[3\\\]"
gdb_test "p sizeof(i3)" " = 16"
gdb_test "print i3" " = \\{-1, -2, -3\\}"
}
gdb_test "whatis i4" "type = int \\\[4\\\]"
gdb_test "p sizeof(i4)" " = 16"
gdb_test "print i4" " = \\{-1, -2, -3, -4\\}"
gdb_test "whatis i8" "type = int \\\[8\\\]"
gdb_test "p sizeof(i8)" " = 32"
gdb_test "print i8" " = \\{-1, -2, -3, -4, -5, -6, -7, -8\\}"
gdb_test "whatis i16" "type = int \\\[16\\\]"
gdb_test "p sizeof(i16)" " = 64"
gdb_test "print i16" " = \\{-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16\\}"
gdb_test "whatis ui" "type = (uint|unsigned int)"
gdb_test "p sizeof(ui)" " = 4"
gdb_test "print ui" " = 1"
gdb_test "whatis ui2" "type = (uint|unsigned int) \\\[2\\\]"
gdb_test "p sizeof(ui2)" " = 8"
gdb_test "print ui2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis ui3" "type = (uint|unsigned int) \\\[3\\\]"
gdb_test "p sizeof(ui3)" " = 16"
gdb_test "print ui3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis ui4" "type = (uint|unsigned int) \\\[4\\\]"
gdb_test "p sizeof(ui4)" " = 16"
gdb_test "print ui4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis ui8" "type = (uint|unsigned int) \\\[8\\\]"
gdb_test "p sizeof(ui8)" " = 32"
gdb_test "print ui8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis ui16" "type = (uint|unsigned int) \\\[16\\\]"
gdb_test "p sizeof(ui16)" " = 64"
gdb_test "print ui16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
gdb_test "whatis l" "type = long"
gdb_test "p sizeof(l)" " = 8"
gdb_test "print l" " = -1"
gdb_test "whatis l2" "type = long \\\[2\\\]"
gdb_test "p sizeof(l2)" " = 16"
gdb_test "print l2" " = \\{-1, -2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis l3" "type = long \\\[3\\\]"
gdb_test "p sizeof(l3)" " = 32"
gdb_test "print l3" " = \\{-1, -2, -3\\}"
}
gdb_test "whatis l4" "type = long \\\[4\\\]"
gdb_test "p sizeof(l4)" " = 32"
gdb_test "print l4" " = \\{-1, -2, -3, -4\\}"
gdb_test "whatis l8" "type = long \\\[8\\\]"
gdb_test "p sizeof(l8)" " = 64"
gdb_test "print l8" " = \\{-1, -2, -3, -4, -5, -6, -7, -8\\}"
gdb_test "whatis l16" "type = long \\\[16\\\]"
gdb_test "p sizeof(l16)" " = 128"
gdb_test "print l16" " = \\{-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16\\}"
gdb_test "whatis ul" "type = (ulong|unsigned long)"
gdb_test "p sizeof(ul)" " = 8"
gdb_test "print ul" " = 1"
gdb_test "whatis ul2" "type = (ulong|unsigned long) \\\[2\\\]"
gdb_test "p sizeof(ul2)" " = 16"
gdb_test "print ul2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis ul3" "type = (ulong|unsigned long) \\\[3\\\]"
gdb_test "p sizeof(ul3)" " = 32"
gdb_test "print ul3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis ul4" "type = (ulong|unsigned long) \\\[4\\\]"
gdb_test "p sizeof(ul4)" " = 32"
gdb_test "print ul4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis ul8" "type = (ulong|unsigned long) \\\[8\\\]"
gdb_test "p sizeof(ul8)" " = 64"
gdb_test "print ul8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis ul16" "type = (ulong|unsigned long) \\\[16\\\]"
gdb_test "p sizeof(ul16)" " = 128"
gdb_test "print ul16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
gdb_test "whatis ph" "type = half *"
gdb_test "whatis *ph" "type = half"
gdb_test "p sizeof(*ph)" " = 2"
if { ${have_cl_khr_fp16} } {
gdb_test "whatis h" "type = half"
gdb_test "p sizeof(h)" " = 2"
gdb_test "print h" " = 1"
gdb_test "whatis h2" "type = half \\\[2\\\]"
gdb_test "p sizeof(h2)" " = 4"
gdb_test "print h2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis h3" "type = half \\\[3\\\]"
gdb_test "p sizeof(h3)" " = 8"
gdb_test "print h3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis h4" "type = half \\\[4\\\]"
gdb_test "p sizeof(h4)" " = 8"
gdb_test "print h4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis h8" "type = half \\\[8\\\]"
gdb_test "p sizeof(h8)" " = 16"
gdb_test "print h8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis h16" "type = half \\\[16\\\]"
gdb_test "p sizeof(h16)" " = 16"
gdb_test "print h16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
}
gdb_test "whatis f" "type = float"
gdb_test "p sizeof(f)" " = 4"
gdb_test "print f" " = 1"
gdb_test "whatis f2" "type = float \\\[2\\\]"
gdb_test "p sizeof(f2)" " = 8"
gdb_test "print f2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis f3" "type = float \\\[3\\\]"
gdb_test "p sizeof(f3)" " = 16"
gdb_test "print f3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis f4" "type = float \\\[4\\\]"
gdb_test "p sizeof(f4)" " = 16"
gdb_test "print f4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis f8" "type = float \\\[8\\\]"
gdb_test "p sizeof(f8)" " = 32"
gdb_test "print f8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis f16" "type = float \\\[16\\\]"
gdb_test "p sizeof(f16)" " = 64"
gdb_test "print f16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
if { ${have_cl_khr_fp64} } {
gdb_test "whatis d" "type = double"
gdb_test "p sizeof(d)" " = 8"
gdb_test "print d" " = 1"
gdb_test "whatis d2" "type = double \\\[2\\\]"
gdb_test "p sizeof(d2)" " = 16"
gdb_test "print d2" " = \\{1, 2\\}"
if { ${opencl_version} >= 110 } {
gdb_test "whatis d3" "type = double \\\[3\\\]"
gdb_test "p sizeof(d3)" " = 32"
gdb_test "print d3" " = \\{1, 2, 3\\}"
}
gdb_test "whatis d4" "type = double \\\[4\\\]"
gdb_test "p sizeof(d4)" " = 32"
gdb_test "print d4" " = \\{1, 2, 3, 4\\}"
gdb_test "whatis d8" "type = double \\\[8\\\]"
gdb_test "p sizeof(d8)" " = 64"
gdb_test "print d8" " = \\{1, 2, 3, 4, 5, 6, 7, 8\\}"
gdb_test "whatis d16" "type = double \\\[16\\\]"
gdb_test "p sizeof(d16)" " = 128"
gdb_test "print d16" " = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\\}"
}
# Delete the OpenCL program source
remote_file target delete ${clprogram}

View File

@ -0,0 +1,105 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com> */
int opencl_version = __OPENCL_VERSION__;
#ifdef HAVE_cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
int have_cl_khr_fp64 = 1;
#else
int have_cl_khr_fp64 = 0;
#endif
#ifdef HAVE_cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
int have_cl_khr_fp16 = 1;
#else
int have_cl_khr_fp16 = 0;
#endif
char ca = 2;
char cb = 1;
uchar uca = 2;
uchar ucb = 1;
char4 c4a = (char4) (2, 4, 8, 16);
char4 c4b = (char4) (1, 2, 8, 4);
uchar4 uc4a = (uchar4) (2, 4, 8, 16);
uchar4 uc4b = (uchar4) (1, 2, 8, 4);
short sa = 2;
short sb = 1;
ushort usa = 2;
ushort usb = 1;
short4 s4a = (short4) (2, 4, 8, 16);
short4 s4b = (short4) (1, 2, 8, 4);
ushort4 us4a = (ushort4) (2, 4, 8, 16);
ushort4 us4b = (ushort4) (1, 2, 8, 4);
int ia = 2;
int ib = 1;
uint uia = 2;
uint uib = 1;
int4 i4a = (int4) (2, 4, 8, 16);
int4 i4b = (int4) (1, 2, 8, 4);
uint4 ui4a = (uint4) (2, 4, 8, 16);
uint4 ui4b = (uint4) (1, 2, 8, 4);
long la = 2;
long lb = 1;
ulong ula = 2;
ulong ulb = 1;
long4 l4a = (long4) (2, 4, 8, 16);
long4 l4b = (long4) (1, 2, 8, 4);
ulong4 ul4a = (ulong4) (2, 4, 8, 16);
ulong4 ul4b = (ulong4) (1, 2, 8, 4);
#ifdef cl_khr_fp16
half ha = 2;
half hb = 1;
half4 h4a = (half4) (2, 4, 8, 16);
half4 h4b = (half4) (1, 2, 8, 4);
#endif
float fa = 2;
float fb = 1;
float4 f4a = (float4) (2, 4, 8, 16);
float4 f4b = (float4) (1, 2, 8, 4);
#ifdef cl_khr_fp64
double da = 2;
double db = 1;
double4 d4a = (double4) (2, 4, 8, 16);
double4 d4b = (double4) (1, 2, 8, 4);
#endif
uint4 ui4 = (uint4) (2, 4, 8, 16);
int2 i2 = (int2) (1, 2);
long2 l2 = (long2) (1, 2);
#ifdef cl_khr_fp16
half2 h2 = (half2) (1, 2);
#endif
float2 f2 = (float2) (1, 2);
#ifdef cl_khr_fp64
double2 d2 = (double2) (1, 2);
#endif
__kernel void testkernel (__global int *data)
{
data[get_global_id(0)] = 1;
}

View File

@ -0,0 +1,955 @@
# Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com>.
#
# Tests GDBs support for OpenCL operators.
if $tracelevel {
strace $tracelevel
}
load_lib opencl.exp
if { [skip_opencl_tests] } {
return 0
}
set testfile "operators"
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
}
# Load the OpenCL app
clean_restart ${testfile}
# Set breakpoint at the OpenCL kernel
gdb_test_multiple "break testkernel" "set pending breakpoint" {
-re ".*Function \"testkernel\" not defined.*Make breakpoint pending.*y or \\\[n\\\]. $" {
gdb_test "y" "Breakpoint.*testkernel.*pending." "set pending breakpoint (without symbols)"
}
}
gdb_run_cmd
gdb_test "" ".*Breakpoint.*1.*testkernel.*" "run"
# Retrieve some information about availability of OpenCL extensions
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]
proc check_basic { name type isfloat } {
gdb_test "print/d ${name}a" " = 2"
gdb_test "print/d ${name}b" " = 1"
gdb_test "print/d ${name}4a" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4b" " = \\{1, 2, 8, 4\\}"
gdb_test "ptype ${name}a" "type = ${type}"
gdb_test "ptype ${name}b" "type = ${type}"
gdb_test "ptype ${name}4a" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4b" "type = ${type} \\\[4\\\]"
if { ! ${isfloat} } {
gdb_test "print/d u${name}a" " = 2"
gdb_test "print/d u${name}b" " = 1"
gdb_test "print/d u${name}4a" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4b" " = \\{1, 2, 8, 4\\}"
gdb_test "ptype u${name}a" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
}
}
# Arithmetic operators
proc check_arithmetic_ops { name type isfloat size } {
# scalar with scalar
gdb_test "print/d ${name}a + ${name}b" " = 3"
gdb_test "print/d ${name}a - ${name}b" " = 1"
gdb_test "print/d ${name}a * ${name}b" " = 2"
gdb_test "print/d ${name}a / ${name}b" " = 2"
# scalar with vector
gdb_test "print/d ${name}a + ${name}4b" " = \\{3, 4, 10, 6\\}"
gdb_test "print/d ${name}4a - ${name}b" " = \\{1, 3, 7, 15\\}"
gdb_test "print/d ${name}4a * ${name}b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}a / ${name}4b" " = \\{2, 1, 0, 0\\}"
# vector with vector
gdb_test "print/d ${name}4a + ${name}4b" " = \\{3, 6, 16, 20\\}"
gdb_test "print/d ${name}4a - ${name}4b" " = \\{1, 2, 0, 12\\}"
gdb_test "print/d ${name}4a * ${name}4b" " = \\{2, 8, 64, 64\\}"
gdb_test "print/d ${name}4a / ${name}4b" " = \\{2, 2, 1, 4\\}"
# scalar
gdb_test "print/d ${name}a++" " = 2"
gdb_test "print/d ++${name}a" " = 4"
gdb_test "print/d ${name}a--" " = 4"
gdb_test "print/d --${name}a" " = 2"
gdb_test "print/d +${name}a" " = 2"
gdb_test "print/d -${name}a" " = -2"
# vector
gdb_test "print/d ${name}4a++" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ++${name}4a" " = \\{4, 6, 10, 18\\}"
gdb_test "print/d ${name}4a--" " = \\{4, 6, 10, 18\\}"
gdb_test "print/d --${name}4a" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d +${name}4a" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d -${name}4a" " = \\{-2, -4, -8, -16\\}"
# scalar with vector
gdb_test "ptype ${name}a + ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a - ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}a * ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a / ${name}b" "type = ${type} \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a + ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a - ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a * ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a / ${name}4b" "type = ${type} \\\[4\\\]"
# scalar
gdb_test "ptype ${name}a++" "type = ${type}"
gdb_test "ptype ++${name}a" "type = ${type}"
gdb_test "ptype ${name}a--" "type = ${type}"
gdb_test "ptype --${name}a" "type = ${type}"
# vector
gdb_test "ptype ${name}4a++" "type = ${type} \\\[4\\\]"
gdb_test "ptype ++${name}4a" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a--" "type = ${type} \\\[4\\\]"
gdb_test "ptype --${name}4a" "type = ${type} \\\[4\\\]"
gdb_test "ptype +${name}4a" "type = ${type} \\\[4\\\]"
gdb_test "ptype -${name}4a" "type = ${type} \\\[4\\\]"
if { ${isfloat} } {
# scalar with scalar
gdb_test "ptype ${name}a + ${name}b" "type = ${type}"
gdb_test "ptype ${name}a - ${name}b" "type = ${type}"
gdb_test "ptype ${name}a * ${name}b" "type = ${type}"
gdb_test "ptype ${name}a / ${name}b" "type = ${type}"
# scalar
gdb_test "ptype +${name}a" "type = ${type}"
gdb_test "ptype -${name}a" "type = ${type}"
} else {
# scalar with scalar
gdb_test "print/d ${name}a % ${name}b" " = 0"
# scalar with vector
gdb_test "print/d ${name}4a % ${name}b" " = \\{0, 0, 0, 0\\}"
# vector with vector
gdb_test "print/d ${name}4a % ${name}b" " = \\{0, 0, 0, 0\\}"
# scalar with scalar
gdb_test "print/d u${name}a + u${name}b" " = 3"
gdb_test "print/d u${name}a - u${name}b" " = 1"
gdb_test "print/d u${name}a * u${name}b" " = 2"
gdb_test "print/d u${name}a / u${name}b" " = 2"
gdb_test "print/d u${name}a % u${name}b" " = 0"
# scalar with vector
gdb_test "print/d u${name}a + u${name}4b" " = \\{3, 4, 10, 6\\}"
gdb_test "print/d u${name}4a - u${name}b" " = \\{1, 3, 7, 15\\}"
gdb_test "print/d u${name}4a * u${name}b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}a / u${name}4b" " = \\{2, 1, 0, 0\\}"
gdb_test "print/d u${name}4a % u${name}b" " = \\{0, 0, 0, 0\\}"
# vector with vector
gdb_test "print/d u${name}4a + u${name}4b" " = \\{3, 6, 16, 20\\}"
gdb_test "print/d u${name}4a - u${name}4b" " = \\{1, 2, 0, 12\\}"
gdb_test "print/d u${name}4a * u${name}4b" " = \\{2, 8, 64, 64\\}"
gdb_test "print/d u${name}4a / u${name}4b" " = \\{2, 2, 1, 4\\}"
gdb_test "print/d u${name}4a % u${name}4b" " = \\{0, 0, 0, 0\\}"
# scalar
gdb_test "print/d u${name}a++" " = 2"
gdb_test "print/d ++u${name}a" " = 4"
gdb_test "print/d u${name}a--" " = 4"
gdb_test "print/d --u${name}a" " = 2"
gdb_test "print/d +u${name}a" " = 2"
gdb_test "print/x -u${name}a" " = 0x.*fe"
# vector
gdb_test "print/d u${name}4a++" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ++u${name}4a" " = \\{4, 6, 10, 18\\}"
gdb_test "print/d u${name}4a--" " = \\{4, 6, 10, 18\\}"
gdb_test "print/d --u${name}4a" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d +u${name}4a" " = \\{2, 4, 8, 16\\}"
gdb_test "print/x -u${name}4a" " = \\{0x.*fe, 0x.*fc, 0x.*f8, 0x.*f0\\}"
# scalar with scalar
if { ${size} < 4 } {
gdb_test "ptype ${name}a + ${name}b" "type = int"
gdb_test "ptype ${name}a - ${name}b" "type = int"
gdb_test "ptype ${name}a * ${name}b" "type = int"
gdb_test "ptype ${name}a / ${name}b" "type = int"
gdb_test "ptype ${name}a % ${name}b" "type = int"
gdb_test "ptype +${name}a" "type = int"
gdb_test "ptype -${name}a" "type = int"
gdb_test "ptype u${name}a + u${name}b" "type = int"
gdb_test "ptype u${name}a - u${name}b" "type = int"
gdb_test "ptype u${name}a * u${name}b" "type = int"
gdb_test "ptype u${name}a / u${name}b" "type = int"
gdb_test "ptype u${name}a % u${name}b" "type = int"
gdb_test "ptype +u${name}a" "type = int"
gdb_test "ptype -u${name}a" "type = int"
} elseif { ${size} == 4 } {
gdb_test "ptype ${name}a + ${name}b" "type = int"
gdb_test "ptype ${name}a - ${name}b" "type = int"
gdb_test "ptype ${name}a * ${name}b" "type = int"
gdb_test "ptype ${name}a / ${name}b" "type = int"
gdb_test "ptype ${name}a % ${name}b" "type = int"
gdb_test "ptype +${name}a" "type = int"
gdb_test "ptype -${name}a" "type = int"
gdb_test "ptype u${name}a + u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype u${name}a - u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype u${name}a * u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype u${name}a / u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype u${name}a % u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype +u${name}a" "type = (unsigned int|uint)"
gdb_test "ptype -u${name}a" "type = (unsigned int|uint)"
} else { # ${size} == 8
gdb_test "ptype ${name}a + ${name}b" "type = long"
gdb_test "ptype ${name}a - ${name}b" "type = long"
gdb_test "ptype ${name}a * ${name}b" "type = long"
gdb_test "ptype ${name}a / ${name}b" "type = long"
gdb_test "ptype ${name}a % ${name}b" "type = long"
gdb_test "ptype +${name}a" "type = long"
gdb_test "ptype -${name}a" "type = long"
gdb_test "ptype u${name}a + u${name}b" "type = (unsigned long|ulong)"
gdb_test "ptype u${name}a - u${name}b" "type = (unsigned long|ulong)"
gdb_test "ptype u${name}a * u${name}b" "type = (unsigned long|ulong)"
gdb_test "ptype u${name}a / u${name}b" "type = (unsigned long|ulong)"
gdb_test "ptype u${name}a % u${name}b" "type = (unsigned long|ulong)"
# scalar
gdb_test "ptype +u${name}a" "type = (unsigned long|ulong)"
gdb_test "ptype -u${name}a" "type = (unsigned long|ulong)"
}
gdb_test "ptype u${name}a++" "type = (unsigned ${type}|u${type})"
gdb_test "ptype ++u${name}a" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a--" "type = (unsigned ${type}|u${type})"
gdb_test "ptype --u${name}a" "type = (unsigned ${type}|u${type})"
# scalar with vector
gdb_test "ptype ${name}a % ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}a + u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a - u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}a * u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a / u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}a % u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a % ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a + u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a - u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a * u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a / u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a % u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a++" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype ++u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a--" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype --u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype +u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype -u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
}
}
# Relational operators
proc check_relational_ops { name type isfloat size } {
# scalar with scalar
gdb_test "print/d ${name}a > ${name}b" " = 1"
gdb_test "print/d ${name}b < ${name}a" " = 1"
gdb_test "print/d ${name}b >= ${name}a" " = 0"
gdb_test "print/d ${name}a <= ${name}b" " = 0"
# scalar with vector
gdb_test "print/d ${name}4a > ${name}b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d ${name}a < ${name}4b" " = \\{0, 0, -1, -1\\}"
gdb_test "print/d ${name}4a >= ${name}b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d ${name}a <= ${name}4b" " = \\{0, -1, -1, -1\\}"
# vector with vector
gdb_test "print/d ${name}4a > ${name}4b" " = \\{-1, -1, 0, -1\\}"
gdb_test "print/d ${name}4b < ${name}4a" " = \\{-1, -1, 0, -1\\}"
gdb_test "print/d ${name}4b >= ${name}4a" " = \\{0, 0, -1, 0\\}"
gdb_test "print/d ${name}4a <= ${name}4b" " = \\{0, 0, -1, 0\\}"
# result type should be int for scalars
gdb_test "ptype ${name}a < ${name}b" "type = int"
gdb_test "ptype ${name}a > ${name}b" "type = int"
gdb_test "ptype ${name}a <= ${name}b" "type = int"
gdb_test "ptype ${name}a >= ${name}b" "type = int"
if { ${isfloat} } {
if { ${size} == 2 } {
# result type should be short for half precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a > ${name}b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}a < ${name}4b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}4a >= ${name}b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}a <= ${name}4b" "type = short \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a > ${name}4b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}4a < ${name}4b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}4a >= ${name}4b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}4a <= ${name}4b" "type = short \\\[4\\\]"
} elseif { ${size} == 4 } {
# result type should be int for single precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a > ${name}b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}a < ${name}4b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}4a >= ${name}b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}a <= ${name}4b" "type = int \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a > ${name}4b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}4a < ${name}4b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}4a >= ${name}4b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}4a <= ${name}4b" "type = int \\\[4\\\]"
} else { # ${size} == 8
# result type should be long for double precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a > ${name}b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}a < ${name}4b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}4a >= ${name}b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}a <= ${name}4b" "type = long \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a > ${name}4b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}4a < ${name}4b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}4a >= ${name}4b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}4a <= ${name}4b" "type = long \\\[4\\\]"
}
} else {
# scalar with scalar
gdb_test "print/d u${name}a > u${name}b" " = 1"
gdb_test "print/d u${name}b < u${name}a" " = 1"
gdb_test "print/d u${name}b >= u${name}a" " = 0"
gdb_test "print/d u${name}a <= u${name}b" " = 0"
# scalar with vector
gdb_test "print/d u${name}4a > u${name}b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d u${name}a < u${name}4b" " = \\{0, 0, -1, -1\\}"
gdb_test "print/d u${name}4a >= u${name}b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d u${name}a <= u${name}4b" " = \\{0, -1, -1, -1\\}"
# vector with vector
gdb_test "print/d u${name}4a > u${name}4b" " = \\{-1, -1, 0, -1\\}"
gdb_test "print/d u${name}4b < u${name}4a" " = \\{-1, -1, 0, -1\\}"
gdb_test "print/d u${name}4b >= u${name}4a" " = \\{0, 0, -1, 0\\}"
gdb_test "print/d u${name}4a <= u${name}4b" " = \\{0, 0, -1, 0\\}"
# result type for unsigned operands is signed
# scalar with scalar
gdb_test "ptype u${name}a < u${name}b" "type = int"
gdb_test "ptype u${name}a > u${name}b" "type = int"
gdb_test "ptype u${name}a <= u${name}b" "type = int"
gdb_test "ptype u${name}a >= u${name}b" "type = int"
# scalar with vector
gdb_test "ptype u${name}4a > u${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}a < u${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a >= u${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}a <= u${name}4b" "type = ${type} \\\[4\\\]"
# vector with vector
gdb_test "ptype u${name}4a > u${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a < u${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a >= u${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a <= u${name}4b" "type = ${type} \\\[4\\\]"
}
}
# Equality operators
proc check_equality_ops { name type isfloat size } {
# scalar with scalar
gdb_test "print/d ${name}a == ${name}b" " = 0"
gdb_test "print/d ${name}a != ${name}b" " = 1"
# scalar with vector
gdb_test "print/d ${name}4a == ${name}b" " = \\{0, 0, 0, 0\\}"
gdb_test "print/d ${name}a != ${name}4b" " = \\{-1, 0, -1, -1\\}"
# vector with vector
gdb_test "print/d ${name}4a == ${name}4b" " = \\{0, 0, -1, 0\\}"
gdb_test "print/d ${name}4a != ${name}4b" " = \\{-1, -1, 0, -1\\}"
# scalar with scalar
gdb_test "ptype ${name}a == ${name}b" "type = int"
gdb_test "ptype ${name}a != ${name}b" "type = int"
if { ${isfloat} } {
if { ${size} == 2 } {
# result type should be short for half precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a == ${name}b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}a != ${name}4b" "type = short \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a == ${name}4b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}4a != ${name}4b" "type = short \\\[4\\\]"
} elseif { ${size} == 4 } {
# result type should be int for single precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a == ${name}b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}a != ${name}4b" "type = int \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a == ${name}4b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}4a != ${name}4b" "type = int \\\[4\\\]"
} else { # ${size} == 8
# result type should be long for double precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a == ${name}b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}a != ${name}4b" "type = long \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a == ${name}4b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}4a != ${name}4b" "type = long \\\[4\\\]"
}
} else {
# scalar with scalar
gdb_test "print/d u${name}a == u${name}b" " = 0"
gdb_test "print/d u${name}a != u${name}b" " = 1"
# scalar with vector
gdb_test "print/d u${name}4a == u${name}b" " = \\{0, 0, 0, 0\\}"
gdb_test "print/d u${name}a != u${name}4b" " = \\{-1, 0, -1, -1\\}"
# vector with vector
gdb_test "print/d u${name}4a == u${name}4b" " = \\{0, 0, -1, 0\\}"
gdb_test "print/d u${name}4b != u${name}4a" " = \\{-1, -1, 0, -1\\}"
# result type for unsigned operands is signed
# scalar with scalar
gdb_test "ptype u${name}a == u${name}b" "type = int"
gdb_test "ptype u${name}a != u${name}b" "type = int"
# scalar with vector
gdb_test "ptype u${name}4a == u${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}a != u${name}4b" "type = ${type} \\\[4\\\]"
# vector with vector
gdb_test "ptype u${name}4a == u${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a != u${name}4b" "type = ${type} \\\[4\\\]"
}
}
# Shift operators
proc check_shift_ops { name type size } {
# scalar with scalar
gdb_test "print/d ${name}a << ${name}b" " = 4"
gdb_test "print/d ${name}a >> ${name}b" " = 1"
gdb_test "print/d u${name}a << u${name}b" " = 4"
gdb_test "print/d u${name}a >> u${name}b" " = 1"
# scalar with vector
gdb_test "print/d ${name}4a << ${name}b" " = \\{4, 8, 16, 32\\}"
gdb_test "print/d ${name}4a >> ${name}b" " = \\{1, 2, 4, 8\\}"
gdb_test "print/d u${name}4a << u${name}b" " = \\{4, 8, 16, 32\\}"
gdb_test "print/d u${name}4a >> u${name}b" " = \\{1, 2, 4, 8\\}"
# vector with vector
if { ${size} == 1 } {
gdb_test "print/d ${name}4a << ${name}4b" " = \\{4, 16, 0, 0\\}"
gdb_test "print/d u${name}4a << u${name}4b" " = \\{4, 16, 0, 0\\}"
} else {
gdb_test "print/d ${name}4a << ${name}4b" " = \\{4, 16, 2048, 256\\}"
gdb_test "print/d u${name}4a << u${name}4b" " = \\{4, 16, 2048, 256\\}"
}
gdb_test "print/d ${name}4a >> ${name}4b" " = \\{1, 1, 0, 1\\}"
gdb_test "print/d u${name}4a >> u${name}4b" " = \\{1, 1, 0, 1\\}"
# scalar with scalar
if { ${size} < 4 } {
gdb_test "ptype ${name}a << ${name}b" "type = int"
gdb_test "ptype ${name}a >> ${name}b" "type = int"
gdb_test "ptype u${name}a << u${name}b" "type = int"
gdb_test "ptype u${name}a >> u${name}b" "type = int"
} elseif { ${size} == 4 } {
gdb_test "ptype ${name}a << ${name}b" "type = int"
gdb_test "ptype ${name}a >> ${name}b" "type = int"
gdb_test "ptype u${name}a << u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype u${name}a >> u${name}b" "type = (unsigned int|uint)"
} else { # ${size} == 8
gdb_test "ptype ${name}a << ${name}b" "type = long"
gdb_test "ptype ${name}a >> ${name}b" "type = long"
gdb_test "ptype u${name}a << u${name}b" "type = (unsigned long|ulong)"
gdb_test "ptype u${name}a >> u${name}b" "type = (unsigned long|ulong)"
}
# scalar with vector
gdb_test "ptype ${name}4a << ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a >> ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a << u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a >> u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a << ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a >> ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a << u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a >> u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
}
# Bitwise operators
proc check_bitwise_ops { name type size } {
# scalar with scalar
gdb_test "print/d ${name}a & ${name}b" " = 0"
gdb_test "print/d ${name}a | ${name}b" " = 3"
gdb_test "print/d ${name}a ^ ${name}b" " = 3"
gdb_test "print/d u${name}a & u${name}b" " = 0"
gdb_test "print/d u${name}a | u${name}b" " = 3"
gdb_test "print/d u${name}a ^ u${name}b" " = 3"
# scalar with vector
gdb_test "print/d ${name}4a & ${name}b" " = \\{0, 0, 0, 0\\}"
gdb_test "print/d ${name}a | ${name}4b" " = \\{3, 2, 10, 6\\}"
gdb_test "print/d ${name}4a ^ ${name}b" " = \\{3, 5, 9, 17\\}"
gdb_test "print/d u${name}4a & u${name}b" " = \\{0, 0, 0, 0\\}"
gdb_test "print/d u${name}a | u${name}4b" " = \\{3, 2, 10, 6\\}"
gdb_test "print/d u${name}4a ^ u${name}b" " = \\{3, 5, 9, 17\\}"
# vector with vector
gdb_test "print/d ${name}4a & ${name}4b" " = \\{0, 0, 8, 0\\}"
gdb_test "print/d ${name}4a | ${name}4b" " = \\{3, 6, 8, 20\\}"
gdb_test "print/d ${name}4a ^ ${name}4b" " = \\{3, 6, 0, 20\\}"
gdb_test "print/d u${name}4a & u${name}4b" " = \\{0, 0, 8, 0\\}"
gdb_test "print/d u${name}4a | u${name}4b" " = \\{3, 6, 8, 20\\}"
gdb_test "print/d u${name}4a ^ u${name}4b" " = \\{3, 6, 0, 20\\}"
# scalar with scalar
if { ${size} < 4 } {
gdb_test "ptype ${name}a & ${name}b" "type = int"
gdb_test "ptype ${name}a | ${name}b" "type = int"
gdb_test "ptype ${name}a ^ ${name}b" "type = int"
gdb_test "ptype u${name}a & u${name}b" "type = int"
gdb_test "ptype u${name}a | u${name}b" "type = int"
gdb_test "ptype u${name}a ^ u${name}b" "type = int"
} elseif { ${size} == 4 } {
gdb_test "ptype ${name}a & ${name}b" "type = int"
gdb_test "ptype ${name}a | ${name}b" "type = int"
gdb_test "ptype ${name}a ^ ${name}b" "type = int"
gdb_test "ptype u${name}a & u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype u${name}a | u${name}b" "type = (unsigned int|uint)"
gdb_test "ptype u${name}a ^ u${name}b" "type = (unsigned int|uint)"
} else { # ${size} == 8
gdb_test "ptype ${name}a & ${name}b" "type = long"
gdb_test "ptype ${name}a | ${name}b" "type = long"
gdb_test "ptype ${name}a ^ ${name}b" "type = long"
gdb_test "ptype u${name}a & u${name}b" "type = (unsigned long|ulong)"
gdb_test "ptype u${name}a | u${name}b" "type = (unsigned long|ulong)"
gdb_test "ptype u${name}a ^ u${name}b" "type = (unsigned long|ulong)"
}
# scalar with vector
gdb_test "ptype ${name}4a & ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}a | ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a ^ ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a & u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}a | u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a ^ u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a & ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a | ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a ^ ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a & u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a | u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a ^ u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
# scalar
if { ${size} < 8 } {
gdb_test "print/x ~${name}a" " = 0xfffffffd"
gdb_test "print/x ~u${name}a" " = 0xfffffffd"
} else {
gdb_test "print/x ~${name}a" " = 0xfffffffffffffffd"
gdb_test "print/x ~u${name}a" " = 0xfffffffffffffffd"
}
# vector
if { ${size} == 1 } {
gdb_test "print/x ~${name}4a" " = \\{0xfd, 0xfb, 0xf7, 0xef\\}"
gdb_test "print/x ~u${name}4a" " = \\{0xfd, 0xfb, 0xf7, 0xef\\}"
} elseif { ${size} == 2 } {
gdb_test "print/x ~${name}4a" " = \\{0xfffd, 0xfffb, 0xfff7, 0xffef\\}"
gdb_test "print/x ~u${name}4a" " = \\{0xfffd, 0xfffb, 0xfff7, 0xffef\\}"
} elseif { ${size} == 4 } {
gdb_test "print/x ~${name}4a" " = \\{0xfffffffd, 0xfffffffb, 0xfffffff7, 0xffffffef\\}"
gdb_test "print/x ~u${name}4a" " = \\{0xfffffffd, 0xfffffffb, 0xfffffff7, 0xffffffef\\}"
} else { # ${size} == 8
gdb_test "print/x ~${name}4a" " = \\{0xfffffffffffffffd, 0xfffffffffffffffb, 0xfffffffffffffff7, 0xffffffffffffffef\\}"
gdb_test "print/x ~u${name}4a" " = \\{0xfffffffffffffffd, 0xfffffffffffffffb, 0xfffffffffffffff7, 0xffffffffffffffef\\}"
}
# scalar
if { ${size} < 4 } {
gdb_test "ptype ~${name}a" "type = int"
gdb_test "ptype ~u${name}a" "type = int"
} elseif { ${size} == 4 } {
gdb_test "ptype ~${name}a" "type = int"
gdb_test "ptype ~u${name}a" "type = (unsigned int|uint)"
} else { # ${size} == 8
gdb_test "ptype ~${name}a" "type = long"
gdb_test "ptype ~u${name}a" "type = (unsigned long|ulong)"
}
# vector
gdb_test "ptype ~${name}4a" "type = ${type} \\\[4\\\]"
gdb_test "ptype ~u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
}
# Logical operators
proc check_logical_ops { name type isfloat size } {
# scalar
gdb_test "print/d !${name}a " " = 0"
gdb_test "print/d !!${name}a " " = 1"
# vector
gdb_test "print/d !${name}4a " " = \\{0, 0, 0, 0\\}"
gdb_test "print/d !!${name}4a " " = \\{-1, -1, -1, -1\\}"
# scalar with scalar
gdb_test "print/d ${name}a && ${name}b" " = 1"
gdb_test "print/d ${name}a && !${name}b" " = 0"
gdb_test "print/d ${name}a || ${name}b" " = 1"
gdb_test "print/d ${name}a || !${name}b" " = 1"
gdb_test "print/d !${name}a || !${name}b" " = 0"
# scalar with vector
gdb_test "print/d ${name}4a && ${name}b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d ${name}4a && !${name}b" " = \\{0, 0, 0, 0\\}"
gdb_test "print/d ${name}a || ${name}4b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d ${name}a || !${name}4b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d !${name}4a || !${name}b" " = \\{0, 0, 0, 0\\}"
# vector with vector
gdb_test "print/d ${name}4a && ${name}4b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d ${name}4a || ${name}4b" " = \\{-1, -1, -1, -1\\}"
# result type should be int for scalars
gdb_test "ptype !${name}a" "type = int"
gdb_test "ptype ${name}a && ${name}b" "type = int"
gdb_test "ptype ${name}a || ${name}b" "type = int"
if { ${isfloat} } {
if { ${size} == 2 } {
# result type should be short for half precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a && ${name}b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}a || ${name}4b" "type = short \\\[4\\\]"
# vector with vector
gdb_test "ptype !${name}4a" "type = short \\\[4\\\]"
gdb_test "ptype ${name}4a && ${name}4b" "type = short \\\[4\\\]"
gdb_test "ptype ${name}4a || ${name}4b" "type = short \\\[4\\\]"
} elseif { ${size} == 4 } {
# result type should be int for single precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a && ${name}b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}a || ${name}4b" "type = int \\\[4\\\]"
# vector with vector
gdb_test "ptype !${name}4a" "type = int \\\[4\\\]"
gdb_test "ptype ${name}4a && ${name}4b" "type = int \\\[4\\\]"
gdb_test "ptype ${name}4a || ${name}4b" "type = int \\\[4\\\]"
} else { # ${size} == 8
# result type should be long for double precision floating point vectors
# scalar with vector
gdb_test "ptype ${name}4a && ${name}b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}a || ${name}4b" "type = long \\\[4\\\]"
# vector with vector
gdb_test "ptype !${name}4a" "type = long \\\[4\\\]"
gdb_test "ptype ${name}4a && ${name}4b" "type = long \\\[4\\\]"
gdb_test "ptype ${name}4a || ${name}4b" "type = long \\\[4\\\]"
}
} else {
# unsigned scalar
gdb_test "print/d !u${name}a " " = 0"
gdb_test "print/d !!u${name}a " " = 1"
# unsigned vector
gdb_test "print/d !u${name}4a " " = \\{0, 0, 0, 0\\}"
gdb_test "print/d !!u${name}4a " " = \\{-1, -1, -1, -1\\}"
# scalar with scalar
gdb_test "print/d u${name}a && u${name}b" " = 1"
gdb_test "print/d u${name}a || u${name}b" " = 1"
# scalar with vector
gdb_test "print/d u${name}4a && u${name}b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d u${name}a || u${name}4b" " = \\{-1, -1, -1, -1\\}"
# vector with vector
gdb_test "print/d u${name}4a && u${name}4b" " = \\{-1, -1, -1, -1\\}"
gdb_test "print/d u${name}4a || u${name}4b" " = \\{-1, -1, -1, -1\\}"
# scalar
gdb_test "ptype !u${name}a" "type = int"
# vector
gdb_test "ptype !${name}4a" "type = ${type} \\\[4\\\]"
gdb_test "ptype !u${name}4a" "type = ${type} \\\[4\\\]"
# scalar with vector
gdb_test "ptype ${name}4a && ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}a || ${name}4b" "type = ${type} \\\[4\\\]"
# result type for unsigned vector operand is signed
gdb_test "ptype u${name}4a && u${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}a || u${name}4b" "type = ${type} \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a && ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a || ${name}4b" "type = ${type} \\\[4\\\]"
# result type for unsigned vector operand is signed
gdb_test "ptype u${name}4a && u${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype u${name}4a || u${name}4b" "type = ${type} \\\[4\\\]"
}
}
# Conditional operator
proc check_conditional_op { name type isfloat } {
# scalar with scalar
gdb_test "print/d ${name}a ? ${name}b : ${name}a" " = 1"
gdb_test "print/d !${name}a ? ${name}b : ${name}a" " = 2"
# scalar with vector
gdb_test "print/d ${name}4a ? ${name}4b : ${name}a" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d ${name}4a ? ${name}b : ${name}4a" " = \\{1, 1, 1, 1\\}"
gdb_test "print/d ${name}4a > 4 ? 1 : ${name}4a" " = \\{2, 4, 1, 1\\}"
gdb_test "print/d ${name}4a > 4 ? ${name}4b : ${name}a" " = \\{2, 2, 8, 4\\}"
# vector with vector
gdb_test "print/d ${name}4a ? ${name}4b : ${name}4a" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d ${name}4a > 4 ? ${name}4b : ${name}4a" " = \\{2, 4, 8, 4\\}"
# scalar with scalar
gdb_test "ptype ${name}a ? ${name}b : ${name}a" "type = ${type}"
# scalar with vector
gdb_test "ptype ${name}4a ? ${name}4b : ${name}a" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a ? ${name}b : ${name}4a" "type = ${type} \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a ? ${name}4b : ${name}4a" "type = ${type} \\\[4\\\]"
if { !${isfloat} } {
# scalar with scalar
gdb_test "print/d u${name}a ? u${name}b : u${name}a" " = 1"
gdb_test "print/d !u${name}a ? u${name}b : u${name}a" " = 2"
# scalar with vector
gdb_test "print/d u${name}4a ? u${name}4b : u${name}a" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d u${name}4a ? u${name}b : u${name}4a" " = \\{1, 1, 1, 1\\}"
gdb_test "print/d u${name}4a > 4 ? 1 : u${name}4a" " = \\{2, 4, 1, 1\\}"
gdb_test "print/d u${name}4a > 4 ? u${name}4b : u${name}a" " = \\{2, 2, 8, 4\\}"
# vector with vector
gdb_test "print/d u${name}4a ? u${name}4b : u${name}4a" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d u${name}4a > 4 ? u${name}4b : u${name}4a" " = \\{2, 4, 8, 4\\}"
# scalar with scalar
gdb_test "ptype u${name}a ? u${name}b : u${name}a" "type = (unsigned ${type}|u${type})"
# scalar with vector
gdb_test "ptype u${name}4a ? u${name}4b : u${name}a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a ? u${name}b : u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
# vector with vector
gdb_test "ptype u${name}4a ? u${name}4b : u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
}
}
# Assignment operators
proc check_assignment_ops { name type isfloat size } {
# scalar with scalar
gdb_test "print/d ${name}a = ${name}b" " = 1"
gdb_test "print/d ${name}a = 2" " = 2"
gdb_test "print/d ${name}a += ${name}b" " = 3"
gdb_test "print/d ${name}a -= ${name}b" " = 2"
gdb_test "print/d ${name}b *= ${name}a" " = 2"
gdb_test "print/d ${name}b /= ${name}a" " = 1"
# scalar with vector
gdb_test "print/d ${name}4a = ${name}b" " = \\{1, 1, 1, 1\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4a += ${name}b" " = \\{3, 5, 9, 17\\}"
gdb_test "print/d ${name}4a -= ${name}b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4b *= ${name}a" " = \\{2, 4, 16, 8\\}"
gdb_test "print/d ${name}4b /= ${name}a" " = \\{1, 2, 8, 4\\}"
# vector with vector
gdb_test "print/d ${name}4a = ${name}4b" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4a += ${name}4b" " = \\{3, 6, 16, 20\\}"
gdb_test "print/d ${name}4a -= ${name}4b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4b *= ${name}4a" " = \\{2, 8, 64, 64\\}"
gdb_test "print/d ${name}4b /= ${name}4a" " = \\{1, 2, 8, 4\\}"
# scalar with scalar
gdb_test "ptype ${name}a = ${name}b" "type = ${type}"
gdb_test "ptype ${name}a += ${name}b" "type = ${type}"
gdb_test "ptype ${name}a -= ${name}b" "type = ${type}"
gdb_test "ptype ${name}a *= ${name}b" "type = ${type}"
gdb_test "ptype ${name}a /= ${name}b" "type = ${type}"
# scalar with vector
gdb_test "ptype ${name}4a = ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a += ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a -= ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4b *= ${name}a" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4b /= ${name}a" "type = ${type} \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a = ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a += ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a -= ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4b *= ${name}4a" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4b /= ${name}4a" "type = ${type} \\\[4\\\]"
if { !${isfloat} } {
# scalar with scalar
gdb_test "print/d ${name}a %= ${name}b" " = 0"
gdb_test "print/d ${name}a = 2" " = 2"
gdb_test "print/d ${name}a <<= ${name}b" " = 4"
gdb_test "print/d ${name}a = 2" " = 2"
gdb_test "print/d ${name}a >>= ${name}b" " = 1"
gdb_test "print/d ${name}a = 2" " = 2"
gdb_test "print/d ${name}a &= ${name}b" " = 0"
gdb_test "print/d ${name}a = 2" " = 2"
gdb_test "print/d ${name}a |= ${name}b" " = 3"
gdb_test "print/d ${name}a = 2" " = 2"
gdb_test "print/d ${name}a ^= ${name}b" " = 3"
gdb_test "print/d ${name}a = 2" " = 2"
# scalar with vector
gdb_test "print/d ${name}4b %= ${name}a" " = \\{1, 0, 0, 0\\}"
gdb_test "print/d ${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d ${name}4a <<= ${name}b" " = \\{4, 8, 16, 32\\}"
gdb_test "print/d ${name}4a >>= ${name}b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4a &= ${name}b" " = \\{0, 0, 0, 0\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4a |= ${name}b" " = \\{3, 5, 9, 17\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4a ^= ${name}b" " = \\{3, 5, 9, 17\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
# vector with vector
gdb_test "print/d ${name}4b %= ${name}4a" " = \\{1, 2, 0, 4\\}"
gdb_test "print/d ${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
if { ${size} == 1 } {
gdb_test "print/d ${name}4a <<= ${name}4b" " = \\{4, 16, 0, 0\\}"
gdb_test "print/d ${name}4a >>= ${name}4b" " = \\{2, 4, 0, 0\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
} else {
gdb_test "print/d ${name}4a <<= ${name}4b" " = \\{4, 16, 2048, 256\\}"
gdb_test "print/d ${name}4a >>= ${name}4b" " = \\{2, 4, 8, 16\\}"
}
gdb_test "print/d ${name}4a &= ${name}4b" " = \\{0, 0, 8, 0\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4a |= ${name}4b" " = \\{3, 6, 8, 20\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d ${name}4a ^= ${name}4b" " = \\{3, 6, 0, 20\\}"
gdb_test "print/d ${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
# scalar with scalar
gdb_test "ptype ${name}a %= ${name}b" "type = ${type}"
gdb_test "ptype ${name}a <<= ${name}b" "type = ${type}"
gdb_test "ptype ${name}a >>= ${name}b" "type = ${type}"
gdb_test "ptype ${name}a &= ${name}b" "type = ${type}"
gdb_test "ptype ${name}a |= ${name}b" "type = ${type}"
gdb_test "ptype ${name}a ^= ${name}b" "type = ${type}"
# scalar with vector
gdb_test "ptype ${name}4a %= ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a <<= ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a >>= ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a &= ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a |= ${name}b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a ^= ${name}b" "type = ${type} \\\[4\\\]"
# vector with vector
gdb_test "ptype ${name}4a %= ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a <<= ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a >>= ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a &= ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a |= ${name}4b" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}4a ^= ${name}4b" "type = ${type} \\\[4\\\]"
# scalar with scalar
gdb_test "print/d u${name}a = u${name}b" " = 1"
gdb_test "print/d u${name}a = 2" " = 2"
gdb_test "print/d u${name}a += u${name}b" " = 3"
gdb_test "print/d u${name}a -= u${name}b" " = 2"
gdb_test "print/d u${name}b *= u${name}a" " = 2"
gdb_test "print/d u${name}b /= u${name}a" " = 1"
gdb_test "print/d u${name}a %= u${name}b" " = 0"
gdb_test "print/d u${name}a = 2" " = 2"
gdb_test "print/d u${name}a <<= u${name}b" " = 4"
gdb_test "print/d u${name}a = 2" " = 2"
gdb_test "print/d u${name}a >>= u${name}b" " = 1"
gdb_test "print/d u${name}a = 2" " = 2"
gdb_test "print/d u${name}a &= u${name}b" " = 0"
gdb_test "print/d u${name}a = 2" " = 2"
gdb_test "print/d u${name}a |= u${name}b" " = 3"
gdb_test "print/d u${name}a = 2" " = 2"
gdb_test "print/d u${name}a ^= u${name}b" " = 3"
gdb_test "print/d u${name}a = 2" " = 2"
# scalar with vector
gdb_test "print/d u${name}4a = u${name}b" " = \\{1, 1, 1, 1\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4a += u${name}b" " = \\{3, 5, 9, 17\\}"
gdb_test "print/d u${name}4a -= u${name}b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4b *= u${name}a" " = \\{2, 4, 16, 8\\}"
gdb_test "print/d u${name}4b /= u${name}a" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d u${name}4b %= u${name}a" " = \\{1, 0, 0, 0\\}"
gdb_test "print/d u${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d u${name}4a <<= u${name}b" " = \\{4, 8, 16, 32\\}"
gdb_test "print/d u${name}4a >>= u${name}b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4a &= u${name}b" " = \\{0, 0, 0, 0\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4a |= u${name}b" " = \\{3, 5, 9, 17\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4a ^= u${name}b" " = \\{3, 5, 9, 17\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
# vector with vector
gdb_test "print/d u${name}4a = u${name}4b" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4a += u${name}4b" " = \\{3, 6, 16, 20\\}"
gdb_test "print/d u${name}4a -= u${name}4b" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4b *= u${name}4a" " = \\{2, 8, 64, 64\\}"
gdb_test "print/d u${name}4b /= u${name}4a" " = \\{1, 2, 8, 4\\}"
gdb_test "print/d u${name}4b %= u${name}4a" " = \\{1, 2, 0, 4\\}"
gdb_test "print/d u${name}4b = \{1, 2, 8, 4\}" " = \\{1, 2, 8, 4\\}"
if { ${size} == 1 } {
gdb_test "print/d u${name}4a <<= u${name}4b" " = \\{4, 16, 0, 0\\}"
gdb_test "print/d u${name}4a >>= u${name}4b" " = \\{2, 4, 0, 0\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
} else {
gdb_test "print/d u${name}4a <<= u${name}4b" " = \\{4, 16, 2048, 256\\}"
gdb_test "print/d u${name}4a >>= u${name}4b" " = \\{2, 4, 8, 16\\}"
}
gdb_test "print/d u${name}4a &= u${name}4b" " = \\{0, 0, 8, 0\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4a |= u${name}4b" " = \\{3, 6, 8, 20\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
gdb_test "print/d u${name}4a ^= u${name}4b" " = \\{3, 6, 0, 20\\}"
gdb_test "print/d u${name}4a = \{2, 4, 8, 16\}" " = \\{2, 4, 8, 16\\}"
# scalar with scalar
gdb_test "ptype u${name}a = u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a += u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a -= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a *= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a /= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a %= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a <<= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a >>= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a &= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a |= u${name}b" "type = (unsigned ${type}|u${type})"
gdb_test "ptype u${name}a ^= u${name}b" "type = (unsigned ${type}|u${type})"
# scalar with vector
gdb_test "ptype u${name}4a = u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a += u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a -= u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4b *= u${name}a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4b /= u${name}a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a %= u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a <<= u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a >>= u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a &= u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a |= u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a ^= u${name}b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
# vector with vector
gdb_test "ptype u${name}4a = u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a += u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a -= u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4b *= u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4b /= u${name}4a" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a %= u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a <<= u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a >>= u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a &= u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a |= u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
gdb_test "ptype u${name}4a ^= u${name}4b" "type = (unsigned ${type}|u${type}) \\\[4\\\]"
}
}
proc do_check { name type isfloat size } {
check_basic ${name} ${type} ${isfloat}
check_arithmetic_ops ${name} ${type} ${isfloat} ${size}
check_relational_ops ${name} ${type} ${isfloat} ${size}
check_equality_ops ${name} ${type} ${isfloat} ${size}
if { !${isfloat} } {
check_shift_ops ${name} ${type} ${size}
check_bitwise_ops ${name} ${type} ${size}
}
check_logical_ops ${name} ${type} ${isfloat} ${size}
check_conditional_op ${name} ${type} ${isfloat}
check_assignment_ops ${name} ${type} ${isfloat} ${size}
}
do_check "c" "char" 0 1
do_check "s" "short" 0 2
do_check "i" "int" 0 4
do_check "l" "long" 0 8
if { ${have_cl_khr_fp16} } {
do_check "h" "half" 1 2
}
do_check "f" "float" 1 4
if { ${have_cl_khr_fp64} } {
do_check "d" "double" 1 8
}
# Delete the OpenCL program source
remote_file target delete ${clprogram}

View File

@ -0,0 +1,59 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com> */
int opencl_version = __OPENCL_VERSION__;
#ifdef HAVE_cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
int have_cl_khr_fp64 = 1;
#else
int have_cl_khr_fp64 = 0;
#endif
#ifdef HAVE_cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
int have_cl_khr_fp16 = 1;
#else
int have_cl_khr_fp16 = 0;
#endif
#define CREATE_VEC(TYPE, NAME)\
TYPE NAME =\
(TYPE) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
CREATE_VEC(char16, c16)
CREATE_VEC(uchar16, uc16)
CREATE_VEC(short16, s16)
CREATE_VEC(ushort16, us16)
CREATE_VEC(int16, i16)
CREATE_VEC(uint16, ui16)
CREATE_VEC(long16, l16)
CREATE_VEC(ulong16, ul16)
#ifdef cl_khr_fp16
CREATE_VEC(half16, h16)
#endif
CREATE_VEC(float16, f16)
#ifdef cl_khr_fp64
CREATE_VEC(double16, d16)
#endif
__kernel void testkernel (__global int *data)
{
data[get_global_id(0)] = 1;
}

View File

@ -0,0 +1,390 @@
# Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com>.
#
# Tests component access of OpenCL vectors.
if $tracelevel {
strace $tracelevel
}
load_lib opencl.exp
if { [skip_opencl_tests] } {
return 0
}
set testfile "vec_comps"
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
}
# Load the OpenCL app
clean_restart ${testfile}
# Set breakpoint at the OpenCL kernel
gdb_test_multiple "break testkernel" "set pending breakpoint" {
-re ".*Function \"testkernel\" not defined.*Make breakpoint pending.*y or \\\[n\\\]. $" {
gdb_test "y" "Breakpoint.*testkernel.*pending." "set pending breakpoint (without symbols)"
}
}
gdb_run_cmd
gdb_test "" ".*Breakpoint.*1.*testkernel.*" "run"
# Check if the language was switched to opencl
gdb_test "show language" "The current source language is \"auto; currently opencl\"\."
# 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]
# Sanity checks
proc check_basic { name type size } {
gdb_test "ptype ${name}" "type = ${type} \\\[16\\\]"
gdb_test "p sizeof(${name})" " = [expr ${size} * 16]"
gdb_test "print/d ${name}" " = \\{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\\}"
}
proc check_type { name type alttype } {
gdb_test "whatis ${name}.lo" "type = ${type}8"
gdb_test "whatis ${name}.hi" "type = ${type}8"
gdb_test "whatis ${name}.even" "type = ${type}8"
gdb_test "whatis ${name}.odd" "type = ${type}8"
gdb_test "whatis ${name}.low" "Invalid OpenCL vector component accessor low"
gdb_test "whatis ${name}.high" "Invalid OpenCL vector component accessor high"
gdb_test "whatis ${name}.hi.even" "type = ${type}4"
gdb_test "whatis ${name}.odd.odd.lo" "type = ${type}2"
gdb_test "whatis ${name}.even.hi.lo.odd" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.x" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.y" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.z" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.w" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.v" "Invalid OpenCL vector component accessor v"
gdb_test "whatis ${name}.xy" "type = ${type}2"
gdb_test "whatis ${name}.xx" "type = ${type}2"
gdb_test "whatis ${name}.wy" "type = ${type}2"
gdb_test "whatis ${name}.zv" "Invalid OpenCL vector component accessor zv"
gdb_test "whatis ${name}.xyz" "type = ${type}3"
gdb_test "whatis ${name}.yxy" "type = ${type}3"
gdb_test "whatis ${name}.yzx" "type = ${type}3"
gdb_test "whatis ${name}.yzv" "Invalid OpenCL vector component accessor yzv"
gdb_test "whatis ${name}.xywz" "type = ${type}4"
gdb_test "whatis ${name}.zzyy" "type = ${type}4"
gdb_test "whatis ${name}.wwww" "type = ${type}4"
gdb_test "whatis ${name}.yxwv" "Invalid OpenCL vector component accessor yxwv"
gdb_test "whatis ${name}.zyxwv" "Invalid OpenCL vector component accessor zyxwv"
gdb_test "whatis ${name}.xy.x" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.wzyx.yy" "type = ${type}2"
gdb_test "whatis ${name}.wzyx.yx.x" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.xyzw.w" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.xy.z" "Invalid OpenCL vector component accessor z"
gdb_test "whatis ${name}.s0" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.s9" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.sa" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.sf" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.sF" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.sg" "Invalid OpenCL vector component accessor sg"
gdb_test "whatis ${name}.sG" "Invalid OpenCL vector component accessor sG"
gdb_test "whatis ${name}.Sg" "Invalid OpenCL vector component accessor Sg"
gdb_test "whatis ${name}.SG" "Invalid OpenCL vector component accessor SG"
gdb_test "whatis ${name}.s01" "type = ${type}2"
gdb_test "whatis ${name}.s00" "type = ${type}2"
gdb_test "whatis ${name}.sF0" "type = ${type}2"
gdb_test "whatis ${name}.S42" "type = ${type}2"
gdb_test "whatis ${name}.s567" "type = ${type}3"
gdb_test "whatis ${name}.S333" "type = ${type}3"
gdb_test "whatis ${name}.Sf0A" "type = ${type}3"
gdb_test "whatis ${name}.SB1D" "type = ${type}3"
gdb_test "whatis ${name}.s01g" "Invalid OpenCL vector component accessor s01g"
gdb_test "whatis ${name}.s9876" "type = ${type}4"
gdb_test "whatis ${name}.sFFFF" "type = ${type}4"
gdb_test "whatis ${name}.sCafe" "type = ${type}4"
gdb_test "whatis ${name}.Sf001" "type = ${type}4"
gdb_test "whatis ${name}.s1fg2" "Invalid OpenCL vector component accessor s1fg2"
gdb_test "whatis ${name}.s012345" "Invalid OpenCL vector component accessor s012345"
gdb_test "whatis ${name}.s00000000" "type = ${type}8"
gdb_test "whatis ${name}.s00224466" "type = ${type}8"
gdb_test "whatis ${name}.sDEADBEEF" "type = ${type}8"
gdb_test "whatis ${name}.Sa628c193" "type = ${type}8"
gdb_test "whatis ${name}.s876543210" "Invalid OpenCL vector component accessor s876543210"
gdb_test "whatis ${name}.s0123456789abcde" "Invalid OpenCL vector component accessor s0123456789abcde"
gdb_test "whatis ${name}.s0123456789aBcDeF" "type = ${type}16"
gdb_test "whatis ${name}.s0022446688AACCFF" "type = ${type}16"
gdb_test "whatis ${name}.S0123456776543210" "type = ${type}16"
gdb_test "whatis ${name}.sFEDCBA9876543210" "type = ${type}16"
gdb_test "whatis ${name}.sfedcba98.S0246" "type = ${type}4"
gdb_test "whatis ${name}.sfedcba98.S0246.s13" "type = ${type}2"
gdb_test "whatis ${name}.sfedcba98.S0246.s13.s0" "type = ${alttype}|${type}"
gdb_test "whatis ${name}.s0123456789abcdef.s22" "type = ${type}2"
gdb_test "whatis ${name}.hi.s7654.wx" "type = ${type}2"
gdb_test "whatis ${name}.s0123456789abcdef.even.lo" "type = ${type}4"
gdb_test "whatis ${name}.odd.xyzw.s23" "type = ${type}2"
gdb_test "whatis ${name}.xyzw.hi.odd" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.lo" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.hi" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.even" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.odd" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.hi.even" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.odd.odd.lo" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.even.hi.lo.odd" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.x" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.y" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.z" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.w" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.xy" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.xx" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.wy" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.xyz" "type = ${type} \\\[3\\\]"
gdb_test "ptype ${name}.yxy" "type = ${type} \\\[3\\\]"
gdb_test "ptype ${name}.yzx" "type = ${type} \\\[3\\\]"
gdb_test "ptype ${name}.xywz" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.zzyy" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.wwww" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.xy.x" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.wzyx.yy" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.wzyx.yx.x" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.xyzw.w" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.s0" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.s9" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.sa" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.sf" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.sF" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.s01" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.s00" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.sF0" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.S42" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.s567" "type = ${type} \\\[3\\\]"
gdb_test "ptype ${name}.S333" "type = ${type} \\\[3\\\]"
gdb_test "ptype ${name}.Sf0A" "type = ${type} \\\[3\\\]"
gdb_test "ptype ${name}.SB1D" "type = ${type} \\\[3\\\]"
gdb_test "ptype ${name}.s9876" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.sFFFF" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.sCafe" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.Sf001" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.s00000000" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.s00224466" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.sDEADBEEF" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.Sa628c193" "type = ${type} \\\[8\\\]"
gdb_test "ptype ${name}.s0123456789aBcDeF" "type = ${type} \\\[16\\\]"
gdb_test "ptype ${name}.s0022446688AACCFF" "type = ${type} \\\[16\\\]"
gdb_test "ptype ${name}.S0123456776543210" "type = ${type} \\\[16\\\]"
gdb_test "ptype ${name}.sFEDCBA9876543210" "type = ${type} \\\[16\\\]"
gdb_test "ptype ${name}.sfedcba98.S0246" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.sfedcba98.S0246.s13" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.sfedcba98.S0246.s13.s0" "type = ${alttype}|${type}"
gdb_test "ptype ${name}.s0123456789abcdef.s22" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.hi.s7654.wx" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.s0123456789abcdef.even.lo" "type = ${type} \\\[4\\\]"
gdb_test "ptype ${name}.odd.xyzw.s23" "type = ${type} \\\[2\\\]"
gdb_test "ptype ${name}.xyzw.hi.odd" "type = ${alttype}|${type}"
}
proc check_sizeof { name size } {
gdb_test "print sizeof (${name}.lo)" " = [expr $size * 8]"
gdb_test "print sizeof (${name}.hi)" " = [expr $size * 8]"
gdb_test "print sizeof (${name}.even)" " = [expr $size * 8]"
gdb_test "print sizeof (${name}.odd)" " = [expr $size * 8]"
gdb_test "print sizeof (${name}.hi.even)" " = [expr $size * 4]"
gdb_test "print sizeof (${name}.odd.odd.lo)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.even.hi.lo.odd)" " = $size"
gdb_test "print sizeof (${name}.x)" " = $size"
gdb_test "print sizeof (${name}.xy)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.xyz)" " = [expr $size * 4]"
gdb_test "print sizeof (${name}.xyzw)" " = [expr $size * 4]"
gdb_test "print sizeof (${name}.xy.x)" " = $size"
gdb_test "print sizeof (${name}.wzyx.yy)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.wzyx.yx.x)" " = $size"
gdb_test "print sizeof (${name}.xyzw.w)" " = $size"
gdb_test "print sizeof (${name}.s0)" " = $size"
gdb_test "print sizeof (${name}.s01)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.s012)" " = [expr $size * 4]"
gdb_test "print sizeof (${name}.s0123)" " = [expr $size * 4]"
gdb_test "print sizeof (${name}.s01234567)" " = [expr $size * 8]"
gdb_test "print sizeof (${name}.s0123456789abcdef)" " = [expr $size * 16]"
gdb_test "print sizeof (${name}.sfedcba98.S0246)" " = [expr $size * 4]"
gdb_test "print sizeof (${name}.sfedcba98.S0246.s13)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.sfedcba98.S0246.s13.s0)" " = $size"
gdb_test "print sizeof (${name}.s0123456789abcdef.s22)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.hi.s7654.wx)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.s0123456789abcdef.even.lo)" " = [expr $size * 4]"
gdb_test "print sizeof (${name}.odd.xyzw.s23)" " = [expr $size * 2]"
gdb_test "print sizeof (${name}.xyzw.hi.odd)" " = $size"
}
# OpenCL vector component access
proc check_access { name type } {
gdb_test "print/d ${name}.lo" " = \\{0, 1, 2, 3, 4, 5, 6, 7\\}"
gdb_test "print/d ${name}.hi" " = \\{8, 9, 10, 11, 12, 13, 14, 15\\}"
gdb_test "print/d ${name}.even" " = \\{0, 2, 4, 6, 8, 10, 12, 14\\}"
gdb_test "print/d ${name}.odd" " = \\{1, 3, 5, 7, 9, 11, 13, 15\\}"
gdb_test "print/d ${name}.hi.even" " = \\{8, 10, 12, 14\\}"
gdb_test "print/d ${name}.odd.odd.lo" " = \\{3, 7\\}"
gdb_test "print/d ${name}.even.hi.lo.odd" " = 10"
gdb_test "print/d ${name}.x" " = 0"
gdb_test "print/d ${name}.y" " = 1"
gdb_test "print/d ${name}.z" " = 2"
gdb_test "print/d ${name}.w" " = 3"
gdb_test "print/d ${name}.xy" " = \\{0, 1\\}"
gdb_test "print/d ${name}.xx" " = \\{0, 0\\}"
gdb_test "print/d ${name}.wy" " = \\{3, 1\\}"
gdb_test "print/d ${name}.xyz" " = \\{0, 1, 2\\}"
gdb_test "print/d ${name}.yxy" " = \\{1, 0, 1\\}"
gdb_test "print/d ${name}.yzx" " = \\{1, 2, 0\\}"
gdb_test "print/d ${name}.xywz" " = \\{0, 1, 3, 2\\}"
gdb_test "print/d ${name}.zzyy" " = \\{2, 2, 1, 1\\}"
gdb_test "print/d ${name}.wwww" " = \\{3, 3, 3, 3\\}"
gdb_test "print/d ${name}.xy.x" " = 0"
gdb_test "print/d ${name}.wzyx.yy" " = \\{2, 2\\}"
gdb_test "print/d ${name}.wzyx.yx.x" " = 2"
gdb_test "print/d ${name}.xyzw.w" " = 3"
for {set i 0} {$i < 16} {incr i} {
gdb_test "print/d ${name}.s[format "%x" $i]" " = $i"
gdb_test "print/d ${name}.S[format "%x" $i]" " = $i"
if {$i > 9} {
gdb_test "print/d ${name}.s[format "%X" $i]" " = $i"
gdb_test "print/d ${name}.S[format "%X" $i]" " = $i"
}
}
gdb_test "print/d ${name}.s01" " = \\{0, 1\\}"
gdb_test "print/d ${name}.s00" " = \\{0, 0\\}"
gdb_test "print/d ${name}.sF0" " = \\{15, 0\\}"
gdb_test "print/d ${name}.S42" " = \\{4, 2\\}"
gdb_test "print/d ${name}.s567" " = \\{5, 6, 7\\}"
gdb_test "print/d ${name}.S333" " = \\{3, 3, 3\\}"
gdb_test "print/d ${name}.Sf0A" " = \\{15, 0, 10\\}"
gdb_test "print/d ${name}.SB1D" " = \\{11, 1, 13\\}"
gdb_test "print/d ${name}.s9876" " = \\{9, 8, 7, 6\\}"
gdb_test "print/d ${name}.sFFFF" " = \\{15, 15, 15, 15\\}"
gdb_test "print/d ${name}.sCafe" " = \\{12, 10, 15, 14\\}"
gdb_test "print/d ${name}.Sf001" " = \\{15, 0, 0, 1\\}"
gdb_test "print/d ${name}.s00000000" " = \\{0, 0, 0, 0, 0, 0, 0, 0\\}"
gdb_test "print/d ${name}.s00224466" " = \\{0, 0, 2, 2, 4, 4, 6, 6\\}"
gdb_test "print/d ${name}.sDEADBEEF" " = \\{13, 14, 10, 13, 11, 14, 14, 15\\}"
gdb_test "print/d ${name}.Sa628c193" " = \\{10, 6, 2, 8, 12, 1, 9, 3\\}"
gdb_test "print/d ${name}.s0123456789aBcDeF" " = \\{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\\}"
gdb_test "print/d ${name}.s0022446688AACCEE" " = \\{0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14\\}"
gdb_test "print/d ${name}.S0123456776543210" " = \\{0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0\\}"
gdb_test "print/d ${name}.sFEDCBA9876543210" " = \\{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0\\}"
gdb_test "print/d ${name}.sfedcba98.S0246" " = \\{15, 13, 11, 9\\}"
gdb_test "print/d ${name}.sfedcba98.S0246.s13" " = \\{13, 9\\}"
gdb_test "print/d ${name}.sfedcba98.S0246.s13.s0" " = 13"
gdb_test "print/d ${name}.s0123456789abcdef.s22" " = \\{2, 2\\}"
gdb_test "print/d ${name}.hi.s7654.wx" " = \\{12, 15\\}"
gdb_test "print/d ${name}.s0123456789abcdef.even.lo" " = \\{0, 2, 4, 6\\}"
gdb_test "print/d ${name}.odd.xyzw.s23" " = \\{5, 7\\}"
gdb_test "print/d ${name}.xyzw.hi.odd" " = 3"
# lvalue tests
for {set i 0} {$i < 16} {incr i} {
gdb_test_no_output "set variable ${name}.s[format "%x" $i] = [expr 15 - $i]"
gdb_test "print/d ${name}.s[format "%x" $i]" " = [expr 15 - $i]"
}
gdb_test "print/d ${name}" " = \\{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0\\}"
gdb_test_no_output "set variable ${name}.s02468ace = ${name}.s13579bdf"
gdb_test "print/d ${name}" " = \\{14, 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 0\\}"
gdb_test_no_output "set variable ${name}.wzyx = ${name}.even.odd"
gdb_test "print/d ${name}" " = \\{0, 4, 8, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 0\\}"
gdb_test_no_output "set variable ${name}.odd.lo = ${name}.hi.even"
gdb_test "print/d ${name}" " = \\{0, 6, 8, 4, 10, 2, 8, 0, 6, 6, 4, 4, 2, 2, 0, 0\\}"
gdb_test_no_output "set variable ${name}.hi.hi.hi = ${name}.lo.s1623.lo"
gdb_test "print/d ${name}" " = \\{0, 6, 8, 4, 10, 2, 8, 0, 6, 6, 4, 4, 2, 2, 6, 8\\}"
}
proc do_check { name type alttype size } {
check_basic ${name} ${alttype} ${size}
check_type ${name} ${type} ${alttype}
check_sizeof ${name} ${size}
check_access ${name} ${alttype}
}
do_check "c16" "char" "char" 1
do_check "uc16" "uchar" "unsigned char" 1
do_check "s16" "short" "short" 2
do_check "us16" "ushort" "unsigned short" 2
do_check "i16" "int" "int" 4
do_check "ui16" "uint" "unsigned int" 4
do_check "l16" "long" "long" 8
do_check "ul16" "ulong" "unsigned long" 8
if { ${have_cl_khr_fp16} } {
do_check "h16" "half" "half" 2
}
do_check "f16" "float" "float" 4
if { ${have_cl_khr_fp64} } {
do_check "d16" "double" "double" 8
}
# Delete the OpenCL program source
remote_file target delete ${clprogram}

519
gdb/testsuite/lib/cl_util.c Normal file
View File

@ -0,0 +1,519 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com> */
/* Utility macros and functions for OpenCL applications. */
#include "cl_util.h"
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <string.h>
const char *get_clerror_string (int errcode)
{
switch (errcode)
{
case CL_SUCCESS:
return "CL_SUCCESS";
case CL_DEVICE_NOT_FOUND:
return "CL_DEVICE_NOT_FOUND";
case CL_DEVICE_NOT_AVAILABLE:
return "CL_DEVICE_NOT_AVAILABLE";
case CL_COMPILER_NOT_AVAILABLE:
return "CL_COMPILER_NOT_AVAILABLE";
case CL_MEM_OBJECT_ALLOCATION_FAILURE:
return "CL_MEM_OBJECT_ALLOCATION_FAILURE";
case CL_OUT_OF_RESOURCES:
return "CL_OUT_OF_RESOURCES";
case CL_OUT_OF_HOST_MEMORY:
return "CL_OUT_OF_HOST_MEMORY";
case CL_PROFILING_INFO_NOT_AVAILABLE:
return "CL_PROFILING_INFO_NOT_AVAILABLE";
case CL_MEM_COPY_OVERLAP:
return "CL_MEM_COPY_OVERLAP";
case CL_IMAGE_FORMAT_MISMATCH:
return "CL_IMAGE_FORMAT_MISMATCH";
case CL_IMAGE_FORMAT_NOT_SUPPORTED:
return "CL_IMAGE_FORMAT_NOT_SUPPORTED";
case CL_BUILD_PROGRAM_FAILURE:
return "CL_BUILD_PROGRAM_FAILURE";
case CL_MAP_FAILURE:
return "CL_MAP_FAILURE";
case CL_INVALID_VALUE:
return "CL_INVALID_VALUE";
case CL_INVALID_DEVICE_TYPE:
return "CL_INVALID_DEVICE_TYPE";
case CL_INVALID_PLATFORM:
return "CL_INVALID_PLATFORM";
case CL_INVALID_DEVICE:
return "CL_INVALID_DEVICE";
case CL_INVALID_CONTEXT:
return "CL_INVALID_CONTEXT";
case CL_INVALID_QUEUE_PROPERTIES:
return "CL_INVALID_QUEUE_PROPERTIES";
case CL_INVALID_COMMAND_QUEUE:
return "CL_INVALID_COMMAND_QUEUE";
case CL_INVALID_HOST_PTR:
return "CL_INVALID_HOST_PTR";
case CL_INVALID_MEM_OBJECT:
return "CL_INVALID_MEM_OBJECT";
case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR:
return "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR";
case CL_INVALID_IMAGE_SIZE:
return "CL_INVALID_IMAGE_SIZE";
case CL_INVALID_SAMPLER:
return "CL_INVALID_SAMPLER";
case CL_INVALID_BINARY:
return "CL_INVALID_BINARY";
case CL_INVALID_BUILD_OPTIONS:
return "CL_INVALID_BUILD_OPTIONS";
case CL_INVALID_PROGRAM:
return "CL_INVALID_PROGRAM";
case CL_INVALID_PROGRAM_EXECUTABLE:
return "CL_INVALID_PROGRAM_EXECUTABLE";
case CL_INVALID_KERNEL_NAME:
return "CL_INVALID_KERNEL_NAME";
case CL_INVALID_KERNEL_DEFINITION:
return "CL_INVALID_KERNEL_DEFINITION";
case CL_INVALID_KERNEL:
return "CL_INVALID_KERNEL";
case CL_INVALID_ARG_INDEX:
return "CL_INVALID_ARG_INDEX";
case CL_INVALID_ARG_VALUE:
return "CL_INVALID_ARG_VALUE";
case CL_INVALID_ARG_SIZE:
return "CL_INVALID_ARG_SIZE";
case CL_INVALID_KERNEL_ARGS:
return "CL_INVALID_KERNEL_ARGS";
case CL_INVALID_WORK_DIMENSION:
return "CL_INVALID_WORK_DIMENSION";
case CL_INVALID_WORK_GROUP_SIZE:
return "CL_INVALID_WORK_GROUP_SIZE";
case CL_INVALID_WORK_ITEM_SIZE:
return "CL_INVALID_WORK_ITEM_SIZE";
case CL_INVALID_GLOBAL_OFFSET:
return "CL_INVALID_GLOBAL_OFFSET";
case CL_INVALID_EVENT_WAIT_LIST:
return "CL_INVALID_EVENT_WAIT_LIST";
case CL_INVALID_EVENT:
return "CL_INVALID_EVENT";
case CL_INVALID_OPERATION:
return "CL_INVALID_OPERATION";
case CL_INVALID_GL_OBJECT:
return "CL_INVALID_GL_OBJECT";
case CL_INVALID_BUFFER_SIZE:
return "CL_INVALID_BUFFER_SIZE";
case CL_INVALID_MIP_LEVEL:
return "CL_INVALID_MIP_LEVEL";
#ifndef CL_PLATFORM_NVIDIA
case CL_INVALID_GLOBAL_WORK_SIZE:
return "CL_INVALID_GLOBAL_WORK_SIZE";
#endif
default:
return "Unknown";
};
}
void print_clinfo ()
{
char *s = NULL;
size_t len;
unsigned i, j;
cl_uint platform_count;
cl_platform_id *platforms;
/* Determine number of OpenCL Platforms available. */
clGetPlatformIDs (0, NULL, &platform_count);
printf ("number of OpenCL Platforms available:\t%d\n", platform_count);
/* Get platforms. */
platforms
= (cl_platform_id*) malloc (sizeof (cl_platform_id) * platform_count);
if (platforms == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
clGetPlatformIDs (platform_count, platforms, NULL);
/* Querying platforms. */
for (i = 0; i < platform_count; i++)
{
cl_device_id *devices;
cl_uint device_count;
cl_device_id default_dev;
printf (" OpenCL Platform: %d\n", i);
#define PRINT_PF_INFO(PARM)\
clGetPlatformInfo (platforms[i], PARM, 0, NULL, &len); \
s = realloc (s, len); \
clGetPlatformInfo (platforms[i], PARM, len, s, NULL); \
printf (" %-36s%s\n", #PARM ":", s);
PRINT_PF_INFO (CL_PLATFORM_PROFILE)
PRINT_PF_INFO (CL_PLATFORM_VERSION)
PRINT_PF_INFO (CL_PLATFORM_NAME)
PRINT_PF_INFO (CL_PLATFORM_VENDOR)
PRINT_PF_INFO (CL_PLATFORM_EXTENSIONS)
#undef PRINT_PF_INFO
clGetDeviceIDs (platforms[i], CL_DEVICE_TYPE_DEFAULT, 1, &default_dev,
NULL);
clGetDeviceInfo (default_dev, CL_DEVICE_NAME, 0, NULL, &len);
s = realloc (s, len);
clGetDeviceInfo (default_dev, CL_DEVICE_NAME, len, s, NULL);
printf (" CL_DEVICE_TYPE_DEFAULT: %s\n", s);
/* Determine number of devices. */
clGetDeviceIDs (platforms[i], CL_DEVICE_TYPE_ALL, 0, NULL, &device_count);
printf ("\n number of OpenCL Devices available: %d\n", device_count);
/* Get devices. */
devices = (cl_device_id*) malloc (sizeof (cl_device_id) * device_count);
if (devices == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
clGetDeviceIDs (platforms[i], CL_DEVICE_TYPE_ALL, device_count, devices,
NULL);
/* Querying devices. */
for (j = 0; j < device_count; j++)
{
cl_device_type dtype;
cl_device_mem_cache_type mctype;
cl_device_local_mem_type mtype;
cl_device_fp_config fpcfg;
cl_device_exec_capabilities xcap;
cl_command_queue_properties qprops;
cl_bool clbool;
cl_uint cluint;
cl_ulong clulong;
size_t sizet;
size_t workitem_size[3];
printf (" OpenCL Device: %d\n", j);
#define PRINT_DEV_INFO(PARM)\
clGetDeviceInfo (devices[j], PARM, 0, NULL, &len); \
s = realloc (s, len); \
clGetDeviceInfo (devices[j], PARM, len, s, NULL); \
printf (" %-41s%s\n", #PARM ":", s);
PRINT_DEV_INFO (CL_DEVICE_NAME)
PRINT_DEV_INFO (CL_DRIVER_VERSION)
PRINT_DEV_INFO (CL_DEVICE_VENDOR)
clGetDeviceInfo (devices[j], CL_DEVICE_VENDOR_ID, sizeof (cluint),
&cluint, NULL);
printf (" CL_DEVICE_VENDOR_ID: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_TYPE, sizeof (dtype), &dtype, NULL);
if (dtype & CL_DEVICE_TYPE_CPU)
printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_CPU\n");
if (dtype & CL_DEVICE_TYPE_GPU)
printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU\n");
if (dtype & CL_DEVICE_TYPE_ACCELERATOR)
printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_ACCELERATOR\n");
if (dtype & CL_DEVICE_TYPE_DEFAULT)
printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_DEFAULT\n");
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MAX_CLOCK_FREQUENCY: %d\n", cluint);
PRINT_DEV_INFO (CL_DEVICE_PROFILE)
PRINT_DEV_INFO (CL_DEVICE_EXTENSIONS)
clGetDeviceInfo (devices[j], CL_DEVICE_AVAILABLE, sizeof (clbool), &clbool, NULL);
if (clbool == CL_TRUE)
printf (" CL_DEVICE_AVAILABLE: CL_TRUE\n");
else
printf (" CL_DEVICE_AVAILABLE: CL_FALSE\n");
clGetDeviceInfo (devices[j], CL_DEVICE_ENDIAN_LITTLE, sizeof (clbool), &clbool, NULL);
if (clbool == CL_TRUE)
printf (" CL_DEVICE_ENDIAN_LITTLE: CL_TRUE\n");
else
printf (" CL_DEVICE_ENDIAN_LITTLE: CL_FALSE\n");
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MAX_COMPUTE_UNITS: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_MAX_WORK_GROUP_SIZE: %d\n", sizet);
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof (workitem_size), &workitem_size, NULL);
printf (" CL_DEVICE_MAX_WORK_ITEM_SIZES: %d / %d / %d\n", workitem_size[0], workitem_size[1], workitem_size[2]);
clGetDeviceInfo (devices[j], CL_DEVICE_ADDRESS_BITS, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_ADDRESS_BITS: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof (clulong), &clulong, NULL);
printf (" CL_DEVICE_MAX_MEM_ALLOC_SIZE: %llu\n", clulong);
clGetDeviceInfo (devices[j], CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MEM_BASE_ADDR_ALIGN: %d\n", cluint);
clGetDeviceInfo(devices[j], CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: %d\n", cluint);
clGetDeviceInfo(devices[j], CL_DEVICE_MAX_PARAMETER_SIZE, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_MAX_PARAMETER_SIZE: %d\n", sizet);
clGetDeviceInfo(devices[j], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof (clulong), &clulong, NULL);
printf (" CL_DEVICE_GLOBAL_MEM_SIZE: %llu\n", clulong);
clGetDeviceInfo (devices[j], CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, sizeof (mctype), &mctype, NULL);
if (mctype & CL_NONE)
printf (" CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_NONE\n");
if (mctype & CL_READ_ONLY_CACHE)
printf (" CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_READ_ONLY_CACHE\n");
if (mctype & CL_READ_WRITE_CACHE)
printf (" CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_READ_WRITE_CACHE\n");
clGetDeviceInfo (devices[j], CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, sizeof (clulong), &clulong, NULL);
printf (" CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: %llu\n", clulong);
clGetDeviceInfo (devices[j], CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_LOCAL_MEM_TYPE, sizeof (mtype), &mtype, NULL);
if (mtype & CL_LOCAL)
printf (" CL_DEVICE_LOCAL_MEM_TYPE: CL_LOCAL\n");
if (mtype & CL_GLOBAL)
printf (" CL_DEVICE_LOCAL_MEM_TYPE: CL_GLOBAL\n");
clGetDeviceInfo (devices[j], CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MEM_BASE_ADDR_ALIGN: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_SINGLE_FP_CONFIG, sizeof (fpcfg), &fpcfg, NULL);
if (fpcfg & CL_FP_DENORM)
printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_DENORM\n");
if (fpcfg & CL_FP_INF_NAN)
printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_INF_NAN\n");
if (fpcfg & CL_FP_ROUND_TO_NEAREST)
printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_ROUND_TO_NEAREST\n");
if (fpcfg & CL_FP_ROUND_TO_ZERO)
printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_ROUND_TO_ZERO\n");
clGetDeviceInfo (devices[j], CL_DEVICE_EXECUTION_CAPABILITIES, sizeof (xcap), &xcap, NULL);
if (xcap & CL_EXEC_KERNEL )
printf (" CL_DEVICE_EXECUTION_CAPABILITIES: CL_EXEC_KERNEL\n");
if (xcap & CL_EXEC_NATIVE_KERNEL)
printf (" CL_DEVICE_EXECUTION_CAPABILITIES: CL_EXEC_NATIVE_KERNEL\n");
clGetDeviceInfo (devices[j], CL_DEVICE_QUEUE_PROPERTIES, sizeof (qprops), &qprops, NULL);
if (qprops & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)
printf (" CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE\n");
if (qprops & CL_QUEUE_PROFILING_ENABLE)
printf (" CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_PROFILING_ENABLE\n");
clGetDeviceInfo (devices[j], CL_DEVICE_PROFILING_TIMER_RESOLUTION, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_PROFILING_TIMER_RESOLUTION: %d\n", sizet);
clGetDeviceInfo (devices[j], CL_DEVICE_COMPILER_AVAILABLE, sizeof (clbool), &clbool, NULL);
if (clbool == CL_TRUE)
printf (" CL_DEVICE_COMPILER_AVAILABLE: CL_TRUE\n");
else
printf (" CL_DEVICE_COMPILER_AVAILABLE: CL_FALSE\n");
clGetDeviceInfo (devices[j], CL_DEVICE_ERROR_CORRECTION_SUPPORT, sizeof (clbool), &clbool, NULL);
if (clbool == CL_TRUE)
printf (" CL_DEVICE_ERROR_CORRECTION_SUPPORT: CL_TRUE\n");
else
printf (" CL_DEVICE_ERROR_CORRECTION_SUPPORT: CL_FALSE\n");
clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE_SUPPORT, sizeof (clbool), &clbool, NULL);
if (clbool == CL_FALSE)
{
printf (" CL_DEVICE_IMAGE_SUPPORT: CL_FALSE\n");
}
else
{
printf (" CL_DEVICE_IMAGE_SUPPORT: CL_TRUE\n");
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_SAMPLERS, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MAX_SAMPLERS: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_READ_IMAGE_ARGS, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MAX_READ_IMAGE_ARGS: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WRITE_IMAGE_ARGS, sizeof (cluint), &cluint, NULL);
printf (" CL_DEVICE_MAX_WRITE_IMAGE_ARGS: %d\n", cluint);
clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE2D_MAX_WIDTH, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_IMAGE2D_MAX_WIDTH: %d\n", sizet);
clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE2D_MAX_HEIGHT, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_IMAGE2D_MAX_HEIGHT: %d\n", sizet);
clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE3D_MAX_WIDTH, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_IMAGE3D_MAX_WIDTH: %d\n", sizet);
clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE3D_MAX_HEIGHT, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_IMAGE3D_MAX_HEIGHT: %d\n", sizet);
clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE3D_MAX_DEPTH, sizeof (sizet), &sizet, NULL);
printf (" CL_DEVICE_IMAGE3D_MAX_DEPTH: %d\n", sizet);
}
#undef PRINT_DEV_INFO
} /* devices */
free (devices);
} /* platforms */
free (s);
free (platforms);
}
const char *
read_file (const char * const filename, size_t *size)
{
char *buf = NULL;
FILE *fd;
struct stat st;
if (stat (filename, &st) == -1)
{
/* Check if the file exists. */
if (errno == ENOENT)
return buf;
perror ("stat failed");
exit (EXIT_FAILURE);
}
buf = (char *) malloc (st.st_size);
if (buf == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
fd = fopen (filename, "r");
if (fd == NULL)
{
perror ("fopen failed");
free (buf);
exit (EXIT_FAILURE);
}
if (fread (buf, st.st_size, 1, fd) != 1)
{
fprintf (stderr, "fread failed\n");
free (buf);
fclose (fd);
exit (EXIT_FAILURE);
}
fclose (fd);
*size = st.st_size;
return buf;
}
void
save_program_binaries (cl_program program)
{
cl_device_id *devices;
cl_uint device_count;
size_t *sizes;
unsigned char **binaries;
unsigned i, j;
/* Query the amount of devices for the given program. */
CHK (clGetProgramInfo (program, CL_PROGRAM_NUM_DEVICES, sizeof (cl_uint),
&device_count, NULL));
/* Get the sizes of the binaries. */
sizes = (size_t*) malloc (sizeof (size_t) * device_count);
if (sizes == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
CHK (clGetProgramInfo (program, CL_PROGRAM_BINARY_SIZES, sizeof (sizes),
sizes, NULL));
/* Get the binaries. */
binaries
= (unsigned char **) malloc (sizeof (unsigned char *) * device_count);
if (binaries == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
for (i = 0; i < device_count; i++)
{
binaries[i] = (unsigned char *) malloc (sizes[i]);
if (binaries[i] == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
}
CHK (clGetProgramInfo (program, CL_PROGRAM_BINARIES, sizeof (binaries),
binaries, NULL));
/* Get the devices for the given program to extract the file names. */
devices = (cl_device_id*) malloc (sizeof (cl_device_id) * device_count);
if (devices == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
CHK (clGetProgramInfo (program, CL_PROGRAM_DEVICES, sizeof (devices),
devices, NULL));
for (i = 0; i < device_count; i++)
{
FILE *fd;
char *dev_name = NULL;
size_t len;
CHK (clGetDeviceInfo (devices[i], CL_DEVICE_NAME, 0, NULL, &len));
dev_name = malloc (len);
if (dev_name == NULL)
{
fprintf (stderr, "malloc failed\n");
exit (EXIT_FAILURE);
}
CHK (clGetDeviceInfo (devices[i], CL_DEVICE_NAME, len, dev_name, NULL));
/* Convert spaces to underscores. */
for (j = 0; j < strlen (dev_name); j++)
{
if (dev_name[j] == ' ')
dev_name[j] = '_';
}
/* Save the binaries. */
printf ("saving program binary for device: %s\n", dev_name);
/* Save binaries[i]. */
fd = fopen (dev_name, "w");
if (fd == NULL)
{
perror ("fopen failed");
exit (EXIT_FAILURE);
}
if (fwrite (binaries[i], sizes[i], 1, fd) != 1)
{
fprintf (stderr, "fwrite failed\n");
for (j = i; j < device_count; j++)
free (binaries[j]);
fclose (fd);
exit (EXIT_FAILURE);
}
fclose (fd);
free (binaries[i]);
free (dev_name);
free (sizes);
}
free (devices);
free (binaries);
}

View File

@ -0,0 +1,88 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com> */
/* Utility macros and functions for OpenCL applications. */
#ifndef CL_UTIL_H
#define CL_UTIL_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
#include <stdio.h>
/* Executes the given OpenCL function and checks its return value.
In case of failure (rc != CL_SUCCESS) an error string will be
printed to stderr and the program will be terminated. This Macro
is only intended for OpenCL routines which return cl_int. */
#define CHK(func)\
{\
int rc = (func);\
CHK_ERR (#func, rc);\
}
/* Macro that checks an OpenCL error code. In case of failure
(err != CL_SUCCESS) an error string will be printed to stderr
including the prefix and the program will be terminated. This
Macro is only intended to use in conjunction with OpenCL routines
which take a pointer to a cl_int as an argument to place their
error code. */
#define CHK_ERR(prefix, err)\
if (err != CL_SUCCESS)\
{\
fprintf (stderr, "CHK_ERR (%s, %d)\n", prefix, err);\
fprintf (stderr, "%s:%d error: %s\n", __FILE__, __LINE__,\
get_clerror_string (err));\
exit (EXIT_FAILURE);\
};
/* Return a pointer to a string that describes the error code specified
by the errcode argument. */
extern const char *get_clerror_string (int errcode);
/* Prints OpenCL information to stdout. */
extern void print_clinfo ();
/* Reads a given file into the memory and returns a pointer to the data or NULL
if the file does not exist. FILENAME specifies the location of the file to
be read. SIZE is an output parameter that returns the size of the file in
bytes. */
extern const char *read_file (const char * const filename, size_t *size);
/* Saves all program binaries of the given OpenCL PROGRAM. The file
names are extracted from the devices. */
extern void save_program_binaries (cl_program program);
#ifdef __cplusplus
}
#endif
#endif /* CL_UTIL_H */

View File

@ -0,0 +1,83 @@
# Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com>.
#
# Support library for testing OpenCL GDB features
# Compile OpenCL programs using a generic host app.
proc gdb_compile_opencl_hostapp {clsource executable options} {
global srcdir objdir subdir
set src "${srcdir}/lib/cl_util.c ${srcdir}/lib/opencl_hostapp.c"
set binfile ${objdir}/${subdir}/${executable}
set compile_flags [concat additional_flags=-I${srcdir}/lib/ additional_flags=-DCL_SOURCE=$clsource]
set options_opencl [concat {debug} $compile_flags $options [list libs=-lOpenCL]]
return [gdb_compile ${src} ${binfile} "executable" ${options_opencl}]
}
# Run a test on the target to check if it supports OpenCL. Return 0 if so, 1 if
# it does not.
proc skip_opencl_tests {} {
global skip_opencl_tests_saved srcdir objdir subdir gdb_prompt
# Use the cached value, if it exists. Cache value per "board" to handle
# runs with multiple options (e.g. unix/{-m32,-64}) correctly.
set me "skip_opencl_tests"
set board [target_info name]
if [info exists skip_opencl_tests_saved($board)] {
verbose "$me: returning saved $skip_opencl_tests_saved($board)" 2
return $skip_opencl_tests_saved($board)
}
# Set up, compile, and execute an OpenCL program. Include the current
# process ID in the file name of the executable to prevent conflicts with
# invocations for multiple testsuites.
set clprogram [remote_download target ${srcdir}/lib/opencl_kernel.cl]
set executable opencltest[pid].x
verbose "$me: compiling OpenCL test app" 2
set compile_flags {debug nowarnings quiet}
if { [gdb_compile_opencl_hostapp "${clprogram}" "${executable}" "" ] != "" } {
verbose "$me: compiling OpenCL binary failed, returning 1" 2
return [set skip_opencl_tests_saved($board) 1]
}
# Compilation succeeded so now run it via gdb.
clean_restart "$executable"
gdb_run_cmd
gdb_expect 30 {
-re ".*Program exited normally.*${gdb_prompt} $" {
verbose -log "\n$me: OpenCL support detected"
set skip_opencl_tests_saved($board) 0
}
-re ".*Program exited with code.*${gdb_prompt} $" {
verbose -log "\n$me: OpenCL support not detected"
set skip_opencl_tests_saved($board) 1
}
default {
verbose -log "\n$me OpenCL support not detected (default case)"
set skip_opencl_tests_saved($board) 1
}
}
gdb_exit
remote_file build delete $executable
# Delete the OpenCL program source file.
remote_file target delete ${clprogram}
verbose "$me: returning $skip_opencl_tests_saved($board)" 2
return $skip_opencl_tests_saved($board)
}

View File

@ -0,0 +1,168 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2010 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 Ken Werner <ken.werner@de.ibm.com> */
/* Simple OpenCL application that executes a kernel on the default device
in a data parallel fashion. The filename of the OpenCL program source
should be specified using the CL_SOURCE define. The name of the kernel
routine is expected to be "testkernel". */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <CL/cl.h>
#include "cl_util.h"
#ifndef CL_SOURCE
#error "Please specify the OpenCL source file using the CL_SOURCE define"
#endif
#define STRINGIFY(S) _STRINGIFY(S)
#define _STRINGIFY(S) #S
#define SIZE 16
int
main ()
{
int err, i;
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_context_properties context_props[3];
cl_command_queue queue;
cl_program program;
cl_kernel kernel;
cl_mem buffer;
size_t len;
const char *program_source = NULL;
char *device_extensions = NULL;
char kernel_build_opts[256];
size_t size = sizeof (cl_int) * SIZE;
const size_t global_work_size[] = {SIZE, 0, 0}; /* size of each dimension */
cl_int *data;
/* In order to see which devices the OpenCL implementation on your platform
provides you may issue a call to the print_clinfo () fuction. */
/* Initialize the data the OpenCl program operates on. */
data = (cl_int*) calloc (1, size);
if (data == NULL)
{
fprintf (stderr, "calloc failed\n");
exit (EXIT_FAILURE);
}
/* Pick the first platform. */
CHK (clGetPlatformIDs (1, &platform, NULL));
/* Get the default device and create context. */
CHK (clGetDeviceIDs (platform, CL_DEVICE_TYPE_DEFAULT, 1, &device, NULL));
context_props[0] = CL_CONTEXT_PLATFORM;
context_props[1] = (cl_context_properties) platform;
context_props[2] = 0;
context = clCreateContext (context_props, 1, &device, NULL, NULL, &err);
CHK_ERR ("clCreateContext", err);
queue = clCreateCommandQueue (context, device, 0, &err);
CHK_ERR ("clCreateCommandQueue", err);
/* Query OpenCL extensions of that device. */
CHK (clGetDeviceInfo (device, CL_DEVICE_EXTENSIONS, 0, NULL, &len));
device_extensions = (char *) malloc (len);
CHK (clGetDeviceInfo (device, CL_DEVICE_EXTENSIONS, len, device_extensions,
NULL));
strcpy (kernel_build_opts, "-Werror -cl-opt-disable");
if (strstr (device_extensions, "cl_khr_fp64") != NULL)
strcpy (kernel_build_opts + strlen (kernel_build_opts),
" -D HAVE_cl_khr_fp64");
if (strstr (device_extensions, "cl_khr_fp16") != NULL)
strcpy (kernel_build_opts + strlen (kernel_build_opts),
" -D HAVE_cl_khr_fp16");
/* Read the OpenCL kernel source into the main memory. */
program_source = read_file (STRINGIFY (CL_SOURCE), &len);
if (program_source == NULL)
{
fprintf (stderr, "file does not exist: %s\n", STRINGIFY (CL_SOURCE));
exit (EXIT_FAILURE);
}
/* Build the OpenCL kernel. */
program = clCreateProgramWithSource (context, 1, &program_source,
&len, &err);
free ((void*) program_source);
CHK_ERR ("clCreateProgramWithSource", err);
err = clBuildProgram (program, 0, NULL, kernel_build_opts, NULL,
NULL);
if (err != CL_SUCCESS)
{
size_t len;
char *clbuild_log = NULL;
CHK (clGetProgramBuildInfo (program, device, CL_PROGRAM_BUILD_LOG, 0,
NULL, &len));
clbuild_log = malloc (len);
if (clbuild_log)
{
CHK (clGetProgramBuildInfo (program, device, CL_PROGRAM_BUILD_LOG,
len, clbuild_log, NULL));
fprintf (stderr, "clBuildProgram failed with:\n%s\n", clbuild_log);
free (clbuild_log);
}
exit (EXIT_FAILURE);
}
/* In some cases it might be handy to save the OpenCL program binaries to do
further analysis on them. In order to do so you may call the following
function: save_program_binaries (program);. */
kernel = clCreateKernel (program, "testkernel", &err);
CHK_ERR ("clCreateKernel", err);
/* Setup the input data for the kernel. */
buffer = clCreateBuffer (context, CL_MEM_USE_HOST_PTR, size, data, &err);
CHK_ERR ("clCreateBuffer", err);
/* Execute the kernel (data parallel). */
CHK (clSetKernelArg (kernel, 0, sizeof (buffer), &buffer));
CHK (clEnqueueNDRangeKernel (queue, kernel, 1, NULL, global_work_size, NULL,
0, NULL, NULL));
/* Fetch the results (blocking). */
CHK (clEnqueueReadBuffer (queue, buffer, CL_TRUE, 0, size, data, 0, NULL,
NULL));
/* Compare the results. */
for (i = 0; i < SIZE; i++)
{
if (data[i] != 0x1)
{
fprintf (stderr, "error: data[%d]: %d != 0x1\n", i, data[i]);
exit (EXIT_FAILURE);
}
}
/* Cleanup. */
CHK (clReleaseMemObject (buffer));
CHK (clReleaseKernel (kernel));
CHK (clReleaseProgram (program));
CHK (clReleaseCommandQueue (queue));
CHK (clReleaseContext (context));
free (data);
return 0;
}

View File

@ -0,0 +1,5 @@
/* OpenCL kernel for testing purposes. */
__kernel void testkernel (__global int *data)
{
data[get_global_id(0)] = 0x1;
}