aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGavin Romig-Koch <gavin@cygnus.com>1999-08-13 18:22:59 +0000
committerGavin Romig-Koch <gavin@gcc.gnu.org>1999-08-13 18:22:59 +0000
commit0a818f84ce73107a93940532da63c5f1738818e3 (patch)
tree42b99d02c99ecd90d6223b6db07d98fd410eaa4e /gcc
parente3beae8c3c6ede0f96c0f49f8c456bb22786225c (diff)
downloadgcc-0a818f84ce73107a93940532da63c5f1738818e3.zip
gcc-0a818f84ce73107a93940532da63c5f1738818e3.tar.gz
gcc-0a818f84ce73107a93940532da63c5f1738818e3.tar.bz2
For gcc:
tree.c (lang_unsave_expr_now) : New. (unsave_expr_now): Call lang_unsave_expr_now. tree.h (lang_unsave_expr_now) : New. For gcc/cp: cp-tree.h (init_cplus_unsave): New. (cplus_unsave_expr_now): New. lex.c (init_parse): Call init_cplus_unsave. tree.c (init_cplus_unsave): New. (cplus_unsave_expr_now): New. From-SVN: r28705
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/lex.c1
-rw-r--r--gcc/cp/tree.c38
-rw-r--r--gcc/tree.c12
-rw-r--r--gcc/tree.h4
7 files changed, 70 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5306750..eaed975 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Fri Aug 13 14:18:27 1999 Gavin Romig-Koch <gavin@cygnus.com>
+
+ tree.c (lang_unsave_expr_now) : New.
+ (unsave_expr_now): Call lang_unsave_expr_now.
+ tree.h (lang_unsave_expr_now) : New.
+
Fri Aug 13 00:49:46 1999 Jason Merrill <jason@yorick.cygnus.com>
* toplev.c (flag_new_exceptions): On by default.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d3cee0d..3653b79 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+1999-08-13 Gavin Romig-Koch <gavin@cygnus.com>
+
+ cp-tree.h (init_cplus_unsave): New.
+ (cplus_unsave_expr_now): New.
+ lex.c (init_parse): Call init_cplus_unsave.
+ tree.c (init_cplus_unsave): New.
+ (cplus_unsave_expr_now): New.
+
1999-08-11 Jason Merrill <jason@yorick.cygnus.com>
* lang-options.h: Add -fms-extensions.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index e752fdc..2e58406 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3350,6 +3350,8 @@ extern int yylex PROTO((void));
extern tree arbitrate_lookup PROTO((tree, tree, tree));
/* in tree.c */
+extern void init_cplus_unsave PROTO((void));
+extern tree cplus_unsave_expr_now PROTO((tree));
extern int pod_type_p PROTO((tree));
extern void unshare_base_binfos PROTO((tree));
extern int member_p PROTO((tree));
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 30eaa85..a92a4f3 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -524,6 +524,7 @@ init_parse (filename)
set_identifier_size (sizeof (struct lang_identifier));
decl_printable_name = lang_printable_name;
+ init_cplus_unsave ();
init_cplus_expand ();
bcopy (cplus_tree_code_type,
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 592b602..a6bbbe0 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2859,3 +2859,41 @@ make_ptrmem_cst (type, member)
return ptrmem_cst;
}
+/* Initialize unsave for C++. */
+void
+init_cplus_unsave ()
+{
+ lang_unsave_expr_now = cplus_unsave_expr_now;
+}
+
+/* The C++ version of unsave_expr_now.
+ See gcc/tree.c:unsave_expr_now for comments. */
+
+tree
+cplus_unsave_expr_now (expr)
+ tree expr;
+{
+ if (expr == NULL)
+ return expr;
+
+ else if (TREE_CODE (expr) == AGGR_INIT_EXPR)
+ {
+ unsave_expr_now (TREE_OPERAND (expr,0));
+ if (TREE_OPERAND (expr, 1)
+ && TREE_CODE (TREE_OPERAND (expr, 1)) == TREE_LIST)
+ {
+ tree exp = TREE_OPERAND (expr, 1);
+ while (exp)
+ {
+ unsave_expr_now (TREE_VALUE (exp));
+ exp = TREE_CHAIN (exp);
+ }
+ }
+ unsave_expr_now (TREE_OPERAND (expr,2));
+ return expr;
+ }
+
+ else
+ return expr;
+}
+
diff --git a/gcc/tree.c b/gcc/tree.c
index 9ab2fea..2516301 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -269,6 +269,10 @@ static void build_real_from_int_cst_1 PROTO((PTR));
extern char *mode_name[];
void gcc_obstack_init ();
+
+/* If non-null, a language specific helper for unsave_expr_now. */
+
+int (*lang_unsave_expr_now) PROTO((tree));
/* Init the principal obstacks. */
@@ -2426,7 +2430,11 @@ first_rtl_op (code)
}
/* Modify a tree in place so that all the evaluate only once things
- are cleared out. Return the EXPR given. */
+ are cleared out. Return the EXPR given.
+
+ LANG_UNSAVE_EXPR_NOW, if set, is a pointer to a function to handle
+ language specific nodes.
+*/
tree
unsave_expr_now (expr)
@@ -2473,6 +2481,8 @@ unsave_expr_now (expr)
break;
default:
+ if (lang_unsave_expr_now)
+ (*lang_unsave_expr_now) (expr);
break;
}
diff --git a/gcc/tree.h b/gcc/tree.h
index a56b202..08d4570 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1714,6 +1714,10 @@ extern tree unsave_expr PROTO((tree));
extern tree unsave_expr_now PROTO((tree));
+/* If non-null, a language specific helper for unsave_expr_now. */
+
+extern int (*lang_unsave_expr_now) PROTO((tree));
+
/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
or offset that depends on a field within a record.