diff options
author | Doug Kwan <dougkwan@google.com> | 2010-05-23 07:43:39 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2010-05-23 07:43:39 +0000 |
commit | 0439c7962a9133f00b9c836c8f211b1cc7b2211c (patch) | |
tree | af4aa52e69d35439bcc7451ec50d11935fca773d /gold/merge.h | |
parent | f434ba0309555deb86dc8b6da65ea67d588bda30 (diff) | |
download | gdb-0439c7962a9133f00b9c836c8f211b1cc7b2211c.zip gdb-0439c7962a9133f00b9c836c8f211b1cc7b2211c.tar.gz gdb-0439c7962a9133f00b9c836c8f211b1cc7b2211c.tar.bz2 |
2010-05-23 Doug Kwan <dougkwan@google.com>
* arm.cc (Arm_input_section::do_output_offset): Use convert_types
instead of a cast.
(Target_arm::apply_cortex_a8_workaround): Rewrite a conditional branch
with a direct branch, not a conditional branch, to a stub.
* merge.cc (Output_merge_base::record_input_section): New method
defintion.
(Output_merge_data::do_add_input_section): Record input section if
keeps-input-sections flag is set.
(Output_merge_string::do_add_input_section): Ditto.
* merge.h (Output_merge_base::Output_merge_base): Initialize new data
members KEEPS_INPUT_SECTIONS_, FIRST_RELOBJ_, FIRST_SHNDX_ and
INPUT_SECTIONS_.
(Output_merge_base::keeps_input_sections,
Output_merge_base::set_keeps_input_sections,
Output_merge_base::first_relobj, Output_merge_base::first_shndx): New
method definitions.
(Output_merge_base::Input_sections): New type declaration.
(Output_merge_base::input_sections_begin,
Output_merge_base::input_sections_end,
Output_merge_base::do_set_keeps_input_sections): New method definitions.
(Output_merge_base::bool keeps_input_sections_,
Output_merge_base::first_relobj_, Output_merge_base::first_shndx_,
Output_merge_base::input_sections_): New data members.
(Output_merge_data::do_set_keeps_input_sections): New method
defintion.
(Output_merge_string::do_set_keeps_input_sections): Ditto.
* output.cc (Output_section::Input_section::relobj): Move method
defintion from class declaration to here and handle merge sections.
(Output_section::Input_section::shndx): Ditto.
(Output_section::Output_section): Remove initializations of removed
data members and initialize new data member LOOKUP_MAPS_.
(Output_section::add_input_section): Set keeps-input-sections flag
for a newly created merge output section as appropriate. Adjust code
to use Output_section_lookup_maps class.
(Output_section::add_relaxed_input_section): Adjst code for lookup
maps code refactoring.
(Output_section::add_merge_input_section): Add a new parameter
KEEPS_INPUT_SECTION. Adjust code to use Output_section_lookup_maps
class. If adding input section to a newly created merge output
section fails, remove the new merge section.
(Output_section::convert_input_sections_in_list_to_relaxed_input_sections):
Adjust code for use of the Output_section_lookup_maps class.
(Output_section::find_merge_section): Ditto.
(Output_section::build_lookup_maps): New method defintion.
(Output_section::find_relaxed_input_section): Adjust code to use
Output_section_lookup_maps class.
(Output_section::get_input_sections): Export merge sections. Adjust
code to use Output_section_lookup_maps class.
(Output_section:::add_script_input_section): Adjust code to use
Output_section_lookup_maps class. Update lookup maps for merge
sections also.
(Output_section::discard_states): Use Output_section_lookup_maps.
(Output_section::restore_states): Same.
* output.h (Merge_section_properties): Move class defintion out of
Output_section.
(Output_section_lookup_maps): New class.
(Output_section::Input_section::is_merge_section): New method
defintion.
(Output_section::Input_section::relobj): Move defintion out of class
defintion. Declare method only.
(Output_section::Input_section::shndx): Ditto.
(Output_section::Input_section::output_merge_base): New method defintion.
(Output_section::Input_section::u2_.pomb): New union field.
(Output_section::Merge_section_by_properties_map,
Output_section::Output_section_data_by_input_section_map,
Output_section::Ouptut_relaxed_input_section_by_input_section_map):
Remove types.
(Output_section::add_merge_input_section): Add new parameter
KEEPS_INPUT_SECTIONS.
(Output_section::build_lookup_maps): New method declaration.
(Output_section::merge_section_map_,
Output_section::merge_section_by_properties_map_,
Output_section::relaxed_input_section_map_,
Output_section::is_relaxed_input_section_map_valid_): Remove data
members.
(Output_section::lookup_maps_): New data member.
Diffstat (limited to 'gold/merge.h')
-rw-r--r-- | gold/merge.h | 84 |
1 files changed, 83 insertions, 1 deletions
diff --git a/gold/merge.h b/gold/merge.h index 345b115..c2d305b 100644 --- a/gold/merge.h +++ b/gold/merge.h @@ -216,7 +216,9 @@ class Output_merge_base : public Output_section_data { public: Output_merge_base(uint64_t entsize, uint64_t addralign) - : Output_section_data(addralign), merge_map_(), entsize_(entsize) + : Output_section_data(addralign), merge_map_(), entsize_(entsize), + keeps_input_sections_(false), first_relobj_(NULL), first_shndx_(-1), + input_sections_() { } // Return the entry size. @@ -230,6 +232,52 @@ class Output_merge_base : public Output_section_data is_string() { return this->do_is_string(); } + // Whether this keeps input sections. + bool + keeps_input_sections() const + { return this->keeps_input_sections_; } + + // Set the keeps-input-sections flag. This is virtual so that sub-classes + // can perform additional checks. + void + set_keeps_input_sections() + { this->do_set_keeps_input_sections(); } + + // Return the object of the first merged input section. This used + // for script processing. This is NULL if merge section is empty. + Relobj* + first_relobj() const + { return this->first_relobj_; } + + // Return the section index of the first merged input section. This + // is used for script processing. This is valid only if merge section + // is not valid. + unsigned int + first_shndx() const + { + gold_assert(this->first_relobj_ != NULL); + return this->first_shndx_; + } + + // Set of merged input sections. + typedef Unordered_set<Section_id, Section_id_hash> Input_sections; + + // Beginning of merged input sections. + Input_sections::const_iterator + input_sections_begin() const + { + gold_assert(this->keeps_input_sections_); + return this->input_sections_.begin(); + } + + // Beginning of merged input sections. + Input_sections::const_iterator + input_sections_end() const + { + gold_assert(this->keeps_input_sections_); + return this->input_sections_.end(); + } + protected: // Return the output offset for an input offset. bool @@ -257,6 +305,15 @@ class Output_merge_base : public Output_section_data do_is_string() { return false; } + // This may be overridden by the child class. + virtual void + do_set_keeps_input_sections() + { this->keeps_input_sections_ = true; } + + // Record the merged input section for script processing. + void + record_input_section(Relobj* relobj, unsigned int shndx); + private: // A mapping from input object/section/offset to offset in output // section. @@ -264,6 +321,15 @@ class Output_merge_base : public Output_section_data // The entry size. For fixed-size constants, this is the size of // the constants. For strings, this is the size of a character. uint64_t entsize_; + // Whether we keep input sections. + bool keeps_input_sections_; + // Object of the first merged input section. We use this for script + // processing. + Relobj* first_relobj_; + // Section index of the first merged input section. + unsigned int first_shndx_; + // Input sections. We only keep them is keeps_input_sections_ is true. + Input_sections input_sections_; }; // Handle SHF_MERGE sections with fixed-size constant data. @@ -303,6 +369,14 @@ class Output_merge_data : public Output_merge_base void do_print_merge_stats(const char* section_name); + // Set keeps-input-sections flag. + void + do_set_keeps_input_sections() + { + gold_assert(this->input_count_ == 0); + Output_merge_base::do_set_keeps_input_sections(); + } + private: // We build a hash table of the fixed-size constants. Each constant // is stored as a pointer into the section data we are accumulating. @@ -440,6 +514,14 @@ class Output_merge_string : public Output_merge_base do_is_string() { return true; } + // Set keeps-input-sections flag. + void + do_set_keeps_input_sections() + { + gold_assert(this->input_count_ == 0); + Output_merge_base::do_set_keeps_input_sections(); + } + private: // The name of the string type, for stats. const char* |