aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-08-29 15:52:45 +0930
committerAlan Modra <amodra@gmail.com>2017-08-29 21:29:37 +0930
commit34ca2bd7ace5e208d46fea6e7a56a5376de0abfe (patch)
treee94fa309fc1b405d885c17c8d230d243334f50b0 /gold/symtab.h
parentAutomatic date update in version.in (diff)
downloadbinutils-gdb-34ca2bd7ace5e208d46fea6e7a56a5376de0abfe.tar.gz
binutils-gdb-34ca2bd7ace5e208d46fea6e7a56a5376de0abfe.tar.bz2
binutils-gdb-34ca2bd7ace5e208d46fea6e7a56a5376de0abfe.zip
[GOLD] Reduce size of class Symbol
On 64-bit targets there is a 32-bit hole in symbol->u_, and another due to symbol flags exceeding 32 bits. By splitting the union, the total size of the class reduces by one 64-bit word. * symtab.h (Symbol): Split u_ into u1_ and u2_. Adjust accessors to suit. Move plt_offset_ before got_offsets_. * symtab.cc (Symbol::init_fields): Adjust for union change. (Symbol::init_base_output_data): Likewise. (Symbol::init_base_output_segment): Likewise. (Symbol::allocate_base_common): Likewise. (Symbol::output_section): Likewise. (Symbol::set_output_section): Likewise. (Symbol::set_output_segment): Likewise. * resolve.cc (Symbol::override_base): Likewise. (Symbol::override_base_with_special): Likewise.
Diffstat (limited to 'gold/symtab.h')
-rw-r--r--gold/symtab.h88
1 files changed, 44 insertions, 44 deletions
diff --git a/gold/symtab.h b/gold/symtab.h
index c371731b5eb..88d6c2782ba 100644
--- a/gold/symtab.h
+++ b/gold/symtab.h
@@ -159,7 +159,7 @@ class Symbol
object() const
{
gold_assert(this->source_ == FROM_OBJECT);
- return this->u_.from_object.object;
+ return this->u1_.object;
}
// Return the index of the section in the input relocatable or
@@ -169,7 +169,7 @@ class Symbol
{
gold_assert(this->source_ == FROM_OBJECT);
*is_ordinary = this->is_ordinary_shndx_;
- return this->u_.from_object.shndx;
+ return this->u2_.shndx;
}
// Return the output data section with which this symbol is
@@ -179,7 +179,7 @@ class Symbol
output_data() const
{
gold_assert(this->source_ == IN_OUTPUT_DATA);
- return this->u_.in_output_data.output_data;
+ return this->u1_.output_data;
}
// If this symbol was defined with respect to an output data
@@ -188,7 +188,7 @@ class Symbol
offset_is_from_end() const
{
gold_assert(this->source_ == IN_OUTPUT_DATA);
- return this->u_.in_output_data.offset_is_from_end;
+ return this->u2_.offset_is_from_end;
}
// Return the output segment with which this symbol is associated,
@@ -198,7 +198,7 @@ class Symbol
output_segment() const
{
gold_assert(this->source_ == IN_OUTPUT_SEGMENT);
- return this->u_.in_output_segment.output_segment;
+ return this->u1_.output_segment;
}
// If this symbol was defined with respect to an output segment,
@@ -207,7 +207,7 @@ class Symbol
offset_base() const
{
gold_assert(this->source_ == IN_OUTPUT_SEGMENT);
- return this->u_.in_output_segment.offset_base;
+ return this->u2_.offset_base;
}
// Return the symbol binding.
@@ -973,38 +973,38 @@ class Symbol
union
{
- // This struct is used if SOURCE_ == FROM_OBJECT.
- struct
- {
- // Object in which symbol is defined, or in which it was first
- // seen.
- Object* object;
- // Section number in object_ in which symbol is defined.
- unsigned int shndx;
- } from_object;
-
- // This struct is used if SOURCE_ == IN_OUTPUT_DATA.
- struct
- {
- // Output_data in which symbol is defined. Before
- // Layout::finalize the symbol's value is an offset within the
- // Output_data.
- Output_data* output_data;
- // True if the offset is from the end, false if the offset is
- // from the beginning.
- bool offset_is_from_end;
- } in_output_data;
-
- // This struct is used if SOURCE_ == IN_OUTPUT_SEGMENT.
- struct
- {
- // Output_segment in which the symbol is defined. Before
- // Layout::finalize the symbol's value is an offset.
- Output_segment* output_segment;
- // The base to use for the offset before Layout::finalize.
- Segment_offset_base offset_base;
- } in_output_segment;
- } u_;
+ // This is used if SOURCE_ == FROM_OBJECT.
+ // Object in which symbol is defined, or in which it was first
+ // seen.
+ Object* object;
+
+ // This is used if SOURCE_ == IN_OUTPUT_DATA.
+ // Output_data in which symbol is defined. Before
+ // Layout::finalize the symbol's value is an offset within the
+ // Output_data.
+ Output_data* output_data;
+
+ // This is used if SOURCE_ == IN_OUTPUT_SEGMENT.
+ // Output_segment in which the symbol is defined. Before
+ // Layout::finalize the symbol's value is an offset.
+ Output_segment* output_segment;
+ } u1_;
+
+ union
+ {
+ // This is used if SOURCE_ == FROM_OBJECT.
+ // Section number in object in which symbol is defined.
+ unsigned int shndx;
+
+ // This is used if SOURCE_ == IN_OUTPUT_DATA.
+ // True if the offset is from the end, false if the offset is
+ // from the beginning.
+ bool offset_is_from_end;
+
+ // This is used if SOURCE_ == IN_OUTPUT_SEGMENT.
+ // The base to use for the offset before Layout::finalize.
+ Segment_offset_base offset_base;
+ } u2_;
// The index of this symbol in the output file. If the symbol is
// not going into the output file, this value is -1U. This field
@@ -1018,16 +1018,16 @@ class Symbol
// non-zero value during Layout::finalize.
unsigned int dynsym_index_;
- // The GOT section entries for this symbol. A symbol may have more
- // than one GOT offset (e.g., when mixing modules compiled with two
- // different TLS models), but will usually have at most one.
- Got_offset_list got_offsets_;
-
// If this symbol has an entry in the PLT section, then this is the
// offset from the start of the PLT section. This is -1U if there
// is no PLT entry.
unsigned int plt_offset_;
+ // The GOT section entries for this symbol. A symbol may have more
+ // than one GOT offset (e.g., when mixing modules compiled with two
+ // different TLS models), but will usually have at most one.
+ Got_offset_list got_offsets_;
+
// Symbol type (bits 0 to 3).
elfcpp::STT type_ : 4;
// Symbol binding (bits 4 to 7).
@@ -1069,7 +1069,7 @@ class Symbol
// True if this symbol was forced to local visibility by a version
// script (bit 28).
bool is_forced_local_ : 1;
- // True if the field u_.from_object.shndx is an ordinary section
+ // True if the field u2_.shndx is an ordinary section
// index, not one of the special codes from SHN_LORESERVE to
// SHN_HIRESERVE (bit 29).
bool is_ordinary_shndx_ : 1;