2007-10-25 Wu Zhou <woodzltc@cn.ibm.com>
authorThiago Jung Bauermann <bauerman@br.ibm.com>
Thu, 25 Oct 2007 17:57:34 +0000 (17:57 +0000)
committerThiago Jung Bauermann <bauerman@br.ibm.com>
Thu, 25 Oct 2007 17:57:34 +0000 (17:57 +0000)
    Thiago Jung Bauermann  <bauerman@br.ibm.com>

* c-lang.c (c_create_fundamental_type): Create fundamental
types for DFP.
* c-typeprint.c (c_type_print_varspec_prefix): Add
TYPE_CODE_DECFLOAT to no prefix needed case.
(c_type_print_varspec_suffix): Add TYPE_CODE_DECFLOAT to no
suffix needed case.
* c-valprint.c (c_val_print): Call print_decimal_floating to
print DFP values.
* dwarf2read.c (read_base_type): Read DW_ATE_decimal_float
attribute code and return TYPE_CODE_DECFLOAT.
(dwarf_base_type): Set dwarf2_fundamental_type for DFP values.
* gdbtypes.c (gdbtypes_post_init): Initialize builtin_decfloat,
builtin_decdouble and builtin_declong.
* gdbtypes.h (enum type_code): Add TYPE_CODE_DECFLOAT as a
type code for DFP.
(FT_DECFLOAT, FT_DBL_PREC_DECFLOAT, FT_EXT_PREC_DECFLOAT): New
types, for decimal floating point.
(FT_NUM_MEMBERS):  Increment, new types added.
(struct builtin_type): Add builtin_decfloat, builtin_decdouble
and builtin_declong.
* valprint.c (print_decimal_floating): New function to print DFP
values.
* value.h (print_decimal_floating): Prototype.

gdb/ChangeLog
gdb/c-lang.c
gdb/c-typeprint.c
gdb/c-valprint.c
gdb/dwarf2read.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/valprint.c
gdb/value.h

index 530adc6cdf79064ed65394ecd8d253a4fb181bfe..be6eab8d00e8ba148d58eeee675c9a26daf25e2e 100644 (file)
@@ -1,3 +1,30 @@
+2007-10-25  Wu Zhou  <woodzltc@cn.ibm.com> 
+           Thiago Jung Bauermann  <bauerman@br.ibm.com>
+
+       * c-lang.c (c_create_fundamental_type): Create fundamental
+       types for DFP.
+       * c-typeprint.c (c_type_print_varspec_prefix): Add
+       TYPE_CODE_DECFLOAT to no prefix needed case.
+       (c_type_print_varspec_suffix): Add TYPE_CODE_DECFLOAT to no
+       suffix needed case.
+       * c-valprint.c (c_val_print): Call print_decimal_floating to
+       print DFP values.
+       * dwarf2read.c (read_base_type): Read DW_ATE_decimal_float
+       attribute code and return TYPE_CODE_DECFLOAT.
+       (dwarf_base_type): Set dwarf2_fundamental_type for DFP values.
+       * gdbtypes.c (gdbtypes_post_init): Initialize builtin_decfloat,
+       builtin_decdouble and builtin_declong. 
+       * gdbtypes.h (enum type_code): Add TYPE_CODE_DECFLOAT as a
+       type code for DFP.
+       (FT_DECFLOAT, FT_DBL_PREC_DECFLOAT, FT_EXT_PREC_DECFLOAT): New
+       types, for decimal floating point.
+       (FT_NUM_MEMBERS):  Increment, new types added.
+       (struct builtin_type): Add builtin_decfloat, builtin_decdouble
+       and builtin_declong.
+       * valprint.c (print_decimal_floating): New function to print DFP
+       values.
+       * value.h (print_decimal_floating): Prototype.
+
 2007-10-25  Wu Zhou  <woodzltc@cn.ibm.com> 
            Thiago Jung Bauermann  <bauerman@br.ibm.com>
 
