summaryrefslogtreecommitdiff
path: root/gcc/genflags.c
diff options
context:
space:
mode:
authorZack Weinberg <zack@gcc.gnu.org>2002-07-29 18:02:47 +0000
committerZack Weinberg <zack@gcc.gnu.org>2002-07-29 18:02:47 +0000
commit2199e5fade2d41cbdb19bb730e494613b9b7e262 (patch)
tree8880ef10951d3d1fbca761d1c3b95b762f0409e5 /gcc/genflags.c
parent6ab185d6a53a5d77b86144d26414b5167778384a (diff)
gensupport.c: Include hashtab.h.
* gensupport.c: Include hashtab.h. (insn_elision, condition_table, hash_c_test, cmp_c_test, maybe_eval_c_test): New routines and data structures to support insn elision. (init_md_reader): Read and initialize the condition_table. (read_md_rtx): Discard insn patterns whose C test is provably always false. * gensupport.h: Declare new functions and data structures. * genconditions.c, dummy-conditions.c: New files. * Makefile.in: Build genconditions; run it to construct insn-conditions.c; build that and link it into most gen* programs. (HOST_SUPPORT, HOST_EARLY_SUPPORT): New variables. (GEN): Delete, unused. (STAGESTUFF): Update. * gencodes.c: (gen_insn): #define CODE_FOR_xxx equal to CODE_FOR_nothing for all elided patterns. (main): Tweaked to support this. * genflags.c (gen_proto): Emit a static inline generator function here for all elided patterns, which simply returns NULL_RTX. (gen_insn): Do not define HAVE_xxx for elided patterns. (main): Tweaked to support this. No need to forward-declare struct rtx_def. * genrecog.c: Do not bother emitting the C test if it's known to be true at compile time. From-SVN: r55839
Diffstat (limited to 'gcc/genflags.c')
-rw-r--r--gcc/genflags.c63
1 files changed, 47 insertions, 16 deletions
diff --git a/gcc/genflags.c b/gcc/genflags.c
index 114b98b837e..94806816762 100644
--- a/gcc/genflags.c
+++ b/gcc/genflags.c
@@ -124,14 +124,18 @@ gen_macro (name, real, expect)
printf ("(%c))\n", i + 'A');
}
-/* Print out prototype information for a function. */
+/* Print out prototype information for a generator function. If the
+ insn pattern has been elided, print out a dummy generator that
+ does nothing. */
static void
gen_proto (insn)
rtx insn;
{
int num = num_operands (insn);
+ int i;
const char *name = XSTR (insn, 0);
+ int truth = maybe_eval_c_test (XSTR (insn, 2));
/* Many md files don't refer to the last two operands passed to the
call patterns. This means their generator functions will be two
@@ -152,19 +156,41 @@ gen_proto (insn)
gen_macro (name, num, 5);
}
- printf ("extern struct rtx_def *gen_%-*s PARAMS ((", max_id_len, name);
+ if (truth != 0)
+ printf ("extern rtx gen_%-*s PARAMS ((", max_id_len, name);
+ else
+ printf ("static inline rtx gen_%-*s PARAMS ((", max_id_len, name);
if (num == 0)
- printf ("void");
+ fputs ("void", stdout);
else
{
- while (num-- > 1)
- printf ("struct rtx_def *, ");
-
- printf ("struct rtx_def *");
+ for (i = 1; i < num; i++)
+ fputs ("rtx, ", stdout);
+
+ fputs ("rtx", stdout);
}
- printf ("));\n");
+ puts ("));");
+
+ /* Some back ends want to take the address of generator functions,
+ so we cannot simply use #define for these dummy definitions. */
+ if (truth == 0)
+ {
+ printf ("static inline rtx\ngen_%s", name);
+ if (num > 0)
+ {
+ putchar ('(');
+ for (i = 0; i < num-1; i++)
+ printf ("%c, ", 'a' + i);
+ printf ("%c)\n", 'a' + i);
+ for (i = 0; i < num; i++)
+ printf (" rtx %c ATTRIBUTE_UNUSED;\n", 'a' + i);
+ }
+ else
+ puts ("()");
+ puts ("{\n return 0;\n}");
+ }
}
@@ -175,6 +201,7 @@ gen_insn (insn)
const char *name = XSTR (insn, 0);
const char *p;
int len;
+ int truth = maybe_eval_c_test (XSTR (insn, 2));
/* Don't mention instructions whose names are the null string
or begin with '*'. They are in the machine description just
@@ -187,22 +214,23 @@ gen_insn (insn)
if (len > max_id_len)
max_id_len = len;
- printf ("#define HAVE_%s ", name);
- if (strlen (XSTR (insn, 2)) == 0)
- printf ("1\n");
+ if (truth == 0)
+ /* emit nothing */;
+ else if (truth == 1)
+ printf ("#define HAVE_%s 1\n", name);
else
{
/* Write the macro definition, putting \'s at the end of each line,
if more than one. */
- printf ("(");
+ printf ("#define HAVE_%s (", name);
for (p = XSTR (insn, 2); *p; p++)
{
if (IS_VSPACE (*p))
- printf (" \\\n");
+ fputs (" \\\n", stdout);
else
- printf ("%c", *p);
+ putchar (*p);
}
- printf (")\n");
+ fputs (")\n", stdout);
}
obstack_grow (&obstack, &insn, sizeof (rtx));
@@ -223,6 +251,10 @@ main (argc, argv)
progname = "genflags";
obstack_init (&obstack);
+ /* We need to see all the possibilities. Elided insns may have
+ direct calls to their generators in C code. */
+ insn_elision = 0;
+
if (argc <= 1)
fatal ("no input file name");
@@ -252,7 +284,6 @@ main (argc, argv)
obstack_grow (&obstack, &dummy, sizeof (rtx));
insns = (rtx *) obstack_finish (&obstack);
- printf ("struct rtx_def;\n");
for (insn_ptr = insns; *insn_ptr; insn_ptr++)
gen_proto (*insn_ptr);