* elf32-mips.c (mips_elf_calculate_relocation): Fix overflow handling
authorThiemo Seufer <ths@networkno.de>
Fri, 7 Sep 2001 05:00:37 +0000 (05:00 +0000)
committerThiemo Seufer <ths@networkno.de>
Fri, 7 Sep 2001 05:00:37 +0000 (05:00 +0000)
of R_MIPS_PC16.

* config/tc-mips.c (append_insn): Handle BFD_RELOC_16_PCREL.
(macro_build): Use BFD_RELOC_16_PCREL_S2 only for embedded
PIC, BFD_RELOC_16_PCREL for the rest.
(mips_ip): Likewise.
        (md_pcrel_from): return the right offset for the differently shifted
        pcrel relocs.
(md_apply_fix): Handle BFD_RELOC_16_PCREL.

* gas/mips/beq.d: Check branches to external labels.
* gas/mips/beq.s: Likewise.
* gas/mips/bge.d: Likewise.
* gas/mips/bge.s: Likewise.
* gas/mips/bgeu.d: Likewise.
* gas/mips/bgeu.s: Likewise.
* gas/mips/blt.d: Likewise.
* gas/mips/blt.s: Likewise.
* gas/mips/bltu.d: Likewise.
* gas/mips/bltu.s: Likewise.
* gas/mips/elempic.d: Switch from R_MIPS_GNU_REL16_S2 to R_MIPS_PC16.
* gas/mips/empic.d: Likewise.
* gas/mips/empic.s: Likewise.
* gas/mips/telempic.d: Likewise.
* gas/mips/tempic.d: Likewise.

15 files changed:
bfd/ChangeLog
bfd/elf32-mips.c
gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/beq.d
gas/testsuite/gas/mips/beq.s
gas/testsuite/gas/mips/bge.d
gas/testsuite/gas/mips/bge.s
gas/testsuite/gas/mips/bgeu.d
gas/testsuite/gas/mips/bgeu.s
gas/testsuite/gas/mips/blt.d
gas/testsuite/gas/mips/blt.s
gas/testsuite/gas/mips/bltu.d
gas/testsuite/gas/mips/bltu.s

index 86fff1a6163cfe110322a6caec9cf108a4643c96..5f9e0a0d19851cab4fb578e3546ec90472558084 100644 (file)
@@ -1,3 +1,8 @@
+2001-09-07  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
+
+       * elf32-mips.c (mips_elf_calculate_relocation): Fix overflow handling
+       of R_MIPS_PC16.
+\r
 2001-09-06  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>\r
 \r
        * elf64-mips.c (mips_elf64_howto_table_rel): Fix relocation HOWTO\r
index 9ba61f0be6fe14cfbce0228542acddd27224c158..935f4fbd52c174708fd6bfe3687ae0a7cae69dd0 100644 (file)
@@ -6480,8 +6480,8 @@ mips_elf_calculate_relocation (abfd,
 
     case R_MIPS_PC16:
       value = mips_elf_sign_extend (addend, 16) + symbol - p;
-      value = (bfd_vma) ((bfd_signed_vma) value / 4);
       overflowed_p = mips_elf_overflow_p (value, 16);
+      value = (bfd_vma) ((bfd_signed_vma) value / 4);
       break;
 
     case R_MIPS_GOT_HI16:
index 7d4ba1613128029bfe6143b437bc1fd8010ce4a5..18a62f01283896943b123ec2859afd4219f1d8d7 100644 (file)
@@ -1,3 +1,13 @@
+2001-09-07  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
+
+       * config/tc-mips.c (append_insn): Handle BFD_RELOC_16_PCREL.
+       (macro_build): Use BFD_RELOC_16_PCREL_S2 only for embedded
+       PIC, BFD_RELOC_16_PCREL for the rest.
+       (mips_ip): Likewise.
+        (md_pcrel_from): return the right offset for the differently shifted
+        pcrel relocs.
+       (md_apply_fix): Handle BFD_RELOC_16_PCREL.
+\r
 2001-09-05  Richard Henderson  <rth@redhat.com>
 
        * config/tc-ia64.c (FUNC_IPLT_RELOC): New.
index 8057de9e6c83a6930cdd020981c81aaa56cf47af..c30176754d19893d49f8b5841814930687532a63 100644 (file)
@@ -1898,6 +1898,10 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
                 | ((address_expr->X_add_number & 0x3fffc) >> 2));
              break;
 
+           case BFD_RELOC_16_PCREL:
+             ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
+             break;
+
            case BFD_RELOC_16_PCREL_S2:
              goto need_reloc;
 
