Commit c9b9aa64 by Richard Henderson Committed by Richard Henderson

cgraph.h (cgraph_build_static_cdtor): Declare.

        * cgraph.h (cgraph_build_static_cdtor): Declare.
        * cgraphunit.c (cgraph_build_static_cdtor): New.
        * c-objc-common.c (build_cdtor): Use it.
        * coverage.c (create_coverage): Likewise.
        * libfuncs.h (LTI_gcov_init, gcov_init_libfunc): Remove.
        * optabs.c (init_optabs): Don't set gcov_init_libfunc.
java/
        * class.c (registerClass_libfunc): Remove.
        (init_class_processing): Don't set it.
        (emit_register_classes): Take list_p parameter.  Fill it in
        with _Jv_RegisterClass calls.
        * decl.c (java_init_decl_processing): Don't call
        init_resource_processing.
        * jcf-parse.c (java_emit_static_constructor): New.
        (java_parse_file): Call it.
        * resource.c (registerResource_libfunc): Remove.
        (init_resource_processing): Remove.
        (write_resource_constructor): Take list_p parameter.  Fill it in
        with _Jv_RegisterResource calls.
        * java-tree.h: Update prototypes.

From-SVN: r83958
parent 276b3fab
2004-07-01 Richard Henderson <rth@redhat.com>
* cgraph.h (cgraph_build_static_cdtor): Declare.
* cgraphunit.c (cgraph_build_static_cdtor): New.
* c-objc-common.c (build_cdtor): Use it.
* coverage.c (create_coverage): Likewise.
* libfuncs.h (LTI_gcov_init, gcov_init_libfunc): Remove.
* optabs.c (init_optabs): Don't set gcov_init_libfunc.
2004-06-30 Roger Sayle <roger@eyesopen.com> 2004-06-30 Roger Sayle <roger@eyesopen.com>
* expmed.c (expand_shift): Consider expanding LSHIFT_EXPR by a * expmed.c (expand_shift): Consider expanding LSHIFT_EXPR by a
......
...@@ -184,27 +184,20 @@ c_objc_common_init (void) ...@@ -184,27 +184,20 @@ c_objc_common_init (void)
/* Synthesize a function which calls all the global ctors or global dtors /* Synthesize a function which calls all the global ctors or global dtors
in this file. */ in this file. */
static void static void
build_cdtor (int method_type, tree cdtors) build_cdtor (int method_type, tree cdtors)
{ {
tree fnname = get_file_function_name (method_type); tree body;
tree cs;
start_function (void_list_node,
build_nt (CALL_EXPR, fnname,
tree_cons (NULL_TREE, NULL_TREE, void_list_node),
NULL_TREE),
NULL_TREE);
store_parm_decls ();
cs = c_begin_compound_stmt (true); body = push_stmt_list ();
for (; cdtors; cdtors = TREE_CHAIN (cdtors)) for (; cdtors; cdtors = TREE_CHAIN (cdtors))
add_stmt (build_function_call (TREE_VALUE (cdtors), 0)); add_stmt (build_function_call (TREE_VALUE (cdtors), NULL_TREE));
add_stmt (c_end_compound_stmt (cs, true)); body = pop_stmt_list (body);
finish_function (); cgraph_build_static_cdtor (method_type, body);
} }
/* Called at end of parsing, but before end-of-file processing. */ /* Called at end of parsing, but before end-of-file processing. */
......
...@@ -192,5 +192,6 @@ void verify_cgraph (void); ...@@ -192,5 +192,6 @@ void verify_cgraph (void);
void verify_cgraph_node (struct cgraph_node *); void verify_cgraph_node (struct cgraph_node *);
void cgraph_mark_inline_edge (struct cgraph_edge *e); void cgraph_mark_inline_edge (struct cgraph_edge *e);
void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate); void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate);
void cgraph_build_static_cdtor (char which, tree body);
#endif /* GCC_CGRAPH_H */ #endif /* GCC_CGRAPH_H */
...@@ -168,6 +168,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -168,6 +168,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "coretypes.h" #include "coretypes.h"
#include "tm.h" #include "tm.h"
#include "tree.h" #include "tree.h"
#include "rtl.h"
#include "tree-inline.h" #include "tree-inline.h"
#include "langhooks.h" #include "langhooks.h"
#include "hashtab.h" #include "hashtab.h"
...@@ -1785,3 +1786,66 @@ cgraph_optimize (void) ...@@ -1785,3 +1786,66 @@ cgraph_optimize (void)
} }
#endif #endif
} }
/* Generate and emit a static constructor or destructor. WHICH must be
one of 'I' or 'D'. BODY should be a STATEMENT_LIST containing
GENERIC statements. */
void
cgraph_build_static_cdtor (char which, tree body)
{
static int counter = 0;
char which_buf[16];
tree decl, name;
sprintf (which_buf, "%c_%d", which, counter++);
name = get_file_function_name_long (which_buf);
decl = build_decl (FUNCTION_DECL, name,
build_function_type (void_type_node, void_list_node));
current_function_decl = decl;
DECL_RESULT (decl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
allocate_struct_function (decl);
TREE_STATIC (decl) = 1;
TREE_USED (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
DECL_IGNORED_P (decl) = 1;
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
DECL_SAVED_TREE (decl) = body;
TREE_PUBLIC (decl) = ! targetm.have_ctors_dtors;
DECL_UNINLINABLE (decl) = 1;
DECL_INITIAL (decl) = make_node (BLOCK);
TREE_USED (DECL_INITIAL (decl)) = 1;
DECL_SOURCE_LOCATION (decl) = input_location;
cfun->function_end_locus = input_location;
if (which == 'I')
DECL_STATIC_CONSTRUCTOR (decl) = 1;
else if (which == 'D')
DECL_STATIC_DESTRUCTOR (decl) = 1;
else
abort ();
gimplify_function_tree (decl);
/* ??? We will get called LATE in the compilation process. */
if (cgraph_global_info_ready)
tree_rest_of_compilation (decl, false);
else
cgraph_finalize_function (decl, 0);
if (targetm.have_ctors_dtors)
{
void (*fn) (rtx, int);
if (which == 'I')
fn = targetm.asm_out.constructor;
else
fn = targetm.asm_out.destructor;
fn (XEXP (DECL_RTL (decl), 0), DEFAULT_INIT_PRIORITY);
}
}
...@@ -39,11 +39,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -39,11 +39,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "function.h" #include "function.h"
#include "toplev.h" #include "toplev.h"
#include "ggc.h" #include "ggc.h"
#include "target.h"
#include "coverage.h" #include "coverage.h"
#include "libfuncs.h"
#include "langhooks.h" #include "langhooks.h"
#include "hashtab.h" #include "hashtab.h"
#include "tree-iterator.h"
#include "cgraph.h"
#include "gcov-io.c" #include "gcov-io.c"
...@@ -904,69 +904,42 @@ build_gcov_info (void) ...@@ -904,69 +904,42 @@ build_gcov_info (void)
static void static void
create_coverage (void) create_coverage (void)
{ {
tree gcov_info, gcov_info_value; tree gcov_info, gcov_init, body, t;
char name[20]; char name_buf[32];
char *ctor_name;
tree ctor;
rtx gcov_info_address;
no_coverage = 1; /* Disable any further coverage. */ no_coverage = 1; /* Disable any further coverage. */
if (!prg_ctr_mask) if (!prg_ctr_mask)
return; return;
gcov_info_value = build_gcov_info (); t = build_gcov_info ();
gcov_info = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (gcov_info_value));
DECL_INITIAL (gcov_info) = gcov_info_value;
gcov_info = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (t));
TREE_STATIC (gcov_info) = 1; TREE_STATIC (gcov_info) = 1;
ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 0); ASM_GENERATE_INTERNAL_LABEL (name_buf, "LPBX", 0);
DECL_NAME (gcov_info) = get_identifier (name); DECL_NAME (gcov_info) = get_identifier (name_buf);
DECL_INITIAL (gcov_info) = t;
/* Build structure. */ /* Build structure. */
assemble_variable (gcov_info, 0, 0, 0); assemble_variable (gcov_info, 0, 0, 0);
/* Build the constructor function to invoke __gcov_init. */ /* Build a decl for __gcov_init. */
ctor_name = concat (IDENTIFIER_POINTER (get_file_function_name ('I')), t = build_pointer_type (TREE_TYPE (gcov_info));
"_GCOV", NULL); t = build_function_type_list (void_type_node, t, NULL);
ctor = build_decl (FUNCTION_DECL, get_identifier (ctor_name), t = build_decl (FUNCTION_DECL, get_identifier ("__gcov_init"), t);
build_function_type (void_type_node, NULL_TREE)); TREE_PUBLIC (t) = 1;
free (ctor_name); DECL_EXTERNAL (t) = 1;
DECL_EXTERNAL (ctor) = 0; gcov_init = t;
/* It can be a static function as long as collect2 does not have /* Generate a call to __gcov_init(&gcov_info). */
to scan the object file to find its ctor/dtor routine. */ body = NULL;
TREE_PUBLIC (ctor) = ! targetm.have_ctors_dtors; t = build_fold_addr_expr (gcov_info);
TREE_USED (ctor) = 1; t = tree_cons (NULL, t, NULL);
DECL_RESULT (ctor) = build_decl (RESULT_DECL, NULL_TREE, void_type_node); t = build_function_call_expr (gcov_init, t);
DECL_UNINLINABLE (ctor) = 1; append_to_statement_list (t, &body);
rest_of_decl_compilation (ctor, 0, 1, 0); /* Generate a constructor to run it. */
announce_function (ctor); cgraph_build_static_cdtor ('I', body);
current_function_decl = ctor;
make_decl_rtl (ctor, NULL);
init_function_start (ctor);
expand_function_start (ctor, 0);
/* Actually generate the code to call __gcov_init. */
gcov_info_address = force_reg (Pmode, XEXP (DECL_RTL (gcov_info), 0));
emit_library_call (gcov_init_libfunc, LCT_NORMAL, VOIDmode, 1,
gcov_info_address, Pmode);
expand_function_end ();
/* Create a dummy BLOCK. */
DECL_INITIAL (ctor) = make_node (BLOCK);
TREE_USED (DECL_INITIAL (ctor)) = 1;
rest_of_compilation ();
if (! quiet_flag)
fflush (asm_out_file);
current_function_decl = NULL_TREE;
if (targetm.have_ctors_dtors)
targetm.asm_out.constructor (XEXP (DECL_RTL (ctor), 0),
DEFAULT_INIT_PRIORITY);
} }
/* Perform file-level initialization. Read in data file, generate name /* Perform file-level initialization. Read in data file, generate name
......
2004-07-01 Richard Henderson <rth@redhat.com>
* class.c (registerClass_libfunc): Remove.
(init_class_processing): Don't set it.
(emit_register_classes): Take list_p parameter. Fill it in
with _Jv_RegisterClass calls.
* decl.c (java_init_decl_processing): Don't call
init_resource_processing.
* jcf-parse.c (java_emit_static_constructor): New.
(java_parse_file): Call it.
* resource.c (registerResource_libfunc): Remove.
(init_resource_processing): Remove.
(write_resource_constructor): Take list_p parameter. Fill it in
with _Jv_RegisterResource calls.
* java-tree.h: Update prototypes.
2004-06-29 Bryce McKinlay <mckinlay@redhat.com> 2004-06-29 Bryce McKinlay <mckinlay@redhat.com>
PR java/1262 PR java/1262
......
...@@ -43,6 +43,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ ...@@ -43,6 +43,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "stdio.h" #include "stdio.h"
#include "target.h" #include "target.h"
#include "except.h" #include "except.h"
#include "tree-iterator.h"
/* DOS brain-damage */ /* DOS brain-damage */
#ifndef O_BINARY #ifndef O_BINARY
...@@ -62,8 +63,6 @@ static void add_miranda_methods (tree, tree); ...@@ -62,8 +63,6 @@ static void add_miranda_methods (tree, tree);
static int assume_compiled (const char *); static int assume_compiled (const char *);
static tree build_symbol_entry (tree); static tree build_symbol_entry (tree);
static GTY(()) rtx registerClass_libfunc;
struct obstack temporary_obstack; struct obstack temporary_obstack;
/* The compiler generates different code depending on whether or not /* The compiler generates different code depending on whether or not
...@@ -2276,14 +2275,19 @@ register_class (void) ...@@ -2276,14 +2275,19 @@ register_class (void)
/* Emit something to register classes at start-up time. /* Emit something to register classes at start-up time.
The preferred mechanism is through the .jcr section, which contain The preferred mechanism is through the .jcr section, which contain
a list of pointers to classes which get registered during a list of pointers to classes which get registered during constructor
constructor invocation time. The fallback mechanism is to generate invocation time.
a `constructor' function which calls _Jv_RegisterClass for each
class in this file. */ The fallback mechanism is to add statements to *LIST_P to call
_Jv_RegisterClass for each class in this file. These statements will
be added to a static constructor function for this translation unit. */
void void
emit_register_classes (void) emit_register_classes (tree *list_p)
{ {
if (registered_class == NULL)
return;
/* ??? This isn't quite the correct test. We also have to know /* ??? This isn't quite the correct test. We also have to know
that the target is using gcc's crtbegin/crtend objects rather that the target is using gcc's crtbegin/crtend objects rather
than the ones that come with the operating system. */ than the ones that come with the operating system. */
...@@ -2302,48 +2306,21 @@ emit_register_classes (void) ...@@ -2302,48 +2306,21 @@ emit_register_classes (void)
} }
else else
{ {
extern tree get_file_function_name (int); tree klass, t, register_class_fn;
tree init_name = get_file_function_name ('I');
tree init_type = build_function_type (void_type_node, end_params_node); t = build_function_type_list (void_type_node, class_ptr_type, NULL);
tree init_decl; t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
tree t; TREE_PUBLIC (t) = 1;
location_t saved_loc = input_location; DECL_EXTERNAL (t) = 1;
register_class_fn = t;
init_decl = build_decl (FUNCTION_DECL, init_name, init_type);
SET_DECL_ASSEMBLER_NAME (init_decl, init_name); for (klass = registered_class; klass; klass = TREE_CHAIN (klass))
DECL_SOURCE_LINE (init_decl) = 0; {
TREE_STATIC (init_decl) = 1; t = build_fold_addr_expr (klass);
current_function_decl = init_decl; t = tree_cons (NULL, t, NULL);
DECL_INLINE (init_decl) = 0; t = build_function_call_expr (register_class_fn, t);
DECL_UNINLINABLE (init_decl) = 1; append_to_statement_list (t, list_p);
DECL_RESULT (init_decl) = build_decl (RESULT_DECL, NULL_TREE, }
void_type_node);
/* It can be a static function as long as collect2 does not have
to scan the object file to find its ctor/dtor routine. */
TREE_PUBLIC (init_decl) = ! targetm.have_ctors_dtors;
/* Suppress spurious warnings. */
TREE_USED (init_decl) = 1;
pushlevel (0);
make_decl_rtl (init_decl, NULL);
init_function_start (init_decl);
expand_function_start (init_decl, 0);
for ( t = registered_class; t; t = TREE_CHAIN (t))
emit_library_call (registerClass_libfunc, 0, VOIDmode, 1,
XEXP (DECL_RTL (t), 0), Pmode);
input_location = DECL_SOURCE_LOCATION (init_decl);
expand_function_end ();
poplevel (1, 0, 1);
rest_of_compilation ();
current_function_decl = NULL_TREE;
if (targetm.have_ctors_dtors)
(* targetm.asm_out.constructor) (XEXP (DECL_RTL (init_decl), 0),
DEFAULT_INIT_PRIORITY);
input_location = saved_loc;
} }
} }
...@@ -2483,9 +2460,9 @@ emit_catch_table (tree this_class) ...@@ -2483,9 +2460,9 @@ emit_catch_table (tree this_class)
void void
init_class_processing (void) init_class_processing (void)
{ {
registerClass_libfunc = gen_rtx_SYMBOL_REF (Pmode, "_Jv_RegisterClass");
fields_ident = get_identifier ("fields"); fields_ident = get_identifier ("fields");
info_ident = get_identifier ("info"); info_ident = get_identifier ("info");
gcc_obstack_init (&temporary_obstack); gcc_obstack_init (&temporary_obstack);
} }
......
...@@ -452,7 +452,6 @@ java_init_decl_processing (void) ...@@ -452,7 +452,6 @@ java_init_decl_processing (void)
tree t; tree t;
init_class_processing (); init_class_processing ();
init_resource_processing ();
current_function_decl = NULL; current_function_decl = NULL;
current_binding_level = NULL_BINDING_LEVEL; current_binding_level = NULL_BINDING_LEVEL;
......
...@@ -1245,7 +1245,7 @@ extern tree get_method_index (tree decl); ...@@ -1245,7 +1245,7 @@ extern tree get_method_index (tree decl);
extern void make_class_data (tree); extern void make_class_data (tree);
extern void register_class (void); extern void register_class (void);
extern int alloc_name_constant (int, tree); extern int alloc_name_constant (int, tree);
extern void emit_register_classes (void); extern void emit_register_classes (tree *);
extern tree emit_symbol_table (tree, tree, tree, tree, tree); extern tree emit_symbol_table (tree, tree, tree, tree, tree);
extern void lang_init_source (int); extern void lang_init_source (int);
extern void write_classfile (tree); extern void write_classfile (tree);
...@@ -1341,8 +1341,7 @@ extern void java_inlining_map_static_initializers (tree, void *); ...@@ -1341,8 +1341,7 @@ extern void java_inlining_map_static_initializers (tree, void *);
extern void compile_resource_data (const char *name, const char *buffer, int); extern void compile_resource_data (const char *name, const char *buffer, int);
extern void compile_resource_file (const char *, const char *); extern void compile_resource_file (const char *, const char *);
extern void write_resource_constructor (void); extern void write_resource_constructor (tree *);
extern void init_resource_processing (void);
extern tree build_java_empty_stmt (void); extern tree build_java_empty_stmt (void);
extern tree add_stmt_to_compound (tree, tree, tree); extern tree add_stmt_to_compound (tree, tree, tree);
extern tree java_add_stmt (tree); extern tree java_add_stmt (tree);
......
...@@ -875,6 +875,21 @@ predefined_filename_p (tree node) ...@@ -875,6 +875,21 @@ predefined_filename_p (tree node)
return 0; return 0;
} }
/* Generate a function that does all static initialization for this
translation unit. */
static void
java_emit_static_constructor (void)
{
tree body = NULL;
emit_register_classes (&body);
write_resource_constructor (&body);
if (body)
cgraph_build_static_cdtor ('I', body);
}
void void
java_parse_file (int set_yydebug ATTRIBUTE_UNUSED) java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
{ {
...@@ -1013,7 +1028,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED) ...@@ -1013,7 +1028,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
resource_filename = IDENTIFIER_POINTER (TREE_VALUE (current_file_list)); resource_filename = IDENTIFIER_POINTER (TREE_VALUE (current_file_list));
compile_resource_file (resource_name, resource_filename); compile_resource_file (resource_name, resource_filename);
return; goto finish;
} }
current_jcf = main_jcf; current_jcf = main_jcf;
...@@ -1120,23 +1135,23 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED) ...@@ -1120,23 +1135,23 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
input_filename = main_input_filename; input_filename = main_input_filename;
java_expand_classes (); java_expand_classes ();
if (!java_report_errors () && !flag_syntax_only) if (java_report_errors () || flag_syntax_only)
{ return;
/* Expand all classes compiled from source. */
java_finish_classes (); /* Expand all classes compiled from source. */
java_finish_classes ();
/* Emit the .jcf section. */
emit_register_classes (); finish:
/* Arrange for any necessary initialization to happen. */
/* Only finalize the compilation unit after we've told cgraph which java_emit_static_constructor ();
functions have their addresses stored. */
cgraph_finalize_compilation_unit (); /* Only finalize the compilation unit after we've told cgraph which
cgraph_optimize (); functions have their addresses stored. */
} cgraph_finalize_compilation_unit ();
cgraph_optimize ();
write_resource_constructor ();
} }
/* Return the name of the class corresponding to the name of the file /* Return the name of the class corresponding to the name of the file
in this zip entry. The result is newly allocated using ALLOC. */ in this zip entry. The result is newly allocated using ALLOC. */
static char * static char *
......
...@@ -41,6 +41,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ ...@@ -41,6 +41,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "stdio.h" #include "stdio.h"
#include "target.h" #include "target.h"
#include "expr.h" #include "expr.h"
#include "tree-iterator.h"
/* DOS brain-damage */ /* DOS brain-damage */
#ifndef O_BINARY #ifndef O_BINARY
...@@ -50,9 +51,6 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ ...@@ -50,9 +51,6 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
/* A list of all the resources files. */ /* A list of all the resources files. */
static GTY(()) tree resources = NULL; static GTY(()) tree resources = NULL;
/* Function used to register resources. */
static GTY(()) rtx registerResource_libfunc;
/* Count of all the resources compiled in this invocation. */ /* Count of all the resources compiled in this invocation. */
static int Jr_count = 0; static int Jr_count = 0;
...@@ -101,65 +99,27 @@ compile_resource_data (const char *name, const char *buffer, int length) ...@@ -101,65 +99,27 @@ compile_resource_data (const char *name, const char *buffer, int length)
} }
void void
write_resource_constructor (void) write_resource_constructor (tree *list_p)
{ {
tree init_name, init_type, init_decl; tree iter, t, register_resource_fn;
tree iter;
location_t saved_loc = input_location;
char *resource_ctor_name;
/* Only do work if required. */ if (resources == NULL)
if (resources == NULL_TREE)
return; return;
resource_ctor_name = concat (IDENTIFIER_POINTER (get_file_function_name ('I')), t = build_function_type_list (void_type_node, ptr_type_node, NULL);
"_resource", NULL); t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterResource"), t);
init_name = get_identifier (resource_ctor_name); TREE_PUBLIC (t) = 1;
free (resource_ctor_name); DECL_EXTERNAL (t) = 1;
init_type = build_function_type (void_type_node, end_params_node); register_resource_fn = t;
init_decl = build_decl (FUNCTION_DECL, init_name, init_type);
DECL_SOURCE_LINE (init_decl) = 0;
SET_DECL_ASSEMBLER_NAME (init_decl, init_name);
TREE_STATIC (init_decl) = 1;
current_function_decl = init_decl;
DECL_RESULT (init_decl) = build_decl (RESULT_DECL,
NULL_TREE, void_type_node);
/* It can be a static function as long as collect2 does not have
to scan the object file to find its ctor/dtor routine. */
TREE_PUBLIC (init_decl) = ! targetm.have_ctors_dtors;
/* Suppress spurious warnings. */
TREE_USED (init_decl) = 1;
pushlevel (0);
make_decl_rtl (init_decl, NULL);
init_function_start (init_decl);
expand_function_start (init_decl, 0);
/* Write out entries in the same order in which they were defined. */ /* Write out entries in the same order in which they were defined. */
for (iter = nreverse (resources); iter != NULL_TREE; for (iter = nreverse (resources); iter ; iter = TREE_CHAIN (iter))
iter = TREE_CHAIN (iter))
{ {
emit_library_call (registerResource_libfunc, 0, VOIDmode, 1, t = build_fold_addr_expr (TREE_VALUE (iter));
expand_expr (build_address_of (TREE_VALUE (iter)), t = tree_cons (NULL, t, NULL);
0, Pmode, 0), t = build_function_call_expr (register_resource_fn, t);
Pmode); append_to_statement_list (t, list_p);
} }
input_location = DECL_SOURCE_LOCATION (init_decl);
expand_function_end ();
poplevel (1, 0, 1);
/* rest_of_compilation forces generation even if -finline-functions. */
rest_of_compilation ();
current_function_decl = NULL_TREE;
if (targetm.have_ctors_dtors)
targetm.asm_out.constructor (XEXP (DECL_RTL (init_decl), 0),
DEFAULT_INIT_PRIORITY);
input_location = saved_loc;
} }
/* Generate a byte array representing the contents of FILENAME. The /* Generate a byte array representing the contents of FILENAME. The
...@@ -191,14 +151,6 @@ compile_resource_file (const char *name, const char *filename) ...@@ -191,14 +151,6 @@ compile_resource_file (const char *name, const char *filename)
close (fd); close (fd);
compile_resource_data (name, buffer, stat_buf.st_size); compile_resource_data (name, buffer, stat_buf.st_size);
write_resource_constructor ();
}
void
init_resource_processing (void)
{
registerResource_libfunc =
gen_rtx_SYMBOL_REF (Pmode, "_Jv_RegisterResource");
} }
#include "gt-java-resource.h" #include "gt-java-resource.h"
...@@ -45,7 +45,6 @@ enum libfunc_index ...@@ -45,7 +45,6 @@ enum libfunc_index
LTI_profile_function_exit, LTI_profile_function_exit,
LTI_gcov_flush, LTI_gcov_flush,
LTI_gcov_init,
LTI_MAX LTI_MAX
}; };
...@@ -78,6 +77,5 @@ extern GTY(()) rtx libfunc_table[LTI_MAX]; ...@@ -78,6 +77,5 @@ extern GTY(()) rtx libfunc_table[LTI_MAX];
#define profile_function_exit_libfunc (libfunc_table[LTI_profile_function_exit]) #define profile_function_exit_libfunc (libfunc_table[LTI_profile_function_exit])
#define gcov_flush_libfunc (libfunc_table[LTI_gcov_flush]) #define gcov_flush_libfunc (libfunc_table[LTI_gcov_flush])
#define gcov_init_libfunc (libfunc_table[LTI_gcov_init])
#endif /* GCC_LIBFUNCS_H */ #endif /* GCC_LIBFUNCS_H */
...@@ -5550,7 +5550,6 @@ init_optabs (void) ...@@ -5550,7 +5550,6 @@ init_optabs (void)
= init_one_libfunc ("__cyg_profile_func_exit"); = init_one_libfunc ("__cyg_profile_func_exit");
gcov_flush_libfunc = init_one_libfunc ("__gcov_flush"); gcov_flush_libfunc = init_one_libfunc ("__gcov_flush");
gcov_init_libfunc = init_one_libfunc ("__gcov_init");
if (HAVE_conditional_trap) if (HAVE_conditional_trap)
trap_rtx = gen_rtx_fmt_ee (EQ, VOIDmode, NULL_RTX, NULL_RTX); trap_rtx = gen_rtx_fmt_ee (EQ, VOIDmode, NULL_RTX, NULL_RTX);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment