2012-11-09 Nick Clifton <nickc@redhat.com>
authorNick Clifton <nickc@redhat.com>
Fri, 9 Nov 2012 17:36:19 +0000 (17:36 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 9 Nov 2012 17:36:19 +0000 (17:36 +0000)
* 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.

29 files changed:
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/archures.c
bfd/bfd-in2.h
bfd/config.bfd
bfd/configure
bfd/configure.in
bfd/cpu-v850.c
bfd/cpu-v850_rh850.c [new file with mode: 0644]
bfd/elf32-v850.c
bfd/targets.c
binutils/ChangeLog
gas/ChangeLog
gas/config/tc-v850.c
gas/config/tc-v850.h
gas/doc/c-v850.texi
include/elf/ChangeLog
include/elf/v850.h
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/configure.tgt
ld/emulparams/v850_rh850.sh [new file with mode: 0644]
ld/scripttempl/v850_rh850.sc [new file with mode: 0644]
opcodes/ChangeLog
opcodes/configure
opcodes/configure.in
opcodes/disassemble.c

index 3a69d7e..e18411e 100644 (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.
index 2ac03e9..d86d899 100644 (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 \
index 66dd911..92d9d08 100644 (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@
index 3198436..c4cefbc 100644 (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,
index e94e3c8..bba8757 100644 (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'
index e59ab25..e9dcd42 100644 (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*)
index 7b073cc..141e76d 100755 (executable)
@@ -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" ;;
index 78f2744..fc17209 100644 (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" ;;
index d124220..bb6b542 100644 (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
diff --git a/bfd/cpu-v850_rh850.c b/bfd/cpu-v850_rh850.c
new file mode 100644 (file)
index 0000000..06abdc7
--- /dev/null
@@ -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]);
index 6cf275f..80e3acb 100644 (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)
+};
 \f
 /* 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;  
+}
+\f
+
+#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"
index 442cb8f..0ca6a1a 100644 (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,
index 0778cb0..81aca13 100644 (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>
 
index ce6c114..32998bb 100644 (file)
        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.
index 4c1428b..7053e93 100644 (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;
 \f
@@ -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:
index b666b21..2762770 100644 (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.
 #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)
 
index 1eb16d7..53fef5f 100644 (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
index e47ac9f..88e72c2 100644 (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.
index 2a0e03e..873825e 100644 (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 */
index 4da5193..afb0b99 100644 (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.
index f6f814f..bda68a8 100644 (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)"
index fb0c21e..660dbab 100644 (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)"
index 9f0025a..3504ee6 100644 (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
diff --git a/ld/emulparams/v850_rh850.sh b/ld/emulparams/v850_rh850.sh
new file mode 100644 (file)
index 0000000..4315d2b
--- /dev/null
@@ -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 (file)
index 0000000..5f79d34
--- /dev/null
@@ -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
index 9400f5c..466ae87 100644 (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 `;'.
index a8f6a87..cd8a371 100755 (executable)
@@ -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)         ;;
index 462d3be..7370d5f 100644 (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)         ;;
index c5887b0..b3ff6ff 100644 (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