diff options
author | Ian Lance Taylor <ian@airs.com> | 2009-06-22 06:51:53 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2009-06-22 06:51:53 +0000 |
commit | 8a5e3e08a6faa0fdba3daa1fa4295b02c7ebe1eb (patch) | |
tree | 01736b6b47e8048239544872455cc12eb3d5bcc6 /gold/output.h | |
parent | 1998a8e0333f8ebc40a5387532d74f90f510591d (diff) | |
download | gdb-8a5e3e08a6faa0fdba3daa1fa4295b02c7ebe1eb.zip gdb-8a5e3e08a6faa0fdba3daa1fa4295b02c7ebe1eb.tar.gz gdb-8a5e3e08a6faa0fdba3daa1fa4295b02c7ebe1eb.tar.bz2 |
* layout.cc (Layout::make_output_section): Call
Target::new_output_section.
(Layout::attach_allocated_section_to_segment): Put large section
sections in a separate load segment with the large segment flag
set.
(Layout::segment_precedes): Sort large data segments after other
load segments.
(align_file_offset): New static function.
(Layout::set_segment_offsets): Use align_file_offset.
* output.h (class Output_section): Add is_small_section_ and
is_large_section_ fields.
(Output_section::is_small_section): New function.
(Output_section::set_is_small_section): New function.
(Output_section::is_large_section): New function.
(Output_section::set_is_large_section): New function.
(Output_section::is_large_data_section): New function.
(class Output_segment): Add is_large_data_segment_ field.
(Output_segment::is_large_data_segment): New function.
(Output_segment::set_is_large_data_segment): New function.
* output.cc (Output_section::Output_section): Initialize new
fields.
(Output_segment::Output_segment): Likewise.
(Output_segment::add_output_section): Add assertion that large
data sections always go in large data segments. Force small data
sections to the end of the list of data sections. Force small BSS
sections to the start of the list of BSS sections. For large BSS
sections to the end of the list of BSS sections.
* symtab.h (class Symbol): Declare is_common_shndx.
(Symbol::is_defined): Check Symbol::is_common_shndx.
(Symbol::is_common): Likewise.
(class Symbol_table): Define enum Commons_section_type. Update
declarations. Add small_commons_ and large_commons_ fields.
* symtab.cc (Symbol::is_common_shndx): New function.
(Symbol_table::Symbol_table): Initialize new fields.
(Symbol_table::add_from_object): Put small and large common
symbols in the right list.
(Symbol_table::sized_finalized_symbol): Check
Symbol::is_common_shndx.
(Symbol_table::sized_write_globals): Likewise.
* common.cc (Symbol_table::do_allocate_commons): Allocate new
common symbol lists. Don't call do_allocate_commons_list if the
list is empty.
(Symbol_table::do_allocate_commons_list): Remove is_tls
parameter. Add comons_section_type parameter. Change all
callers. Handle small and large common symbols.
* object.cc (Sized_relobj::do_finalize_local_symbols): Check
Symbol::is_common_shndx.
* resolve.cc (symbol_to_bits): Likewise.
* target.h (Target::small_common_shndx): New function.
(Target::small_common_section_flags): New function.
(Target::large_common_shndx): New function.
(Target::large_common_section_flags): New function.
(Target::new_output_section): New function.
(Target::Target_info): Add small_common_shndx, large_common_shndx,
small_common_section_flags, and large_common_section_flags
fields.
(Target::do_new_output_section): New virtual function.
* arm.cc (Target_arm::arm_info): Initialize new fields.
* i386.cc (Target_i386::i386_info): Likewise.
* powerpc.cc (Target_powerpc::powerpc_info) [all versions]:
Likewise.
* sparc.c (Target_sparc::sparc_info) [all versions]: Likewise.
* x86_64.cc (Target_x86_64::x86_64_info): Likewise.
(Target_x86_64::do_new_output_section): New function.
* configure.ac: Define conditional MCMODEL_MEDIUM.
* testsuite/Makefile.am (check_PROGRAMS): Add large.
(large_SOURCES, large_CFLAGS, large_DEPENDENCIES): Define.
(large_LDFLAGS): Define.
* testsuite/large.c: New file.
* testsuite/testfile.cc (Target_test::test_target_info):
Initialize new fields.
* configure, testsuite/Makefile.in: Rebuild.
Diffstat (limited to 'gold/output.h')
-rw-r--r-- | gold/output.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/gold/output.h b/gold/output.h index 5d2c62f..3e46ad8 100644 --- a/gold/output.h +++ b/gold/output.h @@ -2195,6 +2195,33 @@ class Output_section : public Output_data set_is_relro_local() { this->is_relro_local_ = true; } + // True if this is a small section: a section which holds small + // variables. + bool + is_small_section() const + { return this->is_small_section_; } + + // Record that this is a small section. + void + set_is_small_section() + { this->is_small_section_ = true; } + + // True if this is a large section: a section which holds large + // variables. + bool + is_large_section() const + { return this->is_large_section_; } + + // Record that this is a large section. + void + set_is_large_section() + { this->is_large_section_ = true; } + + // True if this is a large data (not BSS) section. + bool + is_large_data_section() + { return this->is_large_section_ && this->type_ != elfcpp::SHT_NOBITS; } + // Return whether this section should be written after all the input // sections are complete. bool @@ -2808,6 +2835,10 @@ class Output_section : public Output_data bool is_relro_ : 1; // True if this section holds relro local data. bool is_relro_local_ : 1; + // True if this is a small section. + bool is_small_section_ : 1; + // True if this is a large section. + bool is_large_section_ : 1; // For SHT_TLS sections, the offset of this section relative to the base // of the TLS segment. uint64_t tls_offset_; @@ -2858,6 +2889,17 @@ class Output_segment offset() const { return this->offset_; } + // Whether this is a segment created to hold large data sections. + bool + is_large_data_segment() const + { return this->is_large_data_segment_; } + + // Record that this is a segment created to hold large data + // sections. + void + set_is_large_data_segment() + { this->is_large_data_segment_ = true; } + // Return the maximum alignment of the Output_data. uint64_t maximum_alignment(); @@ -3040,6 +3082,8 @@ class Output_segment bool is_max_align_known_ : 1; // Whether vaddr and paddr were set by a linker script. bool are_addresses_set_ : 1; + // Whether this segment holds large data sections. + bool is_large_data_segment_ : 1; }; // This class represents the output file. |