// layout.h -- lay out output file sections for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
{
class General_options;
+class Incremental_inputs;
class Input_objects;
class Mapfile;
class Symbol_table;
class Output_data;
class Output_data_dynamic;
class Output_symtab_xindex;
+class Output_reduced_debug_abbrev_section;
+class Output_reduced_debug_info_section;
class Eh_frame;
class Target;
Mapfile* mapfile_;
};
+// This struct holds information about the comdat or .gnu.linkonce
+// that will be kept.
+
+struct Kept_section
+{
+ Kept_section()
+ : object(NULL), shndx(0), is_group(false), group_sections(NULL)
+ { }
+ Kept_section(Relobj* a_object, unsigned int a_shndx, bool a_is_group)
+ : object(a_object), shndx(a_shndx), is_group(a_is_group),
+ group_sections(NULL)
+ { }
+
+ typedef Unordered_map<std::string, unsigned int> Comdat_group;
+
+ // The object containing the comdat or .gnu.linkonce.
+ Relobj* object;
+ // Index to the group section for comdats and the section itself for
+ // .gnu.linkonce.
+ unsigned int shndx;
+ // The Kept_sections are values of a mapping, that maps names to
+ // them. This field is true if this struct is associated with the
+ // name of a comdat or .gnu.linkonce, false if it is associated with
+ // the name of a symbol obtained from the .gnu.linkonce.* name
+ // through some heuristics.
+ bool is_group;
+ // For comdats, a map from names of the sections in the group to
+ // indexes in OBJECT_. NULL for .gnu.linkonce.
+ Comdat_group* group_sections;
+};
+
// This class handles the details of laying out input sections.
class Layout
{
public:
- Layout(const General_options& options, Script_options*);
+ Layout(int number_of_input_files, Script_options*);
// Given an input section SHNDX, named NAME, with data in SHDR, from
// the object file OBJECT, return the output section where this
{
// Debugging sections can only be recognized by name.
return (strncmp(name, ".debug", sizeof(".debug") - 1) == 0
- || strncmp(name, ".gnu.linkonce.wi.",
+ || strncmp(name, ".gnu.linkonce.wi.",
sizeof(".gnu.linkonce.wi.") - 1) == 0
|| strncmp(name, ".line", sizeof(".line") - 1) == 0
|| strncmp(name, ".stab", sizeof(".stab") - 1) == 0);
}
- // Record the signature of a comdat section, and return whether to
- // include it in the link. The GROUP parameter is true for a
- // section group signature, false for a signature derived from a
- // .gnu.linkonce section.
+ // Check if a comdat group or .gnu.linkonce section with the given
+ // NAME is selected for the link. If there is already a section,
+ // *KEPT_SECTION is set to point to the signature and the function
+ // returns false. Otherwise, the CANDIDATE signature is recorded
+ // for this NAME in the layout object, *KEPT_SECTION is set to the
+ // internal copy and the function return false. In some cases, with
+ // CANDIDATE->GROUP_ being false, KEPT_SECTION can point back to
+ // CANDIDATE.
bool
- add_comdat(Relobj*, unsigned int, const std::string&, bool group);
+ find_or_add_kept_section(const std::string& name,
+ Kept_section* candidate,
+ Kept_section** kept_section);
// Find the given comdat signature, and return the object and section
// index of the kept group.
script_options() const
{ return this->script_options_; }
+ // Return the object managing inputs in incremental build. NULL in
+ // non-incremental builds.
+ Incremental_inputs*
+ incremental_inputs()
+ { return this->incremental_inputs_; }
+
// Compute and write out the build ID if needed.
void
write_build_id(Output_file*) const;
};
typedef std::vector<Group_signature> Group_signatures;
- // Create a .note section, filling in the header.
+ // Create a note section, filling in the header.
Output_section*
- create_note(const char* name, int note_type, size_t descsz,
- bool allocate, size_t* trailing_padding);
+ create_note(const char* name, int note_type, const char *section_name,
+ size_t descsz, bool allocate, size_t* trailing_padding);
- // Create a .note section for gold.
+ // Create a note section for gold version.
void
create_gold_note();
void
create_build_id();
+ // Create .gnu_incremental_inputs and .gnu_incremental_strtab sections needed
+ // for the next run of incremental linking to check what has changed.
+ void
+ create_incremental_info_sections();
+
// Find the first read-only PT_LOAD segment, creating one if
// necessary.
Output_segment*
static bool
segment_precedes(const Output_segment* seg1, const Output_segment* seg2);
- // A mapping used for group signatures.
- struct Kept_section
- {
- Kept_section()
- : object_(NULL), shndx_(0), group_(false)
- { }
- Kept_section(Relobj* object, unsigned int shndx, bool group)
- : object_(object), shndx_(shndx), group_(group)
- { }
- Relobj* object_;
- unsigned int shndx_;
- bool group_;
- };
+ // A mapping used for kept comdats/.gnu.linkonce group signatures.
typedef Unordered_map<std::string, Kept_section> Signatures;
// Mapping from input section name/type/flags to output section. We
{ return Layout::segment_precedes(seg1, seg2); }
};
- // A reference to the options on the command line.
- const General_options& options_;
+ // The number of input files, for sizing tables.
+ int number_of_input_files_;
// Information set by scripts or by command line options.
Script_options* script_options_;
// The output section names.
// The list of output sections which are not attached to any output
// segment.
Section_list unattached_section_list_;
- // Whether we have attached the sections to the segments.
- bool sections_are_attached_;
// The list of unattached Output_data objects which require special
// handling because they are not Output_sections.
Data_list special_output_list_;
Output_section* eh_frame_hdr_section_;
// The space for the build ID checksum if there is one.
Output_section_data* build_id_note_;
+ // The output section containing dwarf abbreviations
+ Output_reduced_debug_abbrev_section* debug_abbrev_;
+ // The output section containing the dwarf debug info tree
+ Output_reduced_debug_info_section* debug_info_;
// A list of group sections and their signatures.
Group_signatures group_signatures_;
// The size of the output file.
off_t output_file_size_;
+ // Whether we have attached the sections to the segments.
+ bool sections_are_attached_;
// Whether we have seen an object file marked to require an
// executable stack.
bool input_requires_executable_stack_;
bool has_static_tls_;
// Whether any sections require postprocessing.
bool any_postprocessing_sections_;
+ // Whether we have resized the signatures_ hash table.
+ bool resized_signatures_;
+ // In incremental build, holds information check the inputs and build the
+ // .gnu_incremental_inputs section.
+ Incremental_inputs* incremental_inputs_;
};
// This task handles writing out data in output sections which is not