This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] z8k bfd assembler changes


Hi,

the following patch implements bfd assembler support for the z8k
target.

Except for configure changes I had to do 2 changes in non-z8k code, in
bfd/reloc.c:

One is the addition of z8k specific relocation codes to
bfd_reloc_code_type.

The other change is in bfd_install_relocation. It now doesn't set
reloc_entry->addend to 0 for the z8k target anymore.
Since the comment just above the patch makes my head whirl, and I see
some prior art of target specific hacks there, I've added a similar
hack.
Anyway, the handling of reloc_entry->addend appears suspicious to
me. It's added to 'relocation' in line 1036 of reloc.c, but then
subtracted again in line 1170. Then in line 1171 reloc_entry->addend
is set to 0 and is basically lost.


I've applied the change to bfd/configure.in manually to bfd/configure,
since after regenerating bfd/configure there were many other unrelated
diffs. What's the correct version of autoconf to regenerate?

Ok to apply?

regards,
chris




bfd/ChangeLog

2005-08-25  Christian Groessler  <chris@groessler.org>

	z8k bfd assembler changes
	* 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: Ditto.
	* 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.


binutils/testsuite/ChangeLog

2005-08-25  Christian Groessler  <chris@groessler.org>

	* binutils-all/objcopy.exp: Don't setup_xfail "z8*-*".


gas/ChangeLog

2005-08-25  Christian Groessler  <chris@groessler.org>

	z8k bfd assembler changes
	* 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.
	(TARGET_ARCH): Define.
	(tc_fix_adjustable): Define.



Index: bfd/bfd-in2.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in2.h,v
retrieving revision 1.363
diff -p -u -r1.363 bfd-in2.h
--- bfd/bfd-in2.h	18 Aug 2005 03:48:29 -0000	1.363
+++ bfd/bfd-in2.h	24 Aug 2005 22:20:48 -0000
@@ -3950,6 +3950,15 @@ assembler-expanded instructions.  This i
 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: bfd/coff-z8k.c
===================================================================
RCS file: /cvs/src/src/bfd/coff-z8k.c,v
retrieving revision 1.19
diff -p -u -r1.19 coff-z8k.c
--- bfd/coff-z8k.c	4 May 2005 15:53:04 -0000	1.19
+++ bfd/coff-z8k.c	24 Aug 2005 22:20:48 -0000
@@ -55,27 +55,17 @@ 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 __A_MAGIC_SET__
@@ -126,6 +116,35 @@ rtype2howto (arelent *internal, struct i
 
 #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) \
@@ -335,6 +354,7 @@ extra_case (bfd *in_abfd,
 }
 
 #define coff_reloc16_extra_cases extra_case
+#define coff_bfd_reloc_type_lookup coff_z8k_reloc_type_lookup
 
 #include "coffcode.h"
 
Index: bfd/configure
===================================================================
RCS file: /cvs/src/src/bfd/configure,v
retrieving revision 1.221
diff -p -u -r1.221 configure
--- bfd/configure	18 Aug 2005 03:48:27 -0000	1.221
+++ bfd/configure	24 Aug 2005 22:21:01 -0000
@@ -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: bfd/configure.in
===================================================================
RCS file: /cvs/src/src/bfd/configure.in,v
retrieving revision 1.193
diff -p -u -r1.193 configure.in
--- bfd/configure.in	18 Aug 2005 03:48:26 -0000	1.193
+++ bfd/configure.in	24 Aug 2005 22:21:01 -0000
@@ -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: bfd/libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.154
diff -p -u -r1.154 libbfd.h
--- bfd/libbfd.h	29 Jul 2005 17:39:31 -0000	1.154
+++ bfd/libbfd.h	24 Aug 2005 22:21:02 -0000
@@ -1790,6 +1790,9 @@ static const char *const bfd_reloc_code_
   "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: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.135
diff -p -u -r1.135 reloc.c
--- bfd/reloc.c	29 Jul 2005 17:39:32 -0000	1.135
+++ bfd/reloc.c	24 Aug 2005 22:21:05 -0000
@@ -1168,7 +1168,8 @@ 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;
+	  if (strcmp (abfd->xvec->name, "coff-z8k") != 0)
+	    reloc_entry->addend = 0;
 	}
       else
 	{
@@ -4435,6 +4436,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: binutils/testsuite/binutils-all/objcopy.exp
===================================================================
RCS file: /cvs/src/src/binutils/testsuite/binutils-all/objcopy.exp,v
retrieving revision 1.27
diff -p -u -r1.27 objcopy.exp
--- binutils/testsuite/binutils-all/objcopy.exp	18 Aug 2005 03:51:19 -0000	1.27
+++ binutils/testsuite/binutils-all/objcopy.exp	24 Aug 2005 22:21:07 -0000
@@ -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: gas/configure.tgt
===================================================================
RCS file: /cvs/src/src/gas/configure.tgt,v
retrieving revision 1.17
diff -p -u -r1.17 configure.tgt
--- gas/configure.tgt	23 Aug 2005 03:23:12 -0000	1.17
+++ gas/configure.tgt	24 Aug 2005 22:21:17 -0000
@@ -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
Index: gas/config/tc-z8k.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-z8k.c,v
retrieving revision 1.39
diff -p -u -r1.39 tc-z8k.c
--- gas/config/tc-z8k.c	18 Aug 2005 11:54:33 -0000	1.39
+++ gas/config/tc-z8k.c	24 Aug 2005 22:21:17 -0000
@@ -21,12 +21,12 @@
 
 /* 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,6 +938,7 @@ static void
 newfix (int ptr, int type, int size, expressionS *operand)
 {
   int is_pcrel = 0;
+  fixS *fixP;
 
   /* size is in nibbles.  */
 
@@ -949,17 +948,21 @@ newfix (int ptr, int type, int size, exp
     {
       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 +1006,9 @@ build_bytes (opcode_entry_type *this_try
   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 +1025,31 @@ build_bytes (opcode_entry_type *this_try
 	  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 +1109,13 @@ build_bytes (opcode_entry_type *this_try
           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;
@@ -1124,7 +1130,7 @@ build_bytes (opcode_entry_type *this_try
                     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:
@@ -1135,19 +1141,19 @@ build_bytes (opcode_entry_type *this_try
                   {
                     as_bad (_("immediate value out of range"));
                   }
-		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_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 +1384,45 @@ md_show_usage (FILE *stream)
 }
 
 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 = (asymbol **) 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 +1436,59 @@ md_apply_fix (fixS *fixP, valueT *valP, 
 
   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 +1509,7 @@ md_apply_fix (fixS *fixP, valueT *valP, 
         }
       break;
 
-    case R_DISP7:
+    case BFD_RELOC_16_PCREL:
       if (fixP->fx_addsy)
         {
           fixP->fx_no_overflow = 1;
@@ -1437,20 +1517,18 @@ md_apply_fix (fixS *fixP, valueT *valP, 
         }
       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 +1551,25 @@ md_apply_fix (fixS *fixP, valueT *valP, 
         }
       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: gas/config/tc-z8k.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-z8k.h,v
retrieving revision 1.12
diff -p -u -r1.12 tc-z8k.h
--- gas/config/tc-z8k.h	18 Aug 2005 11:54:33 -0000	1.12
+++ gas/config/tc-z8k.h	24 Aug 2005 22:21:17 -0000
@@ -27,10 +27,13 @@ struct internal_reloc;
 
 #define WORKING_DOT_WORD
 
+#define TARGET_ARCH bfd_arch_z8k
 #define COFF_MAGIC 0x8000
 #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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]