Add Visium support to bfd
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 6 Dec 2014 15:35:18 +0000 (16:35 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 6 Dec 2014 15:35:18 +0000 (16:35 +0100)
bfd/
* config.bfd: Add Visium support.
* configure.ac: Likewise.
* configure: Regenerate.
* Makefile.am (ALL_MACHINES): Add cpu-visium.lo.
(ALL_MACHINES_CFILES): Add cpu-visium.c.
(BFD32_BACKENDS): Add elf32-visium.lo.
(BFD32_BACKENDS_CFILES): Add elf32-visium.c.
* Makefile.in: Regenerate.
* archures.c (DESCRIPTION): Add Visium support.
(bfd_visium_arch): Declare.
(bfd_archures_list): Add bfd_visium_arch.
* reloc.c: Add Visium relocations.
* targets.c (visium_elf32_vec): Declare.
(_bfd_target_vector): Add visium_elf32_vec.
* bfd-in2.h: Regenerate.
* libbfd.h: Likewise.
* cpu-visium.c: New file.
* elf32-visium.c: Likewise.
* po/SRC-POTFILES.in: Regenerate.
include/elf/
* common.h (EM_VISIUM): Define.
* visium.h: New file.

17 files changed:
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/archures.c
bfd/bfd-in2.h
bfd/config.bfd
bfd/configure
bfd/configure.ac
bfd/cpu-visium.c [new file with mode: 0644]
bfd/elf32-visium.c [new file with mode: 0644]
bfd/libbfd.h
bfd/po/SRC-POTFILES.in
bfd/reloc.c
bfd/targets.c
include/elf/ChangeLog
include/elf/common.h
include/elf/visium.h [new file with mode: 0644]

index d1c86da91d5a9168d10f563944e45b9908e72d5b..ea307516b9b27664a3fa1ec57ef800dab88924b3 100644 (file)
@@ -1,3 +1,25 @@
+2014-12-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config.bfd: Add Visium support.
+       * configure.ac: Likewise.
+       * configure: Regenerate.
+       * Makefile.am (ALL_MACHINES): Add cpu-visium.lo.
+       (ALL_MACHINES_CFILES): Add cpu-visium.c.
+       (BFD32_BACKENDS): Add elf32-visium.lo.
+       (BFD32_BACKENDS_CFILES): Add elf32-visium.c.
+       * Makefile.in: Regenerate.
+       * archures.c (DESCRIPTION): Add Visium support.
+       (bfd_visium_arch): Declare.
+       (bfd_archures_list): Add bfd_visium_arch.
+       * reloc.c: Add Visium relocations.
+       * targets.c (visium_elf32_vec): Declare.
+       (_bfd_target_vector): Add visium_elf32_vec.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Likewise.
+       * cpu-visium.c: New file.
+       * elf32-visium.c: Likewise.
+       * po/SRC-POTFILES.in: Regenerate.
+
 2014-12-05  Steve Ellcey  <sellcey@mips.com>
 
        * ecoff.c (_bfd_ecoff_slurp_symbol_table): Add cast.
index 6f64f0629732aea7b3f88e99771a9d4ede4b6c71..cea3794c30bf075b32d75783cb6edc16a62733ba 100644 (file)
@@ -159,6 +159,7 @@ ALL_MACHINES = \
        cpu-v850.lo \
        cpu-v850_rh850.lo \
        cpu-vax.lo \
+       cpu-visium.lo \
        cpu-w65.lo \
        cpu-we32k.lo \
        cpu-xc16x.lo \
@@ -243,6 +244,7 @@ ALL_MACHINES_CFILES = \
        cpu-v850.c \
        cpu-v850_rh850.c \
        cpu-vax.c \
+       cpu-visium.c \
        cpu-w65.c \
        cpu-we32k.c \
        cpu-xc16x.c \
@@ -364,6 +366,7 @@ BFD32_BACKENDS = \
        elf32-tilepro.lo \
        elf32-v850.lo \
        elf32-vax.lo \
+       elf32-visium.lo \
        elf32-xc16x.lo \
        elf32-xgate.lo \
        elf32-xstormy16.lo \
@@ -551,6 +554,7 @@ BFD32_BACKENDS_CFILES = \
        elf32-tilepro.c \
        elf32-v850.c \
        elf32-vax.c \
+       elf32-visium.c \
        elf32-xc16x.c \
        elf32-xgate.c \
        elf32-xstormy16.c \
index 2c385d57424b45863115b10a9e9a42916076886f..fbad166f89df4fb409ecce5b7e9561c2a42a2a7c 100644 (file)
@@ -460,6 +460,7 @@ ALL_MACHINES = \
        cpu-v850.lo \
        cpu-v850_rh850.lo \
        cpu-vax.lo \
+       cpu-visium.lo \
        cpu-w65.lo \
        cpu-we32k.lo \
        cpu-xc16x.lo \
@@ -544,6 +545,7 @@ ALL_MACHINES_CFILES = \
        cpu-v850.c \
        cpu-v850_rh850.c \
        cpu-vax.c \
+       cpu-visium.c \
        cpu-w65.c \
        cpu-we32k.c \
        cpu-xc16x.c \
@@ -666,6 +668,7 @@ BFD32_BACKENDS = \
        elf32-tilepro.lo \
        elf32-v850.lo \
        elf32-vax.lo \
+       elf32-visium.lo \
        elf32-xc16x.lo \
        elf32-xgate.lo \
        elf32-xstormy16.lo \
@@ -853,6 +856,7 @@ BFD32_BACKENDS_CFILES = \
        elf32-tilepro.c \
        elf32-v850.c \
        elf32-vax.c \
+       elf32-visium.c \
        elf32-xc16x.c \
        elf32-xgate.c \
        elf32-xstormy16.c \
@@ -1371,6 +1375,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-v850.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-v850_rh850.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-vax.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-visium.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-w65.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-we32k.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-xc16x.Plo@am__quote@
@@ -1456,6 +1461,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-tilepro.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-v850.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-vax.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-visium.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-xc16x.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-xgate.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-xstormy16.Plo@am__quote@
index 5e069b22c4cb843823b31e4bf68668bcef9269ca..067e65489afeebb414da73c47a184e40a1358624 100644 (file)
@@ -497,6 +497,8 @@ DESCRIPTION
 .#define bfd_mach_aarch64_ilp32        32
 .  bfd_arch_nios2,
 .#define bfd_mach_nios2        0
+.  bfd_arch_visium,    {* Visium *}
+.#define bfd_mach_visium       1
 .  bfd_arch_last
 .  };
 */
