X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fopencl-lang.c;h=8af63f76206f3df69ffb6c71334890265182092d;hb=e31efe56455e4a0e84d2157e942e51f8ac94e9fc;hp=d7e66c465856f167c14f2591d9ad5c2887dd5160;hpb=fce632b6dc97eaa7e9f10f5c2c7dd8fd55931a51;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index d7e66c4658..8af63f7620 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1,5 +1,5 @@ /* OpenCL language support for GDB, the GNU debugger. - Copyright (C) 2010-2013 Free Software Foundation, Inc. + Copyright (C) 2010-2018 Free Software Foundation, Inc. Contributed by Ken Werner . @@ -19,17 +19,13 @@ along with this program. If not, see . */ #include "defs.h" -#include "gdb_string.h" #include "gdbtypes.h" #include "symtab.h" #include "expression.h" #include "parser-defs.h" -#include "symtab.h" #include "language.h" +#include "varobj.h" #include "c-lang.h" -#include "gdb_assert.h" - -extern void _initialize_opencl_language (void); /* This macro generates enum values from a given type. */ @@ -71,7 +67,7 @@ static struct gdbarch_data *opencl_type_data; static struct type ** builtin_opencl_type (struct gdbarch *gdbarch) { - return gdbarch_data (gdbarch, opencl_type_data); + return (struct type **) gdbarch_data (gdbarch, opencl_type_data); } /* Returns the corresponding OpenCL vector type from the given type code, @@ -156,11 +152,11 @@ struct lval_closure static struct lval_closure * allocate_lval_closure (int *indices, int n, struct value *val) { - struct lval_closure *c = XZALLOC (struct lval_closure); + struct lval_closure *c = XCNEW (struct lval_closure); c->refc = 1; c->n = n; - c->indices = XCALLOC (n, int); + c->indices = XCNEWVEC (int, n); memcpy (c->indices, indices, n * sizeof (int)); value_incref (val); /* Increment the reference counter of the value. */ c->val = val; @@ -174,8 +170,8 @@ lval_func_read (struct value *v) struct lval_closure *c = (struct lval_closure *) value_computed_closure (v); struct type *type = check_typedef (value_type (v)); struct type *eltype = TYPE_TARGET_TYPE (check_typedef (value_type (c->val))); - int offset = value_offset (v); - int elsize = TYPE_LENGTH (eltype); + LONGEST offset = value_offset (v); + LONGEST elsize = TYPE_LENGTH (eltype); int n, i, j = 0; LONGEST lowb = 0; LONGEST highb = 0; @@ -203,8 +199,8 @@ lval_func_write (struct value *v, struct value *fromval) struct lval_closure *c = (struct lval_closure *) value_computed_closure (v); struct type *type = check_typedef (value_type (v)); struct type *eltype = TYPE_TARGET_TYPE (check_typedef (value_type (c->val))); - int offset = value_offset (v); - int elsize = TYPE_LENGTH (eltype); + LONGEST offset = value_offset (v); + LONGEST elsize = TYPE_LENGTH (eltype); int n, i, j = 0; LONGEST lowb = 0; LONGEST highb = 0; @@ -240,64 +236,12 @@ lval_func_write (struct value *v, struct value *fromval) value_free_to_mark (mark); } -/* Return nonzero if all bits in V within OFFSET and LENGTH are valid. */ - -static int -lval_func_check_validity (const struct value *v, int offset, int length) -{ - struct lval_closure *c = (struct lval_closure *) value_computed_closure (v); - /* Size of the target type in bits. */ - int elsize = - TYPE_LENGTH (TYPE_TARGET_TYPE (check_typedef (value_type (c->val)))) * 8; - int startrest = offset % elsize; - int start = offset / elsize; - int endrest = (offset + length) % elsize; - int end = (offset + length) / elsize; - int i; - - if (endrest) - end++; - - if (end > c->n) - return 0; - - for (i = start; i < end; i++) - { - int comp_offset = (i == start) ? startrest : 0; - int comp_length = (i == end) ? endrest : elsize; - - if (!value_bits_valid (c->val, c->indices[i] * elsize + comp_offset, - comp_length)) - return 0; - } - - return 1; -} - -/* Return nonzero if any bit in V is valid. */ - -static int -lval_func_check_any_valid (const struct value *v) -{ - struct lval_closure *c = (struct lval_closure *) value_computed_closure (v); - /* Size of the target type in bits. */ - int elsize = - TYPE_LENGTH (TYPE_TARGET_TYPE (check_typedef (value_type (c->val)))) * 8; - int i; - - for (i = 0; i < c->n; i++) - if (value_bits_valid (c->val, c->indices[i] * elsize, elsize)) - return 1; - - return 0; -} - /* Return nonzero if bits in V from OFFSET and LENGTH represent a synthetic pointer. */ static int lval_func_check_synthetic_pointer (const struct value *v, - int offset, int length) + LONGEST offset, int length) { struct lval_closure *c = (struct lval_closure *) value_computed_closure (v); /* Size of the target type in bits. */ @@ -348,7 +292,7 @@ lval_func_free_closure (struct value *v) if (c->refc == 0) { - value_free (c->val); /* Decrement the reference counter of the value. */ + value_decref (c->val); /* Decrement the reference counter of the value. */ xfree (c->indices); xfree (c); } @@ -358,8 +302,6 @@ static const struct lval_funcs opencl_value_funcs = { lval_func_read, lval_func_write, - lval_func_check_validity, - lval_func_check_any_valid, NULL, /* indirect */ NULL, /* coerce_ref */ lval_func_check_synthetic_pointer, @@ -1035,10 +977,13 @@ Cannot perform conditional operation on vectors with different sizes")); } else { - /* Also handle EVAL_AVOID_SIDE_EFFECTS. */ - return value_struct_elt (&arg1, NULL, - &exp->elts[pc + 2].string, NULL, - "structure"); + struct value *v = value_struct_elt (&arg1, NULL, + &exp->elts[pc + 2].string, NULL, + "structure"); + + if (noside == EVAL_AVOID_SIDE_EFFECTS) + v = value_zero (value_type (v), VALUE_LVAL (v)); + return v; } } default: @@ -1060,7 +1005,7 @@ opencl_print_type (struct type *type, const char *varstring, be printed using their TYPE_NAME. */ if (show > 0) { - CHECK_TYPEDEF (type); + type = check_typedef (type); if (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type) && TYPE_NAME (type) != NULL) show = 0; @@ -1096,17 +1041,19 @@ const struct exp_descriptor exp_descriptor_opencl = evaluate_subexp_opencl }; -const struct language_defn opencl_language_defn = +extern const struct language_defn opencl_language_defn = { "opencl", /* Language name */ + "OpenCL C", language_opencl, range_check_off, case_sensitive_on, array_row_major, macro_expansion_c, + NULL, &exp_descriptor_opencl, c_parse, - c_error, + c_yyerror, null_post_parser, c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ @@ -1118,22 +1065,29 @@ const struct language_defn opencl_language_defn = default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ + false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ default_word_break_characters, - default_make_symbol_completion_list, + default_collect_symbol_completion_matches, opencl_language_arch_info, default_print_array_index, default_pass_by_reference, c_get_string, - NULL, /* la_get_symbol_name_cmp */ + c_watch_location_expression, + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, + &default_varobj_ops, + NULL, + NULL, LANG_MAGIC }; @@ -1219,17 +1173,13 @@ build_opencl_types (struct gdbarch *gdbarch) types[opencl_primitive_type_uintptr_t] = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch), 1, "uintptr_t"); types[opencl_primitive_type_void] - = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void"); + = arch_type (gdbarch, TYPE_CODE_VOID, TARGET_CHAR_BIT, "void"); return types; } -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_opencl_language; - void _initialize_opencl_language (void) { opencl_type_data = gdbarch_data_register_post_init (build_opencl_types); - add_language (&opencl_language_defn); }