Use .init_arrary/.fini_array sections if possible.

2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>

	PR other/46770
	* config.gcc (tm_file): Add initfini-array.h if
	.init_arrary/.fini_array are supported.

	* crtstuff.c: Don't generate .ctors nor .dtors sections if
	USE_INITFINI_ARRAY is defined.

	* output.h (default_elf_init_array_asm_out_constructor): New.
	(default_elf_fini_array_asm_out_destructor): Likewise.
	* varasm.c (elf_init_array_section): Likewise.
	(elf_fini_array_section): Likewise.
	(get_elf_initfini_array_priority_section): Likewise.
	(default_elf_init_array_asm_out_constructor): Likewise.
	(default_elf_fini_array_asm_out_destructor): Likewise.

	* config/initfini-array.h: New.

From-SVN: r177933
This commit is contained in:
H.J. Lu 2011-08-20 20:02:17 +00:00 committed by H.J. Lu
parent 13001f33ca
commit 9ce7ad7f3a
6 changed files with 131 additions and 1 deletions

View file

@ -1,3 +1,22 @@
2011-08-20 H.J. Lu <hongjiu.lu@intel.com>
PR other/46770
* config.gcc (tm_file): Add initfini-array.h if
.init_arrary/.fini_array are supported.
* crtstuff.c: Don't generate .ctors nor .dtors sections if
USE_INITFINI_ARRAY is defined.
* output.h (default_elf_init_array_asm_out_constructor): New.
(default_elf_fini_array_asm_out_destructor): Likewise.
* varasm.c (elf_init_array_section): Likewise.
(elf_fini_array_section): Likewise.
(get_elf_initfini_array_priority_section): Likewise.
(default_elf_init_array_asm_out_constructor): Likewise.
(default_elf_fini_array_asm_out_destructor): Likewise.
* config/initfini-array.h: New.
2011-08-20 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.c (mips_class_max_nregs): Check that the mode is

View file

@ -3058,6 +3058,11 @@ if test x$with_schedule = x; then
esac
fi
# Support --enable-initfini-array.
if test x$enable_initfini_array = xyes; then
tm_file="${tm_file} initfini-array.h"
fi
# Validate and mark as valid any --with options supported
# by this target. In order to use a particular --with option
# you must list it in supported_defaults; validating the value

View file

@ -0,0 +1,37 @@
/* Definitions for ELF systems with .init_array/.fini_array section
support.
Copyright (C) 2011
Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 3, or (at your
option) any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#define USE_INITFINI_ARRAY
#undef INIT_SECTION_ASM_OP
#undef FINI_SECTION_ASM_OP
#undef INIT_ARRAY_SECTION_ASM_OP
#define INIT_ARRAY_SECTION_ASM_OP
#undef FINI_ARRAY_SECTION_ASM_OP
#define FINI_ARRAY_SECTION_ASM_OP
/* Use .init_array/.fini_array section for constructors and destructors. */
#undef TARGET_ASM_CONSTRUCTOR
#define TARGET_ASM_CONSTRUCTOR default_elf_init_array_asm_out_constructor
#undef TARGET_ASM_DESTRUCTOR
#define TARGET_ASM_DESTRUCTOR default_elf_fini_array_asm_out_destructor

View file

@ -1,7 +1,8 @@
/* Specialized bits of code needed to support construction and
destruction of file-scope objects in C++ code.
Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@monkeys.com).
This file is part of GCC.
@ -189,6 +190,9 @@ typedef void (*func_ptr) (void);
refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
symbol in crtbegin.o, where they are defined. */
/* No need for .ctors/.dtors section if linker can place them in
.init_array/.fini_array section. */
#ifndef USE_INITFINI_ARRAY
/* The -1 is a flag to __do_global_[cd]tors indicating that this table
does not start with a count of elements. */
#ifdef CTOR_LIST_BEGIN
@ -219,6 +223,7 @@ STATIC func_ptr __DTOR_LIST__[1]
__attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
= { (func_ptr) (-1) };
#endif /* __DTOR_LIST__ alternatives */
#endif /* USE_INITFINI_ARRAY */
#ifdef USE_EH_FRAME_REGISTRY
/* Stick a label at the beginning of the frame unwind info so we can register
@ -489,6 +494,9 @@ __do_global_ctors_1(void)
#elif defined(CRT_END) /* ! CRT_BEGIN */
/* No need for .ctors/.dtors section if linker can place them in
.init_array/.fini_array section. */
#ifndef USE_INITFINI_ARRAY
/* Put a word containing zero at the end of each of our two lists of function
addresses. Note that the words defined here go into the .ctors and .dtors
sections of the crtend.o file, and since that file is always linked in
@ -534,6 +542,7 @@ STATIC func_ptr __DTOR_END__[1]
__attribute__((used, section(".dtors"), aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#endif
#endif /* USE_INITFINI_ARRAY */
#ifdef EH_FRAME_SECTION_NAME
/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;

View file

@ -654,6 +654,8 @@ extern void file_end_indicate_split_stack (void);
extern void default_elf_asm_output_external (FILE *file, tree,
const char *);
extern void default_elf_init_array_asm_out_constructor (rtx, int);
extern void default_elf_fini_array_asm_out_destructor (rtx, int);
extern int maybe_assemble_visibility (tree);
extern int default_address_cost (rtx, bool);

View file

@ -7352,4 +7352,62 @@ make_debug_expr_from_rtl (const_rtx exp)
return dval;
}
static GTY(()) section *elf_init_array_section;
static GTY(()) section *elf_fini_array_section;
static section *
get_elf_initfini_array_priority_section (int priority,
bool constructor_p)
{
section *sec;
if (priority != DEFAULT_INIT_PRIORITY)
{
char buf[18];
sprintf (buf, "%s.%.5u",
constructor_p ? ".init_array" : ".fini_array",
priority);
sec = get_section (buf, SECTION_WRITE, NULL_TREE);
}
else
{
if (constructor_p)
{
if (elf_init_array_section == NULL)
elf_init_array_section
= get_unnamed_section (0, output_section_asm_op,
"\t.section\t.init_array");
sec = elf_init_array_section;
}
else
{
if (elf_fini_array_section == NULL)
elf_fini_array_section
= get_unnamed_section (0, output_section_asm_op,
"\t.section\t.fini_array");
sec = elf_fini_array_section;
}
}
return sec;
}
/* Use .init_array section for constructors. */
void
default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
{
section *sec = get_elf_initfini_array_priority_section (priority,
true);
assemble_addr_to_section (symbol, sec);
}
/* Use .fini_array section for destructors. */
void
default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
{
section *sec = get_elf_initfini_array_priority_section (priority,
false);
assemble_addr_to_section (symbol, sec);
}
#include "gt-varasm.h"