OSDN Git Service

bfd/
[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         case 32:
816           switch (field)
817             {
818             case e_fsel:
819               final_type = R_PARISC_PCREL32;
820               break;
821             default:
822               return R_PARISC_NONE;
823             }
824           break;
825
826         case 64:
827           switch (field)
828             {
829             case e_fsel:
830               final_type = R_PARISC_PCREL64;
831               break;
832             default:
833               return R_PARISC_NONE;
834             }
835           break;
836
837         default:
838           return R_PARISC_NONE;
839         }
840       break;
841
842     case R_PARISC_GNU_VTENTRY:
843     case R_PARISC_GNU_VTINHERIT:
844     case R_PARISC_SEGREL32:
845     case R_PARISC_SEGBASE:
846       /* The defaults are fine for these cases.  */
847       break;
848
849     default:
850       return R_PARISC_NONE;
851     }
852
853   return final_type;
854 }
855
856 /* Return one (or more) BFD relocations which implement the base
857    relocation with modifications based on format and field.  */
858
859 elf_hppa_reloc_type **
860 _bfd_elf_hppa_gen_reloc_type (bfd *abfd,
861                               elf_hppa_reloc_type base_type,
862                               int format,
863                               unsigned int field,
864                               int ignore ATTRIBUTE_UNUSED,
865                               asymbol *sym ATTRIBUTE_UNUSED)
866 {
867   elf_hppa_reloc_type *finaltype;
868   elf_hppa_reloc_type **final_types;
869   bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
870
871   /* Allocate slots for the BFD relocation.  */
872   final_types = bfd_alloc (abfd, amt);
873   if (final_types == NULL)
874     return NULL;
875
876   /* Allocate space for the relocation itself.  */
877   amt = sizeof (elf_hppa_reloc_type);
878   finaltype = bfd_alloc (abfd, amt);
879   if (finaltype == NULL)
880     return NULL;
881
882   /* Some reasonable defaults.  */
883   final_types[0] = finaltype;
884   final_types[1] = NULL;
885
886   *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
887
888   return final_types;
889 }
890
891 /* Translate from an elf into field into a howto relocation pointer.  */
892
893 static void
894 elf_hppa_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
895                         arelent *bfd_reloc,
896                         Elf_Internal_Rela *elf_reloc)
897 {
898   BFD_ASSERT (ELF_R_TYPE (elf_reloc->r_info)
899               < (unsigned int) R_PARISC_UNIMPLEMENTED);
900   bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
901 }
902
903 /* Translate from an elf into field into a howto relocation pointer.  */
904
905 static void
906 elf_hppa_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
907                             arelent *bfd_reloc,
908                             Elf_Internal_Rela *elf_reloc)
909 {
910   BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
911               < (unsigned int) R_PARISC_UNIMPLEMENTED);
912   bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
913 }
914
915 /* Return the address of the howto table entry to perform the CODE
916    relocation for an ARCH machine.  */
917
918 static reloc_howto_type *
919 elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
920                             bfd_reloc_code_real_type code)
921 {
922   if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
923     {
924       BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
925       return &elf_hppa_howto_table[(int) code];
926     }
927   return NULL;
928 }
929
930 /* Return TRUE if SYM represents a local label symbol.  */
931
932 static bfd_boolean
933 elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
934 {
935   if (name[0] == 'L' && name[1] == '$')
936     return 1;
937   return _bfd_elf_is_local_label_name (abfd, name);
938 }
939
940 /* Set the correct type for an ELF section.  We do this by the
941    section name, which is a hack, but ought to work.  */
942
943 static bfd_boolean
944 elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
945 {
946   const char *name;
947
948   name = bfd_get_section_name (abfd, sec);
949
950   if (strcmp (name, ".PARISC.unwind") == 0)
951     {
952       int indx;
953       asection *asec;
954 #if ARCH_SIZE == 64
955       hdr->sh_type = SHT_LOPROC + 1;
956 #else
957       hdr->sh_type = 1;
958 #endif
959       /* ?!? How are unwinds supposed to work for symbols in arbitrary
960          sections?  Or what if we have multiple .text sections in a single
961          .o file?  HP really messed up on this one.
962
963          Ugh.  We can not use elf_section_data (sec)->this_idx at this
964          point because it is not initialized yet.
965
966          So we (gasp) recompute it here.  Hopefully nobody ever changes the
967          way sections are numbered in elf.c!  */
968       for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
969         {
970           if (asec->name && strcmp (asec->name, ".text") == 0)
971             {
972               hdr->sh_info = indx;
973               break;
974             }
975         }
976
977       /* I have no idea if this is really necessary or what it means.  */
978       hdr->sh_entsize = 4;
979     }
980   return TRUE;
981 }
982
983 static void
984 elf_hppa_final_write_processing (bfd *abfd,
985                                  bfd_boolean linker ATTRIBUTE_UNUSED)
986 {
987   int mach = bfd_get_mach (abfd);
988
989   elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
990                                      | EF_PARISC_EXT | EF_PARISC_LSB
991                                      | EF_PARISC_WIDE | EF_PARISC_NO_KABP
992                                      | EF_PARISC_LAZYSWAP);
993
994   if (mach == 10)
995     elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
996   else if (mach == 11)
997     elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
998   else if (mach == 20)
999     elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
1000   else if (mach == 25)
1001     elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
1002                                       | EFA_PARISC_2_0
1003                                       /* The GNU tools have trapped without
1004                                          option since 1993, so need to take
1005                                          a step backwards with the ELF
1006                                          based toolchains.  */
1007                                       | EF_PARISC_TRAPNIL);
1008 }
1009
1010 /* Comparison function for qsort to sort unwind section during a
1011    final link.  */
1012
1013 static int
1014 hppa_unwind_entry_compare (const void *a, const void *b)
1015 {
1016   const bfd_byte *ap, *bp;
1017   unsigned long av, bv;
1018
1019   ap = a;
1020   av = (unsigned long) ap[0] << 24;
1021   av |= (unsigned long) ap[1] << 16;
1022   av |= (unsigned long) ap[2] << 8;
1023   av |= (unsigned long) ap[3];
1024
1025   bp = b;
1026   bv = (unsigned long) bp[0] << 24;
1027   bv |= (unsigned long) bp[1] << 16;
1028   bv |= (unsigned long) bp[2] << 8;
1029   bv |= (unsigned long) bp[3];
1030
1031   return av < bv ? -1 : av > bv ? 1 : 0;
1032 }
1033
1034 static bfd_boolean elf_hppa_sort_unwind (bfd *abfd)
1035 {
1036   asection *s;
1037
1038   /* Magic section names, but this is much safer than having
1039      relocate_section remember where SEGREL32 relocs occurred.
1040      Consider what happens if someone inept creates a linker script
1041      that puts unwind information in .text.  */
1042   s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
1043   if (s != NULL)
1044     {
1045       bfd_size_type size;
1046       char *contents;
1047
1048       size = s->_raw_size;
1049       contents = bfd_malloc (size);
1050       if (contents == NULL)
1051         return FALSE;
1052
1053       if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
1054         return FALSE;
1055
1056       qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
1057
1058       if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
1059         return FALSE;
1060     }
1061
1062   return TRUE;
1063 }
1064
1065 #if ARCH_SIZE == 64
1066 /* Hook called by the linker routine which adds symbols from an object
1067    file.  HP's libraries define symbols with HP specific section
1068    indices, which we have to handle.  */
1069
1070 static bfd_boolean
1071 elf_hppa_add_symbol_hook (bfd *abfd,
1072                           struct bfd_link_info *info ATTRIBUTE_UNUSED,
1073                           const Elf_Internal_Sym *sym,
1074                           const char **namep ATTRIBUTE_UNUSED,
1075                           flagword *flagsp ATTRIBUTE_UNUSED,
1076                           asection **secp,
1077                           bfd_vma *valp)
1078 {
1079   int index = sym->st_shndx;
1080
1081   switch (index)
1082     {
1083     case SHN_PARISC_ANSI_COMMON:
1084       *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
1085       (*secp)->flags |= SEC_IS_COMMON;
1086       *valp = sym->st_size;
1087       break;
1088
1089     case SHN_PARISC_HUGE_COMMON:
1090       *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
1091       (*secp)->flags |= SEC_IS_COMMON;
1092       *valp = sym->st_size;
1093       break;
1094     }
1095
1096   return TRUE;
1097 }
1098
1099 static bfd_boolean
1100 elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1101                                          void *data)
1102 {
1103   struct bfd_link_info *info = data;
1104
1105   if (h->root.type == bfd_link_hash_warning)
1106     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1107
1108   /* If we are not creating a shared library, and this symbol is
1109      referenced by a shared library but is not defined anywhere, then
1110      the generic code will warn that it is undefined.
1111
1112      This behavior is undesirable on HPs since the standard shared
1113      libraries contain references to undefined symbols.
1114
1115      So we twiddle the flags associated with such symbols so that they
1116      will not trigger the warning.  ?!? FIXME.  This is horribly fragile.
1117
1118      Ultimately we should have better controls over the generic ELF BFD
1119      linker code.  */
1120   if (! info->relocatable
1121       && info->unresolved_syms_in_shared_libs != RM_IGNORE
1122       && h->root.type == bfd_link_hash_undefined
1123       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
1124       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
1125     {
1126       h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
1127       h->elf_link_hash_flags |= 0x8000;
1128     }
1129
1130   return TRUE;
1131 }
1132
1133 static bfd_boolean
1134 elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1135                                          void *data)
1136 {
1137   struct bfd_link_info *info = data;
1138
1139   if (h->root.type == bfd_link_hash_warning)
1140     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1141
1142   /* If we are not creating a shared library, and this symbol is
1143      referenced by a shared library but is not defined anywhere, then
1144      the generic code will warn that it is undefined.
1145
1146      This behavior is undesirable on HPs since the standard shared
1147      libraries contain references to undefined symbols.
1148
1149      So we twiddle the flags associated with such symbols so that they
1150      will not trigger the warning.  ?!? FIXME.  This is horribly fragile.
1151
1152      Ultimately we should have better controls over the generic ELF BFD
1153      linker code.  */
1154   if (! info->relocatable
1155       && info->unresolved_syms_in_shared_libs != RM_IGNORE
1156       && h->root.type == bfd_link_hash_undefined
1157       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1158       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
1159       && (h->elf_link_hash_flags & 0x8000) != 0)
1160     {
1161       h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
1162       h->elf_link_hash_flags &= ~0x8000;
1163     }
1164
1165   return TRUE;
1166 }
1167
1168 static bfd_boolean
1169 elf_hppa_is_dynamic_loader_symbol (const char *name)
1170 {
1171   return (! strcmp (name, "__CPU_REVISION")
1172           || ! strcmp (name, "__CPU_KEYBITS_1")
1173           || ! strcmp (name, "__SYSTEM_ID_D")
1174           || ! strcmp (name, "__FPU_MODEL")
1175           || ! strcmp (name, "__FPU_REVISION")
1176           || ! strcmp (name, "__ARGC")
1177           || ! strcmp (name, "__ARGV")
1178           || ! strcmp (name, "__ENVP")
1179           || ! strcmp (name, "__TLS_SIZE_D")
1180           || ! strcmp (name, "__LOAD_INFO")
1181           || ! strcmp (name, "__systab"));
1182 }
1183
1184 /* Record the lowest address for the data and text segments.  */
1185 static void
1186 elf_hppa_record_segment_addrs (bfd *abfd ATTRIBUTE_UNUSED,
1187                                asection *section,
1188                                void *data)
1189 {
1190   struct elf64_hppa_link_hash_table *hppa_info;
1191   bfd_vma value;
1192
1193   hppa_info = data;
1194
1195   value = section->vma - section->filepos;
1196
1197   if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1198        == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1199       && value < hppa_info->text_segment_base)
1200     hppa_info->text_segment_base = value;
1201   else if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1202             == (SEC_ALLOC | SEC_LOAD))
1203            && value < hppa_info->data_segment_base)
1204     hppa_info->data_segment_base = value;
1205 }
1206
1207 /* Called after we have seen all the input files/sections, but before
1208    final symbol resolution and section placement has been determined.
1209
1210    We use this hook to (possibly) provide a value for __gp, then we
1211    fall back to the generic ELF final link routine.  */
1212
1213 static bfd_boolean
1214 elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
1215 {
1216   bfd_boolean retval;
1217   struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1218
1219   if (! info->relocatable)
1220     {
1221       struct elf_link_hash_entry *gp;
1222       bfd_vma gp_val;
1223
1224       /* The linker script defines a value for __gp iff it was referenced
1225          by one of the objects being linked.  First try to find the symbol
1226          in the hash table.  If that fails, just compute the value __gp
1227          should have had.  */
1228       gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
1229                                  FALSE, FALSE);
1230
1231       if (gp)
1232         {
1233
1234           /* Adjust the value of __gp as we may want to slide it into the
1235              .plt section so that the stubs can access PLT entries without
1236              using an addil sequence.  */
1237           gp->root.u.def.value += hppa_info->gp_offset;
1238
1239           gp_val = (gp->root.u.def.section->output_section->vma
1240                     + gp->root.u.def.section->output_offset
1241                     + gp->root.u.def.value);
1242         }
1243       else
1244         {
1245           asection *sec;
1246
1247           /* First look for a .plt section.  If found, then __gp is the
1248              address of the .plt + gp_offset.
1249
1250              If no .plt is found, then look for .dlt, .opd and .data (in
1251              that order) and set __gp to the base address of whichever
1252              section is found first.  */
1253
1254           sec = hppa_info->plt_sec;
1255           if (sec && ! (sec->flags & SEC_EXCLUDE))
1256             gp_val = (sec->output_offset
1257                       + sec->output_section->vma
1258                       + hppa_info->gp_offset);
1259           else
1260             {
1261               sec = hppa_info->dlt_sec;
1262               if (!sec || (sec->flags & SEC_EXCLUDE))
1263                 sec = hppa_info->opd_sec;
1264               if (!sec || (sec->flags & SEC_EXCLUDE))
1265                 sec = bfd_get_section_by_name (abfd, ".data");
1266               if (!sec || (sec->flags & SEC_EXCLUDE))
1267                 return FALSE;
1268
1269               gp_val = sec->output_offset + sec->output_section->vma;
1270             }
1271         }
1272
1273       /* Install whatever value we found/computed for __gp.  */
1274       _bfd_set_gp_value (abfd, gp_val);
1275     }
1276
1277   /* We need to know the base of the text and data segments so that we
1278      can perform SEGREL relocations.  We will record the base addresses
1279      when we encounter the first SEGREL relocation.  */
1280   hppa_info->text_segment_base = (bfd_vma)-1;
1281   hppa_info->data_segment_base = (bfd_vma)-1;
1282
1283   /* HP's shared libraries have references to symbols that are not
1284      defined anywhere.  The generic ELF BFD linker code will complain
1285      about such symbols.
1286
1287      So we detect the losing case and arrange for the flags on the symbol
1288      to indicate that it was never referenced.  This keeps the generic
1289      ELF BFD link code happy and appears to not create any secondary
1290      problems.  Ultimately we need a way to control the behavior of the
1291      generic ELF BFD link code better.  */
1292   elf_link_hash_traverse (elf_hash_table (info),
1293                           elf_hppa_unmark_useless_dynamic_symbols,
1294                           info);
1295
1296   /* Invoke the regular ELF backend linker to do all the work.  */
1297   retval = bfd_elf_bfd_final_link (abfd, info);
1298
1299   elf_link_hash_traverse (elf_hash_table (info),
1300                           elf_hppa_remark_useless_dynamic_symbols,
1301                           info);
1302
1303   /* If we're producing a final executable, sort the contents of the
1304      unwind section. */
1305   if (retval)
1306     retval = elf_hppa_sort_unwind (abfd);
1307
1308   return retval;
1309 }
1310
1311 /* Relocate an HPPA ELF section.  */
1312
1313 static bfd_boolean
1314 elf_hppa_relocate_section (bfd *output_bfd,
1315                            struct bfd_link_info *info,
1316                            bfd *input_bfd,
1317                            asection *input_section,
1318                            bfd_byte *contents,
1319                            Elf_Internal_Rela *relocs,
1320                            Elf_Internal_Sym *local_syms,
1321                            asection **local_sections)
1322 {
1323   Elf_Internal_Shdr *symtab_hdr;
1324   Elf_Internal_Rela *rel;
1325   Elf_Internal_Rela *relend;
1326   struct elf64_hppa_link_hash_table *hppa_info;
1327
1328   if (info->relocatable)
1329     return TRUE;
1330
1331   hppa_info = elf64_hppa_hash_table (info);
1332   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1333
1334   rel = relocs;
1335   relend = relocs + input_section->reloc_count;
1336   for (; rel < relend; rel++)
1337     {
1338       int r_type;
1339       reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1340       unsigned long r_symndx;
1341       struct elf_link_hash_entry *h;
1342       Elf_Internal_Sym *sym;
1343       asection *sym_sec;
1344       bfd_vma relocation;
1345       bfd_reloc_status_type r;
1346       const char *sym_name;
1347       const char *dyn_name;
1348       char *dynh_buf = NULL;
1349       size_t dynh_buflen = 0;
1350       struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
1351
1352       r_type = ELF_R_TYPE (rel->r_info);
1353       if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
1354         {
1355           bfd_set_error (bfd_error_bad_value);
1356           return FALSE;
1357         }
1358
1359       /* This is a final link.  */
1360       r_symndx = ELF_R_SYM (rel->r_info);
1361       h = NULL;
1362       sym = NULL;
1363       sym_sec = NULL;
1364       if (r_symndx < symtab_hdr->sh_info)
1365         {
1366           /* This is a local symbol.  */
1367           sym = local_syms + r_symndx;
1368           sym_sec = local_sections[r_symndx];
1369           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
1370
1371           /* If this symbol has an entry in the PA64 dynamic hash
1372              table, then get it.  */
1373           dyn_name = get_dyn_name (input_bfd, h, rel,
1374                                    &dynh_buf, &dynh_buflen);
1375           dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1376                                               dyn_name, FALSE, FALSE);
1377
1378         }
1379       else
1380         {
1381           /* This is not a local symbol.  */
1382           long indx;
1383
1384           indx = r_symndx - symtab_hdr->sh_info;
1385           h = elf_sym_hashes (input_bfd)[indx];
1386           while (h->root.type == bfd_link_hash_indirect
1387                  || h->root.type == bfd_link_hash_warning)
1388             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1389           if (h->root.type == bfd_link_hash_defined
1390               || h->root.type == bfd_link_hash_defweak)
1391             {
1392               sym_sec = h->root.u.def.section;
1393
1394               /* If this symbol has an entry in the PA64 dynamic hash
1395                  table, then get it.  */
1396               dyn_name = get_dyn_name (input_bfd, h, rel,
1397                                        &dynh_buf, &dynh_buflen);
1398               dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1399                                                   dyn_name, FALSE, FALSE);
1400
1401               /* If we have a relocation against a symbol defined in a
1402                  shared library and we have not created an entry in the
1403                  PA64 dynamic symbol hash table for it, then we lose.  */
1404               if (sym_sec->output_section == NULL && dyn_h == NULL)
1405                 {
1406                   (*_bfd_error_handler)
1407                     (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1408                      bfd_archive_filename (input_bfd), h->root.root.string,
1409                      bfd_get_section_name (input_bfd, input_section));
1410                   relocation = 0;
1411                 }
1412               else if (sym_sec->output_section)
1413                 relocation = (h->root.u.def.value
1414                               + sym_sec->output_offset
1415                               + sym_sec->output_section->vma);
1416               /* Value will be provided via one of the offsets in the
1417                  dyn_h hash table entry.  */
1418               else
1419                 relocation = 0;
1420             }
1421           else if (info->unresolved_syms_in_objects == RM_IGNORE
1422                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1423             {
1424               /* If this symbol has an entry in the PA64 dynamic hash
1425                  table, then get it.  */
1426               dyn_name = get_dyn_name (input_bfd, h, rel,
1427                                        &dynh_buf, &dynh_buflen);
1428               dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1429                                                   dyn_name, FALSE, FALSE);
1430
1431               if (dyn_h == NULL)
1432                 {
1433                   (*_bfd_error_handler)
1434                     (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1435                      bfd_archive_filename (input_bfd), h->root.root.string,
1436                      bfd_get_section_name (input_bfd, input_section));
1437                 }
1438               relocation = 0;
1439             }
1440           else if (h->root.type == bfd_link_hash_undefweak)
1441             {
1442               dyn_name = get_dyn_name (input_bfd, h, rel,
1443                                        &dynh_buf, &dynh_buflen);
1444               dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1445                                                   dyn_name, FALSE, FALSE);
1446
1447               if (dyn_h == NULL)
1448                 {
1449                   (*_bfd_error_handler)
1450                     (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1451                      bfd_archive_filename (input_bfd), h->root.root.string,
1452                      bfd_get_section_name (input_bfd, input_section));
1453                 }
1454               relocation = 0;
1455             }
1456           else
1457             {
1458               /* Ignore dynamic loader defined symbols.  */
1459               if (elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
1460                 relocation = 0;
1461               else
1462                 {
1463                   if (!((*info->callbacks->undefined_symbol)
1464                         (info, h->root.root.string, input_bfd,
1465                          input_section, rel->r_offset,
1466                          (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
1467                           || ELF_ST_VISIBILITY (h->other)))))
1468                     return FALSE;
1469                   break;
1470                 }
1471             }
1472         }
1473
1474       if (h != NULL)
1475         sym_name = h->root.root.string;
1476       else
1477         {
1478           sym_name = bfd_elf_string_from_elf_section (input_bfd,
1479                                                       symtab_hdr->sh_link,
1480                                                       sym->st_name);
1481           if (sym_name == NULL)
1482             return FALSE;
1483           if (*sym_name == '\0')
1484             sym_name = bfd_section_name (input_bfd, sym_sec);
1485         }
1486
1487       r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1488                                         input_section, contents,
1489                                         relocation, info, sym_sec,
1490                                         h, dyn_h);
1491
1492       if (r != bfd_reloc_ok)
1493         {
1494           switch (r)
1495             {
1496             default:
1497               abort ();
1498             case bfd_reloc_overflow:
1499               {
1500                 if (!((*info->callbacks->reloc_overflow)
1501                       (info, sym_name, howto->name, (bfd_vma) 0,
1502                         input_bfd, input_section, rel->r_offset)))
1503                   return FALSE;
1504               }
1505               break;
1506             }
1507         }
1508     }
1509   return TRUE;
1510 }
1511
1512 /* Compute the value for a relocation (REL) during a final link stage,
1513    then insert the value into the proper location in CONTENTS.
1514
1515    VALUE is a tentative value for the relocation and may be overridden
1516    and modified here based on the specific relocation to be performed.
1517
1518    For example we do conversions for PC-relative branches in this routine
1519    or redirection of calls to external routines to stubs.
1520
1521    The work of actually applying the relocation is left to a helper
1522    routine in an attempt to reduce the complexity and size of this
1523    function.  */
1524
1525 static bfd_reloc_status_type
1526 elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
1527                               bfd *input_bfd,
1528                               bfd *output_bfd,
1529                               asection *input_section,
1530                               bfd_byte *contents,
1531                               bfd_vma value,
1532                               struct bfd_link_info *info,
1533                               asection *sym_sec,
1534                               struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
1535                               struct elf64_hppa_dyn_hash_entry *dyn_h)
1536 {
1537   int insn;
1538   bfd_vma offset = rel->r_offset;
1539   bfd_signed_vma addend = rel->r_addend;
1540   reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1541   unsigned int r_type = howto->type;
1542   bfd_byte *hit_data = contents + offset;
1543   struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1544
1545   insn = bfd_get_32 (input_bfd, hit_data);
1546
1547   switch (r_type)
1548     {
1549     case R_PARISC_NONE:
1550       break;
1551
1552     /* Basic function call support.
1553
1554        Note for a call to a function defined in another dynamic library
1555        we want to redirect the call to a stub.  */
1556
1557     /* Random PC relative relocs.  */
1558     case R_PARISC_PCREL21L:
1559     case R_PARISC_PCREL14R:
1560     case R_PARISC_PCREL14F:
1561     case R_PARISC_PCREL14WR:
1562     case R_PARISC_PCREL14DR:
1563     case R_PARISC_PCREL16F:
1564     case R_PARISC_PCREL16WF:
1565     case R_PARISC_PCREL16DF:
1566       {
1567         /* If this is a call to a function defined in another dynamic
1568            library, then redirect the call to the local stub for this
1569            function.  */
1570         if (sym_sec == NULL || sym_sec->output_section == NULL)
1571           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1572                    + hppa_info->stub_sec->output_section->vma);
1573
1574         /* Turn VALUE into a proper PC relative address.  */
1575         value -= (offset + input_section->output_offset
1576                   + input_section->output_section->vma);
1577
1578         /* Adjust for any field selectors.  */
1579         if (r_type == R_PARISC_PCREL21L)
1580           value = hppa_field_adjust (value, -8 + addend, e_lsel);
1581         else if (r_type == R_PARISC_PCREL14F
1582                  || r_type == R_PARISC_PCREL16F
1583                  || r_type == R_PARISC_PCREL16WF
1584                  || r_type == R_PARISC_PCREL16DF)
1585           value = hppa_field_adjust (value, -8 + addend, e_fsel);
1586         else
1587           value = hppa_field_adjust (value, -8 + addend, e_rsel);
1588
1589         /* Apply the relocation to the given instruction.  */
1590         insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1591         break;
1592       }
1593
1594     case R_PARISC_PCREL12F:
1595     case R_PARISC_PCREL22F:
1596     case R_PARISC_PCREL17F:
1597     case R_PARISC_PCREL22C:
1598     case R_PARISC_PCREL17C:
1599     case R_PARISC_PCREL17R:
1600       {
1601         /* If this is a call to a function defined in another dynamic
1602            library, then redirect the call to the local stub for this
1603            function.  */
1604         if (sym_sec == NULL || sym_sec->output_section == NULL)
1605           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1606                    + hppa_info->stub_sec->output_section->vma);
1607
1608         /* Turn VALUE into a proper PC relative address.  */
1609         value -= (offset + input_section->output_offset
1610                   + input_section->output_section->vma);
1611
1612         /* Adjust for any field selectors.  */
1613         if (r_type == R_PARISC_PCREL17R)
1614           value = hppa_field_adjust (value, -8 + addend, e_rsel);
1615         else
1616           value = hppa_field_adjust (value, -8 + addend, e_fsel);
1617
1618         /* All branches are implicitly shifted by 2 places.  */
1619         value >>= 2;
1620
1621         /* Apply the relocation to the given instruction.  */
1622         insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1623         break;
1624       }
1625
1626     /* Indirect references to data through the DLT.  */
1627     case R_PARISC_DLTIND14R:
1628     case R_PARISC_DLTIND14F:
1629     case R_PARISC_DLTIND14DR:
1630     case R_PARISC_DLTIND14WR:
1631     case R_PARISC_DLTIND21L:
1632     case R_PARISC_LTOFF_FPTR14R:
1633     case R_PARISC_LTOFF_FPTR14DR:
1634     case R_PARISC_LTOFF_FPTR14WR:
1635     case R_PARISC_LTOFF_FPTR21L:
1636     case R_PARISC_LTOFF_FPTR16F:
1637     case R_PARISC_LTOFF_FPTR16WF:
1638     case R_PARISC_LTOFF_FPTR16DF:
1639     case R_PARISC_LTOFF_TP21L:
1640     case R_PARISC_LTOFF_TP14R:
1641     case R_PARISC_LTOFF_TP14F:
1642     case R_PARISC_LTOFF_TP14WR:
1643     case R_PARISC_LTOFF_TP14DR:
1644     case R_PARISC_LTOFF_TP16F:
1645     case R_PARISC_LTOFF_TP16WF:
1646     case R_PARISC_LTOFF_TP16DF:
1647     case R_PARISC_LTOFF16F:
1648     case R_PARISC_LTOFF16WF:
1649     case R_PARISC_LTOFF16DF:
1650       {
1651         /* If this relocation was against a local symbol, then we still
1652            have not set up the DLT entry (it's not convenient to do so
1653            in the "finalize_dlt" routine because it is difficult to get
1654            to the local symbol's value).
1655
1656            So, if this is a local symbol (h == NULL), then we need to
1657            fill in its DLT entry.
1658
1659            Similarly we may still need to set up an entry in .opd for
1660            a local function which had its address taken.  */
1661         if (dyn_h->h == NULL)
1662           {
1663             /* Now do .opd creation if needed.  */
1664             if (r_type == R_PARISC_LTOFF_FPTR14R
1665                 || r_type == R_PARISC_LTOFF_FPTR14DR
1666                 || r_type == R_PARISC_LTOFF_FPTR14WR
1667                 || r_type == R_PARISC_LTOFF_FPTR21L
1668                 || r_type == R_PARISC_LTOFF_FPTR16F
1669                 || r_type == R_PARISC_LTOFF_FPTR16WF
1670                 || r_type == R_PARISC_LTOFF_FPTR16DF)
1671               {
1672                 /* The first two words of an .opd entry are zero.  */
1673                 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1674                         0, 16);
1675
1676                 /* The next word is the address of the function.  */
1677                 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1678                             (hppa_info->opd_sec->contents
1679                              + dyn_h->opd_offset + 16));
1680
1681                 /* The last word is our local __gp value.  */
1682                 value = _bfd_get_gp_value
1683                           (hppa_info->opd_sec->output_section->owner);
1684                 bfd_put_64 (hppa_info->opd_sec->owner, value,
1685                             (hppa_info->opd_sec->contents
1686                              + dyn_h->opd_offset + 24));
1687
1688                 /* The DLT value is the address of the .opd entry.  */
1689                 value = (dyn_h->opd_offset
1690                          + hppa_info->opd_sec->output_offset
1691                          + hppa_info->opd_sec->output_section->vma);
1692                 addend = 0;
1693               }
1694
1695             bfd_put_64 (hppa_info->dlt_sec->owner,
1696                         value + addend,
1697                         hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1698           }
1699
1700         /* We want the value of the DLT offset for this symbol, not
1701            the symbol's actual address.  Note that __gp may not point
1702            to the start of the DLT, so we have to compute the absolute
1703            address, then subtract out the value of __gp.  */
1704         value = (dyn_h->dlt_offset
1705                  + hppa_info->dlt_sec->output_offset
1706                  + hppa_info->dlt_sec->output_section->vma);
1707         value -= _bfd_get_gp_value (output_bfd);
1708
1709         /* All DLTIND relocations are basically the same at this point,
1710            except that we need different field selectors for the 21bit
1711            version vs the 14bit versions.  */
1712         if (r_type == R_PARISC_DLTIND21L
1713             || r_type == R_PARISC_LTOFF_FPTR21L
1714             || r_type == R_PARISC_LTOFF_TP21L)
1715           value = hppa_field_adjust (value, 0, e_lsel);
1716         else if (r_type == R_PARISC_DLTIND14F
1717                  || r_type == R_PARISC_LTOFF_FPTR16F
1718                  || r_type == R_PARISC_LTOFF_FPTR16WF
1719                  || r_type == R_PARISC_LTOFF_FPTR16DF
1720                  || r_type == R_PARISC_LTOFF16F
1721                  || r_type == R_PARISC_LTOFF16DF
1722                  || r_type == R_PARISC_LTOFF16WF
1723                  || r_type == R_PARISC_LTOFF_TP16F
1724                  || r_type == R_PARISC_LTOFF_TP16WF
1725                  || r_type == R_PARISC_LTOFF_TP16DF)
1726           value = hppa_field_adjust (value, 0, e_fsel);
1727         else
1728           value = hppa_field_adjust (value, 0, e_rsel);
1729
1730         insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1731         break;
1732       }
1733
1734     case R_PARISC_DLTREL14R:
1735     case R_PARISC_DLTREL14F:
1736     case R_PARISC_DLTREL14DR:
1737     case R_PARISC_DLTREL14WR:
1738     case R_PARISC_DLTREL21L:
1739     case R_PARISC_DPREL21L:
1740     case R_PARISC_DPREL14WR:
1741     case R_PARISC_DPREL14DR:
1742     case R_PARISC_DPREL14R:
1743     case R_PARISC_DPREL14F:
1744     case R_PARISC_GPREL16F:
1745     case R_PARISC_GPREL16WF:
1746     case R_PARISC_GPREL16DF:
1747       {
1748         /* Subtract out the global pointer value to make value a DLT
1749            relative address.  */
1750         value -= _bfd_get_gp_value (output_bfd);
1751
1752         /* All DLTREL relocations are basically the same at this point,
1753            except that we need different field selectors for the 21bit
1754            version vs the 14bit versions.  */
1755         if (r_type == R_PARISC_DLTREL21L
1756             || r_type == R_PARISC_DPREL21L)
1757           value = hppa_field_adjust (value, addend, e_lrsel);
1758         else if (r_type == R_PARISC_DLTREL14F
1759                  || r_type == R_PARISC_DPREL14F
1760                  || r_type == R_PARISC_GPREL16F
1761                  || r_type == R_PARISC_GPREL16WF
1762                  || r_type == R_PARISC_GPREL16DF)
1763           value = hppa_field_adjust (value, addend, e_fsel);
1764         else
1765           value = hppa_field_adjust (value, addend, e_rrsel);
1766
1767         insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1768         break;
1769       }
1770
1771     case R_PARISC_DIR21L:
1772     case R_PARISC_DIR17R:
1773     case R_PARISC_DIR17F:
1774     case R_PARISC_DIR14R:
1775     case R_PARISC_DIR14F:
1776     case R_PARISC_DIR14WR:
1777     case R_PARISC_DIR14DR:
1778     case R_PARISC_DIR16F:
1779     case R_PARISC_DIR16WF:
1780     case R_PARISC_DIR16DF:
1781       {
1782         /* All DIR relocations are basically the same at this point,
1783            except that branch offsets need to be divided by four, and
1784            we need different field selectors.  Note that we don't
1785            redirect absolute calls to local stubs.  */
1786
1787         if (r_type == R_PARISC_DIR21L)
1788           value = hppa_field_adjust (value, addend, e_lrsel);
1789         else if (r_type == R_PARISC_DIR17F
1790                  || r_type == R_PARISC_DIR16F
1791                  || r_type == R_PARISC_DIR16WF
1792                  || r_type == R_PARISC_DIR16DF
1793                  || r_type == R_PARISC_DIR14F)
1794           value = hppa_field_adjust (value, addend, e_fsel);
1795         else
1796           value = hppa_field_adjust (value, addend, e_rrsel);
1797
1798         if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
1799           {
1800             /* All branches are implicitly shifted by 2 places.  */
1801             value >>= 2;
1802           }
1803
1804         insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1805         break;
1806       }
1807
1808     case R_PARISC_PLTOFF21L:
1809     case R_PARISC_PLTOFF14R:
1810     case R_PARISC_PLTOFF14F:
1811     case R_PARISC_PLTOFF14WR:
1812     case R_PARISC_PLTOFF14DR:
1813     case R_PARISC_PLTOFF16F:
1814     case R_PARISC_PLTOFF16WF:
1815     case R_PARISC_PLTOFF16DF:
1816       {
1817         /* We want the value of the PLT offset for this symbol, not
1818            the symbol's actual address.  Note that __gp may not point
1819            to the start of the DLT, so we have to compute the absolute
1820            address, then subtract out the value of __gp.  */
1821         value = (dyn_h->plt_offset
1822                  + hppa_info->plt_sec->output_offset
1823                  + hppa_info->plt_sec->output_section->vma);
1824         value -= _bfd_get_gp_value (output_bfd);
1825
1826         /* All PLTOFF relocations are basically the same at this point,
1827            except that we need different field selectors for the 21bit
1828            version vs the 14bit versions.  */
1829         if (r_type == R_PARISC_PLTOFF21L)
1830           value = hppa_field_adjust (value, addend, e_lrsel);
1831         else if (r_type == R_PARISC_PLTOFF14F
1832                  || r_type == R_PARISC_PLTOFF16F
1833                  || r_type == R_PARISC_PLTOFF16WF
1834                  || r_type == R_PARISC_PLTOFF16DF)
1835           value = hppa_field_adjust (value, addend, e_fsel);
1836         else
1837           value = hppa_field_adjust (value, addend, e_rrsel);
1838
1839         insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1840         break;
1841       }
1842
1843     case R_PARISC_LTOFF_FPTR32:
1844       {
1845         /* We may still need to create the FPTR itself if it was for
1846            a local symbol.  */
1847         if (dyn_h->h == NULL)
1848           {
1849             /* The first two words of an .opd entry are zero.  */
1850             memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1851
1852             /* The next word is the address of the function.  */
1853             bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1854                         (hppa_info->opd_sec->contents
1855                          + dyn_h->opd_offset + 16));
1856
1857             /* The last word is our local __gp value.  */
1858             value = _bfd_get_gp_value
1859                       (hppa_info->opd_sec->output_section->owner);
1860             bfd_put_64 (hppa_info->opd_sec->owner, value,
1861                         hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1862
1863             /* The DLT value is the address of the .opd entry.  */
1864             value = (dyn_h->opd_offset
1865                      + hppa_info->opd_sec->output_offset
1866                      + hppa_info->opd_sec->output_section->vma);
1867
1868             bfd_put_64 (hppa_info->dlt_sec->owner,
1869                         value,
1870                         hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1871           }
1872
1873         /* We want the value of the DLT offset for this symbol, not
1874            the symbol's actual address.  Note that __gp may not point
1875            to the start of the DLT, so we have to compute the absolute
1876            address, then subtract out the value of __gp.  */
1877         value = (dyn_h->dlt_offset
1878                  + hppa_info->dlt_sec->output_offset
1879                  + hppa_info->dlt_sec->output_section->vma);
1880         value -= _bfd_get_gp_value (output_bfd);
1881         bfd_put_32 (input_bfd, value, hit_data);
1882         return bfd_reloc_ok;
1883       }
1884
1885     case R_PARISC_LTOFF_FPTR64:
1886     case R_PARISC_LTOFF_TP64:
1887       {
1888         /* We may still need to create the FPTR itself if it was for
1889            a local symbol.  */
1890         if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1891           {
1892             /* The first two words of an .opd entry are zero.  */
1893             memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1894
1895             /* The next word is the address of the function.  */
1896             bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1897                         (hppa_info->opd_sec->contents
1898                          + dyn_h->opd_offset + 16));
1899
1900             /* The last word is our local __gp value.  */
1901             value = _bfd_get_gp_value
1902                       (hppa_info->opd_sec->output_section->owner);
1903             bfd_put_64 (hppa_info->opd_sec->owner, value,
1904                         hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1905
1906             /* The DLT value is the address of the .opd entry.  */
1907             value = (dyn_h->opd_offset
1908                      + hppa_info->opd_sec->output_offset
1909                      + hppa_info->opd_sec->output_section->vma);
1910
1911             bfd_put_64 (hppa_info->dlt_sec->owner,
1912                         value,
1913                         hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1914           }
1915
1916         /* We want the value of the DLT offset for this symbol, not
1917            the symbol's actual address.  Note that __gp may not point
1918            to the start of the DLT, so we have to compute the absolute
1919            address, then subtract out the value of __gp.  */
1920         value = (dyn_h->dlt_offset
1921                  + hppa_info->dlt_sec->output_offset
1922                  + hppa_info->dlt_sec->output_section->vma);
1923         value -= _bfd_get_gp_value (output_bfd);
1924         bfd_put_64 (input_bfd, value, hit_data);
1925         return bfd_reloc_ok;
1926       }
1927
1928     case R_PARISC_DIR32:
1929       bfd_put_32 (input_bfd, value + addend, hit_data);
1930       return bfd_reloc_ok;
1931
1932     case R_PARISC_DIR64:
1933       bfd_put_64 (input_bfd, value + addend, hit_data);
1934       return bfd_reloc_ok;
1935
1936     case R_PARISC_GPREL64:
1937       /* Subtract out the global pointer value to make value a DLT
1938          relative address.  */
1939       value -= _bfd_get_gp_value (output_bfd);
1940
1941       bfd_put_64 (input_bfd, value + addend, hit_data);
1942       return bfd_reloc_ok;
1943
1944     case R_PARISC_LTOFF64:
1945         /* We want the value of the DLT offset for this symbol, not
1946            the symbol's actual address.  Note that __gp may not point
1947            to the start of the DLT, so we have to compute the absolute
1948            address, then subtract out the value of __gp.  */
1949       value = (dyn_h->dlt_offset
1950                + hppa_info->dlt_sec->output_offset
1951                + hppa_info->dlt_sec->output_section->vma);
1952       value -= _bfd_get_gp_value (output_bfd);
1953
1954       bfd_put_64 (input_bfd, value + addend, hit_data);
1955       return bfd_reloc_ok;
1956
1957     case R_PARISC_PCREL32:
1958       {
1959         /* If this is a call to a function defined in another dynamic
1960            library, then redirect the call to the local stub for this
1961            function.  */
1962         if (sym_sec == NULL || sym_sec->output_section == NULL)
1963           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1964                    + hppa_info->stub_sec->output_section->vma);
1965
1966         /* Turn VALUE into a proper PC relative address.  */
1967         value -= (offset + input_section->output_offset
1968                   + input_section->output_section->vma);
1969
1970         value += addend;
1971         value -= 8;
1972         bfd_put_32 (input_bfd, value, hit_data);
1973         return bfd_reloc_ok;
1974       }
1975
1976     case R_PARISC_PCREL64:
1977       {
1978         /* If this is a call to a function defined in another dynamic
1979            library, then redirect the call to the local stub for this
1980            function.  */
1981         if (sym_sec == NULL || sym_sec->output_section == NULL)
1982           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1983                    + hppa_info->stub_sec->output_section->vma);
1984
1985         /* Turn VALUE into a proper PC relative address.  */
1986         value -= (offset + input_section->output_offset
1987                   + input_section->output_section->vma);
1988
1989         value += addend;
1990         value -= 8;
1991         bfd_put_64 (input_bfd, value, hit_data);
1992         return bfd_reloc_ok;
1993       }
1994
1995     case R_PARISC_FPTR64:
1996       {
1997         /* We may still need to create the FPTR itself if it was for
1998            a local symbol.  */
1999         if (dyn_h->h == NULL)
2000           {
2001             /* The first two words of an .opd entry are zero.  */
2002             memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
2003
2004             /* The next word is the address of the function.  */
2005             bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
2006                         (hppa_info->opd_sec->contents
2007                          + dyn_h->opd_offset + 16));
2008
2009             /* The last word is our local __gp value.  */
2010             value = _bfd_get_gp_value
2011                       (hppa_info->opd_sec->output_section->owner);
2012             bfd_put_64 (hppa_info->opd_sec->owner, value,
2013                         hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
2014           }
2015
2016         if (dyn_h->want_opd)
2017           /* We want the value of the OPD offset for this symbol.  */
2018           value = (dyn_h->opd_offset
2019                    + hppa_info->opd_sec->output_offset
2020                    + hppa_info->opd_sec->output_section->vma);
2021         else
2022           /* We want the address of the symbol.  */
2023           value += addend;
2024
2025         bfd_put_64 (input_bfd, value, hit_data);
2026         return bfd_reloc_ok;
2027       }
2028
2029     case R_PARISC_SECREL32:
2030       bfd_put_32 (input_bfd,
2031                   value + addend - sym_sec->output_section->vma,
2032                   hit_data);
2033       return bfd_reloc_ok;
2034
2035     case R_PARISC_SEGREL32:
2036     case R_PARISC_SEGREL64:
2037       {
2038         /* If this is the first SEGREL relocation, then initialize
2039            the segment base values.  */
2040         if (hppa_info->text_segment_base == (bfd_vma) -1)
2041           bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
2042                                  hppa_info);
2043
2044         /* VALUE holds the absolute address.  We want to include the
2045            addend, then turn it into a segment relative address.
2046
2047            The segment is derived from SYM_SEC.  We assume that there are
2048            only two segments of note in the resulting executable/shlib.
2049            A readonly segment (.text) and a readwrite segment (.data).  */
2050         value += addend;
2051
2052         if (sym_sec->flags & SEC_CODE)
2053           value -= hppa_info->text_segment_base;
2054         else
2055           value -= hppa_info->data_segment_base;
2056
2057         if (r_type == R_PARISC_SEGREL32)
2058           bfd_put_32 (input_bfd, value, hit_data);
2059         else
2060           bfd_put_64 (input_bfd, value, hit_data);
2061         return bfd_reloc_ok;
2062       }
2063
2064     /* Something we don't know how to handle.  */
2065     default:
2066       return bfd_reloc_notsupported;
2067     }
2068
2069   /* Update the instruction word.  */
2070   bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
2071   return bfd_reloc_ok;
2072 }
2073
2074 /* Relocate the given INSN.  VALUE should be the actual value we want
2075    to insert into the instruction, ie by this point we should not be
2076    concerned with computing an offset relative to the DLT, PC, etc.
2077    Instead this routine is meant to handle the bit manipulations needed
2078    to insert the relocation into the given instruction.  */
2079
2080 static int
2081 elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
2082 {
2083   switch (r_type)
2084     {
2085     /* This is any 22 bit branch.  In PA2.0 syntax it corresponds to
2086        the "B" instruction.  */
2087     case R_PARISC_PCREL22F:
2088     case R_PARISC_PCREL22C:
2089       return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
2090
2091       /* This is any 12 bit branch.  */
2092     case R_PARISC_PCREL12F:
2093       return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
2094
2095     /* This is any 17 bit branch.  In PA2.0 syntax it also corresponds
2096        to the "B" instruction as well as BE.  */
2097     case R_PARISC_PCREL17F:
2098     case R_PARISC_DIR17F:
2099     case R_PARISC_DIR17R:
2100     case R_PARISC_PCREL17C:
2101     case R_PARISC_PCREL17R:
2102       return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
2103
2104     /* ADDIL or LDIL instructions.  */
2105     case R_PARISC_DLTREL21L:
2106     case R_PARISC_DLTIND21L:
2107     case R_PARISC_LTOFF_FPTR21L:
2108     case R_PARISC_PCREL21L:
2109     case R_PARISC_LTOFF_TP21L:
2110     case R_PARISC_DPREL21L:
2111     case R_PARISC_PLTOFF21L:
2112     case R_PARISC_DIR21L:
2113       return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
2114
2115     /* LDO and integer loads/stores with 14 bit displacements.  */
2116     case R_PARISC_DLTREL14R:
2117     case R_PARISC_DLTREL14F:
2118     case R_PARISC_DLTIND14R:
2119     case R_PARISC_DLTIND14F:
2120     case R_PARISC_LTOFF_FPTR14R:
2121     case R_PARISC_PCREL14R:
2122     case R_PARISC_PCREL14F:
2123     case R_PARISC_LTOFF_TP14R:
2124     case R_PARISC_LTOFF_TP14F:
2125     case R_PARISC_DPREL14R:
2126     case R_PARISC_DPREL14F:
2127     case R_PARISC_PLTOFF14R:
2128     case R_PARISC_PLTOFF14F:
2129     case R_PARISC_DIR14R:
2130     case R_PARISC_DIR14F:
2131       return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
2132
2133     /* PA2.0W LDO and integer loads/stores with 16 bit displacements.  */
2134     case R_PARISC_LTOFF_FPTR16F:
2135     case R_PARISC_PCREL16F:
2136     case R_PARISC_LTOFF_TP16F:
2137     case R_PARISC_GPREL16F:
2138     case R_PARISC_PLTOFF16F:
2139     case R_PARISC_DIR16F:
2140     case R_PARISC_LTOFF16F:
2141       return (insn & ~0xffff) | re_assemble_16 (sym_value);
2142
2143     /* Doubleword loads and stores with a 14 bit displacement.  */
2144     case R_PARISC_DLTREL14DR:
2145     case R_PARISC_DLTIND14DR:
2146     case R_PARISC_LTOFF_FPTR14DR:
2147     case R_PARISC_LTOFF_FPTR16DF:
2148     case R_PARISC_PCREL14DR:
2149     case R_PARISC_PCREL16DF:
2150     case R_PARISC_LTOFF_TP14DR:
2151     case R_PARISC_LTOFF_TP16DF:
2152     case R_PARISC_DPREL14DR:
2153     case R_PARISC_GPREL16DF:
2154     case R_PARISC_PLTOFF14DR:
2155     case R_PARISC_PLTOFF16DF:
2156     case R_PARISC_DIR14DR:
2157     case R_PARISC_DIR16DF:
2158     case R_PARISC_LTOFF16DF:
2159       return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
2160                                  | ((sym_value & 0x1ff8) << 1));
2161
2162     /* Floating point single word load/store instructions.  */
2163     case R_PARISC_DLTREL14WR:
2164     case R_PARISC_DLTIND14WR:
2165     case R_PARISC_LTOFF_FPTR14WR:
2166     case R_PARISC_LTOFF_FPTR16WF:
2167     case R_PARISC_PCREL14WR:
2168     case R_PARISC_PCREL16WF:
2169     case R_PARISC_LTOFF_TP14WR:
2170     case R_PARISC_LTOFF_TP16WF:
2171     case R_PARISC_DPREL14WR:
2172     case R_PARISC_GPREL16WF:
2173     case R_PARISC_PLTOFF14WR:
2174     case R_PARISC_PLTOFF16WF:
2175     case R_PARISC_DIR16WF:
2176     case R_PARISC_DIR14WR:
2177     case R_PARISC_LTOFF16WF:
2178       return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
2179                                  | ((sym_value & 0x1ffc) << 1));
2180
2181     default:
2182       return insn;
2183     }
2184 }
2185 #endif