aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2012-11-09 17:36:11 +0000
committerNick Clifton <nickc@redhat.com>2012-11-09 17:36:11 +0000
commit79f5ae397a764b301812c93498ac2a8b666deae8 (patch)
tree5e25a342915b8201fe787e6093c4380e483de1af
parent2f531e6be1e97d868ef473752be670bac26e966f (diff)
downloadbinutils-current-79f5ae397a764b301812c93498ac2a8b666deae8.tar.gz
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.
-rw-r--r--bfd/ChangeLog29
-rw-r--r--bfd/Makefile.am2
-rw-r--r--bfd/Makefile.in3
-rw-r--r--bfd/archures.c3
-rw-r--r--bfd/bfd-in2.h1
-rw-r--r--bfd/config.bfd3
-rwxr-xr-xbfd/configure1
-rw-r--r--bfd/configure.in1
-rw-r--r--bfd/cpu-v850.c4
-rw-r--r--bfd/cpu-v850_rh850.c39
-rw-r--r--bfd/elf32-v850.c512
-rw-r--r--bfd/targets.c2
-rw-r--r--binutils/ChangeLog5
-rw-r--r--gas/ChangeLog11
-rw-r--r--gas/config/tc-v850.c36
-rw-r--r--gas/config/tc-v850.h8
-rw-r--r--gas/doc/c-v850.texi23
-rw-r--r--include/elf/ChangeLog2
-rw-r--r--include/elf/v850.h132
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/Makefile.am4
-rw-r--r--ld/Makefile.in3
-rw-r--r--ld/configure.tgt3
-rw-r--r--ld/emulparams/v850_rh850.sh15
-rw-r--r--ld/scripttempl/v850_rh850.sc259
-rw-r--r--opcodes/ChangeLog6
-rwxr-xr-xopcodes/configure1
-rw-r--r--opcodes/configure.in1
-rw-r--r--opcodes/disassemble.c1
29 files changed, 1010 insertions, 107 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3a69d7ed3..e18411e50 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/Makefile.am b/bfd/Makefile.am
index 2ac03e957..d86d8997d 100644
--- a/bfd/Makefile.am
+++ b/bfd/Makefile.am
@@ -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 \
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index 66dd911db..92d9d0806 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -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@
diff --git a/bfd/archures.c b/bfd/archures.c
index 3198436af..c4cefbc81 100644
--- a/bfd/archures.c
+++ b/bfd/archures.c
@@ -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,
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index e94e3c849..bba8757c5 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -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'
diff --git a/bfd/config.bfd b/bfd/config.bfd
index e59ab2515..e9dcd42fe 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -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*)
diff --git a/bfd/configure b/bfd/configure
index 7b073cc1b..141e76d9a 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -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" ;;
diff --git a/bfd/configure.in b/bfd/configure.in
index 78f274439..fc1720998 100644
--- a/bfd/configure.in
+++ b/bfd/configure.in
@@ -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" ;;
diff --git a/bfd/cpu-v850.c b/bfd/cpu-v850.c
index d12422014..bb6b542c8 100644
--- a/bfd/cpu-v850.c
+++ b/bfd/cpu-v850.c
@@ -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
diff --git a/bfd/cpu-v850_rh850.c b/bfd/cpu-v850_rh850.c
new file mode 100644
index 000000000..06abdc7f2
--- /dev/null
+++ b/bfd/cpu-v850_rh850.c
@@ -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]);
diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c
index 6cf275f27..80e3acbaf 100644
--- a/bfd/elf32-v850.c
+++ b/bfd/elf32-v850.c
@@ -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)
{
- 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);
+ case EM_V800:
+ arch = bfd_arch_v850_rh850;
+ mach = bfd_mach_v850e2v3;
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);
+
+ 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:
+ 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))
{
+ case bfd_arch_v850_rh850:
+ val = EF_RH850_ABI;
+ elf_elfheader (abfd)->e_flags |= val;
+ break;
+
+ 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:
- 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;
+ break;
}
-
- elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
- elf_elfheader (abfd)->e_flags |= val;
}
/* 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"
diff --git a/bfd/targets.c b/bfd/targets.c
index 442cb8f5d..0ca6a1aa3 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -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,
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 0778cb0d2..81aca136f 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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>
diff --git a/gas/ChangeLog b/gas/ChangeLog
index ce6c11498..32998bb6c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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.
diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c
index 4c1428b9a..7053e9300 100644
--- a/gas/config/tc-v850.c
+++ b/gas/config/tc-v850.c
@@ -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:
diff --git a/gas/config/tc-v850.h b/gas/config/tc-v850.h
index b666b21d3..27627705d 100644
--- a/gas/config/tc-v850.h
+++ b/gas/config/tc-v850.h
@@ -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)
diff --git a/gas/doc/c-v850.texi b/gas/doc/c-v850.texi
index 1eb16d773..53fef5fd1 100644
--- a/gas/doc/c-v850.texi
+++ b/gas/doc/c-v850.texi
@@ -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
diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog
index e47ac9f34..88e72c26a 100644
--- a/include/elf/ChangeLog
+++ b/include/elf/ChangeLog
@@ -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.
diff --git a/include/elf/v850.h b/include/elf/v850.h
index 2a0e03ef8..873825e0f 100644
--- a/include/elf/v850.h
+++ b/include/elf/v850.h
@@ -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 */
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 4da5193d9..afb0b997f 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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.
diff --git a/ld/Makefile.am b/ld/Makefile.am
index f6f814fa0..bda68a803 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -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)"
diff --git a/ld/Makefile.in b/ld/Makefile.in
index fb0c21edc..660dbab1c 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -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)"
diff --git a/ld/configure.tgt b/ld/configure.tgt
index 9f0025a99..3504ee6dc 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -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
diff --git a/ld/emulparams/v850_rh850.sh b/ld/emulparams/v850_rh850.sh
new file mode 100644
index 000000000..4315d2b95
--- /dev/null
+++ b/ld/emulparams/v850_rh850.sh
@@ -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
diff --git a/ld/scripttempl/v850_rh850.sc b/ld/scripttempl/v850_rh850.sc
new file mode 100644
index 000000000..5f79d34ac
--- /dev/null
+++ b/ld/scripttempl/v850_rh850.sc
@@ -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
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 9400f5c5f..466ae87e7 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -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 `;'.
diff --git a/opcodes/configure b/opcodes/configure
index a8f6a87ca..cd8a371bd 100755
--- a/opcodes/configure
+++ b/opcodes/configure
@@ -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) ;;
diff --git a/opcodes/configure.in b/opcodes/configure.in
index 462d3be5f..7370d5f72 100644
--- a/opcodes/configure.in
+++ b/opcodes/configure.in
@@ -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) ;;
diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c
index c5887b050..b3ff6ff44 100644
--- a/opcodes/disassemble.c
+++ b/opcodes/disassemble.c
@@ -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