Introduce comma_operation

This adds class comma_operation, which implements BINOP_COMMA.

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

	* ax-gdb.c (comma_operation::do_generate_ax): New method.
This commit is contained in:
Tom Tromey 2021-03-08 07:27:57 -07:00
parent d4eff4c122
commit ae64ba58b3
3 changed files with 57 additions and 0 deletions

View file

@ -1,3 +1,7 @@
2021-03-08 Tom Tromey <tom@tromey.com>
* ax-gdb.c (comma_operation::do_generate_ax): New method.
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class repeat_operation): New.

View file

@ -2469,6 +2469,28 @@ repeat_operation::do_generate_ax (struct expression *exp,
value->type = array;
}
void
comma_operation::do_generate_ax (struct expression *exp,
struct agent_expr *ax,
struct axs_value *value,
struct type *cast_type)
{
/* Note that we need to be a little subtle about generating code
for comma. In C, we can do some optimizations here because
we know the left operand is only being evaluated for effect.
However, if the tracing kludge is in effect, then we always
need to evaluate the left hand side fully, so that all the
variables it mentions get traced. */
struct axs_value value1;
std::get<0> (m_storage)->generate_ax (exp, ax, &value1);
/* Don't just dispose of the left operand. We might be tracing,
in which case we want to emit code to trace it if it's an
lvalue. */
gen_traced_pop (ax, &value1);
std::get<1> (m_storage)->generate_ax (exp, ax, value);
/* It's the consumer's responsibility to trace the right operand. */
}
}
/* This handles the middle-to-right-side of code generation for binary

View file

@ -1208,6 +1208,37 @@ protected:
override;
};
/* C-style comma operator. */
class comma_operation
: public maybe_constant_operation<operation_up, operation_up>
{
public:
using maybe_constant_operation::maybe_constant_operation;
value *evaluate (struct type *expect_type,
struct expression *exp,
enum noside noside) override
{
/* The left-hand-side is only evaluated for side effects, so don't
bother in other modes. */
if (noside == EVAL_NORMAL)
std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
return std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
}
enum exp_opcode opcode () const override
{ return BINOP_COMMA; }
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 */