@@ -616,6 +618,7 @@ 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_visium_arch;
 extern const bfd_arch_info_type bfd_w65_arch;
 extern const bfd_arch_info_type bfd_we32k_arch;
 extern const bfd_arch_info_type bfd_xstormy16_arch;
@@ -702,6 +705,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
     &bfd_v850_arch,
     &bfd_v850_rh850_arch,
     &bfd_vax_arch,
+    &bfd_visium_arch,
     &bfd_w65_arch,
     &bfd_we32k_arch,
     &bfd_xstormy16_arch,
index ed7be291b87a6f07079ba6194b5c132a0c3eb93b..94546b4a5f85f5fd98b6305e060cb14b724d1816 100644 (file)
@@ -2284,6 +2284,8 @@ enum bfd_architecture
 #define bfd_mach_aarch64_ilp32 32
   bfd_arch_nios2,
 #define bfd_mach_nios2 0
+  bfd_arch_visium,     /* Visium */
+#define bfd_mach_visium        1
   bfd_arch_last
   };
 
@@ -6067,6 +6069,15 @@ assembler and not (currently) written to any object files.  */
 
 /* Adapteva EPIPHANY - 8 bit immediate for 16 bit mov instruction.  */
   BFD_RELOC_EPIPHANY_IMM8,
+
+/* Visium Relocations.  */
+  BFD_RELOC_VISIUM_HI16,
+  BFD_RELOC_VISIUM_LO16,
+  BFD_RELOC_VISIUM_IM16,
+  BFD_RELOC_VISIUM_REL16,
+  BFD_RELOC_VISIUM_HI16_PCREL,
+  BFD_RELOC_VISIUM_LO16_PCREL,
+  BFD_RELOC_VISIUM_IM16_PCREL,
   BFD_RELOC_UNUSED };
 
 typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
index 7bcb92afeed8830e995e9d1b7148c521c49daeb9..a9627f8760ecea8a029c42811d4b4244e3930e58 100644 (file)
@@ -127,6 +127,7 @@ spu*)            targ_archs=bfd_spu_arch ;;
 tilegx*)        targ_archs=bfd_tilegx_arch ;;
 tilepro*)       targ_archs=bfd_tilepro_arch ;;
 v850*)          targ_archs="bfd_v850_arch bfd_v850_rh850_arch" ;;
+visium*)        targ_archs=bfd_visium_arch ;;
 x86_64*)        targ_archs=bfd_i386_arch ;;
 xtensa*)        targ_archs=bfd_xtensa_arch ;;
 xgate)          targ_archs=bfd_xgate_arch ;;
@@ -1657,6 +1658,10 @@ case "${targ}" in
     targ_defvec=vax_elf32_vec
     ;;
 
+  visium-*-elf)
+    targ_defvec=visium_elf32_vec
+    ;;
   we32k-*-*)
     targ_defvec=we32k_coff_vec
     ;;
index 86f58e2d922c26baabc940d933211045e0b308ad..3bb0cf72384aebc844461830a5cb5b77a7107e95 100755 (executable)
@@ -15597,6 +15597,7 @@ do
     vax_aout_bsd_vec)           tb="$tb vaxbsd.lo aout32.lo" ;;
     vax_aout_nbsd_vec)          tb="$tb vaxnetbsd.lo aout32.lo" ;;
     vax_elf32_vec)              tb="$tb elf32-vax.lo elf32.lo $elf" ;;
+    visium_elf32_vec)           tb="$tb elf32-visium.lo elf32.lo $elf" ;;
     w65_coff_vec)               tb="$tb coff-w65.lo reloc16.lo" ;;
     we32k_coff_vec)             tb="$tb coff-we32k.lo" ;;
     x86_64_coff_vec)            tb="$tb coff-x86_64.lo cofflink.lo"; target_size=64 ;;
index ba98e3935e8f059ce066afa38ce519c149d922bf..f9607401d2799ba234714844e1201fef69e4075b 100644 (file)
@@ -998,6 +998,7 @@ do
     vax_aout_bsd_vec)           tb="$tb vaxbsd.lo aout32.lo" ;;
     vax_aout_nbsd_vec)          tb="$tb vaxnetbsd.lo aout32.lo" ;;
     vax_elf32_vec)              tb="$tb elf32-vax.lo elf32.lo $elf" ;;
+    visium_elf32_vec)           tb="$tb elf32-visium.lo elf32.lo $elf" ;;
     w65_coff_vec)               tb="$tb coff-w65.lo reloc16.lo" ;;
     we32k_coff_vec)             tb="$tb coff-we32k.lo" ;;
     x86_64_coff_vec)            tb="$tb coff-x86_64.lo cofflink.lo"; target_size=64 ;;
