2012-11-09 Nick Clifton <nickc@redhat.com>

* Makefile.am (ALL_MACHINES): Add cpu-v850-rh850.lo.
	(ALL_MACHINES_CFILES): Add cpu-v850-rh850.c.
	* archures.c (bfd_arch_info): Add bfd_v850_rh850_arch.
	* config.bfd: Likewise.
	* configure.in: Add bfd_elf32_v850_rh850_vec.
	* cpu-v850.c: Update printed description.
	* cpu-v850_rh850.c: New file.
	* elf32-v850.c (v850_elf_check_relocs): Add support for RH850 ABI
	relocs.
	(v850_elf_perform_relocation): Likewise.
	(v850_elf_final_link_relocate): Likewise.
	(v850_elf_relocate_section): Likewise.
	(v850_elf_relax_section): Likewise.
	(v800_elf_howto_table): New.
	(v850_elf_object_p): Add support for RH850 ABI values.
	(v850_elf_final_write_processing): Likewise.
	(v850_elf_merge_private_bfd_data): Likewise.
	(v850_elf_print_private_bfd_data): Likewise.
	(v800_elf_reloc_map): New.
	(v800_elf_reloc_type_lookup): New.
	(v800_elf_reloc_name_lookup): New.
	(v800_elf_info_to_howto): New.
	(bfd_elf32_v850_rh850_vec): New.
	(bfd_arch_v850_rh850): New.
	* targets.c (_bfd_targets): Add bfd_elf32_v850_rh850_vec.
	* Makefile.in: Regenerate.
	* bfd-in2.h: Regenerate.
	* configure: Regenerate.

	* readelf.c (get_machine_flags): Add support for E_FLAG_RX_ABI.
	(guess_is_rela): Add EM_V800.
	(dump_relocations): Likewise.
	(get_machine_name): Update EM_V800.
	(get_machine_flags): Add support for RH850 ABI flags.
	(is_32bit_abs_reloc): Add support for RH850 ABI reloc.

	* config/tc-v850.c (v850_target_arch): New.
	(v850_target_format): New.
	(set_machine): Use v850_target_arch.
	(md_begin): Likewise.
	(md_show_usage): Document new switches.
	(md_parse_option): Add -mgcc-abi, -mrh850-abi, -m8byte-align and
	-m4byte-align.
	* config/tc-v850.c (TARGET_ARCH) Use v850_target_arch.
	(TARGET_FORMAT): Use v850_target_format.
	* doc/c-v850.texi: Document new options.

	* v850.h: Add RH850 ABI values.

	* Makefile.am: (ALL_EMULATION_SOURCES): Add ev850_rh850.c.
	* Makefile.in: Regenerate.
	* configure.tgt (v850*-*-*): Make v850_rh850 the default
	emulation. Add vanilla v850 as an extra emulation.
	* emulparams/v850_rh850.sh: New file.
	* scripttempl/v850_rh850.sc: New file.

	* configure.in: Add bfd_v850_rh850_arch.
	* configure: Regenerate.
	* disassemble.c (disassembler): Likewise.
This commit is contained in:
Nick Clifton 2012-11-09 17:36:19 +00:00
parent 708e2187a3
commit de863c7475
29 changed files with 1012 additions and 109 deletions

View File

@ -1,5 +1,34 @@
2012-11-09 Nick Clifton <nickc@redhat.com>
* Makefile.am (ALL_MACHINES): Add cpu-v850-rh850.lo.
(ALL_MACHINES_CFILES): Add cpu-v850-rh850.c.
* archures.c (bfd_arch_info): Add bfd_v850_rh850_arch.
* config.bfd: Likewise.
* configure.in: Add bfd_elf32_v850_rh850_vec.
* cpu-v850.c: Update printed description.
* cpu-v850_rh850.c: New file.
* elf32-v850.c (v850_elf_check_relocs): Add support for RH850 ABI
relocs.
(v850_elf_perform_relocation): Likewise.
(v850_elf_final_link_relocate): Likewise.
(v850_elf_relocate_section): Likewise.
(v850_elf_relax_section): Likewise.
(v800_elf_howto_table): New.
(v850_elf_object_p): Add support for RH850 ABI values.
(v850_elf_final_write_processing): Likewise.
(v850_elf_merge_private_bfd_data): Likewise.
(v850_elf_print_private_bfd_data): Likewise.
(v800_elf_reloc_map): New.
(v800_elf_reloc_type_lookup): New.
(v800_elf_reloc_name_lookup): New.
(v800_elf_info_to_howto): New.
(bfd_elf32_v850_rh850_vec): New.
(bfd_arch_v850_rh850): New.
* targets.c (_bfd_targets): Add bfd_elf32_v850_rh850_vec.
* Makefile.in: Regenerate.
* bfd-in2.h: Regenerate.
* configure: Regenerate.
* elf32-rx.c (describe_flags): New function. Returns a buffer
containing a description of the E_FLAG_RX_... values set.
(rx_elf_merge_private_bfd_data): Use it.

View File

@ -141,6 +141,7 @@ ALL_MACHINES = \
cpu-tilegx.lo \
cpu-tilepro.lo \
cpu-v850.lo \
cpu-v850_rh850.lo \
cpu-vax.lo \
cpu-w65.lo \
cpu-we32k.lo \
@ -222,6 +223,7 @@ ALL_MACHINES_CFILES = \
cpu-tilegx.c \
cpu-tilepro.c \
cpu-v850.c \
cpu-v850_rh850.c \
cpu-vax.c \
cpu-w65.c \
cpu-we32k.c \

View File

@ -441,6 +441,7 @@ ALL_MACHINES = \
cpu-tilegx.lo \
cpu-tilepro.lo \
cpu-v850.lo \
cpu-v850_rh850.lo \
cpu-vax.lo \
cpu-w65.lo \
cpu-we32k.lo \
@ -522,6 +523,7 @@ ALL_MACHINES_CFILES = \
cpu-tilegx.c \
cpu-tilepro.c \
cpu-v850.c \
cpu-v850_rh850.c \
cpu-vax.c \
cpu-w65.c \
cpu-we32k.c \
@ -1344,6 +1346,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-tic80.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-tilegx.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-tilepro.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-v850_rh850.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-v850.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-vax.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-w65.Plo@am__quote@

View File

@ -323,6 +323,7 @@ DESCRIPTION
. bfd_arch_tic6x, {* Texas Instruments TMS320C6X *}
. bfd_arch_tic80, {* TI TMS320c80 (MVP) *}
. bfd_arch_v850, {* NEC V850 *}
. bfd_arch_v850_rh850,{* NEC V850 (using RH850 ABI) *}
.#define bfd_mach_v850 1
.#define bfd_mach_v850e 'E'
.#define bfd_mach_v850e1 '1'
@ -578,6 +579,7 @@ extern const bfd_arch_info_type bfd_tic80_arch;
extern const bfd_arch_info_type bfd_tilegx_arch;
extern const bfd_arch_info_type bfd_tilepro_arch;
extern const bfd_arch_info_type bfd_v850_arch;
extern const bfd_arch_info_type bfd_v850_rh850_arch;
extern const bfd_arch_info_type bfd_vax_arch;
extern const bfd_arch_info_type bfd_w65_arch;
extern const bfd_arch_info_type bfd_we32k_arch;
@ -661,6 +663,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
&bfd_tilegx_arch,
&bfd_tilepro_arch,
&bfd_v850_arch,
&bfd_v850_rh850_arch,
&bfd_vax_arch,
&bfd_w65_arch,
&bfd_we32k_arch,

View File

@ -2054,6 +2054,7 @@ enum bfd_architecture
bfd_arch_tic6x, /* Texas Instruments TMS320C6X */
bfd_arch_tic80, /* TI TMS320c80 (MVP) */
bfd_arch_v850, /* NEC V850 */
bfd_arch_v850_rh850,/* NEC V850 (using RH850 ABI) */
#define bfd_mach_v850 1
#define bfd_mach_v850e 'E'
#define bfd_mach_v850e1 '1'

View File

@ -103,7 +103,7 @@ sparc*) targ_archs=bfd_sparc_arch ;;
spu*) targ_archs=bfd_spu_arch ;;
tilegx*) targ_archs=bfd_tilegx_arch ;;
tilepro*) targ_archs=bfd_tilepro_arch ;;
v850*) targ_archs=bfd_v850_arch ;;
v850*) targ_archs="bfd_v850_arch bfd_v850_rh850_arch" ;;
x86_64*) targ_archs=bfd_i386_arch ;;
xtensa*) targ_archs=bfd_xtensa_arch ;;
xgate) targ_archs=bfd_xgate_arch ;;
@ -1569,6 +1569,7 @@ case "${targ}" in
v850*-*-*)
targ_defvec=bfd_elf32_v850_vec
targ_selvecs="bfd_elf32_v850_rh850_vec"
;;
vax-*-netbsdelf*)

1
bfd/configure vendored
View File

