crtstuff.c: Handle targets that use .init_array.

* 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.

Co-Authored-By: Mark Mitchell <mark@codesourcery.com>
Co-Authored-By: Paul Brook <paul@codesourcery.com>

From-SVN: r98986
This commit is contained in:
Julian Brown 2005-04-29 14:09:45 +00:00 committed by Julian Brown
parent aa9dcfc4a4
commit 7abc66b142
9 changed files with 155 additions and 11 deletions

View 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

View 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
/* A finite state machine takes care of noticing whether or not instructions

View 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

View File

@ -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

View File

@ -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)

View 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))

View 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

View 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
}

View 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