Eliminate boolean parameters of emit_func. The first ('open') just
prints 'extern' to generated header, which is unnecessary. Introduce a
separate function to use when finishing a declaration in place of the
second ('close').

Rename emit_func to 'fp_decl' (matching 'fprintf' in length) to unbreak
indentation in several places.

Reshuffle emitted line breaks in a few places to make generated
declarations less ugly.

gcc/ChangeLog:

        * genmatch.cc (header_file): Make static.
        (emit_func): Rename to...
        (fp_decl): ... this.  Adjust all uses.
        (fp_decl_done): New function.  Use it...
        (decision_tree::gen): ... here and...
        (write_predicate): ... here.
        (main): Adjust.
---
 gcc/genmatch.cc | 97 ++++++++++++++++++++++++++-----------------------
 1 file changed, 52 insertions(+), 45 deletions(-)

diff --git a/gcc/genmatch.cc b/gcc/genmatch.cc
index c593814871..d5e56e2d68 100644
--- a/gcc/genmatch.cc
+++ b/gcc/genmatch.cc
@@ -183,31 +183,37 @@ fprintf_indent (FILE *f, unsigned int indent, const char 
*format, ...)
   va_end (ap);
 }
 
-/* Like fprintf, but print to two files, one header one C implementation.  */
-FILE *header_file = NULL;
+/* Secondary stream for fp_decl.  */
+static FILE *header_file;
 
+/* Start or continue emitting a declaration in fprintf-like manner,
+   printing both to F and global header_file, if non-null.  */
 static void
 #if GCC_VERSION >= 4001
-__attribute__((format (printf, 4, 5)))
+__attribute__((format (printf, 2, 3)))
 #endif
-emit_func (FILE *f, bool open, bool close, const char *format, ...)
+fp_decl (FILE *f, const char *format, ...)
 {
-  va_list ap1, ap2;
-  if (header_file != NULL)
-    {
-      if (open)
-       fprintf (header_file, "extern ");
-      va_start (ap2, format);
-      vfprintf (header_file, format, ap2);
-      va_end (ap2);
-      if (close)
-       fprintf (header_file, ";\n");
-    }
+  va_list ap;
+  va_start (ap, format);
+  vfprintf (f, format, ap);
+  va_end (ap);
 
-  va_start (ap1, format);
-  vfprintf (f, format, ap1);
-  va_end (ap1);
-  fputc ('\n', f);
+  if (!header_file)
+    return;
+
+  va_start (ap, format);
+  vfprintf (header_file, format, ap);
+  va_end (ap);
+}
+
+/* Finish a declaration being emitted by fp_decl.  */
+static void
+fp_decl_done (FILE *f, const char *trailer)
+{
+  fprintf (f, "%s\n", trailer);
+  if (header_file)
+    fprintf (header_file, "%s;", trailer);
 }
 
 static void
@@ -3924,35 +3930,35 @@ decision_tree::gen (vec <FILE *> &files, bool gimple)
       s->fname = xasprintf ("%s_simplify_%u", gimple ? "gimple" : "generic",
                            fcnt++);
       if (gimple)
