aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-04-26 23:53:07 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-04-26 23:53:07 -0700
commit94a503970399749ed551946b22b9226512480d81 (patch)
treebd925997654b688081b11a738196c7806d4cef5f /gcc
parent9c0a0632bca68c00acf45fc5ccc6811a652d1406 (diff)
downloadgcc-94a503970399749ed551946b22b9226512480d81.zip
gcc-94a503970399749ed551946b22b9226512480d81.tar.gz
gcc-94a503970399749ed551946b22b9226512480d81.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-common.h2
-rw-r--r--gcc/c-lex.c1
-rw-r--r--gcc/c-parse.in55
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parse.y56
6 files changed, 127 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e4b5474..0fd205f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
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
for fallthru search.
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 873fa4a..a8439d4 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -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 *));
diff --git a/gcc/c-lex.c b/gcc/c-lex.c
index 30ef877..acdcf34 100644
--- a/gcc/c-lex.c
+++ b/gcc/c-lex.c
@@ -159,6 +159,7 @@ c_common_parse_file (set_yydebug)
cpp_finish_options (parse_in);
yyparse ();
+ free_parser_stacks ();
}
struct c_fileinfo *
diff --git a/gcc/c-parse.in b/gcc/c-parse.in
index ff279a1..679d42d 100644
--- a/gcc/c-parse.in
+++ b/gcc/c-parse.in
@@ -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);
+ }
+}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4e9ef3c..237d669 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y
index 0f96361..2574d1d 100644
--- a/gcc/cp/parse.y
+++ b/gcc/cp/parse.y
@@ -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);
+ }
+}