Re-enable GAS for z8k-coff
authorNick Clifton <nickc@redhat.com>
Fri, 26 Aug 2005 09:47:49 +0000 (09:47 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 26 Aug 2005 09:47:49 +0000 (09:47 +0000)
13 files changed:
bfd/ChangeLog
bfd/bfd-in2.h
bfd/coff-z8k.c
bfd/configure
bfd/configure.in
bfd/libbfd.h
bfd/reloc.c
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/objcopy.exp
gas/ChangeLog
gas/config/tc-z8k.c
gas/config/tc-z8k.h
gas/configure.tgt

index 1940287..1ff2729 100644 (file)
@@ -1,3 +1,19 @@
+2005-08-26  Christian Groessler  <chris@groessler.org>
+
+       * coff-z8k.c: (r_jr, r_disp7, r_callr): Fix src_mask and dst_mask
+       of HOWTO.
+       (coff_z8k_select_reloc): Remove.
+       (SELECT_RELOC): Remove.
+       (coff_z8k_reloc_type_lookup): New function.
+       (coff_bfd_reloc_type_lookup): Define.
+       * configure.in: Add cofflink.lo to z8kcoff_vec.
+       * configure: Regenerate.
+       * reloc.c: (bfd_reloc_code_type): Add z8k relocations.
+       (bfd_install_relocation): Don't clear reloc_entry->addend for
+       coff-z8k target.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Regenerate.
+
 2005-08-25  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
 
        * elf32-sh.c (sh_elf_get_flags_from_mach): Fix off-by-one error.
index 2014c54..9359cd4 100644 (file)
@@ -3950,6 +3950,15 @@ assembler-expanded instructions.  This is commonly used
 internally by the linker after analysis of a 
 BFD_RELOC_XTENSA_ASM_EXPAND.  */
   BFD_RELOC_XTENSA_ASM_SIMPLIFY,
+
+/* DJNZ offset.  */
+  BFD_RELOC_Z8K_DISP7,
+
+/* CALR offset.  */
+  BFD_RELOC_Z8K_CALLR,
+
+/* 4 bit value.  */
+  BFD_RELOC_Z8K_IMM4L,
   BFD_RELOC_UNUSED };
 typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
 reloc_howto_type *bfd_reloc_type_lookup
index 52ed81f..d2dc381 100644 (file)
@@ -1,24 +1,24 @@
 /* BFD back-end for Zilog Z800n COFF binaries.
    Copyright 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001, 2002, 2003,
-   2004 Free Software Foundation, Inc.
+   2004, 2005 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
    Written by Steve Chamberlain, <sac@cygnus.com>.
 
-This file is part of BFD, the Binary File Descriptor library.
+   This file is part of BFD, the Binary File Descriptor library.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -55,29 +55,19 @@ HOWTO (R_REL16, 0, 1, 16, FALSE, 0,
        TRUE);
 
 static reloc_howto_type r_jr =
-HOWTO (R_JR, 0, 0, 8, TRUE, 0, complain_overflow_signed, 0,
-       "r_jr", TRUE, 0, 0, TRUE);
+HOWTO (R_JR, 1, 0, 8, TRUE, 0, complain_overflow_signed, 0,
+       "r_jr", TRUE, 0xff, 0xff, TRUE);
 
 static reloc_howto_type r_disp7 =
 HOWTO (R_DISP7, 0, 0, 7, TRUE, 0, complain_overflow_bitfield, 0,
-       "r_disp7", TRUE, 0, 0, TRUE);
+       "r_disp7", TRUE, 0x7f, 0x7f, TRUE);
 
 static reloc_howto_type r_callr =
-HOWTO (R_CALLR, 0, 1, 12, TRUE, 0, complain_overflow_signed, 0,
+HOWTO (R_CALLR, 1, 1, 12, TRUE, 0, complain_overflow_signed, 0,
        "r_callr", TRUE, 0xfff, 0xfff, TRUE);
 
-/* Turn a howto into a reloc number */
-
-static int
-coff_z8k_select_reloc (reloc_howto_type *howto)
-{
-  return howto->type;
-}
-
-#define SELECT_RELOC(x,howto) x.r_type = coff_z8k_select_reloc(howto)
-
 #define BADMAG(x) Z8KBADMAG(x)
