* gc.h (gc_process_relocs): Don't look through function descriptors.
authorAlan Modra <amodra@gmail.com>
Fri, 15 Mar 2013 07:51:32 +0000 (07:51 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 15 Mar 2013 07:51:32 +0000 (07:51 +0000)
* icf.cc (get_section_contents): Do so here instead.

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

index 6913ace..6be58e9 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-15  Alan Modra  <amodra@gmail.com>
+
+       * gc.h (gc_process_relocs): Don't look through function descriptors.
+       * icf.cc (get_section_contents): Do so here instead.
+
 2013-03-13  Alan Modra  <amodra@gmail.com>
 
        * powerpc.cc (is_branch_reloc): Forward declare.
index 6930ace..4224a66 100644 (file)
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -253,21 +253,7 @@ gc_process_relocs(
             {
              Address symvalue = dst_off - addend;
              if (is_ordinary) 
-               {
-                 Symbol_location loc;
-                 loc.object = dst_obj;
-                 loc.shndx = dst_indx;
-                 loc.offset = convert_types<off_t, Address>(dst_off);
-                 // Look through function descriptors.
-                 parameters->target().function_location(&loc);
-                 if (loc.shndx != dst_indx)
-                   {
-                     // Modify symvalue/addend to the code entry.
-                     symvalue = loc.offset;
-                     addend = 0;
-                   }
-                 (*secvec).push_back(Section_id(loc.object, loc.shndx));
-               }
+               (*secvec).push_back(Section_id(dst_obj, dst_indx));
              else
                 (*secvec).push_back(Section_id(NULL, 0));
               (*symvec).push_back(NULL);
@@ -343,21 +329,7 @@ gc_process_relocs(
             {
              Address symvalue = dst_off - addend;
               if (is_ordinary && gsym->source() == Symbol::FROM_OBJECT)
-               {
-                 Symbol_location loc;
-                 loc.object = dst_obj;
-                 loc.shndx = dst_indx;
-                 loc.offset = convert_types<off_t, Address>(dst_off);
-                 // Look through function descriptors.
-                 parameters->target().function_location(&loc);
-                 if (loc.shndx != dst_indx)
-                   {
-                     // Modify symvalue/addend to the code entry.
-                     symvalue = loc.offset;
-                     addend = 0;
-                   }
-                 (*secvec).push_back(Section_id(loc.object, loc.shndx));
-               }
+               (*secvec).push_back(Section_id(dst_obj, dst_indx));
              else
                 (*secvec).push_back(Section_id(NULL, 0));
               (*symvec).push_back(gsym);
index 5935c5b..a58e34f 100644 (file)
@@ -288,6 +288,25 @@ get_section_contents(bool first_iteration,
 
       for (; it_v != v.end(); ++it_v, ++it_s, ++it_a, ++it_o, ++it_addend_size)
         {
+         if (first_iteration
+             && it_v->first != NULL)
+           {
+             Symbol_location loc;
+             loc.object = it_v->first;
+             loc.shndx = it_v->second;
+             loc.offset = convert_types<off_t, long long>(it_a->first
+                                                          + it_a->second);
+             // Look through function descriptors
+             parameters->target().function_location(&loc);
+             if (loc.shndx != it_v->second)
+               {
+                 it_v->second = loc.shndx;
+                 // Modify symvalue/addend to the code entry.
+                 it_a->first = loc.offset;
+                 it_a->second = 0;
+               }
+           }
+
           // ADDEND_STR stores the symbol value and addend and offset,
           // each at most 16 hex digits long.  it_a points to a pair
           // where first is the symbol value and second is the