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 177/203] Convert rust-exp.y to use operations
Date: Fri,  1 Jan 2021 14:46:57 -0700	[thread overview]
Message-ID: <20210101214723.1784144-178-tom@tromey.com> (raw)
In-Reply-To: <20210101214723.1784144-1-tom@tromey.com>

This converts the Rust parser to generate operations rather than
exp_elements.

The Rust parser already made its own AST, that it then lowered to GDB
expressions.  Ironically, this made conversion trickier, rather than
simpler, than the other parsers, primarily due to the way that binary
operations were lowered.  Perhaps in the future, converting the Rust
parser to directly create operations while parsing would be
worthwhile.

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

	* rust-exp.y: Create operations.
	(rust_parser::convert_params_to_expression): Change return type.
	(binop_maker_ftype): New typedef.
	(maker_map): New global.
	(rust_parser::convert_ast_to_expression): Change return type.
	(rust_language::parser): Update.
	(_initialize_rust_exp): Initialize maker_map.
---
 gdb/ChangeLog  |  10 ++
 gdb/rust-exp.y | 324 +++++++++++++++++++++++++++----------------------
 2 files changed, 190 insertions(+), 144 deletions(-)

diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index a6583a6129a..9a5bdd7a836 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -41,6 +41,8 @@
 #include "gdbsupport/selftest.h"
 #include "value.h"
 #include "gdbarch.h"
+#include "rust-exp.h"
+#include <unordered_map>
 
 #define GDB_YY_REMAP_PREFIX rust
 #include "yy-remap.h"
@@ -246,11 +248,11 @@ struct rust_parser
   std::vector<struct type *> convert_params_to_types (rust_op_vector *params);
   struct type *convert_ast_to_type (const struct rust_op *operation);
   const char *convert_name (const struct rust_op *operation);
