/* Or1k-specific support for 32-bit ELF.
   Copyright (C) 2001-2026 Free Software Foundation, Inc.
   Contributed for OR32 by Johan Rydberg, jrydberg@opencores.org

   PIC parts added by Stefan Kristiansson, stefan.kristiansson@saunalahti.fi,
   largely based on elf32-m32r.c and elf32-microblaze.c.

   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, see <http://www.gnu.org/licenses/>.  */

#include "sysdep.h"
#include "bfd.h"
#include "libbfd.h"
#include "elf-bfd.h"
#include "elf/or1k.h"
#include "libiberty.h"

#define N_ONES(X)	(((bfd_vma)2 << (X)) - 1)

#define PLT_ENTRY_SIZE 16
#define PLT_ENTRY_SIZE_LARGE (6*4)
#define PLT_MAX_INSN_COUNT 6

#define OR1K_MOVHI(D)		(0x18000000 | (D << 21))
#define OR1K_ADRP(D)		(0x08000000 | (D << 21))
#define OR1K_LWZ(D,A)		(0x84000000 | (D << 21) | (A << 16))
#define OR1K_ADD(D,A,B)		(0xE0000000 | (D << 21) | (A << 16) | (B << 11))
#define OR1K_ORI(D,A)		(0xA8000000 | (D << 21) | (A << 16))
#define OR1K_ORI0(D)		(0xA8000000 | (D << 21))
#define OR1K_JR(B)		(0x44000000 | (B << 11))
#define OR1K_NOP		0x15000000

#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"

static reloc_howto_type or1k_elf_howto_table[] =
{
  /* This reloc does nothing.  */
  HOWTO (R_OR1K_NONE,		/* type */
	 0,			/* rightshift */
	 0,			/* size */
	 0,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_NONE",		/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0,			/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_32,
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_unsigned, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_32",		/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_16,
	 0,			/* rightshift */
	 2,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_unsigned, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_16",		/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_8,
	 0,			/* rightshift */
	 1,			/* size */
	 8,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_unsigned, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_8",		/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xff,			/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_LO_16_IN_INSN, /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_LO_16_IN_INSN", /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x0000ffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_HI_16_IN_INSN, /* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_HI_16_IN_INSN", /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x0000ffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  /* A PC relative 26 bit relocation, right shifted by 2.  */
  HOWTO (R_OR1K_INSN_REL_26, /* type */
	 2,			/* rightshift */
	 4,			/* size */
	 26,			/* bitsize */
	 true,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_INSN_REL_26", /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x03ffffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  /* GNU extension to record C++ vtable hierarchy.  */
  HOWTO (R_OR1K_GNU_VTINHERIT, /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 0,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 NULL,			/* special_function */
	 "R_OR1K_GNU_VTINHERIT", /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0,			/* dst_mask */
	 false),		/* pcrel_offset */

  /* GNU extension to record C++ vtable member usage.  */
  HOWTO (R_OR1K_GNU_VTENTRY, /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 0,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
	 "R_OR1K_GNU_VTENTRY", /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0,			/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_32_PCREL,
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 true,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_32_PCREL",	/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xffffffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  HOWTO (R_OR1K_16_PCREL,
	 0,			/* rightshift */
	 2,			/* size */
	 16,			/* bitsize */
	 true,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_16_PCREL",	/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  HOWTO (R_OR1K_8_PCREL,
	 0,			/* rightshift */
	 1,			/* size */
	 8,			/* bitsize */
	 true,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_8_PCREL",	/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xff,			/* dst_mask */
	 true),			/* pcrel_offset */

   HOWTO (R_OR1K_GOTPC_HI16,	/* Type.  */
	 16,			/* Rightshift.  */
	 4,			/* Size.  */
	 16,			/* Bitsize.  */
	 true,			/* PC_relative.  */
	 0,			/* Bitpos.  */
	 complain_overflow_dont, /* Complain on overflow.  */
	 bfd_elf_generic_reloc, /* Special Function.  */
	 "R_OR1K_GOTPC_HI16",	/* Name.  */
	 false,		/* Partial Inplace.  */
	 0,			/* Source Mask.  */
	 0xffff,		/* Dest Mask.  */
	 true),			/* PC relative offset?  */

   HOWTO (R_OR1K_GOTPC_LO16,	/* Type.  */
	 0,			/* Rightshift.  */
	 4,			/* Size.  */
	 16,			/* Bitsize.  */
	 true,			/* PC_relative.  */
	 0,			/* Bitpos.  */
	 complain_overflow_dont, /* Complain on overflow.  */
	 bfd_elf_generic_reloc, /* Special Function.  */
	 "R_OR1K_GOTPC_LO16",	/* Name.  */
	 false,		/* Partial Inplace.  */
	 0,			/* Source Mask.  */
	 0xffff,		/* Dest Mask.  */
	 true),			/* PC relative offset?  */

  HOWTO (R_OR1K_GOT16,		/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOT16",	/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  /* A 26 bit PLT relocation.  Shifted by 2.  */
  HOWTO (R_OR1K_PLT26,		/* Type.  */
	 2,			/* Rightshift.  */
	 4,			/* Size.  */
	 26,			/* Bitsize.  */
	 true,			/* pc_relative.  */
	 0,			/* Bitpos.  */
	 complain_overflow_signed, /* Complain on overflow.  */
	 bfd_elf_generic_reloc, /* Special Function.  */
	 "R_OR1K_PLT26",	/* Name.  */
	 false,			/* Partial Inplace.  */
	 0,			/* Source Mask.  */
	 0x03ffffff,		/* Dest Mask.  */
	 true),			/* PC relative offset?  */

  HOWTO (R_OR1K_GOTOFF_HI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOTOFF_HI16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_GOTOFF_LO16,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOTOFF_LO16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_COPY,		/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_bitfield, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_COPY",		/* name */
	 false,			/* partial_inplace */
	 0xffffffff,		/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_GLOB_DAT,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_bitfield, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GLOB_DAT",	/* name */
	 false,			/* partial_inplace */
	 0xffffffff,		/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_JMP_SLOT,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_bitfield, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_JMP_SLOT",	/* name */
	 false,			/* partial_inplace */
	 0xffffffff,		/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_RELATIVE,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_bitfield, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_RELATIVE",	/* name */
	 false,			/* partial_inplace */
	 0xffffffff,		/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_GD_HI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_GD_HI16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_GD_LO16,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_GD_LO16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LDM_HI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LDM_HI16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LDM_LO16,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LDM_LO16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LDO_HI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LDO_HI16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LDO_LO16,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LDO_LO16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_IE_HI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_IE_HI16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_IE_LO16,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_IE_LO16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LE_HI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LE_HI16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LE_LO16,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LE_LO16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_TPOFF,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_bitfield, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_TPOFF",    /* name */
	 false,			/* partial_inplace */
	 0xffffffff,		/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_DTPOFF,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_bitfield, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_DTPOFF",   /* name */
	 false,			/* partial_inplace */
	 0xffffffff,		/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_DTPMOD,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 32,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_bitfield, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_DTPMOD",   /* name */
	 false,			/* partial_inplace */
	 0xffffffff,		/* src_mask */
	 0xffffffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_AHI16,		/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_AHI16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_GOTOFF_AHI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOTOFF_AHI16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_IE_AHI16,   /* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_IE_AHI16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LE_AHI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LE_AHI16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_SLO16,		/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_SLO16",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_GOTOFF_SLO16,	/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOTOFF_SLO16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LE_SLO16,   /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LE_SLO16", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  /* A page relative 21 bit relocation, right shifted by 13, aligned.
     Note that this is *page* relative, not pc relative.  The idea is
     similar, but normally the section alignment is not such that the
     assembler can infer a final value, which it attempts to do with
     pc-relative relocations to local symbols.  */
  HOWTO (R_OR1K_PCREL_PG21,    /* type */
	 13,			/* rightshift */
	 4,			/* size */
	 21,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_PCREL_PG21",   /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x001fffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  HOWTO (R_OR1K_GOT_PG21,       /* type */
	 13,			/* rightshift */
	 4,			/* size */
	 21,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOT_PG21",     /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x001fffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  HOWTO (R_OR1K_TLS_GD_PG21,    /* type */
	 13,			/* rightshift */
	 4,			/* size */
	 21,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_GD_PG21",  /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x001fffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LDM_PG21,   /* type */
	 13,			/* rightshift */
	 4,			/* size */
	 21,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_LDM_PG21", /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x001fffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  HOWTO (R_OR1K_TLS_IE_PG21,    /* type */
	 13,			/* rightshift */
	 4,			/* size */
	 21,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_IE_PG21",  /* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0x001fffff,		/* dst_mask */
	 true),			/* pcrel_offset */

  HOWTO (R_OR1K_LO13,		/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_LO13",		/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_GOT_LO13,       /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOT_LO13",     /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_GD_LO13,    /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_GD_LO13",  /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_LDM_LO13,   /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLD_LDM_LO13", /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_TLS_IE_LO13,    /* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_TLS_IE_LO13",  /* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  HOWTO (R_OR1K_SLO13,		/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_SLO13",	/* name */
	 false,			/* partial_inplace */
	 0x0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */

  /* A 26 bit PLT relocation, using ADRP.  Shifted by 2.  */
  HOWTO (R_OR1K_PLTA26,		/* Type.  */
	 2,			/* Rightshift.  */
	 4,			/* Size.  */
	 26,			/* Bitsize.  */
	 true,			/* pc_relative.  */
	 0,			/* Bitpos.  */
	 complain_overflow_signed, /* Complain on overflow.  */
	 bfd_elf_generic_reloc,	/* Special Function.  */
	 "R_OR1K_PLTA26",	/* Name.  */
	 false,			/* Partial Inplace.  */
	 0,			/* Source Mask.  */
	 0x03ffffff,		/* Dest Mask.  */
	 true),			/* PC relative offset?  */

  HOWTO (R_OR1K_GOT_AHI16,	/* type */
	 16,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_signed, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOT_AHI16",	/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false),		/* pcrel_offset */
};

/* A copy of the R_OR1K_GOT16 used in the presense of R_OR1K_GOT_AHI16
   relocations when we know we can ignore overflows.  */
static reloc_howto_type or1k_elf_got16_no_overflow_howto =
  HOWTO (R_OR1K_GOT16,		/* type */
	 0,			/* rightshift */
	 4,			/* size */
	 16,			/* bitsize */
	 false,			/* pc_relative */
	 0,			/* bitpos */
	 complain_overflow_dont, /* complain_on_overflow */
	 bfd_elf_generic_reloc, /* special_function */
	 "R_OR1K_GOT16",	/* name */
	 false,			/* partial_inplace */
	 0,			/* src_mask */
	 0xffff,		/* dst_mask */
	 false);		/* pcrel_offset */

/* Map BFD reloc types to Or1k ELF reloc types.  */

struct or1k_reloc_map
{
  bfd_reloc_code_real_type bfd_reloc_val;
  unsigned int or1k_reloc_val;
};

static const struct or1k_reloc_map or1k_reloc_map[] =
{
  { BFD_RELOC_NONE,		R_OR1K_NONE },
  { BFD_RELOC_32,		R_OR1K_32 },
  { BFD_RELOC_16,		R_OR1K_16 },
  { BFD_RELOC_8,		R_OR1K_8 },
  { BFD_RELOC_LO16,		R_OR1K_LO_16_IN_INSN },
  { BFD_RELOC_HI16,		R_OR1K_HI_16_IN_INSN },
  { BFD_RELOC_HI16_S,		R_OR1K_AHI16 },
  { BFD_RELOC_OR1K_REL_26,	R_OR1K_INSN_REL_26 },
  { BFD_RELOC_VTABLE_ENTRY,	R_OR1K_GNU_VTENTRY },
  { BFD_RELOC_VTABLE_INHERIT,	R_OR1K_GNU_VTINHERIT },
  { BFD_RELOC_32_PCREL,		R_OR1K_32_PCREL },
  { BFD_RELOC_16_PCREL,		R_OR1K_16_PCREL },
  { BFD_RELOC_8_PCREL,		R_OR1K_8_PCREL },
  { BFD_RELOC_LO16_GOTOFF,	R_OR1K_GOTOFF_LO16 },
  { BFD_RELOC_HI16_GOTOFF,	R_OR1K_GOTOFF_HI16 },
  { BFD_RELOC_HI16_S_GOTOFF,	R_OR1K_GOTOFF_AHI16 },
  { BFD_RELOC_OR1K_GOTPC_HI16,	R_OR1K_GOTPC_HI16 },
  { BFD_RELOC_OR1K_GOTPC_LO16,	R_OR1K_GOTPC_LO16 },
  { BFD_RELOC_OR1K_GOT16,	R_OR1K_GOT16 },
  { BFD_RELOC_OR1K_PLT26,	R_OR1K_PLT26 },
  { BFD_RELOC_GLOB_DAT,		R_OR1K_GLOB_DAT },
  { BFD_RELOC_COPY,		R_OR1K_COPY },
  { BFD_RELOC_JMP_SLOT,		R_OR1K_JMP_SLOT },
  { BFD_RELOC_RELATIVE,		R_OR1K_RELATIVE },
  { BFD_RELOC_OR1K_TLS_GD_HI16, R_OR1K_TLS_GD_HI16 },
  { BFD_RELOC_OR1K_TLS_GD_LO16, R_OR1K_TLS_GD_LO16 },
  { BFD_RELOC_OR1K_TLS_LDM_HI16,	R_OR1K_TLS_LDM_HI16 },
  { BFD_RELOC_OR1K_TLS_LDM_LO16,	R_OR1K_TLS_LDM_LO16 },
  { BFD_RELOC_OR1K_TLS_LDO_HI16,	R_OR1K_TLS_LDO_HI16 },
  { BFD_RELOC_OR1K_TLS_LDO_LO16,	R_OR1K_TLS_LDO_LO16 },
  { BFD_RELOC_OR1K_TLS_IE_HI16, R_OR1K_TLS_IE_HI16 },
  { BFD_RELOC_OR1K_TLS_IE_LO16, R_OR1K_TLS_IE_LO16 },
  { BFD_RELOC_OR1K_TLS_IE_AHI16, R_OR1K_TLS_IE_AHI16 },
  { BFD_RELOC_OR1K_TLS_LE_HI16, R_OR1K_TLS_LE_HI16 },
  { BFD_RELOC_OR1K_TLS_LE_LO16, R_OR1K_TLS_LE_LO16 },
  { BFD_RELOC_OR1K_TLS_LE_AHI16, R_OR1K_TLS_LE_AHI16 },
  { BFD_RELOC_OR1K_SLO16,	R_OR1K_SLO16 },
  { BFD_RELOC_OR1K_GOTOFF_SLO16, R_OR1K_GOTOFF_SLO16 },
  { BFD_RELOC_OR1K_TLS_LE_SLO16, R_OR1K_TLS_LE_SLO16 },
  { BFD_RELOC_OR1K_PCREL_PG21,	R_OR1K_PCREL_PG21 },
  { BFD_RELOC_OR1K_GOT_PG21,	R_OR1K_GOT_PG21 },
  { BFD_RELOC_OR1K_TLS_GD_PG21,	R_OR1K_TLS_GD_PG21 },
  { BFD_RELOC_OR1K_TLS_LDM_PG21, R_OR1K_TLS_LDM_PG21 },
  { BFD_RELOC_OR1K_TLS_IE_PG21,	R_OR1K_TLS_IE_PG21 },
  { BFD_RELOC_OR1K_LO13,	R_OR1K_LO13 },
  { BFD_RELOC_OR1K_GOT_LO13,	R_OR1K_GOT_LO13 },
  { BFD_RELOC_OR1K_TLS_GD_LO13,	R_OR1K_TLS_GD_LO13 },
  { BFD_RELOC_OR1K_TLS_LDM_LO13, R_OR1K_TLS_LDM_LO13 },
  { BFD_RELOC_OR1K_TLS_IE_LO13,	R_OR1K_TLS_IE_LO13 },
  { BFD_RELOC_OR1K_SLO13,	R_OR1K_SLO13 },
  { BFD_RELOC_OR1K_PLTA26,	R_OR1K_PLTA26 },
  { BFD_RELOC_OR1K_GOT_AHI16,	R_OR1K_GOT_AHI16 },
};

/* tls_type is a mask used to track how each symbol is accessed,
   it may be accessed via multiple types of TLS access methods.
   We track this for sizing (allocating got + relocation section space) and
   for how to process relocations.  */
#define TLS_UNKNOWN    0
#define TLS_NONE       1
#define TLS_GD	       2
#define TLS_LD	       4
#define TLS_IE	       8
#define TLS_LE	      16

/* The size of the TLS thread control block, used to offset LE access.  */
#define TCB_SIZE      16

/* ELF linker hash entry.  */
struct elf_or1k_link_hash_entry
{
  struct elf_link_hash_entry root;

  /* For calculating PLT size.  */
  bfd_vma plt_index;
  /* Track type of TLS access.  */
  unsigned char tls_type;
};

/* ELF object data.  */
struct elf_or1k_obj_tdata
{
  struct elf_obj_tdata root;

  /* tls_type for each local got entry.  */
  unsigned char *local_tls_type;
};

#define elf_or1k_tdata(abfd) \
  ((struct elf_or1k_obj_tdata *) (abfd)->tdata.any)

#define elf_or1k_local_tls_type(abfd) \
  (elf_or1k_tdata (abfd)->local_tls_type)

/* ELF linker hash table.  */
struct elf_or1k_link_hash_table
{
  struct elf_link_hash_table root;

  bfd_vma plt_count;
  bool saw_plta;
};

static size_t
elf_or1k_plt_entry_size (bfd_vma plt_index)
{
  bfd_vma plt_reloc;

  plt_reloc = plt_index * sizeof (Elf32_External_Rela);

  return (plt_reloc > 0xffff) ? PLT_ENTRY_SIZE_LARGE : PLT_ENTRY_SIZE;
}

/* Get the ELF linker hash table from a link_info structure.  */
#define or1k_elf_hash_table(p) \
  ((is_elf_hash_table ((p)->hash)					\
    && elf_hash_table_id (elf_hash_table (p)) == OR1K_ELF_DATA)		\
   ? (struct elf_or1k_link_hash_table *) (p)->hash : NULL)

static bool
elf_or1k_mkobject (bfd *abfd)
{
  return bfd_elf_allocate_object (abfd, sizeof (struct elf_or1k_obj_tdata));
}

/* Create an entry in an or1k ELF linker hash table.  */

static struct bfd_hash_entry *
or1k_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
			    struct bfd_hash_table *table,
			    const char *string)
{
  struct elf_or1k_link_hash_entry *ret =
    (struct elf_or1k_link_hash_entry *) entry;

  /* Allocate the structure if it has not already been allocated by a
     subclass.  */
  if (ret == NULL)
    ret = bfd_hash_allocate (table,
			     sizeof (struct elf_or1k_link_hash_entry));
  if (ret == NULL)
    return NULL;

  /* Call the allocation method of the superclass.  */
  ret = ((struct elf_or1k_link_hash_entry *)
	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
				     table, string));
  if (ret != NULL)
    {
      struct elf_or1k_link_hash_entry *eh;

      eh = (struct elf_or1k_link_hash_entry *) ret;
      eh->tls_type = TLS_UNKNOWN;
    }

  return (struct bfd_hash_entry *) ret;
}

/* Create an or1k ELF linker hash table.  */

static struct bfd_link_hash_table *
or1k_elf_link_hash_table_create (bfd *abfd)
{
  struct elf_or1k_link_hash_table *ret;
  size_t amt = sizeof (struct elf_or1k_link_hash_table);

  ret = bfd_zmalloc (amt);
  if (ret == NULL)
    return NULL;

  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
				      or1k_elf_link_hash_newfunc,
				      sizeof (struct elf_or1k_link_hash_entry)))
    {
      free (ret);
      return NULL;
    }

  return &ret->root.root;
}

static reloc_howto_type *
or1k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
			bfd_reloc_code_real_type bcode)
{
  unsigned int i;

  for (i = 0; i < ARRAY_SIZE (or1k_reloc_map); i++)
    if (or1k_reloc_map[i].bfd_reloc_val == bcode)
      {
	unsigned int ocode = or1k_reloc_map[i].or1k_reloc_val;
	if (ocode < (unsigned int) R_OR1K_max)
	  return &or1k_elf_howto_table[ocode];
	else
	  break;
      }

  return NULL;
}

static reloc_howto_type *
or1k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
			const char *r_name)
{
  unsigned int i;

  for (i = 0; i < R_OR1K_max; i++)
    if (or1k_elf_howto_table[i].name != NULL
	&& strcasecmp (or1k_elf_howto_table[i].name, r_name) == 0)
      return &or1k_elf_howto_table[i];

  return NULL;
}

