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