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