Add expected type parameter to evaluate_expression
authorTom Tromey <tom@tromey.com>
Wed, 16 Dec 2020 01:35:13 +0000 (18:35 -0700)
committerTom Tromey <tom@tromey.com>
Wed, 16 Dec 2020 01:57:07 +0000 (18:57 -0700)
While working on the expression rewrite, I found a few spots that
called the internal functions of the expression evaluator, just to
pass in an expected type.  This patch adds a parameter to
evaluate_expression so that these functions can avoid this dependency.

Regression tested on x86-64 Fedora 28.

gdb/ChangeLog
2020-12-15  Tom Tromey  <tom@tromey.com>

* stap-probe.c (stap_probe::evaluate_argument): Use
evaluate_expression.
* dtrace-probe.c (dtrace_probe::evaluate_argument): Use
evaluate_expression.
* value.h (evaluate_expression): Add expect_type parameter.
* objc-lang.c (print_object_command): Call evaluate_expression.
* eval.c (evaluate_expression): Add expect_type parameter.

gdb/ChangeLog
gdb/dtrace-probe.c
gdb/eval.c
gdb/objc-lang.c
gdb/stap-probe.c
gdb/value.h

index 58075c921bb1073805612049202f8938241d0cad..91bf0a228159fde934b6c5310998f91fe14449e6 100644 (file)
@@ -1,3 +1,13 @@
+2020-12-15  Tom Tromey  <tom@tromey.com>
+
+       * stap-probe.c (stap_probe::evaluate_argument): Use
+       evaluate_expression.
+       * dtrace-probe.c (dtrace_probe::evaluate_argument): Use
+       evaluate_expression.
+       * value.h (evaluate_expression): Add expect_type parameter.
+       * objc-lang.c (print_object_command): Call evaluate_expression.
+       * eval.c (evaluate_expression): Add expect_type parameter.
+
 2020-12-15  Tom Tromey  <tom@tromey.com>
 
        * varobj.c (varobj_create): Use first_opcode.
index b709390039f4859a81d2959ee47d3b699edac4ee..c105763ad11f855584afd54ab5375f28a2ac0b55 100644 (file)
@@ -714,11 +714,9 @@ dtrace_probe::evaluate_argument (unsigned n,
 {
   struct gdbarch *gdbarch = this->get_gdbarch ();
   struct dtrace_probe_arg *arg;
-  int pos = 0;
 
   arg = this->get_arg_by_number (n, gdbarch);
-  return evaluate_subexp_standard (arg->type, arg->expr.get (), &pos,
-                                  EVAL_NORMAL);
+  return evaluate_expression (arg->expr.get (), arg->type);
 }
 
 /* Implementation of the compile_to_ax method.  */
index 2d088c8818d342e2967af194e3eaa9f911f10a51..c781fde0614ebd45fd272d3440e8d4509b4355fa 100644 (file)
@@ -120,17 +120,15 @@ parse_to_comma_and_eval (const char **expp)
   return evaluate_expression (expr.get ());
 }
 \f
-/* Evaluate an expression in internal prefix form
-   such as is constructed by parse.y.
 
-   See expression.h for info on the format of an expression.  */
+/* See value.h.  */
 
 struct value *
-evaluate_expression (struct expression *exp)
+evaluate_expression (struct expression *exp, struct type *expect_type)
 {
   int pc = 0;
 
-  return evaluate_subexp (nullptr, exp, &pc, EVAL_NORMAL);
+  return evaluate_subexp (expect_type, exp, &pc, EVAL_NORMAL);
 }
 
 /* Evaluate an expression, avoiding all memory references
index 4cd853249aa8e70697640feb47352f6db2c3726c..10220c81ec3e8f49158a0fb2bce10ab400803023 100644 (file)
@@ -1194,10 +1194,10 @@ print_object_command (const char *args, int from_tty)
 
   {
     expression_up expr = parse_expression (args);
-    int pc = 0;
 
-    object = evaluate_subexp (builtin_type (expr->gdbarch)->builtin_data_ptr,
-                             expr.get (), &pc, EVAL_NORMAL);
+    object
+      = evaluate_expression (expr.get (),
+                            builtin_type (expr->gdbarch)->builtin_data_ptr);
   }
 
   /* Validate the address for sanity.  */
index 9a704716c3e536c99ae0b94ceb3dff2281a4c722..ffcded3c317447d6ba84452d7f85c2ca39f84696 100644 (file)
@@ -1389,12 +1389,10 @@ struct value *
 stap_probe::evaluate_argument (unsigned n, struct frame_info *frame)
 {
   struct stap_probe_arg *arg;
-  int pos = 0;
   struct gdbarch *gdbarch = get_frame_arch (frame);
 
   arg = this->get_arg_by_number (n, gdbarch);
-  return evaluate_subexp_standard (arg->atype, arg->aexpr.get (), &pos,
-                                  EVAL_NORMAL);
+  return evaluate_expression (arg->aexpr.get (), arg->atype);
 }
 
 /* Compile the probe's argument N (indexed from 0) to agent expression.
index 25937f3c29785617ca4c290b40bebc0b50d24cec..98012a5e3ae7cea9b7b00cf09fec87aaf3224255 100644 (file)
@@ -905,7 +905,14 @@ extern int using_struct_return (struct gdbarch *gdbarch,
                                struct value *function,
                                struct type *value_type);
 
-extern struct value *evaluate_expression (struct expression *exp);
+/* Evaluate the expression EXP.  If set, EXPECT_TYPE is passed to the
+   outermost operation's evaluation.  This is ignored by most
+   operations, but may be used, e.g., to determine the type of an
+   otherwise untyped symbol.  The caller should not assume that the
+   returned value has this type.  */
+
+extern struct value *evaluate_expression (struct expression *exp,
+                                         struct type *expect_type = nullptr);
 
 extern struct value *evaluate_type (struct expression *exp);