diff options
author | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-01-23 15:15:05 +0000 |
---|---|---|
committer | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-01-23 15:15:05 +0000 |
commit | af908c02d4c893024a3ccfa73244b96a10caeb2f (patch) | |
tree | 4239faf09e39683b3cf8286950be3b1832fd451b /gcc/read-rtl.c | |
parent | 0a1039d0a6d67e2b6c303ceb4079deead1e6b108 (diff) | |
download | gcc-af908c02d4c893024a3ccfa73244b96a10caeb2f.tar.gz |
r110123@banpei: zack | 2006-01-22 14:44:34 -0800
* genconditions.c (condition_table, add_condition): Delete.
(write_conditions): Don't emit n_insn_conditions nor
insn_elision_unavailable. Issue the gcc version #ifdef here,
inside the table, with no #else clause ...
(write_header): ...not here.
(write_writer): New function.
(main): Don't initialize condition_table. Use add_c_test.
Call write_writer.
* gensupport.c (init_md_reader_args_cb): Handle multiple input
files on the command line.
(maybe_eval_c_test): Don't check insn_elision_unavailable.
Return -1 if there is no entry in the table, don't abort.
(add_c_test, traverse_c_tests): New functions.
* gensupport.h (insn_elision_unavailable, insn_conditions)
(n_insn_conditions): Delete declarations.
(add_c_test, traverse_c_tests): Declare.
* read-rtl.c: Include gensupport.h.
(read_conditions): New function.
(read_rtx): If read_rtx_1 returns 0, treat as EOF.
(read_rtx_1): If we get EOF when we were looking for an initial
open paren, return 0. Call read_conditions when appropriate.
* Makefile.in: Kill BUILD_EARLY_SUPPORT and all references to
dummy-conditions.o. Eliminate references to insn-conditions.o,
or change them to build/gencondmd.o, as appropriate. Remove
insn-constants.h from $(simple_generated_h) and insn-conditions.c
from $(simple_generated_c). For all files remaining in those
two lists, add insn-conditions.md to the generator command line.
Give insn-constants.h/s-constants their own rules. Add rules
for build/gencondmd.c, s-conditions, insn-conditions.md, s-condmd.
(build/read-rtl.o): Depend on gensupport.h.
(genprognormal): Include preds.
(genprogearly): Rename genprognoprint; only difference is now that
they don't link with $(BUILD_PRINT).
* dummy-conditions.c: Delete.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110119 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/read-rtl.c')
-rw-r--r-- | gcc/read-rtl.c | 74 |
1 files changed, 72 insertions, 2 deletions
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c index 79f40508d3b..b4b105108eb 100644 --- a/gcc/read-rtl.c +++ b/gcc/read-rtl.c @@ -31,6 +31,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "rtl.h" #include "obstack.h" #include "hashtab.h" +#include "gensupport.h" static htab_t md_constants; @@ -138,6 +139,7 @@ static void read_escape (FILE *); static hashval_t def_hash (const void *); static int def_name_eq_p (const void *, const void *); static void read_constants (FILE *infile, char *tmp_char); +static void read_conditions (FILE *infile, char *tmp_char); static void validate_const_int (FILE *, const char *); static int find_macro (struct macro_group *, const char *, FILE *); static struct mapping *read_mapping (struct macro_group *, htab_t, FILE *); @@ -1205,6 +1207,58 @@ traverse_md_constants (htab_trav callback, void *info) if (md_constants) htab_traverse (md_constants, callback, info); } + +/* INFILE is a FILE pointer to read text from. TMP_CHAR is a buffer + suitable to read a name or number into. Process a + define_conditions directive, starting with the optional space after + the "define_conditions". The directive looks like this: + + (define_conditions [ + (number "string") + (number "string") + ... + ]) + + It's not intended to appear in machine descriptions. It is + generated by (the program generated by) genconditions.c, and + slipped in at the beginning of the sequence of MD files read by + most of the other generators. */ +static void +read_conditions (FILE *infile, char *tmp_char) +{ + int c; + + c = read_skip_spaces (infile); + if (c != '[') + fatal_expected_char (infile, '[', c); + + while ( (c = read_skip_spaces (infile)) != ']') + { + char *expr; + int value; + + if (c != '(') + fatal_expected_char (infile, '(', c); + + read_name (tmp_char, infile); + validate_const_int (infile, tmp_char); + value = atoi (tmp_char); + + c = read_skip_spaces (infile); + if (c != '"') + fatal_expected_char (infile, '"', c); + expr = read_quoted_string (infile); + + c = read_skip_spaces (infile); + if (c != ')') + fatal_expected_char (infile, ')', c); + + add_c_test (expr, value); + } + c = read_skip_spaces (infile); + if (c != ')') + fatal_expected_char (infile, ')', c); +} static void validate_const_int (FILE *infile, const char *string) @@ -1354,16 +1408,23 @@ read_rtx (FILE *infile, rtx *x, int *lineno) { struct map_value *mode_maps; struct macro_traverse_data mtd; + rtx from_file; c = read_skip_spaces (infile); if (c == EOF) return false; ungetc (c, infile); - queue_next = queue_head; queue_lineno = read_rtx_lineno; mode_maps = 0; - XEXP (queue_next, 0) = read_rtx_1 (infile, &mode_maps); + from_file = read_rtx_1 (infile, &mode_maps); + if (from_file == 0) + return false; /* This confuses a top level (nil) with end of + file, but a top level (nil) would have + crashed our caller anyway. */ + + queue_next = queue_head; + XEXP (queue_next, 0) = from_file; XEXP (queue_next, 1) = 0; mtd.queue = queue_next; @@ -1412,6 +1473,10 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) again: c = read_skip_spaces (infile); /* Should be open paren. */ + + if (c == EOF) + return 0; + if (c != '(') fatal_expected_char (infile, '(', c); @@ -1429,6 +1494,11 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) read_constants (infile, tmp_char); goto again; } + if (strcmp (tmp_char, "define_conditions") == 0) + { + read_conditions (infile, tmp_char); + goto again; + } if (strcmp (tmp_char, "define_mode_attr") == 0) { read_mapping (&modes, modes.attrs, infile); |