Message ID | 20141014170751.GG4805@adacore.com |
---|---|
State | New |
Headers | show |
On Tue, Oct 14, 2014 at 10:07 AM, Joel Brobecker <brobecker@adacore.com> wrote: > > libiberty/ChangeLog: > > * d-demangle.c: Replace strtold with strtod in global comment. > (strtold): Remove declaration. > (strtod): New declaration. > (dlang_parse_real): Declare value as double instead of long > double. Replace call to strtold by call to strtod. > Update format in call to snprintf. This is OK. Thanks. Ian
On 14 October 2014 18:07, Joel Brobecker <brobecker@adacore.com> wrote: >> I've just seen this, so I'll repeat what I've said in gdb patches too. >> >> The call to strtold is only needed to decode templates which have a >> floating point value encoded inside. This value may or may not have a >> greater than double precision. >> >> Replacing long double with double will be fine with me. I'll accept >> that I didn't consider legacy in hindsight, and in reality it would be >> rather rare to stumble upon the need for strtold. > > Attached is a patch that switches it to strtod. Do you have any > test that could quickly verify it? That seems to be the best > approach, at least short-term. Later on, if we do want to use > higher precision, we can indeed add strtold in libiberty. > See d-demangle-expected in the libiberty testsuite, in particular: _D8demangle17__T4testVde0A8P6Zv demangle.test!(42.0000) _D8demangle16__T4testVdeA8P2Zv demangle.test!(42.0000) _D8demangle18__T4testVdeN0A8P6Zv demangle.test!(-42.0000) _D8demangle31__T4testVde0F6E978D4FDF3B646P7Zv demangle.test!(123.456) I doubt they would need adjusting. Regards Iain
> > libiberty/ChangeLog: > > > > * d-demangle.c: Replace strtold with strtod in global comment. > > (strtold): Remove declaration. > > (strtod): New declaration. > > (dlang_parse_real): Declare value as double instead of long > > double. Replace call to strtold by call to strtod. > > Update format in call to snprintf. > > This is OK. Thanks, Ian. As suggested by Iain, I re-ran the libiberty testsuite on x86_64-linux before committing the patch. Thank you both!
From 99f9794c6d2f4dabed0bbcf2cf362b1eb25ee2a7 Mon Sep 17 00:00:00 2001 From: Joel Brobecker <brobecker@adacore.com> Date: Tue, 14 Oct 2014 12:47:43 -0400 Subject: [PATCH] Use strtod instead of strtold in libiberty/d-demangle.c strtold is currently used to decode templates which have a floating-point value encoded inside; but this routine is not available on some systems, such as Solaris 2.9 for instance. This patch fixes the issue by replace the use of strtold by strtod. It reduces a bit the precision, but it should still remain acceptable in most cases. libiberty/ChangeLog: * d-demangle.c: Replace strtold with strtod in global comment. (strtold): Remove declaration. (strtod): New declaration. (dlang_parse_real): Declare value as double instead of long double. Replace call to strtold by call to strtod. Update format in call to snprintf. --- libiberty/d-demangle.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c index d31bf94..bb481c0 100644 --- a/libiberty/d-demangle.c +++ b/libiberty/d-demangle.c @@ -28,7 +28,7 @@ If not, see <http://www.gnu.org/licenses/>. */ /* This file exports one function; dlang_demangle. - This file imports strtol and strtold for decoding mangled literals. */ + This file imports strtol and strtod for decoding mangled literals. */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -44,7 +44,7 @@ If not, see <http://www.gnu.org/licenses/>. */ #include <stdlib.h> #else extern long strtol (const char *nptr, char **endptr, int base); -extern long double strtold (const char *nptr, char **endptr); +extern double strtod (const char *nptr, char **endptr); #endif #include <demangle.h> @@ -810,7 +810,7 @@ dlang_parse_real (string *decl, const char *mangled) { char buffer[64]; int len = 0; - long double value; + double value; char *endptr; /* Handle NAN and +-INF. */ @@ -877,12 +877,12 @@ dlang_parse_real (string *decl, const char *mangled) /* Convert buffer from hexadecimal to floating-point. */ buffer[len] = '\0'; - value = strtold (buffer, &endptr); + value = strtod (buffer, &endptr); if (endptr == NULL || endptr != (buffer + len)) return NULL; - len = snprintf (buffer, sizeof(buffer), "%#Lg", value); + len = snprintf (buffer, sizeof(buffer), "%#g", value); string_appendn (decl, buffer, len); return mangled; } -- 1.7.9.5