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