On Mon, Jul 31, 2023 at 1:07 PM Andrzej Turko via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Currently fprintf calls logging to a dump file take line numbers
> in the match.pd file directly as arguments.
> When match.pd is edited, referenced code changes line numbers,
> which causes changes to many fprintf calls and, thus, to many
> (usually all) .cc files generated by genmatch. This forces make
> to (unnecessarily) rebuild many .o files.
>
> With this change those logging fprintf calls reference an array
> of line numbers, which is defined in one of the produced files.
> Thanks to this, when match.pd changes, it is enough to rebuild
> that single file and, of course, those actually affected by the
> change.
>
> Signed-off-by: Andrzej Turko <andrzej.tu...@gmail.com>

How does this affect the size of the executable?  We are replacing
pushing a small immediate to the stack with an indexed load plus push.

Maybe further indirecting the whole dumping, passing an index of the
match and __FILE__/__LINE__ would help here, so instead of

                          if (UNLIKELY (debug_dump)) fprintf
(dump_file, "Matching expression %s:%d, %s:%d\n", "match.pd", 2522,
__FILE__, __LINE__);

we emit sth like

                          if (UNLIKELY (debug_dump)) dump_match (2522,
__FILE__, __LINE__);

with 2522 replaced by the ID?  That would also get rid of the inline
varargs invocation which might help code size as well (on some targets).

Richard.

