aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Baumgartner <gb@andros.cygnus.com>1994-07-08 20:22:37 +0000
committerMike Stump <mrs@gcc.gnu.org>1994-07-08 20:22:37 +0000
commit311862c8bed5ff4d37ae5e5e2fab91e7b69bab8b (patch)
tree34f34a4d153d8dadc44ca692e69cc9b2fbc716db
parenta98b1078b7baf999498fdd09dfe7eb3ac669f51d (diff)
downloadgcc-311862c8bed5ff4d37ae5e5e2fab91e7b69bab8b.zip
gcc-311862c8bed5ff4d37ae5e5e2fab91e7b69bab8b.tar.gz
gcc-311862c8bed5ff4d37ae5e5e2fab91e7b69bab8b.tar.bz2
partial merge for isgnature stuff
From-SVN: r7680
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/decl2.c45
-rw-r--r--gcc/cp/sig.c1
4 files changed, 58 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d0f869c..af52a29 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,15 @@
+Thu Jul 7 22:20:46 1994 Gerald Baumgartner (gb@andros.cygnus.com)
+
+ * cp-tree.h (walk_sigtables): Created extern declaration.
+ * decl2.c (walk_sigtables): Created function, patterned after
+ walk_vtables, even though we only need it to write out sigtables.
+ (finish_sigtable_vardecl): Created function.
+ (finish_vtable_vardecl): Changed 0 to NULL_PTR.
+ (finish_file): Call walk_sigtables.
+
+ * sig.c (build_signature_table_constructor): Mark class member
+ function pointed to from signature table entry as addressable.
+
Wed Jul 6 20:25:48 1994 Mike Stump (mrs@cygnus.com)
* except.c (init_exception_processing): Setup interim_eh_hook to
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index f6891e8..3eb25cf 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1984,6 +1984,7 @@ extern void finish_builtin_type PROTO((tree, char *, tree *, int, tree));
extern tree coerce_new_type PROTO((tree));
extern tree coerce_delete_type PROTO((tree));
extern void walk_vtables PROTO((void (*)(), void (*)()));
+extern void walk_sigtables PROTO((void (*)(), void (*)()));
extern void finish_file PROTO((void));
extern void warn_if_unknown_interface PROTO((void));
extern tree grok_x_components PROTO((tree, tree));
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 80bb62a..31a2475 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -2439,7 +2439,7 @@ finish_vtable_vardecl (prev, vars)
}
#endif /* DWARF_DEBUGGING_INFO */
- rest_of_decl_compilation (vars, 0, 1, 1);
+ rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
}
else if (TREE_USED (vars) && flag_vtable_thunks)
assemble_external (vars);
@@ -2474,6 +2474,48 @@ walk_vtables (typedecl_fn, vardecl_fn)
}
}
+static void
+finish_sigtable_vardecl (prev, vars)
+ tree prev, vars;
+{
+ /* We don't need to mark sigtable entries as addressable here as is done
+ for vtables. Since sigtables, unlike vtables, are always written out,
+ that was already done in build_signature_table_constructor. */
+
+ rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
+
+ /* We know that PREV must be non-zero here. */
+ TREE_CHAIN (prev) = TREE_CHAIN (vars);
+}
+
+void
+walk_sigtables (typedecl_fn, vardecl_fn)
+ register void (*typedecl_fn)();
+ register void (*vardecl_fn)();
+{
+ tree prev, vars;
+
+ for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars))
+ {
+ register tree type = TREE_TYPE (vars);
+
+ if (TREE_CODE (vars) == TYPE_DECL
+ && type != error_mark_node
+ && IS_SIGNATURE (type))
+ {
+ if (typedecl_fn) (*typedecl_fn) (prev, vars);
+ }
+ else if (TREE_CODE (vars) == VAR_DECL
+ && TREE_TYPE (vars) != error_mark_node
+ && IS_SIGNATURE (TREE_TYPE (vars)))
+ {
+ if (vardecl_fn) (*vardecl_fn) (prev, vars);
+ }
+ else
+ prev = vars;
+ }
+}
+
extern int parse_time, varconst_time;
#define TIMEVAR(VAR, BODY) \
@@ -2756,6 +2798,7 @@ finish_file ()
#endif
walk_vtables ((void (*)())0, finish_vtable_vardecl);
+ walk_sigtables ((void (*)())0, finish_sigtable_vardecl);
for (vars = getdecls (); vars; vars = TREE_CHAIN (vars))
{
diff --git a/gcc/cp/sig.c b/gcc/cp/sig.c
index 4f27b94..1426168 100644
--- a/gcc/cp/sig.c
+++ b/gcc/cp/sig.c
@@ -591,6 +591,7 @@ build_signature_table_constructor (sig_ty, rhs)
offset = integer_zero_node;
pfn = build_unary_op (ADDR_EXPR, rhs_method, 0);
TREE_TYPE (pfn) = ptr_type_node;
+ TREE_ADDRESSABLE (rhs_method) = 1;
}
tbl_entry = tree_cons (NULL_TREE, code,