Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 142/203] Implement function call operations
Date: Fri,  1 Jan 2021 14:46:22 -0700	[thread overview]
Message-ID: <20210101214723.1784144-143-tom@tromey.com> (raw)
In-Reply-To: <20210101214723.1784144-1-tom@tromey.com>

This implement function call operations.

The current function call code relies on some very lengthy code
(evaluate_funcall is 398 lines...) to distinguish between the
different opcodes that might appear in the callee position.

Rather than try to replicate this, and have a function that tried to
dissect many different kinds of operation subclass, this patch instead
puts the work into the callee.  A new operation::evaluate_funcall
method is added, and then this is overridden in the classes that
require special treatment.

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

	* expression.h (class operation) <evaluate_funcall>: New method.
	* expop.h (class scope_operation) <evaluate_funcall>: New method.
	(class var_value_operation) <evaluate_funcall>: New method.
	(class structop_base_operation) <evaluate_funcall>: New method.
	(class structop_member_base): New class.
	(class structop_member_operation): Derive from
	structop_member_base.
	(class structop_mptr_operation): Derive from
	structop_member_base.
	(class funcall_operation): New class.
	* eval.c (operation::evaluate_funcall)
	(var_value_operation::evaluate_funcall)
	(scope_operation::evaluate_funcall)
	(structop_member_base::evaluate_funcall)
	(structop_base_operation::evaluate_funcall): New methods.
---
 gdb/ChangeLog    |  18 +++
 gdb/eval.c       | 279 +++++++++++++++++++++++++++++++++++++++++++++++
 gdb/expop.h      |  55 +++++++++-
 gdb/expression.h |   9 ++
 4 files changed, 358 insertions(+), 3 deletions(-)

diff --git a/gdb/eval.c b/gdb/eval.c
index 2589e35ae30..ff3c58cd4a8 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1202,6 +1202,285 @@ evaluate_funcall (type *expect_type, expression *exp, int *pos,
 				  var_func_name, expect_type);
 }
 
