c-parse.in (malloced_yyss, [...]): New.

* c-parse.in (malloced_yyss, malloced_yyvs): New.
        (yyoverflow): Re-add.  Set them.
        (free_parser_stacks): New.
        * c-common.h: Declare it.
        * c-lex.c (c_common_parse_file): Call it.

        * parse.y (malloced_yyss, malloced_yyvs): New.
        (yyoverflow): Re-add.  Set them.
        (free_parser_stacks): New.

From-SVN: r52827
This commit is contained in:
Richard Henderson 2002-04-26 23:53:07 -07:00 committed by Richard Henderson
parent 9c0a0632bc
commit 94a5039703
6 changed files with 127 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2002-04-26 Richard Henderson <rth@redhat.com>
* c-parse.in (malloced_yyss, malloced_yyvs): New.
(yyoverflow): Re-add. Set them.
(free_parser_stacks): New.
* c-common.h: Declare it.
* c-lex.c (c_common_parse_file): Call it.
2002-04-26 Richard Henderson <rth@redhat.com>
* cfgrtl.c (tidy_fallthru_edge): Don't use next_real_insn

View File

@ -328,6 +328,8 @@ extern tree gettags PARAMS ((void));
extern int (*lang_missing_noreturn_ok_p) PARAMS ((tree));
extern int yyparse PARAMS ((void));
extern void free_parser_stacks PARAMS ((void));
extern stmt_tree current_stmt_tree PARAMS ((void));
extern tree *current_scope_stmt_stack PARAMS ((void));
extern void begin_stmt_tree PARAMS ((tree *));

View File

@ -159,6 +159,7 @@ c_common_parse_file (set_yydebug)
cpp_finish_options (parse_in);
yyparse ();
free_parser_stacks ();
}
struct c_fileinfo *

View File

@ -61,6 +61,49 @@ end ifobjc
/* Like YYERROR but do call yyerror. */
#define YYERROR1 { yyerror ("syntax error"); YYERROR; }
/* Like the default stack expander, except (1) use realloc when possible,
(2) impose no hard maxiumum on stack size, (3) REALLY do not use alloca.
Irritatingly, YYSTYPE is defined after this %{ %} block, so we cannot
give malloced_yyvs its proper type. This is ok since all we need from
it is to be able to free it. */
static short *malloced_yyss;
static void *malloced_yyvs;
#define yyoverflow(MSG, SS, SSSIZE, VS, VSSIZE, YYSSZ) \
do { \
size_t newsize; \
short *newss; \
YYSTYPE *newvs; \
newsize = *(YYSSZ) *= 2; \
if (malloced_yyss) \
{ \
newss = (short *) \
really_call_realloc (*(SS), newsize * sizeof (short)); \
newvs = (YYSTYPE *) \
really_call_realloc (*(VS), newsize * sizeof (YYSTYPE)); \
} \
else \
{ \
newss = (short *) really_call_malloc (newsize * sizeof (short)); \
newvs = (YYSTYPE *) really_call_malloc (newsize * sizeof (YYSTYPE)); \
if (newss) \
memcpy (newss, *(SS), (SSSIZE)); \
if (newvs) \
memcpy (newvs, *(VS), (VSSIZE)); \
} \
if (!newss || !newvs) \
{ \
yyerror (MSG); \
return 2; \
} \
*(SS) = newss; \
*(VS) = newvs; \
malloced_yyss = newss; \
malloced_yyvs = (void *) newvs; \
} while (0)
%}
%start program
@ -3908,3 +3951,15 @@ make_pointer_declarator (type_quals_attrs, target)
itarget = tree_cons (attrs, target, NULL_TREE);
return build1 (INDIRECT_REF, quals, itarget);
}
/* Free malloced parser stacks if necessary. */
void
free_parser_stacks ()
{
if (malloced_yyss)
{
free (malloced_yyss);
free (malloced_yyvs);
}
}

View File

@ -1,3 +1,9 @@
2002-04-26 Richard Henderson <rth@redhat.com>
* parse.y (malloced_yyss, malloced_yyvs): New.
(yyoverflow): Re-add. Set them.
(free_parser_stacks): New.
2002-04-26 Mark Mitchell <mark@codesourcery.com>
PR c++/6497

View File

@ -48,6 +48,49 @@ extern struct obstack permanent_obstack;
/* Like YYERROR but do call yyerror. */
#define YYERROR1 { yyerror ("syntax error"); YYERROR; }
/* Like the default stack expander, except (1) use realloc when possible,
(2) impose no hard maxiumum on stack size, (3) REALLY do not use alloca.
Irritatingly, YYSTYPE is defined after this %{ %} block, so we cannot
give malloced_yyvs its proper type. This is ok since all we need from
it is to be able to free it. */
static short *malloced_yyss;
static void *malloced_yyvs;
#define yyoverflow(MSG, SS, SSSIZE, VS, VSSIZE, YYSSZ) \
do { \
size_t newsize; \
short *newss; \
YYSTYPE *newvs; \
newsize = *(YYSSZ) *= 2; \
if (malloced_yyss) \
{ \
newss = (short *) \
really_call_realloc (*(SS), newsize * sizeof (short)); \
newvs = (YYSTYPE *) \
really_call_realloc (*(VS), newsize * sizeof (YYSTYPE)); \
} \
else \
{ \
newss = (short *) really_call_malloc (newsize * sizeof (short)); \
newvs = (YYSTYPE *) really_call_malloc (newsize * sizeof (YYSTYPE)); \
if (newss) \
memcpy (newss, *(SS), (SSSIZE)); \
if (newvs) \
memcpy (newvs, *(VS), (VSSIZE)); \
} \
if (!newss || !newvs) \
{ \
yyerror (MSG); \
return 2; \
} \
*(SS) = newss; \
*(VS) = newvs; \
malloced_yyss = newss; \
malloced_yyvs = (void *) newvs; \
} while (0)
#define OP0(NODE) (TREE_OPERAND (NODE, 0))
#define OP1(NODE) (TREE_OPERAND (NODE, 1))
@ -3970,5 +4013,16 @@ debug_yytranslate (value)
{
return yytname[YYTRANSLATE (value)];
}
#endif
/* Free malloced parser stacks if necessary. */
void
free_parser_stacks ()
{
if (malloced_yyss)
{
free (malloced_yyss);
free (malloced_yyvs);
}
}