OSDN Git Service

* crtstuff.c: Handle targets that use .init_array.
authorjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 Apr 2005 14:09:45 +0000 (14:09 +0000)
committerjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 Apr 2005 14:09:45 +0000 (14:09 +0000)
* function.c (HAS_INIT_SECTION): Do not define. Instead, make sure
that INVOKE__main is set correctly.
(expand_main_function): Test INVOKE__main.
* libgcc2.c: Do not define __main when using .init_array.
* config/arm/arm.c (arm_elf_asm_constructor): New function.
* config/arm/arm.h (CTORS_SECTION_ASM_OP): Define, with specialized
libgcc version.
(DTORS_SECTION_ASM_OP): Likewise.
(CTOR_LIST_BEGIN): Define specially when in libgcc.
(CTOR_LIST_END): Likewise.
(DTOR_LIST_BEGIN): Likewise.
(DTOR_LIST_END): Likewise.
* config/arm/bpapi.h (INIT_SECTION_ASM_OP): Do not define it.
(FINI_SECTION_ASM_OP): Likewise.
(INIT_ARRAY_SECTION_ASM_OP): Define.
(FINI_ARRAY_SECTION_ASM_OP): Likewise.
* config/arm/elf.h (TARGET_ASM_CONSTRUCTOR): Define.
(SUPPORTS_INIT_PRIORITY): Evaluate to false for EABI based targets.
* doc/tm.texi (INIT_ARRAY_SECTION_ASM_OP): Document.
(FINI_ARRAY_SECTION_ASM_OP): Likewise.

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

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.h
gcc/config/arm/bpabi.h
gcc/config/arm/elf.h
gcc/crtstuff.c
gcc/doc/tm.texi
gcc/function.c
gcc/libgcc2.c

index 46ca9ff..5d30e2c 100644 (file)
@@ -1,3 +1,29 @@
+2005-04-29  Julian Brown  <julian@codesourcery.com>
+           Mark Mitchell  <mark@codesourcery.com>
+           Paul Brook  <paul@codesourcery.com>
+
+       * crtstuff.c: Handle targets that use .init_array.
+       * function.c (HAS_INIT_SECTION): Do not define. Instead, make sure
+       that INVOKE__main is set correctly.
+       (expand_main_function): Test INVOKE__main.
+       * libgcc2.c: Do not define __main when using .init_array.
+       * config/arm/arm.c (arm_elf_asm_constructor): New function.
+       * config/arm/arm.h (CTORS_SECTION_ASM_OP): Define, with specialized
+       libgcc version.
+       (DTORS_SECTION_ASM_OP): Likewise.
+       (CTOR_LIST_BEGIN): Define specially when in libgcc.
+       (CTOR_LIST_END): Likewise.
+       (DTOR_LIST_BEGIN): Likewise.
+       (DTOR_LIST_END): Likewise.
+       * config/arm/bpapi.h (INIT_SECTION_ASM_OP): Do not define it.
+       (FINI_SECTION_ASM_OP): Likewise.
+       (INIT_ARRAY_SECTION_ASM_OP): Define.
+       (FINI_ARRAY_SECTION_ASM_OP): Likewise.
+       * config/arm/elf.h (TARGET_ASM_CONSTRUCTOR): Define.
+       (SUPPORTS_INIT_PRIORITY): Evaluate to false for EABI based targets.
+       * doc/tm.texi (INIT_ARRAY_SECTION_ASM_OP): Document.
+       (FINI_ARRAY_SECTION_ASM_OP): Likewise.  
+
 2005-04-29  Nathan Sidwell  <nathan@codesourcery.com>
 
        * config/m68k/m68k.c (m68k_initial_elimination_offset): Use
index da3b74f..6c0b896 100644 (file)
@@ -144,6 +144,9 @@ static void emit_constant_insn (rtx cond, rtx pattern);
 static int arm_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
                                  tree, bool);
 
