* elf-hppa.h (elf_hppa_final_link_relocate): Handle DLTREL14F
[external/binutils.git] / bfd / elf-hppa.h
1 /* Common code for PA ELF implementations.
2    Copyright (C) 1999 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #define ELF_HOWTO_TABLE_SIZE       R_PARISC_UNIMPLEMENTED + 1
21
22 /* This file is included by multiple PA ELF BFD backends with different
23    sizes.
24
25    Most of the routines are written to be size independent, but sometimes
26    external constraints require 32 or 64 bit specific code.  We remap
27    the definitions/functions as necessary here.  */
28 #if ARCH_SIZE == 64
29 #define ELF_R_TYPE(X)   ELF64_R_TYPE(X)
30 #define ELF_R_SYM(X)   ELF64_R_SYM(X)
31 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
32 #define elf_hppa_relocate_section elf64_hppa_relocate_section
33 #define bfd_elf_bfd_final_link bfd_elf64_bfd_final_link
34 #define elf_hppa_final_link elf64_hppa_final_link
35 #endif
36 #if ARCH_SIZE == 32
37 #define ELF_R_TYPE(X)   ELF32_R_TYPE(X)
38 #define ELF_R_SYM(X)   ELF32_R_SYM(X)
39 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
40 #define elf_hppa_relocate_section elf32_hppa_relocate_section
41 #define bfd_elf_bfd_final_link bfd_elf32_bfd_final_link
42 #define elf_hppa_final_link elf32_hppa_final_link
43 #endif
44
45 static boolean
46 elf_hppa_relocate_section
47   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
48            bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
49
50 static bfd_reloc_status_type elf_hppa_final_link_relocate
51   PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *,
52            bfd_byte *, bfd_vma, bfd_vma, bfd_vma, struct bfd_link_info *,
53            asection *, const char *, int));
54
55 static unsigned long elf_hppa_relocate_insn
56   PARAMS ((bfd *, asection *, unsigned long, unsigned long, long,
57            long, unsigned long, unsigned long, unsigned long));
58
59 static boolean elf_hppa_add_symbol_hook
60   PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
61            const char **, flagword *, asection **, bfd_vma *));
62
63 static boolean elf_hppa_final_link
64   PARAMS ((bfd *, struct bfd_link_info *));
65
66 /* ELF/PA relocation howto entries.  */
67
68 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
69 {
70   {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE", false, 0, 0, false},
71
72   /* The values in DIR32 are to placate the check in
73      _bfd_stab_section_find_nearest_line.  */
74   {R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false},
75   {R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR21L", false, 0, 0, false},
76   {R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17R", false, 0, 0, false},
77   {R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17F", false, 0, 0, false},
78   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
79   {R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14R", false, 0, 0, false},
80   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
81   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
82   {R_PARISC_PCREL32, 0, 0, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL32", false, 0, 0, false},
83
84   {R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL21L", false, 0, 0, false},
85   {R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17R", false, 0, 0, false},
86   {R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17F", false, 0, 0, false},
87   {R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17C", false, 0, 0, false},
88   {R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14R", false, 0, 0, false},
89   {R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14F", false, 0, 0, false},
90   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
91   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
92   {R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL21L", false, 0, 0, false},
93   {R_PARISC_DPREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", false, 0, 0, false},
94
95   {R_PARISC_DPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", false, 0, 0, false},
96   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
97   {R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14R", false, 0, 0, false},
98   {R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14F", false, 0, 0, false},
99   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
100   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
101   {R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL21L", false, 0, 0, false},
102   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
103   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
104   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
105
106   {R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", false, 0, 0, false},
107   {R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", false, 0, 0, false},
108   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
109   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
110   {R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND21L", false, 0, 0, false},
111   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
112   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
113   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
114   {R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", false, 0, 0, false},
115   {R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", false, 0, 0, false},
116
117   {R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SETBASE", false, 0, 0, false},
118   {R_PARISC_SECREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SECREL32", false, 0, 0, false},
119   {R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", false, 0, 0, false},
120   {R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17R", false, 0, 0, false},
121   {R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17F", false, 0, 0, false},
122   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
123   {R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", false, 0, 0, false},
124   {R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", false, 0, 0, false},
125   {R_PARISC_SEGBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGBASE", false, 0, 0, false},
126   {R_PARISC_SEGREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL32", false, 0, 0, false},
127
128   {R_PARISC_PLTOFF21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", false, 0, 0, false},
129   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
130   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
131   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
132   {R_PARISC_PLTOFF14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", false, 0, 0, false},
133   {R_PARISC_PLTOFF14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", false, 0, 0, false},
134   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
135   {R_PARISC_LTOFF_FPTR32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", false, 0, 0, false},
136   {R_PARISC_LTOFF_FPTR21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", false, 0, 0, false},
137   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
138
139   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
140   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
141   {R_PARISC_LTOFF_FPTR14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", false, 0, 0, false},
142   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
143   {R_PARISC_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_FPTR64", false, 0, 0, false},
144   {R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL32", false, 0, 0, false},
145   {R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL21L", false, 0, 0, false},
146   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
147   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
148   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
149
150   {R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", false, 0, 0, false},
151   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
152   {R_PARISC_PCREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL64", false, 0, 0, false},
153   {R_PARISC_PCREL22C, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22C", false, 0, 0, false},
154   {R_PARISC_PCREL22F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22F", false, 0, 0, false},
155   {R_PARISC_PCREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", false, 0, 0, false},
156   {R_PARISC_PCREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", false, 0, 0, false},
157   {R_PARISC_PCREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16F", false, 0, 0, false},
158   {R_PARISC_PCREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", false, 0, 0, false},
159   {R_PARISC_PCREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", false, 0, 0, false},
160
161   {R_PARISC_DIR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64", false, 0, 0, false},
162   {R_PARISC_DIR64WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64WR", false, 0, 0, false},
163   {R_PARISC_DIR64DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64DR", false, 0, 0, false},
164   {R_PARISC_DIR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14WR", false, 0, 0, false},
165   {R_PARISC_DIR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14DR", false, 0, 0, false},
166   {R_PARISC_DIR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16F", false, 0, 0, false},
167   {R_PARISC_DIR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16WF", false, 0, 0, false},
168   {R_PARISC_DIR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16DF", false, 0, 0, false},
169   {R_PARISC_GPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL64", false, 0, 0, false},
170   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
171
172   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
173   {R_PARISC_DLTREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", false, 0, 0, false},
174   {R_PARISC_DLTREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", false, 0, 0, false},
175   {R_PARISC_GPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16F", false, 0, 0, false},
176   {R_PARISC_GPREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", false, 0, 0, false},
177   {R_PARISC_GPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", false, 0, 0, false},
178   {R_PARISC_LTOFF64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF64", false, 0, 0, false},
179   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
180   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
181   {R_PARISC_DLTIND14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", false, 0, 0, false},
182
183   {R_PARISC_DLTIND14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", false, 0, 0, false},
184   {R_PARISC_LTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", false, 0, 0, false},
185   {R_PARISC_LTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", false, 0, 0, false},
186   {R_PARISC_SECREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SECREL64", false, 0, 0, false},
187   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
188   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
189   {R_PARISC_BASEREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BSEREL14WR", false, 0, 0, false},
190   {R_PARISC_BASEREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", false, 0, 0, false},
191   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
192   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
193
194   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
195   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
196   {R_PARISC_SEGREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL64", false, 0, 0, false},
197   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
198   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
199   {R_PARISC_PLTOFF14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", false, 0, 0, false},
200   {R_PARISC_PLTOFF14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", false, 0, 0, false},
201   {R_PARISC_PLTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", false, 0, 0, false},
202   {R_PARISC_PLTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", false, 0, 0, false},
203   {R_PARISC_PLTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", false, 0, 0, false},
204
205   {R_PARISC_LTOFF_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
206   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
207   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
208   {R_PARISC_LTOFF_FPTR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", false, 0, 0, false},
209   {R_PARISC_LTOFF_FPTR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", false, 0, 0, false},
210   {R_PARISC_LTOFF_FPTR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", false, 0, 0, false},
211   {R_PARISC_LTOFF_FPTR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", false, 0, 0, false},
212   {R_PARISC_LTOFF_FPTR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
213   {R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_COPY", false, 0, 0, false},
214   {R_PARISC_IPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_IPLT", false, 0, 0, false},
215
216   {R_PARISC_EPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_EPLT", false, 0, 0, false},
217   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
218   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
219   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
220   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
221   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
222   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
223   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
224   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
225   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
226
227   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
228   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
229   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
230   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
231   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
232   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
233   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
234   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
235   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
236   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
237
238   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
239   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
240   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
241   {R_PARISC_TPREL32, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL32", false, 0, 0, false},
242   {R_PARISC_TPREL21L, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL21L", false, 0, 0, false},
243   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
244   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
245   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
246   {R_PARISC_TPREL14R, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14R", false, 0, 0, false},
247   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
248
249   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
250   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
251   {R_PARISC_LTOFF_TP21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", false, 0, 0, false},
252   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
253   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
254   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
255   {R_PARISC_LTOFF_TP14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
256   {R_PARISC_LTOFF_TP14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", false, 0, 0, false},
257   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
258   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
259
260   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
261   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
262   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
263   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
264   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
265   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
266   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
267   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
268   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
269   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
270
271   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
272   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
273   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
274   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
275   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
276   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
277   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
278   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
279   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
280   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
281
282   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
283   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
284   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
285   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
286   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
287   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
288   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
289   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
290   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
291   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
292
293   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
294   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
295   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
296   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
297   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
298   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
299   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
300   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
301   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
302   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
303
304   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
305   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
306   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
307   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
308   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
309   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
310   {R_PARISC_TPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL64", false, 0, 0, false},
311   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
312   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
313   {R_PARISC_TPREL14WR, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14WR", false, 0, 0, false},
314
315   {R_PARISC_TPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", false, 0, 0, false},
316   {R_PARISC_TPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16F", false, 0, 0, false},
317   {R_PARISC_TPREL16WF, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL16WF", false, 0, 0, false},
318   {R_PARISC_TPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", false, 0, 0, false},
319   {R_PARISC_LTOFF_TP64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", false, 0, 0, false},
320   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
321   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false},
322   {R_PARISC_LTOFF_TP14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", false, 0, 0, false},
323   {R_PARISC_LTOFF_TP14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", false, 0, 0, false},
324   {R_PARISC_LTOFF_TP16F, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_LTOFF_TP16F", false, 0, 0, false},
325
326   {R_PARISC_LTOFF_TP16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", false, 0, 0, false},
327   {R_PARISC_LTOFF_TP16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", false, 0, 0, false},
328 };
329
330 #define OFFSET_14R_FROM_21L 4
331 #define OFFSET_14F_FROM_21L 5
332
333 /* Return one (or more) BFD relocations which implement the base
334    relocation with modifications based on format and field.  */
335
336 elf_hppa_reloc_type **
337 _bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
338      bfd *abfd;
339      elf_hppa_reloc_type base_type;
340      int format;
341      int field;
342      int ignore ATTRIBUTE_UNUSED;
343      asymbol *sym ATTRIBUTE_UNUSED;
344 {
345   elf_hppa_reloc_type *finaltype;
346   elf_hppa_reloc_type **final_types;
347
348   /* Allocate slots for the BFD relocation.  */
349   final_types = ((elf_hppa_reloc_type **)
350                  bfd_alloc (abfd, sizeof (elf_hppa_reloc_type *) * 2));
351   if (final_types == NULL)
352     return NULL;
353
354   /* Allocate space for the relocation itself.  */
355   finaltype = ((elf_hppa_reloc_type *)
356                bfd_alloc (abfd, sizeof (elf_hppa_reloc_type)));
357   if (finaltype == NULL)
358     return NULL;
359
360   /* Some reasonable defaults.  */
361   final_types[0] = finaltype;
362   final_types[1] = NULL;
363
364 #define final_type finaltype[0]
365
366   final_type = base_type;
367
368   /* Just a tangle of nested switch statements to deal with the braindamage
369      that a different field selector means a completely different relocation
370      for PA ELF.  */
371   switch (base_type)
372     {
373     /* We have been using generic relocation types.  However, that may not
374        really make sense.  Anyway, we need to support both R_PARISC_DIR64
375        and R_PARISC_DIR32 here.  */
376     case R_PARISC_DIR32:
377     case R_PARISC_DIR64:
378     case R_HPPA_ABS_CALL:
379       switch (format)
380         {
381         case 14:
382           switch (field)
383             {
384             case e_rsel:
385             case e_rrsel:
386               final_type = R_PARISC_DIR14R;
387               break;
388             case e_rtsel:
389               final_type = R_PARISC_DLTIND14R;
390               break;
391             case e_rtpsel:
392               final_type = R_PARISC_LTOFF_FPTR14DR;
393               break;
394             case e_tsel:
395               final_type = R_PARISC_DLTIND14F;
396               break;
397             case e_rpsel:
398               final_type = R_PARISC_PLABEL14R;
399               break;
400             default:
401               return NULL;
402             }
403           break;
404
405         case 17:
406           switch (field)
407             {
408             case e_fsel:
409               final_type = R_PARISC_DIR17F;
410               break;
411             case e_rsel:
412             case e_rrsel:
413               final_type = R_PARISC_DIR17R;
414               break;
415             default:
416               return NULL;
417             }
418           break;
419
420         case 21:
421           switch (field)
422             {
423             case e_lsel:
424             case e_lrsel:
425               final_type = R_PARISC_DIR21L;
426               break;
427             case e_ltsel:
428               final_type = R_PARISC_DLTIND21L;
429               break;
430             case e_ltpsel:
431               final_type = R_PARISC_LTOFF_FPTR21L;
432               break;
433             case e_lpsel:
434               final_type = R_PARISC_PLABEL21L;
435               break;
436             default:
437               return NULL;
438             }
439           break;
440
441         case 32:
442           switch (field)
443             {
444             case e_fsel:
445               final_type = R_PARISC_DIR32;
446               /* When in 64bit mode, a 32bit relocation is supposed to
447                  be a section relative relocation.  Dwarf2 (for example)
448                  uses 32bit section relative relocations.  */
449               if (bfd_get_arch_info (abfd)->bits_per_address != 32)
450                 final_type = R_PARISC_SECREL32;
451               break;
452             case e_psel:
453               final_type = R_PARISC_PLABEL32;
454               break;
455             default:
456               return NULL;
457             }
458           break;
459
460         case 64:
461           switch (field)
462             {
463             case e_fsel:
464               final_type = R_PARISC_DIR64;
465               break;
466             case e_psel:
467               final_type = R_PARISC_FPTR64;
468               break;
469             default:
470               return NULL;
471             }
472           break;
473
474         default:
475           return NULL;
476         }
477       break;
478
479
480     case R_HPPA_GOTOFF:
481       switch (format)
482         {
483         case 14:
484           switch (field)
485             {
486             case e_rsel:
487             case e_rrsel:
488               final_type = base_type + OFFSET_14R_FROM_21L;
489               break;
490             case e_fsel:
491               final_type = base_type + OFFSET_14F_FROM_21L;
492               break;
493             default:
494               return NULL;
495             }
496           break;
497
498         case 21:
499           switch (field)
500             {
501             case e_lrsel:
502             case e_lsel:
503               final_type = base_type;
504               break;
505             default:
506               return NULL;
507             }
508           break;
509
510         default:
511           return NULL;
512         }
513       break;
514
515
516     case R_HPPA_PCREL_CALL:
517       switch (format)
518         {
519         case 14:
520           switch (field)
521             {
522             case e_rsel:
523             case e_rrsel:
524               final_type = R_PARISC_PCREL14R;
525               break;
526             case e_fsel:
527               final_type = R_PARISC_PCREL14F;
528               break;
529             default:
530               return NULL;
531             }
532           break;
533
534         case 17:
535           switch (field)
536             {
537             case e_rsel:
538             case e_rrsel:
539               final_type = R_PARISC_PCREL17R;
540               break;
541             case e_fsel:
542               final_type = R_PARISC_PCREL17F;
543               break;
544             default:
545               return NULL;
546             }
547           break;
548
549         case 22:
550           switch (field)
551             {
552             case e_fsel:
553               final_type = R_PARISC_PCREL22F;
554               break;
555             default:
556               return NULL;
557             }
558           break;
559
560         case 21:
561           switch (field)
562             {
563             case e_lsel:
564             case e_lrsel:
565               final_type = R_PARISC_PCREL21L;
566               break;
567             default:
568               return NULL;
569             }
570           break;
571
572         default:
573           return NULL;
574         }
575       break;
576
577     case R_PARISC_SEGREL32:
578     case R_PARISC_SEGBASE:
579       /* The defaults are fine for these cases.  */
580       break;
581
582     default:
583       return NULL;
584     }
585
586   return final_types;
587 }
588
589 /* Translate from an elf into field into a howto relocation pointer.  */
590
591 static void
592 elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
593      bfd *abfd ATTRIBUTE_UNUSED;
594      arelent *bfd_reloc;
595      Elf_Internal_Rela *elf_reloc;
596 {
597   BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
598               < (unsigned int) R_PARISC_UNIMPLEMENTED);
599   bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
600 }
601
602 /* Translate from an elf into field into a howto relocation pointer.  */
603
604 static void
605 elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
606      bfd *abfd ATTRIBUTE_UNUSED;
607      arelent *bfd_reloc;
608      Elf_Internal_Rel *elf_reloc;
609 {
610   BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
611               < (unsigned int) R_PARISC_UNIMPLEMENTED);
612   bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
613 }
614
615 /* Return the address of the howto table entry to perform the CODE
616    relocation for an ARCH machine.  */
617
618 static reloc_howto_type *
619 elf_hppa_reloc_type_lookup (abfd, code)
620      bfd *abfd ATTRIBUTE_UNUSED;
621      bfd_reloc_code_real_type code;
622 {
623   if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
624     {
625       BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
626       return &elf_hppa_howto_table[(int) code];
627     }
628   return NULL;
629 }
630
631 static void
632 elf_hppa_final_write_processing (abfd, linker)
633      bfd *abfd;
634      boolean linker ATTRIBUTE_UNUSED;
635 {
636   int mach = bfd_get_mach (abfd);
637
638   elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
639                                      | EF_PARISC_EXT | EF_PARISC_LSB
640                                      | EF_PARISC_WIDE | EF_PARISC_NO_KABP
641                                      | EF_PARISC_LAZYSWAP);
642
643   if (mach == 10)
644     elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
645   else if (mach == 11)
646     elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
647   else if (mach == 20)
648     elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
649   else if (mach == 25)
650     elf_elfheader (abfd)->e_flags |= EF_PARISC_WIDE | EFA_PARISC_2_0;
651 }
652
653 /* Return true if SYM represents a local label symbol.  */
654
655 static boolean
656 elf_hppa_is_local_label_name (abfd, name)
657      bfd *abfd ATTRIBUTE_UNUSED;
658      const char *name;
659 {
660   return (name[0] == 'L' && name[1] == '$');
661 }
662
663 /* Set the correct type for an ELF section.  We do this by the
664    section name, which is a hack, but ought to work.  */
665
666 static boolean
667 elf_hppa_fake_sections (abfd, hdr, sec)
668      bfd *abfd;
669      Elf64_Internal_Shdr *hdr;
670      asection *sec;
671 {
672   register const char *name;
673
674   name = bfd_get_section_name (abfd, sec);
675
676   if (strcmp (name, ".PARISC.unwind") == 0)
677     {
678       int indx;
679       asection *sec;
680       hdr->sh_type = SHT_LOPROC + 1;
681       /* ?!? How are unwinds supposed to work for symbols in arbitrary
682          sections?  Or what if we have multiple .text sections in a single
683          .o file?  HP really messed up on this one. 
684
685          Ugh.  We can not use elf_section_data (sec)->this_idx at this
686          point because it is not initialized yet.
687
688          So we (gasp) recompute it here.  Hopefully nobody ever changes the
689          way sections are numbered in elf.c!  */
690       for (sec = abfd->sections, indx = 1; sec; sec = sec->next, indx++)
691         {
692           if (sec->name && strcmp (sec->name, ".text") == 0)
693             {
694               hdr->sh_info = indx;
695               break;
696             }
697         }
698       
699       /* I have no idea if this is really necessary or what it means.  */
700       hdr->sh_entsize = 4;
701     }
702   return true;
703 }
704
705 /* Hook called by the linker routine which adds symbols from an object
706    file.  HP's libraries define symbols with HP specific section
707    indices, which we have to handle.  */
708
709 static boolean
710 elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
711      bfd *abfd;
712      struct bfd_link_info *info ATTRIBUTE_UNUSED;
713      const Elf_Internal_Sym *sym;
714      const char **namep ATTRIBUTE_UNUSED;
715      flagword *flagsp ATTRIBUTE_UNUSED;
716      asection **secp;
717      bfd_vma *valp;
718 {
719   int index = sym->st_shndx;
720   
721   switch (index)
722     {
723     case SHN_PARISC_ANSI_COMMON:
724       *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
725       (*secp)->flags |= SEC_IS_COMMON;
726       *valp = sym->st_size;
727       break;
728       
729     case SHN_PARISC_HUGE_COMMON:
730       *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
731       (*secp)->flags |= SEC_IS_COMMON;
732       *valp = sym->st_size;
733       break;
734     }
735
736   return true;
737 }
738
739 /* Called after we have seen all the input files/sections, but before
740    final symbol resolution and section placement has been determined.
741
742    We use this hook to (possibly) provide a value for __gp, then we
743    fall back to the generic ELF final link routine.  */
744
745 static boolean
746 elf_hppa_final_link (abfd, info)
747      bfd *abfd;
748      struct bfd_link_info *info;
749 {
750   /* Make sure we've got ourselves a suitable __gp value.  */
751   if (!info->relocateable)
752     {
753       bfd_vma min_short_vma = (bfd_vma) -1, max_short_vma = 0;
754       struct elf_link_hash_entry *gp;
755       bfd_vma gp_val = 0;
756       asection *os;
757
758       /* Find the min and max vma of all short sections.  */
759       for (os = abfd->sections; os ; os = os->next)
760         {
761           bfd_vma lo, hi;
762
763           if ((os->flags & SEC_ALLOC) == 0)
764             continue;
765
766           lo = os->vma;
767           hi = os->vma + os->_raw_size;
768           if (hi < lo)
769             hi = (bfd_vma) -1;
770
771           /* This would be cleaner if we marked sections with an attribute
772              indicating they are short sections.  */
773           if (strcmp (os->name, ".sbss") == 0
774               || strcmp (os->name, ".sdata") == 0)
775             {
776               if (min_short_vma > lo)
777                 min_short_vma = lo;
778               if (max_short_vma < hi)
779                 max_short_vma = hi;
780             }
781         }
782
783       /* See if the user wants to force a value.  */
784       gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
785                                  false, false);
786
787       if (gp
788           && (gp->root.type == bfd_link_hash_defined
789               || gp->root.type == bfd_link_hash_defweak))
790         {
791           asection *gp_sec = gp->root.u.def.section;
792           gp_val = (gp->root.u.def.value
793                     + gp_sec->output_section->vma
794                     + gp_sec->output_offset);
795         }
796       else if (max_short_vma != 0)
797         {
798           /* Pick a sensible value.  */
799           gp_val = min_short_vma;
800
801           /* If we don't cover all the short data, adjust.  */
802           if (max_short_vma - gp_val >= 0x2000)
803             gp_val = min_short_vma + 0x2000;
804
805           /* If we're addressing stuff past the end, adjust back.  */
806           if (gp_val > max_short_vma)
807             gp_val = max_short_vma - 0x2000 + 8;
808
809           /* If there was no __gp symbol, create one.  */
810           if (!gp)
811             gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", true,
812                                        true, false);
813
814           /* We now know the value for the global pointer, figure out which
815              section to shove it into and mark it as defined in the hash
816              table.  */
817           for (os = abfd->sections; os ; os = os->next)
818             {
819               bfd_vma low = os->output_offset + os->output_section->vma;
820               bfd_vma high = low + os->_raw_size;
821
822               if (gp_val >= low && gp_val <= high)
823                 {
824                   gp->root.type = bfd_link_hash_defined;
825                   gp->root.u.def.section = os;
826                   gp->root.u.def.value = gp_val - low;
827                   break;
828                 }
829             }
830         }
831
832       /* Validate whether all short sections are within
833          range of the chosen GP.  */
834
835       if (max_short_vma != 0)
836         {
837           if (max_short_vma - min_short_vma >= 0x4000)
838             {
839               (*_bfd_error_handler)
840                 (_("%s: short data segment overflowed (0x%lx >= 0x4000)"),
841                  bfd_get_filename (abfd),
842                  (unsigned long)(max_short_vma - min_short_vma));
843               return false;
844             }
845           else if ((gp_val > min_short_vma
846                     && gp_val - min_short_vma > 0x2000)
847                    || (gp_val < max_short_vma
848                        && max_short_vma - gp_val >= 0x2000))
849             {
850               (*_bfd_error_handler)
851                 (_("%s: __gp does not cover short data segment"),
852                  bfd_get_filename (abfd));
853               return false;
854             }
855         }
856
857       _bfd_set_gp_value (abfd, gp_val);
858     }
859
860   /* Invoke the regular ELF backend linker to do all the work.  */
861   return bfd_elf_bfd_final_link (abfd, info);
862 }
863
864 /* Relocate an HPPA ELF section.  */
865
866 static boolean
867 elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
868                            contents, relocs, local_syms, local_sections)
869      bfd *output_bfd;
870      struct bfd_link_info *info;
871      bfd *input_bfd;
872      asection *input_section;
873      bfd_byte *contents;
874      Elf_Internal_Rela *relocs;
875      Elf_Internal_Sym *local_syms;
876      asection **local_sections;
877 {
878   Elf_Internal_Shdr *symtab_hdr;
879   Elf_Internal_Rela *rel;
880   Elf_Internal_Rela *relend;
881
882   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
883
884   rel = relocs;
885   relend = relocs + input_section->reloc_count;
886   for (; rel < relend; rel++)
887     {
888       int r_type;
889       reloc_howto_type *howto;
890       unsigned long r_symndx;
891       struct elf_link_hash_entry *h;
892       Elf_Internal_Sym *sym;
893       asection *sym_sec;
894       bfd_vma relocation;
895       bfd_reloc_status_type r;
896       const char *sym_name;
897
898       r_type = ELF_R_TYPE (rel->r_info);
899       if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
900         {
901           bfd_set_error (bfd_error_bad_value);
902           return false;
903         }
904       howto = elf_hppa_howto_table + r_type;
905
906       r_symndx = ELF_R_SYM (rel->r_info);
907
908       if (info->relocateable)
909         {
910           /* This is a relocateable link.  We don't have to change
911              anything, unless the reloc is against a section symbol,
912              in which case we have to adjust according to where the
913              section symbol winds up in the output section.  */
914           if (r_symndx < symtab_hdr->sh_info)
915             {
916               sym = local_syms + r_symndx;
917               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
918                 {
919                   sym_sec = local_sections[r_symndx];
920                   rel->r_addend += sym_sec->output_offset;
921                 }
922             }
923
924           continue;
925         }
926
927       /* This is a final link.  */
928       h = NULL;
929       sym = NULL;
930       sym_sec = NULL;
931       if (r_symndx < symtab_hdr->sh_info)
932         {
933           sym = local_syms + r_symndx;
934           sym_sec = local_sections[r_symndx];
935           relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
936                            ? 0 : sym->st_value)
937                          + sym_sec->output_offset
938                          + sym_sec->output_section->vma);
939         }
940       else
941         {
942           long indx;
943
944           indx = r_symndx - symtab_hdr->sh_info;
945           h = elf_sym_hashes (input_bfd)[indx];
946           while (h->root.type == bfd_link_hash_indirect
947                  || h->root.type == bfd_link_hash_warning)
948             h = (struct elf_link_hash_entry *) h->root.u.i.link;
949           if (h->root.type == bfd_link_hash_defined
950               || h->root.type == bfd_link_hash_defweak)
951             {
952               sym_sec = h->root.u.def.section;
953               relocation = (h->root.u.def.value
954                             + sym_sec->output_offset
955                             + sym_sec->output_section->vma);
956             }
957           else if (h->root.type == bfd_link_hash_undefweak)
958             relocation = 0;
959           else
960             {
961               if (!((*info->callbacks->undefined_symbol)
962                     (info, h->root.root.string, input_bfd,
963                      input_section, rel->r_offset)))
964                 return false;
965               break;
966             }
967         }
968
969       if (h != NULL)
970         sym_name = h->root.root.string;
971       else
972         {
973           sym_name = bfd_elf_string_from_elf_section (input_bfd,
974                                                       symtab_hdr->sh_link,
975                                                       sym->st_name);
976           if (sym_name == NULL)
977             return false;
978           if (*sym_name == '\0')
979             sym_name = bfd_section_name (input_bfd, sym_sec);
980         }
981
982       r = elf_hppa_final_link_relocate (howto, input_bfd, output_bfd,
983                                         input_section, contents,
984                                         rel->r_offset, relocation,
985                                         rel->r_addend, info, sym_sec,
986                                         sym_name, h == NULL);
987
988       if (r != bfd_reloc_ok)
989         {
990           switch (r)
991             {
992             default:
993               abort ();
994             case bfd_reloc_overflow:
995               {
996                 if (!((*info->callbacks->reloc_overflow)
997                       (info, sym_name, howto->name, (bfd_vma) 0,
998                         input_bfd, input_section, rel->r_offset)))
999                   return false;
1000               }
1001               break;
1002             }
1003         }
1004     }
1005   return true;
1006 }
1007
1008
1009 /* Actually perform a relocation as part of a final link.  */
1010
1011 static bfd_reloc_status_type
1012 elf_hppa_final_link_relocate (howto, input_bfd, output_bfd,
1013                               input_section, contents, offset, value,
1014                               addend, info, sym_sec, sym_name, is_local)
1015      reloc_howto_type *howto;
1016      bfd *input_bfd;
1017      bfd *output_bfd ATTRIBUTE_UNUSED;
1018      asection *input_section;
1019      bfd_byte *contents;
1020      bfd_vma offset;
1021      bfd_vma value;
1022      bfd_vma addend;
1023      struct bfd_link_info *info;
1024      asection *sym_sec;
1025      const char *sym_name;
1026      int is_local;
1027 {
1028   unsigned long insn;
1029   unsigned long r_type = howto->type;
1030   unsigned long r_format = howto->bitsize;
1031   unsigned long r_field = e_fsel;
1032   bfd_byte *hit_data = contents + offset;
1033   boolean r_pcrel = howto->pc_relative;
1034
1035   insn = bfd_get_32 (input_bfd, hit_data);
1036
1037 /* For reference here a quick summary of the relocations found in the
1038    HPUX 11.00 PA64 .o and .a files, but not yet implemented.  This is mostly
1039    a guide to help prioritize what relocation support is worked on first.
1040    The list will be deleted eventually.
1041
1042    27210 R_PARISC_SEGREL32
1043    8284 R_PARISC_DLTIND21L
1044    8218 R_PARISC_DLTIND14DR
1045    6675 R_PARISC_FPTR64
1046    3974 R_PARISC_DIR64
1047    1584 R_PARISC_LTOFF_FPTR14DR
1048    1565 R_PARISC_LTOFF_FPTR21L
1049    1120 R_PARISC_PCREL64
1050    1096 R_PARISC_LTOFF_TP14DR
1051    982 R_PARISC_LTOFF_TP21L
1052    791 R_PARISC_GPREL64
1053    772 R_PARISC_PLTOFF14DR
1054    386 R_PARISC_PLTOFF21L
1055    6 R_PARISC_LTOFF64
1056    5 R_PARISC_SEGREL64
1057    1 R_PARISC_DLTIND14R
1058    1 R_PARISC_PCREL21L
1059    1 R_PARISC_PCREL14R */
1060
1061   switch (r_type)
1062     {
1063     case R_PARISC_NONE:
1064       break;
1065
1066     case R_PARISC_PCREL22F:
1067     case R_PARISC_PCREL17F:
1068     case R_PARISC_14F:
1069       {
1070         bfd_vma location;
1071         r_field = e_fsel;
1072
1073         /* Find out where we are and where we're going.  */
1074         location = (offset +
1075                     input_section->output_offset +
1076                     input_section->output_section->vma);
1077
1078         insn = elf_hppa_relocate_insn (output_bfd, input_section, insn,
1079                                        offset, value, addend, r_type,
1080                                        r_field, r_pcrel);
1081         break;
1082       }
1083
1084     case R_PARISC_DLTREL14R:
1085     case R_PARISC_DLTREL14DR:
1086     case R_PARISC_DLTREL14WR:
1087       {
1088         bfd_vma location;
1089         r_field = e_rrsel;
1090
1091         /* Find out where we are and where we're going.  */
1092         location = (offset +
1093                     input_section->output_offset +
1094                     input_section->output_section->vma);
1095
1096         insn = elf_hppa_relocate_insn (output_bfd, input_section, insn,
1097                                        offset, value, addend, r_type,
1098                                        r_field, r_pcrel);
1099         break;
1100       }
1101
1102     case R_PARISC_DLTREL21L:
1103       {
1104         bfd_vma location;
1105         r_field = e_lrsel;
1106
1107         /* Find out where we are and where we're going.  */
1108         location = (offset +
1109                     input_section->output_offset +
1110                     input_section->output_section->vma);
1111
1112         insn = elf_hppa_relocate_insn (output_bfd, input_section, insn,
1113                                        offset, value, addend, r_type,
1114                                        r_field, r_pcrel);
1115         break;
1116       }
1117
1118
1119     /* Something we don't know how to handle.  */
1120     default:
1121       /* ?!? This is temporary as we flesh out basic linker support, once
1122          the basic support is functional we will return the not_supported
1123          error conditional appropriately.  */
1124 #if 0
1125       return bfd_reloc_not_supported;
1126 #else
1127       return bfd_reloc_ok;
1128 #endif
1129     }
1130
1131   /* Update the instruction word.  */
1132   bfd_put_32 (input_bfd, insn, hit_data);
1133   return (bfd_reloc_ok);
1134 }
1135
1136 /* Relocate the given INSN given the various input parameters.  */
1137
1138 static unsigned long
1139 elf_hppa_relocate_insn (abfd, input_sect, insn, address, sym_value,
1140                         r_addend, r_type, r_field, pcrel)
1141      bfd *abfd;
1142      asection *input_sect;
1143      unsigned long insn;
1144      unsigned long address;
1145      long sym_value;
1146      long r_addend;
1147      unsigned long r_type;
1148      unsigned long r_field;
1149      unsigned long pcrel;
1150 {
1151   long constant_value;
1152
1153   switch (r_type)
1154     {
1155     /* This is any 17 or 22bit PC-relative branch.  In PA2.0 syntax it
1156        corresponds to the "B" instruction.  */
1157     case R_PARISC_PCREL22F:
1158     case R_PARISC_PCREL17F:
1159       /* Turn SYM_VALUE into a proper PC relative address.  */
1160       sym_value -= (address + input_sect->output_offset
1161                     + input_sect->output_section->vma);
1162
1163       /* Adjust for any field selectors.  */
1164       sym_value = hppa_field_adjust (sym_value, -8, r_field);
1165
1166       /* All PC relative branches are implicitly shifted by 2 places.  */
1167       sym_value >>= 2;
1168
1169       /* Now determine if this is a 17 or 22 bit branch and take
1170          appropriate action.  */
1171       if (((insn >> 13) & 0x7) == 0x4
1172           || ((insn >> 13) & 0x7) == 0x5)
1173         {
1174           unsigned int w3, w2, w1, w;
1175
1176           /* These are 22 bit branches.  Mask off bits we do not care
1177              about.  */
1178           sym_value &= 0x3fffff;
1179
1180           /* Now extract the W1, W2, W3 and W fields from the value.  */
1181           dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
1182
1183           /* Mask out bits for the value in the instruction.  */
1184           insn &= 0xfc00e002;
1185
1186           /* Insert the bits for the W1, W2 and W fields into the
1187              instruction.  */
1188           insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1189           return insn;
1190         }
1191       else
1192         {
1193           unsigned int w2, w1, w;
1194           /* These are 17 bit branches.  Mask off bits we do not care
1195              about.  */
1196           sym_value &= 0x1ffff;
1197
1198           /* Now extract the W1, W2 and W fields from the value.  */
1199           dis_assemble_17 (sym_value, &w1, &w2, &w);
1200
1201           /* Mask out bits for the value in the instruction.  */
1202           insn &= 0xffe0e002;
1203
1204           /* Insert the bits for the W1, W2 and W fields into the
1205              instruction.  */
1206           insn |= (w2 << 2) | (w1 << 16) | w;
1207           return insn;
1208         }
1209
1210     /* This corresponds to any 17 bit absolute branch.  */
1211     case R_PARISC_DIR17F:
1212       {
1213         unsigned int w2, w1, w;
1214
1215         /* Adjust for any field selectors.  */
1216         sym_value = hppa_field_adjust (sym_value, 0, r_field);
1217
1218         /* All absolute branches are implicitly shifted by 2 places.  */
1219         sym_value >>= 2;
1220
1221         /* These are 17 bit branches.  Mask off bits we do not care
1222            about.  */
1223         sym_value &= 0x1ffff;
1224
1225         /* Now extract the W1, W2 and W fields from the value.  */
1226         dis_assemble_17 (sym_value, &w1, &w2, &w);
1227
1228         /* Mask out bits for the value in the instruction.  */
1229         insn &= 0xffe0e002;
1230
1231         /* Insert the bits for the W1, W2 and W fields into the
1232            instruction.  */
1233         insn |= (w2 << 2) | (w1 << 16) | w;
1234         return insn;
1235       }
1236
1237     case R_PARISC_DLTREL21L:
1238       {
1239         int w;
1240
1241         /* Subtract out the global pointer value.  */
1242         sym_value -= _bfd_get_gp_value (abfd);
1243
1244         /* Apply the desired field selector (R_FIELD).  */
1245         sym_value = hppa_field_adjust (sym_value, r_addend, r_field);
1246
1247         /* Mask off bits in INSN we do not want.  */
1248         insn &= 0xffe00000;
1249
1250         /* Turn the 21bit value into the proper format.  */
1251         dis_assemble_21 (sym_value, &w);
1252
1253         /* And insert the proper bits into INSN.  */
1254         return insn | w;
1255       }
1256    
1257     case R_PARISC_DLTREL14R:
1258     case R_PARISC_DLTREL14F:
1259       {
1260         int w;
1261
1262         /* Subtract out the global pointer value.  */
1263         sym_value -= _bfd_get_gp_value (abfd);
1264
1265         /* Apply the desired field selector (R_FIELD).  */
1266         sym_value = hppa_field_adjust (sym_value, r_addend, r_field);
1267
1268         /* Mask off bits in INSN we do not want.  */
1269         insn &= 0xffffc000;
1270
1271         /* Turn the 14bit value into the proper format.  */
1272         low_sign_unext (sym_value, 14, &w);
1273
1274         /* And insert the proper bits into INSN.  */
1275         return insn | w;
1276       }
1277    
1278     /* This is similar to a DLTREL14R relocation, except that it applies
1279        to doubleword load/store instructions which have a slightly different
1280        bit encoding for the displacement than singleword load/store
1281        instructions.  */
1282     case R_PARISC_DLTREL14DR:
1283       {
1284         int w;
1285
1286         /* Subtract out the global pointer value.  */
1287         sym_value -= _bfd_get_gp_value (abfd);
1288
1289         /* Apply the desired field selector (R_FIELD).  */
1290         sym_value = hppa_field_adjust (sym_value, r_addend, r_field);
1291
1292         /* Mask off bits in INSN we do not want.  */
1293         insn &= 0xffffc00e;
1294
1295         /* The sign bit at 14 moves into bit zero in the destination.  */
1296         insn |= ((sym_value & 0x2000) >> 13);
1297
1298         /* Turn off the bits in sym_value we do not care about.  */
1299         sym_value &= 0x1ff8;
1300
1301         /* Now shift it one bit position left so that it lines up with the
1302            destination field in INSN.  */
1303         sym_value <<= 1;
1304
1305         return insn | sym_value;
1306       }
1307
1308     /* This is similar to DLTREL14R and DLTREL14DR relocation, except that it
1309        applies to floating point single word load store instructions which
1310        have a different encoding than other load/store instructions.  */
1311     case R_PARISC_DLTREL14WR:
1312       {
1313         int w;
1314
1315         /* Subtract out the global pointer value.  */
1316         sym_value -= _bfd_get_gp_value (abfd);
1317
1318         /* Apply the desired field selector (R_FIELD).  */
1319         sym_value = hppa_field_adjust (sym_value, r_addend, r_field);
1320
1321         /* Mask off bits in INSN we do not want.  */
1322         insn &= 0xffffc006;
1323
1324         /* The sign bit at 14 moves into bit zero in the destination.  */
1325         insn |= ((sym_value & 0x2000) >> 13);
1326
1327         /* Turn off the bits in sym_value we do not care about.  */
1328         sym_value &= 0x1ffc;
1329
1330         /* Now shift it one bit position left so that it lines up with the
1331            destination field in INSN.  */
1332         sym_value <<= 1;
1333
1334         return insn | sym_value;
1335       }
1336    
1337     default:
1338       return insn;
1339     }
1340 }