aboutsummaryrefslogtreecommitdiff
path: root/gcc/read-rtl.c
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2006-01-23 15:15:05 +0000
committerZack Weinberg <zack@gcc.gnu.org>2006-01-23 15:15:05 +0000
commit1c7352cde8a759e414b61d3aeaf40eda67f8dd75 (patch)
tree4239faf09e39683b3cf8286950be3b1832fd451b /gcc/read-rtl.c
parent245fc6392879dd2493d4be97cbd01c64d0a61adf (diff)
downloadgcc-1c7352cde8a759e414b61d3aeaf40eda67f8dd75.zip
gcc-1c7352cde8a759e414b61d3aeaf40eda67f8dd75.tar.gz
gcc-1c7352cde8a759e414b61d3aeaf40eda67f8dd75.tar.bz2
r110123@banpei: zack | 2006-01-22 14:44:34 -0800
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. From-SVN: r110119
Diffstat (limited to 'gcc/read-rtl.c')
-rw-r--r--gcc/read-rtl.c74
1 files changed, 72 insertions, 2 deletions
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c
index 79f4050..b4b1051 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);