Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/gpl3/binutils/dist/bfd Revert last change to elf32-...



details:   https://anonhg.NetBSD.org/src/rev/c13c449ae51c
branches:  trunk
changeset: 771973:c13c449ae51c
user:      skrll <skrll%NetBSD.org@localhost>
date:      Mon Dec 12 07:40:56 2011 +0000

description:
Revert last change to elf32-hppa.c and pull across the fix to my binutils
PR 13476.

tests/lib/libc/tls on hppa still passes with this change.

diffstat:

 external/gpl3/binutils/dist/bfd/ChangeLog    |  10 +++
 external/gpl3/binutils/dist/bfd/elf32-hppa.c |  78 +++++++++++++++------------
 2 files changed, 53 insertions(+), 35 deletions(-)

diffs (127 lines):

diff -r e9a168abf10c -r c13c449ae51c external/gpl3/binutils/dist/bfd/ChangeLog
--- a/external/gpl3/binutils/dist/bfd/ChangeLog Mon Dec 12 02:44:14 2011 +0000
+++ b/external/gpl3/binutils/dist/bfd/ChangeLog Mon Dec 12 07:40:56 2011 +0000
@@ -1,3 +1,13 @@
+2011-12-11  John Davis Anglin  <dave.anglin%nrc-cnrc.gc.ca@localhost>
+
+       PR binutils/13476
+       * elf32-hppa.c (final_link_relocate): Convert R_PARISC_TLS_GD21L,
+       R_PARISC_TLS_LDM21L and R_PARISC_TLS_IE21L relocations to
+       R_PARISC_DPREL21L when not doing a shared link.  Likewise convert
+       R_PARISC_TLS_GD14R, R_PARISC_TLS_LDM14R and R_PARISC_TLS_IE14R to
+       R_PARISC_DPREL14R.  Handle R_PARISC_TLS_GD21L, R_PARISC_TLS_LDM21L
+       and R_PARISC_TLS_IE21L with R_PARISC_DLTIND21L.
+
 2011-06-27  Tristan Gingold  <gingold%adacore.com@localhost>
 
        * configure.in: Bump version to 2.21.1
diff -r e9a168abf10c -r c13c449ae51c external/gpl3/binutils/dist/bfd/elf32-hppa.c
--- a/external/gpl3/binutils/dist/bfd/elf32-hppa.c      Mon Dec 12 02:44:14 2011 +0000
+++ b/external/gpl3/binutils/dist/bfd/elf32-hppa.c      Mon Dec 12 07:40:56 2011 +0000
@@ -3356,10 +3356,16 @@
       switch (r_type)
        {
          case R_PARISC_DLTIND21L:
+         case R_PARISC_TLS_GD21L:
+         case R_PARISC_TLS_LDM21L:
+         case R_PARISC_TLS_IE21L:
            r_type = R_PARISC_DPREL21L;
            break;
 
          case R_PARISC_DLTIND14R:
+         case R_PARISC_TLS_GD14R:
+         case R_PARISC_TLS_LDM14R:
+         case R_PARISC_TLS_IE14R:
            r_type = R_PARISC_DPREL14R;
            break;
 
@@ -3430,41 +3436,43 @@
         most efficient way of using PIC code in an incomplete executable,
         but the user must follow the standard runtime conventions for
         accessing data for this to work.  */
-      if (orig_r_type == R_PARISC_DLTIND21L)
+      if (orig_r_type != r_type)
        {
-         /* Convert addil instructions if the original reloc was a
-            DLTIND21L.  GCC sometimes uses a register other than r19 for
-            the operation, so we must convert any addil instruction
-            that uses this relocation.  */
-         if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
-           insn = ADDIL_DP;
-         else
-           /* We must have a ldil instruction.  It's too hard to find
-              and convert the associated add instruction, so issue an
-              error.  */
-           (*_bfd_error_handler)
-             (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
-              input_bfd,
-              input_section,
-              (long) offset,
-              howto->name,
-              insn);
+         if (r_type == R_PARISC_DPREL21L)
+           {
+             /* GCC sometimes uses a register other than r19 for the
+                operation, so we must convert any addil instruction
+                that uses this relocation.  */
+             if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
+               insn = ADDIL_DP;
+             else
+               /* We must have a ldil instruction.  It's too hard to find
+                  and convert the associated add instruction, so issue an
+                  error.  */
+               (*_bfd_error_handler)
+                 (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
+                  input_bfd,
+                  input_section,
+                  (long) offset,
+                  howto->name,
+                  insn);
+           }
+         else if (r_type == R_PARISC_DPREL14F)
+           {
+             /* This must be a format 1 load/store.  Change the base
+                register to dp.  */
+             insn = (insn & 0xfc1ffff) | (27 << 21);
+           }
        }
-      else if (orig_r_type == R_PARISC_DLTIND14F)
-       {
-         /* This must be a format 1 load/store.  Change the base
-            register to dp.  */
-         insn = (insn & 0xfc1ffff) | (27 << 21);
-       }
-
-    /* For all the DP relative relocations, we need to examine the symbol's
-       section.  If it has no section or if it's a code section, then
-       "data pointer relative" makes no sense.  In that case we don't
-       adjust the "value", and for 21 bit addil instructions, we change the
-       source addend register from %dp to %r0.  This situation commonly
-       arises for undefined weak symbols and when a variable's "constness"
-       is declared differently from the way the variable is defined.  For
-       instance: "extern int foo" with foo defined as "const int foo".  */
+
+      /* For all the DP relative relocations, we need to examine the symbol's
+        section.  If it has no section or if it's a code section, then
+        "data pointer relative" makes no sense.  In that case we don't
+        adjust the "value", and for 21 bit addil instructions, we change the
+        source addend register from %dp to %r0.  This situation commonly
+        arises for undefined weak symbols and when a variable's "constness"
+        is declared differently from the way the variable is defined.  For
+        instance: "extern int foo" with foo defined as "const int foo".  */
       if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
        {
          if ((insn & ((0x3f << 26) | (0x1f << 21)))
@@ -3482,10 +3490,10 @@
     case R_PARISC_DLTIND14R:
     case R_PARISC_DLTIND14F:
     case R_PARISC_TLS_GD21L:
+    case R_PARISC_TLS_LDM21L:
+    case R_PARISC_TLS_IE21L:
     case R_PARISC_TLS_GD14R:
-    case R_PARISC_TLS_LDM21L:
     case R_PARISC_TLS_LDM14R:
-    case R_PARISC_TLS_IE21L:
     case R_PARISC_TLS_IE14R:
       value -= elf_gp (input_section->output_section->owner);
       break;



Home | Main Index | Thread Index | Old Index