2004-01-07 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 7 Jan 2004 21:34:24 +0000 (21:34 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 7 Jan 2004 21:34:24 +0000 (21:34 +0000)
* elfxx-ia64.c (elfNN_ia64_relax_section): Don't install
trampoline if it is known out of range.

bfd/ChangeLog
bfd/elfxx-ia64.c

index a90f4f7c3937cb788fd9ac8482495338b1d353b9..eec219a4ef1ea34406c9e3f40775786d75191f01 100644 (file)
@@ -1,3 +1,8 @@
+2004-01-07  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elfxx-ia64.c (elfNN_ia64_relax_section): Don't install
+       trampoline if it is known out of range.
+
 2004-01-06  Alexandre Oliva  <aoliva@redhat.com>
 
        2003-12-17  Alexandre Oliva  <aoliva@redhat.com>
index aba571a415ed05af102ffe33578a6aa8d9d56f04..c699922154dd5aebac4928128587b8723b3ee1b3 100644 (file)
@@ -876,6 +876,8 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
 
       if (is_branch)
        {
+         bfd_signed_vma offset;
+
          reladdr = (sec->output_section->vma
                     + sec->output_offset
                     + roff) & (bfd_vma) -4;
@@ -911,6 +913,13 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
 
              /* Resize the current section to make room for the new branch. */
              trampoff = (sec->_cooked_size + 15) & (bfd_vma) -16;
+
+             /* If trampoline is out of range, there is nothing we
+                can do.  */
+             offset = trampoff - (roff & (bfd_vma) -4);
+             if (offset < -0x1000000 || offset > 0x0FFFFF0)
+               continue;
+
              amt = trampoff + size;
              contents = (bfd_byte *) bfd_realloc (contents, amt);
              if (contents == NULL)
@@ -957,14 +966,18 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again)
            }
          else
            {
+             /* If trampoline is out of range, there is nothing we
+                can do.  */
+             offset = f->trampoff - (roff & (bfd_vma) -4);
+             if (offset < -0x1000000 || offset > 0x0FFFFF0)
+               continue;
+
              /* Nop out the reloc, since we're finalizing things here.  */
              irel->r_info = ELFNN_R_INFO (0, R_IA64_NONE);
            }
 
-         /* Fix up the existing branch to hit the trampoline.  Hope like
-            hell this doesn't overflow too.  */
-         if (elfNN_ia64_install_value (abfd, contents + roff,
-                                       f->trampoff - (roff & (bfd_vma) -4),
+         /* Fix up the existing branch to hit the trampoline.  */
+         if (elfNN_ia64_install_value (abfd, contents + roff, offset,
                                        r_type) != bfd_reloc_ok)
            goto error_return;