gas/
authorMark Shinwell <shinwell@codesourcery.com>
Fri, 23 Mar 2007 10:43:35 +0000 (10:43 +0000)
committerMark Shinwell <shinwell@codesourcery.com>
Fri, 23 Mar 2007 10:43:35 +0000 (10:43 +0000)
* config/tc-arm.c (md_apply_fix): Turn CZB instructions that
attempt to jump to the next instruction into NOPs.

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

index 87c80be..f66b59b 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-23  Mark Shinwell  <shinwell@codesourcery.com>
+
+       * config/tc-arm.c (md_apply_fix): Turn CZB instructions that
+       attempt to jump to the next instruction into NOPs.
+
 2007-03-23  Alan Modra  <amodra@bigpond.net.au>
 
        * config/tc-spu.c: Don't include opcode/spu.h.
index aa2ac05..72ff8f4 100644 (file)
@@ -18101,16 +18101,32 @@ md_apply_fix (fixS *  fixP,
 
     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
       /* CBZ can only branch forward.  */
-      if (value & ~0x7e)
-       as_bad_where (fixP->fx_file, fixP->fx_line,
-                     _("branch out of range"));
 
-      if (fixP->fx_done || !seg->use_rela_p)
+      /* Attempts to use CBZ to branch to the next instruction
+         (which, strictly speaking, are prohibited) will be turned into
+         no-ops.
+
+        FIXME: It may be better to remove the instruction completely and
+        perform relaxation.  */
+      if (value == -2)
        {
          newval = md_chars_to_number (buf, THUMB_SIZE);
-         newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
+         newval = 0xbf00; /* NOP encoding T1 */
          md_number_to_chars (buf, newval, THUMB_SIZE);
        }
+      else
+       {
+         if (value & ~0x7e)
+           as_bad_where (fixP->fx_file, fixP->fx_line,
+                         _("branch out of range"));
+
+          if (fixP->fx_done || !seg->use_rela_p)
+           {
+             newval = md_chars_to_number (buf, THUMB_SIZE);
+             newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
+             md_number_to_chars (buf, newval, THUMB_SIZE);
+           }
+       }
       break;
 
     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch. */