* config/tc-m68k.c (md_apply_fix_2): Error if a short branch uses
authorIan Lance Taylor <ian@airs.com>
Tue, 26 Oct 1993 21:58:41 +0000 (21:58 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 26 Oct 1993 21:58:41 +0000 (21:58 +0000)
an illegal offset of 0 or -1.

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

index 0f665204f00ad32079155fbee12b9b8b471ab214..1d60a2d2fe75887d58137fb3c12e901b9c5a84f0 100644 (file)
@@ -1,5 +1,8 @@
 Tue Oct 26 16:58:36 1993  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
+       * config/tc-m68k.c (md_apply_fix_2): Error if a short branch uses
+       an illegal offset of 0 or -1.
+
        * config/obj-elf.c (obj_elf_init_stab_section): Align .stab
        section to a longword boundary.
 
index 5fe9ff9b7e971c2dbd5e07bd3e9be53c661ead9a..0e9ddbe3c76ea8a94336912b75518659a783adcd 100644 (file)
@@ -4032,7 +4032,17 @@ md_apply_fix_2 (fixP, val)
     upper_limit = upper_limit * 2 + 1;
 
   if ((unsigned) val > upper_limit && (val > 0 || val < lower_limit))
-    as_bad ("value out of range");
+    as_bad_where (fixP->fx_file, fixP->fx_line, "value out of range");
+
+  /* A one byte PC-relative reloc means a short branch.  We can't use
+     a short branch with a value of 0 or -1, because those indicate
+     different opcodes (branches with longer offsets).  */
+  if (fixP->fx_pcrel
+      && fixP->fx_size == 1
+      && (fixP->fx_addsy == NULL
+         || S_IS_DEFINED (fixP->fx_addsy))
+      && (val == 0 || val == -1))
+    as_bad_where (fixP->fx_file, fixP->fx_line, "invalid byte branch offset");
 }
 
 #ifdef BFD_ASSEMBLER