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