Add checks for overfar branches
authorDJ Delorie <dj@redhat.com>
Wed, 2 Apr 2014 20:50:29 +0000 (16:50 -0400)
committerDJ Delorie <dj@redhat.com>
Wed, 2 Apr 2014 20:50:29 +0000 (16:50 -0400)
Check 8 and 16 bit PCREL fixes for overflow, since we bypass the
later overflow checks in write.c.  Direct relocs are left alone,
as gcc has been known to take advantage of the silent overflows
when comparing addresses to constant ranges.

gas/ChangeLog
gas/config/tc-rl78.c

index c6b2bb543a0108e5411519fa7ec5253b75bb519a..c7adc4cc2b48d91d155471bc1f8214ecb86da16f 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-02  DJ Delorie  <dj@redhat.com>
+
+       * config/tc-rl78.c (md_apply_fix): Add overflow warnings for
+       pc-relative branches.
+
 2014-04-02  Nick Clifton  <nickc@redhat.com>
 
        PR gas/16765
index ae8f5af8d19b8a3d64502f392e0e4f697ca30562..bbbf47bb400095f0e514a64057e3881402c700ee 100644 (file)
@@ -1310,13 +1310,23 @@ md_apply_fix (struct fix * f ATTRIBUTE_UNUSED,
       f->fx_done = 1;
       break;
 
-    case BFD_RELOC_8:
     case BFD_RELOC_8_PCREL:
+      if ((long)val < -128 || (long)val > 127)
+       as_bad_where (f->fx_file, f->fx_line,
+                     _("value of %ld too large for 8-bit branch"),
+                     val);
+      /* Fall through.  */
+    case BFD_RELOC_8:
       op[0] = val;
       break;
 
-    case BFD_RELOC_16:
     case BFD_RELOC_16_PCREL:
+      if ((long)val < -32768 || (long)val > 32767)
+       as_bad_where (f->fx_file, f->fx_line,
+                     _("value of %ld too large for 16-bit branch"),
+                     val);
+      /* Fall through.  */
+    case BFD_RELOC_16:
     case BFD_RELOC_RL78_CODE:
       op[0] = val;
       op[1] = val >> 8;