2010-02-20 Sriraman Tallam <tmsriram@google.com>
authorSriraman Tallam <tmsriram@google.com>
Sun, 21 Feb 2010 00:57:59 +0000 (00:57 +0000)
committerSriraman Tallam <tmsriram@google.com>
Sun, 21 Feb 2010 00:57:59 +0000 (00:57 +0000)
* 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.

gold/ChangeLog
gold/gc.h
gold/icf.cc
gold/icf.h

index 3c68e5b..e752bf5 100644 (file)
@@ -1,3 +1,20 @@
+2010-02-20  Sriraman Tallam  <tmsriram@google.com>
+
+       * 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  <dougkwan@google.com>
 
        * arm-reloc.def: Mark R_ARM_TLS_GD32, R_ARM_TLS_LDM32,
index d4fd02e..b79bd77 100644 (file)
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -181,9 +181,10 @@ gc_process_relocs(
   const int reloc_size = Reloc_types<sh_type, size, big_endian>::reloc_size;
   const int sym_size = elfcpp::Elf_sizes<size>::sym_size;
 
-  std::vector<Section_id>* secvec = NULL;
-  std::vector<Symbol*>* symvec = NULL;
-  std::vector<std::pair<long long, long long> >* 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<long long>(lsym.get_st_value());
               (*addendvec).push_back(std::make_pair(symvalue,
                                               static_cast<long long>(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<long long>(sized_gsym->value());
               (*addendvec).push_back(std::make_pair(symvalue,
                                         static_cast<long long>(addend)));
+              uint64_t reloc_offset =
+                convert_to_section_size_type(reloc.get_r_offset());
+             (*offsetvec).push_back(reloc_offset);
            }
         }
       if (parameters->options().gc_sections())
index ec3269c..752aa55 100644 (file)
@@ -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,
index 76e491c..c1db8e5 100644 (file)
@@ -39,25 +39,34 @@ class Symbol_table;
 class Icf
 {
  public:
-  typedef std::vector<Section_id> Sections_reachable_list;
+  typedef std::vector<Section_id> Sections_reachable_info;
   typedef std::vector<Symbol*> Symbol_info;
   typedef std::vector<std::pair<long long, long long> > Addend_info;
-  typedef Unordered_map<Section_id,
-                        Sections_reachable_list,
-                        Section_id_hash> Section_list;
-  typedef Unordered_map<Section_id, Symbol_info, Section_id_hash> Symbol_list;
-  typedef Unordered_map<Section_id, Addend_info, Section_id_hash> Addend_list;
+  typedef std::vector<uint64_t> Offset_info;
   typedef Unordered_map<Section_id,
                         unsigned int,
                         Section_id_hash> Uniq_secn_id_map;
   typedef Unordered_set<Section_id, Section_id_hash> 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<Section_id, Reloc_info,
+                        Section_id_hash> 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