[packages/gdb] - teach gdb about little-endian IBM long double (required for binutils 2.24.51.0.1) - rel 2
baggins
baggins at pld-linux.org
Tue Dec 3 20:58:34 CET 2013
commit 99d067e525af5a3b4f1b7f4c40954af1eab428ca
Author: Jan Rękorajski <baggins at pld-linux.org>
Date: Tue Dec 3 20:56:56 2013 +0100
- teach gdb about little-endian IBM long double (required for binutils 2.24.51.0.1)
- rel 2
floatformat_ibm_long_double.patch | 152 ++++++++++++++++++++++++++++++++++++++
gdb.spec | 4 +-
2 files changed, 155 insertions(+), 1 deletion(-)
---
diff --git a/gdb.spec b/gdb.spec
index 5dbb0b0..fa7e561 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -21,7 +21,7 @@ Summary(zh_TW.UTF-8): [.-A開發]C和.$)B其.-A他語.$)B言的調試器
%define snap 20120926
Name: gdb
Version: 7.6.1
-Release: 1
+Release: 2
License: GPL v3+
Group: Development/Debuggers
Source0: http://ftp.gnu.org/gnu/gdb/%{name}-%{version}.tar.bz2
@@ -36,6 +36,7 @@ Patch103: gdb-6.6-buildid-locate-core-as-arg.patch
Patch104: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch
Patch105: gdb-6.3-gstack-20050411.patch
Patch106: gdb-gdb-add-index-script.patch
+Patch107: floatformat_ibm_long_double.patch
Patch1000: %{name}-readline.patch
Patch1001: %{name}-info.patch
Patch1002: %{name}-passflags.patch
@@ -176,6 +177,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
%patch104 -p1
%patch105 -p1
%patch106 -p1
+%patch107 -p1
%patch1000 -p1
%patch1001 -p1
diff --git a/floatformat_ibm_long_double.patch b/floatformat_ibm_long_double.patch
new file mode 100644
index 0000000..e803e30
--- /dev/null
+++ b/floatformat_ibm_long_double.patch
@@ -0,0 +1,152 @@
+https://sourceware.org/ml/gdb-patches/2013-08/msg00483.html
+
+diff --git a/include/floatformat.h b/include/floatformat.h
+index b595164..04db61a 100644
+--- a/include/floatformat.h
++++ b/include/floatformat.h
+@@ -128,7 +128,8 @@ extern const struct floatformat floatformat_ia64_spill_little;
+ extern const struct floatformat floatformat_ia64_quad_big;
+ extern const struct floatformat floatformat_ia64_quad_little;
+ /* IBM long double (double+double). */
+-extern const struct floatformat floatformat_ibm_long_double;
++extern const struct floatformat floatformat_ibm_long_double_big;
++extern const struct floatformat floatformat_ibm_long_double_little;
+
+ /* Convert from FMT to a double.
+ FROM is the address of the extended float.
+diff --git a/libiberty/floatformat.c b/libiberty/floatformat.c
+index c58ab01..789fa05 100644
+--- a/libiberty/floatformat.c
++++ b/libiberty/floatformat.c
+@@ -371,14 +371,23 @@ floatformat_ibm_long_double_is_valid (const struct floatformat *fmt,
+ }
+ }
+
+-const struct floatformat floatformat_ibm_long_double =
++const struct floatformat floatformat_ibm_long_double_big =
+ {
+ floatformat_big, 128, 0, 1, 11, 1023, 2047, 12, 52,
+ floatformat_intbit_no,
+- "floatformat_ibm_long_double",
++ "floatformat_ibm_long_double_big",
+ floatformat_ibm_long_double_is_valid,
+ &floatformat_ieee_double_big
+ };
++
++const struct floatformat floatformat_ibm_long_double_little =
++{
++ floatformat_little, 128, 0, 1, 11, 1023, 2047, 12, 52,
++ floatformat_intbit_no,
++ "floatformat_ibm_long_double_little",
++ floatformat_ibm_long_double_is_valid,
++ &floatformat_ieee_double_little
++};
+
+
+ #ifndef min
+--
+1.7.1
+
+diff --git a/gdb/doublest.c b/gdb/doublest.c
+index 2e4c87e..85890b1 100644
+--- a/gdb/doublest.c
++++ b/gdb/doublest.c
+@@ -190,7 +190,8 @@ convert_floatformat_to_doublest (const struct floatformat *fmt,
+ {
+ double dto;
+
+- floatformat_to_double (fmt, from, &dto);
++ floatformat_to_double (fmt->split_half ? fmt->split_half : fmt,
++ from, &dto);
+ *to = (DOUBLEST) dto;
+ return;
+ }
+@@ -514,6 +515,11 @@ floatformat_is_negative (const struct floatformat *fmt,
+ gdb_assert (fmt->totalsize
+ <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
+
++ /* An IBM long double (a two element array of double) always takes the
++ sign of the first double. */
++ if (fmt->split_half)
++ fmt = fmt->split_half;
++
+ order = floatformat_normalize_byteorder (fmt, uval, newfrom);
+
+ if (order != fmt->byteorder)
+@@ -540,6 +546,13 @@ floatformat_classify (const struct floatformat *fmt,
+ gdb_assert (fmt->totalsize
+ <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
+
++ /* An IBM long double (a two element array of double) can be classified
++ by looking at the first double. inf and nan are specified as
++ ignoring the second double. zero and subnormal will always have
++ the second double 0.0 if the long double is correctly rounded. */
++ if (fmt->split_half)
++ fmt = fmt->split_half;
++
+ order = floatformat_normalize_byteorder (fmt, uval, newfrom);
+
+ if (order != fmt->byteorder)
+@@ -622,6 +635,16 @@ floatformat_mantissa (const struct floatformat *fmt,
+ gdb_assert (fmt->totalsize
+ <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
+
++ /* For IBM long double (a two element array of double), return the
++ mantissa of the first double. The problem with returning the
++ actual mantissa from both doubles is that there can be an
++ arbitrary number of implied 0's or 1's between the mantissas
++ of the first and second double. In any case, this function
++ is only used for dumping out nans, and a nan is specified to
++ ignore the value in the second double. */
++ if (fmt->split_half)
++ fmt = fmt->split_half;
++
+ order = floatformat_normalize_byteorder (fmt, uval, newfrom);
+
+ if (order != fmt->byteorder)
+@@ -879,27 +902,3 @@ convert_typed_floating (const void *from, const struct type *from_type,
+ floatformat_from_doublest (to_fmt, &d, to);
+ }
+ }
+-
+-const struct floatformat *floatformat_ieee_single[BFD_ENDIAN_UNKNOWN];
+-const struct floatformat *floatformat_ieee_double[BFD_ENDIAN_UNKNOWN];
+-const struct floatformat *floatformat_ieee_quad[BFD_ENDIAN_UNKNOWN];
+-const struct floatformat *floatformat_arm_ext[BFD_ENDIAN_UNKNOWN];
+-const struct floatformat *floatformat_ia64_spill[BFD_ENDIAN_UNKNOWN];
+-
+-extern void _initialize_doublest (void);
+-
+-extern void
+-_initialize_doublest (void)
+-{
+- floatformat_ieee_single[BFD_ENDIAN_LITTLE] = &floatformat_ieee_single_little;
+- floatformat_ieee_single[BFD_ENDIAN_BIG] = &floatformat_ieee_single_big;
+- floatformat_ieee_double[BFD_ENDIAN_LITTLE] = &floatformat_ieee_double_little;
+- floatformat_ieee_double[BFD_ENDIAN_BIG] = &floatformat_ieee_double_big;
+- floatformat_arm_ext[BFD_ENDIAN_LITTLE]
+- = &floatformat_arm_ext_littlebyte_bigword;
+- floatformat_arm_ext[BFD_ENDIAN_BIG] = &floatformat_arm_ext_big;
+- floatformat_ia64_spill[BFD_ENDIAN_LITTLE] = &floatformat_ia64_spill_little;
+- floatformat_ia64_spill[BFD_ENDIAN_BIG] = &floatformat_ia64_spill_big;
+- floatformat_ieee_quad[BFD_ENDIAN_LITTLE] = &floatformat_ia64_quad_little;
+- floatformat_ieee_quad[BFD_ENDIAN_BIG] = &floatformat_ia64_quad_big;
+-}
+diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
+index d19c593..dd2ef96 100644
+--- a/gdb/gdbtypes.c
++++ b/gdb/gdbtypes.c
+@@ -108,8 +108,8 @@ const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN] = {
+ &floatformat_vax_d
+ };
+ const struct floatformat *floatformats_ibm_long_double[BFD_ENDIAN_UNKNOWN] = {
+- &floatformat_ibm_long_double,
+- &floatformat_ibm_long_double
++ &floatformat_ibm_long_double_big,
++ &floatformat_ibm_long_double_little
+ };
+
+ /* Should opaque types be resolved? */
+--
+1.7.1
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/gdb.git/commitdiff/99d067e525af5a3b4f1b7f4c40954af1eab428ca
More information about the pld-cvs-commit
mailing list