This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [GOLD][PATCH]Handle script sections in Output_section::get_input_section.


"Doug Kwan (éæå)" <dougkwan@google.com> writes:

> 2010-05-21  Doug Kwan  <dougkwan@google.com>
>
>         * arm.cc (Arm_input_section::do_output_offset): Add a cast to
>         avoid a compilation error.
>         (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.


> Index: gold/arm.cc
> ===================================================================
> RCS file: /cvs/src/src/gold/arm.cc,v
> retrieving revision 1.103
> diff -u -u -p -r1.103 arm.cc
> --- gold/arm.cc	19 May 2010 07:09:36 -0000	1.103
> +++ gold/arm.cc	21 May 2010 01:11:07 -0000
> @@ -1202,7 +1202,7 @@ class Arm_input_section : public Output_
>      if ((object == this->relobj())
>  	&& (shndx == this->shndx())
>  	&& (offset >= 0)
> -	&& (offset <= this->original_size_))
> +	&& (offset <= static_cast<section_offset_type>(this->original_size_)))
>        {
>  	*poutput = offset;
>  	return true;

As noted separately, this will do the wrong thing if this
this->original_size_ doesn't fit in section_size_type.  My earlier
suggestion was somewhat wrong--I forgot that original_size_ is now
uint32_t.  Here we know offset >= 0 so casting it to uint32_t should
be fine.


> Index: gold/merge.cc
> ===================================================================
> RCS file: /cvs/src/src/gold/merge.cc,v
> retrieving revision 1.34
> diff -u -u -p -r1.34 merge.cc
> --- gold/merge.cc	9 Apr 2010 00:04:30 -0000	1.34
> +++ gold/merge.cc	21 May 2010 01:11:08 -0000
> @@ -304,6 +304,27 @@ Output_merge_base::do_is_merge_section_f
>    return this->merge_map_.is_merge_section_for(object, shndx);
>  }
>  
> +// Record a merged input section for script processing.
> +
> +void
> +Output_merge_base::record_input_section(Relobj* relobj, unsigned int shndx)
> +{
> +  gold_assert(this->keeps_input_sections_ && relobj != NULL);
> +  // If this is the first input section, record it.  We need do this because
> +  // the order of input sections in this->input_sections_to store is
> +  //

The comment is unfinished.


This is OK with above notes.

Thanks.

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]