/* Set the howto pointer for an Or1k ELF reloc.  */

static bool
or1k_info_to_howto_rela (bfd * abfd,
			 arelent * cache_ptr,
			 Elf_Internal_Rela * dst)
{
  unsigned int r_type;

  r_type = ELF32_R_TYPE (dst->r_info);
  if (r_type >= (unsigned int) R_OR1K_max)
    {
      /* xgettext:c-format */
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
			  abfd, r_type);
      bfd_set_error (bfd_error_bad_value);
      return false;
    }
  cache_ptr->howto = & or1k_elf_howto_table[r_type];
  return true;
}

/* Return the relocation value for @tpoff relocations..  */
static bfd_vma
tpoff (struct bfd_link_info *info, bfd_vma address, bool dynamic)
{
  struct elf_link_hash_table *htab = elf_hash_table (info);
  bfd_vma base;

  /* If tls_sec is NULL, we should have signalled an error already.  */
  if (htab->tls_sec == NULL)
    return 0;

  if (dynamic)
    return address - htab->tls_sec->vma;
  else
    {
      /* On or1k, the tp points to just after the tcb, if we have an alignment
	 greater than the tcb size we need to offset by the alignment difference.  */
      base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power)
	     - TCB_SIZE;

      /* The thread pointer on or1k stores the address after the TCB where
	 the data is, just compute the difference. No need to compensate
	 for the size of TCB.  */
      return address - htab->tls_sec->vma + base;
    }
}

/* If we have both IE and GD accesses to a symbol the IE relocations should be
   offset by 8 bytes because the got contains both GD and IE entries.  */