+namespace expr
+{
+
+value *
+operation::evaluate_funcall (struct type *expect_type,
+			     struct expression *exp,
+			     enum noside noside,
+			     const std::vector<operation_up> &args)
+{
+  std::vector<value *> vals (args.size ());
+
+  value *callee = evaluate_with_coercion (exp, noside);
+  for (int i = 0; i < args.size (); ++i)
+    vals[i] = args[i]->evaluate_with_coercion (exp, noside);
+
+  return evaluate_subexp_do_call (exp, noside, callee, vals,
+				  nullptr, expect_type);
+}
+
+value *
+var_value_operation::evaluate_funcall (struct type *expect_type,
+				       struct expression *exp,
+				       enum noside noside,
+				       const std::vector<operation_up> &args)
+{
+  if (!overload_resolution
+      || exp->language_defn->la_language != language_cplus)
+    return operation::evaluate_funcall (expect_type, exp, noside, args);
+
+  std::vector<value *> argvec (args.size ());
+  for (int i = 0; i < args.size (); ++i)
+    argvec[i] = args[i]->evaluate_with_coercion (exp, noside);
+
+  struct symbol *symp;
+  find_overload_match (argvec, NULL, NON_METHOD,
+		       NULL, std::get<0> (m_storage),
+		       NULL, &symp, NULL, 0, noside);
+
+  if (SYMBOL_TYPE (symp)->code () == TYPE_CODE_ERROR)
+    error_unknown_type (symp->print_name ());
+  value *callee = evaluate_var_value (noside, std::get<1> (m_storage), symp);
+
+  return evaluate_subexp_do_call (exp, noside, callee, argvec,
+				  nullptr, expect_type);
+}
+
+value *
+scope_operation::evaluate_funcall (struct type *expect_type,
+				   struct expression *exp,
+				   enum noside noside,
+				   const std::vector<operation_up> &args)
+{
+  if (!overload_resolution
+      || exp->language_defn->la_language != language_cplus)
+    return operation::evaluate_funcall (expect_type, exp, noside, args);
+
+  /* Unpack it locally so we can properly handle overload
+     resolution.  */
+  const std::string &name = std::get<1> (m_storage);
+  struct type *type = std::get<0> (m_storage);
+
+  symbol *function = NULL;
+  const char *function_name = NULL;
+  std::vector<value *> argvec (1 + args.size ());
+  if (type->code () == TYPE_CODE_NAMESPACE)
+    {
+      function = cp_lookup_symbol_namespace (type->name (),
+					     name.c_str (),
+					     get_selected_block (0),
+					     VAR_DOMAIN).symbol;
+      if (function == NULL)
+	error (_("No symbol \"%s\" in namespace \"%s\"."),
+	       name.c_str (), type->name ());
+    }
+  else
+    {
+      gdb_assert (type->code () == TYPE_CODE_STRUCT
+		  || type->code () == TYPE_CODE_UNION);
+      function_name = name.c_str ();
+
+      /* We need a properly typed value for method lookup.  */
+      argvec[0] = value_zero (type, lval_memory);
+    }
+
+  for (int i = 0; i < args.size (); ++i)
+    argvec[i + 1] = args[i]->evaluate_with_coercion (exp, noside);
+  gdb::array_view<value *> arg_view = argvec;
+
+  value *callee = nullptr;
+  if (function_name != nullptr)
+    {
+      int static_memfuncp;
+
+      find_overload_match (arg_view, function_name, METHOD,
+			   &argvec[0], nullptr, &callee, nullptr,
+			   &static_memfuncp, 0, noside);
+      if (!static_memfuncp)
+	{
+	  /* For the time being, we don't handle this.  */
+	  error (_("Call to overloaded function %s requires "
+		   "`this' pointer"),
+		 function_name);
+	}
+
+      arg_view = arg_view.slice (1);
+    }
+  else
+    {
+      symbol *symp;
+      arg_view = arg_view.slice (1);
+      find_overload_match (arg_view, nullptr,
+			   NON_METHOD, nullptr, function,
+			   nullptr, &symp, nullptr, 1, noside);
+      callee = value_of_variable (symp, get_selected_block (0));
+    }
+
+  return evaluate_subexp_do_call (exp, noside, callee, arg_view,
+				  nullptr, expect_type);
+}
+
+value *
+structop_member_base::evaluate_funcall (struct type *expect_type,
+					struct expression *exp,
+					enum noside noside,
+					const std::vector<operation_up> &args)
+{
+  /* First, evaluate the structure into lhs.  */
+  value *lhs;
+  if (opcode () == STRUCTOP_MEMBER)
+    lhs = std::get<0> (m_storage)->evaluate_for_address (exp, noside);
+  else
+    lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
+
+  std::vector<value *> vals (args.size () + 1);
+  gdb::array_view<value *> val_view = vals;
+  /* If the function is a virtual function, then the aggregate
+     value (providing the structure) plays its part by providing
+     the vtable.  Otherwise, it is just along for the ride: call
+     the function directly.  */
+  value *rhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
+  value *callee;
+
+  type *a1_type = check_typedef (value_type (rhs));
+  if (a1_type->code () == TYPE_CODE_METHODPTR)
+    {
+      if (noside == EVAL_AVOID_SIDE_EFFECTS)
+	callee = value_zero (TYPE_TARGET_TYPE (a1_type), not_lval);
+      else
+	callee = cplus_method_ptr_to_value (&lhs, rhs);
+
+      vals[0] = lhs;
+    }
+  else if (a1_type->code () == TYPE_CODE_MEMBERPTR)
+    {
+      struct type *type_ptr
+	= lookup_pointer_type (TYPE_SELF_TYPE (a1_type));
+      struct type *target_type_ptr
+	= lookup_pointer_type (TYPE_TARGET_TYPE (a1_type));
+
+      /* Now, convert this value to an address.  */
+      lhs = value_cast (type_ptr, lhs);
+
+      long mem_offset = value_as_long (rhs);
+
+      callee = value_from_pointer (target_type_ptr,
+				   value_as_long (lhs) + mem_offset);
+      callee = value_ind (callee);
+
+      val_view = val_view.slice (1);
+    }
+  else
+    error (_("Non-pointer-to-member value used in pointer-to-member "
+	     "construct"));
+
+  for (int i = 0; i < args.size (); ++i)
+    vals[i + 1] = args[i]->evaluate_with_coercion (exp, noside);
+
+  return evaluate_subexp_do_call (exp, noside, callee, val_view,
+				  nullptr, expect_type);
+
+}
+
+value *
+structop_base_operation::evaluate_funcall
+     (struct type *expect_type, struct expression *exp, enum noside noside,
+      const std::vector<operation_up> &args)
+{
+  std::vector<value *> vals (args.size () + 1);
+  /* First, evaluate the structure into vals[0].  */
+  enum exp_opcode op = opcode ();
+  if (op == STRUCTOP_STRUCT)
+    {
+      /* If v is a variable in a register, and the user types
+	 v.method (), this will produce an error, because v has no
+	 address.
+
+	 A possible way around this would be to allocate a copy of
+	 the variable on the stack, copy in the contents, call the
+	 function, and copy out the contents.  I.e. convert this
+	 from call by reference to call by copy-return (or
+	 whatever it's called).  However, this does not work
+	 because it is not the same: the method being called could
+	 stash a copy of the address, and then future uses through
+	 that address (after the method returns) would be expected
+	 to use the variable itself, not some copy of it.  */
+      vals[0] = std::get<0> (m_storage)->evaluate_for_address (exp, noside);
+    }
+  else
+    {
+      vals[0] = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
+      /* Check to see if the operator '->' has been overloaded.
+	 If the operator has been overloaded replace vals[0] with the
+	 value returned by the custom operator and continue
+	 evaluation.  */
+      while (unop_user_defined_p (op, vals[0]))
+	{
+	  struct value *value = nullptr;
+	  try
+	    {
+	      value = value_x_unop (vals[0], op, noside);
+	    }
+	  catch (const gdb_exception_error &except)
+	    {
+	      if (except.error == NOT_FOUND_ERROR)
+		break;
+	      else
+		throw;
+	    }
+
+	  vals[0] = value;
+	}
+    }
+
+  for (int i = 0; i < args.size (); ++i)
+    vals[i + 1] = args[i]->evaluate_with_coercion (exp, noside);
+  gdb::array_view<value *> arg_view = vals;
+
+  int static_memfuncp;
+  value *callee;
+  const char *tstr = std::get<1> (m_storage).c_str ();
+  if (overload_resolution
+      && exp->language_defn->la_language == language_cplus)
+    {
+      /* Language is C++, do some overload resolution before
+	 evaluation.  */
+      value *val0 = vals[0];
+      find_overload_match (arg_view, tstr, METHOD,
+			   &val0, nullptr, &callee, nullptr,
+			   &static_memfuncp, 0, noside);
+      vals[0] = val0;
+    }
+  else
+    /* Non-C++ case -- or no overload resolution.  */
+    {
+      struct value *temp = vals[0];
+
+      callee = value_struct_elt (&temp, &vals[1], tstr,
+				 &static_memfuncp,
+				 op == STRUCTOP_STRUCT
+				 ? "structure" : "structure pointer");
+      /* value_struct_elt updates temp with the correct value of the
+	 ``this'' pointer if necessary, so modify it to reflect any
+	 ``this'' changes.  */
+      vals[0] = value_from_longest (lookup_pointer_type (value_type (temp)),
+				    value_address (temp)
+				    + value_embedded_offset (temp));
+    }
+
+  /* Take out `this' if needed.  */
+  if (static_memfuncp)
+    arg_view = arg_view.slice (1);
+
+  return evaluate_subexp_do_call (exp, noside, callee, arg_view,
+				  nullptr, expect_type);
+}
+
+
+} /* namespace expr */
+
 /* Return true if type is integral or reference to integral */
 
 static bool
