From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4849 invoked by alias); 15 Oct 2007 18:11:59 -0000 Received: (qmail 4839 invoked by uid 22791); 15 Oct 2007 18:11:57 -0000 X-Spam-Check-By: sourceware.org Received: from igw2.br.ibm.com (HELO igw2.br.ibm.com) (32.104.18.25) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 15 Oct 2007 18:11:54 +0000 Received: from mailhub3.br.ibm.com (mailhub3 [9.18.232.110]) by igw2.br.ibm.com (Postfix) with ESMTP id D17C917F56B for ; Mon, 15 Oct 2007 16:09:36 -0200 (BRDT) Received: from d24av01.br.ibm.com (d24av01.br.ibm.com [9.18.232.46]) by mailhub3.br.ibm.com (8.13.8/8.13.8/NCO v8.5) with ESMTP id l9FIBo2E2920594 for ; Mon, 15 Oct 2007 16:11:50 -0200 Received: from d24av01.br.ibm.com (loopback [127.0.0.1]) by d24av01.br.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l9FIBo7o011861 for ; Mon, 15 Oct 2007 15:11:50 -0300 Received: from [9.18.238.251] (dyn532128.br.ibm.com [9.18.238.251]) by d24av01.br.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id l9FIBo1m011853; Mon, 15 Oct 2007 15:11:50 -0300 Subject: Re: [patch 2/4] decimal floating point types From: Thiago Jung Bauermann To: Daniel Jacobowitz Cc: gdb-patches@sourceware.org In-Reply-To: <20071011155721.GB22982@caradoc.them.org> References: <20070920215410.062714003@br.ibm.com> <20070920215539.651720008@br.ibm.com> <20071011155721.GB22982@caradoc.them.org> Content-Type: multipart/mixed; boundary="=-tjousCCJCKyvlYp7PsQP" Date: Mon, 15 Oct 2007 18:12:00 -0000 Message-Id: <1192471909.5787.45.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.12.0 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-10/txt/msg00395.txt.bz2 --=-tjousCCJCKyvlYp7PsQP Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1888 On Thu, 2007-10-11 at 11:57 -0400, Daniel Jacobowitz wrote: > On Thu, Sep 20, 2007 at 06:54:12PM -0300, Thiago Jung Bauermann wrote: > > + 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; > > You don't need a bunch of those extra braces. Right. Removed. > > + /* 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); > > I think our convention is to put the equals sign after the line break. Most of the types in gdbtypes_post_init have the equals sign at the end of the line, so this code was being consistent with them. But you're right, the GNU Coding Standards say to break a line before an operator. Changed. > > void > > +print_decimal_floating (const gdb_byte *valaddr, struct type *type, > > + struct ui_file *stream) > > +{ > > + char decstr[128]; > > + unsigned len = TYPE_LENGTH (type); > > + > > + decimal_to_string (valaddr, len, decstr); > > + fputs_filtered (decstr, stream); > > + return; > > +} > > Does the libdecnumber API specify that 128 bytes is enough? If so > this should be a constant in dfp.h. Actually, I just found out that libdecnumber specifies a lower limit: 43 (including the '\0' at the end), so I created a MAX_DECIMAL_STRING constant in dfp.h and use that here. What do you think of this version? -- []'s Thiago Jung Bauermann Software Engineer IBM Linux Technology Center --=-tjousCCJCKyvlYp7PsQP Content-Disposition: attachment; filename=decfloat-types.diff Content-Type: text/x-patch; name=decfloat-types.diff; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 8234 Subject: decimal floating point types 2007-10-15 Wu Zhou Thiago Jung Bauermann * 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. Index: gdb/c-lang.c =================================================================== --- gdb/c-lang.c.orig 2007-09-25 23:45:17.000000000 -0300 +++ gdb/c-lang.c 2007-10-15 14:35:18.000000000 -0200 @@ -325,6 +325,21 @@ c_create_fundamental_type (struct objfil / 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: gdb/c-valprint.c =================================================================== --- gdb/c-valprint.c.orig 2007-09-25 23:45:18.000000000 -0300 +++ gdb/c-valprint.c 2007-10-15 14:35:18.000000000 -0200 @@ -474,6 +474,13 @@ c_val_print (struct type *type, const gd } 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: gdb/dwarf2read.c =================================================================== --- gdb/dwarf2read.c.orig 2007-09-27 20:26:54.000000000 -0300 +++ gdb/dwarf2read.c 2007-10-15 14:35:18.000000000 -0200 @@ -4869,6 +4869,9 @@ read_base_type (struct die_info *die, st 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; @@ -7756,6 +7759,14 @@ dwarf_base_type (int encoding, int size, 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: gdb/gdbtypes.c =================================================================== --- gdb/gdbtypes.c.orig 2007-10-09 11:22:47.000000000 -0300 +++ gdb/gdbtypes.c 2007-10-15 14:35:18.000000000 -0200 @@ -3506,6 +3506,21 @@ gdbtypes_post_init (struct gdbarch *gdba 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: gdb/gdbtypes.h =================================================================== --- gdb/gdbtypes.h.orig 2007-09-25 23:45:18.000000000 -0300 +++ gdb/gdbtypes.h 2007-10-15 14:35:18.000000000 -0200 @@ -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: gdb/valprint.c =================================================================== --- gdb/valprint.c.orig 2007-09-25 23:45:23.000000000 -0300 +++ gdb/valprint.c 2007-10-15 14:35:18.000000000 -0200 @@ -33,6 +33,7 @@ #include "floatformat.h" #include "doublest.h" #include "exceptions.h" +#include "dfp.h" #include @@ -506,6 +507,18 @@ print_floating (const gdb_byte *valaddr, } 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: gdb/value.h =================================================================== --- gdb/value.h.orig 2007-10-15 14:25:14.000000000 -0200 +++ gdb/value.h 2007-10-15 14:35:46.000000000 -0200 @@ -492,6 +492,9 @@ extern void print_longest (struct ui_fil 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); Index: gdb/c-typeprint.c =================================================================== --- gdb/c-typeprint.c.orig 2007-09-25 23:45:18.000000000 -0300 +++ gdb/c-typeprint.c 2007-10-15 14:35:18.000000000 -0200 @@ -277,6 +277,7 @@ c_type_print_varspec_prefix (struct type 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 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; --=-tjousCCJCKyvlYp7PsQP--