Of course I missed c-exprs... The following patch fixes that. Now bootstrapped (building stage3 target libs now).
Applied. Richard. 2014-09-25 Richard Biener <rguent...@suse.de> * genmatch.c (struct c_expr): Also record capture identifier to index map. (c_expr::gen_transform): Use it. Index: gcc/genmatch.c =================================================================== --- gcc/genmatch.c (revision 215598) +++ gcc/genmatch.c (working copy) @@ -408,12 +408,13 @@ struct c_expr : public operand }; c_expr (cpp_reader *r_, vec<cpp_token> code_, unsigned nr_stmts_, - vec<id_tab> ids_ = vNULL) - : operand (OP_C_EXPR), r (r_), code (code_), + vec<id_tab> ids_, std::map<std::string, unsigned> *capture_ids_) + : operand (OP_C_EXPR), 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; + std::map<std::string, unsigned> *capture_ids; /* The number of statements parsed (well, the number of ';'s). */ unsigned nr_stmts; /* The identifier replacement vector. */ @@ -487,11 +488,11 @@ struct simplify simplify (operand *match_, source_location match_location_, struct operand *result_, source_location result_location_, vec<if_or_with> ifexpr_vec_, vec<vec<user_id *> > for_vec_, - int capture_max_) + std::map<std::string, unsigned> *capture_ids_) : match (match_), match_location (match_location_), result (result_), result_location (result_location_), ifexpr_vec (ifexpr_vec_), for_vec (for_vec_), - capture_max (capture_max_) {} + capture_ids (capture_ids_), capture_max (capture_ids_->size ()) {} /* The expression that is matched against the GENERIC or GIMPLE IL. */ operand *match; @@ -507,7 +508,8 @@ struct simplify /* Collected 'for' expression operators that have to be replaced in the lowering phase. */ vec<vec<user_id *> > for_vec; - /* The maximum capture index seen. */ + /* A map of capture identifiers to indexes. */ + std::map<std::string, unsigned> *capture_ids; int capture_max; }; @@ -657,7 +659,7 @@ lower_commutative (simplify *s, vec<simp { simplify *ns = new simplify (matchers[i], s->match_location, s->result, s->result_location, s->ifexpr_vec, - s->for_vec, s->capture_max); + s->for_vec, s->capture_ids); simplifiers.safe_push (ns); } } @@ -787,7 +789,7 @@ lower_opt_convert (simplify *s, vec<simp { simplify *ns = new simplify (matchers[i], s->match_location, s->result, s->result_location, s->ifexpr_vec, - s->for_vec, s->capture_max); + s->for_vec, s->capture_ids); simplifiers.safe_push (ns); } } @@ -820,7 +822,7 @@ 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); + return new c_expr (ce->r, ce->code, ce->nr_stmts, ids, ce->capture_ids); } return o; @@ -872,7 +874,7 @@ lower_for (simplify *sin, vec<simplify * } simplify *ns = new simplify (match_op, s->match_location, result_op, s->result_location, - ifexpr_vec, vNULL, s->capture_max); + ifexpr_vec, vNULL, s->capture_ids); worklist.safe_push (ns); } } @@ -1399,12 +1401,18 @@ c_expr::gen_transform (FILE *f, const ch if (token->type == CPP_ATSIGN) { const cpp_token *n = &code[i+1]; - if (n->type == CPP_NUMBER + if ((n->type == CPP_NUMBER + || n->type == CPP_NAME) && !(n->flags & PREV_WHITE)) { if (token->flags & PREV_WHITE) fputc (' ', f); - fprintf (f, "captures[%s]", n->val.str.text); + const char *id; + if (n->type == CPP_NUMBER) + id = (const char *)n->val.str.text; + else + id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str; + fprintf (f, "captures[%u]", (*capture_ids)[id]); ++i; continue; } @@ -2284,7 +2292,6 @@ private: vec<if_or_with> active_ifs; vec<vec<user_id *> > active_fors; - int capture_max; std::map<std::string, unsigned> *capture_ids; public: @@ -2461,11 +2468,9 @@ parser::parse_capture (operand *op) id = get_ident (); else fatal_at (token, "expected number or identifier"); + unsigned next_id = capture_ids->size (); std::pair<std::map<std::string, unsigned>::iterator, bool> res - = capture_ids->insert - (std::pair<std::string, unsigned>(id, capture_max + 1)); - if (res.second) - capture_max++; + = capture_ids->insert (std::pair<std::string, unsigned>(id, next_id)); return new capture ((*res.first).second, op); } @@ -2571,7 +2576,7 @@ parser::parse_c_expr (cpp_ttype start) code.safe_push (*token); } while (1); - return new c_expr (r, code, nr_stmts); + return new c_expr (r, code, nr_stmts, vNULL, capture_ids); } /* Parse an operand which is either an expression, a predicate or @@ -2645,10 +2650,8 @@ void parser::parse_simplify (source_location match_location, vec<simplify *>& simplifiers, predicate_id *matcher) { - /* Reset the maximum capture number seen. */ - std::map<std::string, unsigned> cids; - capture_max = -1; - capture_ids = &cids; + /* Reset the capture map. */ + capture_ids = new std::map<std::string, unsigned>; const cpp_token *loc = peek (); struct operand *match = parse_op (); @@ -2673,7 +2676,7 @@ parser::parse_simplify (source_location simplifiers.safe_push (new simplify (match, match_location, NULL, token->src_loc, active_ifs.copy (), active_fors.copy (), - capture_max)); + capture_ids)); return; } @@ -2703,7 +2706,7 @@ parser::parse_simplify (source_location simplifiers.safe_push (new simplify (match, match_location, NULL, paren_loc, active_ifs.copy (), - active_fors.copy (), capture_max)); + active_fors.copy (), capture_ids)); } } else if (peek_ident ("with")) @@ -2732,7 +2735,7 @@ parser::parse_simplify (source_location simplifiers.safe_push (new simplify (match, match_location, op, token->src_loc, active_ifs.copy (), - active_fors.copy (), capture_max)); + active_fors.copy (), capture_ids)); eat_token (CPP_CLOSE_PAREN); /* A "default" result closes the enclosing scope. */ if (active_ifs.length () > active_ifs_len) @@ -2763,7 +2766,7 @@ parser::parse_simplify (source_location simplifiers.safe_push (new simplify (match, match_location, parse_op (), token->src_loc, active_ifs.copy (), - active_fors.copy (), capture_max)); + active_fors.copy (), capture_ids)); /* A "default" result closes the enclosing scope. */ if (active_ifs.length () > active_ifs_len) {