This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
struct bfd_link_info
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Date: Fri, 20 Dec 2002 09:41:20 +1030
- Subject: 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