This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: Invalid LTOFF22X -> GPREL22 relaxation
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: binutils at sourceware dot org
- Date: Tue, 17 Nov 2009 12:04:50 -0800
- Subject: Re: PATCH: Invalid LTOFF22X -> GPREL22 relaxation
- References: <20091117183723.GA26490@lucon.org> <4B02F43F.20008@redhat.com>
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);
}