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
This commit is contained in:
Richard Henderson 2000-11-07 17:31:01 -08:00 committed by Richard Henderson
parent 99b130844d
commit 6dbaddf97c
5 changed files with 76 additions and 49 deletions

View 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

View 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));
c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
NULL_TREE));
finish_function (0);
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));
c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
NULL_TREE));
finish_function (0);
assemble_destructor (IDENTIFIER_POINTER (fnname));
finish_cdtor (body);
}
#endif

View 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++.

View 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

View 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"