PR ld/12928
authorRichard Henderson <rth@redhat.com>
Fri, 24 Jun 2011 17:38:17 +0000 (17:38 +0000)
committerRichard Henderson <rth@redhat.com>
Fri, 24 Jun 2011 17:38:17 +0000 (17:38 +0000)
        * elf64-alpha.c (elf64_alpha_relax_tls_get_addr): Recover the
        tlsgd insn before swapping adjacent insns.

bfd/ChangeLog
bfd/elf64-alpha.c

index 96297a3dda636ef673b20d44fb909c0b57b76a6a..c7a634f77b0ec9df32255ebf9a5c18b7cab93d4c 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-24  Richard Henderson  <rth@redhat.com>
+
+       PR ld/12928
+       * elf64-alpha.c (elf64_alpha_relax_tls_get_addr): Recover the
+       tlsgd insn before swapping adjacent insns.
+
 2011-06-24  Tristan Gingold  <gingold@adacore.com>
 
        * vms-alpha.c (alpha_vms_slurp_relocs): Add a guard for relocs in the
index 46078ea4a48794d33ed171c5ddb3442e99a40938..60767099c6b165f5203601edbfc10c60e01878b5 100644 (file)
@@ -3508,6 +3508,13 @@ elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
   pos[3] = info->contents + gpdisp->r_offset;
   pos[4] = pos[3] + gpdisp->r_addend;
 
+  /* Beware of the compiler hoisting part of the sequence out a loop
+     and adjusting the destination register for the TLSGD insn.  If this
+     happens, there will be a move into $16 before the JSR insn, so only
+     transformations of the first insn pair should use this register.  */
+  tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
+  tlsgd_reg = (tlsgd_reg >> 21) & 31;
+
   /* Generally, the positions are not allowed to be out of order, lest the
      modified insn sequence have different register lifetimes.  We can make
      an exception when pos 1 is adjacent to pos 0.  */
@@ -3575,13 +3582,6 @@ elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
   use_gottprel = FALSE;
   new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
 
-  /* Beware of the compiler hoisting part of the sequence out a loop
-     and adjusting the destination register for the TLSGD insn.  If this
-     happens, there will be a move into $16 before the JSR insn, so only
-     transformations of the first insn pair should use this register.  */
-  tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
-  tlsgd_reg = (tlsgd_reg >> 21) & 31;
-
   switch (!dynamic && !info->link_info->shared)
     {
     case 1: