[PATCH 051/203] Split helper functions

Tom Tromey
2021-01-01T21:48:04Z

This splits a couple of address-of and sizeof functions, so that the
body can be reused by the (coming) new expression code.

gdb/ChangeLog
2021-01-01 Tom Tromey <tom@tromey.com>

* eval.c (evaluate_subexp_for_address_base): New function.
(evaluate_subexp_for_address): Use it.
(evaluate_subexp_for_sizeof_base): New function.
(evaluate_subexp_for_sizeof): Use it.
---
gdb/ChangeLog | 7 ++++++
gdb/eval.c | 65 +++++++++++++++++++++++++++++++++------------------
2 files changed, 49 insertions(+), 23 deletions(-)

diff --git a/gdb/eval.c b/gdb/eval.c
index 2907362f709..c27d80ba823 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -3056,6 +3056,29 @@ evaluate_subexp_standard (struct type *expect_type,
gdb_assert_not_reached ("missed return?");
}
\f
+/* Helper for evaluate_subexp_for_address. */
+
+static value *
+evaluate_subexp_for_address_base (struct expression *exp, enum noside noside,
+ value *x)
+{
+ if (noside == EVAL_AVOID_SIDE_EFFECTS)
+ {
+ struct type *type = check_typedef (value_type (x));
+
+ if (TYPE_IS_REFERENCE (type))
+ return value_zero (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
+ not_lval);
+ else if (VALUE_LVAL (x) == lval_memory || value_must_coerce_to_target (x))
+ return value_zero (lookup_pointer_type (value_type (x)),
+ not_lval);
+ else
+ error (_("Attempt to take address of "
+ "value not located in memory."));
+ }
+ return value_addr (x);
+}
+
/* Evaluate a subexpression of EXP, at index *POS,
and return the address of that subexpression.
Advance *POS over the subexpression.
@@ -3163,21 +3186,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
default_case:
x = evaluate_subexp (nullptr, exp, pos, noside);
default_case_after_eval:
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- {
- struct type *type = check_typedef (value_type (x));
-
- if (TYPE_IS_REFERENCE (type))
- return value_zero (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
- not_lval);
- else if (VALUE_LVAL (x) == lval_memory || value_must_coerce_to_target (x))
- return value_zero (lookup_pointer_type (value_type (x)),
- not_lval);
- else
- error (_("Attempt to take address of "
- "value not located in memory."));
- }
- return value_addr (x);
+ return evaluate_subexp_for_address_base (exp, noside, x);
}
}

@@ -3226,6 +3235,23 @@ evaluate_subexp_with_coercion (struct expression *exp,
}
}

+/* Helper function for evaluating the size of a type. */
+
+static value *
+evaluate_subexp_for_sizeof_base (struct expression *exp, struct type *type)
+{
+ /* FIXME: This should be size_t. */
+ struct type *size_type = builtin_type (exp->gdbarch)->builtin_int;
+ /* $5.3.3/2 of the C++ Standard (n3290 draft) says of sizeof:
+ "When applied to a reference or a reference type, the result is
+ the size of the referenced type." */
+ type = check_typedef (type);
+ if (exp->language_defn->la_language == language_cplus
+ && (TYPE_IS_REFERENCE (type)))
+ type = check_typedef (TYPE_TARGET_TYPE (type));
+ return value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type));
+}
+
/* Evaluate a subexpression of EXP, at index *POS,
and return a value for the size of that subexpression.
Advance *POS over the subexpression. If NOSIDE is EVAL_NORMAL
@@ -3349,14 +3375,7 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos,
break;
}

- /* $5.3.3/2 of the C++ Standard (n3290 draft) says of sizeof:
- "When applied to a reference or a reference type, the result is
- the size of the referenced type." */
- type = check_typedef (type);
- if (exp->language_defn->la_language == language_cplus
- && (TYPE_IS_REFERENCE (type)))
- type = check_typedef (TYPE_TARGET_TYPE (type));
- return value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type));
+ return evaluate_subexp_for_sizeof_base (exp, type);
}

/* Evaluate a subexpression of EXP, at index *POS, and return a value
--
2.26.2