mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-28 06:20:30 +00:00
Re-enable GAS for z8k-coff
This commit is contained in:
parent
98a7a8547e
commit
c0524131ea
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
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" ;;
|
||||
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" ;;
|
||||
|
@ -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" ;;
|
||||
|
@ -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
|
||||
|
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
|
||||
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
|
||||
|
@ -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.
|
||||
|
@ -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*"
|
||||
|
@ -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.
|
||||
|
@ -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,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 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)
|
||||
{
|
||||
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)
|
||||
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,
|
||||
_("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);
|
||||
_("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:
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user