diff --git a/bfd/cpu-visium.c b/bfd/cpu-visium.c
new file mode 100644 (file)
index 0000000..011bc40
--- /dev/null
@@ -0,0 +1,41 @@
+/* BFD support for the Visium processor.
+
+   Copyright (C) 2003-2014 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"
+
+const bfd_arch_info_type bfd_visium_arch =
+{
+  32,                          /* bits per word */
+  32,                          /* bits per address */
+  8,                           /* bits per byte */
+  bfd_arch_visium,             /* architecture */
+  bfd_mach_visium,             /* machine */
+  "visium",                    /* architecture name */
+  "visium",                    /* printable name */
+  2,                           /* section align power */
+  TRUE,                                /* the default ? */
+  bfd_default_compatible,      /* architecture comparison fn */
+  bfd_default_scan,            /* string to architecture convert fn */
+  bfd_arch_default_fill,       /* default fill */
+  NULL                         /* next in list */
+};
diff --git a/bfd/elf32-visium.c b/bfd/elf32-visium.c
new file mode 100644 (file)
index 0000000..a77b677
--- /dev/null
@@ -0,0 +1,898 @@
+/* Visium-specific support for 32-bit ELF.
+
+   Copyright (C) 2003-2014 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 "sysdep.h"
+#include "libbfd.h"
+#include "elf-bfd.h"
+#include "elf/visium.h"
+
+static bfd_reloc_status_type visium_elf_howto_parity_reloc
+  (bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **);
+
+static reloc_howto_type visium_elf_howto_table[] = {
+  /* This reloc does nothing.  */
+  HOWTO (R_VISIUM_NONE,                /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_VISIUM_NONE",       /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  /* A 8 bit absolute relocation.  */
+  HOWTO (R_VISIUM_8,           /* type */
+        0,                     /* rightshift */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        8,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_VISIUM_8",          /* name */
+        FALSE,                 /* partial_inplace */
+        0x00,                  /* src_mask */
+        0xff,                  /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  /* A 16 bit absolute relocation.  */
+  HOWTO (R_VISIUM_16,          /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_VISIUM_16",         /* name */
+        FALSE,                 /* partial_inplace */
+        0x0000,                /* src_mask */
+        0xffff,                /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  /* A 32 bit absolute relocation.  */
+  HOWTO (R_VISIUM_32,          /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_VISIUM_32",         /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+
+  /* A 8 bit PC relative relocation.  */
+  HOWTO (R_VISIUM_8_PCREL,             /* type */
+        0,                     /* rightshift */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        8,                     /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_VISIUM_8_PCREL",    /* name */
+        FALSE,                 /* partial_inplace */
+        0x00,                  /* src_mask */
+        0xff,                  /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
+  /* A 16 bit PC relative relocation.  */
+  HOWTO (R_VISIUM_16_PCREL,    /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_VISIUM_16_PCREL",   /* name */
+        FALSE,                 /* partial inplace */
+        0x0000,                /* src_mask */
+        0xffff,                /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
+  /* A 32-bit PC relative relocation.  */
+  HOWTO (R_VISIUM_32_PCREL,    /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_VISIUM_32_PCREL",   /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0xffffffff,            /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
+  /* A 16-bit PC word relative offset, relative to start of instruction
+     and always in the second half of the instruction.  */
+  HOWTO (R_VISIUM_PC16,                /* type */
+        2,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_signed,      /* complain_on_overflow */
+        visium_elf_howto_parity_reloc, /* special_function */
+        "R_VISIUM_PC16",       /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0000ffff,            /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
+  /* The high 16 bits of symbol value.  */
+  HOWTO (R_VISIUM_HI16,                /* type */
+        16,                    /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        visium_elf_howto_parity_reloc, /* special_function */
+        "R_VISIUM_HI16",       /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0000ffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  /* The low 16 bits of symbol value.  */
+  HOWTO (R_VISIUM_LO16,                /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        visium_elf_howto_parity_reloc, /* special_function */
+        "R_VISIUM_LO16",       /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0000ffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  /* A 16 bit immediate value.  */
+  HOWTO (R_VISIUM_IM16,                /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_unsigned,    /* complain_on_overflow */
+        visium_elf_howto_parity_reloc, /* special_function */
+        "R_VISIUM_IM16",       /* name */
+        FALSE,                 /* partial_inplace */
+        0x0000000,             /* src_mask */
+        0x000ffff,             /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  /* The high 16 bits of symbol value, pc relative.  */
+  HOWTO (R_VISIUM_HI16_PCREL,  /* type */
+        16,                    /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        visium_elf_howto_parity_reloc, /* special_function */
+        "R_VISIUM_HI16_PCREL", /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0000ffff,            /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
+  /* The low 16 bits of symbol value, pc relative.  */
+  HOWTO (R_VISIUM_LO16_PCREL,  /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        visium_elf_howto_parity_reloc, /* special_function */
+        "R_VISIUM_LO16_PCREL", /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0000ffff,            /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
+  /* A 16 bit immediate value, pc relative.  */
+  HOWTO (R_VISIUM_IM16_PCREL,  /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        TRUE,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_unsigned,    /* complain_on_overflow */
+        visium_elf_howto_parity_reloc, /* special_function */
+        "R_VISIUM_IM16_PCREL", /* name */
+        FALSE,                 /* partial_inplace */
+        0x0000000,             /* src_mask */
+        0x000ffff,             /* dst_mask */
+        TRUE),                 /* pcrel_offset */
+
+};
+
+/* GNU extension to record C++ vtable hierarchy.  */
+static reloc_howto_type visium_elf_vtinherit_howto =
+  HOWTO (R_VISIUM_GNU_VTINHERIT,      /* type */
+        0,                        /* rightshift */
+        2,                        /* size (0 = byte, 1 = short, 2 = long) */
+        0,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_dont,   /* complain_on_overflow */
+        NULL,                     /* special_function */
+        "R_VISIUM_GNU_VTINHERIT", /* name */
+        FALSE,                    /* partial_inplace */
+        0,                        /* src_mask */
+        0,                        /* dst_mask */
+        FALSE);                   /* pcrel_offset */
+
+/* GNU extension to record C++ vtable member usage.  */
+static reloc_howto_type visium_elf_vtentry_howto =
+  HOWTO (R_VISIUM_GNU_VTENTRY,    /* type */
+        0,                        /* rightshift */
+        2,                        /* size (0 = byte, 1 = short, 2 = long) */
+        0,                        /* bitsize */
+        FALSE,                    /* pc_relative */
+        0,                        /* bitpos */
+        complain_overflow_dont,   /* complain_on_overflow */
+        NULL,                     /* special_function */
+        "R_VISIUM_GNU_VTENTRY",   /* name */
+        FALSE,                    /* partial_inplace */
+        0,                        /* src_mask */
+        0,                        /* dst_mask */
+        FALSE);                   /* pcrel_offset */
+
+/* Map BFD reloc types to VISIUM ELF reloc types.  */
+struct visium_reloc_map
+{
+  bfd_reloc_code_real_type bfd_reloc_val;
+  unsigned int visium_reloc_val;
+};
+
+static const struct visium_reloc_map visium_reloc_map[] = {
+  {BFD_RELOC_NONE,             R_VISIUM_NONE},
+  {BFD_RELOC_8,                R_VISIUM_8},
+  {BFD_RELOC_16,               R_VISIUM_16},
+  {BFD_RELOC_32,               R_VISIUM_32},
+  {BFD_RELOC_8_PCREL,          R_VISIUM_8_PCREL},
+  {BFD_RELOC_16_PCREL,         R_VISIUM_16_PCREL},
+  {BFD_RELOC_32_PCREL,         R_VISIUM_32_PCREL},
+  {BFD_RELOC_VISIUM_REL16,     R_VISIUM_PC16},
+  {BFD_RELOC_VISIUM_HI16,      R_VISIUM_HI16},
+  {BFD_RELOC_VISIUM_LO16,      R_VISIUM_LO16},
+  {BFD_RELOC_VISIUM_IM16,      R_VISIUM_IM16},
+  {BFD_RELOC_VISIUM_HI16_PCREL,        R_VISIUM_HI16_PCREL},
+  {BFD_RELOC_VISIUM_LO16_PCREL,        R_VISIUM_LO16_PCREL},
+  {BFD_RELOC_VISIUM_IM16_PCREL,        R_VISIUM_IM16_PCREL},
+  {BFD_RELOC_VTABLE_INHERIT,   R_VISIUM_GNU_VTINHERIT},
+  {BFD_RELOC_VTABLE_ENTRY,     R_VISIUM_GNU_VTENTRY},
+};
+
+/* Return the parity bit for INSN shifted to its final position.  */
+
+static bfd_vma
+visium_parity_bit (bfd_vma insn)
+{
+  bfd_vma p = 0;
+  int i;
+
+  for (i = 0; i < 31; i++)
+    {
+      p ^= (insn & 1);
+      insn >>= 1;
+    }
+
+  return p << 31;
+}
+
+/* This "special function" will only be used when the input and
+   output files have different formats ie. when generating S-records
+   directly using "--oformat srec". Otherwise we use
+   _bfd_final_link_relocate which uses a howto structure, but does
+   not use the special_function field.
+
+   It sets instruction parity to even.  This cannot be done by a howto.  */
+
+static bfd_reloc_status_type
+visium_elf_howto_parity_reloc (bfd * input_bfd, arelent *reloc_entry,
+                              asymbol *symbol, PTR data,
+                              asection *input_section, bfd *output_bfd,
+                              char **error_message ATTRIBUTE_UNUSED)
+{
+  bfd_reloc_status_type ret;
+  bfd_vma relocation;
+  bfd_byte *inplace_address;
+  bfd_vma insn;
+  const bfd_vma signmask = 0xffff8000;
+
+  /* This part is from bfd_elf_generic_reloc.
+     If we're relocating, and this an external symbol, we don't want
+     to change anything.  */
+  if (output_bfd != (bfd *) NULL && (symbol->flags & BSF_SECTION_SYM) == 0)
+    {
+      reloc_entry->address += input_section->output_offset;
+      return bfd_reloc_ok;
+    }
+
+  /* Now do the reloc in the usual way.  */
+
+  /* Sanity check the address (offset in section).  */
+  if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section))
+    return bfd_reloc_outofrange;
+
+  ret = bfd_reloc_ok;
+  if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
+    ret = bfd_reloc_undefined;
+
+  if (bfd_is_com_section (symbol->section) || output_bfd != (bfd *) NULL)
+    relocation = 0;
+  else
+    relocation = symbol->value;
+
+  /* Only do this for a final link.  */
+  if (output_bfd == (bfd *) NULL)
+    {
+      relocation += symbol->section->output_section->vma;
+      relocation += symbol->section->output_offset;
+    }
+
+  relocation += reloc_entry->addend;
+  inplace_address = (bfd_byte *) data + reloc_entry->address;
+  insn = bfd_get_32 (input_bfd, inplace_address);
+
+  if (reloc_entry->howto->pc_relative)
+    {
+      relocation -= input_section->output_section->vma
+       + input_section->output_offset;
+      relocation -= reloc_entry->address;
+    }
+
+  switch (reloc_entry->howto->type)
+    {
+    case R_VISIUM_PC16:
+      relocation >>= 2;
+      if (ret == bfd_reloc_ok && (relocation & signmask) != 0
+         && (relocation & signmask) != signmask)
+       ret = bfd_reloc_overflow;
+      relocation &= 0xffff;
+      break;
+    case R_VISIUM_HI16:
+    case R_VISIUM_HI16_PCREL:
+      relocation = (relocation >> 16) & 0xffff;
+      break;
+    case R_VISIUM_LO16:
+    case R_VISIUM_LO16_PCREL:
+      relocation &= 0xffff;
+      break;
+    case R_VISIUM_IM16:
+    case R_VISIUM_IM16_PCREL:
+      if (ret == bfd_reloc_ok && (relocation & 0xffff0000) != 0)
+       ret = bfd_reloc_overflow;
+      relocation &= 0xffff;
+      break;
+    }
+  insn = (insn & 0x7fff0000) | relocation;
+  insn |= visium_parity_bit (insn);
+  bfd_put_32 (input_bfd, insn, inplace_address);
+
+  if (output_bfd != (bfd *) NULL)
+    reloc_entry->address += input_section->output_offset;
+
+  return ret;
+}
+
+static reloc_howto_type *
+visium_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                         bfd_reloc_code_real_type code)
+{
+  /* Note that the visium_elf_howto_table is indexed by the R_
+     constants. Thus, the order that the howto records appear in the
+     table *must* match the order of the relocation types defined in
+     include/elf/visium.h.  */
+  switch (code)
+    {
+    case BFD_RELOC_NONE:
+      return &visium_elf_howto_table[(int) R_VISIUM_NONE];
+    case BFD_RELOC_8:
+      return &visium_elf_howto_table[(int) R_VISIUM_8];
+    case BFD_RELOC_16:
+      return &visium_elf_howto_table[(int) R_VISIUM_16];
+    case BFD_RELOC_32:
+      return &visium_elf_howto_table[(int) R_VISIUM_32];
+    case BFD_RELOC_8_PCREL:
+      return &visium_elf_howto_table[(int) R_VISIUM_8_PCREL];
+    case BFD_RELOC_16_PCREL:
+      return &visium_elf_howto_table[(int) R_VISIUM_16_PCREL];
+    case BFD_RELOC_32_PCREL:
+      return &visium_elf_howto_table[(int) R_VISIUM_32_PCREL];
+    case BFD_RELOC_VISIUM_REL16:
+      return &visium_elf_howto_table[(int) R_VISIUM_PC16];
+    case BFD_RELOC_VISIUM_HI16:
+      return &visium_elf_howto_table[(int) R_VISIUM_HI16];
+    case BFD_RELOC_VISIUM_LO16:
+      return &visium_elf_howto_table[(int) R_VISIUM_LO16];
+    case BFD_RELOC_VISIUM_IM16:
+      return &visium_elf_howto_table[(int) R_VISIUM_IM16];
+    case BFD_RELOC_VISIUM_HI16_PCREL:
+      return &visium_elf_howto_table[(int) R_VISIUM_HI16_PCREL];
+    case BFD_RELOC_VISIUM_LO16_PCREL:
+      return &visium_elf_howto_table[(int) R_VISIUM_LO16_PCREL];
+    case BFD_RELOC_VISIUM_IM16_PCREL:
+      return &visium_elf_howto_table[(int) R_VISIUM_IM16_PCREL];
+    case BFD_RELOC_VTABLE_INHERIT:
+      return &visium_elf_vtinherit_howto;
+    case BFD_RELOC_VTABLE_ENTRY:
+      return &visium_elf_vtentry_howto;
+    default:
+      return NULL;
+    }
+}
+
+static reloc_howto_type *
+visium_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < (sizeof (visium_elf_howto_table)
+           / sizeof (visium_elf_howto_table[0])); i++)
+    if (visium_elf_howto_table[i].name != NULL
+       && strcasecmp (visium_elf_howto_table[i].name, r_name) == 0)
+      return &visium_elf_howto_table[i];
+
+  if (strcasecmp (visium_elf_vtinherit_howto.name, r_name) == 0)
+    return &visium_elf_vtinherit_howto;
+  if (strcasecmp (visium_elf_vtentry_howto.name, r_name) == 0)
+    return &visium_elf_vtentry_howto;
+
+  return NULL;
+}
+
+/* Set the howto pointer for a VISIUM ELF reloc.  */
+
+static void
+visium_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
+                          Elf_Internal_Rela *dst)
+{
+  unsigned int r_type = ELF32_R_TYPE (dst->r_info);
+
+  switch (r_type)
+    {
+    case R_VISIUM_GNU_VTINHERIT:
+      cache_ptr->howto = &visium_elf_vtinherit_howto;
+      break;
+
+    case R_VISIUM_GNU_VTENTRY:
+      cache_ptr->howto = &visium_elf_vtentry_howto;
+      break;
+
+    default:
+      cache_ptr->howto = &visium_elf_howto_table[r_type];
+      break;
+    }
+}
+
+/* Look through the relocs for a section during the first phase.
+   Since we don't do .gots or .plts, we just need to consider the
+   virtual table relocs for gc.  */
+
+static bfd_boolean
+visium_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
+                        asection *sec, const Elf_Internal_Rela *relocs)
+{
+  Elf_Internal_Shdr *symtab_hdr;
+  struct elf_link_hash_entry **sym_hashes;
+  const Elf_Internal_Rela *rel;
+  const Elf_Internal_Rela *rel_end;
+
+  if (info->relocatable)
+    return TRUE;
+
+  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+  sym_hashes = elf_sym_hashes (abfd);
+
+  rel_end = relocs + sec->reloc_count;
+  for (rel = relocs; rel < rel_end; rel++)
+    {
+      struct elf_link_hash_entry *h;
+      unsigned long r_symndx;
+
+      r_symndx = ELF32_R_SYM (rel->r_info);
+      if (r_symndx < symtab_hdr->sh_info)
+       h = NULL;
+      else
+       {
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+       }
+
+      switch (ELF32_R_TYPE (rel->r_info))
+       {
+         /* This relocation describes the C++ object vtable hierarchy.
+            Reconstruct it for later use during GC.  */
+       case R_VISIUM_GNU_VTINHERIT:
+         if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+           return FALSE;
+         break;
+
+         /* This relocation describes which C++ vtable entries are actually
+            used.  Record for later use during GC.  */
+       case R_VISIUM_GNU_VTENTRY:
+         if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+           return FALSE;
+         break;
+       }
+    }
+
+  return TRUE;
+}
+
+/* Relocate a VISIUM ELF section.  */
+
+static bfd_boolean
+visium_elf_relocate_section (bfd *output_bfd,
+                            struct bfd_link_info *info, bfd *input_bfd,
+                            asection *input_section, bfd_byte *contents,
+                            Elf_Internal_Rela *relocs,
+                            Elf_Internal_Sym *local_syms,
+                            asection **local_sections)
+{
+  Elf_Internal_Shdr *symtab_hdr;
+  struct elf_link_hash_entry **sym_hashes;
+  Elf_Internal_Rela *rel;
+  Elf_Internal_Rela *relend;
+
+  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
+  sym_hashes = elf_sym_hashes (input_bfd);
+  relend = relocs + input_section->reloc_count;
+
+  for (rel = relocs; rel < relend; rel++)
+    {
+      reloc_howto_type *howto;
+      unsigned long r_symndx;
+      Elf_Internal_Sym *sym;
+      asection *sec;
+      struct elf_link_hash_entry *h;
+      bfd_vma relocation;
+      bfd_reloc_status_type r;
+      const char *name = NULL;
+      int r_type;
+      bfd_vma insn;
+
+      r_type = ELF32_R_TYPE (rel->r_info);
+
+      if (r_type == R_VISIUM_GNU_VTINHERIT || r_type == R_VISIUM_GNU_VTENTRY)
+       continue;
+
+      r_symndx = ELF32_R_SYM (rel->r_info);
+
+      howto = visium_elf_howto_table + ELF32_R_TYPE (rel->r_info);
+      h = NULL;
+      sym = NULL;
+      sec = NULL;
+
+      if (r_symndx < symtab_hdr->sh_info)
+       {
+         /* This is a local symbol.  */
+         sym = local_syms + r_symndx;
+         sec = local_sections[r_symndx];
+         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
+
+         name = bfd_elf_string_from_elf_section
+           (input_bfd, symtab_hdr->sh_link, sym->st_name);
+         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+       }
+      else
+       {
+         bfd_boolean unresolved_reloc;
+         bfd_boolean warned, ignored;
+
+         RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
+                                  r_symndx, symtab_hdr, sym_hashes,
+                                  h, sec, relocation,
+                                  unresolved_reloc, warned, ignored);
+
+         name = h->root.root.string;
+       }
+
+      if (sec != NULL && discarded_section (sec))
+       {
+         /* For relocs against symbols from removed linkonce sections,
+            or sections discarded by a linker script, we just want the
+            section contents zeroed.  Avoid any special processing.  */
+         _bfd_clear_contents (howto, input_bfd, input_section,
+                              contents + rel->r_offset);
+
+         rel->r_info = 0;
+         rel->r_addend = 0;
+         continue;
+       }
+
+      if (info->relocatable)
+       continue;
+
+      switch (r_type)
+       {
+       case R_VISIUM_PC16:
+       case R_VISIUM_HI16:
+       case R_VISIUM_LO16:
+       case R_VISIUM_IM16:
+       case R_VISIUM_HI16_PCREL:
+       case R_VISIUM_LO16_PCREL:
+       case R_VISIUM_IM16_PCREL:
+         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
+                                       contents, rel->r_offset,
+                                       relocation, rel->r_addend);
+
+         /* For instruction relocations, the parity needs correcting.  */
+         if (r == bfd_reloc_ok)
+           {
+             insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
+             insn = (insn & 0x7fffffff) | visium_parity_bit (insn);
+             bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
+           }
+         break;
+
+       default:
+         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
+                                       contents, rel->r_offset,
+                                       relocation, rel->r_addend);
+         break;
+       }
+
+      if (r != bfd_reloc_ok)
+       {
+         const char *msg = (const char *) NULL;
+
+         switch (r)
+           {
+           case bfd_reloc_overflow:
+             r = info->callbacks->reloc_overflow
+               (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
+                input_bfd, input_section, rel->r_offset);
+             break;
+
+           case bfd_reloc_undefined:
+             r = info->callbacks->undefined_symbol
+               (info, name, input_bfd, input_section, rel->r_offset, TRUE);
+             break;
+
+           case bfd_reloc_outofrange:
+             msg = _("internal error: out of range error");
+             break;
+
+           case bfd_reloc_notsupported:
+             msg = _("internal error: unsupported relocation error");
+             break;
+
+           case bfd_reloc_dangerous:
+             msg = _("internal error: dangerous relocation");
+             break;
+
+           default:
+             msg = _("internal error: unknown error");
+             break;
+           }
+
+         if (msg)
+           r = info->callbacks->warning
+             (info, msg, name, input_bfd, input_section, rel->r_offset);
+
+         if (!r)
+           return FALSE;
+       }
+    }
+
+  return TRUE;
+}
+
+/* This function is called during section gc to discover the section a
+   to which a particular relocation refers.  Return the section that
+   should be marked against GC for a given relocation.  */
+
+static asection *
+visium_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
+                        Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
+                        Elf_Internal_Sym *sym)
+{
+  if (h != NULL)
+    switch (ELF32_R_TYPE (rel->r_info))
+      {
+      case R_VISIUM_GNU_VTINHERIT:
+      case R_VISIUM_GNU_VTENTRY:
+       return NULL;
+      }
+
+  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
+}
+
+static void
+visium_elf_post_process_headers (bfd *abfd,
+                                struct bfd_link_info *info ATTRIBUTE_UNUSED)
+{
+  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
+  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_STANDALONE;
+  i_ehdrp->e_ident[EI_ABIVERSION] = 1;
+}
+
+/* Function to set the ELF flag bits.  */
+
+static bfd_boolean
+visium_elf_set_private_flags (bfd *abfd, flagword flags)
+{
+  elf_elfheader (abfd)->e_flags = flags;
+  elf_flags_init (abfd) = TRUE;
+  return TRUE;
+}
+
+/* Copy backend specific data from one object module to another.  */
+
+static bfd_boolean
+visium_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
+{
+  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+    return TRUE;
+
+  BFD_ASSERT (!elf_flags_init (obfd)
+             || elf_elfheader (obfd)->e_flags ==
+             elf_elfheader (ibfd)->e_flags);
+
+  elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
+  elf_flags_init (obfd) = TRUE;
+
+  /* Copy object attributes.  */
+  _bfd_elf_copy_obj_attributes (ibfd, obfd);
+
+  return TRUE;
+}
+
+/* Merge backend specific data from an object
+   file to the output object file when linking.  */
+
+static bfd_boolean
+visium_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
+{
+  flagword old_flags;
+  flagword new_flags;
+  flagword mismatch;
+  const char *opt_arch = NULL;
+  const char *new_opt_with = NULL;
+  const char *old_opt_with = NULL;
+  const char *with = "with";
+  const char *without = "without";
+  const char *mcm = "mcm";
+  const char *mcm24 = "mcm24";
+  const char *gr6 = "gr6";
+
+  new_flags = elf_elfheader (ibfd)->e_flags;
+  old_flags = elf_elfheader (obfd)->e_flags;
+
+  if (!elf_flags_init (obfd))
+    {
+      /* First call, no flags set.  */
+      elf_flags_init (obfd) = TRUE;
+      elf_elfheader (obfd)->e_flags = new_flags;
+    }
+  else
+    {
+      mismatch = (new_flags ^ old_flags)
+       & (EF_VISIUM_ARCH_MCM | EF_VISIUM_ARCH_MCM24 | EF_VISIUM_ARCH_GR6);
+      if (mismatch & EF_VISIUM_ARCH_GR6)
+       {
+         opt_arch = gr6;
+         new_opt_with = new_flags & EF_VISIUM_ARCH_GR6 ? with : without;
+         old_opt_with = old_flags & EF_VISIUM_ARCH_GR6 ? with : without;
+       }
+      else if (mismatch & EF_VISIUM_ARCH_MCM)
+       {
+         opt_arch = mcm;
+         new_opt_with = new_flags & EF_VISIUM_ARCH_MCM ? with : without;
+         old_opt_with = old_flags & EF_VISIUM_ARCH_MCM ? with : without;
+       }
+      else if (mismatch & EF_VISIUM_ARCH_MCM24)
+       {
+         opt_arch = mcm24;
+         new_opt_with = new_flags & EF_VISIUM_ARCH_MCM24 ? with : without;
+         old_opt_with = old_flags & EF_VISIUM_ARCH_MCM24 ? with : without;
+       }
+
+      if (mismatch)
+       _bfd_error_handler
+         (_
+          ("%s: compiled %s -mtune=%s and linked with modules"
+           " compiled %s -mtune=%s"),
+          bfd_get_filename (ibfd), new_opt_with, opt_arch, old_opt_with,
+          opt_arch);
+    }
+
+  return TRUE;
+}
+
+static bfd_boolean
+visium_elf_print_private_bfd_data (bfd *abfd, void *ptr)
+{
+  FILE *file = (FILE *) ptr;
+  flagword flags;
+
+  BFD_ASSERT (abfd != NULL && ptr != NULL);
+
+  /* Print normal ELF private data.  */
+  _bfd_elf_print_private_bfd_data (abfd, ptr);
+
+  flags = elf_elfheader (abfd)->e_flags;
+  fprintf (file, _("private flags = 0x%lx:"), (long) flags);
+
+  if (flags & EF_VISIUM_ARCH_GR6)
+    fprintf (file, " -mtune=gr6");
+  else if (flags & EF_VISIUM_ARCH_MCM)
+    fprintf (file, " -mtune=mcm");
+  else if (flags & EF_VISIUM_ARCH_MCM24)
+    fprintf (file, " -mtune=mcm24");
+
+  fputc ('\n', file);
+  return TRUE;
+}
+
+#define ELF_ARCH               bfd_arch_visium
+#define ELF_MACHINE_CODE       EM_VISIUM
+#define ELF_MAXPAGESIZE                1
+
+#define TARGET_BIG_SYM         visium_elf32_vec
+#define TARGET_BIG_NAME                "elf32-visium"
+
+#define elf_info_to_howto_rel                  NULL
+#define elf_info_to_howto                      visium_info_to_howto_rela
+#define elf_backend_relocate_section           visium_elf_relocate_section
+#define elf_backend_gc_mark_hook               visium_elf_gc_mark_hook
+#define elf_backend_check_relocs               visium_elf_check_relocs
+#define elf_backend_rela_normal                        1
+
+#define elf_backend_can_gc_sections            1
+
+#define bfd_elf32_bfd_reloc_type_lookup                visium_reloc_type_lookup
+#define bfd_elf32_bfd_reloc_name_lookup                visium_reloc_name_lookup
+
+#define bfd_elf32_bfd_set_private_flags                visium_elf_set_private_flags
+#define bfd_elf32_bfd_copy_private_bfd_data    visium_elf_copy_private_bfd_data
+#define bfd_elf32_bfd_merge_private_bfd_data   visium_elf_merge_private_bfd_data
+#define bfd_elf32_bfd_print_private_bfd_data   visium_elf_print_private_bfd_data
+#define elf_backend_post_process_headers       visium_elf_post_process_headers
+
+#include "elf32-target.h"
index a1923c82fb7ffb177fc6a1df3738b41cb0fc6216..14ee8c64f3556b0c5ea1406cbaff5b0f99517ab0 100644 (file)
@@ -2955,6 +2955,13 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_EPIPHANY_SIMM11",
   "BFD_RELOC_EPIPHANY_IMM11",
   "BFD_RELOC_EPIPHANY_IMM8",
+  "BFD_RELOC_VISIUM_HI16",
+  "BFD_RELOC_VISIUM_LO16",
+  "BFD_RELOC_VISIUM_IM16",
+  "BFD_RELOC_VISIUM_REL16",
+  "BFD_RELOC_VISIUM_HI16_PCREL",
+  "BFD_RELOC_VISIUM_LO16_PCREL",
+  "BFD_RELOC_VISIUM_IM16_PCREL",
  "@@overflow: BFD_RELOC_UNUSED@@",
 };
 #endif
