From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <gentoo-commits+bounces-1699855-garchives=archives.gentoo.org@lists.gentoo.org> Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 699C21581F0 for <garchives@archives.gentoo.org>; Fri, 13 Dec 2024 13:23:48 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id A240AE077C; Fri, 13 Dec 2024 13:23:47 +0000 (UTC) Received: from smtp.gentoo.org (mail.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id A277AE077C for <gentoo-commits@lists.gentoo.org>; Fri, 13 Dec 2024 13:23:43 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id F19C634076D for <gentoo-commits@lists.gentoo.org>; Fri, 13 Dec 2024 13:23:35 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 58B12161D for <gentoo-commits@lists.gentoo.org>; Fri, 13 Dec 2024 13:23:34 +0000 (UTC) From: "Sam James" <sam@gentoo.org> To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" <sam@gentoo.org> Message-ID: <1734096195.d868db5ada6f12bebdcbf4a9ec1d0814c1cbafd8.sam@gentoo> Subject: [gentoo-commits] proj/gcc-patches:master commit in: 15.0.0/gentoo/ X-VCS-Repository: proj/gcc-patches X-VCS-Files: 15.0.0/gentoo/72_all_PR111600-genrecog-Split-into-separate-partitions.patch 15.0.0/gentoo/README.history X-VCS-Directories: 15.0.0/gentoo/ X-VCS-Committer: sam X-VCS-Committer-Name: Sam James X-VCS-Revision: d868db5ada6f12bebdcbf4a9ec1d0814c1cbafd8 X-VCS-Branch: master Date: Fri, 13 Dec 2024 13:23:34 +0000 (UTC) Precedence: bulk List-Post: <mailto:gentoo-commits@lists.gentoo.org> List-Help: <mailto:gentoo-commits+help@lists.gentoo.org> List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org> List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org> List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org> X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: 44c4ee8d-0a96-48ce-8362-61fdce2d61a9 X-Archives-Hash: ba9c92c508f67a09cd889480dcf80dcb commit: d868db5ada6f12bebdcbf4a9ec1d0814c1cbafd8 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Fri Dec 13 13:23:15 2024 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Fri Dec 13 13:23:15 2024 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=d868db5a 15.0.0: drop 72_all_PR111600-genrecog-Split-into-separate-partitions.patch Now upstream. Signed-off-by: Sam James <sam <AT> gentoo.org> ...0-genrecog-Split-into-separate-partitions.patch | 1392 -------------------- 15.0.0/gentoo/README.history | 1 + 2 files changed, 1 insertion(+), 1392 deletions(-) diff --git a/15.0.0/gentoo/72_all_PR111600-genrecog-Split-into-separate-partitions.patch b/15.0.0/gentoo/72_all_PR111600-genrecog-Split-into-separate-partitions.patch deleted file mode 100644 index ae2b837..0000000 --- a/15.0.0/gentoo/72_all_PR111600-genrecog-Split-into-separate-partitions.patch +++ /dev/null @@ -1,1392 +0,0 @@ -From eea603288d8d6cfd795c42c8f731d06f8af6828a Mon Sep 17 00:00:00 2001 -Message-ID: <eea603288d8d6cfd795c42c8f731d06f8af6828a.1734090687.git.sam@gentoo.org> -From: Robin Dapp <rdapp.gcc@gmail.com> -Date: Tue, 26 Nov 2024 14:44:17 +0100 -Subject: [PATCH] genrecog: Split into separate partitions [PR111600]. - -Hi, - -this patch makes genrecog split its output into separate files (10 by -default) in the same vein genemit does. The changes are mostly -mechanical again, changing printfs and puts to fprintf. -As insn-recog.cc relies on being able to call other recog functions a -header insn-recog.h is introduced that pre declares all of those. - -For simplicity the number of files is determined by (re-using) ---with-insnemit-partitions. Naming suggestions welcome :) - -Bootstrapped and regtested on x86 and power10, regtested on riscv. -aarch64 bootstrap is currently blocked because of the -"maybe uninitialized" issue discussed on IRC. - -Regards - Robin - -gcc/ChangeLog: - -* Makefile.in: Add insn-recog split. - * configure.ac: Document that the number of insnemit partitions is - used for insn-recog as well. - * genconditions.cc (write_one_condition): Use fprintf. - * genpreds.cc (write_predicate_expr): Ditto. - (write_init_reg_class_start_regs): Ditto. - * genrecog.cc (write_header): Add header file to includes. - (printf_indent): Use fprintf. - (change_state): Ditto. - (print_code): Ditto. - (print_host_wide_int): Ditto. - (print_parameter_value): Ditto. - (print_test_rtx): Ditto. - (print_nonbool_test): Ditto. - (print_label_value): Ditto. - (print_test): Ditto. - (print_decision): Ditto. - (print_state): Ditto. - (print_subroutine_call): Ditto. - (print_acceptance): Ditto. - (print_subroutine_start): Ditto. - (print_pattern): Ditto. - (print_subroutine): Ditto. - (print_subroutine_group): Ditto. - (handle_arg): Add -O and -H for output and header file handling. - (main): Use callback. - * gentarget-def.cc (def_target_insn): Use fprintf. - * read-md.cc (md_reader::print_c_condition): Ditto. - * read-md.h (class md_reader): Ditto. ---- - gcc/Makefile.in | 29 ++- - gcc/configure | 4 +- - gcc/configure.ac | 4 +- - gcc/genconditions.cc | 4 +- - gcc/genpreds.cc | 4 +- - gcc/genrecog.cc | 552 +++++++++++++++++++++++++------------------ - gcc/gentarget-def.cc | 2 +- - gcc/read-md.cc | 4 +- - gcc/read-md.h | 2 +- - 9 files changed, 360 insertions(+), 245 deletions(-) - -diff --git a/gcc/Makefile.in b/gcc/Makefile.in -index 27fbbd4bf19e..493ec6a5cb6e 100644 ---- a/gcc/Makefile.in -+++ b/gcc/Makefile.in -@@ -239,6 +239,12 @@ INSNEMIT_SEQ_SRC = $(patsubst %, insn-emit-%.cc, $(INSNEMIT_SPLITS_SEQ)) - INSNEMIT_SEQ_TMP = $(patsubst %, tmp-emit-%.cc, $(INSNEMIT_SPLITS_SEQ)) - INSNEMIT_SEQ_O = $(patsubst %, insn-emit-%.o, $(INSNEMIT_SPLITS_SEQ)) - -+# Re-use the split number for insn-recog as well. -+INSNRECOG_SPLITS_SEQ = $(wordlist 1,$(NUM_INSNEMIT_SPLITS),$(one_to_9999)) -+INSNRECOG_SEQ_SRC = $(patsubst %, insn-recog-%.cc, $(INSNRECOG_SPLITS_SEQ)) -+INSNRECOG_SEQ_TMP = $(patsubst %, tmp-recog-%.cc, $(INSNRECOG_SPLITS_SEQ)) -+INSNRECOG_SEQ_O = $(patsubst %, insn-recog-%.o, $(INSNRECOG_SPLITS_SEQ)) -+ - # These files are to have specific diagnostics suppressed, or are not to - # be subject to -Werror: - # flex output may yield harmless "no previous prototype" warnings -@@ -1385,7 +1391,7 @@ OBJS = \ - insn-output.o \ - insn-peep.o \ - insn-preds.o \ -- insn-recog.o \ -+ $(INSNRECOG_SEQ_O) \ - insn-enums.o \ - ggc-page.o \ - adjust-alignment.o \ -@@ -1909,8 +1915,8 @@ TREECHECKING = @TREECHECKING@ - FULL_DRIVER_NAME=$(target_noncanonical)-gcc-$(version)$(exeext) - - MOSTLYCLEANFILES = insn-flags.h insn-config.h insn-codes.h \ -- insn-output.cc insn-recog.cc $(INSNEMIT_SEQ_SRC) \ -- insn-extract.cc insn-peep.cc \ -+ insn-output.cc $(INSNRECOG_SEQ_SRC) insn-recog.h \ -+ $(INSNEMIT_SEQ_SRC) insn-extract.cc insn-peep.cc \ - insn-attr.h insn-attr-common.h insn-attrtab.cc insn-dfatab.cc \ - insn-latencytab.cc insn-opinit.cc insn-opinit.h insn-preds.cc insn-constants.h \ - tm-preds.h tm-constrs.h checksum-options $(GIMPLE_MATCH_PD_SEQ_SRC) \ -@@ -2677,7 +2683,8 @@ $(common_out_object_file): $(common_out_file) - # and compile them. - - .PRECIOUS: insn-config.h insn-flags.h insn-codes.h insn-constants.h \ -- $(INSNEMIT_SEQ_SRC) insn-recog.cc insn-extract.cc insn-output.cc \ -+ $(INSNEMIT_SEQ_SRC) insn-recog.h $(INSNRECOG_SEQ_SRC) \ -+ insn-extract.cc insn-output.cc \ - insn-peep.cc insn-attr.h insn-attr-common.h insn-attrtab.cc \ - insn-dfatab.cc insn-latencytab.cc insn-preds.cc \ - $(GIMPLE_MATCH_PD_SEQ_SRC) $(GENERIC_MATCH_PD_SEQ_SRC) \ -@@ -2706,7 +2713,7 @@ simple_rtl_generated_h = insn-attr.h insn-attr-common.h insn-codes.h \ - - simple_rtl_generated_c = insn-automata.cc \ - insn-extract.cc insn-output.cc \ -- insn-peep.cc insn-recog.cc -+ insn-peep.cc - - simple_generated_h = $(simple_rtl_generated_h) insn-constants.h - -@@ -2744,6 +2751,18 @@ s-tmp-emit: build/genemit$(build_exeext) $(MD_DEPS) insn-conditions.md - insn-emit-$(id).cc;) - $(STAMP) s-tmp-emit - -+# Same for genrecog. -+$(INSNRECOG_SEQ_SRC): s-tmp-recog; @true -+insn-recog.h: s-tmp-recog; @true -+s-tmp-recog: build/genrecog$(build_exeext) $(MD_DEPS) insn-conditions.md -+ $(RUN_GEN) build/genrecog$(build_exeext) $(md_file) insn-conditions.md \ -+ -Hinsn-recog.h \ -+ $(addprefix -O,${INSNRECOG_SEQ_TMP}) -+ $(foreach id, $(INSNRECOG_SPLITS_SEQ), \ -+ $(SHELL) $(srcdir)/../move-if-change tmp-recog-$(id).cc \ -+ insn-recog-$(id).cc;) -+ $(STAMP) s-tmp-recog -+ - # gencheck doesn't read the machine description, and the file produced - # doesn't use the insn-* convention. - -diff --git a/gcc/configure b/gcc/configure -index 0a55fa75573b..a8b531d8fae0 100755 ---- a/gcc/configure -+++ b/gcc/configure -@@ -1873,7 +1873,7 @@ Optional Packages: - generic when splitting match.pd. [default=10] - --with-insnemit-partitions=num - Set the number of partitions of insn-emit.cc for -- genemit to create. [default=10] -+ genemit and genrecog to create. [default=10] - --with-dwarf2 force the default debug format to be DWARF 2 (or - later) - --with-specs=SPECS add SPECS to driver command-line processing -@@ -7936,7 +7936,7 @@ fi - - - --# Specify the number of splits of insn-emit.cc to generate. -+# Specify the number of splits of insn-emit.cc and insn-recog.cc to generate. - - # Check whether --with-insnemit-partitions was given. - if test "${with_insnemit_partitions+set}" = set; then : -diff --git a/gcc/configure.ac b/gcc/configure.ac -index 1a6f01e25675..77fab885a428 100644 ---- a/gcc/configure.ac -+++ b/gcc/configure.ac -@@ -929,10 +929,10 @@ fi - - AC_SUBST(DEFAULT_MATCHPD_PARTITIONS) - --# Specify the number of splits of insn-emit.cc to generate. -+# Specify the number of splits of insn-emit.cc and insn-recog.cc to generate. - AC_ARG_WITH(insnemit-partitions, - [AS_HELP_STRING([--with-insnemit-partitions=num], --[Set the number of partitions of insn-emit.cc for genemit to create. [default=10]])], -+[Set the number of partitions of insn-emit.cc for genemit and genrecog to create. [default=10]])], - [DEFAULT_INSNEMIT_PARTITIONS="$with_insnemit_partitions"], [DEFAULT_INSNEMIT_PARTITIONS=10]) - if (test $DEFAULT_INSNEMIT_PARTITIONS -lt 1); then - AC_MSG_ERROR(m4_normalize([ -diff --git a/gcc/genconditions.cc b/gcc/genconditions.cc -index 13963dc3ff46..9da460893d52 100644 ---- a/gcc/genconditions.cc -+++ b/gcc/genconditions.cc -@@ -141,9 +141,9 @@ write_one_condition (void **slot, void * ARG_UNUSED (dummy)) - } - - fputs ("\",\n __builtin_constant_p ", stdout); -- rtx_reader_ptr->print_c_condition (test->expr); -+ rtx_reader_ptr->print_c_condition (stdout, test->expr); - fputs ("\n ? (int) ", stdout); -- rtx_reader_ptr->print_c_condition (test->expr); -+ rtx_reader_ptr->print_c_condition (stdout, test->expr); - fputs ("\n : -1 },\n", stdout); - return 1; - } -diff --git a/gcc/genpreds.cc b/gcc/genpreds.cc -index 55d149e8a404..b8f3bf279d97 100644 ---- a/gcc/genpreds.cc -+++ b/gcc/genpreds.cc -@@ -538,7 +538,7 @@ write_predicate_expr (rtx exp) - break; - - case MATCH_TEST: -- rtx_reader_ptr->print_c_condition (XSTR (exp, 0)); -+ rtx_reader_ptr->print_c_condition (stdout, XSTR (exp, 0)); - break; - - default: -@@ -1344,7 +1344,7 @@ write_init_reg_class_start_regs () - for (unsigned int i = 0; i < register_filters.length (); ++i) - { - printf (" if ("); -- rtx_reader_ptr->print_c_condition (register_filters[i]); -+ rtx_reader_ptr->print_c_condition (stdout, register_filters[i]); - printf (")\n" - " SET_HARD_REG_BIT (%s[%d], regno);\n", - "this_target_constraints->register_filters", i); -diff --git a/gcc/genrecog.cc b/gcc/genrecog.cc -index 719b1d44387e..1852ceba2513 100644 ---- a/gcc/genrecog.cc -+++ b/gcc/genrecog.cc -@@ -4255,9 +4255,9 @@ match_pattern (state *s, md_rtx_info *info, rtx pattern, - /* Begin the output file. */ - - static void --write_header (void) -+write_header (FILE *f, const char *header_filename) - { -- puts ("\ -+ fprintf (f, "%s", "\ - /* Generated automatically by the program `genrecog' from the target\n\ - machine description file. */\n\ - \n\ -@@ -4281,10 +4281,12 @@ write_header (void) - #include \"diagnostic-core.h\"\n\ - #include \"reload.h\"\n\ - #include \"regs.h\"\n\ --#include \"tm-constrs.h\"\n\ --\n"); -+#include \"tm-constrs.h\"\n"); - -- puts ("\n\ -+ fprintf (f, "#include \"%s\"\n", header_filename); -+ fprintf (f, "%s", "\n"); -+ -+ fprintf (f, "%s", "\n\ - /* `recog' contains a decision tree that recognizes whether the rtx\n\ - X0 is a valid instruction.\n\ - \n\ -@@ -4293,19 +4295,19 @@ write_header (void) - pattern that matched. This is the same as the order in the machine\n\ - description of the entry that matched. This number can be used as an\n\ - index into `insn_data' and other tables.\n"); -- puts ("\ -+ fprintf (f, "%s", "\ - The third parameter to recog is an optional pointer to an int. If\n\ - present, recog will accept a pattern if it matches except for missing\n\ - CLOBBER expressions at the end. In that case, the value pointed to by\n\ - the optional pointer will be set to the number of CLOBBERs that need\n\ - to be added (it should be initialized to zero by the caller). If it"); -- puts ("\ -+ fprintf (f, "%s", "\ - is set nonzero, the caller should allocate a PARALLEL of the\n\ - appropriate size, copy the initial entries, and call add_clobbers\n\ - (found in insn-emit.cc) to fill in the CLOBBERs.\n\ - "); - -- puts ("\n\ -+ fprintf (f, "%s", "\n\ - The function split_insns returns 0 if the rtl could not\n\ - be split or the split rtl as an INSN list if it can be.\n\ - \n\ -@@ -4463,13 +4465,13 @@ test_position_available_p (output_state *os, const rtx_test &test) - - /* Like printf, but print INDENT spaces at the beginning. */ - --static void ATTRIBUTE_PRINTF_2 --printf_indent (unsigned int indent, const char *format, ...) -+static void ATTRIBUTE_PRINTF_3 -+printf_indent (FILE *f, unsigned int indent, const char *format, ...) - { - va_list ap; - va_start (ap, format); -- printf ("%*s", indent, ""); -- vprintf (format, ap); -+ fprintf (f, "%*s", indent, ""); -+ vfprintf (f, format, ap); - va_end (ap); - } - -@@ -4478,7 +4480,7 @@ printf_indent (unsigned int indent, const char *format, ...) - OS with the new state. */ - - static void --change_state (output_state *os, position *pos, unsigned int indent) -+change_state (FILE *f, output_state *os, position *pos, unsigned int indent) - { - unsigned int var = os->id_to_var[pos->id]; - gcc_assert (var < os->var_to_id.length () && os->var_to_id[var] == pos->id); -@@ -4487,19 +4489,19 @@ change_state (output_state *os, position *pos, unsigned int indent) - switch (pos->type) - { - case POS_PEEP2_INSN: -- printf_indent (indent, "x%d = PATTERN (peep2_next_insn (%d));\n", -+ printf_indent (f, indent, "x%d = PATTERN (peep2_next_insn (%d));\n", - var, pos->arg); - break; - - case POS_XEXP: -- change_state (os, pos->base, indent); -- printf_indent (indent, "x%d = XEXP (x%d, %d);\n", -+ change_state (f, os, pos->base, indent); -+ printf_indent (f, indent, "x%d = XEXP (x%d, %d);\n", - var, os->id_to_var[pos->base->id], pos->arg); - break; - - case POS_XVECEXP0: -- change_state (os, pos->base, indent); -- printf_indent (indent, "x%d = XVECEXP (x%d, 0, %d);\n", -+ change_state (f, os, pos->base, indent); -+ printf_indent (f, indent, "x%d = XVECEXP (x%d, 0, %d);\n", - var, os->id_to_var[pos->base->id], pos->arg); - break; - } -@@ -4510,11 +4512,11 @@ change_state (output_state *os, position *pos, unsigned int indent) - the name. */ - - static void --print_code (enum rtx_code code) -+print_code (FILE *f, enum rtx_code code) - { - const char *p; - for (p = GET_RTX_NAME (code); *p; p++) -- putchar (TOUPPER (*p)); -+ fprintf (f, "%c", TOUPPER (*p)); - } - - /* Emit a uint64_t as an integer constant expression. We need to take -@@ -4522,22 +4524,22 @@ print_code (enum rtx_code code) - warnings in the resulting code. */ - - static void --print_host_wide_int (uint64_t val) -+print_host_wide_int (FILE *f, uint64_t val) - { - uint64_t min = uint64_t (1) << (HOST_BITS_PER_WIDE_INT - 1); - if (val == min) -- printf ("(" HOST_WIDE_INT_PRINT_DEC_C " - 1)", val + 1); -+ fprintf (f, "(" HOST_WIDE_INT_PRINT_DEC_C " - 1)", val + 1); - else -- printf (HOST_WIDE_INT_PRINT_DEC_C, val); -+ fprintf (f, HOST_WIDE_INT_PRINT_DEC_C, val); - } - - /* Print the C expression for actual parameter PARAM. */ - - static void --print_parameter_value (const parameter ¶m) -+print_parameter_value (FILE *f, const parameter ¶m) - { - if (param.is_param) -- printf ("i%d", (int) param.value + 1); -+ fprintf (f, "i%d", (int) param.value + 1); - else - switch (param.type) - { -@@ -4546,23 +4548,23 @@ print_parameter_value (const parameter ¶m) - break; - - case parameter::CODE: -- print_code ((enum rtx_code) param.value); -+ print_code (f, (enum rtx_code) param.value); - break; - - case parameter::MODE: -- printf ("E_%smode", GET_MODE_NAME ((machine_mode) param.value)); -+ fprintf (f, "E_%smode", GET_MODE_NAME ((machine_mode) param.value)); - break; - - case parameter::INT: -- printf ("%d", (int) param.value); -+ fprintf (f, "%d", (int) param.value); - break; - - case parameter::UINT: -- printf ("%u", (unsigned int) param.value); -+ fprintf (f, "%u", (unsigned int) param.value); - break; - - case parameter::WIDE_INT: -- print_host_wide_int (param.value); -+ print_host_wide_int (f, param.value); - break; - } - } -@@ -4570,90 +4572,90 @@ print_parameter_value (const parameter ¶m) - /* Print the C expression for the rtx tested by TEST. */ - - static void --print_test_rtx (output_state *os, const rtx_test &test) -+print_test_rtx (FILE *f, output_state *os, const rtx_test &test) - { - if (test.pos_operand >= 0) -- printf ("operands[%d]", test.pos_operand); -+ fprintf (f, "operands[%d]", test.pos_operand); - else -- printf ("x%d", os->id_to_var[test.pos->id]); -+ fprintf (f, "x%d", os->id_to_var[test.pos->id]); - } - - /* Print the C expression for non-boolean test TEST. */ - - static void --print_nonbool_test (output_state *os, const rtx_test &test) -+print_nonbool_test (FILE *f, output_state *os, const rtx_test &test) - { - switch (test.kind) - { - case rtx_test::CODE: -- printf ("GET_CODE ("); -- print_test_rtx (os, test); -- printf (")"); -+ fprintf (f, "GET_CODE ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ")"); - break; - - case rtx_test::MODE: -- printf ("GET_MODE ("); -- print_test_rtx (os, test); -- printf (")"); -+ fprintf (f, "GET_MODE ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ")"); - break; - - case rtx_test::VECLEN: -- printf ("XVECLEN ("); -- print_test_rtx (os, test); -- printf (", 0)"); -+ fprintf (f, "XVECLEN ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ", 0)"); - break; - - case rtx_test::INT_FIELD: -- printf ("XINT ("); -- print_test_rtx (os, test); -- printf (", %d)", test.u.opno); -+ fprintf (f, "XINT ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ", %d)", test.u.opno); - break; - - case rtx_test::REGNO_FIELD: -- printf ("REGNO ("); -- print_test_rtx (os, test); -- printf (")"); -+ fprintf (f, "REGNO ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ")"); - break; - - case rtx_test::SUBREG_FIELD: -- printf ("SUBREG_BYTE ("); -- print_test_rtx (os, test); -- printf (")"); -+ fprintf (f, "SUBREG_BYTE ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ")"); - break; - - case rtx_test::WIDE_INT_FIELD: -- printf ("XWINT ("); -- print_test_rtx (os, test); -- printf (", %d)", test.u.opno); -+ fprintf (f, "XWINT ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ", %d)", test.u.opno); - break; - - case rtx_test::PATTERN: - { - pattern_routine *routine = test.u.pattern->routine; -- printf ("pattern%d (", routine->pattern_id); -+ fprintf (f, "pattern%d (", routine->pattern_id); - const char *sep = ""; - if (test.pos) - { -- print_test_rtx (os, test); -+ print_test_rtx (f, os, test); - sep = ", "; - } - if (routine->insn_p) - { -- printf ("%sinsn", sep); -+ fprintf (f, "%sinsn", sep); - sep = ", "; - } - if (routine->pnum_clobbers_p) - { -- printf ("%spnum_clobbers", sep); -+ fprintf (f, "%spnum_clobbers", sep); - sep = ", "; - } - for (unsigned int i = 0; i < test.u.pattern->params.length (); ++i) - { -- fputs (sep, stdout); -- print_parameter_value (test.u.pattern->params[i]); -+ fprintf (f, "%s\n", sep); -+ print_parameter_value (f, test.u.pattern->params[i]); - sep = ", "; - } -- printf (")"); -+ fprintf (f, ")"); - break; - } - -@@ -4674,10 +4676,11 @@ print_nonbool_test (output_state *os, const rtx_test &test) - decision performs TEST. Print the C code for the label. */ - - static void --print_label_value (const rtx_test &test, bool is_param, uint64_t value) -+print_label_value (FILE *f, const rtx_test &test, bool is_param, -+ uint64_t value) - { -- print_parameter_value (parameter (transition_parameter_type (test.kind), -- is_param, value)); -+ print_parameter_value (f, parameter (transition_parameter_type (test.kind), -+ is_param, value)); - } - - /* If IS_PARAM, print code to compare TEST with the C variable i<VALUE+1>. -@@ -4685,7 +4688,7 @@ print_label_value (const rtx_test &test, bool is_param, uint64_t value) - Test for inequality if INVERT_P, otherwise test for equality. */ - - static void --print_test (output_state *os, const rtx_test &test, bool is_param, -+print_test (FILE *f, output_state *os, const rtx_test &test, bool is_param, - uint64_t value, bool invert_p) - { - switch (test.kind) -@@ -4698,71 +4701,71 @@ print_test (output_state *os, const rtx_test &test, bool is_param, - case rtx_test::INT_FIELD: - case rtx_test::WIDE_INT_FIELD: - case rtx_test::PATTERN: -- print_nonbool_test (os, test); -- printf (" %s ", invert_p ? "!=" : "=="); -- print_label_value (test, is_param, value); -+ print_nonbool_test (f, os, test); -+ fprintf (f, " %s ", invert_p ? "!=" : "=="); -+ print_label_value (f, test, is_param, value); - break; - - case rtx_test::SUBREG_FIELD: -- printf ("%s (", invert_p ? "maybe_ne" : "known_eq"); -- print_nonbool_test (os, test); -- printf (", "); -- print_label_value (test, is_param, value); -- printf (")"); -+ fprintf (f, "%s (", invert_p ? "maybe_ne" : "known_eq"); -+ print_nonbool_test (f, os, test); -+ fprintf (f, ", "); -+ print_label_value (f, test, is_param, value); -+ fprintf (f, ")"); - break; - - case rtx_test::SAVED_CONST_INT: - gcc_assert (!is_param && value == 1); -- print_test_rtx (os, test); -- printf (" %s const_int_rtx[MAX_SAVED_CONST_INT + ", -- invert_p ? "!=" : "=="); -- print_parameter_value (parameter (parameter::INT, -- test.u.integer.is_param, -- test.u.integer.value)); -- printf ("]"); -+ print_test_rtx (f, os, test); -+ fprintf (f, " %s const_int_rtx[MAX_SAVED_CONST_INT + ", -+ invert_p ? "!=" : "=="); -+ print_parameter_value (f, parameter (parameter::INT, -+ test.u.integer.is_param, -+ test.u.integer.value)); -+ fprintf (f, "]"); - break; - - case rtx_test::PEEP2_COUNT: - gcc_assert (!is_param && value == 1); -- printf ("peep2_current_count %s %d", invert_p ? "<" : ">=", -- test.u.min_len); -+ fprintf (f, "peep2_current_count %s %d", invert_p ? "<" : ">=", -+ test.u.min_len); - break; - - case rtx_test::VECLEN_GE: - gcc_assert (!is_param && value == 1); -- printf ("XVECLEN ("); -- print_test_rtx (os, test); -- printf (", 0) %s %d", invert_p ? "<" : ">=", test.u.min_len); -+ fprintf (f, "XVECLEN ("); -+ print_test_rtx (f, os, test); -+ fprintf (f, ", 0) %s %d", invert_p ? "<" : ">=", test.u.min_len); - break; - - case rtx_test::PREDICATE: - gcc_assert (!is_param && value == 1); -- printf ("%s%s (", invert_p ? "!" : "", test.u.predicate.data->name); -- print_test_rtx (os, test); -- printf (", "); -- print_parameter_value (parameter (parameter::MODE, -- test.u.predicate.mode_is_param, -- test.u.predicate.mode)); -- printf (")"); -+ fprintf (f, "%s%s (", invert_p ? "!" : "", test.u.predicate.data->name); -+ print_test_rtx (f, os, test); -+ fprintf (f, ", "); -+ print_parameter_value (f, parameter (parameter::MODE, -+ test.u.predicate.mode_is_param, -+ test.u.predicate.mode)); -+ fprintf (f, ")"); - break; - - case rtx_test::DUPLICATE: - gcc_assert (!is_param && value == 1); -- printf ("%srtx_equal_p (", invert_p ? "!" : ""); -- print_test_rtx (os, test); -- printf (", operands[%d])", test.u.opno); -+ fprintf (f, "%srtx_equal_p (", invert_p ? "!" : ""); -+ print_test_rtx (f, os, test); -+ fprintf (f, ", operands[%d])", test.u.opno); - break; - - case rtx_test::HAVE_NUM_CLOBBERS: - gcc_assert (!is_param && value == 1); -- printf ("pnum_clobbers %s NULL", invert_p ? "==" : "!="); -+ fprintf (f, "pnum_clobbers %s NULL", invert_p ? "==" : "!="); - break; - - case rtx_test::C_TEST: - gcc_assert (!is_param && value == 1); - if (invert_p) -- printf ("!"); -- rtx_reader_ptr->print_c_condition (test.u.string); -+ fprintf (f, "!"); -+ rtx_reader_ptr->print_c_condition (f, test.u.string); - break; - - case rtx_test::ACCEPT: -@@ -4771,7 +4774,7 @@ print_test (output_state *os, const rtx_test &test, bool is_param, - } - } - --static exit_state print_decision (output_state *, decision *, -+static exit_state print_decision (FILE *f, output_state *, decision *, - unsigned int, bool); - - /* Print code to perform S, indent each line by INDENT spaces. -@@ -4779,14 +4782,15 @@ static exit_state print_decision (output_state *, decision *, - if the state fails then the entire routine fails. */ - - static exit_state --print_state (output_state *os, state *s, unsigned int indent, bool is_final) -+print_state (FILE *f, output_state *os, state *s, unsigned int indent, -+ bool is_final) - { - exit_state es = ES_FALLTHROUGH; - for (decision *d = s->first; d; d = d->next) -- es = print_decision (os, d, indent, is_final && !d->next); -+ es = print_decision (f, os, d, indent, is_final && !d->next); - if (es != ES_RETURNED && is_final) - { -- printf_indent (indent, "return %s;\n", get_failure_return (os->type)); -+ printf_indent (f, indent, "return %s;\n", get_failure_return (os->type)); - es = ES_RETURNED; - } - return es; -@@ -4797,7 +4801,7 @@ print_state (output_state *os, state *s, unsigned int indent, bool is_final) - match. */ - - static const char * --print_subroutine_call (const acceptance_type &acceptance) -+print_subroutine_call (FILE *f, const acceptance_type &acceptance) - { - switch (acceptance.type) - { -@@ -4805,17 +4809,17 @@ print_subroutine_call (const acceptance_type &acceptance) - gcc_unreachable (); - - case RECOG: -- printf ("recog_%d (x1, insn, pnum_clobbers)", -- acceptance.u.subroutine_id); -+ fprintf (f, "recog_%d (x1, insn, pnum_clobbers)", -+ acceptance.u.subroutine_id); - return ">= 0"; - - case SPLIT: -- printf ("split_%d (x1, insn)", acceptance.u.subroutine_id); -+ fprintf (f, "split_%d (x1, insn)", acceptance.u.subroutine_id); - return "!= NULL_RTX"; - - case PEEPHOLE2: -- printf ("peephole2_%d (x1, insn, pmatch_len_)", -- acceptance.u.subroutine_id); -+ fprintf (f, "peephole2_%d (x1, insn, pmatch_len_)", -+ acceptance.u.subroutine_id); - return "!= NULL_RTX"; - } - gcc_unreachable (); -@@ -4825,63 +4829,65 @@ print_subroutine_call (const acceptance_type &acceptance) - INDENT and IS_FINAL are as for print_state. */ - - static exit_state --print_acceptance (const acceptance_type &acceptance, unsigned int indent, -- bool is_final) -+print_acceptance (FILE *f, const acceptance_type &acceptance, -+ unsigned int indent, bool is_final) - { - if (acceptance.partial_p) - { - /* Defer the rest of the match to a subroutine. */ - if (is_final) - { -- printf_indent (indent, "return "); -- print_subroutine_call (acceptance); -- printf (";\n"); -+ printf_indent (f, indent, "return "); -+ print_subroutine_call (f, acceptance); -+ fprintf (f, ";\n"); - return ES_RETURNED; - } - else - { -- printf_indent (indent, "res = "); -- const char *res_test = print_subroutine_call (acceptance); -- printf (";\n"); -- printf_indent (indent, "if (res %s)\n", res_test); -- printf_indent (indent + 2, "return res;\n"); -+ printf_indent (f, indent, "res = "); -+ const char *res_test = print_subroutine_call (f, acceptance); -+ fprintf (f, ";\n"); -+ printf_indent (f, indent, "if (res %s)\n", res_test); -+ printf_indent (f, indent + 2, "return res;\n"); - return ES_FALLTHROUGH; - } - } - switch (acceptance.type) - { - case SUBPATTERN: -- printf_indent (indent, "return %d;\n", acceptance.u.full.code); -+ printf_indent (f, indent, "return %d;\n", acceptance.u.full.code); - return ES_RETURNED; - - case RECOG: - if (acceptance.u.full.u.num_clobbers != 0) -- printf_indent (indent, "*pnum_clobbers = %d;\n", -+ printf_indent (f, indent, "*pnum_clobbers = %d;\n", - acceptance.u.full.u.num_clobbers); -- printf_indent (indent, "return %d; /* %s */\n", acceptance.u.full.code, -+ printf_indent (f, indent, "return %d; /* %s */\n", acceptance.u.full.code, - get_insn_name (acceptance.u.full.code)); - return ES_RETURNED; - - case SPLIT: -- printf_indent (indent, "return gen_split_%d (insn, operands);\n", -+ printf_indent (f, indent, "return gen_split_%d (insn, operands);\n", - acceptance.u.full.code); - return ES_RETURNED; - - case PEEPHOLE2: -- printf_indent (indent, "*pmatch_len_ = %d;\n", -+ printf_indent (f, indent, "*pmatch_len_ = %d;\n", - acceptance.u.full.u.match_len); - if (is_final) - { -- printf_indent (indent, "return gen_peephole2_%d (insn, operands);\n", -+ printf_indent (f, indent, -+ "return gen_peephole2_%d (insn, operands);\n", - acceptance.u.full.code); - return ES_RETURNED; - } - else - { -- printf_indent (indent, "res = gen_peephole2_%d (insn, operands);\n", -+ printf_indent (f, -+ indent, "res = gen_peephole2_%d (insn, operands);\n", - acceptance.u.full.code); -- printf_indent (indent, "if (res != NULL_RTX)\n"); -- printf_indent (indent + 2, "return res;\n"); -+ printf_indent (f, indent, "if (res != NULL_RTX)\n"); -+ printf_indent (f, indent + 2, "return res;\n"); - return ES_FALLTHROUGH; - } - } -@@ -4891,7 +4897,7 @@ print_acceptance (const acceptance_type &acceptance, unsigned int indent, - /* Print code to perform D. INDENT and IS_FINAL are as for print_state. */ - - static exit_state --print_decision (output_state *os, decision *d, unsigned int indent, -+print_decision (FILE *f, output_state *os, decision *d, unsigned int indent, - bool is_final) - { - uint64_t label; -@@ -4900,7 +4906,7 @@ print_decision (output_state *os, decision *d, unsigned int indent, - /* Make sure the rtx under test is available either in operands[] or - in an xN variable. */ - if (d->test.pos && d->test.pos_operand < 0) -- change_state (os, d->test.pos, indent); -+ change_state (f, os, d->test.pos, indent); - - /* Look for cases where a pattern routine P1 calls another pattern routine - P2 and where P1 returns X + BASE whenever P2 returns X. If IS_FINAL -@@ -4924,32 +4930,32 @@ print_decision (output_state *os, decision *d, unsigned int indent, - { - if (is_final && base == 0) - { -- printf_indent (indent, "return "); -- print_nonbool_test (os, d->test); -- printf ("; /* [-1, %d] */\n", count - 1); -+ printf_indent (f, indent, "return "); -+ print_nonbool_test (f, os, d->test); -+ fprintf (f, "; /* [-1, %d] */\n", count - 1); - return ES_RETURNED; - } - else - { -- printf_indent (indent, "res = "); -- print_nonbool_test (os, d->test); -- printf (";\n"); -- printf_indent (indent, "if (res >= 0)\n"); -- printf_indent (indent + 2, "return res"); -+ printf_indent (f, indent, "res = "); -+ print_nonbool_test (f, os, d->test); -+ fprintf (f, ";\n"); -+ printf_indent (f, indent, "if (res >= 0)\n"); -+ printf_indent (f, indent + 2, "return res"); - if (base != 0) -- printf (" + %d", base); -- printf ("; /* [%d, %d] */\n", base, base + count - 1); -+ fprintf (f, " + %d", base); -+ fprintf (f, "; /* [%d, %d] */\n", base, base + count - 1); - return ES_FALLTHROUGH; - } - } - else if (d->test.kind == rtx_test::ACCEPT) -- return print_acceptance (d->test.u.acceptance, indent, is_final); -+ return print_acceptance (f, d->test.u.acceptance, indent, is_final); - else if (d->test.kind == rtx_test::SET_OP) - { -- printf_indent (indent, "operands[%d] = ", d->test.u.opno); -- print_test_rtx (os, d->test); -- printf (";\n"); -- return print_state (os, d->singleton ()->to, indent, is_final); -+ printf_indent (f, indent, "operands[%d] = ", d->test.u.opno); -+ print_test_rtx (f, os, d->test); -+ fprintf (f, ";\n"); -+ return print_state (f, os, d->singleton ()->to, indent, is_final); - } - /* Handle decisions with a single transition and a single transition - label. */ -@@ -4957,13 +4963,13 @@ print_decision (output_state *os, decision *d, unsigned int indent, - { - transition *trans = d->singleton (); - if (mark_optional_transitions_p && trans->optional) -- printf_indent (indent, "/* OPTIONAL IF */\n"); -+ printf_indent (f, indent, "/* OPTIONAL IF */\n"); - - /* Print the condition associated with TRANS. Invert it if IS_FINAL, - so that we return immediately on failure and fall through on - success. */ -- printf_indent (indent, "if ("); -- print_test (os, d->test, trans->is_param, label, is_final); -+ printf_indent (f, indent, "if ("); -+ print_test (f, os, d->test, trans->is_param, label, is_final); - - /* Look for following states that would be handled by this code - on recursion. If they don't need any preparatory statements, -@@ -4979,13 +4985,13 @@ print_decision (output_state *os, decision *d, unsigned int indent, - || !test_position_available_p (os, d->test)) - break; - trans = d->first; -- printf ("\n"); -+ fprintf (f, "\n"); - if (mark_optional_transitions_p && trans->optional) -- printf_indent (indent + 4, "/* OPTIONAL IF */\n"); -- printf_indent (indent + 4, "%s ", is_final ? "||" : "&&"); -- print_test (os, d->test, trans->is_param, label, is_final); -+ printf_indent (f, indent + 4, "/* OPTIONAL IF */\n"); -+ printf_indent (f, indent + 4, "%s ", is_final ? "||" : "&&"); -+ print_test (f, os, d->test, trans->is_param, label, is_final); - } -- printf (")\n"); -+ fprintf (f, ")\n"); - - /* Print the conditional code with INDENT + 2 and the fallthrough - code with indent INDENT. */ -@@ -4994,9 +5000,9 @@ print_decision (output_state *os, decision *d, unsigned int indent, - { - /* We inverted the condition above, so return failure in the - "if" body and fall through to the target of the transition. */ -- printf_indent (indent + 2, "return %s;\n", -+ printf_indent (f, indent + 2, "return %s;\n", - get_failure_return (os->type)); -- return print_state (os, to, indent, is_final); -+ return print_state (f, os, to, indent, is_final); - } - else if (to->singleton () - && to->first->test.kind == rtx_test::ACCEPT -@@ -5004,7 +5010,7 @@ print_decision (output_state *os, decision *d, unsigned int indent, - { - /* The target of the transition is a simple "return" statement. - It doesn't need any braces and doesn't fall through. */ -- if (print_acceptance (to->first->test.u.acceptance, -+ if (print_acceptance (f, to->first->test.u.acceptance, - indent + 2, true) != ES_RETURNED) - gcc_unreachable (); - return ES_FALLTHROUGH; -@@ -5018,9 +5024,9 @@ print_decision (output_state *os, decision *d, unsigned int indent, - auto_vec <bool, 32> old_seen; - old_seen.safe_splice (os->seen_vars); - -- printf_indent (indent + 2, "{\n"); -- print_state (os, trans->to, indent + 4, is_final); -- printf_indent (indent + 2, "}\n"); -+ printf_indent (f, indent + 2, "{\n"); -+ print_state (f, os, trans->to, indent + 4, is_final); -+ printf_indent (f, indent + 2, "}\n"); - - os->seen_vars.truncate (0); - os->seen_vars.splice (old_seen); -@@ -5030,48 +5036,48 @@ print_decision (output_state *os, decision *d, unsigned int indent, - else - { - /* Output the decision as a switch statement. */ -- printf_indent (indent, "switch ("); -- print_nonbool_test (os, d->test); -- printf (")\n"); -+ printf_indent (f, indent, "switch ("); -+ print_nonbool_test (f, os, d->test); -+ fprintf (f, ")\n"); - - /* Each case statement starts with the same set of valid variables. - These are also the only variables will be valid on fallthrough. */ - auto_vec <bool, 32> old_seen; - old_seen.safe_splice (os->seen_vars); - -- printf_indent (indent + 2, "{\n"); -+ printf_indent (f, indent + 2, "{\n"); - for (transition *trans = d->first; trans; trans = trans->next) - { - gcc_assert (!trans->is_param); - if (mark_optional_transitions_p && trans->optional) -- printf_indent (indent + 2, "/* OPTIONAL CASE */\n"); -+ printf_indent (f, indent + 2, "/* OPTIONAL CASE */\n"); - for (int_set::iterator j = trans->labels.begin (); - j != trans->labels.end (); ++j) - { -- printf_indent (indent + 2, "case "); -- print_label_value (d->test, trans->is_param, *j); -- printf (":\n"); -+ printf_indent (f, indent + 2, "case "); -+ print_label_value (f, d->test, trans->is_param, *j); -+ fprintf (f, ":\n"); - } -- if (print_state (os, trans->to, indent + 4, is_final)) -+ if (print_state (f, os, trans->to, indent + 4, is_final)) - { - /* The state can fall through. Add an explicit break. */ - gcc_assert (!is_final); -- printf_indent (indent + 4, "break;\n"); -+ printf_indent (f, indent + 4, "break;\n"); - } -- printf ("\n"); -+ fprintf (f, "\n"); - - /* Restore the original set of valid variables. */ - os->seen_vars.truncate (0); - os->seen_vars.splice (old_seen); - } - /* Add a default case. */ -- printf_indent (indent + 2, "default:\n"); -+ printf_indent (f, indent + 2, "default:\n"); - if (is_final) -- printf_indent (indent + 4, "return %s;\n", -+ printf_indent (f, indent + 4, "return %s;\n", - get_failure_return (os->type)); - else -- printf_indent (indent + 4, "break;\n"); -- printf_indent (indent + 2, "}\n"); -+ printf_indent (f, indent + 4, "break;\n"); -+ printf_indent (f, indent + 2, "}\n"); - return is_final ? ES_RETURNED : ES_FALLTHROUGH; - } - } -@@ -5114,10 +5120,10 @@ assign_position_vars (output_state *os, state *s) - only ROOT's variable has a valid value. */ - - static void --print_subroutine_start (output_state *os, state *s, position *root) -+print_subroutine_start (FILE *f, output_state *os, state *s, position *root) - { -- printf ("{\n rtx * const operands ATTRIBUTE_UNUSED" -- " = &recog_data.operand[0];\n"); -+ fprintf (f, "{\n rtx * const operands ATTRIBUTE_UNUSED" -+ " = &recog_data.operand[0];\n"); - os->var_to_id.truncate (0); - os->seen_vars.truncate (0); - if (root) -@@ -5140,9 +5146,9 @@ print_subroutine_start (output_state *os, state *s, position *root) - { - for (unsigned int i = 2; i < num_vars; ++i) - /* Print 8 rtx variables to a line. */ -- printf ("%s x%d", -+ fprintf (f, "%s x%d", - i == 2 ? " rtx" : (i - 2) % 8 == 0 ? ";\n rtx" : ",", i); -- printf (";\n"); -+ fprintf (f, ";\n"); - } - - /* Say that x1 is valid and the rest aren't. */ -@@ -5150,22 +5156,26 @@ print_subroutine_start (output_state *os, state *s, position *root) - os->seen_vars[1] = true; - } - if (os->type == SUBPATTERN || os->type == RECOG) -- printf (" int res ATTRIBUTE_UNUSED;\n"); -+ fprintf (f, " int res ATTRIBUTE_UNUSED;\n"); - else -- printf (" rtx_insn *res ATTRIBUTE_UNUSED;\n"); -+ fprintf (f, " rtx_insn *res ATTRIBUTE_UNUSED;\n"); - } - - /* Output the definition of pattern routine ROUTINE. */ - - static void --print_pattern (output_state *os, pattern_routine *routine) -+print_pattern (FILE *f, output_state *os, pattern_routine *routine, -+ bool in_header = false) - { -- printf ("\nstatic int\npattern%d (", routine->pattern_id); -+ if (!in_header) -+ fprintf (f, "\nint\npattern%d (", routine->pattern_id); -+ else -+ fprintf (f, "\nextern int\npattern%d (", routine->pattern_id); - const char *sep = ""; - /* Add the top-level rtx parameter, if any. */ - if (routine->pos) - { -- printf ("%srtx x1", sep); -+ fprintf (f, "%srtx x1", sep); - sep = ", "; - } - /* Add the optional parameters. */ -@@ -5173,26 +5183,34 @@ print_pattern (output_state *os, pattern_routine *routine) - { - /* We can't easily tell whether a C condition actually reads INSN, - so add an ATTRIBUTE_UNUSED just in case. */ -- printf ("%srtx_insn *insn ATTRIBUTE_UNUSED", sep); -+ fprintf (f, "%srtx_insn *insn ATTRIBUTE_UNUSED", sep); - sep = ", "; - } - if (routine->pnum_clobbers_p) - { -- printf ("%sint *pnum_clobbers", sep); -+ fprintf (f, "%sint *pnum_clobbers", sep); - sep = ", "; - } - /* Add the "i" parameters. */ - for (unsigned int i = 0; i < routine->param_types.length (); ++i) - { -- printf ("%s%s i%d", sep, -- parameter_type_string (routine->param_types[i]), i + 1); -+ fprintf (f, "%s%s i%d", sep, -+ parameter_type_string (routine->param_types[i]), i + 1); - sep = ", "; - } -- printf (")\n"); -+ -+ if (!in_header) -+ fprintf (f, ")\n"); -+ else -+ { -+ fprintf (f, ");\n"); -+ return; -+ } -+ - os->type = SUBPATTERN; -- print_subroutine_start (os, routine->s, routine->pos); -- print_state (os, routine->s, 2, true); -- printf ("}\n"); -+ print_subroutine_start (f, os, routine->s, routine->pos); -+ print_state (f, os, routine->s, 2, true); -+ fprintf (f, "}\n"); - } - - /* Output a routine of type TYPE that implements S. PROC_ID is the -@@ -5200,9 +5218,26 @@ print_pattern (output_state *os, pattern_routine *routine) - routine. */ - - static void --print_subroutine (output_state *os, state *s, int proc_id) --{ -- printf ("\n"); -+print_subroutine (FILE *f, output_state *os, state *s, int proc_id, -+ bool in_header = false) -+{ -+ fprintf (f, "\n"); -+ const char *specifier_ext = "extern"; -+ const char *specifier_default = ""; -+ const char *specifier; -+ if (!in_header) -+ specifier = specifier_default; -+ else -+ specifier = specifier_ext; -+ -+ const char *end; -+ const char *end_default = ""; -+ const char *end_header = ";"; -+ if (!in_header) -+ end = end_default; -+ else -+ end = end_header; -+ - switch (os->type) - { - case SUBPATTERN: -@@ -5210,46 +5245,54 @@ print_subroutine (output_state *os, state *s, int proc_id) - - case RECOG: - if (proc_id) -- printf ("static int\nrecog_%d", proc_id); -+ fprintf (f, "%s int\nrecog_%d", specifier, proc_id); - else -- printf ("int\nrecog"); -- printf (" (rtx x1 ATTRIBUTE_UNUSED,\n" -- "\trtx_insn *insn ATTRIBUTE_UNUSED,\n" -- "\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n"); -+ fprintf (f, "%s int\nrecog", specifier); -+ fprintf (f, " (rtx x1 ATTRIBUTE_UNUSED,\n" -+ "\trtx_insn *insn ATTRIBUTE_UNUSED,\n" -+ "\tint *pnum_clobbers ATTRIBUTE_UNUSED)%s\n", end); - break; - - case SPLIT: - if (proc_id) -- printf ("static rtx_insn *\nsplit_%d", proc_id); -+ fprintf (f, "%s rtx_insn *\nsplit_%d", specifier, proc_id); - else -- printf ("rtx_insn *\nsplit_insns"); -- printf (" (rtx x1 ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED)\n"); -+ fprintf (f, "%s rtx_insn *\nsplit_insns", specifier); -+ fprintf (f, " (rtx x1 ATTRIBUTE_UNUSED, " -+ "rtx_insn *insn ATTRIBUTE_UNUSED)%s\n", end); - break; - - case PEEPHOLE2: - if (proc_id) -- printf ("static rtx_insn *\npeephole2_%d", proc_id); -+ fprintf (f, "%s rtx_insn *\npeephole2_%d", specifier, proc_id); - else -- printf ("rtx_insn *\npeephole2_insns"); -- printf (" (rtx x1 ATTRIBUTE_UNUSED,\n" -- "\trtx_insn *insn ATTRIBUTE_UNUSED,\n" -- "\tint *pmatch_len_ ATTRIBUTE_UNUSED)\n"); -+ fprintf (f, "%s rtx_insn *\npeephole2_insns", specifier); -+ fprintf (f, " (rtx x1 ATTRIBUTE_UNUSED,\n" -+ "\trtx_insn *insn ATTRIBUTE_UNUSED,\n" -+ "\tint *pmatch_len_ ATTRIBUTE_UNUSED)%s\n", end); - break; - } -- print_subroutine_start (os, s, &root_pos); -+ -+ if (in_header) -+ return; -+ -+ print_subroutine_start (f, os, s, &root_pos); - if (proc_id == 0) - { -- printf (" recog_data.insn = NULL;\n"); -+ fprintf (f, " recog_data.insn = NULL;\n"); - } -- print_state (os, s, 2, true); -- printf ("}\n"); -+ print_state (f, os, s, 2, true); -+ fprintf (f, "}\n"); - } - - /* Print out a routine of type TYPE that performs ROOT. */ - - static void --print_subroutine_group (output_state *os, routine_type type, state *root) -+print_subroutine_group (vec<FILE *> &vec, FILE *header, output_state *os, -+ routine_type type, state *root) - { -+ FILE *f; -+ unsigned idx; - os->type = type; - if (use_subroutines_p) - { -@@ -5261,11 +5304,20 @@ print_subroutine_group (output_state *os, routine_type type, state *root) - /* Output the subroutines (but not ROOT itself). */ - unsigned int i; - state *s; -+ -+ FILE *f = header; -+ FOR_EACH_VEC_ELT (subroutines, i, s) -+ print_subroutine (header, os, s, i + 1, true); -+ - FOR_EACH_VEC_ELT (subroutines, i, s) -- print_subroutine (os, s, i + 1); -+ { -+ f = choose_output (vec, idx); -+ print_subroutine (f, os, s, i + 1); -+ } - } - /* Output the main routine. */ -- print_subroutine (os, root, 0); -+ f = choose_output (vec, idx); -+ print_subroutine (f, os, root, 0); - } - - /* Return the rtx pattern for the list of rtxes in a define_peephole2. */ -@@ -5336,6 +5388,29 @@ remove_clobbers (acceptance_type *acceptance_ptr, rtx *pattern_ptr) - return true; - } - -+auto_vec<FILE *, 10> output_files; -+char header_name[255]; -+FILE *header = NULL; -+ -+static bool -+handle_arg (const char *arg) -+{ -+ printf ("%s\n", arg); -+ if (arg[1] == 'O') -+ { -+ FILE *file = fopen (&arg[2], "w"); -+ output_files.safe_push (file); -+ return true; -+ } -+ if (arg[1] == 'H') -+ { -+ snprintf (header_name, 255, "%s", &arg[2]); -+ header = fopen (header_name, "w"); -+ return true; -+ } -+ return false; -+} -+ - int - main (int argc, const char **argv) - { -@@ -5343,10 +5418,17 @@ main (int argc, const char **argv) - - progname = "genrecog"; - -- if (!init_rtx_reader_args (argc, argv)) -+ if (!init_rtx_reader_args_cb (argc, argv, handle_arg)) - return (FATAL_EXIT_CODE); - -- write_header (); -+ if (output_files.is_empty ()) -+ output_files.safe_push (stdout); -+ -+ for (auto f : output_files) -+ write_header (f, header_name); -+ -+ FILE *file = NULL; -+ unsigned file_idx; - - /* Read the machine description. */ - -@@ -5354,6 +5436,7 @@ main (int argc, const char **argv) - while (read_md_rtx (&info)) - { - rtx def = info.def; -+ file = choose_output (output_files, file_idx); - - acceptance_type acceptance; - acceptance.partial_p = false; -@@ -5387,8 +5470,8 @@ main (int argc, const char **argv) - - /* Declare the gen_split routine that we'll call if the - pattern matches. The definition comes from insn-emit.cc. */ -- printf ("extern rtx_insn *gen_split_%d (rtx_insn *, rtx *);\n", -- info.index); -+ fprintf (header, "extern rtx_insn *gen_split_%d " -+ "(rtx_insn *, rtx *);\n", info.index); - break; - - case DEFINE_PEEPHOLE2: -@@ -5399,8 +5482,8 @@ main (int argc, const char **argv) - - /* Declare the gen_peephole2 routine that we'll call if the - pattern matches. The definition comes from insn-emit.cc. */ -- printf ("extern rtx_insn *gen_peephole2_%d (rtx_insn *, rtx *);\n", -- info.index); -+ fprintf (header, "extern rtx_insn *gen_peephole2_%d " -+ "(rtx_insn *, rtx *);\n", info.index); - break; - - default: -@@ -5411,7 +5494,8 @@ main (int argc, const char **argv) - if (have_error) - return FATAL_EXIT_CODE; - -- puts ("\n\n"); -+ for (auto f : output_files) -+ fprintf (f, "%s", "\n\n"); - - /* Optimize each routine in turn. */ - optimize_subroutine_group ("recog", &insn_root); -@@ -5433,15 +5517,27 @@ main (int argc, const char **argv) - /* Print out the routines that we just created. */ - unsigned int i; - pattern_routine *routine; -+ - FOR_EACH_VEC_ELT (patterns, i, routine) -- print_pattern (&os, routine); -+ print_pattern (header, &os, routine, true); -+ -+ FOR_EACH_VEC_ELT (patterns, i, routine) -+ { -+ file = choose_output (output_files, file_idx); -+ print_pattern (file, &os, routine); -+ } - } - - /* Print out the matching routines. */ -- print_subroutine_group (&os, RECOG, &insn_root); -- print_subroutine_group (&os, SPLIT, &split_root); -- print_subroutine_group (&os, PEEPHOLE2, &peephole2_root); -+ print_subroutine_group (output_files, header, &os, RECOG, &insn_root); -+ print_subroutine_group (output_files, header, &os, SPLIT, &split_root); -+ print_subroutine_group (output_files, header, &os, PEEPHOLE2, &peephole2_root); -+ -+ fclose (header); - -- fflush (stdout); -- return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); -+ int ret = SUCCESS_EXIT_CODE; -+ for (FILE *f : output_files) -+ if (fclose (f) != 0) -+ ret = FATAL_EXIT_CODE; -+ return ret; - } -diff --git a/gcc/gentarget-def.cc b/gcc/gentarget-def.cc -index 061b1e7247c1..3a462560cc1b 100644 ---- a/gcc/gentarget-def.cc -+++ b/gcc/gentarget-def.cc -@@ -191,7 +191,7 @@ def_target_insn (const char *name, const char *prototype) - printf ("target_have_%s (void)\n", name); - printf ("{\n"); - printf (" return "); -- rtx_reader_ptr->print_c_condition (test); -+ rtx_reader_ptr->print_c_condition (stdout, test); - printf (";\n"); - printf ("}\n"); - } -diff --git a/gcc/read-md.cc b/gcc/read-md.cc -index 93d1ea437812..aeb1cced00d0 100644 ---- a/gcc/read-md.cc -+++ b/gcc/read-md.cc -@@ -192,9 +192,9 @@ md_reader::fprint_c_condition (FILE *outf, const char *cond) - /* Special fprint_c_condition for writing to STDOUT. */ - - void --md_reader::print_c_condition (const char *cond) -+md_reader::print_c_condition (FILE *outf, const char *cond) - { -- fprint_c_condition (stdout, cond); -+ fprint_c_condition (outf, cond); - } - - /* A vfprintf-like function for reporting an error against line LINENO -diff --git a/gcc/read-md.h b/gcc/read-md.h -index e613c42b7241..b42add391ed8 100644 ---- a/gcc/read-md.h -+++ b/gcc/read-md.h -@@ -205,7 +205,7 @@ class md_reader - - const char *join_c_conditions (const char *cond1, const char *cond2); - void fprint_c_condition (FILE *outf, const char *cond); -- void print_c_condition (const char *cond); -+ void print_c_condition (FILE *outf, const char *cond); - - /* Defined in read-rtl.cc. */ - const char *apply_iterator_to_string (const char *string); - -base-commit: 6a5a1b8175e07ff578204476cd11115d8a071cbc --- -2.47.1 - diff --git a/15.0.0/gentoo/README.history b/15.0.0/gentoo/README.history index 8b73c10..b66566b 100644 --- a/15.0.0/gentoo/README.history +++ b/15.0.0/gentoo/README.history @@ -1,5 +1,6 @@ 32 ???? + - 72_all_PR111600-genrecog-Split-into-separate-partitions.patch - 74_all_PR117724-Fix-type-compatibility-for-types-with-flexible-array.patch - 75_all_PR117724-Fix-type-compatibility-for-types-with-flexible-array-2.patch