summaryrefslogtreecommitdiffstats
path: root/gcc/read-rtl.c
diff options
context:
space:
mode:
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>2001-11-19 22:37:12 +0000
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>2001-11-19 22:37:12 +0000
commitbd7c2be3b3eb0361a095b4023a4c34fef1cff54b (patch)
tree600d1a2fa45d18ede321e0380ab136ef1e727499 /gcc/read-rtl.c
parent0d95c8cc005a94a22bd16c200c5d435a52c0de65 (diff)
downloadppe42-gcc-bd7c2be3b3eb0361a095b4023a4c34fef1cff54b.tar.gz
ppe42-gcc-bd7c2be3b3eb0361a095b4023a4c34fef1cff54b.zip
* read-rtl.c (ISDIGIT, ISSPACE): Make sure we have these.
(validate_const_int): New. (read_rtx): Validate constant integers. * config/i386/i386.md (pmulhrwv4hi3): Use decimal constants. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47187 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/read-rtl.c')
-rw-r--r--gcc/read-rtl.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c
index a366dc8c6c2..fd79176c755 100644
--- a/gcc/read-rtl.c
+++ b/gcc/read-rtl.c
@@ -25,6 +25,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "obstack.h"
#include "hashtab.h"
+#ifndef ISDIGIT
+#include <ctype.h>
+#define ISDIGIT isdigit
+#define ISSPACE isspace
+#endif
+
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
@@ -41,6 +47,7 @@ static void read_escape PARAMS ((struct obstack *, FILE *));
static unsigned def_hash PARAMS ((const void *));
static int def_name_eq_p PARAMS ((const void *, const void *));
static void read_constants PARAMS ((FILE *infile, char *tmp_char));
+static void validate_const_int PARAMS ((FILE *, const char *));
/* Subroutines of read_rtx. */
@@ -494,6 +501,28 @@ traverse_md_constants (callback, info)
htab_traverse (md_constants, callback, info);
}
+static void
+validate_const_int (infile, string)
+ FILE *infile;
+ const char *string;
+{
+ const char *cp;
+ int valid = 1;
+
+ cp = string;
+ while (*cp && ISSPACE(*cp))
+ cp++;
+ if (*cp == '-' || *cp == '+')
+ cp++;
+ if (*cp == 0)
+ valid = 0;
+ for (; *cp; cp++)
+ if (! ISDIGIT (*cp))
+ valid = 0;
+ if (!valid)
+ fatal_with_file_and_line (infile, "invalid decimal constant \"%s\"\n", string);
+}
+
/* 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
@@ -699,6 +728,7 @@ again:
case 'w':
read_name (tmp_char, infile);
+ validate_const_int(infile, tmp_char);
#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
tmp_wide = atoi (tmp_char);
#else
@@ -720,6 +750,7 @@ again:
case 'i':
case 'n':
read_name (tmp_char, infile);
+ validate_const_int(infile, tmp_char);
tmp_int = atoi (tmp_char);
XINT (return_rtx, i) = tmp_int;
break;
OpenPOWER on IntegriCloud