Hi,
There was a comment in parse_c_expr, mentioning to use obstack to
build c-code string. I have attached patch for the same.
OK to commit ?
* genmatch.c (parse_c_expr): Use obstack to build c code string.
Thanks and Regards,
Prathamesh
Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c (revision 209470)
+++ gcc/genmatch.c (working copy)
@@ -689,15 +689,18 @@ parse_c_expr (cpp_reader *r, cpp_ttype s
cpp_ttype end;
unsigned opencnt;
char *code;
+ struct obstack ob;
+
+ obstack_init (&ob);
eat_token (r, start);
if (start == CPP_OPEN_PAREN)
{
- code = xstrdup ("(");
+ obstack_grow (&ob, "(", 1);
end = CPP_CLOSE_PAREN;
}
else if (start == CPP_OPEN_BRACE)
{
- code = xstrdup ("({");
+ obstack_grow (&ob, "({", 2);
end = CPP_CLOSE_BRACE;
}
else
@@ -711,16 +714,16 @@ parse_c_expr (cpp_reader *r, cpp_ttype s
if (token->type == CPP_ATSIGN)
{
const cpp_token *n = peek (r);
+ const char *number;
if (n->type == CPP_NUMBER
&& !(n->flags & PREV_WHITE))
{
- code = (char *)xrealloc (code, strlen (code)
- + strlen ("captures[") + 4);
if (token->flags & PREV_WHITE)
- strcat (code, " ");
- strcat (code, "captures[");
- strcat (code, get_number (r));
- strcat (code, "]");
+ obstack_grow (&ob, " ", 1);
+ number = get_number (r);
+ obstack_grow (&ob, "captures[", strlen ("captures["));
+ obstack_grow (&ob, number, strlen (number));
+ obstack_grow (&ob, "]", 1);
continue;
}
}
@@ -734,24 +737,19 @@ parse_c_expr (cpp_reader *r, cpp_ttype s
/* Output the token as string. */
char *tk = (char *)cpp_token_as_text (r, token);
- code = (char *)xrealloc (code, strlen (code) + strlen (tk) + 2);
if (token->flags & PREV_WHITE)
- strcat (code, " ");
- strcat (code, tk);
+ obstack_grow (&ob, " ", 1);
+ obstack_grow (&ob, tk, strlen (tk));
}
while (1);
if (end == CPP_CLOSE_PAREN)
- {
- code = (char *)xrealloc (code, strlen (code) + 1 + 1);
- strcat (code, ")");
- }
+ obstack_grow0 (&ob, ")", 1);
else if (end == CPP_CLOSE_BRACE)
- {
- code = (char *)xrealloc (code, strlen (code) + 1 + 2);
- strcat (code, "})");
- }
+ obstack_grow0 (&ob, "})", 2);
else
gcc_unreachable ();
+
+ code = (char *) obstack_finish (&ob);
return new c_expr (code);
}