From: Luis Machado <luisgpm@linux.vnet.ibm.com>
To: gdb-patches ml <gdb-patches@sourceware.org>
Subject: [RFC] Detecting and printing 128-bit long double values for PPC
Date: Sat, 28 Apr 2007 14:08:00 -0000 [thread overview]
Message-ID: <1177738704.6280.40.camel@localhost> (raw)
[-- Attachment #1: Type: text/plain, Size: 651 bytes --]
Hi,
Follows attached the patch for detecting and printing 128-bit long
double values on GDB for PPC.
This patch was originally written by Pete Carr some time ago. Since its
discussion didn't go much further, i've refreshed it to cleanly apply on
HEAD. The original message with the patch can be found here:
(http://sourceware.org/ml/gdb-patches/2006-07/msg00098.html)
I've modified some bits and pieces suggested by Mark Kettenis and
Daniel Jacobowitz on these mailing list entries.
http://sourceware.org/ml/gdb-patches/2006-07/msg00103.html
http://sourceware.org/ml/gdb-patches/2006-07/msg00107.html
Comments are welcome.
Best regards,
Luis
[-- Attachment #2: long_double.diff --]
[-- Type: text/x-patch, Size: 6437 bytes --]
2007-04-26 Pete Carr <pecarr@us.ibm.com>
Luis Machado <luisgpm@br.ibm.com>
* rs6000-tdep.c (rs6000_gdbarch_init): Set the long double format for
powerpc64.
* configure.host : Set the host long double format for powerpc64 to be
a 128-bit type defined in libiberty/floatformat.c.
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove code that sets long double
size to 8 bytes.
* floatformat.c : Introduce default floatformat structs to describe the
128-bit long double found on the powerpc64. Description does not fully
describe this format which is actually a pair of 64-bit doubles. However
we are relying on floatformat_to_doublest() recognizing that this is
also the default host floatformat.
* floatformat.h : Default floatformat structs for powerpc64 128-bit
long doubles.
* gdbtypes.h : Added new type struct floatformats_ppc64_long_double
declaration
* gdbtypes.c : Added new type struct floatformats_ppc64_long_double
Index: gdb/configure.host
===================================================================
--- gdb/configure.host.orig 2007-04-27 21:05:28.000000000 -0700
+++ gdb/configure.host 2007-04-27 21:05:32.000000000 -0700
@@ -198,6 +198,11 @@
gdb_host_double_format="&floatformat_ieee_double_big"
gdb_host_long_double_format="&floatformat_m68881_ext"
;;
+powerpc64-*-*)
+ gdb_host_float_format=0
+ gdb_host_double_format=0
+ gdb_host_long_double_format="&floatformat_ppc64_long_double_big"
+ ;;
*)
gdb_host_float_format=0
gdb_host_double_format=0
Index: gdb/ppc-linux-tdep.c
===================================================================
--- gdb/ppc-linux-tdep.c.orig 2007-04-27 21:05:28.000000000 -0700
+++ gdb/ppc-linux-tdep.c 2007-04-27 21:12:29.000000000 -0700
@@ -1028,16 +1028,6 @@
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- /* NOTE: jimb/2004-03-26: The System V ABI PowerPC Processor
- Supplement says that long doubles are sixteen bytes long.
- However, as one of the known warts of its ABI, PPC GNU/Linux uses
- eight-byte long doubles. GCC only recently got 128-bit long
- double support on PPC, so it may be changing soon. The
- Linux[sic] Standards Base says that programs that use 'long
- double' on PPC GNU/Linux are non-conformant. */
- /* NOTE: cagney/2005-01-25: True for both 32- and 64-bit. */
- set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
-
if (tdep->wordsize == 4)
{
/* Until November 2001, gcc did not comply with the 32 bit SysV
Index: gdb/rs6000-tdep.c
===================================================================
--- gdb/rs6000-tdep.c.orig 2007-04-27 21:05:28.000000000 -0700
+++ gdb/rs6000-tdep.c 2007-04-27 21:05:32.000000000 -0700
@@ -3425,7 +3425,13 @@
set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
if (sysv_abi)
- set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
+ {
+ int byte_order = gdbarch_byte_order (gdbarch);
+
+ set_gdbarch_long_double_format(gdbarch, floatformats_ppc64_long_double);
+
+ set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
+ }
else
set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
set_gdbarch_char_signed (gdbarch, 0);
Index: include/floatformat.h
===================================================================
--- include/floatformat.h.orig 2007-04-27 21:05:28.000000000 -0700
+++ include/floatformat.h 2007-04-27 21:05:32.000000000 -0700
@@ -118,6 +118,9 @@
extern const struct floatformat floatformat_ia64_spill_little;
extern const struct floatformat floatformat_ia64_quad_big;
extern const struct floatformat floatformat_ia64_quad_little;
+/* ppc64 long double implemented as 2 doubles */
+extern const struct floatformat floatformat_ppc64_long_double_big;
+extern const struct floatformat floatformat_ppc64_long_double_little;
/* Convert from FMT to a double.
FROM is the address of the extended float.
Index: libiberty/floatformat.c
===================================================================
--- libiberty/floatformat.c.orig 2007-04-27 21:05:28.000000000 -0700
+++ libiberty/floatformat.c 2007-04-27 21:05:32.000000000 -0700
@@ -106,6 +106,25 @@
floatformat_always_valid
};
+/* floatformats for ppc64 long double, big and little endian.
+ The layout is a pair of doubles. Don't use this description to pass
+ information to get_field(). The bit size is the important thing. */
+const struct floatformat floatformat_ppc64_long_double_big =
+{
+ floatformat_big, 128, 0, 1, 11, 1023, 2047, 12, 52,
+ floatformat_intbit_no,
+ "floatformat_ppc64_long_double_big",
+ floatformat_always_valid
+};
+
+const struct floatformat floatformat_ppc64_long_double_little =
+{
+ floatformat_little, 128, 0, 1, 11, 1023, 2047, 12, 52,
+ floatformat_intbit_no,
+ "floatformat_ppc64_long_double_little",
+ floatformat_always_valid
+};
+
/* floatformat for IEEE double, little endian byte order, with big endian word
ordering, as on the ARM. */
Index: gdb/gdbtypes.c
===================================================================
--- gdb/gdbtypes.c.orig 2007-04-27 21:05:28.000000000 -0700
+++ gdb/gdbtypes.c 2007-04-27 21:06:00.000000000 -0700
@@ -112,6 +112,11 @@
&floatformat_ieee_double_big,
&floatformat_ieee_double_littlebyte_bigword
};
+const struct floatformat *floatformats_ppc64_long_double[BFD_ENDIAN_UNKNOWN] =
+{
+ &floatformat_ppc64_long_double_big,
+ &floatformat_ppc64_long_double_little
+};
const struct floatformat *floatformats_i387_ext[BFD_ENDIAN_UNKNOWN] = {
&floatformat_i387_ext,
&floatformat_i387_ext
Index: gdb/gdbtypes.h
===================================================================
--- gdb/gdbtypes.h.orig 2007-04-27 21:05:28.000000000 -0700
+++ gdb/gdbtypes.h 2007-04-27 21:05:32.000000000 -0700
@@ -1118,6 +1118,7 @@
extern const struct floatformat *floatformats_ieee_single[BFD_ENDIAN_UNKNOWN];
extern const struct floatformat *floatformats_ieee_double[BFD_ENDIAN_UNKNOWN];
extern const struct floatformat *floatformats_ieee_double_littlebyte_bigword[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_ppc64_long_double[BFD_ENDIAN_UNKNOWN];
extern const struct floatformat *floatformats_i387_ext[BFD_ENDIAN_UNKNOWN];
extern const struct floatformat *floatformats_m68881_ext[BFD_ENDIAN_UNKNOWN];
extern const struct floatformat *floatformats_arm_ext[BFD_ENDIAN_UNKNOWN];
next reply other threads:[~2007-04-28 5:38 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-28 14:08 Luis Machado [this message]
2007-04-28 16:19 ` Daniel Jacobowitz
2007-04-28 16:27 ` Ulrich Weigand
2007-04-28 16:49 ` Daniel Jacobowitz
2007-04-28 23:47 ` Luis Machado
2007-04-30 12:28 ` Ulrich Weigand
2007-04-30 12:41 ` Daniel Jacobowitz
2007-04-30 13:15 ` Luis Machado
2007-04-30 13:19 ` Daniel Jacobowitz
2007-04-30 13:51 ` Luis Machado
2007-04-30 13:53 ` Luis Machado
2007-04-30 14:12 ` Daniel Jacobowitz
2007-05-06 21:36 ` Ulrich Weigand
2007-05-06 22:17 ` Daniel Jacobowitz
2007-08-31 18:15 ` Luis Machado
2007-08-31 18:27 ` Joseph S. Myers
2007-04-30 18:03 ` Luis Machado
2007-04-30 13:08 ` Luis Machado
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1177738704.6280.40.camel@localhost \
--to=luisgpm@linux.vnet.ibm.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox