diff options
author | Tom Tromey <tom@tromey.com> | 2021-03-08 07:27:57 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-03-08 07:28:14 -0700 |
commit | cae26a0cb05be806ae97d4fabc1cb8e6773a1512 (patch) | |
tree | ac4bc202818095d9767164f92fcc317bf0d86912 /gdb | |
parent | 75f9892d435f58fd12e26638a56564e374bfa951 (diff) | |
download | gdb-cae26a0cb05be806ae97d4fabc1cb8e6773a1512.zip gdb-cae26a0cb05be806ae97d4fabc1cb8e6773a1512.tar.gz gdb-cae26a0cb05be806ae97d4fabc1cb8e6773a1512.tar.bz2 |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/expop.h | 42 | ||||
-rw-r--r-- | gdb/expprint.c | 8 |
3 files changed, 56 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2b90a32..036e562 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 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. * ax-gdb.c (gen_expr_binop): New function. (gen_expr_structop): Likewise. diff --git a/gdb/expop.h b/gdb/expop.h index 1bf0613..1e58262 100644 --- a/gdb/expop.h +++ b/gdb/expop.h @@ -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 */ diff --git a/gdb/expprint.c b/gdb/expprint.c index 92f1299..5826108 100644 --- a/gdb/expprint.c +++ b/gdb/expprint.c @@ -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 */ |