index 3e5cbd0b077b05c20f5ae144f89e7712ecd8bbf6..169412f6808f265ac01878563b358d5b1f8843be 100644 (file)
@@ -134,6 +134,7 @@ cpu-tilepro.c
 cpu-v850.c
 cpu-v850_rh850.c
 cpu-vax.c
+cpu-visium.c
 cpu-w65.c
 cpu-we32k.c
 cpu-xc16x.c
@@ -222,6 +223,7 @@ elf32-tilegx.c
 elf32-tilepro.c
 elf32-v850.c
 elf32-vax.c
+elf32-visium.c
 elf32-xc16x.c
 elf32-xgate.c
 elf32-xstormy16.c
index 89e46f39d393cc5ee431ba412eb7944ba1351470..d902a9b93b9a246cca9ff3cf5c2f2b6ff94bf2ff 100644 (file)
@@ -7301,6 +7301,7 @@ ENUMX
   BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD
 ENUMDOC
   Tilera TILE-Gx Relocations.
+
 ENUM
   BFD_RELOC_EPIPHANY_SIMM8
 ENUMDOC
@@ -7330,6 +7331,22 @@ ENUM
 ENUMDOC
   Adapteva EPIPHANY - 8 bit immediate for 16 bit mov instruction.
 
+ENUM
+  BFD_RELOC_VISIUM_HI16
+ENUMX
+  BFD_RELOC_VISIUM_LO16
+ENUMX
+  BFD_RELOC_VISIUM_IM16
+ENUMX
+  BFD_RELOC_VISIUM_REL16
+ENUMX
+  BFD_RELOC_VISIUM_HI16_PCREL
+ENUMX
+  BFD_RELOC_VISIUM_LO16_PCREL
+ENUMX
+  BFD_RELOC_VISIUM_IM16_PCREL
+ENUMDOC
+  Visium Relocations.
 
 ENDSENUM
   BFD_RELOC_UNUSED