+#ifdef OBJECT_FORMAT_ELF
+static void arm_elf_asm_constructor (rtx, int);
+#endif
 #ifndef ARM_PE
 static void arm_encode_section_info (tree, rtx, int);
 #endif
@@ -10780,6 +10783,26 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
 
   return default_assemble_integer (x, size, aligned_p);
 }
+
+
+/* Add a function to the list of static constructors.  */
+
+static void
+arm_elf_asm_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
+{
+  if (!TARGET_AAPCS_BASED)
+    {
+      default_named_section_asm_out_constructor (symbol, priority);
+      return;
+    }
+
+  /* Put these in the .init_array section, using a special relocation.  */
+  ctors_section ();
+  assemble_align (POINTER_SIZE);
+  fputs ("\t.word\t", asm_out_file);
+  output_addr_const (asm_out_file, symbol);
+  fputs ("(target1)\n", asm_out_file);
+}
 #endif
 \f
 /* A finite state machine takes care of noticing whether or not instructions
index b79e028..4f0eeec 100644 (file)
@@ -2122,6 +2122,48 @@ typedef struct
 #define ASM_OUTPUT_LABELREF(FILE, NAME)                \
    arm_asm_output_labelref (FILE, NAME)
 
+/* The EABI specifies that constructors should go in .init_array.
+   Other targets use .ctors for compatibility.  */
+#define ARM_EABI_CTORS_SECTION_OP \
+  "\t.section\t.init_array,\"aw\",%init_array"
+#define ARM_EABI_DTORS_SECTION_OP \
+  "\t.section\t.fini_array,\"aw\",%fini_array"
+#define ARM_CTORS_SECTION_OP \
+  "\t.section\t.ctors,\"aw\",%progbits"
+#define ARM_DTORS_SECTION_OP \
+  "\t.section\t.dtors,\"aw\",%progbits"
+
+/* Define CTORS_SECTION_ASM_OP.  */
+#undef CTORS_SECTION_ASM_OP
+#undef DTORS_SECTION_ASM_OP
+#ifndef IN_LIBGCC2
+# define CTORS_SECTION_ASM_OP \
+   (TARGET_AAPCS_BASED ? ARM_EABI_CTORS_SECTION_OP : ARM_CTORS_SECTION_OP)
+# define DTORS_SECTION_ASM_OP \
+   (TARGET_AAPCS_BASED ? ARM_EABI_DTORS_SECTION_OP : ARM_DTORS_SECTION_OP)
+#else /* !defined (IN_LIBGCC2) */
+/* In libgcc, CTORS_SECTION_ASM_OP must be a compile-time constant,
+   so we cannot use the definition above.  */
+# ifdef __ARM_EABI__
+/* The .ctors section is not part of the EABI, so we do not define
+   CTORS_SECTION_ASM_OP when in libgcc; that prevents crtstuff
+   from trying to use it.  We do define it when doing normal
+   compilation, as .init_array can be used instead of .ctors.  */
+/* There is no need to emit begin or end markers when using
+   init_array; the dynamic linker will compute the size of the
+   array itself based on special symbols created by the static
+   linker.  However, we do need to arrange to set up
+   exception-handling here.  */
+#   define CTOR_LIST_BEGIN asm (ARM_EABI_CTORS_SECTION_OP)
+#   define CTOR_LIST_END /* empty */
+#   define DTOR_LIST_BEGIN asm (ARM_EABI_DTORS_SECTION_OP)
+#   define DTOR_LIST_END /* empty */
+# else /* !defined (__ARM_EABI__) */
+#   define CTORS_SECTION_ASM_OP ARM_CTORS_SECTION_OP
+#   define DTORS_SECTION_ASM_OP ARM_DTORS_SECTION_OP
+# endif /* !defined (__ARM_EABI__) */
+#endif /* !defined (IN_LIBCC2) */
+
 /* True if the operating system can merge entities with vague linkage
    (e.g., symbols in COMDAT group) during dynamic linking.  */
 #ifndef TARGET_ARM_DYNAMIC_VAGUE_LINKAGE_P
