OSDN Git Service

partial merge for isgnature stuff
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jul 1994 20:22:37 +0000 (20:22 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jul 1994 20:22:37 +0000 (20:22 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@7680 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/sig.c

index d0f869c..af52a29 100644 (file)
@@ -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
index f6891e8..3eb25cf 100644 (file)
@@ -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));
index 80bb62a..31a2475 100644 (file)
@@ -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))
     {
index 4f27b94..1426168 100644 (file)
@@ -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,