Index: bfd/Makefile.am
===================================================================
RCS file: /cvs/src/src/bfd/Makefile.am,v
retrieving revision 1.266
diff -u -3 -p -r1.266 Makefile.am
--- bfd/Makefile.am	13 Oct 2012 14:17:10 -0000	1.266
+++ bfd/Makefile.am	9 Nov 2012 08:31:16 -0000
@@ -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: bfd/archures.c
===================================================================
RCS file: /cvs/src/src/bfd/archures.c,v
retrieving revision 1.169
diff -u -3 -p -r1.169 archures.c
--- bfd/archures.c	13 Aug 2012 14:52:34 -0000	1.169
+++ bfd/archures.c	9 Nov 2012 08:31:16 -0000
@@ -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_tic8
 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_tilegx_arch,
     &bfd_tilepro_arch,
     &bfd_v850_arch,
+    &bfd_v850_rh850_arch,
     &bfd_vax_arch,
     &bfd_w65_arch,
     &bfd_we32k_arch,
Index: bfd/config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.297
diff -u -3 -p -r1.297 config.bfd
--- bfd/config.bfd	19 Sep 2012 20:10:43 -0000	1.297
+++ bfd/config.bfd	9 Nov 2012 08:31:16 -0000
@@ -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 ;;
@@ -1563,6 +1563,7 @@ case "${targ}" in
 
   v850*-*-*)
     targ_defvec=bfd_elf32_v850_vec
+    targ_selvecs="bfd_elf32_v850_rh850_vec"
     ;;
 
   vax-*-netbsdelf*)
Index: bfd/configure.in
===================================================================
RCS file: /cvs/src/src/bfd/configure.in,v
retrieving revision 1.323
diff -u -3 -p -r1.323 configure.in
--- bfd/configure.in	5 Nov 2012 10:45:29 -0000	1.323
+++ bfd/configure.in	9 Nov 2012 08:31:18 -0000
@@ -829,6 +829,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: bfd/cpu-v850.c
===================================================================
RCS file: /cvs/src/src/bfd/cpu-v850.c,v
retrieving revision 1.16
diff -u -3 -p -r1.16 cpu-v850.c
--- bfd/cpu-v850.c	31 Jan 2012 17:54:35 -0000	1.16
+++ bfd/cpu-v850.c	9 Nov 2012 08:31:18 -0000
@@ -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

