OSDN Git Service

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