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); }