diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-01 07:51:12 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-01 07:51:12 +0000 |
commit | b553055975ca3366d1c5aba3744b461e513bbee2 (patch) | |
tree | 9e2f01325bb00a9ea11c2b59b1144a6756a6aa5f /gcc/java | |
parent | ae39fb4112dfc99628ad4049fdd708e9734598f9 (diff) | |
download | gcc-b553055975ca3366d1c5aba3744b461e513bbee2.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@83958 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java')
-rw-r--r-- | gcc/java/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/java/class.c | 77 | ||||
-rw-r--r-- | gcc/java/decl.c | 1 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 5 | ||||
-rw-r--r-- | gcc/java/jcf-parse.c | 47 | ||||
-rw-r--r-- | gcc/java/resource.c | 76 |
6 files changed, 90 insertions, 132 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 0544670b65c..135423a5f64 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,19 @@ +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> PR java/1262 diff --git a/gcc/java/class.c b/gcc/java/class.c index 03b18286aa4..3c0538ad5f3 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -43,6 +43,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ #include "stdio.h" #include "target.h" #include "except.h" +#include "tree-iterator.h" /* DOS brain-damage */ #ifndef O_BINARY @@ -62,8 +63,6 @@ static void add_miranda_methods (tree, tree); static int assume_compiled (const char *); static tree build_symbol_entry (tree); -static GTY(()) rtx registerClass_libfunc; - struct obstack temporary_obstack; /* The compiler generates different code depending on whether or not @@ -2276,14 +2275,19 @@ register_class (void) /* Emit something to register classes at start-up time. The preferred mechanism is through the .jcr section, which contain - a list of pointers to classes which get registered during - constructor invocation time. The fallback mechanism is to generate - a `constructor' function which calls _Jv_RegisterClass for each - class in this file. */ + a list of pointers to classes which get registered during constructor + invocation time. + + 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 -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 that the target is using gcc's crtbegin/crtend objects rather than the ones that come with the operating system. */ @@ -2302,48 +2306,21 @@ emit_register_classes (void) } else { - extern tree get_file_function_name (int); - tree init_name = get_file_function_name ('I'); - tree init_type = build_function_type (void_type_node, end_params_node); - tree init_decl; - tree t; - location_t saved_loc = input_location; - - init_decl = build_decl (FUNCTION_DECL, init_name, init_type); - SET_DECL_ASSEMBLER_NAME (init_decl, init_name); - DECL_SOURCE_LINE (init_decl) = 0; - TREE_STATIC (init_decl) = 1; - current_function_decl = init_decl; - DECL_INLINE (init_decl) = 0; - DECL_UNINLINABLE (init_decl) = 1; - 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; + tree klass, t, register_class_fn; + + t = build_function_type_list (void_type_node, class_ptr_type, NULL); + t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t); + TREE_PUBLIC (t) = 1; + DECL_EXTERNAL (t) = 1; + register_class_fn = t; + + for (klass = registered_class; klass; klass = TREE_CHAIN (klass)) + { + t = build_fold_addr_expr (klass); + t = tree_cons (NULL, t, NULL); + t = build_function_call_expr (register_class_fn, t); + append_to_statement_list (t, list_p); + } } } @@ -2483,9 +2460,9 @@ emit_catch_table (tree this_class) void init_class_processing (void) { - registerClass_libfunc = gen_rtx_SYMBOL_REF (Pmode, "_Jv_RegisterClass"); fields_ident = get_identifier ("fields"); info_ident = get_identifier ("info"); + gcc_obstack_init (&temporary_obstack); } diff --git a/gcc/java/decl.c b/gcc/java/decl.c index 508727a888a..5f2771d3ed3 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -452,7 +452,6 @@ java_init_decl_processing (void) tree t; init_class_processing (); - init_resource_processing (); current_function_decl = NULL; current_binding_level = NULL_BINDING_LEVEL; diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index be9a64d2630..6ebf6db45d6 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -1245,7 +1245,7 @@ extern tree get_method_index (tree decl); extern void make_class_data (tree); extern void register_class (void); 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 void lang_init_source (int); extern void write_classfile (tree); @@ -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_file (const char *, const char *); -extern void write_resource_constructor (void); -extern void init_resource_processing (void); +extern void write_resource_constructor (tree *); extern tree build_java_empty_stmt (void); extern tree add_stmt_to_compound (tree, tree, tree); extern tree java_add_stmt (tree); diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index 42c3df3fc32..0503ef9ceeb 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -875,6 +875,21 @@ predefined_filename_p (tree node) 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 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)); compile_resource_file (resource_name, resource_filename); - return; + goto finish; } current_jcf = main_jcf; @@ -1120,23 +1135,23 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED) input_filename = main_input_filename; java_expand_classes (); - if (!java_report_errors () && !flag_syntax_only) - { - /* Expand all classes compiled from source. */ - java_finish_classes (); - - /* Emit the .jcf section. */ - emit_register_classes (); - - /* Only finalize the compilation unit after we've told cgraph which - functions have their addresses stored. */ - cgraph_finalize_compilation_unit (); - cgraph_optimize (); - } - - write_resource_constructor (); + if (java_report_errors () || flag_syntax_only) + return; + + /* Expand all classes compiled from source. */ + java_finish_classes (); + + finish: + /* Arrange for any necessary initialization to happen. */ + java_emit_static_constructor (); + + /* Only finalize the compilation unit after we've told cgraph which + functions have their addresses stored. */ + cgraph_finalize_compilation_unit (); + cgraph_optimize (); } + /* Return the name of the class corresponding to the name of the file in this zip entry. The result is newly allocated using ALLOC. */ static char * diff --git a/gcc/java/resource.c b/gcc/java/resource.c index 0f8440db468..512b903ddba 100644 --- a/gcc/java/resource.c +++ b/gcc/java/resource.c @@ -41,6 +41,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ #include "stdio.h" #include "target.h" #include "expr.h" +#include "tree-iterator.h" /* DOS brain-damage */ #ifndef O_BINARY @@ -50,9 +51,6 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ /* A list of all the resources files. */ static GTY(()) tree resources = NULL; -/* Function used to register resources. */ -static GTY(()) rtx registerResource_libfunc; - /* Count of all the resources compiled in this invocation. */ static int Jr_count = 0; @@ -101,65 +99,27 @@ compile_resource_data (const char *name, const char *buffer, int length) } void -write_resource_constructor (void) +write_resource_constructor (tree *list_p) { - tree init_name, init_type, init_decl; - tree iter; - location_t saved_loc = input_location; - char *resource_ctor_name; + tree iter, t, register_resource_fn; - /* Only do work if required. */ - if (resources == NULL_TREE) + if (resources == NULL) return; - resource_ctor_name = concat (IDENTIFIER_POINTER (get_file_function_name ('I')), - "_resource", NULL); - init_name = get_identifier (resource_ctor_name); - free (resource_ctor_name); - init_type = build_function_type (void_type_node, end_params_node); - - 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); + t = build_function_type_list (void_type_node, ptr_type_node, NULL); + t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterResource"), t); + TREE_PUBLIC (t) = 1; + DECL_EXTERNAL (t) = 1; + register_resource_fn = t; /* Write out entries in the same order in which they were defined. */ - for (iter = nreverse (resources); iter != NULL_TREE; - iter = TREE_CHAIN (iter)) + for (iter = nreverse (resources); iter ; iter = TREE_CHAIN (iter)) { - emit_library_call (registerResource_libfunc, 0, VOIDmode, 1, - expand_expr (build_address_of (TREE_VALUE (iter)), - 0, Pmode, 0), - Pmode); + t = build_fold_addr_expr (TREE_VALUE (iter)); + t = tree_cons (NULL, t, NULL); + t = build_function_call_expr (register_resource_fn, t); + 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 @@ -191,14 +151,6 @@ compile_resource_file (const char *name, const char *filename) close (fd); 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" |