This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix capture parsing in (match ...
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Prathamesh Kulkarni <prathamesh dot kulkarni at linaro dot org>
- Date: Tue, 16 Dec 2014 15:48:02 +0100 (CET)
- Subject: Fix capture parsing in (match ...
- Authentication-results: sourceware.org; auth=none
I am testing the following patch to properly setup capture_ids for
parsing (match ...
Bootstrap and regtest running on x86_64-unknown-linux-gnu.
Richard.
2014-12-16 Richard Biener <rguenther@suse.de>
* genmatch.c (parser::parser): Initialize capture_ids.
(parser::parse_pattern): Properly allocate capture_ids before
using them. Set capture_ids to zero when its lifetime is
supposed to finish.
(parser::parse_simplify): Allocate capture_ids only if
required.
Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c (revision 218747)
+++ gcc/genmatch.c (working copy)
@@ -3176,7 +3176,8 @@ parser::parse_simplify (source_location
expr *result)
{
/* Reset the capture map. */
- capture_ids = new cid_map_t;
+ if (!capture_ids)
+ capture_ids = new cid_map_t;
/* Reset oper_lists and set. */
hash_set <user_id *> olist;
oper_lists_set = &olist;
@@ -3494,7 +3495,10 @@ parser::parse_pattern ()
const cpp_token *token = peek ();
const char *id = get_ident ();
if (strcmp (id, "simplify") == 0)
- parse_simplify (token->src_loc, simplifiers, NULL, NULL);
+ {
+ parse_simplify (token->src_loc, simplifiers, NULL, NULL);
+ capture_ids = NULL;
+ }
else if (strcmp (id, "match") == 0)
{
bool with_args = false;
@@ -3519,6 +3523,7 @@ parser::parse_pattern ()
expr *e = NULL;
if (with_args)
{
+ capture_ids = new cid_map_t;
e = new expr (p);
while (peek ()->type == CPP_ATSIGN)
e->append_op (parse_capture (NULL));
@@ -3530,6 +3535,7 @@ parser::parse_pattern ()
fatal_at (token, "non-matching number of match operands");
p->nargs = e ? e->ops.length () : 0;
parse_simplify (token->src_loc, p->matchers, p, e);
+ capture_ids = NULL;
}
else if (strcmp (id, "for") == 0)
parse_for (token->src_loc);
@@ -3567,6 +3573,7 @@ parser::parser (cpp_reader *r_)
simplifiers = vNULL;
oper_lists_set = NULL;
oper_lists = vNULL;
+ capture_ids = NULL;
user_predicates = vNULL;
parsing_match_operand = false;