Introduce float_const_operation

This adds class float_const_operation, an operation holding a
floating-point constant.  Unlike most other new operations, this one
requires a custom 'dump' method.

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

	* expprint.c (float_const_operation::dump): New method.
	* expop.h (float_data): New typedef.
	(class float_const_operation): New.
This commit is contained in:
Tom Tromey
2021-03-08 07:27:57 -07:00
parent 75f9892d43
commit cae26a0cb0
3 changed files with 56 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2021-03-08 Tom Tromey <tom@tromey.com>
* expprint.c (float_const_operation::dump): New method.
* expop.h (float_data): New typedef.
(class float_const_operation): New.
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (gen_expr_binop, gen_expr_structop): Declare.

View File

@ -373,6 +373,48 @@ private:
}
};
/* A floating-point constant. The constant is encoded in the target
format. */
typedef std::array<gdb_byte, 16> float_data;
/* An operation that holds a floating-point constant of a given
type.
This does not need the facilities provided by
tuple_holding_operation, so it does not use it. */
class float_const_operation
: public operation
{
public:
float_const_operation (struct type *type, float_data data)
: m_type (type),
m_data (data)
{
}
value *evaluate (struct type *expect_type,
struct expression *exp,
enum noside noside) override
{
return value_from_contents (m_type, m_data.data ());
}
enum exp_opcode opcode () const override
{ return OP_FLOAT; }
bool constant_p () const override
{ return true; }
void dump (struct ui_file *stream, int depth) const override;
private:
struct type *m_type;
float_data m_data;
};
} /* namespace expr */
#endif /* EXPOP_H */

View File

@ -1283,4 +1283,12 @@ dump_for_expression (struct ui_file *stream, int depth,
fprintf_filtered (stream, "\n");
}
void
float_const_operation::dump (struct ui_file *stream, int depth) const
{
fprintf_filtered (stream, _("%*sFloat: "), depth, "");
print_floating (m_data.data (), m_type, stream);
fprintf_filtered (stream, "\n");
}
} /* namespace expr */