* [PATCH] Add location to genmatch operator
@ 2015-07-22 12:35 Richard Biener
0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2015-07-22 12:35 UTC (permalink / raw)
To: gcc-patches
This simplifies code by adding a location to each operator. This also
fixes bogus locations in the current generated files.
Bootstrap running on x86_64-unknown-linux-gnu.
Richard.
2015-07-22 Richard Biener <rguenther@suse.de>
* genmatch.c (struct operand): Add location member.
(predicate, expr, c_expr, capture, if_expr, with_expr): Adjust
constructors.
(struct simplify): Remove match_location and result_location
members.
(elsehwere): Adjust.
Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c (revision 226060)
+++ gcc/genmatch.c (working copy)
@@ -483,8 +483,10 @@ struct capture_info;
struct operand {
enum op_type { OP_PREDICATE, OP_EXPR, OP_CAPTURE, OP_C_EXPR, OP_IF, OP_WITH };
- operand (enum op_type type_) : type (type_) {}
+ operand (enum op_type type_, source_location loc_)
+ : type (type_), location (loc_) {}
enum op_type type;
+ source_location location;
virtual void gen_transform (FILE *, int, const char *, bool, int,
const char *, capture_info *,
dt_operand ** = 0,
@@ -496,7 +498,8 @@ struct operand {
struct predicate : public operand
{
- predicate (predicate_id *p_) : operand (OP_PREDICATE), p (p_) {}
+ predicate (predicate_id *p_, source_location loc)
+ : operand (OP_PREDICATE, loc), p (p_) {}
predicate_id *p;
};
@@ -505,12 +508,12 @@ struct predicate : public operand
struct expr : public operand
{
- expr (id_base *operation_, bool is_commutative_ = false)
- : operand (OP_EXPR), operation (operation_),
+ expr (id_base *operation_, source_location loc, bool is_commutative_ = false)
+ : operand (OP_EXPR, loc), operation (operation_),
ops (vNULL), expr_type (NULL), is_commutative (is_commutative_),
is_generic (false), force_single_use (false) {}
expr (expr *e)
- : operand (OP_EXPR), operation (e->operation),
+ : operand (OP_EXPR, e->location), operation (e->operation),
ops (vNULL), expr_type (e->expr_type), is_commutative (e->is_commutative),
is_generic (e->is_generic), force_single_use (e->force_single_use) {}
void append_op (operand *op) { ops.safe_push (op); }
@@ -546,10 +549,11 @@ struct c_expr : public operand
id_tab (const char *id_, const char *oper_): id (id_), oper (oper_) {}
};
- c_expr (cpp_reader *r_, vec<cpp_token> code_, unsigned nr_stmts_,
+ c_expr (cpp_reader *r_, source_location loc,
+ vec<cpp_token> code_, unsigned nr_stmts_,
vec<id_tab> ids_, cid_map_t *capture_ids_)
- : operand (OP_C_EXPR), r (r_), code (code_), capture_ids (capture_ids_),
- nr_stmts (nr_stmts_), ids (ids_) {}
+ : operand (OP_C_EXPR, loc), r (r_), code (code_),
+ capture_ids (capture_ids_), nr_stmts (nr_stmts_), ids (ids_) {}
/* cpplib tokens and state to transform this back to source. */
cpp_reader *r;
vec<cpp_token> code;
@@ -567,8 +571,8 @@ struct c_expr : public operand
struct capture : public operand
{
- capture (unsigned where_, operand *what_)
- : operand (OP_CAPTURE), where (where_), what (what_) {}
+ capture (source_location loc, unsigned where_, operand *what_)
+ : operand (OP_CAPTURE, loc), where (where_), what (what_) {}
/* Identifier index for the value. */
unsigned where;
/* The captured value. */
@@ -582,8 +586,8 @@ struct capture : public operand
struct if_expr : public operand
{
- if_expr () : operand (OP_IF), cond (NULL), trueexpr (NULL),
- falseexpr (NULL) {}
+ if_expr (source_location loc)
+ : operand (OP_IF, loc), cond (NULL), trueexpr (NULL), falseexpr (NULL) {}
c_expr *cond;
operand *trueexpr;
operand *falseexpr;
@@ -593,7 +597,8 @@ struct if_expr : public operand
struct with_expr : public operand
{
- with_expr () : operand (OP_WITH), with (NULL), subexpr (NULL) {}
+ with_expr (source_location loc)
+ : operand (OP_WITH, loc), with (NULL), subexpr (NULL) {}
c_expr *with;
operand *subexpr;
};
@@ -655,25 +660,20 @@ struct simplify
{
enum simplify_kind { SIMPLIFY, MATCH };
- simplify (simplify_kind kind_,
- operand *match_, source_location match_location_,
- struct operand *result_, source_location result_location_,
+ simplify (simplify_kind kind_, operand *match_, operand *result_,
vec<vec<user_id *> > for_vec_, cid_map_t *capture_ids_)
- : kind (kind_), match (match_), match_location (match_location_),
- result (result_), result_location (result_location_),
+ : kind (kind_), match (match_), result (result_),
for_vec (for_vec_),
capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {}
simplify_kind kind;
/* The expression that is matched against the GENERIC or GIMPLE IL. */
operand *match;
- source_location match_location;
/* For a (simplify ...) an expression with ifs and withs with the expression
produced when the pattern applies in the leafs.
For a (match ...) the leafs are either empty if it is a simple predicate
or the single expression specifying the matched operands. */
struct operand *result;
- source_location result_location;
/* Collected 'for' expression operators that have to be replaced
in the lowering phase. */
vec<vec<user_id *> > for_vec;
@@ -772,7 +772,7 @@ commutate (operand *op)
vec<operand *> v = commutate (c->what);
for (unsigned i = 0; i < v.length (); ++i)
{
- capture *nc = new capture (c->where, v[i]);
+ capture *nc = new capture (c->location, c->where, v[i]);
ret.safe_push (nc);
}
return ret;
@@ -829,8 +829,7 @@ lower_commutative (simplify *s, vec<simp
vec<operand *> matchers = commutate (s->match);
for (unsigned i = 0; i < matchers.length (); ++i)
{
- simplify *ns = new simplify (s->kind, matchers[i], s->match_location,
- s->result, s->result_location,
+ simplify *ns = new simplify (s->kind, matchers[i], s->result,
s->for_vec, s->capture_ids);
simplifiers.safe_push (ns);
}
@@ -846,7 +845,7 @@ lower_opt_convert (operand *o, enum tree
if (capture *c = dyn_cast<capture *> (o))
{
if (c->what)
- return new capture (c->where,
+ return new capture (c->location, c->where,
lower_opt_convert (c->what, oper, to_oper, strip));
else
return c;
@@ -958,8 +957,7 @@ lower_opt_convert (simplify *s, vec<simp
vec<operand *> matchers = lower_opt_convert (s->match);
for (unsigned i = 0; i < matchers.length (); ++i)
{
- simplify *ns = new simplify (s->kind, matchers[i], s->match_location,
- s->result, s->result_location,
+ simplify *ns = new simplify (s->kind, matchers[i], s->result,
s->for_vec, s->capture_ids);
simplifiers.safe_push (ns);
}
@@ -981,7 +979,7 @@ lower_cond (operand *o)
lop = lower_cond (c->what);
for (unsigned i = 0; i < lop.length (); ++i)
- ro.safe_push (new capture (c->where, lop[i]));
+ ro.safe_push (new capture (c->location, c->where, lop[i]));
return ro;
}
}
@@ -1031,7 +1029,7 @@ lower_cond (operand *o)
for (unsigned j = 0; j < ocmp->ops.length (); ++j)
cmp->append_op (ocmp->ops[j]);
cmp->is_generic = true;
- ne->ops[0] = new capture (c->where, cmp);
+ ne->ops[0] = new capture (c->location, c->where, cmp);
}
else
{
@@ -1058,8 +1056,7 @@ lower_cond (simplify *s, vec<simplify *>
vec<operand *> matchers = lower_cond (s->match);
for (unsigned i = 0; i < matchers.length (); ++i)
{
- simplify *ns = new simplify (s->kind, matchers[i], s->match_location,
- s->result, s->result_location,
+ simplify *ns = new simplify (s->kind, matchers[i], s->result,
s->for_vec, s->capture_ids);
simplifiers.safe_push (ns);
}
@@ -1076,7 +1073,8 @@ replace_id (operand *o, user_id *id, id_
{
if (!c->what)
return c;
- return new capture (c->where, replace_id (c->what, id, with));
+ return new capture (c->location, c->where,
+ replace_id (c->what, id, with));
}
else if (expr *e = dyn_cast<expr *> (o))
{
@@ -1089,14 +1087,14 @@ replace_id (operand *o, user_id *id, id_
}
else if (with_expr *w = dyn_cast <with_expr *> (o))
{
- with_expr *nw = new with_expr ();
+ with_expr *nw = new with_expr (w->location);
nw->with = as_a <c_expr *> (replace_id (w->with, id, with));
nw->subexpr = replace_id (w->subexpr, id, with);
return nw;
}
else if (if_expr *ife = dyn_cast <if_expr *> (o))
{
- if_expr *nife = new if_expr ();
+ if_expr *nife = new if_expr (ife->location);
nife->cond = as_a <c_expr *> (replace_id (ife->cond, id, with));
nife->trueexpr = replace_id (ife->trueexpr, id, with);
if (ife->falseexpr)
@@ -1110,7 +1108,8 @@ replace_id (operand *o, user_id *id, id_
{
vec<c_expr::id_tab> ids = ce->ids.copy ();
ids.safe_push (c_expr::id_tab (id->id, with->id));
- return new c_expr (ce->r, ce->code, ce->nr_stmts, ids, ce->capture_ids);
+ return new c_expr (ce->r, ce->location,
+ ce->code, ce->nr_stmts, ids, ce->capture_ids);
}
return o;
@@ -1155,8 +1154,7 @@ lower_for (simplify *sin, vec<simplify *
if (result_op)
result_op = replace_id (result_op, id, oper);
}
- simplify *ns = new simplify (s->kind, match_op, s->match_location,
- result_op, s->result_location,
+ simplify *ns = new simplify (s->kind, match_op, result_op,
vNULL, s->capture_ids);
worklist.safe_push (ns);
}
@@ -2582,7 +2580,7 @@ dt_simplify::gen_1 (FILE *f, int indent,
{
fprintf_indent (f, indent, "{\n");
indent += 4;
- output_line_directive (f, w->with->code[0].src_loc);
+ output_line_directive (f, w->location);
w->with->gen_transform (f, indent, NULL, true, 1, "type", NULL);
gen_1 (f, indent, gimple, w->subexpr);
indent -= 4;
@@ -2591,7 +2589,7 @@ dt_simplify::gen_1 (FILE *f, int indent,
}
else if (if_expr *ife = dyn_cast <if_expr *> (result))
{
- output_line_directive (f, ife->cond->code[0].src_loc);
+ output_line_directive (f, ife->location);
fprintf_indent (f, indent, "if (");
ife->cond->gen_transform (f, indent, NULL, true, 1, "type", NULL);
fprintf (f, ")\n");
@@ -2672,7 +2670,8 @@ dt_simplify::gen_1 (FILE *f, int indent,
fprintf_indent (f, indent, "if (dump_file && (dump_flags & TDF_DETAILS)) "
"fprintf (dump_file, \"Applying pattern ");
- output_line_directive (f, s->result_location, true);
+ output_line_directive (f,
+ result ? result->location : s->match->location, true);
fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
if (!result)
@@ -2868,7 +2867,8 @@ dt_simplify::gen (FILE *f, int indent, b
{
fprintf_indent (f, indent, "{\n");
indent += 2;
- output_line_directive (f, s->result_location);
+ output_line_directive (f,
+ s->result ? s->result->location : s->match->location);
if (s->capture_max >= 0)
fprintf_indent (f, indent, "tree captures[%u] ATTRIBUTE_UNUSED = {};\n",
s->capture_max + 1);
@@ -3045,11 +3045,9 @@ private:
void parse_pattern ();
operand *parse_result (operand *, predicate_id *);
void push_simplify (simplify::simplify_kind,
- vec<simplify *>&, operand *, source_location,
- operand *, source_location);
+ vec<simplify *>&, operand *, operand *);
void parse_simplify (simplify::simplify_kind,
- source_location, vec<simplify *>&, predicate_id *,
- operand *);
+ vec<simplify *>&, predicate_id *, operand *);
void parse_for (source_location);
void parse_if (source_location);
void parse_predicates (source_location);
@@ -3269,7 +3267,7 @@ parser::parse_operation ()
struct operand *
parser::parse_capture (operand *op)
{
- eat_token (CPP_ATSIGN);
+ source_location src_loc = eat_token (CPP_ATSIGN)->src_loc;
const cpp_token *token = peek ();
const char *id = NULL;
if (token->type == CPP_NUMBER)
@@ -3283,7 +3281,7 @@ parser::parse_capture (operand *op)
unsigned &num = capture_ids->get_or_insert (id, &existed);
if (!existed)
num = next_id;
- return new capture (num, op);
+ return new capture (src_loc, num, op);
}
/* Parse an expression
@@ -3292,8 +3290,9 @@ parser::parse_capture (operand *op)
struct operand *
parser::parse_expr ()
{
- expr *e = new expr (parse_operation ());
const cpp_token *token = peek ();
+ expr *e = new expr (parse_operation (), token->src_loc);
+ token = peek ();
operand *op;
bool is_commutative = false;
bool force_capture = false;
@@ -3345,7 +3344,7 @@ parser::parse_expr ()
capture_ids->get_or_insert (xstrdup (id), &existed);
if (existed)
fatal_at (token, "reserved capture id '%s' already used", id);
- op = new capture (num, e);
+ op = new capture (token->src_loc, num, e);
}
else
op = e;
@@ -3386,7 +3385,7 @@ parser::parse_c_expr (cpp_ttype start)
unsigned opencnt;
vec<cpp_token> code = vNULL;
unsigned nr_stmts = 0;
- eat_token (start);
+ source_location loc = eat_token (start)->src_loc;
if (start == CPP_OPEN_PAREN)
end = CPP_CLOSE_PAREN;
else if (start == CPP_OPEN_BRACE)
@@ -3423,7 +3422,7 @@ parser::parse_c_expr (cpp_ttype start)
code.safe_push (*token);
}
while (1);
- return new c_expr (r, code, nr_stmts, vNULL, capture_ids);
+ return new c_expr (r, loc, code, nr_stmts, vNULL, capture_ids);
}
/* Parse an operand which is either an expression, a predicate or
@@ -3460,7 +3459,7 @@ parser::parse_op ()
fatal_at (token, "using an operator with operands as predicate");
/* Parse the zero-operand operator "predicates" as
expression. */
- op = new expr (opr);
+ op = new expr (opr, token->src_loc);
}
else if (user_id *code = dyn_cast <user_id *> (opr))
{
@@ -3468,10 +3467,10 @@ parser::parse_op ()
fatal_at (token, "using an operator with operands as predicate");
/* Parse the zero-operand operator "predicates" as
expression. */
- op = new expr (opr);
+ op = new expr (opr, token->src_loc);
}
else if (predicate_id *p = dyn_cast <predicate_id *> (opr))
- op = new predicate (p);
+ op = new predicate (p, token->src_loc);
else
fatal_at (token, "using an unsupported operator as predicate");
if (!parsing_match_operand)
@@ -3499,15 +3498,14 @@ parser::parse_op ()
void
parser::push_simplify (simplify::simplify_kind kind,
vec<simplify *>& simplifiers,
- operand *match, source_location match_loc,
- operand *result, source_location result_loc)
+ operand *match, operand *result)
{
/* Build and push a temporary for operator list uses in expressions. */
if (!oper_lists.is_empty ())
active_fors.safe_push (oper_lists);
simplifiers.safe_push
- (new simplify (kind, match, match_loc, result, result_loc,
+ (new simplify (kind, match, result,
active_fors.copy (), capture_ids));
if (!oper_lists.is_empty ())
@@ -3531,7 +3529,7 @@ parser::parse_result (operand *result, p
if (peek_ident ("if"))
{
eat_ident ("if");
- if_expr *ife = new if_expr ();
+ if_expr *ife = new if_expr (token->src_loc);
ife->cond = parse_c_expr (CPP_OPEN_PAREN);
if (peek ()->type == CPP_OPEN_PAREN)
{
@@ -3563,7 +3561,7 @@ parser::parse_result (operand *result, p
else if (peek_ident ("with"))
{
eat_ident ("with");
- with_expr *withe = new with_expr ();
+ with_expr *withe = new with_expr (token->src_loc);
/* Parse (with c-expr expr) as (if-with (true) expr). */
withe->with = parse_c_expr (CPP_OPEN_BRACE);
withe->with->nr_stmts = 0;
@@ -3574,9 +3572,9 @@ parser::parse_result (operand *result, p
else if (peek_ident ("switch"))
{
token = eat_ident ("switch");
- eat_token (CPP_OPEN_PAREN);
+ source_location ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
eat_ident ("if");
- if_expr *ife = new if_expr ();
+ if_expr *ife = new if_expr (ifloc);
operand *res = ife;
ife->cond = parse_c_expr (CPP_OPEN_PAREN);
if (peek ()->type == CPP_OPEN_PAREN)
@@ -3593,9 +3591,9 @@ parser::parse_result (operand *result, p
{
if (peek_ident ("if", 2))
{
- eat_token (CPP_OPEN_PAREN);
+ ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
eat_ident ("if");
- ife->falseexpr = new if_expr ();
+ ife->falseexpr = new if_expr (ifloc);
ife = as_a <if_expr *> (ife->falseexpr);
ife->cond = parse_c_expr (CPP_OPEN_PAREN);
if (peek ()->type == CPP_OPEN_PAREN)
@@ -3641,7 +3639,6 @@ parser::parse_result (operand *result, p
void
parser::parse_simplify (simplify::simplify_kind kind,
- source_location match_location,
vec<simplify *>& simplifiers, predicate_id *matcher,
operand *result)
{
@@ -3668,7 +3665,7 @@ parser::parse_simplify (simplify::simpli
if_expr *active_if = NULL;
for (int i = active_ifs.length (); i > 0; --i)
{
- if_expr *ifc = new if_expr ();
+ if_expr *ifc = new if_expr (active_ifs[i-1]->location);
ifc->cond = active_ifs[i-1];
ifc->trueexpr = active_if;
active_if = ifc;
@@ -3690,8 +3687,7 @@ parser::parse_simplify (simplify::simpli
active_if->trueexpr = result;
result = outermost_if;
}
- push_simplify (kind, simplifiers, match, match_location,
- result, token->src_loc);
+ push_simplify (kind, simplifiers, match, result);
return;
}
@@ -3704,8 +3700,7 @@ parser::parse_simplify (simplify::simpli
else
result = tem;
- push_simplify (kind, simplifiers, match, match_location,
- result, token->src_loc);
+ push_simplify (kind, simplifiers, match, result);
}
/* Parsing of the outer control structures. */
@@ -3930,13 +3925,13 @@ parser::parse_pattern ()
const char *id = get_ident ();
if (strcmp (id, "simplify") == 0)
{
- parse_simplify (simplify::SIMPLIFY,
- token->src_loc, simplifiers, NULL, NULL);
+ parse_simplify (simplify::SIMPLIFY, simplifiers, NULL, NULL);
capture_ids = NULL;
}
else if (strcmp (id, "match") == 0)
{
bool with_args = false;
+ source_location e_loc = peek ()->src_loc;
if (peek ()->type == CPP_OPEN_PAREN)
{
eat_token (CPP_OPEN_PAREN);
@@ -3959,7 +3954,7 @@ parser::parse_pattern ()
if (with_args)
{
capture_ids = new cid_map_t;
- e = new expr (p);
+ e = new expr (p, e_loc);
while (peek ()->type == CPP_ATSIGN)
e->append_op (parse_capture (NULL));
eat_token (CPP_CLOSE_PAREN);
@@ -3969,7 +3964,7 @@ parser::parse_pattern ()
|| (!e && p->nargs != 0)))
fatal_at (token, "non-matching number of match operands");
p->nargs = e ? e->ops.length () : 0;
- parse_simplify (simplify::MATCH, token->src_loc, p->matchers, p, e);
+ parse_simplify (simplify::MATCH, p->matchers, p, e);
capture_ids = NULL;
}
else if (strcmp (id, "for") == 0)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2015-07-22 12:16 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-22 12:35 [PATCH] Add location to genmatch operator Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).