aboutsummaryrefslogtreecommitdiff
path: root/gold/layout.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2009-03-01 22:22:02 +0000
committerIan Lance Taylor <ian@airs.com>2009-03-01 22:22:02 +0000
commit8a4c0b0d7ee3f258acf37d6d1e5e34ae54f86391 (patch)
treea56d1ab9b0fe09abde5b5526bf5d3d2d3f460b9f /gold/layout.h
parentd1bbb13a635b6bdc15dd0e597a8424a5a2d65610 (diff)
downloadbinutils-8a4c0b0d7ee3f258acf37d6d1e5e34ae54f86391.zip
binutils-8a4c0b0d7ee3f258acf37d6d1e5e34ae54f86391.tar.gz
binutils-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.h65
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