diff options
author | Alan Modra <amodra@gmail.com> | 2017-08-29 15:52:45 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-08-29 21:29:37 +0930 |
commit | 34ca2bd7ace5e208d46fea6e7a56a5376de0abfe (patch) | |
tree | e94fa309fc1b405d885c17c8d230d243334f50b0 /gold/symtab.h | |
parent | f2d394fce1f37a07148719c4bc919ca7b7a0b025 (diff) | |
download | gdb-34ca2bd7ace5e208d46fea6e7a56a5376de0abfe.zip gdb-34ca2bd7ace5e208d46fea6e7a56a5376de0abfe.tar.gz gdb-34ca2bd7ace5e208d46fea6e7a56a5376de0abfe.tar.bz2 |
[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.h | 88 |
1 files changed, 44 insertions, 44 deletions
diff --git a/gold/symtab.h b/gold/symtab.h index c371731..88d6c27 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; |