diff --git a/gdb/expop.h b/gdb/expop.h
index 08e40345e76..de4b876de39 100644
--- a/gdb/expop.h
+++ b/gdb/expop.h
@@ -594,6 +594,11 @@ class scope_operation
   value *evaluate_for_address (struct expression *exp,
 			       enum noside noside) override;
 
+  value *evaluate_funcall (struct type *expect_type,
+			   struct expression *exp,
+			   enum noside noside,
+			   const std::vector<operation_up> &args) override;
+
   enum exp_opcode opcode () const override
   { return OP_SCOPE; }
 
@@ -631,6 +636,11 @@ class var_value_operation
   value *evaluate_for_address (struct expression *exp, enum noside noside)
     override;
 
+  value *evaluate_funcall (struct type *expect_type,
+			   struct expression *exp,
+			   enum noside noside,
+			   const std::vector<operation_up> &args) override;
+
   enum exp_opcode opcode () const override
   { return OP_VAR_VALUE; }
 
@@ -971,6 +981,11 @@ class structop_base_operation
 					      EVAL_AVOID_SIDE_EFFECTS);
   }
 
+  value *evaluate_funcall (struct type *expect_type,
+			   struct expression *exp,
+			   enum noside noside,
+			   const std::vector<operation_up> &args) override;
+
 protected:
 
   using tuple_holding_operation::tuple_holding_operation;
