This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: Invalid LTOFF22X -> GPREL22 relaxation


On Tue, Nov 17, 2009 at 11:06 AM, Richard Henderson <rth@redhat.com> wrote:
> On 11/17/2009 10:37 AM, H.J. Lu wrote:
>>
>> ? ? ? ?PR ld/10955
>> ? ? ? ?* elfxx-ia64.c (elfNN_ia64_link_hash_table): Add max_short_sec,
>> ? ? ? ?max_short_offset, min_short_sec and min_short_offset.
>> ? ? ? ?(elfNN_ia64_update_short_info): New.
>> ? ? ? ?(elfNN_ia64_relax_section): Update max_short_sec,
>> ? ? ? ?max_short_offset, min_short_sec and min_short_offset.
>> ? ? ? ?(elfNN_ia64_choose_gp): Use min_short_sec/max_short_sec if
>> ? ? ? ?they are set.
>
> Looks good, thanks.
>

I made a mistake. I should record output section, not input section
since different input files may have the different input sections with
the same section name, which has the same output section. The new
binutils failed with gcc 4.4 on RHEL5/ia64.

I am testing this patch on gcc 4.4. I will check it in if it works.


-- 
H.J.
2009-11-17  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/10955
	* elfxx-ia64.c (elfNN_ia64_link_hash_table): Update comments.
	(elfNN_ia64_update_short_info): Remove "->output_section" from
	ia64_info->max_short_sec and ia64_info->min_short_sec.
	(elfNN_ia64_choose_gp): Likewise.
	(elfNN_ia64_relax_section): Pass tsec->output_section to
	elfNN_ia64_update_short_info.

diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c
index 5bf4d9e..ed105c8 100644
--- a/bfd/elfxx-ia64.c
+++ b/bfd/elfxx-ia64.c
@@ -176,9 +176,9 @@ struct elfNN_ia64_link_hash_table
      optimized from R_IA64_LTOFF22X, against non-SHF_IA_64_SHORT
      sections.  We need to record those sections so that we can choose
      a proper GP to cover all R_IA64_GPREL22 relocations.  */
-  asection *max_short_sec;	/* maximum short section */
+  asection *max_short_sec;	/* maximum short output section */
   bfd_vma max_short_offset;	/* maximum short offset */
-  asection *min_short_sec;	/* minimum short section */
+  asection *min_short_sec;	/* minimum short output section */
   bfd_vma min_short_offset;	/* minimum short offset */
 
   htab_t loc_hash_table;
@@ -782,13 +782,13 @@ elfNN_ia64_update_short_info (asection *sec, bfd_vma offset,
 	   && offset < ia64_info->min_short_offset)
     ia64_info->min_short_offset = offset;
   else if (sec->output_section->vma
-	   > ia64_info->max_short_sec->output_section->vma)
+	   > ia64_info->max_short_sec->vma)
     {
       ia64_info->max_short_sec = sec;
       ia64_info->max_short_offset = offset;
     }
   else if (sec->output_section->vma
-	   < ia64_info->min_short_sec->output_section->vma)
+	   < ia64_info->min_short_sec->vma)
     {
       ia64_info->min_short_sec = sec;
       ia64_info->min_short_offset = offset;
@@ -1218,7 +1218,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
 	    continue;
 
 	  if (r_type == R_IA64_GPREL22)
-	    elfNN_ia64_update_short_info (tsec,
+	    elfNN_ia64_update_short_info (tsec->output_section,
 					  tsec->output_offset + toff,
 					  ia64_info);
 	  else if (r_type == R_IA64_LTOFF22X)
@@ -1232,7 +1232,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
 		  changed_got |= !dyn_i->want_got;
 		}
 
-	      elfNN_ia64_update_short_info (tsec,
+	      elfNN_ia64_update_short_info (tsec->output_section,
 					    tsec->output_offset + toff,
 					    ia64_info);
 	    }
@@ -4313,14 +4313,14 @@ elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info)
   if (ia64_info->min_short_sec)
     {
       if (min_short_vma 
-	  > (ia64_info->min_short_sec->output_section->vma
+	  > (ia64_info->min_short_sec->vma
 	     + ia64_info->min_short_offset))
-	min_short_vma = (ia64_info->min_short_sec->output_section->vma
+	min_short_vma = (ia64_info->min_short_sec->vma
 			 + ia64_info->min_short_offset);
       if (max_short_vma
-	  < (ia64_info->max_short_sec->output_section->vma
+	  < (ia64_info->max_short_sec->vma
 	     + ia64_info->max_short_offset))
-	max_short_vma = (ia64_info->max_short_sec->output_section->vma
+	max_short_vma = (ia64_info->max_short_sec->vma
 			 + ia64_info->max_short_offset);
     }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]