]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/elf32-hppa.c
* som.[ch]: Do not include libhppa.h in som.c, instead include
[thirdparty/binutils-gdb.git] / bfd / elf32-hppa.c
1 /* BFD back-end for HP PA-RISC ELF files.
2 Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
3
4 Written by
5
6 Center for Software Science
7 Department of Computer Science
8 University of Utah
9
10 This file is part of BFD, the Binary File Descriptor library.
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
25
26 #include "bfd.h"
27 #include "sysdep.h"
28 #include "libbfd.h"
29 #include "obstack.h"
30 #include "bfdlink.h"
31 #include "libelf.h"
32
33 /* Note there isn't much error handling code in here yet. Unexpected
34 conditions are handled by just calling abort. FIXME damnit! */
35
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
40 November 19, 1992. */
41
42 #include "elf32-hppa.h"
43 #include "aout/aout64.h"
44 #include "hppa_stubs.h"
45
46 /* The basic stub types supported. If/when shared libraries are
47 implemented some form of IMPORT and EXPORT stubs will be needed. */
48 typedef 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
57 typedef 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
74 typedef 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. */
107 typedef 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? */
128 typedef 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). */
145 typedef 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. */
154 static CONST arg_reloc_type mismatches[6][6] =
155 {
156 {NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC,
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. */
171 static CONST arg_reloc_type retval_mismatches[6][6] =
172 {
173 {NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC,
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. */
188 struct elf32_hppa_symextn_map_struct
189 {
190 int old_index;
191 bfd *bfd;
192 asymbol *sym;
193 int new_index;
194 };
195
196 static bfd_reloc_status_type hppa_elf_reloc
197 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
198
199 static unsigned long hppa_elf_relocate_insn
200 PARAMS ((bfd *, asection *, unsigned long, unsigned long, long,
201 long, unsigned long, unsigned long, unsigned long));
202
203 static void hppa_elf_relocate_unwind_table
204 PARAMS ((bfd *, PTR, unsigned long, long, long,
205 unsigned long, unsigned long));
206
207 static long get_symbol_value PARAMS ((asymbol *));
208
209 static bfd_reloc_status_type hppa_elf_reloc
210 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd*, char **));
211
212 static CONST reloc_howto_type * elf_hppa_reloc_type_lookup
213 PARAMS ((bfd_arch_info_type *, bfd_reloc_code_real_type));
214
215 static symext_entryS elf32_hppa_get_sym_extn PARAMS ((bfd *, asymbol *, int));
216
217 static elf32_hppa_stub_description * find_stubs PARAMS ((bfd *, asection *));
218
219 static elf32_hppa_stub_description * new_stub
220 PARAMS ((bfd *, asection *, struct bfd_link_info *));
221
222 static arg_reloc_type type_of_mismatch PARAMS ((int, int, int));
223
224 static elf32_hppa_stub_name_list * find_stub_by_name
225 PARAMS ((bfd *, asection *, char *));
226
227 static elf32_hppa_stub_name_list * add_stub_by_name
228 PARAMS ((bfd *, asection *, asymbol *, struct bfd_link_info *));
229
230 static void hppa_elf_stub_finish PARAMS ((bfd *));
231
232 static void hppa_elf_stub_reloc
233 PARAMS ((elf32_hppa_stub_description *, bfd *, asymbol **, int,
234 elf32_hppa_reloc_type));
235
236 static int hppa_elf_arg_reloc_needed_p
237 PARAMS ((bfd *, arelent *, arg_reloc_type [5], symext_entryS));
238
239 static 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
243 static void hppa_elf_create_stub_sec
244 PARAMS ((bfd *, bfd *, asection **, struct bfd_link_info *));
245
246 static int hppa_elf_long_branch_needed_p
247 PARAMS ((bfd *, asection *, arelent *, asymbol *, unsigned));
248
249 static boolean hppa_elf_set_section_contents
250 PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
251
252 static void elf_info_to_howto
253 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
254
255 static void elf32_hppa_backend_symbol_processing PARAMS ((bfd *, asymbol *));
256
257 static boolean elf32_hppa_backend_section_processing
258 PARAMS ((bfd *, Elf32_Internal_Shdr *));
259
260 static boolean elf32_hppa_backend_symbol_table_processing
261 PARAMS ((bfd *, elf_symbol_type *, int));
262
263 static boolean elf32_hppa_backend_section_from_shdr
264 PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
265
266 static boolean elf32_hppa_backend_fake_sections
267 PARAMS ((bfd *, Elf_Internal_Shdr *, asection *));
268
269 static boolean elf32_hppa_backend_section_from_bfd_section
270 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
271
272 /* ELF/PA relocation howto entries. */
273
274 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
275 {
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
398 };
399
400 static symext_chainS *symext_rootP;
401 static symext_chainS *symext_lastP;
402 static boolean symext_chain_built;
403 static long global_value;
404 static long GOT_value;
405 static asymbol *global_symbol;
406 static int global_sym_defined;
407 static symext_entryS *symextn_contents;
408 static unsigned int symextn_contents_real_size;
409 static elf32_hppa_stub_description *elf_hppa_stub_rootP;
410 static boolean stubs_finished = false;
411 static struct elf32_hppa_symextn_map_struct *elf32_hppa_symextn_map;
412 static int elf32_hppa_symextn_map_size;
413
414 static char *linker_stubs = NULL;
415 static int linker_stubs_size = 0;
416 static int linker_stubs_max_size = 0;
417 #define STUB_ALLOC_INCR 100
418 #define STUB_SYM_BUFFER_INC 5
419
420 /* Relocate the given INSN given the various input parameters.
421
422 FIXME: endianness and sizeof (long) issues abound here. */
423
424 static unsigned long
425 hppa_elf_relocate_insn (abfd, input_sect, insn, address, sym_value,
426 r_addend, r_format, r_field, pcrel)
427 bfd *abfd;
428 asection *input_sect;
429 unsigned long insn;
430 unsigned long address;
431 long sym_value;
432 long r_addend;
433 unsigned long r_format;
434 unsigned long r_field;
435 unsigned long pcrel;
436 {
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:
452 case COMICLR:
453 case SUBI:
454 case ADDIT:
455 case ADDI:
456 case LDIL:
457 case ADDIL:
458 constant_value = HPPA_R_CONSTANT (r_addend);
459
460 if (pcrel)
461 sym_value -= address;
462
463 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
464 return hppa_rebuild_insn (abfd, insn, sym_value, r_format);
465
466 case BL:
467 case BE:
468 case BLE:
469 arg_reloc = HPPA_R_ARG_RELOC (r_addend);
470
471 /* XXX computing constant_value is not needed??? */
472 constant_value = assemble_17 ((insn & 0x001f0000) >> 16,
473 (insn & 0x00001ffc) >> 2,
474 insn & 1);
475
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);
486
487 return hppa_rebuild_insn (abfd, insn, sym_value >> 2, r_format);
488
489 default:
490 if (opcode == 0)
491 {
492 constant_value = HPPA_R_CONSTANT (r_addend);
493
494 if (pcrel)
495 sym_value -= address;
496
497 return hppa_field_adjust (sym_value, constant_value, r_field);
498 }
499 else
500 abort ();
501 }
502 }
503
504 /* Relocate a single unwind entry, or an entire table of them. */
505
506 static void
507 hppa_elf_relocate_unwind_table (abfd, data, address, sym_value,
508 r_addend, r_type, r_field)
509 bfd *abfd;
510 PTR data;
511 unsigned long address;
512 long sym_value;
513 long r_addend;
514 unsigned long r_type;
515 unsigned long r_field;
516 {
517 bfd_byte *hit_data = address + (bfd_byte *) data;
518 long start_offset;
519 long end_offset;
520 long relocated_value;
521 int i;
522
523 switch (r_type)
524 {
525 case R_HPPA_UNWIND_ENTRY:
526 /* Need to relocate the first two 32bit fields in the unwind. They
527 correspond to a function's start and end address. */
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:
539 /* Relocate a mass of unwind entires. The count is passed in r_addend
540 (who's braindamaged idea was this anyway? */
541 for (i = 0; i < r_addend; i++, hit_data += 3 * sizeof (unsigned long))
542 {
543 unsigned int adjustment;
544 /* Adjust the first 32bit field in the unwind entry. It's
545 the starting offset of a function. */
546 start_offset = bfd_get_32 (abfd, hit_data);
547 bfd_put_32 (abfd, sym_value, hit_data);
548 adjustment = sym_value - start_offset;
549
550 /* Now adjust the second 32bit field, it's the ending offset
551 of a function. */
552 hit_data += sizeof (unsigned long);
553 end_offset = adjustment + bfd_get_32 (abfd, hit_data);
554 bfd_put_32 (abfd, end_offset, hit_data);
555
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;
560 }
561 break;
562
563 default:
564 abort ();
565 }
566 }
567
568 /* Return the relocated value of the given symbol. */
569
570 static long
571 get_symbol_value (symbol)
572 asymbol *symbol;
573 {
574 if (symbol == NULL
575 || symbol->section == &bfd_com_section)
576 return 0;
577 else
578 return symbol->value + symbol->section->output_section->vma
579 + symbol->section->output_offset;
580 }
581
582 /* Return one (or more) BFD relocations which implement the base
583 relocation with modifications based on format and field. */
584
585 elf32_hppa_reloc_type **
586 hppa_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;
591 {
592 elf32_hppa_reloc_type *finaltype;
593 elf32_hppa_reloc_type **final_types;
594
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);
598 BFD_ASSERT (final_types != 0); /* FIXME */
599
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));
603 BFD_ASSERT (finaltype != 0); /* FIXME */
604
605 /* Some reasonable defaults. */
606 final_types[0] = finaltype;
607 final_types[1] = NULL;
608
609 #define final_type finaltype[0]
610
611 final_type = base_type;
612
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. */
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;
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;
642 case e_tsel:
643 final_type = R_HPPA_DLT_11;
644 break;
645 case e_rtsel:
646 final_type = R_HPPA_DLT_R11;
647 break;
648 default:
649 abort ();
650 break;
651 }
652 break;
653
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;
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;
675 case e_tsel:
676 final_type = R_HPPA_DLT_14;
677 break;
678 case e_rtsel:
679 final_type = R_HPPA_DLT_R14;
680 break;
681 default:
682 abort ();
683 break;
684 }
685 break;
686
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;
705 default:
706 abort ();
707 break;
708 }
709 break;
710
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;
729 case e_ltsel:
730 final_type = R_HPPA_PLABEL_L21;
731 break;
732 default:
733 abort ();
734 break;
735 }
736 break;
737
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;
747 case e_tsel:
748 final_type = R_HPPA_DLT_32;
749 break;
750 default:
751 abort ();
752 break;
753 }
754 break;
755
756 default:
757 abort ();
758 break;
759 }
760 break;
761
762
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;
781 default:
782 abort ();
783 break;
784 }
785 break;
786
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;
805 default:
806 abort ();
807 break;
808 }
809 break;
810
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;
826 default:
827 abort ();
828 break;
829 }
830 break;
831
832 default:
833 abort ();
834 break;
835 }
836 break;
837
838
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;
857 default:
858 abort ();
859 break;
860 }
861 break;
862
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;
881 default:
882 abort ();
883 break;
884 }
885 break;
886
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;
905 default:
906 abort ();
907 break;
908 }
909 break;
910
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;
926 default:
927 abort ();
928 break;
929 }
930 break;
931
932 default:
933 abort ();
934 break;
935 }
936 break;
937
938
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:
952 abort ();
953 break;
954 }
955 break;
956
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:
967 abort ();
968 break;
969 }
970 break;
971
972 case 21:
973 switch (field)
974 {
975 case e_lsel:
976 final_type = R_HPPA_PLABEL_L21;
977 break;
978 default:
979 abort ();
980 break;
981 }
982 break;
983
984 case 32:
985 switch (field)
986 {
987 case e_fsel:
988 final_type = R_HPPA_PLABEL_32;
989 break;
990 default:
991 abort ();
992 break;
993 }
994 break;
995
996 default:
997 abort ();
998 break;
999 }
1000
1001
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;
1020 default:
1021 abort ();
1022 break;
1023 }
1024 break;
1025
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;
1044 default:
1045 abort ();
1046 break;
1047 }
1048 break;
1049
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;
1068 default:
1069 abort ();
1070 break;
1071 }
1072 break;
1073
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;
1089 default:
1090 abort ();
1091 break;
1092 }
1093 break;
1094
1095 default:
1096 abort ();
1097 break;
1098 }
1099 break;
1100
1101
1102 case R_HPPA_UNWIND:
1103 final_type = R_HPPA_UNWIND_ENTRY;
1104 break;
1105
1106
1107 case R_HPPA_COMPLEX:
1108 case R_HPPA_COMPLEX_PCREL_CALL:
1109 case R_HPPA_COMPLEX_ABS_CALL:
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 ();
1114 break;
1115
1116 default:
1117 final_type = base_type;
1118 break;
1119 }
1120
1121 return final_types;
1122 }
1123
1124 #undef final_type
1125
1126
1127 /* Actually perform a relocation. */
1128
1129 static bfd_reloc_status_type
1130 hppa_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
1131 error_message)
1132 bfd *abfd;
1133 arelent *reloc_entry;
1134 asymbol *symbol_in;
1135 PTR data;
1136 asection *input_section;
1137 bfd *output_bfd;
1138 char **error_message;
1139 {
1140 unsigned long insn;
1141 long sym_value = 0;
1142 unsigned long addr = reloc_entry->address;
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;
1146 boolean r_pcrel = reloc_entry->howto->pc_relative;
1147 unsigned r_format = reloc_entry->howto->bitsize;
1148 long r_addend = reloc_entry->addend;
1149
1150 /* If only performing a partial link, get out early. */
1151 if (output_bfd)
1152 {
1153 reloc_entry->address += input_section->output_offset;
1154 return bfd_reloc_ok;
1155 }
1156
1157 /* If performing final link and the symbol we're relocating against
1158 is undefined, then return an error. */
1159 if (symbol_in && symbol_in->section == &bfd_und_section)
1160 return bfd_reloc_undefined;
1161
1162 /* Get the final relocated value. */
1163 sym_value = get_symbol_value (symbol_in);
1164
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. */
1172 if (!global_sym_defined)
1173 {
1174 if (global_symbol)
1175 {
1176 global_value = (global_symbol->value
1177 + global_symbol->section->output_section->vma
1178 + global_symbol->section->output_offset);
1179 GOT_value = global_value;
1180 global_sym_defined++;
1181 }
1182 }
1183
1184 /* Get the instruction word. */
1185 insn = bfd_get_32 (abfd, hit_data);
1186
1187 /* Relocate the value based on one of the basic relocation types
1188
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 */
1196
1197 switch (r_type)
1198 {
1199 case R_HPPA_NONE:
1200 break;
1201
1202 /* Handle all the basic type 1 relocations. */
1203 case R_HPPA_32:
1204 case R_HPPA_11:
1205 case R_HPPA_14:
1206 case R_HPPA_17:
1207 r_field = e_fsel;
1208 goto do_basic_type_1;
1209 case R_HPPA_L21:
1210 r_field = e_lsel;
1211 goto do_basic_type_1;
1212 case R_HPPA_R11:
1213 case R_HPPA_R14:
1214 case R_HPPA_R17:
1215 r_field = e_rsel;
1216 goto do_basic_type_1;
1217 case R_HPPA_LS21:
1218 r_field = e_lssel;
1219 goto do_basic_type_1;
1220 case R_HPPA_RS11:
1221 case R_HPPA_RS14:
1222 case R_HPPA_RS17:
1223 r_field = e_ldsel;
1224 goto do_basic_type_1;
1225 case R_HPPA_LD21:
1226 r_field = e_ldsel;
1227 goto do_basic_type_1;
1228 case R_HPPA_RD11:
1229 case R_HPPA_RD14:
1230 case R_HPPA_RD17:
1231 r_field = e_rdsel;
1232 goto do_basic_type_1;
1233 case R_HPPA_LR21:
1234 r_field = e_lrsel;
1235 goto do_basic_type_1;
1236 case R_HPPA_RR14:
1237 case R_HPPA_RR17:
1238 r_field = e_rrsel;
1239
1240 do_basic_type_1:
1241 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1242 sym_value, r_addend, r_format,
1243 r_field, r_pcrel);
1244 break;
1245
1246 /* Handle all the basic type 2 relocations. */
1247 case R_HPPA_GOTOFF_11:
1248 case R_HPPA_GOTOFF_14:
1249 r_field = e_fsel;
1250 goto do_basic_type_2;
1251 case R_HPPA_GOTOFF_L21:
1252 r_field = e_lsel;
1253 goto do_basic_type_2;
1254 case R_HPPA_GOTOFF_R11:
1255 case R_HPPA_GOTOFF_R14:
1256 r_field = e_rsel;
1257 goto do_basic_type_2;
1258 case R_HPPA_GOTOFF_LS21:
1259 r_field = e_lssel;
1260 goto do_basic_type_2;
1261 case R_HPPA_GOTOFF_RS11:
1262 case R_HPPA_GOTOFF_RS14:
1263 r_field = e_rssel;
1264 goto do_basic_type_2;
1265 case R_HPPA_GOTOFF_LD21:
1266 r_field = e_ldsel;
1267 goto do_basic_type_2;
1268 case R_HPPA_GOTOFF_RD11:
1269 case R_HPPA_GOTOFF_RD14:
1270 r_field = e_rdsel;
1271 goto do_basic_type_2;
1272 case R_HPPA_GOTOFF_LR21:
1273 r_field = e_lrsel;
1274 goto do_basic_type_2;
1275 case R_HPPA_GOTOFF_RR14:
1276 r_field = e_rrsel;
1277
1278 do_basic_type_2:
1279 sym_value -= GOT_value;
1280 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1281 sym_value, r_addend, r_format,
1282 r_field, r_pcrel);
1283 break;
1284
1285 /* Handle all the basic type 3 relocations. */
1286 case R_HPPA_ABS_CALL_11:
1287 case R_HPPA_ABS_CALL_14:
1288 case R_HPPA_ABS_CALL_17:
1289 r_field = e_fsel;
1290 goto do_basic_type_3;
1291 case R_HPPA_ABS_CALL_L21:
1292 r_field = e_lsel;
1293 goto do_basic_type_3;
1294 case R_HPPA_ABS_CALL_R11:
1295 case R_HPPA_ABS_CALL_R14:
1296 case R_HPPA_ABS_CALL_R17:
1297 r_field = e_rsel;
1298 goto do_basic_type_3;
1299 case R_HPPA_ABS_CALL_LS21:
1300 r_field = e_lssel;
1301 goto do_basic_type_3;
1302 case R_HPPA_ABS_CALL_RS11:
1303 case R_HPPA_ABS_CALL_RS14:
1304 case R_HPPA_ABS_CALL_RS17:
1305 r_field = e_rssel;
1306 goto do_basic_type_3;
1307 case R_HPPA_ABS_CALL_LD21:
1308 r_field = e_ldsel;
1309 goto do_basic_type_3;
1310 case R_HPPA_ABS_CALL_RD11:
1311 case R_HPPA_ABS_CALL_RD14:
1312 case R_HPPA_ABS_CALL_RD17:
1313 r_field = e_rdsel;
1314 goto do_basic_type_3;
1315 case R_HPPA_ABS_CALL_LR21:
1316 r_field = e_lrsel;
1317 goto do_basic_type_3;
1318 case R_HPPA_ABS_CALL_RR14:
1319 case R_HPPA_ABS_CALL_RR17:
1320 r_field = e_rrsel;
1321
1322 do_basic_type_3:
1323 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1324 sym_value, r_addend, r_format,
1325 r_field, r_pcrel);
1326 break;
1327
1328 /* Handle all the basic type 4 relocations. */
1329 case R_HPPA_PCREL_CALL_11:
1330 case R_HPPA_PCREL_CALL_14:
1331 case R_HPPA_PCREL_CALL_17:
1332 r_field = e_fsel;
1333 goto do_basic_type_4;
1334 case R_HPPA_PCREL_CALL_L21:
1335 r_field = e_lsel;
1336 goto do_basic_type_4;
1337 case R_HPPA_PCREL_CALL_R11:
1338 case R_HPPA_PCREL_CALL_R14:
1339 case R_HPPA_PCREL_CALL_R17:
1340 r_field = e_rsel;
1341 goto do_basic_type_4;
1342 case R_HPPA_PCREL_CALL_LS21:
1343 r_field = e_lssel;
1344 goto do_basic_type_4;
1345 case R_HPPA_PCREL_CALL_RS11:
1346 case R_HPPA_PCREL_CALL_RS14:
1347 case R_HPPA_PCREL_CALL_RS17:
1348 r_field = e_rssel;
1349 goto do_basic_type_4;
1350 case R_HPPA_PCREL_CALL_LD21:
1351 r_field = e_ldsel;
1352 goto do_basic_type_4;
1353 case R_HPPA_PCREL_CALL_RD11:
1354 case R_HPPA_PCREL_CALL_RD14:
1355 case R_HPPA_PCREL_CALL_RD17:
1356 r_field = e_rdsel;
1357 goto do_basic_type_4;
1358 case R_HPPA_PCREL_CALL_LR21:
1359 r_field = e_lrsel;
1360 goto do_basic_type_4;
1361 case R_HPPA_PCREL_CALL_RR14:
1362 case R_HPPA_PCREL_CALL_RR17:
1363 r_field = e_rrsel;
1364
1365 do_basic_type_4:
1366 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1367 sym_value, r_addend, r_format,
1368 r_field, r_pcrel);
1369 break;
1370
1371 /* Handle all the basic type 5 relocations. */
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,
1385 sym_value, r_addend, r_format,
1386 r_field, r_pcrel);
1387 break;
1388
1389 /* Handle all basic type 6 relocations. */
1390 case R_HPPA_UNWIND_ENTRY:
1391 case R_HPPA_UNWIND_ENTRIES:
1392 hppa_elf_relocate_unwind_table (abfd, data, addr,
1393 sym_value, r_addend,
1394 r_type, r_field);
1395 return bfd_reloc_ok;
1396
1397 /* This is a linker internal relocation. */
1398 case R_HPPA_STUB_CALL_17:
1399 /* This relocation is for a branch to a long branch stub.
1400 Change instruction to a BLE,N. It may also be necessary
1401 to interchange the branch and its delay slot.
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"
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.
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
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. */
1430
1431 /* Is this instruction nullified? (does this ever happen?) */
1432 if (insn & 2)
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,
1439 addr, sym_value, r_addend,
1440 r_format, r_field, r_pcrel);
1441 }
1442 else
1443 {
1444 /* So much for the trivial case... */
1445 unsigned long old_delay_slot_insn = bfd_get_32 (abfd, hit_data + 4);
1446 unsigned rtn_reg = (insn & 0x03e00000) >> 21;
1447
1448 if (get_opcode (old_delay_slot_insn) == LDO)
1449 {
1450 unsigned ldo_src_reg = (old_delay_slot_insn & 0x03e00000) >> 21;
1451 unsigned ldo_target_reg = (old_delay_slot_insn & 0x001f0000) >> 16;
1452
1453 /* If the target of the LDO is the same as the return
1454 register then there is no reordering. We can leave the
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. */
1459 if (ldo_target_reg == rtn_reg)
1460 {
1461 unsigned long new_delay_slot_insn = old_delay_slot_insn;
1462
1463 BFD_ASSERT (ldo_src_reg == ldo_target_reg);
1464 new_delay_slot_insn &= 0xfc00ffff;
1465 new_delay_slot_insn |= ((31 << 21) | (31 << 16));
1466 bfd_put_32 (abfd, new_delay_slot_insn, hit_data + 4);
1467 insn = BLE_XXX_0_0;
1468 r_type = R_HPPA_ABS_CALL_17;
1469 r_pcrel = 0;
1470 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
1471 addr, sym_value, r_addend,
1472 r_format, r_field, r_pcrel);
1473 bfd_put_32 (abfd, insn, hit_data);
1474 return bfd_reloc_ok;
1475 }
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,
1484 addr, sym_value,
1485 r_addend, r_format,
1486 r_field, r_pcrel);
1487 bfd_put_32 (abfd, insn, hit_data);
1488 return bfd_reloc_ok;
1489 }
1490 else
1491 {
1492 /* Check to see if the delay slot instruction has a
1493 relocation. If so, we need to change the address
1494 field of it because the instruction it relocates
1495 is going to be moved. Oh what a mess. */
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,
1508 addr + 4,
1509 sym_value, r_addend,
1510 r_format, r_field, r_pcrel);
1511 bfd_put_32 (abfd, insn, hit_data + 4);
1512 return bfd_reloc_ok;
1513 }
1514 }
1515 /* Same comments as above regarding incorrect test. */
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,
1524 addr, sym_value,
1525 r_addend, r_format,
1526 r_field, r_pcrel);
1527 bfd_put_32 (abfd, insn, hit_data);
1528 return bfd_reloc_ok;
1529 }
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,
1548 addr + 4, sym_value,
1549 r_addend, r_format,
1550 r_field, r_pcrel);
1551 bfd_put_32 (abfd, insn, hit_data + 4);
1552 return bfd_reloc_ok;
1553 }
1554 }
1555 break;
1556
1557 /* Something we don't know how to handle. */
1558 default:
1559 *error_message = (char *) "Unrecognized reloc";
1560 return bfd_reloc_notsupported;
1561 }
1562
1563 /* Update the instruction word. */
1564 bfd_put_32 (abfd, insn, hit_data);
1565 return (bfd_reloc_ok);
1566 }
1567
1568 /* Return the address of the howto table entry to perform the CODE
1569 relocation for an ARCH machine. */
1570
1571 static CONST reloc_howto_type *
1572 elf_hppa_reloc_type_lookup (arch, code)
1573 bfd_arch_info_type *arch;
1574 bfd_reloc_code_real_type code;
1575 {
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 }
1581 return NULL;
1582 }
1583
1584
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. */
1587
1588 void
1589 elf_hppa_tc_symbol (abfd, symbolP, sym_idx, symext_root, symext_last)
1590 bfd *abfd;
1591 elf_symbol_type *symbolP;
1592 int sym_idx;
1593 symext_chainS **symext_root;
1594 symext_chainS **symext_last;
1595 {
1596 symext_chainS *symextP;
1597 unsigned int arg_reloc;
1598
1599 /* Only functions can have argument relocations. */
1600 if (!(symbolP->symbol.flags & BSF_FUNCTION))
1601 return;
1602
1603 arg_reloc = symbolP->tc_data.hppa_arg_reloc;
1604
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
1610 /* Allocate memory and initialize this entry. */
1611 symextP = (symext_chainS *) bfd_alloc (abfd, sizeof (symext_chainS) * 2);
1612 if (!symextP)
1613 {
1614 bfd_set_error (bfd_error_no_memory);
1615 abort(); /* FIXME */
1616 }
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
1624 /* Now update the chain itself so it can be walked later to build
1625 the symbol extension section. */
1626 if (*symext_root == NULL)
1627 {
1628 *symext_root = &symextP[0];
1629 *symext_last = &symextP[1];
1630 }
1631 else
1632 {
1633 (*symext_last)->next = &symextP[0];
1634 *symext_last = &symextP[1];
1635 }
1636 }
1637
1638 /* Build the symbol extension section. Used internally and by GAS. */
1639
1640 void
1641 elf_hppa_tc_make_sections (abfd, symext_root)
1642 bfd *abfd;
1643 symext_chainS *symext_root;
1644 {
1645 symext_chainS *symextP;
1646 int size, n, i;
1647 asection *symextn_sec;
1648
1649 /* FIXME: Huh? I don't see what this is supposed to do for us. */
1650 hppa_elf_stub_finish (abfd);
1651
1652 /* If there are no entries in the symbol extension chain, then
1653 there is no symbol extension section. */
1654 if (symext_root == NULL)
1655 return;
1656
1657 /* Count the number of entries on the chain. */
1658 for (n = 0, symextP = symext_root; symextP; symextP = symextP->next, ++n)
1659 ;
1660
1661 /* Create the symbol extension section and set some appropriate
1662 attributes. */
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,
1670 SEC_LOAD | SEC_HAS_CONTENTS | SEC_DATA);
1671 symextn_sec->output_section = symextn_sec;
1672 symextn_sec->output_offset = 0;
1673 bfd_set_section_alignment (abfd, symextn_sec, 2);
1674 }
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. */
1680 symextn_contents = (symext_entryS *) bfd_alloc (abfd, size);
1681 if (!symextn_contents)
1682 {
1683 bfd_set_error (bfd_error_no_memory);
1684 abort(); /* FIXME */
1685 }
1686
1687 /* Fill in the contents of the symbol extension section. */
1688 for (i = 0, symextP = symext_root; symextP; symextP = symextP->next, ++i)
1689 symextn_contents[i] = symextP->entry;
1690
1691 return;
1692 }
1693
1694 /* Return the symbol extension record of type TYPE for the symbol SYM. */
1695
1696 static symext_entryS
1697 elf32_hppa_get_sym_extn (abfd, sym, type)
1698 bfd *abfd;
1699 asymbol *sym;
1700 int type;
1701 {
1702 switch (type)
1703 {
1704 case HPPA_SXT_SYMNDX:
1705 case HPPA_SXT_NULL:
1706 return (symext_entryS) 0;
1707 case HPPA_SXT_ARG_RELOC:
1708 {
1709 elf_symbol_type *esymP = (elf_symbol_type *) sym;
1710
1711 return (symext_entryS) esymP->tc_data.hppa_arg_reloc;
1712 }
1713 /* This should never happen. */
1714 default:
1715 abort();
1716 }
1717 }
1718
1719 /* Search the chain of stub descriptions and locate the stub
1720 description for this the given section within the given bfd.
1721
1722 FIXME: I see yet another wonderful linear linked list search
1723 here. This is probably bad. */
1724
1725 static elf32_hppa_stub_description *
1726 find_stubs (abfd, stub_sec)
1727 bfd *abfd;
1728 asection *stub_sec;
1729 {
1730 elf32_hppa_stub_description *stubP;
1731
1732 for (stubP = elf_hppa_stub_rootP; stubP; stubP = stubP->next)
1733 {
1734 /* Is this the right one? */
1735 if (stubP->this_bfd == abfd && stubP->stub_sec == stub_sec)
1736 return stubP;
1737 }
1738 return NULL;
1739 }
1740
1741 static elf32_hppa_stub_description *
1742 new_stub (abfd, stub_sec, link_info)
1743 bfd *abfd;
1744 asection *stub_sec;
1745 struct bfd_link_info *link_info;
1746 {
1747 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
1748
1749 /* If we found a list for this bfd, then use it. */
1750 if (stub)
1751 return stub;
1752
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));
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;
1764 stub->link_info = link_info;
1765
1766 stub->next = elf_hppa_stub_rootP;
1767 elf_hppa_stub_rootP = stub;
1768 }
1769 else
1770 {
1771 bfd_set_error (bfd_error_no_memory);
1772 abort(); /* FIXME */
1773 }
1774
1775 return stub;
1776 }
1777
1778 /* Try and locate a stub with the name NAME within the stubs
1779 associated with ABFD. More linked list searches. */
1780
1781 static elf32_hppa_stub_name_list *
1782 find_stub_by_name (abfd, stub_sec, name)
1783 bfd *abfd;
1784 asection *stub_sec;
1785 char *name;
1786 {
1787 /* Find the stubs associated with this bfd. */
1788 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
1789
1790 /* If found, then we have to walk down them looking for a match. */
1791 if (stub)
1792 {
1793 elf32_hppa_stub_name_list *name_listP;
1794
1795 for (name_listP = stub->stub_listP;
1796 name_listP;
1797 name_listP = name_listP->next)
1798 {
1799 if (!strcmp (name_listP->sym->name, name))
1800 return name_listP;
1801 }
1802 }
1803
1804 /* Not found. */
1805 return 0;
1806 }
1807
1808 /* Add a new stub (SYM) to the list of stubs associated with the given BFD. */
1809 static elf32_hppa_stub_name_list *
1810 add_stub_by_name(abfd, stub_sec, sym, link_info)
1811 bfd *abfd;
1812 asection *stub_sec;
1813 asymbol *sym;
1814 struct bfd_link_info *link_info;
1815 {
1816 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
1817 elf32_hppa_stub_name_list *stub_entry;
1818
1819 /* If no stubs are associated with this bfd, then we have to make
1820 a chain-of-stubs associated with this bfd. */
1821 if (!stub)
1822 stub = new_stub (abfd, stub_sec, link_info);
1823
1824 if (stub)
1825 {
1826 /* Allocate and initialize an entry in the stub chain. */
1827 stub_entry = (elf32_hppa_stub_name_list *)
1828 bfd_zalloc (abfd, sizeof (elf32_hppa_stub_name_list));
1829
1830 if (stub_entry)
1831 {
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;
1838 /* Add it to the chain. */
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;
1845 }
1846 else
1847 {
1848 bfd_set_error (bfd_error_no_memory);
1849 abort(); /* FIXME */
1850 }
1851 }
1852 /* Death by mis-adventure. */
1853 abort ();
1854 return (elf32_hppa_stub_name_list *)NULL;
1855 }
1856
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. */
1860
1861 static arg_reloc_type
1862 type_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 }
1874 return ARG_RELOC_ERR;
1875 }
1876
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
1880
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) \
1885 { \
1886 *((entry)->stub_desc->stub_secp)++ = (insn); \
1887 (entry)->stub_desc->real_size += sizeof (int); \
1888 (entry)->size += sizeof(int); \
1889 bfd_set_section_size((entry)->stub_desc->this_bfd, \
1890 (entry)->stub_desc->stub_sec, \
1891 (entry)->stub_desc->real_size); \
1892 }
1893
1894 /* Find the offset of the current stub? Looks more like it
1895 finds the offset of the last instruction to me. */
1896 #define CURRENT_STUB_OFFSET(entry) \
1897 ((char *)(entry)->stub_desc->stub_secp \
1898 - (char *)(entry)->stub_desc->stub_contents - 4)
1899
1900 /* All the stubs have already been built, finish up stub stuff
1901 by applying relocations to the stubs. */
1902
1903 static void
1904 hppa_elf_stub_finish (output_bfd)
1905 bfd *output_bfd;
1906 {
1907 elf32_hppa_stub_description *stub_list = elf_hppa_stub_rootP;
1908
1909 /* If the stubs have been finished, then we're already done. */
1910 if (stubs_finished)
1911 return;
1912
1913 /* Walk down the list of stub lists. */
1914 for (; stub_list; stub_list = stub_list->next)
1915 {
1916 /* If this list has stubs, then do something. */
1917 if (stub_list->real_size)
1918 {
1919 bfd *stub_bfd = stub_list->this_bfd;
1920 asection *stub_sec = bfd_get_section_by_name (stub_bfd,
1921 ".hppa_linker_stubs");
1922 bfd_size_type reloc_size;
1923 arelent **reloc_vector;
1924
1925 /* Some sanity checking. */
1926 BFD_ASSERT (stub_sec == stub_list->stub_sec);
1927 BFD_ASSERT (stub_sec);
1928
1929 /* For stub sections raw_size == cooked_size. Also update
1930 reloc_done as we're handling the relocs now. */
1931 stub_sec->_cooked_size = stub_sec->_raw_size;
1932 stub_sec->reloc_done = true;
1933
1934 /* Make space to hold the relocations for the stub section. */
1935 reloc_size = bfd_get_reloc_upper_bound (stub_bfd, stub_sec);
1936 reloc_vector = (arelent **) alloca (reloc_size);
1937
1938 /* If we have relocations, do them. */
1939 if (bfd_canonicalize_reloc (stub_bfd, stub_sec, reloc_vector,
1940 output_bfd->outsymbols))
1941 {
1942 arelent **parent;
1943 for (parent = reloc_vector; *parent != NULL; parent++)
1944 {
1945 char *err = NULL;
1946 bfd_reloc_status_type r =
1947 bfd_perform_relocation (stub_bfd, *parent,
1948 stub_list->stub_contents,
1949 stub_sec, (bfd *) NULL, &err);
1950
1951 /* If there was an error, tell someone about it. */
1952 if (r != bfd_reloc_ok)
1953 {
1954 struct bfd_link_info *link_info = stub_list->link_info;
1955
1956 switch (r)
1957 {
1958 case bfd_reloc_undefined:
1959 if (! ((*link_info->callbacks->undefined_symbol)
1960 (link_info,
1961 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
1962 stub_bfd, stub_sec, (*parent)->address)))
1963 abort ();
1964 break;
1965 case bfd_reloc_dangerous:
1966 if (! ((*link_info->callbacks->reloc_dangerous)
1967 (link_info, err, stub_bfd, stub_sec,
1968 (*parent)->address)))
1969 abort ();
1970 break;
1971 case bfd_reloc_overflow:
1972 {
1973 if (! ((*link_info->callbacks->reloc_overflow)
1974 (link_info,
1975 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
1976 (*parent)->howto->name,
1977 (*parent)->addend,
1978 stub_bfd, stub_sec,
1979 (*parent)->address)))
1980 abort ();
1981 }
1982 break;
1983 case bfd_reloc_outofrange:
1984 default:
1985 abort ();
1986 break;
1987 }
1988 }
1989 }
1990 }
1991
1992 /* All done with the relocations. Set the final contents
1993 of the stub section. FIXME: no check of return value! */
1994 bfd_set_section_contents (output_bfd, stub_sec,
1995 stub_list->stub_contents,
1996 0, stub_list->real_size);
1997 }
1998 }
1999 /* All done. */
2000 stubs_finished = true;
2001 }
2002
2003 /* Allocate a new relocation entry to be used in a linker stub. */
2004
2005 static void
2006 hppa_elf_stub_reloc (stub_desc, output_bfd, target_sym, offset, type)
2007 elf32_hppa_stub_description *stub_desc;
2008 bfd *output_bfd;
2009 asymbol **target_sym;
2010 int offset;
2011 elf32_hppa_reloc_type type;
2012 {
2013 arelent relent;
2014 int size;
2015 Elf_Internal_Shdr *rela_hdr;
2016
2017 /* I really don't like the realloc nonsense in here. FIXME. */
2018 if (stub_desc->relocs_allocated_cnt == stub_desc->stub_sec->reloc_count)
2019 {
2020 /* Allocate the first few relocation entries. */
2021 if (stub_desc->stub_sec->relocation == NULL)
2022 {
2023 stub_desc->relocs_allocated_cnt = STUB_RELOC_INCR;
2024 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
2025 stub_desc->stub_sec->relocation = (arelent *) bfd_zmalloc (size);
2026 }
2027 else
2028 {
2029 /* We've used all the entries we've already allocated. So get
2030 some more. */
2031 stub_desc->relocs_allocated_cnt += STUB_RELOC_INCR;
2032 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
2033 stub_desc->stub_sec->relocation = (arelent *)
2034 realloc (stub_desc->stub_sec->relocation, size);
2035 }
2036 if (!stub_desc->stub_sec->relocation)
2037 {
2038 bfd_set_error (bfd_error_no_memory);
2039 abort (); /* FIXME */
2040 }
2041 }
2042
2043 rela_hdr = &elf_section_data(stub_desc->stub_sec)->rel_hdr;
2044 rela_hdr->sh_size += sizeof(Elf32_External_Rela);
2045
2046 /* Fill in the details. */
2047 relent.address = offset;
2048 relent.addend = 0;
2049 relent.sym_ptr_ptr = target_sym;
2050 relent.howto = bfd_reloc_type_lookup (stub_desc->this_bfd, type);
2051
2052 /* Save it in the array of relocations for the stub section. */
2053 memcpy (&stub_desc->stub_sec->relocation[stub_desc->stub_sec->reloc_count++],
2054 &relent, sizeof (arelent));
2055 }
2056
2057 /* Build an argument relocation stub. RTN_ADJUST is a hint that an
2058 adjust to the return pointer from within the stub itself may be
2059 needed. */
2060
2061 static asymbol *
2062 hppa_elf_build_linker_stub (abfd, output_bfd, link_info, reloc_entry,
2063 stub_types, rtn_adjust, data, linker_stub_type)
2064 bfd *abfd;
2065 bfd *output_bfd;
2066 struct bfd_link_info *link_info;
2067 arelent *reloc_entry;
2068 arg_reloc_type stub_types[5];
2069 int rtn_adjust;
2070 unsigned *data;
2071 hppa_stub_type linker_stub_type;
2072 {
2073 int i;
2074 boolean milli, dyncall;
2075 char stub_sym_name[128];
2076 elf32_hppa_stub_name_list *stub_entry;
2077 /* Some initialization. */
2078 unsigned insn = data[0];
2079 asymbol *stub_sym = NULL;
2080 asymbol **orig_sym = reloc_entry->sym_ptr_ptr;
2081 asection *stub_sec = bfd_get_section_by_name (abfd, ".hppa_linker_stubs");
2082 elf32_hppa_stub_description *stub_desc = find_stubs (abfd, stub_sec);
2083
2084 /* Perform some additional checks on whether we should really do the
2085 return adjustment. For example, if the instruction is nullified
2086 or if the delay slot contains an instruction that modifies the return
2087 pointer, then the branch instructions should not be rearranged
2088 (rtn_adjust is false). */
2089 if (insn & 2 || insn == 0)
2090 rtn_adjust = false;
2091 else
2092 {
2093 unsigned delay_insn = data[1];
2094
2095 if (get_opcode (delay_insn) == LDO
2096 && (((insn & 0x03e00000) >> 21) == ((delay_insn & 0x001f0000) >> 16)))
2097 rtn_adjust = false;
2098 }
2099
2100 /* Some special code for long-call stubs. */
2101 if (linker_stub_type == HPPA_STUB_LONG_CALL)
2102 {
2103
2104 /* Is this a millicode call? If so, the return address
2105 comes in on r31 rather than r2 (rp) so a slightly
2106 different code sequence is needed. */
2107 unsigned rtn_reg = (insn & 0x03e00000) >> 21;
2108 if (rtn_reg == 31)
2109 milli = true;
2110
2111 /* Dyncall is special because the user code has already
2112 put the return pointer in %r2 (aka RP). Other millicode
2113 calls have the return pointer in %r31. */
2114 if (strcmp ((*orig_sym)->name, "$$dyncall") == 0)
2115 dyncall = true;
2116
2117 /* If we are creating a call from a stub to another stub, then
2118 never do the instruction reordering. We can tell if we are
2119 going to be calling one stub from another by the fact that
2120 the symbol name has '_stub_' (arg. reloc. stub) or '_lb_stub_'
2121 prepended to the name. Alternatively, the section of the
2122 symbol will be '.hppa_linker_stubs'. This is only an issue
2123 for long-calls; they are the only stubs allowed to call another
2124 stub. */
2125 if ((strncmp ((*orig_sym)->name, "_stub_", 6) == 0)
2126 || (strncmp ((*orig_sym)->name, "_lb_stub_", 9) == 0))
2127 {
2128 BFD_ASSERT (strcmp ((*orig_sym)->section->name, ".hppa_linker_stubs")
2129 == 0);
2130 rtn_adjust = false;
2131 }
2132 }
2133
2134 /* Create the stub section if necessary. */
2135 if (!stub_sec)
2136 {
2137 BFD_ASSERT (stub_desc == NULL);
2138 hppa_elf_create_stub_sec (abfd, output_bfd, &stub_sec, link_info);
2139 stub_desc = new_stub (abfd, stub_sec, link_info);
2140 }
2141
2142 /* Make the stub if we did not find one already. */
2143 if (!stub_desc)
2144 stub_desc = new_stub (abfd, stub_sec, link_info);
2145
2146 /* Allocate space to write the stub.
2147 FIXME: Why using realloc?!? */
2148 if (!stub_desc->stub_contents)
2149 {
2150 stub_desc->allocated_size = STUB_BUFFER_INCR;
2151 stub_desc->stub_contents = (char *) malloc (STUB_BUFFER_INCR);
2152 }
2153 else if ((stub_desc->allocated_size - stub_desc->real_size) < STUB_MAX_SIZE)
2154 {
2155 stub_desc->allocated_size = stub_desc->allocated_size + STUB_BUFFER_INCR;
2156 stub_desc->stub_contents = (char *) realloc (stub_desc->stub_contents,
2157 stub_desc->allocated_size);
2158 }
2159
2160 /* If no memory die. (I seriously doubt the other routines
2161 are prepared to get a NULL return value). */
2162 if (!stub_desc->stub_contents)
2163 {
2164 bfd_set_error (bfd_error_no_memory);
2165 abort ();
2166 }
2167
2168 /* Generate an appropriate name for this stub. */
2169 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
2170 sprintf (stub_sym_name,
2171 "_stub_%s_%02d_%02d_%02d_%02d_%02d_%s",
2172 reloc_entry->sym_ptr_ptr[0]->name,
2173 stub_types[0], stub_types[1], stub_types[2],
2174 stub_types[3], stub_types[4],
2175 rtn_adjust ? "RA" : "");
2176 else
2177 sprintf (stub_sym_name,
2178 "_lb_stub_%s_%s", reloc_entry->sym_ptr_ptr[0]->name,
2179 rtn_adjust ? "RA" : "");
2180
2181
2182 stub_desc->stub_secp
2183 = (int *) (stub_desc->stub_contents + stub_desc->real_size);
2184 stub_entry = find_stub_by_name (abfd, stub_sec, stub_sym_name);
2185
2186 /* See if we already have one by this name. */
2187 if (stub_entry)
2188 {
2189 /* Yes, re-use it. Redirect the original relocation from the
2190 old symbol (a function symbol) to the stub (the stub will call
2191 the original function). */
2192 stub_sym = stub_entry->sym;
2193 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (abfd,
2194 sizeof (asymbol **));
2195 if (reloc_entry->sym_ptr_ptr == NULL)
2196 {
2197 bfd_set_error (bfd_error_no_memory);
2198 abort ();
2199 }
2200 reloc_entry->sym_ptr_ptr[0] = stub_sym;
2201 if (linker_stub_type == HPPA_STUB_LONG_CALL
2202 || (reloc_entry->howto->type != R_HPPA_PLABEL_32
2203 && (get_opcode(insn) == BLE
2204 || get_opcode (insn) == BE
2205 || get_opcode (insn) == BL)))
2206 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
2207 }
2208 else
2209 {
2210 /* Create a new symbol to point to this stub. */
2211 stub_sym = bfd_make_empty_symbol (abfd);
2212 if (!stub_sym)
2213 {
2214 bfd_set_error (bfd_error_no_memory);
2215 abort ();
2216 }
2217 stub_sym->name = bfd_zalloc (abfd, strlen (stub_sym_name) + 1);
2218 if (!stub_sym->name)
2219 {
2220 bfd_set_error (bfd_error_no_memory);
2221 abort ();
2222 }
2223 strcpy ((char *) stub_sym->name, stub_sym_name);
2224 stub_sym->value
2225 = (char *) stub_desc->stub_secp - (char *) stub_desc->stub_contents;
2226 stub_sym->section = stub_sec;
2227 stub_sym->flags = BSF_LOCAL | BSF_FUNCTION;
2228 stub_entry = add_stub_by_name (abfd, stub_sec, stub_sym, link_info);
2229
2230 /* Redirect the original relocation from the old symbol (a function)
2231 to the stub (the stub calls the function). */
2232 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (abfd,
2233 sizeof (asymbol **));
2234 if (reloc_entry->sym_ptr_ptr == NULL)
2235 {
2236 bfd_set_error (bfd_error_no_memory);
2237 abort ();
2238 }
2239 reloc_entry->sym_ptr_ptr[0] = stub_sym;
2240 if (linker_stub_type == HPPA_STUB_LONG_CALL
2241 || (reloc_entry->howto->type != R_HPPA_PLABEL_32
2242 && (get_opcode (insn) == BLE
2243 || get_opcode (insn) == BE
2244 || get_opcode (insn) == BL)))
2245 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
2246
2247 /* Now generate the code for the stub. Starting with two
2248 common instructions.
2249
2250 FIXME: Do we still need the SP adjustment?
2251 Do we still need to muck with space registers? */
2252 NEW_INSTRUCTION (stub_entry, LDSID_31_1)
2253 NEW_INSTRUCTION (stub_entry, MTSP_1_SR0)
2254
2255 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
2256 {
2257 NEW_INSTRUCTION (stub_entry, ADDI_8_SP)
2258
2259 /* Examine each argument, generating code to relocate it
2260 into a different register if necessary. */
2261 for (i = ARG0; i < ARG3; i++)
2262 {
2263 switch (stub_types[i])
2264 {
2265
2266 case NO_ARG_RELOC:
2267 continue;
2268
2269 case R_TO_FR:
2270 switch (i)
2271 {
2272 case ARG0:
2273 NEW_INSTRUCTION (stub_entry, STWS_ARG0_M8SP)
2274 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG0)
2275 break;
2276 case ARG1:
2277 NEW_INSTRUCTION (stub_entry, STWS_ARG1_M8SP)
2278 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG1)
2279 break;
2280 case ARG2:
2281 NEW_INSTRUCTION (stub_entry, STWS_ARG2_M8SP)
2282 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG2)
2283 break;
2284 case ARG3:
2285 NEW_INSTRUCTION (stub_entry, STWS_ARG3_M8SP)
2286 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG3)
2287 break;
2288 }
2289 continue;
2290
2291 case R01_TO_FR:
2292 switch (i)
2293 {
2294 case ARG0:
2295 NEW_INSTRUCTION (stub_entry, STWS_ARG0_M4SP)
2296 NEW_INSTRUCTION (stub_entry, STWS_ARG1_M8SP)
2297 NEW_INSTRUCTION (stub_entry, FLDDS_M8SP_FARG1)
2298 break;
2299 default:
2300 abort ();
2301 break;
2302 }
2303 continue;
2304
2305 case R23_TO_FR:
2306 switch (i)
2307 {
2308 case ARG2:
2309 NEW_INSTRUCTION (stub_entry, STWS_ARG2_M4SP)
2310 NEW_INSTRUCTION (stub_entry, STWS_ARG3_M8SP)
2311 NEW_INSTRUCTION (stub_entry, FLDDS_M8SP_FARG3)
2312 break;
2313 default:
2314 abort ();
2315 break;
2316 }
2317 continue;
2318
2319 case FR_TO_R:
2320 switch (i)
2321 {
2322 case ARG0:
2323 NEW_INSTRUCTION (stub_entry, FSTWS_FARG0_M8SP)
2324 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG0)
2325 break;
2326 case ARG1:
2327 NEW_INSTRUCTION (stub_entry, FSTWS_FARG1_M8SP)
2328 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG1)
2329 break;
2330 case ARG2:
2331 NEW_INSTRUCTION (stub_entry, FSTWS_FARG2_M8SP)
2332 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG2)
2333 break;
2334 case ARG3:
2335 NEW_INSTRUCTION (stub_entry, FSTWS_FARG3_M8SP)
2336 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG3)
2337 break;
2338 }
2339 continue;
2340
2341 case FR_TO_R01:
2342 switch (i)
2343 {
2344 case ARG0:
2345 NEW_INSTRUCTION (stub_entry, FSTDS_FARG1_M8SP)
2346 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG0)
2347 NEW_INSTRUCTION (stub_entry, LDWS_M8SP_ARG1)
2348 break;
2349 default:
2350 abort ();
2351 break;
2352 }
2353 continue;
2354
2355 case FR_TO_R23:
2356 switch (i)
2357 {
2358 case ARG2:
2359 NEW_INSTRUCTION (stub_entry, FSTDS_FARG3_M8SP)
2360 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG2)
2361 NEW_INSTRUCTION (stub_entry, LDWS_M8SP_ARG3)
2362 break;
2363 default:
2364 abort ();
2365 break;
2366 }
2367 continue;
2368
2369 default:
2370 abort ();
2371 break;
2372 }
2373 }
2374
2375 /* Put the stack pointer back. FIXME: Is this still necessary? */
2376 NEW_INSTRUCTION (stub_entry, ADDI_M8_SP_SP)
2377 }
2378
2379 /* Common code again. Return pointer adjustment and the like. */
2380 if (!dyncall)
2381 {
2382 /* This isn't dyncall. */
2383 if (!milli)
2384 {
2385 /* It's not a millicode call, so get the correct return
2386 value into %r2 (aka RP). */
2387 if (rtn_adjust)
2388 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_RP)
2389 else
2390 NEW_INSTRUCTION (stub_entry, COPY_31_2)
2391 }
2392 else
2393 {
2394 /* It is a millicode call, so get the correct return
2395 value into %r1?!?. FIXME: Shouldn't this be
2396 %r31? Yes, and a little re-arrangement of the
2397 code below would make that possible. */
2398 if (rtn_adjust)
2399 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_1)
2400 else
2401 NEW_INSTRUCTION (stub_entry, COPY_31_1)
2402 }
2403 }
2404 else
2405 {
2406 /* This is dyncall, so the code is a little different as the
2407 return pointer is already in %r2 (aka RP). */
2408 if (rtn_adjust)
2409 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_RP)
2410 }
2411
2412 /* Save the return address. */
2413 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
2414 NEW_INSTRUCTION (stub_entry, STW_RP_M8SP)
2415
2416 /* Long branch to the target function. */
2417 NEW_INSTRUCTION (stub_entry, LDIL_XXX_31)
2418 hppa_elf_stub_reloc (stub_entry->stub_desc,
2419 abfd, orig_sym,
2420 CURRENT_STUB_OFFSET (stub_entry),
2421 R_HPPA_L21);
2422 NEW_INSTRUCTION (stub_entry, BLE_XXX_0_31)
2423 hppa_elf_stub_reloc (stub_entry->stub_desc,
2424 abfd, orig_sym,
2425 CURRENT_STUB_OFFSET (stub_entry),
2426 R_HPPA_ABS_CALL_R17);
2427
2428 if (linker_stub_type == HPPA_STUB_ARG_RELOC)
2429 {
2430 /* In delay slot of long-call, copy %r31 into %r2 so that
2431 the callee can return in the normal fashion. */
2432 NEW_INSTRUCTION (stub_entry, COPY_31_2)
2433
2434 /* Restore the return address. */
2435 NEW_INSTRUCTION (stub_entry, LDW_M8SP_RP)
2436
2437 /* Generate the code to move the return value around. */
2438 switch (stub_types[RETVAL])
2439 {
2440 case NO_ARG_RELOC:
2441 break;
2442
2443 case R_TO_FR:
2444 NEW_INSTRUCTION (stub_entry, STWS_RET0_M8SP)
2445 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FRET0)
2446 break;
2447
2448 case FR_TO_R:
2449 NEW_INSTRUCTION (stub_entry, FSTWS_FRET0_M8SP)
2450 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_RET0)
2451 break;
2452
2453 default:
2454 abort ();
2455 break;
2456 }
2457
2458 /* Return back to the main code stream. */
2459 NEW_INSTRUCTION (stub_entry, BV_N_0_RP)
2460 }
2461 else
2462 {
2463 if (!dyncall)
2464 {
2465 /* Get return address into %r31. Both variants may be necessary
2466 (I think) as we could be cascading into another stub. */
2467 if (!milli)
2468 NEW_INSTRUCTION (stub_entry, COPY_2_31)
2469 else
2470 NEW_INSTRUCTION (stub_entry, COPY_1_31)
2471 }
2472 else
2473 {
2474 /* Get the return address into %r31 too. Might be necessary
2475 (I think) as we could be cascading into another stub. */
2476 NEW_INSTRUCTION (stub_entry, COPY_2_31)
2477 }
2478
2479 /* No need for a return to the main stream. */
2480 }
2481 }
2482 return stub_sym;
2483 }
2484
2485 /* Return nonzero if an argument relocation will be needed to call
2486 the function (symbol in RELOC_ENTRY) assuming the caller has
2487 argument relocation bugs CALLER_AR. */
2488
2489 static int
2490 hppa_elf_arg_reloc_needed_p (abfd, reloc_entry, stub_types, caller_ar)
2491 bfd *abfd;
2492 arelent *reloc_entry;
2493 arg_reloc_type stub_types[5];
2494 symext_entryS caller_ar;
2495 {
2496 /* If the symbol is still undefined, then it's impossible to know
2497 if an argument relocation is needed. */
2498 if (reloc_entry->sym_ptr_ptr[0]
2499 && reloc_entry->sym_ptr_ptr[0]->section != &bfd_und_section)
2500 {
2501 symext_entryS callee_ar = elf32_hppa_get_sym_extn (abfd,
2502 reloc_entry->sym_ptr_ptr[0],
2503 HPPA_SXT_ARG_RELOC);
2504
2505 /* Now examine all the argument and return value location
2506 information to determine if a relocation stub will be needed. */
2507 if (caller_ar && callee_ar)
2508 {
2509 arg_location caller_loc[5];
2510 arg_location callee_loc[5];
2511
2512 /* Extract the location information for the return value
2513 and argument registers separately. */
2514 callee_loc[RETVAL] = EXTRACT_ARBITS (callee_ar, RETVAL);
2515 caller_loc[RETVAL] = EXTRACT_ARBITS (caller_ar, RETVAL);
2516 callee_loc[ARG0] = EXTRACT_ARBITS (callee_ar, ARG0);
2517 caller_loc[ARG0] = EXTRACT_ARBITS (caller_ar, ARG0);
2518 callee_loc[ARG1] = EXTRACT_ARBITS (callee_ar, ARG1);
2519 caller_loc[ARG1] = EXTRACT_ARBITS (caller_ar, ARG1);
2520 callee_loc[ARG2] = EXTRACT_ARBITS (callee_ar, ARG2);
2521 caller_loc[ARG2] = EXTRACT_ARBITS (caller_ar, ARG2);
2522 callee_loc[ARG3] = EXTRACT_ARBITS (callee_ar, ARG3);
2523 caller_loc[ARG3] = EXTRACT_ARBITS (caller_ar, ARG3);
2524
2525 /* Check some special combinations. For example, if FU
2526 appears in ARG1 or ARG3, we can move it to ARG0 or ARG2,
2527 respectively. (I guess this braindamage is correct? It'd
2528 take an hour or two of reading PA calling conventions to
2529 really know). */
2530
2531 if (caller_loc[ARG0] == AR_FU || caller_loc[ARG1] == AR_FU)
2532 {
2533 caller_loc[ARG0] = AR_DBL01;
2534 caller_loc[ARG1] = AR_NO;
2535 }
2536 if (caller_loc[ARG2] == AR_FU || caller_loc[ARG3] == AR_FU)
2537 {
2538 caller_loc[ARG2] = AR_DBL23;
2539 caller_loc[ARG3] = AR_NO;
2540 }
2541 if (callee_loc[ARG0] == AR_FU || callee_loc[ARG1] == AR_FU)
2542 {
2543 callee_loc[ARG0] = AR_DBL01;
2544 callee_loc[ARG1] = AR_NO;
2545 }
2546 if (callee_loc[ARG2] == AR_FU || callee_loc[ARG3] == AR_FU)
2547 {
2548 callee_loc[ARG2] = AR_DBL23;
2549 callee_loc[ARG3] = AR_NO;
2550 }
2551
2552 /* Now look up potential mismatches. */
2553 stub_types[ARG0] = type_of_mismatch (caller_loc[ARG0],
2554 callee_loc[ARG0],
2555 ARGUMENTS);
2556 stub_types[ARG1] = type_of_mismatch (caller_loc[ARG1],
2557 callee_loc[ARG1],
2558 ARGUMENTS);
2559 stub_types[ARG2] = type_of_mismatch (caller_loc[ARG2],
2560 callee_loc[ARG2],
2561 ARGUMENTS);
2562 stub_types[ARG3] = type_of_mismatch (caller_loc[ARG3],
2563 callee_loc[ARG3],
2564 ARGUMENTS);
2565 stub_types[RETVAL] = type_of_mismatch (caller_loc[RETVAL],
2566 callee_loc[RETVAL],
2567 RETURN_VALUE);
2568
2569 /* If any of the arguments or return value need an argument
2570 relocation, then we will need an argument relocation stub. */
2571 if (stub_types[ARG0] != NO_ARG_RELOC
2572 || stub_types[ARG1] != NO_ARG_RELOC
2573 || stub_types[ARG2] != NO_ARG_RELOC
2574 || stub_types[ARG3] != NO_ARG_RELOC
2575 || stub_types[RETVAL] != NO_ARG_RELOC)
2576 return 1;
2577 }
2578 }
2579 return 0;
2580 }
2581
2582 /* Create the linker stub section. */
2583
2584 static void
2585 hppa_elf_create_stub_sec (abfd, output_bfd, secptr, link_info)
2586 bfd *abfd;
2587 bfd *output_bfd;
2588 asection **secptr;
2589 struct bfd_link_info *link_info;
2590 {
2591 asection *output_text_section;
2592
2593 output_text_section = bfd_get_section_by_name (output_bfd, ".text");
2594 *secptr = bfd_make_section (abfd, ".hppa_linker_stubs");
2595 bfd_set_section_flags (abfd, *secptr,
2596 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
2597 | SEC_RELOC | SEC_CODE | SEC_READONLY);
2598 (*secptr)->output_section = output_text_section->output_section;
2599 (*secptr)->output_offset = 0;
2600
2601 /* Set up the ELF section header for this new section. This
2602 is basically the same processing as elf_make_sections().
2603 elf_make_sections is static and therefore not accessable
2604 here. */
2605 {
2606 Elf_Internal_Shdr *this_hdr;
2607 this_hdr = &elf_section_data ((*secptr))->this_hdr;
2608
2609 /* Set the sizes of this section. The contents have already
2610 been set up ?!? */
2611 this_hdr->sh_addr = (*secptr)->vma;
2612 this_hdr->sh_size = (*secptr)->_raw_size;
2613
2614 /* Set appropriate flags for sections with relocations. */
2615 if ((*secptr)->flags & SEC_RELOC)
2616 {
2617 Elf_Internal_Shdr *rela_hdr;
2618 int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
2619
2620 rela_hdr = &elf_section_data ((*secptr))->rel_hdr;
2621
2622 if (use_rela_p)
2623 {
2624 rela_hdr->sh_type = SHT_RELA;
2625 rela_hdr->sh_entsize = sizeof (Elf32_External_Rela);
2626 }
2627 else
2628 {
2629 rela_hdr->sh_type = SHT_REL;
2630 rela_hdr->sh_entsize = sizeof (Elf32_External_Rel);
2631 }
2632 rela_hdr->sh_flags = 0;
2633 rela_hdr->sh_addr = 0;
2634 rela_hdr->sh_offset = 0;
2635 rela_hdr->sh_addralign = 0;
2636 rela_hdr->size = 0;
2637 }
2638
2639 if ((*secptr)->flags & SEC_ALLOC)
2640 this_hdr->sh_flags |= SHF_ALLOC;
2641
2642 if (!((*secptr)->flags & SEC_READONLY))
2643 this_hdr->sh_flags |= SHF_WRITE;
2644
2645 if ((*secptr)->flags & SEC_CODE)
2646 this_hdr->sh_flags |= SHF_EXECINSTR;
2647 }
2648
2649 bfd_set_section_alignment (abfd, *secptr, 2);
2650 }
2651
2652 /* Return nonzero if a long-call stub will be needed to call the
2653 function (symbol in RELOC_ENTRY). */
2654
2655 static int
2656 hppa_elf_long_branch_needed_p (abfd, asec, reloc_entry, symbol, insn)
2657 bfd *abfd;
2658 asection *asec;
2659 arelent *reloc_entry;
2660 asymbol *symbol;
2661 unsigned insn;
2662 {
2663 long sym_value = get_symbol_value (symbol);
2664 int fmt = reloc_entry->howto->bitsize;
2665 unsigned char op = get_opcode (insn);
2666 unsigned raddr;
2667
2668 #define too_far(val,num_bits) \
2669 ((int)(val) > (1 << (num_bits)) - 1) || ((int)(val) < (-1 << (num_bits)))
2670
2671 switch (op)
2672 {
2673 case BL:
2674 raddr =
2675 reloc_entry->address + asec->output_offset + asec->output_section->vma;
2676 /* If the symbol and raddr (relocated addr?) are too far away from
2677 each other, then a long-call stub will be needed. */
2678 if (too_far (sym_value - raddr, fmt + 1))
2679 return 1;
2680 break;
2681 }
2682 return 0;
2683 }
2684
2685 /* Search the given section and determine if linker stubs will be
2686 needed for any calls within that section.
2687
2688 Return any new stub symbols created.
2689
2690 Used out of hppaelf.em in the linker. */
2691
2692 asymbol *
2693 hppa_look_for_stubs_in_section (stub_bfd, abfd, output_bfd, asec,
2694 new_sym_cnt, link_info)
2695 bfd *stub_bfd;
2696 bfd *abfd;
2697 bfd *output_bfd;
2698 asection *asec;
2699 int *new_sym_cnt;
2700 struct bfd_link_info *link_info;
2701 {
2702 int i;
2703 arg_reloc_type stub_types[5];
2704 asymbol *new_syms = NULL;
2705 int new_cnt = 0;
2706 int new_max = 0;
2707
2708 /* Relocations are in different places depending on whether this is
2709 an output section or an input section. Also, the relocations are
2710 in different forms. Sigh. Luckily, we have bfd_canonicalize_reloc()
2711 to straighten this out for us . */
2712 if (asec->reloc_count > 0)
2713 {
2714 arelent **reloc_vector
2715 = (arelent **) alloca (asec->reloc_count * (sizeof (arelent *) + 1));
2716
2717 /* Make sure the canonical symbols are hanging around in a convient
2718 location. */
2719 if (bfd_get_outsymbols (abfd) == NULL)
2720 {
2721 size_t symsize;
2722
2723 symsize = get_symtab_upper_bound (abfd);
2724 abfd->outsymbols = (asymbol **) bfd_alloc (abfd, symsize);
2725 if (!abfd->outsymbols)
2726 {
2727 bfd_set_error (bfd_error_no_memory);
2728 abort ();
2729 }
2730 abfd->symcount = bfd_canonicalize_symtab (abfd, abfd->outsymbols);
2731 }
2732
2733 /* Now get the relocations. */
2734 bfd_canonicalize_reloc (abfd, asec, reloc_vector,
2735 bfd_get_outsymbols (abfd));
2736
2737 /* Examine each relocation entry in this section. */
2738 for (i = 0; i < asec->reloc_count; i++)
2739 {
2740 arelent *rle = reloc_vector[i];
2741
2742 switch (rle->howto->type)
2743 {
2744 /* Any call could need argument relocation stubs, and
2745 some may need long-call stubs. */
2746 case R_HPPA_ABS_CALL_11:
2747 case R_HPPA_ABS_CALL_14:
2748 case R_HPPA_ABS_CALL_17:
2749 case R_HPPA_ABS_CALL_L21:
2750 case R_HPPA_ABS_CALL_R11:
2751 case R_HPPA_ABS_CALL_R14:
2752 case R_HPPA_ABS_CALL_R17:
2753 case R_HPPA_ABS_CALL_LS21:
2754 case R_HPPA_ABS_CALL_RS11:
2755 case R_HPPA_ABS_CALL_RS14:
2756 case R_HPPA_ABS_CALL_RS17:
2757 case R_HPPA_ABS_CALL_LD21:
2758 case R_HPPA_ABS_CALL_RD11:
2759 case R_HPPA_ABS_CALL_RD14:
2760 case R_HPPA_ABS_CALL_RD17:
2761 case R_HPPA_ABS_CALL_LR21:
2762 case R_HPPA_ABS_CALL_RR14:
2763 case R_HPPA_ABS_CALL_RR17:
2764 case R_HPPA_PCREL_CALL_11:
2765 case R_HPPA_PCREL_CALL_14:
2766 case R_HPPA_PCREL_CALL_17:
2767 case R_HPPA_PCREL_CALL_12:
2768 case R_HPPA_PCREL_CALL_L21:
2769 case R_HPPA_PCREL_CALL_R11:
2770 case R_HPPA_PCREL_CALL_R14:
2771 case R_HPPA_PCREL_CALL_R17:
2772 case R_HPPA_PCREL_CALL_LS21:
2773 case R_HPPA_PCREL_CALL_RS11:
2774 case R_HPPA_PCREL_CALL_RS14:
2775 case R_HPPA_PCREL_CALL_RS17:
2776 case R_HPPA_PCREL_CALL_LD21:
2777 case R_HPPA_PCREL_CALL_RD11:
2778 case R_HPPA_PCREL_CALL_RD14:
2779 case R_HPPA_PCREL_CALL_RD17:
2780 case R_HPPA_PCREL_CALL_LR21:
2781 case R_HPPA_PCREL_CALL_RR14:
2782 case R_HPPA_PCREL_CALL_RR17:
2783 {
2784 symext_entryS caller_ar
2785 = (symext_entryS) HPPA_R_ARG_RELOC (rle->addend);
2786 unsigned insn[2];
2787
2788 /* We'll need this for the long-call checks. */
2789 bfd_get_section_contents (abfd, asec, insn, rle->address,
2790 sizeof(insn));
2791
2792 /* See if this call needs an argument relocation stub. */
2793 if (hppa_elf_arg_reloc_needed_p (abfd, rle, stub_types,
2794 caller_ar))
2795 {
2796 /* Generate a stub and keep track of the new symbol. */
2797 asymbol *r;
2798
2799 if (new_cnt == new_max)
2800 {
2801 new_max += STUB_SYM_BUFFER_INC;
2802 new_syms = (asymbol *)
2803 realloc (new_syms, new_max * sizeof (asymbol));
2804 if (new_syms == NULL)
2805 abort ();
2806 }
2807
2808 /* Build the argument relocation stub. */
2809 r = hppa_elf_build_linker_stub (stub_bfd, output_bfd,
2810 link_info, rle,
2811 stub_types, true, insn,
2812 HPPA_STUB_ARG_RELOC);
2813 new_syms[new_cnt++] = *r;
2814 }
2815
2816 /* See if this call needs a long-call stub. */
2817 if (hppa_elf_long_branch_needed_p (abfd, asec, rle,
2818 rle->sym_ptr_ptr[0],
2819 insn[0]))
2820 {
2821 /* Generate a stub and keep track of the new symbol. */
2822 asymbol *r;
2823
2824 if (new_cnt == new_max)
2825 {
2826 new_max += STUB_SYM_BUFFER_INC;
2827 new_syms = (asymbol *)
2828 realloc (new_syms, (new_max * sizeof (asymbol)));
2829 if (! new_syms)
2830 abort ();
2831 }
2832
2833 /* Build the long-call stub. */
2834 r = hppa_elf_build_linker_stub (stub_bfd, output_bfd,
2835 link_info, rle,
2836 NULL, true, insn,
2837 HPPA_STUB_LONG_CALL);
2838 new_syms[new_cnt++] = *r;
2839 }
2840 }
2841 break;
2842
2843 /* PLABELs may need argument relocation stubs. */
2844 case R_HPPA_PLABEL_32:
2845 case R_HPPA_PLABEL_11:
2846 case R_HPPA_PLABEL_14:
2847 case R_HPPA_PLABEL_L21:
2848 case R_HPPA_PLABEL_R11:
2849 case R_HPPA_PLABEL_R14:
2850 {
2851 /* On a plabel relocation, assume the arguments of the
2852 caller are set up in general registers (indirect
2853 calls only use general registers.
2854 NOTE: 0x155 = ARGW0=GR,ARGW1=GR,ARGW2=GR,RETVAL=GR. */
2855 symext_entryS caller_ar = (symext_entryS) 0x155;
2856 unsigned insn[2];
2857
2858 /* Do we really need this? */
2859 bfd_get_section_contents (abfd, asec, insn, rle->address,
2860 sizeof(insn));
2861
2862 /* See if this call needs an argument relocation stub. */
2863 if (hppa_elf_arg_reloc_needed_p (abfd, rle, stub_types,
2864 caller_ar))
2865 {
2866 /* Generate a plabel stub and keep track of the
2867 new symbol. */
2868 asymbol *r;
2869 int rtn_adjust;
2870
2871 if (new_cnt == new_max)
2872 {
2873 new_max += STUB_SYM_BUFFER_INC;
2874 new_syms = (asymbol *) realloc (new_syms, new_max
2875 * sizeof (asymbol));
2876 }
2877
2878 /* Determine whether a return adjustment
2879 (see the relocation code for relocation type
2880 R_HPPA_STUB_CALL_17) is possible. Basically,
2881 determine whether we are looking at a branch or not. */
2882 if (rle->howto->type == R_HPPA_PLABEL_32)
2883 rtn_adjust = false;
2884 else
2885 {
2886 switch (get_opcode(insn[0]))
2887 {
2888 case BLE:
2889 case BE:
2890 rtn_adjust = true;
2891 break;
2892 default:
2893 rtn_adjust = false;
2894 }
2895 }
2896
2897 /* Build the argument relocation stub. */
2898 r = hppa_elf_build_linker_stub (stub_bfd, output_bfd,
2899 link_info, rle, stub_types,
2900 rtn_adjust, insn,
2901 HPPA_STUB_ARG_RELOC);
2902 new_syms[new_cnt++] = *r;
2903 }
2904 }
2905 break;
2906
2907 default:
2908 break;
2909 }
2910 }
2911 }
2912
2913 /* Return the new symbols and update the counters. */
2914 *new_sym_cnt = new_cnt;
2915 return new_syms;
2916 }
2917
2918 /* Set the contents of a particular section at a particular location. */
2919
2920 static boolean
2921 hppa_elf_set_section_contents (abfd, section, location, offset, count)
2922 bfd *abfd;
2923 sec_ptr section;
2924 PTR location;
2925 file_ptr offset;
2926 bfd_size_type count;
2927 {
2928 /* Linker stubs are handled a little differently. */
2929 if (! strcmp (section->name, ".hppa_linker_stubs"))
2930 {
2931 if (linker_stubs_max_size < offset + count)
2932 {
2933 linker_stubs_max_size = offset + count + STUB_ALLOC_INCR;
2934 linker_stubs = (char *)realloc (linker_stubs, linker_stubs_max_size);
2935 if (! linker_stubs)
2936 abort ();
2937 }
2938
2939 if (offset + count > linker_stubs_size)
2940 linker_stubs_size = offset + count;
2941
2942 /* Set the contents. */
2943 memcpy(linker_stubs + offset, location, count);
2944 return (true);
2945 }
2946 else
2947 /* For everything but the linker stub section, use the generic
2948 code. */
2949 return bfd_elf32_set_section_contents (abfd, section, location,
2950 offset, count);
2951 }
2952
2953 /* Get the contents of the given section.
2954
2955 This is special for PA ELF because some sections (such as linker stubs)
2956 may reside in memory rather than on disk, or in the case of the symbol
2957 extension section, the contents may need to be generated from other
2958 information contained in the BFD. */
2959
2960 boolean
2961 hppa_elf_get_section_contents (abfd, section, location, offset, count)
2962 bfd *abfd;
2963 sec_ptr section;
2964 PTR location;
2965 file_ptr offset;
2966 bfd_size_type count;
2967 {
2968 /* If this is the linker stub section, then its contents are contained
2969 in memory rather than on disk. FIXME. Is that always right? What
2970 about the case where a final executable is read in and a user tries
2971 to get the contents of this section? In that case the contents would
2972 be on disk like everything else. */
2973 if (strcmp (section->name, ".hppa_linker_stubs") == 0)
2974 {
2975 elf32_hppa_stub_description *stub_desc = find_stubs (abfd, section);
2976
2977 if (count == 0)
2978 return true;
2979
2980 /* Sanity check our arguments. */
2981 if ((bfd_size_type) (offset + count) > section->_raw_size
2982 || (bfd_size_type) (offset + count) > stub_desc->real_size)
2983 return (false);
2984
2985 memcpy (location, stub_desc->stub_contents + offset, count);
2986 return (true);
2987 }
2988
2989 /* The symbol extension section also needs special handling. Its
2990 contents might be on the disk, in memory, or still need to
2991 be generated. */
2992 else if (strcmp (section->name, ".hppa_symextn") == 0)
2993 {
2994 /* If there are no output sections, then read the contents of the
2995 symbol extension section from disk. */
2996 if (section->output_section == NULL
2997 && abfd->direction == read_direction)
2998 {
2999 return bfd_generic_get_section_contents (abfd, section, location,
3000 offset, count);
3001 }
3002
3003 /* If this is the first time through, and there are output sections,
3004 then build the symbol extension section based on other information
3005 contained in the BFD. */
3006 else if (! symext_chain_built)
3007 {
3008 int i;
3009 int *symtab_map =
3010 (int *) elf_sym_extra (section->output_section->owner);
3011
3012 for (i = 0; i < section->output_section->owner->symcount; i++)
3013 {
3014 elf_hppa_tc_symbol (section->output_section->owner,
3015 ((elf_symbol_type *)
3016 section->output_section->owner->outsymbols[i]),
3017 symtab_map[i], &symext_rootP, &symext_lastP);
3018 }
3019 symext_chain_built++;
3020 elf_hppa_tc_make_sections (section->output_section->owner,
3021 symext_rootP);
3022 }
3023
3024 /* At this point we know that the symbol extension section has been
3025 built. We just need to copy it into the user's buffer. */
3026 if (count == 0)
3027 return true;
3028
3029 /* Sanity check our arguments. */
3030 if ((bfd_size_type) (offset + count) > section->_raw_size
3031 || (bfd_size_type) (offset + count) > symextn_contents_real_size)
3032 return (false);
3033
3034 memcpy (location,
3035 (char *)symextn_contents + section->output_offset + offset,
3036 count);
3037 return (true);
3038 }
3039 else
3040 /* It's not the symbol extension or linker stub sections, use
3041 the generic routines. */
3042 return bfd_generic_get_section_contents (abfd, section, location,
3043 offset, count);
3044 }
3045
3046 /* Translate from an elf into field into a howto relocation pointer. */
3047
3048 static void
3049 elf_info_to_howto (abfd, cache_ptr, dst)
3050 bfd *abfd;
3051 arelent *cache_ptr;
3052 Elf32_Internal_Rela *dst;
3053 {
3054 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_HPPA_UNIMPLEMENTED);
3055 cache_ptr->howto = &elf_hppa_howto_table[ELF32_R_TYPE (dst->r_info)];
3056 }
3057
3058 /* Do PA ELF specific processing for symbols. Needed to find the
3059 value of $global$. */
3060
3061 static void
3062 elf32_hppa_backend_symbol_processing (abfd, sym)
3063 bfd *abfd;
3064 asymbol *sym;
3065 {
3066 /* Is this a definition of $global$? If so, keep it because it will be
3067 needed if any relocations are performed. */
3068 if (!strcmp (sym->name, "$global$")
3069 && sym->section != &bfd_und_section)
3070 {
3071 global_symbol = sym;
3072 }
3073 }
3074
3075 /* Do some PA ELF specific work after reading in the symbol table.
3076 In particular attach the argument relocation from the
3077 symbol extension section to the appropriate symbols. */
3078 static boolean
3079 elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt)
3080 bfd *abfd;
3081 elf_symbol_type *esyms;
3082 int symcnt;
3083 {
3084 Elf32_Internal_Shdr *symextn_hdr =
3085 bfd_elf_find_section (abfd, SYMEXTN_SECTION_NAME);
3086 int i, current_sym_idx = 0;
3087
3088 /* If no symbol extension existed, then all symbol extension information
3089 is assumed to be zero. */
3090 if (symextn_hdr == NULL)
3091 {
3092 for (i = 0; i < symcnt; i++)
3093 esyms[i].tc_data.hppa_arg_reloc = 0;
3094 return (true);
3095 }
3096
3097 /* Allocate a buffer of the appropriate size for the symextn section. */
3098 symextn_hdr->contents = bfd_zalloc(abfd,symextn_hdr->sh_size);
3099 if (!symextn_hdr->contents)
3100 {
3101 bfd_set_error (bfd_error_no_memory);
3102 return false;
3103 }
3104 symextn_hdr->size = symextn_hdr->sh_size;
3105
3106 /* Read in the symextn section. */
3107 if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1)
3108 {
3109 bfd_set_error (bfd_error_system_call);
3110 return (false);
3111 }
3112 if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->size, abfd)
3113 != symextn_hdr->size)
3114 {
3115 bfd_set_error (bfd_error_system_call);
3116 return (false);
3117 }
3118
3119 /* Parse entries in the symbol extension section, updating the symtab
3120 entries as we go */
3121 for (i = 0; i < symextn_hdr->size / sizeof(symext_entryS); i++)
3122 {
3123 symext_entryS *seP = ((symext_entryS *)symextn_hdr->contents) + i;
3124 int se_value = ELF32_HPPA_SX_VAL (*seP);
3125 int se_type = ELF32_HPPA_SX_TYPE (*seP);
3126
3127 switch (se_type)
3128 {
3129 case HPPA_SXT_NULL:
3130 break;
3131
3132 case HPPA_SXT_SYMNDX:
3133 if (se_value >= symcnt)
3134 {
3135 bfd_set_error (bfd_error_bad_value);
3136 return (false);
3137 }
3138 current_sym_idx = se_value - 1;
3139 break;
3140
3141 case HPPA_SXT_ARG_RELOC:
3142 esyms[current_sym_idx].tc_data.hppa_arg_reloc = se_value;
3143 break;
3144
3145 default:
3146 bfd_set_error (bfd_error_bad_value);
3147 return (false);
3148 }
3149 }
3150 return (true);
3151 }
3152
3153 /* Perform on PA ELF specific processing once a section has been
3154 read in. In particular keep the symbol indexes correct for
3155 the symbol extension information. */
3156
3157 static boolean
3158 elf32_hppa_backend_section_processing (abfd, secthdr)
3159 bfd *abfd;
3160 Elf32_Internal_Shdr *secthdr;
3161 {
3162 int i, j, k;
3163
3164 if (secthdr->sh_type == SHT_HPPA_SYMEXTN)
3165 {
3166 for (i = 0; i < secthdr->size / sizeof (symext_entryS); i++)
3167 {
3168 symext_entryS *seP = ((symext_entryS *)secthdr->contents) + i;
3169 int se_value = ELF32_HPPA_SX_VAL (*seP);
3170 int se_type = ELF32_HPPA_SX_TYPE (*seP);
3171
3172 switch (se_type)
3173 {
3174 case HPPA_SXT_NULL:
3175 break;
3176
3177 case HPPA_SXT_SYMNDX:
3178 for (j = 0; j < abfd->symcount; j++)
3179 {
3180 /* Locate the map entry for this symbol and modify the
3181 symbol extension section symbol index entry to reflect
3182 the new symbol table index. */
3183 for (k = 0; k < elf32_hppa_symextn_map_size; k++)
3184 {
3185 if (elf32_hppa_symextn_map[k].old_index == se_value
3186 && elf32_hppa_symextn_map[k].bfd
3187 == abfd->outsymbols[j]->the_bfd
3188 && elf32_hppa_symextn_map[k].sym
3189 == abfd->outsymbols[j])
3190 {
3191 bfd_put_32(abfd,
3192 ELF32_HPPA_SX_WORD (HPPA_SXT_SYMNDX, j),
3193 (char *)seP);
3194 }
3195 }
3196 }
3197 break;
3198
3199 case HPPA_SXT_ARG_RELOC:
3200 break;
3201
3202 default:
3203 bfd_set_error (bfd_error_bad_value);
3204 return (false);
3205 }
3206 }
3207 }
3208 return true;
3209 }
3210
3211 /* What does this really do? Just determine if there is an appropriate
3212 mapping from ELF section headers to backend sections? More symbol
3213 extension braindamage. */
3214
3215 static boolean
3216 elf32_hppa_backend_section_from_shdr (abfd, hdr, name)
3217 bfd *abfd;
3218 Elf32_Internal_Shdr *hdr;
3219 char *name;
3220 {
3221 asection *newsect;
3222
3223 if (hdr->sh_type == SHT_HPPA_SYMEXTN)
3224 {
3225 BFD_ASSERT (strcmp (name, ".hppa_symextn") == 0);
3226
3227 /* Bits that get saved. This one is real. */
3228 if (!hdr->rawdata)
3229 {
3230 newsect = bfd_make_section (abfd, name);
3231 if (newsect != NULL)
3232 {
3233 newsect->vma = hdr->sh_addr;
3234 newsect->_raw_size = hdr->sh_size;
3235 newsect->filepos = hdr->sh_offset;
3236 newsect->flags |= SEC_HAS_CONTENTS;
3237 newsect->alignment_power = hdr->sh_addralign;
3238
3239 if (hdr->sh_flags & SHF_ALLOC)
3240 {
3241 newsect->flags |= SEC_ALLOC;
3242 newsect->flags |= SEC_LOAD;
3243 }
3244
3245 if (!(hdr->sh_flags & SHF_WRITE))
3246 newsect->flags |= SEC_READONLY;
3247
3248 if (hdr->sh_flags & SHF_EXECINSTR)
3249 newsect->flags |= SEC_CODE;
3250 else
3251 newsect->flags |= SEC_DATA;
3252
3253 hdr->rawdata = (void *) newsect;
3254 }
3255 }
3256 return true;
3257 }
3258 return false;
3259 }
3260
3261 /* Return true if the given section is a fake section. */
3262
3263 static boolean
3264 elf32_hppa_backend_fake_sections (abfd, secthdr, asect)
3265 bfd *abfd;
3266 Elf_Internal_Shdr *secthdr;
3267 asection *asect;
3268 {
3269
3270 if (strcmp(asect->name, ".hppa_symextn") == 0)
3271 {
3272 secthdr->sh_type = SHT_HPPA_SYMEXTN;
3273 secthdr->sh_flags = 0;
3274 secthdr->sh_info = elf_section_data(asect)->rel_hdr.sh_link;
3275 secthdr->sh_link = elf_onesymtab(abfd);
3276 return true;
3277 }
3278
3279 if (!strcmp (asect->name, ".hppa_unwind"))
3280 {
3281 secthdr->sh_type = SHT_PROGBITS;
3282 /* Unwind descriptors are not part of the program memory image. */
3283 secthdr->sh_flags = 0;
3284 secthdr->sh_info = 0;
3285 secthdr->sh_link = 0;
3286 secthdr->sh_entsize = 16;
3287 return true;
3288 }
3289
3290 /* @@ Should this be CPU specific?? KR */
3291 if (!strcmp (asect->name, ".stabstr"))
3292 {
3293 secthdr->sh_type = SHT_STRTAB;
3294 secthdr->sh_flags = 0;
3295 secthdr->sh_info = 0;
3296 secthdr->sh_link = 0;
3297 secthdr->sh_entsize = 0;
3298 return true;
3299 }
3300
3301 return false;
3302 }
3303
3304 /* Return true if there is a mapping from bfd section into a
3305 backend section. */
3306
3307 static boolean
3308 elf32_hppa_backend_section_from_bfd_section (abfd, hdr, asect, ignored)
3309 bfd *abfd;
3310 Elf32_Internal_Shdr *hdr;
3311 asection *asect;
3312 int *ignored;
3313 {
3314 if (hdr->sh_type == SHT_HPPA_SYMEXTN)
3315 {
3316 if (hdr->rawdata)
3317 {
3318 if (((struct sec *) (hdr->rawdata)) == asect)
3319 {
3320 BFD_ASSERT (strcmp (asect->name, ".hppa_symextn") == 0);
3321 return true;
3322 }
3323 }
3324 }
3325 else if (hdr->sh_type == SHT_STRTAB)
3326 {
3327 if (hdr->rawdata)
3328 {
3329 if (((struct sec *) (hdr->rawdata)) == asect)
3330 {
3331 BFD_ASSERT (strcmp (asect->name, ".stabstr") == 0);
3332 return true;
3333 }
3334 }
3335 }
3336
3337 return false;
3338 }
3339
3340 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
3341 #define elf_backend_section_from_bfd_section elf32_hppa_backend_section_from_bfd_section
3342
3343 #define elf_backend_symbol_processing elf32_hppa_backend_symbol_processing
3344 #define elf_backend_symbol_table_processing elf32_hppa_backend_symbol_table_processing
3345
3346 #define bfd_generic_get_section_contents hppa_elf_get_section_contents
3347 #define bfd_elf32_set_section_contents hppa_elf_set_section_contents
3348
3349 #define elf_backend_section_processing elf32_hppa_backend_section_processing
3350
3351 #define elf_backend_section_from_shdr elf32_hppa_backend_section_from_shdr
3352 #define elf_backend_fake_sections elf32_hppa_backend_fake_sections
3353
3354 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
3355 #define TARGET_BIG_NAME "elf32-hppa"
3356 #define ELF_ARCH bfd_arch_hppa
3357 #define ELF_MACHINE_CODE EM_HPPA
3358 #define ELF_MAXPAGESIZE 0x1000
3359
3360 #include "elf32-target.h"