X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fvalarith.c;h=97145a1526569855f7b9ae19cba87c4b9083c72b;hb=8d3842cd156eb6cd6cd6c68c49c090b8f9452a2d;hp=a17c91af3f4875900b0310aa9888df225f467a10;hpb=0d5cff5020224cfd67bc3d6e30b158105d03a324;p=binutils-gdb.git diff --git a/gdb/valarith.c b/gdb/valarith.c index a17c91af3f4..97145a15265 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -1,7 +1,6 @@ /* Perform arithmetic and other operations on values, for GDB. - Copyright (C) 1986, 1988-2005, 2007-2012 Free Software Foundation, - Inc. + Copyright (C) 1986-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -25,12 +24,10 @@ #include "expression.h" #include "target.h" #include "language.h" -#include "gdb_string.h" #include "doublest.h" #include "dfp.h" #include #include "infcall.h" -#include "exceptions.h" /* Define whether or not the C operator '/' truncates towards zero for differently signed operands (truncation direction is undefined in C). */ @@ -57,7 +54,7 @@ find_size_for_pointer_math (struct type *ptr_type) gdb_assert (TYPE_CODE (ptr_type) == TYPE_CODE_PTR); ptr_target = check_typedef (TYPE_TARGET_TYPE (ptr_type)); - sz = TYPE_LENGTH (ptr_target); + sz = type_length_units (ptr_target); if (sz == 0) { if (TYPE_CODE (ptr_type) == TYPE_CODE_VOID) @@ -124,7 +121,7 @@ value_ptrdiff (struct value *arg1, struct value *arg2) "second argument is neither\n" "an integer nor a pointer of the same type.")); - sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1))); + sz = type_length_units (check_typedef (TYPE_TARGET_TYPE (type1))); if (sz == 0) { warning (_("Type size unknown, assuming 1. " @@ -139,7 +136,6 @@ value_ptrdiff (struct value *arg1, struct value *arg2) ARRAY may be of type TYPE_CODE_ARRAY or TYPE_CODE_STRING. If the current language supports C-style arrays, it may also be TYPE_CODE_PTR. - To access TYPE_CODE_BITSTRING values, use value_bitstring_subscript. See comments in value_coerce_array() for rationale for reason for doing lower bounds adjustment here rather than there. @@ -196,13 +192,20 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound) { struct type *array_type = check_typedef (value_type (array)); struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (array_type)); - unsigned int elt_size = TYPE_LENGTH (elt_type); + unsigned int elt_size = type_length_units (elt_type); unsigned int elt_offs = elt_size * longest_to_int (index - lowerbound); struct value *v; if (index < lowerbound || (!TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type) - && elt_offs >= TYPE_LENGTH (array_type))) - error (_("no such vector element")); + && elt_offs >= type_length_units (array_type))) + { + if (type_not_associated (array_type)) + error (_("no such vector element (vector not associated)")); + else if (type_not_allocated (array_type)) + error (_("no such vector element (vector not allocated)")); + else + error (_("no such vector element")); + } if (VALUE_LVAL (array) == lval_memory && value_lazy (array)) v = allocate_value_lazy (elt_type); @@ -221,46 +224,6 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound) return v; } -/* Return the value of BITSTRING[IDX] as (boolean) type TYPE. */ - -struct value * -value_bitstring_subscript (struct type *type, - struct value *bitstring, LONGEST index) -{ - - struct type *bitstring_type, *range_type; - struct value *v; - int offset, byte, bit_index; - LONGEST lowerbound, upperbound; - - bitstring_type = check_typedef (value_type (bitstring)); - gdb_assert (TYPE_CODE (bitstring_type) == TYPE_CODE_BITSTRING); - - range_type = TYPE_INDEX_TYPE (bitstring_type); - get_discrete_bounds (range_type, &lowerbound, &upperbound); - if (index < lowerbound || index > upperbound) - error (_("bitstring index out of range")); - - index -= lowerbound; - offset = index / TARGET_CHAR_BIT; - byte = *((char *) value_contents (bitstring) + offset); - - bit_index = index % TARGET_CHAR_BIT; - byte >>= (gdbarch_bits_big_endian (get_type_arch (bitstring_type)) ? - TARGET_CHAR_BIT - 1 - bit_index : bit_index); - - v = value_from_longest (type, byte & 1); - - set_value_bitpos (v, bit_index); - set_value_bitsize (v, 1); - set_value_component_location (v, bitstring); - VALUE_FRAME_ID (v) = VALUE_FRAME_ID (bitstring); - - set_value_offset (v, offset + value_offset (bitstring)); - - return v; -} - /* Check to see if either argument is a structure, or a reference to one. This is called so we know whether to go ahead with the normal @@ -279,7 +242,7 @@ binop_types_user_defined_p (enum exp_opcode op, if (TYPE_CODE (type1) == TYPE_CODE_REF) type1 = check_typedef (TYPE_TARGET_TYPE (type1)); - type2 = check_typedef (type1); + type2 = check_typedef (type2); if (TYPE_CODE (type2) == TYPE_CODE_REF) type2 = check_typedef (TYPE_TARGET_TYPE (type2)); @@ -328,17 +291,17 @@ unop_user_defined_p (enum exp_opcode op, struct value *arg1) situations or combinations thereof. */ static struct value * -value_user_defined_cpp_op (struct value **args, int nargs, char *operator, - int *static_memfuncp) +value_user_defined_cpp_op (struct value **args, int nargs, char *oper, + int *static_memfuncp, enum noside noside) { struct symbol *symp = NULL; struct value *valp = NULL; - find_overload_match (args, nargs, operator, BOTH /* could be method */, - 0 /* strict match */, &args[0], /* objp */ + find_overload_match (args, nargs, oper, BOTH /* could be method */, + &args[0] /* objp */, NULL /* pass NULL symbol since symbol is unknown */, - &valp, &symp, static_memfuncp, 0); + &valp, &symp, static_memfuncp, 0, noside); if (valp) return valp; @@ -352,7 +315,7 @@ value_user_defined_cpp_op (struct value **args, int nargs, char *operator, return value_of_variable (symp, 0); } - error (_("Could not find %s."), operator); + error (_("Could not find %s."), oper); } /* Lookup user defined operator NAME. Return a value representing the @@ -360,12 +323,15 @@ value_user_defined_cpp_op (struct value **args, int nargs, char *operator, static struct value * value_user_defined_op (struct value **argp, struct value **args, char *name, - int *static_memfuncp, int nargs) + int *static_memfuncp, int nargs, enum noside noside) { struct value *result = NULL; if (current_language->la_language == language_cplus) - result = value_user_defined_cpp_op (args, nargs, name, static_memfuncp); + { + result = value_user_defined_cpp_op (args, nargs, name, static_memfuncp, + noside); + } else result = value_struct_elt (argp, args, name, static_memfuncp, "structure"); @@ -514,7 +480,7 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, } argvec[0] = value_user_defined_op (&arg1, argvec + 1, tstr, - &static_memfuncp, 2); + &static_memfuncp, 2, noside); if (argvec[0]) { @@ -523,6 +489,21 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, argvec[1] = argvec[0]; argvec++; } + if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD) + { + /* Static xmethods are not supported yet. */ + gdb_assert (static_memfuncp == 0); + if (noside == EVAL_AVOID_SIDE_EFFECTS) + { + struct type *return_type + = result_type_of_xmethod (argvec[0], 2, argvec + 1); + + if (return_type == NULL) + error (_("Xmethod is missing return type.")); + return value_zero (return_type, VALUE_LVAL (arg1)); + } + return call_xmethod (argvec[0], 2, argvec + 1); + } if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type; @@ -552,7 +533,7 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) { struct gdbarch *gdbarch = get_type_arch (value_type (arg1)); struct value **argvec; - char *ptr, *mangle_ptr; + char *ptr; char tstr[13], mangle_tstr[13]; int static_memfuncp, nargs; @@ -574,7 +555,6 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) strcpy (tstr, "operator__"); ptr = tstr + 8; strcpy (mangle_tstr, "__"); - mangle_ptr = mangle_tstr + 2; switch (op) { case UNOP_PREINCREMENT: @@ -618,7 +598,7 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) } argvec[0] = value_user_defined_op (&arg1, argvec + 1, tstr, - &static_memfuncp, nargs); + &static_memfuncp, nargs, noside); if (argvec[0]) { @@ -628,6 +608,21 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) nargs --; argvec++; } + if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD) + { + /* Static xmethods are not supported yet. */ + gdb_assert (static_memfuncp == 0); + if (noside == EVAL_AVOID_SIDE_EFFECTS) + { + struct type *return_type + = result_type_of_xmethod (argvec[0], 1, argvec + 1); + + if (return_type == NULL) + error (_("Xmethod is missing return type.")); + return value_zero (return_type, VALUE_LVAL (arg1)); + } + return call_xmethod (argvec[0], 1, argvec + 1); + } if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type; @@ -709,9 +704,12 @@ value_concat (struct value *arg1, struct value *arg2) if (TYPE_CODE (type2) == TYPE_CODE_STRING || TYPE_CODE (type2) == TYPE_CODE_CHAR) { + struct cleanup *back_to; + count = longest_to_int (value_as_long (inval1)); inval2len = TYPE_LENGTH (type2); - ptr = (char *) alloca (count * inval2len); + ptr = (char *) xmalloc (count * inval2len); + back_to = make_cleanup (xfree, ptr); if (TYPE_CODE (type2) == TYPE_CODE_CHAR) { char_type = type2; @@ -734,11 +732,11 @@ value_concat (struct value *arg1, struct value *arg2) } } outval = value_string (ptr, count * inval2len, char_type); + do_cleanups (back_to); } - else if (TYPE_CODE (type2) == TYPE_CODE_BITSTRING - || TYPE_CODE (type2) == TYPE_CODE_BOOL) + else if (TYPE_CODE (type2) == TYPE_CODE_BOOL) { - error (_("unimplemented support for bitstring/boolean repeats")); + error (_("unimplemented support for boolean repeats")); } else { @@ -748,6 +746,8 @@ value_concat (struct value *arg1, struct value *arg2) else if (TYPE_CODE (type1) == TYPE_CODE_STRING || TYPE_CODE (type1) == TYPE_CODE_CHAR) { + struct cleanup *back_to; + /* We have two character strings to concatenate. */ if (TYPE_CODE (type2) != TYPE_CODE_STRING && TYPE_CODE (type2) != TYPE_CODE_CHAR) @@ -756,7 +756,8 @@ value_concat (struct value *arg1, struct value *arg2) } inval1len = TYPE_LENGTH (type1); inval2len = TYPE_LENGTH (type2); - ptr = (char *) alloca (inval1len + inval2len); + ptr = (char *) xmalloc (inval1len + inval2len); + back_to = make_cleanup (xfree, ptr); if (TYPE_CODE (type1) == TYPE_CODE_CHAR) { char_type = type1; @@ -779,18 +780,17 @@ value_concat (struct value *arg1, struct value *arg2) memcpy (ptr + inval1len, value_contents (inval2), inval2len); } outval = value_string (ptr, inval1len + inval2len, char_type); + do_cleanups (back_to); } - else if (TYPE_CODE (type1) == TYPE_CODE_BITSTRING - || TYPE_CODE (type1) == TYPE_CODE_BOOL) + else if (TYPE_CODE (type1) == TYPE_CODE_BOOL) { /* We have two bitstrings to concatenate. */ - if (TYPE_CODE (type2) != TYPE_CODE_BITSTRING - && TYPE_CODE (type2) != TYPE_CODE_BOOL) + if (TYPE_CODE (type2) != TYPE_CODE_BOOL) { - error (_("Bitstrings or booleans can only be concatenated " + error (_("Booleans can only be concatenated " "with other bitstrings or booleans.")); } - error (_("unimplemented support for bitstring/boolean concatenation.")); + error (_("unimplemented support for boolean concatenation.")); } else { @@ -1383,6 +1383,49 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) return val; } +/* Widen a scalar value SCALAR_VALUE to vector type VECTOR_TYPE by + replicating SCALAR_VALUE for each element of the vector. Only scalar + types that can be cast to the type of one element of the vector are + acceptable. The newly created vector value is returned upon success, + otherwise an error is thrown. */ + +struct value * +value_vector_widen (struct value *scalar_value, struct type *vector_type) +{ + /* Widen the scalar to a vector. */ + struct type *eltype, *scalar_type; + struct value *val, *elval; + LONGEST low_bound, high_bound; + int i; + + vector_type = check_typedef (vector_type); + + gdb_assert (TYPE_CODE (vector_type) == TYPE_CODE_ARRAY + && TYPE_VECTOR (vector_type)); + + if (!get_array_bounds (vector_type, &low_bound, &high_bound)) + error (_("Could not determine the vector bounds")); + + eltype = check_typedef (TYPE_TARGET_TYPE (vector_type)); + elval = value_cast (eltype, scalar_value); + + scalar_type = check_typedef (value_type (scalar_value)); + + /* If we reduced the length of the scalar then check we didn't loose any + important bits. */ + if (TYPE_LENGTH (eltype) < TYPE_LENGTH (scalar_type) + && !value_equal (elval, scalar_value)) + error (_("conversion of scalar to vector involves truncation")); + + val = allocate_value (vector_type); + for (i = 0; i < high_bound - low_bound + 1; i++) + /* Duplicate the contents of elval into the destination vector. */ + memcpy (value_contents_writeable (val) + (i * TYPE_LENGTH (eltype)), + value_contents_all (elval), TYPE_LENGTH (eltype)); + + return val; +} + /* Performs a binary operation on two vector operands by calling scalar_binop for each pair of vector components. */ @@ -1390,7 +1433,7 @@ static struct value * vector_binop (struct value *val1, struct value *val2, enum exp_opcode op) { struct value *val, *tmp, *mark; - struct type *type1, *type2, *eltype1, *eltype2, *result_type; + struct type *type1, *type2, *eltype1, *eltype2; int t1_is_vec, t2_is_vec, elsize, i; LONGEST low_bound1, high_bound1, low_bound2, high_bound2; @@ -1462,7 +1505,9 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) && !is_integral_type (t)) error (_("Argument to operation not a number or boolean.")); - *v = value_cast (t1_is_vec ? type1 : type2, *v); + /* Replicate the scalar value to make a vector value. */ + *v = value_vector_widen (*v, t1_is_vec ? type1 : type2); + val = vector_binop (arg1, arg2, op); }