This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [google/gcc-4_6_2-mobile] PATCH: PR other/46770: Replace .ctors/.dtors with .init_array/.fini_array on targets supporting them


Sorry -- I will fix it in google/gcc-4_6_2-mobile.

Thanks,
Jing

On Mon, Feb 20, 2012 at 7:15 AM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> Hello,
>
>> Hey, Jing, you broke the google/gcc-4_6 branch by checking the new
>> header file into the wrong directory.
>>
>> Fixed via r184386.
>>
>
> google/gcc-4_6_2-mobile branch still has the same problem. Could
> please someone fix it?
>
> Thanks
> Ilya
>
>> Ollie
>>
>> On Fri, Feb 17, 2012 at 10:25 PM, Jing Yu <jingyu@google.com> wrote:
>>>
>>> OK. Thanks for porting the patch.
>>> I will commit the patch into google/gcc-4_6_2-mobile for you.
>>>
>>> I would also like to commit it into google/gcc-4_6 branch if all tests
>>> pass. This patch is almost the same as Google Ref 47894.
>>>
>>> Thanks,
>>> Jing
>>>
>>> On Fri, Feb 17, 2012 at 5:20 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>>> > Hi,
>>> >
>>> > This patch backports the fix from trunk:
>>> >
>>> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
>>> >
>>> > for google/gcc-4_6_2-mobile branch. ?This is needed to support C++
>>> > global constructors/destructiors on Android/x86. ?OK for
>>> > google/gcc-4_6_2-mobile branch?
>>> >
>>> > Thanks.
>>> >
>>> > H.J.
>>> > ---
>>> > 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.
>>> >
>>> > git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177933 138bc75d-0d04-0410-961f-82ee72b054a4
>>> >
>>> > Conflicts:
>>> >
>>> > ? ? ? ?gcc/ChangeLog
>>> > ---
>>> > ?gcc/ChangeLog.hjl ? ? ? ? ? | ? 21 +++++++++++++++
>>> > ?gcc/config.gcc ? ? ? ? ? ? ?| ? ?5 +++
>>> > ?gcc/config/initfini-array.h | ? 37 +++++++++++++++++++++++++++
>>> > ?gcc/crtstuff.c ? ? ? ? ? ? ?| ? 11 +++++++-
>>> > ?gcc/output.h ? ? ? ? ? ? ? ?| ? ?2 +
>>> > ?gcc/varasm.c ? ? ? ? ? ? ? ?| ? 58 +++++++++++++++++++++++++++++++++++++++++++
>>> > ?6 files changed, 133 insertions(+), 1 deletions(-)
>>> > ?create mode 100644 gcc/ChangeLog.hjl
>>> > ?create mode 100644 gcc/config/initfini-array.h
>>> >
>>> > diff --git a/gcc/ChangeLog.hjl b/gcc/ChangeLog.hjl
>>> > new file mode 100644
>>> > index 0000000..3527b27
>>> > --- /dev/null
>>> > +++ b/gcc/ChangeLog.hjl
>>> > @@ -0,0 +1,21 @@
>>> > +2011-12-07 ?H.J. Lu ?<hongjiu.lu@intel.com>
>>> > +
>>> > + ? ? ? Backport from mainline
>>> > + ? ? ? 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.
>>> > diff --git a/gcc/config.gcc b/gcc/config.gcc
>>> > index d9ac0fa..b386424 100644
>>> > --- a/gcc/config.gcc
>>> > +++ b/gcc/config.gcc
>>> > @@ -3176,6 +3176,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
>>> > diff --git a/gcc/config/initfini-array.h b/gcc/config/initfini-array.h
>>> > new file mode 100644
>>> > index 0000000..8aaadf6
>>> > --- /dev/null
>>> > +++ b/gcc/config/initfini-array.h
>>> > @@ -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
>>> > diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
>>> > index b65f490..010d472 100644
>>> > --- a/gcc/crtstuff.c
>>> > +++ b/gcc/crtstuff.c
>>> > @@ -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;
>>> > diff --git a/gcc/output.h b/gcc/output.h
>>> > index 7031b08..661b623 100644
>>> > --- a/gcc/output.h
>>> > +++ b/gcc/output.h
>>> > @@ -655,6 +655,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);
>>> > diff --git a/gcc/varasm.c b/gcc/varasm.c
>>> > index 40a8567..d15c278 100644
>>> > --- a/gcc/varasm.c
>>> > +++ b/gcc/varasm.c
>>> > @@ -7397,4 +7397,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"
>>> > --
>>> > 1.7.6.5
>>> >


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]