rtl.c (read_rtx): Fall back on homebrew atoll if HOST_WIDE_INT is large...
authorRichard Henderson <rth@cygnus.com>
Wed, 18 Mar 1998 09:55:53 +0000 (01:55 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 18 Mar 1998 09:55:53 +0000 (01:55 -0800)
        * rtl.c (read_rtx): Fall back on homebrew atoll if HOST_WIDE_INT
        is large, and the system doesn't provide atoll or atoq.
        (atoll): New.
        * alpha/xm-vms.h (HAVE_ATOLL): Define.
        Reported by Klaus Kaempf <kkaempf@progis.de>.

From-SVN: r18657

gcc/ChangeLog
gcc/config/alpha/xm-vms.h
gcc/rtl.c

index 8b70fb7..cedf008 100644 (file)
@@ -1,3 +1,12 @@
+Wed Mar 18 09:52:56 1998  Richard Henderson  <rth@cygnus.com>
+
+       * rtl.c (read_rtx): Fall back on homebrew atoll if HOST_WIDE_INT
+       is large, and the system doesn't provide atoll or atoq.
+       (atoll): New.  
+
+       * alpha/xm-vms.h (HAVE_ATOLL): Define.
+       Reported by Klaus Kaempf <kkaempf@progis.de>.
+       
 Wed Mar 18 09:56:26 1998  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * c-lang.c (finish_file): Wrap variable `void_list_node' with macro
index 43ac5b6..5e5a442 100644 (file)
@@ -68,6 +68,7 @@ Boston, MA 02111-1307, USA.  */
 #define HAVE_VPRINTF
 #define HAVE_PUTENV
 #define HAVE_STRERROR
+#define HAVE_ATOLL
 
 #define NO_SYS_PARAMS_H                /* Don't have <sys/params.h> */
 #define NO_STAB_H              /* Don't have <stab.h> */
index acfe6c2..1de50c2 100644 (file)
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -558,6 +558,43 @@ read_name (str, infile)
   *p = 0;
 }
 \f
+/* Provide a version of a function to read a long long if the system does
+   not provide one.  */
+#if HOST_BITS_PER_WIDE_INT > HOST_BITS_PER_LONG && !defined(HAVE_ATOLL) && !defined(HAVE_ATOQ)
+HOST_WIDE_INT
+atoll(p)
+    const char *p;
+{
+  int neg = 0;
+  HOST_WIDE_INT tmp_wide;
+
+  while (isspace(*p))
+    p++;
+  if (*p == '-')
+    neg = 1, p++;
+  else if (*p == '+')
+    p++;
+
+  tmp_wide = 0;
+  while (isdigit(*p))
+    {
+      HOST_WIDE_INT new_wide = tmp_wide*10 + (*p - '0');
+      if (new_wide < tmp_wide)
+       {
+         /* Return INT_MAX equiv on overflow.  */
+         tmp_wide = (~(unsigned HOST_WIDE_INT)0) >> 1;
+         break;
+       }
+      tmp_wide = new_wide;
+      p++;
+    }
+
+  if (neg)
+    tmp_wide = -tmp_wide;
+  return tmp_wide;
+}
+#endif
+
 /* Read an rtx in printed representation from INFILE
    and return an actual rtx in core constructed accordingly.
    read_rtx is not used in the compiler proper, but rather in
@@ -768,15 +805,15 @@ read_rtx (infile)
 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
        tmp_wide = atol (tmp_char);
 #else
-#ifdef HAVE_ATOLL
+       /* Prefer atoll over atoq, since the former is in the ISO C9X draft. 
+          But prefer not to use our hand-rolled function above either.  */
+#if defined(HAVE_ATOLL) || !defined(HAVE_ATOQ)
        tmp_wide = atoll (tmp_char);
 #else
-#ifdef HAVE_ATOQ
        tmp_wide = atoq (tmp_char);
 #endif
 #endif
 #endif
-#endif
        XWINT (return_rtx, i) = tmp_wide;
        break;