Introduce float_const_operation
authorTom Tromey <tom@tromey.com>
Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 8 Mar 2021 14:28:14 +0000 (07:28 -0700)
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.

gdb/ChangeLog
gdb/expop.h
gdb/expprint.c

index 2b90a32e74938b5599bd18ee152682c35cb9c12b..036e562525393065c61384a972cf2cc344cbb206 100644 (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.
index 1bf06139dfb6a35517b296d92f6eb90fdbb6c8f1..1e58262e876d79169ee159580e536273210e27fd 100644 (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 */
index 92f1299947295b79fbe7b40edc2569979d967c70..5826108c1c92fa1037af5a71f85f92e5e2601768 100644 (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 */