index 6fb11b9..037b26d 100644 (file)
 
 #define TARGET_OS_CPP_BUILTINS() \
   TARGET_BPABI_CPP_BUILTINS()
+
+/* The BPABI specifies the use of .{init,fini}_array.  Therefore, we
+   do not want GCC to put anything into the .{init,fini} sections.  */
+#undef INIT_SECTION_ASM_OP
+#undef FINI_SECTION_ASM_OP
+#define INIT_ARRAY_SECTION_ASM_OP ARM_EABI_CTORS_SECTION_OP
+#define FINI_ARRAY_SECTION_ASM_OP ARM_EABI_DTORS_SECTION_OP
index a6c6102..9a48a9b 100644 (file)
 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
 \f
 
+/* Output an element in the static constructor array.  */
+#undef TARGET_ASM_CONSTRUCTOR
+#define TARGET_ASM_CONSTRUCTOR arm_elf_asm_constructor
+
 /* For PIC code we need to explicitly specify (PLT) and (GOT) relocs.  */
 #define NEED_PLT_RELOC flag_pic
 #define NEED_GOT_RELOC flag_pic
     }                                                  \
   while (0)
 
-#define SUPPORTS_INIT_PRIORITY 1
+/* The EABI doesn't provide a way of implementing init_priority.  */
+#define SUPPORTS_INIT_PRIORITY (!TARGET_AAPCS_BASED)
index 0e362f3..6fd3655 100644 (file)
@@ -211,7 +211,7 @@ STATIC void *__JCR_LIST__[]
   = { };
 #endif /* JCR_SECTION_NAME */
 
-#ifdef INIT_SECTION_ASM_OP
+#if defined(INIT_SECTION_ASM_OP) || defined(INIT_ARRAY_SECTION_ASM_OP)
 
 #ifdef OBJECT_FORMAT_ELF
 
@@ -256,9 +256,11 @@ extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;
 static void __attribute__((used))
 __do_global_dtors_aux (void)
 {
+#ifndef FINI_ARRAY_SECTION_ASM_OP
   static func_ptr *p = __DTOR_LIST__ + 1;
-  static _Bool completed;
   func_ptr f;
+#endif /* !defined(FINI_ARRAY_SECTION_ASM_OP)  */
+  static _Bool completed;
 
   if (__builtin_expect (completed, 0))
     return;
@@ -268,11 +270,16 @@ __do_global_dtors_aux (void)
     __cxa_finalize (__dso_handle);
 #endif
 
+#ifdef FINI_ARRAY_SECTION_ASM_OP
+  /* If we are using .fini_array then destructors will be run via that
+     mechanism.  */
+#else /* !defined (FINI_ARRAY_SECTION_ASM_OP) */
   while ((f = *p))
     {
       p++;
       f ();
     }
+#endif /* !defined(FINI_ARRAY_SECTION_ASM_OP) */
 
 #ifdef USE_EH_FRAME_REGISTRY
 #ifdef CRT_GET_RFIB_DATA
@@ -290,7 +297,13 @@ __do_global_dtors_aux (void)
 }
 
 /* Stick a call to __do_global_dtors_aux into the .fini section.  */
+#ifdef FINI_SECTION_ASM_OP
 CRT_CALL_STATIC_FUNCTION (FINI_SECTION_ASM_OP, __do_global_dtors_aux)
+#else /* !defined(FINI_SECTION_ASM_OP) */
+static func_ptr __do_global_dtors_aux_fini_array_entry[]
+  __attribute__ ((__unused__, section(".fini_array")))
+  = { __do_global_dtors_aux };
+#endif /* !defined(FINI_SECTION_ASM_OP) */
 
 #if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
 /* Stick a call to __register_frame_info into the .init section.  For some
@@ -324,7 +337,13 @@ frame_dummy (void)
 #endif /* JCR_SECTION_NAME */
 }
 
+#ifdef INIT_SECTION_ASM_OP
 CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, frame_dummy)
