diff options
author | Cary Coutant <ccoutant@google.com> | 2008-05-01 01:23:21 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2008-05-01 01:23:21 +0000 |
commit | e94cf1277329c4eaba3b398b446e693550463c77 (patch) | |
tree | c3264396a84db5f5c415e8465cef5d21f58db7cf /gold/layout.cc | |
parent | 1af5d7ceb5960c714e55c2fdf80c22b52db84738 (diff) | |
download | gdb-e94cf1277329c4eaba3b398b446e693550463c77.zip gdb-e94cf1277329c4eaba3b398b446e693550463c77.tar.gz 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.cc | 31 |
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 |