OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [bfd/] [elf-hppa.h] - Blame information for rev 1181

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.