This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFA: Bring ObjC init/finalization into line with C


I first posted this patch a few weeks back.  It makes ObjC and C share
almost all initialization and finalization code.  In the process it
adds 2 things to ObjC that were missing (and therefore bugs I assume):

1) Static constructors and destructors finalization.

2) Tree dumping of all the decls in the translation unit.

I'd like to get this in before we freeze.  It's bootstrapped x86 Linux
many times for me over the past month.  OK?

Neil.

	* Makefile.in: Update dependencies.
	* c-lang.c: Remove unnecessary includes.
	(deferred_fns, start_cdtor, finish_cdtor, defer_fn): Move to
	c-objc-common.c
	(finish_file): Move body to c_common_finish_file.
	* c-objc-common.c: Include varray.h and ggc.h.
	(deferred_fns, start_cdtor, finish_cdtor, defer_fn,
	expand_deferred_fns, c_objc_common_finish_file): Moved from c-lang.c.
	(c_objc_common_init): Initialize deferred function array.
	* c-tree.h (c_objc_common_finish_file,
	static_ctors, static_dtors): New.
objc:
	* Make-lang.in: Update dependencies.
	* objc/ojbc-act.c: Don't include varray.h.
	(defer_fn, deferred_fns): Move to c-objc-common.c.
	(objc_init): Similarly for initialization of it.
	(finish_file): Move some to c-objc-common.c, use
	c_objc_common_finish_file.

============================================================
Index: gcc/Makefile.in
--- gcc/Makefile.in	2001/12/06 18:13:14	1.802
+++ gcc/Makefile.in	2001/12/06 23:05:49
@@ -1147,15 +1147,15 @@ c-decl.o : c-decl.c $(CONFIG_H) $(SYSTEM
 c-typeck.o : c-typeck.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(C_TREE_H) \
     $(TARGET_H) flags.h intl.h output.h $(EXPR_H) $(RTL_H) toplev.h $(TM_P_H)
 c-lang.o : c-lang.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(C_TREE_H) \
-    $(GGC_H) toplev.h function.h $(VARRAY_H) \
-    $(RTL_H) $(EXPR_H) langhooks.h langhooks-def.h
+    langhooks.h langhooks-def.h
 c-lex.o : c-lex.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) c-lex.h \
     debug.h $(C_TREE_H) \
     c-pragma.h input.h intl.h flags.h toplev.h output.h \
     mbchar.h $(CPPLIB_H) $(EXPR_H) $(TM_P_H)
 c-objc-common.o : c-objc-common.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
     $(C_TREE_H) $(RTL_H) insn-config.h integrate.h $(EXPR_H) $(C_TREE_H) \
-    flags.h toplev.h tree-inline.h diagnostic.h integrate.h
+    flags.h toplev.h tree-inline.h diagnostic.h integrate.h $(VARRAY_H) \
+    $(GGC_H)
 c-aux-info.o : c-aux-info.c  $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(C_TREE_H) \
     flags.h toplev.h
 c-convert.o : c-convert.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) flags.h toplev.h
============================================================
Index: gcc/c-lang.c
--- gcc/c-lang.c	2001/12/04 22:55:37	1.72
+++ gcc/c-lang.c	2001/12/06 07:21:29
@@ -23,14 +23,7 @@ Software Foundation, 59 Temple Place - S
 #include "config.h"
 #include "system.h"
 #include "tree.h"
-#include "function.h"
-#include "toplev.h"
-#include "flags.h"
-#include "ggc.h"
-#include "rtl.h"
-#include "expr.h"
 #include "c-tree.h"
-#include "varray.h"
 #include "langhooks.h"
 #include "langhooks-def.h"
 
