Re-enable GAS for z8k-coff
This commit is contained in:
parent
98a7a8547e
commit
c0524131ea
13 changed files with 248 additions and 114 deletions
|
@ -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>
|
2005-08-25 Kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||||
|
|
||||||
* elf32-sh.c (sh_elf_get_flags_from_mach): Fix off-by-one error.
|
* elf32-sh.c (sh_elf_get_flags_from_mach): Fix off-by-one error.
|
||||||
|
|
|
@ -3950,6 +3950,15 @@ assembler-expanded instructions. This is commonly used
|
||||||
internally by the linker after analysis of a
|
internally by the linker after analysis of a
|
||||||
BFD_RELOC_XTENSA_ASM_EXPAND. */
|
BFD_RELOC_XTENSA_ASM_EXPAND. */
|
||||||
BFD_RELOC_XTENSA_ASM_SIMPLIFY,
|
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 };
|
BFD_RELOC_UNUSED };
|
||||||
typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
|
typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
|
||||||
reloc_howto_type *bfd_reloc_type_lookup
|
reloc_howto_type *bfd_reloc_type_lookup
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
/* BFD back-end for Zilog Z800n COFF binaries.
|
/* BFD back-end for Zilog Z800n COFF binaries.
|
||||||
Copyright 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001, 2002, 2003,
|
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.
|
Contributed by Cygnus Support.
|
||||||
Written by Steve Chamberlain, <sac@cygnus.com>.
|
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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
|
@ -55,29 +55,19 @@ HOWTO (R_REL16, 0, 1, 16, FALSE, 0,
|
||||||
TRUE);
|
TRUE);
|
||||||
|
|
||||||
static reloc_howto_type r_jr =
|
static reloc_howto_type r_jr =
|
||||||
HOWTO (R_JR, 0, 0, 8, TRUE, 0, complain_overflow_signed, 0,
|
HOWTO (R_JR, 1, 0, 8, TRUE, 0, complain_overflow_signed, 0,
|
||||||
"r_jr", TRUE, 0, 0, TRUE);
|
"r_jr", TRUE, 0xff, 0xff, TRUE);
|
||||||
|
|
||||||
static reloc_howto_type r_disp7 =
|
static reloc_howto_type r_disp7 =
|
||||||
HOWTO (R_DISP7, 0, 0, 7, TRUE, 0, complain_overflow_bitfield, 0,
|
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 =
|
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);
|
"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 BADMAG(x) Z8KBADMAG(x)
|
||||||
#define Z8K 1 /* Customize coffcode.h */
|
#define Z8K 1 /* Customize coffcode.h. */
|
||||||
#define __A_MAGIC_SET__
|
#define __A_MAGIC_SET__
|
||||||
|
|
||||||
/* Code to swap in the reloc. */
|
/* Code to swap in the reloc. */
|
||||||
|
@ -126,6 +116,25 @@ rtype2howto (arelent *internal, struct internal_reloc *dst)
|
||||||
|
|
||||||
#define RTYPE2HOWTO(internal, relocentry) rtype2howto (internal, relocentry)
|
#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. */
|
/* Perform any necessary magic to the addend in a reloc entry. */
|
||||||
|
|
||||||
#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
|
#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"
|
#include "coffcode.h"
|
||||||
|
|
||||||
#undef coff_bfd_get_relocated_section_contents
|
#undef coff_bfd_get_relocated_section_contents
|
||||||
#undef coff_bfd_relax_section
|
|
||||||
#define coff_bfd_get_relocated_section_contents \
|
#define coff_bfd_get_relocated_section_contents \
|
||||||
bfd_coff_reloc16_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
|
#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)
|
CREATE_BIG_COFF_TARGET_VEC (z8kcoff_vec, "coff-z8k", 0, 0, '_', NULL, COFF_SWAP_TABLE)
|
||||||
|
|
2
bfd/configure
vendored
2
bfd/configure
vendored
|
@ -13189,7 +13189,7 @@ do
|
||||||
vms_vax_vec) tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo" ;;
|
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" ;;
|
w65_vec) tb="$tb coff-w65.lo reloc16.lo" ;;
|
||||||
we32kcoff_vec) tb="$tb coff-we32k.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
|
# These appear out of order in targets.c
|
||||||
srec_vec) tb="$tb srec.lo" ;;
|
srec_vec) tb="$tb srec.lo" ;;
|
||||||
|
|
|
@ -810,7 +810,7 @@ do
|
||||||
vms_vax_vec) tb="$tb vms.lo vms-hdr.lo vms-gsd.lo vms-tir.lo vms-misc.lo" ;;
|
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" ;;
|
w65_vec) tb="$tb coff-w65.lo reloc16.lo" ;;
|
||||||
we32kcoff_vec) tb="$tb coff-we32k.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
|
# These appear out of order in targets.c
|
||||||
srec_vec) tb="$tb srec.lo" ;;
|
srec_vec) tb="$tb srec.lo" ;;
|
||||||
|
|
|
@ -1790,6 +1790,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
||||||
"BFD_RELOC_XTENSA_OP2",
|
"BFD_RELOC_XTENSA_OP2",
|
||||||
"BFD_RELOC_XTENSA_ASM_EXPAND",
|
"BFD_RELOC_XTENSA_ASM_EXPAND",
|
||||||
"BFD_RELOC_XTENSA_ASM_SIMPLIFY",
|
"BFD_RELOC_XTENSA_ASM_SIMPLIFY",
|
||||||
|
"BFD_RELOC_Z8K_DISP7",
|
||||||
|
"BFD_RELOC_Z8K_CALLR",
|
||||||
|
"BFD_RELOC_Z8K_IMM4L",
|
||||||
"@@overflow: BFD_RELOC_UNUSED@@",
|
"@@overflow: BFD_RELOC_UNUSED@@",
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
17
bfd/reloc.c
17
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
|
7) if they are different you have to figure out which version is
|
||||||
right. */
|
right. */
|
||||||
relocation -= reloc_entry->addend;
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -4435,6 +4437,19 @@ ENUMDOC
|
||||||
internally by the linker after analysis of a
|
internally by the linker after analysis of a
|
||||||
BFD_RELOC_XTENSA_ASM_EXPAND.
|
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
|
ENDSENUM
|
||||||
BFD_RELOC_UNUSED
|
BFD_RELOC_UNUSED
|
||||||
CODE_FRAGMENT
|
CODE_FRAGMENT
|
||||||
|
|
|
@ -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>
|
2005-08-18 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* binutils-all/objcopy.exp: Remove a29k support.
|
* binutils-all/objcopy.exp: Remove a29k support.
|
||||||
|
|
|
@ -80,7 +80,7 @@ if ![string match "" $got] then {
|
||||||
setup_xfail "m8*-*"
|
setup_xfail "m8*-*"
|
||||||
setup_xfail "or32-*-rtems*" "or32-*-coff"
|
setup_xfail "or32-*-rtems*" "or32-*-coff"
|
||||||
setup_xfail "sh-*-coff*" "sh-*-rtems*"
|
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*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
|
||||||
clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*" "m68*-*-sysv4*"
|
clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*" "m68*-*-sysv4*"
|
||||||
|
|
|
@ -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>
|
2005-08-25 Chao-ying Fu <fu@mips.com>
|
||||||
|
|
||||||
* config/tc-mips.c (mips_set_options): Add ase_dsp for DSP instructions.
|
* config/tc-mips.c (mips_set_options): Add ase_dsp for DSP instructions.
|
||||||
|
|
|
@ -21,12 +21,12 @@
|
||||||
|
|
||||||
/* Written By Steve Chamberlain <sac@cygnus.com>. */
|
/* Written By Steve Chamberlain <sac@cygnus.com>. */
|
||||||
|
|
||||||
#define DEFINE_TABLE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "as.h"
|
#include "as.h"
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "safe-ctype.h"
|
#include "safe-ctype.h"
|
||||||
|
#define DEFINE_TABLE
|
||||||
#include "opcodes/z8k-opc.h"
|
#include "opcodes/z8k-opc.h"
|
||||||
|
|
||||||
const char comment_chars[] = "!";
|
const char comment_chars[] = "!";
|
||||||
|
@ -46,14 +46,12 @@ s_segm (int segm)
|
||||||
if (segm)
|
if (segm)
|
||||||
{
|
{
|
||||||
segmented_mode = 1;
|
segmented_mode = 1;
|
||||||
machine = bfd_mach_z8001;
|
bfd_set_arch_mach (stdoutput, TARGET_ARCH, bfd_mach_z8001);
|
||||||
coff_flags = F_Z8001;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
segmented_mode = 0;
|
segmented_mode = 0;
|
||||||
machine = bfd_mach_z8002;
|
bfd_set_arch_mach (stdoutput, TARGET_ARCH, bfd_mach_z8002);
|
||||||
coff_flags = F_Z8002;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -940,26 +938,24 @@ static void
|
||||||
newfix (int ptr, int type, int size, expressionS *operand)
|
newfix (int ptr, int type, int size, expressionS *operand)
|
||||||
{
|
{
|
||||||
int is_pcrel = 0;
|
int is_pcrel = 0;
|
||||||
|
fixS *fixP;
|
||||||
|
|
||||||
/* size is in nibbles. */
|
/* Size is in nibbles. */
|
||||||
|
|
||||||
if (operand->X_add_symbol
|
if (operand->X_add_symbol
|
||||||
|| operand->X_op_symbol
|
|| operand->X_op_symbol
|
||||||
|| operand->X_add_number)
|
|| operand->X_add_number)
|
||||||
{
|
{
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case R_JR:
|
case BFD_RELOC_8_PCREL:
|
||||||
case R_DISP7:
|
case BFD_RELOC_Z8K_CALLR:
|
||||||
case R_CALLR:
|
case BFD_RELOC_Z8K_DISP7:
|
||||||
is_pcrel = 1;
|
is_pcrel = 1;
|
||||||
}
|
}
|
||||||
fix_new_exp (frag_now,
|
fixP = fix_new_exp (frag_now, ptr, size / 2,
|
||||||
ptr,
|
operand, is_pcrel, type);
|
||||||
size / 2,
|
if (is_pcrel)
|
||||||
operand,
|
fixP->fx_no_overflow = 1;
|
||||||
is_pcrel,
|
|
||||||
type);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1003,6 +999,9 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
|
||||||
frag_wane (frag_now);
|
frag_wane (frag_now);
|
||||||
frag_new (0);
|
frag_new (0);
|
||||||
|
|
||||||
|
if (frag_room () < 8)
|
||||||
|
frag_grow (8); /* Make room for maximum instruction size. */
|
||||||
|
|
||||||
memset (buffer, 0, sizeof (buffer));
|
memset (buffer, 0, sizeof (buffer));
|
||||||
class_ptr = this_try->byte_info;
|
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)
|
if (segmented_mode)
|
||||||
{
|
{
|
||||||
/* da_operand->X_add_number |= 0x80000000; -- Now set at relocation time. */
|
/* 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
|
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;
|
da_operand = 0;
|
||||||
break;
|
break;
|
||||||
case CLASS_DISP8:
|
case CLASS_DISP8:
|
||||||
/* pc rel 8 bit */
|
/* 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;
|
da_operand = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CLASS_0DISP7:
|
case CLASS_0DISP7:
|
||||||
/* pc rel 7 bit */
|
/* pc rel 7 bit */
|
||||||
*output_ptr = 0;
|
*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;
|
da_operand = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CLASS_1DISP7:
|
case CLASS_1DISP7:
|
||||||
/* pc rel 7 bit */
|
/* pc rel 7 bit */
|
||||||
*output_ptr = 0x80;
|
*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;
|
output_ptr[-2] = 0x8;
|
||||||
da_operand = 0;
|
da_operand = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -1103,13 +1102,13 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
|
||||||
switch (c & ARG_MASK)
|
switch (c & ARG_MASK)
|
||||||
{
|
{
|
||||||
case ARG_DISP12:
|
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;
|
break;
|
||||||
case ARG_DISP16:
|
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;
|
break;
|
||||||
default:
|
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;
|
da_operand = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -1120,11 +1119,9 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
|
||||||
{
|
{
|
||||||
case ARG_NIM4:
|
case ARG_NIM4:
|
||||||
if (imm_operand->X_add_number > 15)
|
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;
|
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;
|
break;
|
||||||
/*case ARG_IMMNMINUS1: not used. */
|
/*case ARG_IMMNMINUS1: not used. */
|
||||||
case ARG_IMM4M1:
|
case ARG_IMM4M1:
|
||||||
|
@ -1132,22 +1129,20 @@ build_bytes (opcode_entry_type *this_try, struct z8k_op *operand ATTRIBUTE_UNUSE
|
||||||
/* Drop through. */
|
/* Drop through. */
|
||||||
case ARG_IMM4:
|
case ARG_IMM4:
|
||||||
if (imm_operand->X_add_number > 15)
|
if (imm_operand->X_add_number > 15)
|
||||||
{
|
as_bad (_("immediate value out of range"));
|
||||||
as_bad (_("immediate value out of range"));
|
output_ptr = apply_fix (output_ptr, BFD_RELOC_Z8K_IMM4L, imm_operand, 1);
|
||||||
}
|
|
||||||
output_ptr = apply_fix (output_ptr, R_IMM4L, imm_operand, 1);
|
|
||||||
break;
|
break;
|
||||||
case ARG_NIM8:
|
case ARG_NIM8:
|
||||||
imm_operand->X_add_number = -imm_operand->X_add_number;
|
imm_operand->X_add_number = -imm_operand->X_add_number;
|
||||||
/* Drop through. */
|
/* Drop through. */
|
||||||
case ARG_IMM8:
|
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;
|
break;
|
||||||
case ARG_IMM16:
|
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;
|
break;
|
||||||
case ARG_IMM32:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
|
@ -1378,19 +1373,46 @@ md_show_usage (FILE *stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
md_convert_frag (object_headers *headers ATTRIBUTE_UNUSED,
|
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
|
||||||
segT seg ATTRIBUTE_UNUSED,
|
segT sec ATTRIBUTE_UNUSED,
|
||||||
fragS *fragP ATTRIBUTE_UNUSED)
|
fragS *fragP ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
printf (_("call to md_convert_frag\n"));
|
printf (_("call to md_convert_frag\n"));
|
||||||
abort ();
|
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
|
valueT
|
||||||
md_section_align (segT seg, valueT size)
|
md_section_align (segT seg, valueT size)
|
||||||
{
|
{
|
||||||
return ((size + (1 << section_alignment[(int) seg]) - 1)
|
int align = bfd_get_section_alignment (stdoutput, seg);
|
||||||
& (-1 << section_alignment[(int) seg]));
|
valueT mask = ((valueT) 1 << align) - 1;
|
||||||
|
|
||||||
|
return (size + mask) & ~mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Attempt to simplify or eliminate a fixup. To indicate that a fixup
|
/* 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)
|
switch (fixP->fx_r_type)
|
||||||
{
|
{
|
||||||
case R_IMM4L:
|
case BFD_RELOC_Z8K_IMM4L:
|
||||||
buf[0] = (buf[0] & 0xf0) | (val & 0xf);
|
if (fixP->fx_addsy)
|
||||||
|
{
|
||||||
|
fixP->fx_no_overflow = 1;
|
||||||
|
fixP->fx_done = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
buf[0] = (buf[0] & 0xf0) | (val & 0xf);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_JR:
|
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 BFD_RELOC_8_PCREL:
|
||||||
if (fixP->fx_addsy)
|
if (fixP->fx_addsy)
|
||||||
{
|
{
|
||||||
fixP->fx_no_overflow = 1;
|
fixP->fx_no_overflow = 1;
|
||||||
|
@ -1429,7 +1495,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_DISP7:
|
case BFD_RELOC_16_PCREL:
|
||||||
if (fixP->fx_addsy)
|
if (fixP->fx_addsy)
|
||||||
{
|
{
|
||||||
fixP->fx_no_overflow = 1;
|
fixP->fx_no_overflow = 1;
|
||||||
|
@ -1437,20 +1503,18 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (val & 1)
|
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,
|
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||||
_("cannot branch to odd address"));
|
_("relative address out of range"));
|
||||||
val /= 2;
|
*buf++ = (val >> 8);
|
||||||
if (val > 0 || val < -127)
|
*buf++ = val;
|
||||||
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_no_overflow = 1;
|
||||||
fixP->fx_done = 1;
|
fixP->fx_done = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_CALLR:
|
case BFD_RELOC_Z8K_CALLR:
|
||||||
if (fixP->fx_addsy)
|
if (fixP->fx_addsy)
|
||||||
{
|
{
|
||||||
fixP->fx_no_overflow = 1;
|
fixP->fx_no_overflow = 1;
|
||||||
|
@ -1473,34 +1537,25 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_IMM8:
|
case BFD_RELOC_Z8K_DISP7:
|
||||||
*buf++ = val;
|
if (fixP->fx_addsy)
|
||||||
break;
|
{
|
||||||
|
fixP->fx_no_overflow = 1;
|
||||||
case R_IMM16:
|
fixP->fx_done = 0;
|
||||||
*buf++ = (val >> 8);
|
}
|
||||||
*buf++ = val;
|
else
|
||||||
break;
|
{
|
||||||
|
if (val & 1)
|
||||||
case R_IMM32:
|
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||||
*buf++ = (val >> 24);
|
_("cannot branch to odd address"));
|
||||||
*buf++ = (val >> 16);
|
val /= 2;
|
||||||
*buf++ = (val >> 8);
|
if (val > 0 || val < -127)
|
||||||
*buf++ = val;
|
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||||
break;
|
_("relative jump out of range"));
|
||||||
|
*buf = (*buf & 0x80) | (-val & 0x7f);
|
||||||
case R_REL16:
|
fixP->fx_no_overflow = 1;
|
||||||
val = val - fixP->fx_frag->fr_address + fixP->fx_where - fixP->fx_size;
|
fixP->fx_done = 1;
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
#define TC_Z8K
|
#define TC_Z8K
|
||||||
#define TARGET_BYTES_BIG_ENDIAN 1
|
#define TARGET_BYTES_BIG_ENDIAN 1
|
||||||
|
#define TARGET_ARCH bfd_arch_z8k
|
||||||
|
#define TARGET_FORMAT "coff-z8k"
|
||||||
|
|
||||||
struct internal_reloc;
|
struct internal_reloc;
|
||||||
|
|
||||||
|
@ -31,6 +33,8 @@ struct internal_reloc;
|
||||||
#define IGNORE_NONSTANDARD_ESCAPES
|
#define IGNORE_NONSTANDARD_ESCAPES
|
||||||
#undef WARN_SIGNED_OVERFLOW_WORD
|
#undef WARN_SIGNED_OVERFLOW_WORD
|
||||||
|
|
||||||
|
#define tc_fix_adjustable(X) 0
|
||||||
|
|
||||||
#define LISTING_HEADER "Zilog Z8000 GAS "
|
#define LISTING_HEADER "Zilog Z8000 GAS "
|
||||||
#define RELOC_32 1234
|
#define RELOC_32 1234
|
||||||
|
|
||||||
|
|
|
@ -387,7 +387,7 @@ case ${generic_target} in
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case ${cpu_type} in
|
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
|
bfd_gas=yes
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue