]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf32-hppa.c
* libbfd-in.h: Remove alloca cruft. It was missing some necessary
[thirdparty/binutils-gdb.git] / bfd / elf32-hppa.c
CommitLineData
4c85cbfa 1/* BFD back-end for HP PA-RISC ELF files.
f4bd7a8f 2 Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
4c85cbfa
KR
3
4 Written by
e8f2240a 5
4c85cbfa
KR
6 Center for Software Science
7 Department of Computer Science
8 University of Utah
9
10This file is part of BFD, the Binary File Descriptor library.
11
12This program is free software; you can redistribute it and/or modify
13it under the terms of the GNU General Public License as published by
14the Free Software Foundation; either version 2 of the License, or
15(at your option) any later version.
16
17This program is distributed in the hope that it will be useful,
18but WITHOUT ANY WARRANTY; without even the implied warranty of
19MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20GNU General Public License for more details.
21
22You should have received a copy of the GNU General Public License
23along with this program; if not, write to the Free Software
24Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
25
26#include "bfd.h"
27#include "sysdep.h"
28#include "libbfd.h"
29#include "obstack.h"
4991ebb9 30#include "bfdlink.h"
4c85cbfa
KR
31#include "libelf.h"
32
f5bfdacd
JL
33/* Note there isn't much error handling code in here yet. Unexpected
34 conditions are handled by just calling abort. FIXME damnit! */
35
4c85cbfa
KR
36/* ELF32/HPPA relocation support
37
38 This file contains ELF32/HPPA relocation support as specified
39 in the Stratus FTX/Golf Object File Format (SED-1762) dated
f5bfdacd 40 November 19, 1992. */
4c85cbfa 41
4c85cbfa 42#include "elf32-hppa.h"
e8f2240a 43#include "aout/aout64.h"
d9ad93bc 44#include "hppa_stubs.h"
4c85cbfa 45
e08b9ad7
JL
46/* The basic stub types supported. If/when shared libraries are
47 implemented some form of IMPORT and EXPORT stubs will be needed. */
48typedef enum
49{
50 HPPA_STUB_ILLEGAL,
51 HPPA_STUB_ARG_RELOC,
52 HPPA_STUB_LONG_CALL,
53} hppa_stub_type;
54
55/* This is a list of all the stubs for a particular BFD. */
56
57typedef struct elf32_hppa_stub_name_list_struct
58{
59 /* The symbol associated with this stub. */
60 asymbol *sym;
61 /* Pointer to chain of all stub chains. */
62 struct elf32_hppa_stub_description_struct *stub_desc;
63 /* Pointer to the stub contents (eg instructions). */
64 int *stub_secp;
65 /* Size of this stub? (in what units? FIXME). */
66 unsigned size;
67 /* Pointer to the next stub entry in the chain. */
68 struct elf32_hppa_stub_name_list_struct *next;
69} elf32_hppa_stub_name_list;
70
71/* This is a linked list in which each entry describes all the
72 linker stubs for a particular bfd. */
73
74typedef struct elf32_hppa_stub_description_struct
75{
76 /* The next group of stubs. */
77 struct elf32_hppa_stub_description_struct *next;
78 /* Used to identify this group of stubs as belonging
79 to a particular bfd. */
80 bfd *this_bfd;
81 /* FIXME: The stub section for this group of stubs? Is
82 this redundant with stub_listP->sym->section? */
83 asection *stub_sec;
84 /* FIXME: what the hell is this? */
85 unsigned relocs_allocated_cnt;
86 /* The current real size of the stubs (in bytes?). */
87 unsigned real_size;
88 /* How much space we have allocated for stubs (in bytes?). */
89 unsigned allocated_size;
90 /* Pointer to the first available space for new stubs. */
91 int *stub_secp;
92 /* Pointer to the beginning of the stubs. FIXME: Why an int *
93 above and a char * here? */
94 char *stub_contents;
95 /* The list of stubs for this bfd. */
96 elf32_hppa_stub_name_list *stub_listP;
97 /* I guess we just carry this around for fun. */
98 struct bfd_link_info *link_info;
99} elf32_hppa_stub_description;
100
101/* FIXME. */
102#define ARGUMENTS 0
103#define RETURN_VALUE 1
104
105/* The various argument relocations that may be performed.
106 Note GRX,GRY really means ARGX,ARGY. */
107typedef enum
108{
109 /* No relocation. */
110 NO_ARG_RELOC,
111 /* Relocate 32 bits from general to FP register. */
112 R_TO_FR,
113 /* Relocate 64 bits from arg0,arg1 to FParg1. */
114 R01_TO_FR,
115 /* Relocate 64 bits from arg2,arg3 to FParg3. */
116 R23_TO_FR,
117 /* Relocate 32 bits from FP to general register. */
118 FR_TO_R,
119 /* Relocate 64 bits from FParg1 to arg0,arg1. */
120 FR_TO_R01,
121 /* Relocate 64 bits from FParg3 to arg2,arg3. */
122 FR_TO_R23,
123 /* Death. */
124 ARG_RELOC_ERR,
125} arg_reloc_type;
126
127/* Where (what register type) is an argument comming from? */
128typedef enum
129{
130 /* Not in a register. */
131 AR_NO,
132 /* In a general argument register. */
133 AR_GR,
134 /* In right half of a FP argument register. */
135 AR_FR,
136 /* In upper (left) half of a FP argument register. */
137 AR_FU,
138 /* In general argument register pair 0 (arg0, arg1). */
139 AR_DBL01,
140 /* In general argument register pair 1 (arg2, arg3). */
141 AR_DBL23,
142} arg_location;
143
144/* What is being relocated (eg which argument or the return value). */
145typedef enum
146{
147 ARG0, ARG1, ARG2, ARG3, RETVAL,
148} arg_reloc_location;
149
150/* Horizontal represents callee's argument location information, vertical
151 represents caller's argument location information. Value at a particular
152 X, Y location represents what (if any) argument relocation needs to
153 be performed to make caller and callee agree. */
154static CONST arg_reloc_type mismatches[6][6] =
155{
f3b477be 156 {NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC,
e08b9ad7
JL
157 NO_ARG_RELOC, NO_ARG_RELOC},
158 {NO_ARG_RELOC, NO_ARG_RELOC, R_TO_FR, ARG_RELOC_ERR,
159 R01_TO_FR, ARG_RELOC_ERR},
160 {NO_ARG_RELOC, FR_TO_R, NO_ARG_RELOC, ARG_RELOC_ERR,
161 ARG_RELOC_ERR, ARG_RELOC_ERR},
162 {ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR,
163 ARG_RELOC_ERR, ARG_RELOC_ERR},
164 {NO_ARG_RELOC, FR_TO_R01, NO_ARG_RELOC, ARG_RELOC_ERR,
165 NO_ARG_RELOC, ARG_RELOC_ERR},
166 {NO_ARG_RELOC, FR_TO_R23, NO_ARG_RELOC, ARG_RELOC_ERR,
167 ARG_RELOC_ERR, NO_ARG_RELOC},
168};
169
170/* Likewise for the return value. */
171static CONST arg_reloc_type retval_mismatches[6][6] =
172{
f3b477be 173 {NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC,
e08b9ad7
JL
174 NO_ARG_RELOC, NO_ARG_RELOC},
175 {NO_ARG_RELOC, NO_ARG_RELOC, FR_TO_R, ARG_RELOC_ERR,
176 FR_TO_R01, ARG_RELOC_ERR},
177 {NO_ARG_RELOC, R_TO_FR, NO_ARG_RELOC, ARG_RELOC_ERR,
178 ARG_RELOC_ERR, ARG_RELOC_ERR},
179 {ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR,
180 ARG_RELOC_ERR, ARG_RELOC_ERR},
181 {NO_ARG_RELOC, R01_TO_FR, NO_ARG_RELOC, ARG_RELOC_ERR,
182 NO_ARG_RELOC, ARG_RELOC_ERR},
183 {NO_ARG_RELOC, R23_TO_FR, NO_ARG_RELOC, ARG_RELOC_ERR,
184 ARG_RELOC_ERR, NO_ARG_RELOC},
185};
186
187/* Used for index mapping in symbol-extension sections. */
188struct elf32_hppa_symextn_map_struct
189{
190 int old_index;
191 bfd *bfd;
192 asymbol *sym;
193 int new_index;
194};
4c85cbfa 195
4991ebb9
ILT
196static bfd_reloc_status_type hppa_elf_reloc
197 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
4c85cbfa 198
f5bfdacd
JL
199static unsigned long hppa_elf_relocate_insn
200 PARAMS ((bfd *, asection *, unsigned long, unsigned long, long,
201 long, unsigned long, unsigned long, unsigned long));
202
203static void hppa_elf_relocate_unwind_table
204 PARAMS ((bfd *, PTR, unsigned long, long, long,
205 unsigned long, unsigned long));
206
207static long get_symbol_value PARAMS ((asymbol *));
e08b9ad7 208
f5bfdacd
JL
209static bfd_reloc_status_type hppa_elf_reloc
210 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd*, char **));
211
212static CONST reloc_howto_type * elf_hppa_reloc_type_lookup
213 PARAMS ((bfd_arch_info_type *, bfd_reloc_code_real_type));
214
e08b9ad7
JL
215static symext_entryS elf32_hppa_get_sym_extn PARAMS ((bfd *, asymbol *, int));
216
217static elf32_hppa_stub_description * find_stubs PARAMS ((bfd *, asection *));
218
219static elf32_hppa_stub_description * new_stub
220 PARAMS ((bfd *, asection *, struct bfd_link_info *));
221
222static arg_reloc_type type_of_mismatch PARAMS ((int, int, int));
223
224static elf32_hppa_stub_name_list * find_stub_by_name
225 PARAMS ((bfd *, asection *, char *));
226
227static elf32_hppa_stub_name_list * add_stub_by_name
228 PARAMS ((bfd *, asection *, asymbol *, struct bfd_link_info *));
229
230static void hppa_elf_stub_finish PARAMS ((bfd *));
231
232static void hppa_elf_stub_reloc
6e58a4e5 233 PARAMS ((elf32_hppa_stub_description *, bfd *, asymbol **, int,
e08b9ad7
JL
234 elf32_hppa_reloc_type));
235
236static int hppa_elf_arg_reloc_needed_p
237 PARAMS ((bfd *, arelent *, arg_reloc_type [5], symext_entryS));
238
239static asymbol * hppa_elf_build_linker_stub
240 PARAMS ((bfd *, bfd *, struct bfd_link_info *, arelent *,
241 arg_reloc_type [5], int, unsigned *, hppa_stub_type));
242
243static void hppa_elf_create_stub_sec
244 PARAMS ((bfd *, bfd *, asection **, struct bfd_link_info *));
245
246static int hppa_elf_long_branch_needed_p
247 PARAMS ((bfd *, asection *, arelent *, asymbol *, unsigned));
248
249static boolean hppa_elf_set_section_contents
250 PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
251
252static void elf_info_to_howto
253 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
254
255static void elf32_hppa_backend_symbol_processing PARAMS ((bfd *, asymbol *));
256
257static boolean elf32_hppa_backend_section_processing
258 PARAMS ((bfd *, Elf32_Internal_Shdr *));
259
260static boolean elf32_hppa_backend_symbol_table_processing
261 PARAMS ((bfd *, elf_symbol_type *, int));
262
263static boolean elf32_hppa_backend_section_from_shdr
264 PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
265
266static boolean elf32_hppa_backend_fake_sections
267 PARAMS ((bfd *, Elf_Internal_Shdr *, asection *));
268
269static boolean elf32_hppa_backend_section_from_bfd_section
270 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
271
272/* ELF/PA relocation howto entries. */
273
d9ad93bc 274static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
4c85cbfa 275{
d9ad93bc
KR
276 {R_HPPA_NONE, 0, 3, 19, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_NONE"},
277 {R_HPPA_32, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_32"},
278 {R_HPPA_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_11"},
279 {R_HPPA_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_14"},
280 {R_HPPA_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_17"},
281{R_HPPA_L21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_L21"},
282{R_HPPA_R11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_R11"},
283{R_HPPA_R14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_R14"},
284{R_HPPA_R17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_R17"},
285 {R_HPPA_LS21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LS21"},
286 {R_HPPA_RS11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RS11"},
287 {R_HPPA_RS14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RS14"},
288 {R_HPPA_RS17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RS17"},
289 {R_HPPA_LD21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LD21"},
290 {R_HPPA_RD11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RD11"},
291 {R_HPPA_RD14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RD14"},
292 {R_HPPA_RD17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RD17"},
293 {R_HPPA_LR21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LR21"},
294 {R_HPPA_RR14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RR14"},
295 {R_HPPA_RR17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RR17"},
d9ad93bc
KR
296 {R_HPPA_GOTOFF_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_11"},
297 {R_HPPA_GOTOFF_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_14"},
298 {R_HPPA_GOTOFF_L21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_L21"},
299 {R_HPPA_GOTOFF_R11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_R11"},
300 {R_HPPA_GOTOFF_R14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_R14"},
301 {R_HPPA_GOTOFF_LS21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_LS21"},
302 {R_HPPA_GOTOFF_RS11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RS11"},
303 {R_HPPA_GOTOFF_RS14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RS14"},
304 {R_HPPA_GOTOFF_LD21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_LD21"},
305 {R_HPPA_GOTOFF_RD11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RD11"},
306 {R_HPPA_GOTOFF_RD14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RD14"},
307 {R_HPPA_GOTOFF_LR21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_LR21"},
308 {R_HPPA_GOTOFF_RR14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RR14"},
d9ad93bc
KR
309 {R_HPPA_ABS_CALL_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_11"},
310 {R_HPPA_ABS_CALL_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_14"},
311 {R_HPPA_ABS_CALL_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_17"},
312 {R_HPPA_ABS_CALL_L21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_L21"},
313 {R_HPPA_ABS_CALL_R11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_R11"},
314 {R_HPPA_ABS_CALL_R14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_R14"},
315 {R_HPPA_ABS_CALL_R17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_R17"},
316 {R_HPPA_ABS_CALL_LS21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_LS21"},
317 {R_HPPA_ABS_CALL_RS11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RS11"},
318 {R_HPPA_ABS_CALL_RS14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RS14"},
319 {R_HPPA_ABS_CALL_RS17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RS17"},
320 {R_HPPA_ABS_CALL_LD21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_LD21"},
321 {R_HPPA_ABS_CALL_RD11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RD11"},
322 {R_HPPA_ABS_CALL_RD14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RD14"},
323 {R_HPPA_ABS_CALL_RD17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RD17"},
324 {R_HPPA_ABS_CALL_LR21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_LR21"},
325 {R_HPPA_ABS_CALL_RR14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RR14"},
326 {R_HPPA_ABS_CALL_RR17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RR17"},
d9ad93bc
KR
327 {R_HPPA_PCREL_CALL_11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_11"},
328 {R_HPPA_PCREL_CALL_14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_14"},
329 {R_HPPA_PCREL_CALL_17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_17"},
330 {R_HPPA_PCREL_CALL_12, 0, 3, 12, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_12"},
331 {R_HPPA_PCREL_CALL_L21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_L21"},
332 {R_HPPA_PCREL_CALL_R11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_R11"},
333 {R_HPPA_PCREL_CALL_R14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_R14"},
334 {R_HPPA_PCREL_CALL_R17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_R17"},
335 {R_HPPA_PCREL_CALL_LS21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_LS21"},
336 {R_HPPA_PCREL_CALL_RS11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RS11"},
337 {R_HPPA_PCREL_CALL_RS14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RS14"},
338 {R_HPPA_PCREL_CALL_RS17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RS17"},
339 {R_HPPA_PCREL_CALL_LD21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_LD21"},
340 {R_HPPA_PCREL_CALL_RD11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RD11"},
341 {R_HPPA_PCREL_CALL_RD14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RD14"},
342 {R_HPPA_PCREL_CALL_RD17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RD17"},
343 {R_HPPA_PCREL_CALL_LR21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_LR21"},
344 {R_HPPA_PCREL_CALL_RR14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RR14"},
345 {R_HPPA_PCREL_CALL_RR17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RR17"},
4861ac76
JL
346 {R_HPPA_PLABEL_32, 0, 3, 32, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_32"},
347 {R_HPPA_PLABEL_11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_11"},
348 {R_HPPA_PLABEL_14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_14"},
349 {R_HPPA_PLABEL_L21, 0, 3, 21, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_L21"},
350 {R_HPPA_PLABEL_R11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_R11"},
351 {R_HPPA_PLABEL_R14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_R14"},
4861ac76
JL
352 {R_HPPA_DLT_32, 0, 3, 32, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_32"},
353 {R_HPPA_DLT_11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_11"},
354 {R_HPPA_DLT_14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_14"},
355 {R_HPPA_DLT_L21, 0, 3, 21, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_L21"},
356 {R_HPPA_DLT_R11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_R11"},
357 {R_HPPA_DLT_R14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_R14"},
d9ad93bc
KR
358 {R_HPPA_UNWIND_ENTRY, 0, 3, 32, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_UNWIND_ENTRY"},
359 {R_HPPA_UNWIND_ENTRIES, 0, 3, 32, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_UNWIND_ENTRIES"},
d9ad93bc
KR
360 {R_HPPA_PUSH_CONST, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_CONST"},
361 {R_HPPA_PUSH_PC, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_PC"},
362 {R_HPPA_PUSH_SYM, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_SYM"},
363 {R_HPPA_PUSH_GOTOFF, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_GOTOFF"},
364 {R_HPPA_PUSH_ABS_CALL, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_ABS_CALL"},
365 {R_HPPA_PUSH_PCREL_CALL, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_PCREL_CALL"},
366 {R_HPPA_PUSH_PLABEL, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_PLABEL"},
367{R_HPPA_MAX, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MAX"},
368{R_HPPA_MIN, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MIN"},
369{R_HPPA_ADD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ADD"},
370{R_HPPA_SUB, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_SUB"},
371 {R_HPPA_MULT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MULT"},
372{R_HPPA_DIV, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_DIV"},
373{R_HPPA_MOD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MOD"},
374{R_HPPA_AND, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_AND"},
375 {R_HPPA_OR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_OR"},
376{R_HPPA_XOR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_XOR"},
377{R_HPPA_NOT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_NOT"},
378 {R_HPPA_LSHIFT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LSHIFT"},
379 {R_HPPA_ARITH_RSHIFT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ARITH_RSHIFT"},
380 {R_HPPA_LOGIC_RSHIFT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LOGIC_RSHIFT"},
381{R_HPPA_EXPR_F, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_L"},
382 {R_HPPA_EXPR_L, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_L"},
383 {R_HPPA_EXPR_R, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_R"},
384 {R_HPPA_EXPR_LS, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_LS"},
385 {R_HPPA_EXPR_RS, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_RS"},
386 {R_HPPA_EXPR_LD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_LD"},
387 {R_HPPA_EXPR_RD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_RD"},
388 {R_HPPA_EXPR_LR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_LR"},
389 {R_HPPA_EXPR_RR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_RR"},
d9ad93bc
KR
390 {R_HPPA_EXPR_32, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_32"},
391 {R_HPPA_EXPR_21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_21"},
392 {R_HPPA_EXPR_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_11"},
393 {R_HPPA_EXPR_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_14"},
394 {R_HPPA_EXPR_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_17"},
395 {R_HPPA_EXPR_12, 0, 3, 12, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_12"},
396 {R_HPPA_STUB_CALL_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_STUB_CALL_17"},
397 {R_HPPA_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_HPPA_UNIMPLEMENTED"},
e8f2240a 398};
4c85cbfa 399
d9ad93bc
KR
400static symext_chainS *symext_rootP;
401static symext_chainS *symext_lastP;
7218bb04 402static boolean symext_chain_built;
f5bfdacd
JL
403static long global_value;
404static long GOT_value;
405static asymbol *global_symbol;
406static int global_sym_defined;
f5bfdacd
JL
407static symext_entryS *symextn_contents;
408static unsigned int symextn_contents_real_size;
e08b9ad7
JL
409static elf32_hppa_stub_description *elf_hppa_stub_rootP;
410static boolean stubs_finished = false;
411static struct elf32_hppa_symextn_map_struct *elf32_hppa_symextn_map;
412static int elf32_hppa_symextn_map_size;
413
414static char *linker_stubs = NULL;
415static int linker_stubs_size = 0;
416static int linker_stubs_max_size = 0;
417#define STUB_ALLOC_INCR 100
418#define STUB_SYM_BUFFER_INC 5
e8f2240a 419
f5bfdacd 420/* Relocate the given INSN given the various input parameters.
e8f2240a 421
f5bfdacd 422 FIXME: endianness and sizeof (long) issues abound here. */
4c85cbfa
KR
423
424static unsigned long
f5bfdacd
JL
425hppa_elf_relocate_insn (abfd, input_sect, insn, address, sym_value,
426 r_addend, r_format, r_field, pcrel)
f4bd7a8f
DM
427 bfd *abfd;
428 asection *input_sect;
429 unsigned long insn;
430 unsigned long address;
f4bd7a8f
DM
431 long sym_value;
432 long r_addend;
f5bfdacd
JL
433 unsigned long r_format;
434 unsigned long r_field;
435 unsigned long pcrel;
4c85cbfa 436{
e8f2240a
KR
437 unsigned char opcode = get_opcode (insn);
438 long constant_value;
439 unsigned arg_reloc;
440
441 switch (opcode)
442 {
443 case LDO:
444 case LDB:
445 case LDH:
446 case LDW:
447 case LDWM:
448 case STB:
449 case STH:
450 case STW:
451 case STWM:
f5bfdacd
JL
452 case COMICLR:
453 case SUBI:
454 case ADDIT:
455 case ADDI:
456 case LDIL:
457 case ADDIL:
7218bb04 458 constant_value = HPPA_R_CONSTANT (r_addend);
e8f2240a
KR
459
460 if (pcrel)
461 sym_value -= address;
e8f2240a 462
e8f2240a 463 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
f5bfdacd 464 return hppa_rebuild_insn (abfd, insn, sym_value, r_format);
e8f2240a
KR
465
466 case BL:
467 case BE:
468 case BLE:
7218bb04 469 arg_reloc = HPPA_R_ARG_RELOC (r_addend);
e8f2240a 470
e8f2240a
KR
471 /* XXX computing constant_value is not needed??? */
472 constant_value = assemble_17 ((insn & 0x001f0000) >> 16,
473 (insn & 0x00001ffc) >> 2,
474 insn & 1);
f5bfdacd 475
e8f2240a
KR
476 constant_value = (constant_value << 15) >> 15;
477 if (pcrel)
478 {
479 sym_value -=
480 address + input_sect->output_offset
481 + input_sect->output_section->vma;
482 sym_value = hppa_field_adjust (sym_value, -8, r_field);
483 }
484 else
485 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
4c85cbfa 486
f5bfdacd 487 return hppa_rebuild_insn (abfd, insn, sym_value >> 2, r_format);
4c85cbfa 488
e8f2240a
KR
489 default:
490 if (opcode == 0)
491 {
7218bb04 492 constant_value = HPPA_R_CONSTANT (r_addend);
e8f2240a 493
f5bfdacd
JL
494 if (pcrel)
495 sym_value -= address;
496
e8f2240a
KR
497 return hppa_field_adjust (sym_value, constant_value, r_field);
498 }
499 else
f5bfdacd 500 abort ();
e8f2240a 501 }
4c85cbfa
KR
502}
503
f5bfdacd
JL
504/* Relocate a single unwind entry, or an entire table of them. */
505
4c85cbfa 506static void
f5bfdacd
JL
507hppa_elf_relocate_unwind_table (abfd, data, address, sym_value,
508 r_addend, r_type, r_field)
f4bd7a8f 509 bfd *abfd;
f4bd7a8f
DM
510 PTR data;
511 unsigned long address;
f4bd7a8f
DM
512 long sym_value;
513 long r_addend;
f5bfdacd
JL
514 unsigned long r_type;
515 unsigned long r_field;
4c85cbfa 516{
f5bfdacd 517 bfd_byte *hit_data = address + (bfd_byte *) data;
e8f2240a
KR
518 long start_offset;
519 long end_offset;
520 long relocated_value;
521 int i;
522
e8f2240a
KR
523 switch (r_type)
524 {
525 case R_HPPA_UNWIND_ENTRY:
f5bfdacd
JL
526 /* Need to relocate the first two 32bit fields in the unwind. They
527 correspond to a function's start and end address. */
e8f2240a
KR
528 start_offset = bfd_get_32 (abfd, hit_data);
529 relocated_value = hppa_field_adjust (sym_value, start_offset, r_field);
530 bfd_put_32 (abfd, relocated_value, hit_data);
531
532 hit_data += sizeof (unsigned long);
533 end_offset = bfd_get_32 (abfd, hit_data);
534 relocated_value = hppa_field_adjust (sym_value, end_offset, r_field);
535 bfd_put_32 (abfd, relocated_value, hit_data);
536 break;
537
538 case R_HPPA_UNWIND_ENTRIES:
f5bfdacd
JL
539 /* Relocate a mass of unwind entires. The count is passed in r_addend
540 (who's braindamaged idea was this anyway? */
e8f2240a
KR
541 for (i = 0; i < r_addend; i++, hit_data += 3 * sizeof (unsigned long))
542 {
d9ad93bc 543 unsigned int adjustment;
f5bfdacd
JL
544 /* Adjust the first 32bit field in the unwind entry. It's
545 the starting offset of a function. */
e8f2240a 546 start_offset = bfd_get_32 (abfd, hit_data);
e8f2240a 547 bfd_put_32 (abfd, sym_value, hit_data);
d9ad93bc 548 adjustment = sym_value - start_offset;
e8f2240a 549
f5bfdacd
JL
550 /* Now adjust the second 32bit field, it's the ending offset
551 of a function. */
e8f2240a 552 hit_data += sizeof (unsigned long);
d9ad93bc
KR
553 end_offset = adjustment + bfd_get_32 (abfd, hit_data);
554 bfd_put_32 (abfd, end_offset, hit_data);
e8f2240a 555
f5bfdacd
JL
556 /* Prepare for the next iteration. */
557 start_offset = bfd_get_32 (abfd,
558 hit_data + 3 * sizeof (unsigned long));
559 sym_value = start_offset + adjustment;
4c85cbfa 560 }
e8f2240a
KR
561 break;
562
563 default:
f5bfdacd 564 abort ();
e8f2240a 565 }
4c85cbfa
KR
566}
567
f5bfdacd
JL
568/* Return the relocated value of the given symbol. */
569
e8f2240a
KR
570static long
571get_symbol_value (symbol)
572 asymbol *symbol;
573{
f5bfdacd
JL
574 if (symbol == NULL
575 || symbol->section == &bfd_com_section)
576 return 0;
e8f2240a 577 else
f5bfdacd
JL
578 return symbol->value + symbol->section->output_section->vma
579 + symbol->section->output_offset;
4c85cbfa
KR
580}
581
f5bfdacd 582/* Return one (or more) BFD relocations which implement the base
e08b9ad7 583 relocation with modifications based on format and field. */
4c85cbfa 584
e8f2240a
KR
585elf32_hppa_reloc_type **
586hppa_elf_gen_reloc_type (abfd, base_type, format, field)
587 bfd *abfd;
588 elf32_hppa_reloc_type base_type;
589 int format;
590 int field;
4c85cbfa 591{
e8f2240a
KR
592 elf32_hppa_reloc_type *finaltype;
593 elf32_hppa_reloc_type **final_types;
e8f2240a 594
f5bfdacd
JL
595 /* Allocate slots for the BFD relocation. */
596 final_types = (elf32_hppa_reloc_type **)
597 bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type *) * 2);
9783e04a 598 BFD_ASSERT (final_types != 0); /* FIXME */
e8f2240a 599
f5bfdacd
JL
600 /* Allocate space for the relocation itself. */
601 finaltype = (elf32_hppa_reloc_type *)
602 bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type));
9783e04a 603 BFD_ASSERT (finaltype != 0); /* FIXME */
e8f2240a 604
f5bfdacd 605 /* Some reasonable defaults. */
e8f2240a
KR
606 final_types[0] = finaltype;
607 final_types[1] = NULL;
608
609#define final_type finaltype[0]
610
611 final_type = base_type;
612
f5bfdacd
JL
613 /* Just a tangle of nested switch statements to deal with the braindamage
614 that a different field selector means a completely different relocation
615 for PA ELF. */
e8f2240a
KR
616 switch (base_type)
617 {
618 case R_HPPA:
619 switch (format)
620 {
621 case 11:
622 switch (field)
623 {
624 case e_fsel:
625 final_type = R_HPPA_11;
626 break;
627 case e_rsel:
628 final_type = R_HPPA_R11;
629 break;
630 case e_rssel:
631 final_type = R_HPPA_RS11;
632 break;
633 case e_rdsel:
634 final_type = R_HPPA_RD11;
635 break;
e8f2240a
KR
636 case e_psel:
637 final_type = R_HPPA_PLABEL_11;
638 break;
639 case e_rpsel:
640 final_type = R_HPPA_PLABEL_R11;
641 break;
e8f2240a 642 case e_tsel:
a36b6f1d
JL
643 final_type = R_HPPA_DLT_11;
644 break;
e8f2240a 645 case e_rtsel:
a36b6f1d
JL
646 final_type = R_HPPA_DLT_R11;
647 break;
e8f2240a 648 default:
f5bfdacd 649 abort ();
e8f2240a
KR
650 break;
651 }
652 break;
f5bfdacd 653
e8f2240a
KR
654 case 14:
655 switch (field)
656 {
657 case e_rsel:
658 final_type = R_HPPA_R14;
659 break;
660 case e_rssel:
661 final_type = R_HPPA_RS14;
662 break;
663 case e_rdsel:
664 final_type = R_HPPA_RD14;
665 break;
666 case e_rrsel:
667 final_type = R_HPPA_RR14;
668 break;
e8f2240a
KR
669 case e_psel:
670 final_type = R_HPPA_PLABEL_14;
671 break;
672 case e_rpsel:
673 final_type = R_HPPA_PLABEL_R14;
674 break;
e8f2240a 675 case e_tsel:
a36b6f1d
JL
676 final_type = R_HPPA_DLT_14;
677 break;
e8f2240a 678 case e_rtsel:
a36b6f1d
JL
679 final_type = R_HPPA_DLT_R14;
680 break;
e8f2240a 681 default:
f5bfdacd 682 abort ();
e8f2240a
KR
683 break;
684 }
685 break;
f5bfdacd 686
e8f2240a
KR
687 case 17:
688 switch (field)
689 {
690 case e_fsel:
691 final_type = R_HPPA_17;
692 break;
693 case e_rsel:
694 final_type = R_HPPA_R17;
695 break;
696 case e_rssel:
697 final_type = R_HPPA_RS17;
698 break;
699 case e_rdsel:
700 final_type = R_HPPA_RD17;
701 break;
702 case e_rrsel:
703 final_type = R_HPPA_RR17;
704 break;
e8f2240a 705 default:
f5bfdacd 706 abort ();
e8f2240a
KR
707 break;
708 }
709 break;
f5bfdacd 710
e8f2240a
KR
711 case 21:
712 switch (field)
713 {
714 case e_lsel:
715 final_type = R_HPPA_L21;
716 break;
717 case e_lssel:
718 final_type = R_HPPA_LS21;
719 break;
720 case e_ldsel:
721 final_type = R_HPPA_LD21;
722 break;
723 case e_lrsel:
724 final_type = R_HPPA_LR21;
725 break;
726 case e_lpsel:
727 final_type = R_HPPA_PLABEL_L21;
728 break;
a36b6f1d
JL
729 case e_ltsel:
730 final_type = R_HPPA_PLABEL_L21;
731 break;
e8f2240a 732 default:
f5bfdacd 733 abort ();
e8f2240a
KR
734 break;
735 }
736 break;
f5bfdacd 737
e8f2240a
KR
738 case 32:
739 switch (field)
740 {
741 case e_fsel:
742 final_type = R_HPPA_32;
743 break;
744 case e_psel:
745 final_type = R_HPPA_PLABEL_32;
746 break;
a36b6f1d 747 case e_tsel:
7a60ed8c 748 final_type = R_HPPA_DLT_32;
a36b6f1d 749 break;
e8f2240a 750 default:
f5bfdacd 751 abort ();
e8f2240a
KR
752 break;
753 }
754 break;
f5bfdacd 755
e8f2240a 756 default:
f5bfdacd 757 abort ();
e8f2240a
KR
758 break;
759 }
760 break;
f5bfdacd
JL
761
762
e8f2240a
KR
763 case R_HPPA_GOTOFF:
764 switch (format)
765 {
766 case 11:
767 switch (field)
768 {
769 case e_rsel:
770 final_type = R_HPPA_GOTOFF_R11;
771 break;
772 case e_rssel:
773 final_type = R_HPPA_GOTOFF_RS11;
774 break;
775 case e_rdsel:
776 final_type = R_HPPA_GOTOFF_RD11;
777 break;
778 case e_fsel:
779 final_type = R_HPPA_GOTOFF_11;
780 break;
e8f2240a 781 default:
f5bfdacd 782 abort ();
e8f2240a
KR
783 break;
784 }
785 break;
f5bfdacd 786
e8f2240a
KR
787 case 14:
788 switch (field)
789 {
790 case e_rsel:
791 final_type = R_HPPA_GOTOFF_R14;
792 break;
793 case e_rssel:
794 final_type = R_HPPA_GOTOFF_RS14;
795 break;
796 case e_rdsel:
797 final_type = R_HPPA_GOTOFF_RD14;
798 break;
799 case e_rrsel:
800 final_type = R_HPPA_GOTOFF_RR14;
801 break;
802 case e_fsel:
803 final_type = R_HPPA_GOTOFF_14;
804 break;
e8f2240a 805 default:
f5bfdacd 806 abort ();
e8f2240a
KR
807 break;
808 }
809 break;
f5bfdacd 810
e8f2240a
KR
811 case 21:
812 switch (field)
813 {
814 case e_lsel:
815 final_type = R_HPPA_GOTOFF_L21;
816 break;
817 case e_lssel:
818 final_type = R_HPPA_GOTOFF_LS21;
819 break;
820 case e_ldsel:
821 final_type = R_HPPA_GOTOFF_LD21;
822 break;
823 case e_lrsel:
824 final_type = R_HPPA_GOTOFF_LR21;
825 break;
e8f2240a 826 default:
f5bfdacd 827 abort ();
e8f2240a
KR
828 break;
829 }
830 break;
f5bfdacd 831
e8f2240a 832 default:
f5bfdacd 833 abort ();
e8f2240a
KR
834 break;
835 }
836 break;
f5bfdacd
JL
837
838
e8f2240a
KR
839 case R_HPPA_PCREL_CALL:
840 switch (format)
841 {
842 case 11:
843 switch (field)
844 {
845 case e_rsel:
846 final_type = R_HPPA_PCREL_CALL_R11;
847 break;
848 case e_rssel:
849 final_type = R_HPPA_PCREL_CALL_RS11;
850 break;
851 case e_rdsel:
852 final_type = R_HPPA_PCREL_CALL_RD11;
853 break;
854 case e_fsel:
855 final_type = R_HPPA_PCREL_CALL_11;
856 break;
e8f2240a 857 default:
f5bfdacd 858 abort ();
e8f2240a
KR
859 break;
860 }
861 break;
f5bfdacd 862
e8f2240a
KR
863 case 14:
864 switch (field)
865 {
866 case e_rsel:
867 final_type = R_HPPA_PCREL_CALL_R14;
868 break;
869 case e_rssel:
870 final_type = R_HPPA_PCREL_CALL_RS14;
871 break;
872 case e_rdsel:
873 final_type = R_HPPA_PCREL_CALL_RD14;
874 break;
875 case e_rrsel:
876 final_type = R_HPPA_PCREL_CALL_RR14;
877 break;
878 case e_fsel:
879 final_type = R_HPPA_PCREL_CALL_14;
880 break;
e8f2240a 881 default:
f5bfdacd 882 abort ();
e8f2240a
KR
883 break;
884 }
885 break;
f5bfdacd 886
e8f2240a
KR
887 case 17:
888 switch (field)
889 {
890 case e_rsel:
891 final_type = R_HPPA_PCREL_CALL_R17;
892 break;
893 case e_rssel:
894 final_type = R_HPPA_PCREL_CALL_RS17;
895 break;
896 case e_rdsel:
897 final_type = R_HPPA_PCREL_CALL_RD17;
898 break;
899 case e_rrsel:
900 final_type = R_HPPA_PCREL_CALL_RR17;
901 break;
902 case e_fsel:
903 final_type = R_HPPA_PCREL_CALL_17;
904 break;
e8f2240a 905 default:
f5bfdacd 906 abort ();
e8f2240a
KR
907 break;
908 }
909 break;
f5bfdacd 910
e8f2240a
KR
911 case 21:
912 switch (field)
913 {
914 case e_lsel:
915 final_type = R_HPPA_PCREL_CALL_L21;
916 break;
917 case e_lssel:
918 final_type = R_HPPA_PCREL_CALL_LS21;
919 break;
920 case e_ldsel:
921 final_type = R_HPPA_PCREL_CALL_LD21;
922 break;
923 case e_lrsel:
924 final_type = R_HPPA_PCREL_CALL_LR21;
925 break;
e8f2240a 926 default:
f5bfdacd 927 abort ();
e8f2240a
KR
928 break;
929 }
930 break;
f5bfdacd 931
e8f2240a 932 default:
f5bfdacd 933 abort ();
e8f2240a
KR
934 break;
935 }
936 break;
f5bfdacd
JL
937
938
e8f2240a
KR
939 case R_HPPA_PLABEL:
940 switch (format)
941 {
942 case 11:
943 switch (field)
944 {
945 case e_fsel:
946 final_type = R_HPPA_PLABEL_11;
947 break;
948 case e_rsel:
949 final_type = R_HPPA_PLABEL_R11;
950 break;
951 default:
f5bfdacd 952 abort ();
e8f2240a
KR
953 break;
954 }
955 break;
f5bfdacd 956
e8f2240a
KR
957 case 14:
958 switch (field)
959 {
960 case e_fsel:
961 final_type = R_HPPA_PLABEL_14;
962 break;
963 case e_rsel:
964 final_type = R_HPPA_PLABEL_R14;
965 break;
966 default:
f5bfdacd 967 abort ();
e8f2240a
KR
968 break;
969 }
970 break;
f5bfdacd 971
e8f2240a
KR
972 case 21:
973 switch (field)
974 {
975 case e_lsel:
976 final_type = R_HPPA_PLABEL_L21;
977 break;
978 default:
f5bfdacd 979 abort ();
e8f2240a
KR
980 break;
981 }
982 break;
f5bfdacd 983
e8f2240a
KR
984 case 32:
985 switch (field)
986 {
987 case e_fsel:
988 final_type = R_HPPA_PLABEL_32;
989 break;
990 default:
f5bfdacd 991 abort ();
e8f2240a
KR
992 break;
993 }
994 break;
f5bfdacd 995
e8f2240a 996 default:
f5bfdacd 997 abort ();
e8f2240a
KR
998 break;
999 }
f5bfdacd
JL
1000
1001
e8f2240a
KR
1002 case R_HPPA_ABS_CALL:
1003 switch (format)
1004 {
1005 case 11:
1006 switch (field)
1007 {
1008 case e_rsel:
1009 final_type = R_HPPA_ABS_CALL_R11;
1010 break;
1011 case e_rssel:
1012 final_type = R_HPPA_ABS_CALL_RS11;
1013 break;
1014 case e_rdsel:
1015 final_type = R_HPPA_ABS_CALL_RD11;
1016 break;
1017 case e_fsel:
1018 final_type = R_HPPA_ABS_CALL_11;
1019 break;
4c85cbfa 1020 default:
f5bfdacd 1021 abort ();
e8f2240a
KR
1022 break;
1023 }
1024 break;
f5bfdacd 1025
e8f2240a
KR
1026 case 14:
1027 switch (field)
1028 {
1029 case e_rsel:
1030 final_type = R_HPPA_ABS_CALL_R14;
1031 break;
1032 case e_rssel:
1033 final_type = R_HPPA_ABS_CALL_RS14;
1034 break;
1035 case e_rdsel:
1036 final_type = R_HPPA_ABS_CALL_RD14;
1037 break;
1038 case e_rrsel:
1039 final_type = R_HPPA_ABS_CALL_RR14;
1040 break;
1041 case e_fsel:
1042 final_type = R_HPPA_ABS_CALL_14;
1043 break;
e8f2240a 1044 default:
f5bfdacd 1045 abort ();
e8f2240a
KR
1046 break;
1047 }
1048 break;
f5bfdacd 1049
e8f2240a
KR
1050 case 17:
1051 switch (field)
1052 {
1053 case e_rsel:
1054 final_type = R_HPPA_ABS_CALL_R17;
1055 break;
1056 case e_rssel:
1057 final_type = R_HPPA_ABS_CALL_RS17;
1058 break;
1059 case e_rdsel:
1060 final_type = R_HPPA_ABS_CALL_RD17;
1061 break;
1062 case e_rrsel:
1063 final_type = R_HPPA_ABS_CALL_RR17;
1064 break;
1065 case e_fsel:
1066 final_type = R_HPPA_ABS_CALL_17;
1067 break;
e8f2240a 1068 default:
f5bfdacd 1069 abort ();
e8f2240a
KR
1070 break;
1071 }
1072 break;
f5bfdacd 1073
e8f2240a
KR
1074 case 21:
1075 switch (field)
1076 {
1077 case e_lsel:
1078 final_type = R_HPPA_ABS_CALL_L21;
1079 break;
1080 case e_lssel:
1081 final_type = R_HPPA_ABS_CALL_LS21;
1082 break;
1083 case e_ldsel:
1084 final_type = R_HPPA_ABS_CALL_LD21;
1085 break;
1086 case e_lrsel:
1087 final_type = R_HPPA_ABS_CALL_LR21;
1088 break;
e8f2240a 1089 default:
f5bfdacd 1090 abort ();
e8f2240a
KR
1091 break;
1092 }
1093 break;
f5bfdacd 1094
e8f2240a 1095 default:
f5bfdacd 1096 abort ();
e8f2240a
KR
1097 break;
1098 }
1099 break;
f5bfdacd
JL
1100
1101
e8f2240a
KR
1102 case R_HPPA_UNWIND:
1103 final_type = R_HPPA_UNWIND_ENTRY;
1104 break;
f5bfdacd
JL
1105
1106
e8f2240a
KR
1107 case R_HPPA_COMPLEX:
1108 case R_HPPA_COMPLEX_PCREL_CALL:
1109 case R_HPPA_COMPLEX_ABS_CALL:
f5bfdacd
JL
1110 /* The code originally here was horribly broken, and apparently
1111 never used. Zap it. When we need complex relocations rewrite
1112 it correctly! */
1113 abort ();
e8f2240a 1114 break;
f5bfdacd 1115
e8f2240a
KR
1116 default:
1117 final_type = base_type;
1118 break;
1119 }
1120
1121 return final_types;
4c85cbfa
KR
1122}
1123
e8f2240a
KR
1124#undef final_type
1125
4c85cbfa 1126
f5bfdacd 1127/* Actually perform a relocation. */
4c85cbfa
KR
1128
1129static bfd_reloc_status_type
4991ebb9
ILT
1130hppa_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
1131 error_message)
4861ac76
JL
1132 bfd *abfd;
1133 arelent *reloc_entry;
1134 asymbol *symbol_in;
1135 PTR data;
1136 asection *input_section;
1137 bfd *output_bfd;
4991ebb9 1138 char **error_message;
e8f2240a
KR
1139{
1140 unsigned long insn;
1141 long sym_value = 0;
4861ac76 1142 unsigned long addr = reloc_entry->address;
f5bfdacd
JL
1143 bfd_byte *hit_data = addr + (bfd_byte *) data;
1144 unsigned long r_type = reloc_entry->howto->type;
1145 unsigned long r_field = e_fsel;
e8f2240a 1146 boolean r_pcrel = reloc_entry->howto->pc_relative;
e8f2240a
KR
1147 unsigned r_format = reloc_entry->howto->bitsize;
1148 long r_addend = reloc_entry->addend;
1149
f5bfdacd 1150 /* If only performing a partial link, get out early. */
e8f2240a
KR
1151 if (output_bfd)
1152 {
e8f2240a
KR
1153 reloc_entry->address += input_section->output_offset;
1154 return bfd_reloc_ok;
1155 }
1156
4861ac76
JL
1157 /* If performing final link and the symbol we're relocating against
1158 is undefined, then return an error. */
e8f2240a
KR
1159 if (symbol_in && symbol_in->section == &bfd_und_section)
1160 return bfd_reloc_undefined;
1161
f5bfdacd 1162 /* Get the final relocated value. */
e8f2240a
KR
1163 sym_value = get_symbol_value (symbol_in);
1164
f5bfdacd
JL
1165 /* Compute the value of $global$.
1166 FIXME: None of this should be necessary. $global$ is just a
1167 marker and shouldn't really figure into these computations.
1168
1169 Once that's fixed we'll need to teach this backend to change
1170 DP-relative relocations involving symbols in the text section
1171 to be simple absolute relocations. */
d9ad93bc 1172 if (!global_sym_defined)
e8f2240a 1173 {
d9ad93bc 1174 if (global_symbol)
e8f2240a 1175 {
d9ad93bc
KR
1176 global_value = (global_symbol->value
1177 + global_symbol->section->output_section->vma
1178 + global_symbol->section->output_offset);
4861ac76 1179 GOT_value = global_value;
d9ad93bc 1180 global_sym_defined++;
e8f2240a
KR
1181 }
1182 }
1183
4861ac76 1184 /* Get the instruction word. */
e8f2240a
KR
1185 insn = bfd_get_32 (abfd, hit_data);
1186
4861ac76 1187 /* Relocate the value based on one of the basic relocation types
e8f2240a 1188
4861ac76
JL
1189 basic_type_1: relocation is relative to $global$
1190 basic_type_2: relocation is relative to the current GOT
1191 basic_type_3: relocation is an absolute call
1192 basic_type_4: relocation is an PC-relative call
1193 basic_type_5: relocation is plabel reference
1194 basic_type_6: relocation is an unwind table relocation
1195 extended_type: unimplemented */
e8f2240a
KR
1196
1197 switch (r_type)
1198 {
1199 case R_HPPA_NONE:
1200 break;
4861ac76
JL
1201
1202 /* Handle all the basic type 1 relocations. */
1203 case R_HPPA_32:
4861ac76 1204 case R_HPPA_11:
4861ac76 1205 case R_HPPA_14:
4861ac76 1206 case R_HPPA_17:
e8f2240a
KR
1207 r_field = e_fsel;
1208 goto do_basic_type_1;
4861ac76 1209 case R_HPPA_L21:
e8f2240a
KR
1210 r_field = e_lsel;
1211 goto do_basic_type_1;
4861ac76 1212 case R_HPPA_R11:
4861ac76 1213 case R_HPPA_R14:
4861ac76 1214 case R_HPPA_R17:
e8f2240a
KR
1215 r_field = e_rsel;
1216 goto do_basic_type_1;
4861ac76 1217 case R_HPPA_LS21:
e8f2240a
KR
1218 r_field = e_lssel;
1219 goto do_basic_type_1;
4861ac76 1220 case R_HPPA_RS11:
4861ac76 1221 case R_HPPA_RS14:
4861ac76 1222 case R_HPPA_RS17:
e8f2240a
KR
1223 r_field = e_ldsel;
1224 goto do_basic_type_1;
4861ac76 1225 case R_HPPA_LD21:
e8f2240a
KR
1226 r_field = e_ldsel;
1227 goto do_basic_type_1;
4861ac76 1228 case R_HPPA_RD11:
4861ac76 1229 case R_HPPA_RD14:
4861ac76 1230 case R_HPPA_RD17:
e8f2240a
KR
1231 r_field = e_rdsel;
1232 goto do_basic_type_1;
4861ac76 1233 case R_HPPA_LR21:
e8f2240a
KR
1234 r_field = e_lrsel;
1235 goto do_basic_type_1;
4861ac76 1236 case R_HPPA_RR14:
4861ac76 1237 case R_HPPA_RR17:
e8f2240a
KR
1238 r_field = e_rrsel;
1239
1240 do_basic_type_1:
1241 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
f5bfdacd
JL
1242 sym_value, r_addend, r_format,
1243 r_field, r_pcrel);
e8f2240a
KR
1244 break;
1245
4861ac76
JL
1246 /* Handle all the basic type 2 relocations. */
1247 case R_HPPA_GOTOFF_11:
4861ac76 1248 case R_HPPA_GOTOFF_14:
e8f2240a
KR
1249 r_field = e_fsel;
1250 goto do_basic_type_2;
4861ac76 1251 case R_HPPA_GOTOFF_L21:
e8f2240a
KR
1252 r_field = e_lsel;
1253 goto do_basic_type_2;
4861ac76 1254 case R_HPPA_GOTOFF_R11:
4861ac76 1255 case R_HPPA_GOTOFF_R14:
e8f2240a
KR
1256 r_field = e_rsel;
1257 goto do_basic_type_2;
4861ac76 1258 case R_HPPA_GOTOFF_LS21:
e8f2240a
KR
1259 r_field = e_lssel;
1260 goto do_basic_type_2;
4861ac76 1261 case R_HPPA_GOTOFF_RS11:
4861ac76 1262 case R_HPPA_GOTOFF_RS14:
e8f2240a
KR
1263 r_field = e_rssel;
1264 goto do_basic_type_2;
4861ac76 1265 case R_HPPA_GOTOFF_LD21:
e8f2240a
KR
1266 r_field = e_ldsel;
1267 goto do_basic_type_2;
4861ac76 1268 case R_HPPA_GOTOFF_RD11:
4861ac76 1269 case R_HPPA_GOTOFF_RD14:
e8f2240a
KR
1270 r_field = e_rdsel;
1271 goto do_basic_type_2;
4861ac76 1272 case R_HPPA_GOTOFF_LR21:
e8f2240a
KR
1273 r_field = e_lrsel;
1274 goto do_basic_type_2;
4861ac76 1275 case R_HPPA_GOTOFF_RR14:
e8f2240a 1276 r_field = e_rrsel;
4861ac76 1277
e8f2240a
KR
1278 do_basic_type_2:
1279 sym_value -= GOT_value;
1280 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
f5bfdacd
JL
1281 sym_value, r_addend, r_format,
1282 r_field, r_pcrel);
e8f2240a
KR
1283 break;
1284
4861ac76
JL
1285 /* Handle all the basic type 3 relocations. */
1286 case R_HPPA_ABS_CALL_11:
4861ac76 1287 case R_HPPA_ABS_CALL_14:
4861ac76 1288 case R_HPPA_ABS_CALL_17:
e8f2240a
KR
1289 r_field = e_fsel;
1290 goto do_basic_type_3;
4861ac76 1291 case R_HPPA_ABS_CALL_L21:
e8f2240a
KR
1292 r_field = e_lsel;
1293 goto do_basic_type_3;
4861ac76 1294 case R_HPPA_ABS_CALL_R11:
4861ac76 1295 case R_HPPA_ABS_CALL_R14:
4861ac76 1296 case R_HPPA_ABS_CALL_R17:
e8f2240a
KR
1297 r_field = e_rsel;
1298 goto do_basic_type_3;
4861ac76 1299 case R_HPPA_ABS_CALL_LS21:
e8f2240a
KR
1300 r_field = e_lssel;
1301 goto do_basic_type_3;
4861ac76 1302 case R_HPPA_ABS_CALL_RS11:
4861ac76 1303 case R_HPPA_ABS_CALL_RS14:
4861ac76 1304 case R_HPPA_ABS_CALL_RS17:
e8f2240a
KR
1305 r_field = e_rssel;
1306 goto do_basic_type_3;
4861ac76 1307 case R_HPPA_ABS_CALL_LD21:
e8f2240a
KR
1308 r_field = e_ldsel;
1309 goto do_basic_type_3;
4861ac76 1310 case R_HPPA_ABS_CALL_RD11:
4861ac76 1311 case R_HPPA_ABS_CALL_RD14:
4861ac76 1312 case R_HPPA_ABS_CALL_RD17:
e8f2240a
KR
1313 r_field = e_rdsel;
1314 goto do_basic_type_3;
4861ac76 1315 case R_HPPA_ABS_CALL_LR21:
e8f2240a
KR
1316 r_field = e_lrsel;
1317 goto do_basic_type_3;
4861ac76 1318 case R_HPPA_ABS_CALL_RR14:
4861ac76 1319 case R_HPPA_ABS_CALL_RR17:
e8f2240a 1320 r_field = e_rrsel;
4861ac76 1321
e8f2240a
KR
1322 do_basic_type_3:
1323 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
f5bfdacd
JL
1324 sym_value, r_addend, r_format,
1325 r_field, r_pcrel);
e8f2240a
KR
1326 break;
1327
4861ac76
JL
1328 /* Handle all the basic type 4 relocations. */
1329 case R_HPPA_PCREL_CALL_11:
4861ac76 1330 case R_HPPA_PCREL_CALL_14:
4861ac76 1331 case R_HPPA_PCREL_CALL_17:
e8f2240a
KR
1332 r_field = e_fsel;
1333 goto do_basic_type_4;
4861ac76 1334 case R_HPPA_PCREL_CALL_L21:
e8f2240a
KR
1335 r_field = e_lsel;
1336 goto do_basic_type_4;
4861ac76 1337 case R_HPPA_PCREL_CALL_R11:
4861ac76 1338 case R_HPPA_PCREL_CALL_R14:
4861ac76 1339 case R_HPPA_PCREL_CALL_R17:
e8f2240a
KR
1340 r_field = e_rsel;
1341 goto do_basic_type_4;
4861ac76 1342 case R_HPPA_PCREL_CALL_LS21:
e8f2240a
KR
1343 r_field = e_lssel;
1344 goto do_basic_type_4;
4861ac76 1345 case R_HPPA_PCREL_CALL_RS11:
4861ac76 1346 case R_HPPA_PCREL_CALL_RS14:
4861ac76 1347 case R_HPPA_PCREL_CALL_RS17:
e8f2240a
KR
1348 r_field = e_rssel;
1349 goto do_basic_type_4;
4861ac76 1350 case R_HPPA_PCREL_CALL_LD21:
e8f2240a
KR
1351 r_field = e_ldsel;
1352 goto do_basic_type_4;
4861ac76 1353 case R_HPPA_PCREL_CALL_RD11:
4861ac76 1354 case R_HPPA_PCREL_CALL_RD14:
4861ac76 1355 case R_HPPA_PCREL_CALL_RD17:
e8f2240a
KR
1356 r_field = e_rdsel;
1357 goto do_basic_type_4;
4861ac76 1358 case R_HPPA_PCREL_CALL_LR21:
e8f2240a
KR
1359 r_field = e_lrsel;
1360 goto do_basic_type_4;
4861ac76 1361 case R_HPPA_PCREL_CALL_RR14:
4861ac76 1362 case R_HPPA_PCREL_CALL_RR17:
e8f2240a 1363 r_field = e_rrsel;
4861ac76 1364
e8f2240a
KR
1365 do_basic_type_4:
1366 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
f5bfdacd
JL
1367 sym_value, r_addend, r_format,
1368 r_field, r_pcrel);
e8f2240a
KR
1369 break;
1370
4861ac76 1371 /* Handle all the basic type 5 relocations. */
e8f2240a
KR
1372 case R_HPPA_PLABEL_32:
1373 case R_HPPA_PLABEL_11:
1374 case R_HPPA_PLABEL_14:
1375 r_field = e_fsel;
1376 goto do_basic_type_5;
1377 case R_HPPA_PLABEL_L21:
1378 r_field = e_lsel;
1379 goto do_basic_type_5;
1380 case R_HPPA_PLABEL_R11:
1381 case R_HPPA_PLABEL_R14:
1382 r_field = e_rsel;
1383 do_basic_type_5:
1384 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
f5bfdacd
JL
1385 sym_value, r_addend, r_format,
1386 r_field, r_pcrel);
e8f2240a
KR
1387 break;
1388
4861ac76 1389 /* Handle all basic type 6 relocations. */
e8f2240a
KR
1390 case R_HPPA_UNWIND_ENTRY:
1391 case R_HPPA_UNWIND_ENTRIES:
f5bfdacd
JL
1392 hppa_elf_relocate_unwind_table (abfd, data, addr,
1393 sym_value, r_addend,
1394 r_type, r_field);
4861ac76
JL
1395 return bfd_reloc_ok;
1396
4861ac76 1397 /* This is a linker internal relocation. */
d9ad93bc 1398 case R_HPPA_STUB_CALL_17:
4861ac76
JL
1399 /* This relocation is for a branch to a long branch stub.
1400 Change instruction to a BLE,N. It may also be necessary
f5bfdacd 1401 to interchange the branch and its delay slot.
4861ac76
JL
1402 The original instruction stream is
1403
1404 bl <foo>,r ; call foo using register r as
1405 ; the return pointer
1406 XXX ; delay slot instruction
1407
1408 The new instruction stream will be:
1409
1410 XXX ; delay slot instruction
1411 ble <foo_stub> ; call the long call stub for foo
1412 ; using r31 as the return pointer
1413
1414 This braindamage is necessary because the compiler may put
1415 an instruction which uses %r31 in the delay slot of the original
1416 call. By changing the call instruction from a "bl" to a "ble"
f5bfdacd
JL
1417 %r31 gets clobbered before the delay slot executes. This
1418 also means the stub has to play funny games to make sure
1419 we return to the instruction just after the BLE rather than
1420 two instructions after the BLE.
4861ac76
JL
1421
1422 We do not interchange the branch and delay slot if the delay
1423 slot was already nullified, or if the instruction in the delay
1424 slot modifies the return pointer to avoid an unconditional
f5bfdacd
JL
1425 jump after the call returns (GCC optimization).
1426
1427 None of this horseshit would be necessary if we put the
1428 stubs between functions and just redirected the "bl" to
1429 the stub. Live and learn. */
4861ac76 1430
f5bfdacd 1431 /* Is this instruction nullified? (does this ever happen?) */
4861ac76 1432 if (insn & 2)
a36b6f1d
JL
1433 {
1434 insn = BLE_N_XXX_0_0;
1435 bfd_put_32 (abfd, insn, hit_data);
1436 r_type = R_HPPA_ABS_CALL_17;
1437 r_pcrel = 0;
1438 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
f5bfdacd
JL
1439 addr, sym_value, r_addend,
1440 r_format, r_field, r_pcrel);
a36b6f1d 1441 }
d9ad93bc 1442 else
7218bb04 1443 {
f5bfdacd 1444 /* So much for the trivial case... */
7218bb04
KR
1445 unsigned long old_delay_slot_insn = bfd_get_32 (abfd, hit_data + 4);
1446 unsigned rtn_reg = (insn & 0x03e00000) >> 21;
1447
4861ac76 1448 if (get_opcode (old_delay_slot_insn) == LDO)
7218bb04
KR
1449 {
1450 unsigned ldo_src_reg = (old_delay_slot_insn & 0x03e00000) >> 21;
1451 unsigned ldo_target_reg = (old_delay_slot_insn & 0x001f0000) >> 16;
1452
4861ac76
JL
1453 /* If the target of the LDO is the same as the return
1454 register then there is no reordering. We can leave the
f5bfdacd
JL
1455 instuction as a non-nullified BLE in this case.
1456
1457 FIXME: This test looks wrong. If we had a ble using
1458 ldo_target_reg as the *source* we'd fuck this up. */
7218bb04
KR
1459 if (ldo_target_reg == rtn_reg)
1460 {
1461 unsigned long new_delay_slot_insn = old_delay_slot_insn;
1462
f5bfdacd 1463 BFD_ASSERT (ldo_src_reg == ldo_target_reg);
7218bb04
KR
1464 new_delay_slot_insn &= 0xfc00ffff;
1465 new_delay_slot_insn |= ((31 << 21) | (31 << 16));
4861ac76
JL
1466 bfd_put_32 (abfd, new_delay_slot_insn, hit_data + 4);
1467 insn = BLE_XXX_0_0;
4861ac76
JL
1468 r_type = R_HPPA_ABS_CALL_17;
1469 r_pcrel = 0;
1470 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
f5bfdacd
JL
1471 addr, sym_value, r_addend,
1472 r_format, r_field, r_pcrel);
a36b6f1d 1473 bfd_put_32 (abfd, insn, hit_data);
4861ac76 1474 return bfd_reloc_ok;
7218bb04 1475 }
a36b6f1d
JL
1476 else if (rtn_reg == 31)
1477 {
1478 /* The return register is r31, so this is a millicode
1479 call. Do not perform any instruction reordering. */
1480 insn = BLE_XXX_0_0;
1481 r_type = R_HPPA_ABS_CALL_17;
1482 r_pcrel = 0;
1483 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
f5bfdacd
JL
1484 addr, sym_value,
1485 r_addend, r_format,
a36b6f1d
JL
1486 r_field, r_pcrel);
1487 bfd_put_32 (abfd, insn, hit_data);
1488 return bfd_reloc_ok;
1489 }
4861ac76
JL
1490 else
1491 {
1492 /* Check to see if the delay slot instruction has a
1493 relocation. If so, we need to change the address
f5bfdacd
JL
1494 field of it because the instruction it relocates
1495 is going to be moved. Oh what a mess. */
4861ac76
JL
1496 arelent * next_reloc_entry = reloc_entry+1;
1497
1498 if (next_reloc_entry->address == reloc_entry->address + 4)
1499 next_reloc_entry->address -= 4;
1500
1501 insn = old_delay_slot_insn;
1502 bfd_put_32 (abfd, insn, hit_data);
1503 insn = BLE_N_XXX_0_0;
1504 bfd_put_32 (abfd, insn, hit_data + 4);
1505 r_type = R_HPPA_ABS_CALL_17;
1506 r_pcrel = 0;
1507 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
f5bfdacd
JL
1508 addr + 4,
1509 sym_value, r_addend,
4861ac76
JL
1510 r_format, r_field, r_pcrel);
1511 bfd_put_32 (abfd, insn, hit_data + 4);
1512 return bfd_reloc_ok;
1513 }
1514 }
f5bfdacd 1515 /* Same comments as above regarding incorrect test. */
a36b6f1d
JL
1516 else if (rtn_reg == 31)
1517 {
1518 /* The return register is r31, so this is a millicode call.
1519 Perform no instruction reordering in this case. */
1520 insn = BLE_XXX_0_0;
1521 r_type = R_HPPA_ABS_CALL_17;
1522 r_pcrel = 0;
1523 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
f5bfdacd
JL
1524 addr, sym_value,
1525 r_addend, r_format,
a36b6f1d
JL
1526 r_field, r_pcrel);
1527 bfd_put_32 (abfd, insn, hit_data);
1528 return bfd_reloc_ok;
1529 }
4861ac76
JL
1530 else
1531 {
1532 /* Check to see if the delay slot instruction has a
1533 relocation. If so, we need to change its address
1534 field because the instruction it relocates is going
1535 to be moved. */
1536 arelent * next_reloc_entry = reloc_entry+1;
1537
1538 if (next_reloc_entry->address == reloc_entry->address + 4)
1539 next_reloc_entry->address -= 4;
1540
1541 insn = old_delay_slot_insn;
1542 bfd_put_32 (abfd, insn, hit_data);
1543 insn = BLE_N_XXX_0_0;
1544 bfd_put_32 (abfd, insn, hit_data + 4);
1545 r_type = R_HPPA_ABS_CALL_17;
1546 r_pcrel = 0;
1547 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
f5bfdacd
JL
1548 addr + 4, sym_value,
1549 r_addend, r_format,
4861ac76
JL
1550 r_field, r_pcrel);
1551 bfd_put_32 (abfd, insn, hit_data + 4);
1552 return bfd_reloc_ok;
7218bb04 1553 }
7218bb04 1554 }
d9ad93bc
KR
1555 break;
1556
f5bfdacd 1557 /* Something we don't know how to handle. */
e8f2240a 1558 default:
4991ebb9 1559 *error_message = (char *) "Unrecognized reloc";
f5bfdacd 1560 return bfd_reloc_notsupported;
e8f2240a
KR
1561 }
1562
4861ac76 1563 /* Update the instruction word. */
e8f2240a 1564 bfd_put_32 (abfd, insn, hit_data);
e8f2240a 1565 return (bfd_reloc_ok);
e8f2240a
KR
1566}
1567
f5bfdacd
JL
1568/* Return the address of the howto table entry to perform the CODE
1569 relocation for an ARCH machine. */
1570
1571static CONST reloc_howto_type *
e8f2240a
KR
1572elf_hppa_reloc_type_lookup (arch, code)
1573 bfd_arch_info_type *arch;
1574 bfd_reloc_code_real_type code;
1575{
e8f2240a
KR
1576 if ((int) code < (int) R_HPPA_UNIMPLEMENTED)
1577 {
1578 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
1579 return &elf_hppa_howto_table[(int) code];
1580 }
f5bfdacd 1581 return NULL;
e8f2240a
KR
1582}
1583
e8f2240a 1584
f5bfdacd
JL
1585/* Update the symbol extention chain to include the symbol pointed to
1586 by SYMBOLP if SYMBOLP is a function symbol. Used internally and by GAS. */
e8f2240a
KR
1587
1588void
f5bfdacd 1589elf_hppa_tc_symbol (abfd, symbolP, sym_idx, symext_root, symext_last)
f4bd7a8f
DM
1590 bfd *abfd;
1591 elf_symbol_type *symbolP;
1592 int sym_idx;
f5bfdacd
JL
1593 symext_chainS **symext_root;
1594 symext_chainS **symext_last;
e8f2240a
KR
1595{
1596 symext_chainS *symextP;
1597 unsigned int arg_reloc;
1598
3a70b01d 1599 /* Only functions can have argument relocations. */
e8f2240a
KR
1600 if (!(symbolP->symbol.flags & BSF_FUNCTION))
1601 return;
1602
e8f2240a
KR
1603 arg_reloc = symbolP->tc_data.hppa_arg_reloc;
1604
3a70b01d
KR
1605 /* If there are no argument relocation bits, then no relocation is
1606 necessary. Do not add this to the symextn section. */
1607 if (arg_reloc == 0)
1608 return;
1609
f5bfdacd 1610 /* Allocate memory and initialize this entry. */
e8f2240a 1611 symextP = (symext_chainS *) bfd_alloc (abfd, sizeof (symext_chainS) * 2);
9783e04a
DM
1612 if (!symextP)
1613 {
f5bfdacd 1614 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1615 abort(); /* FIXME */
1616 }
e8f2240a
KR
1617
1618 symextP[0].entry = ELF32_HPPA_SX_WORD (HPPA_SXT_SYMNDX, sym_idx);
1619 symextP[0].next = &symextP[1];
1620
1621 symextP[1].entry = ELF32_HPPA_SX_WORD (HPPA_SXT_ARG_RELOC, arg_reloc);
1622 symextP[1].next = NULL;
1623
f5bfdacd
JL
1624 /* Now update the chain itself so it can be walked later to build
1625 the symbol extension section. */
1626 if (*symext_root == NULL)
e8f2240a 1627 {
f5bfdacd
JL
1628 *symext_root = &symextP[0];
1629 *symext_last = &symextP[1];
e8f2240a
KR
1630 }
1631 else
1632 {
f5bfdacd
JL
1633 (*symext_last)->next = &symextP[0];
1634 *symext_last = &symextP[1];
e8f2240a
KR
1635 }
1636}
1637
f5bfdacd 1638/* Build the symbol extension section. Used internally and by GAS. */
e8f2240a
KR
1639
1640void
f5bfdacd 1641elf_hppa_tc_make_sections (abfd, symext_root)
f4bd7a8f 1642 bfd *abfd;
f5bfdacd 1643 symext_chainS *symext_root;
e8f2240a
KR
1644{
1645 symext_chainS *symextP;
f5bfdacd 1646 int size, n, i;
e8f2240a
KR
1647 asection *symextn_sec;
1648
f5bfdacd 1649 /* FIXME: Huh? I don't see what this is supposed to do for us. */
e8f2240a
KR
1650 hppa_elf_stub_finish (abfd);
1651
f5bfdacd
JL
1652 /* If there are no entries in the symbol extension chain, then
1653 there is no symbol extension section. */
1654 if (symext_root == NULL)
e8f2240a
KR
1655 return;
1656
f5bfdacd
JL
1657 /* Count the number of entries on the chain. */
1658 for (n = 0, symextP = symext_root; symextP; symextP = symextP->next, ++n)
e8f2240a
KR
1659 ;
1660
f5bfdacd
JL
1661 /* Create the symbol extension section and set some appropriate
1662 attributes. */
e8f2240a
KR
1663 size = sizeof (symext_entryS) * n;
1664 symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1665 if (symextn_sec == (asection *) 0)
1666 {
1667 symextn_sec = bfd_make_section (abfd, SYMEXTN_SECTION_NAME);
1668 bfd_set_section_flags (abfd,
1669 symextn_sec,
f5bfdacd 1670 SEC_LOAD | SEC_HAS_CONTENTS | SEC_DATA);
e8f2240a
KR
1671 symextn_sec->output_section = symextn_sec;
1672 symextn_sec->output_offset = 0;
1673 bfd_set_section_alignment (abfd, symextn_sec, 2);
1674 }
f5bfdacd
JL
1675 bfd_set_section_size (abfd, symextn_sec, symextn_contents_real_size);
1676 symextn_contents_real_size = size;
1677
1678 /* Grab some memory for the contents of the symbol extension section
1679 itself. */
e8f2240a 1680 symextn_contents = (symext_entryS *) bfd_alloc (abfd, size);
9783e04a
DM
1681 if (!symextn_contents)
1682 {
f5bfdacd 1683 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1684 abort(); /* FIXME */
1685 }
e8f2240a 1686
f5bfdacd
JL
1687 /* Fill in the contents of the symbol extension section. */
1688 for (i = 0, symextP = symext_root; symextP; symextP = symextP->next, ++i)
e8f2240a 1689 symextn_contents[i] = symextP->entry;
e8f2240a
KR
1690
1691 return;
1692}
1693
e08b9ad7 1694/* Return the symbol extension record of type TYPE for the symbol SYM. */
e8f2240a 1695
e08b9ad7 1696static symext_entryS
e8f2240a
KR
1697elf32_hppa_get_sym_extn (abfd, sym, type)
1698 bfd *abfd;
1699 asymbol *sym;
1700 int type;
1701{
e8f2240a
KR
1702 switch (type)
1703 {
e8f2240a 1704 case HPPA_SXT_SYMNDX:
e08b9ad7
JL
1705 case HPPA_SXT_NULL:
1706 return (symext_entryS) 0;
e8f2240a
KR
1707 case HPPA_SXT_ARG_RELOC:
1708 {
3a70b01d 1709 elf_symbol_type *esymP = (elf_symbol_type *) sym;
e8f2240a 1710
e08b9ad7 1711 return (symext_entryS) esymP->tc_data.hppa_arg_reloc;
e8f2240a 1712 }
d9ad93bc
KR
1713 /* This should never happen. */
1714 default:
1715 abort();
e8f2240a 1716 }
e8f2240a
KR
1717}
1718
e08b9ad7
JL
1719/* Search the chain of stub descriptions and locate the stub
1720 description for this the given section within the given bfd.
e8f2240a 1721
e08b9ad7
JL
1722 FIXME: I see yet another wonderful linear linked list search
1723 here. This is probably bad. */
e8f2240a 1724
3a70b01d 1725static elf32_hppa_stub_description *
e8f2240a
KR
1726find_stubs (abfd, stub_sec)
1727 bfd *abfd;
1728 asection *stub_sec;
1729{
3a70b01d 1730 elf32_hppa_stub_description *stubP;
e8f2240a
KR
1731
1732 for (stubP = elf_hppa_stub_rootP; stubP; stubP = stubP->next)
1733 {
e08b9ad7
JL
1734 /* Is this the right one? */
1735 if (stubP->this_bfd == abfd && stubP->stub_sec == stub_sec)
3a70b01d 1736 return stubP;
e8f2240a 1737 }
e08b9ad7 1738 return NULL;
e8f2240a
KR
1739}
1740
3a70b01d 1741static elf32_hppa_stub_description *
4991ebb9 1742new_stub (abfd, stub_sec, link_info)
e8f2240a
KR
1743 bfd *abfd;
1744 asection *stub_sec;
4991ebb9 1745 struct bfd_link_info *link_info;
e8f2240a 1746{
3a70b01d 1747 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
e8f2240a 1748
e08b9ad7 1749 /* If we found a list for this bfd, then use it. */
e8f2240a
KR
1750 if (stub)
1751 return stub;
1752
e08b9ad7
JL
1753 /* Nope, allocate and initialize a new entry in the stub list chain. */
1754 stub = (elf32_hppa_stub_description *)
1755 bfd_zalloc (abfd, sizeof (elf32_hppa_stub_description));
3a70b01d
KR
1756 if (stub)
1757 {
1758 stub->this_bfd = abfd;
1759 stub->stub_sec = stub_sec;
1760 stub->real_size = 0;
1761 stub->allocated_size = 0;
1762 stub->stub_contents = NULL;
1763 stub->stub_secp = NULL;
4991ebb9 1764 stub->link_info = link_info;
3a70b01d
KR
1765
1766 stub->next = elf_hppa_stub_rootP;
1767 elf_hppa_stub_rootP = stub;
1768 }
1769 else
1770 {
f5bfdacd 1771 bfd_set_error (bfd_error_no_memory);
9783e04a 1772 abort(); /* FIXME */
3a70b01d 1773 }
e8f2240a
KR
1774
1775 return stub;
1776}
1777
e08b9ad7
JL
1778/* Try and locate a stub with the name NAME within the stubs
1779 associated with ABFD. More linked list searches. */
1780
3a70b01d
KR
1781static elf32_hppa_stub_name_list *
1782find_stub_by_name (abfd, stub_sec, name)
1783 bfd *abfd;
1784 asection *stub_sec;
1785 char *name;
1786{
e08b9ad7 1787 /* Find the stubs associated with this bfd. */
3a70b01d
KR
1788 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
1789
e08b9ad7 1790 /* If found, then we have to walk down them looking for a match. */
3a70b01d
KR
1791 if (stub)
1792 {
1793 elf32_hppa_stub_name_list *name_listP;
1794
e08b9ad7
JL
1795 for (name_listP = stub->stub_listP;
1796 name_listP;
1797 name_listP = name_listP->next)
3a70b01d
KR
1798 {
1799 if (!strcmp (name_listP->sym->name, name))
1800 return name_listP;
1801 }
1802 }
1803
e08b9ad7 1804 /* Not found. */
3a70b01d
KR
1805 return 0;
1806}
1807
e08b9ad7 1808/* Add a new stub (SYM) to the list of stubs associated with the given BFD. */
3a70b01d 1809static elf32_hppa_stub_name_list *
4991ebb9 1810add_stub_by_name(abfd, stub_sec, sym, link_info)
3a70b01d
KR
1811 bfd *abfd;
1812 asection *stub_sec;
1813 asymbol *sym;
4991ebb9 1814 struct bfd_link_info *link_info;
e8f2240a 1815{
3a70b01d
KR
1816 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
1817 elf32_hppa_stub_name_list *stub_entry;
e8f2240a 1818
e08b9ad7
JL
1819 /* If no stubs are associated with this bfd, then we have to make
1820 a chain-of-stubs associated with this bfd. */
3a70b01d 1821 if (!stub)
e08b9ad7 1822 stub = new_stub (abfd, stub_sec, link_info);
e8f2240a 1823
3a70b01d 1824 if (stub)
e8f2240a 1825 {
e08b9ad7 1826 /* Allocate and initialize an entry in the stub chain. */
3a70b01d
KR
1827 stub_entry = (elf32_hppa_stub_name_list *)
1828 bfd_zalloc (abfd, sizeof (elf32_hppa_stub_name_list));
e8f2240a 1829
3a70b01d 1830 if (stub_entry)
e8f2240a 1831 {
3a70b01d
KR
1832 stub_entry->size = 0;
1833 stub_entry->sym = sym;
1834 stub_entry->stub_desc = stub;
1835 /* First byte of this stub is the pointer to
1836 the next available location in the stub buffer. */
1837 stub_entry->stub_secp = stub->stub_secp;
e08b9ad7 1838 /* Add it to the chain. */
3a70b01d
KR
1839 if (stub->stub_listP)
1840 stub_entry->next = stub->stub_listP;
1841 else
1842 stub_entry->next = NULL;
1843 stub->stub_listP = stub_entry;
1844 return stub_entry;
4c85cbfa 1845 }
e8f2240a
KR
1846 else
1847 {
f5bfdacd 1848 bfd_set_error (bfd_error_no_memory);
9783e04a 1849 abort(); /* FIXME */
e8f2240a
KR
1850 }
1851 }
e08b9ad7
JL
1852 /* Death by mis-adventure. */
1853 abort ();
3a70b01d 1854 return (elf32_hppa_stub_name_list *)NULL;
e8f2240a
KR
1855}
1856
e08b9ad7
JL
1857/* For the given caller/callee argument location information and the
1858 type of relocation (arguments or return value), return the type
1859 of argument relocation needed to make caller and callee happy. */
e8f2240a 1860
e08b9ad7 1861static arg_reloc_type
e8f2240a
KR
1862type_of_mismatch (caller_bits, callee_bits, type)
1863 int caller_bits;
1864 int callee_bits;
1865 int type;
1866{
1867 switch (type)
1868 {
1869 case ARGUMENTS:
1870 return mismatches[caller_bits][callee_bits];
1871 case RETURN_VALUE:
1872 return retval_mismatches[caller_bits][callee_bits];
1873 }
e08b9ad7 1874 return ARG_RELOC_ERR;
e8f2240a
KR
1875}
1876
e08b9ad7
JL
1877/* Extract specific argument location bits for WHICH from the
1878 the full argument location information in AR. */
1879#define EXTRACT_ARBITS(ar, which) ((ar) >> (8 - ((which) * 2))) & 3
e8f2240a 1880
e08b9ad7
JL
1881/* Add the new instruction INSN into the stub area denoted by ENTRY.
1882 FIXME: Looks like more cases where we assume sizeof (int) ==
1883 sizeof (insn) which may not be true if building cross tools. */
1884#define NEW_INSTRUCTION(entry, insn) \
4861ac76 1885{ \
3a70b01d 1886 *((entry)->stub_desc->stub_secp)++ = (insn); \
e08b9ad7 1887 (entry)->stub_desc->real_size += sizeof (int); \
3a70b01d
KR
1888 (entry)->size += sizeof(int); \
1889 bfd_set_section_size((entry)->stub_desc->this_bfd, \
1890 (entry)->stub_desc->stub_sec, \
4861ac76
JL
1891 (entry)->stub_desc->real_size); \
1892}
e8f2240a 1893
e08b9ad7
JL
1894/* Find the offset of the current stub? Looks more like it
1895 finds the offset of the last instruction to me. */
3a70b01d 1896#define CURRENT_STUB_OFFSET(entry) \
9783e04a
DM
1897 ((char *)(entry)->stub_desc->stub_secp \
1898 - (char *)(entry)->stub_desc->stub_contents - 4)
d9ad93bc 1899
e08b9ad7
JL
1900/* All the stubs have already been built, finish up stub stuff
1901 by applying relocations to the stubs. */
d9ad93bc 1902
e08b9ad7 1903static void
e8f2240a
KR
1904hppa_elf_stub_finish (output_bfd)
1905 bfd *output_bfd;
1906{
3a70b01d 1907 elf32_hppa_stub_description *stub_list = elf_hppa_stub_rootP;
e8f2240a 1908
e08b9ad7 1909 /* If the stubs have been finished, then we're already done. */
f5bfdacd 1910 if (stubs_finished)
d9ad93bc
KR
1911 return;
1912
e08b9ad7 1913 /* Walk down the list of stub lists. */
e8f2240a
KR
1914 for (; stub_list; stub_list = stub_list->next)
1915 {
e08b9ad7 1916 /* If this list has stubs, then do something. */
3a70b01d 1917 if (stub_list->real_size)
e8f2240a 1918 {
3a70b01d 1919 bfd *stub_bfd = stub_list->this_bfd;
e08b9ad7
JL
1920 asection *stub_sec = bfd_get_section_by_name (stub_bfd,
1921 ".hppa_linker_stubs");
e8f2240a
KR
1922 bfd_size_type reloc_size;
1923 arelent **reloc_vector;
1924
e08b9ad7 1925 /* Some sanity checking. */
3a70b01d 1926 BFD_ASSERT (stub_sec == stub_list->stub_sec);
e8f2240a
KR
1927 BFD_ASSERT (stub_sec);
1928
e08b9ad7
JL
1929 /* For stub sections raw_size == cooked_size. Also update
1930 reloc_done as we're handling the relocs now. */
e8f2240a
KR
1931 stub_sec->_cooked_size = stub_sec->_raw_size;
1932 stub_sec->reloc_done = true;
1933
e08b9ad7
JL
1934 /* Make space to hold the relocations for the stub section. */
1935 reloc_size = bfd_get_reloc_upper_bound (stub_bfd, stub_sec);
80425e6c
JK
1936 reloc_vector = (arelent **) malloc (reloc_size);
1937 if (reloc_vector == NULL)
1938 {
1939 /* FIXME: should be returning an error so the caller can
1940 clean up */
1941 abort ();
1942 }
e8f2240a 1943
e08b9ad7
JL
1944 /* If we have relocations, do them. */
1945 if (bfd_canonicalize_reloc (stub_bfd, stub_sec, reloc_vector,
e8f2240a
KR
1946 output_bfd->outsymbols))
1947 {
1948 arelent **parent;
e08b9ad7 1949 for (parent = reloc_vector; *parent != NULL; parent++)
e8f2240a 1950 {
e08b9ad7 1951 char *err = NULL;
e8f2240a 1952 bfd_reloc_status_type r =
e08b9ad7 1953 bfd_perform_relocation (stub_bfd, *parent,
4991ebb9
ILT
1954 stub_list->stub_contents,
1955 stub_sec, (bfd *) NULL, &err);
e8f2240a 1956
e08b9ad7 1957 /* If there was an error, tell someone about it. */
e8f2240a
KR
1958 if (r != bfd_reloc_ok)
1959 {
4991ebb9
ILT
1960 struct bfd_link_info *link_info = stub_list->link_info;
1961
e8f2240a
KR
1962 switch (r)
1963 {
1964 case bfd_reloc_undefined:
4991ebb9
ILT
1965 if (! ((*link_info->callbacks->undefined_symbol)
1966 (link_info,
1967 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
1968 stub_bfd, stub_sec, (*parent)->address)))
1969 abort ();
e8f2240a
KR
1970 break;
1971 case bfd_reloc_dangerous:
4991ebb9
ILT
1972 if (! ((*link_info->callbacks->reloc_dangerous)
1973 (link_info, err, stub_bfd, stub_sec,
1974 (*parent)->address)))
1975 abort ();
e8f2240a 1976 break;
e8f2240a 1977 case bfd_reloc_overflow:
4991ebb9
ILT
1978 {
1979 if (! ((*link_info->callbacks->reloc_overflow)
1980 (link_info,
1981 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
1982 (*parent)->howto->name,
1983 (*parent)->addend,
1984 stub_bfd, stub_sec,
1985 (*parent)->address)))
1986 abort ();
1987 }
e8f2240a 1988 break;
4991ebb9 1989 case bfd_reloc_outofrange:
e8f2240a
KR
1990 default:
1991 abort ();
1992 break;
1993 }
1994 }
1995 }
1996 }
80425e6c 1997 free (reloc_vector);
e8f2240a 1998
e08b9ad7
JL
1999 /* All done with the relocations. Set the final contents
2000 of the stub section. FIXME: no check of return value! */
2001 bfd_set_section_contents (output_bfd, stub_sec,
3a70b01d 2002 stub_list->stub_contents,
e08b9ad7 2003 0, stub_list->real_size);
e8f2240a
KR
2004 }
2005 }
e08b9ad7 2006 /* All done. */
d9ad93bc 2007 stubs_finished = true;
e8f2240a
KR
2008}
2009
e08b9ad7 2010/* Allocate a new relocation entry to be used in a linker stub. */
d9ad93bc 2011
e08b9ad7
JL
2012static void
2013hppa_elf_stub_reloc (stub_desc, output_bfd, target_sym, offset, type)
f4bd7a8f
DM
2014 elf32_hppa_stub_description *stub_desc;
2015 bfd *output_bfd;
6e58a4e5 2016 asymbol **target_sym;
f4bd7a8f
DM
2017 int offset;
2018 elf32_hppa_reloc_type type;
d9ad93bc 2019{
d9ad93bc
KR
2020 arelent relent;
2021 int size;
2022 Elf_Internal_Shdr *rela_hdr;
2023
e08b9ad7 2024 /* I really don't like the realloc nonsense in here. FIXME. */
d9ad93bc
KR
2025 if (stub_desc->relocs_allocated_cnt == stub_desc->stub_sec->reloc_count)
2026 {
e08b9ad7 2027 /* Allocate the first few relocation entries. */
d9ad93bc
KR
2028 if (stub_desc->stub_sec->relocation == NULL)
2029 {
2030 stub_desc->relocs_allocated_cnt = STUB_RELOC_INCR;
2031 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
f4bd7a8f 2032 stub_desc->stub_sec->relocation = (arelent *) bfd_zmalloc (size);
d9ad93bc
KR
2033 }
2034 else
2035 {
e08b9ad7
JL
2036 /* We've used all the entries we've already allocated. So get
2037 some more. */
d9ad93bc
KR
2038 stub_desc->relocs_allocated_cnt += STUB_RELOC_INCR;
2039 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
e08b9ad7
JL
2040 stub_desc->stub_sec->relocation = (arelent *)
2041 realloc (stub_desc->stub_sec->relocation, size);
d9ad93bc 2042 }
9783e04a
DM
2043 if (!stub_desc->stub_sec->relocation)
2044 {
f5bfdacd 2045 bfd_set_error (bfd_error_no_memory);
e08b9ad7 2046 abort (); /* FIXME */
9783e04a 2047 }
d9ad93bc
KR
2048 }
2049
2050 rela_hdr = &elf_section_data(stub_desc->stub_sec)->rel_hdr;
2051 rela_hdr->sh_size += sizeof(Elf32_External_Rela);
2052
2053 /* Fill in the details. */
2054 relent.address = offset;
2055 relent.addend = 0;
6e58a4e5 2056 relent.sym_ptr_ptr = target_sym;
d9ad93bc 2057 relent.howto = bfd_reloc_type_lookup (stub_desc->this_bfd, type);
e8f2240a 2058
e08b9ad7 2059 /* Save it in the array of relocations for the stub section. */
e8f2240a 2060 memcpy (&stub_desc->stub_sec->relocation[stub_desc->stub_sec->reloc_count++],
e08b9ad7 2061 &relent, sizeof (arelent));
e8f2240a
KR
2062}
2063
e08b9ad7
JL
2064/* Build an argument relocation stub. RTN_ADJUST is a hint that an
2065 adjust to the return pointer from within the stub itself may be
2066 needed. */
2067
2068static asymbol *
2069hppa_elf_build_linker_stub (abfd, output_bfd, link_info, reloc_entry,
2070 stub_types, rtn_adjust, data, linker_stub_type)
e8f2240a
KR
2071 bfd *abfd;
2072 bfd *output_bfd;
4991ebb9 2073 struct bfd_link_info *link_info;
e8f2240a 2074 arelent *reloc_entry;
e08b9ad7 2075 arg_reloc_type stub_types[5];
4861ac76
JL
2076 int rtn_adjust;
2077 unsigned *data;
e08b9ad7 2078 hppa_stub_type linker_stub_type;
e8f2240a 2079{
e8f2240a 2080 int i;
e08b9ad7 2081 boolean milli, dyncall;
e8f2240a 2082 char stub_sym_name[128];
3a70b01d 2083 elf32_hppa_stub_name_list *stub_entry;
e08b9ad7 2084 /* Some initialization. */
4861ac76 2085 unsigned insn = data[0];
e08b9ad7 2086 asymbol *stub_sym = NULL;
f3b477be 2087 asymbol **orig_sym = reloc_entry->sym_ptr_ptr;
e08b9ad7
JL
2088 asection *stub_sec = bfd_get_section_by_name (abfd, ".hppa_linker_stubs");
2089 elf32_hppa_stub_description *stub_desc = find_stubs (abfd, stub_sec);
4861ac76
JL
2090
2091 /* Perform some additional checks on whether we should really do the
2092 return adjustment. For example, if the instruction is nullified
2093 or if the delay slot contains an instruction that modifies the return
2094 pointer, then the branch instructions should not be rearranged
2095 (rtn_adjust is false). */
2096 if (insn & 2 || insn == 0)
2097 rtn_adjust = false;
2098 else
2099 {
2100 unsigned delay_insn = data[1];
e8f2240a 2101
4861ac76
JL
2102 if (get_opcode (delay_insn) == LDO
2103 && (((insn & 0x03e00000) >> 21) == ((delay_insn & 0x001f0000) >> 16)))
2104 rtn_adjust = false;
2105 }
2106
e08b9ad7
JL
2107 /* Some special code for long-call stubs. */
2108 if (linker_stub_type == HPPA_STUB_LONG_CALL)
2109 {
2110
2111 /* Is this a millicode call? If so, the return address
2112 comes in on r31 rather than r2 (rp) so a slightly
2113 different code sequence is needed. */
2114 unsigned rtn_reg = (insn & 0x03e00000) >> 21;
2115 if (rtn_reg == 31)
2116 milli = true;
2117
2118 /* Dyncall is special because the user code has already
2119 put the return pointer in %r2 (aka RP). Other millicode
2120 calls have the return pointer in %r31. */
f3b477be 2121 if (strcmp ((*orig_sym)->name, "$$dyncall") == 0)
e08b9ad7
JL
2122 dyncall = true;
2123
2124 /* If we are creating a call from a stub to another stub, then
2125 never do the instruction reordering. We can tell if we are
2126 going to be calling one stub from another by the fact that
2127 the symbol name has '_stub_' (arg. reloc. stub) or '_lb_stub_'
2128 prepended to the name. Alternatively, the section of the
2129 symbol will be '.hppa_linker_stubs'. This is only an issue
2130 for long-calls; they are the only stubs allowed to call another
2131 stub. */
f3b477be
JL
2132 if ((strncmp ((*orig_sym)->name, "_stub_", 6) == 0)
2133 || (strncmp ((*orig_sym)->name, "_lb_stub_", 9) == 0))
e08b9ad7 2134 {
f3b477be 2135 BFD_ASSERT (strcmp ((*orig_sym)->section->name, ".hppa_linker_stubs")
e08b9ad7
JL
2136 == 0);
2137 rtn_adjust = false;
2138 }
2139 }
2140
2141 /* Create the stub section if necessary. */
e8f2240a
KR
2142 if (!stub_sec)
2143 {
2144 BFD_ASSERT (stub_desc == NULL);
e08b9ad7 2145 hppa_elf_create_stub_sec (abfd, output_bfd, &stub_sec, link_info);
4991ebb9 2146 stub_desc = new_stub (abfd, stub_sec, link_info);
e8f2240a
KR
2147 }
2148
4861ac76 2149 /* Make the stub if we did not find one already. */
e8f2240a 2150 if (!stub_desc)
4991ebb9 2151 stub_desc = new_stub (abfd, stub_sec, link_info);
e8f2240a 2152
4861ac76 2153 /* Allocate space to write the stub.
e08b9ad7 2154 FIXME: Why using realloc?!? */
e8f2240a
KR
2155 if (!stub_desc->stub_contents)
2156 {
2157 stub_desc->allocated_size = STUB_BUFFER_INCR;
9783e04a 2158 stub_desc->stub_contents = (char *) malloc (STUB_BUFFER_INCR);
e8f2240a
KR
2159 }
2160 else if ((stub_desc->allocated_size - stub_desc->real_size) < STUB_MAX_SIZE)
2161 {
2162 stub_desc->allocated_size = stub_desc->allocated_size + STUB_BUFFER_INCR;
a5ccdad1
ILT
2163 stub_desc->stub_contents = (char *) realloc (stub_desc->stub_contents,
2164 stub_desc->allocated_size);
e8f2240a
KR
2165 }
2166
e08b9ad7
JL
2167 /* If no memory die. (I seriously doubt the other routines
2168 are prepared to get a NULL return value). */
2169 if (!stub_desc->stub_contents)
2170 {
2171 bfd_set_error (bfd_error_no_memory);
2172 abort ();
2173 }
2174
2175 /* Generate an appropriate name for this stub. */
2176 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
2177 sprintf (stub_sym_name,
2178 "_stub_%s_%02d_%02d_%02d_%02d_%02d_%s",
2179 reloc_entry->sym_ptr_ptr[0]->name,
2180 stub_types[0], stub_types[1], stub_types[2],
2181 stub_types[3], stub_types[4],
2182 rtn_adjust ? "RA" : "");
2183 else
2184 sprintf (stub_sym_name,
2185 "_lb_stub_%s_%s", reloc_entry->sym_ptr_ptr[0]->name,
2186 rtn_adjust ? "RA" : "");
2187
2188
4861ac76
JL
2189 stub_desc->stub_secp
2190 = (int *) (stub_desc->stub_contents + stub_desc->real_size);
4861ac76 2191 stub_entry = find_stub_by_name (abfd, stub_sec, stub_sym_name);
e8f2240a 2192
e08b9ad7 2193 /* See if we already have one by this name. */
3a70b01d
KR
2194 if (stub_entry)
2195 {
e08b9ad7
JL
2196 /* Yes, re-use it. Redirect the original relocation from the
2197 old symbol (a function symbol) to the stub (the stub will call
2198 the original function). */
3a70b01d 2199 stub_sym = stub_entry->sym;
44fd6622
JL
2200 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (abfd,
2201 sizeof (asymbol **));
6e58a4e5
JL
2202 if (reloc_entry->sym_ptr_ptr == NULL)
2203 {
2204 bfd_set_error (bfd_error_no_memory);
2205 abort ();
2206 }
2207 reloc_entry->sym_ptr_ptr[0] = stub_sym;
e08b9ad7
JL
2208 if (linker_stub_type == HPPA_STUB_LONG_CALL
2209 || (reloc_entry->howto->type != R_HPPA_PLABEL_32
2210 && (get_opcode(insn) == BLE
2211 || get_opcode (insn) == BE
2212 || get_opcode (insn) == BL)))
4861ac76 2213 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
3a70b01d
KR
2214 }
2215 else
2216 {
4861ac76 2217 /* Create a new symbol to point to this stub. */
3a70b01d 2218 stub_sym = bfd_make_empty_symbol (abfd);
9783e04a
DM
2219 if (!stub_sym)
2220 {
f5bfdacd 2221 bfd_set_error (bfd_error_no_memory);
e08b9ad7 2222 abort ();
9783e04a 2223 }
3a70b01d 2224 stub_sym->name = bfd_zalloc (abfd, strlen (stub_sym_name) + 1);
9783e04a
DM
2225 if (!stub_sym->name)
2226 {
f5bfdacd 2227 bfd_set_error (bfd_error_no_memory);
e08b9ad7 2228 abort ();
9783e04a 2229 }
3a70b01d 2230 strcpy ((char *) stub_sym->name, stub_sym_name);
4861ac76 2231 stub_sym->value
9783e04a 2232 = (char *) stub_desc->stub_secp - (char *) stub_desc->stub_contents;
3a70b01d
KR
2233 stub_sym->section = stub_sec;
2234 stub_sym->flags = BSF_LOCAL | BSF_FUNCTION;
4991ebb9 2235 stub_entry = add_stub_by_name (abfd, stub_sec, stub_sym, link_info);
3a70b01d 2236
4861ac76 2237 /* Redirect the original relocation from the old symbol (a function)
e08b9ad7 2238 to the stub (the stub calls the function). */
44fd6622
JL
2239 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (abfd,
2240 sizeof (asymbol **));
6e58a4e5
JL
2241 if (reloc_entry->sym_ptr_ptr == NULL)
2242 {
2243 bfd_set_error (bfd_error_no_memory);
2244 abort ();
2245 }
2246 reloc_entry->sym_ptr_ptr[0] = stub_sym;
e08b9ad7
JL
2247 if (linker_stub_type == HPPA_STUB_LONG_CALL
2248 || (reloc_entry->howto->type != R_HPPA_PLABEL_32
2249 && (get_opcode (insn) == BLE
2250 || get_opcode (insn) == BE
2251 || get_opcode (insn) == BL)))
4861ac76 2252 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
3a70b01d 2253
e08b9ad7
JL
2254 /* Now generate the code for the stub. Starting with two
2255 common instructions.
3a70b01d 2256
e08b9ad7
JL
2257 FIXME: Do we still need the SP adjustment?
2258 Do we still need to muck with space registers? */
2259 NEW_INSTRUCTION (stub_entry, LDSID_31_1)
2260 NEW_INSTRUCTION (stub_entry, MTSP_1_SR0)
3a70b01d 2261
e08b9ad7 2262 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
3a70b01d 2263 {
e08b9ad7 2264 NEW_INSTRUCTION (stub_entry, ADDI_8_SP)
e8f2240a 2265
e08b9ad7
JL
2266 /* Examine each argument, generating code to relocate it
2267 into a different register if necessary. */
2268 for (i = ARG0; i < ARG3; i++)
2269 {
2270 switch (stub_types[i])
2271 {
4861ac76 2272
e08b9ad7
JL
2273 case NO_ARG_RELOC:
2274 continue;
2275
2276 case R_TO_FR:
2277 switch (i)
2278 {
2279 case ARG0:
2280 NEW_INSTRUCTION (stub_entry, STWS_ARG0_M8SP)
2281 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG0)
2282 break;
2283 case ARG1:
2284 NEW_INSTRUCTION (stub_entry, STWS_ARG1_M8SP)
2285 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG1)
2286 break;
2287 case ARG2:
2288 NEW_INSTRUCTION (stub_entry, STWS_ARG2_M8SP)
2289 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG2)
2290 break;
2291 case ARG3:
2292 NEW_INSTRUCTION (stub_entry, STWS_ARG3_M8SP)
2293 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG3)
2294 break;
2295 }
2296 continue;
2297
2298 case R01_TO_FR:
2299 switch (i)
2300 {
2301 case ARG0:
2302 NEW_INSTRUCTION (stub_entry, STWS_ARG0_M4SP)
2303 NEW_INSTRUCTION (stub_entry, STWS_ARG1_M8SP)
2304 NEW_INSTRUCTION (stub_entry, FLDDS_M8SP_FARG1)
2305 break;
2306 default:
2307 abort ();
2308 break;
2309 }
2310 continue;
2311
2312 case R23_TO_FR:
2313 switch (i)
2314 {
2315 case ARG2:
2316 NEW_INSTRUCTION (stub_entry, STWS_ARG2_M4SP)
2317 NEW_INSTRUCTION (stub_entry, STWS_ARG3_M8SP)
2318 NEW_INSTRUCTION (stub_entry, FLDDS_M8SP_FARG3)
2319 break;
2320 default:
2321 abort ();
2322 break;
2323 }
2324 continue;
2325
2326 case FR_TO_R:
2327 switch (i)
2328 {
2329 case ARG0:
2330 NEW_INSTRUCTION (stub_entry, FSTWS_FARG0_M8SP)
2331 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG0)
2332 break;
2333 case ARG1:
2334 NEW_INSTRUCTION (stub_entry, FSTWS_FARG1_M8SP)
2335 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG1)
2336 break;
2337 case ARG2:
2338 NEW_INSTRUCTION (stub_entry, FSTWS_FARG2_M8SP)
2339 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG2)
2340 break;
2341 case ARG3:
2342 NEW_INSTRUCTION (stub_entry, FSTWS_FARG3_M8SP)
2343 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG3)
2344 break;
2345 }
2346 continue;
2347
2348 case FR_TO_R01:
2349 switch (i)
2350 {
2351 case ARG0:
2352 NEW_INSTRUCTION (stub_entry, FSTDS_FARG1_M8SP)
2353 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG0)
2354 NEW_INSTRUCTION (stub_entry, LDWS_M8SP_ARG1)
2355 break;
2356 default:
2357 abort ();
2358 break;
2359 }
2360 continue;
2361
2362 case FR_TO_R23:
2363 switch (i)
2364 {
2365 case ARG2:
2366 NEW_INSTRUCTION (stub_entry, FSTDS_FARG3_M8SP)
2367 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG2)
2368 NEW_INSTRUCTION (stub_entry, LDWS_M8SP_ARG3)
2369 break;
2370 default:
2371 abort ();
2372 break;
2373 }
2374 continue;
2375
2376 default:
2377 abort ();
2378 break;
2379 }
2380 }
2381
2382 /* Put the stack pointer back. FIXME: Is this still necessary? */
2383 NEW_INSTRUCTION (stub_entry, ADDI_M8_SP_SP)
2384 }
2385
2386 /* Common code again. Return pointer adjustment and the like. */
2387 if (!dyncall)
4861ac76 2388 {
e08b9ad7
JL
2389 /* This isn't dyncall. */
2390 if (!milli)
2391 {
2392 /* It's not a millicode call, so get the correct return
2393 value into %r2 (aka RP). */
2394 if (rtn_adjust)
2395 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_RP)
2396 else
2397 NEW_INSTRUCTION (stub_entry, COPY_31_2)
2398 }
2399 else
2400 {
2401 /* It is a millicode call, so get the correct return
2402 value into %r1?!?. FIXME: Shouldn't this be
2403 %r31? Yes, and a little re-arrangement of the
2404 code below would make that possible. */
2405 if (rtn_adjust)
2406 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_1)
2407 else
2408 NEW_INSTRUCTION (stub_entry, COPY_31_1)
2409 }
4861ac76 2410 }
4991ebb9 2411 else
e08b9ad7
JL
2412 {
2413 /* This is dyncall, so the code is a little different as the
2414 return pointer is already in %r2 (aka RP). */
2415 if (rtn_adjust)
2416 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_RP)
2417 }
e8f2240a 2418
4861ac76 2419 /* Save the return address. */
e08b9ad7
JL
2420 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
2421 NEW_INSTRUCTION (stub_entry, STW_RP_M8SP)
e8f2240a 2422
4861ac76 2423 /* Long branch to the target function. */
e08b9ad7 2424 NEW_INSTRUCTION (stub_entry, LDIL_XXX_31)
3a70b01d 2425 hppa_elf_stub_reloc (stub_entry->stub_desc,
f3b477be 2426 abfd, orig_sym,
4861ac76 2427 CURRENT_STUB_OFFSET (stub_entry),
3a70b01d 2428 R_HPPA_L21);
e08b9ad7 2429 NEW_INSTRUCTION (stub_entry, BLE_XXX_0_31)
3a70b01d 2430 hppa_elf_stub_reloc (stub_entry->stub_desc,
f3b477be 2431 abfd, orig_sym,
4861ac76 2432 CURRENT_STUB_OFFSET (stub_entry),
3a70b01d 2433 R_HPPA_ABS_CALL_R17);
4861ac76 2434
e08b9ad7
JL
2435 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
2436 {
2437 /* In delay slot of long-call, copy %r31 into %r2 so that
2438 the callee can return in the normal fashion. */
2439 NEW_INSTRUCTION (stub_entry, COPY_31_2)
2440
2441 /* Restore the return address. */
2442 NEW_INSTRUCTION (stub_entry, LDW_M8SP_RP)
3a70b01d 2443
e08b9ad7
JL
2444 /* Generate the code to move the return value around. */
2445 switch (stub_types[RETVAL])
2446 {
2447 case NO_ARG_RELOC:
2448 break;
2449
2450 case R_TO_FR:
2451 NEW_INSTRUCTION (stub_entry, STWS_RET0_M8SP)
2452 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FRET0)
2453 break;
2454
2455 case FR_TO_R:
2456 NEW_INSTRUCTION (stub_entry, FSTWS_FRET0_M8SP)
2457 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_RET0)
2458 break;
2459
2460 default:
2461 abort ();
2462 break;
2463 }
2464
2465 /* Return back to the main code stream. */
2466 NEW_INSTRUCTION (stub_entry, BV_N_0_RP)
2467 }
2468 else
e8f2240a 2469 {
e08b9ad7 2470 if (!dyncall)
e8f2240a 2471 {
e08b9ad7
JL
2472 /* Get return address into %r31. Both variants may be necessary
2473 (I think) as we could be cascading into another stub. */
2474 if (!milli)
2475 NEW_INSTRUCTION (stub_entry, COPY_2_31)
2476 else
2477 NEW_INSTRUCTION (stub_entry, COPY_1_31)
2478 }
2479 else
2480 {
2481 /* Get the return address into %r31 too. Might be necessary
2482 (I think) as we could be cascading into another stub. */
2483 NEW_INSTRUCTION (stub_entry, COPY_2_31)
e8f2240a 2484 }
e08b9ad7
JL
2485
2486 /* No need for a return to the main stream. */
e8f2240a
KR
2487 }
2488 }
e8f2240a
KR
2489 return stub_sym;
2490}
2491
e08b9ad7
JL
2492/* Return nonzero if an argument relocation will be needed to call
2493 the function (symbol in RELOC_ENTRY) assuming the caller has
2494 argument relocation bugs CALLER_AR. */
2495
2496static int
3a70b01d 2497hppa_elf_arg_reloc_needed_p (abfd, reloc_entry, stub_types, caller_ar)
e8f2240a
KR
2498 bfd *abfd;
2499 arelent *reloc_entry;
e08b9ad7 2500 arg_reloc_type stub_types[5];
3a70b01d 2501 symext_entryS caller_ar;
e8f2240a 2502{
e08b9ad7
JL
2503 /* If the symbol is still undefined, then it's impossible to know
2504 if an argument relocation is needed. */
2505 if (reloc_entry->sym_ptr_ptr[0]
2506 && reloc_entry->sym_ptr_ptr[0]->section != &bfd_und_section)
e8f2240a 2507 {
e8f2240a
KR
2508 symext_entryS callee_ar = elf32_hppa_get_sym_extn (abfd,
2509 reloc_entry->sym_ptr_ptr[0],
2510 HPPA_SXT_ARG_RELOC);
2511
e08b9ad7
JL
2512 /* Now examine all the argument and return value location
2513 information to determine if a relocation stub will be needed. */
e8f2240a
KR
2514 if (caller_ar && callee_ar)
2515 {
e08b9ad7
JL
2516 arg_location caller_loc[5];
2517 arg_location callee_loc[5];
e8f2240a 2518
e08b9ad7
JL
2519 /* Extract the location information for the return value
2520 and argument registers separately. */
e8f2240a
KR
2521 callee_loc[RETVAL] = EXTRACT_ARBITS (callee_ar, RETVAL);
2522 caller_loc[RETVAL] = EXTRACT_ARBITS (caller_ar, RETVAL);
2523 callee_loc[ARG0] = EXTRACT_ARBITS (callee_ar, ARG0);
2524 caller_loc[ARG0] = EXTRACT_ARBITS (caller_ar, ARG0);
2525 callee_loc[ARG1] = EXTRACT_ARBITS (callee_ar, ARG1);
2526 caller_loc[ARG1] = EXTRACT_ARBITS (caller_ar, ARG1);
2527 callee_loc[ARG2] = EXTRACT_ARBITS (callee_ar, ARG2);
2528 caller_loc[ARG2] = EXTRACT_ARBITS (caller_ar, ARG2);
2529 callee_loc[ARG3] = EXTRACT_ARBITS (callee_ar, ARG3);
2530 caller_loc[ARG3] = EXTRACT_ARBITS (caller_ar, ARG3);
2531
e08b9ad7
JL
2532 /* Check some special combinations. For example, if FU
2533 appears in ARG1 or ARG3, we can move it to ARG0 or ARG2,
2534 respectively. (I guess this braindamage is correct? It'd
2535 take an hour or two of reading PA calling conventions to
2536 really know). */
e8f2240a
KR
2537
2538 if (caller_loc[ARG0] == AR_FU || caller_loc[ARG1] == AR_FU)
2539 {
d9ad93bc 2540 caller_loc[ARG0] = AR_DBL01;
e8f2240a
KR
2541 caller_loc[ARG1] = AR_NO;
2542 }
2543 if (caller_loc[ARG2] == AR_FU || caller_loc[ARG3] == AR_FU)
2544 {
d9ad93bc 2545 caller_loc[ARG2] = AR_DBL23;
e8f2240a
KR
2546 caller_loc[ARG3] = AR_NO;
2547 }
2548 if (callee_loc[ARG0] == AR_FU || callee_loc[ARG1] == AR_FU)
2549 {
d9ad93bc 2550 callee_loc[ARG0] = AR_DBL01;
e8f2240a
KR
2551 callee_loc[ARG1] = AR_NO;
2552 }
2553 if (callee_loc[ARG2] == AR_FU || callee_loc[ARG3] == AR_FU)
2554 {
d9ad93bc 2555 callee_loc[ARG2] = AR_DBL23;
e8f2240a
KR
2556 callee_loc[ARG3] = AR_NO;
2557 }
2558
e08b9ad7
JL
2559 /* Now look up potential mismatches. */
2560 stub_types[ARG0] = type_of_mismatch (caller_loc[ARG0],
2561 callee_loc[ARG0],
2562 ARGUMENTS);
2563 stub_types[ARG1] = type_of_mismatch (caller_loc[ARG1],
2564 callee_loc[ARG1],
2565 ARGUMENTS);
2566 stub_types[ARG2] = type_of_mismatch (caller_loc[ARG2],
2567 callee_loc[ARG2],
2568 ARGUMENTS);
2569 stub_types[ARG3] = type_of_mismatch (caller_loc[ARG3],
2570 callee_loc[ARG3],
2571 ARGUMENTS);
2572 stub_types[RETVAL] = type_of_mismatch (caller_loc[RETVAL],
2573 callee_loc[RETVAL],
2574 RETURN_VALUE);
2575
2576 /* If any of the arguments or return value need an argument
2577 relocation, then we will need an argument relocation stub. */
2578 if (stub_types[ARG0] != NO_ARG_RELOC
2579 || stub_types[ARG1] != NO_ARG_RELOC
2580 || stub_types[ARG2] != NO_ARG_RELOC
2581 || stub_types[ARG3] != NO_ARG_RELOC
2582 || stub_types[RETVAL] != NO_ARG_RELOC)
2583 return 1;
e8f2240a
KR
2584 }
2585 }
2586 return 0;
2587}
2588
e08b9ad7
JL
2589/* Create the linker stub section. */
2590
2591static void
2592hppa_elf_create_stub_sec (abfd, output_bfd, secptr, link_info)
d9ad93bc
KR
2593 bfd *abfd;
2594 bfd *output_bfd;
e08b9ad7 2595 asection **secptr;
4991ebb9 2596 struct bfd_link_info *link_info;
d9ad93bc 2597{
e08b9ad7
JL
2598 asection *output_text_section;
2599
2600 output_text_section = bfd_get_section_by_name (output_bfd, ".text");
2601 *secptr = bfd_make_section (abfd, ".hppa_linker_stubs");
2602 bfd_set_section_flags (abfd, *secptr,
2603 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
2604 | SEC_RELOC | SEC_CODE | SEC_READONLY);
2605 (*secptr)->output_section = output_text_section->output_section;
2606 (*secptr)->output_offset = 0;
2607
2608 /* Set up the ELF section header for this new section. This
2609 is basically the same processing as elf_make_sections().
2610 elf_make_sections is static and therefore not accessable
2611 here. */
2612 {
2613 Elf_Internal_Shdr *this_hdr;
2614 this_hdr = &elf_section_data ((*secptr))->this_hdr;
2615
2616 /* Set the sizes of this section. The contents have already
2617 been set up ?!? */
2618 this_hdr->sh_addr = (*secptr)->vma;
2619 this_hdr->sh_size = (*secptr)->_raw_size;
2620
2621 /* Set appropriate flags for sections with relocations. */
2622 if ((*secptr)->flags & SEC_RELOC)
d9ad93bc 2623 {
e08b9ad7
JL
2624 Elf_Internal_Shdr *rela_hdr;
2625 int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
4861ac76 2626
e08b9ad7 2627 rela_hdr = &elf_section_data ((*secptr))->rel_hdr;
4861ac76 2628
e08b9ad7 2629 if (use_rela_p)
d9ad93bc 2630 {
e08b9ad7
JL
2631 rela_hdr->sh_type = SHT_RELA;
2632 rela_hdr->sh_entsize = sizeof (Elf32_External_Rela);
d9ad93bc 2633 }
e08b9ad7 2634 else
d9ad93bc 2635 {
e08b9ad7
JL
2636 rela_hdr->sh_type = SHT_REL;
2637 rela_hdr->sh_entsize = sizeof (Elf32_External_Rel);
d9ad93bc 2638 }
e08b9ad7
JL
2639 rela_hdr->sh_flags = 0;
2640 rela_hdr->sh_addr = 0;
2641 rela_hdr->sh_offset = 0;
2642 rela_hdr->sh_addralign = 0;
2643 rela_hdr->size = 0;
d9ad93bc 2644 }
4861ac76 2645
e08b9ad7
JL
2646 if ((*secptr)->flags & SEC_ALLOC)
2647 this_hdr->sh_flags |= SHF_ALLOC;
2648
2649 if (!((*secptr)->flags & SEC_READONLY))
2650 this_hdr->sh_flags |= SHF_WRITE;
2651
2652 if ((*secptr)->flags & SEC_CODE)
2653 this_hdr->sh_flags |= SHF_EXECINSTR;
4861ac76
JL
2654 }
2655
e08b9ad7 2656 bfd_set_section_alignment (abfd, *secptr, 2);
d9ad93bc
KR
2657}
2658
e08b9ad7
JL
2659/* Return nonzero if a long-call stub will be needed to call the
2660 function (symbol in RELOC_ENTRY). */
2661
2662static int
d9ad93bc
KR
2663hppa_elf_long_branch_needed_p (abfd, asec, reloc_entry, symbol, insn)
2664 bfd *abfd;
2665 asection *asec;
2666 arelent *reloc_entry;
2667 asymbol *symbol;
2668 unsigned insn;
2669{
e08b9ad7 2670 long sym_value = get_symbol_value (symbol);
d9ad93bc 2671 int fmt = reloc_entry->howto->bitsize;
e08b9ad7 2672 unsigned char op = get_opcode (insn);
d9ad93bc
KR
2673 unsigned raddr;
2674
e08b9ad7
JL
2675#define too_far(val,num_bits) \
2676 ((int)(val) > (1 << (num_bits)) - 1) || ((int)(val) < (-1 << (num_bits)))
d9ad93bc 2677
d9ad93bc
KR
2678 switch (op)
2679 {
2680 case BL:
2681 raddr =
2682 reloc_entry->address + asec->output_offset + asec->output_section->vma;
e08b9ad7
JL
2683 /* If the symbol and raddr (relocated addr?) are too far away from
2684 each other, then a long-call stub will be needed. */
2685 if (too_far (sym_value - raddr, fmt + 1))
d9ad93bc 2686 return 1;
d9ad93bc
KR
2687 break;
2688 }
2689 return 0;
2690}
2691
e08b9ad7
JL
2692/* Search the given section and determine if linker stubs will be
2693 needed for any calls within that section.
2694
2695 Return any new stub symbols created.
e8f2240a 2696
e08b9ad7
JL
2697 Used out of hppaelf.em in the linker. */
2698
e8f2240a 2699asymbol *
4861ac76 2700hppa_look_for_stubs_in_section (stub_bfd, abfd, output_bfd, asec,
6e58a4e5 2701 new_sym_cnt, link_info)
d9ad93bc 2702 bfd *stub_bfd;
e8f2240a
KR
2703 bfd *abfd;
2704 bfd *output_bfd;
2705 asection *asec;
e8f2240a 2706 int *new_sym_cnt;
4991ebb9 2707 struct bfd_link_info *link_info;
e8f2240a
KR
2708{
2709 int i;
e08b9ad7
JL
2710 arg_reloc_type stub_types[5];
2711 asymbol *new_syms = NULL;
e8f2240a
KR
2712 int new_cnt = 0;
2713 int new_max = 0;
80425e6c 2714 arelent **reloc_vector = NULL;
e8f2240a 2715
3a70b01d
KR
2716 /* Relocations are in different places depending on whether this is
2717 an output section or an input section. Also, the relocations are
e08b9ad7
JL
2718 in different forms. Sigh. Luckily, we have bfd_canonicalize_reloc()
2719 to straighten this out for us . */
e8f2240a
KR
2720 if (asec->reloc_count > 0)
2721 {
80425e6c
JK
2722 reloc_vector
2723 = (arelent **) malloc (asec->reloc_count * (sizeof (arelent *) + 1));
2724 if (reloc_vector == NULL)
2725 {
2726 bfd_set_error (bfd_error_no_memory);
2727 goto error_return;
2728 }
e8f2240a 2729
6e58a4e5
JL
2730 /* Make sure the canonical symbols are hanging around in a convient
2731 location. */
2732 if (bfd_get_outsymbols (abfd) == NULL)
2733 {
2734 size_t symsize;
2735
2736 symsize = get_symtab_upper_bound (abfd);
2737 abfd->outsymbols = (asymbol **) bfd_alloc (abfd, symsize);
2738 if (!abfd->outsymbols)
2739 {
2740 bfd_set_error (bfd_error_no_memory);
80425e6c 2741 goto error_return;
6e58a4e5
JL
2742 }
2743 abfd->symcount = bfd_canonicalize_symtab (abfd, abfd->outsymbols);
2744 }
2745
2746 /* Now get the relocations. */
2747 bfd_canonicalize_reloc (abfd, asec, reloc_vector,
2748 bfd_get_outsymbols (abfd));
e08b9ad7
JL
2749
2750 /* Examine each relocation entry in this section. */
e8f2240a
KR
2751 for (i = 0; i < asec->reloc_count; i++)
2752 {
e8f2240a
KR
2753 arelent *rle = reloc_vector[i];
2754
2755 switch (rle->howto->type)
2756 {
e08b9ad7
JL
2757 /* Any call could need argument relocation stubs, and
2758 some may need long-call stubs. */
4861ac76
JL
2759 case R_HPPA_ABS_CALL_11:
2760 case R_HPPA_ABS_CALL_14:
2761 case R_HPPA_ABS_CALL_17:
2762 case R_HPPA_ABS_CALL_L21:
2763 case R_HPPA_ABS_CALL_R11:
2764 case R_HPPA_ABS_CALL_R14:
2765 case R_HPPA_ABS_CALL_R17:
2766 case R_HPPA_ABS_CALL_LS21:
2767 case R_HPPA_ABS_CALL_RS11:
2768 case R_HPPA_ABS_CALL_RS14:
2769 case R_HPPA_ABS_CALL_RS17:
2770 case R_HPPA_ABS_CALL_LD21:
2771 case R_HPPA_ABS_CALL_RD11:
2772 case R_HPPA_ABS_CALL_RD14:
2773 case R_HPPA_ABS_CALL_RD17:
2774 case R_HPPA_ABS_CALL_LR21:
2775 case R_HPPA_ABS_CALL_RR14:
2776 case R_HPPA_ABS_CALL_RR17:
2777 case R_HPPA_PCREL_CALL_11:
2778 case R_HPPA_PCREL_CALL_14:
2779 case R_HPPA_PCREL_CALL_17:
2780 case R_HPPA_PCREL_CALL_12:
2781 case R_HPPA_PCREL_CALL_L21:
2782 case R_HPPA_PCREL_CALL_R11:
2783 case R_HPPA_PCREL_CALL_R14:
2784 case R_HPPA_PCREL_CALL_R17:
2785 case R_HPPA_PCREL_CALL_LS21:
2786 case R_HPPA_PCREL_CALL_RS11:
2787 case R_HPPA_PCREL_CALL_RS14:
2788 case R_HPPA_PCREL_CALL_RS17:
2789 case R_HPPA_PCREL_CALL_LD21:
2790 case R_HPPA_PCREL_CALL_RD11:
2791 case R_HPPA_PCREL_CALL_RD14:
2792 case R_HPPA_PCREL_CALL_RD17:
2793 case R_HPPA_PCREL_CALL_LR21:
2794 case R_HPPA_PCREL_CALL_RR14:
2795 case R_HPPA_PCREL_CALL_RR17:
3a70b01d 2796 {
4861ac76
JL
2797 symext_entryS caller_ar
2798 = (symext_entryS) HPPA_R_ARG_RELOC (rle->addend);
2799 unsigned insn[2];
2800
e08b9ad7 2801 /* We'll need this for the long-call checks. */
4861ac76
JL
2802 bfd_get_section_contents (abfd, asec, insn, rle->address,
2803 sizeof(insn));
e08b9ad7
JL
2804
2805 /* See if this call needs an argument relocation stub. */
3a70b01d
KR
2806 if (hppa_elf_arg_reloc_needed_p (abfd, rle, stub_types,
2807 caller_ar))
2808 {
4861ac76 2809 /* Generate a stub and keep track of the new symbol. */
3a70b01d 2810 asymbol *r;
d9ad93bc 2811
3a70b01d
KR
2812 if (new_cnt == new_max)
2813 {
2814 new_max += STUB_SYM_BUFFER_INC;
4861ac76
JL
2815 new_syms = (asymbol *)
2816 realloc (new_syms, new_max * sizeof (asymbol));
e08b9ad7 2817 if (new_syms == NULL)
80425e6c
JK
2818 {
2819 bfd_set_error (bfd_error_no_memory);
2820 goto error_return;
2821 }
3a70b01d 2822 }
4861ac76 2823
e08b9ad7
JL
2824 /* Build the argument relocation stub. */
2825 r = hppa_elf_build_linker_stub (stub_bfd, output_bfd,
2826 link_info, rle,
2827 stub_types, true, insn,
2828 HPPA_STUB_ARG_RELOC);
3a70b01d
KR
2829 new_syms[new_cnt++] = *r;
2830 }
d9ad93bc 2831
e08b9ad7 2832 /* See if this call needs a long-call stub. */
4861ac76
JL
2833 if (hppa_elf_long_branch_needed_p (abfd, asec, rle,
2834 rle->sym_ptr_ptr[0],
2835 insn[0]))
2836 {
2837 /* Generate a stub and keep track of the new symbol. */
2838 asymbol *r;
3a70b01d 2839
4861ac76
JL
2840 if (new_cnt == new_max)
2841 {
2842 new_max += STUB_SYM_BUFFER_INC;
2843 new_syms = (asymbol *)
2844 realloc (new_syms, (new_max * sizeof (asymbol)));
e08b9ad7 2845 if (! new_syms)
80425e6c
JK
2846 {
2847 bfd_set_error (bfd_error_no_memory);
2848 goto error_return;
2849 }
4861ac76 2850 }
e08b9ad7
JL
2851
2852 /* Build the long-call stub. */
2853 r = hppa_elf_build_linker_stub (stub_bfd, output_bfd,
2854 link_info, rle,
2855 NULL, true, insn,
2856 HPPA_STUB_LONG_CALL);
4861ac76
JL
2857 new_syms[new_cnt++] = *r;
2858 }
3a70b01d
KR
2859 }
2860 break;
2861
e08b9ad7 2862 /* PLABELs may need argument relocation stubs. */
4861ac76
JL
2863 case R_HPPA_PLABEL_32:
2864 case R_HPPA_PLABEL_11:
2865 case R_HPPA_PLABEL_14:
2866 case R_HPPA_PLABEL_L21:
2867 case R_HPPA_PLABEL_R11:
2868 case R_HPPA_PLABEL_R14:
d9ad93bc 2869 {
3a70b01d 2870 /* On a plabel relocation, assume the arguments of the
e08b9ad7
JL
2871 caller are set up in general registers (indirect
2872 calls only use general registers.
2873 NOTE: 0x155 = ARGW0=GR,ARGW1=GR,ARGW2=GR,RETVAL=GR. */
3a70b01d 2874 symext_entryS caller_ar = (symext_entryS) 0x155;
4861ac76
JL
2875 unsigned insn[2];
2876
e08b9ad7 2877 /* Do we really need this? */
4861ac76
JL
2878 bfd_get_section_contents (abfd, asec, insn, rle->address,
2879 sizeof(insn));
d9ad93bc 2880
e08b9ad7 2881 /* See if this call needs an argument relocation stub. */
3a70b01d
KR
2882 if (hppa_elf_arg_reloc_needed_p (abfd, rle, stub_types,
2883 caller_ar))
d9ad93bc 2884 {
4861ac76
JL
2885 /* Generate a plabel stub and keep track of the
2886 new symbol. */
d9ad93bc 2887 asymbol *r;
4861ac76 2888 int rtn_adjust;
d9ad93bc
KR
2889
2890 if (new_cnt == new_max)
2891 {
2892 new_max += STUB_SYM_BUFFER_INC;
4861ac76
JL
2893 new_syms = (asymbol *) realloc (new_syms, new_max
2894 * sizeof (asymbol));
d9ad93bc 2895 }
4861ac76
JL
2896
2897 /* Determine whether a return adjustment
2898 (see the relocation code for relocation type
2899 R_HPPA_STUB_CALL_17) is possible. Basically,
2900 determine whether we are looking at a branch or not. */
4861ac76
JL
2901 if (rle->howto->type == R_HPPA_PLABEL_32)
2902 rtn_adjust = false;
2903 else
2904 {
2905 switch (get_opcode(insn[0]))
2906 {
2907 case BLE:
2908 case BE:
2909 rtn_adjust = true;
2910 break;
2911 default:
2912 rtn_adjust = false;
2913 }
2914 }
e08b9ad7
JL
2915
2916 /* Build the argument relocation stub. */
2917 r = hppa_elf_build_linker_stub (stub_bfd, output_bfd,
2918 link_info, rle, stub_types,
2919 rtn_adjust, insn,
2920 HPPA_STUB_ARG_RELOC);
d9ad93bc
KR
2921 new_syms[new_cnt++] = *r;
2922 }
2923 }
e8f2240a 2924 break;
4c85cbfa 2925
e8f2240a
KR
2926 default:
2927 break;
e8f2240a
KR
2928 }
2929 }
2930 }
e08b9ad7 2931
80425e6c
JK
2932 if (reloc_vector != NULL)
2933 free (reloc_vector);
e08b9ad7 2934 /* Return the new symbols and update the counters. */
e8f2240a
KR
2935 *new_sym_cnt = new_cnt;
2936 return new_syms;
80425e6c
JK
2937
2938 error_return:
2939 if (reloc_vector != NULL)
2940 free (reloc_vector);
2941 /* FIXME: This is bogus. We should be returning NULL. But do the callers
2942 check for that? */
2943 abort ();
4c85cbfa
KR
2944}
2945
e08b9ad7 2946/* Set the contents of a particular section at a particular location. */
d9ad93bc 2947
e08b9ad7 2948static boolean
f4bd7a8f
DM
2949hppa_elf_set_section_contents (abfd, section, location, offset, count)
2950 bfd *abfd;
2951 sec_ptr section;
2952 PTR location;
2953 file_ptr offset;
2954 bfd_size_type count;
4c85cbfa 2955{
e08b9ad7
JL
2956 /* Linker stubs are handled a little differently. */
2957 if (! strcmp (section->name, ".hppa_linker_stubs"))
d9ad93bc 2958 {
f5bfdacd 2959 if (linker_stubs_max_size < offset + count)
d9ad93bc
KR
2960 {
2961 linker_stubs_max_size = offset + count + STUB_ALLOC_INCR;
e08b9ad7
JL
2962 linker_stubs = (char *)realloc (linker_stubs, linker_stubs_max_size);
2963 if (! linker_stubs)
2964 abort ();
d9ad93bc
KR
2965 }
2966
f5bfdacd 2967 if (offset + count > linker_stubs_size)
d9ad93bc
KR
2968 linker_stubs_size = offset + count;
2969
e08b9ad7
JL
2970 /* Set the contents. */
2971 memcpy(linker_stubs + offset, location, count);
d9ad93bc
KR
2972 return (true);
2973 }
2974 else
e08b9ad7
JL
2975 /* For everything but the linker stub section, use the generic
2976 code. */
d9ad93bc
KR
2977 return bfd_elf32_set_section_contents (abfd, section, location,
2978 offset, count);
e8f2240a 2979}
4c85cbfa 2980
7218bb04
KR
2981/* Get the contents of the given section.
2982
2983 This is special for PA ELF because some sections (such as linker stubs)
2984 may reside in memory rather than on disk, or in the case of the symbol
2985 extension section, the contents may need to be generated from other
2986 information contained in the BFD. */
2987
e8f2240a 2988boolean
7218bb04
KR
2989hppa_elf_get_section_contents (abfd, section, location, offset, count)
2990 bfd *abfd;
2991 sec_ptr section;
2992 PTR location;
2993 file_ptr offset;
2994 bfd_size_type count;
e8f2240a 2995{
7218bb04
KR
2996 /* If this is the linker stub section, then its contents are contained
2997 in memory rather than on disk. FIXME. Is that always right? What
2998 about the case where a final executable is read in and a user tries
2999 to get the contents of this section? In that case the contents would
3000 be on disk like everything else. */
e8f2240a
KR
3001 if (strcmp (section->name, ".hppa_linker_stubs") == 0)
3002 {
3a70b01d 3003 elf32_hppa_stub_description *stub_desc = find_stubs (abfd, section);
7218bb04 3004
e8f2240a
KR
3005 if (count == 0)
3006 return true;
7218bb04
KR
3007
3008 /* Sanity check our arguments. */
3009 if ((bfd_size_type) (offset + count) > section->_raw_size
3010 || (bfd_size_type) (offset + count) > stub_desc->real_size)
3011 return (false);
3012
e8f2240a
KR
3013 memcpy (location, stub_desc->stub_contents + offset, count);
3014 return (true);
3015 }
7218bb04
KR
3016
3017 /* The symbol extension section also needs special handling. Its
3018 contents might be on the disk, in memory, or still need to
3019 be generated. */
e8f2240a
KR
3020 else if (strcmp (section->name, ".hppa_symextn") == 0)
3021 {
4861ac76 3022 /* If there are no output sections, then read the contents of the
a5ccdad1
ILT
3023 symbol extension section from disk. */
3024 if (section->output_section == NULL
3025 && abfd->direction == read_direction)
7218bb04
KR
3026 {
3027 return bfd_generic_get_section_contents (abfd, section, location,
3028 offset, count);
3029 }
3030
3031 /* If this is the first time through, and there are output sections,
3032 then build the symbol extension section based on other information
3033 contained in the BFD. */
3034 else if (! symext_chain_built)
3035 {
3036 int i;
a5ccdad1 3037 int *symtab_map =
e08b9ad7 3038 (int *) elf_sym_extra (section->output_section->owner);
7218bb04 3039
f5bfdacd 3040 for (i = 0; i < section->output_section->owner->symcount; i++)
7218bb04 3041 {
e08b9ad7
JL
3042 elf_hppa_tc_symbol (section->output_section->owner,
3043 ((elf_symbol_type *)
3044 section->output_section->owner->outsymbols[i]),
3045 symtab_map[i], &symext_rootP, &symext_lastP);
7218bb04
KR
3046 }
3047 symext_chain_built++;
f5bfdacd
JL
3048 elf_hppa_tc_make_sections (section->output_section->owner,
3049 symext_rootP);
7218bb04 3050 }
a5ccdad1
ILT
3051
3052 /* At this point we know that the symbol extension section has been
3053 built. We just need to copy it into the user's buffer. */
e8f2240a
KR
3054 if (count == 0)
3055 return true;
7218bb04
KR
3056
3057 /* Sanity check our arguments. */
3058 if ((bfd_size_type) (offset + count) > section->_raw_size
3059 || (bfd_size_type) (offset + count) > symextn_contents_real_size)
3060 return (false);
3061
3062 memcpy (location,
e08b9ad7 3063 (char *)symextn_contents + section->output_offset + offset,
7218bb04 3064 count);
e8f2240a
KR
3065 return (true);
3066 }
3067 else
e08b9ad7
JL
3068 /* It's not the symbol extension or linker stub sections, use
3069 the generic routines. */
7218bb04
KR
3070 return bfd_generic_get_section_contents (abfd, section, location,
3071 offset, count);
4c85cbfa
KR
3072}
3073
e08b9ad7
JL
3074/* Translate from an elf into field into a howto relocation pointer. */
3075
8ddd7ab3 3076static void
f4bd7a8f
DM
3077elf_info_to_howto (abfd, cache_ptr, dst)
3078 bfd *abfd;
3079 arelent *cache_ptr;
3080 Elf32_Internal_Rela *dst;
4c85cbfa 3081{
d9ad93bc 3082 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_HPPA_UNIMPLEMENTED);
e08b9ad7 3083 cache_ptr->howto = &elf_hppa_howto_table[ELF32_R_TYPE (dst->r_info)];
d9ad93bc
KR
3084}
3085
e08b9ad7
JL
3086/* Do PA ELF specific processing for symbols. Needed to find the
3087 value of $global$. */
3088
d9ad93bc 3089static void
f4bd7a8f
DM
3090elf32_hppa_backend_symbol_processing (abfd, sym)
3091 bfd *abfd;
3092 asymbol *sym;
d9ad93bc
KR
3093{
3094 /* Is this a definition of $global$? If so, keep it because it will be
3095 needed if any relocations are performed. */
d9ad93bc
KR
3096 if (!strcmp (sym->name, "$global$")
3097 && sym->section != &bfd_und_section)
3098 {
3099 global_symbol = sym;
3100 }
3101}
3102
e08b9ad7
JL
3103/* Do some PA ELF specific work after reading in the symbol table.
3104 In particular attach the argument relocation from the
3105 symbol extension section to the appropriate symbols. */
d9ad93bc 3106static boolean
f4bd7a8f
DM
3107elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt)
3108 bfd *abfd;
3109 elf_symbol_type *esyms;
3110 int symcnt;
d9ad93bc 3111{
e08b9ad7
JL
3112 Elf32_Internal_Shdr *symextn_hdr =
3113 bfd_elf_find_section (abfd, SYMEXTN_SECTION_NAME);
3114 int i, current_sym_idx = 0;
d9ad93bc 3115
e08b9ad7
JL
3116 /* If no symbol extension existed, then all symbol extension information
3117 is assumed to be zero. */
f5bfdacd 3118 if (symextn_hdr == NULL)
d9ad93bc 3119 {
f5bfdacd 3120 for (i = 0; i < symcnt; i++)
e08b9ad7 3121 esyms[i].tc_data.hppa_arg_reloc = 0;
d9ad93bc
KR
3122 return (true);
3123 }
3124
e08b9ad7 3125 /* Allocate a buffer of the appropriate size for the symextn section. */
d9ad93bc 3126 symextn_hdr->contents = bfd_zalloc(abfd,symextn_hdr->sh_size);
9783e04a
DM
3127 if (!symextn_hdr->contents)
3128 {
f5bfdacd 3129 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
3130 return false;
3131 }
d9ad93bc
KR
3132 symextn_hdr->size = symextn_hdr->sh_size;
3133
e08b9ad7 3134 /* Read in the symextn section. */
d9ad93bc
KR
3135 if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1)
3136 {
f5bfdacd 3137 bfd_set_error (bfd_error_system_call);
d9ad93bc
KR
3138 return (false);
3139 }
3140 if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->size, abfd)
3141 != symextn_hdr->size)
3142 {
f5bfdacd 3143 bfd_set_error (bfd_error_system_call);
d9ad93bc
KR
3144 return (false);
3145 }
3146
e08b9ad7
JL
3147 /* Parse entries in the symbol extension section, updating the symtab
3148 entries as we go */
f5bfdacd 3149 for (i = 0; i < symextn_hdr->size / sizeof(symext_entryS); i++)
d9ad93bc
KR
3150 {
3151 symext_entryS *seP = ((symext_entryS *)symextn_hdr->contents) + i;
e08b9ad7
JL
3152 int se_value = ELF32_HPPA_SX_VAL (*seP);
3153 int se_type = ELF32_HPPA_SX_TYPE (*seP);
d9ad93bc 3154
f5bfdacd 3155 switch (se_type)
d9ad93bc
KR
3156 {
3157 case HPPA_SXT_NULL:
3158 break;
3159
3160 case HPPA_SXT_SYMNDX:
f5bfdacd 3161 if (se_value >= symcnt)
d9ad93bc 3162 {
f5bfdacd 3163 bfd_set_error (bfd_error_bad_value);
d9ad93bc
KR
3164 return (false);
3165 }
3166 current_sym_idx = se_value - 1;
3167 break;
3168
3169 case HPPA_SXT_ARG_RELOC:
3170 esyms[current_sym_idx].tc_data.hppa_arg_reloc = se_value;
3171 break;
3172
3173 default:
f5bfdacd 3174 bfd_set_error (bfd_error_bad_value);
d9ad93bc
KR
3175 return (false);
3176 }
3177 }
3178 return (true);
3179}
3180
e08b9ad7
JL
3181/* Perform on PA ELF specific processing once a section has been
3182 read in. In particular keep the symbol indexes correct for
3183 the symbol extension information. */
d9ad93bc
KR
3184
3185static boolean
f4bd7a8f
DM
3186elf32_hppa_backend_section_processing (abfd, secthdr)
3187 bfd *abfd;
3188 Elf32_Internal_Shdr *secthdr;
d9ad93bc 3189{
e08b9ad7 3190 int i, j, k;
d9ad93bc 3191
f5bfdacd 3192 if (secthdr->sh_type == SHT_HPPA_SYMEXTN)
d9ad93bc 3193 {
e08b9ad7 3194 for (i = 0; i < secthdr->size / sizeof (symext_entryS); i++)
d9ad93bc
KR
3195 {
3196 symext_entryS *seP = ((symext_entryS *)secthdr->contents) + i;
e08b9ad7
JL
3197 int se_value = ELF32_HPPA_SX_VAL (*seP);
3198 int se_type = ELF32_HPPA_SX_TYPE (*seP);
d9ad93bc 3199
f5bfdacd 3200 switch (se_type)
d9ad93bc
KR
3201 {
3202 case HPPA_SXT_NULL:
3203 break;
3204
3205 case HPPA_SXT_SYMNDX:
f5bfdacd 3206 for (j = 0; j < abfd->symcount; j++)
d9ad93bc 3207 {
e08b9ad7
JL
3208 /* Locate the map entry for this symbol and modify the
3209 symbol extension section symbol index entry to reflect
3210 the new symbol table index. */
f5bfdacd 3211 for (k = 0; k < elf32_hppa_symextn_map_size; k++)
d9ad93bc 3212 {
f5bfdacd 3213 if (elf32_hppa_symextn_map[k].old_index == se_value
e08b9ad7
JL
3214 && elf32_hppa_symextn_map[k].bfd
3215 == abfd->outsymbols[j]->the_bfd
3216 && elf32_hppa_symextn_map[k].sym
3217 == abfd->outsymbols[j])
d9ad93bc
KR
3218 {
3219 bfd_put_32(abfd,
3220 ELF32_HPPA_SX_WORD (HPPA_SXT_SYMNDX, j),
3221 (char *)seP);
3222 }
3223 }
3224 }
3225 break;
3226
3227 case HPPA_SXT_ARG_RELOC:
3228 break;
3229
3230 default:
f5bfdacd 3231 bfd_set_error (bfd_error_bad_value);
d9ad93bc
KR
3232 return (false);
3233 }
3234 }
3235 }
3236 return true;
3237}
3238
e08b9ad7
JL
3239/* What does this really do? Just determine if there is an appropriate
3240 mapping from ELF section headers to backend sections? More symbol
3241 extension braindamage. */
d9ad93bc
KR
3242
3243static boolean
f4bd7a8f
DM
3244elf32_hppa_backend_section_from_shdr (abfd, hdr, name)
3245 bfd *abfd;
3246 Elf32_Internal_Shdr *hdr;
3247 char *name;
d9ad93bc
KR
3248{
3249 asection *newsect;
3250
f5bfdacd 3251 if (hdr->sh_type == SHT_HPPA_SYMEXTN)
d9ad93bc 3252 {
e08b9ad7 3253 BFD_ASSERT (strcmp (name, ".hppa_symextn") == 0);
d9ad93bc 3254
e08b9ad7 3255 /* Bits that get saved. This one is real. */
d9ad93bc
KR
3256 if (!hdr->rawdata)
3257 {
3258 newsect = bfd_make_section (abfd, name);
3259 if (newsect != NULL)
3260 {
3261 newsect->vma = hdr->sh_addr;
3262 newsect->_raw_size = hdr->sh_size;
e08b9ad7 3263 newsect->filepos = hdr->sh_offset;
d9ad93bc
KR
3264 newsect->flags |= SEC_HAS_CONTENTS;
3265 newsect->alignment_power = hdr->sh_addralign;
3266
3267 if (hdr->sh_flags & SHF_ALLOC)
3268 {
3269 newsect->flags |= SEC_ALLOC;
3270 newsect->flags |= SEC_LOAD;
3271 }
3272
3273 if (!(hdr->sh_flags & SHF_WRITE))
3274 newsect->flags |= SEC_READONLY;
3275
3276 if (hdr->sh_flags & SHF_EXECINSTR)
e08b9ad7 3277 newsect->flags |= SEC_CODE;
d9ad93bc
KR
3278 else
3279 newsect->flags |= SEC_DATA;
3280
3281 hdr->rawdata = (void *) newsect;
3282 }
3283 }
3284 return true;
3285 }
3286 return false;
3287}
3288
e08b9ad7 3289/* Return true if the given section is a fake section. */
d9ad93bc
KR
3290
3291static boolean
f4bd7a8f
DM
3292elf32_hppa_backend_fake_sections (abfd, secthdr, asect)
3293 bfd *abfd;
3294 Elf_Internal_Shdr *secthdr;
3295 asection *asect;
d9ad93bc
KR
3296{
3297
f5bfdacd 3298 if (strcmp(asect->name, ".hppa_symextn") == 0)
d9ad93bc
KR
3299 {
3300 secthdr->sh_type = SHT_HPPA_SYMEXTN;
3301 secthdr->sh_flags = 0;
3302 secthdr->sh_info = elf_section_data(asect)->rel_hdr.sh_link;
3303 secthdr->sh_link = elf_onesymtab(abfd);
3304 return true;
3305 }
3306
3307 if (!strcmp (asect->name, ".hppa_unwind"))
3308 {
3309 secthdr->sh_type = SHT_PROGBITS;
3310 /* Unwind descriptors are not part of the program memory image. */
3311 secthdr->sh_flags = 0;
3312 secthdr->sh_info = 0;
3313 secthdr->sh_link = 0;
3314 secthdr->sh_entsize = 16;
3315 return true;
3316 }
3317
7218bb04
KR
3318 /* @@ Should this be CPU specific?? KR */
3319 if (!strcmp (asect->name, ".stabstr"))
3320 {
3321 secthdr->sh_type = SHT_STRTAB;
3322 secthdr->sh_flags = 0;
3323 secthdr->sh_info = 0;
3324 secthdr->sh_link = 0;
3325 secthdr->sh_entsize = 0;
3326 return true;
3327 }
3328
d9ad93bc
KR
3329 return false;
3330}
3331
e08b9ad7
JL
3332/* Return true if there is a mapping from bfd section into a
3333 backend section. */
d9ad93bc
KR
3334
3335static boolean
e08b9ad7 3336elf32_hppa_backend_section_from_bfd_section (abfd, hdr, asect, ignored)
f4bd7a8f
DM
3337 bfd *abfd;
3338 Elf32_Internal_Shdr *hdr;
3339 asection *asect;
e08b9ad7 3340 int *ignored;
d9ad93bc 3341{
f5bfdacd 3342 if (hdr->sh_type == SHT_HPPA_SYMEXTN)
d9ad93bc
KR
3343 {
3344 if (hdr->rawdata)
3345 {
3346 if (((struct sec *) (hdr->rawdata)) == asect)
3347 {
e08b9ad7 3348 BFD_ASSERT (strcmp (asect->name, ".hppa_symextn") == 0);
d9ad93bc
KR
3349 return true;
3350 }
3351 }
3352 }
f5bfdacd 3353 else if (hdr->sh_type == SHT_STRTAB)
7218bb04
KR
3354 {
3355 if (hdr->rawdata)
3356 {
3357 if (((struct sec *) (hdr->rawdata)) == asect)
3358 {
f5bfdacd 3359 BFD_ASSERT (strcmp (asect->name, ".stabstr") == 0);
7218bb04
KR
3360 return true;
3361 }
3362 }
3363 }
d9ad93bc
KR
3364
3365 return false;
8ddd7ab3 3366}
4c85cbfa 3367
f5bfdacd 3368#define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
d9ad93bc
KR
3369#define elf_backend_section_from_bfd_section elf32_hppa_backend_section_from_bfd_section
3370
e08b9ad7
JL
3371#define elf_backend_symbol_processing elf32_hppa_backend_symbol_processing
3372#define elf_backend_symbol_table_processing elf32_hppa_backend_symbol_table_processing
3373
d9ad93bc
KR
3374#define bfd_generic_get_section_contents hppa_elf_get_section_contents
3375#define bfd_elf32_set_section_contents hppa_elf_set_section_contents
3376
e08b9ad7
JL
3377#define elf_backend_section_processing elf32_hppa_backend_section_processing
3378
3379#define elf_backend_section_from_shdr elf32_hppa_backend_section_from_shdr
3380#define elf_backend_fake_sections elf32_hppa_backend_fake_sections
3381
e8f2240a 3382#define TARGET_BIG_SYM bfd_elf32_hppa_vec
8ddd7ab3
KR
3383#define TARGET_BIG_NAME "elf32-hppa"
3384#define ELF_ARCH bfd_arch_hppa
a5ccdad1 3385#define ELF_MACHINE_CODE EM_HPPA
3a70b01d 3386#define ELF_MAXPAGESIZE 0x1000
8ddd7ab3
KR
3387
3388#include "elf32-target.h"