diff options
author | Ian Lance Taylor <ian@airs.com> | 2009-03-01 22:22:02 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2009-03-01 22:22:02 +0000 |
commit | 8a4c0b0d7ee3f258acf37d6d1e5e34ae54f86391 (patch) | |
tree | a56d1ab9b0fe09abde5b5526bf5d3d2d3f460b9f /gold/layout.h | |
parent | d1bbb13a635b6bdc15dd0e597a8424a5a2d65610 (diff) | |
download | gdb-8a4c0b0d7ee3f258acf37d6d1e5e34ae54f86391.zip gdb-8a4c0b0d7ee3f258acf37d6d1e5e34ae54f86391.tar.gz gdb-8a4c0b0d7ee3f258acf37d6d1e5e34ae54f86391.tar.bz2 |
* layout.cc (Layout::find_or_add_kept_section): New function.
(Layout::add_comdat): Removed.
* layout.h (struct Kept_section): Move out of class Layout.
Remove trailing underscores from field names. Add group_sections
field. Rename group_ field to is_group. Change all uses.
(class Layout): Declare find_or_add_kept_section, not add_comdat.
* object.cc (Sized_relobj::Sized_relobj): Don't initialize
comdat_groups_ field.
(Sized_relobj::include_section_group): Use
find_or_add_kept_section and Kept_section::group_sections.
(Sized_relobj::include_linkonce_section): Likewise.
* object.cc (class Sized_relobj): Don't define Comdat_group or
Comdat_group_table. Remove find_comdat_group and
add_comdat_group. Remove comdat_groups_ field.
* plugin.cc (include_comdat_group): Use
Layout::find_or_add_kept_section.
Diffstat (limited to 'gold/layout.h')
-rw-r--r-- | gold/layout.h | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/gold/layout.h b/gold/layout.h index ca8b7c7..ca0f89a 100644 --- a/gold/layout.h +++ b/gold/layout.h @@ -1,6 +1,6 @@ // 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. @@ -89,6 +89,37 @@ class Layout_task_runner : public Task_function_runner 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 @@ -225,18 +256,24 @@ class Layout { // 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. @@ -577,19 +614,7 @@ class Layout 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 |