From patchwork Tue Dec 7 16:57:38 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 74582 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 241FDB6EF2 for ; Wed, 8 Dec 2010 03:57:52 +1100 (EST) Received: (qmail 10073 invoked by alias); 7 Dec 2010 16:57:49 -0000 Received: (qmail 10060 invoked by uid 22791); 7 Dec 2010 16:57:46 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, TW_GM, TW_PM X-Spam-Check-By: sourceware.org Received: from mail-qy0-f182.google.com (HELO mail-qy0-f182.google.com) (209.85.216.182) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 07 Dec 2010 16:57:40 +0000 Received: by qyk36 with SMTP id 36so121355qyk.20 for ; Tue, 07 Dec 2010 08:57:38 -0800 (PST) MIME-Version: 1.0 Received: by 10.229.222.13 with SMTP id ie13mr5781825qcb.283.1291741058581; Tue, 07 Dec 2010 08:57:38 -0800 (PST) Received: by 10.220.61.13 with HTTP; Tue, 7 Dec 2010 08:57:38 -0800 (PST) In-Reply-To: References: <20101207155451.GA25694@intel.com> Date: Tue, 7 Dec 2010 08:57:38 -0800 Message-ID: Subject: Re: PATCH: PR target/46770: Use .init_array/.fini_array sections From: "H.J. Lu" To: "Joseph S. Myers" Cc: gcc-patches@gcc.gnu.org, Uros Bizjak X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Tue, Dec 7, 2010 at 8:31 AM, Joseph S. Myers wrote: > On Tue, 7 Dec 2010, H.J. Lu wrote: > >> @@ -2698,6 +2698,7 @@ esac >>  case ${target} in >>  i[34567]86-*-linux* | x86_64-*-linux*) >>       tmake_file="${tmake_file} i386/t-pmm_malloc i386/t-i386" >> +     use_initfini_array=yes > > Please update the comment at the top of config.gcc listing the variables > it sets, and put a default (empty or "no") setting of this variable along > with the other defaults as well. Done. >> +#include "tree.h" > > What is tree.h needed for here? DEFAULT_INIT_PRIORITY is defined in tree.h. >> +     $(TREE_H) $(GCC_H) > > I think you mean $(GGC_H) not $(GCC_H) (which is gcc.h, the header for the > driver). > Fixed. Here is the updated patch. OK for trunk? Thanks. diff --git a/gcc/config.gcc b/gcc/config.gcc index dfbf2c5..917c1ce 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -177,6 +177,9 @@ # configure_default_options # Set to an initializer for configure_default_options # in configargs.h, based on --with-cpu et cetera. +# +# use_initfini_array If set to yes, .init_array/.fini_array sections +# will be used if they work. # The following variables are used in each case-construct to build up the # outgoing variables: @@ -219,6 +222,7 @@ default_gnu_indirect_function=no target_gtfiles= need_64bit_hwint= need_64bit_isa= +use_initfini_array= # Don't carry these over build->host->target. Please. xm_file= @@ -2698,6 +2702,7 @@ esac case ${target} in i[34567]86-*-linux* | x86_64-*-linux*) tmake_file="${tmake_file} i386/t-pmm_malloc i386/t-i386" + use_initfini_array=yes ;; i[34567]86-*-* | x86_64-*-*) tmake_file="${tmake_file} i386/t-gmm_malloc i386/t-i386" @@ -3050,6 +3055,16 @@ if test x$with_schedule = x; then esac fi +# Support --enable-initfini-array. Use initfini-array.h only if +# use_initfini_array is also set to yes. Some platforms don't need it +# even if enable_initfini_array is yes. +if test x$enable_initfini_array$use_initfini_array = xyesyes; then + tm_file="${tm_file} initfini-array.h" + tmake_file="${tmake_file} t-initfini-array" + extra_objs="$extra_objs initfini-array.o" + target_gtfiles="$target_gtfiles \$(srcdir)/config/initfini-array.c" +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.c b/gcc/config/initfini-array.c new file mode 100644 index 0000000..d5fd40f --- /dev/null +++ b/gcc/config/initfini-array.c @@ -0,0 +1,79 @@ +/* Definitions for ELF systems with .init_array/.fini_array section + Copyright (C) 2010 + 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 +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "target.h" +#include "output.h" +#include "tree.h" +#include "ggc.h" + +static GTY(()) section *init_array_section; +static GTY(()) section *fini_array_section; + +void +elf_initfini_array_init_sections (void) +{ + init_array_section = get_unnamed_section (0, output_section_asm_op, + "\t.section\t.init_array"); + fini_array_section = get_unnamed_section (0, output_section_asm_op, + "\t.section\t.fini_array"); +} + +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 + sec = constructor_p ? init_array_section : fini_array_section; + return sec; +} + +/* Use .init_array section for constructors. */ + +void +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 +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-initfini-array.h" diff --git a/gcc/config/initfini-array.h b/gcc/config/initfini-array.h new file mode 100644 index 0000000..115996e --- /dev/null +++ b/gcc/config/initfini-array.h @@ -0,0 +1,33 @@ +/* Definitions for ELF systems with .init_array/.fini_array section + support. + Copyright (C) 2010 + 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 + . */ + +#ifndef TARGET_ASM_INIT_SECTIONS +#define TARGET_ASM_INIT_SECTIONS elf_initfini_array_init_sections +#endif +extern void elf_initfini_array_init_sections (void); + +/* Use .init_array/.fini_array section for constructors and destructors. */ +#undef TARGET_ASM_CONSTRUCTOR +#define TARGET_ASM_CONSTRUCTOR elf_init_array_asm_out_constructor +#undef TARGET_ASM_DESTRUCTOR +#define TARGET_ASM_DESTRUCTOR elf_fini_array_asm_out_destructor +extern void elf_init_array_asm_out_constructor (rtx, int); +extern void elf_fini_array_asm_out_destructor (rtx, int); diff --git a/gcc/config/t-initfini-array b/gcc/config/t-initfini-array new file mode 100644 index 0000000..3dcb25d --- /dev/null +++ b/gcc/config/t-initfini-array @@ -0,0 +1,23 @@ +# Copyright (C) 2010 +# 2009 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 +# . + +initfini-array.o: $(srcdir)/config/initfini-array.c gt-initfini-array.h \ + $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TARGET_H) output.h \ + $(TREE_H) $(GGC_H) + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<