@@ -78,8 +71,6 @@ static void c_post_options PARAMS ((void
 /* Each front end provides its own.  */
 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
-static varray_type deferred_fns;
-
 /* Post-switch processing.  */
 static void
 c_post_options ()
@@ -97,12 +88,7 @@ static const char *
 c_init (filename)
      const char *filename;
 {
-  filename = c_objc_common_init (filename);
-
-  VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns");
-  ggc_add_tree_varray_root (&deferred_fns, 1);
-
-  return filename;
+  return c_objc_common_init (filename);
 }
 
 /* Used by c-lex.c, but only for objc.  */
@@ -157,119 +143,8 @@ lookup_objc_ivar (id)
   return 0;
 }
 
-extern tree static_ctors;
-extern tree static_dtors;
-
-static tree start_cdtor		PARAMS ((int));
-static void finish_cdtor	PARAMS ((tree));
-
-static tree
-start_cdtor (method_type)
-     int method_type;
-{
-  tree fnname = get_file_function_name (method_type);
-  tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
-  tree body;
-
-  start_function (void_list_node_1,
-		  build_nt (CALL_EXPR, fnname,
-			    tree_cons (NULL_TREE, NULL_TREE, void_list_node_1),
-			    NULL_TREE),
-		  NULL_TREE);
-  store_parm_decls ();
-
-  current_function_cannot_inline
-    = "static constructors and destructors cannot be inlined";
-
-  body = c_begin_compound_stmt ();
-
-  pushlevel (0);
-  clear_last_expr ();
-  add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
-
-  return body;
-}
-
-static void
-finish_cdtor (body)
-     tree body;
-{
-  tree scope;
-  tree block;
-
-  scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
-  block = poplevel (0, 0, 0);
-  SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
-  SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
-
-  RECHAIN_STMTS (body, COMPOUND_BODY (body));
-
-  finish_function (0);
-}
-
-/* Register a function tree, so that its optimization and conversion
-   to RTL is only done at the end of the compilation.  */
-
-int
-defer_fn (fn)
-     tree fn;
-{
-  VARRAY_PUSH_TREE (deferred_fns, fn);
-
-  return 1;
-}
-
-/* Called at end of parsing, but before end-of-file processing.  */
-
 void
 finish_file ()
 {
-  unsigned int i;
-
-  for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_fns); i++)
-    {
-      tree decl = VARRAY_TREE (deferred_fns, i);
-
-      if (! TREE_ASM_WRITTEN (decl))
-	{
-	  /* For static inline functions, delay the decision whether to
-	     emit them or not until wrapup_global_declarations.  */
-	  if (! TREE_PUBLIC (decl))
-	    DECL_DEFER_OUTPUT (decl) = 1;
-	  c_expand_deferred_function (decl);
-	}
-    }
-  VARRAY_FREE (deferred_fns);
-
-  if (static_ctors)
-    {
-      tree body = start_cdtor ('I');
-
-      for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
-	c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
-						 NULL_TREE));
-
-      finish_cdtor (body);
-    }
-  if (static_dtors)
-    {
-      tree body = start_cdtor ('D');
-
-      for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
-	c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
-						 NULL_TREE));
-
-      finish_cdtor (body);
-    }
-
-  {
-    int flags;
-    FILE *stream = dump_begin (TDI_all, &flags);
-
-    if (stream)
-      {
-	dump_node (getdecls (), flags & ~TDF_SLIM, stream);
-	dump_end (TDI_all, stream);
-      }
-  }
+  c_objc_common_finish_file ();
 }
============================================================
Index: gcc/c-objc-common.c
--- gcc/c-objc-common.c	2001/11/27 22:31:29	1.1
+++ gcc/c-objc-common.c	2001/12/06 07:21:32
@@ -31,10 +31,17 @@ Software Foundation, 59 Temple Place - S
 #include "toplev.h"
 #include "diagnostic.h"
 #include "tree-inline.h"
+#include "varray.h"
+#include "ggc.h"
 
 static int c_tree_printer PARAMS ((output_buffer *));
 static tree inline_forbidden_p PARAMS ((tree *, int *, void *));
