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]

[PATCH][GOLD] Add support for relaxation.


Hi

    This patch adds support for doing relaxation in Gold.  The basic
idea is to run part of Layout::finalize until a target hook tell it to
stop.  To be able to do that, we save some of the states of output
sections and output segments and rollback the output sections and
output segment states before the relaxation look is restarted.  Some
of derived classes of Output_data are changed so that they either keep
their data size constant or can compute their data size repeatedly.
Some output section data may indeed changes.  For example, it is
possible, though not likely that different number of PT_LOAD segments
are created by a script during different iteration of the relaxation
loop so now the Output_segment_headers can adjust its size
accordingly. I also added a class Output_relaxed_input_section, which
will be sub-classed by a target to implement target-specific
relaxation.  Since this is quite a big change,  I also added some
debug code.

   This has been tested on the x86_64 target by running all the tests
with a dummy relaxation pass and checks enabled.  All tests passed.

-Doug

2009-09-04  Doug Kwan  <dougkwan@google.com>

        * gold.cc (demangle.h): New include.
        (demangled_typename): New function.
        * gold.h (typeinfo): New include.
        (RELXAXATION_DEBUG): Add comment.
        (demangled_typename): New declaration.
        * layout.cc (Relaxation_debug_check): New class.
        (Relaxation_debug_check::check_output_data_for_reset_values,
        Relaxation_debug_check::read_sections,
        Relaxation_debug_check::read_sections): New method definitions.
        (Layout::Layout): Initialize data members
        record_output_section_data_from_scrips_ and
        script_output_section_data_list_.
        (Layout::save_segments, Layout::restore_segments,
        Layout::clean_up_after_relaxation): New method definitions.
        (Layout::finalize): Support relaxation.
        (Layout::set_asection_address_from_script): Move code for orphan
        section placement out.
        (Layout::place_orphan_sections_in_script, Layout::print_segments,
        Layout::print_sections, Layout::print_special_outputs): New method
        definitions.
        * layout.h (Layout::print_segments, Layout::print_sections,
        Layout::print_special_outputs): Declare new methods.
        (Layout::new_output_section_data_from_script): New method definition.
        (Layout::place_orphan_sections_in_script): New method declaration.
        (Layout::Segment_states): New type declaration.
        (Layout::save_segments, Layout::restore_segments,
        Layout::clean_up_after_relaxation): New method declarations.
        (Layout::Output_section_data_list): New type declaration.
        (Layout::record_output_section_data_from_script_,
        Layout::script_output_section_data_list_): New data member.
        * options.h (--relax-debug): New option.
        * output.cc (Output_data::do_debug): New method definition.
        (Output_section_headers::do_size): New method definition.
        (Output_section_headers::Output_section_headers): Move size
        computation to Output_section_headers::do_size.
        (Output_segment_headers::do_size): New method definition.
        (Output_file_header::Output_file_header): Move size computation to
        Output_file_header::do_size and call it.
        (Output_file_header::do_size): New method definition.
        (Output_data_group::Output_data_group): Adjust call to
        Output_section_data.
        (Output_data_dynamic::set_final_data_size): Add DT_NULL tag only once.
        (Output_symtab_xindex::do_write): Add array bound check.
        (Output_section::Input_section::print_to_mapfile): Handle
        RELAXED_INPUT_SECTION_CODE.
        (Output_section::Input_section::debug): New method definition.
        (Output_section::Output_section): Initialize data member checkpoint_.
        (Output_section::~Output_section): Delete checkpoint object pointed
        by checkpoint_.
        (Output_section::add_input_section): Always add an Input_section if
        relaxing.
        (Output_section::add_merge_input_section): Add assert.
        (Output_section::relax_input_section): New method definition.
        (Output_section::set_final_data_size): Set load address to zero for
        an unallocated section.
        (Output_section::do_address_and_file_offset_have_reset_values):
        New method definition.
        (Output_section::Input_section_sort_enty::Input_section_sort_enty):
        Handle relaxed input section.
        (Output_section::sort_attached_input_sections): Checkpoint input section
        list lazily.
        (Output_section::get_input_sections): Change type of input_sections to
        list of Simple_input_section pointers.  Checkpoint input section list
        lazily.  Also handle relaxed input sections.
        (Output_section::add_input_section_for_script): Take a reference to
        a Simple_input_section object instead of Relobj pointer and section
        index as parameter.  Handle relaxed input sections.
        (Output_section::save_states, Output_section::restore_states): New
        method definitions.
        (Output_section::do_debug): New method definition.
        (Output_section::debug): New method definition.
        * output.h (Output_data::Output_data): Initialize is_data_size_fixed_.
        (Output_data::is_data_size_fixed): New method definition.
        (Output_data::reset_addresss_and_file_offset): Do not reset data size
        if it is fixed.
        (Output_data::address_and_file_offset_have_reset_values): New method
        definition.
        (Output_data::debug): New method definitions.
        (Output_data::do_address_and_file_offset_have_reset_values): New method
        definition.
        (Output_data::do_debug): New method definitions.
        (Output_data::set_data_size): Check that data size is not fixed.
        (Output_data::fix_data_size): New method definition.
        (Output_data::is_data_size_fixed_): New data member.
        (Output_section_headers::set_final_data_size): New method definition.
        (Output_section_headers::do_size): New method declaration.
        (Output_segment_headers::set_final_data_size): New method definition.
        (Output_segment_headers::do_size): New method declaration.
        (Output_file_header::set_final_data_size)::New method definition.
        (Output_file_header::do_size)::New method declaration.
        (Output_section_data::Output_section_data): Add new parameter
        is_data_size_fixed and use it to fix data size.
        (Output_data_const::Output_data_const): Adjust call to base class
        constructor and fix data size.
        (Output_data_const_buffer::Output_data_const_buffer): Adjust call to
        base class constructor and fix data size.
        (Output_data_fixed_space::Output_data_fixed_space): Adjust call to
        base class constructor and fix data size.
        (Output_data_zero_fill::Output_data_zero_fill): Adjust call to base
        class constructor and fix data size.
        (Output_data_group::set_final_data_size): New method definition.
        (Output_data_dynamic::Dynamic_entry::tag): New method definition.
        (Output_symtab_xindex::Output_symtab_xindex): Adjust call to base
        class constructor and fix data size.
        (Output_relaxed_input_section): New class definition.
        (Output_section::Simple_input_section): New class definition.
        (Output_section::get_input_sections): Adjust parameter list.
        (Output_section::add_input_section_for_script): Same.
        (Output_section::save_states, Output_section::restore_states,
        Output_section::do_address_and_file_offset_have_reset_values,
        Output_section::do_debug): New method declarations.
        (Output_section::Input_section::Input_section): Handle
        RELAXED_INPUT_SECTION_CODE.  Add new overload for
        Output_relaxed_input_section.
        (Output_section::Input_section::is_input_section): Handle relaxed
        input section.
        (Output_section::Input_section::is_relaxed_input_section,
        Output_section::Input_section::output_section_data,
        Output_section::Input_section::relaxed_input_section): New method
        definitions.
        (Output_section::Input_section::debug): New method declaration and
        definition.
        (Output_section::Input_section::RELAXED_INPUT_SECTION_CODE): New enum
        value.
        (Output_section::Input_section::u1_, Output_section::Input_section::u2_
        ): Update comments.
        (Output_section::Checkpoint): New classs definition.
        (Output_section::relax_input_section): New method declaration.
        (Output_section::checkpoint_): New data member.
        (Output_segment): Update comments.
        (Output_segment::Output_segment): Un-privatize copy constructor.
        (Output_segment::operator=): Un-privatize.
        (Output_segment::debug): New method declaration and definition.
        * script-sections.cc (Output_section_element::Input_section_list):
        Change element type to Output_section::Simple_input_section.
        (Output_section_element_dot_assignment::set_section_addresses):
        Register output section data for relaxation clean up.
        (Output_data_exression::Output_data_expression): Adjust call to base
        constructor to fix data size.
        (Output_section_element_data::set_section_addresses): Register
        Output_data_expression object for relaxation clean up.
        (struct Input_section_info): Replace Relobj pointer and section index
        pair with Output_section::Simple_input_section and Convert struct to a
        class.
        (Input_section_sorter::operator()): Adjust access to
        Input_section_info data member to use accessors.
        (Output_section_element_input::set_section_addresses): Use layout
        parameter.  Adjust code to use Output_section::Simple_input_section
        and Input_secction_info classes.  Register filler for relaxation
        clean up.
        (Orphan_output_section::set_section_addresses): Replace Relobj pointer
        and section index pair with Output_section::Simple_input_section
        class.  Adjust code accordingly.
        (Phdrs_element::release_segment): New method definition.
        (Script_sections::attach_sections_using_phdrs_clause): Do not modify
        segment list.
        (Script_sections::release_segments): New method definition.
        * gold/script-sections.h (Script_sections::release_segments): New
        method declaration.
        * gold/target.h (Target::may_relax, Target::relax,
       Target::do_may_relax, Target::do_relax): New method definitions.

Attachment: patch.txt
Description: Text document


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