-#define Z8K 1                  /* Customize coffcode.h */
+#define Z8K 1                  /* Customize coffcode.h */
 #define __A_MAGIC_SET__
 
 /* Code to swap in the reloc.  */
@@ -126,6 +116,25 @@ rtype2howto (arelent *internal, struct internal_reloc *dst)
 
 #define RTYPE2HOWTO(internal, relocentry) rtype2howto (internal, relocentry)
 
+static reloc_howto_type *
+coff_z8k_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                            bfd_reloc_code_real_type code)
+{
+  switch (code)
+    {
+    case BFD_RELOC_8:          return & r_imm8;
+    case BFD_RELOC_16:         return & r_da;
+    case BFD_RELOC_32:         return & r_imm32;
+    case BFD_RELOC_8_PCREL:     return & r_jr;
+    case BFD_RELOC_16_PCREL:    return & r_rel16;
+    case BFD_RELOC_Z8K_DISP7:   return & r_disp7;
+    case BFD_RELOC_Z8K_CALLR:   return & r_callr;
+    case BFD_RELOC_Z8K_IMM4L:   return & r_imm4l;
+    default:                   BFD_FAIL ();
+      return 0;
+    }
+}
+
 /* Perform any necessary magic to the addend in a reloc entry.  */
 
 #define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
@@ -334,14 +343,16 @@ extra_case (bfd *in_abfd,
     }
 }
 
-#define coff_reloc16_extra_cases extra_case
+#define coff_reloc16_extra_cases    extra_case
+#define coff_bfd_reloc_type_lookup  coff_z8k_reloc_type_lookup
 
 #include "coffcode.h"
 
 #undef  coff_bfd_get_relocated_section_contents
-#undef coff_bfd_relax_section
 #define coff_bfd_get_relocated_section_contents \
   bfd_coff_reloc16_get_relocated_section_contents
+
+#undef  coff_bfd_relax_section
 #define coff_bfd_relax_section bfd_coff_reloc16_relax_section
 
 CREATE_BIG_COFF_TARGET_VEC (z8kcoff_vec, "coff-z8k", 0, 0, '_', NULL, COFF_SWAP_TABLE)
index bffdfb0..03f0477 100755 (executable)
@@ -13189,7 +13189,7 @@ do
     vms_vax_vec)               tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo" ;;
     w65_vec)                   tb="$tb coff-w65.lo reloc16.lo" ;;
     we32kcoff_vec)             tb="$tb coff-we32k.lo" ;;
-    z8kcoff_vec)               tb="$tb coff-z8k.lo reloc16.lo" ;;
+    z8kcoff_vec)               tb="$tb coff-z8k.lo reloc16.lo cofflink.lo" ;;
 
     # These appear out of order in targets.c
     srec_vec)                  tb="$tb srec.lo" ;;
index 7876cd4..40da6d8 100644 (file)
@@ -810,7 +810,7 @@ do
     vms_vax_vec)               tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo" ;;
     w65_vec)                   tb="$tb coff-w65.lo reloc16.lo" ;;
     we32kcoff_vec)             tb="$tb coff-we32k.lo" ;;
-    z8kcoff_vec)               tb="$tb coff-z8k.lo reloc16.lo" ;;
+    z8kcoff_vec)               tb="$tb coff-z8k.lo reloc16.lo cofflink.lo" ;;
 
     # These appear out of order in targets.c
     srec_vec)                  tb="$tb srec.lo" ;;
index 62173e0..527b776 100644 (file)
@@ -1790,6 +1790,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_XTENSA_OP2",
   "BFD_RELOC_XTENSA_ASM_EXPAND",
   "BFD_RELOC_XTENSA_ASM_SIMPLIFY",
+  "BFD_RELOC_Z8K_DISP7",
+  "BFD_RELOC_Z8K_CALLR",
+  "BFD_RELOC_Z8K_IMM4L",
  "@@overflow: BFD_RELOC_UNUSED@@",
 };
 #endif
index 77b4feb..f128033 100644 (file)
@@ -1168,7 +1168,9 @@ space consuming.  For each target:
     7) if they are different you have to figure out which version is
        right.  */
          relocation -= reloc_entry->addend;
