On Thu, 5 Jun 2014, Richard Earnshaw wrote:

> 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.

Yeah, that's what I do right now (because for debugging the generated
code it's not really useful but a hindrance as you say).

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

Not that I know.

Richard.

> 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'");
> >  
> > 
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer

Reply via email to