+static void expand_deferred_fns PARAMS ((void));
+static tree start_cdtor	PARAMS ((int));
+static void finish_cdtor PARAMS ((tree));
 
+static varray_type deferred_fns;
+
 int
 c_missing_noreturn_ok_p (decl)
      tree decl;
@@ -227,7 +234,131 @@ c_objc_common_init (filename)
 	mesg_implicit_function_declaration = 0;
     }
 
+  VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns");
+  ggc_add_tree_varray_root (&deferred_fns, 1);
+
   return filename;
+}
+
+/* Register a function tree, so that its optimization and conversion
+   to RTL is only done at the end of the compilation.  */
+
+int
+defer_fn (fn)
+     tree fn;
+{
+  VARRAY_PUSH_TREE (deferred_fns, fn);
+
+  return 1;
+}
+
+/* Expand deferred functions for C and ObjC.  */
+
+static void
+expand_deferred_fns ()
+{
+  unsigned int i;
+
+  for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_fns); i++)
+    {
+      tree decl = VARRAY_TREE (deferred_fns, i);
+
+      if (! TREE_ASM_WRITTEN (decl))
+	{
+	  /* For static inline functions, delay the decision whether to
+	     emit them or not until wrapup_global_declarations.  */
+	  if (! TREE_PUBLIC (decl))
+	    DECL_DEFER_OUTPUT (decl) = 1;
+	  c_expand_deferred_function (decl);
+	}
+    }
+
+  VARRAY_FREE (deferred_fns);
+}
+
+static tree
+start_cdtor (method_type)
+     int method_type;
+{
+  tree fnname = get_file_function_name (method_type);
+  tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
+  tree body;
+
+  start_function (void_list_node_1,
+		  build_nt (CALL_EXPR, fnname,
+			    tree_cons (NULL_TREE, NULL_TREE, void_list_node_1),
+			    NULL_TREE),
+		  NULL_TREE);
+  store_parm_decls ();
+
+  current_function_cannot_inline
+    = "static constructors and destructors cannot be inlined";
+
+  body = c_begin_compound_stmt ();
+
+  pushlevel (0);
+  clear_last_expr ();
+  add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
+
+  return body;
+}
+
+static void
+finish_cdtor (body)
+     tree body;
+{
+  tree scope;
+  tree block;
+
+  scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
+  block = poplevel (0, 0, 0);
+  SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
+  SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
+
+  RECHAIN_STMTS (body, COMPOUND_BODY (body));
+
+  finish_function (0);
+}
+
+/* Called at end of parsing, but before end-of-file processing.  */
+
+void
+c_objc_common_finish_file ()
+{
+  expand_deferred_fns ();
+
+  if (static_ctors)
+    {
+      tree body = start_cdtor ('I');
+
+      for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
+	c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
+						 NULL_TREE));
+
+      finish_cdtor (body);
+    }
+
+  if (static_dtors)
+    {
+      tree body = start_cdtor ('D');
+
+      for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
+	c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
+						 NULL_TREE));
+
+      finish_cdtor (body);
+    }
+
+  {
+    int flags;
+    FILE *stream = dump_begin (TDI_all, &flags);
+
+    if (stream)
+      {
+	dump_node (getdecls (), flags & ~TDF_SLIM, stream);
+	dump_end (TDI_all, stream);
+      }
+  }
 }
 
 /* Called during diagnostic message formatting process to print a
============================================================
Index: gcc/c-tree.h
--- gcc/c-tree.h	2001/12/04 22:55:37	1.77
+++ gcc/c-tree.h	2001/12/06 07:21:34
@@ -153,8 +153,6 @@ extern tree maybe_building_objc_message_
 extern int recognize_objc_keyword		PARAMS ((void));
 extern tree lookup_objc_ivar			PARAMS ((tree));
 
-/* in c-lang.c and objc/objc-act.c */
-extern int defer_fn				PARAMS ((tree));
 
 /* in c-parse.in */
 extern void c_parse_init			PARAMS ((void));