@@ -1044,13 +1059,26 @@ class structop_ptr_operation
   }
 };
 
-class structop_member_operation
+class structop_member_base
   : public tuple_holding_operation<operation_up, operation_up>
 {
 public:
 
   using tuple_holding_operation::tuple_holding_operation;
 
+  value *evaluate_funcall (struct type *expect_type,
+			   struct expression *exp,
+			   enum noside noside,
+			   const std::vector<operation_up> &args) override;
+};
+
+class structop_member_operation
+  : public structop_member_base
+{
+public:
+
+  using structop_member_base::structop_member_base;
+
   value *evaluate (struct type *expect_type,
 		   struct expression *exp,
 		   enum noside noside) override
@@ -1067,11 +1095,11 @@ class structop_member_operation
 };
 
 class structop_mptr_operation
-  : public tuple_holding_operation<operation_up, operation_up>
+  : public structop_member_base
 {
 public:
 
-  using tuple_holding_operation::tuple_holding_operation;
+  using structop_member_base::structop_member_base;
 
   value *evaluate (struct type *expect_type,
 		   struct expression *exp,
@@ -2068,6 +2096,27 @@ class array_operation
 				       enum noside noside, int nargs);
 };
 
+/* A function call.  This holds the callee operation and the
+   arguments.  */
+class funcall_operation
+  : public tuple_holding_operation<operation_up, std::vector<operation_up>>
+{
+public:
+
+  using tuple_holding_operation::tuple_holding_operation;
+
+  value *evaluate (struct type *expect_type,
+		   struct expression *exp,
+		   enum noside noside) override
+  {
+    return std::get<0> (m_storage)->evaluate_funcall (expect_type, exp, noside,
+						      std::get<1> (m_storage));
+  }
+
+  enum exp_opcode opcode () const override
+  { return OP_FUNCALL; }
+};
+
 } /* namespace expr */
 
 #endif /* EXPOP_H */
diff --git a/gdb/expression.h b/gdb/expression.h
index 08a6424fdd2..a850f64d160 100644
--- a/gdb/expression.h
+++ b/gdb/expression.h
@@ -144,6 +144,15 @@ class operation
   virtual value *evaluate_for_address (struct expression *exp,
 				       enum noside noside);
 
+  /* Evaluate a function call, with this object as the callee.
+     EXPECT_TYPE, EXP, and NOSIDE have the same meaning as in
+     'evaluate'.  ARGS holds the operations that should be evaluated
+     to get the arguments to the call.  */
+  virtual value *evaluate_funcall (struct type *expect_type,
+				   struct expression *exp,
+				   enum noside noside,
+				   const std::vector<operation_up> &args);
+
   /* True if this is a constant expression.  */
   virtual bool constant_p () const
   { return false; }
-- 
2.26.2


  parent reply	other threads:[~2021-01-01 21:49 UTC|newest]