Index: bfd/elf32-v850.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-v850.c,v
retrieving revision 1.83
diff -u -3 -p -r1.83 elf32-v850.c
--- bfd/elf32-v850.c	7 May 2012 03:27:51 -0000	1.83
+++ bfd/elf32-v850.c	9 Nov 2012 08:31:18 -0000
@@ -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 ATTRIBU
 }
 /* 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 v
   { 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_howt
   /* 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_howt
 
       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_howt
       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_howt
       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_howt
     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_howt
     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_howt
     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_howt
       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_b
   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_b
           || 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);
-      break;
-    case E_V850E2_ARCH:
-      bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e2);
+    case EM_V800:
+      arch = bfd_arch_v850_rh850;
+      mach = bfd_mach_v850e2v3;
       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 *ab
 {
   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 *ib
   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 *ib
 	  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 *ib
 	  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 *ab
   /* 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_sect
 #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_sect
 
 #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_sect
 
 #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"
Index: bfd/targets.c
===================================================================
RCS file: /cvs/src/src/bfd/targets.c,v
retrieving revision 1.219
diff -u -3 -p -r1.219 targets.c
--- bfd/targets.c	13 Sep 2012 22:24:49 -0000	1.219
+++ bfd/targets.c	9 Nov 2012 08:31:19 -0000
@@ -721,6 +721,7 @@ extern const bfd_target bfd_elf32_tradbi
 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;
@@ -1098,6 +1099,7 @@ static const bfd_target * const _bfd_tar
 	&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: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.585
diff -u -3 -p -r1.585 readelf.c
--- binutils/readelf.c	1 Nov 2012 14:57:22 -0000	1.585
+++ binutils/readelf.c	9 Nov 2012 08:31:19 -0000
@@ -634,6 +634,7 @@ guess_is_rela (unsigned int e_machine)
     case EM_TI_C6000:
     case EM_TILEGX:
     case EM_TILEPRO:
+    case EM_V800:
     case EM_V850:
     case EM_CYGNUS_V850:
     case EM_VAX:
@@ -1058,6 +1059,9 @@ dump_relocations (FILE * file,
 	  rtype = elf_spu_reloc_type (type);
 	  break;
 
+	case EM_V800:
+	  rtype = v800_reloc_type (type);
+	  break;
 	case EM_V850:
 	case EM_CYGNUS_V850:
 	  rtype = v850_reloc_type (type);
@@ -1885,7 +1889,6 @@ get_machine_name (unsigned e_machine)
     case EM_960:		return "Intel 90860";
     case EM_PPC:		return "PowerPC";
     case EM_PPC64:		return "PowerPC64";
-    case EM_V800:		return "NEC V800";
     case EM_FR20:		return "Fujitsu FR20";
     case EM_RH32:		return "TRW RH32";
     case EM_MCORE:		return "MCORE";
@@ -1910,6 +1913,7 @@ get_machine_name (unsigned e_machine)
     case EM_CYGNUS_M32R:
     case EM_M32R:		return "Renesas M32R (formerly Mitsubishi M32r)";
     case EM_CYGNUS_V850:
+    case EM_V800:		return "Renesas V850 (using RH850 ABI)";
     case EM_V850:		return "Renesas V850";
     case EM_CYGNUS_MN10300:
     case EM_MN10300:		return "mn10300";
@@ -2412,6 +2416,56 @@ get_machine_flags (unsigned e_flags, uns
 	    strcat (buf, _(", relocatable-lib"));
 	  break;
 
+	case EM_V800:
+	  if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
+	    strcat (buf, ", RH850 ABI");
+	    
+	  if (e_flags & EF_V800_850E3)
+	    strcat (buf, ", V3 architecture");
+
+	  if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
+	    strcat (buf, ", FPU not used");
+
+	  if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
+	    strcat (buf, ", regmode: COMMON");
+
+	  if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
+	    strcat (buf, ", r4 not used");
+
+	  if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
+	    strcat (buf, ", r30 not used");
+
+	  if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
+	    strcat (buf, ", r5 not used");
+
+	  if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
+	    strcat (buf, ", r2 not used");
+
+	  for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
+	    {
+	      switch (e_flags & - e_flags)
+		{
+		case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
+		case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
+		case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
+		case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
+		case EF_RH850_MMU: strcat (buf, ", MMU"); break;
+		case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
+		case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
+		case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
+		case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
+		case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
+		case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
+		case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
+		case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
+		case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
+		case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
+		case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
+		default: break;
+		}
+	    }
+	  break;
+
 	case EM_V850:
 	case EM_CYGNUS_V850:
 	  switch (e_flags & EF_V850_ARCH)
@@ -9998,6 +10054,8 @@ is_32bit_abs_reloc (unsigned int reloc_t
     case EM_CYGNUS_V850:
     case EM_V850:
       return reloc_type == 6; /* R_V850_ABS32.  */
+    case EM_V800:
+      return reloc_type == 0x33; /* R_V810_WORD.  */
     case EM_VAX:
       return reloc_type == 1; /* R_VAX_32.  */
     case EM_X86_64:
