summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-29 14:09:45 +0000
committerjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-29 14:09:45 +0000
commitd24bc14583aaf3a0edb93267bffb5b240252d87c (patch)
treea069a1c7e66dac7e1d042f7a22530125e2918422
parentc828481ae6866cf54f3fe408e82e81d93c38b6d6 (diff)
downloadgcc-d24bc14583aaf3a0edb93267bffb5b240252d87c.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98986 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog26
-rw-r--r--gcc/config/arm/arm.c23
-rw-r--r--gcc/config/arm/arm.h42
-rw-r--r--gcc/config/arm/bpabi.h7
-rw-r--r--gcc/config/arm/elf.h7
-rw-r--r--gcc/crtstuff.c29
-rw-r--r--gcc/doc/tm.texi16
-rw-r--r--gcc/function.c13
-rw-r--r--gcc/libgcc2.c3
9 files changed, 155 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 46ca9ff2ca5..5d30e2c5b0f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index da3b74fc77b..6c0b896ec23 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -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
/* A finite state machine takes care of noticing whether or not instructions
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index b79e02861b5..4f0eeec6138 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -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
diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
index 6fb11b9838c..037b26de145 100644
--- a/gcc/config/arm/bpabi.h
+++ b/gcc/config/arm/bpabi.h
@@ -100,3 +100,10 @@
#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
diff --git a/gcc/config/arm/elf.h b/gcc/config/arm/elf.h
index a6c6102d088..9a48a9b30e2 100644
--- a/gcc/config/arm/elf.h
+++ b/gcc/config/arm/elf.h
@@ -120,6 +120,10 @@
#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
+/* 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
@@ -143,4 +147,5 @@
} \
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)
diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
index 0e362f3a91f..6fd365577b9 100644
--- a/gcc/crtstuff.c
+++ b/gcc/crtstuff.c
@@ -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))
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 514f59d5bbe..4c883f43384 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -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
diff --git a/gcc/function.c b/gcc/function.c
index 5a1cf8b36c1..a092d6c62e0 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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
}
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index e1b2c45af2d..fb1dce548ec 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -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