summaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-01 07:51:12 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-01 07:51:12 +0000
commitb553055975ca3366d1c5aba3744b461e513bbee2 (patch)
tree9e2f01325bb00a9ea11c2b59b1144a6756a6aa5f /gcc/java
parentae39fb4112dfc99628ad4049fdd708e9734598f9 (diff)
downloadgcc-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/ChangeLog16
-rw-r--r--gcc/java/class.c77
-rw-r--r--gcc/java/decl.c1
-rw-r--r--gcc/java/java-tree.h5
-rw-r--r--gcc/java/jcf-parse.c47
-rw-r--r--gcc/java/resource.c76
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"