Index: gas/config/tc-v850.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-v850.c,v
retrieving revision 1.59
diff -u -3 -p -r1.59 tc-v850.c
--- gas/config/tc-v850.c	4 Oct 2012 10:30:04 -0000	1.59
+++ gas/config/tc-v850.c	9 Nov 2012 08:31:20 -0000
@@ -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_overflo
 /* 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
@@ -1391,7 +1401,7 @@ md_parse_option (int c, char *arg)
     }
   else if (strcmp (arg, "extension") == 0)
     {
-      processor_mask |= PROCESSOR_OPTION_EXTENSION | PROCESSOR_OPTION_ALIAS;;
+      processor_mask |= PROCESSOR_OPTION_EXTENSION | PROCESSOR_OPTION_ALIAS;
     }
   else if (strcmp (arg, "no-bcond17") == 0)
     {
@@ -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
 	      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: gas/config/tc-v850.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-v850.h,v
retrieving revision 1.23
diff -u -3 -p -r1.23 tc-v850.h
--- gas/config/tc-v850.h	23 May 2011 09:29:00 -0000	1.23
+++ gas/config/tc-v850.h	9 Nov 2012 08:31:20 -0000
@@ -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)
 
Index: gas/doc/c-v850.texi
===================================================================
RCS file: /cvs/src/src/gas/doc/c-v850.texi,v
retrieving revision 1.10
diff -u -3 -p -r1.10 c-v850.texi
--- gas/doc/c-v850.texi	18 Jan 2011 13:37:39 -0000	1.10
+++ gas/doc/c-v850.texi	9 Nov 2012 08:31:21 -0000
@@ -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
 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: include/elf/v850.h
===================================================================
RCS file: /cvs/src/src/include/elf/v850.h,v
retrieving revision 1.16
diff -u -3 -p -r1.16 v850.h
--- include/elf/v850.h	23 Jul 2010 14:52:52 -0000	1.16
+++ include/elf/v850.h	9 Nov 2012 08:31:22 -0000
@@ -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: ld/Makefile.am
===================================================================
RCS file: /cvs/src/src/ld/Makefile.am,v
retrieving revision 1.316
diff -u -3 -p -r1.316 Makefile.am
--- ld/Makefile.am	13 Aug 2012 14:52:50 -0000	1.316
+++ ld/Makefile.am	9 Nov 2012 08:31:22 -0000
@@ -452,6 +452,7 @@ ALL_EMULATION_SOURCES = \
 	etic54xcoff.c \
 	etic80coff.c \
 	ev850.c \
+	ev850_rh850.c \
 	evanilla.c \
 	evax.c \
 	evaxnbsd.c \
@@ -1917,6 +1918,9 @@ etic80coff.c: $(srcdir)/emulparams/tic80
 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: ld/configure.tgt
===================================================================
RCS file: /cvs/src/src/ld/configure.tgt,v
retrieving revision 1.270
diff -u -3 -p -r1.270 configure.tgt
--- ld/configure.tgt	29 Oct 2012 10:09:34 -0000	1.270
+++ ld/configure.tgt	9 Nov 2012 08:31:22 -0000
@@ -707,7 +707,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
Index: opcodes/configure.in
===================================================================
RCS file: /cvs/src/src/opcodes/configure.in,v
retrieving revision 1.113
diff -u -3 -p -r1.113 configure.in
--- opcodes/configure.in	5 Nov 2012 10:45:29 -0000	1.113
+++ opcodes/configure.in	9 Nov 2012 08:31:25 -0000
@@ -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: opcodes/disassemble.c
===================================================================
RCS file: /cvs/src/src/opcodes/disassemble.c,v
retrieving revision 1.87
diff -u -3 -p -r1.87 disassemble.c
--- opcodes/disassemble.c	13 Aug 2012 14:52:47 -0000	1.87
+++ opcodes/disassemble.c	9 Nov 2012 08:31:25 -0000
@@ -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

*** /dev/null	2012-11-09 07:34:00.424791882 +0000
--- bfd/cpu-v850_rh850.c	2012-11-06 12:46:02.252466348 +0000
***************
*** 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]);
*** /dev/null	2012-11-09 07:34:00.424791882 +0000
--- ld/scripttempl/v850_rh850.sc	2012-11-06 13:28:02.597960582 +0000
***************
*** 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
*** /dev/null	2012-11-09 07:34:00.424791882 +0000
--- ld/emulparams/v850_rh850.sh	2012-11-06 13:27:25.476922436 +0000
***************
*** 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
