From 6dbaddf97cdeab91396cc4f805fa23d1dbacdb8b Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 7 Nov 2000 17:31:01 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 10 ++++ gcc/c-lang.c | 99 ++++++++++++++++++++------------ gcc/config/alpha/alpha-interix.h | 6 -- gcc/config/alpha/alpha.h | 5 -- gcc/config/alpha/osf.h | 5 ++ 5 files changed, 76 insertions(+), 49 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d33c3c40d61..61e7193b92c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2000-11-07 Richard Henderson + + * 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 * config/mips/t-iris6 (FPBIT): New. Added so that __unorddf2 is diff --git a/gcc/c-lang.c b/gcc/c-lang.c index ab36a2ea37e..86e87b7ac6e 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 b174651578c..4bbd98809ff 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 edc644a88ba..75782244a4d 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 b6333faa021..f4ad241aa86 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" -- 2.30.2