aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMike Stump <mrs@gcc.gnu.org>1995-12-28 19:35:49 +0000
committerMike Stump <mrs@gcc.gnu.org>1995-12-28 19:35:49 +0000
commit21451173d21db7d6184bb788693a5e941cb2a08d (patch)
tree6c32b1ffe0f79ba06f97414bef472f4a78625af3 /gcc
parent9ad6177652206b70447c8b8d2289b71c67838c48 (diff)
downloadgcc-21451173d21db7d6184bb788693a5e941cb2a08d.zip
gcc-21451173d21db7d6184bb788693a5e941cb2a08d.tar.gz
gcc-21451173d21db7d6184bb788693a5e941cb2a08d.tar.bz2
77th Cygnus<->FSF merge
From-SVN: r10894
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog40
-rw-r--r--gcc/cp/decl.c9
-rw-r--r--gcc/cp/decl2.c69
-rw-r--r--gcc/cp/except.c68
-rw-r--r--gcc/cp/sig.c2
5 files changed, 140 insertions, 48 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bfa05f6..a1722c2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,39 @@
+Thu Dec 28 11:13:15 1995 Mike Stump <mrs@cygnus.com>
+
+ * except.c (expand_builtin_throw): Use RETURN_ADDR_OFFSET instead of
+ NORMAL_RETURN_ADDR_OFFSET.
+ (end_eh_unwinder): Ditto.
+
+Wed Dec 27 22:18:16 1995 Mike Stump <mrs@cygnus.com>
+
+ * gc.c (build_dynamic_cast): Make sure we don't cast away const
+ when dealing with references, and make sure we handle dynamic
+ casting to a cv qualified reference.
+
+Thu Dec 21 23:50:35 1995 Mike Stump <mrs@cygnus.com>
+
+ * except.c (struct eh_context): New structure top hold eh context
+ information.
+ (push_eh_context): New routine.
+ (pop_eh_context): Ditto.
+ * decl.c (push_cp_function_context): Use them.
+ (pop_cp_function_context): Ditto.
+
+Wed Dec 20 12:42:51 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * decl2.c (finish_file): Also prune uninteresting functions in the
+ inline emission loop.
+
+Wed Dec 20 02:32:07 1995 Jeffrey A Law (law@cygnus.com)
+
+ * sig.c (build_signature_table_constructor): Mark functions
+ in the signature as referenced.
+
+Tue Dec 19 22:36:56 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * decl2.c (finish_file): Do all the vtable/synthesis stuff before
+ the inline emission stuff.
+
Mon Dec 18 15:51:33 1995 Jason Merrill <jason@yorick.cygnus.com>
* cp-tree.h, decl2.c (flag_weak): New flag to control the use of
@@ -331,7 +367,7 @@ Wed Oct 11 16:30:34 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
* parse.y (fn.def1): Call split_specs_attrs in
declmods notype_declarator case.
-Mon Nov 20 14:06:28 1995 Mike Stump <mrs@cygnus.com>
+Sun Nov 26 14:47:42 1995 Richard Kenner <kenner@mole.gnu.ai.mit.edu>
* Version 2.7.2 released.
@@ -344,7 +380,7 @@ Thu Oct 26 13:59:54 1995 Mike Stump <mrs@cygnus.com>
* init.c (expand_aggr_init): Handle cv qualifiers on the object's
type.
-Sun Nov 12 18:09:35 1995 Mike Stump <mrs@cygnus.com>
+Sat Nov 11 08:25:55 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Version 2.7.1 released.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index f639140..869d853 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -127,6 +127,8 @@ static tree grokparms PROTO((tree, int));
static tree lookup_nested_type PROTO((tree, tree));
static char *redeclaration_error_message PROTO((tree, tree));
static void grok_op_properties PROTO((tree, int, int));
+extern void* push_eh_context PROTO(());
+extern void pop_eh_context PROTO((void *));
tree define_function
PROTO((char *, tree, enum built_in_function, void (*)(), char *));
@@ -12807,8 +12809,11 @@ struct cp_function
rtx result_rtx;
struct cp_function *next;
struct binding_level *binding_level;
+ void* eh_context;
};
+
+
struct cp_function *cp_function_chain;
extern int temp_name_counter;
@@ -12848,6 +12853,8 @@ push_cp_function_context (context)
p->member_init_list = current_member_init_list;
p->class_decl = current_class_decl;
p->C_C_D = C_C_D;
+
+ p->eh_context = push_eh_context ();
}
/* Restore the variables used during compilation of a C++ function. */
@@ -12901,6 +12908,8 @@ pop_cp_function_context (context)
current_class_decl = p->class_decl;
C_C_D = p->C_C_D;
+ pop_eh_context (p->eh_context);
+
free (p);
}
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 437247f..117687a 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -3126,53 +3126,46 @@ finish_file ()
while (reconsider)
{
- tree last = saved_inlines = tree_cons (NULL_TREE, NULL_TREE,
- saved_inlines);
- tree last_head = last;
- tree place = TREE_CHAIN (saved_inlines);
+ tree *p = &saved_inlines;
reconsider = 0;
walk_vtables ((void (*)())0, finish_vtable_vardecl);
- for (; place; place = TREE_CHAIN (place))
+ while (*p)
{
- tree decl = TREE_VALUE (place);
+ tree decl = TREE_VALUE (*p);
- /* Slice out the empty elements put in just above in the
- previous reconsidering. */
- if (decl == NULL_TREE)
+ if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
+ && TREE_USED (decl))
{
- TREE_CHAIN (last) = TREE_CHAIN (place);
- continue;
+ synthesize_method (decl);
+ reconsider = 1;
}
- if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl))
- {
- if (TREE_USED (decl))
- {
- synthesize_method (decl);
- if (TREE_ASM_WRITTEN (decl))
- reconsider = 1;
- }
- else
- {
- last = place;
- continue;
- }
- }
+ if (TREE_ASM_WRITTEN (decl)
+ || (DECL_SAVED_INSNS (decl) == 0 && ! DECL_ARTIFICIAL (decl)))
+ *p = TREE_CHAIN (*p);
+ else
+ p = &TREE_CHAIN (*p);
+ }
+ }
- if (TREE_ASM_WRITTEN (decl) || DECL_SAVED_INSNS (decl) == 0)
- {
- TREE_CHAIN (last) = TREE_CHAIN (place);
- continue;
- }
+ reconsider = 1; /* More may be referenced; check again */
+ while (reconsider)
+ {
+ tree *p = &saved_inlines;
+ reconsider = 0;
- if ((TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
- || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
- || flag_keep_inline_functions)
- {
- TREE_CHAIN (last) = TREE_CHAIN (place);
+ while (*p)
+ {
+ tree decl = TREE_VALUE (*p);
+ if (TREE_ASM_WRITTEN (decl) || DECL_SAVED_INSNS (decl) == 0)
+ *p = TREE_CHAIN (*p);
+ else if ((TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
+ || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
+ || flag_keep_inline_functions)
+ {
if (DECL_NOT_REALLY_EXTERN (decl))
{
DECL_EXTERNAL (decl) = 0;
@@ -3182,10 +3175,10 @@ finish_file ()
permanent_allocation (1);
}
- continue;
+ *p = TREE_CHAIN (*p);
}
-
- last = place;
+ else
+ p = &TREE_CHAIN (*p);
}
}
}
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 88587f0..38fcb35 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -31,6 +31,7 @@ Boston, MA 02111-1307, USA. */
#include "flags.h"
#include "obstack.h"
#include "expr.h"
+#include "output.h"
tree protect_list;
@@ -330,7 +331,6 @@ tree saved_cleanup;
int throw_used;
static rtx catch_clauses;
-static first_catch_label;
static struct ehStack ehstack;
static struct ehQueue ehqueue;
@@ -352,6 +352,58 @@ static tree top_label_entry PROTO((struct labelNode **labelstack));
static struct ehEntry *copy_eh_entry PROTO((struct ehEntry *entry));
+/* Routines to save and restore eh context information. */
+struct eh_context {
+ struct ehStack ehstack;
+ struct ehQueue ehqueue;
+ rtx catch_clauses;
+ struct labelNode *false_label_stack;
+ struct labelNode *caught_return_label_stack;
+ tree protect_list;
+};
+
+/* Save the context and push into a new one. */
+void*
+push_eh_context ()
+{
+ struct eh_context *p
+ = (struct eh_context*)xmalloc (sizeof (struct eh_context));
+
+ p->ehstack = ehstack;
+ p->ehqueue = ehqueue;
+ p->catch_clauses = catch_clauses;
+ p->false_label_stack = false_label_stack;
+ p->caught_return_label_stack = caught_return_label_stack;
+ p->protect_list = protect_list;
+
+ new_eh_stack (&ehstack);
+ new_eh_queue (&ehqueue);
+ catch_clauses = NULL_RTX;
+ false_label_stack = NULL;
+ caught_return_label_stack = NULL;
+ protect_list = NULL_TREE;
+
+ return p;
+}
+
+/* Pop and restore the context. */
+void
+pop_eh_context (vp)
+ void *vp;
+{
+ struct eh_context *p = (struct eh_context *)vp;
+
+ protect_list = p->protect_list;
+ caught_return_label_stack = p->caught_return_label_stack;
+ false_label_stack = p->false_label_stack;
+ catch_clauses = p->catch_clauses;
+ ehqueue = p->ehqueue;
+ ehstack = p->ehstack;
+
+ free (p);
+}
+
+
/* All my cheesy stack/queue/misc data structure handling routines
@@ -1323,8 +1375,8 @@ expand_builtin_throw ()
/* Set it up so that we continue inside, at the top of the loop. */
emit_move_insn (ret_val, gen_rtx (LABEL_REF, Pmode, top_of_loop));
-#ifdef NORMAL_RETURN_ADDR_OFFSET
- return_val_rtx = plus_constant (ret_val, -NORMAL_RETURN_ADDR_OFFSET);
+#ifdef RETURN_ADDR_OFFSET
+ return_val_rtx = plus_constant (ret_val, -RETURN_ADDR_OFFSET);
if (return_val_rtx != ret_val)
emit_move_insn (ret_val, return_val_rtx);
#endif
@@ -1434,7 +1486,7 @@ expand_end_eh_spec (raises)
void
expand_exception_blocks ()
{
- static rtx funcend;
+ rtx funcend;
rtx insns;
start_sequence ();
@@ -1771,8 +1823,8 @@ end_eh_unwinder (end)
ret_val = expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS,
0, hard_frame_pointer_rtx);
return_val_rtx = copy_to_reg (ret_val);
-#ifdef NORMAL_RETURN_ADDR_OFFSET
- return_val_rtx = plus_constant (return_val_rtx, NORMAL_RETURN_ADDR_OFFSET-1);
+#ifdef RETURN_ADDR_OFFSET
+ return_val_rtx = plus_constant (return_val_rtx, RETURN_ADDR_OFFSET-1);
#else
return_val_rtx = plus_constant (return_val_rtx, -1);
#endif
@@ -1785,8 +1837,8 @@ end_eh_unwinder (end)
emit_move_insn (ret_val, gen_rtx (LABEL_REF, Pmode, label));
#endif
-#ifdef NORMAL_RETURN_ADDR_OFFSET
- return_val_rtx = plus_constant (ret_val, -NORMAL_RETURN_ADDR_OFFSET);
+#ifdef RETURN_ADDR_OFFSET
+ return_val_rtx = plus_constant (ret_val, -RETURN_ADDR_OFFSET);
if (return_val_rtx != ret_val)
emit_move_insn (ret_val, return_val_rtx);
#endif
diff --git a/gcc/cp/sig.c b/gcc/cp/sig.c
index 135dc6d..0337ce3 100644
--- a/gcc/cp/sig.c
+++ b/gcc/cp/sig.c
@@ -571,6 +571,7 @@ build_signature_table_constructor (sig_ty, rhs)
delta = integer_zero_node;
index = integer_zero_node;
pfn = build_unary_op (ADDR_EXPR, rhs_method, 0);
+ TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (rhs_method)) = 1;
TREE_TYPE (pfn) = ptr_type_node;
TREE_ADDRESSABLE (rhs_method) = 1;
offset_p = 0; /* we can't offset the rhs sig table */
@@ -595,6 +596,7 @@ build_signature_table_constructor (sig_ty, rhs)
rhstype, 1));
index = integer_zero_node;
pfn = build_unary_op (ADDR_EXPR, rhs_method, 0);
+ TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (rhs_method)) = 1;
TREE_TYPE (pfn) = ptr_type_node;
TREE_ADDRESSABLE (rhs_method) = 1;
}