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