> gcc/ChangeLog:
>
>         * genmatch.cc: Keep line numbers from match.pd in an array.
>
> Signed-off-by: Andrzej Turko <andrzej.tu...@gmail.com>
> ---
>  gcc/genmatch.cc | 73 +++++++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 65 insertions(+), 8 deletions(-)
>
> diff --git a/gcc/genmatch.cc b/gcc/genmatch.cc
> index 1deca505603..0a480a140c9 100644
> --- a/gcc/genmatch.cc
> +++ b/gcc/genmatch.cc
> @@ -217,9 +217,48 @@ fp_decl_done (FILE *f, const char *trailer)
>      fprintf (header_file, "%s;", trailer);
>  }
>
> +/* Line numbers for use by indirect line directives.  */
> +static vec<int> dbg_line_numbers;
> +
> +static void
> +write_header_declarations (bool gimple, FILE *f)
> +{
> +  if (gimple)
> +    fprintf (f, "\nextern int __gimple_dbg_line_numbers[];\n");
> +  else
> +    fprintf (f, "\nextern int __generic_dbg_line_numbers[];\n");
> +}
> +
> +static void
> +define_dbg_line_numbers (bool gimple, FILE *f)
> +{
> +  if (gimple)
> +    fprintf (f, "\nint __gimple_dbg_line_numbers[%d] = {",
> +           dbg_line_numbers.length ());
> +  else
> +    fprintf (f, "\nint __generic_dbg_line_numbers[%d] = {",
> +           dbg_line_numbers.length ());
> +
> +   if (dbg_line_numbers.is_empty ())
> +    {
> +      fprintf (f, "};\n\n");
> +      return;
> +    }
> +
> +  for (int i = 0; i < (int)dbg_line_numbers.length () - 1; i++)
> +    {
> +      if (i % 20 == 0)
> +       fprintf (f, "\n\t");
> +
> +      fprintf (f, "%d, ", dbg_line_numbers[i]);
> +    }
> +  fprintf (f, "%d\n};\n\n", dbg_line_numbers.last ());
> +}
> +
>  static void
>  output_line_directive (FILE *f, location_t location,
> -                      bool dumpfile = false, bool fnargs = false)
> +                     bool dumpfile = false, bool fnargs = false,
> +                     bool indirect_line_numbers = false, bool gimple = false)
>  {
>    const line_map_ordinary *map;
>    linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, 
> &map);
> @@ -239,7 +278,20 @@ output_line_directive (FILE *f, location_t location,
>         ++file;
>
>        if (fnargs)
> -       fprintf (f, "\"%s\", %d", file, loc.line);
> +  {
> +  if (indirect_line_numbers)
> +    {
> +      if (gimple)
> +  fprintf (f, "\"%s\", __gimple_dbg_line_numbers[%d]",
> +         file, dbg_line_numbers.length ());
> +      else
> +  fprintf (f, "\"%s\", __generic_dbg_line_numbers[%d]",
> +         file, dbg_line_numbers.length ());
> +      dbg_line_numbers.safe_push (loc.line);
> +    }
> +  else
> +    fprintf (f, "\"%s\", %d", file, loc.line);
> +  }
>        else
>         fprintf (f, "%s:%d", file, loc.line);
>      }
> @@ -3378,7 +3430,8 @@ dt_operand::gen (FILE *f, int indent, bool gimple, int 
> depth)
>  /* Emit a fprintf to the debug file to the file F, with the INDENT from
>     either the RESULT location or the S's match location if RESULT is null. */
>  static void
> -emit_debug_printf (FILE *f, int indent, class simplify *s, operand *result)
> +emit_debug_printf (FILE *f, int indent, class simplify *s, operand *result,
> +                                 bool gimple)
>  {
>    fprintf_indent (f, indent, "if (UNLIKELY (debug_dump)) "
>            "fprintf (dump_file, \"%s ",
> @@ -3387,7 +3440,7 @@ emit_debug_printf (FILE *f, int indent, class simplify 
> *s, operand *result)
>    fprintf (f, "%%s:%%d, %%s:%%d\\n\", ");
>    output_line_directive (f,
>                          result ? result->location : s->match->location, true,
> -                        true);
> +                        true, true, gimple);
>    fprintf (f, ", __FILE__, __LINE__);\n");
>  }
>
> @@ -3524,7 +3577,7 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, 
> operand *result)
>    if (!result)
>      {
>        /* If there is no result then this is a predicate implementation.  */
> -      emit_debug_printf (f, indent, s, result);
> +      emit_debug_printf (f, indent, s, result, gimple);
>        fprintf_indent (f, indent, "return true;\n");
>      }
>    else if (gimple)
> @@ -3615,7 +3668,7 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, 
> operand *result)
>         }
>        else
>         gcc_unreachable ();
> -      emit_debug_printf (f, indent, s, result);
> +      emit_debug_printf (f, indent, s, result, gimple);
>        fprintf_indent (f, indent, "return true;\n");
>      }
>    else /* GENERIC */
> @@ -3670,7 +3723,7 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, 
> operand *result)
>             }
>           if (is_predicate)
>             {
> -             emit_debug_printf (f, indent, s, result);
> +             emit_debug_printf (f, indent, s, result, gimple);
>               fprintf_indent (f, indent, "return true;\n");
>             }
>           else
> @@ -3738,7 +3791,7 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, 
> operand *result)
>                                   i);
>                 }
>             }
> -         emit_debug_printf (f, indent, s, result);
> +         emit_debug_printf (f, indent, s, result, gimple);
>           fprintf_indent (f, indent, "return _r;\n");
>         }
>      }
> @@ -5447,6 +5500,7 @@ main (int argc, char **argv)
>        parts.quick_push (stdout);
>        write_header (stdout, s_include_file);
>        write_header_includes (gimple, stdout);
> +      write_header_declarations (gimple, stdout);
>      }
>    else
>      {
> @@ -5460,6 +5514,7 @@ main (int argc, char **argv)
>        fprintf (header_file, "#ifndef GCC_GIMPLE_MATCH_AUTO_H\n"
>                             "#define GCC_GIMPLE_MATCH_AUTO_H\n");
>        write_header_includes (gimple, header_file);
> +      write_header_declarations (gimple, header_file);
>      }
>
>    /* Go over all predicates defined with patterns and perform
> @@ -5502,6 +5557,8 @@ main (int argc, char **argv)
>
>    dt.gen (parts, gimple);
>
> +  define_dbg_line_numbers (gimple, choose_output (parts));
> +
>    for (FILE *f : parts)
>      {
>        fprintf (f, "#pragma GCC diagnostic pop\n");
> --
> 2.34.1
>

Reply via email to