* 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.
This commit is contained in:
parent
98b90dd888
commit
89eef11460
8 changed files with 158 additions and 92 deletions
80
gdb/eval.c
80
gdb/eval.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue