Split helper functions
authorTom Tromey <tom@tromey.com>
Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 8 Mar 2021 14:28:08 +0000 (07:28 -0700)
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-03-08  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
gdb/eval.c

index 75409c62e7519b5327f9bfa0ba881ebb8ca370e9..0f3967ffae57400ad778973f031a0ac148096f15 100644 (file)
@@ -1,3 +1,10 @@
+2021-03-08  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.
+
 2021-03-08  Tom Tromey  <tom@tromey.com>
 
        * rust-lang.c (eval_op_rust_structop): New function.
index e62f9e5dba4dea8b54b0c155ddb0a97a4f93ad7e..def1220888300b6ff99aace6f239f42666da1515 100644 (file)
@@ -3081,6 +3081,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.
@@ -3188,21 +3211,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);
     }
 }
 
@@ -3251,6 +3260,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
@@ -3374,14 +3400,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