index 6a282ea2e1247a16831d32482c19b061a3011423..71e59e010c3d27ffc1e1d2f6e652197dfe02bd87 100644 (file)
@@ -876,6 +876,7 @@ extern const bfd_target vax_aout_1knbsd_vec;
 extern const bfd_target vax_aout_bsd_vec;
 extern const bfd_target vax_aout_nbsd_vec;
 extern const bfd_target vax_elf32_vec;
+extern const bfd_target visium_elf32_vec;
 extern const bfd_target w65_coff_vec;
 extern const bfd_target we32k_coff_vec;
 extern const bfd_target x86_64_coff_vec;
@@ -1385,6 +1386,8 @@ static const bfd_target * const _bfd_target_vector[] =
        &vax_aout_nbsd_vec,
        &vax_elf32_vec,
 
+       &visium_elf32_vec,
+
        &w65_coff_vec,
 
        &we32k_coff_vec,
index aaee35d8382887af17ce458e14825f1f86b912a7..f4f71077c0f46ba7ce14ec541756a4efe0fca0e9 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * common.h (EM_VISIUM): Define.
+       * visium.h: New file.
+
 2014-11-13  H.J. Lu  <hongjiu.lu@intel.com>
 
        * x86-64.h (R_X86_64_GOTPLT64): Mark it obsolete.
