diff options
author | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-19 22:37:12 +0000 |
---|---|---|
committer | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-19 22:37:12 +0000 |
commit | bd7c2be3b3eb0361a095b4023a4c34fef1cff54b (patch) | |
tree | 600d1a2fa45d18ede321e0380ab136ef1e727499 /gcc/read-rtl.c | |
parent | 0d95c8cc005a94a22bd16c200c5d435a52c0de65 (diff) | |
download | ppe42-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.c | 31 |
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; |