+#else /* defined(INIT_SECTION_ASM_OP) */
+static func_ptr __frame_dummy_init_array_entry[]
+  __attribute__ ((__unused__, section(".init_array")))
+  = { frame_dummy };
+#endif /* !defined(INIT_SECTION_ASM_OP) */
 #endif /* USE_EH_FRAME_REGISTRY || JCR_SECTION_NAME */
 
 #else  /* OBJECT_FORMAT_ELF */
@@ -480,7 +499,11 @@ STATIC void *__JCR_END__[1]
    = { 0 };
 #endif /* JCR_SECTION_NAME */
 
-#ifdef INIT_SECTION_ASM_OP
+#ifdef INIT_ARRAY_SECTION_ASM_OP
+
+/* If we are using .init_array, there is nothing to do.  */
+
+#elif defined(INIT_SECTION_ASM_OP)
 
 #ifdef OBJECT_FORMAT_ELF
 static void __attribute__((used))
index 514f59d..4c883f4 100644 (file)
@@ -6019,6 +6019,22 @@ finalization code.  If not defined, GCC will assume such a section does
 not exist.
 @end defmac
 
+@defmac INIT_ARRAY_SECTION_ASM_OP
+If defined, a C expression whose value is a string, including spacing,
+containing the assembler operation to identify the following data as
+part of the @code{.init_array} (or equivalent) section.  If not
+defined, GCC will assume such a section does not exist.  Do not define
+both this macro and @code{INIT_SECTION_ASM_OP}.
+@end defmac
+@defmac FINI_ARRAY_SECTION_ASM_OP
+If defined, a C expression whose value is a string, including spacing,
+containing the assembler operation to identify the following data as
+part of the @code{.fini_array} (or equivalent) section.  If not
+defined, GCC will assume such a section does not exist.  Do not define
+both this macro and @code{FINI_SECTION_ASM_OP}.
+@end defmac
+
 @defmac CRT_CALL_STATIC_FUNCTION (@var{section_op}, @var{function})
 If defined, an ASM statement that switches to a different section
 via @var{section_op}, calls @var{function}, and switches back to
index 5a1cf8b..a092d6c 100644 (file)
@@ -4035,11 +4035,12 @@ init_function_for_compilation (void)
   VARRAY_GROW (sibcall_epilogue, 0);
 }
 
-/* Expand a call to __main at the beginning of a possible main function.  */
-
-#if defined(INIT_SECTION_ASM_OP) && !defined(INVOKE__main)
-#undef HAS_INIT_SECTION
-#define HAS_INIT_SECTION
+/* Define IVOKE__main if we should emit a call to __main at the start
+   of "main".  */ 
+#if (!defined(INVOKE__main)                    \
+     && !defined(INIT_SECTION_ASM_OP)          \
+     && !defined(INIT_ARRAY_SECTION_ASM_OP))
+#define INVOKE__main
 #endif
 
 void
@@ -4081,7 +4082,7 @@ expand_main_function (void)
     }
 #endif
 
-#ifndef HAS_INIT_SECTION
+#if defined(INVOKE__main)
   emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode, 0);
 #endif
 }
index e1b2c45..fb1dce5 100644 (file)
@@ -1905,6 +1905,7 @@ TRANSFER_FROM_TRAMPOLINE
 #ifdef L__main
 
 #include "gbl-ctors.h"
+
 /* Some systems use __main in a way incompatible with its use in gcc, in these
    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
    give the same symbol without quotes for an alternative entry point.  You
@@ -1914,7 +1915,7 @@ TRANSFER_FROM_TRAMPOLINE
 #define SYMBOL__MAIN __main
 #endif
 
-#ifdef INIT_SECTION_ASM_OP
+#if defined (INIT_SECTION_ASM_OP) || defined (INIT_ARRAY_SECTION_ASM_OP)
 #undef HAS_INIT_SECTION
 #define HAS_INIT_SECTION
 #endif