@ -15349,6 +15349,7 @@ do
tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
bfd_elf32_us_cris_vec) tb="$tb elf32-cris.lo elf32.lo $elf" ;;
bfd_elf32_v850_vec) tb="$tb elf32-v850.lo elf32.lo $elf" ;;
bfd_elf32_v850_rh850_vec) tb="$tb elf32-v850.lo elf32.lo $elf" ;;
bfd_elf32_vax_vec) tb="$tb elf32-vax.lo elf32.lo $elf" ;;
bfd_elf32_xstormy16_vec) tb="$tb elf32-xstormy16.lo elf32.lo $elf" ;;
bfd_elf32_xc16x_vec) tb="$tb elf32-xc16x.lo elf32.lo $elf" ;;

View File

@ -830,6 +830,7 @@ do
tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
bfd_elf32_us_cris_vec) tb="$tb elf32-cris.lo elf32.lo $elf" ;;
bfd_elf32_v850_vec) tb="$tb elf32-v850.lo elf32.lo $elf" ;;
bfd_elf32_v850_rh850_vec) tb="$tb elf32-v850.lo elf32.lo $elf" ;;
bfd_elf32_vax_vec) tb="$tb elf32-vax.lo elf32.lo $elf" ;;
bfd_elf32_xstormy16_vec) tb="$tb elf32-xstormy16.lo elf32.lo $elf" ;;
bfd_elf32_xc16x_vec) tb="$tb elf32-xc16x.lo elf32.lo $elf" ;;

View File

