diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2008-09-11 14:13:46 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2008-09-11 14:13:46 +0000 |
commit | 89eef114606ca0510db54cec2fc60946a91990e8 (patch) | |
tree | ce97504e52ddf8d7505920f03559f2428b431940 /gdb/eval.c | |
parent | 98b90dd8884cb6526f17524e800a315860904ec0 (diff) | |
download | gdb-89eef114606ca0510db54cec2fc60946a91990e8.zip gdb-89eef114606ca0510db54cec2fc60946a91990e8.tar.gz gdb-89eef114606ca0510db54cec2fc60946a91990e8.tar.bz2 |
* value.h (value_add, value_sub): Remove.
(value_ptradd, value_ptrsub, value_ptrdiff): Add prototypes.
* valarith.c (value_add, value_sub): Remove.
(value_ptradd, value_ptrsub, value_ptrdiff): New functions.
(find_size_for_pointer_math): Add assertion. Update comment.
(value_binop): Update comment.
* eval.c (ptrmath_type_p): New function.
(evaluate_subexp_standard): Replace value_add and value_sub
by value_ptradd, value_ptrsub, value_ptrdiff or value_binop.
Use builtin_type_uint8 instead of builtin_type_char to hold
the increment for BINOP_{PRE,POST}{IN,DE}CREMENT operations.
* valarith.c (value_subscript): Replace value_add by
value_ptradd. Replace value_sub by value_binop.
* ada-lang.c (ada_value_ptr_subscript): Likewise.
(ada_tag_name_2): Replace value_add by value_ptradd.
(ada_evaluate_subexp): Replace value_add and value_sub by
value_binop.
* m2-lang.c (evaluate_subexp_modula2): Replace value_add
by value_ptradd.
* gnu-v2-abi.c (gnuv2_virtual_fn_field): Likewise.
* gnu-v3-abi.c (gnuv3_method_ptr_to_value): Likewise.
Diffstat (limited to 'gdb/eval.c')
-rw-r--r-- | gdb/eval.c | 80 |
1 files changed, 66 insertions, 14 deletions
@@ -439,6 +439,27 @@ value_f90_subarray (struct value *array, return value_slice (array, low_bound, high_bound - low_bound + 1); } +static int +ptrmath_type_p (struct type *type) +{ + type = check_typedef (type); + if (TYPE_CODE (type) == TYPE_CODE_REF) + type = TYPE_TARGET_TYPE (type); + + switch (TYPE_CODE (type)) + { + case TYPE_CODE_PTR: + case TYPE_CODE_FUNC: + return 1; + + case TYPE_CODE_ARRAY: + return current_language->c_style_arrays; + + default: + return 0; + } +} + struct value * evaluate_subexp_standard (struct type *expect_type, struct expression *exp, int *pos, @@ -1506,10 +1527,10 @@ evaluate_subexp_standard (struct type *expect_type, op = exp->elts[pc + 1].opcode; if (binop_user_defined_p (op, arg1, arg2)) return value_x_binop (arg1, arg2, BINOP_ASSIGN_MODIFY, op, noside); - else if (op == BINOP_ADD) - arg2 = value_add (arg1, arg2); - else if (op == BINOP_SUB) - arg2 = value_sub (arg1, arg2); + else if (op == BINOP_ADD && ptrmath_type_p (value_type (arg1))) + arg2 = value_ptradd (arg1, arg2); + else if (op == BINOP_SUB && ptrmath_type_p (value_type (arg1))) + arg2 = value_ptrsub (arg1, arg2); else arg2 = value_binop (arg1, arg2, op); return value_assign (arg1, arg2); @@ -1521,8 +1542,12 @@ evaluate_subexp_standard (struct type *expect_type, goto nosideret; if (binop_user_defined_p (op, arg1, arg2)) return value_x_binop (arg1, arg2, op, OP_NULL, noside); + else if (ptrmath_type_p (value_type (arg1))) + return value_ptradd (arg1, arg2); + else if (ptrmath_type_p (value_type (arg2))) + return value_ptradd (arg2, arg1); else - return value_add (arg1, arg2); + return value_binop (arg1, arg2, BINOP_ADD); case BINOP_SUB: arg1 = evaluate_subexp_with_coercion (exp, pos, noside); @@ -1531,8 +1556,19 @@ evaluate_subexp_standard (struct type *expect_type, goto nosideret; if (binop_user_defined_p (op, arg1, arg2)) return value_x_binop (arg1, arg2, op, OP_NULL, noside); + else if (ptrmath_type_p (value_type (arg1))) + { + if (ptrmath_type_p (value_type (arg2))) + { + /* FIXME -- should be ptrdiff_t */ + type = builtin_type (exp->gdbarch)->builtin_long; + return value_from_longest (type, value_ptrdiff (arg1, arg2)); + } + else + return value_ptrsub (arg1, arg2); + } else - return value_sub (arg1, arg2); + return value_binop (arg1, arg2, BINOP_SUB); case BINOP_EXP: case BINOP_MUL: @@ -2091,8 +2127,12 @@ evaluate_subexp_standard (struct type *expect_type, } else { - arg2 = value_add (arg1, value_from_longest (builtin_type_char, - (LONGEST) 1)); + arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1); + if (ptrmath_type_p (value_type (arg1))) + arg2 = value_ptradd (arg1, arg2); + else + arg2 = value_binop (arg1, arg2, BINOP_ADD); + return value_assign (arg1, arg2); } @@ -2106,8 +2146,12 @@ evaluate_subexp_standard (struct type *expect_type, } else { - arg2 = value_sub (arg1, value_from_longest (builtin_type_char, - (LONGEST) 1)); + arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1); + if (ptrmath_type_p (value_type (arg1))) + arg2 = value_ptrsub (arg1, arg2); + else + arg2 = value_binop (arg1, arg2, BINOP_SUB); + return value_assign (arg1, arg2); } @@ -2121,8 +2165,12 @@ evaluate_subexp_standard (struct type *expect_type, } else { - arg2 = value_add (arg1, value_from_longest (builtin_type_char, - (LONGEST) 1)); + arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1); + if (ptrmath_type_p (value_type (arg1))) + arg2 = value_ptradd (arg1, arg2); + else + arg2 = value_binop (arg1, arg2, BINOP_ADD); + value_assign (arg1, arg2); return arg1; } @@ -2137,8 +2185,12 @@ evaluate_subexp_standard (struct type *expect_type, } else { - arg2 = value_sub (arg1, value_from_longest (builtin_type_char, - (LONGEST) 1)); + arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1); + if (ptrmath_type_p (value_type (arg1))) + arg2 = value_ptrsub (arg1, arg2); + else + arg2 = value_binop (arg1, arg2, BINOP_SUB); + value_assign (arg1, arg2); return arg1; } |