aboutsummaryrefslogtreecommitdiff
path: root/gold/layout.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2008-05-01 01:23:21 +0000
committerCary Coutant <ccoutant@google.com>2008-05-01 01:23:21 +0000
commite94cf1277329c4eaba3b398b446e693550463c77 (patch)
treec3264396a84db5f5c415e8465cef5d21f58db7cf /gold/layout.cc
parent1af5d7ceb5960c714e55c2fdf80c22b52db84738 (diff)
downloadfsf-binutils-gdb-e94cf1277329c4eaba3b398b446e693550463c77.zip
fsf-binutils-gdb-e94cf1277329c4eaba3b398b446e693550463c77.tar.gz
fsf-binutils-gdb-e94cf1277329c4eaba3b398b446e693550463c77.tar.bz2
* layout.cc (Layout::include_section): Refactored check for debug
info section. (Layout::add_comdat): Add new parameters. Change type of signature parameter. Add object and shndx to signatures table. (Layout::find_kept_object): New function. * layout.h: Include <cstring>. (Layout::is_debug_info_section): New function. (Layout::add_comdat): Add new parameters. (Layout::find_kept_object): New function. (Layout::Kept_section): New struct. (Layout::Signatures): Change type of map range. * object.cc (Relobj::output_section_address): New function. (Sized_relobj::include_section_group): Add new parameters. Change calls to Layout::add_comdat. Change to build table of kept comdat groups and table mapping discarded sections to kept sections. (Sized_relobj::include_linkonce_section): Likewise. Add new parameter. (Sized_relobj::do_layout): Change calls to include_section_group and include_linkonce_section. (Sized_relobj::do_finalize_local_symbols): Do not set local symbol value to zero when section is discarded. (Sized_relobj::map_to_kept_section): New function. * object.h (Relobj::output_section_address): New function. (Relobj::Comdat_group): New type. (Relobj::find_comdat_group): New function. (Relobj::Comdat_group_table): New type. (Relobj::Kept_comdat_section): New type. (Relobj::Kept_comdat_section_table): New type. (Relobj::add_comdat_group): New function. (Relobj::set_kept_comdat_section): New function. (Relobj::get_kept_comdat_section): New function. (Relobj::comdat_groups_): New field. (Relobj::kept_comdat_sections_): New field. (Symbol_value::input_value): Update comment. (Sized_relobj::map_to_kept_section) New function. (Sized_relobj::include_linkonce_section): Add new parameter. * target-reloc.h (Comdat_behavior): New type. (get_comdat_behavior): New function. (relocate_section): Add code to map a discarded section to the corresponding kept section when applying a relocation.
Diffstat (limited to 'gold/layout.cc')
-rw-r--r--gold/layout.cc31
1 files changed, 21 insertions, 10 deletions
diff --git a/gold/layout.cc b/gold/layout.cc
index a3bcf21..8d0d5f7 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -192,11 +192,7 @@ Layout::include_section(Sized_relobj<size, big_endian>*, const char* name,
if (parameters->options().strip_debug()
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
{
- // Debugging sections can only be recognized by name.
- if (is_prefix_of(".debug", name)
- || is_prefix_of(".gnu.linkonce.wi.", name)
- || is_prefix_of(".line", name)
- || is_prefix_of(".stab", name))
+ if (is_debug_info_section(name))
return false;
}
if (parameters->options().strip_debug_gdb()
@@ -2770,11 +2766,12 @@ Layout::output_section_name(const char* name, size_t* plen)
// want a linkonce signature to block another linkonce signature.
bool
-Layout::add_comdat(const char* signature, bool group)
+Layout::add_comdat(Relobj* object, unsigned int shndx,
+ const std::string& signature, bool group)
{
- std::string sig(signature);
+ Kept_section kept(object, shndx, group);
std::pair<Signatures::iterator, bool> ins(
- this->signatures_.insert(std::make_pair(sig, group)));
+ this->signatures_.insert(std::make_pair(signature, kept)));
if (ins.second)
{
@@ -2782,7 +2779,7 @@ Layout::add_comdat(const char* signature, bool group)
return true;
}
- if (ins.first->second)
+ if (ins.first->second.group_)
{
// We've already seen a real section group with this signature.
return false;
@@ -2792,7 +2789,7 @@ Layout::add_comdat(const char* signature, bool group)
// This is a real section group, and we've already seen a
// linkonce section with this signature. Record that we've seen
// a section group, and don't include this section group.
- ins.first->second = true;
+ ins.first->second.group_ = true;
return false;
}
else
@@ -2804,6 +2801,20 @@ Layout::add_comdat(const char* signature, bool group)
}
}
+// Find the given comdat signature, and return the object and section
+// index of the kept group.
+Relobj*
+Layout::find_kept_object(const std::string& signature,
+ unsigned int* pshndx) const
+{
+ Signatures::const_iterator p = this->signatures_.find(signature);
+ if (p == this->signatures_.end())
+ return NULL;
+ if (pshndx != NULL)
+ *pshndx = p->second.shndx_;
+ return p->second.object_;
+}
+
// Store the allocated sections into the section list.
void