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