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:
parent
aa9dcfc4a4
commit
7abc66b142
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user