OSDN Git Service

* c-lang.c (start_cdtor, finish_cdtor): New functions.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Nov 2000 01:31:01 +0000 (01:31 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Nov 2000 01:31:01 +0000 (01:31 +0000)
        (finish_file): Use them in building constructor/destructor functions.

        * config/alpha/alpha.h (HAS_INIT_SECTION, LD_INIT_SWITCH,
        LD_FINI_SWITCH): Move ...
        * config/alpha/osf.h: ... here.
        * config/alpha/alpha-interix.h: Don't undef them.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37307 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-lang.c
gcc/config/alpha/alpha-interix.h
gcc/config/alpha/alpha.h
gcc/config/alpha/osf.h

index d33c3c4..61e7193 100644 (file)
@@ -1,3 +1,13 @@
+2000-11-07  Richard Henderson  <rth@redhat.com>
+
+       * c-lang.c (start_cdtor, finish_cdtor): New functions.
+       (finish_file): Use them in building constructor/destructor functions.
+
+       * config/alpha/alpha.h (HAS_INIT_SECTION, LD_INIT_SWITCH, 
+       LD_FINI_SWITCH): Move ...
+       * config/alpha/osf.h: ... here.
+       * config/alpha/alpha-interix.h: Don't undef them.
+
 2000-11-07  Jeffrey Oldham  <oldham@oz.codesourcery.com>
 
        * config/mips/t-iris6 (FPBIT): New.  Added so that __unorddf2 is
index ab36a2e..86e87b7 100644 (file)
@@ -183,63 +183,86 @@ lookup_objc_ivar (id)
   return 0;
 }
 
+#if !defined(ASM_OUTPUT_CONSTRUCTOR) || !defined(ASM_OUTPUT_DESTRUCTOR)
+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_parse_node (CALL_EXPR, fnname, 
+                                   tree_cons (NULL_TREE, NULL_TREE, 
+                                              void_list_node_1),
+                                   NULL_TREE),
+                 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);
+}
+#endif
+
 /* Called at end of parsing, but before end-of-file processing.  */
 
 void
 finish_file ()
 {
 #ifndef ASM_OUTPUT_CONSTRUCTOR
-  extern tree static_ctors;
-#endif
-#ifndef ASM_OUTPUT_DESTRUCTOR
-  extern tree static_dtors;
-#endif
-  extern tree build_function_call                 PARAMS ((tree, tree));
-#if !defined(ASM_OUTPUT_CONSTRUCTOR) || !defined(ASM_OUTPUT_DESTRUCTOR)
-  tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
-#endif
-#ifndef ASM_OUTPUT_CONSTRUCTOR
   if (static_ctors)
     {
-      tree fnname = get_file_function_name ('I');
-      start_function (void_list_node_1,
-                     build_parse_node (CALL_EXPR, fnname, 
-                                       tree_cons (NULL_TREE, NULL_TREE, 
-                                                  void_list_node_1),
-                                       NULL_TREE),
-                     NULL_TREE, NULL_TREE);
-      fnname = DECL_ASSEMBLER_NAME (current_function_decl);
-      store_parm_decls ();
+      tree body = start_cdtor ('I');
 
       for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
-       expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
-                                              NULL_TREE));
-
-      finish_function (0);
+       c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
+                                                NULL_TREE));
 
-      assemble_constructor (IDENTIFIER_POINTER (fnname));
+      finish_cdtor (body);
     }
 #endif
 #ifndef ASM_OUTPUT_DESTRUCTOR
   if (static_dtors)
     {
-      tree fnname = get_file_function_name ('D');
-      start_function (void_list_node_1,
-                     build_parse_node (CALL_EXPR, fnname, 
-                                       tree_cons (NULL_TREE, NULL_TREE,
-                                                  void_list_node_1),
-                                       NULL_TREE),
-                     NULL_TREE, NULL_TREE);
-      fnname = DECL_ASSEMBLER_NAME (current_function_decl);
-      store_parm_decls ();
+      tree body = start_cdtor ('D');
 
       for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
-       expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
-                                              NULL_TREE));
-
-      finish_function (0);
+       c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
+                                                NULL_TREE));
 
-      assemble_destructor (IDENTIFIER_POINTER (fnname));
+      finish_cdtor (body);
     }
 #endif
   
index b174651..4bbd988 100644 (file)
@@ -62,12 +62,6 @@ Boston, MA 02111-1307, USA.  */
 #undef PUT_SDB_BLOCK_START
 #undef PUT_SDB_BLOCK_END
 
-/* the following are OSF linker (not gld) specific... we don't want them */
-#undef HAS_INIT_SECTION
-#undef LD_INIT_SWITCH
-#undef LD_FINI_SWITCH
-
-
 /* The following are needed for C++, but also needed for profiling */
 
 /* Support const sections and the ctors and dtors sections for g++.
index edc644a..7578224 100644 (file)
@@ -2525,11 +2525,6 @@ do {                                                     \
 
 #define ALIGN_SYMTABLE_OFFSET(OFFSET) (((OFFSET) + 7) & ~7)
 
-/* The linker will stick __main into the .init section.  */
-#define HAS_INIT_SECTION
-#define LD_INIT_SWITCH "-init"
-#define LD_FINI_SWITCH "-fini"
-
 /* The system headers under Alpha systems are generally C++-aware.  */
 #define NO_IMPLICIT_EXTERN_C
 
index b6333fa..f4ad241 100644 (file)
@@ -144,3 +144,8 @@ __enable_execute_stack (addr)                                               \
 /* Digital UNIX V4.0E (1091)/usr/include/sys/types.h 4.3.49.9 1997/08/14 */
 #define SIZE_TYPE      "long unsigned int"
 #define PTRDIFF_TYPE   "long int"
+
+/* The linker will stick __main into the .init section.  */
+#define HAS_INIT_SECTION
+#define LD_INIT_SWITCH "-init"
+#define LD_FINI_SWITCH "-fini"