@@ -1914,7 +1918,8 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
            {
              fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
                                  address_expr,
-                                 reloc_type == BFD_RELOC_16_PCREL_S2,
+                                 (reloc_type == BFD_RELOC_16_PCREL
+                                  || reloc_type == BFD_RELOC_16_PCREL_S2),
                                  reloc_type);
              if (unmatched_hi)
                {
@@ -2699,7 +2704,10 @@ macro_build (place, counter, ep, name, fmt, va_alist)
              ep = NULL;
            }
          else
-           r = BFD_RELOC_16_PCREL_S2;
+           if (mips_pic == EMBEDDED_PIC)
+             r = BFD_RELOC_16_PCREL_S2;
+           else
+             r = BFD_RELOC_16_PCREL;
          continue;
 
        case 'a':
@@ -7796,7 +7804,10 @@ mips_ip (str, ip)
              continue;
 
            case 'p':           /* pc relative offset */
-             offset_reloc = BFD_RELOC_16_PCREL_S2;
+             if (mips_pic == EMBEDDED_PIC)
+               offset_reloc = BFD_RELOC_16_PCREL_S2;
+             else
+               offset_reloc = BFD_RELOC_16_PCREL;
              my_getExpression (&offset_expr, s);
              s = expr_end;
              continue;
@@ -9426,9 +9437,16 @@ md_pcrel_from (fixP)
       && fixP->fx_addsy != (symbolS *) NULL
       && ! S_IS_DEFINED (fixP->fx_addsy))
     {
-      /* This makes a branch to an undefined symbol be a branch to the
-        current location.  */
-      return 4;
+      if (mips_pic == EMBEDDED_PIC)
+       {
+         /* This makes a branch to an undefined symbol be a branch to the
+            current location.  */
+         return 4;
+       }
+      else
+       {
+         return 1;
+       }
     }
 
   /* return the address of the delay slot */
@@ -9665,7 +9683,8 @@ md_apply_fix (fixP, valueP)
          /* BFD's REL handling, for MIPS, is _very_ weird.
             This gives the right results, but it can't possibly
             be the way things are supposed to work.  */