static bfd_vma
or1k_initial_exec_offset (reloc_howto_type *howto, unsigned char tls_type_mask)
{
   switch (howto->type)
     {
     case R_OR1K_TLS_IE_HI16:
     case R_OR1K_TLS_IE_LO16:
     case R_OR1K_TLS_IE_PG21:
     case R_OR1K_TLS_IE_LO13:
     case R_OR1K_TLS_IE_AHI16:
       return (tls_type_mask & TLS_GD) != 0 ? 8 : 0;
     default:
       return 0;
     }
}

/* Like _bfd_final_link_relocate, but handles non-contiguous fields.  */

static bfd_reloc_status_type
or1k_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
			  asection *input_section, bfd_byte *contents,
			  bfd_vma offset, bfd_vma value)
{
  bfd_reloc_status_type status = bfd_reloc_ok;
  int size = bfd_get_reloc_size (howto);
  bfd_vma x, place;

  /* Sanity check the address.  */
  if (offset + size > bfd_get_section_limit_octets (input_bfd, input_section))
    return bfd_reloc_outofrange;

  place = (input_section->output_section->vma
	   + input_section->output_offset
	   + (howto->pcrel_offset ? offset : 0));

  switch (howto->type)
    {
    case R_OR1K_AHI16:
    case R_OR1K_GOT_AHI16:
    case R_OR1K_GOTOFF_AHI16:
    case R_OR1K_TLS_IE_AHI16:
    case R_OR1K_TLS_LE_AHI16:
      /* Adjust the operand to match with a signed LO16.  */
      value += 0x8000;
      break;

    case R_OR1K_INSN_REL_26:
      value -= place;
      /* Diagnose mis-aligned branch targets.  */
      if (value & 3)
	status = bfd_reloc_dangerous;
      break;

    case R_OR1K_PCREL_PG21:
    case R_OR1K_GOT_PG21:
    case R_OR1K_TLS_GD_PG21:
    case R_OR1K_TLS_LDM_PG21:
    case R_OR1K_TLS_IE_PG21:
      value = (value & -8192) - (place & -8192);
      break;

    case R_OR1K_LO13:
    case R_OR1K_GOT_LO13:
    case R_OR1K_TLS_GD_LO13:
    case R_OR1K_TLS_LDM_LO13:
    case R_OR1K_TLS_IE_LO13:
    case R_OR1K_SLO13:
      value &= 8191;
      break;

    default:
      if (howto->pc_relative)
	value -= place;
      break;
    }

  status = bfd_check_overflow (howto->complain_on_overflow,
			       howto->bitsize,
			       howto->rightshift,
			       bfd_arch_bits_per_address (input_bfd),
			       value);
  value >>= howto->rightshift;

  /* If we're overwriting the entire destination,
     then no need to read the current contents.  */
  if (size == 0 || howto->dst_mask == N_ONES (size))
    x = 0;
  else
    {
      BFD_ASSERT (size == 4);
      x = bfd_get_32 (input_bfd, contents + offset);
    }

  switch (howto->type)
    {
    case R_OR1K_SLO16:
    case R_OR1K_GOTOFF_SLO16:
    case R_OR1K_TLS_LE_SLO16:
    case R_OR1K_SLO13:
      /* The split imm16 field used for stores.  */
      x = (x & ~0x3e007ff) | ((value & 0xf800) << 10) | (value & 0x7ff);
      break;

    default:
      {
	bfd_vma fieldmask = howto->dst_mask;
	value <<= howto->bitpos;
	x = (x & ~fieldmask) | (value & fieldmask);
      }
      break;
    }

  /* Put the relocated value back in the object file.  */
  switch (size)
    {
    case 0:
      break;
    case 1:
      bfd_put_8 (input_bfd, x, contents + offset);
      break;
    case 2:
      bfd_put_16 (input_bfd, x, contents + offset);
      break;
    case 4:
      bfd_put_32 (input_bfd, x, contents + offset);
      break;
#ifdef BFD64
    case 8:
      bfd_put_64 (input_bfd, x, contents + offset);
      break;
#endif
    default:
      _bfd_error_handler
	(_("%pB: Cannot handle relocation value size of %d"),
	 input_bfd, size);
      abort ();
    }
  return status;
}

/* Relocate an Or1k ELF section.

   The RELOCATE_SECTION function is called by the new ELF backend linker
   to handle the relocations for a section.

   The relocs are always passed as Rela structures; if the section
   actually uses Rel structures, the r_addend field will always be
   zero.

   This function is responsible for adjusting the section contents as
   necessary, and (if using Rela relocs and generating a relocatable
   output file) adjusting the reloc addend as necessary.

   This function does not have to worry about setting the reloc
   address or the reloc symbol index.

   LOCAL_SYMS is a pointer to the swapped in local symbols.

   LOCAL_SECTIONS is an array giving the section in the input file
   corresponding to the st_shndx field of each local symbol.

   The global hash table entry for the global symbols can be found
   via elf_sym_hashes (input_bfd).

   When generating relocatable output, this function must handle
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
   going to be the section symbol corresponding to the output
   section, which means that the addend must be adjusted
   accordingly.  */

static int
or1k_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;
  struct elf_or1k_link_hash_table *htab = or1k_elf_hash_table (info);
  asection *sreloc;
  bfd_vma *local_got_offsets;
  asection *sgot, *splt;
  bfd_vma plt_base, got_base, got_sym_value;
  bool ret_val = true;
  bool saw_gotha = false;

  if (htab == NULL)
    return false;

  local_got_offsets = elf_local_got_offsets (input_bfd);

  sreloc = elf_section_data (input_section)->sreloc;

  splt = htab->root.splt;
  plt_base = 0;
  if (splt != NULL)
    plt_base = splt->output_section->vma + splt->output_offset;

  sgot = htab->root.sgot;
  got_sym_value = got_base = 0;
  if (sgot != NULL)
    {
      struct elf_link_hash_entry *hgot = htab->root.hgot;
      got_sym_value = (hgot->root.u.def.value
		       + hgot->root.u.def.section->output_section->vma
		       + hgot->root.u.def.section->output_offset);
      got_base = sgot->output_section->vma + sgot->output_offset;
    }

  symtab_hdr = &elf_symtab_hdr (input_bfd);
  sym_hashes = elf_sym_hashes (input_bfd);
  relend = relocs + input_section->reloc_count;

  /* Make a full scan for R_OR1K_GOT_AHI16, since it could be AFTER R_OR1K_GOT16.  */
  for (rel = relocs; rel < relend; rel++)
    {
      int r_type = ELF32_R_TYPE (rel->r_info);
      if (r_type==R_OR1K_GOT_AHI16)
        {
	  saw_gotha = true;
	  break;
        }
    }

  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;

      r_type = ELF32_R_TYPE (rel->r_info);
      r_symndx = ELF32_R_SYM (rel->r_info);

      if (r_type == R_OR1K_GNU_VTINHERIT
	  || r_type == R_OR1K_GNU_VTENTRY)
	continue;

      if (r_type < 0 || r_type >= (int) R_OR1K_max)
	{
	  _bfd_error_handler
	    (_("%pB: unknown relocation type %d"),
	     input_bfd, (int) r_type);
	  bfd_set_error (bfd_error_bad_value);
	  ret_val = false;
	  continue;
	}

      howto = or1k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
      h = NULL;
      sym = NULL;
      sec = NULL;

      if (r_symndx < symtab_hdr->sh_info)
	{
	  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 (sec) : name;
	}
      else
	{
	  bool unresolved_reloc, 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))
	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
					 rel, 1, relend, R_OR1K_NONE,
					 howto, 0, contents);

      if (bfd_link_relocatable (info))
	continue;

      switch (howto->type)
	{
	case R_OR1K_PLT26:
	case R_OR1K_PLTA26:
	  /* If the call is not local, redirect the branch to the PLT.
	     Otherwise do nothing to send the branch to the symbol direct.  */
	  if (!SYMBOL_CALLS_LOCAL (info, h)
	      && h->plt.offset != (bfd_vma) -1)
	    relocation = plt_base + h->plt.offset;

	  /* Addend should be zero.  */
	  if (rel->r_addend != 0)
	    {
	      _bfd_error_handler
		(_("%pB: addend should be zero for plt relocations"),
		 input_bfd);
	      bfd_set_error (bfd_error_bad_value);
	      ret_val = false;
	    }
	  break;

	case R_OR1K_GOT_AHI16:
	case R_OR1K_GOT16:
	case R_OR1K_GOT_PG21:
	case R_OR1K_GOT_LO13:
	  {
	    bfd_vma off;

	    /* Relocation is to the entry for this symbol
	       in the global offset table.  */
	  BFD_ASSERT (sgot != NULL);
	  if (h != NULL)
	    {
	      bool dyn;

	      off = h->got.offset;
	      BFD_ASSERT (off != (bfd_vma) -1);

	      dyn = htab->root.dynamic_sections_created;
	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
						     bfd_link_pic (info),
						     h)
		  || (bfd_link_pic (info)
		      && SYMBOL_REFERENCES_LOCAL (info, h)))
		{
		    /* This is actually a static link, or it is a -Bsymbolic
		       link and the symbol is defined locally, or the symbol
		       was forced to be local because of a version file.
		       We must initialize this entry in the GOT.  Since the
		       offset must always be a multiple of 4, we use the least
		       significant bit to record whether we have initialized
		       it already.

		     When doing a dynamic link, we create a .rela.got
		     relocation entry to initialize the value.  This
		     is done in the finish_dynamic_symbol routine.  */
		  if ((off & 1) != 0)
		    off &= ~1;
		  else
		    {
		      /* Write entry in GOT.  */
		      bfd_put_32 (output_bfd, relocation,
				  sgot->contents + off);
		      /* Mark GOT entry as having been written.  */
		      h->got.offset |= 1;
		    }
		}
	    }
	  else
	    {
	      bfd_byte *loc;

	      BFD_ASSERT (local_got_offsets != NULL
			  && local_got_offsets[r_symndx] != (bfd_vma) -1);

	      /* Get offset into GOT table.  */
	      off = local_got_offsets[r_symndx];

	      /* The offset must always be a multiple of 4.  We use
		 the least significant bit to record whether we have
		 already processed this entry.  */
	      if ((off & 1) != 0)
		off &= ~1;
	      else
		{
		  /* Write entry in GOT.  */
		  bfd_put_32 (output_bfd, relocation, sgot->contents + off);
		  if (bfd_link_pic (info))
		    {
		      asection *srelgot;
		      Elf_Internal_Rela outrel;

		      /* We need to generate a R_OR1K_RELATIVE reloc
			 for the dynamic linker.  */
		      srelgot = htab->root.srelgot;
		      BFD_ASSERT (srelgot != NULL);

		      outrel.r_offset = got_base + off;
		      outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
		      outrel.r_addend = relocation;
		      loc = srelgot->contents;
		      loc += (srelgot->reloc_count
			      * sizeof (Elf32_External_Rela));
		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
		      ++srelgot->reloc_count;
		    }
		  local_got_offsets[r_symndx] |= 1;
		}
	    }

	    /* The GOT_PG21 and GOT_LO13 relocs are pc-relative,
	       while the GOT16 reloc is GOT relative.  */
	    relocation = got_base + off;
	    if (r_type == R_OR1K_GOT16
		|| r_type == R_OR1K_GOT_AHI16)
	      relocation -= got_sym_value;

	    /* If we have a R_OR1K_GOT16 following a R_OR1K_GOT_AHI16
	       relocation we assume the code is doing the right thing to avoid
	       overflows.  */
	    if (r_type == R_OR1K_GOT16 && saw_gotha)
	      howto = &or1k_elf_got16_no_overflow_howto;

	  /* Addend should be zero.  */
	  if (rel->r_addend != 0)
	    {
	      _bfd_error_handler
		(_("%pB: addend should be zero for got relocations"),
		 input_bfd);
	      bfd_set_error (bfd_error_bad_value);
	      ret_val = false;
	    }
	  }
	  break;

	case R_OR1K_GOTOFF_LO16:
	case R_OR1K_GOTOFF_HI16:
	case R_OR1K_GOTOFF_AHI16:
	case R_OR1K_GOTOFF_SLO16:
	  /* Relocation is offset from GOT.  */
	  BFD_ASSERT (sgot != NULL);
	  if (!SYMBOL_REFERENCES_LOCAL (info, h))
	    {
	      _bfd_error_handler
		(_("%pB: gotoff relocation against dynamic symbol %s"),
		 input_bfd, h->root.root.string);
	      ret_val = false;
	      bfd_set_error (bfd_error_bad_value);
	    }
	  relocation -= got_sym_value;
	  break;

	case R_OR1K_INSN_REL_26:
	  /* For a non-shared link, these will reference plt or call the
	     version of actual object.  */
	  if (bfd_link_pic (info) && !SYMBOL_CALLS_LOCAL (info, h))
	    {
	      _bfd_error_handler
		(_("%pB: pc-relative relocation against dynamic symbol %s"),
		 input_bfd, name);
	      ret_val = false;
	      bfd_set_error (bfd_error_bad_value);
	    }
	  break;

	case R_OR1K_PCREL_PG21:
	case R_OR1K_LO13:
	case R_OR1K_SLO13:
	  /* For a non-shared link, these will reference either the plt
	     or a .dynbss copy of the symbol.  */
	  if (bfd_link_pic (info) && !SYMBOL_REFERENCES_LOCAL (info, h))
	    {
	      _bfd_error_handler
		(_("%pB: pc-relative relocation against dynamic symbol %s"),
		 input_bfd, name);
	      ret_val = false;
	      bfd_set_error (bfd_error_bad_value);
	    }
	  break;

	case R_OR1K_HI_16_IN_INSN:
	case R_OR1K_LO_16_IN_INSN:
	case R_OR1K_AHI16:
	case R_OR1K_SLO16:
	  if (bfd_link_pic (info))
	    {
	      _bfd_error_handler
		(_("%pB: non-pic relocation against symbol %s"),
		 input_bfd, name);
	      ret_val = false;
	      bfd_set_error (bfd_error_bad_value);
	    }
	  break;

	case R_OR1K_32:
	  /* R_OR1K_16? */
	  {
	    /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols
	       from removed linkonce sections, or sections discarded by
	       a linker script.  */
	    if (r_symndx == STN_UNDEF
		|| (input_section->flags & SEC_ALLOC) == 0)
	      break;

	    /* Emit a direct relocation if the symbol is dynamic,
	       or a RELATIVE reloc for shared objects.  We can omit
	       RELATIVE relocs to local undefweak symbols.  */
	    if (bfd_link_pic (info)
		? (h == NULL
		     || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
		     || h->root.type != bfd_link_hash_undefweak)
		: (h != NULL
		    && h->dynindx != -1
		    && !h->non_got_ref
		   && ((h->def_dynamic && !h->def_regular)
			|| h->root.type == bfd_link_hash_undefweak
			|| h->root.type == bfd_link_hash_undefined)))
	      {
		Elf_Internal_Rela outrel;
		bfd_byte *loc;
		bool skip;

		/* When generating a shared object, these relocations
		   are copied into the output file to be resolved at run
		   time.  */

		BFD_ASSERT (sreloc != NULL);

		skip = false;

		outrel.r_offset =
		  _bfd_elf_section_offset (output_bfd, info, input_section,
					   rel->r_offset);
		if (outrel.r_offset == (bfd_vma) -1)
		  skip = true;
		else if (outrel.r_offset == (bfd_vma) -2)
		  skip = true;
		outrel.r_offset += (input_section->output_section->vma
				    + input_section->output_offset);

		if (skip)
		  memset (&outrel, 0, sizeof outrel);
		else if (SYMBOL_REFERENCES_LOCAL (info, h))
		  {
		    outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
		    outrel.r_addend = relocation + rel->r_addend;
		  }
		else
		  {
		    BFD_ASSERT (h->dynindx != -1);
		    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
		    outrel.r_addend = rel->r_addend;
		  }

		loc = sreloc->contents;
		loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
		bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
		break;
	      }
	    break;
	  }

	case R_OR1K_TLS_LDM_HI16:
	case R_OR1K_TLS_LDM_LO16:
	case R_OR1K_TLS_LDM_PG21:
	case R_OR1K_TLS_LDM_LO13:
	case R_OR1K_TLS_LDO_HI16:
	case R_OR1K_TLS_LDO_LO16:
	  /* TODO: implement support for local dynamic.  */
	  BFD_FAIL ();
	  _bfd_error_handler
	    (_("%pB: support for local dynamic not implemented"),
	     input_bfd);
	  bfd_set_error (bfd_error_bad_value);
	  return false;

	case R_OR1K_TLS_GD_HI16:
	case R_OR1K_TLS_GD_LO16:
	case R_OR1K_TLS_GD_PG21:
	case R_OR1K_TLS_GD_LO13:
	case R_OR1K_TLS_IE_HI16:
	case R_OR1K_TLS_IE_LO16:
	case R_OR1K_TLS_IE_PG21:
	case R_OR1K_TLS_IE_LO13:
	case R_OR1K_TLS_IE_AHI16:
	  {
	    bfd_vma gotoff;
	    Elf_Internal_Rela rela;
	    asection *srelgot;
	    bfd_byte *loc;
	    bool dynamic;
	    int indx = 0;
	    unsigned char tls_type;

	    srelgot = htab->root.srelgot;

	    /* Mark as TLS related GOT entry by setting
	       bit 2 to indcate TLS and bit 1 to indicate GOT.  */
	    if (h != NULL)
	      {
		gotoff = h->got.offset;
		tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
		h->got.offset |= 3;
	      }
	    else
	      {
		unsigned char *local_tls_type;

		gotoff = local_got_offsets[r_symndx];
		local_tls_type = (unsigned char *) elf_or1k_local_tls_type (input_bfd);
		tls_type = local_tls_type == NULL ? TLS_NONE
						  : local_tls_type[r_symndx];
		local_got_offsets[r_symndx] |= 3;
	      }

	    /* Only process the relocation once.  */
	    if ((gotoff & 1) != 0)
	      {
		gotoff += or1k_initial_exec_offset (howto, tls_type);

		/* The PG21 and LO13 relocs are pc-relative, while the
		   rest are GOT relative.  */
		relocation = got_base + (gotoff & ~3);
		if (!(r_type == R_OR1K_TLS_GD_PG21
		    || r_type == R_OR1K_TLS_GD_LO13
		    || r_type == R_OR1K_TLS_IE_PG21
		    || r_type == R_OR1K_TLS_IE_LO13))
		  relocation -= got_sym_value;
		break;
	      }

	    BFD_ASSERT (elf_hash_table (info)->hgot == NULL
			|| elf_hash_table (info)->hgot->root.u.def.value == 0);

	    if (h != NULL)
	      {
		bool dyn = htab->root.dynamic_sections_created;
		bool pic = bfd_link_pic (info);

		if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
		    && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
		  indx = h->dynindx;
	      }

	    /* Dynamic entries will require relocations.  If we do not need
	       them we will just use the default R_OR1K_NONE and
	       not set anything.  */
	    dynamic = (bfd_link_pic (info) || indx != 0)
		       && (h == NULL
			   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
			   || h->root.type != bfd_link_hash_undefweak);

	    /* Shared GD.  */
	    if (dynamic && ((tls_type & TLS_GD) != 0))
	      {
		int i;

		/* Add DTPMOD and DTPOFF GOT and rela entries.  */
		for (i = 0; i < 2; ++i)
		  {
		    BFD_ASSERT (srelgot->contents != NULL);

		    rela.r_offset = got_base + gotoff + i*4;
		    if (h != NULL && h->dynindx != -1)
		      {
			rela.r_info = ELF32_R_INFO (h->dynindx,
			    (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
			rela.r_addend = 0;
		      }
		    else
		      {
			rela.r_info = ELF32_R_INFO (0,
			    (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
			rela.r_addend =
			    (i == 0 ? 0 : tpoff (info, relocation, dynamic));
		      }

		    loc = srelgot->contents;
		    loc += (srelgot->reloc_count++
			    * sizeof (Elf32_External_Rela));

		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
		    bfd_put_32 (output_bfd, 0, sgot->contents + gotoff + i*4);
		  }
	      }
	    /* Static GD.  */
	    else if ((tls_type & TLS_GD) != 0)
	      {
		bfd_put_32 (output_bfd, 1, sgot->contents + gotoff);
		bfd_put_32 (output_bfd, tpoff (info, relocation, dynamic),
		    sgot->contents + gotoff + 4);
	      }

	    gotoff += or1k_initial_exec_offset (howto, tls_type);

	    /* Shared IE.  */
	    if (dynamic && ((tls_type & TLS_IE) != 0))
	      {
		BFD_ASSERT (srelgot->contents != NULL);

		/* Add TPOFF GOT and rela entries.  */
		rela.r_offset = got_base + gotoff;
		if (h != NULL && h->dynindx != -1)
		  {
		    rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_TLS_TPOFF);
		    rela.r_addend = 0;
		  }
		else
		  {
		    rela.r_info = ELF32_R_INFO (0, R_OR1K_TLS_TPOFF);
		    rela.r_addend = tpoff (info, relocation, dynamic);
		  }

		loc = srelgot->contents;
		loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);

		bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
		bfd_put_32 (output_bfd, 0, sgot->contents + gotoff);
	      }
	    /* Static IE.  */
	    else if ((tls_type & TLS_IE) != 0)
	      bfd_put_32 (output_bfd, tpoff (info, relocation, dynamic),
			  sgot->contents + gotoff);

	    /* The PG21 and LO13 relocs are pc-relative, while the
	       rest are GOT relative.  */
	    relocation = got_base + gotoff;
	    if (!(r_type == R_OR1K_TLS_GD_PG21
		  || r_type == R_OR1K_TLS_GD_LO13
		  || r_type == R_OR1K_TLS_IE_PG21
		  || r_type == R_OR1K_TLS_IE_LO13))
	      relocation -= got_sym_value;
	  }
	  break;

	case R_OR1K_TLS_LE_HI16:
	case R_OR1K_TLS_LE_LO16:
	case R_OR1K_TLS_LE_AHI16:
	case R_OR1K_TLS_LE_SLO16:
	  /* Relocation is offset from TP.  */
	  relocation = tpoff (info, relocation, 0);
	  break;

	case R_OR1K_TLS_DTPMOD:
	case R_OR1K_TLS_DTPOFF:
	case R_OR1K_TLS_TPOFF:
	  /* These are resolved dynamically on load and shouldn't
	     be used as linker input.  */
	  BFD_FAIL ();
	  _bfd_error_handler
	    (_("%pB: will not resolve runtime TLS relocation"),
	     input_bfd);
	  bfd_set_error (bfd_error_bad_value);
	  return false;

	default:
	  break;
	}

      r = or1k_final_link_relocate (howto, input_bfd, input_section, contents,
				    rel->r_offset, relocation + rel->r_addend);

      if (r != bfd_reloc_ok)
	{
	  const char *msg = NULL;

	  switch (r)
	    {
	    case bfd_reloc_overflow:
	      (*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:
	      (*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)
	    (*info->callbacks->warning) (info, msg, name, input_bfd,
					 input_section, rel->r_offset);
	}
    }

  return ret_val;
}

/* Return the section that should be marked against GC for a given
   relocation.  */

static asection *
or1k_elf_gc_mark_hook (asection *sec,
		       struct bfd_link_info *info,
		       struct elf_reloc_cookie *cookie,
		       struct elf_link_hash_entry *h,
		       unsigned int symndx)
{
  if (h != NULL)
    switch (ELF32_R_TYPE (cookie->rel->r_info))
      {
      case R_OR1K_GNU_VTINHERIT:
      case R_OR1K_GNU_VTENTRY:
	return NULL;
      }

  return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx);
}

/* Look through the relocs for a section during the first phase.  */

static bool
or1k_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;
  struct elf_or1k_link_hash_table *htab;
  bfd *dynobj;
  asection *sreloc = NULL;

  if (bfd_link_relocatable (info))
    return true;

  symtab_hdr = &elf_symtab_hdr (abfd);
  sym_hashes = elf_sym_hashes (abfd);

  htab = or1k_elf_hash_table (info);
  if (htab == NULL)
    return false;

  dynobj = htab->root.dynobj;

  rel_end = relocs + sec->reloc_count;
  for (rel = relocs; rel < rel_end; rel++)
    {
      struct elf_link_hash_entry *h;
      unsigned long r_symndx;
      unsigned char tls_type;
      int r_type;

      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;
	}

      r_type = ELF32_R_TYPE (rel->r_info);
      switch (r_type)
	{
	case R_OR1K_TLS_GD_HI16:
	case R_OR1K_TLS_GD_LO16:
	case R_OR1K_TLS_GD_PG21:
	case R_OR1K_TLS_GD_LO13:
	  tls_type = TLS_GD;
	  break;
	case R_OR1K_TLS_LDM_HI16:
	case R_OR1K_TLS_LDM_LO16:
	case R_OR1K_TLS_LDM_PG21:
	case R_OR1K_TLS_LDM_LO13:
	case R_OR1K_TLS_LDO_HI16:
	case R_OR1K_TLS_LDO_LO16:
	  tls_type = TLS_LD;
	  break;
	case R_OR1K_TLS_IE_HI16:
	case R_OR1K_TLS_IE_LO16:
	case R_OR1K_TLS_IE_PG21:
	case R_OR1K_TLS_IE_LO13:
	case R_OR1K_TLS_IE_AHI16:
	  tls_type = TLS_IE;
	  break;
	case R_OR1K_TLS_LE_HI16:
	case R_OR1K_TLS_LE_LO16:
	case R_OR1K_TLS_LE_AHI16:
	case R_OR1K_TLS_LE_SLO16:
	  tls_type = TLS_LE;
	  break;
	default:
	  tls_type = TLS_NONE;
	}

      /* Record TLS type.  */
      if (h != NULL)
	  ((struct elf_or1k_link_hash_entry *) h)->tls_type |= tls_type;
      else
	{
	  unsigned char *local_tls_type;

	  /* This is a TLS type record for a local symbol.  */
	  local_tls_type = (unsigned char *) elf_or1k_local_tls_type (abfd);
	  if (local_tls_type == NULL)
	    {
	      bfd_size_type size;

	      size = symtab_hdr->sh_info;
	      local_tls_type = bfd_zalloc (abfd, size);
	      if (local_tls_type == NULL)
		return false;
	      elf_or1k_local_tls_type (abfd) = local_tls_type;
	    }
	  local_tls_type[r_symndx] |= tls_type;
	}

      switch (r_type)
	{
	  /* This relocation describes the C++ object vtable hierarchy.
	     Reconstruct it for later use during GC.  */
	case R_OR1K_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_OR1K_GNU_VTENTRY:
	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
	    return false;
	  break;

	  /* This relocation requires .plt entry.  */
	case R_OR1K_PLTA26:
	  htab->saw_plta = true;
	  /* FALLTHRU */
	case R_OR1K_PLT26:
	  if (h != NULL)
	    {
	      h->needs_plt = 1;
	      h->plt.refcount += 1;
	    }
	  break;

	case R_OR1K_GOT_AHI16:
	case R_OR1K_GOT16:
	case R_OR1K_GOT_PG21:
	case R_OR1K_GOT_LO13:
	case R_OR1K_TLS_GD_HI16:
	case R_OR1K_TLS_GD_LO16:
	case R_OR1K_TLS_GD_PG21:
	case R_OR1K_TLS_GD_LO13:
	case R_OR1K_TLS_IE_HI16:
	case R_OR1K_TLS_IE_LO16:
	case R_OR1K_TLS_IE_PG21:
	case R_OR1K_TLS_IE_LO13:
	case R_OR1K_TLS_IE_AHI16:
	      if (h != NULL)
		h->got.refcount += 1;
	      else
		{
		  bfd_signed_vma *local_got_refcounts;

		  /* This is a global offset table entry for a local symbol.  */
		  local_got_refcounts = elf_local_got_refcounts (abfd);
		  if (local_got_refcounts == NULL)
		    {
		      bfd_size_type size;

		      size = symtab_hdr->sh_info;
		      size *= sizeof (bfd_signed_vma);
		      local_got_refcounts = bfd_zalloc (abfd, size);
		      if (local_got_refcounts == NULL)
			return false;
		      elf_local_got_refcounts (abfd) = local_got_refcounts;
		    }
		  local_got_refcounts[r_symndx] += 1;
		}
	  /* FALLTHRU */

	case R_OR1K_GOTOFF_HI16:
	case R_OR1K_GOTOFF_LO16:
	case R_OR1K_GOTOFF_AHI16:
	case R_OR1K_GOTOFF_SLO16:
	  if (htab->root.sgot == NULL)
	    {
	      if (dynobj == NULL)
		htab->root.dynobj = dynobj = abfd;
	      if (!_bfd_elf_create_got_section (dynobj, info))
		return false;
	    }
	  break;

	case R_OR1K_INSN_REL_26:
	case R_OR1K_HI_16_IN_INSN:
	case R_OR1K_LO_16_IN_INSN:
	case R_OR1K_AHI16:
	case R_OR1K_SLO16:
	case R_OR1K_32:
	case R_OR1K_PCREL_PG21:
	case R_OR1K_LO13:
	case R_OR1K_SLO13:
	  {
	    if (h != NULL && !bfd_link_pic (info))
	      {
		/* We may need a copy reloc.  */
		h->non_got_ref = 1;

		/* We may also need a .plt entry.  */
		h->plt.refcount += 1;
		if (r_type != R_OR1K_INSN_REL_26)
		  h->pointer_equality_needed = 1;
	      }

	    /* If we are creating a shared library, and this is a reloc
	       against a global symbol, or a non PC relative reloc
	       against a local symbol, then we need to copy the reloc
	       into the shared library.  However, if we are linking with
	       -Bsymbolic, we do not need to copy a reloc against a
	       global symbol which is defined in an object we are
	       including in the link (i.e., DEF_REGULAR is set).  At
	       this point we have not seen all the input files, so it is
	       possible that DEF_REGULAR is not set now but will be set
	       later (it is never cleared).  In case of a weak definition,
	       DEF_REGULAR may be cleared later by a strong definition in
	       a shared library.  We account for that possibility below by
	       storing information in the relocs_copied field of the hash
	       table entry.  A similar situation occurs when creating
	       shared libraries and symbol visibility changes render the
	       symbol local.

	       If on the other hand, we are creating an executable, we
	       may need to keep relocations for symbols satisfied by a
	       dynamic library if we manage to avoid copy relocs for the
	       symbol.  */

	    if ((bfd_link_pic (info)
		 && (sec->flags & SEC_ALLOC) != 0
		 && (r_type != R_OR1K_INSN_REL_26
		     || (h != NULL
			 && (!SYMBOLIC_BIND (info, h)
			     || h->root.type == bfd_link_hash_defweak
			     || !h->def_regular))))
		|| (!bfd_link_pic (info)
		    && (sec->flags & SEC_ALLOC) != 0
		    && h != NULL
		    && (h->root.type == bfd_link_hash_defweak
			|| !h->def_regular)))
	      {
		struct elf_dyn_relocs *sec_relocs;
		struct elf_dyn_relocs **head;

		/* When creating a shared object, we must copy these
		   relocs into the output file.  We create a reloc
		   section in dynobj and make room for the reloc.  */
		if (sreloc == NULL)
		  {
		    const char *name;
		    unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
		    unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;

		    name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
		    if (name == NULL)
		      return false;

		    if (!startswith (name, ".rela")
			|| strcmp (bfd_section_name (sec), name + 5) != 0)
		      {
			_bfd_error_handler
			  /* xgettext:c-format */
			  (_("%pB: bad relocation section name `%s\'"),
			   abfd, name);
		      }

		    if (htab->root.dynobj == NULL)
		      htab->root.dynobj = abfd;
		    dynobj = htab->root.dynobj;

		    sreloc = bfd_get_section_by_name (dynobj, name);
		    if (sreloc == NULL)
		      {
			sreloc = _bfd_elf_make_dynamic_reloc_section
			  (sec, dynobj, 2, abfd, /*rela?*/ true);

			if (sreloc == NULL)
			  return false;
		      }
		    elf_section_data (sec)->sreloc = sreloc;
		  }

		/* If this is a global symbol, we count the number of
		   relocations we need for this symbol.  */
		if (h != NULL)
		  head = &h->dyn_relocs;
		else
		  {
		    /* Track dynamic relocs needed for local syms too.
		       We really need local syms available to do this
		       easily.  Oh well.  */

		    asection *s;
		    Elf_Internal_Sym *isym;
		    void *vpp;

		    isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
						  abfd, r_symndx);
		    if (isym == NULL)
		      return false;

		    s = bfd_section_from_elf_index (abfd, isym->st_shndx);
		    if (s == NULL)
		      return false;

		    vpp = &elf_section_data (s)->local_dynrel;
		    head = (struct elf_dyn_relocs **) vpp;
		  }

		sec_relocs = *head;
		/* Allocate this sections dynamic reolcations structure if this
		   is a new section.  */
		if (sec_relocs == NULL || sec_relocs->sec != sec)
		  {
		    size_t amt = sizeof *sec_relocs;
		    sec_relocs = ((struct elf_dyn_relocs *)
				  bfd_alloc (htab->root.dynobj, amt));
		    if (sec_relocs == NULL)
		      return false;
		    sec_relocs->next = *head;
		    *head = sec_relocs;
		    sec_relocs->sec = sec;
		    sec_relocs->count = 0;
		    sec_relocs->pc_count = 0;
		  }

		sec_relocs->count += 1;
		if (r_type == R_OR1K_INSN_REL_26)
		  sec_relocs->pc_count += 1;
	      }
	  }
	  break;
	}
    }

  return true;
}

static void
or1k_write_plt_entry (bfd *output_bfd, bfd_byte *contents, unsigned insnj,
		      unsigned insns[], size_t insn_count)
{
  unsigned nodelay = elf_elfheader (output_bfd)->e_flags & EF_OR1K_NODELAY;
  unsigned output_insns[PLT_MAX_INSN_COUNT];

  /* Copy instructions into the output buffer.  */
  for (size_t i = 0; i < insn_count; i++)
    output_insns[i] = insns[i];

  /* Honor the no-delay-slot setting.  */
  if (insns[insn_count-1] == OR1K_NOP)
    {
      unsigned slot1, slot2;

      if (nodelay)
	slot1 = insns[insn_count-2], slot2 = insnj;
      else
	slot1 = insnj, slot2 = insns[insn_count-2];

      output_insns[insn_count-2] = slot1;
      output_insns[insn_count-1] = slot2;
      output_insns[insn_count]   = OR1K_NOP;
    }
  else
    {
      unsigned slot1, slot2;

      if (nodelay)
	slot1 = insns[insn_count-1], slot2 = insnj;
      else
	slot1 = insnj, slot2 = insns[insn_count-1];

      output_insns[insn_count-1] = slot1;
      output_insns[insn_count]   = slot2;
    }

  /* Write out the output buffer.  */
  for (size_t i = 0; i < (insn_count+1); i++)
    bfd_put_32 (output_bfd, output_insns[i], contents + (i*4));
}

/* Finish up the dynamic sections.  */

static bool
or1k_elf_finish_dynamic_sections (bfd *output_bfd,
				  struct bfd_link_info *info,
				  bfd_byte *buf ATTRIBUTE_UNUSED)
{
  bfd *dynobj;
  asection *sdyn, *sgot;
  struct elf_or1k_link_hash_table *htab;

  htab = or1k_elf_hash_table (info);
  if (htab == NULL)
    return false;

  dynobj = htab->root.dynobj;

  sgot = htab->root.sgotplt;
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");

  if (htab->root.dynamic_sections_created)
    {
      asection *splt;
      Elf32_External_Dyn *dyncon, *dynconend;

      BFD_ASSERT (sgot != NULL && sdyn != NULL);

      dyncon = (Elf32_External_Dyn *) sdyn->contents;
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);

      for (; dyncon < dynconend; dyncon++)
	{
	  Elf_Internal_Dyn dyn;
	  asection *s;

	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);

	  switch (dyn.d_tag)
	    {
	    default:
	      continue;

	    case DT_PLTGOT:
	      s = htab->root.sgotplt;
	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
	      break;

	    case DT_JMPREL:
	      s = htab->root.srelplt;
	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
	      break;

	    case DT_PLTRELSZ:
	      s = htab->root.srelplt;
	      dyn.d_un.d_val = s->size;
	      break;
	    }
	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
	}


      /* Fill in the first entry in the procedure linkage table.  */
      splt = htab->root.splt;
      if (splt && splt->size > 0)
	{
	  unsigned plt[PLT_MAX_INSN_COUNT];
	  size_t plt_insn_count = 3;
	  bfd_vma got_addr = sgot->output_section->vma + sgot->output_offset;

	  /* Note we force 16 byte alignment on the .got, so that
	     the movhi/adrp can be shared between the two loads.  */

	  if (htab->saw_plta)
	    {
	      bfd_vma pc = splt->output_section->vma + splt->output_offset;
	      unsigned pa = ((got_addr >> 13) - (pc >> 13)) & 0x1fffff;
	      unsigned po = got_addr & 0x1fff;
	      plt[0] = OR1K_ADRP(12) | pa;
	      plt[1] = OR1K_LWZ(15,12) | (po + 8);
	      plt[2] = OR1K_LWZ(12,12) | (po + 4);
	    }
	  else if (bfd_link_pic (info))
	    {
	      plt[0] = OR1K_LWZ(15, 16) | 8;	/* .got+8 */
	      plt[1] = OR1K_LWZ(12, 16) | 4;	/* .got+4 */
	      plt[2] = OR1K_NOP;
	    }
	  else
	    {
	      unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
	      unsigned lo = got_addr & 0xffff;
	      plt[0] = OR1K_MOVHI(12) | ha;
	      plt[1] = OR1K_LWZ(15,12) | (lo + 8);
	      plt[2] = OR1K_LWZ(12,12) | (lo + 4);
	    }

	  or1k_write_plt_entry (output_bfd, splt->contents, OR1K_JR(15),
				plt, plt_insn_count);

	  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
	}
    }

  /* Set the first entry in the global offset table to the address of
     the dynamic section.  */
  if (sgot && sgot->size > 0)
    {
      if (sdyn == NULL)
	bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
      else
	bfd_put_32 (output_bfd,
		    sdyn->output_section->vma + sdyn->output_offset,
		    sgot->contents);
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
    }

  if (htab->root.sgot && htab->root.sgot->size > 0)
    elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize = 4;

  return true;
}

/* Finish up dynamic symbol handling.  We set the contents of various
   dynamic sections here.  */

static bool
or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
				struct bfd_link_info *info,
				struct elf_link_hash_entry *h,
				Elf_Internal_Sym *sym)
{
  struct elf_or1k_link_hash_table *htab;
  bfd_byte *loc;

  htab = or1k_elf_hash_table (info);

  if (h->plt.offset != (bfd_vma) -1)
    {
      unsigned int plt[PLT_MAX_INSN_COUNT];
      size_t plt_insn_count = 3;
      asection *splt;
      asection *sgot;
      asection *srela;
      bfd_vma plt_base_addr;
      bfd_vma plt_addr;
      bfd_vma plt_index;
      bfd_vma plt_reloc;
      bfd_vma got_base_addr;
      bfd_vma got_offset;
      bfd_vma got_addr;
      Elf_Internal_Rela rela;
      bool large_plt_entry;

      /* This symbol has an entry in the procedure linkage table.  Set
	 it up.  */
      BFD_ASSERT (h->dynindx != -1);

      splt = htab->root.splt;
      sgot = htab->root.sgotplt;
      srela = htab->root.srelplt;
      BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);

      plt_base_addr = splt->output_section->vma + splt->output_offset;
      got_base_addr = sgot->output_section->vma + sgot->output_offset;

      /* Get the index in the procedure linkage table which
	 corresponds to this symbol.  This is the index of this symbol
	 in all the symbols for which we are making plt entries.  The
	 first entry in the procedure linkage table is reserved.  */
      plt_index = ((struct elf_or1k_link_hash_entry *) h)->plt_index;
      plt_addr = plt_base_addr + h->plt.offset;
      plt_reloc = plt_index * sizeof (Elf32_External_Rela);

      large_plt_entry = (elf_or1k_plt_entry_size (plt_index)
			 == PLT_ENTRY_SIZE_LARGE);

      /* Get the offset into the .got table of the entry that
	corresponds to this function.  Each .got entry is 4 bytes.
	The first three are reserved.  */
      got_offset = (plt_index + 3) * 4;
      got_addr = got_base_addr + got_offset;

      /* Fill in the entry in the procedure linkage table.  */
      if (htab->saw_plta)
	{
	  unsigned pa = ((got_addr >> 13) - (plt_addr >> 13)) & 0x1fffff;
	  unsigned po = (got_addr & 0x1fff);
	  plt[0] = OR1K_ADRP(12) | pa;
	  plt[1] = OR1K_LWZ(12,12) | po;
	  plt[2] = OR1K_ORI0(11) | plt_reloc;
	}
      else if (bfd_link_pic (info))
	{
	  if (large_plt_entry)
	    {
	      unsigned gotha = ((got_offset + 0x8000) >> 16) & 0xffff;
	      unsigned got = got_offset & 0xffff;
	      unsigned pltrelhi = (plt_reloc >> 16) & 0xffff;
	      unsigned pltrello = plt_reloc & 0xffff;

	      plt[0] = OR1K_MOVHI(12) | gotha;
	      plt[1] = OR1K_ADD(12,12,16);
	      plt[2] = OR1K_LWZ(12,12) | got;
	      plt[3] = OR1K_MOVHI(11) | pltrelhi;
	      plt[4] = OR1K_ORI(11,11) | pltrello;
	      plt_insn_count = 5;
	    }
	  else
	    {
	      plt[0] = OR1K_LWZ(12,16) | got_offset;
	      plt[1] = OR1K_ORI0(11) | plt_reloc;
	      plt[2] = OR1K_NOP;
	    }
	}
      else
	{
	  unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
	  unsigned lo = got_addr & 0xffff;
	  plt[0] = OR1K_MOVHI(12) | ha;
	  plt[1] = OR1K_LWZ(12,12) | lo;
	  plt[2] = OR1K_ORI0(11) | plt_reloc;
	}

      /* For large code model we fixup the non-PIC PLT relocation instructions
	 here.  */
      if (large_plt_entry && !bfd_link_pic (info))
	{
	  unsigned pltrelhi = (plt_reloc >> 16) & 0xffff;
	  unsigned pltrello = plt_reloc & 0xffff;

	  plt[2] = OR1K_MOVHI(11) | pltrelhi;
	  plt[3] = OR1K_ORI(11,11) | pltrello;
	  plt[4] = OR1K_NOP;
	  plt_insn_count = 5;
	}

      or1k_write_plt_entry (output_bfd, splt->contents + h->plt.offset,
			    OR1K_JR(12), plt, plt_insn_count);

      /* Fill in the entry in the global offset table.  We initialize it to
	 point to the top of the plt.  This is done to lazy lookup the actual
	 symbol as the first plt entry will be setup by libc to call the
	 runtime dynamic linker.  */
      bfd_put_32 (output_bfd, plt_base_addr, sgot->contents + got_offset);

      /* Fill in the entry in the .rela.plt section.  */
      rela.r_offset = got_addr;
      rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
      rela.r_addend = 0;
      loc = srela->contents;
      loc += plt_index * sizeof (Elf32_External_Rela);
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);

      if (!h->def_regular)
	{
	  /* Mark the symbol as undefined, rather than as defined in
	     the .plt section.  Leave the value alone.  */
	  sym->st_shndx = SHN_UNDEF;
	}
    }

  if (h->got.offset != (bfd_vma) -1
      && (h->got.offset & 2) == 0) /* Homemade TLS check.  */
    {
      asection *sgot;
      asection *srelgot;
      Elf_Internal_Rela rela;

      /* This symbol has an entry in the global offset table.  Set it
	 up.  */
      sgot = htab->root.sgot;
      srelgot = htab->root.srelgot;
      BFD_ASSERT (sgot != NULL && srelgot != NULL);

      rela.r_offset = (sgot->output_section->vma
		       + sgot->output_offset
		       + (h->got.offset &~ 1));

      /* If this is a -Bsymbolic link, and the symbol is defined
	 locally, we just want to emit a RELATIVE reloc.  Likewise if
	 the symbol was forced to be local because of a version file.
	 The entry in the global offset table will already have been
	 initialized in the relocate_section function.  */
      if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
	{
	  rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
	  rela.r_addend = (h->root.u.def.value
			   + h->root.u.def.section->output_section->vma
			   + h->root.u.def.section->output_offset);
	}
      else
	{
	  BFD_ASSERT ((h->got.offset & 1) == 0);
	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
	  rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
	  rela.r_addend = 0;
	}

      loc = srelgot->contents;
      loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
      ++srelgot->reloc_count;
    }

  if (h->needs_copy)
    {
      asection *s;
      Elf_Internal_Rela rela;

      /* This symbols needs a copy reloc.  Set it up.  */
      BFD_ASSERT (h->dynindx != -1
		  && (h->root.type == bfd_link_hash_defined
		      || h->root.type == bfd_link_hash_defweak));

      rela.r_offset = (h->root.u.def.value
		       + h->root.u.def.section->output_section->vma
		       + h->root.u.def.section->output_offset);
      rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
      rela.r_addend = 0;
      if (h->root.u.def.section == htab->root.sdynrelro)
	s = htab->root.sreldynrelro;
      else
	s = htab->root.srelbss;
      loc = s->contents + s->reloc_count * sizeof (Elf32_External_Rela);
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
      ++s->reloc_count;
    }

  /* Mark some specially defined symbols as absolute.  */
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
      || h == htab->root.hgot)
    sym->st_shndx = SHN_ABS;

  return true;
}

