X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalarith.c;h=7959f3b2215eff75058e025dd9f34594e40842aa;hb=c5ac15402a894e87a118526a066880f596b3c78d;hp=894a87ac04864443980fc0b61ed956bcf6424ec0;hpb=8954db33ac73962ac337cc456a782db7e9539c06;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valarith.c b/gdb/valarith.c index 894a87ac04..7959f3b221 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -1,6 +1,6 @@ /* Perform arithmetic and other operations on values, for GDB. - Copyright (C) 1986-2013 Free Software Foundation, Inc. + Copyright (C) 1986-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -24,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). */ @@ -56,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) @@ -123,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. " @@ -194,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); @@ -286,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; @@ -310,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 @@ -318,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"); @@ -472,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]) { @@ -481,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; @@ -510,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; @@ -532,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: @@ -576,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]) { @@ -586,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; @@ -1361,7 +1398,7 @@ value_vector_widen (struct value *scalar_value, struct type *vector_type) LONGEST low_bound, high_bound; int i; - CHECK_TYPEDEF (vector_type); + vector_type = check_typedef (vector_type); gdb_assert (TYPE_CODE (vector_type) == TYPE_CODE_ARRAY && TYPE_VECTOR (vector_type));