-         reloc_entry->addend = 0;
+         /* FIXME: There should be no target specific code here...  */
+         if (strcmp (abfd->xvec->name, "coff-z8k") != 0)
+           reloc_entry->addend = 0;
        }
       else
        {
@@ -4435,6 +4437,19 @@ ENUMDOC
   internally by the linker after analysis of a 
   BFD_RELOC_XTENSA_ASM_EXPAND.
 
+ENUM
+  BFD_RELOC_Z8K_DISP7
+ENUMDOC
+  DJNZ offset.
+ENUM
+  BFD_RELOC_Z8K_CALLR
+ENUMDOC
+  CALR offset.
+ENUM
+  BFD_RELOC_Z8K_IMM4L
+ENUMDOC
+  4 bit value.
+
 ENDSENUM
   BFD_RELOC_UNUSED
 CODE_FRAGMENT
index d42de3c..14888a9 100644 (file)
@@ -1,3 +1,7 @@
+2005-08-26  Christian Groessler  <chris@groessler.org>
+
+       * binutils-all/objcopy.exp: Don't setup_xfail "z8*-*".
+
 2005-08-18  Alan Modra  <amodra@bigpond.net.au>
 
        * binutils-all/objcopy.exp: Remove a29k support.
index cb9850a..f96113e 100644 (file)
@@ -80,7 +80,7 @@ if ![string match "" $got] then {
     setup_xfail "m8*-*"
     setup_xfail "or32-*-rtems*" "or32-*-coff"
     setup_xfail "sh-*-coff*" "sh-*-rtems*" 
-    setup_xfail "tic4x-*-*" "tic80-*-*" "w65-*" "z8*-*"
+    setup_xfail "tic4x-*-*" "tic80-*-*" "w65-*"
 
     clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
     clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*" "m68*-*-sysv4*"
index c3fc297..255a7b3 100644 (file)
@@ -1,3 +1,20 @@
+2005-08-26  Christian Groessler  <chris@groessler.org>
+
+       * configure.tgt: Set bfd_gas also for z8k cpu.
+       * config/tc-z8k.c (s_segm): Use bfd_set_arch_mach to set machine
+       type.
+       (newfix): Adapt to bfd reloc types.
+       (build_bytes): Adapt to bfd reloc types.  Ensure that enough space
+       is available in the current frag.
+       (md_convert_frag): Adapt function parameters.
+       (tc_gen_reloc): New function.
+       (md_section_align): Use bfd_get_section_alignment.
+       (md_apply_fix): Adapt to bfd reloc types.  Fix handling of
+       BFD_RELOC_Z8K_IMM4L, BFD_RELOC_8, BFD_RELOC_16, and BFD_RELOC_32
+       relocations.
+       * config/tc-z8k.h (TARGET_ARCH): Define.
+       (tc_fix_adjustable): Define.
+
 2005-08-25  Chao-ying Fu  <fu@mips.com>
 
        * config/tc-mips.c (mips_set_options): Add ase_dsp for DSP instructions.
index 0d45f1b..355ac12 100644 (file)
 
 /* Written By Steve Chamberlain <sac@cygnus.com>.  */
 
-#define DEFINE_TABLE
 #include <stdio.h>
 
 #include "as.h"
 #include "bfd.h"
 #include "safe-ctype.h"
+#define DEFINE_TABLE
 #include "opcodes/z8k-opc.h"
 
 const char comment_chars[] = "!";
@@ -46,14 +46,12 @@ s_segm (int segm)
   if (segm)
     {
       segmented_mode = 1;
-      machine = bfd_mach_z8001;
-      coff_flags = F_Z8001;
+      bfd_set_arch_mach (stdoutput, TARGET_ARCH, bfd_mach_z8001);
     }
   else
     {
       segmented_mode = 0;
-      machine = bfd_mach_z8002;
-      coff_flags = F_Z8002;
+      bfd_set_arch_mach (stdoutput, TARGET_ARCH, bfd_mach_z8002);
     }
 }
 
@@ -940,26 +938,24 @@ static void
 newfix (int ptr, int type, int size, expressionS *operand)
 {
   int is_pcrel = 0;
+  fixS *fixP;
 
-  /* size is in nibbles.  */
-
+  /* Size is in nibbles.  */
   if (operand->X_add_symbol
       || operand->X_op_symbol
       || operand->X_add_number)
     {
       switch(type)
         {
-        case R_JR:
-        case R_DISP7:
-        case R_CALLR:
+        case BFD_RELOC_8_PCREL:
+        case BFD_RELOC_Z8K_CALLR:
+        case BFD_RELOC_Z8K_DISP7:
           is_pcrel = 1;
         }
-      fix_new_exp (frag_now,
-                  ptr,
-                  size / 2,
-                  operand,
-                  is_pcrel,
-                  type);
+      fixP = fix_new_exp (frag_now, ptr, size / 2,
+                          operand, is_pcrel, type);
+      if (is_pcrel)
+       fixP->fx_no_overflow = 1;
     }
 }
 
@@ -1003,6 +999,9 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
   frag_wane (frag_now);
   frag_new (0);
 
+  if (frag_room () < 8)
+    frag_grow (8);  /* Make room for maximum instruction size.  */
+
   memset (buffer, 0, sizeof (buffer));
   class_ptr = this_try->byte_info;
 
@@ -1019,31 +1018,31 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
          if (segmented_mode)
            {
              /* da_operand->X_add_number |= 0x80000000;  --  Now set at relocation time.  */
-             output_ptr = apply_fix (output_ptr, R_IMM32, da_operand, 8);
+             output_ptr = apply_fix (output_ptr, BFD_RELOC_32, da_operand, 8);
            }
          else
            {
-             output_ptr = apply_fix (output_ptr, R_IMM16, da_operand, 4);
+             output_ptr = apply_fix (output_ptr, BFD_RELOC_16, da_operand, 4);
            }
          da_operand = 0;
          break;
        case CLASS_DISP8:
          /* pc rel 8 bit  */
-         output_ptr = apply_fix (output_ptr, R_JR, da_operand, 2);
+         output_ptr = apply_fix (output_ptr, BFD_RELOC_8_PCREL, da_operand, 2);
          da_operand = 0;
          break;
 
        case CLASS_0DISP7:
          /* pc rel 7 bit  */
          *output_ptr = 0;
-         output_ptr = apply_fix (output_ptr, R_DISP7, da_operand, 2);
+         output_ptr = apply_fix (output_ptr, BFD_RELOC_Z8K_DISP7, da_operand, 2);
          da_operand = 0;
          break;
 
        case CLASS_1DISP7:
          /* pc rel 7 bit  */
          *output_ptr = 0x80;
-         output_ptr = apply_fix (output_ptr, R_DISP7, da_operand, 2);
+         output_ptr = apply_fix (output_ptr, BFD_RELOC_Z8K_DISP7, da_operand, 2);
          output_ptr[-2] = 0x8;
          da_operand = 0;
          break;
@@ -1103,13 +1102,13 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
           switch (c & ARG_MASK)
             {
             case ARG_DISP12:
-              output_ptr = apply_fix (output_ptr, R_CALLR, da_operand, 4);
+              output_ptr = apply_fix (output_ptr, BFD_RELOC_Z8K_CALLR, da_operand, 4);
               break;
             case ARG_DISP16:
-             output_ptr = apply_fix (output_ptr, R_REL16, da_operand, 4);
+             output_ptr = apply_fix (output_ptr, BFD_RELOC_16_PCREL, da_operand, 4);
              break;
            default:
-             output_ptr = apply_fix (output_ptr, R_IMM16, da_operand, 4);
+             output_ptr = apply_fix (output_ptr, BFD_RELOC_16, da_operand, 4);
            }
          da_operand = 0;
          break;
@@ -1120,11 +1119,9 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
              {
              case ARG_NIM4:
                 if (imm_operand->X_add_number > 15)
-                  {
-                    as_bad (_("immediate value out of range"));
-                  }
+                 as_bad (_("immediate value out of range"));
                imm_operand->X_add_number = -imm_operand->X_add_number;
-               output_ptr = apply_fix (output_ptr, R_IMM4L, imm_operand, 1);
+               output_ptr = apply_fix (output_ptr, BFD_RELOC_Z8K_IMM4L, imm_operand, 1);
                break;
               /*case ARG_IMMNMINUS1: not used.  */
              case ARG_IMM4M1:
@@ -1132,22 +1129,20 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
                 /* Drop through.  */
              case ARG_IMM4:
                 if (imm_operand->X_add_number > 15)
-                  {
-                    as_bad (_("immediate value out of range"));
-                  }
-               output_ptr = apply_fix (output_ptr, R_IMM4L, imm_operand, 1);
+                 as_bad (_("immediate value out of range"));
+               output_ptr = apply_fix (output_ptr, BFD_RELOC_Z8K_IMM4L, imm_operand, 1);
                break;
              case ARG_NIM8:
                imm_operand->X_add_number = -imm_operand->X_add_number;
                 /* Drop through.  */
              case ARG_IMM8:
-               output_ptr = apply_fix (output_ptr, R_IMM8, imm_operand, 2);
+               output_ptr = apply_fix (output_ptr, BFD_RELOC_8, imm_operand, 2);
                break;
              case ARG_IMM16:
-               output_ptr = apply_fix (output_ptr, R_IMM16, imm_operand, 4);
+               output_ptr = apply_fix (output_ptr, BFD_RELOC_16, imm_operand, 4);
                break;
              case ARG_IMM32:
-               output_ptr = apply_fix (output_ptr, R_IMM32, imm_operand, 8);
+               output_ptr = apply_fix (output_ptr, BFD_RELOC_32, imm_operand, 8);
                break;
              default:
                abort ();
@@ -1378,19 +1373,46 @@ md_show_usage (FILE *stream)
 }
 \f
 void
-md_convert_frag (object_headers *headers ATTRIBUTE_UNUSED,
-                 segT seg ATTRIBUTE_UNUSED,
+md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
+                 segT sec ATTRIBUTE_UNUSED,
                  fragS *fragP ATTRIBUTE_UNUSED)
 {
   printf (_("call to md_convert_frag\n"));
   abort ();
 }
 
+/* Generate a machine dependent reloc from a fixup.  */
+
+arelent*
+tc_gen_reloc (asection *section ATTRIBUTE_UNUSED,
+             fixS *fixp      ATTRIBUTE_UNUSED)
+{
+  arelent *reloc;
+
+  reloc = xmalloc (sizeof (*reloc));
+  reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
+  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+  reloc->addend = fixp->fx_offset;
+  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
+
+  if (! reloc->howto)
+    {
+      as_bad_where (fixp->fx_file, fixp->fx_line,
+                    "Cannot represent %s relocation in object file",
+                    bfd_get_reloc_code_name (fixp->fx_r_type));
+      abort ();
+    }
+  return reloc;
+}
+
 valueT
 md_section_align (segT seg, valueT size)
 {
-  return ((size + (1 << section_alignment[(int) seg]) - 1)
-         & (-1 << section_alignment[(int) seg]));
+  int align = bfd_get_section_alignment (stdoutput, seg);
+  valueT mask = ((valueT) 1 << align) - 1;
+
+  return (size + mask) & ~mask;
 }
 
 /* Attempt to simplify or eliminate a fixup. To indicate that a fixup
@@ -1404,11 +1426,55 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
 
   switch (fixP->fx_r_type)
     {
-    case R_IMM4L:
-      buf[0] = (buf[0] & 0xf0) | (val & 0xf);
+    case BFD_RELOC_Z8K_IMM4L:
+      if (fixP->fx_addsy)
+        {
+          fixP->fx_no_overflow = 1;
+          fixP->fx_done = 0;
+        }
+      else
+       buf[0] = (buf[0] & 0xf0) | (val & 0xf);
+      break;
+
+    case BFD_RELOC_8:
+      if (fixP->fx_addsy)
+        {
+          fixP->fx_no_overflow = 1;
+          fixP->fx_done = 0;
+        }
+      else
+       *buf++ = val;
+      break;
+
+    case BFD_RELOC_16:
+      if (fixP->fx_addsy)
+        {
+          fixP->fx_no_overflow = 1;
+          fixP->fx_done = 0;
+        }
+      else
+        {
+          *buf++ = (val >> 8);
+          *buf++ = val;
+        }
+      break;
+
+    case BFD_RELOC_32:
+      if (fixP->fx_addsy)
+        {
+          fixP->fx_no_overflow = 1;
+          fixP->fx_done = 0;
+        }
+      else
+        {
+          *buf++ = (val >> 24);
+          *buf++ = (val >> 16);
+          *buf++ = (val >> 8);
+          *buf++ = val;
+        }
       break;
 
-    case R_JR:
+    case BFD_RELOC_8_PCREL:
       if (fixP->fx_addsy)
         {
           fixP->fx_no_overflow = 1;
@@ -1429,7 +1495,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
         }
       break;
 
-    case R_DISP7:
+    case BFD_RELOC_16_PCREL:
       if (fixP->fx_addsy)
         {
           fixP->fx_no_overflow = 1;
@@ -1437,20 +1503,18 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
         }
       else
         {
-          if (val & 1)
-            as_bad_where (fixP->fx_file, fixP->fx_line,
-                          _("cannot branch to odd address"));
-          val /= 2;
-          if (val > 0 || val < -127)
+          val = val - fixP->fx_frag->fr_address + fixP->fx_where - fixP->fx_size;
+          if (val > 32767 || val < -32768)
             as_bad_where (fixP->fx_file, fixP->fx_line,
-                          _("relative jump out of range"));
-          *buf = (*buf & 0x80) | (-val & 0x7f);
+                          _("relative address out of range"));
+          *buf++ = (val >> 8);
+          *buf++ = val;
           fixP->fx_no_overflow = 1;
           fixP->fx_done = 1;
         }
       break;
 
-    case R_CALLR:
+    case BFD_RELOC_Z8K_CALLR:
       if (fixP->fx_addsy)
         {
           fixP->fx_no_overflow = 1;
@@ -1473,34 +1537,25 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
         }
       break;
 
-    case R_IMM8:
-      *buf++ = val;
-      break;
-
-    case R_IMM16:
-      *buf++ = (val >> 8);
-      *buf++ = val;
-      break;
-
-    case R_IMM32:
-      *buf++ = (val >> 24);
-      *buf++ = (val >> 16);
-      *buf++ = (val >> 8);
-      *buf++ = val;
-      break;
-
-    case R_REL16:
-      val = val - fixP->fx_frag->fr_address + fixP->fx_where - fixP->fx_size;
-      if (val > 32767 || val < -32768)
-        as_bad_where (fixP->fx_file, fixP->fx_line,
-                      _("relative address out of range"));
-      *buf++ = (val >> 8);
-      *buf++ = val;
-      fixP->fx_no_overflow = 1;
-      break;
-
-    case 0:
-      md_number_to_chars (buf, val, fixP->fx_size);
+    case BFD_RELOC_Z8K_DISP7:
+      if (fixP->fx_addsy)
+        {
+          fixP->fx_no_overflow = 1;
+          fixP->fx_done = 0;
+        }
+      else
+        {
+          if (val & 1)
+            as_bad_where (fixP->fx_file, fixP->fx_line,
+                          _("cannot branch to odd address"));
+          val /= 2;
+          if (val > 0 || val < -127)
+            as_bad_where (fixP->fx_file, fixP->fx_line,
+                          _("relative jump out of range"));
+          *buf = (*buf & 0x80) | (-val & 0x7f);
+          fixP->fx_no_overflow = 1;
+          fixP->fx_done = 1;
+        }
       break;
 
     default:
index 9132ec4..3765a15 100644 (file)
@@ -22,6 +22,8 @@
 
 #define TC_Z8K
 #define TARGET_BYTES_BIG_ENDIAN 1
+#define TARGET_ARCH    bfd_arch_z8k
+#define TARGET_FORMAT  "coff-z8k"
 
 struct internal_reloc;
 
@@ -31,6 +33,8 @@ struct internal_reloc;
 #define IGNORE_NONSTANDARD_ESCAPES
 #undef WARN_SIGNED_OVERFLOW_WORD
 
+#define tc_fix_adjustable(X)  0
+
 #define LISTING_HEADER "Zilog Z8000 GAS "
 #define RELOC_32 1234
 
index fe4b976..dd30a01 100644 (file)
@@ -387,7 +387,7 @@ case ${generic_target} in
 esac
 
 case ${cpu_type} in
-  alpha | arm | i386 | ia64 | mips | ns32k | pdp11 | ppc | sparc)
+  alpha | arm | i386 | ia64 | mips | ns32k | pdp11 | ppc | sparc | z8k)
     bfd_gas=yes
     ;;
 esac