index 785555136a957ae47a3ad0543dc3bbb840e4bc00..9b4d1cd086896b61e9bbc6779937f671f7859f41 100644 (file)
@@ -325,6 +325,21 @@ c_create_fundamental_type (struct objfile *objfile, int typeid)
                          / TARGET_CHAR_BIT,
                        0, "long double", objfile);
       break;
+    case FT_DECFLOAT:
+      type = init_type (TYPE_CODE_DECFLOAT,
+                       32 / 8,
+                       0, "decimal float", objfile);
+      break;
+    case FT_DBL_PREC_DECFLOAT:
+      type = init_type (TYPE_CODE_DECFLOAT,
+                       64 / 8,
+                       0, "decimal double", objfile);
+      break;
+    case FT_EXT_PREC_DECFLOAT:
+      type = init_type (TYPE_CODE_DECFLOAT,
+                       128 / 8,
+                       0, "decimal long double", objfile);
+      break;
     case FT_COMPLEX:
       type = init_type (TYPE_CODE_FLT,
                        2 * gdbarch_float_bit (current_gdbarch)
index b249dda67f98f5916512671deb582d1774c71c1f..77647adc34f376aa079dec95b5671acc3777a7d5 100644 (file)
@@ -277,6 +277,7 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
     case TYPE_CODE_COMPLEX:
     case TYPE_CODE_TEMPLATE:
     case TYPE_CODE_NAMESPACE:
+    case TYPE_CODE_DECFLOAT:
       /* These types need no prefix.  They are listed here so that
          gcc -Wall will reveal any types that haven't been handled.  */
       break;
@@ -599,6 +600,7 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
     case TYPE_CODE_COMPLEX:
     case TYPE_CODE_TEMPLATE:
     case TYPE_CODE_NAMESPACE:
+    case TYPE_CODE_DECFLOAT:
       /* These types do not need a suffix.  They are listed so that
          gcc -Wall will report types that may not have been considered.  */
       break;
index cd4c85a5fb3587864bea4af9c7ef498f11eadd83..ddcec6e378025f4cadf5b12ea117a82209856996 100644 (file)
@@ -474,6 +474,13 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
        }
       break;
 
+    case TYPE_CODE_DECFLOAT:
+      if (format)
+       print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
+      else
+       print_decimal_floating (valaddr + embedded_offset, type, stream);
+      break;
+
     case TYPE_CODE_VOID:
       fprintf_filtered (stream, "void");
       break;
index a5fdbee8df54a7bb511f040219cc025f0ba7a24a..5d8551956755cef5e740d237e43c44daf4053848 100644 (file)
@@ -4865,6 +4865,9 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
        case DW_ATE_complex_float:
          code = TYPE_CODE_COMPLEX;
          break;
+       case DW_ATE_decimal_float:
+         code = TYPE_CODE_DECFLOAT;
+         break;
        case DW_ATE_float:
          code = TYPE_CODE_FLT;
          break;
@@ -7751,6 +7754,14 @@ dwarf_base_type (int encoding, int size, struct dwarf2_cu *cu)
          type = dwarf2_fundamental_type (objfile, FT_FLOAT, cu);
        }
       return type;
+    case DW_ATE_decimal_float:
+      if (size == 16)
+       type = dwarf2_fundamental_type (objfile, FT_DBL_PREC_DECFLOAT, cu);
+      else if (size == 8)
+       type = dwarf2_fundamental_type (objfile, FT_EXT_PREC_DECFLOAT, cu);
+      else
+       type = dwarf2_fundamental_type (objfile, FT_DECFLOAT, cu);
+      return type;
     case DW_ATE_signed:
       switch (size)
        {
index 7ffa9868682da21b360013183239b6ca41d9c031..7400d68b4b933207271adec8a825660d43fdd9b4 100644 (file)
@@ -3506,6 +3506,21 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
               0,
               "bool", (struct objfile *) NULL);
 
