This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils 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]

struct bfd_link_info


The aim of this patch is to reduce cache footprint of a frequently
accessed structure.  The change happens to reduce code size on
x86 too, no doubt because tests on two or more flags can be
combined.

include/ChangeLog
	* bfdlink.h (struct bfd_link_info): Replace bfd_boolean fields with
	bit-fields.  Rearrange to put all like types together.

ld/ChangeLog
	* ldmain.c (main): Re-order link_info initialization.  Init all
	fields.

Index: include/bfdlink.h
===================================================================
RCS file: /cvs/src/src/include/bfdlink.h,v
retrieving revision 1.24
diff -u -p -r1.24 bfdlink.h
--- include/bfdlink.h	30 Nov 2002 08:39:44 -0000	1.24
+++ include/bfdlink.h	16 Dec 2002 09:41:48 -0000
@@ -203,47 +203,44 @@ struct bfd_sym_chain
 
 struct bfd_link_info
 {
-  /* Function callbacks.  */
-  const struct bfd_link_callbacks *callbacks;
-
-  /* TRUE if BFD should generate a relocateable object file.  */
-  bfd_boolean relocateable;
+  /* TRUE if BFD should generate a relocatable object file.  */
+  unsigned int relocateable: 1;
 
   /* TRUE if BFD should generate relocation information in the final
      executable.  */
-  bfd_boolean emitrelocations;
+  unsigned int emitrelocations: 1;
 
   /* TRUE if BFD should generate a "task linked" object file,
      similar to relocatable but also with globals converted to
      statics.  */
-  bfd_boolean task_link;
+  unsigned int task_link: 1;
 
   /* TRUE if BFD should generate a shared object.  */
-  bfd_boolean shared;
+  unsigned int shared: 1;
 
   /* TRUE if BFD should pre-bind symbols in a shared object.  */
-  bfd_boolean symbolic;
+  unsigned int symbolic: 1;
 
   /* TRUE if BFD should export all symbols in the dynamic symbol table
      of an executable, rather than only those used.  */
-  bfd_boolean export_dynamic;
+  unsigned int export_dynamic: 1;
 
   /* TRUE if shared objects should be linked directly, not shared.  */
-  bfd_boolean static_link;
+  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.  */
-  bfd_boolean traditional_format;
+  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.  */
-  bfd_boolean optimize;
+  unsigned int optimize: 1;
 
   /* TRUE if BFD should generate errors for undefined symbols
      even if generating a shared object.  */
-  bfd_boolean no_undefined;
+  unsigned int no_undefined: 1;
 
   /* TRUE if BFD should allow undefined symbols in shared objects even
      when no_undefined is set to disallow undefined symbols.  The net
@@ -257,13 +254,36 @@ struct bfd_link_info
      appropriate for the current architecture.  I.E. dynamically
      select an appropriate memset function.  Apparently it is also
      normal for HPPA shared libraries to have undefined symbols.  */
-  bfd_boolean allow_shlib_undefined;
+  unsigned int allow_shlib_undefined: 1;
 
   /* TRUE if ok to have multiple definition.  */
-  bfd_boolean allow_multiple_definition;
+  unsigned int allow_multiple_definition: 1;
 
   /* TRUE if ok to have version with no definition.  */
-  bfd_boolean allow_undefined_version;
+  unsigned int allow_undefined_version: 1;
+
+  /* TRUE if symbols should be retained in memory, FALSE if they
+     should be freed and reread.  */
+  unsigned int keep_memory: 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 the new ELF dynamic tags are enabled. */
+  unsigned int new_dtags: 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 .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 bfd_link_strip strip;
@@ -271,24 +294,12 @@ struct bfd_link_info
   /* Which local symbols to discard.  */
   enum bfd_link_discard discard;
 
-  /* TRUE if symbols should be retained in memory, FALSE if they
-     should be freed and reread.  */
-  bfd_boolean keep_memory;
-
-  /* The list of input BFD's involved in the link.  These are chained
-     together via the link_next field.  */
-  bfd *input_bfds;
-
-  /* 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
-     will be created.  This is to support CREATE_OBJECT_SYMBOLS in the
-     linker command language.  */
-  asection *create_object_symbols_section;
+  /* Criteria for skipping symbols when detemining
+     whether to include an object from an archive. */
+  enum bfd_link_common_skip_ar_aymbols common_skip_ar_aymbols;
 
-  /* List of global symbol names that are starting points for marking
-     sections against garbage collection.  */
-  struct bfd_sym_chain *gc_sym_list;
+  /* Function callbacks.  */
+  const struct bfd_link_callbacks *callbacks;
 
   /* Hash table handled by BFD.  */
   struct bfd_link_hash_table *hash;
@@ -297,10 +308,6 @@ struct bfd_link_info
      strip_some.  */
   struct bfd_hash_table *keep_hash;
 
-  /* TRUE if every symbol should be reported back via the notice
-     callback.  */
-  bfd_boolean notice_all;
-
   /* Hash table of symbols to report back via the notice callback.  If
      this is NULL, and notice_all is FALSE, then no symbols are
      reported back.  */
@@ -310,14 +317,24 @@ struct bfd_link_info
      option).  If this is NULL, no symbols are being wrapped.  */
   struct bfd_hash_table *wrap_hash;
 