-         if (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
+         if ((fixP->fx_r_type != BFD_RELOC_16_PCREL
+              && fixP->fx_r_type != BFD_RELOC_16_PCREL_S2)
              || S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
            value += fixP->fx_frag->fr_address + fixP->fx_where;
        }
@@ -9811,15 +9830,18 @@ md_apply_fix (fixP, valueP)
       break;
 
     case BFD_RELOC_16_PCREL_S2:
+      if ((value & 0x3) != 0)
+       as_bad_where (fixP->fx_file, fixP->fx_line,
+                     _("Branch to odd address (%lx)"), (long) value);
+
+      /* Fall through.  */
+
+    case BFD_RELOC_16_PCREL:
       /*
        * We need to save the bits in the instruction since fixup_segment()
        * might be deleting the relocation entry (i.e., a branch within
        * the current segment).
        */
-      if ((value & 0x3) != 0)
-       as_bad_where (fixP->fx_file, fixP->fx_line,
-                     _("Branch to odd address (%lx)"), (long) value);
-
       if (!fixP->fx_done && value != 0)
        break;
       /* If 'value' is zero, the remaining reloc code won't actually
index f0422b09e200ef8b1e89e76863322c9521d1c5fb..a037123ffae6552f97ccadf5e2332e158dc88a1b 100644 (file)
@@ -1,3 +1,21 @@
+2001-09-07  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
+
+       * gas/mips/beq.d: Check branches to external labels.
+       * gas/mips/beq.s: Likewise.
+       * gas/mips/bge.d: Likewise.
+       * gas/mips/bge.s: Likewise.
+       * gas/mips/bgeu.d: Likewise.
+       * gas/mips/bgeu.s: Likewise.
+       * gas/mips/blt.d: Likewise.
+       * gas/mips/blt.s: Likewise.
+       * gas/mips/bltu.d: Likewise.
+       * gas/mips/bltu.s: Likewise.
+       * gas/mips/elempic.d: Switch from R_MIPS_GNU_REL16_S2 to R_MIPS_PC16.
+       * gas/mips/empic.d: Likewise.
+       * gas/mips/empic.s: Likewise.
+       * gas/mips/telempic.d: Likewise.
+       * gas/mips/tempic.d: Likewise.
+\r
 2001-09-06  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
 
        * gas/mips/tmips16-f.d: New file, testcase for big endian MIPS16
index 2fa90f51785f591b8880ffd6818d21d1702fdc32..9eb24345e4ce86ba1d4541dd091571d8aec8bcd3 100644 (file)
@@ -37,4 +37,10 @@ Disassembly of section .text:
 0+2006c <[^>]*> nop
 0+20070 <[^>]*> jal    0+0000 <text_label>
 [      ]*20070: (MIPS_JMP|JMPADDR|R_MIPS_26)   .text
+0+20074 <[^>]*> nop
+0+20078 <[^>]*> b      0+20078 <text_label\+0x20078>
+[      ]*20078: R_MIPS_PC16    external_label
+0+2007c <[^>]*> nop
+0+20080 <[^>]*> bal    0+20080 <text_label\+0x20080>
+[      ]*20080: R_MIPS_PC16    external_label
        ...
index 9922eecb2790caaa7254462bab05fb9eb4cfd9e8..5567f02103408d5b7f70cf0034f41fca31b6fd05 100644 (file)
@@ -22,7 +22,9 @@ text_label:
        b       text_label
        bal     text_label
 
+# Branch to an external label.
+       b       external_label
+       bal     external_label
+
 # Round to a 16 byte boundary, for ease in testing multiple targets.
        nop
-       nop
-       nop
index 387fd3440b256a7b3d05ffe7491f2e841f189cb8..8ade2ad6143d48a2ba8cbcde99f5f6370f1b8f75 100644 (file)
@@ -50,4 +50,20 @@ Disassembly of section .text:
 0+00a4 <[^>]*> nop
 0+00a8 <[^>]*> slt     at,a1,a0
 0+00ac <[^>]*> bnezl   at,0+0000 <text_label>
+0+00b0 <[^>]*> nop
+0+00b4 <[^>]*> slt     at,a0,a1
+0+00b8 <[^>]*> beqz    at,000000b8 <text_label\+0xb8>
+[      ]*b8: R_MIPS_PC16       external_label
+0+00bc <[^>]*> nop
+0+00c0 <[^>]*> slt     at,a1,a0
+0+00c4 <[^>]*> bnez    at,000000c4 <text_label\+0xc4>
+[      ]*c4: R_MIPS_PC16       external_label
+0+00c8 <[^>]*> nop
+0+00cc <[^>]*> slt     at,a0,a1
+0+00d0 <[^>]*> beqzl   at,000000d0 <text_label\+0xd0>
+[      ]*d0: R_MIPS_PC16       external_label
+0+00d4 <[^>]*> nop
+0+00d8 <[^>]*> slt     at,a1,a0
+0+00dc <[^>]*> bnezl   at,000000dc <text_label\+0xdc>
+[      ]*dc: R_MIPS_PC16       external_label
        ...
index 405fd82b2b7126491c4f5771ab308a775e097b0c..4b4e58f6d69bad91c5a64ff4b84ace7ad27b957e 100644 (file)
@@ -24,6 +24,12 @@ text_label:
        bgel    $4,$5,text_label
        bgtl    $4,$5,text_label
 
+# Branch to an external label.
+       bge     $4,$5,external_label
+       bgt     $4,$5,external_label
+       bgel    $4,$5,external_label
+       bgtl    $4,$5,external_label
+
 # Round to a 16 byte boundary, for ease in testing multiple targets.
        nop
        nop
index 8f2bfa7c4c1802ad9ad9fd648fec731605a2967d..49d11303ca41c3e40736dc5b9521c9c65ee3b48a 100644 (file)
@@ -44,4 +44,20 @@ Disassembly of section .text:
 0+008c <[^>]*> nop
 0+0090 <[^>]*> sltu    at,a1,a0
 0+0094 <[^>]*> bnezl   at,0+0000 <text_label>
+0+0098 <[^>]*> nop
+0+009c <[^>]*> sltu    at,a0,a1
+0+00a0 <[^>]*> beqz    at,000000a0 <text_label\+0xa0>
+[      ]*a0: R_MIPS_PC16       external_label
+0+00a4 <[^>]*> nop
+0+00a8 <[^>]*> sltu    at,a1,a0
+0+00ac <[^>]*> bnez    at,000000ac <text_label\+0xac>
+[      ]*ac: R_MIPS_PC16       external_label
+0+00b0 <[^>]*> nop
+0+00b4 <[^>]*> sltu    at,a0,a1
+0+00b8 <[^>]*> beqzl   at,000000b8 <text_label\+0xb8>
+[      ]*b8: R_MIPS_PC16       external_label
+0+00bc <[^>]*> nop
+0+00c0 <[^>]*> sltu    at,a1,a0
+0+00c4 <[^>]*> bnezl   at,000000c4 <text_label\+0xc4>
+[      ]*c4: R_MIPS_PC16       external_label
        ...
index 1c37f96939c19484be94adb1e6560c89acc49908..cccd584f780a4d38d1bb20a946514180e7a7ad08 100644 (file)
@@ -22,6 +22,12 @@ text_label:
        bgeul   $4,$5,text_label
        bgtul   $4,$5,text_label
 
+# Branch to an external label.
+       bgeu    $4,$5,external_label
+       bgtu    $4,$5,external_label
+       bgeul   $4,$5,external_label
+       bgtul   $4,$5,external_label
+
 # Round to a 16 byte boundary, for ease in testing multiple targets.
        nop
        nop
index 3423cdf1ec5db4b84983a4b1567b601f4e9d6ad5..d7670c0fdd33247ea53a049084af386d263f120c 100644 (file)
@@ -50,4 +50,20 @@ Disassembly of section .text:
 0+00a4 <[^>]*> nop
 0+00a8 <[^>]*> slt     at,a1,a0
 0+00ac <[^>]*> beqzl   at,0+0000 <text_label>
+0+00b0 <[^>]*> nop
+0+00b4 <[^>]*> slt     at,a0,a1
+0+00b8 <[^>]*> bnez    at,000000b8 <text_label\+0xb8>
+[      ]*b8: R_MIPS_PC16       external_label
+0+00bc <[^>]*> nop
+0+00c0 <[^>]*> slt     at,a1,a0
+0+00c4 <[^>]*> beqz    at,000000c4 <text_label\+0xc4>
+[      ]*c4: R_MIPS_PC16       external_label
+0+00c8 <[^>]*> nop
+0+00cc <[^>]*> slt     at,a0,a1
+0+00d0 <[^>]*> bnezl   at,000000d0 <text_label\+0xd0>
+[      ]*d0: R_MIPS_PC16       external_label
+0+00d4 <[^>]*> nop
+0+00d8 <[^>]*> slt     at,a1,a0
+0+00dc <[^>]*> beqzl   at,000000dc <text_label\+0xdc>
+[      ]*dc: R_MIPS_PC16       external_label
        ...
index 000305696dd6eec4928c779d36d88770e015a5d1..9b2ed08524f396cd7d6212d7df6073ab87f1ae6d 100644 (file)
@@ -24,6 +24,12 @@ text_label:
        bltl    $4,$5,text_label
        blel    $4,$5,text_label
 
+# Branch to an external label.
+       blt     $4,$5,external_label
+       ble     $4,$5,external_label
+       bltl    $4,$5,external_label
+       blel    $4,$5,external_label
+
 # Round to a 16 byte boundary, for ease in testing multiple targets.
        nop
        nop
index 63dcd1794c0a2b9398f7ef167886af11370223d1..0e2a644fc43c3904688884fa893cb2c7c1486b51 100644 (file)
@@ -44,4 +44,20 @@ Disassembly of section .text:
 0+008c <[^>]*> nop
 0+0090 <[^>]*> sltu    at,a1,a0
 0+0094 <[^>]*> beqzl   at,0+0000 <text_label>
+0+0098 <[^>]*> nop
+0+009c <[^>]*> sltu    at,a0,a1
+0+00a0 <[^>]*> bnez    at,000000a0 <text_label\+0xa0>
+[      ]*a0: R_MIPS_PC16       external_label
+0+00a4 <[^>]*> nop
+0+00a8 <[^>]*> sltu    at,a1,a0
+0+00ac <[^>]*> beqz    at,000000ac <text_label\+0xac>
+[      ]*ac: R_MIPS_PC16       external_label
+0+00b0 <[^>]*> nop
+0+00b4 <[^>]*> sltu    at,a0,a1
+0+00b8 <[^>]*> bnezl   at,000000b8 <text_label\+0xb8>
+[      ]*b8: R_MIPS_PC16       external_label
+0+00bc <[^>]*> nop
+0+00c0 <[^>]*> sltu    at,a1,a0
+0+00c4 <[^>]*> beqzl   at,000000c4 <text_label\+0xc4>
+[      ]*c4: R_MIPS_PC16       external_label
        ...
index 44b1ae629eb03ee4c525cc019da39400619d918f..602b7b283d65559ca26e511d90832e20b72d96b8 100644 (file)
@@ -22,6 +22,12 @@ text_label:
        bltul   $4,$5,text_label
        bleul   $4,$5,text_label
 
+# Branch to an external label.
+       bltu    $4,$5,external_label
+       bleu    $4,$5,external_label
+       bltul   $4,$5,external_label
+       bleul   $4,$5,external_label
+
 # Round to a 16 byte boundary, for ease in testing multiple targets.
        nop
        nop