+  /* The following three are about decimal floating point types, which
+     are 32-bits, 64-bits and 128-bits respectively.  */
+  builtin_type->builtin_decfloat
+    = init_type (TYPE_CODE_DECFLOAT, 32 / 8,
+               0,
+              "decimal float", (struct objfile *) NULL);
+  builtin_type->builtin_decdouble
+    = init_type (TYPE_CODE_DECFLOAT, 64 / 8,
+              0,
+              "decimal double", (struct objfile *) NULL);
+  builtin_type->builtin_declong
+    = init_type (TYPE_CODE_DECFLOAT, 128 / 8,
+              0,
+              "decimal long double", (struct objfile *) NULL);
+
   /* Pointer/Address types.  */
 
   /* NOTE: on some targets, addresses and pointers are not necessarily
index 7c93ca55b0898b6cfe12d6bbfa46d787f7afc72e..b1e8558451de6f1b25d98c6ccc773bf50fbfff92 100644 (file)
@@ -65,7 +65,12 @@ struct block;
 #define FT_UNSIGNED_BYTE       27
 #define FT_TEMPLATE_ARG                28
 
-#define FT_NUM_MEMBERS         29      /* Highest FT_* above, plus one. */
+/* The following three fundamental types are for decimal floating point.  */
+#define FT_DECFLOAT            29
+#define FT_DBL_PREC_DECFLOAT   30
+#define FT_EXT_PREC_DECFLOAT   31
+
+#define FT_NUM_MEMBERS         32      /* Highest FT_* above, plus one. */
 
 /* Some macros for char-based bitfields.  */
 
@@ -169,7 +174,9 @@ enum type_code
     TYPE_CODE_TEMPLATE,                /* C++ template */
     TYPE_CODE_TEMPLATE_ARG,    /* C++ template arg */
 
-    TYPE_CODE_NAMESPACE                /* C++ namespace.  */
+    TYPE_CODE_NAMESPACE,       /* C++ namespace.  */
+
+    TYPE_CODE_DECFLOAT         /* Decimal floating point.  */
   };
 
 /* For now allow source to use TYPE_CODE_CLASS for C++ classes, as an
@@ -1041,6 +1048,9 @@ struct builtin_type
   struct type *builtin_bool;
   struct type *builtin_long_long;
   struct type *builtin_unsigned_long_long;
+  struct type *builtin_decfloat;
+  struct type *builtin_decdouble;
+  struct type *builtin_declong;
 };
 
 /* Return the type table for the specified architecture.  */
index eb3a73b4ef3ccff5025feda89cf266aa9d4a61c9..2b995da9745c8b248e39908194a48dc1b1a57317 100644 (file)
@@ -33,6 +33,7 @@
 #include "floatformat.h"
 #include "doublest.h"
 #include "exceptions.h"
+#include "dfp.h"
 
 #include <errno.h>
 
@@ -505,6 +506,18 @@ print_floating (const gdb_byte *valaddr, struct type *type,
 #endif
 }
 
+void
+print_decimal_floating (const gdb_byte *valaddr, struct type *type,
+                       struct ui_file *stream)
+{
+  char decstr[MAX_DECIMAL_STRING];
+  unsigned len = TYPE_LENGTH (type);
+
+  decimal_to_string (valaddr, len, decstr);
+  fputs_filtered (decstr, stream);
+  return;
+}
+
 void
 print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
                    unsigned len)
index 0824b5ea207ae7a5dcc1fcb5b5890db0ee3d1a40..7026466222843cc4d6612bfbd049e3ea8be3c78e 100644 (file)
@@ -492,6 +492,9 @@ extern void print_longest (struct ui_file *stream, int format,
 extern void print_floating (const gdb_byte *valaddr, struct type *type,
                            struct ui_file *stream);
 
+extern void print_decimal_floating (const gdb_byte *valaddr, struct type *type,
+                                   struct ui_file *stream);
+
 extern int value_print (struct value *val, struct ui_file *stream, int format,
                        enum val_prettyprint pretty);