1/* Common code for PA ELF implementations.
2   Copyright 1999, 2000, 2001, 2002, 2003, 2004
3   Free Software Foundation, Inc.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21#define ELF_HOWTO_TABLE_SIZE       R_PARISC_UNIMPLEMENTED + 1
22
23/* This file is included by multiple PA ELF BFD backends with different
24   sizes.
25
26   Most of the routines are written to be size independent, but sometimes
27   external constraints require 32 or 64 bit specific code.  We remap
28   the definitions/functions as necessary here.  */
29#if ARCH_SIZE == 64
30#define ELF_R_TYPE(X)   ELF64_R_TYPE(X)
31#define ELF_R_SYM(X)   ELF64_R_SYM(X)
32#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
33#define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
34#define elf_hppa_relocate_section elf64_hppa_relocate_section
35#define elf_hppa_final_link elf64_hppa_final_link
36#endif
37#if ARCH_SIZE == 32
38#define ELF_R_TYPE(X)   ELF32_R_TYPE(X)
39#define ELF_R_SYM(X)   ELF32_R_SYM(X)
40#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
41#define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
42#define elf_hppa_relocate_section elf32_hppa_relocate_section
43#define elf_hppa_final_link elf32_hppa_final_link
44#endif
45
46#if ARCH_SIZE == 64
47static bfd_reloc_status_type elf_hppa_final_link_relocate
48  (Elf_Internal_Rela *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma,
49   struct bfd_link_info *, asection *, struct elf_link_hash_entry *,
50   struct elf64_hppa_dyn_hash_entry *);
51
52static int elf_hppa_relocate_insn
53  (int, int, unsigned int);
54#endif
55
56/* ELF/PA relocation howto entries.  */
57
58static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
59{
60  { R_PARISC_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
61    bfd_elf_generic_reloc, "R_PARISC_NONE", FALSE, 0, 0, FALSE },
62
63  /* The values in DIR32 are to placate the check in
64     _bfd_stab_section_find_nearest_line.  */
65  { R_PARISC_DIR32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
66    bfd_elf_generic_reloc, "R_PARISC_DIR32", FALSE, 0, 0xffffffff, FALSE },
67  { R_PARISC_DIR21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
68    bfd_elf_generic_reloc, "R_PARISC_DIR21L", FALSE, 0, 0, FALSE },
69  { R_PARISC_DIR17R, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
70    bfd_elf_generic_reloc, "R_PARISC_DIR17R", FALSE, 0, 0, FALSE },
71  { R_PARISC_DIR17F, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
72    bfd_elf_generic_reloc, "R_PARISC_DIR17F", FALSE, 0, 0, FALSE },
73  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
74    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
75  { R_PARISC_DIR14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
76    bfd_elf_generic_reloc, "R_PARISC_DIR14R", FALSE, 0, 0, FALSE },
77  { R_PARISC_DIR14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
78    bfd_elf_generic_reloc, "R_PARISC_DIR14F", FALSE, 0, 0, FALSE },
79  /* 8 */
80  { R_PARISC_PCREL12F, 0, 0, 12, TRUE, 0, complain_overflow_bitfield,
81    bfd_elf_generic_reloc, "R_PARISC_PCREL12F", FALSE, 0, 0, FALSE },
82  { R_PARISC_PCREL32, 0, 0, 32, TRUE, 0, complain_overflow_bitfield,
83    bfd_elf_generic_reloc, "R_PARISC_PCREL32", FALSE, 0, 0, FALSE },
84  { R_PARISC_PCREL21L, 0, 0, 21, TRUE, 0, complain_overflow_bitfield,
85    bfd_elf_generic_reloc, "R_PARISC_PCREL21L", FALSE, 0, 0, FALSE },
86  { R_PARISC_PCREL17R, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
87    bfd_elf_generic_reloc, "R_PARISC_PCREL17R", FALSE, 0, 0, FALSE },
88  { R_PARISC_PCREL17F, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
89    bfd_elf_generic_reloc, "R_PARISC_PCREL17F", FALSE, 0, 0, FALSE },
90  { R_PARISC_PCREL17C, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
91    bfd_elf_generic_reloc, "R_PARISC_PCREL17C", FALSE, 0, 0, FALSE },
92  { R_PARISC_PCREL14R, 0, 0, 14, TRUE, 0, complain_overflow_bitfield,
93    bfd_elf_generic_reloc, "R_PARISC_PCREL14R", FALSE, 0, 0, FALSE },
94  { R_PARISC_PCREL14F, 0, 0, 14, TRUE, 0, complain_overflow_bitfield,
95    bfd_elf_generic_reloc, "R_PARISC_PCREL14F", FALSE, 0, 0, FALSE },
96  /* 16 */
97  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
98    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
99  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
100    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
101  { R_PARISC_DPREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
102    bfd_elf_generic_reloc, "R_PARISC_DPREL21L", FALSE, 0, 0, FALSE },
103  { R_PARISC_DPREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
104    bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", FALSE, 0, 0, FALSE },
105  { R_PARISC_DPREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
106    bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", FALSE, 0, 0, FALSE },
107  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
108    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
109  { R_PARISC_DPREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
110    bfd_elf_generic_reloc, "R_PARISC_DPREL14R", FALSE, 0, 0, FALSE },
111  { R_PARISC_DPREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
112    bfd_elf_generic_reloc, "R_PARISC_DPREL14F", FALSE, 0, 0, FALSE },
113  /* 24 */
114  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
115    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
116  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
117    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
118  { R_PARISC_DLTREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
119    bfd_elf_generic_reloc, "R_PARISC_DLTREL21L", FALSE, 0, 0, FALSE },
120  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
121    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
122  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
123    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
124  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
125    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
126  { R_PARISC_DLTREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
127    bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", FALSE, 0, 0, FALSE },
128  { R_PARISC_DLTREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
129    bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", FALSE, 0, 0, FALSE },
130  /* 32 */
131  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
132    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
133  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
134    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
135  { R_PARISC_DLTIND21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
136    bfd_elf_generic_reloc, "R_PARISC_DLTIND21L", FALSE, 0, 0, FALSE },
137  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
138    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
139  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
140    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
141  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
142    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
143  { R_PARISC_DLTIND14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
144    bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", FALSE, 0, 0, FALSE },
145  { R_PARISC_DLTIND14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
146    bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", FALSE, 0, 0, FALSE },
147  /* 40 */
148  { R_PARISC_SETBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
149    bfd_elf_generic_reloc, "R_PARISC_SETBASE", FALSE, 0, 0, FALSE },
150  { R_PARISC_SECREL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
151    bfd_elf_generic_reloc, "R_PARISC_SECREL32", FALSE, 0, 0, FALSE },
152  { R_PARISC_BASEREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
153    bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", FALSE, 0, 0, FALSE },
154  { R_PARISC_BASEREL17R, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
155    bfd_elf_generic_reloc, "R_PARISC_BASEREL17R", FALSE, 0, 0, FALSE },
156  { R_PARISC_BASEREL17F, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
157    bfd_elf_generic_reloc, "R_PARISC_BASEREL17F", FALSE, 0, 0, FALSE },
158  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
159    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
160  { R_PARISC_BASEREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
161    bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", FALSE, 0, 0, FALSE },
162  { R_PARISC_BASEREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
163    bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", FALSE, 0, 0, FALSE },
164  /* 48 */
165  { R_PARISC_SEGBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
166    bfd_elf_generic_reloc, "R_PARISC_SEGBASE", FALSE, 0, 0, FALSE },
167  { R_PARISC_SEGREL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
168    bfd_elf_generic_reloc, "R_PARISC_SEGREL32", FALSE, 0, 0, FALSE },
169  { R_PARISC_PLTOFF21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
170    bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", FALSE, 0, 0, FALSE },
171  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
172    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
173  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
174    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
175  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
176    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
177  { R_PARISC_PLTOFF14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
178    bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", FALSE, 0, 0, FALSE },
179  { R_PARISC_PLTOFF14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
180    bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", FALSE, 0, 0, FALSE },
181  /* 56 */
182  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
183    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
184  { R_PARISC_LTOFF_FPTR32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
185    bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", FALSE, 0, 0, FALSE },
186  { R_PARISC_LTOFF_FPTR21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
187    bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", FALSE, 0, 0, FALSE },
188  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
189    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
190  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
191    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
192  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
193    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
194  { R_PARISC_LTOFF_FPTR14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
195    bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", FALSE, 0, 0, FALSE },
196  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
197    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
198  /* 64 */
199  { R_PARISC_FPTR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
200    bfd_elf_generic_reloc, "R_PARISC_FPTR64", FALSE, 0, 0, FALSE },
201  { R_PARISC_PLABEL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
202    bfd_elf_generic_reloc, "R_PARISC_PLABEL32", FALSE, 0, 0, FALSE },
203  { R_PARISC_PLABEL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
204    bfd_elf_generic_reloc, "R_PARISC_PLABEL21L", FALSE, 0, 0, FALSE },
205  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
206    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
207  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
208    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
209  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
210    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
211  { R_PARISC_PLABEL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
212    bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", FALSE, 0, 0, FALSE },
213  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
214    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
215  /* 72 */
216  { R_PARISC_PCREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
217    bfd_elf_generic_reloc, "R_PARISC_PCREL64", FALSE, 0, 0, FALSE },
218  { R_PARISC_PCREL22C, 0, 0, 22, FALSE, 0, complain_overflow_bitfield,
219    bfd_elf_generic_reloc, "R_PARISC_PCREL22C", FALSE, 0, 0, FALSE },
220  { R_PARISC_PCREL22F, 0, 0, 22, FALSE, 0, complain_overflow_bitfield,
221    bfd_elf_generic_reloc, "R_PARISC_PCREL22F", FALSE, 0, 0, FALSE },
222  { R_PARISC_PCREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
223    bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", FALSE, 0, 0, FALSE },
224  { R_PARISC_PCREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
225    bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", FALSE, 0, 0, FALSE },
226  { R_PARISC_PCREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
227    bfd_elf_generic_reloc, "R_PARISC_PCREL16F", FALSE, 0, 0, FALSE },
228  { R_PARISC_PCREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
229    bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", FALSE, 0, 0, FALSE },
230  { R_PARISC_PCREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
231    bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", FALSE, 0, 0, FALSE },
232  /* 80 */
233  { R_PARISC_DIR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
234    bfd_elf_generic_reloc, "R_PARISC_DIR64", FALSE, 0, 0, FALSE },
235  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
236    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
237  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
238    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
239  { R_PARISC_DIR14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
240    bfd_elf_generic_reloc, "R_PARISC_DIR14WR", FALSE, 0, 0, FALSE },
241  { R_PARISC_DIR14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
242    bfd_elf_generic_reloc, "R_PARISC_DIR14DR", FALSE, 0, 0, FALSE },
243  { R_PARISC_DIR16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
244    bfd_elf_generic_reloc, "R_PARISC_DIR16F", FALSE, 0, 0, FALSE },
245  { R_PARISC_DIR16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
246    bfd_elf_generic_reloc, "R_PARISC_DIR16WF", FALSE, 0, 0, FALSE },
247  { R_PARISC_DIR16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
248    bfd_elf_generic_reloc, "R_PARISC_DIR16DF", FALSE, 0, 0, FALSE },
249  /* 88 */
250  { R_PARISC_GPREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
251    bfd_elf_generic_reloc, "R_PARISC_GPREL64", FALSE, 0, 0, FALSE },
252  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
253    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
254  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
255    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
256  { R_PARISC_DLTREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
257    bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", FALSE, 0, 0, FALSE },
258  { R_PARISC_DLTREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
259    bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", FALSE, 0, 0, FALSE },
260  { R_PARISC_GPREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
261    bfd_elf_generic_reloc, "R_PARISC_GPREL16F", FALSE, 0, 0, FALSE },
262  { R_PARISC_GPREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
263    bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", FALSE, 0, 0, FALSE },
264  { R_PARISC_GPREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
265    bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", FALSE, 0, 0, FALSE },
266  /* 96 */
267  { R_PARISC_LTOFF64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
268    bfd_elf_generic_reloc, "R_PARISC_LTOFF64", FALSE, 0, 0, FALSE },
269  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
270    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
271  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
272    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
273  { R_PARISC_DLTIND14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
274    bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", FALSE, 0, 0, FALSE },
275  { R_PARISC_DLTIND14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
276    bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", FALSE, 0, 0, FALSE },
277  { R_PARISC_LTOFF16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
278    bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", FALSE, 0, 0, FALSE },
279  { R_PARISC_LTOFF16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
280    bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
281  { R_PARISC_LTOFF16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
282    bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
283  /* 104 */
284  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
285    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
286  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
287    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
288  { R_PARISC_BASEREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
289    bfd_elf_generic_reloc, "R_PARISC_BASEREL14WR", FALSE, 0, 0, FALSE },
290  { R_PARISC_BASEREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
291    bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", FALSE, 0, 0, FALSE },
292  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
293    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
294  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
295    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
296  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
297    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
298  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
299    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
300  /* 112 */
301  { R_PARISC_SEGREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
302    bfd_elf_generic_reloc, "R_PARISC_SEGREL64", FALSE, 0, 0, FALSE },
303  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
304    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
305  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
306    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
307  { R_PARISC_PLTOFF14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
308    bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", FALSE, 0, 0, FALSE },
309  { R_PARISC_PLTOFF14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
310    bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", FALSE, 0, 0, FALSE },
311  { R_PARISC_PLTOFF16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
312    bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", FALSE, 0, 0, FALSE },
313  { R_PARISC_PLTOFF16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
314    bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", FALSE, 0, 0, FALSE },
315  { R_PARISC_PLTOFF16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
316    bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", FALSE, 0, 0, FALSE },
317  /* 120 */
318  { R_PARISC_LTOFF_FPTR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
319    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
320  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
321    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
322  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
323    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
324  { R_PARISC_LTOFF_FPTR14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
325    bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", FALSE, 0, 0, FALSE },
326  { R_PARISC_LTOFF_FPTR14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
327    bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", FALSE, 0, 0, FALSE },
328  { R_PARISC_LTOFF_FPTR16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
329    bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", FALSE, 0, 0, FALSE },
330  { R_PARISC_LTOFF_FPTR16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
331    bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", FALSE, 0, 0, FALSE },
332  { R_PARISC_LTOFF_FPTR16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
333    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
334  /* 128 */
335  { R_PARISC_COPY, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
336    bfd_elf_generic_reloc, "R_PARISC_COPY", FALSE, 0, 0, FALSE },
337  { R_PARISC_IPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
338    bfd_elf_generic_reloc, "R_PARISC_IPLT", FALSE, 0, 0, FALSE },
339  { R_PARISC_EPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
340    bfd_elf_generic_reloc, "R_PARISC_EPLT", FALSE, 0, 0, FALSE },
341  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
342    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
343  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
344    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
345  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
346    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
347  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
348    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
349  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
350    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
351  /* 136 */
352  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
353    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
354  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
355    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
356  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
357    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
358  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
359    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
360  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
361    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
362  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
363    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
364  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
365    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
366  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
367    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
368  /* 144 */
369  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
370    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
371  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
372    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
373  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
374    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
375  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
376    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
377  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
378    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
379  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
380    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
381  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
382    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
383  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
384    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
385  /* 152 */
386  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
387    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
388  { R_PARISC_TPREL32, 0, 0, 32, FALSE, 0, complain_overflow_dont,
389    bfd_elf_generic_reloc, "R_PARISC_TPREL32", FALSE, 0, 0, FALSE },
390  { R_PARISC_TPREL21L, 0, 0, 21, FALSE, 0, complain_overflow_dont,
391    bfd_elf_generic_reloc, "R_PARISC_TPREL21L", FALSE, 0, 0, FALSE },
392  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
393    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
394  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
395    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
396  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
397    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
398  { R_PARISC_TPREL14R, 0, 0, 14, FALSE, 0, complain_overflow_dont,
399    bfd_elf_generic_reloc, "R_PARISC_TPREL14R", FALSE, 0, 0, FALSE },
400  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
401    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
402  /* 160 */
403  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
404    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
405  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
406    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
407  { R_PARISC_LTOFF_TP21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
408    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", FALSE, 0, 0, FALSE },
409  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
410    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
411  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
412    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
413  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
414    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
415  { R_PARISC_LTOFF_TP14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
416    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
417  { R_PARISC_LTOFF_TP14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
418    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", FALSE, 0, 0, FALSE },
419  /* 168 */
420  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
421    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
422  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
423    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
424  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
425    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
426  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
427    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
428  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
429    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
430  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
431    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
432  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
433    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
434  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
435    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
436  /* 176 */
437  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
438    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
439  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
440    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
441  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
442    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
443  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
444    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
445  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
446    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
447  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
448    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
449  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
450    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
451  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
452    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
453  /* 184 */
454  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
455    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
456  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
457    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
458  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
459    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
460  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
461    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
462  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
463    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
464  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
465    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
466  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
467    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
468  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
469    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
470  /* 192 */
471  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
472    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
473  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
474    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
475  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
476    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
477  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
478    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
479  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
480    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
481  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
482    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
483  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
484    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
485  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
486    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
487  /* 200 */
488  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
489    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
490  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
491    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
492  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
493    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
494  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
495    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
496  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
497    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
498  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
499    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
500  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
501    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
502  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
503    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
504  /* 208 */
505  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
506    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
507  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
508    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
509  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
510    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
511  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
512    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
513  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
514    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
515  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
516    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
517  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
518    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
519  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
520    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
521  /* 216 */
522  { R_PARISC_TPREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
523    bfd_elf_generic_reloc, "R_PARISC_TPREL64", FALSE, 0, 0, FALSE },
524  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
525    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
526  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
527    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
528  { R_PARISC_TPREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_dont,
529    bfd_elf_generic_reloc, "R_PARISC_TPREL14WR", FALSE, 0, 0, FALSE },
530  { R_PARISC_TPREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
531    bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", FALSE, 0, 0, FALSE },
532  { R_PARISC_TPREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
533    bfd_elf_generic_reloc, "R_PARISC_TPREL16F", FALSE, 0, 0, FALSE },
534  { R_PARISC_TPREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_dont,
535    bfd_elf_generic_reloc, "R_PARISC_TPREL16WF", FALSE, 0, 0, FALSE },
536  { R_PARISC_TPREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
537    bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", FALSE, 0, 0, FALSE },
538  /* 224 */
539  { R_PARISC_LTOFF_TP64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
540    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", FALSE, 0, 0, FALSE },
541  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
542    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
543  { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
544    bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
545  { R_PARISC_LTOFF_TP14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
546    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", FALSE, 0, 0, FALSE },
547  { R_PARISC_LTOFF_TP14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
548    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", FALSE, 0, 0, FALSE },
549  { R_PARISC_LTOFF_TP16F, 0, 0, 16, FALSE, 0, complain_overflow_dont,
550    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16F", FALSE, 0, 0, FALSE },
551  { R_PARISC_LTOFF_TP16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
552    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", FALSE, 0, 0, FALSE },
553  { R_PARISC_LTOFF_TP16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
554    bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", FALSE, 0, 0, FALSE },
555  /* 232 */
556  { R_PARISC_GNU_VTENTRY, 0, 0, 0, FALSE, 0, complain_overflow_dont,
557    bfd_elf_generic_reloc, "R_PARISC_GNU_VTENTRY", FALSE, 0, 0, FALSE },
558  { R_PARISC_GNU_VTINHERIT, 0, 0, 0, FALSE, 0, complain_overflow_dont,
559    bfd_elf_generic_reloc, "R_PARISC_GNU_VTINHERIT", FALSE, 0, 0, FALSE },
560};
561
562#define OFFSET_14R_FROM_21L 4
563#define OFFSET_14F_FROM_21L 5
564
565/* Return the final relocation type for the given base type, instruction
566   format, and field selector.  */
567
568elf_hppa_reloc_type
569elf_hppa_reloc_final_type (bfd *abfd,
570			   elf_hppa_reloc_type base_type,
571			   int format,
572			   unsigned int field)
573{
574  elf_hppa_reloc_type final_type = base_type;
575
576  /* Just a tangle of nested switch statements to deal with the braindamage
577     that a different field selector means a completely different relocation
578     for PA ELF.  */
579  switch (base_type)
580    {
581    /* We have been using generic relocation types.  However, that may not
582       really make sense.  Anyway, we need to support both R_PARISC_DIR64
583       and R_PARISC_DIR32 here.  */
584    case R_PARISC_DIR32:
585    case R_PARISC_DIR64:
586    case R_HPPA_ABS_CALL:
587      switch (format)
588	{
589	case 14:
590	  switch (field)
591	    {
592	    case e_fsel:
593	      final_type = R_PARISC_DIR14F;
594	      break;
595	    case e_rsel:
596	    case e_rrsel:
597	    case e_rdsel:
598	      final_type = R_PARISC_DIR14R;
599	      break;
600	    case e_rtsel:
601	      final_type = R_PARISC_DLTIND14R;
602	      break;
603	    case e_rtpsel:
604	      final_type = R_PARISC_LTOFF_FPTR14DR;
605	      break;
606	    case e_tsel:
607	      final_type = R_PARISC_DLTIND14F;
608	      break;
609	    case e_rpsel:
610	      final_type = R_PARISC_PLABEL14R;
611	      break;
612	    default:
613	      return R_PARISC_NONE;
614	    }
615	  break;
616
617	case 17:
618	  switch (field)
619	    {
620	    case e_fsel:
621	      final_type = R_PARISC_DIR17F;
622	      break;
623	    case e_rsel:
624	    case e_rrsel:
625	    case e_rdsel:
626	      final_type = R_PARISC_DIR17R;
627	      break;
628	    default:
629	      return R_PARISC_NONE;
630	    }
631	  break;
632
633	case 21:
634	  switch (field)
635	    {
636	    case e_lsel:
637	    case e_lrsel:
638	    case e_ldsel:
639	    case e_nlsel:
640	    case e_nlrsel:
641	      final_type = R_PARISC_DIR21L;
642	      break;
643	    case e_ltsel:
644	      final_type = R_PARISC_DLTIND21L;
645	      break;
646	    case e_ltpsel:
647	      final_type = R_PARISC_LTOFF_FPTR21L;
648	      break;
649	    case e_lpsel:
650	      final_type = R_PARISC_PLABEL21L;
651	      break;
652	    default:
653	      return R_PARISC_NONE;
654	    }
655	  break;
656
657	case 32:
658	  switch (field)
659	    {
660	    case e_fsel:
661	      final_type = R_PARISC_DIR32;
662	      /* When in 64bit mode, a 32bit relocation is supposed to
663		 be a section relative relocation.  Dwarf2 (for example)
664		 uses 32bit section relative relocations.  */
665	      if (bfd_get_arch_info (abfd)->bits_per_address != 32)
666		final_type = R_PARISC_SECREL32;
667	      break;
668	    case e_psel:
669	      final_type = R_PARISC_PLABEL32;
670	      break;
671	    default:
672	      return R_PARISC_NONE;
673	    }
674	  break;
675
676	case 64:
677	  switch (field)
678	    {
679	    case e_fsel:
680	      final_type = R_PARISC_DIR64;
681	      break;
682	    case e_psel:
683	      final_type = R_PARISC_FPTR64;
684	      break;
685	    default:
686	      return R_PARISC_NONE;
687	    }
688	  break;
689
690	default:
691	  return R_PARISC_NONE;
692	}
693      break;
694
695    case R_HPPA_GOTOFF:
696      switch (format)
697	{
698	case 14:
699	  switch (field)
700	    {
701	    case e_rsel:
702	    case e_rrsel:
703	    case e_rdsel:
704	      /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32  */
705	      final_type = base_type + OFFSET_14R_FROM_21L;
706	      break;
707	    case e_fsel:
708	      /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32  */
709	      final_type = base_type + OFFSET_14F_FROM_21L;
710	      break;
711	    default:
712	      return R_PARISC_NONE;
713	    }
714	  break;
715
716	case 21:
717	  switch (field)
718	    {
719	    case e_lsel:
720	    case e_lrsel:
721	    case e_ldsel:
722	    case e_nlsel:
723	    case e_nlrsel:
724	      /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32  */
725	      final_type = base_type;
726	      break;
727	    default:
728	      return R_PARISC_NONE;
729	    }
730	  break;
731
732	default:
733	  return R_PARISC_NONE;
734	}
735      break;
736
737    case R_HPPA_PCREL_CALL:
738      switch (format)
739	{
740	case 12:
741	  switch (field)
742	    {
743	    case e_fsel:
744	      final_type = R_PARISC_PCREL12F;
745	      break;
746	    default:
747	      return R_PARISC_NONE;
748	    }
749	  break;
750
751	case 14:
752	  /* Contrary to appearances, these are not calls of any sort.
753	     Rather, they are loads/stores with a pcrel reloc.  */
754	  switch (field)
755	    {
756	    case e_rsel:
757	    case e_rrsel:
758	    case e_rdsel:
759	      final_type = R_PARISC_PCREL14R;
760	      break;
761	    case e_fsel:
762	      if (bfd_get_mach (abfd) < 25)
763		final_type = R_PARISC_PCREL14F;
764	      else
765		final_type = R_PARISC_PCREL16F;
766	      break;
767	    default:
768	      return R_PARISC_NONE;
769	    }
770	  break;
771
772	case 17:
773	  switch (field)
774	    {
775	    case e_rsel:
776	    case e_rrsel:
777	    case e_rdsel:
778	      final_type = R_PARISC_PCREL17R;
779	      break;
780	    case e_fsel:
781	      final_type = R_PARISC_PCREL17F;
782	      break;
783	    default:
784	      return R_PARISC_NONE;
785	    }
786	  break;
787
788	case 21:
789	  switch (field)
790	    {
791	    case e_lsel:
792	    case e_lrsel:
793	    case e_ldsel:
794	    case e_nlsel:
795	    case e_nlrsel:
796	      final_type = R_PARISC_PCREL21L;
797	      break;
798	    default:
799	      return R_PARISC_NONE;
800	    }
801	  break;
802
803	case 22:
804	  switch (field)
805	    {
806	    case e_fsel:
807	      final_type = R_PARISC_PCREL22F;
808	      break;
809	    default:
810	      return R_PARISC_NONE;
811	    }
812	  break;
813
814	case 32:
815	  switch (field)
816	    {
817	    case e_fsel:
818	      final_type = R_PARISC_PCREL32;
819	      break;
820	    default:
821	      return R_PARISC_NONE;
822	    }
823	  break;
824
825	case 64:
826	  switch (field)
827	    {
828	    case e_fsel:
829	      final_type = R_PARISC_PCREL64;
830	      break;
831	    default:
832	      return R_PARISC_NONE;
833	    }
834	  break;
835
836	default:
837	  return R_PARISC_NONE;
838	}
839      break;
840
841    case R_PARISC_GNU_VTENTRY:
842    case R_PARISC_GNU_VTINHERIT:
843    case R_PARISC_SEGREL32:
844    case R_PARISC_SEGBASE:
845      /* The defaults are fine for these cases.  */
846      break;
847
848    default:
849      return R_PARISC_NONE;
850    }
851
852  return final_type;
853}
854
855/* Return one (or more) BFD relocations which implement the base
856   relocation with modifications based on format and field.  */
857
858elf_hppa_reloc_type **
859_bfd_elf_hppa_gen_reloc_type (bfd *abfd,
860			      elf_hppa_reloc_type base_type,
861			      int format,
862			      unsigned int field,
863			      int ignore ATTRIBUTE_UNUSED,
864			      asymbol *sym ATTRIBUTE_UNUSED)
865{
866  elf_hppa_reloc_type *finaltype;
867  elf_hppa_reloc_type **final_types;
868  bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
869
870  /* Allocate slots for the BFD relocation.  */
871  final_types = bfd_alloc (abfd, amt);
872  if (final_types == NULL)
873    return NULL;
874
875  /* Allocate space for the relocation itself.  */
876  amt = sizeof (elf_hppa_reloc_type);
877  finaltype = bfd_alloc (abfd, amt);
878  if (finaltype == NULL)
879    return NULL;
880
881  /* Some reasonable defaults.  */
882  final_types[0] = finaltype;
883  final_types[1] = NULL;
884
885  *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
886
887  return final_types;
888}
889
890/* Translate from an elf into field into a howto relocation pointer.  */
891
892static void
893elf_hppa_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
894			arelent *bfd_reloc,
895			Elf_Internal_Rela *elf_reloc)
896{
897  BFD_ASSERT (ELF_R_TYPE (elf_reloc->r_info)
898	      < (unsigned int) R_PARISC_UNIMPLEMENTED);
899  bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
900}
901
902/* Translate from an elf into field into a howto relocation pointer.  */
903
904static void
905elf_hppa_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
906			    arelent *bfd_reloc,
907			    Elf_Internal_Rela *elf_reloc)
908{
909  BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
910	      < (unsigned int) R_PARISC_UNIMPLEMENTED);
911  bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
912}
913
914/* Return the address of the howto table entry to perform the CODE
915   relocation for an ARCH machine.  */
916
917static reloc_howto_type *
918elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
919			    bfd_reloc_code_real_type code)
920{
921  if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
922    {
923      BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
924      return &elf_hppa_howto_table[(int) code];
925    }
926  return NULL;
927}
928
929/* Return TRUE if SYM represents a local label symbol.  */
930
931static bfd_boolean
932elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
933{
934  if (name[0] == 'L' && name[1] == '$')
935    return 1;
936  return _bfd_elf_is_local_label_name (abfd, name);
937}
938
939/* Set the correct type for an ELF section.  We do this by the
940   section name, which is a hack, but ought to work.  */
941
942static bfd_boolean
943elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
944{
945  const char *name;
946
947  name = bfd_get_section_name (abfd, sec);
948
949  if (strcmp (name, ".PARISC.unwind") == 0)
950    {
951      int indx;
952      asection *asec;
953#if ARCH_SIZE == 64
954      hdr->sh_type = SHT_LOPROC + 1;
955#else
956      hdr->sh_type = 1;
957#endif
958      /* ?!? How are unwinds supposed to work for symbols in arbitrary
959	 sections?  Or what if we have multiple .text sections in a single
960	 .o file?  HP really messed up on this one.
961
962	 Ugh.  We can not use elf_section_data (sec)->this_idx at this
963	 point because it is not initialized yet.
964
965	 So we (gasp) recompute it here.  Hopefully nobody ever changes the
966	 way sections are numbered in elf.c!  */
967      for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
968	{
969	  if (asec->name && strcmp (asec->name, ".text") == 0)
970	    {
971	      hdr->sh_info = indx;
972	      break;
973	    }
974	}
975
976      /* I have no idea if this is really necessary or what it means.  */
977      hdr->sh_entsize = 4;
978    }
979  return TRUE;
980}
981
982static void
983elf_hppa_final_write_processing (bfd *abfd,
984				 bfd_boolean linker ATTRIBUTE_UNUSED)
985{
986  int mach = bfd_get_mach (abfd);
987
988  elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
989				     | EF_PARISC_EXT | EF_PARISC_LSB
990				     | EF_PARISC_WIDE | EF_PARISC_NO_KABP
991				     | EF_PARISC_LAZYSWAP);
992
993  if (mach == 10)
994    elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
995  else if (mach == 11)
996    elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
997  else if (mach == 20)
998    elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
999  else if (mach == 25)
1000    elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
1001				      | EFA_PARISC_2_0
1002				      /* The GNU tools have trapped without
1003					 option since 1993, so need to take
1004					 a step backwards with the ELF
1005					 based toolchains.  */
1006				      | EF_PARISC_TRAPNIL);
1007}
1008
1009/* Comparison function for qsort to sort unwind section during a
1010   final link.  */
1011
1012static int
1013hppa_unwind_entry_compare (const void *a, const void *b)
1014{
1015  const bfd_byte *ap, *bp;
1016  unsigned long av, bv;
1017
1018  ap = a;
1019  av = (unsigned long) ap[0] << 24;
1020  av |= (unsigned long) ap[1] << 16;
1021  av |= (unsigned long) ap[2] << 8;
1022  av |= (unsigned long) ap[3];
1023
1024  bp = b;
1025  bv = (unsigned long) bp[0] << 24;
1026  bv |= (unsigned long) bp[1] << 16;
1027  bv |= (unsigned long) bp[2] << 8;
1028  bv |= (unsigned long) bp[3];
1029
1030  return av < bv ? -1 : av > bv ? 1 : 0;
1031}
1032
1033static bfd_boolean elf_hppa_sort_unwind (bfd *abfd)
1034{
1035  asection *s;
1036
1037  /* Magic section names, but this is much safer than having
1038     relocate_section remember where SEGREL32 relocs occurred.
1039     Consider what happens if someone inept creates a linker script
1040     that puts unwind information in .text.  */
1041  s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
1042  if (s != NULL)
1043    {
1044      bfd_size_type size;
1045      bfd_byte *contents;
1046
1047      if (!bfd_malloc_and_get_section (abfd, s, &contents))
1048	return FALSE;
1049
1050      size = s->size;
1051      qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
1052
1053      if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
1054	return FALSE;
1055    }
1056
1057  return TRUE;
1058}
1059
1060#if ARCH_SIZE == 64
1061/* Hook called by the linker routine which adds symbols from an object
1062   file.  HP's libraries define symbols with HP specific section
1063   indices, which we have to handle.  */
1064
1065static bfd_boolean
1066elf_hppa_add_symbol_hook (bfd *abfd,
1067			  struct bfd_link_info *info ATTRIBUTE_UNUSED,
1068			  Elf_Internal_Sym *sym,
1069			  const char **namep ATTRIBUTE_UNUSED,
1070			  flagword *flagsp ATTRIBUTE_UNUSED,
1071			  asection **secp,
1072			  bfd_vma *valp)
1073{
1074  int index = sym->st_shndx;
1075
1076  switch (index)
1077    {
1078    case SHN_PARISC_ANSI_COMMON:
1079      *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
1080      (*secp)->flags |= SEC_IS_COMMON;
1081      *valp = sym->st_size;
1082      break;
1083
1084    case SHN_PARISC_HUGE_COMMON:
1085      *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
1086      (*secp)->flags |= SEC_IS_COMMON;
1087      *valp = sym->st_size;
1088      break;
1089    }
1090
1091  return TRUE;
1092}
1093
1094static bfd_boolean
1095elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1096					 void *data)
1097{
1098  struct bfd_link_info *info = data;
1099
1100  if (h->root.type == bfd_link_hash_warning)
1101    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1102
1103  /* If we are not creating a shared library, and this symbol is
1104     referenced by a shared library but is not defined anywhere, then
1105     the generic code will warn that it is undefined.
1106
1107     This behavior is undesirable on HPs since the standard shared
1108     libraries contain references to undefined symbols.
1109
1110     So we twiddle the flags associated with such symbols so that they
1111     will not trigger the warning.  ?!? FIXME.  This is horribly fragile.
1112
1113     Ultimately we should have better controls over the generic ELF BFD
1114     linker code.  */
1115  if (! info->relocatable
1116      && info->unresolved_syms_in_shared_libs != RM_IGNORE
1117      && h->root.type == bfd_link_hash_undefined
1118      && h->ref_dynamic
1119      && !h->ref_regular)
1120    {
1121      h->ref_dynamic = 0;
1122      h->pointer_equality_needed = 1;
1123    }
1124
1125  return TRUE;
1126}
1127
1128static bfd_boolean
1129elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1130					 void *data)
1131{
1132  struct bfd_link_info *info = data;
1133
1134  if (h->root.type == bfd_link_hash_warning)
1135    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1136
1137  /* If we are not creating a shared library, and this symbol is
1138     referenced by a shared library but is not defined anywhere, then
1139     the generic code will warn that it is undefined.
1140
1141     This behavior is undesirable on HPs since the standard shared
1142     libraries contain references to undefined symbols.
1143
1144     So we twiddle the flags associated with such symbols so that they
1145     will not trigger the warning.  ?!? FIXME.  This is horribly fragile.
1146
1147     Ultimately we should have better controls over the generic ELF BFD
1148     linker code.  */
1149  if (! info->relocatable
1150      && info->unresolved_syms_in_shared_libs != RM_IGNORE
1151      && h->root.type == bfd_link_hash_undefined
1152      && !h->ref_dynamic
1153      && !h->ref_regular
1154      && h->pointer_equality_needed)
1155    {
1156      h->ref_dynamic = 1;
1157      h->pointer_equality_needed = 0;
1158    }
1159
1160  return TRUE;
1161}
1162
1163static bfd_boolean
1164elf_hppa_is_dynamic_loader_symbol (const char *name)
1165{
1166  return (! strcmp (name, "__CPU_REVISION")
1167	  || ! strcmp (name, "__CPU_KEYBITS_1")
1168	  || ! strcmp (name, "__SYSTEM_ID_D")
1169	  || ! strcmp (name, "__FPU_MODEL")
1170	  || ! strcmp (name, "__FPU_REVISION")
1171	  || ! strcmp (name, "__ARGC")
1172	  || ! strcmp (name, "__ARGV")
1173	  || ! strcmp (name, "__ENVP")
1174	  || ! strcmp (name, "__TLS_SIZE_D")
1175	  || ! strcmp (name, "__LOAD_INFO")
1176	  || ! strcmp (name, "__systab"));
1177}
1178
1179/* Record the lowest address for the data and text segments.  */
1180static void
1181elf_hppa_record_segment_addrs (bfd *abfd ATTRIBUTE_UNUSED,
1182			       asection *section,
1183			       void *data)
1184{
1185  struct elf64_hppa_link_hash_table *hppa_info;
1186  bfd_vma value;
1187
1188  hppa_info = data;
1189
1190  value = section->vma - section->filepos;
1191
1192  if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1193       == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1194      && value < hppa_info->text_segment_base)
1195    hppa_info->text_segment_base = value;
1196  else if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1197	    == (SEC_ALLOC | SEC_LOAD))
1198	   && value < hppa_info->data_segment_base)
1199    hppa_info->data_segment_base = value;
1200}
1201
1202/* Called after we have seen all the input files/sections, but before
1203   final symbol resolution and section placement has been determined.
1204
1205   We use this hook to (possibly) provide a value for __gp, then we
1206   fall back to the generic ELF final link routine.  */
1207
1208static bfd_boolean
1209elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
1210{
1211  bfd_boolean retval;
1212  struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1213
1214  if (! info->relocatable)
1215    {
1216      struct elf_link_hash_entry *gp;
1217      bfd_vma gp_val;
1218
1219      /* The linker script defines a value for __gp iff it was referenced
1220	 by one of the objects being linked.  First try to find the symbol
1221	 in the hash table.  If that fails, just compute the value __gp
1222	 should have had.  */
1223      gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
1224				 FALSE, FALSE);
1225
1226      if (gp)
1227	{
1228
1229	  /* Adjust the value of __gp as we may want to slide it into the
1230	     .plt section so that the stubs can access PLT entries without
1231	     using an addil sequence.  */
1232	  gp->root.u.def.value += hppa_info->gp_offset;
1233
1234	  gp_val = (gp->root.u.def.section->output_section->vma
1235		    + gp->root.u.def.section->output_offset
1236		    + gp->root.u.def.value);
1237	}
1238      else
1239	{
1240	  asection *sec;
1241
1242	  /* First look for a .plt section.  If found, then __gp is the
1243	     address of the .plt + gp_offset.
1244
1245	     If no .plt is found, then look for .dlt, .opd and .data (in
1246	     that order) and set __gp to the base address of whichever
1247	     section is found first.  */
1248
1249	  sec = hppa_info->plt_sec;
1250	  if (sec && ! (sec->flags & SEC_EXCLUDE))
1251	    gp_val = (sec->output_offset
1252		      + sec->output_section->vma
1253		      + hppa_info->gp_offset);
1254	  else
1255	    {
1256	      sec = hppa_info->dlt_sec;
1257	      if (!sec || (sec->flags & SEC_EXCLUDE))
1258		sec = hppa_info->opd_sec;
1259	      if (!sec || (sec->flags & SEC_EXCLUDE))
1260		sec = bfd_get_section_by_name (abfd, ".data");
1261	      if (!sec || (sec->flags & SEC_EXCLUDE))
1262		return FALSE;
1263
1264	      gp_val = sec->output_offset + sec->output_section->vma;
1265	    }
1266	}
1267
1268      /* Install whatever value we found/computed for __gp.  */
1269      _bfd_set_gp_value (abfd, gp_val);
1270    }
1271
1272  /* We need to know the base of the text and data segments so that we
1273     can perform SEGREL relocations.  We will record the base addresses
1274     when we encounter the first SEGREL relocation.  */
1275  hppa_info->text_segment_base = (bfd_vma)-1;
1276  hppa_info->data_segment_base = (bfd_vma)-1;
1277
1278  /* HP's shared libraries have references to symbols that are not
1279     defined anywhere.  The generic ELF BFD linker code will complain
1280     about such symbols.
1281
1282     So we detect the losing case and arrange for the flags on the symbol
1283     to indicate that it was never referenced.  This keeps the generic
1284     ELF BFD link code happy and appears to not create any secondary
1285     problems.  Ultimately we need a way to control the behavior of the
1286     generic ELF BFD link code better.  */
1287  elf_link_hash_traverse (elf_hash_table (info),
1288			  elf_hppa_unmark_useless_dynamic_symbols,
1289			  info);
1290
1291  /* Invoke the regular ELF backend linker to do all the work.  */
1292  retval = bfd_elf_final_link (abfd, info);
1293
1294  elf_link_hash_traverse (elf_hash_table (info),
1295			  elf_hppa_remark_useless_dynamic_symbols,
1296			  info);
1297
1298  /* If we're producing a final executable, sort the contents of the
1299     unwind section. */
1300  if (retval)
1301    retval = elf_hppa_sort_unwind (abfd);
1302
1303  return retval;
1304}
1305
1306/* Relocate an HPPA ELF section.  */
1307
1308static bfd_boolean
1309elf_hppa_relocate_section (bfd *output_bfd,
1310			   struct bfd_link_info *info,
1311			   bfd *input_bfd,
1312			   asection *input_section,
1313			   bfd_byte *contents,
1314			   Elf_Internal_Rela *relocs,
1315			   Elf_Internal_Sym *local_syms,
1316			   asection **local_sections)
1317{
1318  Elf_Internal_Shdr *symtab_hdr;
1319  Elf_Internal_Rela *rel;
1320  Elf_Internal_Rela *relend;
1321  struct elf64_hppa_link_hash_table *hppa_info;
1322
1323  if (info->relocatable)
1324    return TRUE;
1325
1326  hppa_info = elf64_hppa_hash_table (info);
1327  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1328
1329  rel = relocs;
1330  relend = relocs + input_section->reloc_count;
1331  for (; rel < relend; rel++)
1332    {
1333      int r_type;
1334      reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1335      unsigned long r_symndx;
1336      struct elf_link_hash_entry *h;
1337      Elf_Internal_Sym *sym;
1338      asection *sym_sec;
1339      bfd_vma relocation;
1340      bfd_reloc_status_type r;
1341      const char *sym_name;
1342      const char *dyn_name;
1343      char *dynh_buf = NULL;
1344      size_t dynh_buflen = 0;
1345      struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
1346
1347      r_type = ELF_R_TYPE (rel->r_info);
1348      if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
1349	{
1350	  bfd_set_error (bfd_error_bad_value);
1351	  return FALSE;
1352	}
1353
1354      /* This is a final link.  */
1355      r_symndx = ELF_R_SYM (rel->r_info);
1356      h = NULL;
1357      sym = NULL;
1358      sym_sec = NULL;
1359      if (r_symndx < symtab_hdr->sh_info)
1360	{
1361	  /* This is a local symbol.  */
1362	  sym = local_syms + r_symndx;
1363	  sym_sec = local_sections[r_symndx];
1364	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
1365
1366	  /* If this symbol has an entry in the PA64 dynamic hash
1367	     table, then get it.  */
1368	  dyn_name = get_dyn_name (input_bfd, h, rel,
1369				   &dynh_buf, &dynh_buflen);
1370	  dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1371					      dyn_name, FALSE, FALSE);
1372
1373	}
1374      else
1375	{
1376	  /* This is not a local symbol.  */
1377	  long indx;
1378
1379	  indx = r_symndx - symtab_hdr->sh_info;
1380	  h = elf_sym_hashes (input_bfd)[indx];
1381	  while (h->root.type == bfd_link_hash_indirect
1382		 || h->root.type == bfd_link_hash_warning)
1383	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1384	  if (h->root.type == bfd_link_hash_defined
1385	      || h->root.type == bfd_link_hash_defweak)
1386	    {
1387	      sym_sec = h->root.u.def.section;
1388
1389	      /* If this symbol has an entry in the PA64 dynamic hash
1390		 table, then get it.  */
1391	      dyn_name = get_dyn_name (input_bfd, h, rel,
1392				       &dynh_buf, &dynh_buflen);
1393	      dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1394						  dyn_name, FALSE, FALSE);
1395
1396	      /* If we have a relocation against a symbol defined in a
1397		 shared library and we have not created an entry in the
1398		 PA64 dynamic symbol hash table for it, then we lose.  */
1399	      if (sym_sec->output_section == NULL && dyn_h == NULL)
1400		{
1401		  (*_bfd_error_handler)
1402		    (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
1403		     input_bfd, input_section, h->root.root.string);
1404		  relocation = 0;
1405		}
1406	      else if (sym_sec->output_section)
1407		relocation = (h->root.u.def.value
1408			      + sym_sec->output_offset
1409			      + sym_sec->output_section->vma);
1410	      /* Value will be provided via one of the offsets in the
1411		 dyn_h hash table entry.  */
1412	      else
1413		relocation = 0;
1414	    }
1415	  else if (info->unresolved_syms_in_objects == RM_IGNORE
1416		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1417	    {
1418	      /* If this symbol has an entry in the PA64 dynamic hash
1419		 table, then get it.  */
1420	      dyn_name = get_dyn_name (input_bfd, h, rel,
1421				       &dynh_buf, &dynh_buflen);
1422	      dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1423						  dyn_name, FALSE, FALSE);
1424
1425	      if (dyn_h == NULL)
1426		{
1427		  (*_bfd_error_handler)
1428		    (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
1429		     input_bfd, input_section, h->root.root.string);
1430		}
1431	      relocation = 0;
1432	    }
1433	  else if (h->root.type == bfd_link_hash_undefweak)
1434            {
1435	      dyn_name = get_dyn_name (input_bfd, h, rel,
1436				       &dynh_buf, &dynh_buflen);
1437	      dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1438						  dyn_name, FALSE, FALSE);
1439
1440	      if (dyn_h == NULL)
1441		{
1442		  (*_bfd_error_handler)
1443		    (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
1444		     input_bfd, input_section, h->root.root.string);
1445		}
1446	      relocation = 0;
1447	    }
1448	  else
1449	    {
1450	      /* Ignore dynamic loader defined symbols.  */
1451	      if (elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
1452		relocation = 0;
1453	      else
1454		{
1455		  if (!((*info->callbacks->undefined_symbol)
1456			(info, h->root.root.string, input_bfd,
1457			 input_section, rel->r_offset,
1458			 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
1459			  || ELF_ST_VISIBILITY (h->other)))))
1460		    return FALSE;
1461		  break;
1462		}
1463	    }
1464	}
1465
1466      if (h != NULL)
1467	sym_name = h->root.root.string;
1468      else
1469	{
1470	  sym_name = bfd_elf_string_from_elf_section (input_bfd,
1471						      symtab_hdr->sh_link,
1472						      sym->st_name);
1473	  if (sym_name == NULL)
1474	    return FALSE;
1475	  if (*sym_name == '\0')
1476	    sym_name = bfd_section_name (input_bfd, sym_sec);
1477	}
1478
1479      r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1480					input_section, contents,
1481					relocation, info, sym_sec,
1482					h, dyn_h);
1483
1484      if (r != bfd_reloc_ok)
1485	{
1486	  switch (r)
1487	    {
1488	    default:
1489	      abort ();
1490	    case bfd_reloc_overflow:
1491	      {
1492		if (!((*info->callbacks->reloc_overflow)
1493		      (info, sym_name, howto->name, (bfd_vma) 0,
1494			input_bfd, input_section, rel->r_offset)))
1495		  return FALSE;
1496	      }
1497	      break;
1498	    }
1499	}
1500    }
1501  return TRUE;
1502}
1503
1504/* Compute the value for a relocation (REL) during a final link stage,
1505   then insert the value into the proper location in CONTENTS.
1506
1507   VALUE is a tentative value for the relocation and may be overridden
1508   and modified here based on the specific relocation to be performed.
1509
1510   For example we do conversions for PC-relative branches in this routine
1511   or redirection of calls to external routines to stubs.
1512
1513   The work of actually applying the relocation is left to a helper
1514   routine in an attempt to reduce the complexity and size of this
1515   function.  */
1516
1517static bfd_reloc_status_type
1518elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
1519			      bfd *input_bfd,
1520			      bfd *output_bfd,
1521			      asection *input_section,
1522			      bfd_byte *contents,
1523			      bfd_vma value,
1524			      struct bfd_link_info *info,
1525			      asection *sym_sec,
1526			      struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
1527			      struct elf64_hppa_dyn_hash_entry *dyn_h)
1528{
1529  int insn;
1530  bfd_vma offset = rel->r_offset;
1531  bfd_signed_vma addend = rel->r_addend;
1532  reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1533  unsigned int r_type = howto->type;
1534  bfd_byte *hit_data = contents + offset;
1535  struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1536
1537  insn = bfd_get_32 (input_bfd, hit_data);
1538
1539  switch (r_type)
1540    {
1541    case R_PARISC_NONE:
1542      break;
1543
1544    /* Basic function call support.
1545
1546       Note for a call to a function defined in another dynamic library
1547       we want to redirect the call to a stub.  */
1548
1549    /* Random PC relative relocs.  */
1550    case R_PARISC_PCREL21L:
1551    case R_PARISC_PCREL14R:
1552    case R_PARISC_PCREL14F:
1553    case R_PARISC_PCREL14WR:
1554    case R_PARISC_PCREL14DR:
1555    case R_PARISC_PCREL16F:
1556    case R_PARISC_PCREL16WF:
1557    case R_PARISC_PCREL16DF:
1558      {
1559	/* If this is a call to a function defined in another dynamic
1560	   library, then redirect the call to the local stub for this
1561	   function.  */
1562	if (sym_sec == NULL || sym_sec->output_section == NULL)
1563	  value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1564		   + hppa_info->stub_sec->output_section->vma);
1565
1566	/* Turn VALUE into a proper PC relative address.  */
1567	value -= (offset + input_section->output_offset
1568		  + input_section->output_section->vma);
1569
1570	/* Adjust for any field selectors.  */
1571	if (r_type == R_PARISC_PCREL21L)
1572	  value = hppa_field_adjust (value, -8 + addend, e_lsel);
1573	else if (r_type == R_PARISC_PCREL14F
1574		 || r_type == R_PARISC_PCREL16F
1575		 || r_type == R_PARISC_PCREL16WF
1576		 || r_type == R_PARISC_PCREL16DF)
1577	  value = hppa_field_adjust (value, -8 + addend, e_fsel);
1578	else
1579	  value = hppa_field_adjust (value, -8 + addend, e_rsel);
1580
1581	/* Apply the relocation to the given instruction.  */
1582	insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1583	break;
1584      }
1585
1586    case R_PARISC_PCREL12F:
1587    case R_PARISC_PCREL22F:
1588    case R_PARISC_PCREL17F:
1589    case R_PARISC_PCREL22C:
1590    case R_PARISC_PCREL17C:
1591    case R_PARISC_PCREL17R:
1592      {
1593	/* If this is a call to a function defined in another dynamic
1594	   library, then redirect the call to the local stub for this
1595	   function.  */
1596	if (sym_sec == NULL || sym_sec->output_section == NULL)
1597	  value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1598		   + hppa_info->stub_sec->output_section->vma);
1599
1600	/* Turn VALUE into a proper PC relative address.  */
1601	value -= (offset + input_section->output_offset
1602		  + input_section->output_section->vma);
1603
1604	/* Adjust for any field selectors.  */
1605	if (r_type == R_PARISC_PCREL17R)
1606	  value = hppa_field_adjust (value, -8 + addend, e_rsel);
1607	else
1608	  value = hppa_field_adjust (value, -8 + addend, e_fsel);
1609
1610	/* All branches are implicitly shifted by 2 places.  */
1611	value >>= 2;
1612
1613	/* Apply the relocation to the given instruction.  */
1614	insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1615	break;
1616      }
1617
1618    /* Indirect references to data through the DLT.  */
1619    case R_PARISC_DLTIND14R:
1620    case R_PARISC_DLTIND14F:
1621    case R_PARISC_DLTIND14DR:
1622    case R_PARISC_DLTIND14WR:
1623    case R_PARISC_DLTIND21L:
1624    case R_PARISC_LTOFF_FPTR14R:
1625    case R_PARISC_LTOFF_FPTR14DR:
1626    case R_PARISC_LTOFF_FPTR14WR:
1627    case R_PARISC_LTOFF_FPTR21L:
1628    case R_PARISC_LTOFF_FPTR16F:
1629    case R_PARISC_LTOFF_FPTR16WF:
1630    case R_PARISC_LTOFF_FPTR16DF:
1631    case R_PARISC_LTOFF_TP21L:
1632    case R_PARISC_LTOFF_TP14R:
1633    case R_PARISC_LTOFF_TP14F:
1634    case R_PARISC_LTOFF_TP14WR:
1635    case R_PARISC_LTOFF_TP14DR:
1636    case R_PARISC_LTOFF_TP16F:
1637    case R_PARISC_LTOFF_TP16WF:
1638    case R_PARISC_LTOFF_TP16DF:
1639    case R_PARISC_LTOFF16F:
1640    case R_PARISC_LTOFF16WF:
1641    case R_PARISC_LTOFF16DF:
1642      {
1643	/* If this relocation was against a local symbol, then we still
1644	   have not set up the DLT entry (it's not convenient to do so
1645	   in the "finalize_dlt" routine because it is difficult to get
1646	   to the local symbol's value).
1647
1648	   So, if this is a local symbol (h == NULL), then we need to
1649	   fill in its DLT entry.
1650
1651	   Similarly we may still need to set up an entry in .opd for
1652	   a local function which had its address taken.  */
1653	if (dyn_h->h == NULL)
1654	  {
1655	    /* Now do .opd creation if needed.  */
1656	    if (r_type == R_PARISC_LTOFF_FPTR14R
1657		|| r_type == R_PARISC_LTOFF_FPTR14DR
1658		|| r_type == R_PARISC_LTOFF_FPTR14WR
1659		|| r_type == R_PARISC_LTOFF_FPTR21L
1660		|| r_type == R_PARISC_LTOFF_FPTR16F
1661		|| r_type == R_PARISC_LTOFF_FPTR16WF
1662		|| r_type == R_PARISC_LTOFF_FPTR16DF)
1663	      {
1664		/* The first two words of an .opd entry are zero.  */
1665		memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1666			0, 16);
1667
1668		/* The next word is the address of the function.  */
1669		bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1670			    (hppa_info->opd_sec->contents
1671			     + dyn_h->opd_offset + 16));
1672
1673		/* The last word is our local __gp value.  */
1674		value = _bfd_get_gp_value
1675			  (hppa_info->opd_sec->output_section->owner);
1676		bfd_put_64 (hppa_info->opd_sec->owner, value,
1677			    (hppa_info->opd_sec->contents
1678			     + dyn_h->opd_offset + 24));
1679
1680		/* The DLT value is the address of the .opd entry.  */
1681		value = (dyn_h->opd_offset
1682			 + hppa_info->opd_sec->output_offset
1683			 + hppa_info->opd_sec->output_section->vma);
1684		addend = 0;
1685	      }
1686
1687	    bfd_put_64 (hppa_info->dlt_sec->owner,
1688			value + addend,
1689			hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1690	  }
1691
1692	/* We want the value of the DLT offset for this symbol, not
1693	   the symbol's actual address.  Note that __gp may not point
1694	   to the start of the DLT, so we have to compute the absolute
1695	   address, then subtract out the value of __gp.  */
1696	value = (dyn_h->dlt_offset
1697		 + hppa_info->dlt_sec->output_offset
1698		 + hppa_info->dlt_sec->output_section->vma);
1699	value -= _bfd_get_gp_value (output_bfd);
1700
1701	/* All DLTIND relocations are basically the same at this point,
1702	   except that we need different field selectors for the 21bit
1703	   version vs the 14bit versions.  */
1704	if (r_type == R_PARISC_DLTIND21L
1705	    || r_type == R_PARISC_LTOFF_FPTR21L
1706	    || r_type == R_PARISC_LTOFF_TP21L)
1707	  value = hppa_field_adjust (value, 0, e_lsel);
1708	else if (r_type == R_PARISC_DLTIND14F
1709		 || r_type == R_PARISC_LTOFF_FPTR16F
1710		 || r_type == R_PARISC_LTOFF_FPTR16WF
1711		 || r_type == R_PARISC_LTOFF_FPTR16DF
1712		 || r_type == R_PARISC_LTOFF16F
1713		 || r_type == R_PARISC_LTOFF16DF
1714		 || r_type == R_PARISC_LTOFF16WF
1715		 || r_type == R_PARISC_LTOFF_TP16F
1716		 || r_type == R_PARISC_LTOFF_TP16WF
1717		 || r_type == R_PARISC_LTOFF_TP16DF)
1718	  value = hppa_field_adjust (value, 0, e_fsel);
1719	else
1720	  value = hppa_field_adjust (value, 0, e_rsel);
1721
1722	insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1723	break;
1724      }
1725
1726    case R_PARISC_DLTREL14R:
1727    case R_PARISC_DLTREL14F:
1728    case R_PARISC_DLTREL14DR:
1729    case R_PARISC_DLTREL14WR:
1730    case R_PARISC_DLTREL21L:
1731    case R_PARISC_DPREL21L:
1732    case R_PARISC_DPREL14WR:
1733    case R_PARISC_DPREL14DR:
1734    case R_PARISC_DPREL14R:
1735    case R_PARISC_DPREL14F:
1736    case R_PARISC_GPREL16F:
1737    case R_PARISC_GPREL16WF:
1738    case R_PARISC_GPREL16DF:
1739      {
1740	/* Subtract out the global pointer value to make value a DLT
1741	   relative address.  */
1742	value -= _bfd_get_gp_value (output_bfd);
1743
1744	/* All DLTREL relocations are basically the same at this point,
1745	   except that we need different field selectors for the 21bit
1746	   version vs the 14bit versions.  */
1747	if (r_type == R_PARISC_DLTREL21L
1748	    || r_type == R_PARISC_DPREL21L)
1749	  value = hppa_field_adjust (value, addend, e_lrsel);
1750	else if (r_type == R_PARISC_DLTREL14F
1751		 || r_type == R_PARISC_DPREL14F
1752		 || r_type == R_PARISC_GPREL16F
1753		 || r_type == R_PARISC_GPREL16WF
1754		 || r_type == R_PARISC_GPREL16DF)
1755	  value = hppa_field_adjust (value, addend, e_fsel);
1756	else
1757	  value = hppa_field_adjust (value, addend, e_rrsel);
1758
1759	insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1760	break;
1761      }
1762
1763    case R_PARISC_DIR21L:
1764    case R_PARISC_DIR17R:
1765    case R_PARISC_DIR17F:
1766    case R_PARISC_DIR14R:
1767    case R_PARISC_DIR14F:
1768    case R_PARISC_DIR14WR:
1769    case R_PARISC_DIR14DR:
1770    case R_PARISC_DIR16F:
1771    case R_PARISC_DIR16WF:
1772    case R_PARISC_DIR16DF:
1773      {
1774	/* All DIR relocations are basically the same at this point,
1775	   except that branch offsets need to be divided by four, and
1776	   we need different field selectors.  Note that we don't
1777	   redirect absolute calls to local stubs.  */
1778
1779	if (r_type == R_PARISC_DIR21L)
1780	  value = hppa_field_adjust (value, addend, e_lrsel);
1781	else if (r_type == R_PARISC_DIR17F
1782		 || r_type == R_PARISC_DIR16F
1783		 || r_type == R_PARISC_DIR16WF
1784		 || r_type == R_PARISC_DIR16DF
1785		 || r_type == R_PARISC_DIR14F)
1786	  value = hppa_field_adjust (value, addend, e_fsel);
1787	else
1788	  value = hppa_field_adjust (value, addend, e_rrsel);
1789
1790	if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
1791	  {
1792	    /* All branches are implicitly shifted by 2 places.  */
1793	    value >>= 2;
1794	  }
1795
1796	insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1797	break;
1798      }
1799
1800    case R_PARISC_PLTOFF21L:
1801    case R_PARISC_PLTOFF14R:
1802    case R_PARISC_PLTOFF14F:
1803    case R_PARISC_PLTOFF14WR:
1804    case R_PARISC_PLTOFF14DR:
1805    case R_PARISC_PLTOFF16F:
1806    case R_PARISC_PLTOFF16WF:
1807    case R_PARISC_PLTOFF16DF:
1808      {
1809	/* We want the value of the PLT offset for this symbol, not
1810	   the symbol's actual address.  Note that __gp may not point
1811	   to the start of the DLT, so we have to compute the absolute
1812	   address, then subtract out the value of __gp.  */
1813	value = (dyn_h->plt_offset
1814		 + hppa_info->plt_sec->output_offset
1815		 + hppa_info->plt_sec->output_section->vma);
1816	value -= _bfd_get_gp_value (output_bfd);
1817
1818	/* All PLTOFF relocations are basically the same at this point,
1819	   except that we need different field selectors for the 21bit
1820	   version vs the 14bit versions.  */
1821	if (r_type == R_PARISC_PLTOFF21L)
1822	  value = hppa_field_adjust (value, addend, e_lrsel);
1823	else if (r_type == R_PARISC_PLTOFF14F
1824		 || r_type == R_PARISC_PLTOFF16F
1825		 || r_type == R_PARISC_PLTOFF16WF
1826		 || r_type == R_PARISC_PLTOFF16DF)
1827	  value = hppa_field_adjust (value, addend, e_fsel);
1828	else
1829	  value = hppa_field_adjust (value, addend, e_rrsel);
1830
1831	insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1832	break;
1833      }
1834
1835    case R_PARISC_LTOFF_FPTR32:
1836      {
1837	/* We may still need to create the FPTR itself if it was for
1838	   a local symbol.  */
1839	if (dyn_h->h == NULL)
1840	  {
1841	    /* The first two words of an .opd entry are zero.  */
1842	    memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1843
1844	    /* The next word is the address of the function.  */
1845	    bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1846			(hppa_info->opd_sec->contents
1847			 + dyn_h->opd_offset + 16));
1848
1849	    /* The last word is our local __gp value.  */
1850	    value = _bfd_get_gp_value
1851		      (hppa_info->opd_sec->output_section->owner);
1852	    bfd_put_64 (hppa_info->opd_sec->owner, value,
1853			hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1854
1855	    /* The DLT value is the address of the .opd entry.  */
1856	    value = (dyn_h->opd_offset
1857		     + hppa_info->opd_sec->output_offset
1858		     + hppa_info->opd_sec->output_section->vma);
1859
1860	    bfd_put_64 (hppa_info->dlt_sec->owner,
1861			value,
1862			hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1863	  }
1864
1865	/* We want the value of the DLT offset for this symbol, not
1866	   the symbol's actual address.  Note that __gp may not point
1867	   to the start of the DLT, so we have to compute the absolute
1868	   address, then subtract out the value of __gp.  */
1869	value = (dyn_h->dlt_offset
1870		 + hppa_info->dlt_sec->output_offset
1871		 + hppa_info->dlt_sec->output_section->vma);
1872	value -= _bfd_get_gp_value (output_bfd);
1873	bfd_put_32 (input_bfd, value, hit_data);
1874	return bfd_reloc_ok;
1875      }
1876
1877    case R_PARISC_LTOFF_FPTR64:
1878    case R_PARISC_LTOFF_TP64:
1879      {
1880	/* We may still need to create the FPTR itself if it was for
1881	   a local symbol.  */
1882	if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1883	  {
1884	    /* The first two words of an .opd entry are zero.  */
1885	    memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1886
1887	    /* The next word is the address of the function.  */
1888	    bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1889			(hppa_info->opd_sec->contents
1890			 + dyn_h->opd_offset + 16));
1891
1892	    /* The last word is our local __gp value.  */
1893	    value = _bfd_get_gp_value
1894		      (hppa_info->opd_sec->output_section->owner);
1895	    bfd_put_64 (hppa_info->opd_sec->owner, value,
1896			hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1897
1898	    /* The DLT value is the address of the .opd entry.  */
1899	    value = (dyn_h->opd_offset
1900		     + hppa_info->opd_sec->output_offset
1901		     + hppa_info->opd_sec->output_section->vma);
1902
1903	    bfd_put_64 (hppa_info->dlt_sec->owner,
1904			value,
1905			hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1906	  }
1907
1908	/* We want the value of the DLT offset for this symbol, not
1909	   the symbol's actual address.  Note that __gp may not point
1910	   to the start of the DLT, so we have to compute the absolute
1911	   address, then subtract out the value of __gp.  */
1912	value = (dyn_h->dlt_offset
1913		 + hppa_info->dlt_sec->output_offset
1914		 + hppa_info->dlt_sec->output_section->vma);
1915	value -= _bfd_get_gp_value (output_bfd);
1916	bfd_put_64 (input_bfd, value, hit_data);
1917	return bfd_reloc_ok;
1918      }
1919
1920    case R_PARISC_DIR32:
1921      bfd_put_32 (input_bfd, value + addend, hit_data);
1922      return bfd_reloc_ok;
1923
1924    case R_PARISC_DIR64:
1925      bfd_put_64 (input_bfd, value + addend, hit_data);
1926      return bfd_reloc_ok;
1927
1928    case R_PARISC_GPREL64:
1929      /* Subtract out the global pointer value to make value a DLT
1930	 relative address.  */
1931      value -= _bfd_get_gp_value (output_bfd);
1932
1933      bfd_put_64 (input_bfd, value + addend, hit_data);
1934      return bfd_reloc_ok;
1935
1936    case R_PARISC_LTOFF64:
1937	/* We want the value of the DLT offset for this symbol, not
1938	   the symbol's actual address.  Note that __gp may not point
1939	   to the start of the DLT, so we have to compute the absolute
1940	   address, then subtract out the value of __gp.  */
1941      value = (dyn_h->dlt_offset
1942	       + hppa_info->dlt_sec->output_offset
1943	       + hppa_info->dlt_sec->output_section->vma);
1944      value -= _bfd_get_gp_value (output_bfd);
1945
1946      bfd_put_64 (input_bfd, value + addend, hit_data);
1947      return bfd_reloc_ok;
1948
1949    case R_PARISC_PCREL32:
1950      {
1951	/* If this is a call to a function defined in another dynamic
1952	   library, then redirect the call to the local stub for this
1953	   function.  */
1954	if (sym_sec == NULL || sym_sec->output_section == NULL)
1955	  value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1956		   + hppa_info->stub_sec->output_section->vma);
1957
1958	/* Turn VALUE into a proper PC relative address.  */
1959	value -= (offset + input_section->output_offset
1960		  + input_section->output_section->vma);
1961
1962	value += addend;
1963	value -= 8;
1964	bfd_put_32 (input_bfd, value, hit_data);
1965	return bfd_reloc_ok;
1966      }
1967
1968    case R_PARISC_PCREL64:
1969      {
1970	/* If this is a call to a function defined in another dynamic
1971	   library, then redirect the call to the local stub for this
1972	   function.  */
1973	if (sym_sec == NULL || sym_sec->output_section == NULL)
1974	  value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1975		   + hppa_info->stub_sec->output_section->vma);
1976
1977	/* Turn VALUE into a proper PC relative address.  */
1978	value -= (offset + input_section->output_offset
1979		  + input_section->output_section->vma);
1980
1981	value += addend;
1982	value -= 8;
1983	bfd_put_64 (input_bfd, value, hit_data);
1984	return bfd_reloc_ok;
1985      }
1986
1987    case R_PARISC_FPTR64:
1988      {
1989	/* We may still need to create the FPTR itself if it was for
1990	   a local symbol.  */
1991	if (dyn_h->h == NULL)
1992	  {
1993	    /* The first two words of an .opd entry are zero.  */
1994	    memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1995
1996	    /* The next word is the address of the function.  */
1997	    bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1998			(hppa_info->opd_sec->contents
1999			 + dyn_h->opd_offset + 16));
2000
2001	    /* The last word is our local __gp value.  */
2002	    value = _bfd_get_gp_value
2003		      (hppa_info->opd_sec->output_section->owner);
2004	    bfd_put_64 (hppa_info->opd_sec->owner, value,
2005			hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
2006	  }
2007
2008	if (dyn_h->want_opd)
2009	  /* We want the value of the OPD offset for this symbol.  */
2010	  value = (dyn_h->opd_offset
2011		   + hppa_info->opd_sec->output_offset
2012		   + hppa_info->opd_sec->output_section->vma);
2013	else
2014	  /* We want the address of the symbol.  */
2015	  value += addend;
2016
2017	bfd_put_64 (input_bfd, value, hit_data);
2018	return bfd_reloc_ok;
2019      }
2020
2021    case R_PARISC_SECREL32:
2022      bfd_put_32 (input_bfd,
2023		  value + addend - sym_sec->output_section->vma,
2024		  hit_data);
2025      return bfd_reloc_ok;
2026
2027    case R_PARISC_SEGREL32:
2028    case R_PARISC_SEGREL64:
2029      {
2030	/* If this is the first SEGREL relocation, then initialize
2031	   the segment base values.  */
2032	if (hppa_info->text_segment_base == (bfd_vma) -1)
2033	  bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
2034				 hppa_info);
2035
2036	/* VALUE holds the absolute address.  We want to include the
2037	   addend, then turn it into a segment relative address.
2038
2039	   The segment is derived from SYM_SEC.  We assume that there are
2040	   only two segments of note in the resulting executable/shlib.
2041	   A readonly segment (.text) and a readwrite segment (.data).  */
2042	value += addend;
2043
2044	if (sym_sec->flags & SEC_CODE)
2045	  value -= hppa_info->text_segment_base;
2046	else
2047	  value -= hppa_info->data_segment_base;
2048
2049	if (r_type == R_PARISC_SEGREL32)
2050	  bfd_put_32 (input_bfd, value, hit_data);
2051	else
2052	  bfd_put_64 (input_bfd, value, hit_data);
2053	return bfd_reloc_ok;
2054      }
2055
2056    /* Something we don't know how to handle.  */
2057    default:
2058      return bfd_reloc_notsupported;
2059    }
2060
2061  /* Update the instruction word.  */
2062  bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
2063  return bfd_reloc_ok;
2064}
2065
2066/* Relocate the given INSN.  VALUE should be the actual value we want
2067   to insert into the instruction, ie by this point we should not be
2068   concerned with computing an offset relative to the DLT, PC, etc.
2069   Instead this routine is meant to handle the bit manipulations needed
2070   to insert the relocation into the given instruction.  */
2071
2072static int
2073elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
2074{
2075  switch (r_type)
2076    {
2077    /* This is any 22 bit branch.  In PA2.0 syntax it corresponds to
2078       the "B" instruction.  */
2079    case R_PARISC_PCREL22F:
2080    case R_PARISC_PCREL22C:
2081      return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
2082
2083      /* This is any 12 bit branch.  */
2084    case R_PARISC_PCREL12F:
2085      return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
2086
2087    /* This is any 17 bit branch.  In PA2.0 syntax it also corresponds
2088       to the "B" instruction as well as BE.  */
2089    case R_PARISC_PCREL17F:
2090    case R_PARISC_DIR17F:
2091    case R_PARISC_DIR17R:
2092    case R_PARISC_PCREL17C:
2093    case R_PARISC_PCREL17R:
2094      return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
2095
2096    /* ADDIL or LDIL instructions.  */
2097    case R_PARISC_DLTREL21L:
2098    case R_PARISC_DLTIND21L:
2099    case R_PARISC_LTOFF_FPTR21L:
2100    case R_PARISC_PCREL21L:
2101    case R_PARISC_LTOFF_TP21L:
2102    case R_PARISC_DPREL21L:
2103    case R_PARISC_PLTOFF21L:
2104    case R_PARISC_DIR21L:
2105      return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
2106
2107    /* LDO and integer loads/stores with 14 bit displacements.  */
2108    case R_PARISC_DLTREL14R:
2109    case R_PARISC_DLTREL14F:
2110    case R_PARISC_DLTIND14R:
2111    case R_PARISC_DLTIND14F:
2112    case R_PARISC_LTOFF_FPTR14R:
2113    case R_PARISC_PCREL14R:
2114    case R_PARISC_PCREL14F:
2115    case R_PARISC_LTOFF_TP14R:
2116    case R_PARISC_LTOFF_TP14F:
2117    case R_PARISC_DPREL14R:
2118    case R_PARISC_DPREL14F:
2119    case R_PARISC_PLTOFF14R:
2120    case R_PARISC_PLTOFF14F:
2121    case R_PARISC_DIR14R:
2122    case R_PARISC_DIR14F:
2123      return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
2124
2125    /* PA2.0W LDO and integer loads/stores with 16 bit displacements.  */
2126    case R_PARISC_LTOFF_FPTR16F:
2127    case R_PARISC_PCREL16F:
2128    case R_PARISC_LTOFF_TP16F:
2129    case R_PARISC_GPREL16F:
2130    case R_PARISC_PLTOFF16F:
2131    case R_PARISC_DIR16F:
2132    case R_PARISC_LTOFF16F:
2133      return (insn & ~0xffff) | re_assemble_16 (sym_value);
2134
2135    /* Doubleword loads and stores with a 14 bit displacement.  */
2136    case R_PARISC_DLTREL14DR:
2137    case R_PARISC_DLTIND14DR:
2138    case R_PARISC_LTOFF_FPTR14DR:
2139    case R_PARISC_LTOFF_FPTR16DF:
2140    case R_PARISC_PCREL14DR:
2141    case R_PARISC_PCREL16DF:
2142    case R_PARISC_LTOFF_TP14DR:
2143    case R_PARISC_LTOFF_TP16DF:
2144    case R_PARISC_DPREL14DR:
2145    case R_PARISC_GPREL16DF:
2146    case R_PARISC_PLTOFF14DR:
2147    case R_PARISC_PLTOFF16DF:
2148    case R_PARISC_DIR14DR:
2149    case R_PARISC_DIR16DF:
2150    case R_PARISC_LTOFF16DF:
2151      return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
2152				 | ((sym_value & 0x1ff8) << 1));
2153
2154    /* Floating point single word load/store instructions.  */
2155    case R_PARISC_DLTREL14WR:
2156    case R_PARISC_DLTIND14WR:
2157    case R_PARISC_LTOFF_FPTR14WR:
2158    case R_PARISC_LTOFF_FPTR16WF:
2159    case R_PARISC_PCREL14WR:
2160    case R_PARISC_PCREL16WF:
2161    case R_PARISC_LTOFF_TP14WR:
2162    case R_PARISC_LTOFF_TP16WF:
2163    case R_PARISC_DPREL14WR:
2164    case R_PARISC_GPREL16WF:
2165    case R_PARISC_PLTOFF14WR:
2166    case R_PARISC_PLTOFF16WF:
2167    case R_PARISC_DIR16WF:
2168    case R_PARISC_DIR14WR:
2169    case R_PARISC_LTOFF16WF:
2170      return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
2171				 | ((sym_value & 0x1ffc) << 1));
2172
2173    default:
2174      return insn;
2175    }
2176}
2177#endif
2178