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 <jin...@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...@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...@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...@intel.com>
>> > +
>> > +       Backport from mainline
>> > +       2011-08-20  H.J. Lu  <hongjiu...@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 (r...@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
>> >

Reply via email to