From e94cf1277329c4eaba3b398b446e693550463c77 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Thu, 1 May 2008 01:23:21 +0000 Subject: * 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 . (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. --- gold/layout.cc | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'gold/layout.cc') 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*, 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 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 -- cgit v1.1