On 05/06/14 14:25, Richard Biener wrote:
> 
> The following makes genmatch annotate gimple-match.c with (commented
> for now) line directives, similar to other generator programs.
> This should help associating generated code with parts in match.pd.
> 

I've often found these annotations more of a hindrance than a help
(mostly because when they return to pure boilerplate code there's no
line directive to switch back to the main C file and we end with the
debugger pointing at a random bit of the gen source that's irrelevant).

It would be nice if there were some way to turn this annotation off
(perhaps with a configury option)... or maybe to write the source file
lines as comments in the auto-generated code.

Perhaps there already is one, but if there is, I don't know about it... :-(

R.

> Bootstrapped on x86_64-unknown-linux-gnu, applied.
> 
> Richard.
> 
> 2014-06-05  Richard Biener  <rguent...@suse.de>
> 
>       * genmatch.c (output_line_directive): New function.
>       (struct simplify): Add locations for match, ifexpr and result.
>       (write_nary_simplifiers): Annotate the source with line
>       directives.
>       (parse_match_and_simplify): Record locations of match, ifexpr
>       and result part.
>       (main): Adjust.
> 
> Index: gcc/genmatch.c
> ===================================================================
> --- gcc/genmatch.c    (revision 211234)
> +++ gcc/genmatch.c    (working copy)
> @@ -31,6 +31,52 @@ along with GCC; see the file COPYING3.
>  #include "vec.h"
>  
>  
> +/* libccp helpers.  */
> +
> +static struct line_maps *line_table;
> +
> +static bool
> +#if GCC_VERSION >= 4001
> +__attribute__((format (printf, 6, 0)))
> +#endif
> +error_cb (cpp_reader *, int, int, source_location location,
> +       unsigned int, const char *msg, va_list *ap)
> +{
> +  const line_map *map;
> +  linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, 
> &map);
> +  expanded_location loc = linemap_expand_location (line_table, map, 
> location);
> +  fprintf (stderr, "%s:%d:%d error: ", loc.file, loc.line, loc.column);
> +  vfprintf (stderr, msg, *ap);
> +  fprintf (stderr, "\n");
> +  exit (1);
> +}
> +
> +static void
> +#if GCC_VERSION >= 4001
> +__attribute__((format (printf, 2, 3)))
> +#endif
> +fatal_at (const cpp_token *tk, const char *msg, ...)
> +{
> +  va_list ap;
> +  va_start (ap, msg);
> +  error_cb (NULL, CPP_DL_FATAL, 0, tk->src_loc, 0, msg, &ap);
> +  va_end (ap);
> +}
> +
> +static void
> +output_line_directive (FILE *f, source_location location)
> +{
> +  const line_map *map;
> +  linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, 
> &map);
> +  expanded_location loc = linemap_expand_location (line_table, map, 
> location);
> +  /* Other gen programs really output line directives here, at least for
> +     development it's right now more convenient to have line information
> +     from the generated file.  Still keep the directives as comment for now
> +     to easily back-point to the meta-description.  */
> +  fprintf (f, "/* #line %d \"%s\" */\n", loc.line, loc.file);
> +}
> +
> +
>  /* Grammar
>  
>       capture = '@' number
> @@ -247,13 +293,19 @@ e_operation::e_operation (const char *id
>  
>  struct simplify {
>    simplify (const char *name_,
> -         struct operand *match_, struct operand *ifexpr_,
> -         struct operand *result_)
> -      : name (name_), match (match_), ifexpr (ifexpr_), result (result_) {}
> +         struct operand *match_, source_location match_location_,
> +         struct operand *ifexpr_, source_location ifexpr_location_,
> +         struct operand *result_, source_location result_location_)
> +      : name (name_), match (match_), match_location (match_location_),
> +      ifexpr (ifexpr_), ifexpr_location (ifexpr_location_),
> +      result (result_), result_location (result_location_) {}
>    const char *name;
>    struct operand *match;
> +  source_location match_location;
>    struct operand *ifexpr;
> +  source_location ifexpr_location;
>    struct operand *result;
> +  source_location result_location;
>  };
>  
>  
> @@ -529,6 +581,7 @@ write_nary_simplifiers (FILE *f, vec<sim
>       continue;
>        char fail_label[16];
>        snprintf (fail_label, 16, "fail%d", label_cnt++);
> +      output_line_directive (f, s->match_location);
>        fprintf (f, "  if (code == %s)\n", e->operation->op->id);
>        fprintf (f, "    {\n");
>        fprintf (f, "      tree captures[4] = {};\n");
> @@ -540,10 +593,12 @@ write_nary_simplifiers (FILE *f, vec<sim
>       }
>        if (s->ifexpr)
>       {
> +       output_line_directive (f, s->ifexpr_location);
>         fprintf (f, "  if (!(");
>         s->ifexpr->gen_gimple_transform (f, fail_label, NULL);
> -       fprintf (f, ")) goto %s;", fail_label);
> +       fprintf (f, ")) goto %s;\n", fail_label);
>       }
> +      output_line_directive (f, s->result_location);
>        if (s->result->type == operand::OP_EXPR)
>       {
>         e = static_cast <expr *> (s->result);
> @@ -659,39 +714,6 @@ write_gimple (FILE *f, vec<simplify *>&
>  }
>  
>  
> -/* libccp helpers.  */
> -
> -static struct line_maps *line_table;
> -
> -static bool
> -#if GCC_VERSION >= 4001
> -__attribute__((format (printf, 6, 0)))
> -#endif
> -error_cb (cpp_reader *, int, int, source_location location,
> -       unsigned int, const char *msg, va_list *ap)
> -{
> -  const line_map *map;
> -  linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, 
> &map);
> -  expanded_location loc = linemap_expand_location (line_table, map, 
> location);
> -  fprintf (stderr, "%s:%d:%d error: ", loc.file, loc.line, loc.column);
> -  vfprintf (stderr, msg, *ap);
> -  fprintf (stderr, "\n");
> -  exit (1);
> -}
> -
> -static void
> -#if GCC_VERSION >= 4001
> -__attribute__((format (printf, 2, 3)))
> -#endif
> -fatal_at (const cpp_token *tk, const char *msg, ...)
> -{
> -  va_list ap;
> -  va_start (ap, msg);
> -  error_cb (NULL, CPP_DL_FATAL, 0, tk->src_loc, 0, msg, &ap);
> -  va_end (ap);
> -}
> -
> -
>  /* Read the next non-whitespace token from R.  */
>  
>  static const cpp_token *
> @@ -914,7 +936,7 @@ parse_op (cpp_reader *r)
>          <op> <op>)  */
>  
>  static simplify *
> -parse_match_and_simplify (cpp_reader *r)
> +parse_match_and_simplify (cpp_reader *r, source_location match_location)
>  {
>    const cpp_token *token = peek (r);
>    const char *id;
> @@ -934,14 +956,18 @@ parse_match_and_simplify (cpp_reader *r)
>    token = peek (r);
>    /* Conditional if (....)  */
>    struct operand *ifexpr = NULL;
> +  source_location ifexpr_location = 0;
>    if (token->type == CPP_NAME)
>      {
>        const char *tem = get_ident (r);
>        if (strcmp (tem, "if") != 0)
>       fatal_at (token, "expected 'if' or expression");
> +      ifexpr_location = token->src_loc;
>        ifexpr = parse_c_expr (r, CPP_OPEN_PAREN);
>      }
> -  return new simplify (id, match, ifexpr, parse_op (r));
> +  token = peek (r);
> +  return new simplify (id, match, match_location,
> +                    ifexpr, ifexpr_location, parse_op (r), token->src_loc);
>  }
>  
>  
> @@ -1004,7 +1030,7 @@ main(int argc, char **argv)
>  
>        const char *id = get_ident (r);
>        if (strcmp (id, "match_and_simplify") == 0)
> -     simplifiers.safe_push (parse_match_and_simplify (r));
> +     simplifiers.safe_push (parse_match_and_simplify (r, token->src_loc));
>        else
>       fatal_at (token, "expected 'match_and_simplify'");
>  
> 


Reply via email to