aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2000-11-07 17:31:01 -0800
committerRichard Henderson <rth@gcc.gnu.org>2000-11-07 17:31:01 -0800
commit6dbaddf97cdeab91396cc4f805fa23d1dbacdb8b (patch)
treec856e04a6d92ac54490fed87ab2b96a519581e86 /gcc
parent99b130844d3b2946fa13ddad7e8e9bc579145891 (diff)
downloadgcc-6dbaddf97cdeab91396cc4f805fa23d1dbacdb8b.zip
gcc-6dbaddf97cdeab91396cc4f805fa23d1dbacdb8b.tar.gz
gcc-6dbaddf97cdeab91396cc4f805fa23d1dbacdb8b.tar.bz2
c-lang.c (start_cdtor, [...]): New functions.
* 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. From-SVN: r37307
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/c-lang.c99
-rw-r--r--gcc/config/alpha/alpha-interix.h6
-rw-r--r--gcc/config/alpha/alpha.h5
-rw-r--r--gcc/config/alpha/osf.h5
5 files changed, 76 insertions, 49 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d33c3c4..61e7193 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/c-lang.c b/gcc/c-lang.c
index ab36a2e..86e87b7 100644
--- a/gcc/c-lang.c
+++ b/gcc/c-lang.c
@@ -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
diff --git a/gcc/config/alpha/alpha-interix.h b/gcc/config/alpha/alpha-interix.h
index b174651..4bbd988 100644
--- a/gcc/config/alpha/alpha-interix.h
+++ b/gcc/config/alpha/alpha-interix.h
@@ -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++.
diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h
index edc644a..7578224 100644
--- a/gcc/config/alpha/alpha.h
+++ b/gcc/config/alpha/alpha.h
@@ -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
diff --git a/gcc/config/alpha/osf.h b/gcc/config/alpha/osf.h
index b6333fa..f4ad241 100644
--- a/gcc/config/alpha/osf.h
+++ b/gcc/config/alpha/osf.h
@@ -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"