Use ENUM_BITFIELD in struct bfd_link_info

Alan Modra amodra@gmail.com
Fri Jul 15 09:22:00 GMT 2011


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



More information about the Binutils mailing list