/* Common code for PA ELF implementations.
   Copyright (C) 1999-2020 Free Software Foundation, Inc.

   This file is part of BFD, the Binary File Descriptor library.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#define ELF_HOWTO_TABLE_SIZE       R_PARISC_UNIMPLEMENTED + 1

/* This file is included by multiple PA ELF BFD backends with different
   sizes.

   Most of the routines are written to be size independent, but sometimes
   external constraints require 32 or 64 bit specific code.  We remap
   the definitions/functions as necessary here.  */
#if ARCH_SIZE == 64
#define ELF_R_TYPE(X)		      ELF64_R_TYPE(X)
#define ELF_R_SYM(X)		      ELF64_R_SYM(X)
#define elf_hppa_reloc_final_type     elf64_hppa_reloc_final_type
#define _bfd_elf_hppa_gen_reloc_type  _bfd_elf64_hppa_gen_reloc_type
#define elf_hppa_relocate_section     elf64_hppa_relocate_section
#define elf_hppa_final_link	      elf64_hppa_final_link
#endif
#if ARCH_SIZE == 32
#define ELF_R_TYPE(X)		      ELF32_R_TYPE(X)
#define ELF_R_SYM(X)		      ELF32_R_SYM(X)
#define elf_hppa_reloc_final_type     elf32_hppa_reloc_final_type
#define _bfd_elf_hppa_gen_reloc_type  _bfd_elf32_hppa_gen_reloc_type
#define elf_hppa_relocate_section     elf32_hppa_relocate_section
#define elf_hppa_final_link	      elf32_hppa_final_link
#endif

/* ELF/PA relocation howto entries.  */

