aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-03-08 07:27:57 -0700
committerTom Tromey <tom@tromey.com>2021-03-08 07:28:14 -0700
commitcae26a0cb05be806ae97d4fabc1cb8e6773a1512 (patch)
treeac4bc202818095d9767164f92fcc317bf0d86912 /gdb
parent75f9892d435f58fd12e26638a56564e374bfa951 (diff)
downloadgdb-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/ChangeLog6
-rw-r--r--gdb/expop.h42
-rw-r--r--gdb/expprint.c8
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 */