X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalarith.c;h=efa41ed06568b0f5e29926d841fd67371d0c6600;hb=ec8f76882145c71bef81a9cadf0bf51ff9fa5b35;hp=96d54116a7d6150510851e7c1d51f21946149fa9;hpb=4e32eda7cb41f6ab1672a6f1c0420b163bc779b8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valarith.c b/gdb/valarith.c index 96d54116a7..efa41ed065 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-2016 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,69 +192,29 @@ 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_offs = elt_size * longest_to_int (index - lowerbound); - struct value *v; + ULONGEST elt_size = type_length_units (elt_type); + ULONGEST elt_offs = elt_size * (index - lowerbound); if (index < lowerbound || (!TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type) - && elt_offs >= TYPE_LENGTH (array_type))) - error (_("no such vector element")); - - if (VALUE_LVAL (array) == lval_memory && value_lazy (array)) - v = allocate_value_lazy (elt_type); - else + && elt_offs >= type_length_units (array_type))) { - v = allocate_value (elt_type); - value_contents_copy (v, value_embedded_offset (v), - array, value_embedded_offset (array) + elt_offs, - elt_size); + 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")); } - set_value_component_location (v, array); - VALUE_REGNUM (v) = VALUE_REGNUM (array); - VALUE_FRAME_ID (v) = VALUE_FRAME_ID (array); - set_value_offset (v, value_offset (array) + elt_offs); - 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); + if (is_dynamic_type (elt_type)) + { + CORE_ADDR address; - set_value_offset (v, offset + value_offset (bitstring)); + address = value_address (array) + elt_offs; + elt_type = resolve_dynamic_type (elt_type, NULL, address); + } - return v; + return value_from_component (array, elt_type, elt_offs); } @@ -328,17 +284,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 +308,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 +316,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 +473,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 +482,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 +526,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 +548,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 +591,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 +601,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 +697,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 +725,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 +739,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 +749,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 +773,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 +1376,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. */ @@ -1462,7 +1498,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); }