static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
{
#define HOW(type, size, bitsize, pc_rel, complain, mask) \
  HOWTO (type, 0, size, bitsize, pc_rel, 0, complain_overflow_ ## complain, \
	 bfd_elf_generic_reloc, #type, FALSE, 0, mask, FALSE)

  /* The values in DIR32 are to placate the check in
     _bfd_stab_section_find_nearest_line.  */
  HOW (R_PARISC_NONE,		3,  0, FALSE,     dont, 0),
  HOW (R_PARISC_DIR32,		2, 32, FALSE, bitfield, 0xffffffff),
  HOW (R_PARISC_DIR21L,		2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR17R,		2, 17, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR17F,		2, 17, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR14R,		2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR14F,		2, 14, FALSE, bitfield, 0),
  /* 8 */
  HOW (R_PARISC_PCREL12F,	2, 12,  TRUE, bitfield, 0),
  HOW (R_PARISC_PCREL32,	2, 32,  TRUE, bitfield, 0),
  HOW (R_PARISC_PCREL21L,	2, 21,  TRUE, bitfield, 0),
  HOW (R_PARISC_PCREL17R,	2, 17,  TRUE, bitfield, 0),
  HOW (R_PARISC_PCREL17F,	2, 17,  TRUE, bitfield, 0),
  HOW (R_PARISC_PCREL17C,	2, 17,  TRUE, bitfield, 0),
  HOW (R_PARISC_PCREL14R,	2, 14,  TRUE, bitfield, 0),
  HOW (R_PARISC_PCREL14F,	2, 14,  TRUE, bitfield, 0),
  /* 16 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DPREL21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_DPREL14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DPREL14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DPREL14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DPREL14F,	2, 14, FALSE, bitfield, 0),
  /* 24 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTREL21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTREL14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTREL14F,	2, 14, FALSE, bitfield, 0),
  /* 32 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTIND21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTIND14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTIND14F,	2, 14, FALSE, bitfield, 0),
  /* 40 */
  HOW (R_PARISC_SETBASE,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_SECREL32,	2, 32, FALSE, bitfield, 0xffffffff),
  HOW (R_PARISC_BASEREL21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_BASEREL17R,	2, 17, FALSE, bitfield, 0),
  HOW (R_PARISC_BASEREL17F,	2, 17, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_BASEREL14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_BASEREL14F,	2, 14, FALSE, bitfield, 0),
  /* 48 */
  HOW (R_PARISC_SEGBASE,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_SEGREL32,	2, 32, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF14F,	2, 14, FALSE, bitfield, 0),
  /* 56 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR32,	2, 32, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 64 */
  HOW (R_PARISC_FPTR64,		4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_PLABEL32,	2, 32, FALSE, bitfield, 0),
  HOW (R_PARISC_PLABEL21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_PLABEL14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 72 */
  HOW (R_PARISC_PCREL64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_PCREL22C,	2, 22, FALSE, bitfield, 0),
  HOW (R_PARISC_PCREL22F,	2, 22, FALSE, bitfield, 0),
  HOW (R_PARISC_PCREL14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_PCREL14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_PCREL16F,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_PCREL16WF,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_PCREL16DF,	2, 16, FALSE, bitfield, 0),
  /* 80 */
  HOW (R_PARISC_DIR64,		4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR16F,		2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR16WF,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_DIR16DF,	2, 16, FALSE, bitfield, 0),
  /* 88 */
  HOW (R_PARISC_GPREL64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTREL14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTREL14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_GPREL16F,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_GPREL16WF,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_GPREL16DF,	2, 16, FALSE, bitfield, 0),
  /* 96 */
  HOW (R_PARISC_LTOFF64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTIND14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_DLTIND14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF16F,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF16WF,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF16DF,	2, 16, FALSE, bitfield, 0),
  /* 104 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_BASEREL14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_BASEREL14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 112 */
  HOW (R_PARISC_SEGREL64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF16F,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF16WF,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_PLTOFF16DF,	2, 16, FALSE, bitfield, 0),
  /* 120 */
  HOW (R_PARISC_LTOFF_FPTR64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR16F,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR16WF,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_FPTR16DF,	2, 16, FALSE, bitfield, 0),
  /* 128 */
  HOW (R_PARISC_COPY,		0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_IPLT,		0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_EPLT,		0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 136 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 144 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  /* 152 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_TPREL32,	2, 32, FALSE,     dont, 0),
  HOW (R_PARISC_TPREL21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_TPREL14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  /* 160 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_LTOFF_TP21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_TP14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_TP14F,	2, 14, FALSE, bitfield, 0),
  /* 168 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 176 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 184 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  /* 192 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 200 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 208 */
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  /* 216 */
  HOW (R_PARISC_TPREL64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_TPREL14WR,	2, 14, FALSE,     dont, 0),
  HOW (R_PARISC_TPREL14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_TPREL16F,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_TPREL16WF,	2, 16, FALSE,     dont, 0),
  HOW (R_PARISC_TPREL16DF,	2, 16, FALSE, bitfield, 0),
  /* 224 */
  HOW (R_PARISC_LTOFF_TP64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_UNIMPLEMENTED,	0,  0, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_TP14WR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_TP14DR,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_TP16F,	2, 16, FALSE,     dont, 0),
  HOW (R_PARISC_LTOFF_TP16WF,	2, 16, FALSE, bitfield, 0),
  HOW (R_PARISC_LTOFF_TP16DF,	2, 16, FALSE, bitfield, 0),
  /* 232 */
  HOW (R_PARISC_GNU_VTENTRY,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_GNU_VTINHERIT,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_TLS_GD21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_GD14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_GDCALL,	0,  0, FALSE,     dont, 0),
  HOW (R_PARISC_TLS_LDM21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_LDM14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_LDMCALL,	0,  0, FALSE,     dont, 0),
  /* 240 */
  HOW (R_PARISC_TLS_LDO21L,	2, 21, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_LDO14R,	2, 14, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_DTPMOD32,	2, 32, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_DTPMOD64,	4, 64, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_DTPOFF32,	2, 32, FALSE, bitfield, 0),
  HOW (R_PARISC_TLS_DTPOFF64,	4, 64, FALSE, bitfield, 0)
#undef HOW
};

#define OFFSET_14R_FROM_21L 4
#define OFFSET_14F_FROM_21L 5

/* Return the final relocation type for the given base type, instruction
   format, and field selector.  */

elf_hppa_reloc_type
elf_hppa_reloc_final_type (bfd *abfd,
			   elf_hppa_reloc_type base_type,
			   int format,
			   unsigned int field)
{
  elf_hppa_reloc_type final_type = base_type;

  /* Just a tangle of nested switch statements to deal with the braindamage
     that a different field selector means a completely different relocation
     for PA ELF.  */
  switch (base_type)
    {
      /* We have been using generic relocation types.  However, that may not
	 really make sense.  Anyway, we need to support both R_PARISC_DIR64
	 and R_PARISC_DIR32 here.  */
    case R_PARISC_DIR32:
    case R_PARISC_DIR64:
    case R_HPPA_ABS_CALL:
      switch (format)
	{
	case 14:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_DIR14F;
	      break;
	    case e_rsel:
	    case e_rrsel:
	    case e_rdsel:
	      final_type = R_PARISC_DIR14R;
	      break;
	    case e_rtsel:
	      final_type = R_PARISC_DLTIND14R;
	      break;
	    case e_rtpsel:
	      final_type = R_PARISC_LTOFF_FPTR14DR;
	      break;
	    case e_tsel:
	      final_type = R_PARISC_DLTIND14F;
	      break;
	    case e_rpsel:
	      final_type = R_PARISC_PLABEL14R;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 17:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_DIR17F;
	      break;
	    case e_rsel:
	    case e_rrsel:
	    case e_rdsel:
	      final_type = R_PARISC_DIR17R;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 21:
	  switch (field)
	    {
	    case e_lsel:
	    case e_lrsel:
	    case e_ldsel:
	    case e_nlsel:
	    case e_nlrsel:
	      final_type = R_PARISC_DIR21L;
	      break;
	    case e_ltsel:
	      final_type = R_PARISC_DLTIND21L;
	      break;
	    case e_ltpsel:
	      final_type = R_PARISC_LTOFF_FPTR21L;
	      break;
	    case e_lpsel:
	      final_type = R_PARISC_PLABEL21L;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 32:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_DIR32;
	      /* When in 64bit mode, a 32bit relocation is supposed to
		 be a section relative relocation.  Dwarf2 (for example)
		 uses 32bit section relative relocations.  */
	      if (bfd_arch_bits_per_address (abfd) != 32)
		final_type = R_PARISC_SECREL32;
	      break;
	    case e_psel:
	      final_type = R_PARISC_PLABEL32;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 64:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_DIR64;
	      break;
	    case e_psel:
	      final_type = R_PARISC_FPTR64;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	default:
	  return R_PARISC_NONE;
	}
      break;

    case R_HPPA_GOTOFF:
      switch (format)
	{
	case 14:
	  switch (field)
	    {
	    case e_rsel:
	    case e_rrsel:
	    case e_rdsel:
	      /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32.  */
	      final_type = base_type + OFFSET_14R_FROM_21L;
	      break;
	    case e_fsel:
	      /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32.  */
	      final_type = base_type + OFFSET_14F_FROM_21L;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 21:
	  switch (field)
	    {
	    case e_lsel:
	    case e_lrsel:
	    case e_ldsel:
	    case e_nlsel:
	    case e_nlrsel:
	      /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32.  */
	      final_type = base_type;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 64:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_GPREL64;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	default:
	  return R_PARISC_NONE;
	}
      break;

    case R_HPPA_PCREL_CALL:
      switch (format)
	{
	case 12:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_PCREL12F;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 14:
	  /* Contrary to appearances, these are not calls of any sort.
	     Rather, they are loads/stores with a pcrel reloc.  */
	  switch (field)
	    {
	    case e_rsel:
	    case e_rrsel:
	    case e_rdsel:
	      final_type = R_PARISC_PCREL14R;
	      break;
	    case e_fsel:
	      if (bfd_get_mach (abfd) < 25)
		final_type = R_PARISC_PCREL14F;
	      else
		final_type = R_PARISC_PCREL16F;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 17:
	  switch (field)
	    {
	    case e_rsel:
	    case e_rrsel:
	    case e_rdsel:
	      final_type = R_PARISC_PCREL17R;
	      break;
	    case e_fsel:
	      final_type = R_PARISC_PCREL17F;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 21:
	  switch (field)
	    {
	    case e_lsel:
	    case e_lrsel:
	    case e_ldsel:
	    case e_nlsel:
	    case e_nlrsel:
	      final_type = R_PARISC_PCREL21L;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 22:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_PCREL22F;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 32:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_PCREL32;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 64:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_PCREL64;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	default:
	  return R_PARISC_NONE;
	}
      break;

    case R_PARISC_TLS_GD21L:
      switch (field)
	{
	  case e_ltsel:
	  case e_lrsel:
	    final_type = R_PARISC_TLS_GD21L;
	    break;
	  case e_rtsel:
	  case e_rrsel:
	    final_type = R_PARISC_TLS_GD14R;
	    break;
	  default:
	    return R_PARISC_NONE;
	}
      break;

    case R_PARISC_TLS_LDM21L:
      switch (field)
	{
	  case e_ltsel:
	  case e_lrsel:
	    final_type = R_PARISC_TLS_LDM21L;
	    break;
	  case e_rtsel:
	  case e_rrsel:
	    final_type = R_PARISC_TLS_LDM14R;
	    break;
	  default:
	    return R_PARISC_NONE;
	}
      break;

    case R_PARISC_TLS_LDO21L:
      switch (field)
	{
	  case e_lrsel:
	    final_type = R_PARISC_TLS_LDO21L;
	    break;
	  case e_rrsel:
	    final_type = R_PARISC_TLS_LDO14R;
	    break;
	  default:
	    return R_PARISC_NONE;
	}
      break;

    case R_PARISC_TLS_IE21L:
      switch (field)
	{
	  case e_ltsel:
	  case e_lrsel:
	    final_type = R_PARISC_TLS_IE21L;
	    break;
	  case e_rtsel:
	  case e_rrsel:
	    final_type = R_PARISC_TLS_IE14R;
	    break;
	  default:
	    return R_PARISC_NONE;
	}
      break;

    case R_PARISC_TLS_LE21L:
      switch (field)
	{
	  case e_lrsel:
	    final_type = R_PARISC_TLS_LE21L;
	    break;
	  case e_rrsel:
	    final_type = R_PARISC_TLS_LE14R;
	    break;
	  default:
	    return R_PARISC_NONE;
	}
      break;

    case R_PARISC_SEGREL32:
      switch (format)
	{
	case 32:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_SEGREL32;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	case 64:
	  switch (field)
	    {
	    case e_fsel:
	      final_type = R_PARISC_SEGREL64;
	      break;
	    default:
	      return R_PARISC_NONE;
	    }
	  break;

	default:
	  return R_PARISC_NONE;
	}
      break;

    case R_PARISC_GNU_VTENTRY:
    case R_PARISC_GNU_VTINHERIT:
    case R_PARISC_SEGBASE:
      /* The defaults are fine for these cases.  */
      break;

    default:
      return R_PARISC_NONE;
    }

  return final_type;
}

/* Return one (or more) BFD relocations which implement the base
   relocation with modifications based on format and field.  */

elf_hppa_reloc_type **
_bfd_elf_hppa_gen_reloc_type (bfd *abfd,
			      elf_hppa_reloc_type base_type,
			      int format,
			      unsigned int field,
			      int ignore ATTRIBUTE_UNUSED,
			      asymbol *sym ATTRIBUTE_UNUSED)
{
  elf_hppa_reloc_type *finaltype;
  elf_hppa_reloc_type **final_types;
  size_t amt = sizeof (elf_hppa_reloc_type *) * 2;

  /* Allocate slots for the BFD relocation.  */
  final_types = bfd_alloc (abfd, amt);
  if (final_types == NULL)
    return NULL;

  /* Allocate space for the relocation itself.  */
  amt = sizeof (elf_hppa_reloc_type);
  finaltype = bfd_alloc (abfd, amt);
  if (finaltype == NULL)
    return NULL;

  /* Some reasonable defaults.  */
  final_types[0] = finaltype;
  final_types[1] = NULL;

  *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);

  return final_types;
}

/* Translate from an elf into field into a howto relocation pointer.  */

static bfd_boolean
elf_hppa_info_to_howto (bfd *abfd,
			arelent *bfd_reloc,
			Elf_Internal_Rela *elf_reloc)
{
  unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info);
  unsigned int type = r_type;
  reloc_howto_type *howto = NULL;

  if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED)
    {
      howto = &elf_hppa_howto_table[r_type];
      type = howto->type;
    }
  if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
    {
      /* xgettext:c-format */
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
			  abfd, r_type);
      bfd_set_error (bfd_error_bad_value);
      return FALSE;
    }
  bfd_reloc->howto = howto;
  return TRUE;
}

/* Translate from an elf into field into a howto relocation pointer.  */

static bfd_boolean
elf_hppa_info_to_howto_rel (bfd *abfd,
			    arelent *bfd_reloc,
			    Elf_Internal_Rela *elf_reloc)
{
  unsigned int r_type = ELF_R_TYPE (elf_reloc->r_info);
  unsigned int type = r_type;
  reloc_howto_type *howto = NULL;

  if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED)
    {
      howto = &elf_hppa_howto_table[r_type];
      type = howto->type;
    }
  if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
    {
      /* xgettext:c-format */
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
			  abfd, r_type);
      bfd_set_error (bfd_error_bad_value);
      return FALSE;
    }
  bfd_reloc->howto = howto;
  return TRUE;
}

/* Return the address of the howto table entry to perform the CODE
   relocation for an ARCH machine.  */

static reloc_howto_type *
elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
			    bfd_reloc_code_real_type code)
{
  if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
    {
      BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
      return &elf_hppa_howto_table[(int) code];
    }
  return NULL;
}

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

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

  return NULL;
}

/* Return TRUE if SYM represents a local label symbol.  */

static bfd_boolean
elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
{
  if (name[0] == 'L' && name[1] == '$')
    return TRUE;
  return _bfd_elf_is_local_label_name (abfd, name);
}

/* Set the correct type for an ELF section.  We do this by the
   section name, which is a hack, but ought to work.  */

static bfd_boolean
elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
{
  const char *name;

  name = bfd_section_name (sec);

  if (strcmp (name, ".PARISC.unwind") == 0)
    {
      int indx;
      asection *asec;

#if ARCH_SIZE == 64
      hdr->sh_type = SHT_PARISC_UNWIND;
#else
      /* Note - it is not clear why this is not SHT_PARISC_UNWIND as well.
	 Presumably it is a historical constraint, so leave it as it is.  */
      hdr->sh_type = SHT_PROGBITS;
#endif
      /* ?!? How are unwinds supposed to work for symbols in arbitrary
	 sections?  Or what if we have multiple .text sections in a single
	 .o file?  HP really messed up on this one.

	 Ugh.  We can not use elf_section_data (sec)->this_idx at this
	 point because it is not initialized yet.

	 So we (gasp) recompute it here.  Hopefully nobody ever changes the
	 way sections are numbered in elf.c!  */
      for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
	{
	  if (asec->name && strcmp (asec->name, ".text") == 0)
	    {
	      hdr->sh_info = indx;
	      hdr->sh_flags |= SHF_INFO_LINK;
	      break;
	    }
	}

      /* The unwind table entries are 16 bytes long, so it is not clear
	 why this field is set to 4.  (The ELF spec says that the sh_entsize
	 field is a byte quantity, but this is a processor specific section,
	 so it is allowed to change the rules).  Leave as it is for now.  */
      hdr->sh_entsize = 4;
    }
  return TRUE;
}

static bfd_boolean
elf_hppa_final_write_processing (bfd *abfd)
{
  int mach = bfd_get_mach (abfd);

  elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
				     | EF_PARISC_EXT | EF_PARISC_LSB
				     | EF_PARISC_WIDE | EF_PARISC_NO_KABP
				     | EF_PARISC_LAZYSWAP);

  if (mach == 10)
    elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
  else if (mach == 11)
    elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
  else if (mach == 20)
    elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
  else if (mach == 25)
    elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
				      | EFA_PARISC_2_0
				      /* The GNU tools have trapped without
					 option since 1993, so need to take
					 a step backwards with the ELF
					 based toolchains.  */
				      | EF_PARISC_TRAPNIL);
  return _bfd_elf_final_write_processing (abfd);
}