-       emit_func (f, true, false, "\nbool\n"
+       fp_decl (f, "\nbool\n"
                 "%s (gimple_match_op *res_op, gimple_seq *seq,\n"
                 "                 tree (*valueize)(tree) ATTRIBUTE_UNUSED,\n"
                 "                 const tree ARG_UNUSED (type), tree 
*ARG_UNUSED "
-                "(captures)\n",
+                "(captures)",
                 s->fname);
       else
        {
-         emit_func (f, true, false, "\ntree\n"
+         fp_decl (f, "\ntree\n"
                   "%s (location_t ARG_UNUSED (loc), const tree ARG_UNUSED 
(type),\n",
                   (*iter).second->fname);
          for (unsigned i = 0;
               i < as_a <expr *>(s->s->s->match)->ops.length (); ++i)
-           emit_func (f, false, false, " tree ARG_UNUSED (_p%d),", i);
-         emit_func (f, false, false, " tree *captures\n");
+           fp_decl (f, " tree ARG_UNUSED (_p%d),", i);
+         fp_decl (f, " tree *captures");
        }
       for (unsigned i = 0; i < s->s->s->for_subst_vec.length (); ++i)
        {
          if (! s->s->s->for_subst_vec[i].first->used)
            continue;
          if (is_a <operator_id *> (s->s->s->for_subst_vec[i].second))
-           emit_func (f, false, false, ", const enum tree_code ARG_UNUSED 
(%s)",
+           fp_decl (f, ",\n const enum tree_code ARG_UNUSED (%s)",
                     s->s->s->for_subst_vec[i].first->id);
          else if (is_a <fn_id *> (s->s->s->for_subst_vec[i].second))
-           emit_func (f, false, false, ", const combined_fn ARG_UNUSED (%s)",
+           fp_decl (f, ",\n const combined_fn ARG_UNUSED (%s)",
                     s->s->s->for_subst_vec[i].first->id);
        }
 
-      emit_func (f, false, true, ")");
+      fp_decl_done (f, ")");
       fprintf (f, "{\n");
       fprintf_indent (f, 2, "const bool debug_dump = "
                            "dump_file && (dump_flags & TDF_FOLDING);\n");
@@ -3988,22 +3994,22 @@ decision_tree::gen (vec <FILE *> &files, bool gimple)
          FILE *f = get_out_file (files);
 
          if (gimple)
-           emit_func (f, true, false,"\nbool\n"
+           fp_decl (f, "\nbool\n"
                     "gimple_simplify_%s (gimple_match_op *res_op,"
                     " gimple_seq *seq,\n"
                     "                 tree (*valueize)(tree) "
                     "ATTRIBUTE_UNUSED,\n"
                     "                 code_helper ARG_UNUSED (code), tree "
-                    "ARG_UNUSED (type)\n",
+                    "ARG_UNUSED (type)",
                     e->operation->id);
          else
-           emit_func (f, true, false, "\ntree\n"
+           fp_decl (f, "\ntree\n"
                     "generic_simplify_%s (location_t ARG_UNUSED (loc), enum "
                     "tree_code ARG_UNUSED (code), const tree ARG_UNUSED 
(type)",
                     e->operation->id);
          for (unsigned i = 0; i < n; ++i)
-           emit_func (f, false, false,", tree _p%d", i);
-         emit_func (f, false, true, ")");
+           fp_decl (f, ", tree _p%d", i);
+         fp_decl_done (f, ")");
          fprintf (f, "{\n");
          fprintf_indent (f, 2, "const bool debug_dump = "
                                "dump_file && (dump_flags & TDF_FOLDING);\n");
@@ -4025,17 +4031,17 @@ decision_tree::gen (vec <FILE *> &files, bool gimple)
          FILE *f = get_out_file (files);
 
          if (gimple)
-           emit_func (f, true, false, "\nbool\n"
+           fp_decl (f, "\nbool\n"
                        "gimple_simplify (gimple_match_op*, gimple_seq*,\n"
                        "                 tree (*)(tree), code_helper,\n"
                        "                 const tree");
          else
-           emit_func (f, true, false,"\ntree\n"
+           fp_decl (f, "\ntree\n"
                        "generic_simplify (location_t, enum tree_code,\n"
                        "                  const tree");
          for (unsigned i = 0; i < n; ++i)
-           emit_func (f, false, false, ", tree");
-         emit_func (f, false, true, ")");
+           fp_decl (f, ", tree");
+         fp_decl_done (f, ")");
          fprintf (f, "{\n");
          if (gimple)
            fprintf (f, "  return false;\n");
@@ -4052,17 +4058,17 @@ decision_tree::gen (vec <FILE *> &files, bool gimple)
       /* Then generate the main entry with the outermost switch and
          tail-calls to the split-out functions.  */
       if (gimple)
-       emit_func (f, true, false, "\nbool\n"
+       fp_decl (f, "\nbool\n"
                 "gimple_simplify (gimple_match_op *res_op, gimple_seq *seq,\n"
                 "                 tree (*valueize)(tree) ATTRIBUTE_UNUSED,\n"
                 "                 code_helper code, const tree type");
       else
-       emit_func (f, true, false, "\ntree\n"
+       fp_decl (f, "\ntree\n"
                 "generic_simplify (location_t loc, enum tree_code code, "
                 "const tree type ATTRIBUTE_UNUSED");
       for (unsigned i = 0; i < n; ++i)
-       emit_func (f, false, false, ", tree _p%d", i);
-      emit_func (f, false, true, ")");
+       fp_decl (f, ", tree _p%d", i);
+      fp_decl_done (f, ")");
       fprintf (f, "{\n");
 
       if (gimple)
@@ -4117,10 +4123,11 @@ decision_tree::gen (vec <FILE *> &files, bool gimple)
 void
 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
 {
-  emit_func (f, true, true, "\nbool\n%s%s (tree t%s%s)",
-               gimple ? "gimple_" : "tree_", p->id,
-               p->nargs > 0 ? ", tree *res_ops" : "",
-               gimple ? ", tree (*valueize)(tree) ATTRIBUTE_UNUSED" : "");
+  fp_decl (f, "\nbool\n%s%s (tree t%s%s)",
+          gimple ? "gimple_" : "tree_", p->id,
+          p->nargs > 0 ? ", tree *res_ops" : "",
+          gimple ? ", tree (*valueize)(tree) ATTRIBUTE_UNUSED" : "");
+  fp_decl_done (f, "");
   fprintf (f, "{\n");
   /* Conveniently make 'type' available.  */
   fprintf_indent (f, 2, "const tree type = TREE_TYPE (t);\n");
@@ -5484,7 +5491,7 @@ main (int argc, char **argv)
 
   if (header_file)
     {
-      fprintf (header_file, "#endif /* GCC_GIMPLE_MATCH_AUTO_H.  */\n");
+      fprintf (header_file, "\n#endif /* GCC_GIMPLE_MATCH_AUTO_H.  */\n");
       fclose (header_file);
     }
 
-- 
2.39.2

Reply via email to