[051/203] Split helper functions

Message ID 20210101214723.1784144-52-tom@tromey.com
State Superseded
Headers show
Series
  • Refactor expressions
Related show

Commit Message

Tom Tromey Jan. 1, 2021, 9:44 p.m.
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(-)

-- 
2.26.2

Patch

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?");
 }
 
+/* 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