Thread overview: 225+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-01 21:44 [PATCH 000/203] Refactor expressions Tom Tromey
2021-01-01 21:44 ` [PATCH 001/203] Split out eval_op_scope Tom Tromey
2021-01-01 21:44 ` [PATCH 002/203] Split out eval_op_var_entry_value Tom Tromey
2021-01-01 21:44 ` [PATCH 003/203] Split out eval_op_var_msym_value Tom Tromey
2021-01-04 11:43   ` Andrew Burgess
2021-02-13 19:37     ` Tom Tromey
2021-01-01 21:44 ` [PATCH 004/203] Split out eval_op_func_static_var Tom Tromey
2021-01-01 21:44 ` [PATCH 005/203] Split out eval_op_register Tom Tromey
2021-01-01 21:44 ` [PATCH 006/203] Split out eval_op_string Tom Tromey
2021-01-01 21:44 ` [PATCH 007/203] Split out eval_op_objc_selector Tom Tromey
2021-01-01 21:44 ` [PATCH 008/203] Split out eval_op_concat Tom Tromey
2021-01-01 21:44 ` [PATCH 009/203] what is this code for Tom Tromey
2021-01-03  6:00   ` Joel Brobecker
2021-01-25  2:28     ` Simon Marchi via Gdb-patches
2021-01-25  3:27       ` Tom Tromey
2021-02-11  2:25       ` Tom Tromey
2021-02-13 19:37         ` Tom Tromey
2021-01-01 21:44 ` [PATCH 010/203] Split out eval_op_ternop Tom Tromey
2021-01-01 21:44 ` [PATCH 011/203] Split out eval_op_structop_struct Tom Tromey
2021-01-01 21:44 ` [PATCH 012/203] Split out eval_op_structop_ptr Tom Tromey
2021-01-01 21:44 ` [PATCH 013/203] Split out eval_op_member Tom Tromey
2021-01-01 21:44 ` [PATCH 014/203] Split out eval_op_add Tom Tromey
2021-01-01 21:44 ` [PATCH 015/203] Split out eval_op_sub Tom Tromey
2021-01-01 21:44 ` [PATCH 016/203] Split out eval_op_binary Tom Tromey
2021-01-01 21:44 ` [PATCH 017/203] Split out eval_op_subscript Tom Tromey
2021-01-01 21:44 ` [PATCH 018/203] Split out eval_op_equal Tom Tromey
2021-01-01 21:44 ` [PATCH 019/203] Split out eval_op_notequal Tom Tromey
2021-01-01 21:44 ` [PATCH 020/203] Split out eval_op_less Tom Tromey
2021-01-01 21:44 ` [PATCH 021/203] Split out eval_op_gtr Tom Tromey
2021-01-01 21:44 ` [PATCH 022/203] Split out eval_op_geq Tom Tromey
2021-01-01 21:44 ` [PATCH 023/203] Split out eval_op_leq Tom Tromey
2021-01-01 21:44 ` [PATCH 024/203] Split out eval_op_repeat Tom Tromey
2021-01-01 21:44 ` [PATCH 025/203] Split out eval_op_plus Tom Tromey
2021-01-01 21:44 ` [PATCH 026/203] Split out eval_op_neg Tom Tromey
2021-01-01 21:44 ` [PATCH 027/203] Split out eval_op_complement Tom Tromey
2021-01-01 21:44 ` [PATCH 028/203] Split out eval_op_lognot Tom Tromey
2021-01-01 21:44 ` [PATCH 029/203] Split out eval_op_ind Tom Tromey
2021-01-01 21:44 ` [PATCH 030/203] Split out eval_op_alignof Tom Tromey
2021-01-01 21:44 ` [PATCH 031/203] Split out eval_op_memval Tom Tromey
2021-01-01 21:44 ` [PATCH 032/203] Split out eval_op_preinc Tom Tromey
2021-01-01 21:44 ` [PATCH 033/203] Split out eval_op_predec Tom Tromey
2021-01-01 21:44 ` [PATCH 034/203] Split out eval_op_postinc Tom Tromey
2021-01-01 21:44 ` [PATCH 035/203] Split out eval_op_postdec Tom Tromey
2021-01-01 21:44 ` [PATCH 036/203] Split out eval_op_type Tom Tromey
2021-01-01 21:44 ` [PATCH 037/203] Split out eval_op_f_abs Tom Tromey
2021-01-01 21:44 ` [PATCH 038/203] Split out eval_op_f_mod Tom Tromey
2021-01-01 21:44 ` [PATCH 039/203] Split out eval_op_f_ceil Tom Tromey
2021-01-01 21:44 ` [PATCH 040/203] Split out eval_op_f_floor Tom Tromey
2021-01-01 21:44 ` [PATCH 041/203] Split out eval_op_f_modulo Tom Tromey
2021-01-01 21:44 ` [PATCH 042/203] Split out eval_op_f_cmplx Tom Tromey
2021-01-01 21:44 ` [PATCH 043/203] Split out eval_op_f_kind Tom Tromey
2021-01-01 21:44 ` [PATCH 044/203] Change parameters to rust_range Tom Tromey
2021-01-01 21:44 ` [PATCH 045/203] Change parameters to rust_subscript Tom Tromey
2021-01-01 21:44 ` [PATCH 046/203] Split out eval_op_rust_ind Tom Tromey
2021-01-01 21:44 ` [PATCH 047/203] Split out eval_op_rust_complement Tom Tromey
2021-01-01 21:44 ` [PATCH 048/203] Split out eval_op_rust_array Tom Tromey
2021-01-01 21:44 ` [PATCH 049/203] Split out eval_op_rust_struct_anon Tom Tromey
2021-01-01 21:44 ` [PATCH 050/203] Split out eval_op_rust_structop Tom Tromey
2021-01-01 21:44 ` [PATCH 051/203] Split helper functions Tom Tromey
2021-01-01 21:44 ` [PATCH 052/203] Split out eval_op_m2_high Tom Tromey
2021-01-04 12:05   ` Andrew Burgess
2021-02-10  0:56     ` Tom Tromey
2021-01-01 21:44 ` [PATCH 053/203] Split out eval_op_m2_subscript Tom Tromey
2021-01-01 21:44 ` [PATCH 054/203] Split out eval_binop_assign_modify Tom Tromey
2021-01-01 21:44 ` [PATCH 055/203] Split out eval_op_objc_msgcall Tom Tromey
2021-01-01 21:44 ` [PATCH 056/203] Split out eval_opencl_assign Tom Tromey
2021-01-01 21:44 ` [PATCH 057/203] Split out eval_ternop_in_range Tom Tromey
2021-01-01 21:44 ` [PATCH 058/203] Split out ada_unop_neg Tom Tromey
2021-01-01 21:44 ` [PATCH 059/203] Split out ada_unop_in_range Tom Tromey
2021-01-01 21:45 ` [PATCH 060/203] Split out ada_atr_tag Tom Tromey
2021-01-01 21:45 ` [PATCH 061/203] Split out ada_atr_size Tom Tromey
2021-01-01 21:45 ` [PATCH 062/203] Split out ada_abs Tom Tromey
2021-01-01 21:45 ` [PATCH 063/203] Split out ada_mult_binop Tom Tromey
2021-01-01 21:45 ` [PATCH 064/203] Split out ada_equal_binop Tom Tromey
2021-01-01 21:45 ` [PATCH 065/203] Split out ada_ternop_slice Tom Tromey
2021-01-01 21:45 ` [PATCH 066/203] Split out ada_binop_in_bounds Tom Tromey
2021-01-01 21:45 ` [PATCH 067/203] Split out ada_unop_atr Tom Tromey
2021-01-01 21:45 ` [PATCH 068/203] Split out ada_binop_minmax Tom Tromey
2021-01-01 21:45 ` [PATCH 069/203] Change value_val_atr to ada_val_atr Tom Tromey
2021-01-01 21:45 ` [PATCH 070/203] Split out ada_binop_exp Tom Tromey
2021-01-01 21:45 ` [PATCH 071/203] Split out eval_multi_subscript Tom Tromey
2021-01-01 21:45 ` [PATCH 072/203] Split gen_expr_binop_rest Tom Tromey
2021-01-01 21:45 ` [PATCH 073/203] Introduce class operation Tom Tromey
2021-01-03  7:09   ` Joel Brobecker
2021-01-03 13:55     ` Lancelot SIX via Gdb-patches
2021-02-10  0:57       ` Tom Tromey
2021-01-01 21:45 ` [PATCH 074/203] Implement dumping Tom Tromey
2021-01-01 21:45 ` [PATCH 075/203] Add two agent expression helper functions Tom Tromey
2021-01-01 21:45 ` [PATCH 076/203] Introduce float_const_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 077/203] Introduce scope_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 078/203] Introduce long_const_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 079/203] Introduce var_msym_value_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 080/203] Introduce var_entry_value_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 081/203] Introduce func_static_var_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 082/203] Introduce last_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 083/203] Introduce register_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 084/203] Introduce bool_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 085/203] Introduce internalvar_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 086/203] Introduce string_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 087/203] Introduce ternop_slice_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 088/203] Introduce ternop_cond_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 089/203] Add c-exp.h and c_string_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 090/203] Introduce objc_nsstring_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 091/203] Introduce objc_selector_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 092/203] Introduce complex_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 093/203] Introduce structop_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 094/203] Introduce structop_ptr_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 095/203] Introduce structop_member_operation and structop_mptr_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 096/203] Introduce concat_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 097/203] Introduce add_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 098/203] Introduce sub_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 099/203] Introduce binop_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 100/203] Introduce subscript_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 101/203] Implement binary comparison operations Tom Tromey
2021-01-01 21:45 ` [PATCH 102/203] Introduce repeat_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 103/203] Introduce comma_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 104/203] Implement some unary operations Tom Tromey
2021-01-01 21:45 ` [PATCH 105/203] Implement unary increment and decrement operations Tom Tromey
2021-01-01 21:45 ` [PATCH 106/203] Introduce unop_ind_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 107/203] Introduce type_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 108/203] Introduce typeof_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 109/203] Introduce decltype_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 110/203] Introduce typeid_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 111/203] Introduce unop_addr_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 112/203] Introduce unop_sizeof_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 113/203] Introduce unop_alignof_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 114/203] Implement UNOP_MEMVAL and UNOP_MEMVAL_TYPE Tom Tromey
2021-01-01 21:45 ` [PATCH 115/203] Introduce op_this_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 116/203] Introduce type_instance_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 117/203] Introduce assign_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 118/203] Introduce assign_modify_operation Tom Tromey
2021-01-01 21:45 ` [PATCH 119/203] Introduce unop_cast_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 120/203] Introduce unop_cast_type_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 121/203] Implement C++ cast operations Tom Tromey
2021-01-01 21:46 ` [PATCH 122/203] Introduce var_value_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 123/203] Introduce objc_msgcall_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 124/203] Introduce multi_subscript_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 125/203] Introduce ada_wrapped_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 126/203] Introduce ada_string_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 127/203] Introduce ada_qual_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 128/203] Introduce ada_ternop_range_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 129/203] Implement several Fortran operations Tom Tromey
2021-01-01 21:46 ` [PATCH 130/203] Implement some Rust operations Tom Tromey
2021-01-01 21:46 ` [PATCH 131/203] Introduce rust_unop_ind_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 132/203] Introduce rust_subscript_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 133/203] Introduce rust_range_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 134/203] Implement Rust field operations Tom Tromey
2021-01-01 21:46 ` [PATCH 135/203] Introduce rust_aggregate_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 136/203] Add two simple Modula-2 operations Tom Tromey
2021-01-07 15:16   ` Gaius Mulley via Gdb-patches
2021-01-01 21:46 ` [PATCH 137/203] Implement the "&&" and "||" operators Tom Tromey
2021-01-01 21:46 ` [PATCH 138/203] Implement some Ada unary operations Tom Tromey
2021-01-01 21:46 ` [PATCH 139/203] Introduce ada_unop_range_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 140/203] Introduce class adl_func_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 141/203] Introduce array_operation Tom Tromey
2021-01-01 21:46 ` Tom Tromey [this message]
2021-01-01 21:46 ` [PATCH 143/203] Implement Rust funcall operation Tom Tromey
2021-01-01 21:46 ` [PATCH 144/203] Introduce fortran_undetermined Tom Tromey
2021-01-01 21:46 ` [PATCH 145/203] Introduce opencl_cast_type_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 146/203] Implement OpenCL binary operations Tom Tromey
2021-01-01 21:46 ` [PATCH 147/203] Introduce opencl_notequal_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 148/203] Introduce opencl_structop_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 149/203] Implement OpenCL logical binary operations Tom Tromey
2021-01-01 21:46 ` [PATCH 150/203] Implement OpenCL ternary conditional operator Tom Tromey
2021-01-01 21:46 ` [PATCH 151/203] Split out some Ada type resolution code Tom Tromey
2021-01-03  7:46   ` Joel Brobecker
2021-02-13 19:47     ` Tom Tromey
2021-01-01 21:46 ` [PATCH 152/203] Introduce ada_binop_addsub_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 153/203] Implement Ada multiplicative operators Tom Tromey
2021-01-01 21:46 ` [PATCH 154/203] Implement Ada equality operators Tom Tromey
2021-01-01 21:46 ` [PATCH 155/203] Introduce ada_bitwise_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 156/203] Introduce ada_ternop_slice Tom Tromey
2021-01-01 21:46 ` [PATCH 157/203] Introduce ada_binop_in_bounds Tom Tromey
2021-01-01 21:46 ` [PATCH 158/203] Implement some Ada OP_ATR_ operations Tom Tromey
2021-01-01 21:46 ` [PATCH 159/203] Introduce ada_var_value_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 160/203] Introduce ada_var_msym_value_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 161/203] Implement Ada min and max operations Tom Tromey
2021-01-01 21:46 ` [PATCH 162/203] Refactor value_pos_atr Tom Tromey
2021-01-01 21:46 ` [PATCH 163/203] Introduce ada_pos_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 164/203] Introduce ada_atr_val_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 165/203] Introduce ada_binop_exp_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 166/203] Introduce ada_unop_ind_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 167/203] Introduce ada_structop_operation Tom Tromey
2021-01-01 21:46 ` [PATCH 168/203] Implement function calls for Ada Tom Tromey
2021-01-01 21:46 ` [PATCH 169/203] Implement Ada resolution Tom Tromey
2021-01-03  7:57   ` Joel Brobecker
2021-02-13 19:49     ` Tom Tromey
2021-01-01 21:46 ` [PATCH 170/203] Implement Ada assignment Tom Tromey
2021-01-01 21:46 ` [PATCH 171/203] Remove use of op_string Tom Tromey
2021-01-01 21:46 ` [PATCH 172/203] Add an expr::operation_up to struct expression Tom Tromey
2021-01-01 21:46 ` [PATCH 173/203] Add completion for operations Tom Tromey
2021-01-01 21:46 ` [PATCH 174/203] Add operation-related methods to parser_state Tom Tromey
2021-01-01 21:46 ` [PATCH 175/203] Convert dtrace probes to use operations Tom Tromey
2021-01-01 21:46 ` [PATCH 176/203] Convert stap probes to create operations Tom Tromey
2021-01-01 21:46 ` [PATCH 177/203] Convert rust-exp.y to use operations Tom Tromey
2021-01-01 21:46 ` [PATCH 178/203] Convert c-exp.y " Tom Tromey
2021-01-01 21:46 ` [PATCH 179/203] Convert go-exp.y " Tom Tromey
2021-01-01 21:47 ` [PATCH 180/203] Convert d-exp.y " Tom Tromey
2021-01-01 21:47 ` [PATCH 181/203] Convert p-exp.y " Tom Tromey
2021-01-01 21:47 ` [PATCH 182/203] Convert m2-exp.y " Tom Tromey
2021-01-01 21:47 ` [PATCH 183/203] Convert f-exp.y " Tom Tromey
2021-01-01 21:47 ` [PATCH 184/203] Convert ada-exp.y " Tom Tromey
2021-01-01 21:47 ` [PATCH 185/203] Remove now-unused Rust evaluator code Tom Tromey
2021-01-01 21:47 ` [PATCH 186/203] Remove now-unused Fortran " Tom Tromey
2021-01-01 21:47 ` [PATCH 187/203] Remove now-unused Modula-2 " Tom Tromey
2021-01-01 21:47 ` [PATCH 188/203] Remove now-unused Ada " Tom Tromey
2021-01-01 21:47 ` [PATCH 189/203] Remove now-unused C " Tom Tromey
2021-01-01 21:47 ` [PATCH 190/203] Remove union exp_element Tom Tromey
2021-01-01 21:47 ` [PATCH 191/203] Remove two Ada opcodes Tom Tromey
2021-01-01 21:47 ` [PATCH 192/203] Remove unused Modula-2 opcodes Tom Tromey
2021-01-01 21:47 ` [PATCH 193/203] Remove unused Ada opcodes Tom Tromey
2021-01-01 21:47 ` [PATCH 194/203] Remove OP_EXTENDED0 Tom Tromey
2021-01-01 21:47 ` [PATCH 195/203] Remove OP_UNUSED_LAST Tom Tromey
2021-01-01 21:47 ` [PATCH 196/203] Remove BINOP_END Tom Tromey
2021-01-01 21:47 ` [PATCH 197/203] Inline expression constructor Tom Tromey
2021-01-01 21:47 ` [PATCH 198/203] Inline expr_builder methods Tom Tromey
2021-01-01 21:47 ` [PATCH 199/203] Merge namespace scopes in eval.c Tom Tromey
2021-01-01 21:47 ` [PATCH 200/203] Remove EVAL_SKIP Tom Tromey
2021-01-01 21:47 ` [PATCH 201/203] Change exp_uses_objfile to return bool Tom Tromey
2021-01-01 21:47 ` [PATCH 202/203] Use bound_minimal_symbol in var_msym_value_operation Tom Tromey
2021-01-01 21:47 ` [PATCH 203/203] Remove some null checks Tom Tromey
2021-01-03  7:02 ` [PATCH 000/203] Refactor expressions Joel Brobecker
2021-01-04 12:16   ` Andrew Burgess
2021-02-13 19:54   ` Tom Tromey
2021-02-16 16:17     ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210101214723.1784144-143-tom@tromey.com \
    --to=tom@tromey.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox