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