bfd/
authorMark Shinwell <shinwell@codesourcery.com>
Tue, 15 May 2007 09:54:09 +0000 (09:54 +0000)
committerMark Shinwell <shinwell@codesourcery.com>
Tue, 15 May 2007 09:54:09 +0000 (09:54 +0000)
* elf32-arm.c (elf32_arm_final_link_relocate): Correctly
handle the Thumb-2 JUMP19 relocation.

ld/testsuite/
* ld-arm/arm-elf.exp: Add jump19 testcase.
* ld-arm/jump19.d: New.
* ld-arm/jump19.s: New.

bfd/ChangeLog
bfd/elf32-arm.c
ld/testsuite/ChangeLog
ld/testsuite/ld-arm/arm-elf.exp
ld/testsuite/ld-arm/jump19.d [new file with mode: 0644]
ld/testsuite/ld-arm/jump19.s [new file with mode: 0644]

index 1a97ba19f41c345d4ac4cf8796ccc9f07b348eff..5d54f5c27e744bb8dded9852042bc313ef0d1b7d 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-15  Mark Shinwell  <shinwell@codesourcery.com>
+
+       * elf32-arm.c (elf32_arm_final_link_relocate): Correctly
+       handle the Thumb-2 JUMP19 relocation.
+
 2007-05-15  Alan Modra  <amodra@bigpond.net.au>
 
        PR 4479
index 1eb0cf66887f5c60299ec20b4231bbbe9a7b0acc..7ad4a4ad9576b5f4e4d8d903b6905ab16108d7ee 100644 (file)
@@ -5213,9 +5213,8 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
        bfd_boolean overflow = FALSE;
        bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
        bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
-       bfd_signed_vma reloc_signed_max = ((1 << (howto->bitsize - 1)) - 1) >> howto->rightshift;
-       bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
-       bfd_vma check;
+       bfd_signed_vma reloc_signed_max = 0xffffe;
+       bfd_signed_vma reloc_signed_min = -0x100000;
        bfd_signed_vma signed_check;
 
        /* Need to refetch the addend, reconstruct the top three bits,
@@ -5223,14 +5222,14 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
        if (globals->use_rel)
          {
            bfd_vma S     = (upper_insn & 0x0400) >> 10;
-           bfd_vma upper = (upper_insn & 0x001f);
+           bfd_vma upper = (upper_insn & 0x003f);
            bfd_vma J1    = (lower_insn & 0x2000) >> 13;
            bfd_vma J2    = (lower_insn & 0x0800) >> 11;
            bfd_vma lower = (lower_insn & 0x07ff);
 
-           upper |= J2 << 6;
-           upper |= J1 << 7;
-           upper |= ~S << 8;
+           upper |= J1 << 6;
+           upper |= J2 << 7;
+           upper |= (!S) << 8;
            upper -= 0x0100; /* Sign extend.  */
 
            addend = (upper << 12) | (lower << 1);
@@ -5244,17 +5243,8 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
        relocation -= (input_section->output_section->vma
                       + input_section->output_offset
                       + rel->r_offset);
+       signed_check = (bfd_signed_vma) relocation;
 
-       check = relocation >> howto->rightshift;
-
-       /* If this is a signed value, the rightshift just dropped
-          leading 1 bits (assuming twos complement).  */
-       if ((bfd_signed_vma) relocation >= 0)
-         signed_check = check;
-       else
-         signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
-
-       /* Assumes two's complement.  */
        if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
          overflow = TRUE;
 
@@ -5266,7 +5256,7 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
          bfd_vma hi = (relocation & 0x0003f000) >> 12;
          bfd_vma lo = (relocation & 0x00000ffe) >>  1;
 
-         upper_insn = (upper_insn & 0xfb30) | (S << 10) | hi;
+         upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
          lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
        }
 
index 2ccb103b422d2ba655c109767c3c995357f8563e..0f8e42159ff3492b09e117fdfef9f6e24a187844 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-15  Mark Shinwell  <shinwell@codesourcery.com>
+
+       * ld-arm/arm-elf.exp: Add jump19 testcase.
+       * ld-arm/jump19.d: New.
+       * ld-arm/jump19.s: New.
+
 2007-05-14  Richard Sandiford  <richard@codesourcery.com>
 
        * ld-sh/vxworks1.dd: Remove hexadecimal prefixes from constant pool
index f28bd095d9d41d4a98d51da76c5f940aad01b408..6442df4b057357ab6d4cad2235e2c8164adb6d7e 100644 (file)
@@ -163,6 +163,9 @@ set armelftests {
      {preempt-app.s}
      {{readelf -Ds preempt-app.sym}}
      "preempt-app"}
+     {"jump19" "-static -T arm.ld" "" {jump19.s}
+      {{objdump -dr jump19.d}}
+      "jump19"}
 }
 
 run_ld_link_tests $armelftests
diff --git a/ld/testsuite/ld-arm/jump19.d b/ld/testsuite/ld-arm/jump19.d
new file mode 100644 (file)
index 0000000..303477f
--- /dev/null
@@ -0,0 +1,12 @@
+
+.*jump19:     file format elf32-(big|little)arm
+
+Disassembly of section .text:
+
+00008000 <_start>:
+    8000:      4280            cmp     r0, r0
+    8002:      f010 8000       beq.w   18006 <bar>
+       ...
+
+00018006 <bar>:
+   18006:      4770            bx      lr
diff --git a/ld/testsuite/ld-arm/jump19.s b/ld/testsuite/ld-arm/jump19.s
new file mode 100644 (file)
index 0000000..1e3ddf0
--- /dev/null
@@ -0,0 +1,12 @@
+@ Test the Thumb-2 JUMP19 relocation.
+
+       .syntax unified
+       .thumb
+       .global _start
+_start:
+       cmp     r0, r0
+       beq.w   bar
+       .space 65536
+       .weak bar
+bar:
+       bx      lr