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