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