Introduce internalvar_operation
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:16 +0000 (07:28 -0700)
This adds class internalvar_operation, which implements
OP_INTERNALVAR.

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

* expop.h (class internalvar_operation): New.
* ax-gdb.c (internalvar_operation::do_generate_ax): New method.

gdb/ChangeLog
gdb/ax-gdb.c
gdb/expop.h

index 9acaee4c152b591f3072cc987e30fca4be74d622..05f67b855b70d8d2fb09e078da80de0898744342 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-08  Tom Tromey  <tom@tromey.com>
+
+       * expop.h (class internalvar_operation): New.
+       * ax-gdb.c (internalvar_operation::do_generate_ax): New method.
+
 2021-03-08  Tom Tromey  <tom@tromey.com>
 
        * expop.h (class bool_operation): New.
index 5ffe5a00da15edb912bc227820399f4c7f154cf0..e25e2942475c13d24ca75abd6862533f072db8ab 100644 (file)
@@ -2365,6 +2365,31 @@ register_operation::do_generate_ax (struct expression *exp,
   value->type = register_type (ax->gdbarch, reg);
 }
 
+void
+internalvar_operation::do_generate_ax (struct expression *exp,
+                                      struct agent_expr *ax,
+                                      struct axs_value *value,
+                                      struct type *cast_type)
+{
+  struct internalvar *var = std::get<0> (m_storage);
+  const char *name = internalvar_name (var);
+  struct trace_state_variable *tsv;
+
+  tsv = find_trace_state_variable (name);
+  if (tsv)
+    {
+      ax_tsv (ax, aop_getv, tsv->number);
+      if (ax->tracing)
+       ax_tsv (ax, aop_tracev, tsv->number);
+      /* Trace state variables are always 64-bit integers.  */
+      value->kind = axs_rvalue;
+      value->type = builtin_type (ax->gdbarch)->builtin_long_long;
+    }
+  else if (! compile_internalvar_to_ax (var, ax, value))
+    error (_("$%s is not a trace state variable; GDB agent "
+            "expressions cannot use convenience variables."), name);
+}
+
 }
 
 /* This handles the middle-to-right-side of code generation for binary
index 44098b847613005d7ee05be68a6e92224a6be8dc..d143815a25958cd6ca9be514269498f2d8f0d2e5 100644 (file)
@@ -649,6 +649,38 @@ public:
   { return true; }
 };
 
+class internalvar_operation
+  : public tuple_holding_operation<internalvar *>
+{
+public:
+
+  using tuple_holding_operation::tuple_holding_operation;
+
+  value *evaluate (struct type *expect_type,
+                  struct expression *exp,
+                  enum noside noside) override
+  {
+    return value_of_internalvar (exp->gdbarch,
+                                std::get<0> (m_storage));
+  }
+
+  internalvar *get_internalvar () const
+  {
+    return std::get<0> (m_storage);
+  }
+
+  enum exp_opcode opcode () const override
+  { return OP_INTERNALVAR; }
+
+protected:
+
+  void do_generate_ax (struct expression *exp,
+                      struct agent_expr *ax,
+                      struct axs_value *value,
+                      struct type *cast_type)
+    override;
+};
+
 } /* namespace expr */
 
 #endif /* EXPOP_H */