static enum elf_reloc_type_class
or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
			   const asection *rel_sec ATTRIBUTE_UNUSED,
			   const Elf_Internal_Rela *rela)
{
  switch ((int) ELF32_R_TYPE (rela->r_info))
    {
    case R_OR1K_RELATIVE:  return reloc_class_relative;
    case R_OR1K_JMP_SLOT:  return reloc_class_plt;
    case R_OR1K_COPY:	   return reloc_class_copy;
    default:		   return reloc_class_normal;
    }
}

/* Adjust a symbol defined by a dynamic object and referenced by a
   regular object.  The current definition is in some section of the
   dynamic object, but we're not including those sections.  We have to
   change the definition to something the rest of the link can
   understand.  */

static bool
or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
				struct elf_link_hash_entry *h)
{
  struct elf_or1k_link_hash_table *htab;
  bfd *dynobj;
  asection *s, *srel;

  dynobj = elf_hash_table (info)->dynobj;

  /* Make sure we know what is going on here.  */
  BFD_ASSERT (dynobj != NULL
	      && (h->needs_plt
		  || h->is_weakalias
		  || (h->def_dynamic
		      && h->ref_regular
		      && !h->def_regular)));

  /* If this is a function, put it in the procedure linkage table.  We
     will fill in the contents of the procedure linkage table later,
     when we know the address of the .got section.  */
  if (h->type == STT_FUNC
      || h->needs_plt)
    {
      if (h->plt.refcount <= 0
	  || (SYMBOL_CALLS_LOCAL (info, h)
	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
	      && h->root.type == bfd_link_hash_undefweak)))
	{
	  /* This case can occur if we saw a PLT reloc in an input
	     file, but the symbol was never referred to by a dynamic
	     object.  In such a case, we don't actually need to build
	     a procedure linkage table, and we can just do a PCREL
	     reloc instead.  */
	  h->plt.offset = (bfd_vma) -1;
	  h->needs_plt = 0;
	}

      return true;
    }
  else
    h->plt.offset = (bfd_vma) -1;

  /* If this is a weak symbol, and there is a real definition, the
     processor independent code will have arranged for us to see the
     real definition first, and we can just use the same value.  */
  if (h->is_weakalias)
    {
      struct elf_link_hash_entry *def = weakdef (h);
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
      h->root.u.def.section = def->root.u.def.section;
      h->root.u.def.value = def->root.u.def.value;
      return true;
    }

  /* This is a reference to a symbol defined by a dynamic object which
     is not a function.  */

  /* If we are creating a shared library, we must presume that the
     only references to the symbol are via the global offset table.
     For such cases we need not do anything here; the relocations will
     be handled correctly by relocate_section.  */
  if (bfd_link_pic (info))
    return true;

  /* If there are no references to this symbol that do not use the
     GOT, we don't need to generate a copy reloc.  */
  if (!h->non_got_ref)
    return true;

  /* If -z nocopyreloc was given, we won't generate them either.  */
  if (info->nocopyreloc)
    {
      h->non_got_ref = 0;
      return true;
    }

  /* If we don't find any dynamic relocs in read-only sections, then
     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
  if (!_bfd_elf_readonly_dynrelocs (h))
    {
      h->non_got_ref = 0;
      return true;
    }

  /* We must allocate the symbol in our .dynbss section, which will
     become part of the .bss section of the executable.  There will be
     an entry for this symbol in the .dynsym section.  The dynamic
     object will contain position independent code, so all references
     from the dynamic object to this symbol will go through the global
     offset table.  The dynamic linker will use the .dynsym entry to
     determine the address it must put in the global offset table, so
     both the dynamic object and the regular object will refer to the
     same memory location for the variable.  */

  htab = or1k_elf_hash_table (info);
  if (htab == NULL)
    return false;

  /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
     to copy the initial value out of the dynamic object and into the
     runtime process image.  We need to remember the offset into the
     .rela.bss section we are going to use.  */
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
    {
      s = htab->root.sdynrelro;
      srel = htab->root.sreldynrelro;
    }
  else
    {
      s = htab->root.sdynbss;
      srel = htab->root.srelbss;
    }
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
    {
      srel->size += sizeof (Elf32_External_Rela);
      h->needs_copy = 1;
    }

  return _bfd_elf_adjust_dynamic_copy (info, h, s);
}

/* Caclulate an update the sizes required for a symbol in the GOT and
   RELA relocation section based on the TLS_TYPE and whether or not the symbol
   is DYNAMIC.

   Symbols with TLS_GD access require 8 bytes in the GOT and, if dynamic,
   require two relocation entries.  Symbols with TLS_IE access require 4 bytes
   in the GOT and, if dynamic, require one relocation entry.  Symbols may have
   both TLS_GD and TLS_IE access to be accounted for.

   Other symbols require 4 bytes in the GOT table and, if dynamic, require one
   relocation entry.  */

static void
or1k_set_got_and_rela_sizes (const unsigned char tls_type,
			     const bool dynamic,
			     bfd_vma *got_size,
			     bfd_vma *rela_size)
{
  bool is_tls_entry = false;

  /* TLS GD requires two GOT entries and two relocs.  */
  if ((tls_type & TLS_GD) != 0)
    {
      *got_size += 8;
      is_tls_entry = true;
    }

  if ((tls_type & TLS_IE) != 0)
    {
      *got_size += 4;
      is_tls_entry = true;
    }

  if (!is_tls_entry)
    *got_size += 4;

  if (dynamic)
    {
      if ((tls_type & TLS_GD) != 0)
	*rela_size += 2 * sizeof (Elf32_External_Rela);

      if ((tls_type & TLS_IE) != 0)
	*rela_size += sizeof (Elf32_External_Rela);

      if (!is_tls_entry)
	*rela_size += sizeof (Elf32_External_Rela);
    }
}


/* Allocate space in .plt, .got and associated reloc sections for
   dynamic relocs.  */

static bool
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
{
  struct bfd_link_info *info;
  struct elf_or1k_link_hash_table *htab;
  struct elf_dyn_relocs *sec_relocs;

  if (h->root.type == bfd_link_hash_indirect)
    return true;

  info = (struct bfd_link_info *) inf;
  htab = or1k_elf_hash_table (info);
  if (htab == NULL)
    return false;

  if (htab->root.dynamic_sections_created
      && h->plt.refcount > 0)
    {
      /* Make sure this symbol is output as a dynamic symbol.
	 Undefined weak syms won't yet be marked as dynamic.  */
      if (h->dynindx == -1
	  && !h->forced_local)
	{
	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
	    return false;
	}

      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
	{
	  asection *splt = htab->root.splt;
	  bfd_vma plt_index;

	  /* Track the index of our plt entry for use in calculating size.  */
	  plt_index = htab->plt_count++;
	  ((struct elf_or1k_link_hash_entry *) h)->plt_index = plt_index;

	  /* If this is the first .plt entry, make room for the special
	     first entry.  */
	  if (splt->size == 0)
	    splt->size = elf_or1k_plt_entry_size (plt_index);

	  h->plt.offset = splt->size;

	  /* If this symbol is not defined in a regular file, and we are
	     not generating a shared library, then set the symbol to this
	     location in the .plt.  This is required to make function
	     pointers compare as equal between the normal executable and
	     the shared library.  */
	  if (! bfd_link_pic (info)
	      && !h->def_regular)
	    {
	      h->root.u.def.section = splt;
	      h->root.u.def.value = h->plt.offset;
	    }

	  /* Make room for this entry.  */
	  splt->size += elf_or1k_plt_entry_size (plt_index);

	  /* We also need to make an entry in the .got.plt section, which
	     will be placed in the .got section by the linker script.  */
	  htab->root.sgotplt->size += 4;

	  /* We also need to make an entry in the .rel.plt section.  */
	  htab->root.srelplt->size += sizeof (Elf32_External_Rela);
	}
      else
	{
	  h->plt.offset = (bfd_vma) -1;
	  h->needs_plt = 0;
	}
    }
  else
    {
      h->plt.offset = (bfd_vma) -1;
      h->needs_plt = 0;
    }

  if (h->got.refcount > 0)
    {
      asection *sgot;
      bool dyn;
      unsigned char tls_type;

      /* Make sure this symbol is output as a dynamic symbol.
	 Undefined weak syms won't yet be marked as dynamic.  */
      if (h->dynindx == -1
	  && !h->forced_local)
	{
	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
	    return false;
	}

      sgot = htab->root.sgot;

      h->got.offset = sgot->size;

      tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;

      dyn = htab->root.dynamic_sections_created;
      dyn = WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h);
      or1k_set_got_and_rela_sizes (tls_type, dyn,
				   &sgot->size, &htab->root.srelgot->size);
    }
  else
    h->got.offset = (bfd_vma) -1;

  if (h->dyn_relocs == NULL)
    return true;

  /* In the shared -Bsymbolic case, discard space allocated for
     dynamic pc-relative relocs against symbols which turn out to be
     defined in regular objects.  For the normal shared case, discard
     space for pc-relative relocs that have become local due to symbol
     visibility changes.  */

  if (bfd_link_pic (info))
    {
      if (SYMBOL_CALLS_LOCAL (info, h))
	{
	  struct elf_dyn_relocs **pp;

	  for (pp = &h->dyn_relocs; (sec_relocs = *pp) != NULL;)
	    {
	      sec_relocs->count -= sec_relocs->pc_count;
	      sec_relocs->pc_count = 0;
	      if (sec_relocs->count == 0)
		*pp = sec_relocs->next;
	      else
		pp = &sec_relocs->next;
	    }
	}

      /* Also discard relocs on undefined weak syms with non-default
	 visibility.  */
      if (h->dyn_relocs != NULL
	  && h->root.type == bfd_link_hash_undefweak)
	{
	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
	    h->dyn_relocs = NULL;

	  /* Make sure undefined weak symbols are output as a dynamic
	     symbol in PIEs.  */
	  else if (h->dynindx == -1
		   && !h->forced_local)
	    {
	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
		return false;
	    }
	}
    }
  else
    {
      /* For the non-shared case, discard space for relocs against
	 symbols which turn out to need copy relocs or are not
	 dynamic.  */

      if (!h->non_got_ref
	  && ((h->def_dynamic
	       && !h->def_regular)
	      || (htab->root.dynamic_sections_created
		  && (h->root.type == bfd_link_hash_undefweak
		      || h->root.type == bfd_link_hash_undefined))))
	{
	  /* Make sure this symbol is output as a dynamic symbol.
	     Undefined weak syms won't yet be marked as dynamic.  */
	  if (h->dynindx == -1
	      && !h->forced_local)
	    {
	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
		return false;
	    }

	  /* If that succeeded, we know we'll be keeping all the
	     relocs.  */
	  if (h->dynindx != -1)
	    goto keep;
	}

      h->dyn_relocs = NULL;

    keep: ;
    }

  /* Finally, allocate space.  */
  for (sec_relocs = h->dyn_relocs;
       sec_relocs != NULL;
       sec_relocs = sec_relocs->next)
    {
      asection *sreloc = elf_section_data (sec_relocs->sec)->sreloc;
      sreloc->size += sec_relocs->count * sizeof (Elf32_External_Rela);
    }

  return true;
}