+  /* The list of input BFD's involved in the link.  These are chained
+     together via the link_next field.  */
+  bfd *input_bfds;
+
+  /* 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
+     will be created.  This is to support CREATE_OBJECT_SYMBOLS in the
+     linker command language.  */
+  asection *create_object_symbols_section;
+
+  /* List of global symbol names that are starting points for marking
+     sections against garbage collection.  */
+  struct bfd_sym_chain *gc_sym_list;
+
   /* If a base output file is wanted, then this points to it */
   PTR base_file;
 
-  /* If non-zero, specifies that branches which are problematic for the
-  MPC860 C0 (or earlier) should be checked for and modified.  It gives the
-  number of bytes that should be checked at the end of each text page. */
-  int mpc860c0;
-
   /* The function to call when the executable or shared object is
      loaded.  */
   const char *init_function;
@@ -326,14 +343,10 @@ struct bfd_link_info
      unloaded.  */
   const char *fini_function;
 
-  /* TRUE if the new ELF dynamic tags are enabled. */
-  bfd_boolean new_dtags;
-
-  /* May be used to set DT_FLAGS for ELF. */
-  bfd_vma flags;
-
-  /* May be used to set DT_FLAGS_1 for ELF. */
-  bfd_vma flags_1;
+  /* If non-zero, specifies that branches which are problematic for the
+     MPC860 C0 (or earlier) should be checked for and modified.  It gives the
+     number of bytes that should be checked at the end of each text page.  */
+  int mpc860c0;
 
   /* Non-zero if auto-import thunks for DATA items in pei386 DLLs
      should be generated/linked against.  Set to 1 if this feature
@@ -345,24 +358,14 @@ struct bfd_link_info
      is explicitly requested by the user, -1 if enabled by default.  */
   int pei386_runtime_pseudo_reloc;
 
-  /* TRUE if non-PLT relocs should be merged into one reloc section
-     and sorted so that relocs against the same symbol come together.  */
-  bfd_boolean combreloc;
-
-  /* TRUE if executable should not contain copy relocs.
-     Setting this true may result in a non-sharable text segment.  */
-  bfd_boolean nocopyreloc;
-
-  /* TRUE if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment
-     should be created.  */
-  bfd_boolean eh_frame_hdr;
-
   /* How many spare .dynamic DT_NULL entries should be added?  */
   unsigned int spare_dynamic_tags;
 
-  /* Criteria for skipping symbols when detemining
-     whether to include an object from an archive. */
-  enum bfd_link_common_skip_ar_aymbols common_skip_ar_aymbols;
+  /* May be used to set DT_FLAGS for ELF. */
+  bfd_vma flags;
+
+  /* May be used to set DT_FLAGS_1 for ELF. */
+  bfd_vma flags_1;
 };
 
 /* This structures holds a set of callback functions.  These are
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.54
diff -u -p -r1.54 ldmain.c
--- ld/ldmain.c	30 Nov 2002 08:39:45 -0000	1.54
+++ ld/ldmain.c	16 Dec 2002 09:41:53 -0000
@@ -228,9 +228,9 @@ main (argc, argv)
      interface by default.  */
   demangling = getenv ("COLLECT_NO_DEMANGLE") == NULL;
 
-  link_info.callbacks = &link_callbacks;
   link_info.relocateable = FALSE;
   link_info.emitrelocations = FALSE;
+  link_info.task_link = FALSE;
   link_info.shared = FALSE;
   link_info.symbolic = FALSE;
   link_info.export_dynamic = FALSE;
@@ -241,31 +241,34 @@ main (argc, argv)
   link_info.allow_shlib_undefined = FALSE;
   link_info.allow_multiple_definition = FALSE;
   link_info.allow_undefined_version = TRUE;
+  link_info.keep_memory = TRUE;
+  link_info.notice_all = FALSE;
+  link_info.nocopyreloc = FALSE;
+  link_info.new_dtags = FALSE;
+  link_info.combreloc = TRUE;
+  link_info.eh_frame_hdr = FALSE;
   link_info.strip = strip_none;
   link_info.discard = discard_sec_merge;
-  link_info.keep_memory = TRUE;
-  link_info.input_bfds = NULL;
-  link_info.create_object_symbols_section = NULL;
-  link_info.gc_sym_list = NULL;
+  link_info.common_skip_ar_aymbols = bfd_link_common_skip_none;
+  link_info.callbacks = &link_callbacks;
   link_info.hash = NULL;
   link_info.keep_hash = NULL;
-  link_info.notice_all = FALSE;
   link_info.notice_hash = NULL;
   link_info.wrap_hash = NULL;
-  link_info.mpc860c0 = 0;
+  link_info.input_bfds = NULL;
+  link_info.create_object_symbols_section = NULL;
+  link_info.gc_sym_list = NULL;
+  link_info.base_file = NULL;
   /* SVR4 linkers seem to set DT_INIT and DT_FINI based on magic _init
      and _fini symbols.  We are compatible.  */
   link_info.init_function = "_init";
   link_info.fini_function = "_fini";
-  link_info.new_dtags = FALSE;
-  link_info.eh_frame_hdr = FALSE;
-  link_info.flags = (bfd_vma) 0;
-  link_info.flags_1 = (bfd_vma) 0;
+  link_info.mpc860c0 = 0;
   link_info.pei386_auto_import = -1;
   link_info.pei386_runtime_pseudo_reloc = FALSE;
-  link_info.combreloc = TRUE;
   link_info.spare_dynamic_tags = 5;
-  link_info.common_skip_ar_aymbols = bfd_link_common_skip_none;
+  link_info.flags = (bfd_vma) 0;
+  link_info.flags_1 = (bfd_vma) 0;
 
   ldfile_add_arch ("");
 

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


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