Change PAGE_SIZE to TARGET_PAGE_SIZE
[platform/upstream/binutils.git] / bfd / elf32-hppa.c
1 /* BFD back-end for HP PA-RISC ELF files.
2    Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
3
4    Written by
5
6         Center for Software Science
7         Department of Computer Science
8         University of Utah
9
10 This file is part of BFD, the Binary File Descriptor library.
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
25
26 #include "bfd.h"
27 #include "sysdep.h"
28 #include "bfdlink.h"
29 #include "libbfd.h"
30 #include "obstack.h"
31 #include "libelf.h"
32
33 /* The internal type of a symbol table extension entry.  */
34 typedef unsigned long symext_entryS;
35
36 /* The external type of a symbol table extension entry.  */
37 #define ELF32_PARISC_SX_SIZE (4)
38 #define ELF32_PARISC_SX_GET(bfd, addr) bfd_h_get_32 ((bfd), (addr))
39 #define ELF32_PARISC_SX_PUT(bfd, val, addr) \
40   bfd_h_put_32 ((bfd), (val), (addr))
41
42 /* HPPA symbol table extension entry types */
43 enum elf32_hppa_symextn_types
44 {
45   PARISC_SXT_NULL,
46   PARISC_SXT_SYMNDX,
47   PARISC_SXT_ARG_RELOC,
48 };
49
50 /* These macros compose and decompose the value of a symextn entry:
51
52    entry_type = ELF32_PARISC_SX_TYPE(word);
53    entry_value = ELF32_PARISC_SX_VAL(word);
54    word = ELF32_PARISC_SX_WORD(type,val);  */
55
56 #define ELF32_PARISC_SX_TYPE(p)         ((p) >> 24)
57 #define ELF32_PARISC_SX_VAL(p)          ((p) & 0xFFFFFF)
58 #define ELF32_PARISC_SX_WORD(type,val)  (((type) << 24) + (val & 0xFFFFFF))
59
60 /* The following was added facilitate implementation of the .hppa_symextn
61    section.  This section is built after the symbol table is built in the
62    elf_write_object_contents routine (called from bfd_close).  It is built
63    so late because it requires information that is not known until
64    the symbol and string table sections have been allocated, and
65    the symbol table has been built. */
66
67 #define SYMEXTN_SECTION_NAME ".PARISC.symext"
68
69 struct symext_chain
70   {
71     symext_entryS entry;
72     struct symext_chain *next;
73   };
74
75 typedef struct symext_chain symext_chainS;
76
77 /* We use three different hash tables to hold information for
78    linking PA ELF objects.
79
80    The first is the elf32_hppa_link_hash_table which is derived
81    from the standard ELF linker hash table.  We use this as a place to
82    attach other hash tables and static information.
83
84    The second is the stub hash table which is derived from the
85    base BFD hash table.  The stub hash table holds the information
86    necessary to build the linker stubs during a link.
87
88    The last hash table keeps track of argument location information needed
89    to build hash tables.  Each function with nonzero argument location
90    bits will have an entry in this table.  */
91
92 /* Hash table for linker stubs.  */
93
94 struct elf32_hppa_stub_hash_entry
95 {
96   /* Base hash table entry structure, we can get the name of the stub
97      (and thus know exactly what actions it performs) from the base
98      hash table entry.  */
99   struct bfd_hash_entry root;
100
101   /* Offset of the beginning of this stub.  */
102   bfd_vma offset;
103
104   /* Given the symbol's value and its section we can determine its final
105      value when building the stubs (so the stub knows where to jump.  */
106   symvalue target_value;
107   asection *target_section;
108 };
109
110 struct elf32_hppa_stub_hash_table
111 {
112   /* The hash table itself.  */
113   struct bfd_hash_table root;
114
115   /* The stub BFD.  */
116   bfd *stub_bfd;
117
118   /* Where to place the next stub.  */
119   bfd_byte *location;
120
121   /* Current offset in the stub section.  */
122   unsigned int offset;
123
124 };
125
126 /* Hash table for argument location information.  */
127
128 struct elf32_hppa_args_hash_entry
129 {
130   /* Base hash table entry structure.  */
131   struct bfd_hash_entry root;
132
133   /* The argument location bits for this entry.  */
134   int arg_bits;
135 };
136
137 struct elf32_hppa_args_hash_table
138 {
139   /* The hash table itself.  */
140   struct bfd_hash_table root;
141 };
142
143 struct elf32_hppa_link_hash_entry
144 {
145   struct elf_link_hash_entry root;
146 };
147
148 struct elf32_hppa_link_hash_table
149 {
150   /* The main hash table.  */
151   struct elf_link_hash_table root;
152
153   /* The stub hash table.  */
154   struct elf32_hppa_stub_hash_table *stub_hash_table;
155
156   /* The argument relocation bits hash table.  */
157   struct elf32_hppa_args_hash_table *args_hash_table;
158
159   /* A count of the number of output symbols.  */
160   unsigned int output_symbol_count;
161
162   /* Stuff so we can handle DP relative relocations.  */
163   long global_value;
164   int global_sym_defined;
165 };
166
167 /* FIXME.  */
168 #define ARGUMENTS       0
169 #define RETURN_VALUE    1
170
171 /* The various argument relocations that may be performed.  */
172 typedef enum
173 {
174   /* No relocation.  */
175   NO,
176   /* Relocate 32 bits from GR to FP register.  */
177   GF,
178   /* Relocate 64 bits from a GR pair to FP pair.  */
179   GD,
180   /* Relocate 32 bits from FP to GR.  */
181   FG,
182   /* Relocate 64 bits from FP pair to GR pair.  */
183   DG,
184 } arg_reloc_type;
185
186 /* What is being relocated (eg which argument or the return value).  */
187 typedef enum
188 {
189   ARG0, ARG1, ARG2, ARG3, RET,
190 } arg_reloc_location;
191
192
193 /* ELF32/HPPA relocation support
194
195         This file contains ELF32/HPPA relocation support as specified
196         in the Stratus FTX/Golf Object File Format (SED-1762) dated
197         February 1994.  */
198
199 #include "elf32-hppa.h"
200 #include "hppa_stubs.h"
201
202 static bfd_reloc_status_type hppa_elf_reloc
203   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
204
205 static unsigned long hppa_elf_relocate_insn
206   PARAMS ((bfd *, asection *, unsigned long, unsigned long, long,
207            long, unsigned long, unsigned long, unsigned long));
208
209 static bfd_reloc_status_type hppa_elf_reloc
210   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd*, char **));
211
212 static reloc_howto_type * elf_hppa_reloc_type_lookup
213   PARAMS ((bfd *, bfd_reloc_code_real_type));
214
215 static boolean elf32_hppa_set_section_contents
216   PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
217
218 static void elf_info_to_howto
219   PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
220
221 static boolean elf32_hppa_backend_symbol_table_processing
222   PARAMS ((bfd *, elf_symbol_type *, int));
223
224 static void elf32_hppa_backend_begin_write_processing
225   PARAMS ((bfd *, struct bfd_link_info *));
226
227 static void elf32_hppa_backend_final_write_processing
228   PARAMS ((bfd *, boolean));
229
230 static void add_entry_to_symext_chain
231   PARAMS ((bfd *, unsigned int, unsigned int, symext_chainS **,
232            symext_chainS **));
233
234 static void
235 elf_hppa_tc_make_sections PARAMS ((bfd *, symext_chainS *));
236
237 static boolean hppa_elf_is_local_label PARAMS ((bfd *, asymbol *));
238
239 static boolean elf32_hppa_add_symbol_hook
240   PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
241            const char **, flagword *, asection **, bfd_vma *));
242
243 static bfd_reloc_status_type elf32_hppa_bfd_final_link_relocate
244   PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *,
245            bfd_byte *, bfd_vma, bfd_vma, bfd_vma, struct bfd_link_info *,
246            asection *, const char *, int));
247
248 static struct bfd_link_hash_table *elf32_hppa_link_hash_table_create
249   PARAMS ((bfd *));
250
251 static struct bfd_hash_entry *
252 elf32_hppa_stub_hash_newfunc
253   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
254
255 static struct bfd_hash_entry *
256 elf32_hppa_args_hash_newfunc
257   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
258
259 static boolean
260 elf32_hppa_relocate_section
261   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
262            bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
263
264 static boolean
265 elf32_hppa_stub_hash_table_init
266   PARAMS ((struct elf32_hppa_stub_hash_table *, bfd *,
267            struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *,
268                                                struct bfd_hash_table *,
269                                                const char *))));
270
271 static boolean
272 elf32_hppa_build_one_stub PARAMS ((struct bfd_hash_entry *, PTR));
273
274 static boolean
275 elf32_hppa_read_symext_info
276   PARAMS ((bfd *, Elf_Internal_Shdr *, struct elf32_hppa_args_hash_table *,
277            Elf_Internal_Sym *));
278
279 static unsigned int elf32_hppa_size_of_stub
280   PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, const char *));
281
282 static boolean elf32_hppa_arg_reloc_needed
283   PARAMS ((unsigned int, unsigned int, arg_reloc_type []));
284
285 static void elf32_hppa_name_of_stub
286   PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, char *));
287
288 static boolean elf32_hppa_size_symext PARAMS ((struct bfd_hash_entry *, PTR));
289
290 static boolean elf32_hppa_link_output_symbol_hook
291   PARAMS ((bfd *, struct bfd_link_info *, const char *,
292            Elf_Internal_Sym *, asection *));
293
294 /* ELF/PA relocation howto entries.  */
295
296 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
297 {
298   {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_NONE"},
299   {R_PARISC_DIR32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR32"},
300   {R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR21L"},
301   {R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR17R"},
302   {R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR17F"},
303   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
304   {R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR14R"},
305   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
306
307   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
308   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
309   {R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL21L"},
310   {R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17R"},
311   {R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17F"},
312   {R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17C"},
313   {R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL14R"},
314   {R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL14F"},
315
316   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
317   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
318   {R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL21L"},
319   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
320   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
321   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
322   {R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL14R"},
323   {R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL14F"},
324
325   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
326   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
327   {R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL21L"},
328   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
329   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
330   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
331   {R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL14R"},
332   {R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL14F"},
333
334   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
335   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
336   {R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND21L"},
337   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
338   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
339   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
340   {R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND14R"},
341   {R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND14F"},
342
343   {R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_SETBASE"},
344   {R_PARISC_BASEREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL32"},
345   {R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL21L"},
346   {R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL17R"},
347   {R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL17F"},
348   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
349   {R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL14R"},
350   {R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL14F"},
351
352   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
353   {R_PARISC_TEXTREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_TEXTREL32"},
354   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
355   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
356   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
357   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
358   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
359   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
360
361   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
362   {R_PARISC_DATAREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
363   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
364   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
365   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
366   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
367   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
368   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
369
370
371   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
372   {R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL32"},
373   {R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL21L"},
374   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
375   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
376   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
377   {R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL14R"},
378   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
379
380   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
381   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
382   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
383   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
384   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
385   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
386   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
387   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
388
389   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
390   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
391   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
392   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
393   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
394   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
395   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
396   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
397   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
398   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
399   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
400   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
401   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
402   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
403   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
404   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
405
406   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
407   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
408   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
409   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
410   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
411   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
412   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
413   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
414   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
415   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
416   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
417   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
418   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
419   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
420   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
421   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
422
423   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
424   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
425   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
426   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
427   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
428   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
429   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
430   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
431   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
432   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
433   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
434   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
435   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
436   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
437   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
438   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
439
440
441   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
442   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
443   {R_PARISC_PLTIND21L, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND21L"},
444   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
445   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
446   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
447   {R_PARISC_PLTIND14R, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND14R"},
448   {R_PARISC_PLTIND14F, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND14F"},
449
450
451   {R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_COPY"},
452   {R_PARISC_GLOB_DAT, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_GLOB_DAT"},
453   {R_PARISC_JMP_SLOT, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_JMP_SLOT"},
454   {R_PARISC_RELATIVE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_RELATIVE"},
455
456   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
457 };
458
459 /* Where (what register type) is an argument comming from?  */
460 typedef enum
461 {
462   AR_NO,
463   AR_GR,
464   AR_FR,
465   AR_FU,
466   AR_FPDBL1,
467   AR_FPDBL2,
468 } arg_location;
469
470 /* Horizontal represents the callee's argument location information,
471    vertical represents caller's argument location information.  Value at a
472    particular X,Y location represents what (if any) argument relocation
473    needs to be performed to make caller and callee agree.  */
474
475 static CONST arg_reloc_type arg_mismatches[6][6] =
476 {
477   {NO, NO, NO, NO, NO, NO},
478   {NO, NO, GF, NO, GD, NO},
479   {NO, FG, NO, NO, NO, NO},
480   {NO, NO, NO, NO, NO, NO},
481   {NO, DG, NO, NO, NO, NO},
482   {NO, DG, NO, NO, NO, NO},
483 };
484
485 /* Likewise, but reversed for the return value.  */
486 static CONST arg_reloc_type ret_mismatches[6][6] =
487 {
488   {NO, NO, NO, NO, NO, NO},
489   {NO, NO, FG, NO, DG, NO},
490   {NO, GF, NO, NO, NO, NO},
491   {NO, NO, NO, NO, NO, NO},
492   {NO, GD, NO, NO, NO, NO},
493   {NO, GD, NO, NO, NO, NO},
494 };
495
496 /* Misc static crud for symbol extension records.  */
497 static symext_chainS *symext_rootP;
498 static symext_chainS *symext_lastP;
499 static bfd_size_type symext_chain_size;
500
501 /* FIXME: We should be able to try this static variable!  */
502 static bfd_byte *symextn_contents;
503
504
505 /* For linker stub hash tables.  */
506 #define elf32_hppa_stub_hash_lookup(table, string, create, copy) \
507   ((struct elf32_hppa_stub_hash_entry *) \
508    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
509
510 #define elf32_hppa_stub_hash_traverse(table, func, info) \
511   (bfd_hash_traverse \
512    (&(table)->root, \
513     (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
514     (info)))
515
516 /* For linker args hash tables.  */
517 #define elf32_hppa_args_hash_lookup(table, string, create, copy) \
518   ((struct elf32_hppa_args_hash_entry *) \
519    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
520
521 #define elf32_hppa_args_hash_traverse(table, func, info) \
522   (bfd_hash_traverse \
523    (&(table)->root, \
524     (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
525     (info)))
526
527 #define elf32_hppa_args_hash_table_init(table, newfunc) \
528   (bfd_hash_table_init \
529    (&(table)->root, \
530     (struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *, \
531                                          struct bfd_hash_table *, \
532                                          const char *))) (newfunc)))
533
534 /* For HPPA linker hash table.  */
535
536 #define elf32_hppa_link_hash_lookup(table, string, create, copy, follow)\
537   ((struct elf32_hppa_link_hash_entry *)                                \
538    elf_link_hash_lookup (&(table)->root, (string), (create),            \
539                          (copy), (follow)))
540
541 #define elf32_hppa_link_hash_traverse(table, func, info)                \
542   (elf_link_hash_traverse                                               \
543    (&(table)->root,                                                     \
544     (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
545     (info)))
546
547 /* Get the PA ELF linker hash table from a link_info structure.  */
548
549 #define elf32_hppa_hash_table(p) \
550   ((struct elf32_hppa_link_hash_table *) ((p)->hash))
551
552
553 /* Extract specific argument location bits for WHICH from
554    the full argument location in AR.  */
555 #define EXTRACT_ARBITS(ar, which) ((ar) >> (8 - ((which) * 2))) & 3
556
557 /* Assorted hash table functions.  */
558
559 /* Initialize an entry in the stub hash table.  */
560
561 static struct bfd_hash_entry *
562 elf32_hppa_stub_hash_newfunc (entry, table, string)
563      struct bfd_hash_entry *entry;
564      struct bfd_hash_table *table;
565      const char *string;
566 {
567   struct elf32_hppa_stub_hash_entry *ret;
568
569   ret = (struct elf32_hppa_stub_hash_entry *) entry;
570
571   /* Allocate the structure if it has not already been allocated by a
572      subclass.  */
573   if (ret == NULL)
574     ret = ((struct elf32_hppa_stub_hash_entry *)
575            bfd_hash_allocate (table,
576                               sizeof (struct elf32_hppa_stub_hash_entry)));
577   if (ret == NULL)
578     {
579       bfd_set_error (bfd_error_no_memory);
580       return NULL;
581     }
582
583   /* Call the allocation method of the superclass.  */
584   ret = ((struct elf32_hppa_stub_hash_entry *)
585          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
586
587   if (ret)
588     {
589       /* Initialize the local fields.  */
590       ret->offset = 0;
591       ret->target_value = 0;
592       ret->target_section = NULL;
593     }
594
595   return (struct bfd_hash_entry *) ret;
596 }
597
598 /* Initialize a stub hash table.  */
599
600 static boolean
601 elf32_hppa_stub_hash_table_init (table, stub_bfd, newfunc)
602      struct elf32_hppa_stub_hash_table *table;
603      bfd *stub_bfd;
604      struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
605                                                 struct bfd_hash_table *,
606                                                 const char *));
607 {
608   table->offset = 0;
609   table->location = 0;
610   table->stub_bfd = stub_bfd;
611   return (bfd_hash_table_init (&table->root, newfunc));
612 }
613
614 /* Initialize an entry in the argument location hash table.  */
615
616 static struct bfd_hash_entry *
617 elf32_hppa_args_hash_newfunc (entry, table, string)
618      struct bfd_hash_entry *entry;
619      struct bfd_hash_table *table;
620      const char *string;
621 {
622   struct elf32_hppa_args_hash_entry *ret;
623
624   ret = (struct elf32_hppa_args_hash_entry *) entry;
625
626   /* Allocate the structure if it has not already been allocated by a
627      subclass.  */
628   if (ret == NULL)
629     ret = ((struct elf32_hppa_args_hash_entry *)
630            bfd_hash_allocate (table,
631                               sizeof (struct elf32_hppa_args_hash_entry)));
632   if (ret == NULL)
633     {
634       bfd_set_error (bfd_error_no_memory);
635       return NULL;
636     }
637
638   /* Call the allocation method of the superclass.  */
639   ret = ((struct elf32_hppa_args_hash_entry *)
640          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
641
642   /* Initialize the local fields.  */
643   if (ret)
644     ret->arg_bits = 0;
645
646   return (struct bfd_hash_entry *) ret;
647 }
648
649 /* Create the derived linker hash table.  The PA ELF port uses the derived
650    hash table to keep information specific to the PA ELF linker (without
651    using static variables).  */
652
653 static struct bfd_link_hash_table *
654 elf32_hppa_link_hash_table_create (abfd)
655      bfd *abfd;
656 {
657   struct elf32_hppa_link_hash_table *ret;
658
659   ret = ((struct elf32_hppa_link_hash_table *)
660          bfd_alloc (abfd, sizeof (struct elf32_hppa_link_hash_table)));
661   if (ret == NULL)
662     {
663       bfd_set_error (bfd_error_no_memory);
664       return NULL;
665     }
666   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
667                                       _bfd_elf_link_hash_newfunc))
668     {
669       bfd_release (abfd, ret);
670       return NULL;
671     }
672   ret->stub_hash_table = NULL;
673   ret->args_hash_table = NULL;
674   ret->output_symbol_count = 0;
675   ret->global_value = 0;
676   ret->global_sym_defined = 0;
677
678   return &ret->root.root;
679 }
680
681 /* Relocate the given INSN given the various input parameters.
682
683    FIXME: endianness and sizeof (long) issues abound here.  */
684
685 static unsigned long
686 hppa_elf_relocate_insn (abfd, input_sect, insn, address, sym_value,
687                         r_addend, r_format, r_field, pcrel)
688      bfd *abfd;
689      asection *input_sect;
690      unsigned long insn;
691      unsigned long address;
692      long sym_value;
693      long r_addend;
694      unsigned long r_format;
695      unsigned long r_field;
696      unsigned long pcrel;
697 {
698   unsigned char opcode = get_opcode (insn);
699   long constant_value;
700
701   switch (opcode)
702     {
703     case LDO:
704     case LDB:
705     case LDH:
706     case LDW:
707     case LDWM:
708     case STB:
709     case STH:
710     case STW:
711     case STWM:
712     case COMICLR:
713     case SUBI:
714     case ADDIT:
715     case ADDI:
716     case LDIL:
717     case ADDIL:
718       constant_value = HPPA_R_CONSTANT (r_addend);
719
720       if (pcrel)
721         sym_value -= address;
722
723       sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
724       return hppa_rebuild_insn (abfd, insn, sym_value, r_format);
725
726     case BL:
727     case BE:
728     case BLE:
729       /* XXX computing constant_value is not needed??? */
730       constant_value = assemble_17 ((insn & 0x001f0000) >> 16,
731                                     (insn & 0x00001ffc) >> 2,
732                                     insn & 1);
733
734       constant_value = (constant_value << 15) >> 15;
735       if (pcrel)
736         {
737           sym_value -=
738             address + input_sect->output_offset
739             + input_sect->output_section->vma;
740           sym_value = hppa_field_adjust (sym_value, -8, r_field);
741         }
742       else
743         sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
744
745       return hppa_rebuild_insn (abfd, insn, sym_value >> 2, r_format);
746
747     default:
748       if (opcode == 0)
749         {
750           constant_value = HPPA_R_CONSTANT (r_addend);
751
752           if (pcrel)
753             sym_value -= address;
754
755           return hppa_field_adjust (sym_value, constant_value, r_field);
756         }
757       else
758         abort ();
759     }
760 }
761
762 /* Relocate an HPPA ELF section.  */
763
764 static boolean
765 elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
766                              contents, relocs, local_syms, local_sections)
767      bfd *output_bfd;
768      struct bfd_link_info *info;
769      bfd *input_bfd;
770      asection *input_section;
771      bfd_byte *contents;
772      Elf_Internal_Rela *relocs;
773      Elf_Internal_Sym *local_syms;
774      asection **local_sections;
775 {
776   Elf_Internal_Shdr *symtab_hdr;
777   Elf_Internal_Rela *rel;
778   Elf_Internal_Rela *relend;
779
780   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
781
782   rel = relocs;
783   relend = relocs + input_section->reloc_count;
784   for (; rel < relend; rel++)
785     {
786       int r_type;
787       reloc_howto_type *howto;
788       long r_symndx;
789       struct elf_link_hash_entry *h;
790       Elf_Internal_Sym *sym;
791       asection *sym_sec;
792       bfd_vma relocation;
793       bfd_reloc_status_type r;
794       const char *sym_name;
795
796       r_type = ELF32_R_TYPE (rel->r_info);
797       if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
798         {
799           bfd_set_error (bfd_error_bad_value);
800           return false;
801         }
802       howto = elf_hppa_howto_table + r_type;
803
804       r_symndx = ELF32_R_SYM (rel->r_info);
805
806       if (info->relocateable)
807         {
808           /* This is a relocateable link.  We don't have to change
809              anything, unless the reloc is against a section symbol,
810              in which case we have to adjust according to where the
811              section symbol winds up in the output section.  */
812           if (r_symndx < symtab_hdr->sh_info)
813             {
814               sym = local_syms + r_symndx;
815               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
816                 {
817                   sym_sec = local_sections[r_symndx];
818                   rel->r_addend += sym_sec->output_offset;
819                 }
820             }
821
822           continue;
823         }
824
825       /* This is a final link.  */
826       h = NULL;
827       sym = NULL;
828       sym_sec = NULL;
829       if (r_symndx < symtab_hdr->sh_info)
830         {
831           sym = local_syms + r_symndx;
832           sym_sec = local_sections[r_symndx];
833           relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
834                            ? 0 : sym->st_value)
835                          + sym_sec->output_offset
836                          + sym_sec->output_section->vma);
837         }
838       else
839         {
840           long indx;
841
842           indx = r_symndx - symtab_hdr->sh_info;
843           h = elf_sym_hashes (input_bfd)[indx];
844           if (h->root.type == bfd_link_hash_defined
845               || h->root.type == bfd_link_hash_defweak)
846             {
847               sym_sec = h->root.u.def.section;
848               relocation = (h->root.u.def.value
849                             + sym_sec->output_offset
850                             + sym_sec->output_section->vma);
851             }
852           else if (h->root.type == bfd_link_hash_undefweak)
853             relocation = 0;
854           else
855             {
856               if (!((*info->callbacks->undefined_symbol)
857                     (info, h->root.root.string, input_bfd,
858                      input_section, rel->r_offset)))
859                 return false;
860               break;
861             }
862         }
863
864       if (h != NULL)
865         sym_name = h->root.root.string;
866       else
867         {
868           sym_name = bfd_elf_string_from_elf_section (input_bfd,
869                                                       symtab_hdr->sh_link,
870                                                       sym->st_name);
871           if (sym_name == NULL)
872             return false;
873           if (*sym_name == '\0')
874             sym_name = bfd_section_name (input_bfd, sym_sec);
875         }
876
877       /* If args_hash_table is NULL, then we have encountered some
878          kind of link error (ex. undefined symbols).  Do not try to
879          apply any relocations, continue the loop so we can notify
880          the user of several errors in a single attempted link.  */
881       if (elf32_hppa_hash_table (info)->args_hash_table == NULL)
882         continue;
883
884       r = elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
885                                               input_section, contents,
886                                               rel->r_offset, relocation,
887                                               rel->r_addend, info, sym_sec,
888                                               sym_name, h == NULL);
889
890       if (r != bfd_reloc_ok)
891         {
892           switch (r)
893             {
894             /* This can happen for DP relative relocs if $global$ is
895                undefined.  This is a panic situation so we don't try
896                to continue.  */
897             case bfd_reloc_undefined:
898             case bfd_reloc_notsupported:
899               if (!((*info->callbacks->undefined_symbol)
900                     (info, "$global$", input_bfd,
901                      input_section, rel->r_offset)))
902                 return false;
903               return false;
904             case bfd_reloc_dangerous:
905               {
906                 /* We use this return value to indicate that we performed
907                    a "dangerous" relocation.  This doesn't mean we did
908                    the wrong thing, it just means there may be some cleanup
909                    that needs to be done here.
910
911                    In particular we had to swap the last call insn and its
912                    delay slot.  If the delay slot insn needed a relocation,
913                    then we'll need to adjust the next relocation entry's
914                    offset to account for the fact that the insn moved.
915
916                    This hair wouldn't be necessary if we inserted stubs
917                    between procedures and used a "bl" to get to the stub.  */
918                 if (rel != relend)
919                   {
920                     Elf_Internal_Rela *next_rel = rel + 1;
921
922                     if (rel->r_offset + 4 == next_rel->r_offset)
923                       next_rel->r_offset -= 4;
924                   }
925                 break;
926               }
927             default:
928             case bfd_reloc_outofrange:
929             case bfd_reloc_overflow:
930               {
931                 if (!((*info->callbacks->reloc_overflow)
932                       (info, sym_name, howto->name, (bfd_vma) 0,
933                         input_bfd, input_section, rel->r_offset)))
934                   return false;
935               }
936               break;
937             }
938         }
939     }
940
941   return true;
942 }
943
944 /* Return one (or more) BFD relocations which implement the base
945    relocation with modifications based on format and field.  */
946
947 elf32_hppa_reloc_type **
948 hppa_elf_gen_reloc_type (abfd, base_type, format, field)
949      bfd *abfd;
950      elf32_hppa_reloc_type base_type;
951      int format;
952      int field;
953 {
954   elf32_hppa_reloc_type *finaltype;
955   elf32_hppa_reloc_type **final_types;
956
957   /* Allocate slots for the BFD relocation.  */
958   final_types = (elf32_hppa_reloc_type **)
959     bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type *) * 2);
960   if (final_types == NULL)
961     return NULL;
962
963   /* Allocate space for the relocation itself.  */
964   finaltype = (elf32_hppa_reloc_type *)
965     bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type));
966   if (finaltype == NULL)
967     return NULL;
968
969   /* Some reasonable defaults.  */
970   final_types[0] = finaltype;
971   final_types[1] = NULL;
972
973 #define final_type finaltype[0]
974
975   final_type = base_type;
976
977   /* Just a tangle of nested switch statements to deal with the braindamage
978      that a different field selector means a completely different relocation
979      for PA ELF.  */
980   switch (base_type)
981     {
982     case R_HPPA:
983     case R_HPPA_ABS_CALL:
984       switch (format)
985         {
986         case 14:
987           switch (field)
988             {
989             case e_rsel:
990             case e_rrsel:
991               final_type = R_PARISC_DIR14R;
992               break;
993             case e_rtsel:
994               final_type = R_PARISC_DLTREL14R;
995               break;
996             case e_tsel:
997               final_type = R_PARISC_DLTREL14F;
998               break;
999             case e_rpsel:
1000               final_type = R_PARISC_PLABEL14R;
1001               break;
1002             default:
1003               return NULL;
1004             }
1005           break;
1006
1007         case 17:
1008           switch (field)
1009             {
1010             case e_fsel:
1011               final_type = R_PARISC_DIR17F;
1012               break;
1013             case e_rsel:
1014             case e_rrsel:
1015               final_type = R_PARISC_DIR17R;
1016               break;
1017             default:
1018               return NULL;
1019             }
1020           break;
1021
1022         case 21:
1023           switch (field)
1024             {
1025             case e_lsel:
1026             case e_lrsel:
1027               final_type = R_PARISC_DIR21L;
1028               break;
1029             case e_ltsel:
1030               final_type = R_PARISC_DLTREL21L;
1031               break;
1032             case e_lpsel:
1033               final_type = R_PARISC_PLABEL21L;
1034               break;
1035             default:
1036               return NULL;
1037             }
1038           break;
1039
1040         case 32:
1041           switch (field)
1042             {
1043             case e_fsel:
1044               final_type = R_PARISC_DIR32;
1045               break;
1046             case e_psel:
1047               final_type = R_PARISC_PLABEL32;
1048               break;
1049             default:
1050               return NULL;
1051             }
1052           break;
1053
1054         default:
1055           return NULL;
1056         }
1057       break;
1058
1059
1060     case R_HPPA_GOTOFF:
1061       switch (format)
1062         {
1063         case 14:
1064           switch (field)
1065             {
1066             case e_rsel:
1067             case e_rrsel:
1068               final_type = R_PARISC_DPREL14R;
1069               break;
1070             case e_fsel:
1071               final_type = R_PARISC_DPREL14F;
1072               break;
1073             default:
1074               return NULL;
1075             }
1076           break;
1077
1078         case 21:
1079           switch (field)
1080             {
1081             case e_lrsel:
1082             case e_lsel:
1083               final_type = R_PARISC_DPREL21L;
1084               break;
1085             default:
1086               return NULL;
1087             }
1088           break;
1089
1090         default:
1091           return NULL;
1092         }
1093       break;
1094
1095
1096     case R_HPPA_PCREL_CALL:
1097       switch (format)
1098         {
1099         case 14:
1100           switch (field)
1101             {
1102             case e_rsel:
1103             case e_rrsel:
1104               final_type = R_PARISC_PCREL14R;
1105               break;
1106             case e_fsel:
1107               final_type = R_PARISC_PCREL14F;
1108               break;
1109             default:
1110               return NULL;
1111             }
1112           break;
1113
1114         case 17:
1115           switch (field)
1116             {
1117             case e_rsel:
1118             case e_rrsel:
1119               final_type = R_PARISC_PCREL17R;
1120               break;
1121             case e_fsel:
1122               final_type = R_PARISC_PCREL17F;
1123               break;
1124             default:
1125               return NULL;
1126             }
1127           break;
1128
1129         case 21:
1130           switch (field)
1131             {
1132             case e_lsel:
1133             case e_lrsel:
1134               final_type = R_PARISC_PCREL21L;
1135               break;
1136             default:
1137               return NULL;
1138             }
1139           break;
1140
1141         default:
1142           return NULL;
1143         }
1144       break;
1145
1146     default:
1147       return NULL;
1148     }
1149
1150   return final_types;
1151 }
1152
1153 #undef final_type
1154
1155 /* Set the contents of a particular section at a particular location.  */
1156
1157 static boolean
1158 elf32_hppa_set_section_contents (abfd, section, location, offset, count)
1159      bfd *abfd;
1160      sec_ptr section;
1161      PTR location;
1162      file_ptr offset;
1163      bfd_size_type count;
1164 {
1165   /* Ignore write requests for the symbol extension section until we've
1166      had the chance to rebuild it ourselves.  */
1167   if (!strcmp (section->name, ".PARISC.symextn") && !symext_chain_size)
1168     return true;
1169   else
1170     return _bfd_elf_set_section_contents (abfd, section, location,
1171                                           offset, count);
1172 }
1173
1174 /* Translate from an elf into field into a howto relocation pointer.  */
1175
1176 static void
1177 elf_info_to_howto (abfd, cache_ptr, dst)
1178      bfd *abfd;
1179      arelent *cache_ptr;
1180      Elf32_Internal_Rela *dst;
1181 {
1182   BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_PARISC_UNIMPLEMENTED);
1183   cache_ptr->howto = &elf_hppa_howto_table[ELF32_R_TYPE (dst->r_info)];
1184 }
1185
1186
1187 /* Actually perform a relocation.  NOTE this is (mostly) superceeded
1188    by elf32_hppa_bfd_final_link_relocate which is called by the new
1189    fast linker.  */
1190
1191 static bfd_reloc_status_type
1192 hppa_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
1193                 error_message)
1194      bfd *abfd;
1195      arelent *reloc_entry;
1196      asymbol *symbol_in;
1197      PTR data;
1198      asection *input_section;
1199      bfd *output_bfd;
1200      char **error_message;
1201 {
1202   /* It is no longer valid to call hppa_elf_reloc when creating
1203      a final executable.  */
1204   if (output_bfd)
1205     {
1206       reloc_entry->address += input_section->output_offset;
1207
1208       /* Work around lossage in generic elf code to write relocations.
1209          (maps different section symbols into the same symbol index).  */
1210       if ((symbol_in->flags & BSF_SECTION_SYM)
1211           && symbol_in->section)
1212         reloc_entry->addend += symbol_in->section->output_offset;
1213       return bfd_reloc_ok;
1214     }
1215   else
1216     {
1217       *error_message = (char *) "Unsupported call to hppa_elf_reloc";
1218       return bfd_reloc_notsupported;
1219     }
1220 }
1221
1222 /* Actually perform a relocation as part of a final link.  This can get
1223    rather hairy when linker stubs are needed.  */
1224
1225 static bfd_reloc_status_type
1226 elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
1227                                     input_section, contents, offset, value,
1228                                     addend, info, sym_sec, sym_name, is_local)
1229      reloc_howto_type *howto;
1230      bfd *input_bfd;
1231      bfd *output_bfd;
1232      asection *input_section;
1233      bfd_byte *contents;
1234      bfd_vma offset;
1235      bfd_vma value;
1236      bfd_vma addend;
1237      struct bfd_link_info *info;
1238      asection *sym_sec;
1239      const char *sym_name;
1240      int is_local;
1241 {
1242   unsigned long insn;
1243   unsigned long r_type = howto->type;
1244   unsigned long r_format = howto->bitsize;
1245   unsigned long r_field = e_fsel;
1246   bfd_byte *hit_data = contents + offset;
1247   boolean r_pcrel = howto->pc_relative;
1248
1249   insn = bfd_get_32 (input_bfd, hit_data);
1250
1251   /* Make sure we have a value for $global$.  FIXME isn't this effectively
1252      just like the gp pointer on MIPS?  Can we use those routines for this
1253      purpose?  */
1254   if (!elf32_hppa_hash_table (info)->global_sym_defined)
1255     {
1256       struct elf_link_hash_entry *h;
1257       asection *sec;
1258
1259       h = elf_link_hash_lookup (elf_hash_table (info), "$global$", false,
1260                                  false, false);
1261
1262       /* If there isn't a $global$, then we're in deep trouble.  */
1263       if (h == NULL)
1264         return bfd_reloc_notsupported;
1265
1266       /* If $global$ isn't a defined symbol, then we're still in deep
1267          trouble.  */
1268       if (h->root.type != bfd_link_hash_defined)
1269         return bfd_reloc_undefined;
1270
1271       sec = h->root.u.def.section;
1272       elf32_hppa_hash_table (info)->global_value = (h->root.u.def.value
1273                                                     + sec->output_section->vma
1274                                                     + sec->output_offset);
1275       elf32_hppa_hash_table (info)->global_sym_defined = 1;
1276     }
1277
1278   switch (r_type)
1279     {
1280     case R_PARISC_NONE:
1281       break;
1282
1283     case R_PARISC_DIR32:
1284     case R_PARISC_DIR17F:
1285     case R_PARISC_PCREL17C:
1286       r_field = e_fsel;
1287       goto do_basic_type_1;
1288     case R_PARISC_DIR21L:
1289     case R_PARISC_PCREL21L:
1290       r_field = e_lrsel;
1291       goto do_basic_type_1;
1292     case R_PARISC_DIR17R:
1293     case R_PARISC_PCREL17R:
1294     case R_PARISC_DIR14R:
1295     case R_PARISC_PCREL14R:
1296       r_field = e_rrsel;
1297       goto do_basic_type_1;
1298
1299     /* For all the DP relative relocations, we need to examine the symbol's
1300        section.  If it's a code section, then "data pointer relative" makes
1301        no sense.  In that case we don't adjust the "value", and for 21 bit
1302        addil instructions, we change the source addend register from %dp to
1303        %r0.  */
1304     case R_PARISC_DPREL21L:
1305       r_field = e_lrsel;
1306       if (sym_sec->flags & SEC_CODE)
1307         {
1308           if ((insn & 0xfc000000) >> 26 == 0xa
1309                && (insn & 0x03e00000) >> 21 == 0x1b)
1310             insn &= ~0x03e00000;
1311         }
1312       else
1313         value -= elf32_hppa_hash_table (info)->global_value;
1314       goto do_basic_type_1;
1315     case R_PARISC_DPREL14R:
1316       r_field = e_rrsel;
1317       if ((sym_sec->flags & SEC_CODE) == 0)
1318         value -= elf32_hppa_hash_table (info)->global_value;
1319       goto do_basic_type_1;
1320     case R_PARISC_DPREL14F:
1321       r_field = e_fsel;
1322       if ((sym_sec->flags & SEC_CODE) == 0)
1323         value -= elf32_hppa_hash_table (info)->global_value;
1324       goto do_basic_type_1;
1325
1326     /* These cases are separate as they may involve a lot more work
1327        to deal with linker stubs.  */
1328     case R_PARISC_PLABEL32:
1329     case R_PARISC_PLABEL21L:
1330     case R_PARISC_PLABEL14R:
1331     case R_PARISC_PCREL17F:
1332       {
1333         bfd_vma location;
1334         unsigned int len, caller_args, callee_args;
1335         arg_reloc_type arg_reloc_types[5];
1336         struct elf32_hppa_args_hash_table *args_hash_table;
1337         struct elf32_hppa_args_hash_entry *args_hash;
1338         char *new_name, *stub_name;
1339
1340         /* Get the field selector right.  We'll need it in a minute.  */
1341         if (r_type == R_PARISC_PCREL17F
1342             || r_type == R_PARISC_PLABEL32)
1343           r_field = e_fsel;
1344         else if (r_type == R_PARISC_PLABEL21L)
1345           r_field = e_lrsel;
1346         else if (r_type == R_PARISC_PLABEL14R)
1347           r_field = e_rrsel;
1348
1349         /* Find out where we are and where we're going.  */
1350         location = (offset +
1351                     input_section->output_offset +
1352                     input_section->output_section->vma);
1353
1354         /* Now look for the argument relocation bits associated with the
1355            target.  */
1356         len = strlen (sym_name) + 1;
1357         if (is_local)
1358           len += 9;
1359         new_name = malloc (len);
1360         if (!new_name)
1361           {
1362             bfd_set_error (bfd_error_no_memory);
1363             return bfd_reloc_notsupported;
1364           }
1365         strcpy (new_name, sym_name);
1366
1367         /* Local symbols have unique IDs.  */
1368         if (is_local)
1369           sprintf (new_name + len - 10, "_%08x", (int)sym_sec);
1370
1371         args_hash_table = elf32_hppa_hash_table (info)->args_hash_table;
1372
1373         args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
1374                                                  new_name, false, false);
1375         if (args_hash == NULL)
1376           callee_args = 0;
1377         else
1378           callee_args = args_hash->arg_bits;
1379
1380         /* If this is a CALL relocation, then get the caller's bits
1381            from the addend.  Else use the magic 0x155 value for PLABELS.
1382
1383            Also we don't care about the destination (value) for PLABELS.  */
1384         if (r_type == R_PARISC_PCREL17F)
1385           caller_args = HPPA_R_ARG_RELOC (addend);
1386         else
1387           {
1388             caller_args = 0x155;
1389             location = value;
1390           }
1391
1392         /* Any kind of linker stub needed?  */
1393         if (((int)(value - location) > 0x3ffff)
1394             || ((int)(value - location) < (int)0xfffc0000)
1395             || elf32_hppa_arg_reloc_needed (caller_args, callee_args,
1396                                             arg_reloc_types))
1397           {
1398             struct elf32_hppa_stub_hash_table *stub_hash_table;
1399             struct elf32_hppa_stub_hash_entry *stub_hash;
1400             asection *stub_section;
1401
1402             /* Build a name for the stub.  */
1403
1404             len = strlen (new_name);
1405             len += 23;
1406             stub_name = malloc (len);
1407             if (!stub_name)
1408               {
1409                 bfd_set_error (bfd_error_no_memory);
1410                 return bfd_reloc_notsupported;
1411               }
1412             elf32_hppa_name_of_stub (caller_args, callee_args,
1413                                      location, value, stub_name);
1414             strcat (stub_name, new_name);
1415             free (new_name);
1416
1417             stub_hash_table = elf32_hppa_hash_table (info)->stub_hash_table;
1418
1419             stub_hash
1420               = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
1421                                              false, false);
1422
1423             /* We're done with that name.  */
1424             free (stub_name);
1425
1426             /* The stub BFD only has one section.  */
1427             stub_section = stub_hash_table->stub_bfd->sections;
1428
1429             if (stub_hash != NULL)
1430               {
1431
1432                 if (r_type == R_PARISC_PCREL17F)
1433                   {
1434                     unsigned long delay_insn;
1435                     unsigned int opcode, rtn_reg, ldo_target_reg, ldo_src_reg;
1436
1437                     /* We'll need to peek at the next insn.  */
1438                     delay_insn = bfd_get_32 (input_bfd, hit_data + 4);
1439                     opcode = get_opcode (delay_insn);
1440
1441                     /* We also need to know the return register for this
1442                        call.  */
1443                     rtn_reg = (insn & 0x03e00000) >> 21;
1444
1445                     ldo_src_reg = (delay_insn & 0x03e00000) >> 21;
1446                     ldo_target_reg = (delay_insn & 0x001f0000) >> 16;
1447
1448                     /* Munge up the value and other parameters for
1449                        hppa_elf_relocate_insn.  */
1450
1451                     value = (stub_hash->offset
1452                              + stub_section->output_offset
1453                              + stub_section->output_section->vma);
1454
1455                     r_format = 17;
1456                     r_field = e_fsel;
1457                     r_pcrel = 0;
1458                     addend = 0;
1459
1460                     /* We need to peek at the delay insn and determine if
1461                        we'll need to swap the branch and its delay insn.  */
1462                     if ((insn & 2)
1463                         || (opcode == LDO
1464                             && ldo_target_reg == rtn_reg)
1465                         || (delay_insn == 0x08000240))
1466                       {
1467                         /* No need to swap the branch and its delay slot, but
1468                            we do need to make sure to jump past the return
1469                            pointer update in the stub.  */
1470                         value += 4;
1471
1472                         /* If the delay insn does a return pointer adjustment,
1473                            then we have to make sure it stays valid.  */
1474                         if (opcode == LDO
1475                             && ldo_target_reg == rtn_reg)
1476                           {
1477                             delay_insn &= 0xfc00ffff;
1478                             delay_insn |= ((31 << 21) | (31 << 16));
1479                             bfd_put_32 (input_bfd, delay_insn, hit_data + 4);
1480                           }
1481                         /* Use a BLE to reach the stub.  */
1482                         insn = BLE_SR4_R0;
1483                       }
1484                     else
1485                       {
1486                         /* Wonderful, we have to swap the call insn and its
1487                            delay slot.  */
1488                         bfd_put_32 (input_bfd, delay_insn, hit_data);
1489                         /* Use a BLE,n to reach the stub.  */
1490                         insn = (BLE_SR4_R0 | 0x2);
1491                         bfd_put_32 (input_bfd, insn, hit_data + 4);
1492                         insn = hppa_elf_relocate_insn (input_bfd,
1493                                                        input_section,
1494                                                        insn, offset + 4,
1495                                                        value, addend,
1496                                                        r_format, r_field,
1497                                                        r_pcrel);
1498                         /* Update the instruction word.  */
1499                         bfd_put_32 (input_bfd, insn, hit_data + 4);
1500                         return bfd_reloc_dangerous;
1501                       }
1502                   }
1503                 else
1504                   {
1505                     /* PLABEL stuff is easy.  */
1506
1507                     value = (stub_hash->offset
1508                              + stub_section->output_offset
1509                              + stub_section->output_section->vma);
1510                     /* We don't need the RP adjustment for PLABELs.  */
1511                     value += 4;
1512                     if (r_type == R_PARISC_PLABEL32)
1513                       r_format = 32;
1514                     else if (r_type == R_PARISC_PLABEL21L)
1515                       r_format = 21;
1516                     else if (r_type == R_PARISC_PLABEL14R)
1517                       r_format = 14;
1518
1519                     r_pcrel = 0;
1520                     addend = 0;
1521                   }
1522                 }
1523               else
1524                 return bfd_reloc_notsupported;
1525           }
1526         goto do_basic_type_1;
1527       }
1528
1529 do_basic_type_1:
1530       insn = hppa_elf_relocate_insn (input_bfd, input_section, insn,
1531                                      offset, value, addend, r_format,
1532                                      r_field, r_pcrel);
1533       break;
1534
1535     /* Something we don't know how to handle.  */
1536     default:
1537       return bfd_reloc_notsupported;
1538     }
1539
1540   /* Update the instruction word.  */
1541   bfd_put_32 (input_bfd, insn, hit_data);
1542   return (bfd_reloc_ok);
1543 }
1544
1545 /* Return the address of the howto table entry to perform the CODE
1546    relocation for an ARCH machine.  */
1547
1548 static reloc_howto_type *
1549 elf_hppa_reloc_type_lookup (abfd, code)
1550      bfd *abfd;
1551      bfd_reloc_code_real_type code;
1552 {
1553   if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
1554     {
1555       BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
1556       return &elf_hppa_howto_table[(int) code];
1557     }
1558   return NULL;
1559 }
1560
1561 /* Return true if SYM represents a local label symbol.  */
1562
1563 static boolean
1564 hppa_elf_is_local_label (abfd, sym)
1565      bfd *abfd;
1566      asymbol *sym;
1567 {
1568   return (sym->name[0] == 'L' && sym->name[1] == '$');
1569 }
1570
1571 /* Do any backend specific processing when beginning to write an object
1572    file.  For PA ELF we need to determine the size of the symbol extension
1573    section *before* any other output processing happens.  */
1574
1575 static void
1576 elf32_hppa_backend_begin_write_processing (abfd, info)
1577      bfd *abfd;
1578      struct bfd_link_info *info;
1579 {
1580   unsigned int i;
1581   asection *symextn_sec;
1582
1583   /* Size up the symbol extension section.  */
1584   if ((abfd->outsymbols == NULL
1585        && info == NULL)
1586       || symext_chain_size != 0)
1587     return;
1588
1589   if (info == NULL)
1590     {
1591       /* We were not called from the BFD ELF linker code, so we need
1592          to examine the output BFD's outsymbols.
1593
1594          Note we can not build the symbol extensions now as the symbol
1595          map hasn't been set up.  */
1596       for (i = 0; i < abfd->symcount; i++)
1597         {
1598           elf_symbol_type *symbol = (elf_symbol_type *)abfd->outsymbols[i];
1599
1600           /* Only functions ever need an entry in the symbol extension
1601              section.  */
1602           if (!(symbol->symbol.flags & BSF_FUNCTION))
1603             continue;
1604
1605           /* And only if they specify the locations of their arguments.  */
1606           if (symbol->tc_data.hppa_arg_reloc == 0)
1607             continue;
1608
1609           /* Yup.  This function symbol needs an entry.  */
1610           symext_chain_size += 2 * ELF32_PARISC_SX_SIZE;
1611         }
1612     }
1613   else if (info->relocateable == true)
1614     {
1615       struct elf32_hppa_args_hash_table *table;
1616       table = elf32_hppa_hash_table (info)->args_hash_table;
1617
1618       /* Determine the size of the symbol extension section.  */
1619       elf32_hppa_args_hash_traverse (table,
1620                                      elf32_hppa_size_symext,
1621                                      &symext_chain_size);
1622     }
1623
1624   /* Now create the section and set its size.  We'll fill in the
1625      contents later.  */
1626   symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1627   if (symextn_sec == NULL)
1628     symextn_sec = bfd_make_section (abfd, SYMEXTN_SECTION_NAME);
1629
1630   bfd_set_section_flags (abfd, symextn_sec,
1631                          SEC_LOAD | SEC_HAS_CONTENTS | SEC_DATA);
1632   symextn_sec->output_section = symextn_sec;
1633   symextn_sec->output_offset = 0;
1634   bfd_set_section_alignment (abfd, symextn_sec, 2);
1635   bfd_set_section_size (abfd, symextn_sec, symext_chain_size);
1636 }
1637
1638 /* Called for each entry in the args location hash table.  For each
1639    entry we bump the size pointer by 2 records (16 bytes).  */
1640
1641 static boolean
1642 elf32_hppa_size_symext (gen_entry, in_args)
1643      struct bfd_hash_entry *gen_entry;
1644      PTR in_args;
1645 {
1646   bfd_size_type *sizep = (bfd_size_type *)in_args;
1647
1648   *sizep += 2 * ELF32_PARISC_SX_SIZE;
1649   return true;
1650 }
1651
1652 /* Backend routine called by the linker for each output symbol.
1653
1654    For PA ELF we use this opportunity to add an appropriate entry
1655    to the symbol extension chain for function symbols.  */
1656
1657 static boolean
1658 elf32_hppa_link_output_symbol_hook (abfd, info, name, sym, section)
1659      bfd *abfd;
1660      struct bfd_link_info *info;
1661      const char *name;
1662      Elf_Internal_Sym *sym;
1663      asection *section;
1664 {
1665   char *new_name;
1666   unsigned int len, index;
1667   struct elf32_hppa_args_hash_table *args_hash_table;
1668   struct elf32_hppa_args_hash_entry *args_hash;
1669
1670   /* If the args hash table is NULL, then we've encountered an error
1671      of some sorts (for example, an undefined symbol).  In that case
1672      we've got nothing else to do.
1673
1674      NOTE: elf_link_output_symbol will abort if we return false here!  */
1675   if (elf32_hppa_hash_table (info)->args_hash_table == NULL)
1676     return true;
1677
1678   index = elf32_hppa_hash_table (info)->output_symbol_count++;
1679
1680   /* We need to look up this symbol in the args hash table to see if
1681      it has argument relocation bits.  */
1682   if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
1683     return true;
1684
1685   /* We know it's a function symbol of some kind.  */
1686   len = strlen (name) + 1;
1687   if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
1688     len += 9;
1689
1690   new_name = malloc (len);
1691   if (new_name == NULL)
1692     {
1693       bfd_set_error (bfd_error_no_memory);
1694       return false;
1695     }
1696
1697   strcpy (new_name, name);
1698   if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
1699     sprintf (new_name + len - 10, "_%08x", (int)section);
1700
1701   /* Now that we have the unique name, we can look it up in the
1702      args hash table.  */
1703   args_hash_table = elf32_hppa_hash_table (info)->args_hash_table;
1704   args_hash = elf32_hppa_args_hash_lookup (args_hash_table, new_name,
1705                                            false, false);
1706   free (new_name);
1707   if (args_hash == NULL)
1708     return true;
1709
1710   /* We know this symbol has arg reloc bits.  */
1711   add_entry_to_symext_chain (abfd, args_hash->arg_bits,
1712                              index, &symext_rootP, &symext_lastP);
1713   return true;
1714 }
1715
1716 /* Perform any processing needed late in the object file writing process.
1717    For PA ELF we build and set the contents of the symbol extension
1718    section.  */
1719
1720 static void
1721 elf32_hppa_backend_final_write_processing (abfd, linker)
1722      bfd *abfd;
1723      boolean linker;
1724 {
1725   asection *symextn_sec;
1726   unsigned int i;
1727
1728   /* Now build the symbol extension section.  */
1729   if (symext_chain_size == 0)
1730     return;
1731
1732   if (! linker)
1733     {
1734       /* We were not called from the backend linker, so we still need
1735          to build the symbol extension chain.
1736
1737          Look at each symbol, adding the appropriate information to the
1738          symbol extension section list as necessary.  */
1739       for (i = 0; i < abfd->symcount; i++)
1740         {
1741           elf_symbol_type *symbol = (elf_symbol_type *) abfd->outsymbols[i];
1742
1743           /* Only functions ever need an entry in the symbol extension
1744              section.  */
1745           if (!(symbol->symbol.flags & BSF_FUNCTION))
1746             continue;
1747
1748           /* And only if they specify the locations of their arguments.  */
1749           if (symbol->tc_data.hppa_arg_reloc == 0)
1750             continue;
1751
1752           /* Add this symbol's information to the chain.  */
1753           add_entry_to_symext_chain (abfd, symbol->tc_data.hppa_arg_reloc,
1754                                      symbol->symbol.udata.i, &symext_rootP,
1755                                      &symext_lastP);
1756         }
1757     }
1758
1759   /* Now fill in the contents of the symbol extension section.  */
1760   elf_hppa_tc_make_sections (abfd, symext_rootP);
1761
1762   /* And attach that as the section's contents.  */
1763   symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1764   if (symextn_sec == (asection *) 0)
1765     abort();
1766
1767   symextn_sec->contents = (void *)symextn_contents;
1768
1769   bfd_set_section_contents (abfd, symextn_sec, symextn_sec->contents,
1770                             symextn_sec->output_offset, symextn_sec->_raw_size);
1771 }
1772
1773 /* Update the symbol extention chain to include the symbol pointed to
1774    by SYMBOLP if SYMBOLP is a function symbol.  Used internally and by GAS.  */
1775
1776 static void
1777 add_entry_to_symext_chain (abfd, arg_reloc, sym_idx, symext_root, symext_last)
1778      bfd *abfd;
1779      unsigned int arg_reloc;
1780      unsigned int sym_idx;
1781      symext_chainS **symext_root;
1782      symext_chainS **symext_last;
1783 {
1784   symext_chainS *symextP;
1785
1786   /* Allocate memory and initialize this entry.  */
1787   symextP = (symext_chainS *) bfd_alloc (abfd, sizeof (symext_chainS) * 2);
1788   if (!symextP)
1789     {
1790       bfd_set_error (bfd_error_no_memory);
1791       abort();                  /* FIXME */
1792     }
1793
1794   symextP[0].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_SYMNDX, sym_idx);
1795   symextP[0].next = &symextP[1];
1796
1797   symextP[1].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_ARG_RELOC, arg_reloc);
1798   symextP[1].next = NULL;
1799
1800   /* Now update the chain itself so it can be walked later to build
1801      the symbol extension section.  */
1802   if (*symext_root == NULL)
1803     {
1804       *symext_root = &symextP[0];
1805       *symext_last = &symextP[1];
1806     }
1807   else
1808     {
1809       (*symext_last)->next = &symextP[0];
1810       *symext_last = &symextP[1];
1811     }
1812 }
1813
1814 /* Build the symbol extension section.  */
1815
1816 static void
1817 elf_hppa_tc_make_sections (abfd, symext_root)
1818      bfd *abfd;
1819      symext_chainS *symext_root;
1820 {
1821   symext_chainS *symextP;
1822   unsigned int i;
1823   asection *symextn_sec;
1824
1825   symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1826
1827   /* Grab some memory for the contents of the symbol extension section
1828      itself.  */
1829   symextn_contents = (bfd_byte *) bfd_zalloc (abfd,
1830                                               symextn_sec->_raw_size);
1831   if (!symextn_contents)
1832     {
1833       bfd_set_error (bfd_error_no_memory);
1834       abort();                  /* FIXME */
1835     }
1836
1837   /* Fill in the contents of the symbol extension chain.  */
1838   for (i = 0, symextP = symext_root; symextP; symextP = symextP->next, ++i)
1839     ELF32_PARISC_SX_PUT (abfd, (bfd_vma) symextP->entry,
1840                          symextn_contents + i * ELF32_PARISC_SX_SIZE);
1841
1842   return;
1843 }
1844
1845 /* Do some PA ELF specific work after reading in the symbol table.
1846    In particular attach the argument relocation from the
1847    symbol extension section to the appropriate symbols.  */
1848
1849 static boolean
1850 elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt)
1851      bfd *abfd;
1852      elf_symbol_type *esyms;
1853      int symcnt;
1854 {
1855   Elf32_Internal_Shdr *symextn_hdr =
1856     bfd_elf_find_section (abfd, SYMEXTN_SECTION_NAME);
1857   unsigned int i, current_sym_idx = 0;
1858
1859   /* If no symbol extension existed, then all symbol extension information
1860      is assumed to be zero.  */
1861   if (symextn_hdr == NULL)
1862     {
1863       for (i = 0; i < symcnt; i++)
1864         esyms[i].tc_data.hppa_arg_reloc = 0;
1865       return (true);
1866     }
1867
1868   /* FIXME:  Why not use bfd_get_section_contents here?  Also should give
1869      memory back when we're done.  */
1870   /* Allocate a buffer of the appropriate size for the symextn section.  */
1871   symextn_hdr->contents = bfd_zalloc(abfd,symextn_hdr->sh_size);
1872   if (!symextn_hdr->contents)
1873     {
1874       bfd_set_error (bfd_error_no_memory);
1875       return false;
1876     }
1877
1878   /* Read in the symextn section.  */
1879   if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1)
1880     return false;
1881   if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->sh_size, abfd)
1882       != symextn_hdr->sh_size)
1883     return false;
1884
1885   /* Parse entries in the symbol extension section, updating the symtab
1886      entries as we go */
1887   for (i = 0; i < symextn_hdr->sh_size / ELF32_PARISC_SX_SIZE; i++)
1888     {
1889       symext_entryS se =
1890         ELF32_PARISC_SX_GET (abfd,
1891                              (symextn_hdr->contents
1892                               + i * ELF32_PARISC_SX_SIZE));
1893       unsigned int se_value = ELF32_PARISC_SX_VAL (se);
1894       unsigned int se_type = ELF32_PARISC_SX_TYPE (se);
1895
1896       switch (se_type)
1897         {
1898         case PARISC_SXT_NULL:
1899           break;
1900
1901         case PARISC_SXT_SYMNDX:
1902           if (se_value >= symcnt)
1903             {
1904               bfd_set_error (bfd_error_bad_value);
1905               return (false);
1906             }
1907           current_sym_idx = se_value - 1;
1908           break;
1909
1910         case PARISC_SXT_ARG_RELOC:
1911           esyms[current_sym_idx].tc_data.hppa_arg_reloc = se_value;
1912           break;
1913
1914         default:
1915           bfd_set_error (bfd_error_bad_value);
1916           return (false);
1917         }
1918     }
1919   return (true);
1920 }
1921
1922 /* Read and attach the symbol extension information for the symbols
1923    in INPUT_BFD to the argument location hash table.  Handle locals
1924    if DO_LOCALS is true; likewise for globals when DO_GLOBALS is true.  */
1925
1926 static boolean
1927 elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table, local_syms)
1928      bfd *input_bfd;
1929      Elf_Internal_Shdr *symtab_hdr;
1930      struct elf32_hppa_args_hash_table *args_hash_table;
1931      Elf_Internal_Sym *local_syms;
1932 {
1933   asection *symextn_sec;
1934   bfd_byte *contents;
1935   unsigned int i, n_entries, current_index = 0;
1936
1937   /* Get the symbol extension section for this BFD.  If no section exists
1938      then there's nothing to do.  Likewise if the section exists, but
1939      has no contents.  */
1940   symextn_sec = bfd_get_section_by_name (input_bfd, SYMEXTN_SECTION_NAME);
1941   if (symextn_sec == NULL)
1942     return true;
1943
1944   /* Done separately so we can turn off SEC_HAS_CONTENTS (see below).  */
1945   if (symextn_sec->_raw_size == 0)
1946     {
1947       symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1948       return true;
1949     }
1950
1951   contents = (bfd_byte *) malloc (symextn_sec->_raw_size);
1952   if (contents == NULL)
1953     {
1954       bfd_set_error (bfd_error_no_memory);
1955       return false;
1956     }
1957
1958   /* How gross.  We turn off SEC_HAS_CONTENTS for the input symbol extension
1959      sections to keep the generic ELF/BFD code from trying to do anything
1960      with them.  We have to undo that hack temporarily so that we can read
1961      in the contents with the generic code.  */
1962   symextn_sec->flags |= SEC_HAS_CONTENTS;
1963   if (bfd_get_section_contents (input_bfd, symextn_sec, contents,
1964                                 0, symextn_sec->_raw_size) == false)
1965     {
1966       symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1967       free (contents);
1968       return false;
1969     }
1970
1971   /* Gross.  Turn off SEC_HAS_CONTENTS for the input symbol extension
1972      sections (see above).  */
1973   symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1974
1975   n_entries = symextn_sec->_raw_size / ELF32_PARISC_SX_SIZE;
1976   for (i = 0; i < n_entries; i++)
1977     {
1978       symext_entryS entry =
1979         ELF32_PARISC_SX_GET (input_bfd, contents + i * ELF32_PARISC_SX_SIZE);
1980       unsigned int value = ELF32_PARISC_SX_VAL (entry);
1981       unsigned int type = ELF32_PARISC_SX_TYPE (entry);
1982       struct elf32_hppa_args_hash_entry *args_hash;
1983
1984       switch (type)
1985         {
1986         case PARISC_SXT_NULL:
1987           break;
1988
1989         case PARISC_SXT_SYMNDX:
1990           if (value >= symtab_hdr->sh_size / sizeof (Elf32_External_Sym))
1991             {
1992               bfd_set_error (bfd_error_bad_value);
1993               free (contents);
1994               return false;
1995             }
1996           current_index = value;
1997           break;
1998
1999         case PARISC_SXT_ARG_RELOC:
2000           if (current_index < symtab_hdr->sh_info)
2001             {
2002               Elf_Internal_Shdr *hdr;
2003               char *new_name;
2004               const char *sym_name;
2005               asection *sym_sec;
2006               unsigned int len;
2007
2008               hdr = elf_elfsections (input_bfd)[local_syms[current_index].st_shndx];
2009               sym_sec = hdr->bfd_section;
2010               sym_name = bfd_elf_string_from_elf_section (input_bfd,
2011                                                       symtab_hdr->sh_link,
2012                                         local_syms[current_index].st_name);
2013               len = strlen (sym_name) + 10;
2014               new_name = malloc (len);
2015               if (new_name == NULL)
2016                 {
2017                   bfd_set_error (bfd_error_no_memory);
2018                   free (contents);
2019                   return false;
2020                 }
2021               strcpy (new_name, sym_name);
2022               sprintf (new_name + len - 10, "_%08x", (int)sym_sec);
2023
2024               /* This is a global symbol with argument location info.
2025                  We need to enter it into the hash table.  */
2026               args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2027                                                        new_name, true,
2028                                                        true);
2029               free (new_name);
2030               if (args_hash == NULL)
2031                 {
2032                   free (contents);
2033                   return false;
2034                 }
2035               args_hash->arg_bits = value;
2036               break;
2037             }
2038           else if (current_index >= symtab_hdr->sh_info)
2039             {
2040               struct elf_link_hash_entry *h;
2041
2042               current_index -= symtab_hdr->sh_info;
2043               h = elf_sym_hashes(input_bfd)[current_index];
2044               /* This is a global symbol with argument location
2045                  information.  We need to enter it into the hash table.  */
2046               args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2047                                                        h->root.root.string,
2048                                                        true, true);
2049               if (args_hash == NULL)
2050                 {
2051                   bfd_set_error (bfd_error_bad_value);
2052                   free (contents);
2053                   return false;
2054                 }
2055               args_hash->arg_bits = value;
2056               break;
2057             }
2058           else
2059             break;
2060
2061         default:
2062           bfd_set_error (bfd_error_bad_value);
2063           free (contents);
2064           return false;
2065         }
2066     }
2067   free (contents);
2068   return true;
2069 }
2070
2071 /* Undo the generic ELF code's subtraction of section->vma from the
2072    value of each external symbol.  */
2073
2074 static boolean
2075 elf32_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2076      bfd *abfd;
2077      struct bfd_link_info *info;
2078      const Elf_Internal_Sym *sym;
2079      const char **namep;
2080      flagword *flagsp;
2081      asection **secp;
2082      bfd_vma *valp;
2083 {
2084   *valp += (*secp)->vma;
2085   return true;
2086 }
2087
2088 /* Determine the name of the stub needed to perform a call assuming the
2089    argument relocation bits for caller and callee are in CALLER and CALLEE
2090    for a call from LOCATION to DESTINATION.  Copy the name into STUB_NAME.  */
2091
2092 static void
2093 elf32_hppa_name_of_stub (caller, callee, location, destination, stub_name)
2094      unsigned int caller, callee;
2095      bfd_vma location, destination;
2096      char *stub_name;
2097 {
2098   arg_reloc_type arg_reloc_types[5];
2099
2100   if (elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types))
2101     {
2102       arg_reloc_location i;
2103       /* Fill in the basic template.  */
2104       strcpy (stub_name, "__XX_XX_XX_XX_XX_stub_");
2105
2106       /* Now fix the specifics.  */
2107       for (i = ARG0; i <= RET; i++)
2108         switch (arg_reloc_types[i])
2109           {
2110             case NO:
2111               stub_name[3 * i + 2] = 'N';
2112               stub_name[3 * i + 3] = 'O';
2113               break;
2114             case GF:
2115               stub_name[3 * i + 2] = 'G';
2116               stub_name[3 * i + 3] = 'F';
2117               break;
2118             case FG:
2119               stub_name[3 * i + 2] = 'F';
2120               stub_name[3 * i + 3] = 'G';
2121               break;
2122             case GD:
2123               stub_name[3 * i + 2] = 'G';
2124               stub_name[3 * i + 3] = 'D';
2125               break;
2126             case DG:
2127               stub_name[3 * i + 2] = 'D';
2128               stub_name[3 * i + 3] = 'G';
2129               break;
2130           }
2131     }
2132   else
2133     strcpy (stub_name, "_____long_branch_stub_");
2134 }
2135
2136 /* Determine if an argument relocation stub is needed to perform a
2137    call assuming the argument relocation bits for caller and callee
2138    are in CALLER and CALLEE.  Place the type of relocations (if any)
2139    into stub_types_p.  */
2140
2141 static boolean
2142 elf32_hppa_arg_reloc_needed (caller, callee, stub_types)
2143      unsigned int caller, callee;
2144      arg_reloc_type stub_types[5];
2145 {
2146   /* Special case for no relocations.  */
2147   if (caller == 0 || callee == 0)
2148     return 0;
2149   else
2150     {
2151       arg_location caller_loc[5];
2152       arg_location callee_loc[5];
2153
2154       /* Extract the location information for the argument and return
2155          value on both the caller and callee sides.  */
2156       caller_loc[ARG0] = EXTRACT_ARBITS (caller, ARG0);
2157       callee_loc[ARG0] = EXTRACT_ARBITS (callee, ARG0);
2158       caller_loc[ARG1] = EXTRACT_ARBITS (caller, ARG1);
2159       callee_loc[ARG1] = EXTRACT_ARBITS (callee, ARG1);
2160       caller_loc[ARG2] = EXTRACT_ARBITS (caller, ARG2);
2161       callee_loc[ARG2] = EXTRACT_ARBITS (callee, ARG2);
2162       caller_loc[ARG3] = EXTRACT_ARBITS (caller, ARG3);
2163       callee_loc[ARG3] = EXTRACT_ARBITS (callee, ARG3);
2164       caller_loc[RET] = EXTRACT_ARBITS (caller, RET);
2165       callee_loc[RET] = EXTRACT_ARBITS (callee, RET);
2166
2167       /* Check some special combinations.  This is necessary to
2168          deal with double precision FP arguments.  */
2169       if (caller_loc[ARG0] == AR_FU || caller_loc[ARG1] == AR_FU)
2170         {
2171           caller_loc[ARG0] = AR_FPDBL1;
2172           caller_loc[ARG1] = AR_NO;
2173         }
2174       if (caller_loc[ARG2] == AR_FU || caller_loc[ARG3] == AR_FU)
2175         {
2176           caller_loc[ARG2] = AR_FPDBL2;
2177           caller_loc[ARG3] = AR_NO;
2178         }
2179       if (callee_loc[ARG0] == AR_FU || callee_loc[ARG1] == AR_FU)
2180         {
2181           callee_loc[ARG0] = AR_FPDBL1;
2182           callee_loc[ARG1] = AR_NO;
2183         }
2184       if (callee_loc[ARG2] == AR_FU || callee_loc[ARG3] == AR_FU)
2185         {
2186           callee_loc[ARG2] = AR_FPDBL2;
2187           callee_loc[ARG3] = AR_NO;
2188         }
2189
2190       /* Now look up any relocation needed for each argument and the
2191          return value.  */
2192       stub_types[ARG0] = arg_mismatches[caller_loc[ARG0]][callee_loc[ARG0]];
2193       stub_types[ARG1] = arg_mismatches[caller_loc[ARG1]][callee_loc[ARG1]];
2194       stub_types[ARG2] = arg_mismatches[caller_loc[ARG2]][callee_loc[ARG2]];
2195       stub_types[ARG3] = arg_mismatches[caller_loc[ARG3]][callee_loc[ARG3]];
2196       stub_types[RET] = ret_mismatches[caller_loc[RET]][callee_loc[RET]];
2197
2198       return (stub_types[ARG0] != NO
2199               || stub_types[ARG1] != NO
2200               || stub_types[ARG2] != NO
2201               || stub_types[ARG3] != NO
2202               || stub_types[RET] != NO);
2203     }
2204 }
2205
2206 /* Compute the size of the stub needed to call from LOCATION to DESTINATION
2207    (a function named SYM_NAME), with argument relocation bits CALLER and
2208    CALLEE.  Return zero if no stub is needed to perform such a call.  */
2209
2210 static unsigned int
2211 elf32_hppa_size_of_stub (callee, caller, location, destination, sym_name)
2212      unsigned int callee, caller;
2213      bfd_vma location, destination;
2214      const char *sym_name;
2215 {
2216   arg_reloc_type arg_reloc_types[5];
2217
2218   /* Determine if a long branch or argument relocation stub is needed.
2219      If an argument relocation stub is needed, the relocation will be
2220      stored into arg_reloc_types.  */
2221   if (!(((int)(location - destination) > 0x3ffff)
2222         || ((int)(location - destination) < (int)0xfffc0000)
2223         || elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types)))
2224     return 0;
2225
2226   /* Some kind of stub is needed.  Determine how big it needs to be.
2227      First check for argument relocation stubs as they also handle
2228      long calls.  Then check for long calls to millicode and finally
2229      the normal long calls.  */
2230   if (arg_reloc_types[ARG0] != NO
2231       || arg_reloc_types[ARG1] != NO
2232       || arg_reloc_types[ARG2] != NO
2233       || arg_reloc_types[ARG3] != NO
2234       || arg_reloc_types[RET] != NO)
2235     {
2236       /* Some kind of argument relocation stub is needed.  */
2237       unsigned int len = 16;
2238       arg_reloc_location i;
2239
2240       /* Each GR or FG relocation takes 2 insns, each GD or DG
2241          relocation takes 3 insns.  Plus 4 more insns for the
2242          RP adjustment, ldil & (be | ble) and copy.  */
2243       for (i = ARG0; i <= RET; i++)
2244         switch (arg_reloc_types[i])
2245           {
2246             case GF:
2247             case FG:
2248               len += 8;
2249               break;
2250
2251             case GD:
2252             case DG:
2253               len += 12;
2254               break;
2255
2256             default:
2257               break;
2258           }
2259
2260       /* Extra instructions are needed if we're relocating a return value.  */
2261       if (arg_reloc_types[RET] != NO)
2262         len += 12;
2263
2264       return len;
2265     }
2266   else if (!strncmp ("$$", sym_name, 2)
2267       && strcmp ("$$dyncall", sym_name))
2268     return 12;
2269   else
2270     return 16;
2271 }
2272
2273 /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
2274    IN_ARGS contains the stub BFD and link info pointers.  */
2275
2276 static boolean
2277 elf32_hppa_build_one_stub (gen_entry, in_args)
2278      struct bfd_hash_entry *gen_entry;
2279      PTR in_args;
2280 {
2281   void **args = (void **)in_args;
2282   bfd *stub_bfd = (bfd *)args[0];
2283   struct bfd_link_info *info = (struct bfd_link_info *)args[1];
2284   struct elf32_hppa_stub_hash_entry *entry;
2285   struct elf32_hppa_stub_hash_table *stub_hash_table;
2286   bfd_byte *loc;
2287   symvalue sym_value;
2288   const char *sym_name;
2289
2290   /* Initialize pointers to the stub hash table, the particular entry we
2291      are building a stub for, and where (in memory) we should place the stub
2292      instructions.  */
2293   entry = (struct elf32_hppa_stub_hash_entry *)gen_entry;
2294   stub_hash_table = elf32_hppa_hash_table(info)->stub_hash_table;
2295   loc = stub_hash_table->location;
2296
2297   /* Make a note of the offset within the stubs for this entry.  */
2298   entry->offset = stub_hash_table->offset;
2299
2300   /* The symbol's name starts at offset 22.  */
2301   sym_name = entry->root.string + 22;
2302
2303   sym_value = (entry->target_value
2304                + entry->target_section->output_offset
2305                + entry->target_section->output_section->vma);
2306
2307   if (strncmp ("_____long_branch_stub_", entry->root.string, 22))
2308     {
2309       /* This must be an argument or return value relocation stub.  */
2310       unsigned long insn;
2311       arg_reloc_location i;
2312       bfd_byte *begin_loc = loc;
2313
2314       /* First the return pointer adjustment.  Depending on exact calling
2315          sequence this instruction may be skipped.  */
2316       bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc);
2317       loc += 4;
2318
2319       /* If we are relocating a return value, then we're going to have
2320          to return into the stub.  So we have to save off the user's
2321          return pointer into the stack at RP'.  */
2322       if (strncmp (entry->root.string + 14, "NO", 2))
2323         {
2324           bfd_put_32 (stub_bfd, STW_R31_M8R30, loc);
2325           loc += 4;
2326         }
2327
2328       /* Iterate over the argument relocations, emitting instructions
2329          to move them around as necessary.  */
2330       for (i = ARG0; i <= ARG3; i++)
2331         {
2332           if (!strncmp (entry->root.string + 3 * i + 2, "GF", 2))
2333             {
2334               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((26 - i) << 16), loc);
2335               bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | (4 + i), loc + 4);
2336               loc += 8;
2337             }
2338           else if (!strncmp (entry->root.string + 3 * i + 2, "FG", 2))
2339             {
2340               bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | (4 + i), loc);
2341               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((26 - i) << 16), loc + 4);
2342               loc += 8;
2343             }
2344           else if (!strncmp (entry->root.string + 3 * i + 2, "GD", 2))
2345             {
2346               bfd_put_32 (stub_bfd, STW_ARG_M12R30 | ((26 - i) << 16), loc);
2347               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((25 - i) << 16), loc + 4);
2348               bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | (5 + i), loc + 8);
2349               loc += 12;
2350             }
2351           else if (!strncmp (entry->root.string + 3 * i + 2, "DG", 2))
2352             {
2353               bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | (5 + i), loc);
2354               bfd_put_32 (stub_bfd, LDW_M12R30_ARG | ((26 - i) << 16), loc + 4);
2355               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((25 - i) << 16), loc + 8);
2356               loc += 12;
2357             }
2358         }
2359
2360       /* Load the high bits of the target address into %r1.  */
2361       insn = hppa_rebuild_insn (stub_bfd, LDIL_R1,
2362                                 hppa_field_adjust (sym_value, 0, e_lrsel), 21);
2363       bfd_put_32 (stub_bfd, insn, loc);
2364       loc += 4;
2365
2366       /* If we are relocating a return value, then we're going to have
2367          to return into the stub, then perform the return value relocation.  */
2368       if (strncmp (entry->root.string + 14, "NO", 2))
2369         {
2370           /* To return to the stub we "ble" to the target and copy the return
2371              pointer from %r31 into %r2.  */
2372           insn = hppa_rebuild_insn (stub_bfd,
2373                                     BLE_SR4_R1,
2374                                     hppa_field_adjust (sym_value, 0,
2375                                                        e_rrsel) >> 2,
2376                                     17);
2377           bfd_put_32 (stub_bfd, insn, loc);
2378           bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4);
2379
2380           /* Reload the return pointer for our caller from the stack.  */
2381           bfd_put_32 (stub_bfd, LDW_M8R30_R31, loc + 8);
2382           loc += 12;
2383
2384           /* Perform the return value relocation.  */
2385           if (!strncmp (entry->root.string + 14, "GF", 2))
2386             {
2387               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (28 << 16), loc);
2388               bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | 4, loc + 4);
2389               loc += 8;
2390             }
2391           else if (!strncmp (entry->root.string + 14, "FG", 2))
2392             {
2393               bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | 4, loc);
2394               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (28 << 16), loc + 4);
2395               loc += 8;
2396             }
2397           else if (!strncmp (entry->root.string + 2, "GD", 2))
2398             {
2399               bfd_put_32 (stub_bfd, STW_ARG_M12R30 | (28 << 16), loc);
2400               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (29 << 16), loc + 4);
2401               bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | 4, loc + 8);
2402               loc += 12;
2403             }
2404           else if (!strncmp (entry->root.string + 2, "DG", 2))
2405             {
2406               bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | 4, loc);
2407               bfd_put_32 (stub_bfd, LDW_M12R30_ARG | (28 << 16), loc + 4);
2408               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (29 << 16), loc + 8);
2409               loc += 12;
2410             }
2411           /* Branch back to the user's code now.  */
2412           bfd_put_32 (stub_bfd, BV_N_0_R31, loc);
2413           loc += 4;
2414         }
2415       else
2416         {
2417           /* No return value relocation, so we can simply "be" to the
2418              target and copy out return pointer into %r2.  */
2419           insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1,
2420                                     hppa_field_adjust (sym_value, 0,
2421                                                        e_rrsel) >> 2, 17);
2422           bfd_put_32 (stub_bfd, insn, loc);
2423           bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4);
2424           loc += 8;
2425         }
2426
2427       /* Update the location and offsets.  */
2428       stub_hash_table->location += (loc - begin_loc);
2429       stub_hash_table->offset += (loc - begin_loc);
2430     }
2431   else
2432     {
2433       /* Create one of two variant long branch stubs.  One for $$dyncall and
2434          normal calls, the other for calls to millicode.  */
2435       unsigned long insn;
2436       int millicode_call = 0;
2437
2438       if (!strncmp ("$$", sym_name, 2) && strcmp ("$$dyncall", sym_name))
2439         millicode_call = 1;
2440
2441       /* First the return pointer adjustment.  Depending on exact calling
2442          sequence this instruction may be skipped.  */
2443       bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc);
2444
2445       /* The next two instructions are the long branch itself.  A long branch
2446          is formed with "ldil" loading the upper bits of the target address
2447          into a register, then branching with "be" which adds in the lower bits.
2448          Long branches to millicode nullify the delay slot of the "be".  */
2449       insn = hppa_rebuild_insn (stub_bfd, LDIL_R1,
2450                                 hppa_field_adjust (sym_value, 0, e_lrsel), 21);
2451       bfd_put_32 (stub_bfd, insn, loc + 4);
2452       insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1 | (millicode_call ? 2 : 0),
2453                                 hppa_field_adjust (sym_value, 0, e_rrsel) >> 2,
2454                                 17);
2455       bfd_put_32 (stub_bfd, insn, loc + 8);
2456
2457       if (!millicode_call)
2458         {
2459           /* The sequence to call this stub places the return pointer into %r31,
2460              the final target expects the return pointer in %r2, so copy the
2461               return pointer into the proper register.  */
2462           bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 12);
2463
2464           /* Update the location and offsets.  */
2465           stub_hash_table->location += 16;
2466           stub_hash_table->offset += 16;
2467         }
2468       else
2469         {
2470           /* Update the location and offsets.  */
2471           stub_hash_table->location += 12;
2472           stub_hash_table->offset += 12;
2473         }
2474
2475     }
2476   return true;
2477 }
2478
2479 /* External entry points for sizing and building linker stubs.  */
2480
2481 /* Build all the stubs associated with the current output file.  The
2482    stubs are kept in a hash table attached to the main linker hash
2483    table.  This is called via hppaelf_finish in the linker.  */
2484
2485 boolean
2486 elf32_hppa_build_stubs (stub_bfd, info)
2487      bfd *stub_bfd;
2488      struct bfd_link_info *info;
2489 {
2490   /* The stub BFD only has one section.  */
2491   asection *stub_sec = stub_bfd->sections;
2492   struct elf32_hppa_stub_hash_table *table;
2493   unsigned int size;
2494   void *args[2];
2495
2496   /* So we can pass both the BFD for the stubs and the link info
2497      structure to the routine which actually builds stubs.  */
2498   args[0] = stub_bfd;
2499   args[1] = info;
2500
2501   /* Allocate memory to hold the linker stubs.  */
2502   size = bfd_section_size (stub_bfd, stub_sec);
2503   stub_sec->contents = (unsigned char *) bfd_zalloc (stub_bfd, size);
2504   if (stub_sec->contents == NULL)
2505     {
2506       bfd_set_error (bfd_error_no_memory);
2507       return false;
2508     }
2509   table = elf32_hppa_hash_table(info)->stub_hash_table;
2510   table->location = stub_sec->contents;
2511
2512   /* Build the stubs as directed by the stub hash table.  */
2513   elf32_hppa_stub_hash_traverse (table, elf32_hppa_build_one_stub, args);
2514
2515   return true;
2516 }
2517
2518 /* Determine and set the size of the stub section for a final link.
2519
2520    The basic idea here is to examine all the relocations looking for
2521    PC-relative calls to a target that is unreachable with a "bl"
2522    instruction or calls where the caller and callee disagree on the
2523    location of their arguments or return value.  */
2524
2525 boolean
2526 elf32_hppa_size_stubs (stub_bfd, output_bfd, link_info)
2527      bfd *stub_bfd;
2528      bfd *output_bfd;
2529      struct bfd_link_info *link_info;
2530 {
2531   bfd *input_bfd;
2532   asection *section, *stub_sec = 0;
2533   Elf_Internal_Shdr *symtab_hdr;
2534   Elf_Internal_Sym *local_syms, *isym, **all_local_syms;
2535   Elf32_External_Sym *ext_syms, *esym;
2536   unsigned int i, index, bfd_count = 0;
2537   struct elf32_hppa_stub_hash_table *stub_hash_table = 0;
2538   struct elf32_hppa_args_hash_table *args_hash_table = 0;
2539
2540   /* Create and initialize the stub hash table.  */
2541   stub_hash_table = ((struct elf32_hppa_stub_hash_table *)
2542                      malloc (sizeof (struct elf32_hppa_stub_hash_table)));
2543   if (!stub_hash_table)
2544     {
2545       bfd_set_error (bfd_error_no_memory);
2546       goto error_return;
2547     }
2548
2549   if (!elf32_hppa_stub_hash_table_init (stub_hash_table, stub_bfd,
2550                                         elf32_hppa_stub_hash_newfunc))
2551     goto error_return;
2552
2553   /* Likewise for the argument location hash table.  */
2554   args_hash_table = ((struct elf32_hppa_args_hash_table *)
2555                      malloc (sizeof (struct elf32_hppa_args_hash_table)));
2556   if (!args_hash_table)
2557     {
2558       bfd_set_error (bfd_error_no_memory);
2559       goto error_return;
2560     }
2561
2562   if (!elf32_hppa_args_hash_table_init (args_hash_table,
2563                                         elf32_hppa_args_hash_newfunc))
2564     goto error_return;
2565
2566   /* Attach the hash tables to the main hash table.  */
2567   elf32_hppa_hash_table(link_info)->stub_hash_table = stub_hash_table;
2568   elf32_hppa_hash_table(link_info)->args_hash_table = args_hash_table;
2569
2570   /* Count the number of input BFDs.  */
2571   for (input_bfd = link_info->input_bfds;
2572        input_bfd != NULL;
2573        input_bfd = input_bfd->link_next)
2574      bfd_count++;
2575
2576   /* We want to read in symbol extension records only once.  To do this
2577      we need to read in the local symbols in parallel and save them for
2578      later use; so hold pointers to the local symbols in an array.  */
2579   all_local_syms
2580     = (Elf_Internal_Sym **) malloc (sizeof (Elf_Internal_Sym *) * bfd_count);
2581   if (all_local_syms == NULL)
2582     {
2583       bfd_set_error (bfd_error_no_memory);
2584       goto error_return;
2585     }
2586   memset (all_local_syms, 0, sizeof (Elf_Internal_Sym *) * bfd_count);
2587
2588   /* Walk over all the input BFDs adding entries to the args hash table
2589      for all the external functions.  */
2590   for (input_bfd = link_info->input_bfds, index = 0;
2591        input_bfd != NULL;
2592        input_bfd = input_bfd->link_next, index++)
2593     {
2594       /* We'll need the symbol table in a second.  */
2595       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2596       if (symtab_hdr->sh_info == 0)
2597         continue;
2598
2599       /* We need an array of the local symbols attached to the input bfd.
2600          Unfortunately, we're going to have to read & swap them in.  */
2601       local_syms
2602         = (Elf_Internal_Sym *)malloc (symtab_hdr->sh_info
2603                                       * sizeof (Elf_Internal_Sym));
2604       if (local_syms == NULL)
2605         {
2606           bfd_set_error (bfd_error_no_memory);
2607           for (i = 0; i < bfd_count; i++)
2608             if (all_local_syms[i])
2609               free (all_local_syms[i]);
2610           free (all_local_syms);
2611           goto error_return;
2612         }
2613       all_local_syms[index] = local_syms;
2614
2615       ext_syms
2616         = (Elf32_External_Sym *)malloc (symtab_hdr->sh_info
2617                                         * sizeof (Elf32_External_Sym));
2618       if (ext_syms == NULL)
2619         {
2620           bfd_set_error (bfd_error_no_memory);
2621           for (i = 0; i < bfd_count; i++)
2622             if (all_local_syms[i])
2623               free (all_local_syms[i]);
2624           free (all_local_syms);
2625           goto error_return;
2626         }
2627
2628       if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
2629           || bfd_read (ext_syms, 1,
2630                        (symtab_hdr->sh_info
2631                         * sizeof (Elf32_External_Sym)), input_bfd)
2632           != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym)))
2633         {
2634           for (i = 0; i < bfd_count; i++)
2635             if (all_local_syms[i])
2636               free (all_local_syms[i]);
2637           free (all_local_syms);
2638           free (ext_syms);
2639           goto error_return;
2640         }
2641
2642       /* Swap the local symbols in.  */
2643       isym = local_syms;
2644       esym = ext_syms;
2645       for (i = 0; i < symtab_hdr->sh_info; i++, esym++, isym++)
2646          bfd_elf32_swap_symbol_in (input_bfd, esym, isym);
2647
2648       /* Now we can free the external symbols.  */
2649       free (ext_syms);
2650
2651       if (elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table,
2652                                        local_syms) == false)
2653         {
2654           for (i = 0; i < bfd_count; i++)
2655             if (all_local_syms[i])
2656               free (all_local_syms[i]);
2657           free (all_local_syms);
2658           goto error_return;
2659         }
2660     }
2661
2662   /* Magic as we know the stub bfd only has one section.  */
2663   stub_sec = stub_bfd->sections;
2664
2665   /* If generating a relocateable output file, then we don't
2666      have to examine the relocs.  */
2667   if (link_info->relocateable)
2668     {
2669       for (i = 0; i < bfd_count; i++)
2670         if (all_local_syms[i])
2671           free (all_local_syms[i]);
2672       free (all_local_syms);
2673       return true;
2674     }
2675
2676   /* Now that we have argument location information for all the global
2677      functions we can start looking for stubs.  */
2678   for (input_bfd = link_info->input_bfds, index = 0;
2679        input_bfd != NULL;
2680        input_bfd = input_bfd->link_next, index++)
2681     {
2682       /* We'll need the symbol table in a second.  */
2683       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2684       if (symtab_hdr->sh_info == 0)
2685         continue;
2686
2687       local_syms = all_local_syms[index];
2688
2689       /* Walk over each section attached to the input bfd.  */
2690       for (section = input_bfd->sections;
2691            section != NULL;
2692            section = section->next)
2693         {
2694           Elf_Internal_Shdr *input_rel_hdr;
2695           Elf32_External_Rela *external_relocs, *erelaend, *erela;
2696           Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2697
2698           /* If there aren't any relocs, then there's nothing to do.  */
2699           if ((section->flags & SEC_RELOC) == 0
2700               || section->reloc_count == 0)
2701             continue;
2702
2703           /* Allocate space for the external relocations.  */
2704           external_relocs
2705             = (Elf32_External_Rela *) malloc (section->reloc_count * sizeof (Elf32_External_Rela));
2706           if (external_relocs == NULL)
2707             {
2708               bfd_set_error (bfd_error_no_memory);
2709               for (i = 0; i < bfd_count; i++)
2710                 if (all_local_syms[i])
2711                   free (all_local_syms[i]);
2712               free (all_local_syms);
2713               goto error_return;
2714             }
2715
2716           /* Likewise for the internal relocations.  */
2717           internal_relocs
2718             = (Elf_Internal_Rela *) malloc (section->reloc_count * sizeof (Elf_Internal_Rela));
2719           if (internal_relocs == NULL)
2720             {
2721               bfd_set_error (bfd_error_no_memory);
2722               free (external_relocs);
2723               for (i = 0; i < bfd_count; i++)
2724                 if (all_local_syms[i])
2725                   free (all_local_syms[i]);
2726               free (all_local_syms);
2727               goto error_return;
2728             }
2729
2730           /* Read in the external relocs.  */
2731           input_rel_hdr = &elf_section_data (section)->rel_hdr;
2732           if (bfd_seek (input_bfd, input_rel_hdr->sh_offset, SEEK_SET) != 0
2733               || bfd_read (external_relocs, 1, input_rel_hdr->sh_size,
2734                            input_bfd) != input_rel_hdr->sh_size)
2735             {
2736               free (external_relocs);
2737               free (internal_relocs);
2738               for (i = 0; i < bfd_count; i++)
2739                 if (all_local_syms[i])
2740                   free (all_local_syms[i]);
2741               free (all_local_syms);
2742               goto error_return;
2743             }
2744
2745           /* Swap in the relocs.  */
2746           erela = external_relocs;
2747           erelaend = erela + section->reloc_count;
2748           irela = internal_relocs;
2749           for (; erela < erelaend; erela++, irela++)
2750             bfd_elf32_swap_reloca_in (input_bfd, erela, irela);
2751
2752           /* We're done with the external relocs, free them.  */
2753           free (external_relocs);
2754
2755           /* Now examine each relocation.  */
2756           irela = internal_relocs;
2757           irelaend = irela + section->reloc_count;
2758           for (; irela < irelaend; irela++)
2759             {
2760               long r_type, callee_args, caller_args, r_index, size_of_stub;
2761               struct elf_link_hash_entry *hash;
2762               struct elf32_hppa_stub_hash_entry *stub_hash;
2763               struct elf32_hppa_args_hash_entry *args_hash;
2764               Elf_Internal_Sym *sym;
2765               asection *sym_sec;
2766               const char *sym_name;
2767               symvalue sym_value;
2768               bfd_vma location, destination;
2769               char *new_name = NULL;
2770
2771               r_type = ELF32_R_TYPE (irela->r_info);
2772               r_index = ELF32_R_SYM (irela->r_info);
2773
2774               if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
2775                 {
2776                   bfd_set_error (bfd_error_bad_value);
2777                   free (internal_relocs);
2778                   for (i = 0; i < bfd_count; i++)
2779                     if (all_local_syms[i])
2780                       free (all_local_syms[i]);
2781                   free (all_local_syms);
2782                   goto error_return;
2783                 }
2784
2785               /* Only look for stubs on call instructions or plabel
2786                  references.  */
2787               if (r_type != R_PARISC_PCREL17F
2788                   && r_type != R_PARISC_PLABEL32
2789                   && r_type != R_PARISC_PLABEL21L
2790                   && r_type != R_PARISC_PLABEL14R)
2791                 continue;
2792
2793               /* Now determine the call target, its name, value, section
2794                  and argument relocation bits.  */
2795               hash = NULL;
2796               sym = NULL;
2797               sym_sec = NULL;
2798               if (r_index < symtab_hdr->sh_info)
2799                 {
2800                   /* It's a local symbol.  */
2801                   Elf_Internal_Shdr *hdr;
2802
2803                   sym = local_syms + r_index;
2804                   hdr = elf_elfsections (input_bfd)[sym->st_shndx];
2805                   sym_sec = hdr->bfd_section;
2806                   sym_name = bfd_elf_string_from_elf_section (input_bfd,
2807                                                               symtab_hdr->sh_link,
2808                                                               sym->st_name);
2809                   sym_value = (ELF_ST_TYPE (sym->st_info) == STT_SECTION
2810                                ? 0 : sym->st_value);
2811                   destination = (sym_value
2812                                  + sym_sec->output_offset
2813                                  + sym_sec->output_section->vma);
2814
2815                   /* Tack on an ID so we can uniquely identify this local
2816                      symbol in the stub or arg info hash tables.  */
2817                   new_name = malloc (strlen (sym_name) + 10);
2818                   if (new_name == 0)
2819                     {
2820                       bfd_set_error (bfd_error_bad_value);
2821                       free (internal_relocs);
2822                       for (i = 0; i < bfd_count; i++)
2823                         if (all_local_syms[i])
2824                           free (all_local_syms[i]);
2825                       free (all_local_syms);
2826                       goto error_return;
2827                     }
2828                   sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
2829                   sym_name = new_name;
2830                 }
2831               else
2832                 {
2833                   /* It's an external symbol.  */
2834                   long index;
2835
2836                   index = r_index - symtab_hdr->sh_info;
2837                   hash = elf_sym_hashes (input_bfd)[index];
2838                   if (hash->root.type == bfd_link_hash_defined
2839                       || hash->root.type == bfd_link_hash_defweak)
2840                     {
2841                       sym_sec = hash->root.u.def.section;
2842                       sym_name = hash->root.root.string;
2843                       sym_value = hash->root.u.def.value;
2844                       destination = (sym_value
2845                                      + sym_sec->output_offset
2846                                      + sym_sec->output_section->vma);
2847                     }
2848                   else
2849                     {
2850                       bfd_set_error (bfd_error_bad_value);
2851                       free (internal_relocs);
2852                       for (i = 0; i < bfd_count; i++)
2853                         if (all_local_syms[i])
2854                           free (all_local_syms[i]);
2855                       free (all_local_syms);
2856                       goto error_return;
2857                     }
2858                 }
2859
2860               args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2861                                                        sym_name, false, false);
2862
2863               /* Get both caller and callee argument information.  */
2864               if (args_hash == NULL)
2865                 callee_args = 0;
2866               else
2867                 callee_args = args_hash->arg_bits;
2868
2869               /* For calls get the caller's bits from the addend of
2870                  the call relocation.  For PLABELS the caller's bits
2871                  are assumed to have all args & return values in general
2872                  registers (0x155).  */
2873               if (r_type == R_PARISC_PCREL17F)
2874                 caller_args = HPPA_R_ARG_RELOC (irela->r_addend);
2875               else
2876                 caller_args = 0x155;
2877
2878               /* Now determine where the call point is.  */
2879               location = (section->output_offset
2880                           + section->output_section->vma
2881                           + irela->r_offset);
2882
2883               /* We only care about the destination for PCREL function
2884                  calls (eg. we don't care for PLABELS).  */
2885               if (r_type != R_PARISC_PCREL17F)
2886                 location = destination;
2887
2888               /* Determine what (if any) linker stub is needed and its
2889                  size (in bytes).  */
2890               size_of_stub = elf32_hppa_size_of_stub (callee_args,
2891                                                       caller_args,
2892                                                       location,
2893                                                       destination,
2894                                                       sym_name);
2895               if (size_of_stub != 0)
2896                 {
2897                   char *stub_name;
2898                   unsigned int len;
2899
2900                   /* Get the name of this stub.  */
2901                   len = strlen (sym_name);
2902                   len += 23;
2903
2904                   stub_name = malloc (len);
2905                   if (!stub_name)
2906                     {
2907                       bfd_set_error (bfd_error_no_memory);
2908
2909                       /* Because sym_name was mallocd above for local
2910                          symbols.  */
2911                       if (r_index < symtab_hdr->sh_info)
2912                         free (new_name);
2913
2914                       free (internal_relocs);
2915                       for (i = 0; i < bfd_count; i++)
2916                         if (all_local_syms[i])
2917                           free (all_local_syms[i]);
2918                       free (all_local_syms);
2919                       goto error_return;
2920                     }
2921                   elf32_hppa_name_of_stub (caller_args, callee_args,
2922                                            location, destination, stub_name);
2923                   strcat (stub_name + 22, sym_name);
2924
2925                   /* Because sym_name was malloced above for local symbols.  */
2926                   if (r_index < symtab_hdr->sh_info)
2927                     free (new_name);
2928
2929                   stub_hash
2930                     = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
2931                                                    false, false);
2932                   if (stub_hash != NULL)
2933                     {
2934                       /* The proper stub has already been created, nothing
2935                          else to do.  */
2936                       free (stub_name);
2937                     }
2938                   else
2939                     {
2940                       bfd_set_section_size (stub_bfd, stub_sec,
2941                                             (bfd_section_size (stub_bfd,
2942                                                                stub_sec)
2943                                              + size_of_stub));
2944
2945                       /* Enter this entry into the linker stub hash table.  */
2946                       stub_hash
2947                         = elf32_hppa_stub_hash_lookup (stub_hash_table,
2948                                                        stub_name, true, true);
2949                       if (stub_hash == NULL)
2950                         {
2951                           bfd_set_error (bfd_error_no_memory);
2952                           free (stub_name);
2953                           free (internal_relocs);
2954                           for (i = 0; i < bfd_count; i++)
2955                             if (all_local_syms[i])
2956                               free (all_local_syms[i]);
2957                           free (all_local_syms);
2958                           goto error_return;
2959                         }
2960
2961                       /* We'll need these to determine the address that the
2962                          stub will branch to.  */
2963                       stub_hash->target_value = sym_value;
2964                       stub_hash->target_section = sym_sec;
2965                     }
2966                   free (stub_name);
2967                 }
2968             }
2969           /* We're done with the internal relocs, free them.  */
2970           free (internal_relocs);
2971         }
2972     }
2973   /* We're done with the local symbols, free them.  */
2974   for (i = 0; i < bfd_count; i++)
2975     if (all_local_syms[i])
2976       free (all_local_syms[i]);
2977   free (all_local_syms);
2978   return true;
2979
2980 error_return:
2981   /* Return gracefully, avoiding dangling references to the hash tables.  */
2982   if (stub_hash_table)
2983     {
2984       elf32_hppa_hash_table(link_info)->stub_hash_table = NULL;
2985       free (stub_hash_table);
2986     }
2987   if (args_hash_table)
2988     {
2989       elf32_hppa_hash_table(link_info)->args_hash_table = NULL;
2990       free (args_hash_table);
2991     }
2992   /* Set the size of the stub section to zero since we're never going
2993      to create them.   Avoids losing when we try to get its contents
2994      too.  */
2995   bfd_set_section_size (stub_bfd, stub_sec, 0);
2996   return false;
2997 }
2998
2999 /* Misc BFD support code.  */
3000 #define bfd_elf32_bfd_reloc_type_lookup         elf_hppa_reloc_type_lookup
3001 #define bfd_elf32_bfd_is_local_label            hppa_elf_is_local_label
3002
3003 /* Symbol extension stuff.  */
3004 #define bfd_elf32_set_section_contents          elf32_hppa_set_section_contents
3005 #define elf_backend_symbol_table_processing \
3006   elf32_hppa_backend_symbol_table_processing
3007 #define elf_backend_begin_write_processing \
3008   elf32_hppa_backend_begin_write_processing
3009 #define elf_backend_final_write_processing \
3010   elf32_hppa_backend_final_write_processing
3011
3012 /* Stuff for the BFD linker.  */
3013 #define elf_backend_relocate_section            elf32_hppa_relocate_section
3014 #define elf_backend_add_symbol_hook             elf32_hppa_add_symbol_hook
3015 #define elf_backend_link_output_symbol_hook \
3016   elf32_hppa_link_output_symbol_hook
3017 #define bfd_elf32_bfd_link_hash_table_create \
3018   elf32_hppa_link_hash_table_create
3019
3020 #define TARGET_BIG_SYM          bfd_elf32_hppa_vec
3021 #define TARGET_BIG_NAME         "elf32-hppa"
3022 #define ELF_ARCH                bfd_arch_hppa
3023 #define ELF_MACHINE_CODE        EM_PARISC
3024 #define ELF_MAXPAGESIZE         0x1000
3025
3026 #include "elf32-target.h"