From c0524131ea2e5bf988f957dcbccd68f0d9ea1bb9 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 26 Aug 2005 09:47:49 +0000 Subject: [PATCH] Re-enable GAS for z8k-coff --- bfd/ChangeLog | 16 +++ bfd/bfd-in2.h | 9 ++ bfd/coff-z8k.c | 71 ++++++---- bfd/configure | 2 +- bfd/configure.in | 2 +- bfd/libbfd.h | 3 + bfd/reloc.c | 17 ++- binutils/testsuite/ChangeLog | 4 + binutils/testsuite/binutils-all/objcopy.exp | 2 +- gas/ChangeLog | 17 +++ gas/config/tc-z8k.c | 213 +++++++++++++++++----------- gas/config/tc-z8k.h | 4 + gas/configure.tgt | 2 +- 13 files changed, 248 insertions(+), 114 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1940287..1ff2729 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,19 @@ +2005-08-26 Christian Groessler + + * 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 * elf32-sh.c (sh_elf_get_flags_from_mach): Fix off-by-one error. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 2014c54..9359cd4 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -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 diff --git a/bfd/coff-z8k.c b/bfd/coff-z8k.c index 52ed81f..d2dc381 100644 --- a/bfd/coff-z8k.c +++ b/bfd/coff-z8k.c @@ -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, . -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) diff --git a/bfd/configure b/bfd/configure index bffdfb0..03f0477 100755 --- a/bfd/configure +++ b/bfd/configure @@ -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" ;; diff --git a/bfd/configure.in b/bfd/configure.in index 7876cd4..40da6d8 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -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" ;; diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 62173e0..527b776 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -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 diff --git a/bfd/reloc.c b/bfd/reloc.c index 77b4feb..f128033 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -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 diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index d42de3c..14888a9 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-08-26 Christian Groessler + + * binutils-all/objcopy.exp: Don't setup_xfail "z8*-*". + 2005-08-18 Alan Modra * binutils-all/objcopy.exp: Remove a29k support. diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index cb9850a..f96113e 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -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*" diff --git a/gas/ChangeLog b/gas/ChangeLog index c3fc297..255a7b3 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,20 @@ +2005-08-26 Christian Groessler + + * 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 * config/tc-mips.c (mips_set_options): Add ase_dsp for DSP instructions. diff --git a/gas/config/tc-z8k.c b/gas/config/tc-z8k.c index 0d45f1b..355ac12 100644 --- a/gas/config/tc-z8k.c +++ b/gas/config/tc-z8k.c @@ -21,12 +21,12 @@ /* Written By Steve Chamberlain . */ -#define DEFINE_TABLE #include #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) } 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: diff --git a/gas/config/tc-z8k.h b/gas/config/tc-z8k.h index 9132ec4..3765a15 100644 --- a/gas/config/tc-z8k.h +++ b/gas/config/tc-z8k.h @@ -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 diff --git a/gas/configure.tgt b/gas/configure.tgt index fe4b976..dd30a01 100644 --- a/gas/configure.tgt +++ b/gas/configure.tgt @@ -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 -- 2.7.4