diff mbox

Add D demangling support to libiberty

Message ID 20141014170751.GG4805@adacore.com
State New
Headers show

Commit Message

Joel Brobecker Oct. 14, 2014, 5:07 p.m. UTC
> 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.

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.

I verified that the patch allows GDB to build on both sparc-solaris
and x86_64-linux.

Thanks,

Comments

Ian Lance Taylor Oct. 14, 2014, 5:33 p.m. UTC | #1
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
Iain Buclaw Oct. 14, 2014, 5:33 p.m. UTC | #2
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
Joel Brobecker Oct. 14, 2014, 6:01 p.m. UTC | #3
> > 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!
diff mbox

Patch

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