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