@ -1,6 +1,6 @@
/* BFD support for the NEC V850 processor
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2007,
2010 Free Software Foundation, Inc.
2010, 2012 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -25,7 +25,7 @@
#include "safe-ctype.h"
#define N(number, print, default, next) \
{ 32, 32, 8, bfd_arch_v850, number, "v850", print, 2, default, \
{ 32, 32, 8, bfd_arch_v850, number, "v850", print " (using old gcc ABI)", 2, default, \
bfd_default_compatible, bfd_default_scan, bfd_arch_default_fill, next }
#define NEXT NULL

39
bfd/cpu-v850_rh850.c Normal file
View File

@ -0,0 +1,39 @@
/* BFD support for the NEC V850 processor with the RH850 ABI.
Copyright 2012 Free Software Foundation, Inc.
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 3 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.
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 "sysdep.h"
#include "bfd.h"
#include "libbfd.h"
#include "safe-ctype.h"
#define R(number, print, default, next) \
{ 32, 32, 8, bfd_arch_v850_rh850, number, "v850", print, 2, default, \
bfd_default_compatible, bfd_default_scan, bfd_arch_default_fill, next }
static const bfd_arch_info_type arch_info_struct[] =
{
R (bfd_mach_v850e2v3, "v850e2v3", FALSE, & arch_info_struct[1]),
R (bfd_mach_v850e2, "v850e2", FALSE, & arch_info_struct[2]),
R (bfd_mach_v850e1, "v850e1", FALSE, & arch_info_struct[3]),
R (bfd_mach_v850e, "v850e", FALSE, NULL)
};
const bfd_arch_info_type bfd_v850_rh850_arch =
R (bfd_mach_v850, "v850-rh850", TRUE, & arch_info_struct[0]);

View File

@ -55,7 +55,7 @@ v850_elf_check_relocs (bfd *abfd,
struct elf_link_hash_entry **sym_hashes;
const Elf_Internal_Rela *rel;
const Elf_Internal_Rela *rel_end;
enum v850_reloc_type r_type;
unsigned int r_type;
int other = 0;
const char *common = NULL;
@ -87,32 +87,10 @@ v850_elf_check_relocs (bfd *abfd,
h = (struct elf_link_hash_entry *) h->root.u.i.link;
}
r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
r_type = ELF32_R_TYPE (rel->r_info);
switch (r_type)
{
default:
case R_V850_NONE:
case R_V850_9_PCREL:
case R_V850_16_PCREL:
case R_V850_17_PCREL:
case R_V850_22_PCREL:
case R_V850_32_PCREL:
case R_V850_32_ABS:
case R_V850_HI16:
case R_V850_HI16_S:
case R_V850_LO16:
case R_V850_LO16_S1:
case R_V850_LO16_SPLIT_OFFSET:
case R_V850_23:
case R_V850_ABS32:
case R_V850_REL32:
case R_V850_16:
case R_V850_16_S1:
case R_V850_16_SPLIT_OFFSET:
case R_V850_8:
case R_V850_CALLT_6_7_OFFSET:
case R_V850_CALLT_15_16_OFFSET:
case R_V850_CALLT_16_16_OFFSET:
break;
/* This relocation describes the C++ object vtable hierarchy.
@ -134,6 +112,9 @@ v850_elf_check_relocs (bfd *abfd,
case R_V850_SDA_16_16_SPLIT_OFFSET:
case R_V850_SDA_16_16_OFFSET:
case R_V850_SDA_15_16_OFFSET:
case R_V810_GPWLO_1:
case R_V850_HWLO:
case R_V850_HWLO_1:
other = V850_OTHER_SDA;
common = ".scommon";
goto small_data_common;
@ -510,13 +491,19 @@ v850_elf_perform_relocation (bfd *abfd,
switch (r_type)
{
default:
#ifdef DEBUG
fprintf (stderr, "reloc number %d not recognised\n", r_type);
#endif
return bfd_reloc_notsupported;
case R_V850_REL32:
case R_V850_ABS32:
case R_V810_WORD:
case R_V850_PC32:
bfd_put_32 (abfd, addend, address);
return bfd_reloc_ok;
case R_V850_WLO23:
case R_V850_23:
insn = bfd_get_32 (abfd, address);
insn &= ~((0x7f << 4) | (0x7fff80 << (16-7)));
@ -524,6 +511,7 @@ v850_elf_perform_relocation (bfd *abfd,
bfd_put_32 (abfd, (bfd_vma) insn, address);
return bfd_reloc_ok;
case R_V850_PCR22:
case R_V850_22_PCREL:
if (saddend > 0x1fffff || saddend < -0x200000)
return bfd_reloc_overflow;
@ -537,6 +525,7 @@ v850_elf_perform_relocation (bfd *abfd,
bfd_put_32 (abfd, (bfd_vma) insn, address);
return bfd_reloc_ok;
case R_V850_PC17:
case R_V850_17_PCREL:
if (saddend > 0xffff || saddend < -0x10000)
return bfd_reloc_overflow;
@ -549,6 +538,7 @@ v850_elf_perform_relocation (bfd *abfd,
insn |= ((addend & 0xfffe) << 16) | ((addend & 0x10000) >> (16-4));
break;
case R_V850_PC16U:
case R_V850_16_PCREL:
if ((saddend < -0xffff) || (saddend > 0))
return bfd_reloc_overflow;
@ -561,6 +551,7 @@ v850_elf_perform_relocation (bfd *abfd,
insn |= (-addend & 0xfffe);
break;
case R_V850_PC9:
case R_V850_9_PCREL:
if (saddend > 0xff || saddend < -0x100)
return bfd_reloc_overflow;
@ -573,12 +564,14 @@ v850_elf_perform_relocation (bfd *abfd,
insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
break;
case R_V810_WHI:
case R_V850_HI16:
addend += (bfd_get_16 (abfd, address) << 16);
addend = (addend >> 16);
insn = addend;
break;
case R_V810_WHI1:
case R_V850_HI16_S:
/* Remember where this relocation took place. */
remember_hi16s_reloc (abfd, addend, address);
@ -593,12 +586,14 @@ v850_elf_perform_relocation (bfd *abfd,
insn = addend;
break;
case R_V810_WLO:
case R_V850_LO16:
insn = bfd_get_16 (abfd, address);
if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
return bfd_reloc_overflow;
break;
case R_V810_BYTE:
case R_V850_8:
addend += (char) bfd_get_8 (abfd, address);
@ -652,6 +647,7 @@ v850_elf_perform_relocation (bfd *abfd,
break;
case R_V850_16:
case R_V810_HWORD:
case R_V850_SDA_16_16_OFFSET:
case R_V850_ZDA_16_16_OFFSET:
case R_V850_TDA_16_16_OFFSET:
@ -668,6 +664,7 @@ v850_elf_perform_relocation (bfd *abfd,
case R_V850_16_S1:
case R_V850_SDA_15_16_OFFSET:
case R_V850_ZDA_15_16_OFFSET:
case R_V810_GPWLO_1:
insn = bfd_get_16 (abfd, address);
addend += (insn & 0xfffe);
@ -756,6 +753,9 @@ v850_elf_perform_relocation (bfd *abfd,
insn |= addend;
break;
case R_V810_WLO_1:
case R_V850_HWLO:
case R_V850_HWLO_1:
case R_V850_LO16_S1:
insn = bfd_get_16 (abfd, address);
result = insn & 0xfffe;
@ -768,6 +768,7 @@ v850_elf_perform_relocation (bfd *abfd,
bfd_put_16 (abfd, insn, address);
return bfd_reloc_ok;
case R_V850_BLO:
case R_V850_LO16_SPLIT_OFFSET:
insn = bfd_get_32 (abfd, address);
result = ((insn & 0xfffe0000) >> 16) | ((insn & 0x20) >> 5);
@ -886,7 +887,7 @@ v850_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
}
/* Note: It is REQUIRED that the 'type' value of each entry
in this array match the index of the entry in the array.
SeeAlso: RELOC_NUBMER in include/elf/v850.h */
SeeAlso: RELOC_NUBMER in include/elf/v850.h. */
static reloc_howto_type v850_elf_howto_table[] =
{
/* This reloc does nothing. */
@ -1742,6 +1743,109 @@ static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
{ BFD_RELOC_V850_CODE, R_V850_CODE },
{ BFD_RELOC_V850_DATA, R_V850_DATA },
};
#define V800_RELOC(name,sz,bit,shift,complain,pcrel,resolver) \
HOWTO (name, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
bfd_elf_ ## resolver ## _reloc, #name, FALSE, 0, ~0, FALSE)
#define V800_EMPTY(name) EMPTY_HOWTO (name - R_V810_NONE)
#define bfd_elf_v850_reloc v850_elf_reloc
/* Note: It is REQUIRED that the 'type' value (R_V810_...) of each entry
in this array match the index of the entry in the array minus 0x30.
See: bfd_elf_v850_relocate_section(), v800_elf_reloc_type_lookup()
and v800_elf_info_to_howto(). */
static reloc_howto_type v800_elf_howto_table[] =
{
V800_RELOC (R_V810_NONE, 0, 0, 0, dont, FALSE, generic), /* Type = 0x30 */
V800_RELOC (R_V810_BYTE, 0, 8, 0, dont, FALSE, generic),
V800_RELOC (R_V810_HWORD, 1, 16, 0, dont, FALSE, generic),
V800_RELOC (R_V810_WORD, 2, 32, 0, dont, FALSE, generic),
V800_RELOC (R_V810_WLO, 1, 16, 0, dont, FALSE, generic),
V800_RELOC (R_V810_WHI, 1, 16, 0, dont, FALSE, generic),
V800_RELOC (R_V810_WHI1, 1, 16, 0, dont, FALSE, generic),
V800_RELOC (R_V810_GPBYTE, 0, 8, 0, dont, FALSE, v850),
V800_RELOC (R_V810_GPHWORD, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_GPWORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V810_GPWLO, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_GPWHI, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_GPWHI1, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V850_HWLO, 1, 16, 0, dont, FALSE, generic),
V800_EMPTY (R_V810_reserved1),
V800_RELOC (R_V850_EP7BIT, 0, 7, 0, unsigned, FALSE, v850),
V800_RELOC (R_V850_EPHBYTE, 0, 8, 1, unsigned, FALSE, v850),
V800_RELOC (R_V850_EPWBYTE, 0, 8, 2, unsigned, FALSE, v850),
V800_RELOC (R_V850_REGHWLO, 1, 16, 0, dont, FALSE, v850),
V800_EMPTY (R_V810_reserved2),
V800_RELOC (R_V850_GPHWLO, 1, 16, 0, dont, FALSE, v850),
V800_EMPTY (R_V810_reserved3),
V800_RELOC (R_V850_PCR22, 2, 22, 0, signed, TRUE, generic),
V800_RELOC (R_V850_BLO, 2, 24, 0, dont, FALSE, v850),
V800_RELOC (R_V850_EP4BIT, 0, 4, 0, unsigned, FALSE, v850),
V800_RELOC (R_V850_EP5BIT, 0, 5, 0, unsigned, FALSE, v850),
V800_RELOC (R_V850_REGBLO, 2, 24, 0, dont, FALSE, v850),
V800_RELOC (R_V850_GPBLO, 2, 24, 0, dont, FALSE, v850),
V800_RELOC (R_V810_WLO_1, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_GPWLO_1, 1, 16, 0, signed, FALSE, v850),
V800_RELOC (R_V850_BLO_1, 2, 16, 0, signed, FALSE, v850),
V800_RELOC (R_V850_HWLO_1, 1, 16, 0, signed, FALSE, v850),
V800_EMPTY (R_V810_reserved4),
V800_RELOC (R_V850_GPBLO_1, 2, 16, 1, signed, FALSE, v850),
V800_RELOC (R_V850_GPHWLO_1, 1, 16, 1, signed, FALSE, v850),
V800_EMPTY (R_V810_reserved5),
V800_RELOC (R_V850_EPBLO, 2, 16, 1, signed, FALSE, v850),
V800_RELOC (R_V850_EPHWLO, 1, 16, 1, signed, FALSE, v850),
V800_EMPTY (R_V810_reserved6),
V800_RELOC (R_V850_EPWLO_N, 1, 16, 1, signed, FALSE, v850),
V800_RELOC (R_V850_PC32, 2, 32, 1, signed, TRUE, v850),
V800_RELOC (R_V850_W23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_GPW23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_EPW23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_B23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_GPB23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_EPB23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_PC16U, 1, 16, 1, unsigned, TRUE, generic),
V800_RELOC (R_V850_PC17, 2, 17, 1, signed, TRUE, generic),
V800_RELOC (R_V850_DW8, 2, 8, 2, signed, FALSE, v850),
V800_RELOC (R_V850_GPDW8, 2, 8, 2, signed, FALSE, v850),
V800_RELOC (R_V850_EPDW8, 2, 8, 2, signed, FALSE, v850),
V800_RELOC (R_V850_PC9, 1, 9, 3, signed, TRUE, v850),
V800_RELOC (R_V810_REGBYTE, 0, 8, 0, dont, FALSE, v850),
V800_RELOC (R_V810_REGHWORD, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_REGWORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V810_REGWLO, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_REGWHI, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_REGWHI1, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V850_REGW23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_REGB23BIT, 2, 23, 1, signed, FALSE, v850),
V800_RELOC (R_V850_REGDW8, 2, 8, 2, signed, FALSE, v850),
V800_RELOC (R_V810_EPBYTE, 0, 8, 0, dont, FALSE, v850),
V800_RELOC (R_V810_EPHWORD, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_EPWORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V850_WLO23, 2, 32, 1, dont, FALSE, v850),
V800_RELOC (R_V850_WORD_E, 2, 32, 1, dont, FALSE, v850),
V800_RELOC (R_V850_REGWORD_E, 2, 32, 1, dont, FALSE, v850),
V800_RELOC (R_V850_WORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V850_GPWORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V850_REGWORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V850_EPWORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V810_TPBYTE, 0, 8, 0, dont, FALSE, v850),
V800_RELOC (R_V810_TPHWORD, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_TPWORD, 2, 32, 0, dont, FALSE, v850),
V800_RELOC (R_V810_TPWLO, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_TPWHI, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V810_TPWHI1, 1, 16, 0, dont, FALSE, v850),
V800_RELOC (R_V850_TPHWLO, 1, 16, 1, dont, FALSE, v850),
V800_RELOC (R_V850_TPBLO, 2, 24, 0, dont, FALSE, v850),
V800_RELOC (R_V810_TPWLO_1, 1, 16, 0, signed, FALSE, v850),
V800_RELOC (R_V850_TPBLO_1, 2, 16, 0, signed, FALSE, v850),
V800_RELOC (R_V850_TPHWLO_1, 1, 16, 0, signed, FALSE, v850),
V800_RELOC (R_V850_TP23BIT, 2, 23, 0, signed, FALSE, v850),
V800_RELOC (R_V850_TPW23BIT, 2, 23, 0, signed, FALSE, v850),
V800_RELOC (R_V850_TPDW8, 2, 8, 0, signed, FALSE, v850)
};
/* Map a bfd relocation into the appropriate howto structure. */
@ -1841,12 +1945,14 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
/* Adjust the value according to the relocation. */
switch (r_type)
{
case R_V850_PC9:
case R_V850_9_PCREL:
value -= (input_section->output_section->vma
+ input_section->output_offset);
value -= offset;
break;
case R_V850_PC16U:
case R_V850_16_PCREL:
value -= (input_section->output_section->vma
+ input_section->output_offset
@ -1858,6 +1964,7 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
break;
case R_V850_PC17:
case R_V850_17_PCREL:
value -= (input_section->output_section->vma
+ input_section->output_offset
@ -1870,6 +1977,7 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
value = SEXT17 (value);
break;
case R_V850_PCR22:
case R_V850_22_PCREL:
value -= (input_section->output_section->vma
+ input_section->output_offset
@ -1883,6 +1991,7 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
value = SEXT22 (value);
break;
case R_V850_PC32:
case R_V850_32_PCREL:
value -= (input_section->output_section->vma
+ input_section->output_offset
@ -1899,6 +2008,15 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
case R_V850_16:
case R_V850_ABS32:
case R_V850_8:
case R_V810_BYTE:
case R_V810_HWORD:
case R_V810_WORD:
case R_V810_WLO:
case R_V810_WHI:
case R_V810_WHI1:
case R_V810_WLO_1:
case R_V850_WLO23:
case R_V850_BLO:
break;
case R_V850_ZDA_15_16_OFFSET:
@ -1913,6 +2031,7 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
case R_V850_SDA_15_16_OFFSET:
case R_V850_SDA_16_16_OFFSET:
case R_V850_SDA_16_16_SPLIT_OFFSET:
case R_V810_GPWLO_1:
{
unsigned long gp;
struct bfd_link_hash_entry * h;
@ -2002,6 +2121,7 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
break;
case R_V850_NONE:
case R_V810_NONE:
case R_V850_GNU_VTINHERIT:
case R_V850_GNU_VTENTRY:
case R_V850_LONGCALL:
@ -2010,6 +2130,9 @@ v850_elf_final_link_relocate (reloc_howto_type *howto,
return bfd_reloc_ok;
default:
#ifdef DEBUG
fprintf (stderr, "reloc number %d not recognised\n", r_type);
#endif
return bfd_reloc_notsupported;
}
@ -2046,7 +2169,7 @@ v850_elf_relocate_section (bfd *output_bfd,
relend = relocs + input_section->reloc_count;
for (; rel < relend; rel++)
{
int r_type;
unsigned int r_type;
reloc_howto_type *howto;
unsigned long r_symndx;
Elf_Internal_Sym *sym;
@ -2062,7 +2185,13 @@ v850_elf_relocate_section (bfd *output_bfd,
|| r_type == R_V850_GNU_VTINHERIT)
continue;
howto = v850_elf_howto_table + r_type;
if (bfd_get_arch (input_bfd) == bfd_arch_v850_rh850)
howto = v800_elf_howto_table + (r_type - R_V810_NONE);
else
howto = v850_elf_howto_table + r_type;
BFD_ASSERT (r_type == howto->type);
h = NULL;
sym = NULL;
sec = NULL;
@ -2199,31 +2328,40 @@ v850_elf_gc_mark_hook (asection *sec,
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
}
/* Set the right machine number. */
/* Set the right machine number and architecture. */
static bfd_boolean
v850_elf_object_p (bfd *abfd)
{
switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
enum bfd_architecture arch;
unsigned long mach;
switch (elf_elfheader (abfd)->e_machine)
{
case EM_V800:
arch = bfd_arch_v850_rh850;
mach = bfd_mach_v850e2v3;
break;
case EM_CYGNUS_V850:
case EM_V850:
arch = bfd_arch_v850;
switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
{
default:
case E_V850_ARCH: mach = bfd_mach_v850; break;
case E_V850E_ARCH: mach = bfd_mach_v850e; break;
case E_V850E1_ARCH: mach = bfd_mach_v850e1; break;
case E_V850E2_ARCH: mach = bfd_mach_v850e2; break;
case E_V850E2V3_ARCH: mach = bfd_mach_v850e2v3; break;
}
break;
default:
case E_V850_ARCH:
bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850);
break;
case E_V850E_ARCH:
bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
break;
case E_V850E1_ARCH:
bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
break;
case E_V850E2_ARCH:
bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e2);
break;
case E_V850E2V3_ARCH:
bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e2v3);
break;
return FALSE;
}
return TRUE;
return bfd_default_set_arch_mach (abfd, arch, mach);
}
/* Store the machine number in the flags field. */
@ -2234,18 +2372,29 @@ v850_elf_final_write_processing (bfd *abfd,
{
unsigned long val;
switch (bfd_get_mach (abfd))
switch (bfd_get_arch (abfd))
{
default:
case bfd_mach_v850: val = E_V850_ARCH; break;
case bfd_mach_v850e: val = E_V850E_ARCH; break;
case bfd_mach_v850e1: val = E_V850E1_ARCH; break;
case bfd_mach_v850e2: val = E_V850E2_ARCH; break;
case bfd_mach_v850e2v3: val = E_V850E2V3_ARCH; break;
}
case bfd_arch_v850_rh850:
val = EF_RH850_ABI;
elf_elfheader (abfd)->e_flags |= val;
break;
elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
elf_elfheader (abfd)->e_flags |= val;
case bfd_arch_v850:
switch (bfd_get_mach (abfd))
{
default:
case bfd_mach_v850: val = E_V850_ARCH; break;
case bfd_mach_v850e: val = E_V850E_ARCH; break;
case bfd_mach_v850e1: val = E_V850E1_ARCH; break;
case bfd_mach_v850e2: val = E_V850E2_ARCH; break;
case bfd_mach_v850e2v3: val = E_V850E2V3_ARCH; break;
}
elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
elf_elfheader (abfd)->e_flags |= val;
break;
default:
break;
}
}
/* Function to keep V850 specific file flags. */
@ -2302,17 +2451,36 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
if (in_flags == out_flags)
return TRUE;
if (bfd_get_arch (obfd) == bfd_arch_v850_rh850)
{
if ((in_flags & EF_V800_850E3) != (out_flags & EF_V800_850E3))
{
_bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
ibfd);
elf_elfheader (obfd)->e_flags |= EF_V800_850E3;
}
if ((in_flags & EF_RH850_DATA_ALIGN8) != (out_flags & EF_RH850_DATA_ALIGN8))
{
_bfd_error_handler (_("%B: Alignment mismatch with previous modules"),
ibfd);
elf_elfheader (obfd)->e_flags |= EF_RH850_DATA_ALIGN8;
}
return TRUE;
}
if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
&& (in_flags & EF_V850_ARCH) != E_V850_ARCH)
{
/* Allow v850e1 binaries to be linked with v850e binaries.
Set the output binary to v850e. */
if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
/* Allow earlier architecture binaries to be linked with later binaries.
Set the output binary to the later architecture, except for v850e1,
which we set to v850e. */
if ( (in_flags & EF_V850_ARCH) == E_V850E1_ARCH
&& (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
return TRUE;
if ((in_flags & EF_V850_ARCH) == E_V850_ARCH
if ( (in_flags & EF_V850_ARCH) == E_V850_ARCH
&& (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
{
elf_elfheader (obfd)->e_flags =
@ -2320,7 +2488,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
return TRUE;
}
if (((in_flags & EF_V850_ARCH) == E_V850_ARCH
if (( (in_flags & EF_V850_ARCH) == E_V850_ARCH
|| (in_flags & EF_V850_ARCH) == E_V850E_ARCH)
&& (out_flags & EF_V850_ARCH) == E_V850E2_ARCH)
{
@ -2329,7 +2497,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
return TRUE;
}
if (((in_flags & EF_V850_ARCH) == E_V850_ARCH
if (( (in_flags & EF_V850_ARCH) == E_V850_ARCH
|| (in_flags & EF_V850_ARCH) == E_V850E_ARCH
|| (in_flags & EF_V850_ARCH) == E_V850E2_ARCH)
&& (out_flags & EF_V850_ARCH) == E_V850E2V3_ARCH)
@ -2360,14 +2528,29 @@ v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
/* xgettext:c-format. */
fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
{
default:
case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
case E_V850E2_ARCH: fprintf (file, _("v850e2 architecture")); break;
case E_V850E2V3_ARCH: fprintf (file, _("v850e2v3 architecture")); break;
if ((elf_elfheader (abfd)->e_flags & EF_RH850_ABI) != EF_RH850_ABI)
fprintf (file, _("unknown v850 architecture"));
else if (elf_elfheader (abfd)->e_flags & EF_V800_850E3)
fprintf (file, _("v850 E3 architecture"));
else
fprintf (file, _("v850 architecture"));
if (elf_elfheader (abfd)->e_flags & EF_RH850_DATA_ALIGN8)
fprintf (file, _(", 8-byte data alignment"));
}
else
{
switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
{
default:
case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
case E_V850E2_ARCH: fprintf (file, _("v850e2 architecture")); break;
case E_V850E2V3_ARCH: fprintf (file, _("v850e2v3 architecture")); break;
}
}
fputc ('\n', file);
@ -2965,6 +3148,7 @@ v850_elf_relax_section (bfd *abfd,
Elf_Internal_Rela *lo_irelfn;
Elf_Internal_Rela *irelcall;
bfd_signed_vma foff;
unsigned int r_type;
if (! (irel->r_offset >= addr && irel->r_offset < toaddr
&& (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
@ -3060,23 +3244,33 @@ v850_elf_relax_section (bfd *abfd,
/* Get the reloc for the address from which the register is
being loaded. This reloc will tell us which function is
actually being called. */
for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
if (hi_irelfn->r_offset == laddr + 2
&& ELF32_R_TYPE (hi_irelfn->r_info)
== (int) R_V850_HI16_S)
break;
{
r_type = ELF32_R_TYPE (hi_irelfn->r_info);
if (hi_irelfn->r_offset == laddr + 2
&& (r_type == (int) R_V850_HI16_S || r_type == (int) R_V810_WHI1))
break;
}
for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
if (lo_irelfn->r_offset == laddr + 6
&& ELF32_R_TYPE (lo_irelfn->r_info)
== (int) R_V850_LO16)
break;
{
r_type = ELF32_R_TYPE (lo_irelfn->r_info);
if (lo_irelfn->r_offset == laddr + 6
&& (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
break;
}
for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
if (irelcall->r_offset == laddr + 8
&& ELF32_R_TYPE (irelcall->r_info)
== (int) R_V850_22_PCREL)
break;
{
r_type = ELF32_R_TYPE (irelcall->r_info);
if (irelcall->r_offset == laddr + 8
&& (r_type == (int) R_V850_22_PCREL || r_type == (int) R_V850_PCR22))
break;
}
if ( hi_irelfn == irelend
|| lo_irelfn == irelend
@ -3202,7 +3396,10 @@ v850_elf_relax_section (bfd *abfd,
symtab_hdr->contents = (bfd_byte *) isymbuf;
/* Replace the long call with a jarl. */
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_PCR22);
else
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
addend = 0;
@ -3278,14 +3475,22 @@ v850_elf_relax_section (bfd *abfd,
being loaded. This reloc will tell us which function is
actually being called. */
for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
if (hi_irelfn->r_offset == laddr + 2
&& ELF32_R_TYPE (hi_irelfn->r_info) == (int) R_V850_HI16_S)
break;
{
r_type = ELF32_R_TYPE (hi_irelfn->r_info);
if (hi_irelfn->r_offset == laddr + 2
&& ((r_type == (int) R_V850_HI16_S) || r_type == (int) R_V810_WHI1))
break;
}
for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
if (lo_irelfn->r_offset == laddr + 6
&& ELF32_R_TYPE (lo_irelfn->r_info) == (int) R_V850_LO16)
break;
{
r_type = ELF32_R_TYPE (lo_irelfn->r_info);
if (lo_irelfn->r_offset == laddr + 6
&& (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
break;
}
if ( hi_irelfn == irelend
|| lo_irelfn == irelend)
@ -3392,8 +3597,11 @@ v850_elf_relax_section (bfd *abfd,
{
/* Replace the long jump with a jr. */
irel->r_info =
ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PCR22);
else
irel->r_info =
ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
irel->r_addend = addend;
addend = 0;
@ -3425,8 +3633,11 @@ v850_elf_relax_section (bfd *abfd,
{
/* Replace the long jump with a br. */
irel->r_info =
ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PC9);
else
irel->r_info =
ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
irel->r_addend = addend;
addend = 0;
@ -3539,7 +3750,6 @@ static const struct bfd_elf_special_section v850_elf_special_sections[] =
#define ELF_ARCH bfd_arch_v850
#define ELF_MACHINE_CODE EM_V850
#define ELF_MACHINE_ALT1 EM_CYGNUS_V850
#define ELF_MACHINE_ALT2 EM_V800 /* This is the value used by the GreenHills toolchain. */
#define ELF_MAXPAGESIZE 0x1000
#define elf_info_to_howto v850_elf_info_to_howto_rela
@ -3563,7 +3773,7 @@ static const struct bfd_elf_special_section v850_elf_special_sections[] =
#define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
#define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup v850_elf_reloc_name_lookup
#define bfd_elf32_bfd_reloc_name_lookup v850_elf_reloc_name_lookup
#define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
#define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
#define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
@ -3571,4 +3781,122 @@ static const struct bfd_elf_special_section v850_elf_special_sections[] =
#define elf_symbol_leading_char '_'
#undef elf32_bed
#define elf32_bed elf32_v850_bed
#include "elf32-target.h"
/* Map BFD reloc types to V800 ELF reloc types. */
static const struct v850_elf_reloc_map v800_elf_reloc_map[] =
{
{ BFD_RELOC_NONE, R_V810_NONE },
{ BFD_RELOC_8, R_V810_BYTE },
{ BFD_RELOC_16, R_V810_HWORD },
{ BFD_RELOC_32, R_V810_WORD },
{ BFD_RELOC_LO16, R_V810_WLO },
{ BFD_RELOC_HI16, R_V810_WHI },
{ BFD_RELOC_HI16_S, R_V810_WHI1 },
{ BFD_RELOC_V850_32_PCREL, R_V850_PC32 },
{ BFD_RELOC_V850_22_PCREL, R_V850_PCR22 },
{ BFD_RELOC_V850_17_PCREL, R_V850_PC17 },
{ BFD_RELOC_V850_16_PCREL, R_V850_PC16U },
{ BFD_RELOC_V850_9_PCREL, R_V850_PC9 },
{ BFD_RELOC_V850_LO16_S1, R_V810_WLO_1 }, /* Or R_V850_HWLO or R_V850_HWLO_1. */
{ BFD_RELOC_V850_23, R_V850_WLO23 },
{ BFD_RELOC_V850_LO16_SPLIT_OFFSET, R_V850_BLO },
{ BFD_RELOC_V850_ZDA_16_16_OFFSET, R_V810_HWORD },
{ BFD_RELOC_V850_TDA_16_16_OFFSET, R_V810_HWORD },
{ BFD_RELOC_V850_SDA_16_16_OFFSET, R_V810_HWORD },
{ BFD_RELOC_V850_SDA_15_16_OFFSET, R_V810_GPWLO_1 }
};
/* Map a bfd relocation into the appropriate howto structure. */
static reloc_howto_type *
v800_elf_reloc_type_lookup (bfd * abfd, bfd_reloc_code_real_type code)
{
unsigned int i;
BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
for (i = ARRAY_SIZE (v800_elf_reloc_map); i --;)
if (v800_elf_reloc_map[i].bfd_reloc_val == code)
{
unsigned int elf_reloc_val = v800_elf_reloc_map[i].elf_reloc_val;
unsigned int idx = elf_reloc_val - R_V810_NONE;
BFD_ASSERT (v800_elf_howto_table[idx].type == elf_reloc_val);
return v800_elf_howto_table + idx;
}
#ifdef DEBUG
fprintf (stderr, "failed to find v800 equiv of bfd reloc code %d\n", code);
#endif
return NULL;
}
static reloc_howto_type *
v800_elf_reloc_name_lookup (bfd * abfd, const char * r_name)
{
unsigned int i;
BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
for (i = ARRAY_SIZE (v800_elf_howto_table); i--;)
if (v800_elf_howto_table[i].name != NULL
&& strcasecmp (v800_elf_howto_table[i].name, r_name) == 0)
return v800_elf_howto_table + i;
return NULL;
}
/* Set the howto pointer in CACHE_PTR for a V800 ELF reloc. */
static void
v800_elf_info_to_howto (bfd * abfd,
arelent * cache_ptr,
Elf_Internal_Rela * dst)
{
unsigned int r_type = ELF32_R_TYPE (dst->r_info);
BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
BFD_ASSERT (r_type < (unsigned int) R_V800_max);
if (r_type == R_V800_NONE)
r_type = R_V810_NONE;
BFD_ASSERT (r_type >= (unsigned int) R_V810_NONE);
r_type -= R_V810_NONE;
BFD_ASSERT (r_type < ARRAY_SIZE (v800_elf_howto_table));
cache_ptr->howto = v800_elf_howto_table + r_type;
}
#undef TARGET_LITTLE_SYM
#define TARGET_LITTLE_SYM bfd_elf32_v850_rh850_vec
#undef TARGET_LITTLE_NAME
#define TARGET_LITTLE_NAME "elf32-v850-rh850"
#undef ELF_ARCH
#define ELF_ARCH bfd_arch_v850_rh850
#undef ELF_MACHINE_CODE
#define ELF_MACHINE_CODE EM_V800
#undef ELF_MACHINE_ALT1
#undef elf32_bed
#define elf32_bed elf32_v850_rh850_bed
#undef elf_info_to_howto
#define elf_info_to_howto v800_elf_info_to_howto
#undef elf_info_to_howto_rel
#define elf_info_to_howto_rel NULL
#undef bfd_elf32_bfd_reloc_type_lookup
#define bfd_elf32_bfd_reloc_type_lookup v800_elf_reloc_type_lookup
#undef bfd_elf32_bfd_reloc_name_lookup
#define bfd_elf32_bfd_reloc_name_lookup v800_elf_reloc_name_lookup
#include "elf32-target.h"

View File

@ -722,6 +722,7 @@ extern const bfd_target bfd_elf32_tradbigmips_freebsd_vec;
extern const bfd_target bfd_elf32_tradlittlemips_freebsd_vec;
extern const bfd_target bfd_elf32_us_cris_vec;
extern const bfd_target bfd_elf32_v850_vec;
extern const bfd_target bfd_elf32_v850_rh850_vec;
extern const bfd_target bfd_elf32_vax_vec;
extern const bfd_target bfd_elf32_xc16x_vec;
extern const bfd_target bfd_elf32_xgate_vec;
@ -1099,6 +1100,7 @@ static const bfd_target * const _bfd_target_vector[] =
&bfd_elf32_tradlittlemips_freebsd_vec,
&bfd_elf32_us_cris_vec,
&bfd_elf32_v850_vec,
&bfd_elf32_v850_rh850_vec,
&bfd_elf32_vax_vec,
&bfd_elf32_xc16x_vec,
&bfd_elf32_xgate_vec,

View File

@ -1,6 +1,11 @@
2012-11-09 Nick Clifton <nickc@redhat.com>
* readelf.c (get_machine_flags): Add support for E_FLAG_RX_ABI.
(guess_is_rela): Add EM_V800.
(dump_relocations): Likewise.
(get_machine_name): Update EM_V800.
(get_machine_flags): Add support for RH850 ABI flags.
(is_32bit_abs_reloc): Add support for RH850 ABI reloc.
2012-11-09 H.J. Lu <hongjiu.lu@intel.com>

View File

@ -11,6 +11,17 @@
options.
* doc/c-rx.texi: Document -mgcc-abi and -mrx-abi.
* config/tc-v850.c (v850_target_arch): New.
(v850_target_format): New.
(set_machine): Use v850_target_arch.
(md_begin): Likewise.
(md_show_usage): Document new switches.
(md_parse_option): Add -mgcc-abi, -mrh850-abi, -m8byte-align and
-m4byte-align.
* config/tc-v850.c (TARGET_ARCH) Use v850_target_arch.
(TARGET_FORMAT): Use v850_target_format.
* doc/c-v850.texi: Document new options.
2012-11-09 David Holsgrove <david.holsgrove@xilinx.com>
* gas/microblaze/endian.exp: New file - endian testcase for microblaze / microblazeel.

View File

@ -1,6 +1,6 @@
/* tc-v850.c -- Assembler code for the NEC V850
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -38,6 +38,12 @@ static bfd_boolean warn_unsigned_overflows = FALSE;
/* Indicates the target BFD machine number. */
static int machine = -1;
/* Indiciates the target BFD architecture. */
int v850_target_arch = bfd_arch_v850_rh850;
const char * v850_target_format = "elf32-v850-rh850";
static flagword v850_e_flags = 0;
/* Indicates the target processor(s) for the assemble. */
static int processor_mask = 0;
@ -512,7 +518,7 @@ static void
set_machine (int number)
{
machine = number;
bfd_set_arch_mach (stdoutput, TARGET_ARCH, machine);
bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
switch (machine)
{
@ -1338,6 +1344,10 @@ md_show_usage (FILE *stream)
fprintf (stream, _(" -mextension enable extension opcode support\n"));
fprintf (stream, _(" -mno-bcond17 disable b<cond> disp17 instruction\n"));
fprintf (stream, _(" -mno-stld23 disable st/ld offset23 instruction\n"));
fprintf (stream, _(" -mgcc-abi Mark the binary as using the old GCC ABI\n"));
fprintf (stream, _(" -mrh850-abi Mark the binary as using the RH850 ABI (default)\n"));
fprintf (stream, _(" -m8byte-align Mark the binary as using 64-bit alignment\n"));
fprintf (stream, _(" -m4byte-align Mark the binary as using 32-bit alignment (default)\n"));
}
int
@ -1403,6 +1413,20 @@ md_parse_option (int c, char *arg)
}
else if (strcmp (arg, "relax") == 0)
v850_relax = 1;
else if (strcmp (arg, "gcc-abi") == 0)
{
v850_target_arch = bfd_arch_v850;
v850_target_format = "elf32-v850";
}
else if (strcmp (arg, "rh850-abi") == 0)
{
v850_target_arch = bfd_arch_v850_rh850;
v850_target_format = "elf32-v850-rh850";
}
else if (strcmp (arg, "8byte-align") == 0)
v850_e_flags |= EF_RH850_DATA_ALIGN8;
else if (strcmp (arg, "4byte-align") == 0)
v850_e_flags &= ~ EF_RH850_DATA_ALIGN8;
else
return 0;
@ -1673,7 +1697,8 @@ md_begin (void)
}
v850_seg_table[BSS_SECTION].s = bss_section;
bfd_set_arch_mach (stdoutput, TARGET_ARCH, machine);
bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
bfd_set_private_flags (stdoutput, v850_e_flags);
}
@ -1996,7 +2021,7 @@ md_assemble (char *str)
int relaxable = 0;
unsigned long insn;
unsigned long insn_size;
char *f;
char *f = NULL;
int i;
int match;
bfd_boolean extra_data_after_insn = FALSE;
@ -3219,7 +3244,8 @@ md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
break;
case BFD_RELOC_V850_16_PCREL:
bfd_putl16 (-value & 0xfffe, (unsigned char *) where);
bfd_putl16 ((-value & 0xfffe) | (bfd_getl16 (where + 2) & 0x0001),
(unsigned char *) (where + 2));
break;
case BFD_RELOC_V850_22_PCREL:

View File

@ -1,5 +1,5 @@
/* tc-v850.h -- Header file for tc-v850.c.
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2006, 2007
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2012
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -26,10 +26,12 @@
#define TARGET_BYTES_BIG_ENDIAN 0
/* The target BFD architecture. */
#define TARGET_ARCH bfd_arch_v850
#define TARGET_ARCH v850_target_arch
extern int v850_target_arch;
/* The target BFD format. */
#define TARGET_FORMAT "elf32-v850"
#define TARGET_FORMAT v850_target_format
extern const char * v850_target_format;
#define md_operand(x)

View File

@ -1,4 +1,4 @@
@c Copyright 1997, 2002, 2003, 2006, 2011 Free Software Foundation, Inc.
@c Copyright 1997, 2002, 2003, 2006, 2011, 2012 Free Software Foundation, Inc.
@c This is part of the GAS manual.
@c For copying conditions, see the file as.texinfo.
@ -88,8 +88,27 @@ of code which are either a long function call or a long branch. The
assembler will then flag these sections of code and the linker will
attempt to relax them.
@end table
@cindex @code{-mgcc-abi} command line option, V850
@item -mgcc-abi
Marks the generated objecy file as supporting the old GCC ABI.
@cindex @code{-mrh850-abi} command line option, V850
@item -mrh850-abi
Marks the generated objecy file as supporting the RH850 ABI. This is
the default.
@cindex @code{-m8byte-align} command line option, V850
@item -m8byte-align
Marks the generated objecy file as supporting a maximum 64-bits of
alignment for variables defined in the source code.
@cindex @code{-m4byte-align} command line option, V850
@item -m4byte-align
Marks the generated objecy file as supporting a maximum 32-bits of
alignment for variables defined in the source code. This is the
default.
@end table
@node V850 Syntax
@section Syntax

View File

@ -3,6 +3,8 @@
* rx.h (EF_RX_CPU_RX): Add comment.
(E_FLAG_RX_ABI): Define.
* v850.h: Add RH850 ABI values.
2012-11-08 Maciej W. Rozycki <macro@codesourcery.com>
* mips.h (EF_MIPS_32BITMODE): Move next to lower-order bits.

View File

@ -1,5 +1,5 @@
/* V850 ELF support for BFD.
Copyright 1997, 1998, 2000, 2002, 2003, 2004, 2007, 2008, 2010
Copyright 1997, 1998, 2000, 2002, 2003, 2004, 2007, 2008, 2010, 2012
Free Software Foundation, Inc.
Created by Michael Meissner, Cygnus Support <meissner@cygnus.com>
@ -148,4 +148,134 @@ END_RELOC_NUMBERS (R_V850_max)
/* This section must be in the zero data area (pointed to by R0). */
#define SHF_V850_R0REL 0x40000000
/* Alternative versions of the above definitions, as specified by the RH850 ABI. */
#define EF_RH850_ABI 0xF0000000
#define EF_V800_850E3 0x00100000
#define EF_RH850_FPU_DOUBLE 0x00000001 /* sizeof(double) == 8. */
#define EF_RH850_FPU_SINGLE 0x00000002 /* sizeof(double) == 4. */
#define EF_RH850_SIMD 0x00000004
#define EF_RH850_CACHE 0x00000008
#define EF_RH850_MMU 0x00000010
#define EF_RH850_REGMODE22 0x00000020 /* Registers r15-r24 (inclusive) are not used. */
#define EF_RH850_REGMODE32 0x00000040
#define EF_RH850_DATA_ALIGN8 0x00000080 /* 8-byte alignment supported. */
#define EF_RH850_GP_FIX 0x00000100 /* r4 is fixed. */
#define EF_RH850_GP_NOFIX 0x00000200 /* r4 is callee save. */
#define EF_RH850_EP_FIX 0x00000400 /* r30 is fixed. */
#define EF_RH850_EP_NOFIX 0x00000800 /* r30 is callee save. */
#define EF_RH850_TP_FIX 0x00001000 /* r5 is fixed. */
#define EF_RH850_TP_NOFIX 0x00002000 /* r5 is callee save. */
#define EF_RH850_REG2_RESERVE 0x00004000 /* r2 is fixed. */
#define EF_RH850_REG2_NORESERVE 0x00008000 /* r2 is callee saved. */
#define SHT_RNESAS_IOP SHT_LOUSER /* Used by Renesas linker. */
#define SHF_RENESAS_ABS 0x80000000 /* Absolute section. */
#define SHF_GHS_ABS 0x00000400 /* Use unknown. */
#define STT_RENESAS_ENTRY 14 /* Set for functions called at reset time. */
START_RELOC_NUMBERS (v800_reloc_type)
RELOC_NUMBER (R_V800_NONE, 0x00)
RELOC_NUMBER (R_V810_NONE, 0x30)
RELOC_NUMBER (R_V810_BYTE, 0x31)
RELOC_NUMBER (R_V810_HWORD, 0x32)
RELOC_NUMBER (R_V810_WORD, 0x33)
RELOC_NUMBER (R_V810_WLO, 0x34)
RELOC_NUMBER (R_V810_WHI, 0x35)
RELOC_NUMBER (R_V810_WHI1, 0x36)
RELOC_NUMBER (R_V810_GPBYTE, 0x37)
RELOC_NUMBER (R_V810_GPHWORD, 0x38)
RELOC_NUMBER (R_V810_GPWORD, 0x39)
RELOC_NUMBER (R_V810_GPWLO, 0x3a)
RELOC_NUMBER (R_V810_GPWHI, 0x3b)
RELOC_NUMBER (R_V810_GPWHI1, 0x3c)
RELOC_NUMBER (R_V850_HWLO, 0x3d)
FAKE_RELOC (R_V810_reserved1, 0x3e)
RELOC_NUMBER (R_V850_EP7BIT, 0x3f)
RELOC_NUMBER (R_V850_EPHBYTE, 0x40)
RELOC_NUMBER (R_V850_EPWBYTE, 0x41)
RELOC_NUMBER (R_V850_REGHWLO, 0x42)
FAKE_RELOC (R_V810_reserved2, 0x43)
RELOC_NUMBER (R_V850_GPHWLO, 0x44)
FAKE_RELOC (R_V810_reserved3, 0x45)
RELOC_NUMBER (R_V850_PCR22, 0x46)
RELOC_NUMBER (R_V850_BLO, 0x47)
RELOC_NUMBER (R_V850_EP4BIT, 0x48)
RELOC_NUMBER (R_V850_EP5BIT, 0x49)
RELOC_NUMBER (R_V850_REGBLO, 0x4a)
RELOC_NUMBER (R_V850_GPBLO, 0x4b)
RELOC_NUMBER (R_V810_WLO_1, 0x4c)
RELOC_NUMBER (R_V810_GPWLO_1, 0x4d)
RELOC_NUMBER (R_V850_BLO_1, 0x4e)
RELOC_NUMBER (R_V850_HWLO_1, 0x4f)
FAKE_RELOC (R_V810_reserved4, 0x50)
RELOC_NUMBER (R_V850_GPBLO_1, 0x51)
RELOC_NUMBER (R_V850_GPHWLO_1, 0x52)
FAKE_RELOC (R_V810_reserved5, 0x53)
RELOC_NUMBER (R_V850_EPBLO, 0x54)
RELOC_NUMBER (R_V850_EPHWLO, 0x55)
FAKE_RELOC (R_V810_reserved6, 0x56)
RELOC_NUMBER (R_V850_EPWLO_N, 0x57)
RELOC_NUMBER (R_V850_PC32, 0x58)
RELOC_NUMBER (R_V850_W23BIT, 0x59)
RELOC_NUMBER (R_V850_GPW23BIT, 0x5a)
RELOC_NUMBER (R_V850_EPW23BIT, 0x5b)
RELOC_NUMBER (R_V850_B23BIT, 0x5c)
RELOC_NUMBER (R_V850_GPB23BIT, 0x5d)
RELOC_NUMBER (R_V850_EPB23BIT, 0x5e)
RELOC_NUMBER (R_V850_PC16U, 0x5f)
RELOC_NUMBER (R_V850_PC17, 0x60)
RELOC_NUMBER (R_V850_DW8, 0x61)
RELOC_NUMBER (R_V850_GPDW8, 0x62)
RELOC_NUMBER (R_V850_EPDW8, 0x63)
RELOC_NUMBER (R_V850_PC9, 0x64)
RELOC_NUMBER (R_V810_REGBYTE, 0x65)
RELOC_NUMBER (R_V810_REGHWORD, 0x66)
RELOC_NUMBER (R_V810_REGWORD, 0x67)
RELOC_NUMBER (R_V810_REGWLO, 0x68)
RELOC_NUMBER (R_V810_REGWHI, 0x69)
RELOC_NUMBER (R_V810_REGWHI1, 0x6a)
RELOC_NUMBER (R_V850_REGW23BIT, 0x6b)
RELOC_NUMBER (R_V850_REGB23BIT, 0x6c)
RELOC_NUMBER (R_V850_REGDW8, 0x6d)
RELOC_NUMBER (R_V810_EPBYTE, 0x6e)
RELOC_NUMBER (R_V810_EPHWORD, 0x6f)
RELOC_NUMBER (R_V810_EPWORD, 0x70)
RELOC_NUMBER (R_V850_WLO23, 0x71)
RELOC_NUMBER (R_V850_WORD_E, 0x72)
RELOC_NUMBER (R_V850_REGWORD_E, 0x73)
RELOC_NUMBER (R_V850_WORD, 0x74)
RELOC_NUMBER (R_V850_GPWORD, 0x75)
RELOC_NUMBER (R_V850_REGWORD, 0x76)
RELOC_NUMBER (R_V850_EPWORD, 0x77)
RELOC_NUMBER (R_V810_TPBYTE, 0x78)
RELOC_NUMBER (R_V810_TPHWORD, 0x79)
RELOC_NUMBER (R_V810_TPWORD, 0x7a)
RELOC_NUMBER (R_V810_TPWLO, 0x7b)
RELOC_NUMBER (R_V810_TPWHI, 0x7c)
RELOC_NUMBER (R_V810_TPWHI1, 0x7d)
RELOC_NUMBER (R_V850_TPHWLO, 0x7e)
RELOC_NUMBER (R_V850_TPBLO, 0x7f)
RELOC_NUMBER (R_V810_TPWLO_1, 0x80)
RELOC_NUMBER (R_V850_TPBLO_1, 0x81)
RELOC_NUMBER (R_V850_TPHWLO_1, 0x82)
RELOC_NUMBER (R_V850_TP23BIT, 0x83)
RELOC_NUMBER (R_V850_TPW23BIT, 0x84)
RELOC_NUMBER (R_V850_TPDW8, 0x85)
/* These are defined by the RH850 ABI, but not used. */
RELOC_NUMBER (R_V810_ABS32, 0xa0)
RELOC_NUMBER (R_V850_SYM, 0xe0)
RELOC_NUMBER (R_V850_OPadd, 0xe1)
RELOC_NUMBER (R_V850_OPsub, 0xe2)
RELOC_NUMBER (R_V850_OPsctsize, 0xe3)
RELOC_NUMBER (R_V850_OPscttop, 0xe4)
END_RELOC_NUMBERS (R_V800_max)
#endif /* _ELF_V850_H */

View File

@ -6,6 +6,13 @@
(PARSE_AND_LIST_ARG_CASES): Add support for
--flag-mismatch-warnings.
* Makefile.am: (ALL_EMULATION_SOURCES): Add ev850_rh850.c.
* Makefile.in: Regenerate.
* configure.tgt (v850*-*-*): Make v850_rh850 the default
emulation. Add vanilla v850 as an extra emulation.
* emulparams/v850_rh850.sh: New file.
* scripttempl/v850_rh850.sc: New file.
2012-11-09 Edgar E. Iglesias <edgar.iglesias@gmail.com>
* Makefile.am: Add eelf32microblazeel.c and eelf32mbel_linux.c.

View File

@ -453,6 +453,7 @@ ALL_EMULATION_SOURCES = \
etic54xcoff.c \
etic80coff.c \
ev850.c \
ev850_rh850.c \
evanilla.c \
evax.c \
evaxnbsd.c \
@ -1924,6 +1925,9 @@ etic80coff.c: $(srcdir)/emulparams/tic80coff.sh \
ev850.c: $(srcdir)/emulparams/v850.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/v850.sc ${GEN_DEPENDS}
${GENSCRIPTS} v850 "$(tdir_v850)"
ev850_rh850.c: $(srcdir)/emulparams/v850_rh850.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/v850_rh850.sc ${GEN_DEPENDS}
${GENSCRIPTS} v850_rh850 "$(tdir_v850_rh850)"
evanilla.c: $(srcdir)/emulparams/vanilla.sh \
$(srcdir)/emultempl/vanilla.em $(srcdir)/scripttempl/vanilla.sc ${GEN_DEPENDS}
${GENSCRIPTS} vanilla "$(tdir_vanilla)"

View File

@ -3395,6 +3395,9 @@ etic80coff.c: $(srcdir)/emulparams/tic80coff.sh \
ev850.c: $(srcdir)/emulparams/v850.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/v850.sc ${GEN_DEPENDS}
${GENSCRIPTS} v850 "$(tdir_v850)"
ev850_rh850.c: $(srcdir)/emulparams/v850_rh850.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/v850_rh850.sc ${GEN_DEPENDS}
${GENSCRIPTS} v850_rh850 "$(tdir_v850_rh850)"
evanilla.c: $(srcdir)/emulparams/vanilla.sh \
$(srcdir)/emultempl/vanilla.em $(srcdir)/scripttempl/vanilla.sc ${GEN_DEPENDS}
${GENSCRIPTS} vanilla "$(tdir_vanilla)"

View File

@ -716,7 +716,8 @@ tilegxbe-*-*) targ_emul=elf64tilegx_be
targ_extra_emuls="elf64tilegx elf32tilegx elf32tilegx_be"
targ_extra_libpath=$targ_extra_emuls ;;
tilepro-*-*) targ_emul=elf32tilepro ;;
v850*-*-*) targ_emul=v850
v850*-*-*) targ_emul=v850_rh850
targ_extra_emuls=v850
;;
vax-dec-ultrix* | vax-dec-bsd*) targ_emul=vax ;;
vax-*-netbsdelf*) targ_emul=elf32vax

View File

@ -0,0 +1,15 @@
MACHINE=
SCRIPT_NAME=v850_rh850
OUTPUT_FORMAT="elf32-v850-rh850"
TEXT_START_ADDR=0x100000
ZDATA_START_ADDR=0x160
ROZDATA_START_ADDR="ALIGN (4)"
SDATA_START_ADDR="ALIGN (4)"
ROSDATA_START_ADDR="ALIGN (4)"
TDATA_START_ADDR="ALIGN (4)"
CALL_TABLE_START_ADDR="ALIGN (4)"
ARCH=v850_rh850
MAXPAGESIZE=256
ENTRY=_start
EMBEDDED=yes
TEMPLATE_NAME=elf32

View File

@ -0,0 +1,259 @@
cat << EOF
OUTPUT_FORMAT("elf32-v850-rh850", "elf32-v850-rh850",
"elf32-v850-rh850")
OUTPUT_ARCH(v850-rh850)
${RELOCATING+ENTRY(_start)}
SEARCH_DIR(.);
EXTERN(__ctbp __ep __gp);
SECTIONS
{
/* This saves a little space in the ELF file, since the zda starts
at a higher location that the ELF headers take up. */
.zdata ${ZDATA_START_ADDR} :
{
*(.zdata)
*(.zdata23)
*(.zbss)
*(.zbss23)
*(reszdata)
*(.zcommon)
}
/* This is the read only part of the zero data area.
Having it as a seperate section prevents its
attributes from being inherited by the zdata
section. Specifically it prevents the zdata
section from being marked READONLY. */
.rozdata ${ROZDATA_START_ADDR} :
{
*(.rozdata)
*(romzdata)
*(romzbss)
*(.zconst)
*(.zconst23)
}
/* Read-only sections, merged into text segment. */
. = ${TEXT_START_ADDR};
.interp : { *(.interp) }
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.rel.text : { *(.rel.text) }
.rela.text : { *(.rela.text) }
.rel.data : { *(.rel.data) }
.rela.data : { *(.rela.data) }
.rel.rodata : { *(.rel.rodata) }
.rela.rodata : { *(.rela.rodata) }
.rel.gcc_except_table : { *(.rel.gcc_except_table) }
.rela.gcc_except_table : { *(.rela.gcc_except_table) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.init : { *(.rel.init) }
.rela.init : { *(.rela.init) }
.rel.fini : { *(.rel.fini) }
.rela.fini : { *(.rela.fini) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
.init : { KEEP (*(.init)) } =0
.plt : { *(.plt) }
.text :
{
*(.text)
${RELOCATING+*(.text.*)}
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
*(.gnu.linkonce.t*)
} =0
${RELOCATING+_etext = .;}
${RELOCATING+PROVIDE (etext = .);}
/* This is special code area at the end of the normal text section.
It contains a small lookup table at the start followed by the
code pointed to by entries in the lookup table. */
.call_table_data ${CALL_TABLE_START_ADDR} :
{
${RELOCATING+PROVIDE(__ctbp = .);}
*(.call_table_data)
} = 0xff /* Fill gaps with 0xff. */
.call_table_text :
{
*(.call_table_text)
}
.fini : { KEEP (*(.fini)) } =0
.rodata :
{
*(.rodata)
${RELOCATING+*(.rodata.*)}
*(.gnu.linkonce.r*)
*(.const)
}
.rodata1 : { *(.rodata1) }
.data :
{
*(.data)
${RELOCATING+*(.data.*)}
*(.gnu.linkonce.d*)
CONSTRUCTORS
}
.data1 : { *(.data1) }
.ctors :
{
${CONSTRUCTING+___ctors = .;}
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*crtend(.ctors))
${CONSTRUCTING+___ctors_end = .;}
}
.dtors :
{
${CONSTRUCTING+___dtors = .;}
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*crtend.o(.dtors))
${CONSTRUCTING+___dtors_end = .;}
}
.jcr :
{
KEEP (*(.jcr))
}
.gcc_except_table : { *(.gcc_except_table) }
.got : { *(.got.plt) *(.got) }
.dynamic : { *(.dynamic) }
.tdata ${TDATA_START_ADDR} :
{
${RELOCATING+PROVIDE (__ep = .);}
*(.edata)
*(.edata23)
*(.tbyte)
*(.tcommon_byte)
*(.tdata)
*(.tdata*)
*(.ebss)
*(.ebss23)
*(.tbss)
*(.tbss*)
*(.tcommon)
}
/* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so
we can shorten the on-disk segment size. */
.sdata ${SDATA_START_ADDR} :
{
${RELOCATING+PROVIDE (__gp = . + 0x8000);}
*(.sdata)
*(.sdata23)
}
/* See comment about .rozdata. */
.rosdata ${ROSDATA_START_ADDR} :
{
*(.rosdata)
*(.sconst)
*(.sconst23)
}
/* We place the .sbss data section AFTER the .rosdata section, so that
it can directly preceed the .bss section. This allows runtime startup
code to initialise all the zero-data sections by simply taking the
value of '_edata' and zeroing until it reaches '_end'. */
.sbss :
{
${RELOCATING+__sbss_start = .;}
*(.sbss)
*(.sbss23)
*(.scommon)
}
${RELOCATING+_edata = DEFINED (__sbss_start) ? __sbss_start : . ;}
${RELOCATING+PROVIDE (edata = _edata);}
.bss :
{
${RELOCATING+__bss_start = DEFINED (__sbss_start) ? __sbss_start : . ;}
${RELOCATING+__real_bss_start = . ;}
*(.dynbss)
*(.bss)
*(COMMON)
}
${RELOCATING+_end = . ;}
${RELOCATING+PROVIDE (end = .);}
${RELOCATING+PROVIDE (_heap_start = .);}
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3 */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
/* DWARF Extension. */
.debug_macro 0 : { *(.debug_macro) }
/* User stack. */
.stack 0x200000 :
{
${RELOCATING+__stack = .;}
*(.stack)
}
}
EOF

View File

@ -1,3 +1,9 @@
2012-11-09 Nick Clifton <nickc@redhat.com>
* configure.in: Add bfd_v850_rh850_arch.
* configure: Regenerate.
* disassemble.c (disassembler): Likewise.
2012-11-09 H.J. Lu <hongjiu.lu@intel.com>
* aarch64-opc.h (gen_mask): Remove trailing redundant `;'.

1
opcodes/configure vendored
View File

@ -12581,6 +12581,7 @@ if test x${all_targets} = xfalse ; then
bfd_v850_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_v850e_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_v850ea_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_v850_rh850_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_vax_arch) ta="$ta vax-dis.lo" ;;
bfd_w65_arch) ta="$ta w65-dis.lo" ;;
bfd_we32k_arch) ;;

View File

@ -318,6 +318,7 @@ if test x${all_targets} = xfalse ; then
bfd_v850_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_v850e_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_v850ea_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_v850_rh850_arch) ta="$ta v850-opc.lo v850-dis.lo" ;;
bfd_vax_arch) ta="$ta vax-dis.lo" ;;
bfd_w65_arch) ta="$ta w65-dis.lo" ;;
bfd_we32k_arch) ;;

View File

@ -436,6 +436,7 @@ disassembler (abfd)
#endif
#ifdef ARCH_v850
case bfd_arch_v850:
case bfd_arch_v850_rh850:
disassemble = print_insn_v850;
break;
#endif