-  void convert_params_to_expression (rust_op_vector *params,
-				     const struct rust_op *top);
-  void convert_ast_to_expression (const struct rust_op *operation,
-				  const struct rust_op *top,
-				  bool want_type = false);
+  std::vector<expr::operation_up> convert_params_to_expression
+       (rust_op_vector *params, const struct rust_op *top);
+  expr::operation_up convert_ast_to_expression (const struct rust_op *opn,
+						const struct rust_op *top,
+						bool want_type = false);
 
   struct rust_op *ast_basic_type (enum type_code typecode);
   const struct rust_op *ast_operation (enum exp_opcode opcode,
@@ -2183,14 +2185,25 @@ rust_parser::convert_name (const struct rust_op *operation)
 /* A helper function that converts a vec of rust_ops to a gdb
    expression.  */
 
-void
+std::vector<expr::operation_up>
 rust_parser::convert_params_to_expression (rust_op_vector *params,
 					   const struct rust_op *top)
 {
+  std::vector<expr::operation_up> result;
   for (const rust_op *elem : *params)
-    convert_ast_to_expression (elem, top);
+    result.push_back (convert_ast_to_expression (elem, top));
+  result.shrink_to_fit ();
+  return result;
 }
 
+typedef expr::operation_up binop_maker_ftype (expr::operation_up &&,
+					      expr::operation_up &&);
+
+/* Map from an expression opcode to a function that will create an
+   instance of the appropriate operation subclass.  Only binary
+   operations are handled this way.  */
+static std::unordered_map<exp_opcode, binop_maker_ftype *> maker_map;
+
 /* Lower a rust_op to a gdb expression.  STATE is the parser state.
    OPERATION is the operation to lower.  TOP is a pointer to the
    top-most operation; it is used to handle the special case where the
@@ -2200,62 +2213,87 @@ rust_parser::convert_params_to_expression (rust_op_vector *params,
    erroring).  If WANT_TYPE is set, then the similar TOP handling is
    not done.  */
 
-void
+expr::operation_up
 rust_parser::convert_ast_to_expression (const struct rust_op *operation,
 					const struct rust_op *top,
 					bool want_type)
 {
+  using namespace expr;
+
   switch (operation->opcode)
     {
     case OP_LONG:
-      write_exp_elt_opcode (pstate, OP_LONG);
-      write_exp_elt_type (pstate, operation->left.typed_val_int.type);
-      write_exp_elt_longcst (pstate, operation->left.typed_val_int.val);
-      write_exp_elt_opcode (pstate, OP_LONG);
-      break;
+      return operation_up
+	(new long_const_operation (operation->left.typed_val_int.type,
+				   operation->left.typed_val_int.val));
 
     case OP_FLOAT:
-      write_exp_elt_opcode (pstate, OP_FLOAT);
-      write_exp_elt_type (pstate, operation->left.typed_val_float.type);
-      write_exp_elt_floatcst (pstate, operation->left.typed_val_float.val);
-      write_exp_elt_opcode (pstate, OP_FLOAT);
-      break;
+      {
+	float_data data;
+	memcpy (data.data (), operation->left.typed_val_float.val,
+		sizeof (operation->left.typed_val_float.val));
+	return operation_up
+	  (new float_const_operation (operation->left.typed_val_float.type,
+				      data));
+      }
 
     case STRUCTOP_STRUCT:
       {
-	convert_ast_to_expression (operation->left.op, top);
-
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	auto result = new rust_structop (std::move (lhs),
+					 operation->right.sval.ptr);
 	if (operation->completing)
-	  pstate->mark_struct_expression ();
-	write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
-	write_exp_string (pstate, operation->right.sval);
-	write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+	  pstate->mark_struct_expression (result);
+	return operation_up (result);
       }
-      break;
 
     case STRUCTOP_ANONYMOUS:
       {
-	convert_ast_to_expression (operation->left.op, top);
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
 
-	write_exp_elt_opcode (pstate, STRUCTOP_ANONYMOUS);
-	write_exp_elt_longcst (pstate, operation->right.typed_val_int.val);
-	write_exp_elt_opcode (pstate, STRUCTOP_ANONYMOUS);
+	return operation_up
+	  (new rust_struct_anon (operation->right.typed_val_int.val,
+				 std::move (lhs)));
       }
-      break;
 
     case UNOP_SIZEOF:
-      convert_ast_to_expression (operation->left.op, top, true);
-      write_exp_elt_opcode (pstate, UNOP_SIZEOF);
-      break;
+      {
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top,
+						      true);
+	return operation_up
+	  (new unop_sizeof_operation (std::move (lhs)));
+      }
 
     case UNOP_PLUS:
+      {
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	return operation_up
+	  (new unary_plus_operation (std::move (lhs)));
+      }
     case UNOP_NEG:
+      {
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	return operation_up
+	  (new unary_neg_operation (std::move (lhs)));
+      }
     case UNOP_COMPLEMENT:
+      {
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	return operation_up
+	  (new rust_unop_compl_operation (std::move (lhs)));
+      }
     case UNOP_IND:
+      {
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	return operation_up
+	  (new rust_unop_ind_operation (std::move (lhs)));
+      }
     case UNOP_ADDR:
-      convert_ast_to_expression (operation->left.op, top);
-      write_exp_elt_opcode (pstate, operation->opcode);
-      break;
+      {
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	return operation_up
+	  (new rust_unop_addr_operation (std::move (lhs)));
+      }
 
     case BINOP_SUBSCRIPT:
     case BINOP_MUL:
@@ -2279,45 +2317,45 @@ rust_parser::convert_ast_to_expression (const struct rust_op *operation,
     case BINOP_RSH:
     case BINOP_ASSIGN:
     case OP_RUST_ARRAY:
-      convert_ast_to_expression (operation->left.op, top);
-      convert_ast_to_expression (operation->right.op, top);
-      if (operation->compound_assignment)
-	{
-	  write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
-	  write_exp_elt_opcode (pstate, operation->opcode);
-	  write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
-	}
-      else
-	write_exp_elt_opcode (pstate, operation->opcode);
-
-      if (operation->compound_assignment
-	  || operation->opcode == BINOP_ASSIGN)
-	{
-	  struct type *type;
-
-	  type = language_lookup_primitive_type (pstate->language (),
-						 pstate->gdbarch (),
-						 "()");
+      {
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	operation_up rhs = convert_ast_to_expression (operation->right.op,
+						      top);
+	operation_up result;
+	if (operation->compound_assignment)
+	  result = (operation_up
+		    (new assign_modify_operation (operation->opcode,
+						  std::move (lhs),
+						  std::move (rhs))));
+	else
+	  {
+	    auto iter = maker_map.find (operation->opcode);
+	    gdb_assert (iter != maker_map.end ());
+	    result = iter->second (std::move (lhs), std::move (rhs));
+	  }
 
-	  write_exp_elt_opcode (pstate, OP_LONG);
-	  write_exp_elt_type (pstate, type);
-	  write_exp_elt_longcst (pstate, 0);
-	  write_exp_elt_opcode (pstate, OP_LONG);
+	if (operation->compound_assignment
+	    || operation->opcode == BINOP_ASSIGN)
+	  {
+	    struct type *type
+	      = language_lookup_primitive_type (pstate->language (),
+						pstate->gdbarch (),
+						"()");
+
+	    operation_up nil (new long_const_operation (type, 0));
+	    result.reset (new comma_operation (std::move (result),
+					       std::move (nil)));
+	  }
 
-	  write_exp_elt_opcode (pstate, BINOP_COMMA);
-	}
-      break;
+	return result;
+      }
 
     case UNOP_CAST:
       {
 	struct type *type = convert_ast_to_type (operation->right.op);
-
-	convert_ast_to_expression (operation->left.op, top);
-	write_exp_elt_opcode (pstate, UNOP_CAST);
-	write_exp_elt_type (pstate, type);
-	write_exp_elt_opcode (pstate, UNOP_CAST);
+	operation_up lhs = convert_ast_to_expression (operation->left.op, top);
+	return operation_up (new unop_cast_operation (std::move (lhs), type));
       }
-      break;
 
     case OP_FUNCALL:
       {
@@ -2339,42 +2377,39 @@ rust_parser::convert_ast_to_expression (const struct rust_op *operation,
 		    if (!rust_tuple_struct_type_p (type))
 		      error (_("Type %s is not a tuple struct"), varname);
 
+		    std::vector<std::pair<std::string, operation_up>> args
+		      (params->size ());
 		    for (int i = 0; i < params->size (); ++i)
 		      {
 			char *cell = get_print_cell ();
 
+			operation_up op
+			  = convert_ast_to_expression ((*params)[i], top);
 			xsnprintf (cell, PRINT_CELL_SIZE, "__%d", i);
-			write_exp_elt_opcode (pstate, OP_NAME);
-			write_exp_string (pstate, make_stoken (cell));
-			write_exp_elt_opcode (pstate, OP_NAME);
-
-			convert_ast_to_expression ((*params)[i], top);
+			args[i] = { cell, std::move (op) };
 		      }
 
-		    write_exp_elt_opcode (pstate, OP_AGGREGATE);
-		    write_exp_elt_type (pstate, type);
-		    write_exp_elt_longcst (pstate, 2 * params->size ());
-		    write_exp_elt_opcode (pstate, OP_AGGREGATE);
-		    break;
+		    return make_operation<rust_aggregate_operation>
+		      (type, operation_up (), std::move (args));
 		  }
 	      }
 	  }
-	convert_ast_to_expression (operation->left.op, top);
-	convert_params_to_expression (operation->right.params, top);
-	write_exp_elt_opcode (pstate, OP_FUNCALL);
-	write_exp_elt_longcst (pstate, operation->right.params->size ());
-	write_exp_elt_longcst (pstate, OP_FUNCALL);
+	operation_up callee = convert_ast_to_expression (operation->left.op,
+							 top);
+	std::vector<operation_up> args
+	  = convert_params_to_expression (operation->right.params, top);
+	return make_operation<funcall_operation> (std::move (callee),
+						  std::move (args));
       }
-      break;
 
     case OP_ARRAY:
-      gdb_assert (operation->left.op == NULL);
-      convert_params_to_expression (operation->right.params, top);
-      write_exp_elt_opcode (pstate, OP_ARRAY);
-      write_exp_elt_longcst (pstate, 0);
-      write_exp_elt_longcst (pstate, operation->right.params->size () - 1);
-      write_exp_elt_longcst (pstate, OP_ARRAY);
-      break;
+      {
+	gdb_assert (operation->left.op == NULL);
+	std::vector<operation_up> subexps
+	  = convert_params_to_expression (operation->right.params, top);
+	return make_operation<array_operation>
+	  (0, operation->right.params->size () - 1, std::move (subexps));
+      }
 
     case OP_VAR_VALUE:
       {
@@ -2383,20 +2418,16 @@ rust_parser::convert_ast_to_expression (const struct rust_op *operation,
 
 	if (operation->left.sval.ptr[0] == '$')
 	  {
-	    write_dollar_variable (pstate, operation->left.sval);
-	    break;
+	    pstate->push_dollar (operation->left.sval);
+	    return pstate->pop ();
 	  }
 
 	varname = convert_name (operation);
 	sym = lookup_symbol (varname, pstate->expression_context_block,
 			     VAR_DOMAIN);
+	operation_up result;
 	if (sym.symbol != NULL && SYMBOL_CLASS (sym.symbol) != LOC_TYPEDEF)
-	  {
-	    write_exp_elt_opcode (pstate, OP_VAR_VALUE);
-	    write_exp_elt_block (pstate, sym.block);
-	    write_exp_elt_sym (pstate, sym.symbol);
-	    write_exp_elt_opcode (pstate, OP_VAR_VALUE);
-	  }
+	  result.reset (new var_value_operation (sym.symbol, sym.block));
 	else
 	  {
 	    struct type *type = NULL;
@@ -2417,52 +2448,35 @@ rust_parser::convert_ast_to_expression (const struct rust_op *operation,
 		&& type->num_fields () == 0)
 	      {
 		/* A unit-like struct.  */
-		write_exp_elt_opcode (pstate, OP_AGGREGATE);
-		write_exp_elt_type (pstate, type);
-		write_exp_elt_longcst (pstate, 0);
-		write_exp_elt_opcode (pstate, OP_AGGREGATE);
+		result.reset (new rust_aggregate_operation (type, {}, {}));
 	      }
 	    else if (want_type || operation == top)
-	      {
-		write_exp_elt_opcode (pstate, OP_TYPE);
-		write_exp_elt_type (pstate, type);
-		write_exp_elt_opcode (pstate, OP_TYPE);
-	      }
+	      result.reset (new type_operation (type));
 	    else
 	      error (_("Found type '%s', which can't be "
 		       "evaluated in this context"),
 		     varname);
 	  }
+
+	return result;
       }
-      break;
 
     case OP_AGGREGATE:
       {
-	int length;
 	rust_set_vector *fields = operation->right.field_inits;
 	struct type *type;
 	const char *name;
 
-	length = 0;
+	operation_up others;
+	std::vector<std::pair<std::string, operation_up>> field_v;
 	for (const set_field &init : *fields)
 	  {
-	    if (init.name.ptr != NULL)
-	      {
-		write_exp_elt_opcode (pstate, OP_NAME);
-		write_exp_string (pstate, init.name);
-		write_exp_elt_opcode (pstate, OP_NAME);
-		++length;
-	      }
-
-	    convert_ast_to_expression (init.init, top);
-	    ++length;
+	    operation_up expr = convert_ast_to_expression (init.init, top);
 
 	    if (init.name.ptr == NULL)
-	      {
-		/* This is handled differently from Ada in our
-		   evaluator.  */
-		write_exp_elt_opcode (pstate, OP_OTHERS);
-	      }
+	      others = std::move (expr);
+	    else
+	      field_v.emplace_back (init.name.ptr, std::move (expr));
 	  }
 
 	name = convert_name (operation->left.op);
@@ -2475,34 +2489,29 @@ rust_parser::convert_ast_to_expression (const struct rust_op *operation,
 	    || rust_tuple_struct_type_p (type))
 	  error (_("Struct expression applied to non-struct type"));
 
-	write_exp_elt_opcode (pstate, OP_AGGREGATE);
-	write_exp_elt_type (pstate, type);
-	write_exp_elt_longcst (pstate, length);
-	write_exp_elt_opcode (pstate, OP_AGGREGATE);
+	return operation_up
+	  (new rust_aggregate_operation (type, std::move (others),
+					 std::move (field_v)));
       }
-      break;
 
     case OP_STRING:
-      {
-	write_exp_elt_opcode (pstate, OP_STRING);
-	write_exp_string (pstate, operation->left.sval);
-	write_exp_elt_opcode (pstate, OP_STRING);
-      }
-      break;
+      return (operation_up
+	      (new string_operation (::copy_name (operation->left.sval))));
 
     case OP_RANGE:
       {
 	enum range_flag kind = (RANGE_HIGH_BOUND_DEFAULT
 				| RANGE_LOW_BOUND_DEFAULT);
+	operation_up lhs, rhs;
 
 	if (operation->left.op != NULL)
 	  {
-	    convert_ast_to_expression (operation->left.op, top);
+	    lhs = convert_ast_to_expression (operation->left.op, top);
 	    kind &= ~RANGE_LOW_BOUND_DEFAULT;
 	  }
 	if (operation->right.op != NULL)
 	  {
-	    convert_ast_to_expression (operation->right.op, top);
+	    rhs = convert_ast_to_expression (operation->right.op, top);
 	    if (kind == (RANGE_HIGH_BOUND_DEFAULT | RANGE_LOW_BOUND_DEFAULT))
 	      {
 		kind = RANGE_LOW_BOUND_DEFAULT;
@@ -2524,11 +2533,10 @@ rust_parser::convert_ast_to_expression (const struct rust_op *operation,
 	    gdb_assert (!operation->inclusive);
 	  }
 
-	write_exp_elt_opcode (pstate, OP_RANGE);
-	write_exp_elt_longcst (pstate, kind);
-	write_exp_elt_opcode (pstate, OP_RANGE);
+	return operation_up (new rust_range_operation (kind,
+						       std::move (lhs),
+						       std::move (rhs)));
       }
-      break;
 
     default:
       gdb_assert_not_reached ("unhandled opcode in convert_ast_to_expression");
@@ -2551,7 +2559,11 @@ rust_language::parser (struct parser_state *state) const
   result = rustyyparse (&parser);
 
   if (!result || (state->parse_completion && parser.rust_ast != NULL))
-    parser.convert_ast_to_expression (parser.rust_ast, parser.rust_ast);
+    {
+      expr::operation_up op
+	= parser.convert_ast_to_expression (parser.rust_ast, parser.rust_ast);
+      state->set_operation (std::move (op));
+    }
 
   return result;
 }
@@ -2840,6 +2852,30 @@ _initialize_rust_exp ()
      error.  */
   gdb_assert (code == 0);
 
+  using namespace expr;
+  maker_map[BINOP_SUBSCRIPT] = make_operation<rust_subscript_operation>;
+  maker_map[BINOP_MUL] = make_operation<mul_operation>;
+  maker_map[BINOP_REPEAT] = make_operation<repeat_operation>;
+  maker_map[BINOP_DIV] = make_operation<div_operation>;
+  maker_map[BINOP_REM] = make_operation<rem_operation>;
+  maker_map[BINOP_LESS] = make_operation<less_operation>;
+  maker_map[BINOP_GTR] = make_operation<gtr_operation>;
+  maker_map[BINOP_BITWISE_AND] = make_operation<bitwise_and_operation>;
+  maker_map[BINOP_BITWISE_IOR] = make_operation<bitwise_ior_operation>;
+  maker_map[BINOP_BITWISE_XOR] = make_operation<bitwise_xor_operation>;
+  maker_map[BINOP_ADD] = make_operation<add_operation>;
+  maker_map[BINOP_SUB] = make_operation<sub_operation>;
+  maker_map[BINOP_LOGICAL_OR] = make_operation<logical_or_operation>;
+  maker_map[BINOP_LOGICAL_AND] = make_operation<logical_and_operation>;
+  maker_map[BINOP_EQUAL] = make_operation<equal_operation>;
+  maker_map[BINOP_NOTEQUAL] = make_operation<notequal_operation>;
+  maker_map[BINOP_LEQ] = make_operation<leq_operation>;
+  maker_map[BINOP_GEQ] = make_operation<geq_operation>;
+  maker_map[BINOP_LSH] = make_operation<lsh_operation>;
+  maker_map[BINOP_RSH] = make_operation<rsh_operation>;
+  maker_map[BINOP_ASSIGN] = make_operation<assign_operation>;
+  maker_map[OP_RUST_ARRAY] = make_operation<rust_array_operation>;
+
 #if GDB_SELF_TEST
   selftests::register_test ("rust-lex", rust_lex_tests);
 #endif
-- 
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 ` [PATCH 142/203] Implement function call operations Tom Tromey
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 ` Tom Tromey [this message]
2021-01-01 21:46 ` [PATCH 178/203] Convert c-exp.y to use operations 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-178-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