@@ -175,6 +173,8 @@ extern int c_disregard_inline_limits		PA
 extern int c_cannot_inline_tree_fn		PARAMS ((tree *));
 extern const char *c_objc_common_init		PARAMS ((const char *));
 extern int c_missing_noreturn_ok_p		PARAMS ((tree));
+extern void c_objc_common_finish_file		PARAMS ((void));
+extern int defer_fn				PARAMS ((tree));
 
 #define c_build_type_variant(TYPE, CONST_P, VOLATILE_P)		  \
   c_build_qualified_type (TYPE,				  \
@@ -371,5 +371,8 @@ extern int mesg_implicit_function_declar
 
 /* In c-decl.c */
 extern void finish_incomplete_decl PARAMS ((tree));
+
+extern tree static_ctors;
+extern tree static_dtors;
 
 #endif /* ! GCC_C_TREE_H */
============================================================
Index: gcc/objc/Make-lang.in
--- gcc/objc/Make-lang.in	2001/12/04 00:25:20	1.42
+++ gcc/objc/Make-lang.in	2001/12/06 07:21:34
@@ -85,7 +85,7 @@ $(srcdir)/objc/objc-parse.y: $(srcdir)/c
 
 objc-act.o : $(srcdir)/objc/objc-act.c \
    $(CONFIG_H) $(TREE_H) $(RTL_H) $(SYSTEM_H) $(EXPR_H) $(TARGET_H) \
-   $(srcdir)/c-tree.h $(srcdir)/c-common.h $(srcdir)/c-lex.h $(VARRAY_H) \
+   $(srcdir)/c-tree.h $(srcdir)/c-common.h $(srcdir)/c-lex.h \
    $(srcdir)/toplev.h $(srcdir)/flags.h $(srcdir)/objc/objc-act.h \
    $(srcdir)/input.h $(srcdir)/function.h $(srcdir)/output.h $(srcdir)/debug.h \
    $(srcdir)/langhooks.h $(srcdir)/langhooks-def.h
============================================================
Index: gcc/objc/objc-act.c
--- gcc/objc/objc-act.c	2001/12/04 00:25:20	1.112
+++ gcc/objc/objc-act.c	2001/12/06 07:21:49
@@ -58,7 +58,6 @@ Boston, MA 02111-1307, USA.  */
 #include "cpplib.h"
 #include "debug.h"
 #include "target.h"
-#include "varray.h"
 
 /* This is the default way of generating a method name.  */
 /* I am not sure it is really correct.
@@ -448,8 +447,6 @@ static int generating_instance_variables
 
 static int print_struct_values = 0;
 
-static varray_type deferred_fns;
-
 /* Some platforms pass small structures through registers versus through
    an invisible pointer.  Determine at what size structure is the 
    transition point between the two possibilities. */
@@ -564,36 +561,13 @@ objc_init (filename)
 
   objc_act_parse_init ();
 
-  VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns");
-  ggc_add_tree_varray_root (&deferred_fns, 1);
-
   return filename;
 }
 
-/* Register a function tree, so that its optimization and conversion
-   to RTL is only done at the end of the compilation.  */
-
-int
-defer_fn (fn)
-     tree fn;
-{
-  VARRAY_PUSH_TREE (deferred_fns, fn);
-
-  return 1;
-}
-
 void
 finish_file ()
 {
-  size_t i;
-
-  for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_fns); i++)
-    /* Don't output the same function twice.  We may run into such
-       situations when an extern inline function is later given a
-       non-extern-inline definition.  */
-    if (! TREE_ASM_WRITTEN (VARRAY_TREE (deferred_fns, i)))
-      c_expand_deferred_function (VARRAY_TREE (deferred_fns, i));
-  VARRAY_FREE (deferred_fns);
+  c_objc_common_finish_file ();
 
   finish_objc ();		/* Objective-C finalization */
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]