/* Set the sizes of the dynamic sections.  */

static bool
or1k_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
			     struct bfd_link_info *info)
{
  struct elf_or1k_link_hash_table *htab;
  bfd *dynobj;
  asection *s;
  bool relocs;
  bfd *ibfd;

  htab = or1k_elf_hash_table (info);
  if (htab == NULL)
    return false;

  dynobj = htab->root.dynobj;
  if (dynobj == NULL)
    return true;

  if (htab->root.dynamic_sections_created)
    {
      /* Set the contents of the .interp section to the interpreter.  */
      if (bfd_link_executable (info) && !info->nointerp)
	{
	  s = htab->root.interp;
	  BFD_ASSERT (s != NULL);
	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
	  s->alloced = 1;
	}
    }

  /* Set up .got offsets for local syms, and space for local dynamic
     relocs.  */
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
    {
      bfd_signed_vma *local_got;
      bfd_signed_vma *end_local_got;
      bfd_size_type locsymcount;
      Elf_Internal_Shdr *symtab_hdr;
      unsigned char *local_tls_type;
      asection *srel;

      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
	continue;

      for (s = ibfd->sections; s != NULL; s = s->next)
	{
	  struct elf_dyn_relocs *sec_relocs;

	  for (sec_relocs = ((struct elf_dyn_relocs *)
			     elf_section_data (s)->local_dynrel);
	       sec_relocs != NULL;
	       sec_relocs = sec_relocs->next)
	    {
	      if (! bfd_is_abs_section (sec_relocs->sec)
		  && bfd_is_abs_section (sec_relocs->sec->output_section))
		{
		  /* Input section has been discarded, either because
		     it is a copy of a linkonce section or due to
		     linker script /DISCARD/, so we'll be discarding
		     the relocs too.  */
		}
	      else if (sec_relocs->count != 0)
		{
		  srel = elf_section_data (sec_relocs->sec)->sreloc;
		  srel->size += sec_relocs->count
				* sizeof (Elf32_External_Rela);
		  if ((sec_relocs->sec->output_section->flags & SEC_READONLY)
		      != 0)
		    info->flags |= DF_TEXTREL;
		}
	    }
	}

      local_got = elf_local_got_refcounts (ibfd);
      if (!local_got)
	continue;

      symtab_hdr = &elf_symtab_hdr (ibfd);
      locsymcount = symtab_hdr->sh_info;
      end_local_got = local_got + locsymcount;
      s = htab->root.sgot;
      srel = htab->root.srelgot;
      local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
      for (; local_got < end_local_got; ++local_got)
	{
	  if (*local_got > 0)
	    {
	      unsigned char tls_type = (local_tls_type == NULL)
					? TLS_UNKNOWN
					: *local_tls_type;

	      *local_got = s->size;
	      or1k_set_got_and_rela_sizes (tls_type, bfd_link_pic (info),
					   &s->size, &srel->size);
	    }
	  else

	    *local_got = (bfd_vma) -1;

	  if (local_tls_type)
	    ++local_tls_type;
	}
    }

  /* Allocate global sym .plt and .got entries, and space for global
     sym dynamic relocs.  */
  elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);

  /* We now have determined the sizes of the various dynamic sections.
     Allocate memory for them.  */
  relocs = false;
  for (s = dynobj->sections; s != NULL; s = s->next)
    {
      if ((s->flags & SEC_LINKER_CREATED) == 0)
	continue;

      if (s == htab->root.splt
	  || s == htab->root.sgot
	  || s == htab->root.sgotplt
	  || s == htab->root.sdynbss
	  || s == htab->root.sdynrelro)
	{
	  /* Strip this section if we don't need it; see the
	     comment below.  */
	}
      else if (startswith (bfd_section_name (s), ".rela"))
	{
	  if (s->size != 0 && s != htab->root.srelplt)
	    relocs = true;

	  /* We use the reloc_count field as a counter if we need
	     to copy relocs into the output file.  */
	  s->reloc_count = 0;
	}
      else
	/* It's not one of our sections, so don't allocate space.  */
	continue;

      if (s->size == 0)
	{
	  /* If we don't need this section, strip it from the
	     output file.  This is mostly to handle .rela.bss and
	     .rela.plt.  We must create both sections in
	     create_dynamic_sections, because they must be created
	     before the linker maps input sections to output
	     sections.  The linker does that before
	     adjust_dynamic_symbol is called, and it is that
	     function which decides whether anything needs to go
	     into these sections.  */
	  s->flags |= SEC_EXCLUDE;
	  continue;
	}

      if ((s->flags & SEC_HAS_CONTENTS) == 0)
	continue;

      /* Allocate memory for the section contents.  We use bfd_zalloc
	 here in case unused entries are not reclaimed before the
	 section's contents are written out.  This should not happen,
	 but this way if it does, we get a R_OR1K_NONE reloc instead
	 of garbage.  */
      s->contents = bfd_zalloc (dynobj, s->size);
      if (s->contents == NULL)
	return false;
      s->alloced = 1;
    }

  return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
}

/* Copy the extra info we tack onto an elf_link_hash_entry.  */

static void
or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
			       struct elf_link_hash_entry *dir,
			       struct elf_link_hash_entry *ind)
{
  struct elf_or1k_link_hash_entry * edir;
  struct elf_or1k_link_hash_entry * eind;

  edir = (struct elf_or1k_link_hash_entry *) dir;
  eind = (struct elf_or1k_link_hash_entry *) ind;

  if (ind->root.type == bfd_link_hash_indirect)
    {
      if (dir->got.refcount <= 0)
	{
	  edir->tls_type = eind->tls_type;
	  eind->tls_type = TLS_UNKNOWN;
	}
    }

  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
}

/* Set the right machine number.  */

static bool
or1k_elf_object_p (bfd *abfd)
{
  unsigned long mach = bfd_mach_or1k;

  if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
    mach = bfd_mach_or1knd;

  return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
}

/* Store the machine number in the flags field.  */

static bool
or1k_elf_final_write_processing (bfd *abfd)
{
  switch (bfd_get_mach (abfd))
    {
    default:
    case bfd_mach_or1k:
      break;
    case bfd_mach_or1knd:
      elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY;
      break;
    }
  return _bfd_elf_final_write_processing (abfd);
}

static bool
or1k_elf_set_private_flags (bfd *abfd, flagword flags)
{
  BFD_ASSERT (!elf_flags_init (abfd)
	      || elf_elfheader (abfd)->e_flags == flags);

  elf_elfheader (abfd)->e_flags = flags;
  elf_flags_init (abfd) = true;
  return true;
}

/* Make sure all input files are consistent with respect to
   EF_OR1K_NODELAY flag setting.  */

static bool
elf32_or1k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
{
  bfd *obfd = info->output_bfd;
  flagword out_flags;
  flagword in_flags;

  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
    return true;

  in_flags  = elf_elfheader (ibfd)->e_flags;
  out_flags = elf_elfheader (obfd)->e_flags;

  if (!elf_flags_init (obfd))
    {
      elf_flags_init (obfd) = true;
      elf_elfheader (obfd)->e_flags = in_flags;

      return true;
    }

  if (in_flags == out_flags)
    return true;

  if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
    {
      _bfd_error_handler
	(_("%pB: %s flag mismatch with previous modules"),
	 ibfd, "EF_OR1K_NODELAY");

      bfd_set_error (bfd_error_bad_value);
      return false;
    }

  return true;

}

/* Implement elf_backend_grok_prstatus:
   Support for core dump NOTE sections.  */
static bool
or1k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
{
  int offset;
  size_t size;

  switch (note->descsz)
    {
    default:
      return false;

    case 212:	      /* Linux/OpenRISC */
      /* pr_cursig */
      elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);

      /* pr_pid */
      elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);

      /* pr_reg */
      offset = 72;
      size = 132;

      break;
    }

  /* Make a ".reg/999" section.  */
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
					  size, note->descpos + offset);
}

/* Implement elf_backend_grok_psinfo.  */
static bool
or1k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
{
  switch (note->descsz)
    {
    default:
      return false;

    case 128:	      /* Linux/OpenRISC elf_prpsinfo */
      elf_tdata (abfd)->core->program
	= _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
      elf_tdata (abfd)->core->command
	= _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
    }

  return true;
}


#define ELF_ARCH			bfd_arch_or1k
#define ELF_MACHINE_CODE		EM_OR1K
#define ELF_TARGET_ID			OR1K_ELF_DATA
#define ELF_MAXPAGESIZE			0x2000

#define TARGET_BIG_SYM			or1k_elf32_vec
#define TARGET_BIG_NAME			"elf32-or1k"

#define elf_info_to_howto_rel		NULL
#define elf_info_to_howto		or1k_info_to_howto_rela
#define elf_backend_relocate_section	or1k_elf_relocate_section
#define elf_backend_gc_mark_hook	or1k_elf_gc_mark_hook
#define elf_backend_check_relocs	or1k_elf_check_relocs
#define elf_backend_reloc_type_class	or1k_elf_reloc_type_class
#define elf_backend_can_gc_sections	1
#define elf_backend_rela_normal		1

#define bfd_elf32_mkobject		     elf_or1k_mkobject

#define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
#define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
#define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup

#define elf_backend_object_p		    or1k_elf_object_p
#define elf_backend_final_write_processing  or1k_elf_final_write_processing
#define elf_backend_can_refcount		1

#define elf_backend_plt_readonly		1
#define elf_backend_want_got_plt		1
#define elf_backend_want_plt_sym		0
#define elf_backend_got_header_size		12
#define elf_backend_dtrel_excludes_plt		1
#define elf_backend_want_dynrelro		1

#define bfd_elf32_bfd_link_hash_table_create	or1k_elf_link_hash_table_create
#define elf_backend_copy_indirect_symbol	or1k_elf_copy_indirect_symbol
#define elf_backend_create_dynamic_sections	_bfd_elf_create_dynamic_sections
#define elf_backend_finish_dynamic_sections	or1k_elf_finish_dynamic_sections
#define elf_backend_late_size_sections		or1k_elf_late_size_sections
#define elf_backend_adjust_dynamic_symbol	or1k_elf_adjust_dynamic_symbol
#define elf_backend_finish_dynamic_symbol	or1k_elf_finish_dynamic_symbol

#define elf_backend_grok_prstatus	  or1k_grok_prstatus
#define elf_backend_grok_psinfo		  or1k_grok_psinfo

#include "elf32-target.h"