/* Comparison function for qsort to sort unwind section during a
   final link.  */

static int
hppa_unwind_entry_compare (const void *a, const void *b)
{
  const bfd_byte *ap, *bp;
  unsigned long av, bv;

  ap = a;
  av = (unsigned long) ap[0] << 24;
  av |= (unsigned long) ap[1] << 16;
  av |= (unsigned long) ap[2] << 8;
  av |= (unsigned long) ap[3];

  bp = b;
  bv = (unsigned long) bp[0] << 24;
  bv |= (unsigned long) bp[1] << 16;
  bv |= (unsigned long) bp[2] << 8;
  bv |= (unsigned long) bp[3];

  return av < bv ? -1 : av > bv ? 1 : 0;
}

static bfd_boolean
elf_hppa_sort_unwind (bfd *abfd)
{
  asection *s;

  /* Magic section names, but this is much safer than having
     relocate_section remember where SEGREL32 relocs occurred.
     Consider what happens if someone inept creates a linker script
     that puts unwind information in .text.  */
  s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
  if (s != NULL)
    {
      bfd_size_type size;
      bfd_byte *contents;

      if (!bfd_malloc_and_get_section (abfd, s, &contents))
	return FALSE;

      size = s->size;
      qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);

      if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
	return FALSE;
    }

  return TRUE;
}

/* What to do when ld finds relocations against symbols defined in
   discarded sections.  */

static unsigned int
elf_hppa_action_discarded (asection *sec)
{
  /* Ignore relocations in .data.rel.ro.local.  This section can contain
     PLABEL32 relocations to functions in discarded COMDAT groups.  */
  if (strcmp (".data.rel.ro.local", sec->name) == 0)
    return 0;

  if (strcmp (".PARISC.unwind", sec->name) == 0)
    return 0;

  return _bfd_elf_default_action_discarded (sec);
}
