aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-03-08 07:27:57 -0700
committerTom Tromey <tom@tromey.com>2021-03-08 07:28:08 -0700
commit13ea014aeefb4a11d43c2e9d9e28064a46bd5a4a (patch)
tree4d2010fd11bcfd1d9beed9c624ab8e513645a8d4 /gdb
parent1fa41fc710dd282dacb67cd035af7e350b1b1057 (diff)
downloadgdb-13ea014aeefb4a11d43c2e9d9e28064a46bd5a4a.zip
gdb-13ea014aeefb4a11d43c2e9d9e28064a46bd5a4a.tar.gz
gdb-13ea014aeefb4a11d43c2e9d9e28064a46bd5a4a.tar.bz2
Split helper functions
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/eval.c65
2 files changed, 49 insertions, 23 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 75409c6..0f3967f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
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.
(rust_evaluate_subexp): Use it.
diff --git a/gdb/eval.c b/gdb/eval.c
index e62f9e5..def1220 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -3081,6 +3081,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.
@@ -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