From: Sriraman Tallam Date: Sun, 21 Feb 2010 00:57:59 +0000 (+0000) Subject: 2010-02-20 Sriraman Tallam X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b487ad64e5aa3da0c80b8648f7079b5415c45a3a;p=binutils-gdb.git 2010-02-20 Sriraman Tallam * gc.h (gc_process_relocs): Change vectors to point to the new list. Add reloc offset information. * icf.cc (get_section_contents): Change iterators to point to the new vectors. Add reloc offset information to the contents. * icf.h (Icf::Sections_reachable_info): New typedef. (Icf::Sections_reachable_list): New typedef. (Icf::Offset_info): New typedef. (Icf::Reloc_info): New struct typedef. (Icf::Reloc_info_list): New typedef. (Icf::symbol_reloc_list): Delete method. (Icf::addend_reloc_list): Delete method. (Icf::section_reloc_list): Delete method. (Icf::reloc_info_list): New method. (Icf::reloc_info_list_): New member. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 3c68e5bf0ff..e752bf57a11 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,20 @@ +2010-02-20 Sriraman Tallam + + * gc.h (gc_process_relocs): Change vectors to point to the new list. + Add reloc offset information. + * icf.cc (get_section_contents): Change iterators to point to the new + vectors. Add reloc offset information to the contents. + * icf.h (Icf::Sections_reachable_info): New typedef. + (Icf::Sections_reachable_list): New typedef. + (Icf::Offset_info): New typedef. + (Icf::Reloc_info): New struct typedef. + (Icf::Reloc_info_list): New typedef. + (Icf::symbol_reloc_list): Delete method. + (Icf::addend_reloc_list): Delete method. + (Icf::section_reloc_list): Delete method. + (Icf::reloc_info_list): New method. + (Icf::reloc_info_list_): New member. + 2010-02-19 Doug Kwan * arm-reloc.def: Mark R_ARM_TLS_GD32, R_ARM_TLS_LDM32, diff --git a/gold/gc.h b/gold/gc.h index d4fd02e3bdd..b79bd77e666 100644 --- a/gold/gc.h +++ b/gold/gc.h @@ -181,9 +181,10 @@ gc_process_relocs( const int reloc_size = Reloc_types::reloc_size; const int sym_size = elfcpp::Elf_sizes::sym_size; - std::vector* secvec = NULL; - std::vector* symvec = NULL; - std::vector >* addendvec = NULL; + Icf::Sections_reachable_info* secvec = NULL; + Icf::Symbol_info* symvec = NULL; + Icf::Addend_info* addendvec = NULL; + Icf::Offset_info* offsetvec = NULL; bool is_icf_tracked = false; const char* cident_section_name = NULL; @@ -198,9 +199,12 @@ gc_process_relocs( { is_icf_tracked = true; Section_id src_id(src_obj, src_indx); - secvec = &symtab->icf()->section_reloc_list()[src_id]; - symvec = &symtab->icf()->symbol_reloc_list()[src_id]; - addendvec = &symtab->icf()->addend_reloc_list()[src_id]; + Icf::Reloc_info* reloc_info = + &symtab->icf()->reloc_info_list()[src_id]; + secvec = &reloc_info->section_info; + symvec = &reloc_info->symbol_info; + addendvec = &reloc_info->addend_info; + offsetvec = &reloc_info->offset_info; } check_section_for_function_pointers = @@ -236,6 +240,9 @@ gc_process_relocs( long long symvalue = static_cast(lsym.get_st_value()); (*addendvec).push_back(std::make_pair(symvalue, static_cast(addend))); + uint64_t reloc_offset = + convert_to_section_size_type(reloc.get_r_offset()); + (*offsetvec).push_back(reloc_offset); } // When doing safe folding, check to see if this relocation is that @@ -301,6 +308,9 @@ gc_process_relocs( static_cast(sized_gsym->value()); (*addendvec).push_back(std::make_pair(symvalue, static_cast(addend))); + uint64_t reloc_offset = + convert_to_section_size_type(reloc.get_r_offset()); + (*offsetvec).push_back(reloc_offset); } } if (parameters->options().gc_sections()) diff --git a/gold/icf.cc b/gold/icf.cc index ec3269c0550..752aa5599c1 100644 --- a/gold/icf.cc +++ b/gold/icf.cc @@ -248,39 +248,38 @@ get_section_contents(bool first_iteration, if (num_tracked_relocs) *num_tracked_relocs = 0; - Icf::Section_list& seclist = symtab->icf()->section_reloc_list(); - Icf::Symbol_list& symlist = symtab->icf()->symbol_reloc_list(); - Icf::Addend_list& addendlist = symtab->icf()->addend_reloc_list(); + Icf::Reloc_info_list& reloc_info_list = + symtab->icf()->reloc_info_list(); - Icf::Section_list::iterator it_seclist = seclist.find(secn); - Icf::Symbol_list::iterator it_symlist = symlist.find(secn); - Icf::Addend_list::iterator it_addendlist = addendlist.find(secn); + Icf::Reloc_info_list::iterator it_reloc_info_list = + reloc_info_list.find(secn); buffer.clear(); icf_reloc_buffer.clear(); // Process relocs and put them into the buffer. - if (it_seclist != seclist.end()) + if (it_reloc_info_list != reloc_info_list.end()) { - gold_assert(it_symlist != symlist.end()); - gold_assert(it_addendlist != addendlist.end()); - Icf::Sections_reachable_list v = it_seclist->second; - Icf::Symbol_info s = it_symlist->second; - Icf::Addend_info a = it_addendlist->second; - Icf::Sections_reachable_list::iterator it_v = v.begin(); + Icf::Sections_reachable_info v = + (it_reloc_info_list->second).section_info; + Icf::Symbol_info s = (it_reloc_info_list->second).symbol_info; + Icf::Addend_info a = (it_reloc_info_list->second).addend_info; + Icf::Offset_info o = (it_reloc_info_list->second).offset_info; + Icf::Sections_reachable_info::iterator it_v = v.begin(); Icf::Symbol_info::iterator it_s = s.begin(); Icf::Addend_info::iterator it_a = a.begin(); + Icf::Offset_info::iterator it_o = o.begin(); - for (; it_v != v.end(); ++it_v, ++it_s, ++it_a) + for (; it_v != v.end(); ++it_v, ++it_s, ++it_a, ++it_o) { - // ADDEND_STR stores the symbol value and addend, each - // atmost 16 hex digits long. it_v points to a pair + // ADDEND_STR stores the symbol value and addend and offset, + // each atmost 16 hex digits long. it_a points to a pair // where first is the symbol value and second is the // addend. - char addend_str[34]; - snprintf(addend_str, sizeof(addend_str), "%llx %llx", - (*it_a).first, (*it_a).second); + char addend_str[50]; + snprintf(addend_str, sizeof(addend_str), "%llx %llx %lux", + (*it_a).first, (*it_a).second, (*it_o)); Section_id reloc_secn(it_v->first, it_v->second); // If this reloc turns back and points to the same section, diff --git a/gold/icf.h b/gold/icf.h index 76e491c094c..c1db8e586f5 100644 --- a/gold/icf.h +++ b/gold/icf.h @@ -39,25 +39,34 @@ class Symbol_table; class Icf { public: - typedef std::vector Sections_reachable_list; + typedef std::vector Sections_reachable_info; typedef std::vector Symbol_info; typedef std::vector > Addend_info; - typedef Unordered_map Section_list; - typedef Unordered_map Symbol_list; - typedef Unordered_map Addend_list; + typedef std::vector Offset_info; typedef Unordered_map Uniq_secn_id_map; typedef Unordered_set Secn_fptr_taken_set; + typedef struct + { + // This stores the section corresponding to the reloc. + Sections_reachable_info section_info; + // This stores the symbol corresponding to the reloc. + Symbol_info symbol_info; + // This stores the symbol value and the addend for a reloc. + Addend_info addend_info; + Offset_info offset_info; + } Reloc_info; + + typedef Unordered_map Reloc_info_list; + Icf() : id_section_(), section_id_(), kept_section_id_(), fptr_section_id_(), num_tracked_relocs(NULL), icf_ready_(false), - section_reloc_list_(), symbol_reloc_list_(), - addend_reloc_list_() + reloc_info_list_() { } // Returns the kept folded identical section corresponding to @@ -121,23 +130,10 @@ class Icf && !is_prefix_of(".eh_frame", section_name.c_str())); } - // Returns a map of a section to a list of all sections referenced - // by its relocations. - Section_list& - section_reloc_list() - { return this->section_reloc_list_; } - - // Returns a map of a section to a list of all symbols referenced - // by its relocations. - Symbol_list& - symbol_reloc_list() - { return this->symbol_reloc_list_; } - - // Returns a maps of a section to a list of symbol values and addends - // of its relocations. - Addend_list& - addend_reloc_list() - { return this->addend_reloc_list_; } + // Returns a map of a section to info (Reloc_info) about its relocations. + Reloc_info_list& + reloc_info_list() + { return this->reloc_info_list_; } // Returns a mapping of each section to a unique integer. Uniq_secn_id_map& @@ -161,11 +157,8 @@ class Icf unsigned int* num_tracked_relocs; // Flag to indicate if ICF has been run. bool icf_ready_; - - // These lists are populated by gc_process_relocs in gc.h. - Section_list section_reloc_list_; - Symbol_list symbol_reloc_list_; - Addend_list addend_reloc_list_; + // This list is populated by gc_process_relocs in gc.h. + Reloc_info_list reloc_info_list_; }; // This function returns true if this section corresponds to a function that