From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30787 invoked by alias); 15 Jul 2011 02:38:22 -0000 Received: (qmail 30775 invoked by uid 22791); 15 Jul 2011 02:38:19 -0000 X-SWARE-Spam-Status: No, hits=-2.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-yx0-f169.google.com (HELO mail-yx0-f169.google.com) (209.85.213.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 15 Jul 2011 02:38:03 +0000 Received: by yxj17 with SMTP id 17so425668yxj.0 for ; Thu, 14 Jul 2011 19:38:02 -0700 (PDT) Received: by 10.236.136.232 with SMTP id w68mr381376yhi.103.1310697481957; Thu, 14 Jul 2011 19:38:01 -0700 (PDT) Received: from bubble.grove.modra.org ([115.187.252.19]) by mx.google.com with ESMTPS id v25sm779216yhk.36.2011.07.14.19.37.58 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 14 Jul 2011 19:38:00 -0700 (PDT) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id 21498175A005; Fri, 15 Jul 2011 12:07:54 +0930 (CST) Date: Fri, 15 Jul 2011 09:22:00 -0000 From: Alan Modra To: binutils@sourceware.org Subject: Use ENUM_BITFIELD in struct bfd_link_info Message-ID: <20110715023754.GC26365@bubble.grove.modra.org> Mail-Followup-To: binutils@sourceware.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) X-IsSubscribed: yes Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2011-07/txt/msg00162.txt.bz2 This makes use of ENUM_BITFIELD in struct bfd_link_info, and reorders some of the bitfields. I wouldn't normally bother compacting a struct that only has one instance, but this one is "hot"; Reducing cache footprint might help performance. I reordered bitfields so that most commonly accessed fields come first (static analysis of our source tree, but fields accessed per symbol weighted much higher than fields accessed per file). include/ * bfdlink.h (struct bfd_link_info): Use ENUM_BITFIELD for strip, discard, common_skip_ar_symbols, unresolved_syms_in_objects, and unresolved_syms_in_shared_libs fields. Move emit_note_gnu_build_id out of bitfields. Reorder bitfields. bfd/ * configure.in: Bump version. * configure: Regenerate. Index: bfd/configure.in =================================================================== RCS file: /cvs/src/src/bfd/configure.in,v retrieving revision 1.298 diff -u -p -r1.298 configure.in --- bfd/configure.in 14 Jun 2011 05:09:51 -0000 1.298 +++ bfd/configure.in 15 Jul 2011 02:04:41 -0000 @@ -8,7 +8,7 @@ AC_CONFIG_SRCDIR([libbfd.c]) AC_CANONICAL_TARGET AC_ISC_POSIX -AM_INIT_AUTOMAKE(bfd, 2.21.52) +AM_INIT_AUTOMAKE(bfd, 2.21.53) dnl These must be called before LT_INIT, because it may want dnl to call AC_CHECK_PROG. Index: include/bfdlink.h =================================================================== RCS file: /cvs/src/src/include/bfdlink.h,v retrieving revision 1.90 diff -u -p -r1.90 bfdlink.h --- include/bfdlink.h 11 Jul 2011 15:03:08 -0000 1.90 +++ include/bfdlink.h 15 Jul 2011 02:04:41 -0000 @@ -251,110 +251,91 @@ struct bfd_elf_dynamic_list; struct bfd_link_info { - /* TRUE if BFD should generate a relocatable object file. */ - unsigned int relocatable: 1; + /* TRUE if BFD should generate a shared object (or a pie). */ + unsigned int shared: 1; - /* TRUE if BFD should generate relocation information in the final - executable. */ - unsigned int emitrelocations: 1; + /* TRUE if generating an executable, position independent or not. */ + unsigned int executable : 1; - /* TRUE if BFD should generate a "task linked" object file, - similar to relocatable but also with globals converted to - statics. */ - unsigned int task_link: 1; + /* TRUE if generating a position independent executable. */ + unsigned int pie: 1; - /* TRUE if BFD should generate a shared object. */ - unsigned int shared: 1; + /* TRUE if BFD should generate a relocatable object file. */ + unsigned int relocatable: 1; /* TRUE if BFD should pre-bind symbols in a shared object. */ unsigned int symbolic: 1; + /* TRUE if executable should not contain copy relocs. + Setting this true may result in a non-sharable text segment. */ + unsigned int nocopyreloc: 1; + /* TRUE if BFD should export all symbols in the dynamic symbol table of an executable, rather than only those used. */ unsigned int export_dynamic: 1; - /* TRUE if shared objects should be linked directly, not shared. */ - unsigned int static_link: 1; - - /* TRUE if the output file should be in a traditional format. This - is equivalent to the setting of the BFD_TRADITIONAL_FORMAT flag - on the output file, but may be checked when reading the input - files. */ - unsigned int traditional_format: 1; - - /* TRUE if we want to produced optimized output files. This might - need much more time and therefore must be explicitly selected. */ - unsigned int optimize: 1; - - /* TRUE if ok to have multiple definition. */ - unsigned int allow_multiple_definition: 1; - - /* TRUE if ok to have version with no definition. */ - unsigned int allow_undefined_version: 1; - /* TRUE if a default symbol version should be created and used for exported symbols. */ unsigned int create_default_symver: 1; - /* TRUE if a default symbol version should be created and used for - imported symbols. */ - unsigned int default_imported_symver: 1; - - /* TRUE if symbols should be retained in memory, FALSE if they - should be freed and reread. */ - unsigned int keep_memory: 1; + /* TRUE if unreferenced sections should be removed. */ + unsigned int gc_sections: 1; /* TRUE if every symbol should be reported back via the notice callback. */ unsigned int notice_all: 1; - /* TRUE if executable should not contain copy relocs. - Setting this true may result in a non-sharable text segment. */ - unsigned int nocopyreloc: 1; + /* TRUE if we are loading LTO outputs. */ + unsigned int loading_lto_outputs: 1; - /* TRUE if the new ELF dynamic tags are enabled. */ - unsigned int new_dtags: 1; + /* TRUE if global symbols in discarded sections should be stripped. */ + unsigned int strip_discarded: 1; - /* TRUE if non-PLT relocs should be merged into one reloc section - and sorted so that relocs against the same symbol come together. */ - unsigned int combreloc: 1; + /* TRUE if all data symbols should be dynamic. */ + unsigned int dynamic_data: 1; - /* TRUE if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment - should be created. */ - unsigned int eh_frame_hdr: 1; + /* Which symbols to strip. */ + ENUM_BITFIELD (bfd_link_strip) strip : 2; - /* TRUE if global symbols in discarded sections should be stripped. */ - unsigned int strip_discarded: 1; + /* Which local symbols to discard. */ + ENUM_BITFIELD (bfd_link_discard) discard : 2; - /* TRUE if generating a position independent executable. */ - unsigned int pie: 1; + /* Criteria for skipping symbols when determining + whether to include an object from an archive. */ + ENUM_BITFIELD (bfd_link_common_skip_ar_symbols) common_skip_ar_symbols : 2; - /* TRUE if generating an executable, position independent or not. */ - unsigned int executable : 1; + /* What to do with unresolved symbols in an object file. + When producing executables the default is GENERATE_ERROR. + When producing shared libraries the default is IGNORE. The + assumption with shared libraries is that the reference will be + resolved at load/execution time. */ + ENUM_BITFIELD (report_method) unresolved_syms_in_objects : 2; - /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W|PF_X - flags. */ - unsigned int execstack: 1; + /* What to do with unresolved symbols in a shared library. + The same defaults apply. */ + ENUM_BITFIELD (report_method) unresolved_syms_in_shared_libs : 2; - /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W - flags. */ - unsigned int noexecstack: 1; + /* TRUE if shared objects should be linked directly, not shared. */ + unsigned int static_link: 1; + + /* TRUE if symbols should be retained in memory, FALSE if they + should be freed and reread. */ + unsigned int keep_memory: 1; + + /* TRUE if BFD should generate relocation information in the final + executable. */ + unsigned int emitrelocations: 1; /* TRUE if PT_GNU_RELRO segment should be created. */ unsigned int relro: 1; + /* TRUE if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment + should be created. */ + unsigned int eh_frame_hdr: 1; + /* TRUE if we should warn when adding a DT_TEXTREL to a shared object. */ unsigned int warn_shared_textrel: 1; - /* TRUE if we should warn alternate ELF machine code. */ - unsigned int warn_alternate_em: 1; - - /* TRUE if unreferenced sections should be removed. */ - unsigned int gc_sections: 1; - - /* TRUE if user shoudl be informed of removed unreferenced sections. */ - unsigned int print_gc_sections: 1; - /* TRUE if .hash section should be created. */ unsigned int emit_hash: 1; @@ -366,43 +347,59 @@ struct bfd_link_info caching ELF symbol buffer. */ unsigned int reduce_memory_overheads: 1; - /* TRUE if all data symbols should be dynamic. */ - unsigned int dynamic_data: 1; + /* TRUE if the output file should be in a traditional format. This + is equivalent to the setting of the BFD_TRADITIONAL_FORMAT flag + on the output file, but may be checked when reading the input + files. */ + unsigned int traditional_format: 1; - /* TRUE if some symbols have to be dynamic, controlled by - --dynamic-list command line options. */ - unsigned int dynamic: 1; + /* TRUE if non-PLT relocs should be merged into one reloc section + and sorted so that relocs against the same symbol come together. */ + unsigned int combreloc: 1; + + /* TRUE if a default symbol version should be created and used for + imported symbols. */ + unsigned int default_imported_symver: 1; + + /* TRUE if the new ELF dynamic tags are enabled. */ + unsigned int new_dtags: 1; /* FALSE if .eh_frame unwind info should be generated for PLT and other linker created sections, TRUE if it should be omitted. */ unsigned int no_ld_generated_unwind_info: 1; - /* TRUE if we are loading LTO outputs. */ - unsigned int loading_lto_outputs: 1; + /* TRUE if BFD should generate a "task linked" object file, + similar to relocatable but also with globals converted to + statics. */ + unsigned int task_link: 1; - /* Non-NULL if .note.gnu.build-id section should be created. */ - char *emit_note_gnu_build_id; + /* TRUE if ok to have multiple definition. */ + unsigned int allow_multiple_definition: 1; - /* What to do with unresolved symbols in an object file. - When producing executables the default is GENERATE_ERROR. - When producing shared libraries the default is IGNORE. The - assumption with shared libraries is that the reference will be - resolved at load/execution time. */ - enum report_method unresolved_syms_in_objects; + /* TRUE if ok to have version with no definition. */ + unsigned int allow_undefined_version: 1; - /* What to do with unresolved symbols in a shared library. - The same defaults apply. */ - enum report_method unresolved_syms_in_shared_libs; + /* TRUE if some symbols have to be dynamic, controlled by + --dynamic-list command line options. */ + unsigned int dynamic: 1; - /* Which symbols to strip. */ - enum bfd_link_strip strip; + /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W|PF_X + flags. */ + unsigned int execstack: 1; - /* Which local symbols to discard. */ - enum bfd_link_discard discard; + /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W + flags. */ + unsigned int noexecstack: 1; - /* Criteria for skipping symbols when determining - whether to include an object from an archive. */ - enum bfd_link_common_skip_ar_symbols common_skip_ar_symbols; + /* TRUE if we want to produced optimized output files. This might + need much more time and therefore must be explicitly selected. */ + unsigned int optimize: 1; + + /* TRUE if user should be informed of removed unreferenced sections. */ + unsigned int print_gc_sections: 1; + + /* TRUE if we should warn alternate ELF machine code. */ + unsigned int warn_alternate_em: 1; /* Char that may appear as the first char of a symbol, but should be skipped (like symbol_leading_char) when looking up symbols in @@ -439,6 +436,9 @@ struct bfd_link_info bfd *input_bfds; bfd **input_bfds_tail; + /* Non-NULL if .note.gnu.build-id section should be created. */ + char *emit_note_gnu_build_id; + /* If a symbol should be created for each input BFD, this is section where those symbols should be placed. It must be a section in the output BFD. It may be NULL, in which case no such symbols -- Alan Modra Australia Development Lab, IBM