Introduce unop_sizeof_operation

This adds class unop_sizeof_operation, which implements UNOP_SIZEOF.

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

	* expop.h (class unop_sizeof_operation): New.
	* ax-gdb.c (unop_sizeof_operation::do_generate_ax): New method.
This commit is contained in:
Tom Tromey 2021-03-08 07:27:57 -07:00
parent 14aff815df
commit 85d23bda83
3 changed files with 57 additions and 0 deletions

View File

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

View File

@ -2491,6 +2491,29 @@ comma_operation::do_generate_ax (struct expression *exp,
/* It's the consumer's responsibility to trace the right operand. */
}
void
unop_sizeof_operation::do_generate_ax (struct expression *exp,
struct agent_expr *ax,
struct axs_value *value,
struct type *cast_type)
{
/* We don't care about the value of the operand expression; we only
care about its type. However, in the current arrangement, the
only way to find an expression's type is to generate code for it.
So we generate code for the operand, and then throw it away,
replacing it with code that simply pushes its size. */
int start = ax->len;
std::get<0> (m_storage)->generate_ax (exp, ax, value);
/* Throw away the code we just generated. */
ax->len = start;
ax_const_l (ax, TYPE_LENGTH (value->type));
value->kind = axs_rvalue;
value->type = builtin_type (ax->gdbarch)->builtin_int;
}
}
/* This handles the middle-to-right-side of code generation for binary

View File

@ -1582,6 +1582,35 @@ protected:
}
};
/* Implement 'sizeof'. */
class unop_sizeof_operation
: public maybe_constant_operation<operation_up>
{
public:
using maybe_constant_operation::maybe_constant_operation;
value *evaluate (struct type *expect_type,
struct expression *exp,
enum noside noside) override
{
if (noside == EVAL_SKIP)
return eval_skip_value (exp);
return std::get<0> (m_storage)->evaluate_for_sizeof (exp, noside);
}
enum exp_opcode opcode () const override
{ return UNOP_SIZEOF; }
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 */