OSDN Git Service

2001-08-08 Anthony Green <green@redhat.com>
authorgreen <green@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Aug 2001 23:33:51 +0000 (23:33 +0000)
committergreen <green@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Aug 2001 23:33:51 +0000 (23:33 +0000)
* java/class.c (emit_register_classes): Use assemble_jcr if
possible.  Keep the original mechanism as a fallback.
* defaults.h (JCR_SECTION_NAME): Define if we have named section
and weak symbol support.
* crtstuff.c (__JCR_LIST__): Define.
(__JCR_END__): Define.
(_Jv_RegiserClasses): Define weak symbol if possible.
(__do_global_ctors_aux): Register classes for ELF targets with
weak symbol support.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44731 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/crtstuff.c
gcc/defaults.h
gcc/java/class.c

index 7ca9c06..6f28595 100644 (file)
@@ -1,3 +1,15 @@
+2001-08-08  Anthony Green  <green@redhat.com>
+
+       * java/class.c (emit_register_classes): Use assemble_jcr if
+       possible.  Keep the original mechanism as a fallback.
+       * defaults.h (JCR_SECTION_NAME): Define if we have named section
+       and weak symbol support.
+       * crtstuff.c (__JCR_LIST__): Define.
+       (__JCR_END__): Define.
+       (_Jv_RegiserClasses): Define weak symbol if possible.
+       (__do_global_ctors_aux): Register classes for ELF targets with
+       weak symbol support.
+
 2001-08-08  Kazu Hirata  <kazu@hxi.com>
 
        * dbxout.c: Fix comment formatting.
index 75e9441..c74377e 100644 (file)
@@ -415,6 +415,14 @@ char __EH_FRAME_BEGIN__[]
      = { };
 #endif /* EH_FRAME_SECTION_NAME */
 
+#ifdef JCR_SECTION_NAME
+/* Stick a label at the beginning of the java class registration info
+   so we can register them properly.  */
+
+STATIC void *__JCR_LIST__[] __attribute__ ((unused, section(JCR_SECTION_NAME)))
+  = { 0 };
+#endif /* JCR_SECTION_NAME */
+
 #endif /* defined(CRT_BEGIN) */
 
 #ifdef CRT_END
@@ -423,11 +431,25 @@ char __EH_FRAME_BEGIN__[]
 
 #ifdef OBJECT_FORMAT_ELF
 
+#ifdef JCR_SECTION_NAME
+extern void _Jv_RegisterClasses (void *) __attribute__((weak));
+static void *__JCR_END__[];
+#endif
+
 static func_ptr __CTOR_END__[];
 static void
 __do_global_ctors_aux (void)
 {
   func_ptr *p;
+#ifdef JCR_SECTION_NAME
+  void **jcr;
+  if (_Jv_RegisterClasses)
+    {
+      for (jcr = __JCR_END__ - 1; *jcr != NULL; jcr--);
+      if (*(jcr + 1))
+       _Jv_RegisterClasses (jcr + 1);
+    }
+#endif
   for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
     (*p) ();
 }
@@ -543,6 +565,14 @@ STATIC int __FRAME_END__[]
      = { 0 };
 #endif /* EH_FRAME_SECTION */
 
+#ifdef JCR_SECTION_NAME
+/* Stick a label at the beginning of the java class registration info
+   so we can register them properly.  */
+
+STATIC void *__JCR_END__[1] 
+     __attribute__ ((unused, section(JCR_SECTION_NAME))) = { 0 };
+#endif /* JCR_SECTION_NAME */
+
 #endif /* defined(CRT_END) */
 
 #else  /* OBJECT_FORMAT_MACHO */
index 2072924..0939d07 100644 (file)
@@ -217,6 +217,15 @@ do { ASM_OUTPUT_LABEL(FILE,LABEL_ALTERNATE_NAME (INSN)); } while (0)
 #endif
 #endif
 
