/* Visium-specific support for 32-bit ELF.

   Copyright (C) 2003-2015 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 */
	 3,			/* size (0 = byte, 1 = short, 2 = long) */
	 0,			/* bitsize */
	 FALSE,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont,	/* 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:
      if (r_type >= (unsigned int) R_VISIUM_max)
	{
	  _bfd_error_handler (_("%B: invalid Visium reloc number: %d"), abfd, r_type);
	  r_type = 0;
	}
      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"