index e8ae3ac2e97c0053255765195b782584dabf75b4..1d68f80cdc6986a7a126048ed99620cc94530662 100644 (file)
 #define EM_INTEL207    207     /* Reserved by Intel */
 #define EM_INTEL208    208     /* Reserved by Intel */
 #define EM_INTEL209    209     /* Reserved by Intel */
+#define EM_VISIUM      221     /* Controls and Data Services VISIUMcore processor */
 
 /* If it is necessary to assign new unofficial EM_* values, please pick large
    random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision
diff --git a/include/elf/visium.h b/include/elf/visium.h
new file mode 100644 (file)
index 0000000..8de57a6
--- /dev/null
@@ -0,0 +1,51 @@
+/* Visium ELF support for BFD.
+
+   Copyright (C) 2002-2014 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.  */
+
+#ifndef _ELF_VISIUM_H
+#define _ELF_VISIUM_H
+
+#include "elf/reloc-macros.h"
+
+/* Processor specific flags for the ELF header e_flags field.  */
+#define EF_VISIUM_ARCH_MCM   0x01
+#define EF_VISIUM_ARCH_MCM24 0x02
+#define EF_VISIUM_ARCH_GR6   0x04
+
+/* Relocations.  */
+START_RELOC_NUMBERS (elf_visium_reloc_type)
+  RELOC_NUMBER (R_VISIUM_NONE, 0)
+  RELOC_NUMBER (R_VISIUM_8, 1)
+  RELOC_NUMBER (R_VISIUM_16, 2)
+  RELOC_NUMBER (R_VISIUM_32, 3)
+  RELOC_NUMBER (R_VISIUM_8_PCREL, 4)
+  RELOC_NUMBER (R_VISIUM_16_PCREL, 5)
+  RELOC_NUMBER (R_VISIUM_32_PCREL, 6)
+  RELOC_NUMBER (R_VISIUM_PC16, 7)
+  RELOC_NUMBER (R_VISIUM_HI16, 8)
+  RELOC_NUMBER (R_VISIUM_LO16, 9)
+  RELOC_NUMBER (R_VISIUM_IM16, 10)
+  RELOC_NUMBER (R_VISIUM_HI16_PCREL, 11)
+  RELOC_NUMBER (R_VISIUM_LO16_PCREL, 12)
+  RELOC_NUMBER (R_VISIUM_IM16_PCREL, 13)
+  RELOC_NUMBER (R_VISIUM_GNU_VTINHERIT, 200)
+  RELOC_NUMBER (R_VISIUM_GNU_VTENTRY, 201)
+END_RELOC_NUMBERS(R_VISIUM_max)
+
+#endif /* _ELF_VISIUM_H */