+/* If we have named section and we support weak symbols, then use the
+   .jcr section for recording java classes which need to be registered
+   at program start-up time.  */
+#if defined (TARGET_ASM_NAMED_SECTION) && SUPPORTS_WEAK
+#ifndef JCR_SECTION_NAME
+#define JCR_SECTION_NAME ".jcr"
+#endif
+#endif
+
 /* If we have no definition for UNIQUE_SECTION, but do have the 
    ability to generate arbitrary sections, construct something
    reasonable.  */
index 3cb8aa4..8113340 100644 (file)
@@ -37,6 +37,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 #include "output.h"
 #include "parse.h"
 #include "ggc.h"
+#include "target.h"
 
 static tree make_method_value PARAMS ((tree));
 static tree build_java_method_type PARAMS ((tree, tree, int));
@@ -848,7 +849,6 @@ build_utf8_ref (name)
   sprintf(buf, "_Utf%d", ++utf8_count);
 
   decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
-  /* FIXME get some way to force this into .text, not .data. */
   TREE_STATIC (decl) = 1;
   DECL_ARTIFICIAL (decl) = 1;
   DECL_IGNORED_P (decl) = 1;
@@ -1865,45 +1865,62 @@ register_class ()
   end = current;
 }
 
-/* Generate a function that gets called at start-up (static contructor) time,
-   which calls registerClass for all the compiled classes. */
+/* 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 invoction time.  The fallback mechanism is to generate
+   a `constructor' function which calls _Jv_RegisterClass for each
+   class in this file.  */
 
 void
 emit_register_classes ()
 {
-  extern tree get_file_function_name PARAMS ((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;
-
-  init_decl = build_decl (FUNCTION_DECL, init_name, init_type);
-  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);
-  /*  DECL_EXTERNAL (init_decl) = 1;*/
-  TREE_PUBLIC (init_decl) = 1;
-  pushlevel (0);
-  make_decl_rtl (init_decl, NULL);
-  init_function_start (init_decl, input_filename, 0);
-  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);
-
-  expand_function_end (input_filename, 0, 0);
-  poplevel (1, 0, 1);
-  { 
-    /* Force generation, even with -O3 or deeper. Gross hack. FIXME */
-    int saved_flag = flag_inline_functions;
-    flag_inline_functions = 0; 
-    rest_of_compilation (init_decl);
-    flag_inline_functions = saved_flag;
-  }
-  current_function_decl = NULL_TREE;
-  assemble_constructor (XEXP (DECL_RTL (init_decl), 0), DEFAULT_INIT_PRIORITY);
+  if (SUPPORTS_WEAK && targetm.have_named_sections)
+    {
+      tree t;
+      named_section_flags (JCR_SECTION_NAME, SECTION_WRITE,
+                          POINTER_SIZE / BITS_PER_UNIT);
+      for (t = registered_class; t; t = TREE_CHAIN (t))
+       assemble_integer (XEXP (DECL_RTL (t), 0),
+                         POINTER_SIZE / BITS_PER_UNIT, 1);
+    }
+  else
+    {
+      extern tree get_file_function_name PARAMS ((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;
+      
+      init_decl = build_decl (FUNCTION_DECL, init_name, init_type);
+      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);
+      /*  DECL_EXTERNAL (init_decl) = 1;*/
+      TREE_PUBLIC (init_decl) = 1;
+      pushlevel (0);
+      make_decl_rtl (init_decl, NULL);
+      init_function_start (init_decl, input_filename, 0);
+      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);
+      
+      expand_function_end (input_filename, 0, 0);
+      poplevel (1, 0, 1);
+      { 
+       /* Force generation, even with -O3 or deeper. Gross hack. FIXME */
+       int saved_flag = flag_inline_functions;
+       flag_inline_functions = 0;      
+       rest_of_compilation (init_decl);
+       flag_inline_functions = saved_flag;
+      }
+      current_function_decl = NULL_TREE;
+      assemble_constructor (XEXP (DECL_RTL (init_decl), 0), DEFAULT_INIT_PRIORITY);
+    }
 }
 
 void