]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/opencl-lang.c
* elf32-h8300.c (elf32_h8_relax_section): When checking for a
[thirdparty/binutils-gdb.git] / gdb / opencl-lang.c
CommitLineData
f4b8a18d 1/* OpenCL language support for GDB, the GNU debugger.
28e7fd62 2 Copyright (C) 2010-2013 Free Software Foundation, Inc.
f4b8a18d
KW
3
4 Contributed by Ken Werner <ken.werner@de.ibm.com>.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21#include "defs.h"
22#include "gdb_string.h"
23#include "gdbtypes.h"
24#include "symtab.h"
25#include "expression.h"
26#include "parser-defs.h"
27#include "symtab.h"
28#include "language.h"
29#include "c-lang.h"
30#include "gdb_assert.h"
31
32extern void _initialize_opencl_language (void);
33
34/* This macro generates enum values from a given type. */
35
36#define OCL_P_TYPE(TYPE)\
37 opencl_primitive_type_##TYPE,\
38 opencl_primitive_type_##TYPE##2,\
39 opencl_primitive_type_##TYPE##3,\
40 opencl_primitive_type_##TYPE##4,\
41 opencl_primitive_type_##TYPE##8,\
42 opencl_primitive_type_##TYPE##16
43
44enum opencl_primitive_types {
45 OCL_P_TYPE (char),
46 OCL_P_TYPE (uchar),
47 OCL_P_TYPE (short),
48 OCL_P_TYPE (ushort),
49 OCL_P_TYPE (int),
50 OCL_P_TYPE (uint),
51 OCL_P_TYPE (long),
52 OCL_P_TYPE (ulong),
53 OCL_P_TYPE (half),
54 OCL_P_TYPE (float),
55 OCL_P_TYPE (double),
56 opencl_primitive_type_bool,
57 opencl_primitive_type_unsigned_char,
58 opencl_primitive_type_unsigned_short,
59 opencl_primitive_type_unsigned_int,
60 opencl_primitive_type_unsigned_long,
61 opencl_primitive_type_size_t,
62 opencl_primitive_type_ptrdiff_t,
63 opencl_primitive_type_intptr_t,
64 opencl_primitive_type_uintptr_t,
65 opencl_primitive_type_void,
66 nr_opencl_primitive_types
67};
68
f4b8a18d
KW
69static struct gdbarch_data *opencl_type_data;
70
70221824 71static struct type **
f4b8a18d
KW
72builtin_opencl_type (struct gdbarch *gdbarch)
73{
74 return gdbarch_data (gdbarch, opencl_type_data);
75}
76
77/* Returns the corresponding OpenCL vector type from the given type code,
78 the length of the element type, the unsigned flag and the amount of
79 elements (N). */
80
81static struct type *
82lookup_opencl_vector_type (struct gdbarch *gdbarch, enum type_code code,
83 unsigned int el_length, unsigned int flag_unsigned,
84 int n)
85{
86 int i;
87 unsigned int length;
88 struct type *type = NULL;
c9def01d 89 struct type **types = builtin_opencl_type (gdbarch);
f4b8a18d
KW
90
91 /* Check if n describes a valid OpenCL vector size (2, 3, 4, 8, 16). */
92 if (n != 2 && n != 3 && n != 4 && n != 8 && n != 16)
93 error (_("Invalid OpenCL vector size: %d"), n);
94
95 /* Triple vectors have the size of a quad vector. */
96 length = (n == 3) ? el_length * 4 : el_length * n;
97
98 for (i = 0; i < nr_opencl_primitive_types; i++)
99 {
100 LONGEST lowb, highb;
101
102 if (TYPE_CODE (types[i]) == TYPE_CODE_ARRAY && TYPE_VECTOR (types[i])
103 && get_array_bounds (types[i], &lowb, &highb)
104 && TYPE_CODE (TYPE_TARGET_TYPE (types[i])) == code
105 && TYPE_UNSIGNED (TYPE_TARGET_TYPE (types[i])) == flag_unsigned
106 && TYPE_LENGTH (TYPE_TARGET_TYPE (types[i])) == el_length
107 && TYPE_LENGTH (types[i]) == length
108 && highb - lowb + 1 == n)
109 {
110 type = types[i];
111 break;
112 }
113 }
114
115 return type;
116}
117
118/* Returns nonzero if the array ARR contains duplicates within
119 the first N elements. */
120
121static int
122array_has_dups (int *arr, int n)
123{
124 int i, j;
125
126 for (i = 0; i < n; i++)
127 {
128 for (j = i + 1; j < n; j++)
129 {
130 if (arr[i] == arr[j])
131 return 1;
132 }
133 }
134
135 return 0;
136}
137
138/* The OpenCL component access syntax allows to create lvalues referring to
139 selected elements of an original OpenCL vector in arbitrary order. This
140 structure holds the information to describe such lvalues. */
141
142struct lval_closure
143{
144 /* Reference count. */
145 int refc;
146 /* The number of indices. */
147 int n;
148 /* The element indices themselves. */
149 int *indices;
150 /* A pointer to the original value. */
151 struct value *val;
152};
153
154/* Allocates an instance of struct lval_closure. */
155
156static struct lval_closure *
157allocate_lval_closure (int *indices, int n, struct value *val)
158{
159 struct lval_closure *c = XZALLOC (struct lval_closure);
160
161 c->refc = 1;
162 c->n = n;
163 c->indices = XCALLOC (n, int);
164 memcpy (c->indices, indices, n * sizeof (int));
165 value_incref (val); /* Increment the reference counter of the value. */
166 c->val = val;
167
168 return c;
169}
170
171static void
172lval_func_read (struct value *v)
173{
174 struct lval_closure *c = (struct lval_closure *) value_computed_closure (v);
175 struct type *type = check_typedef (value_type (v));
176 struct type *eltype = TYPE_TARGET_TYPE (check_typedef (value_type (c->val)));
177 int offset = value_offset (v);
178 int elsize = TYPE_LENGTH (eltype);
179 int n, i, j = 0;
180 LONGEST lowb = 0;
181 LONGEST highb = 0;
182
183 if (TYPE_CODE (type) == TYPE_CODE_ARRAY
184 && !get_array_bounds (type, &lowb, &highb))
185 error (_("Could not determine the vector bounds"));
186
187 /* Assume elsize aligned offset. */
188 gdb_assert (offset % elsize == 0);
189 offset /= elsize;
190 n = offset + highb - lowb + 1;
191 gdb_assert (n <= c->n);
192
193 for (i = offset; i < n; i++)
194 memcpy (value_contents_raw (v) + j++ * elsize,
195 value_contents (c->val) + c->indices[i] * elsize,
196 elsize);
197}
198
199static void
200lval_func_write (struct value *v, struct value *fromval)
201{
202 struct value *mark = value_mark ();
203 struct lval_closure *c = (struct lval_closure *) value_computed_closure (v);
204 struct type *type = check_typedef (value_type (v));
205 struct type *eltype = TYPE_TARGET_TYPE (check_typedef (value_type (c->val)));
206 int offset = value_offset (v);
207 int elsize = TYPE_LENGTH (eltype);
208 int n, i, j = 0;
209 LONGEST lowb = 0;
210 LONGEST highb = 0;
211
212 if (TYPE_CODE (type) == TYPE_CODE_ARRAY
213 && !get_array_bounds (type, &lowb, &highb))
214 error (_("Could not determine the vector bounds"));
215
216 /* Assume elsize aligned offset. */
217 gdb_assert (offset % elsize == 0);
218 offset /= elsize;
219 n = offset + highb - lowb + 1;
220
221 /* Since accesses to the fourth component of a triple vector is undefined we
222 just skip writes to the fourth element. Imagine something like this:
223 int3 i3 = (int3)(0, 1, 2);
224 i3.hi.hi = 5;
225 In this case n would be 4 (offset=12/4 + 1) while c->n would be 3. */
226 if (n > c->n)
227 n = c->n;
228
229 for (i = offset; i < n; i++)
230 {
231 struct value *from_elm_val = allocate_value (eltype);
232 struct value *to_elm_val = value_subscript (c->val, c->indices[i]);
233
234 memcpy (value_contents_writeable (from_elm_val),
235 value_contents (fromval) + j++ * elsize,
236 elsize);
237 value_assign (to_elm_val, from_elm_val);
238 }
239
240 value_free_to_mark (mark);
241}
242
243/* Return nonzero if all bits in V within OFFSET and LENGTH are valid. */
244
245static int
246lval_func_check_validity (const struct value *v, int offset, int length)
247{
248 struct lval_closure *c = (struct lval_closure *) value_computed_closure (v);
249 /* Size of the target type in bits. */
250 int elsize =
251 TYPE_LENGTH (TYPE_TARGET_TYPE (check_typedef (value_type (c->val)))) * 8;
252 int startrest = offset % elsize;
253 int start = offset / elsize;
254 int endrest = (offset + length) % elsize;
255 int end = (offset + length) / elsize;
256 int i;
257
258 if (endrest)
259 end++;
260
261 if (end > c->n)
262 return 0;
263
264 for (i = start; i < end; i++)
265 {
8f9a01ee
MS
266 int comp_offset = (i == start) ? startrest : 0;
267 int comp_length = (i == end) ? endrest : elsize;
f4b8a18d 268
8f9a01ee
MS
269 if (!value_bits_valid (c->val, c->indices[i] * elsize + comp_offset,
270 comp_length))
f4b8a18d
KW
271 return 0;
272 }
273
274 return 1;
275}
276
277/* Return nonzero if any bit in V is valid. */
278
279static int
280lval_func_check_any_valid (const struct value *v)
281{
282 struct lval_closure *c = (struct lval_closure *) value_computed_closure (v);
283 /* Size of the target type in bits. */
284 int elsize =
285 TYPE_LENGTH (TYPE_TARGET_TYPE (check_typedef (value_type (c->val)))) * 8;
286 int i;
287
288 for (i = 0; i < c->n; i++)
289 if (value_bits_valid (c->val, c->indices[i] * elsize, elsize))
290 return 1;
291
292 return 0;
293}
294
8cf6f0b1
TT
295/* Return nonzero if bits in V from OFFSET and LENGTH represent a
296 synthetic pointer. */
297
298static int
299lval_func_check_synthetic_pointer (const struct value *v,
300 int offset, int length)
301{
302 struct lval_closure *c = (struct lval_closure *) value_computed_closure (v);
303 /* Size of the target type in bits. */
304 int elsize =
305 TYPE_LENGTH (TYPE_TARGET_TYPE (check_typedef (value_type (c->val)))) * 8;
306 int startrest = offset % elsize;
307 int start = offset / elsize;
308 int endrest = (offset + length) % elsize;
309 int end = (offset + length) / elsize;
310 int i;
311
312 if (endrest)
313 end++;
314
315 if (end > c->n)
316 return 0;
317
318 for (i = start; i < end; i++)
319 {
8f9a01ee
MS
320 int comp_offset = (i == start) ? startrest : 0;
321 int comp_length = (i == end) ? endrest : elsize;
8cf6f0b1
TT
322
323 if (!value_bits_synthetic_pointer (c->val,
8f9a01ee
MS
324 c->indices[i] * elsize + comp_offset,
325 comp_length))
8cf6f0b1
TT
326 return 0;
327 }
328
329 return 1;
330}
331
f4b8a18d
KW
332static void *
333lval_func_copy_closure (const struct value *v)
334{
335 struct lval_closure *c = (struct lval_closure *) value_computed_closure (v);
336
337 ++c->refc;
338
339 return c;
340}
341
342static void
343lval_func_free_closure (struct value *v)
344{
345 struct lval_closure *c = (struct lval_closure *) value_computed_closure (v);
346
347 --c->refc;
348
349 if (c->refc == 0)
350 {
c05202a1 351 value_free (c->val); /* Decrement the reference counter of the value. */
f4b8a18d
KW
352 xfree (c->indices);
353 xfree (c);
f4b8a18d
KW
354 }
355}
356
c8f2448a 357static const struct lval_funcs opencl_value_funcs =
f4b8a18d
KW
358 {
359 lval_func_read,
360 lval_func_write,
361 lval_func_check_validity,
362 lval_func_check_any_valid,
a471c594
JK
363 NULL, /* indirect */
364 NULL, /* coerce_ref */
8cf6f0b1 365 lval_func_check_synthetic_pointer,
f4b8a18d
KW
366 lval_func_copy_closure,
367 lval_func_free_closure
368 };
369
370/* Creates a sub-vector from VAL. The elements are selected by the indices of
371 an array with the length of N. Supported values for NOSIDE are
372 EVAL_NORMAL and EVAL_AVOID_SIDE_EFFECTS. */
373
374static struct value *
375create_value (struct gdbarch *gdbarch, struct value *val, enum noside noside,
376 int *indices, int n)
377{
378 struct type *type = check_typedef (value_type (val));
379 struct type *elm_type = TYPE_TARGET_TYPE (type);
380 struct value *ret;
381
382 /* Check if a single component of a vector is requested which means
383 the resulting type is a (primitive) scalar type. */
384 if (n == 1)
385 {
386 if (noside == EVAL_AVOID_SIDE_EFFECTS)
387 ret = value_zero (elm_type, not_lval);
388 else
389 ret = value_subscript (val, indices[0]);
390 }
391 else
392 {
393 /* Multiple components of the vector are requested which means the
394 resulting type is a vector as well. */
395 struct type *dst_type =
396 lookup_opencl_vector_type (gdbarch, TYPE_CODE (elm_type),
397 TYPE_LENGTH (elm_type),
398 TYPE_UNSIGNED (elm_type), n);
399
400 if (dst_type == NULL)
401 dst_type = init_vector_type (elm_type, n);
402
403 make_cv_type (TYPE_CONST (type), TYPE_VOLATILE (type), dst_type, NULL);
404
405 if (noside == EVAL_AVOID_SIDE_EFFECTS)
406 ret = allocate_value (dst_type);
407 else
408 {
409 /* Check whether to create a lvalue or not. */
410 if (VALUE_LVAL (val) != not_lval && !array_has_dups (indices, n))
411 {
412 struct lval_closure *c = allocate_lval_closure (indices, n, val);
413 ret = allocate_computed_value (dst_type, &opencl_value_funcs, c);
414 }
415 else
416 {
417 int i;
418
419 ret = allocate_value (dst_type);
420
421 /* Copy src val contents into the destination value. */
422 for (i = 0; i < n; i++)
423 memcpy (value_contents_writeable (ret)
424 + (i * TYPE_LENGTH (elm_type)),
425 value_contents (val)
426 + (indices[i] * TYPE_LENGTH (elm_type)),
427 TYPE_LENGTH (elm_type));
428 }
429 }
430 }
431 return ret;
432}
433
434/* OpenCL vector component access. */
435
436static struct value *
437opencl_component_ref (struct expression *exp, struct value *val, char *comps,
438 enum noside noside)
439{
440 LONGEST lowb, highb;
441 int src_len;
442 struct value *v;
443 int indices[16], i;
444 int dst_len;
445
446 if (!get_array_bounds (check_typedef (value_type (val)), &lowb, &highb))
447 error (_("Could not determine the vector bounds"));
448
449 src_len = highb - lowb + 1;
450
451 /* Throw an error if the amount of array elements does not fit a
452 valid OpenCL vector size (2, 3, 4, 8, 16). */
453 if (src_len != 2 && src_len != 3 && src_len != 4 && src_len != 8
454 && src_len != 16)
455 error (_("Invalid OpenCL vector size"));
456
457 if (strcmp (comps, "lo") == 0 )
458 {
459 dst_len = (src_len == 3) ? 2 : src_len / 2;
460
461 for (i = 0; i < dst_len; i++)
462 indices[i] = i;
463 }
464 else if (strcmp (comps, "hi") == 0)
465 {
466 dst_len = (src_len == 3) ? 2 : src_len / 2;
467
468 for (i = 0; i < dst_len; i++)
469 indices[i] = dst_len + i;
470 }
471 else if (strcmp (comps, "even") == 0)
472 {
473 dst_len = (src_len == 3) ? 2 : src_len / 2;
474
475 for (i = 0; i < dst_len; i++)
476 indices[i] = i*2;
477 }
478 else if (strcmp (comps, "odd") == 0)
479 {
480 dst_len = (src_len == 3) ? 2 : src_len / 2;
481
482 for (i = 0; i < dst_len; i++)
483 indices[i] = i*2+1;
484 }
485 else if (strncasecmp (comps, "s", 1) == 0)
486 {
487#define HEXCHAR_TO_INT(C) ((C >= '0' && C <= '9') ? \
488 C-'0' : ((C >= 'A' && C <= 'F') ? \
489 C-'A'+10 : ((C >= 'a' && C <= 'f') ? \
490 C-'a'+10 : -1)))
491
492 dst_len = strlen (comps);
493 /* Skip the s/S-prefix. */
494 dst_len--;
495
496 for (i = 0; i < dst_len; i++)
497 {
498 indices[i] = HEXCHAR_TO_INT(comps[i+1]);
499 /* Check if the requested component is invalid or exceeds
500 the vector. */
501 if (indices[i] < 0 || indices[i] >= src_len)
502 error (_("Invalid OpenCL vector component accessor %s"), comps);
503 }
504 }
505 else
506 {
507 dst_len = strlen (comps);
508
509 for (i = 0; i < dst_len; i++)
510 {
511 /* x, y, z, w */
512 switch (comps[i])
513 {
514 case 'x':
515 indices[i] = 0;
516 break;
517 case 'y':
518 indices[i] = 1;
519 break;
520 case 'z':
521 if (src_len < 3)
522 error (_("Invalid OpenCL vector component accessor %s"), comps);
523 indices[i] = 2;
524 break;
525 case 'w':
526 if (src_len < 4)
527 error (_("Invalid OpenCL vector component accessor %s"), comps);
528 indices[i] = 3;
529 break;
530 default:
531 error (_("Invalid OpenCL vector component accessor %s"), comps);
532 break;
533 }
534 }
535 }
536
537 /* Throw an error if the amount of requested components does not
538 result in a valid length (1, 2, 3, 4, 8, 16). */
539 if (dst_len != 1 && dst_len != 2 && dst_len != 3 && dst_len != 4
540 && dst_len != 8 && dst_len != 16)
541 error (_("Invalid OpenCL vector component accessor %s"), comps);
542
543 v = create_value (exp->gdbarch, val, noside, indices, dst_len);
544
545 return v;
546}
547
548/* Perform the unary logical not (!) operation. */
549
550static struct value *
551opencl_logical_not (struct expression *exp, struct value *arg)
552{
553 struct type *type = check_typedef (value_type (arg));
554 struct type *rettype;
555 struct value *ret;
556
557 if (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type))
558 {
559 struct type *eltype = check_typedef (TYPE_TARGET_TYPE (type));
560 LONGEST lowb, highb;
561 int i;
562
563 if (!get_array_bounds (type, &lowb, &highb))
564 error (_("Could not determine the vector bounds"));
565
566 /* Determine the resulting type of the operation and allocate the
567 value. */
568 rettype = lookup_opencl_vector_type (exp->gdbarch, TYPE_CODE_INT,
569 TYPE_LENGTH (eltype), 0,
570 highb - lowb + 1);
571 ret = allocate_value (rettype);
572
573 for (i = 0; i < highb - lowb + 1; i++)
574 {
575 /* For vector types, the unary operator shall return a 0 if the
576 value of its operand compares unequal to 0, and -1 (i.e. all bits
577 set) if the value of its operand compares equal to 0. */
578 int tmp = value_logical_not (value_subscript (arg, i)) ? -1 : 0;
579 memset (value_contents_writeable (ret) + i * TYPE_LENGTH (eltype),
580 tmp, TYPE_LENGTH (eltype));
581 }
582 }
583 else
584 {
585 rettype = language_bool_type (exp->language_defn, exp->gdbarch);
586 ret = value_from_longest (rettype, value_logical_not (arg));
587 }
588
589 return ret;
590}
591
592/* Perform a relational operation on two scalar operands. */
593
594static int
595scalar_relop (struct value *val1, struct value *val2, enum exp_opcode op)
596{
597 int ret;
598
599 switch (op)
600 {
601 case BINOP_EQUAL:
602 ret = value_equal (val1, val2);
603 break;
604 case BINOP_NOTEQUAL:
605 ret = !value_equal (val1, val2);
606 break;
607 case BINOP_LESS:
608 ret = value_less (val1, val2);
609 break;
610 case BINOP_GTR:
611 ret = value_less (val2, val1);
612 break;
613 case BINOP_GEQ:
614 ret = value_less (val2, val1) || value_equal (val1, val2);
615 break;
616 case BINOP_LEQ:
617 ret = value_less (val1, val2) || value_equal (val1, val2);
618 break;
619 case BINOP_LOGICAL_AND:
620 ret = !value_logical_not (val1) && !value_logical_not (val2);
621 break;
622 case BINOP_LOGICAL_OR:
623 ret = !value_logical_not (val1) || !value_logical_not (val2);
624 break;
625 default:
626 error (_("Attempt to perform an unsupported operation"));
627 break;
628 }
629 return ret;
630}
631
632/* Perform a relational operation on two vector operands. */
633
634static struct value *
635vector_relop (struct expression *exp, struct value *val1, struct value *val2,
636 enum exp_opcode op)
637{
638 struct value *ret;
639 struct type *type1, *type2, *eltype1, *eltype2, *rettype;
640 int t1_is_vec, t2_is_vec, i;
641 LONGEST lowb1, lowb2, highb1, highb2;
642
643 type1 = check_typedef (value_type (val1));
644 type2 = check_typedef (value_type (val2));
645
646 t1_is_vec = (TYPE_CODE (type1) == TYPE_CODE_ARRAY && TYPE_VECTOR (type1));
647 t2_is_vec = (TYPE_CODE (type2) == TYPE_CODE_ARRAY && TYPE_VECTOR (type2));
648
649 if (!t1_is_vec || !t2_is_vec)
650 error (_("Vector operations are not supported on scalar types"));
651
652 eltype1 = check_typedef (TYPE_TARGET_TYPE (type1));
653 eltype2 = check_typedef (TYPE_TARGET_TYPE (type2));
654
655 if (!get_array_bounds (type1,&lowb1, &highb1)
656 || !get_array_bounds (type2, &lowb2, &highb2))
657 error (_("Could not determine the vector bounds"));
658
659 /* Check whether the vector types are compatible. */
660 if (TYPE_CODE (eltype1) != TYPE_CODE (eltype2)
661 || TYPE_LENGTH (eltype1) != TYPE_LENGTH (eltype2)
662 || TYPE_UNSIGNED (eltype1) != TYPE_UNSIGNED (eltype2)
663 || lowb1 != lowb2 || highb1 != highb2)
664 error (_("Cannot perform operation on vectors with different types"));
665
666 /* Determine the resulting type of the operation and allocate the value. */
667 rettype = lookup_opencl_vector_type (exp->gdbarch, TYPE_CODE_INT,
668 TYPE_LENGTH (eltype1), 0,
669 highb1 - lowb1 + 1);
670 ret = allocate_value (rettype);
671
672 for (i = 0; i < highb1 - lowb1 + 1; i++)
673 {
674 /* For vector types, the relational, equality and logical operators shall
675 return 0 if the specified relation is false and -1 (i.e. all bits set)
676 if the specified relation is true. */
677 int tmp = scalar_relop (value_subscript (val1, i),
678 value_subscript (val2, i), op) ? -1 : 0;
679 memset (value_contents_writeable (ret) + i * TYPE_LENGTH (eltype1),
680 tmp, TYPE_LENGTH (eltype1));
681 }
682
683 return ret;
684}
685
686/* Perform a relational operation on two operands. */
687
688static struct value *
689opencl_relop (struct expression *exp, struct value *arg1, struct value *arg2,
690 enum exp_opcode op)
691{
692 struct value *val;
693 struct type *type1 = check_typedef (value_type (arg1));
694 struct type *type2 = check_typedef (value_type (arg2));
695 int t1_is_vec = (TYPE_CODE (type1) == TYPE_CODE_ARRAY
696 && TYPE_VECTOR (type1));
697 int t2_is_vec = (TYPE_CODE (type2) == TYPE_CODE_ARRAY
698 && TYPE_VECTOR (type2));
699
700 if (!t1_is_vec && !t2_is_vec)
701 {
702 int tmp = scalar_relop (arg1, arg2, op);
703 struct type *type =
704 language_bool_type (exp->language_defn, exp->gdbarch);
705
706 val = value_from_longest (type, tmp);
707 }
708 else if (t1_is_vec && t2_is_vec)
709 {
710 val = vector_relop (exp, arg1, arg2, op);
711 }
712 else
713 {
714 /* Widen the scalar operand to a vector. */
715 struct value **v = t1_is_vec ? &arg2 : &arg1;
716 struct type *t = t1_is_vec ? type2 : type1;
717
718 if (TYPE_CODE (t) != TYPE_CODE_FLT && !is_integral_type (t))
719 error (_("Argument to operation not a number or boolean."));
720
721 *v = value_cast (t1_is_vec ? type1 : type2, *v);
722 val = vector_relop (exp, arg1, arg2, op);
723 }
724
725 return val;
726}
727
728/* Expression evaluator for the OpenCL. Most operations are delegated to
729 evaluate_subexp_standard; see that function for a description of the
730 arguments. */
731
732static struct value *
733evaluate_subexp_opencl (struct type *expect_type, struct expression *exp,
734 int *pos, enum noside noside)
735{
736 enum exp_opcode op = exp->elts[*pos].opcode;
737 struct value *arg1 = NULL;
738 struct value *arg2 = NULL;
739 struct type *type1, *type2;
740
741 switch (op)
742 {
743 /* Handle binary relational and equality operators that are either not
744 or differently defined for GNU vectors. */
745 case BINOP_EQUAL:
746 case BINOP_NOTEQUAL:
747 case BINOP_LESS:
748 case BINOP_GTR:
749 case BINOP_GEQ:
750 case BINOP_LEQ:
751 (*pos)++;
752 arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
753 arg2 = evaluate_subexp (value_type (arg1), exp, pos, noside);
754
755 if (noside == EVAL_SKIP)
756 return value_from_longest (builtin_type (exp->gdbarch)->
757 builtin_int, 1);
758
759 return opencl_relop (exp, arg1, arg2, op);
760
761 /* Handle the logical unary operator not(!). */
762 case UNOP_LOGICAL_NOT:
763 (*pos)++;
764 arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
765
766 if (noside == EVAL_SKIP)
767 return value_from_longest (builtin_type (exp->gdbarch)->
768 builtin_int, 1);
769
770 return opencl_logical_not (exp, arg1);
771
772 /* Handle the logical operator and(&&) and or(||). */
773 case BINOP_LOGICAL_AND:
774 case BINOP_LOGICAL_OR:
775 (*pos)++;
776 arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
777
778 if (noside == EVAL_SKIP)
779 {
5b92b49f 780 evaluate_subexp (NULL_TYPE, exp, pos, noside);
f4b8a18d
KW
781
782 return value_from_longest (builtin_type (exp->gdbarch)->
783 builtin_int, 1);
784 }
785 else
786 {
787 /* For scalar operations we need to avoid evaluating operands
788 unecessarily. However, for vector operations we always need to
789 evaluate both operands. Unfortunately we only know which of the
790 two cases apply after we know the type of the second operand.
791 Therefore we evaluate it once using EVAL_AVOID_SIDE_EFFECTS. */
792 int oldpos = *pos;
793
0df8b418
MS
794 arg2 = evaluate_subexp (NULL_TYPE, exp, pos,
795 EVAL_AVOID_SIDE_EFFECTS);
f4b8a18d
KW
796 *pos = oldpos;
797 type1 = check_typedef (value_type (arg1));
798 type2 = check_typedef (value_type (arg2));
799
800 if ((TYPE_CODE (type1) == TYPE_CODE_ARRAY && TYPE_VECTOR (type1))
801 || (TYPE_CODE (type2) == TYPE_CODE_ARRAY && TYPE_VECTOR (type2)))
802 {
803 arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
804
805 return opencl_relop (exp, arg1, arg2, op);
806 }
807 else
808 {
809 /* For scalar built-in types, only evaluate the right
810 hand operand if the left hand operand compares
811 unequal(&&)/equal(||) to 0. */
812 int res;
813 int tmp = value_logical_not (arg1);
814
815 if (op == BINOP_LOGICAL_OR)
816 tmp = !tmp;
817
818 arg2 = evaluate_subexp (NULL_TYPE, exp, pos,
819 tmp ? EVAL_SKIP : noside);
820 type1 = language_bool_type (exp->language_defn, exp->gdbarch);
821
822 if (op == BINOP_LOGICAL_AND)
823 res = !tmp && !value_logical_not (arg2);
824 else /* BINOP_LOGICAL_OR */
825 res = tmp || !value_logical_not (arg2);
826
827 return value_from_longest (type1, res);
828 }
829 }
830
831 /* Handle the ternary selection operator. */
832 case TERNOP_COND:
833 (*pos)++;
834 arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
835 type1 = check_typedef (value_type (arg1));
836 if (TYPE_CODE (type1) == TYPE_CODE_ARRAY && TYPE_VECTOR (type1))
837 {
838 struct value *arg3, *tmp, *ret;
839 struct type *eltype2, *type3, *eltype3;
840 int t2_is_vec, t3_is_vec, i;
841 LONGEST lowb1, lowb2, lowb3, highb1, highb2, highb3;
842
843 arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
844 arg3 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
845 type2 = check_typedef (value_type (arg2));
846 type3 = check_typedef (value_type (arg3));
847 t2_is_vec
848 = TYPE_CODE (type2) == TYPE_CODE_ARRAY && TYPE_VECTOR (type2);
849 t3_is_vec
850 = TYPE_CODE (type3) == TYPE_CODE_ARRAY && TYPE_VECTOR (type3);
851
852 /* Widen the scalar operand to a vector if necessary. */
853 if (t2_is_vec || !t3_is_vec)
854 {
855 arg3 = value_cast (type2, arg3);
856 type3 = value_type (arg3);
857 }
858 else if (!t2_is_vec || t3_is_vec)
859 {
860 arg2 = value_cast (type3, arg2);
861 type2 = value_type (arg2);
862 }
863 else if (!t2_is_vec || !t3_is_vec)
864 {
865 /* Throw an error if arg2 or arg3 aren't vectors. */
866 error (_("\
867Cannot perform conditional operation on incompatible types"));
868 }
869
870 eltype2 = check_typedef (TYPE_TARGET_TYPE (type2));
871 eltype3 = check_typedef (TYPE_TARGET_TYPE (type3));
872
873 if (!get_array_bounds (type1, &lowb1, &highb1)
874 || !get_array_bounds (type2, &lowb2, &highb2)
875 || !get_array_bounds (type3, &lowb3, &highb3))
876 error (_("Could not determine the vector bounds"));
877
878 /* Throw an error if the types of arg2 or arg3 are incompatible. */
879 if (TYPE_CODE (eltype2) != TYPE_CODE (eltype3)
880 || TYPE_LENGTH (eltype2) != TYPE_LENGTH (eltype3)
881 || TYPE_UNSIGNED (eltype2) != TYPE_UNSIGNED (eltype3)
882 || lowb2 != lowb3 || highb2 != highb3)
883 error (_("\
884Cannot perform operation on vectors with different types"));
885
886 /* Throw an error if the sizes of arg1 and arg2/arg3 differ. */
887 if (lowb1 != lowb2 || lowb1 != lowb3
888 || highb1 != highb2 || highb1 != highb3)
889 error (_("\
890Cannot perform conditional operation on vectors with different sizes"));
891
892 ret = allocate_value (type2);
893
894 for (i = 0; i < highb1 - lowb1 + 1; i++)
895 {
896 tmp = value_logical_not (value_subscript (arg1, i)) ?
897 value_subscript (arg3, i) : value_subscript (arg2, i);
898 memcpy (value_contents_writeable (ret) +
899 i * TYPE_LENGTH (eltype2), value_contents_all (tmp),
900 TYPE_LENGTH (eltype2));
901 }
902
903 return ret;
904 }
905 else
906 {
907 if (value_logical_not (arg1))
908 {
909 /* Skip the second operand. */
910 evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
911
912 return evaluate_subexp (NULL_TYPE, exp, pos, noside);
913 }
914 else
915 {
916 /* Skip the third operand. */
917 arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
918 evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
919
920 return arg2;
921 }
922 }
923
924 /* Handle STRUCTOP_STRUCT to allow component access on OpenCL vectors. */
925 case STRUCTOP_STRUCT:
926 {
927 int pc = (*pos)++;
928 int tem = longest_to_int (exp->elts[pc + 1].longconst);
929
930 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
931 arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
932 type1 = check_typedef (value_type (arg1));
933
934 if (noside == EVAL_SKIP)
935 {
936 return value_from_longest (builtin_type (exp->gdbarch)->
937 builtin_int, 1);
938 }
939 else if (TYPE_CODE (type1) == TYPE_CODE_ARRAY && TYPE_VECTOR (type1))
940 {
941 return opencl_component_ref (exp, arg1, &exp->elts[pc + 2].string,
942 noside);
943 }
944 else
945 {
946 if (noside == EVAL_AVOID_SIDE_EFFECTS)
947 return
948 value_zero (lookup_struct_elt_type
949 (value_type (arg1),&exp->elts[pc + 2].string, 0),
950 lval_memory);
951 else
952 return value_struct_elt (&arg1, NULL,
953 &exp->elts[pc + 2].string, NULL,
954 "structure");
955 }
956 }
957 default:
958 break;
959 }
960
961 return evaluate_subexp_c (expect_type, exp, pos, noside);
962}
963
ea5e6b0e
UW
964/* Print OpenCL types. */
965
966static void
967opencl_print_type (struct type *type, const char *varstring,
968 struct ui_file *stream, int show, int level,
969 const struct type_print_options *flags)
970{
971 /* We nearly always defer to C type printing, except that vector
972 types are considered primitive in OpenCL, and should always
973 be printed using their TYPE_NAME. */
974 if (show > 0)
975 {
976 CHECK_TYPEDEF (type);
977 if (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type)
978 && TYPE_NAME (type) != NULL)
979 show = 0;
980 }
981
982 c_print_type (type, varstring, stream, show, level, flags);
983}
984
70221824 985static void
f4b8a18d 986opencl_language_arch_info (struct gdbarch *gdbarch,
c9def01d 987 struct language_arch_info *lai)
f4b8a18d 988{
c9def01d 989 struct type **types = builtin_opencl_type (gdbarch);
f4b8a18d 990
c9def01d
UW
991 /* Copy primitive types vector from gdbarch. */
992 lai->primitive_type_vector = types;
f4b8a18d 993
c9def01d
UW
994 /* Type of elements of strings. */
995 lai->string_char_type = types [opencl_primitive_type_char];
f4b8a18d
KW
996
997 /* Specifies the return type of logical and relational operations. */
998 lai->bool_type_symbol = "int";
c9def01d 999 lai->bool_type_default = types [opencl_primitive_type_int];
f4b8a18d
KW
1000}
1001
1002const struct exp_descriptor exp_descriptor_opencl =
1003{
1004 print_subexp_standard,
1005 operator_length_standard,
1006 operator_check_standard,
1007 op_name_standard,
1008 dump_subexp_body_standard,
1009 evaluate_subexp_opencl
1010};
1011
1012const struct language_defn opencl_language_defn =
1013{
1014 "opencl", /* Language name */
1015 language_opencl,
1016 range_check_off,
f4b8a18d
KW
1017 case_sensitive_on,
1018 array_row_major,
1019 macro_expansion_c,
1020 &exp_descriptor_opencl,
1021 c_parse,
1022 c_error,
1023 null_post_parser,
1024 c_printchar, /* Print a character constant */
1025 c_printstr, /* Function to print string constant */
1026 c_emit_char, /* Print a single char */
ea5e6b0e 1027 opencl_print_type, /* Print a type using appropriate syntax */
f4b8a18d
KW
1028 c_print_typedef, /* Print a typedef using appropriate syntax */
1029 c_val_print, /* Print a value using appropriate syntax */
1030 c_value_print, /* Print a top-level value */
a5ee536b 1031 default_read_var_value, /* la_read_var_value */
f4b8a18d
KW
1032 NULL, /* Language specific skip_trampoline */
1033 NULL, /* name_of_this */
1034 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
1035 basic_lookup_transparent_type,/* lookup_transparent_type */
1036 NULL, /* Language specific symbol demangler */
0df8b418
MS
1037 NULL, /* Language specific
1038 class_name_from_physname */
f4b8a18d
KW
1039 c_op_print_tab, /* expression operators for printing */
1040 1, /* c-style arrays */
1041 0, /* String lower bound */
1042 default_word_break_characters,
1043 default_make_symbol_completion_list,
1044 opencl_language_arch_info,
1045 default_print_array_index,
1046 default_pass_by_reference,
1047 c_get_string,
1a119f36 1048 NULL, /* la_get_symbol_name_cmp */
f8eba3c6 1049 iterate_over_symbols,
f4b8a18d
KW
1050 LANG_MAGIC
1051};
1052
1053static void *
1054build_opencl_types (struct gdbarch *gdbarch)
1055{
c9def01d
UW
1056 struct type **types
1057 = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_opencl_primitive_types + 1,
1058 struct type *);
f4b8a18d
KW
1059
1060/* Helper macro to create strings. */
0af3e2db 1061#define OCL_STRING(S) #S
f4b8a18d
KW
1062/* This macro allocates and assigns the type struct pointers
1063 for the vector types. */
1064#define BUILD_OCL_VTYPES(TYPE)\
c9def01d
UW
1065 types[opencl_primitive_type_##TYPE##2] \
1066 = init_vector_type (types[opencl_primitive_type_##TYPE], 2); \
1067 TYPE_NAME (types[opencl_primitive_type_##TYPE##2]) = OCL_STRING(TYPE ## 2); \
1068 types[opencl_primitive_type_##TYPE##3] \
1069 = init_vector_type (types[opencl_primitive_type_##TYPE], 3); \
1070 TYPE_NAME (types[opencl_primitive_type_##TYPE##3]) = OCL_STRING(TYPE ## 3); \
1071 TYPE_LENGTH (types[opencl_primitive_type_##TYPE##3]) \
1072 = 4 * TYPE_LENGTH (types[opencl_primitive_type_##TYPE]); \
1073 types[opencl_primitive_type_##TYPE##4] \
1074 = init_vector_type (types[opencl_primitive_type_##TYPE], 4); \
1075 TYPE_NAME (types[opencl_primitive_type_##TYPE##4]) = OCL_STRING(TYPE ## 4); \
1076 types[opencl_primitive_type_##TYPE##8] \
1077 = init_vector_type (types[opencl_primitive_type_##TYPE], 8); \
1078 TYPE_NAME (types[opencl_primitive_type_##TYPE##8]) = OCL_STRING(TYPE ## 8); \
1079 types[opencl_primitive_type_##TYPE##16] \
1080 = init_vector_type (types[opencl_primitive_type_##TYPE], 16); \
1081 TYPE_NAME (types[opencl_primitive_type_##TYPE##16]) = OCL_STRING(TYPE ## 16)
1082
1083 types[opencl_primitive_type_char]
f4b8a18d
KW
1084 = arch_integer_type (gdbarch, 8, 0, "char");
1085 BUILD_OCL_VTYPES (char);
c9def01d 1086 types[opencl_primitive_type_uchar]
f4b8a18d
KW
1087 = arch_integer_type (gdbarch, 8, 1, "uchar");
1088 BUILD_OCL_VTYPES (uchar);
c9def01d 1089 types[opencl_primitive_type_short]
f4b8a18d
KW
1090 = arch_integer_type (gdbarch, 16, 0, "short");
1091 BUILD_OCL_VTYPES (short);
c9def01d 1092 types[opencl_primitive_type_ushort]
f4b8a18d
KW
1093 = arch_integer_type (gdbarch, 16, 1, "ushort");
1094 BUILD_OCL_VTYPES (ushort);
c9def01d 1095 types[opencl_primitive_type_int]
f4b8a18d
KW
1096 = arch_integer_type (gdbarch, 32, 0, "int");
1097 BUILD_OCL_VTYPES (int);
c9def01d 1098 types[opencl_primitive_type_uint]
f4b8a18d
KW
1099 = arch_integer_type (gdbarch, 32, 1, "uint");
1100 BUILD_OCL_VTYPES (uint);
c9def01d 1101 types[opencl_primitive_type_long]
f4b8a18d
KW
1102 = arch_integer_type (gdbarch, 64, 0, "long");
1103 BUILD_OCL_VTYPES (long);
c9def01d 1104 types[opencl_primitive_type_ulong]
f4b8a18d
KW
1105 = arch_integer_type (gdbarch, 64, 1, "ulong");
1106 BUILD_OCL_VTYPES (ulong);
c9def01d 1107 types[opencl_primitive_type_half]
f4b8a18d
KW
1108 = arch_float_type (gdbarch, 16, "half", floatformats_ieee_half);
1109 BUILD_OCL_VTYPES (half);
c9def01d 1110 types[opencl_primitive_type_float]
f4b8a18d
KW
1111 = arch_float_type (gdbarch, 32, "float", floatformats_ieee_single);
1112 BUILD_OCL_VTYPES (float);
c9def01d 1113 types[opencl_primitive_type_double]
f4b8a18d
KW
1114 = arch_float_type (gdbarch, 64, "double", floatformats_ieee_double);
1115 BUILD_OCL_VTYPES (double);
c9def01d 1116 types[opencl_primitive_type_bool]
648cd113 1117 = arch_boolean_type (gdbarch, 8, 1, "bool");
c9def01d 1118 types[opencl_primitive_type_unsigned_char]
f4b8a18d 1119 = arch_integer_type (gdbarch, 8, 1, "unsigned char");
c9def01d 1120 types[opencl_primitive_type_unsigned_short]
f4b8a18d 1121 = arch_integer_type (gdbarch, 16, 1, "unsigned short");
c9def01d 1122 types[opencl_primitive_type_unsigned_int]
f4b8a18d 1123 = arch_integer_type (gdbarch, 32, 1, "unsigned int");
c9def01d 1124 types[opencl_primitive_type_unsigned_long]
f4b8a18d 1125 = arch_integer_type (gdbarch, 64, 1, "unsigned long");
c9def01d 1126 types[opencl_primitive_type_size_t]
f4b8a18d 1127 = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch), 1, "size_t");
c9def01d 1128 types[opencl_primitive_type_ptrdiff_t]
f4b8a18d 1129 = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch), 0, "ptrdiff_t");
c9def01d 1130 types[opencl_primitive_type_intptr_t]
f4b8a18d 1131 = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch), 0, "intptr_t");
c9def01d 1132 types[opencl_primitive_type_uintptr_t]
f4b8a18d 1133 = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch), 1, "uintptr_t");
c9def01d 1134 types[opencl_primitive_type_void]
f4b8a18d
KW
1135 = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void");
1136
c9def01d 1137 return types;
f4b8a18d
KW
1138}
1139
70221824
PA
1140/* Provide a prototype to silence -Wmissing-prototypes. */
1141extern initialize_file_ftype _initialize_opencl_language;
1142
f4b8a18d
KW
1143void
1144_initialize_opencl_language (void)
1145{
1146 opencl_type_data = gdbarch_data_register_post_init (build_opencl_types);
1147 add_language (&opencl_language_defn);
1148}