* gettext.m4: Properly quote arguments to AC_DEFUN.
[deliverable/binutils-gdb.git] / bfd / elf32-xtensa.c
CommitLineData
e0001a05
NC
1/* Xtensa-specific support for 32-bit ELF.
2 Copyright 2003 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
20
21#include "bfd.h"
22#include "sysdep.h"
23
24#ifdef ANSI_PROTOTYPES
25#include <stdarg.h>
26#else
27#include <varargs.h>
28#endif
29#include <strings.h>
30
31#include "bfdlink.h"
32#include "libbfd.h"
33#include "elf-bfd.h"
34#include "elf/xtensa.h"
35#include "xtensa-isa.h"
36#include "xtensa-config.h"
37
38/* Main interface functions. */
39static void elf_xtensa_info_to_howto_rela
40 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
41static reloc_howto_type *elf_xtensa_reloc_type_lookup
42 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
43extern int xtensa_read_table_entries
44 PARAMS ((bfd *, asection *, property_table_entry **, const char *));
45static bfd_boolean elf_xtensa_check_relocs
46 PARAMS ((bfd *, struct bfd_link_info *, asection *,
47 const Elf_Internal_Rela *));
48static void elf_xtensa_hide_symbol
49 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean));
50static void elf_xtensa_copy_indirect_symbol
9c5bfbb7 51 PARAMS ((const struct elf_backend_data *, struct elf_link_hash_entry *,
e0001a05
NC
52 struct elf_link_hash_entry *));
53static asection *elf_xtensa_gc_mark_hook
54 PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
55 struct elf_link_hash_entry *, Elf_Internal_Sym *));
56static bfd_boolean elf_xtensa_gc_sweep_hook
57 PARAMS ((bfd *, struct bfd_link_info *, asection *,
58 const Elf_Internal_Rela *));
59static bfd_boolean elf_xtensa_create_dynamic_sections
60 PARAMS ((bfd *, struct bfd_link_info *));
61static bfd_boolean elf_xtensa_adjust_dynamic_symbol
62 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
63static bfd_boolean elf_xtensa_size_dynamic_sections
64 PARAMS ((bfd *, struct bfd_link_info *));
65static bfd_boolean elf_xtensa_modify_segment_map
66 PARAMS ((bfd *));
67static bfd_boolean elf_xtensa_relocate_section
68 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
69 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
70static bfd_boolean elf_xtensa_relax_section
71 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *again));
72static bfd_boolean elf_xtensa_finish_dynamic_symbol
73 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
74 Elf_Internal_Sym *));
75static bfd_boolean elf_xtensa_finish_dynamic_sections
76 PARAMS ((bfd *, struct bfd_link_info *));
77static bfd_boolean elf_xtensa_merge_private_bfd_data
78 PARAMS ((bfd *, bfd *));
79static bfd_boolean elf_xtensa_set_private_flags
80 PARAMS ((bfd *, flagword));
81extern flagword elf_xtensa_get_private_bfd_flags
82 PARAMS ((bfd *));
83static bfd_boolean elf_xtensa_print_private_bfd_data
84 PARAMS ((bfd *, PTR));
85static bfd_boolean elf_xtensa_object_p
86 PARAMS ((bfd *));
87static void elf_xtensa_final_write_processing
88 PARAMS ((bfd *, bfd_boolean));
89static enum elf_reloc_type_class elf_xtensa_reloc_type_class
90 PARAMS ((const Elf_Internal_Rela *));
91static bfd_boolean elf_xtensa_discard_info
92 PARAMS ((bfd *, struct elf_reloc_cookie *, struct bfd_link_info *));
93static bfd_boolean elf_xtensa_ignore_discarded_relocs
94 PARAMS ((asection *));
95static bfd_boolean elf_xtensa_grok_prstatus
96 PARAMS ((bfd *, Elf_Internal_Note *));
97static bfd_boolean elf_xtensa_grok_psinfo
98 PARAMS ((bfd *, Elf_Internal_Note *));
99static bfd_boolean elf_xtensa_new_section_hook
100 PARAMS ((bfd *, asection *));
101
102
103/* Local helper functions. */
104
571b5725
BW
105static bfd_boolean xtensa_elf_dynamic_symbol_p
106 PARAMS ((struct elf_link_hash_entry *, struct bfd_link_info *));
e0001a05
NC
107static int property_table_compare
108 PARAMS ((const PTR, const PTR));
109static bfd_boolean elf_xtensa_in_literal_pool
110 PARAMS ((property_table_entry *, int, bfd_vma));
111static void elf_xtensa_make_sym_local
112 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
113static bfd_boolean add_extra_plt_sections
114 PARAMS ((bfd *, int));
115static bfd_boolean elf_xtensa_fix_refcounts
116 PARAMS ((struct elf_link_hash_entry *, PTR));
117static bfd_boolean elf_xtensa_allocate_plt_size
118 PARAMS ((struct elf_link_hash_entry *, PTR));
119static bfd_boolean elf_xtensa_allocate_got_size
120 PARAMS ((struct elf_link_hash_entry *, PTR));
121static void elf_xtensa_allocate_local_got_size
122 PARAMS ((struct bfd_link_info *, asection *));
123static bfd_reloc_status_type elf_xtensa_do_reloc
124 PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_vma, bfd_byte *,
125 bfd_vma, bfd_boolean, char **));
126static char * vsprint_msg
127 VPARAMS ((const char *, const char *, int, ...));
128static char *build_encoding_error_message
129 PARAMS ((xtensa_opcode, xtensa_encode_result));
130static bfd_reloc_status_type bfd_elf_xtensa_reloc
131 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
1049f94e 132static void do_fix_for_relocatable_link
e0001a05
NC
133 PARAMS ((Elf_Internal_Rela *, bfd *, asection *));
134static void do_fix_for_final_link
135 PARAMS ((Elf_Internal_Rela *, asection *, bfd_vma *));
e0001a05
NC
136static bfd_vma elf_xtensa_create_plt_entry
137 PARAMS ((bfd *, bfd *, unsigned));
138static int elf_xtensa_combine_prop_entries
e901de89 139 PARAMS ((bfd *, asection *, asection *));
e0001a05
NC
140static bfd_boolean elf_xtensa_discard_info_for_section
141 PARAMS ((bfd *, struct elf_reloc_cookie *, struct bfd_link_info *,
142 asection *));
143
144/* Local functions to handle Xtensa configurability. */
145
146static void init_call_opcodes
147 PARAMS ((void));
148static bfd_boolean is_indirect_call_opcode
149 PARAMS ((xtensa_opcode));
150static bfd_boolean is_direct_call_opcode
151 PARAMS ((xtensa_opcode));
152static bfd_boolean is_windowed_call_opcode
153 PARAMS ((xtensa_opcode));
154static xtensa_opcode get_l32r_opcode
155 PARAMS ((void));
156static bfd_vma l32r_offset
157 PARAMS ((bfd_vma, bfd_vma));
158static int get_relocation_opnd
159 PARAMS ((Elf_Internal_Rela *));
160static xtensa_opcode get_relocation_opcode
161 PARAMS ((asection *, bfd_byte *, Elf_Internal_Rela *));
162static bfd_boolean is_l32r_relocation
163 PARAMS ((asection *, bfd_byte *, Elf_Internal_Rela *));
164
165/* Functions for link-time code simplifications. */
166
167static bfd_reloc_status_type elf_xtensa_do_asm_simplify
168 PARAMS ((bfd_byte *, bfd_vma, bfd_vma));
169static bfd_reloc_status_type contract_asm_expansion
170 PARAMS ((bfd_byte *, bfd_vma, Elf_Internal_Rela *));
171static xtensa_opcode swap_callx_for_call_opcode
172 PARAMS ((xtensa_opcode));
173static xtensa_opcode get_expanded_call_opcode
174 PARAMS ((bfd_byte *, int));
175
176/* Access to internal relocations, section contents and symbols. */
177
178static Elf_Internal_Rela *retrieve_internal_relocs
179 PARAMS ((bfd *, asection *, bfd_boolean));
180static void pin_internal_relocs
181 PARAMS ((asection *, Elf_Internal_Rela *));
182static void release_internal_relocs
183 PARAMS ((asection *, Elf_Internal_Rela *));
184static bfd_byte *retrieve_contents
185 PARAMS ((bfd *, asection *, bfd_boolean));
186static void pin_contents
187 PARAMS ((asection *, bfd_byte *));
188static void release_contents
189 PARAMS ((asection *, bfd_byte *));
190static Elf_Internal_Sym *retrieve_local_syms
191 PARAMS ((bfd *));
192
193/* Miscellaneous utility functions. */
194
195static asection *elf_xtensa_get_plt_section
196 PARAMS ((bfd *, int));
197static asection *elf_xtensa_get_gotplt_section
198 PARAMS ((bfd *, int));
199static asection *get_elf_r_symndx_section
200 PARAMS ((bfd *, unsigned long));
201static struct elf_link_hash_entry *get_elf_r_symndx_hash_entry
202 PARAMS ((bfd *, unsigned long));
203static bfd_vma get_elf_r_symndx_offset
204 PARAMS ((bfd *, unsigned long));
205static bfd_boolean pcrel_reloc_fits
206 PARAMS ((xtensa_operand, bfd_vma, bfd_vma));
207static bfd_boolean xtensa_is_property_section
208 PARAMS ((asection *));
e901de89
BW
209static bfd_boolean xtensa_is_littable_section
210 PARAMS ((asection *));
e0001a05
NC
211static bfd_boolean is_literal_section
212 PARAMS ((asection *));
213static int internal_reloc_compare
214 PARAMS ((const PTR, const PTR));
215static bfd_boolean get_is_linkonce_section
216 PARAMS ((bfd *, asection *));
217extern char *xtensa_get_property_section_name
218 PARAMS ((bfd *, asection *, const char *));
219
220/* Other functions called directly by the linker. */
221
222typedef void (*deps_callback_t)
223 PARAMS ((asection *, bfd_vma, asection *, bfd_vma, PTR));
224extern bfd_boolean xtensa_callback_required_dependence
225 PARAMS ((bfd *, asection *, struct bfd_link_info *,
226 deps_callback_t, PTR));
227
228
229typedef struct xtensa_relax_info_struct xtensa_relax_info;
230
231
232/* Total count of PLT relocations seen during check_relocs.
233 The actual PLT code must be split into multiple sections and all
234 the sections have to be created before size_dynamic_sections,
235 where we figure out the exact number of PLT entries that will be
b536dc1e 236 needed. It is OK if this count is an overestimate, e.g., some
e0001a05
NC
237 relocations may be removed by GC. */
238
239static int plt_reloc_count = 0;
240
241
242/* When this is true, relocations may have been modified to refer to
243 symbols from other input files. The per-section list of "fix"
244 records needs to be checked when resolving relocations. */
245
246static bfd_boolean relaxing_section = FALSE;
247
248\f
249static reloc_howto_type elf_howto_table[] =
250{
251 HOWTO (R_XTENSA_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
252 bfd_elf_xtensa_reloc, "R_XTENSA_NONE",
253 FALSE, 0x00000000, 0x00000000, FALSE),
254 HOWTO (R_XTENSA_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
255 bfd_elf_xtensa_reloc, "R_XTENSA_32",
256 TRUE, 0xffffffff, 0xffffffff, FALSE),
257 /* Replace a 32-bit value with a value from the runtime linker (only
258 used by linker-generated stub functions). The r_addend value is
259 special: 1 means to substitute a pointer to the runtime linker's
260 dynamic resolver function; 2 means to substitute the link map for
261 the shared object. */
262 HOWTO (R_XTENSA_RTLD, 0, 2, 32, FALSE, 0, complain_overflow_dont,
263 NULL, "R_XTENSA_RTLD",
264 FALSE, 0x00000000, 0x00000000, FALSE),
265 HOWTO (R_XTENSA_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
266 bfd_elf_generic_reloc, "R_XTENSA_GLOB_DAT",
267 FALSE, 0xffffffff, 0xffffffff, FALSE),
268 HOWTO (R_XTENSA_JMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
269 bfd_elf_generic_reloc, "R_XTENSA_JMP_SLOT",
270 FALSE, 0xffffffff, 0xffffffff, FALSE),
271 HOWTO (R_XTENSA_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
272 bfd_elf_generic_reloc, "R_XTENSA_RELATIVE",
273 FALSE, 0xffffffff, 0xffffffff, FALSE),
274 HOWTO (R_XTENSA_PLT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
275 bfd_elf_xtensa_reloc, "R_XTENSA_PLT",
276 FALSE, 0xffffffff, 0xffffffff, FALSE),
277 EMPTY_HOWTO (7),
278 HOWTO (R_XTENSA_OP0, 0, 0, 0, TRUE, 0, complain_overflow_dont,
279 bfd_elf_xtensa_reloc, "R_XTENSA_OP0",
280 FALSE, 0x00000000, 0x00000000, TRUE),
281 HOWTO (R_XTENSA_OP1, 0, 0, 0, TRUE, 0, complain_overflow_dont,
282 bfd_elf_xtensa_reloc, "R_XTENSA_OP1",
283 FALSE, 0x00000000, 0x00000000, TRUE),
284 HOWTO (R_XTENSA_OP2, 0, 0, 0, TRUE, 0, complain_overflow_dont,
285 bfd_elf_xtensa_reloc, "R_XTENSA_OP2",
286 FALSE, 0x00000000, 0x00000000, TRUE),
287 /* Assembly auto-expansion. */
288 HOWTO (R_XTENSA_ASM_EXPAND, 0, 0, 0, TRUE, 0, complain_overflow_dont,
289 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_EXPAND",
290 FALSE, 0x00000000, 0x00000000, FALSE),
291 /* Relax assembly auto-expansion. */
292 HOWTO (R_XTENSA_ASM_SIMPLIFY, 0, 0, 0, TRUE, 0, complain_overflow_dont,
293 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_SIMPLIFY",
294 FALSE, 0x00000000, 0x00000000, TRUE),
295 EMPTY_HOWTO (13),
296 EMPTY_HOWTO (14),
297 /* GNU extension to record C++ vtable hierarchy. */
298 HOWTO (R_XTENSA_GNU_VTINHERIT, 0, 2, 0, FALSE, 0, complain_overflow_dont,
299 NULL, "R_XTENSA_GNU_VTINHERIT",
300 FALSE, 0x00000000, 0x00000000, FALSE),
301 /* GNU extension to record C++ vtable member usage. */
302 HOWTO (R_XTENSA_GNU_VTENTRY, 0, 2, 0, FALSE, 0, complain_overflow_dont,
303 _bfd_elf_rel_vtable_reloc_fn, "R_XTENSA_GNU_VTENTRY",
304 FALSE, 0x00000000, 0x00000000, FALSE)
305};
306
307#ifdef DEBUG_GEN_RELOC
308#define TRACE(str) \
309 fprintf (stderr, "Xtensa bfd reloc lookup %d (%s)\n", code, str)
310#else
311#define TRACE(str)
312#endif
313
314static reloc_howto_type *
315elf_xtensa_reloc_type_lookup (abfd, code)
316 bfd *abfd ATTRIBUTE_UNUSED;
317 bfd_reloc_code_real_type code;
318{
319 switch (code)
320 {
321 case BFD_RELOC_NONE:
322 TRACE ("BFD_RELOC_NONE");
323 return &elf_howto_table[(unsigned) R_XTENSA_NONE ];
324
325 case BFD_RELOC_32:
326 TRACE ("BFD_RELOC_32");
327 return &elf_howto_table[(unsigned) R_XTENSA_32 ];
328
329 case BFD_RELOC_XTENSA_RTLD:
330 TRACE ("BFD_RELOC_XTENSA_RTLD");
331 return &elf_howto_table[(unsigned) R_XTENSA_RTLD ];
332
333 case BFD_RELOC_XTENSA_GLOB_DAT:
334 TRACE ("BFD_RELOC_XTENSA_GLOB_DAT");
335 return &elf_howto_table[(unsigned) R_XTENSA_GLOB_DAT ];
336
337 case BFD_RELOC_XTENSA_JMP_SLOT:
338 TRACE ("BFD_RELOC_XTENSA_JMP_SLOT");
339 return &elf_howto_table[(unsigned) R_XTENSA_JMP_SLOT ];
340
341 case BFD_RELOC_XTENSA_RELATIVE:
342 TRACE ("BFD_RELOC_XTENSA_RELATIVE");
343 return &elf_howto_table[(unsigned) R_XTENSA_RELATIVE ];
344
345 case BFD_RELOC_XTENSA_PLT:
346 TRACE ("BFD_RELOC_XTENSA_PLT");
347 return &elf_howto_table[(unsigned) R_XTENSA_PLT ];
348
349 case BFD_RELOC_XTENSA_OP0:
350 TRACE ("BFD_RELOC_XTENSA_OP0");
351 return &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
352
353 case BFD_RELOC_XTENSA_OP1:
354 TRACE ("BFD_RELOC_XTENSA_OP1");
355 return &elf_howto_table[(unsigned) R_XTENSA_OP1 ];
356
357 case BFD_RELOC_XTENSA_OP2:
358 TRACE ("BFD_RELOC_XTENSA_OP2");
359 return &elf_howto_table[(unsigned) R_XTENSA_OP2 ];
360
361 case BFD_RELOC_XTENSA_ASM_EXPAND:
362 TRACE ("BFD_RELOC_XTENSA_ASM_EXPAND");
363 return &elf_howto_table[(unsigned) R_XTENSA_ASM_EXPAND ];
364
365 case BFD_RELOC_XTENSA_ASM_SIMPLIFY:
366 TRACE ("BFD_RELOC_XTENSA_ASM_SIMPLIFY");
367 return &elf_howto_table[(unsigned) R_XTENSA_ASM_SIMPLIFY ];
368
369 case BFD_RELOC_VTABLE_INHERIT:
370 TRACE ("BFD_RELOC_VTABLE_INHERIT");
371 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTINHERIT ];
372
373 case BFD_RELOC_VTABLE_ENTRY:
374 TRACE ("BFD_RELOC_VTABLE_ENTRY");
375 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTENTRY ];
376
377 default:
378 break;
379 }
380
381 TRACE ("Unknown");
382 return NULL;
383}
384
385
386/* Given an ELF "rela" relocation, find the corresponding howto and record
387 it in the BFD internal arelent representation of the relocation. */
388
389static void
390elf_xtensa_info_to_howto_rela (abfd, cache_ptr, dst)
391 bfd *abfd ATTRIBUTE_UNUSED;
392 arelent *cache_ptr;
393 Elf_Internal_Rela *dst;
394{
395 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
396
397 BFD_ASSERT (r_type < (unsigned int) R_XTENSA_max);
398 cache_ptr->howto = &elf_howto_table[r_type];
399}
400
401\f
402/* Functions for the Xtensa ELF linker. */
403
404/* The name of the dynamic interpreter. This is put in the .interp
405 section. */
406
407#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
408
409/* The size in bytes of an entry in the procedure linkage table.
410 (This does _not_ include the space for the literals associated with
411 the PLT entry.) */
412
413#define PLT_ENTRY_SIZE 16
414
415/* For _really_ large PLTs, we may need to alternate between literals
416 and code to keep the literals within the 256K range of the L32R
417 instructions in the code. It's unlikely that anyone would ever need
418 such a big PLT, but an arbitrary limit on the PLT size would be bad.
419 Thus, we split the PLT into chunks. Since there's very little
420 overhead (2 extra literals) for each chunk, the chunk size is kept
421 small so that the code for handling multiple chunks get used and
422 tested regularly. With 254 entries, there are 1K of literals for
423 each chunk, and that seems like a nice round number. */
424
425#define PLT_ENTRIES_PER_CHUNK 254
426
427/* PLT entries are actually used as stub functions for lazy symbol
428 resolution. Once the symbol is resolved, the stub function is never
429 invoked. Note: the 32-byte frame size used here cannot be changed
430 without a corresponding change in the runtime linker. */
431
432static const bfd_byte elf_xtensa_be_plt_entry[PLT_ENTRY_SIZE] =
433{
434 0x6c, 0x10, 0x04, /* entry sp, 32 */
435 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
436 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
437 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
438 0x0a, 0x80, 0x00, /* jx a8 */
439 0 /* unused */
440};
441
442static const bfd_byte elf_xtensa_le_plt_entry[PLT_ENTRY_SIZE] =
443{
444 0x36, 0x41, 0x00, /* entry sp, 32 */
445 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
446 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
447 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
448 0xa0, 0x08, 0x00, /* jx a8 */
449 0 /* unused */
450};
451
571b5725
BW
452
453static inline bfd_boolean
454xtensa_elf_dynamic_symbol_p (h, info)
455 struct elf_link_hash_entry *h;
456 struct bfd_link_info *info;
457{
458 /* Check if we should do dynamic things to this symbol. The
459 "ignore_protected" argument need not be set, because Xtensa code
460 does not require special handling of STV_PROTECTED to make function
461 pointer comparisons work properly. The PLT addresses are never
462 used for function pointers. */
463
464 return _bfd_elf_dynamic_symbol_p (h, info, 0);
465}
466
e0001a05
NC
467\f
468static int
469property_table_compare (ap, bp)
470 const PTR ap;
471 const PTR bp;
472{
473 const property_table_entry *a = (const property_table_entry *) ap;
474 const property_table_entry *b = (const property_table_entry *) bp;
475
476 /* Check if one entry overlaps with the other; this shouldn't happen
477 except when searching for a match. */
478 if ((b->address >= a->address && b->address < (a->address + a->size))
479 || (a->address >= b->address && a->address < (b->address + b->size)))
480 return 0;
481
482 return (a->address - b->address);
483}
484
485
486/* Get the literal table or instruction table entries for the given
487 section. Sets TABLE_P and returns the number of entries. On error,
488 returns a negative value. */
489
490int
491xtensa_read_table_entries (abfd, section, table_p, sec_name)
492 bfd *abfd;
493 asection *section;
494 property_table_entry **table_p;
495 const char *sec_name;
496{
497 asection *table_section;
498 char *table_section_name;
499 bfd_size_type table_size = 0;
500 bfd_byte *table_data;
501 property_table_entry *blocks;
502 int block_count;
503 bfd_size_type num_records;
504 Elf_Internal_Rela *internal_relocs;
505
506 table_section_name =
507 xtensa_get_property_section_name (abfd, section, sec_name);
508 table_section = bfd_get_section_by_name (abfd, table_section_name);
509 if (table_section != NULL)
510 table_size = bfd_get_section_size_before_reloc (table_section);
511
512 if (table_size == 0)
513 {
514 *table_p = NULL;
515 return 0;
516 }
517
518 num_records = table_size / sizeof (property_table_entry);
519 table_data = retrieve_contents (abfd, table_section, TRUE);
520 blocks = (property_table_entry *)
521 bfd_malloc (num_records * sizeof (property_table_entry));
522 block_count = 0;
523
524 /* If the file has not yet been relocated, process the relocations
525 and sort out the table entries that apply to the specified section. */
526 internal_relocs = retrieve_internal_relocs (abfd, table_section, TRUE);
527 if (internal_relocs)
528 {
529 unsigned i;
530
531 for (i = 0; i < table_section->reloc_count; i++)
532 {
533 Elf_Internal_Rela *rel = &internal_relocs[i];
534 unsigned long r_symndx;
535
536 if (ELF32_R_TYPE (rel->r_info) == R_XTENSA_NONE)
537 continue;
538
539 BFD_ASSERT (ELF32_R_TYPE (rel->r_info) == R_XTENSA_32);
540 r_symndx = ELF32_R_SYM (rel->r_info);
541
542 if (get_elf_r_symndx_section (abfd, r_symndx) == section)
543 {
544 bfd_vma sym_off = get_elf_r_symndx_offset (abfd, r_symndx);
545 blocks[block_count].address =
546 (section->vma + sym_off + rel->r_addend
547 + bfd_get_32 (abfd, table_data + rel->r_offset));
548 blocks[block_count].size =
549 bfd_get_32 (abfd, table_data + rel->r_offset + 4);
550 block_count++;
551 }
552 }
553 }
554 else
555 {
556 /* No relocations. Presumably the file has been relocated
557 and the addresses are already in the table. */
558 bfd_vma off;
559
560 for (off = 0; off < table_size; off += sizeof (property_table_entry))
561 {
562 bfd_vma address = bfd_get_32 (abfd, table_data + off);
563
564 if (address >= section->vma
565 && address < ( section->vma + section->_raw_size))
566 {
567 blocks[block_count].address = address;
568 blocks[block_count].size =
569 bfd_get_32 (abfd, table_data + off + 4);
570 block_count++;
571 }
572 }
573 }
574
575 release_contents (table_section, table_data);
576 release_internal_relocs (table_section, internal_relocs);
577
578 if (block_count > 0)
579 {
580 /* Now sort them into address order for easy reference. */
581 qsort (blocks, block_count, sizeof (property_table_entry),
582 property_table_compare);
583 }
584
585 *table_p = blocks;
586 return block_count;
587}
588
589
590static bfd_boolean
591elf_xtensa_in_literal_pool (lit_table, lit_table_size, addr)
592 property_table_entry *lit_table;
593 int lit_table_size;
594 bfd_vma addr;
595{
596 property_table_entry entry;
597
598 if (lit_table_size == 0)
599 return FALSE;
600
601 entry.address = addr;
602 entry.size = 1;
603
604 if (bsearch (&entry, lit_table, lit_table_size,
605 sizeof (property_table_entry), property_table_compare))
606 return TRUE;
607
608 return FALSE;
609}
610
611\f
612/* Look through the relocs for a section during the first phase, and
613 calculate needed space in the dynamic reloc sections. */
614
615static bfd_boolean
616elf_xtensa_check_relocs (abfd, info, sec, relocs)
617 bfd *abfd;
618 struct bfd_link_info *info;
619 asection *sec;
620 const Elf_Internal_Rela *relocs;
621{
622 Elf_Internal_Shdr *symtab_hdr;
623 struct elf_link_hash_entry **sym_hashes;
624 const Elf_Internal_Rela *rel;
625 const Elf_Internal_Rela *rel_end;
626 property_table_entry *lit_table;
627 int ltblsize;
628
1049f94e 629 if (info->relocatable)
e0001a05
NC
630 return TRUE;
631
632 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
633 sym_hashes = elf_sym_hashes (abfd);
634
635 ltblsize = xtensa_read_table_entries (abfd, sec, &lit_table,
636 XTENSA_LIT_SEC_NAME);
637 if (ltblsize < 0)
638 return FALSE;
639
640 rel_end = relocs + sec->reloc_count;
641 for (rel = relocs; rel < rel_end; rel++)
642 {
643 unsigned int r_type;
644 unsigned long r_symndx;
645 struct elf_link_hash_entry *h;
646
647 r_symndx = ELF32_R_SYM (rel->r_info);
648 r_type = ELF32_R_TYPE (rel->r_info);
649
650 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
651 {
652 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
653 bfd_archive_filename (abfd),
654 r_symndx);
655 return FALSE;
656 }
657
658 if (r_symndx < symtab_hdr->sh_info)
659 h = NULL;
660 else
661 {
662 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
663 while (h->root.type == bfd_link_hash_indirect
664 || h->root.type == bfd_link_hash_warning)
665 h = (struct elf_link_hash_entry *) h->root.u.i.link;
666 }
667
668 switch (r_type)
669 {
670 case R_XTENSA_32:
671 if (h == NULL)
672 goto local_literal;
673
674 if ((sec->flags & SEC_ALLOC) != 0)
675 {
676 if ((sec->flags & SEC_READONLY) != 0
677 && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
678 sec->vma + rel->r_offset))
679 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
680
681 if (h->got.refcount <= 0)
682 h->got.refcount = 1;
683 else
684 h->got.refcount += 1;
685 }
686 break;
687
688 case R_XTENSA_PLT:
689 /* If this relocation is against a local symbol, then it's
690 exactly the same as a normal local GOT entry. */
691 if (h == NULL)
692 goto local_literal;
693
694 if ((sec->flags & SEC_ALLOC) != 0)
695 {
696 if ((sec->flags & SEC_READONLY) != 0
697 && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
698 sec->vma + rel->r_offset))
699 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
700
701 if (h->plt.refcount <= 0)
702 {
703 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
704 h->plt.refcount = 1;
705 }
706 else
707 h->plt.refcount += 1;
708
709 /* Keep track of the total PLT relocation count even if we
710 don't yet know whether the dynamic sections will be
711 created. */
712 plt_reloc_count += 1;
713
714 if (elf_hash_table (info)->dynamic_sections_created)
715 {
716 if (!add_extra_plt_sections (elf_hash_table (info)->dynobj,
717 plt_reloc_count))
718 return FALSE;
719 }
720 }
721 break;
722
723 local_literal:
724 if ((sec->flags & SEC_ALLOC) != 0)
725 {
726 bfd_signed_vma *local_got_refcounts;
727
728 /* This is a global offset table entry for a local symbol. */
729 local_got_refcounts = elf_local_got_refcounts (abfd);
730 if (local_got_refcounts == NULL)
731 {
732 bfd_size_type size;
733
734 size = symtab_hdr->sh_info;
735 size *= sizeof (bfd_signed_vma);
736 local_got_refcounts = ((bfd_signed_vma *)
737 bfd_zalloc (abfd, size));
738 if (local_got_refcounts == NULL)
739 return FALSE;
740 elf_local_got_refcounts (abfd) = local_got_refcounts;
741 }
742 local_got_refcounts[r_symndx] += 1;
743
744 /* If the relocation is not inside the GOT, the DF_TEXTREL
745 flag needs to be set. */
746 if (info->shared
747 && (sec->flags & SEC_READONLY) != 0
748 && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
749 sec->vma + rel->r_offset))
750 info->flags |= DF_TEXTREL;
751 }
752 break;
753
754 case R_XTENSA_OP0:
755 case R_XTENSA_OP1:
756 case R_XTENSA_OP2:
757 case R_XTENSA_ASM_EXPAND:
758 case R_XTENSA_ASM_SIMPLIFY:
759 /* Nothing to do for these. */
760 break;
761
762 case R_XTENSA_GNU_VTINHERIT:
763 /* This relocation describes the C++ object vtable hierarchy.
764 Reconstruct it for later use during GC. */
765 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
766 return FALSE;
767 break;
768
769 case R_XTENSA_GNU_VTENTRY:
770 /* This relocation describes which C++ vtable entries are actually
771 used. Record for later use during GC. */
772 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
773 return FALSE;
774 break;
775
776 default:
777 break;
778 }
779 }
780
781 free (lit_table);
782 return TRUE;
783}
784
785
786static void
787elf_xtensa_hide_symbol (info, h, force_local)
788 struct bfd_link_info *info;
789 struct elf_link_hash_entry *h;
790 bfd_boolean force_local;
791{
792 /* For a shared link, move the plt refcount to the got refcount to leave
793 space for RELATIVE relocs. */
794 elf_xtensa_make_sym_local (info, h);
795
796 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
797}
798
799
800static void
801elf_xtensa_copy_indirect_symbol (bed, dir, ind)
9c5bfbb7 802 const struct elf_backend_data *bed;
e0001a05
NC
803 struct elf_link_hash_entry *dir, *ind;
804{
805 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
806
807 /* The standard function doesn't copy the NEEDS_PLT flag. */
808 dir->elf_link_hash_flags |=
809 (ind->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT);
810}
811
812
813/* Return the section that should be marked against GC for a given
814 relocation. */
815
816static asection *
817elf_xtensa_gc_mark_hook (sec, info, rel, h, sym)
818 asection *sec;
819 struct bfd_link_info *info ATTRIBUTE_UNUSED;
820 Elf_Internal_Rela *rel;
821 struct elf_link_hash_entry *h;
822 Elf_Internal_Sym *sym;
823{
824 if (h != NULL)
825 {
826 switch (ELF32_R_TYPE (rel->r_info))
827 {
828 case R_XTENSA_GNU_VTINHERIT:
829 case R_XTENSA_GNU_VTENTRY:
830 break;
831
832 default:
833 switch (h->root.type)
834 {
835 case bfd_link_hash_defined:
836 case bfd_link_hash_defweak:
837 return h->root.u.def.section;
838
839 case bfd_link_hash_common:
840 return h->root.u.c.p->section;
841
842 default:
843 break;
844 }
845 }
846 }
847 else
848 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
849
850 return NULL;
851}
852
853/* Update the GOT & PLT entry reference counts
854 for the section being removed. */
855
856static bfd_boolean
857elf_xtensa_gc_sweep_hook (abfd, info, sec, relocs)
858 bfd *abfd;
859 struct bfd_link_info *info ATTRIBUTE_UNUSED;
860 asection *sec;
861 const Elf_Internal_Rela *relocs;
862{
863 Elf_Internal_Shdr *symtab_hdr;
864 struct elf_link_hash_entry **sym_hashes;
865 bfd_signed_vma *local_got_refcounts;
866 const Elf_Internal_Rela *rel, *relend;
867
868 if ((sec->flags & SEC_ALLOC) == 0)
869 return TRUE;
870
871 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
872 sym_hashes = elf_sym_hashes (abfd);
873 local_got_refcounts = elf_local_got_refcounts (abfd);
874
875 relend = relocs + sec->reloc_count;
876 for (rel = relocs; rel < relend; rel++)
877 {
878 unsigned long r_symndx;
879 unsigned int r_type;
880 struct elf_link_hash_entry *h = NULL;
881
882 r_symndx = ELF32_R_SYM (rel->r_info);
883 if (r_symndx >= symtab_hdr->sh_info)
884 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
885
886 r_type = ELF32_R_TYPE (rel->r_info);
887 switch (r_type)
888 {
889 case R_XTENSA_32:
890 if (h == NULL)
891 goto local_literal;
892 if (h->got.refcount > 0)
893 h->got.refcount--;
894 break;
895
896 case R_XTENSA_PLT:
897 if (h == NULL)
898 goto local_literal;
899 if (h->plt.refcount > 0)
900 h->plt.refcount--;
901 break;
902
903 local_literal:
904 if (local_got_refcounts[r_symndx] > 0)
905 local_got_refcounts[r_symndx] -= 1;
906 break;
907
908 default:
909 break;
910 }
911 }
912
913 return TRUE;
914}
915
916
917/* Create all the dynamic sections. */
918
919static bfd_boolean
920elf_xtensa_create_dynamic_sections (dynobj, info)
921 bfd *dynobj;
922 struct bfd_link_info *info;
923{
e901de89 924 flagword flags, noalloc_flags;
e0001a05
NC
925 asection *s;
926
927 /* First do all the standard stuff. */
928 if (! _bfd_elf_create_dynamic_sections (dynobj, info))
929 return FALSE;
930
931 /* Create any extra PLT sections in case check_relocs has already
932 been called on all the non-dynamic input files. */
933 if (!add_extra_plt_sections (dynobj, plt_reloc_count))
934 return FALSE;
935
e901de89
BW
936 noalloc_flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
937 | SEC_LINKER_CREATED | SEC_READONLY);
938 flags = noalloc_flags | SEC_ALLOC | SEC_LOAD;
e0001a05
NC
939
940 /* Mark the ".got.plt" section READONLY. */
941 s = bfd_get_section_by_name (dynobj, ".got.plt");
942 if (s == NULL
943 || ! bfd_set_section_flags (dynobj, s, flags))
944 return FALSE;
945
946 /* Create ".rela.got". */
947 s = bfd_make_section (dynobj, ".rela.got");
948 if (s == NULL
949 || ! bfd_set_section_flags (dynobj, s, flags)
950 || ! bfd_set_section_alignment (dynobj, s, 2))
951 return FALSE;
952
e901de89
BW
953 /* Create ".got.loc" (literal tables for use by dynamic linker). */
954 s = bfd_make_section (dynobj, ".got.loc");
955 if (s == NULL
956 || ! bfd_set_section_flags (dynobj, s, flags)
957 || ! bfd_set_section_alignment (dynobj, s, 2))
958 return FALSE;
959
e0001a05
NC
960 /* Create ".xt.lit.plt" (literal table for ".got.plt*"). */
961 s = bfd_make_section (dynobj, ".xt.lit.plt");
962 if (s == NULL
e901de89 963 || ! bfd_set_section_flags (dynobj, s, noalloc_flags)
e0001a05
NC
964 || ! bfd_set_section_alignment (dynobj, s, 2))
965 return FALSE;
966
967 return TRUE;
968}
969
970
971static bfd_boolean
972add_extra_plt_sections (dynobj, count)
973 bfd *dynobj;
974 int count;
975{
976 int chunk;
977
978 /* Iterate over all chunks except 0 which uses the standard ".plt" and
979 ".got.plt" sections. */
980 for (chunk = count / PLT_ENTRIES_PER_CHUNK; chunk > 0; chunk--)
981 {
982 char *sname;
983 flagword flags;
984 asection *s;
985
986 /* Stop when we find a section has already been created. */
987 if (elf_xtensa_get_plt_section (dynobj, chunk))
988 break;
989
990 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
991 | SEC_LINKER_CREATED | SEC_READONLY);
992
993 sname = (char *) bfd_malloc (10);
994 sprintf (sname, ".plt.%u", chunk);
995 s = bfd_make_section (dynobj, sname);
996 if (s == NULL
997 || ! bfd_set_section_flags (dynobj, s, flags | SEC_CODE)
998 || ! bfd_set_section_alignment (dynobj, s, 2))
999 return FALSE;
1000
1001 sname = (char *) bfd_malloc (14);
1002 sprintf (sname, ".got.plt.%u", chunk);
1003 s = bfd_make_section (dynobj, sname);
1004 if (s == NULL
1005 || ! bfd_set_section_flags (dynobj, s, flags)
1006 || ! bfd_set_section_alignment (dynobj, s, 2))
1007 return FALSE;
1008 }
1009
1010 return TRUE;
1011}
1012
1013
1014/* Adjust a symbol defined by a dynamic object and referenced by a
1015 regular object. The current definition is in some section of the
1016 dynamic object, but we're not including those sections. We have to
1017 change the definition to something the rest of the link can
1018 understand. */
1019
1020static bfd_boolean
1021elf_xtensa_adjust_dynamic_symbol (info, h)
1022 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1023 struct elf_link_hash_entry *h;
1024{
1025 /* If this is a weak symbol, and there is a real definition, the
1026 processor independent code will have arranged for us to see the
1027 real definition first, and we can just use the same value. */
1028 if (h->weakdef != NULL)
1029 {
1030 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1031 || h->weakdef->root.type == bfd_link_hash_defweak);
1032 h->root.u.def.section = h->weakdef->root.u.def.section;
1033 h->root.u.def.value = h->weakdef->root.u.def.value;
1034 return TRUE;
1035 }
1036
1037 /* This is a reference to a symbol defined by a dynamic object. The
1038 reference must go through the GOT, so there's no need for COPY relocs,
1039 .dynbss, etc. */
1040
1041 return TRUE;
1042}
1043
1044
1045static void
1046elf_xtensa_make_sym_local (info, h)
1047 struct bfd_link_info *info;
1048 struct elf_link_hash_entry *h;
1049{
1050 if (info->shared)
1051 {
1052 if (h->plt.refcount > 0)
1053 {
1054 /* Will use RELATIVE relocs instead of JMP_SLOT relocs. */
1055 if (h->got.refcount < 0)
1056 h->got.refcount = 0;
1057 h->got.refcount += h->plt.refcount;
1058 h->plt.refcount = 0;
1059 }
1060 }
1061 else
1062 {
1063 /* Don't need any dynamic relocations at all. */
1064 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1065 h->plt.refcount = 0;
1066 h->got.refcount = 0;
1067 }
1068}
1069
1070
1071static bfd_boolean
1072elf_xtensa_fix_refcounts (h, arg)
1073 struct elf_link_hash_entry *h;
1074 PTR arg;
1075{
1076 struct bfd_link_info *info = (struct bfd_link_info *) arg;
1077
1078 if (h->root.type == bfd_link_hash_warning)
1079 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1080
571b5725 1081 if (! xtensa_elf_dynamic_symbol_p (h, info))
e0001a05
NC
1082 elf_xtensa_make_sym_local (info, h);
1083
1084 /* If the symbol has a relocation outside the GOT, set the
1085 DF_TEXTREL flag. */
1086 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) != 0)
1087 info->flags |= DF_TEXTREL;
1088
1089 return TRUE;
1090}
1091
1092
1093static bfd_boolean
1094elf_xtensa_allocate_plt_size (h, arg)
1095 struct elf_link_hash_entry *h;
1096 PTR arg;
1097{
1098 asection *srelplt = (asection *) arg;
1099
1100 if (h->root.type == bfd_link_hash_warning)
1101 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1102
1103 if (h->plt.refcount > 0)
1104 srelplt->_raw_size += (h->plt.refcount * sizeof (Elf32_External_Rela));
1105
1106 return TRUE;
1107}
1108
1109
1110static bfd_boolean
1111elf_xtensa_allocate_got_size (h, arg)
1112 struct elf_link_hash_entry *h;
1113 PTR arg;
1114{
1115 asection *srelgot = (asection *) arg;
1116
1117 if (h->root.type == bfd_link_hash_warning)
1118 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1119
1120 if (h->got.refcount > 0)
1121 srelgot->_raw_size += (h->got.refcount * sizeof (Elf32_External_Rela));
1122
1123 return TRUE;
1124}
1125
1126
1127static void
1128elf_xtensa_allocate_local_got_size (info, srelgot)
1129 struct bfd_link_info *info;
1130 asection *srelgot;
1131{
1132 bfd *i;
1133
1134 for (i = info->input_bfds; i; i = i->link_next)
1135 {
1136 bfd_signed_vma *local_got_refcounts;
1137 bfd_size_type j, cnt;
1138 Elf_Internal_Shdr *symtab_hdr;
1139
1140 local_got_refcounts = elf_local_got_refcounts (i);
1141 if (!local_got_refcounts)
1142 continue;
1143
1144 symtab_hdr = &elf_tdata (i)->symtab_hdr;
1145 cnt = symtab_hdr->sh_info;
1146
1147 for (j = 0; j < cnt; ++j)
1148 {
1149 if (local_got_refcounts[j] > 0)
1150 srelgot->_raw_size += (local_got_refcounts[j]
1151 * sizeof (Elf32_External_Rela));
1152 }
1153 }
1154}
1155
1156
1157/* Set the sizes of the dynamic sections. */
1158
1159static bfd_boolean
1160elf_xtensa_size_dynamic_sections (output_bfd, info)
1161 bfd *output_bfd ATTRIBUTE_UNUSED;
1162 struct bfd_link_info *info;
1163{
e901de89
BW
1164 bfd *dynobj, *abfd;
1165 asection *s, *srelplt, *splt, *sgotplt, *srelgot, *spltlittbl, *sgotloc;
e0001a05
NC
1166 bfd_boolean relplt, relgot;
1167 int plt_entries, plt_chunks, chunk;
1168
1169 plt_entries = 0;
1170 plt_chunks = 0;
1171 srelgot = 0;
1172
1173 dynobj = elf_hash_table (info)->dynobj;
1174 if (dynobj == NULL)
1175 abort ();
1176
1177 if (elf_hash_table (info)->dynamic_sections_created)
1178 {
1179 /* Set the contents of the .interp section to the interpreter. */
1180 if (! info->shared)
1181 {
1182 s = bfd_get_section_by_name (dynobj, ".interp");
1183 if (s == NULL)
1184 abort ();
1185 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1186 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1187 }
1188
1189 /* Allocate room for one word in ".got". */
1190 s = bfd_get_section_by_name (dynobj, ".got");
1191 if (s == NULL)
1192 abort ();
1193 s->_raw_size = 4;
1194
1195 /* Adjust refcounts for symbols that we now know are not "dynamic". */
1196 elf_link_hash_traverse (elf_hash_table (info),
1197 elf_xtensa_fix_refcounts,
1198 (PTR) info);
1199
1200 /* Allocate space in ".rela.got" for literals that reference
1201 global symbols. */
1202 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1203 if (srelgot == NULL)
1204 abort ();
1205 elf_link_hash_traverse (elf_hash_table (info),
1206 elf_xtensa_allocate_got_size,
1207 (PTR) srelgot);
1208
1209 /* If we are generating a shared object, we also need space in
1210 ".rela.got" for R_XTENSA_RELATIVE relocs for literals that
1211 reference local symbols. */
1212 if (info->shared)
1213 elf_xtensa_allocate_local_got_size (info, srelgot);
1214
1215 /* Allocate space in ".rela.plt" for literals that have PLT entries. */
1216 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
1217 if (srelplt == NULL)
1218 abort ();
1219 elf_link_hash_traverse (elf_hash_table (info),
1220 elf_xtensa_allocate_plt_size,
1221 (PTR) srelplt);
1222
1223 /* Allocate space in ".plt" to match the size of ".rela.plt". For
1224 each PLT entry, we need the PLT code plus a 4-byte literal.
1225 For each chunk of ".plt", we also need two more 4-byte
1226 literals, two corresponding entries in ".rela.got", and an
1227 8-byte entry in ".xt.lit.plt". */
1228 spltlittbl = bfd_get_section_by_name (dynobj, ".xt.lit.plt");
1229 if (spltlittbl == NULL)
1230 abort ();
1231
1232 plt_entries = srelplt->_raw_size / sizeof (Elf32_External_Rela);
1233 plt_chunks =
1234 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
1235
1236 /* Iterate over all the PLT chunks, including any extra sections
1237 created earlier because the initial count of PLT relocations
1238 was an overestimate. */
1239 for (chunk = 0;
1240 (splt = elf_xtensa_get_plt_section (dynobj, chunk)) != NULL;
1241 chunk++)
1242 {
1243 int chunk_entries;
1244
1245 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
1246 if (sgotplt == NULL)
1247 abort ();
1248
1249 if (chunk < plt_chunks - 1)
1250 chunk_entries = PLT_ENTRIES_PER_CHUNK;
1251 else if (chunk == plt_chunks - 1)
1252 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
1253 else
1254 chunk_entries = 0;
1255
1256 if (chunk_entries != 0)
1257 {
1258 sgotplt->_raw_size = 4 * (chunk_entries + 2);
1259 splt->_raw_size = PLT_ENTRY_SIZE * chunk_entries;
1260 srelgot->_raw_size += 2 * sizeof (Elf32_External_Rela);
1261 spltlittbl->_raw_size += 8;
1262 }
1263 else
1264 {
1265 sgotplt->_raw_size = 0;
1266 splt->_raw_size = 0;
1267 }
1268 }
e901de89
BW
1269
1270 /* Allocate space in ".got.loc" to match the total size of all the
1271 literal tables. */
1272 sgotloc = bfd_get_section_by_name (dynobj, ".got.loc");
1273 if (sgotloc == NULL)
1274 abort ();
1275 sgotloc->_raw_size = spltlittbl->_raw_size;
1276 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1277 {
1278 if (abfd->flags & DYNAMIC)
1279 continue;
1280 for (s = abfd->sections; s != NULL; s = s->next)
1281 {
b536dc1e
BW
1282 if (! elf_discarded_section (s)
1283 && xtensa_is_littable_section (s)
1284 && s != spltlittbl)
e901de89
BW
1285 sgotloc->_raw_size += s->_raw_size;
1286 }
1287 }
e0001a05
NC
1288 }
1289
1290 /* Allocate memory for dynamic sections. */
1291 relplt = FALSE;
1292 relgot = FALSE;
1293 for (s = dynobj->sections; s != NULL; s = s->next)
1294 {
1295 const char *name;
1296 bfd_boolean strip;
1297
1298 if ((s->flags & SEC_LINKER_CREATED) == 0)
1299 continue;
1300
1301 /* It's OK to base decisions on the section name, because none
1302 of the dynobj section names depend upon the input files. */
1303 name = bfd_get_section_name (dynobj, s);
1304
1305 strip = FALSE;
1306
1307 if (strncmp (name, ".rela", 5) == 0)
1308 {
1309 if (strcmp (name, ".rela.plt") == 0)
1310 relplt = TRUE;
1311 else if (strcmp (name, ".rela.got") == 0)
1312 relgot = TRUE;
1313
1314 /* We use the reloc_count field as a counter if we need
1315 to copy relocs into the output file. */
1316 s->reloc_count = 0;
1317 }
1318 else if (strncmp (name, ".plt.", 5) == 0
1319 || strncmp (name, ".got.plt.", 9) == 0)
1320 {
1321 if (s->_raw_size == 0)
1322 {
1323 /* If we don't need this section, strip it from the output
1324 file. We must create the ".plt*" and ".got.plt*"
1325 sections in create_dynamic_sections and/or check_relocs
1326 based on a conservative estimate of the PLT relocation
1327 count, because the sections must be created before the
1328 linker maps input sections to output sections. The
1329 linker does that before size_dynamic_sections, where we
1330 compute the exact size of the PLT, so there may be more
1331 of these sections than are actually needed. */
1332 strip = TRUE;
1333 }
1334 }
1335 else if (strcmp (name, ".got") != 0
1336 && strcmp (name, ".plt") != 0
1337 && strcmp (name, ".got.plt") != 0
e901de89
BW
1338 && strcmp (name, ".xt.lit.plt") != 0
1339 && strcmp (name, ".got.loc") != 0)
e0001a05
NC
1340 {
1341 /* It's not one of our sections, so don't allocate space. */
1342 continue;
1343 }
1344
1345 if (strip)
1346 _bfd_strip_section_from_output (info, s);
1347 else
1348 {
1349 /* Allocate memory for the section contents. */
1350 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1351 if (s->contents == NULL && s->_raw_size != 0)
1352 return FALSE;
1353 }
1354 }
1355
1356 if (elf_hash_table (info)->dynamic_sections_created)
1357 {
1358 /* Add the special XTENSA_RTLD relocations now. The offsets won't be
1359 known until finish_dynamic_sections, but we need to get the relocs
1360 in place before they are sorted. */
1361 if (srelgot == NULL)
1362 abort ();
1363 for (chunk = 0; chunk < plt_chunks; chunk++)
1364 {
1365 Elf_Internal_Rela irela;
1366 bfd_byte *loc;
1367
1368 irela.r_offset = 0;
1369 irela.r_info = ELF32_R_INFO (0, R_XTENSA_RTLD);
1370 irela.r_addend = 0;
1371
1372 loc = (srelgot->contents
1373 + srelgot->reloc_count * sizeof (Elf32_External_Rela));
1374 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
1375 bfd_elf32_swap_reloca_out (output_bfd, &irela,
1376 loc + sizeof (Elf32_External_Rela));
1377 srelgot->reloc_count += 2;
1378 }
1379
1380 /* Add some entries to the .dynamic section. We fill in the
1381 values later, in elf_xtensa_finish_dynamic_sections, but we
1382 must add the entries now so that we get the correct size for
1383 the .dynamic section. The DT_DEBUG entry is filled in by the
1384 dynamic linker and used by the debugger. */
1385#define add_dynamic_entry(TAG, VAL) \
1386 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1387
1388 if (! info->shared)
1389 {
1390 if (!add_dynamic_entry (DT_DEBUG, 0))
1391 return FALSE;
1392 }
1393
1394 if (relplt)
1395 {
1396 if (!add_dynamic_entry (DT_PLTGOT, 0)
1397 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1398 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1399 || !add_dynamic_entry (DT_JMPREL, 0))
1400 return FALSE;
1401 }
1402
1403 if (relgot)
1404 {
1405 if (!add_dynamic_entry (DT_RELA, 0)
1406 || !add_dynamic_entry (DT_RELASZ, 0)
1407 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
1408 return FALSE;
1409 }
1410
1411 if ((info->flags & DF_TEXTREL) != 0)
1412 {
1413 if (!add_dynamic_entry (DT_TEXTREL, 0))
1414 return FALSE;
1415 }
1416
1417 if (!add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0)
1418 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0))
1419 return FALSE;
1420 }
1421#undef add_dynamic_entry
1422
1423 return TRUE;
1424}
1425
1426\f
1427/* Remove any PT_LOAD segments with no allocated sections. Prior to
1428 binutils 2.13, this function used to remove the non-SEC_ALLOC
1429 sections from PT_LOAD segments, but that task has now been moved
1430 into elf.c. We still need this function to remove any empty
1431 segments that result, but there's nothing Xtensa-specific about
1432 this and it probably ought to be moved into elf.c as well. */
1433
1434static bfd_boolean
1435elf_xtensa_modify_segment_map (abfd)
1436 bfd *abfd;
1437{
1438 struct elf_segment_map **m_p;
1439
1440 m_p = &elf_tdata (abfd)->segment_map;
1441 while (*m_p != NULL)
1442 {
1443 if ((*m_p)->p_type == PT_LOAD && (*m_p)->count == 0)
1444 *m_p = (*m_p)->next;
1445 else
1446 m_p = &(*m_p)->next;
1447 }
1448 return TRUE;
1449}
1450
1451\f
1452/* Perform the specified relocation. The instruction at (contents + address)
1453 is modified to set one operand to represent the value in "relocation". The
1454 operand position is determined by the relocation type recorded in the
1455 howto. */
1456
1457#define CALL_SEGMENT_BITS (30)
1458#define CALL_SEGMENT_SIZE (1<<CALL_SEGMENT_BITS)
1459
1460static bfd_reloc_status_type
1461elf_xtensa_do_reloc (howto, abfd, input_section, relocation,
1462 contents, address, is_weak_undef, error_message)
1463 reloc_howto_type *howto;
1464 bfd *abfd;
1465 asection *input_section;
1466 bfd_vma relocation;
1467 bfd_byte *contents;
1468 bfd_vma address;
1469 bfd_boolean is_weak_undef;
1470 char **error_message;
1471{
1472 xtensa_opcode opcode;
1473 xtensa_operand operand;
1474 xtensa_encode_result encode_result;
1475 xtensa_isa isa = xtensa_default_isa;
1476 xtensa_insnbuf ibuff;
1477 bfd_vma self_address;
1478 int opnd;
1479 uint32 newval;
1480
1481 switch (howto->type)
1482 {
1483 case R_XTENSA_NONE:
1484 return bfd_reloc_ok;
1485
1486 case R_XTENSA_ASM_EXPAND:
1487 if (!is_weak_undef)
1488 {
1489 /* Check for windowed CALL across a 1GB boundary. */
1490 xtensa_opcode opcode =
1491 get_expanded_call_opcode (contents + address,
1492 input_section->_raw_size - address);
1493 if (is_windowed_call_opcode (opcode))
1494 {
1495 self_address = (input_section->output_section->vma
1496 + input_section->output_offset
1497 + address);
1498 if ((self_address >> CALL_SEGMENT_BITS) !=
1499 (relocation >> CALL_SEGMENT_BITS))
1500 {
1501 *error_message = "windowed longcall crosses 1GB boundary; "
1502 "return may fail";
1503 return bfd_reloc_dangerous;
1504 }
1505 }
1506 }
1507 return bfd_reloc_ok;
1508
1509 case R_XTENSA_ASM_SIMPLIFY:
1510 {
1511 /* Convert the L32R/CALLX to CALL. */
1512 bfd_reloc_status_type retval =
1513 elf_xtensa_do_asm_simplify (contents, address,
1514 input_section->_raw_size);
1515 if (retval != bfd_reloc_ok)
1516 return retval;
1517
1518 /* The CALL needs to be relocated. Continue below for that part. */
1519 address += 3;
1520 howto = &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
1521 }
1522 break;
1523
1524 case R_XTENSA_32:
1525 case R_XTENSA_PLT:
1526 {
1527 bfd_vma x;
1528 x = bfd_get_32 (abfd, contents + address);
1529 x = x + relocation;
1530 bfd_put_32 (abfd, x, contents + address);
1531 }
1532 return bfd_reloc_ok;
1533 }
1534
1535 /* Read the instruction into a buffer and decode the opcode. */
1536 ibuff = xtensa_insnbuf_alloc (isa);
1537 xtensa_insnbuf_from_chars (isa, ibuff, contents + address);
1538 opcode = xtensa_decode_insn (isa, ibuff);
1539
1540 /* Determine which operand is being relocated. */
1541 if (opcode == XTENSA_UNDEFINED)
1542 {
1543 *error_message = "cannot decode instruction";
1544 return bfd_reloc_dangerous;
1545 }
1546
1547 if (howto->type < R_XTENSA_OP0 || howto->type > R_XTENSA_OP2)
1548 {
1549 *error_message = "unexpected relocation";
1550 return bfd_reloc_dangerous;
1551 }
1552
1553 opnd = howto->type - R_XTENSA_OP0;
1554
1555 /* Calculate the PC address for this instruction. */
1556 if (!howto->pc_relative)
1557 {
1558 *error_message = "expected PC-relative relocation";
1559 return bfd_reloc_dangerous;
1560 }
1561
1562 self_address = (input_section->output_section->vma
1563 + input_section->output_offset
1564 + address);
1565
1566 /* Apply the relocation. */
1567 operand = xtensa_get_operand (isa, opcode, opnd);
1568 newval = xtensa_operand_do_reloc (operand, relocation, self_address);
1569 encode_result = xtensa_operand_encode (operand, &newval);
1570 xtensa_operand_set_field (operand, ibuff, newval);
1571
1572 /* Write the modified instruction back out of the buffer. */
1573 xtensa_insnbuf_to_chars (isa, ibuff, contents + address);
1574 free (ibuff);
1575
1576 if (encode_result != xtensa_encode_result_ok)
1577 {
1578 char *message = build_encoding_error_message (opcode, encode_result);
1579 *error_message = message;
1580 return bfd_reloc_dangerous;
1581 }
1582
1583 /* Final check for call. */
1584 if (is_direct_call_opcode (opcode)
1585 && is_windowed_call_opcode (opcode))
1586 {
1587 if ((self_address >> CALL_SEGMENT_BITS) !=
1588 (relocation >> CALL_SEGMENT_BITS))
1589 {
1590 *error_message = "windowed call crosses 1GB boundary; "
1591 "return may fail";
1592 return bfd_reloc_dangerous;
1593 }
1594 }
1595
1596 return bfd_reloc_ok;
1597}
1598
1599
1600static char *
1601vsprint_msg VPARAMS ((const char *origmsg, const char *fmt, int arglen, ...))
1602{
1603 /* To reduce the size of the memory leak,
1604 we only use a single message buffer. */
1605 static bfd_size_type alloc_size = 0;
1606 static char *message = NULL;
1607 bfd_size_type orig_len, len = 0;
1608 bfd_boolean is_append;
1609
1610 VA_OPEN (ap, arglen);
1611 VA_FIXEDARG (ap, const char *, origmsg);
1612
1613 is_append = (origmsg == message);
1614
1615 orig_len = strlen (origmsg);
1616 len = orig_len + strlen (fmt) + arglen + 20;
1617 if (len > alloc_size)
1618 {
1619 message = (char *) bfd_realloc (message, len);
1620 alloc_size = len;
1621 }
1622 if (!is_append)
1623 memcpy (message, origmsg, orig_len);
1624 vsprintf (message + orig_len, fmt, ap);
1625 VA_CLOSE (ap);
1626 return message;
1627}
1628
1629
1630static char *
1631build_encoding_error_message (opcode, encode_result)
1632 xtensa_opcode opcode;
1633 xtensa_encode_result encode_result;
1634{
1635 const char *opname = xtensa_opcode_name (xtensa_default_isa, opcode);
1636 const char *msg = NULL;
1637
1638 switch (encode_result)
1639 {
1640 case xtensa_encode_result_ok:
1641 msg = "unexpected valid encoding";
1642 break;
1643 case xtensa_encode_result_align:
1644 msg = "misaligned encoding";
1645 break;
1646 case xtensa_encode_result_not_in_table:
1647 msg = "encoding not in lookup table";
1648 break;
1649 case xtensa_encode_result_too_low:
1650 msg = "encoding out of range: too low";
1651 break;
1652 case xtensa_encode_result_too_high:
1653 msg = "encoding out of range: too high";
1654 break;
1655 case xtensa_encode_result_not_ok:
1656 default:
1657 msg = "could not encode";
1658 break;
1659 }
1660
1661 if (is_direct_call_opcode (opcode)
1662 && (encode_result == xtensa_encode_result_too_low
1663 || encode_result == xtensa_encode_result_too_high))
1664
1665 msg = "direct call out of range";
1666
1667 else if (opcode == get_l32r_opcode ())
1668 {
1669 /* L32Rs have the strange interaction with encoding in that they
1670 have an unsigned immediate field, so libisa returns "too high"
1671 when the absolute value is out of range and never returns "too
1672 low", but I leave the "too low" message in case anything
1673 changes. */
1674 if (encode_result == xtensa_encode_result_too_low)
1675 msg = "literal out of range";
1676 else if (encode_result == xtensa_encode_result_too_high)
1677 msg = "literal placed after use";
1678 }
1679
1680 return vsprint_msg (opname, ": %s", strlen (msg) + 2, msg);
1681}
1682
1683
1684/* This function is registered as the "special_function" in the
1685 Xtensa howto for handling simplify operations.
1686 bfd_perform_relocation / bfd_install_relocation use it to
1687 perform (install) the specified relocation. Since this replaces the code
1688 in bfd_perform_relocation, it is basically an Xtensa-specific,
1689 stripped-down version of bfd_perform_relocation. */
1690
1691static bfd_reloc_status_type
1692bfd_elf_xtensa_reloc (abfd, reloc_entry, symbol, data, input_section,
1693 output_bfd, error_message)
1694 bfd *abfd;
1695 arelent *reloc_entry;
1696 asymbol *symbol;
1697 PTR data;
1698 asection *input_section;
1699 bfd *output_bfd;
1700 char **error_message;
1701{
1702 bfd_vma relocation;
1703 bfd_reloc_status_type flag;
1704 bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
1705 bfd_vma output_base = 0;
1706 reloc_howto_type *howto = reloc_entry->howto;
1707 asection *reloc_target_output_section;
1708 bfd_boolean is_weak_undef;
1709
1049f94e 1710 /* ELF relocs are against symbols. If we are producing relocatable
e0001a05
NC
1711 output, and the reloc is against an external symbol, the resulting
1712 reloc will also be against the same symbol. In such a case, we
1713 don't want to change anything about the way the reloc is handled,
1714 since it will all be done at final link time. This test is similar
1715 to what bfd_elf_generic_reloc does except that it lets relocs with
1716 howto->partial_inplace go through even if the addend is non-zero.
1717 (The real problem is that partial_inplace is set for XTENSA_32
1718 relocs to begin with, but that's a long story and there's little we
1719 can do about it now....) */
1720
1721 if (output_bfd != (bfd *) NULL
1722 && (symbol->flags & BSF_SECTION_SYM) == 0)
1723 {
1724 reloc_entry->address += input_section->output_offset;
1725 return bfd_reloc_ok;
1726 }
1727
1728 /* Is the address of the relocation really within the section? */
1729 if (reloc_entry->address > (input_section->_cooked_size
1730 / bfd_octets_per_byte (abfd)))
1731 return bfd_reloc_outofrange;
1732
1733 /* Work out which section the relocation is targetted at and the
1734 initial relocation command value. */
1735
1736 /* Get symbol value. (Common symbols are special.) */
1737 if (bfd_is_com_section (symbol->section))
1738 relocation = 0;
1739 else
1740 relocation = symbol->value;
1741
1742 reloc_target_output_section = symbol->section->output_section;
1743
1744 /* Convert input-section-relative symbol value to absolute. */
1745 if ((output_bfd && !howto->partial_inplace)
1746 || reloc_target_output_section == NULL)
1747 output_base = 0;
1748 else
1749 output_base = reloc_target_output_section->vma;
1750
1751 relocation += output_base + symbol->section->output_offset;
1752
1753 /* Add in supplied addend. */
1754 relocation += reloc_entry->addend;
1755
1756 /* Here the variable relocation holds the final address of the
1757 symbol we are relocating against, plus any addend. */
1758 if (output_bfd)
1759 {
1760 if (!howto->partial_inplace)
1761 {
1762 /* This is a partial relocation, and we want to apply the relocation
1763 to the reloc entry rather than the raw data. Everything except
1764 relocations against section symbols has already been handled
1765 above. */
1766
1767 BFD_ASSERT (symbol->flags & BSF_SECTION_SYM);
1768 reloc_entry->addend = relocation;
1769 reloc_entry->address += input_section->output_offset;
1770 return bfd_reloc_ok;
1771 }
1772 else
1773 {
1774 reloc_entry->address += input_section->output_offset;
1775 reloc_entry->addend = 0;
1776 }
1777 }
1778
1779 is_weak_undef = (bfd_is_und_section (symbol->section)
1780 && (symbol->flags & BSF_WEAK) != 0);
1781 flag = elf_xtensa_do_reloc (howto, abfd, input_section, relocation,
1782 (bfd_byte *) data, (bfd_vma) octets,
1783 is_weak_undef, error_message);
1784
1785 if (flag == bfd_reloc_dangerous)
1786 {
1787 /* Add the symbol name to the error message. */
1788 if (! *error_message)
1789 *error_message = "";
1790 *error_message = vsprint_msg (*error_message, ": (%s + 0x%lx)",
1791 strlen (symbol->name) + 17,
1792 symbol->name, reloc_entry->addend);
1793 }
1794
1795 return flag;
1796}
1797
1798
1799/* Set up an entry in the procedure linkage table. */
1800
1801static bfd_vma
1802elf_xtensa_create_plt_entry (dynobj, output_bfd, reloc_index)
1803 bfd *dynobj;
1804 bfd *output_bfd;
1805 unsigned reloc_index;
1806{
1807 asection *splt, *sgotplt;
1808 bfd_vma plt_base, got_base;
1809 bfd_vma code_offset, lit_offset;
1810 int chunk;
1811
1812 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
1813 splt = elf_xtensa_get_plt_section (dynobj, chunk);
1814 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
1815 BFD_ASSERT (splt != NULL && sgotplt != NULL);
1816
1817 plt_base = splt->output_section->vma + splt->output_offset;
1818 got_base = sgotplt->output_section->vma + sgotplt->output_offset;
1819
1820 lit_offset = 8 + (reloc_index % PLT_ENTRIES_PER_CHUNK) * 4;
1821 code_offset = (reloc_index % PLT_ENTRIES_PER_CHUNK) * PLT_ENTRY_SIZE;
1822
1823 /* Fill in the literal entry. This is the offset of the dynamic
1824 relocation entry. */
1825 bfd_put_32 (output_bfd, reloc_index * sizeof (Elf32_External_Rela),
1826 sgotplt->contents + lit_offset);
1827
1828 /* Fill in the entry in the procedure linkage table. */
1829 memcpy (splt->contents + code_offset,
1830 (bfd_big_endian (output_bfd)
1831 ? elf_xtensa_be_plt_entry
1832 : elf_xtensa_le_plt_entry),
1833 PLT_ENTRY_SIZE);
1834 bfd_put_16 (output_bfd, l32r_offset (got_base + 0,
1835 plt_base + code_offset + 3),
1836 splt->contents + code_offset + 4);
1837 bfd_put_16 (output_bfd, l32r_offset (got_base + 4,
1838 plt_base + code_offset + 6),
1839 splt->contents + code_offset + 7);
1840 bfd_put_16 (output_bfd, l32r_offset (got_base + lit_offset,
1841 plt_base + code_offset + 9),
1842 splt->contents + code_offset + 10);
1843
1844 return plt_base + code_offset;
1845}
1846
1847
e0001a05 1848/* Relocate an Xtensa ELF section. This is invoked by the linker for
1049f94e 1849 both relocatable and final links. */
e0001a05
NC
1850
1851static bfd_boolean
1852elf_xtensa_relocate_section (output_bfd, info, input_bfd,
1853 input_section, contents, relocs,
1854 local_syms, local_sections)
1855 bfd *output_bfd;
1856 struct bfd_link_info *info;
1857 bfd *input_bfd;
1858 asection *input_section;
1859 bfd_byte *contents;
1860 Elf_Internal_Rela *relocs;
1861 Elf_Internal_Sym *local_syms;
1862 asection **local_sections;
1863{
1864 Elf_Internal_Shdr *symtab_hdr;
1865 Elf_Internal_Rela *rel;
1866 Elf_Internal_Rela *relend;
1867 struct elf_link_hash_entry **sym_hashes;
1868 asection *srelgot, *srelplt;
1869 bfd *dynobj;
1870 char *error_message = NULL;
1871
1872 if (xtensa_default_isa == NULL)
1873 xtensa_isa_init ();
1874
1875 dynobj = elf_hash_table (info)->dynobj;
1876 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1877 sym_hashes = elf_sym_hashes (input_bfd);
1878
1879 srelgot = NULL;
1880 srelplt = NULL;
1881 if (dynobj != NULL)
1882 {
1883 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");;
1884 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
1885 }
1886
1887 rel = relocs;
1888 relend = relocs + input_section->reloc_count;
1889 for (; rel < relend; rel++)
1890 {
1891 int r_type;
1892 reloc_howto_type *howto;
1893 unsigned long r_symndx;
1894 struct elf_link_hash_entry *h;
1895 Elf_Internal_Sym *sym;
1896 asection *sec;
1897 bfd_vma relocation;
1898 bfd_reloc_status_type r;
1899 bfd_boolean is_weak_undef;
1900 bfd_boolean unresolved_reloc;
9b8c98a4 1901 bfd_boolean warned;
e0001a05
NC
1902
1903 r_type = ELF32_R_TYPE (rel->r_info);
1904 if (r_type == (int) R_XTENSA_GNU_VTINHERIT
1905 || r_type == (int) R_XTENSA_GNU_VTENTRY)
1906 continue;
1907
1908 if (r_type < 0 || r_type >= (int) R_XTENSA_max)
1909 {
1910 bfd_set_error (bfd_error_bad_value);
1911 return FALSE;
1912 }
1913 howto = &elf_howto_table[r_type];
1914
1915 r_symndx = ELF32_R_SYM (rel->r_info);
1916
1049f94e 1917 if (info->relocatable)
e0001a05 1918 {
1049f94e 1919 /* This is a relocatable link.
e0001a05
NC
1920 1) If the reloc is against a section symbol, adjust
1921 according to the output section.
1922 2) If there is a new target for this relocation,
1923 the new target will be in the same output section.
1924 We adjust the relocation by the output section
1925 difference. */
1926
1927 if (relaxing_section)
1928 {
1929 /* Check if this references a section in another input file. */
1049f94e 1930 do_fix_for_relocatable_link (rel, input_bfd, input_section);
e0001a05
NC
1931 r_type = ELF32_R_TYPE (rel->r_info);
1932 }
1933
1934 if (r_type == R_XTENSA_ASM_SIMPLIFY)
1935 {
1936 /* Convert ASM_SIMPLIFY into the simpler relocation
1937 so that they never escape a relaxing link. */
1938 contract_asm_expansion (contents, input_section->_raw_size, rel);
1939 r_type = ELF32_R_TYPE (rel->r_info);
1940 }
1941
1049f94e 1942 /* This is a relocatable link, so we don't have to change
e0001a05
NC
1943 anything unless the reloc is against a section symbol,
1944 in which case we have to adjust according to where the
1945 section symbol winds up in the output section. */
1946 if (r_symndx < symtab_hdr->sh_info)
1947 {
1948 sym = local_syms + r_symndx;
1949 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1950 {
1951 sec = local_sections[r_symndx];
1952 rel->r_addend += sec->output_offset + sym->st_value;
1953 }
1954 }
1955
1956 /* If there is an addend with a partial_inplace howto,
1957 then move the addend to the contents. This is a hack
1049f94e 1958 to work around problems with DWARF in relocatable links
e0001a05
NC
1959 with some previous version of BFD. Now we can't easily get
1960 rid of the hack without breaking backward compatibility.... */
1961 if (rel->r_addend)
1962 {
1963 howto = &elf_howto_table[r_type];
1964 if (howto->partial_inplace)
1965 {
1966 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
1967 rel->r_addend, contents,
1968 rel->r_offset, FALSE,
1969 &error_message);
1970 if (r != bfd_reloc_ok)
1971 {
1972 if (!((*info->callbacks->reloc_dangerous)
1973 (info, error_message, input_bfd, input_section,
1974 rel->r_offset)))
1975 return FALSE;
1976 }
1977 rel->r_addend = 0;
1978 }
1979 }
1980
1049f94e 1981 /* Done with work for relocatable link; continue with next reloc. */
e0001a05
NC
1982 continue;
1983 }
1984
1985 /* This is a final link. */
1986
1987 h = NULL;
1988 sym = NULL;
1989 sec = NULL;
1990 is_weak_undef = FALSE;
1991 unresolved_reloc = FALSE;
9b8c98a4 1992 warned = FALSE;
e0001a05
NC
1993
1994 if (howto->partial_inplace)
1995 {
1996 /* Because R_XTENSA_32 was made partial_inplace to fix some
1997 problems with DWARF info in partial links, there may be
1998 an addend stored in the contents. Take it out of there
1999 and move it back into the addend field of the reloc. */
2000 rel->r_addend += bfd_get_32 (input_bfd, contents + rel->r_offset);
2001 bfd_put_32 (input_bfd, 0, contents + rel->r_offset);
2002 }
2003
2004 if (r_symndx < symtab_hdr->sh_info)
2005 {
2006 sym = local_syms + r_symndx;
2007 sec = local_sections[r_symndx];
2008 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
2009 }
2010 else
2011 {
560e09e9
NC
2012 RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
2013 symtab_hdr, relocation, sec,
2014 unresolved_reloc, info,
2015 warned);
2016
2017 if (relocation == 0
2018 && !unresolved_reloc
2019 && h->root.type == bfd_link_hash_undefweak)
e0001a05 2020 is_weak_undef = TRUE;
e0001a05
NC
2021 }
2022
2023 if (relaxing_section)
2024 {
2025 /* Check if this references a section in another input file. */
2026 do_fix_for_final_link (rel, input_section, &relocation);
2027
2028 /* Update some already cached values. */
2029 r_type = ELF32_R_TYPE (rel->r_info);
2030 howto = &elf_howto_table[r_type];
2031 }
2032
2033 /* Sanity check the address. */
2034 if (rel->r_offset >= input_section->_raw_size
2035 && ELF32_R_TYPE (rel->r_info) != R_XTENSA_NONE)
2036 {
2037 bfd_set_error (bfd_error_bad_value);
2038 return FALSE;
2039 }
2040
2041 /* Generate dynamic relocations. */
2042 if (elf_hash_table (info)->dynamic_sections_created)
2043 {
571b5725 2044 bfd_boolean dynamic_symbol = xtensa_elf_dynamic_symbol_p (h, info);
e0001a05
NC
2045
2046 if (dynamic_symbol && (r_type == R_XTENSA_OP0
2047 || r_type == R_XTENSA_OP1
2048 || r_type == R_XTENSA_OP2))
2049 {
2050 /* This is an error. The symbol's real value won't be known
2051 until runtime and it's likely to be out of range anyway. */
2052 const char *name = h->root.root.string;
2053 error_message = vsprint_msg ("invalid relocation for dynamic "
2054 "symbol", ": %s",
2055 strlen (name) + 2, name);
2056 if (!((*info->callbacks->reloc_dangerous)
2057 (info, error_message, input_bfd, input_section,
2058 rel->r_offset)))
2059 return FALSE;
2060 }
2061 else if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
2062 && (input_section->flags & SEC_ALLOC) != 0
2063 && (dynamic_symbol || info->shared))
2064 {
2065 Elf_Internal_Rela outrel;
2066 bfd_byte *loc;
2067 asection *srel;
2068
2069 if (dynamic_symbol && r_type == R_XTENSA_PLT)
2070 srel = srelplt;
2071 else
2072 srel = srelgot;
2073
2074 BFD_ASSERT (srel != NULL);
2075
2076 outrel.r_offset =
2077 _bfd_elf_section_offset (output_bfd, info,
2078 input_section, rel->r_offset);
2079
2080 if ((outrel.r_offset | 1) == (bfd_vma) -1)
2081 memset (&outrel, 0, sizeof outrel);
2082 else
2083 {
f0578e28
BW
2084 outrel.r_offset += (input_section->output_section->vma
2085 + input_section->output_offset);
e0001a05
NC
2086
2087 if (dynamic_symbol)
2088 {
2089 outrel.r_addend = rel->r_addend;
2090 rel->r_addend = 0;
2091
2092 if (r_type == R_XTENSA_32)
2093 {
2094 outrel.r_info =
2095 ELF32_R_INFO (h->dynindx, R_XTENSA_GLOB_DAT);
2096 relocation = 0;
2097 }
2098 else /* r_type == R_XTENSA_PLT */
2099 {
2100 outrel.r_info =
2101 ELF32_R_INFO (h->dynindx, R_XTENSA_JMP_SLOT);
2102
2103 /* Create the PLT entry and set the initial
2104 contents of the literal entry to the address of
2105 the PLT entry. */
2106 relocation =
2107 elf_xtensa_create_plt_entry (dynobj, output_bfd,
2108 srel->reloc_count);
2109 }
2110 unresolved_reloc = FALSE;
2111 }
2112 else
2113 {
2114 /* Generate a RELATIVE relocation. */
2115 outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
2116 outrel.r_addend = 0;
2117 }
2118 }
2119
2120 loc = (srel->contents
2121 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2122 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2123 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2124 <= srel->_cooked_size);
2125 }
2126 }
2127
2128 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2129 because such sections are not SEC_ALLOC and thus ld.so will
2130 not process them. */
2131 if (unresolved_reloc
2132 && !((input_section->flags & SEC_DEBUGGING) != 0
2133 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
2134 (*_bfd_error_handler)
2135 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
2136 bfd_archive_filename (input_bfd),
2137 bfd_get_section_name (input_bfd, input_section),
2138 (long) rel->r_offset,
2139 h->root.root.string);
2140
2141 /* There's no point in calling bfd_perform_relocation here.
2142 Just go directly to our "special function". */
2143 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2144 relocation + rel->r_addend,
2145 contents, rel->r_offset, is_weak_undef,
2146 &error_message);
2147
9b8c98a4 2148 if (r != bfd_reloc_ok && !warned)
e0001a05
NC
2149 {
2150 const char *name;
2151
2152 BFD_ASSERT (r == bfd_reloc_dangerous);
2153 BFD_ASSERT (error_message != (char *) NULL);
2154
2155 if (h != NULL)
2156 name = h->root.root.string;
2157 else
2158 {
2159 name = bfd_elf_string_from_elf_section
2160 (input_bfd, symtab_hdr->sh_link, sym->st_name);
2161 if (name && *name == '\0')
2162 name = bfd_section_name (input_bfd, sec);
2163 }
2164 if (name)
2165 error_message = vsprint_msg (error_message, ": %s",
2166 strlen (name), name);
2167 if (!((*info->callbacks->reloc_dangerous)
2168 (info, error_message, input_bfd, input_section,
2169 rel->r_offset)))
2170 return FALSE;
2171 }
2172 }
2173
2174 return TRUE;
2175}
2176
2177
2178/* Finish up dynamic symbol handling. There's not much to do here since
2179 the PLT and GOT entries are all set up by relocate_section. */
2180
2181static bfd_boolean
2182elf_xtensa_finish_dynamic_symbol (output_bfd, info, h, sym)
2183 bfd *output_bfd ATTRIBUTE_UNUSED;
2184 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2185 struct elf_link_hash_entry *h;
2186 Elf_Internal_Sym *sym;
2187{
2188 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
2189 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2190 {
2191 /* Mark the symbol as undefined, rather than as defined in
2192 the .plt section. Leave the value alone. */
2193 sym->st_shndx = SHN_UNDEF;
2194 }
2195
2196 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2197 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2198 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2199 sym->st_shndx = SHN_ABS;
2200
2201 return TRUE;
2202}
2203
2204
2205/* Combine adjacent literal table entries in the output. Adjacent
2206 entries within each input section may have been removed during
2207 relaxation, but we repeat the process here, even though it's too late
2208 to shrink the output section, because it's important to minimize the
2209 number of literal table entries to reduce the start-up work for the
2210 runtime linker. Returns the number of remaining table entries or -1
2211 on error. */
2212
2213static int
e901de89 2214elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc)
e0001a05 2215 bfd *output_bfd;
e901de89
BW
2216 asection *sxtlit;
2217 asection *sgotloc;
e0001a05 2218{
e0001a05
NC
2219 bfd_byte *contents;
2220 property_table_entry *table;
e901de89 2221 bfd_size_type section_size, sgotloc_size;
e0001a05
NC
2222 bfd_vma offset;
2223 int n, m, num;
2224
e901de89
BW
2225 section_size = (sxtlit->_cooked_size != 0
2226 ? sxtlit->_cooked_size : sxtlit->_raw_size);
e0001a05
NC
2227 BFD_ASSERT (section_size % 8 == 0);
2228 num = section_size / 8;
2229
e901de89
BW
2230 sgotloc_size = (sgotloc->_cooked_size != 0
2231 ? sgotloc->_cooked_size : sgotloc->_raw_size);
2232 if (sgotloc_size != section_size)
b536dc1e
BW
2233 {
2234 (*_bfd_error_handler)
2235 ("internal inconsistency in size of .got.loc section");
2236 return -1;
2237 }
e901de89 2238
e0001a05
NC
2239 contents = (bfd_byte *) bfd_malloc (section_size);
2240 table = (property_table_entry *)
2241 bfd_malloc (num * sizeof (property_table_entry));
2242 if (contents == 0 || table == 0)
2243 return -1;
2244
2245 /* The ".xt.lit.plt" section has the SEC_IN_MEMORY flag set and this
2246 propagates to the output section, where it doesn't really apply and
2247 where it breaks the following call to bfd_get_section_contents. */
e901de89 2248 sxtlit->flags &= ~SEC_IN_MEMORY;
e0001a05 2249
e901de89
BW
2250 if (! bfd_get_section_contents (output_bfd, sxtlit, contents, 0,
2251 section_size))
e0001a05
NC
2252 return -1;
2253
2254 /* There should never be any relocations left at this point, so this
2255 is quite a bit easier than what is done during relaxation. */
2256
2257 /* Copy the raw contents into a property table array and sort it. */
2258 offset = 0;
2259 for (n = 0; n < num; n++)
2260 {
2261 table[n].address = bfd_get_32 (output_bfd, &contents[offset]);
2262 table[n].size = bfd_get_32 (output_bfd, &contents[offset + 4]);
2263 offset += 8;
2264 }
2265 qsort (table, num, sizeof (property_table_entry), property_table_compare);
2266
2267 for (n = 0; n < num; n++)
2268 {
2269 bfd_boolean remove = FALSE;
2270
2271 if (table[n].size == 0)
2272 remove = TRUE;
2273 else if (n > 0 &&
2274 (table[n-1].address + table[n-1].size == table[n].address))
2275 {
2276 table[n-1].size += table[n].size;
2277 remove = TRUE;
2278 }
2279
2280 if (remove)
2281 {
2282 for (m = n; m < num - 1; m++)
2283 {
2284 table[m].address = table[m+1].address;
2285 table[m].size = table[m+1].size;
2286 }
2287
2288 n--;
2289 num--;
2290 }
2291 }
2292
2293 /* Copy the data back to the raw contents. */
2294 offset = 0;
2295 for (n = 0; n < num; n++)
2296 {
2297 bfd_put_32 (output_bfd, table[n].address, &contents[offset]);
2298 bfd_put_32 (output_bfd, table[n].size, &contents[offset + 4]);
2299 offset += 8;
2300 }
2301
2302 /* Clear the removed bytes. */
2303 if ((bfd_size_type) (num * 8) < section_size)
2304 {
2305 memset (&contents[num * 8], 0, section_size - num * 8);
e901de89 2306 sxtlit->_cooked_size = num * 8;
e0001a05
NC
2307 }
2308
e901de89
BW
2309 if (! bfd_set_section_contents (output_bfd, sxtlit, contents, 0,
2310 section_size))
e0001a05
NC
2311 return -1;
2312
e901de89
BW
2313 /* Copy the contents to ".got.loc". */
2314 memcpy (sgotloc->contents, contents, section_size);
2315
e0001a05
NC
2316 free (contents);
2317 return num;
2318}
2319
2320
2321/* Finish up the dynamic sections. */
2322
2323static bfd_boolean
2324elf_xtensa_finish_dynamic_sections (output_bfd, info)
2325 bfd *output_bfd;
2326 struct bfd_link_info *info;
2327{
2328 bfd *dynobj;
e901de89 2329 asection *sdyn, *srelplt, *sgot, *sxtlit, *sgotloc;
e0001a05
NC
2330 Elf32_External_Dyn *dyncon, *dynconend;
2331 int num_xtlit_entries;
2332
2333 if (! elf_hash_table (info)->dynamic_sections_created)
2334 return TRUE;
2335
2336 dynobj = elf_hash_table (info)->dynobj;
2337 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2338 BFD_ASSERT (sdyn != NULL);
2339
2340 /* Set the first entry in the global offset table to the address of
2341 the dynamic section. */
2342 sgot = bfd_get_section_by_name (dynobj, ".got");
2343 if (sgot)
2344 {
2345 BFD_ASSERT (sgot->_raw_size == 4);
2346 if (sdyn == NULL)
2347 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2348 else
2349 bfd_put_32 (output_bfd,
2350 sdyn->output_section->vma + sdyn->output_offset,
2351 sgot->contents);
2352 }
2353
2354 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
2355 if (srelplt != NULL && srelplt->_raw_size != 0)
2356 {
2357 asection *sgotplt, *srelgot, *spltlittbl;
2358 int chunk, plt_chunks, plt_entries;
2359 Elf_Internal_Rela irela;
2360 bfd_byte *loc;
2361 unsigned rtld_reloc;
2362
2363 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");;
2364 BFD_ASSERT (srelgot != NULL);
2365
2366 spltlittbl = bfd_get_section_by_name (dynobj, ".xt.lit.plt");
2367 BFD_ASSERT (spltlittbl != NULL);
2368
2369 /* Find the first XTENSA_RTLD relocation. Presumably the rest
2370 of them follow immediately after.... */
2371 for (rtld_reloc = 0; rtld_reloc < srelgot->reloc_count; rtld_reloc++)
2372 {
2373 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
2374 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
2375 if (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD)
2376 break;
2377 }
2378 BFD_ASSERT (rtld_reloc < srelgot->reloc_count);
2379
2380 plt_entries = (srelplt->_raw_size / sizeof (Elf32_External_Rela));
2381 plt_chunks =
2382 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
2383
2384 for (chunk = 0; chunk < plt_chunks; chunk++)
2385 {
2386 int chunk_entries = 0;
2387
2388 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
2389 BFD_ASSERT (sgotplt != NULL);
2390
2391 /* Emit special RTLD relocations for the first two entries in
2392 each chunk of the .got.plt section. */
2393
2394 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
2395 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
2396 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
2397 irela.r_offset = (sgotplt->output_section->vma
2398 + sgotplt->output_offset);
2399 irela.r_addend = 1; /* tell rtld to set value to resolver function */
2400 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
2401 rtld_reloc += 1;
2402 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
2403
2404 /* Next literal immediately follows the first. */
2405 loc += sizeof (Elf32_External_Rela);
2406 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
2407 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
2408 irela.r_offset = (sgotplt->output_section->vma
2409 + sgotplt->output_offset + 4);
2410 /* Tell rtld to set value to object's link map. */
2411 irela.r_addend = 2;
2412 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
2413 rtld_reloc += 1;
2414 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
2415
2416 /* Fill in the literal table. */
2417 if (chunk < plt_chunks - 1)
2418 chunk_entries = PLT_ENTRIES_PER_CHUNK;
2419 else
2420 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
2421
2422 BFD_ASSERT ((unsigned) (chunk + 1) * 8 <= spltlittbl->_cooked_size);
2423 bfd_put_32 (output_bfd,
2424 sgotplt->output_section->vma + sgotplt->output_offset,
2425 spltlittbl->contents + (chunk * 8) + 0);
2426 bfd_put_32 (output_bfd,
2427 8 + (chunk_entries * 4),
2428 spltlittbl->contents + (chunk * 8) + 4);
2429 }
2430
2431 /* All the dynamic relocations have been emitted at this point.
2432 Make sure the relocation sections are the correct size. */
2433 if (srelgot->_cooked_size != (sizeof (Elf32_External_Rela)
2434 * srelgot->reloc_count)
2435 || srelplt->_cooked_size != (sizeof (Elf32_External_Rela)
2436 * srelplt->reloc_count))
2437 abort ();
2438
2439 /* The .xt.lit.plt section has just been modified. This must
2440 happen before the code below which combines adjacent literal
2441 table entries, and the .xt.lit.plt contents have to be forced to
2442 the output here. */
2443 if (! bfd_set_section_contents (output_bfd,
2444 spltlittbl->output_section,
2445 spltlittbl->contents,
2446 spltlittbl->output_offset,
2447 spltlittbl->_raw_size))
2448 return FALSE;
2449 /* Clear SEC_HAS_CONTENTS so the contents won't be output again. */
2450 spltlittbl->flags &= ~SEC_HAS_CONTENTS;
2451 }
2452
2453 /* Combine adjacent literal table entries. */
1049f94e 2454 BFD_ASSERT (! info->relocatable);
e901de89
BW
2455 sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");
2456 sgotloc = bfd_get_section_by_name (dynobj, ".got.loc");
b536dc1e 2457 BFD_ASSERT (sxtlit && sgotloc);
e901de89
BW
2458 num_xtlit_entries =
2459 elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc);
e0001a05
NC
2460 if (num_xtlit_entries < 0)
2461 return FALSE;
2462
2463 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2464 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2465 for (; dyncon < dynconend; dyncon++)
2466 {
2467 Elf_Internal_Dyn dyn;
2468 const char *name;
2469 asection *s;
2470
2471 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2472
2473 switch (dyn.d_tag)
2474 {
2475 default:
2476 break;
2477
2478 case DT_XTENSA_GOT_LOC_SZ:
e0001a05
NC
2479 dyn.d_un.d_val = num_xtlit_entries;
2480 break;
2481
2482 case DT_XTENSA_GOT_LOC_OFF:
e901de89 2483 name = ".got.loc";
e0001a05
NC
2484 goto get_vma;
2485 case DT_PLTGOT:
2486 name = ".got";
2487 goto get_vma;
2488 case DT_JMPREL:
2489 name = ".rela.plt";
2490 get_vma:
2491 s = bfd_get_section_by_name (output_bfd, name);
2492 BFD_ASSERT (s);
2493 dyn.d_un.d_ptr = s->vma;
2494 break;
2495
2496 case DT_PLTRELSZ:
2497 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2498 BFD_ASSERT (s);
2499 dyn.d_un.d_val = (s->_cooked_size ? s->_cooked_size : s->_raw_size);
2500 break;
2501
2502 case DT_RELASZ:
2503 /* Adjust RELASZ to not include JMPREL. This matches what
2504 glibc expects and what is done for several other ELF
2505 targets (e.g., i386, alpha), but the "correct" behavior
2506 seems to be unresolved. Since the linker script arranges
2507 for .rela.plt to follow all other relocation sections, we
2508 don't have to worry about changing the DT_RELA entry. */
2509 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2510 if (s)
2511 {
2512 dyn.d_un.d_val -=
2513 (s->_cooked_size ? s->_cooked_size : s->_raw_size);
2514 }
2515 break;
2516 }
2517
2518 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2519 }
2520
2521 return TRUE;
2522}
2523
2524\f
2525/* Functions for dealing with the e_flags field. */
2526
2527/* Merge backend specific data from an object file to the output
2528 object file when linking. */
2529
2530static bfd_boolean
2531elf_xtensa_merge_private_bfd_data (ibfd, obfd)
2532 bfd *ibfd;
2533 bfd *obfd;
2534{
2535 unsigned out_mach, in_mach;
2536 flagword out_flag, in_flag;
2537
2538 /* Check if we have the same endianess. */
2539 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
2540 return FALSE;
2541
2542 /* Don't even pretend to support mixed-format linking. */
2543 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2544 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2545 return FALSE;
2546
2547 out_flag = elf_elfheader (obfd)->e_flags;
2548 in_flag = elf_elfheader (ibfd)->e_flags;
2549
2550 out_mach = out_flag & EF_XTENSA_MACH;
2551 in_mach = in_flag & EF_XTENSA_MACH;
2552 if (out_mach != in_mach)
2553 {
2554 (*_bfd_error_handler)
b536dc1e 2555 ("%s: incompatible machine type. Output is 0x%x. Input is 0x%x",
e0001a05
NC
2556 bfd_archive_filename (ibfd), out_mach, in_mach);
2557 bfd_set_error (bfd_error_wrong_format);
2558 return FALSE;
2559 }
2560
2561 if (! elf_flags_init (obfd))
2562 {
2563 elf_flags_init (obfd) = TRUE;
2564 elf_elfheader (obfd)->e_flags = in_flag;
2565
2566 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2567 && bfd_get_arch_info (obfd)->the_default)
2568 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
2569 bfd_get_mach (ibfd));
2570
2571 return TRUE;
2572 }
2573
2574 if ((out_flag & EF_XTENSA_XT_INSN) !=
2575 (in_flag & EF_XTENSA_XT_INSN))
2576 elf_elfheader(obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
2577
2578 if ((out_flag & EF_XTENSA_XT_LIT) !=
2579 (in_flag & EF_XTENSA_XT_LIT))
2580 elf_elfheader(obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
2581
2582 return TRUE;
2583}
2584
2585
2586static bfd_boolean
2587elf_xtensa_set_private_flags (abfd, flags)
2588 bfd *abfd;
2589 flagword flags;
2590{
2591 BFD_ASSERT (!elf_flags_init (abfd)
2592 || elf_elfheader (abfd)->e_flags == flags);
2593
2594 elf_elfheader (abfd)->e_flags |= flags;
2595 elf_flags_init (abfd) = TRUE;
2596
2597 return TRUE;
2598}
2599
2600
2601extern flagword
2602elf_xtensa_get_private_bfd_flags (abfd)
2603 bfd *abfd;
2604{
2605 return elf_elfheader (abfd)->e_flags;
2606}
2607
2608
2609static bfd_boolean
2610elf_xtensa_print_private_bfd_data (abfd, farg)
2611 bfd *abfd;
2612 PTR farg;
2613{
2614 FILE *f = (FILE *) farg;
2615 flagword e_flags = elf_elfheader (abfd)->e_flags;
2616
2617 fprintf (f, "\nXtensa header:\n");
2618 if ((e_flags & EF_XTENSA_MACH) == E_XTENSA_MACH)
2619 fprintf (f, "\nMachine = Base\n");
2620 else
2621 fprintf (f, "\nMachine Id = 0x%x\n", e_flags & EF_XTENSA_MACH);
2622
2623 fprintf (f, "Insn tables = %s\n",
2624 (e_flags & EF_XTENSA_XT_INSN) ? "true" : "false");
2625
2626 fprintf (f, "Literal tables = %s\n",
2627 (e_flags & EF_XTENSA_XT_LIT) ? "true" : "false");
2628
2629 return _bfd_elf_print_private_bfd_data (abfd, farg);
2630}
2631
2632
2633/* Set the right machine number for an Xtensa ELF file. */
2634
2635static bfd_boolean
2636elf_xtensa_object_p (abfd)
2637 bfd *abfd;
2638{
2639 int mach;
2640 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
2641
2642 switch (arch)
2643 {
2644 case E_XTENSA_MACH:
2645 mach = bfd_mach_xtensa;
2646 break;
2647 default:
2648 return FALSE;
2649 }
2650
2651 (void) bfd_default_set_arch_mach (abfd, bfd_arch_xtensa, mach);
2652 return TRUE;
2653}
2654
2655
2656/* The final processing done just before writing out an Xtensa ELF object
2657 file. This gets the Xtensa architecture right based on the machine
2658 number. */
2659
2660static void
2661elf_xtensa_final_write_processing (abfd, linker)
2662 bfd *abfd;
2663 bfd_boolean linker ATTRIBUTE_UNUSED;
2664{
2665 int mach;
2666 unsigned long val;
2667
2668 switch (mach = bfd_get_mach (abfd))
2669 {
2670 case bfd_mach_xtensa:
2671 val = E_XTENSA_MACH;
2672 break;
2673 default:
2674 return;
2675 }
2676
2677 elf_elfheader (abfd)->e_flags &= (~ EF_XTENSA_MACH);
2678 elf_elfheader (abfd)->e_flags |= val;
2679}
2680
2681
2682static enum elf_reloc_type_class
2683elf_xtensa_reloc_type_class (rela)
2684 const Elf_Internal_Rela *rela;
2685{
2686 switch ((int) ELF32_R_TYPE (rela->r_info))
2687 {
2688 case R_XTENSA_RELATIVE:
2689 return reloc_class_relative;
2690 case R_XTENSA_JMP_SLOT:
2691 return reloc_class_plt;
2692 default:
2693 return reloc_class_normal;
2694 }
2695}
2696
2697\f
2698static bfd_boolean
2699elf_xtensa_discard_info_for_section (abfd, cookie, info, sec)
2700 bfd *abfd;
2701 struct elf_reloc_cookie *cookie;
2702 struct bfd_link_info *info;
2703 asection *sec;
2704{
2705 bfd_byte *contents;
2706 bfd_vma section_size;
2707 bfd_vma offset, actual_offset;
2708 size_t removed_bytes = 0;
2709
2710 section_size = (sec->_cooked_size ? sec->_cooked_size : sec->_raw_size);
2711 if (section_size == 0 || section_size % 8 != 0)
2712 return FALSE;
2713
2714 if (sec->output_section
2715 && bfd_is_abs_section (sec->output_section))
2716 return FALSE;
2717
2718 contents = retrieve_contents (abfd, sec, info->keep_memory);
2719 if (!contents)
2720 return FALSE;
2721
2722 cookie->rels = retrieve_internal_relocs (abfd, sec, info->keep_memory);
2723 if (!cookie->rels)
2724 {
2725 release_contents (sec, contents);
2726 return FALSE;
2727 }
2728
2729 cookie->rel = cookie->rels;
2730 cookie->relend = cookie->rels + sec->reloc_count;
2731
2732 for (offset = 0; offset < section_size; offset += 8)
2733 {
2734 actual_offset = offset - removed_bytes;
2735
2736 /* The ...symbol_deleted_p function will skip over relocs but it
2737 won't adjust their offsets, so do that here. */
2738 while (cookie->rel < cookie->relend
2739 && cookie->rel->r_offset < offset)
2740 {
2741 cookie->rel->r_offset -= removed_bytes;
2742 cookie->rel++;
2743 }
2744
2745 while (cookie->rel < cookie->relend
2746 && cookie->rel->r_offset == offset)
2747 {
2748 if (_bfd_elf32_reloc_symbol_deleted_p (offset, cookie))
2749 {
2750 /* Remove the table entry. (If the reloc type is NONE, then
2751 the entry has already been merged with another and deleted
2752 during relaxation.) */
2753 if (ELF32_R_TYPE (cookie->rel->r_info) != R_XTENSA_NONE)
2754 {
2755 /* Shift the contents up. */
2756 if (offset + 8 < section_size)
2757 memmove (&contents[actual_offset],
2758 &contents[actual_offset+8],
2759 section_size - offset - 8);
2760 removed_bytes += 8;
2761 }
2762
2763 /* Remove this relocation. */
2764 cookie->rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
2765 }
2766
2767 /* Adjust the relocation offset for previous removals. This
2768 should not be done before calling ...symbol_deleted_p
2769 because it might mess up the offset comparisons there.
2770 Make sure the offset doesn't underflow in the case where
2771 the first entry is removed. */
2772 if (cookie->rel->r_offset >= removed_bytes)
2773 cookie->rel->r_offset -= removed_bytes;
2774 else
2775 cookie->rel->r_offset = 0;
2776
2777 cookie->rel++;
2778 }
2779 }
2780
2781 if (removed_bytes != 0)
2782 {
2783 /* Adjust any remaining relocs (shouldn't be any). */
2784 for (; cookie->rel < cookie->relend; cookie->rel++)
2785 {
2786 if (cookie->rel->r_offset >= removed_bytes)
2787 cookie->rel->r_offset -= removed_bytes;
2788 else
2789 cookie->rel->r_offset = 0;
2790 }
2791
2792 /* Clear the removed bytes. */
2793 memset (&contents[section_size - removed_bytes], 0, removed_bytes);
2794
2795 pin_contents (sec, contents);
2796 pin_internal_relocs (sec, cookie->rels);
2797
2798 sec->_cooked_size = section_size - removed_bytes;
2799 /* Also shrink _raw_size. See comments in relax_property_section. */
2800 sec->_raw_size = sec->_cooked_size;
b536dc1e
BW
2801
2802 if (xtensa_is_littable_section (sec))
2803 {
2804 bfd *dynobj = elf_hash_table (info)->dynobj;
2805 if (dynobj)
2806 {
2807 asection *sgotloc =
2808 bfd_get_section_by_name (dynobj, ".got.loc");
2809 if (sgotloc)
2810 {
2811 bfd_size_type sgotloc_size =
2812 (sgotloc->_cooked_size ? sgotloc->_cooked_size
2813 : sgotloc->_raw_size);
2814 sgotloc->_cooked_size = sgotloc_size - removed_bytes;
2815 sgotloc->_raw_size = sgotloc_size - removed_bytes;
2816 }
2817 }
2818 }
e0001a05
NC
2819 }
2820 else
2821 {
2822 release_contents (sec, contents);
2823 release_internal_relocs (sec, cookie->rels);
2824 }
2825
2826 return (removed_bytes != 0);
2827}
2828
2829
2830static bfd_boolean
2831elf_xtensa_discard_info (abfd, cookie, info)
2832 bfd *abfd;
2833 struct elf_reloc_cookie *cookie;
2834 struct bfd_link_info *info;
2835{
2836 asection *sec;
2837 bfd_boolean changed = FALSE;
2838
2839 for (sec = abfd->sections; sec != NULL; sec = sec->next)
2840 {
2841 if (xtensa_is_property_section (sec))
2842 {
2843 if (elf_xtensa_discard_info_for_section (abfd, cookie, info, sec))
2844 changed = TRUE;
2845 }
2846 }
2847
2848 return changed;
2849}
2850
2851
2852static bfd_boolean
2853elf_xtensa_ignore_discarded_relocs (sec)
2854 asection *sec;
2855{
2856 return xtensa_is_property_section (sec);
2857}
2858
2859\f
2860/* Support for core dump NOTE sections. */
2861
2862static bfd_boolean
2863elf_xtensa_grok_prstatus (abfd, note)
2864 bfd *abfd;
2865 Elf_Internal_Note *note;
2866{
2867 int offset;
2868 unsigned int raw_size;
2869
2870 /* The size for Xtensa is variable, so don't try to recognize the format
2871 based on the size. Just assume this is GNU/Linux. */
2872
2873 /* pr_cursig */
2874 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2875
2876 /* pr_pid */
2877 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2878
2879 /* pr_reg */
2880 offset = 72;
2881 raw_size = note->descsz - offset - 4;
2882
2883 /* Make a ".reg/999" section. */
2884 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2885 raw_size, note->descpos + offset);
2886}
2887
2888
2889static bfd_boolean
2890elf_xtensa_grok_psinfo (abfd, note)
2891 bfd *abfd;
2892 Elf_Internal_Note *note;
2893{
2894 switch (note->descsz)
2895 {
2896 default:
2897 return FALSE;
2898
2899 case 128: /* GNU/Linux elf_prpsinfo */
2900 elf_tdata (abfd)->core_program
2901 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2902 elf_tdata (abfd)->core_command
2903 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2904 }
2905
2906 /* Note that for some reason, a spurious space is tacked
2907 onto the end of the args in some (at least one anyway)
2908 implementations, so strip it off if it exists. */
2909
2910 {
2911 char *command = elf_tdata (abfd)->core_command;
2912 int n = strlen (command);
2913
2914 if (0 < n && command[n - 1] == ' ')
2915 command[n - 1] = '\0';
2916 }
2917
2918 return TRUE;
2919}
2920
2921\f
2922/* Generic Xtensa configurability stuff. */
2923
2924static xtensa_opcode callx0_op = XTENSA_UNDEFINED;
2925static xtensa_opcode callx4_op = XTENSA_UNDEFINED;
2926static xtensa_opcode callx8_op = XTENSA_UNDEFINED;
2927static xtensa_opcode callx12_op = XTENSA_UNDEFINED;
2928static xtensa_opcode call0_op = XTENSA_UNDEFINED;
2929static xtensa_opcode call4_op = XTENSA_UNDEFINED;
2930static xtensa_opcode call8_op = XTENSA_UNDEFINED;
2931static xtensa_opcode call12_op = XTENSA_UNDEFINED;
2932
2933static void
2934init_call_opcodes ()
2935{
2936 if (callx0_op == XTENSA_UNDEFINED)
2937 {
2938 callx0_op = xtensa_opcode_lookup (xtensa_default_isa, "callx0");
2939 callx4_op = xtensa_opcode_lookup (xtensa_default_isa, "callx4");
2940 callx8_op = xtensa_opcode_lookup (xtensa_default_isa, "callx8");
2941 callx12_op = xtensa_opcode_lookup (xtensa_default_isa, "callx12");
2942 call0_op = xtensa_opcode_lookup (xtensa_default_isa, "call0");
2943 call4_op = xtensa_opcode_lookup (xtensa_default_isa, "call4");
2944 call8_op = xtensa_opcode_lookup (xtensa_default_isa, "call8");
2945 call12_op = xtensa_opcode_lookup (xtensa_default_isa, "call12");
2946 }
2947}
2948
2949
2950static bfd_boolean
2951is_indirect_call_opcode (opcode)
2952 xtensa_opcode opcode;
2953{
2954 init_call_opcodes ();
2955 return (opcode == callx0_op
2956 || opcode == callx4_op
2957 || opcode == callx8_op
2958 || opcode == callx12_op);
2959}
2960
2961
2962static bfd_boolean
2963is_direct_call_opcode (opcode)
2964 xtensa_opcode opcode;
2965{
2966 init_call_opcodes ();
2967 return (opcode == call0_op
2968 || opcode == call4_op
2969 || opcode == call8_op
2970 || opcode == call12_op);
2971}
2972
2973
2974static bfd_boolean
2975is_windowed_call_opcode (opcode)
2976 xtensa_opcode opcode;
2977{
2978 init_call_opcodes ();
2979 return (opcode == call4_op
2980 || opcode == call8_op
2981 || opcode == call12_op
2982 || opcode == callx4_op
2983 || opcode == callx8_op
2984 || opcode == callx12_op);
2985}
2986
2987
2988static xtensa_opcode
2989get_l32r_opcode (void)
2990{
2991 static xtensa_opcode l32r_opcode = XTENSA_UNDEFINED;
2992 if (l32r_opcode == XTENSA_UNDEFINED)
2993 {
2994 l32r_opcode = xtensa_opcode_lookup (xtensa_default_isa, "l32r");
2995 BFD_ASSERT (l32r_opcode != XTENSA_UNDEFINED);
2996 }
2997 return l32r_opcode;
2998}
2999
3000
3001static bfd_vma
3002l32r_offset (addr, pc)
3003 bfd_vma addr;
3004 bfd_vma pc;
3005{
3006 bfd_vma offset;
3007
3008 offset = addr - ((pc+3) & -4);
3009 BFD_ASSERT ((offset & ((1 << 2) - 1)) == 0);
3010 offset = (signed int) offset >> 2;
3011 BFD_ASSERT ((signed int) offset >> 16 == -1);
3012 return offset;
3013}
3014
3015
3016/* Get the operand number for a PC-relative relocation.
3017 If the relocation is not a PC-relative one, return (-1). */
3018
3019static int
3020get_relocation_opnd (irel)
3021 Elf_Internal_Rela *irel;
3022{
3023 if (ELF32_R_TYPE (irel->r_info) < R_XTENSA_OP0
3024 || ELF32_R_TYPE (irel->r_info) >= R_XTENSA_max)
3025 return -1;
3026 return ELF32_R_TYPE (irel->r_info) - R_XTENSA_OP0;
3027}
3028
3029
3030/* Get the opcode for a relocation. */
3031
3032static xtensa_opcode
3033get_relocation_opcode (sec, contents, irel)
3034 asection *sec;
3035 bfd_byte *contents;
3036 Elf_Internal_Rela *irel;
3037{
3038 static xtensa_insnbuf ibuff = NULL;
3039 xtensa_isa isa = xtensa_default_isa;
3040
3041 if (get_relocation_opnd (irel) == -1)
3042 return XTENSA_UNDEFINED;
3043
3044 if (contents == NULL)
3045 return XTENSA_UNDEFINED;
3046
3047 if (sec->_raw_size <= irel->r_offset)
3048 return XTENSA_UNDEFINED;
3049
3050 if (ibuff == NULL)
3051 ibuff = xtensa_insnbuf_alloc (isa);
3052
3053 /* Decode the instruction. */
3054 xtensa_insnbuf_from_chars (isa, ibuff, &contents[irel->r_offset]);
3055 return xtensa_decode_insn (isa, ibuff);
3056}
3057
3058
3059bfd_boolean
3060is_l32r_relocation (sec, contents, irel)
3061 asection *sec;
3062 bfd_byte *contents;
3063 Elf_Internal_Rela *irel;
3064{
3065 xtensa_opcode opcode;
3066
3067 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_OP1)
3068 return FALSE;
3069
3070 opcode = get_relocation_opcode (sec, contents, irel);
3071 return (opcode == get_l32r_opcode ());
3072}
3073
3074\f
3075/* Code for transforming CALLs at link-time. */
3076
3077static bfd_reloc_status_type
3078elf_xtensa_do_asm_simplify (contents, address, content_length)
3079 bfd_byte *contents;
3080 bfd_vma address;
3081 bfd_vma content_length;
3082{
3083 static xtensa_insnbuf insnbuf = NULL;
3084 xtensa_opcode opcode;
3085 xtensa_operand operand;
3086 xtensa_opcode direct_call_opcode;
3087 xtensa_isa isa = xtensa_default_isa;
3088 bfd_byte *chbuf = contents + address;
3089 int opn;
3090
3091 if (insnbuf == NULL)
3092 insnbuf = xtensa_insnbuf_alloc (isa);
3093
3094 if (content_length < address)
3095 {
3096 (*_bfd_error_handler)
b536dc1e 3097 ("Attempt to convert L32R/CALLX to CALL failed");
e0001a05
NC
3098 return bfd_reloc_other;
3099 }
3100
3101 opcode = get_expanded_call_opcode (chbuf, content_length - address);
3102 direct_call_opcode = swap_callx_for_call_opcode (opcode);
3103 if (direct_call_opcode == XTENSA_UNDEFINED)
3104 {
3105 (*_bfd_error_handler)
b536dc1e 3106 ("Attempt to convert L32R/CALLX to CALL failed");
e0001a05
NC
3107 return bfd_reloc_other;
3108 }
3109
3110 /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset. */
3111 opcode = xtensa_opcode_lookup (isa, "or");
3112 xtensa_encode_insn (isa, opcode, insnbuf);
3113 for (opn = 0; opn < 3; opn++)
3114 {
3115 operand = xtensa_get_operand (isa, opcode, opn);
3116 xtensa_operand_set_field (operand, insnbuf, 1);
3117 }
3118 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf);
3119
3120 /* Assemble a CALL ("callN 0") into the 3 byte offset. */
3121 xtensa_encode_insn (isa, direct_call_opcode, insnbuf);
3122 operand = xtensa_get_operand (isa, opcode, 0);
3123 xtensa_operand_set_field (operand, insnbuf, 0);
3124 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf + 3);
3125
3126 return bfd_reloc_ok;
3127}
3128
3129
3130static bfd_reloc_status_type
3131contract_asm_expansion (contents, content_length, irel)
3132 bfd_byte *contents;
3133 bfd_vma content_length;
3134 Elf_Internal_Rela *irel;
3135{
3136 bfd_reloc_status_type retval =
3137 elf_xtensa_do_asm_simplify (contents, irel->r_offset, content_length);
3138
3139 if (retval != bfd_reloc_ok)
3140 return retval;
3141
3142 /* Update the irel->r_offset field so that the right immediate and
3143 the right instruction are modified during the relocation. */
3144 irel->r_offset += 3;
3145 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_XTENSA_OP0);
3146 return bfd_reloc_ok;
3147}
3148
3149
3150static xtensa_opcode
3151swap_callx_for_call_opcode (opcode)
3152 xtensa_opcode opcode;
3153{
3154 init_call_opcodes ();
3155
3156 if (opcode == callx0_op) return call0_op;
3157 if (opcode == callx4_op) return call4_op;
3158 if (opcode == callx8_op) return call8_op;
3159 if (opcode == callx12_op) return call12_op;
3160
3161 /* Return XTENSA_UNDEFINED if the opcode is not an indirect call. */
3162 return XTENSA_UNDEFINED;
3163}
3164
3165
3166/* Check if "buf" is pointing to a "L32R aN; CALLX aN" sequence, and
3167 if so, return the CALLX opcode. If not, return XTENSA_UNDEFINED. */
3168
3169#define L32R_TARGET_REG_OPERAND 0
3170#define CALLN_SOURCE_OPERAND 0
3171
3172static xtensa_opcode
3173get_expanded_call_opcode (buf, bufsize)
3174 bfd_byte *buf;
3175 int bufsize;
3176{
3177 static xtensa_insnbuf insnbuf = NULL;
3178 xtensa_opcode opcode;
3179 xtensa_operand operand;
3180 xtensa_isa isa = xtensa_default_isa;
3181 uint32 regno, call_regno;
3182
3183 /* Buffer must be at least 6 bytes. */
3184 if (bufsize < 6)
3185 return XTENSA_UNDEFINED;
3186
3187 if (insnbuf == NULL)
3188 insnbuf = xtensa_insnbuf_alloc (isa);
3189
3190 xtensa_insnbuf_from_chars (isa, insnbuf, buf);
3191 opcode = xtensa_decode_insn (isa, insnbuf);
3192
3193 if (opcode != get_l32r_opcode ())
3194 return XTENSA_UNDEFINED;
3195
3196 operand = xtensa_get_operand (isa, opcode, L32R_TARGET_REG_OPERAND);
3197 regno = xtensa_operand_decode
3198 (operand, xtensa_operand_get_field (operand, insnbuf));
3199
3200 /* Next instruction should be an CALLXn with operand 0 == regno. */
3201 xtensa_insnbuf_from_chars (isa, insnbuf,
3202 buf + xtensa_insn_length (isa, opcode));
3203 opcode = xtensa_decode_insn (isa, insnbuf);
3204
3205 if (!is_indirect_call_opcode (opcode))
3206 return XTENSA_UNDEFINED;
3207
3208 operand = xtensa_get_operand (isa, opcode, CALLN_SOURCE_OPERAND);
3209 call_regno = xtensa_operand_decode
3210 (operand, xtensa_operand_get_field (operand, insnbuf));
3211 if (call_regno != regno)
3212 return XTENSA_UNDEFINED;
3213
3214 return opcode;
3215}
3216
3217\f
3218/* Data structures used during relaxation. */
3219
3220/* r_reloc: relocation values. */
3221
3222/* Through the relaxation process, we need to keep track of the values
3223 that will result from evaluating relocations. The standard ELF
3224 relocation structure is not sufficient for this purpose because we're
3225 operating on multiple input files at once, so we need to know which
3226 input file a relocation refers to. The r_reloc structure thus
3227 records both the input file (bfd) and ELF relocation.
3228
3229 For efficiency, an r_reloc also contains a "target_offset" field to
3230 cache the target-section-relative offset value that is represented by
3231 the relocation. */
3232
3233typedef struct r_reloc_struct r_reloc;
3234
3235struct r_reloc_struct
3236{
3237 bfd *abfd;
3238 Elf_Internal_Rela rela;
3239 bfd_vma target_offset;
3240};
3241
3242static bfd_boolean r_reloc_is_const
3243 PARAMS ((const r_reloc *));
3244static void r_reloc_init
3245 PARAMS ((r_reloc *, bfd *, Elf_Internal_Rela *));
3246static bfd_vma r_reloc_get_target_offset
3247 PARAMS ((const r_reloc *));
3248static asection *r_reloc_get_section
3249 PARAMS ((const r_reloc *));
3250static bfd_boolean r_reloc_is_defined
3251 PARAMS ((const r_reloc *));
3252static struct elf_link_hash_entry *r_reloc_get_hash_entry
3253 PARAMS ((const r_reloc *));
3254
3255
3256/* The r_reloc structure is included by value in literal_value, but not
3257 every literal_value has an associated relocation -- some are simple
3258 constants. In such cases, we set all the fields in the r_reloc
3259 struct to zero. The r_reloc_is_const function should be used to
3260 detect this case. */
3261
3262static bfd_boolean
3263r_reloc_is_const (r_rel)
3264 const r_reloc *r_rel;
3265{
3266 return (r_rel->abfd == NULL);
3267}
3268
3269
3270static void
3271r_reloc_init (r_rel, abfd, irel)
3272 r_reloc *r_rel;
3273 bfd *abfd;
3274 Elf_Internal_Rela *irel;
3275{
3276 if (irel != NULL)
3277 {
3278 r_rel->rela = *irel;
3279 r_rel->abfd = abfd;
3280 r_rel->target_offset = r_reloc_get_target_offset (r_rel);
3281 }
3282 else
3283 memset (r_rel, 0, sizeof (r_reloc));
3284}
3285
3286
3287static bfd_vma
3288r_reloc_get_target_offset (r_rel)
3289 const r_reloc *r_rel;
3290{
3291 bfd_vma target_offset;
3292 unsigned long r_symndx;
3293
3294 BFD_ASSERT (!r_reloc_is_const (r_rel));
3295 r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
3296 target_offset = get_elf_r_symndx_offset (r_rel->abfd, r_symndx);
3297 return (target_offset + r_rel->rela.r_addend);
3298}
3299
3300
3301static struct elf_link_hash_entry *
3302r_reloc_get_hash_entry (r_rel)
3303 const r_reloc *r_rel;
3304{
3305 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
3306 return get_elf_r_symndx_hash_entry (r_rel->abfd, r_symndx);
3307}
3308
3309
3310static asection *
3311r_reloc_get_section (r_rel)
3312 const r_reloc *r_rel;
3313{
3314 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
3315 return get_elf_r_symndx_section (r_rel->abfd, r_symndx);
3316}
3317
3318
3319static bfd_boolean
3320r_reloc_is_defined (r_rel)
3321 const r_reloc *r_rel;
3322{
3323 asection *sec = r_reloc_get_section (r_rel);
3324 if (sec == bfd_abs_section_ptr
3325 || sec == bfd_com_section_ptr
3326 || sec == bfd_und_section_ptr)
3327 return FALSE;
3328 return TRUE;
3329}
3330
3331\f
3332/* source_reloc: relocations that reference literal sections. */
3333
3334/* To determine whether literals can be coalesced, we need to first
3335 record all the relocations that reference the literals. The
3336 source_reloc structure below is used for this purpose. The
3337 source_reloc entries are kept in a per-literal-section array, sorted
3338 by offset within the literal section (i.e., target offset).
3339
3340 The source_sec and r_rel.rela.r_offset fields identify the source of
3341 the relocation. The r_rel field records the relocation value, i.e.,
3342 the offset of the literal being referenced. The opnd field is needed
3343 to determine the range of the immediate field to which the relocation
3344 applies, so we can determine whether another literal with the same
3345 value is within range. The is_null field is true when the relocation
3346 is being removed (e.g., when an L32R is being removed due to a CALLX
3347 that is converted to a direct CALL). */
3348
3349typedef struct source_reloc_struct source_reloc;
3350
3351struct source_reloc_struct
3352{
3353 asection *source_sec;
3354 r_reloc r_rel;
3355 xtensa_operand opnd;
3356 bfd_boolean is_null;
3357};
3358
3359
3360static void init_source_reloc
3361 PARAMS ((source_reloc *, asection *, const r_reloc *, xtensa_operand));
3362static source_reloc *find_source_reloc
3363 PARAMS ((source_reloc *, int, asection *, Elf_Internal_Rela *));
3364static int source_reloc_compare
3365 PARAMS ((const PTR, const PTR));
3366
3367
3368static void
3369init_source_reloc (reloc, source_sec, r_rel, opnd)
3370 source_reloc *reloc;
3371 asection *source_sec;
3372 const r_reloc *r_rel;
3373 xtensa_operand opnd;
3374{
3375 reloc->source_sec = source_sec;
3376 reloc->r_rel = *r_rel;
3377 reloc->opnd = opnd;
3378 reloc->is_null = FALSE;
3379}
3380
3381
3382/* Find the source_reloc for a particular source offset and relocation
3383 type. Note that the array is sorted by _target_ offset, so this is
3384 just a linear search. */
3385
3386static source_reloc *
3387find_source_reloc (src_relocs, src_count, sec, irel)
3388 source_reloc *src_relocs;
3389 int src_count;
3390 asection *sec;
3391 Elf_Internal_Rela *irel;
3392{
3393 int i;
3394
3395 for (i = 0; i < src_count; i++)
3396 {
3397 if (src_relocs[i].source_sec == sec
3398 && src_relocs[i].r_rel.rela.r_offset == irel->r_offset
3399 && (ELF32_R_TYPE (src_relocs[i].r_rel.rela.r_info)
3400 == ELF32_R_TYPE (irel->r_info)))
3401 return &src_relocs[i];
3402 }
3403
3404 return NULL;
3405}
3406
3407
3408static int
3409source_reloc_compare (ap, bp)
3410 const PTR ap;
3411 const PTR bp;
3412{
3413 const source_reloc *a = (const source_reloc *) ap;
3414 const source_reloc *b = (const source_reloc *) bp;
3415
3416 return (a->r_rel.target_offset - b->r_rel.target_offset);
3417}
3418
3419\f
3420/* Literal values and value hash tables. */
3421
3422/* Literals with the same value can be coalesced. The literal_value
3423 structure records the value of a literal: the "r_rel" field holds the
3424 information from the relocation on the literal (if there is one) and
3425 the "value" field holds the contents of the literal word itself.
3426
3427 The value_map structure records a literal value along with the
3428 location of a literal holding that value. The value_map hash table
3429 is indexed by the literal value, so that we can quickly check if a
3430 particular literal value has been seen before and is thus a candidate
3431 for coalescing. */
3432
3433typedef struct literal_value_struct literal_value;
3434typedef struct value_map_struct value_map;
3435typedef struct value_map_hash_table_struct value_map_hash_table;
3436
3437struct literal_value_struct
3438{
3439 r_reloc r_rel;
3440 unsigned long value;
3441};
3442
3443struct value_map_struct
3444{
3445 literal_value val; /* The literal value. */
3446 r_reloc loc; /* Location of the literal. */
3447 value_map *next;
3448};
3449
3450struct value_map_hash_table_struct
3451{
3452 unsigned bucket_count;
3453 value_map **buckets;
3454 unsigned count;
3455};
3456
3457
3458static bfd_boolean is_same_value
3459 PARAMS ((const literal_value *, const literal_value *));
3460static value_map_hash_table *value_map_hash_table_init
3461 PARAMS ((void));
3462static unsigned hash_literal_value
3463 PARAMS ((const literal_value *));
3464static unsigned hash_bfd_vma
3465 PARAMS ((bfd_vma));
3466static value_map *get_cached_value
3467 PARAMS ((value_map_hash_table *, const literal_value *));
3468static value_map *add_value_map
3469 PARAMS ((value_map_hash_table *, const literal_value *, const r_reloc *));
3470
3471
3472static bfd_boolean
3473is_same_value (src1, src2)
3474 const literal_value *src1;
3475 const literal_value *src2;
3476{
3477 if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
3478 return FALSE;
3479
3480 if (r_reloc_is_const (&src1->r_rel))
3481 return (src1->value == src2->value);
3482
3483 if (ELF32_R_TYPE (src1->r_rel.rela.r_info)
3484 != ELF32_R_TYPE (src2->r_rel.rela.r_info))
3485 return FALSE;
3486
3487 if (r_reloc_get_target_offset (&src1->r_rel)
3488 != r_reloc_get_target_offset (&src2->r_rel))
3489 return FALSE;
3490
3491 if (src1->value != src2->value)
3492 return FALSE;
3493
3494 /* Now check for the same section and the same elf_hash. */
3495 if (r_reloc_is_defined (&src1->r_rel))
3496 {
3497 if (r_reloc_get_section (&src1->r_rel)
3498 != r_reloc_get_section (&src2->r_rel))
3499 return FALSE;
3500 }
3501 else
3502 {
3503 if (r_reloc_get_hash_entry (&src1->r_rel)
3504 != r_reloc_get_hash_entry (&src2->r_rel))
3505 return FALSE;
3506
3507 if (r_reloc_get_hash_entry (&src1->r_rel) == 0)
3508 return FALSE;
3509 }
3510
3511 return TRUE;
3512}
3513
3514
3515/* Must be power of 2. */
3516#define INITIAL_HASH_RELOC_BUCKET_COUNT 1024
3517
3518static value_map_hash_table *
3519value_map_hash_table_init ()
3520{
3521 value_map_hash_table *values;
3522
3523 values = (value_map_hash_table *)
3524 bfd_malloc (sizeof (value_map_hash_table));
3525
3526 values->bucket_count = INITIAL_HASH_RELOC_BUCKET_COUNT;
3527 values->count = 0;
3528 values->buckets = (value_map **)
3529 bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
3530
3531 return values;
3532}
3533
3534
3535static unsigned
3536hash_bfd_vma (val)
3537 bfd_vma val;
3538{
3539 return (val >> 2) + (val >> 10);
3540}
3541
3542
3543static unsigned
3544hash_literal_value (src)
3545 const literal_value *src;
3546{
3547 unsigned hash_val;
560e09e9 3548
e0001a05
NC
3549 if (r_reloc_is_const (&src->r_rel))
3550 return hash_bfd_vma (src->value);
3551
3552 hash_val = (hash_bfd_vma (r_reloc_get_target_offset (&src->r_rel))
3553 + hash_bfd_vma (src->value));
3554
3555 /* Now check for the same section and the same elf_hash. */
3556 if (r_reloc_is_defined (&src->r_rel))
560e09e9 3557 hash_val += hash_bfd_vma ((bfd_vma) (unsigned) r_reloc_get_section (&src->r_rel));
e0001a05 3558 else
560e09e9 3559 hash_val += hash_bfd_vma ((bfd_vma) (unsigned) r_reloc_get_hash_entry (&src->r_rel));
e0001a05
NC
3560
3561 return hash_val;
3562}
3563
3564
3565/* Check if the specified literal_value has been seen before. */
3566
3567static value_map *
3568get_cached_value (map, val)
3569 value_map_hash_table *map;
3570 const literal_value *val;
3571{
3572 value_map *map_e;
3573 value_map *bucket;
3574 unsigned idx;
3575
3576 idx = hash_literal_value (val);
3577 idx = idx & (map->bucket_count - 1);
3578 bucket = map->buckets[idx];
3579 for (map_e = bucket; map_e; map_e = map_e->next)
3580 {
3581 if (is_same_value (&map_e->val, val))
3582 return map_e;
3583 }
3584 return NULL;
3585}
3586
3587
3588/* Record a new literal value. It is illegal to call this if VALUE
3589 already has an entry here. */
3590
3591static value_map *
3592add_value_map (map, val, loc)
3593 value_map_hash_table *map;
3594 const literal_value *val;
3595 const r_reloc *loc;
3596{
3597 value_map **bucket_p;
3598 unsigned idx;
3599
3600 value_map *val_e = (value_map *) bfd_zmalloc (sizeof (value_map));
3601
3602 BFD_ASSERT (get_cached_value (map, val) == NULL);
3603 val_e->val = *val;
3604 val_e->loc = *loc;
3605
3606 idx = hash_literal_value (val);
3607 idx = idx & (map->bucket_count - 1);
3608 bucket_p = &map->buckets[idx];
3609
3610 val_e->next = *bucket_p;
3611 *bucket_p = val_e;
3612 map->count++;
3613 /* FIXME: consider resizing the hash table if we get too many entries */
3614
3615 return val_e;
3616}
3617
3618\f
3619/* Lists of literals being coalesced or removed. */
3620
3621/* In the usual case, the literal identified by "from" is being
3622 coalesced with another literal identified by "to". If the literal is
3623 unused and is being removed altogether, "to.abfd" will be NULL.
3624 The removed_literal entries are kept on a per-section list, sorted
3625 by the "from" offset field. */
3626
3627typedef struct removed_literal_struct removed_literal;
3628typedef struct removed_literal_list_struct removed_literal_list;
3629
3630struct removed_literal_struct
3631{
3632 r_reloc from;
3633 r_reloc to;
3634 removed_literal *next;
3635};
3636
3637struct removed_literal_list_struct
3638{
3639 removed_literal *head;
3640 removed_literal *tail;
3641};
3642
3643
3644static void add_removed_literal
3645 PARAMS ((removed_literal_list *, const r_reloc *, const r_reloc *));
3646static removed_literal *find_removed_literal
3647 PARAMS ((removed_literal_list *, bfd_vma));
3648static bfd_vma offset_with_removed_literals
3649 PARAMS ((removed_literal_list *, bfd_vma));
3650
3651
3652/* Record that the literal at "from" is being removed. If "to" is not
3653 NULL, the "from" literal is being coalesced with the "to" literal. */
3654
3655static void
3656add_removed_literal (removed_list, from, to)
3657 removed_literal_list *removed_list;
3658 const r_reloc *from;
3659 const r_reloc *to;
3660{
3661 removed_literal *r, *new_r, *next_r;
3662
3663 new_r = (removed_literal *) bfd_zmalloc (sizeof (removed_literal));
3664
3665 new_r->from = *from;
3666 if (to)
3667 new_r->to = *to;
3668 else
3669 new_r->to.abfd = NULL;
3670 new_r->next = NULL;
3671
3672 r = removed_list->head;
3673 if (r == NULL)
3674 {
3675 removed_list->head = new_r;
3676 removed_list->tail = new_r;
3677 }
3678 /* Special check for common case of append. */
3679 else if (removed_list->tail->from.target_offset < from->target_offset)
3680 {
3681 removed_list->tail->next = new_r;
3682 removed_list->tail = new_r;
3683 }
3684 else
3685 {
3686 while (r->from.target_offset < from->target_offset
3687 && r->next != NULL)
3688 {
3689 r = r->next;
3690 }
3691 next_r = r->next;
3692 r->next = new_r;
3693 new_r->next = next_r;
3694 if (next_r == NULL)
3695 removed_list->tail = new_r;
3696 }
3697}
3698
3699
3700/* Check if the list of removed literals contains an entry for the
3701 given address. Return the entry if found. */
3702
3703static removed_literal *
3704find_removed_literal (removed_list, addr)
3705 removed_literal_list *removed_list;
3706 bfd_vma addr;
3707{
3708 removed_literal *r = removed_list->head;
3709 while (r && r->from.target_offset < addr)
3710 r = r->next;
3711 if (r && r->from.target_offset == addr)
3712 return r;
3713 return NULL;
3714}
3715
3716
3717/* Adjust an offset in a section to compensate for literals that are
3718 being removed. Search the list of removed literals and subtract
3719 4 bytes for every removed literal prior to the given address. */
3720
3721static bfd_vma
3722offset_with_removed_literals (removed_list, addr)
3723 removed_literal_list *removed_list;
3724 bfd_vma addr;
3725{
3726 removed_literal *r = removed_list->head;
3727 unsigned num_bytes = 0;
3728
3729 if (r == NULL)
3730 return addr;
3731
3732 while (r && r->from.target_offset <= addr)
3733 {
3734 num_bytes += 4;
3735 r = r->next;
3736 }
3737 if (num_bytes > addr)
3738 return 0;
3739 return (addr - num_bytes);
3740}
3741
3742\f
3743/* Coalescing literals may require a relocation to refer to a section in
3744 a different input file, but the standard relocation information
3745 cannot express that. Instead, the reloc_bfd_fix structures are used
3746 to "fix" the relocations that refer to sections in other input files.
3747 These structures are kept on per-section lists. The "src_type" field
3748 records the relocation type in case there are multiple relocations on
3749 the same location. FIXME: This is ugly; an alternative might be to
3750 add new symbols with the "owner" field to some other input file. */
3751
3752typedef struct reloc_bfd_fix_struct reloc_bfd_fix;
3753
3754struct reloc_bfd_fix_struct
3755{
3756 asection *src_sec;
3757 bfd_vma src_offset;
3758 unsigned src_type; /* Relocation type. */
3759
3760 bfd *target_abfd;
3761 asection *target_sec;
3762 bfd_vma target_offset;
3763
3764 reloc_bfd_fix *next;
3765};
3766
3767
3768static reloc_bfd_fix *reloc_bfd_fix_init
3769 PARAMS ((asection *, bfd_vma, unsigned, bfd *, asection *, bfd_vma));
3770static reloc_bfd_fix *get_bfd_fix
3771 PARAMS ((reloc_bfd_fix *, asection *, bfd_vma, unsigned));
3772
3773
3774static reloc_bfd_fix *
3775reloc_bfd_fix_init (src_sec, src_offset, src_type,
3776 target_abfd, target_sec, target_offset)
3777 asection *src_sec;
3778 bfd_vma src_offset;
3779 unsigned src_type;
3780 bfd *target_abfd;
3781 asection *target_sec;
3782 bfd_vma target_offset;
3783{
3784 reloc_bfd_fix *fix;
3785
3786 fix = (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix));
3787 fix->src_sec = src_sec;
3788 fix->src_offset = src_offset;
3789 fix->src_type = src_type;
3790 fix->target_abfd = target_abfd;
3791 fix->target_sec = target_sec;
3792 fix->target_offset = target_offset;
3793
3794 return fix;
3795}
3796
3797
3798static reloc_bfd_fix *
3799get_bfd_fix (fix_list, sec, offset, type)
3800 reloc_bfd_fix *fix_list;
3801 asection *sec;
3802 bfd_vma offset;
3803 unsigned type;
3804{
3805 reloc_bfd_fix *r;
3806
3807 for (r = fix_list; r != NULL; r = r->next)
3808 {
3809 if (r->src_sec == sec
3810 && r->src_offset == offset
3811 && r->src_type == type)
3812 return r;
3813 }
3814 return NULL;
3815}
3816
3817\f
3818/* Per-section data for relaxation. */
3819
3820struct xtensa_relax_info_struct
3821{
3822 bfd_boolean is_relaxable_literal_section;
3823 int visited; /* Number of times visited. */
3824
3825 source_reloc *src_relocs; /* Array[src_count]. */
3826 int src_count;
3827 int src_next; /* Next src_relocs entry to assign. */
3828
3829 removed_literal_list removed_list;
3830
3831 reloc_bfd_fix *fix_list;
3832};
3833
3834struct elf_xtensa_section_data
3835{
3836 struct bfd_elf_section_data elf;
3837 xtensa_relax_info relax_info;
3838};
3839
3840static void init_xtensa_relax_info
3841 PARAMS ((asection *));
3842static xtensa_relax_info *get_xtensa_relax_info
3843 PARAMS ((asection *));
3844static void add_fix
3845 PARAMS ((asection *, reloc_bfd_fix *));
3846
3847
3848static bfd_boolean
3849elf_xtensa_new_section_hook (abfd, sec)
3850 bfd *abfd;
3851 asection *sec;
3852{
3853 struct elf_xtensa_section_data *sdata;
3854 bfd_size_type amt = sizeof (*sdata);
3855
3856 sdata = (struct elf_xtensa_section_data *) bfd_zalloc (abfd, amt);
3857 if (sdata == NULL)
3858 return FALSE;
3859 sec->used_by_bfd = (PTR) sdata;
3860
3861 return _bfd_elf_new_section_hook (abfd, sec);
3862}
3863
3864
3865static void
3866init_xtensa_relax_info (sec)
3867 asection *sec;
3868{
3869 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
3870
3871 relax_info->is_relaxable_literal_section = FALSE;
3872 relax_info->visited = 0;
3873
3874 relax_info->src_relocs = NULL;
3875 relax_info->src_count = 0;
3876 relax_info->src_next = 0;
3877
3878 relax_info->removed_list.head = NULL;
3879 relax_info->removed_list.tail = NULL;
3880
3881 relax_info->fix_list = NULL;
3882}
3883
3884
3885static xtensa_relax_info *
3886get_xtensa_relax_info (sec)
3887 asection *sec;
3888{
3889 struct elf_xtensa_section_data *section_data;
3890
3891 /* No info available if no section or if it is an output section. */
3892 if (!sec || sec == sec->output_section)
3893 return NULL;
3894
3895 section_data = (struct elf_xtensa_section_data *) elf_section_data (sec);
3896 return &section_data->relax_info;
3897}
3898
3899
3900static void
3901add_fix (src_sec, fix)
3902 asection *src_sec;
3903 reloc_bfd_fix *fix;
3904{
3905 xtensa_relax_info *relax_info;
3906
3907 relax_info = get_xtensa_relax_info (src_sec);
3908 fix->next = relax_info->fix_list;
3909 relax_info->fix_list = fix;
3910}
3911
3912\f
3913/* Access to internal relocations, section contents and symbols. */
3914
3915/* During relaxation, we need to modify relocations, section contents,
3916 and symbol definitions, and we need to keep the original values from
3917 being reloaded from the input files, i.e., we need to "pin" the
3918 modified values in memory. We also want to continue to observe the
3919 setting of the "keep-memory" flag. The following functions wrap the
3920 standard BFD functions to take care of this for us. */
3921
3922static Elf_Internal_Rela *
3923retrieve_internal_relocs (abfd, sec, keep_memory)
3924 bfd *abfd;
3925 asection *sec;
3926 bfd_boolean keep_memory;
3927{
3928 Elf_Internal_Rela *internal_relocs;
3929
3930 if ((sec->flags & SEC_LINKER_CREATED) != 0)
3931 return NULL;
3932
3933 internal_relocs = elf_section_data (sec)->relocs;
3934 if (internal_relocs == NULL)
45d6a902 3935 internal_relocs = (_bfd_elf_link_read_relocs
e0001a05
NC
3936 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
3937 keep_memory));
3938 return internal_relocs;
3939}
3940
3941
3942static void
3943pin_internal_relocs (sec, internal_relocs)
3944 asection *sec;
3945 Elf_Internal_Rela *internal_relocs;
3946{
3947 elf_section_data (sec)->relocs = internal_relocs;
3948}
3949
3950
3951static void
3952release_internal_relocs (sec, internal_relocs)
3953 asection *sec;
3954 Elf_Internal_Rela *internal_relocs;
3955{
3956 if (internal_relocs
3957 && elf_section_data (sec)->relocs != internal_relocs)
3958 free (internal_relocs);
3959}
3960
3961
3962static bfd_byte *
3963retrieve_contents (abfd, sec, keep_memory)
3964 bfd *abfd;
3965 asection *sec;
3966 bfd_boolean keep_memory;
3967{
3968 bfd_byte *contents;
3969
3970 contents = elf_section_data (sec)->this_hdr.contents;
3971
3972 if (contents == NULL && sec->_raw_size != 0)
3973 {
3974 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
3975 if (contents != NULL)
3976 {
3977 if (! bfd_get_section_contents (abfd, sec, contents,
3978 (file_ptr) 0, sec->_raw_size))
3979 {
3980 free (contents);
3981 return NULL;
3982 }
3983 if (keep_memory)
3984 elf_section_data (sec)->this_hdr.contents = contents;
3985 }
3986 }
3987 return contents;
3988}
3989
3990
3991static void
3992pin_contents (sec, contents)
3993 asection *sec;
3994 bfd_byte *contents;
3995{
3996 elf_section_data (sec)->this_hdr.contents = contents;
3997}
3998
3999
4000static void
4001release_contents (sec, contents)
4002 asection *sec;
4003 bfd_byte *contents;
4004{
4005 if (contents &&
4006 elf_section_data (sec)->this_hdr.contents != contents)
4007 free (contents);
4008}
4009
4010
4011static Elf_Internal_Sym *
4012retrieve_local_syms (input_bfd)
4013 bfd *input_bfd;
4014{
4015 Elf_Internal_Shdr *symtab_hdr;
4016 Elf_Internal_Sym *isymbuf;
4017 size_t locsymcount;
4018
4019 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4020 locsymcount = symtab_hdr->sh_info;
4021
4022 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
4023 if (isymbuf == NULL && locsymcount != 0)
4024 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
4025 NULL, NULL, NULL);
4026
4027 /* Save the symbols for this input file so they won't be read again. */
4028 if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
4029 symtab_hdr->contents = (unsigned char *) isymbuf;
4030
4031 return isymbuf;
4032}
4033
4034\f
4035/* Code for link-time relaxation. */
4036
4037/* Local helper functions. */
4038static bfd_boolean analyze_relocations
4039 PARAMS ((struct bfd_link_info *));
4040static bfd_boolean find_relaxable_sections
4041 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
4042static bfd_boolean collect_source_relocs
4043 PARAMS ((bfd *, asection *, struct bfd_link_info *));
4044static bfd_boolean is_resolvable_asm_expansion
4045 PARAMS ((bfd *, asection *, bfd_byte *, Elf_Internal_Rela *,
4046 struct bfd_link_info *, bfd_boolean *));
4047static bfd_boolean remove_literals
4048 PARAMS ((bfd *, asection *, struct bfd_link_info *, value_map_hash_table *));
4049static bfd_boolean relax_section
4050 PARAMS ((bfd *, asection *, struct bfd_link_info *));
4051static bfd_boolean relax_property_section
4052 PARAMS ((bfd *, asection *, struct bfd_link_info *));
4053static bfd_boolean relax_section_symbols
4054 PARAMS ((bfd *, asection *));
4055static bfd_boolean relocations_reach
4056 PARAMS ((source_reloc *, int, const r_reloc *));
4057static void translate_reloc
4058 PARAMS ((const r_reloc *, r_reloc *));
4059static Elf_Internal_Rela *get_irel_at_offset
4060 PARAMS ((asection *, Elf_Internal_Rela *, bfd_vma));
4061static Elf_Internal_Rela *find_associated_l32r_irel
4062 PARAMS ((asection *, bfd_byte *, Elf_Internal_Rela *,
4063 Elf_Internal_Rela *));
4064static void shrink_dynamic_reloc_sections
4065 PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *));
4066
4067
4068static bfd_boolean
4069elf_xtensa_relax_section (abfd, sec, link_info, again)
4070 bfd *abfd;
4071 asection *sec;
4072 struct bfd_link_info *link_info;
4073 bfd_boolean *again;
4074{
4075 static value_map_hash_table *values = NULL;
4076 xtensa_relax_info *relax_info;
4077
4078 if (!values)
4079 {
4080 /* Do some overall initialization for relaxation. */
4081 values = value_map_hash_table_init ();
4082 relaxing_section = TRUE;
4083 if (!analyze_relocations (link_info))
4084 return FALSE;
4085 }
4086 *again = FALSE;
4087
4088 /* Don't mess with linker-created sections. */
4089 if ((sec->flags & SEC_LINKER_CREATED) != 0)
4090 return TRUE;
4091
4092 relax_info = get_xtensa_relax_info (sec);
4093 BFD_ASSERT (relax_info != NULL);
4094
4095 switch (relax_info->visited)
4096 {
4097 case 0:
4098 /* Note: It would be nice to fold this pass into
4099 analyze_relocations, but it is important for this step that the
4100 sections be examined in link order. */
4101 if (!remove_literals (abfd, sec, link_info, values))
4102 return FALSE;
4103 *again = TRUE;
4104 break;
4105
4106 case 1:
4107 if (!relax_section (abfd, sec, link_info))
4108 return FALSE;
4109 *again = TRUE;
4110 break;
4111
4112 case 2:
4113 if (!relax_section_symbols (abfd, sec))
4114 return FALSE;
4115 break;
4116 }
4117
4118 relax_info->visited++;
4119 return TRUE;
4120}
4121
4122/* Initialization for relaxation. */
4123
4124/* This function is called once at the start of relaxation. It scans
4125 all the input sections and marks the ones that are relaxable (i.e.,
4126 literal sections with L32R relocations against them). It then
4127 collect source_reloc information for all the relocations against
4128 those relaxable sections. */
4129
4130static bfd_boolean
4131analyze_relocations (link_info)
4132 struct bfd_link_info *link_info;
4133{
4134 bfd *abfd;
4135 asection *sec;
4136 bfd_boolean is_relaxable = FALSE;
4137
4138 /* Initialize the per-section relaxation info. */
4139 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
4140 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4141 {
4142 init_xtensa_relax_info (sec);
4143 }
4144
4145 /* Mark relaxable sections (and count relocations against each one). */
4146 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
4147 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4148 {
4149 if (!find_relaxable_sections (abfd, sec, link_info, &is_relaxable))
4150 return FALSE;
4151 }
4152
4153 /* Bail out if there are no relaxable sections. */
4154 if (!is_relaxable)
4155 return TRUE;
4156
4157 /* Allocate space for source_relocs. */
4158 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
4159 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4160 {
4161 xtensa_relax_info *relax_info;
4162
4163 relax_info = get_xtensa_relax_info (sec);
4164 if (relax_info->is_relaxable_literal_section)
4165 {
4166 relax_info->src_relocs = (source_reloc *)
4167 bfd_malloc (relax_info->src_count * sizeof (source_reloc));
4168 }
4169 }
4170
4171 /* Collect info on relocations against each relaxable section. */
4172 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
4173 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4174 {
4175 if (!collect_source_relocs (abfd, sec, link_info))
4176 return FALSE;
4177 }
4178
4179 return TRUE;
4180}
4181
4182
4183/* Find all the literal sections that might be relaxed. The motivation
4184 for this pass is that collect_source_relocs() needs to record _all_
4185 the relocations that target each relaxable section. That is
4186 expensive and unnecessary unless the target section is actually going
4187 to be relaxed. This pass identifies all such sections by checking if
4188 they have L32Rs pointing to them. In the process, the total number
4189 of relocations targetting each section is also counted so that we
4190 know how much space to allocate for source_relocs against each
4191 relaxable literal section. */
4192
4193static bfd_boolean
4194find_relaxable_sections (abfd, sec, link_info, is_relaxable_p)
4195 bfd *abfd;
4196 asection *sec;
4197 struct bfd_link_info *link_info;
4198 bfd_boolean *is_relaxable_p;
4199{
4200 Elf_Internal_Rela *internal_relocs;
4201 bfd_byte *contents;
4202 bfd_boolean ok = TRUE;
4203 unsigned i;
4204
4205 internal_relocs = retrieve_internal_relocs (abfd, sec,
4206 link_info->keep_memory);
4207 if (internal_relocs == NULL)
4208 return ok;
4209
4210 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
4211 if (contents == NULL && sec->_raw_size != 0)
4212 {
4213 ok = FALSE;
4214 goto error_return;
4215 }
4216
4217 for (i = 0; i < sec->reloc_count; i++)
4218 {
4219 Elf_Internal_Rela *irel = &internal_relocs[i];
4220 r_reloc r_rel;
4221 asection *target_sec;
4222 xtensa_relax_info *target_relax_info;
4223
4224 r_reloc_init (&r_rel, abfd, irel);
4225
4226 target_sec = r_reloc_get_section (&r_rel);
4227 target_relax_info = get_xtensa_relax_info (target_sec);
4228 if (!target_relax_info)
4229 continue;
4230
4231 /* Count relocations against the target section. */
4232 target_relax_info->src_count++;
4233
4234 if (is_literal_section (target_sec)
4235 && is_l32r_relocation (sec, contents, irel)
4236 && r_reloc_is_defined (&r_rel))
4237 {
4238 /* Mark the target section as relaxable. */
4239 target_relax_info->is_relaxable_literal_section = TRUE;
4240 *is_relaxable_p = TRUE;
4241 }
4242 }
4243
4244 error_return:
4245 release_contents (sec, contents);
4246 release_internal_relocs (sec, internal_relocs);
4247 return ok;
4248}
4249
4250
4251/* Record _all_ the relocations that point to relaxable literal
4252 sections, and get rid of ASM_EXPAND relocs by either converting them
4253 to ASM_SIMPLIFY or by removing them. */
4254
4255static bfd_boolean
4256collect_source_relocs (abfd, sec, link_info)
4257 bfd *abfd;
4258 asection *sec;
4259 struct bfd_link_info *link_info;
4260{
4261 Elf_Internal_Rela *internal_relocs;
4262 bfd_byte *contents;
4263 bfd_boolean ok = TRUE;
4264 unsigned i;
4265
4266 internal_relocs = retrieve_internal_relocs (abfd, sec,
4267 link_info->keep_memory);
4268 if (internal_relocs == NULL)
4269 return ok;
4270
4271 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
4272 if (contents == NULL && sec->_raw_size != 0)
4273 {
4274 ok = FALSE;
4275 goto error_return;
4276 }
4277
4278 /* Record relocations against relaxable literal sections. */
4279 for (i = 0; i < sec->reloc_count; i++)
4280 {
4281 Elf_Internal_Rela *irel = &internal_relocs[i];
4282 r_reloc r_rel;
4283 asection *target_sec;
4284 xtensa_relax_info *target_relax_info;
4285
4286 r_reloc_init (&r_rel, abfd, irel);
4287
4288 target_sec = r_reloc_get_section (&r_rel);
4289 target_relax_info = get_xtensa_relax_info (target_sec);
4290
4291 if (target_relax_info
4292 && target_relax_info->is_relaxable_literal_section)
4293 {
4294 xtensa_opcode opcode;
4295 xtensa_operand opnd;
4296 source_reloc *s_reloc;
4297 int src_next;
4298
4299 src_next = target_relax_info->src_next++;
4300 s_reloc = &target_relax_info->src_relocs[src_next];
4301
4302 opcode = get_relocation_opcode (sec, contents, irel);
4303 if (opcode == XTENSA_UNDEFINED)
4304 opnd = NULL;
4305 else
4306 opnd = xtensa_get_operand (xtensa_default_isa, opcode,
4307 get_relocation_opnd (irel));
4308
4309 init_source_reloc (s_reloc, sec, &r_rel, opnd);
4310 }
4311 }
4312
4313 /* Now get rid of ASM_EXPAND relocations. At this point, the
4314 src_relocs array for the target literal section may still be
4315 incomplete, but it must at least contain the entries for the L32R
4316 relocations associated with ASM_EXPANDs because they were just
4317 added in the preceding loop over the relocations. */
4318
4319 for (i = 0; i < sec->reloc_count; i++)
4320 {
4321 Elf_Internal_Rela *irel = &internal_relocs[i];
4322 bfd_boolean is_reachable;
4323
4324 if (!is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
4325 &is_reachable))
4326 continue;
4327
4328 if (is_reachable)
4329 {
4330 Elf_Internal_Rela *l32r_irel;
4331 r_reloc r_rel;
4332 asection *target_sec;
4333 xtensa_relax_info *target_relax_info;
4334
4335 /* Mark the source_reloc for the L32R so that it will be
4336 removed in remove_literals(), along with the associated
4337 literal. */
4338 l32r_irel = find_associated_l32r_irel (sec, contents,
4339 irel, internal_relocs);
4340 if (l32r_irel == NULL)
4341 continue;
4342
4343 r_reloc_init (&r_rel, abfd, l32r_irel);
4344
4345 target_sec = r_reloc_get_section (&r_rel);
4346 target_relax_info = get_xtensa_relax_info (target_sec);
4347
4348 if (target_relax_info
4349 && target_relax_info->is_relaxable_literal_section)
4350 {
4351 source_reloc *s_reloc;
4352
4353 /* Search the source_relocs for the entry corresponding to
4354 the l32r_irel. Note: The src_relocs array is not yet
4355 sorted, but it wouldn't matter anyway because we're
4356 searching by source offset instead of target offset. */
4357 s_reloc = find_source_reloc (target_relax_info->src_relocs,
4358 target_relax_info->src_next,
4359 sec, l32r_irel);
4360 BFD_ASSERT (s_reloc);
4361 s_reloc->is_null = TRUE;
4362 }
4363
4364 /* Convert this reloc to ASM_SIMPLIFY. */
4365 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4366 R_XTENSA_ASM_SIMPLIFY);
4367 l32r_irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
4368
4369 pin_internal_relocs (sec, internal_relocs);
4370 }
4371 else
4372 {
4373 /* It is resolvable but doesn't reach. We resolve now
4374 by eliminating the relocation -- the call will remain
4375 expanded into L32R/CALLX. */
4376 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
4377 pin_internal_relocs (sec, internal_relocs);
4378 }
4379 }
4380
4381 error_return:
4382 release_contents (sec, contents);
4383 release_internal_relocs (sec, internal_relocs);
4384 return ok;
4385}
4386
4387
4388/* Return TRUE if the asm expansion can be resolved. Generally it can
4389 be resolved on a final link or when a partial link locates it in the
4390 same section as the target. Set "is_reachable" flag if the target of
4391 the call is within the range of a direct call, given the current VMA
4392 for this section and the target section. */
4393
4394bfd_boolean
4395is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
4396 is_reachable_p)
4397 bfd *abfd;
4398 asection *sec;
4399 bfd_byte *contents;
4400 Elf_Internal_Rela *irel;
4401 struct bfd_link_info *link_info;
4402 bfd_boolean *is_reachable_p;
4403{
4404 asection *target_sec;
4405 bfd_vma target_offset;
4406 r_reloc r_rel;
4407 xtensa_opcode opcode, direct_call_opcode;
4408 bfd_vma self_address;
4409 bfd_vma dest_address;
4410
4411 *is_reachable_p = FALSE;
4412
4413 if (contents == NULL)
4414 return FALSE;
4415
4416 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
4417 return FALSE;
4418
4419 opcode = get_expanded_call_opcode (contents + irel->r_offset,
4420 sec->_raw_size - irel->r_offset);
4421
4422 direct_call_opcode = swap_callx_for_call_opcode (opcode);
4423 if (direct_call_opcode == XTENSA_UNDEFINED)
4424 return FALSE;
4425
4426 /* Check and see that the target resolves. */
4427 r_reloc_init (&r_rel, abfd, irel);
4428 if (!r_reloc_is_defined (&r_rel))
4429 return FALSE;
4430
4431 target_sec = r_reloc_get_section (&r_rel);
4432 target_offset = r_reloc_get_target_offset (&r_rel);
4433
4434 /* If the target is in a shared library, then it doesn't reach. This
4435 isn't supposed to come up because the compiler should never generate
4436 non-PIC calls on systems that use shared libraries, but the linker
4437 shouldn't crash regardless. */
4438 if (!target_sec->output_section)
4439 return FALSE;
4440
1049f94e 4441 /* For relocatable sections, we can only simplify when the output
e0001a05
NC
4442 section of the target is the same as the output section of the
4443 source. */
1049f94e 4444 if (link_info->relocatable
e0001a05
NC
4445 && (target_sec->output_section != sec->output_section))
4446 return FALSE;
4447
4448 self_address = (sec->output_section->vma
4449 + sec->output_offset + irel->r_offset + 3);
4450 dest_address = (target_sec->output_section->vma
4451 + target_sec->output_offset + target_offset);
4452
4453 *is_reachable_p = pcrel_reloc_fits
4454 (xtensa_get_operand (xtensa_default_isa, direct_call_opcode, 0),
4455 self_address, dest_address);
4456
4457 if ((self_address >> CALL_SEGMENT_BITS) !=
4458 (dest_address >> CALL_SEGMENT_BITS))
4459 return FALSE;
4460
4461 return TRUE;
4462}
4463
4464
4465static Elf_Internal_Rela *
4466find_associated_l32r_irel (sec, contents, other_irel, internal_relocs)
4467 asection *sec;
4468 bfd_byte *contents;
4469 Elf_Internal_Rela *other_irel;
4470 Elf_Internal_Rela *internal_relocs;
4471{
4472 unsigned i;
4473
4474 for (i = 0; i < sec->reloc_count; i++)
4475 {
4476 Elf_Internal_Rela *irel = &internal_relocs[i];
4477
4478 if (irel == other_irel)
4479 continue;
4480 if (irel->r_offset != other_irel->r_offset)
4481 continue;
4482 if (is_l32r_relocation (sec, contents, irel))
4483 return irel;
4484 }
4485
4486 return NULL;
4487}
4488
4489/* First relaxation pass. */
4490
4491/* If the section is relaxable (i.e., a literal section), check each
4492 literal to see if it has the same value as another literal that has
4493 already been seen, either in the current section or a previous one.
4494 If so, add an entry to the per-section list of removed literals. The
4495 actual changes are deferred until the next pass. */
4496
4497static bfd_boolean
4498remove_literals (abfd, sec, link_info, values)
4499 bfd *abfd;
4500 asection *sec;
4501 struct bfd_link_info *link_info;
4502 value_map_hash_table *values;
4503{
4504 xtensa_relax_info *relax_info;
4505 bfd_byte *contents;
4506 Elf_Internal_Rela *internal_relocs;
4507 source_reloc *src_relocs;
4508 bfd_boolean ok = TRUE;
4509 int i;
4510
4511 /* Do nothing if it is not a relaxable literal section. */
4512 relax_info = get_xtensa_relax_info (sec);
4513 BFD_ASSERT (relax_info);
4514
4515 if (!relax_info->is_relaxable_literal_section)
4516 return ok;
4517
4518 internal_relocs = retrieve_internal_relocs (abfd, sec,
4519 link_info->keep_memory);
4520
4521 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
4522 if (contents == NULL && sec->_raw_size != 0)
4523 {
4524 ok = FALSE;
4525 goto error_return;
4526 }
4527
4528 /* Sort the source_relocs by target offset. */
4529 src_relocs = relax_info->src_relocs;
4530 qsort (src_relocs, relax_info->src_count,
4531 sizeof (source_reloc), source_reloc_compare);
4532
4533 for (i = 0; i < relax_info->src_count; i++)
4534 {
4535 source_reloc *rel;
4536 Elf_Internal_Rela *irel = NULL;
4537 literal_value val;
4538 value_map *val_map;
4539
4540 rel = &src_relocs[i];
4541 irel = get_irel_at_offset (sec, internal_relocs,
4542 rel->r_rel.target_offset);
4543
4544 /* If the target_offset for this relocation is the same as the
4545 previous relocation, then we've already considered whether the
4546 literal can be coalesced. Skip to the next one.... */
4547 if (i != 0 && (src_relocs[i-1].r_rel.target_offset
4548 == rel->r_rel.target_offset))
4549 continue;
4550
4551 /* Check if the relocation was from an L32R that is being removed
4552 because a CALLX was converted to a direct CALL, and check if
4553 there are no other relocations to the literal. */
4554 if (rel->is_null
4555 && (i == relax_info->src_count - 1
4556 || (src_relocs[i+1].r_rel.target_offset
4557 != rel->r_rel.target_offset)))
4558 {
4559 /* Mark the unused literal so that it will be removed. */
4560 add_removed_literal (&relax_info->removed_list, &rel->r_rel, NULL);
4561
4562 /* Zero out the relocation on this literal location. */
4563 if (irel)
4564 {
4565 if (elf_hash_table (link_info)->dynamic_sections_created)
4566 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
4567
4568 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
4569 }
4570
4571 continue;
4572 }
4573
4574 /* Find the literal value. */
4575 r_reloc_init (&val.r_rel, abfd, irel);
4576 BFD_ASSERT (rel->r_rel.target_offset < sec->_raw_size);
4577 val.value = bfd_get_32 (abfd, contents + rel->r_rel.target_offset);
4578
4579 /* Check if we've seen another literal with the same value. */
4580 val_map = get_cached_value (values, &val);
4581 if (val_map != NULL)
4582 {
4583 /* First check that THIS and all the other relocs to this
4584 literal will FIT if we move them to the new address. */
4585
4586 if (relocations_reach (rel, relax_info->src_count - i,
4587 &val_map->loc))
4588 {
4589 /* Mark that the literal will be coalesced. */
4590 add_removed_literal (&relax_info->removed_list,
4591 &rel->r_rel, &val_map->loc);
4592 }
4593 else
4594 {
4595 /* Relocations do not reach -- do not remove this literal. */
4596 val_map->loc = rel->r_rel;
4597 }
4598 }
4599 else
4600 {
4601 /* This is the first time we've seen this literal value. */
4602 BFD_ASSERT (sec == r_reloc_get_section (&rel->r_rel));
4603 add_value_map (values, &val, &rel->r_rel);
4604 }
4605 }
4606
4607error_return:
4608 release_contents (sec, contents);
4609 release_internal_relocs (sec, internal_relocs);
4610 return ok;
4611}
4612
4613
4614/* Check if the original relocations (presumably on L32R instructions)
4615 identified by reloc[0..N] can be changed to reference the literal
4616 identified by r_rel. If r_rel is out of range for any of the
4617 original relocations, then we don't want to coalesce the original
4618 literal with the one at r_rel. We only check reloc[0..N], where the
4619 offsets are all the same as for reloc[0] (i.e., they're all
4620 referencing the same literal) and where N is also bounded by the
4621 number of remaining entries in the "reloc" array. The "reloc" array
4622 is sorted by target offset so we know all the entries for the same
4623 literal will be contiguous. */
4624
4625static bfd_boolean
4626relocations_reach (reloc, remaining_relocs, r_rel)
4627 source_reloc *reloc;
4628 int remaining_relocs;
4629 const r_reloc *r_rel;
4630{
4631 bfd_vma from_offset, source_address, dest_address;
4632 asection *sec;
4633 int i;
4634
4635 if (!r_reloc_is_defined (r_rel))
4636 return FALSE;
4637
4638 sec = r_reloc_get_section (r_rel);
4639 from_offset = reloc[0].r_rel.target_offset;
4640
4641 for (i = 0; i < remaining_relocs; i++)
4642 {
4643 if (reloc[i].r_rel.target_offset != from_offset)
4644 break;
4645
4646 /* Ignore relocations that have been removed. */
4647 if (reloc[i].is_null)
4648 continue;
4649
4650 /* The original and new output section for these must be the same
4651 in order to coalesce. */
4652 if (r_reloc_get_section (&reloc[i].r_rel)->output_section
4653 != sec->output_section)
4654 return FALSE;
4655
4656 /* A NULL operand means it is not a PC-relative relocation, so
4657 the literal can be moved anywhere. */
4658 if (reloc[i].opnd)
4659 {
4660 /* Otherwise, check to see that it fits. */
4661 source_address = (reloc[i].source_sec->output_section->vma
4662 + reloc[i].source_sec->output_offset
4663 + reloc[i].r_rel.rela.r_offset);
4664 dest_address = (sec->output_section->vma
4665 + sec->output_offset
4666 + r_rel->target_offset);
4667
4668 if (!pcrel_reloc_fits (reloc[i].opnd, source_address, dest_address))
4669 return FALSE;
4670 }
4671 }
4672
4673 return TRUE;
4674}
4675
4676
4677/* WARNING: linear search here. If the relocation are in order by
4678 address, we can use a faster binary search. ALSO, we assume that
4679 there is only 1 non-NONE relocation per address. */
4680
4681static Elf_Internal_Rela *
4682get_irel_at_offset (sec, internal_relocs, offset)
4683 asection *sec;
4684 Elf_Internal_Rela *internal_relocs;
4685 bfd_vma offset;
4686{
4687 unsigned i;
4688 if (!internal_relocs)
4689 return NULL;
4690 for (i = 0; i < sec->reloc_count; i++)
4691 {
4692 Elf_Internal_Rela *irel = &internal_relocs[i];
4693 if (irel->r_offset == offset
4694 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
4695 return irel;
4696 }
4697 return NULL;
4698}
4699
4700\f
4701/* Second relaxation pass. */
4702
4703/* Modify all of the relocations to point to the right spot, and if this
4704 is a relaxable section, delete the unwanted literals and fix the
4705 cooked_size. */
4706
4707bfd_boolean
4708relax_section (abfd, sec, link_info)
4709 bfd *abfd;
4710 asection *sec;
4711 struct bfd_link_info *link_info;
4712{
4713 Elf_Internal_Rela *internal_relocs;
4714 xtensa_relax_info *relax_info;
4715 bfd_byte *contents;
4716 bfd_boolean ok = TRUE;
4717 unsigned i;
4718
4719 relax_info = get_xtensa_relax_info (sec);
4720 BFD_ASSERT (relax_info);
4721
4722 /* Handle property sections (e.g., literal tables) specially. */
4723 if (xtensa_is_property_section (sec))
4724 {
4725 BFD_ASSERT (!relax_info->is_relaxable_literal_section);
4726 return relax_property_section (abfd, sec, link_info);
4727 }
4728
4729 internal_relocs = retrieve_internal_relocs (abfd, sec,
4730 link_info->keep_memory);
4731 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
4732 if (contents == NULL && sec->_raw_size != 0)
4733 {
4734 ok = FALSE;
4735 goto error_return;
4736 }
4737
4738 if (internal_relocs)
4739 {
4740 for (i = 0; i < sec->reloc_count; i++)
4741 {
4742 Elf_Internal_Rela *irel;
4743 xtensa_relax_info *target_relax_info;
4744 bfd_vma source_offset;
4745 r_reloc r_rel;
4746 unsigned r_type;
4747 asection *target_sec;
4748
4749 /* Locally change the source address.
4750 Translate the target to the new target address.
4751 If it points to this section and has been removed,
4752 NULLify it.
4753 Write it back. */
4754
4755 irel = &internal_relocs[i];
4756 source_offset = irel->r_offset;
4757
4758 r_type = ELF32_R_TYPE (irel->r_info);
4759 r_reloc_init (&r_rel, abfd, irel);
4760
4761 if (relax_info->is_relaxable_literal_section)
4762 {
4763 if (r_type != R_XTENSA_NONE
4764 && find_removed_literal (&relax_info->removed_list,
4765 irel->r_offset))
4766 {
4767 /* Remove this relocation. */
4768 if (elf_hash_table (link_info)->dynamic_sections_created)
4769 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
4770 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
4771 irel->r_offset = offset_with_removed_literals
4772 (&relax_info->removed_list, irel->r_offset);
4773 continue;
4774 }
4775 source_offset =
4776 offset_with_removed_literals (&relax_info->removed_list,
4777 irel->r_offset);
4778 irel->r_offset = source_offset;
4779 }
4780
4781 target_sec = r_reloc_get_section (&r_rel);
4782 target_relax_info = get_xtensa_relax_info (target_sec);
4783
4784 if (target_relax_info
4785 && target_relax_info->is_relaxable_literal_section)
4786 {
4787 r_reloc new_rel;
4788 reloc_bfd_fix *fix;
4789
4790 translate_reloc (&r_rel, &new_rel);
4791
4792 /* FIXME: If the relocation still references a section in
4793 the same input file, the relocation should be modified
4794 directly instead of adding a "fix" record. */
4795
4796 fix = reloc_bfd_fix_init (sec, source_offset, r_type, 0,
4797 r_reloc_get_section (&new_rel),
4798 new_rel.target_offset);
4799 add_fix (sec, fix);
4800 }
4801
4802 pin_internal_relocs (sec, internal_relocs);
4803 }
4804 }
4805
4806 if (relax_info->is_relaxable_literal_section)
4807 {
4808 /* Walk through the contents and delete literals that are not needed
4809 anymore. */
4810
4811 unsigned long size = sec->_cooked_size;
4812 unsigned long removed = 0;
4813
4814 removed_literal *reloc = relax_info->removed_list.head;
4815 for (; reloc; reloc = reloc->next)
4816 {
4817 unsigned long upper = sec->_raw_size;
4818 bfd_vma start = reloc->from.target_offset + 4;
4819 if (reloc->next)
4820 upper = reloc->next->from.target_offset;
4821 if (upper - start != 0)
4822 {
4823 BFD_ASSERT (start <= upper);
4824 memmove (contents + start - removed - 4,
4825 contents + start,
4826 upper - start );
4827 pin_contents (sec, contents);
4828 }
4829 removed += 4;
4830 size -= 4;
4831 }
4832
4833 /* Change the section size. */
4834 sec->_cooked_size = size;
4835 /* Also shrink _raw_size. (The code in relocate_section that
4836 checks that relocations are within the section must use
4837 _raw_size because of the way the stabs sections are relaxed;
4838 shrinking _raw_size means that these checks will not be
4839 unnecessarily lax.) */
4840 sec->_raw_size = size;
4841 }
4842
4843 error_return:
4844 release_internal_relocs (sec, internal_relocs);
4845 release_contents (sec, contents);
4846 return ok;
4847}
4848
4849
4850/* Fix up a relocation to take account of removed literals. */
4851
4852static void
4853translate_reloc (orig_rel, new_rel)
4854 const r_reloc *orig_rel;
4855 r_reloc *new_rel;
4856{
4857 asection *sec;
4858 xtensa_relax_info *relax_info;
4859 removed_literal *removed;
4860 unsigned long new_offset;
4861
4862 *new_rel = *orig_rel;
4863
4864 if (!r_reloc_is_defined (orig_rel))
4865 return;
4866 sec = r_reloc_get_section (orig_rel);
4867
4868 relax_info = get_xtensa_relax_info (sec);
4869 BFD_ASSERT (relax_info);
4870
4871 if (!relax_info->is_relaxable_literal_section)
4872 return;
4873
4874 /* Check if the original relocation is against a literal being removed. */
4875 removed = find_removed_literal (&relax_info->removed_list,
4876 orig_rel->target_offset);
4877 if (removed)
4878 {
4879 asection *new_sec;
4880
4881 /* The fact that there is still a relocation to this literal indicates
4882 that the literal is being coalesced, not simply removed. */
4883 BFD_ASSERT (removed->to.abfd != NULL);
4884
4885 /* This was moved to some other address (possibly in another section). */
4886 *new_rel = removed->to;
4887 new_sec = r_reloc_get_section (new_rel);
4888 if (new_sec != sec)
4889 {
4890 sec = new_sec;
4891 relax_info = get_xtensa_relax_info (sec);
4892 if (!relax_info || !relax_info->is_relaxable_literal_section)
4893 return;
4894 }
4895 }
4896
4897 /* ...and the target address may have been moved within its section. */
4898 new_offset = offset_with_removed_literals (&relax_info->removed_list,
4899 new_rel->target_offset);
4900
4901 /* Modify the offset and addend. */
4902 new_rel->target_offset = new_offset;
4903 new_rel->rela.r_addend += (new_offset - new_rel->target_offset);
4904}
4905
4906
4907/* For dynamic links, there may be a dynamic relocation for each
4908 literal. The number of dynamic relocations must be computed in
4909 size_dynamic_sections, which occurs before relaxation. When a
4910 literal is removed, this function checks if there is a corresponding
4911 dynamic relocation and shrinks the size of the appropriate dynamic
4912 relocation section accordingly. At this point, the contents of the
4913 dynamic relocation sections have not yet been filled in, so there's
4914 nothing else that needs to be done. */
4915
4916static void
4917shrink_dynamic_reloc_sections (info, abfd, input_section, rel)
4918 struct bfd_link_info *info;
4919 bfd *abfd;
4920 asection *input_section;
4921 Elf_Internal_Rela *rel;
4922{
4923 Elf_Internal_Shdr *symtab_hdr;
4924 struct elf_link_hash_entry **sym_hashes;
4925 unsigned long r_symndx;
4926 int r_type;
4927 struct elf_link_hash_entry *h;
4928 bfd_boolean dynamic_symbol;
4929
4930 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4931 sym_hashes = elf_sym_hashes (abfd);
4932
4933 r_type = ELF32_R_TYPE (rel->r_info);
4934 r_symndx = ELF32_R_SYM (rel->r_info);
4935
4936 if (r_symndx < symtab_hdr->sh_info)
4937 h = NULL;
4938 else
4939 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4940
571b5725 4941 dynamic_symbol = xtensa_elf_dynamic_symbol_p (h, info);
e0001a05
NC
4942
4943 if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
4944 && (input_section->flags & SEC_ALLOC) != 0
4945 && (dynamic_symbol || info->shared))
4946 {
4947 bfd *dynobj;
4948 const char *srel_name;
4949 asection *srel;
4950 bfd_boolean is_plt = FALSE;
4951
4952 dynobj = elf_hash_table (info)->dynobj;
4953 BFD_ASSERT (dynobj != NULL);
4954
4955 if (dynamic_symbol && r_type == R_XTENSA_PLT)
4956 {
4957 srel_name = ".rela.plt";
4958 is_plt = TRUE;
4959 }
4960 else
4961 srel_name = ".rela.got";
4962
4963 /* Reduce size of the .rela.* section by one reloc. */
4964 srel = bfd_get_section_by_name (dynobj, srel_name);
4965 BFD_ASSERT (srel != NULL);
4966 BFD_ASSERT (srel->_cooked_size >= sizeof (Elf32_External_Rela));
4967 srel->_cooked_size -= sizeof (Elf32_External_Rela);
4968
4969 /* Also shrink _raw_size. (This seems wrong but other bfd code seems
4970 to assume that linker-created sections will never be relaxed and
4971 hence _raw_size must always equal _cooked_size.) */
4972 srel->_raw_size = srel->_cooked_size;
4973
4974 if (is_plt)
4975 {
4976 asection *splt, *sgotplt, *srelgot;
4977 int reloc_index, chunk;
4978
4979 /* Find the PLT reloc index of the entry being removed. This
4980 is computed from the size of ".rela.plt". It is needed to
4981 figure out which PLT chunk to resize. Usually "last index
4982 = size - 1" since the index starts at zero, but in this
4983 context, the size has just been decremented so there's no
4984 need to subtract one. */
4985 reloc_index = srel->_cooked_size / sizeof (Elf32_External_Rela);
4986
4987 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
4988 splt = elf_xtensa_get_plt_section (dynobj, chunk);
4989 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
4990 BFD_ASSERT (splt != NULL && sgotplt != NULL);
4991
4992 /* Check if an entire PLT chunk has just been eliminated. */
4993 if (reloc_index % PLT_ENTRIES_PER_CHUNK == 0)
4994 {
4995 /* The two magic GOT entries for that chunk can go away. */
4996 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
4997 BFD_ASSERT (srelgot != NULL);
4998 srelgot->reloc_count -= 2;
4999 srelgot->_cooked_size -= 2 * sizeof (Elf32_External_Rela);
5000 /* Shrink _raw_size (see comment above). */
5001 srelgot->_raw_size = srelgot->_cooked_size;
5002
5003 sgotplt->_cooked_size -= 8;
5004
5005 /* There should be only one entry left (and it will be
5006 removed below). */
5007 BFD_ASSERT (sgotplt->_cooked_size == 4);
5008 BFD_ASSERT (splt->_cooked_size == PLT_ENTRY_SIZE);
5009 }
5010
5011 BFD_ASSERT (sgotplt->_cooked_size >= 4);
5012 BFD_ASSERT (splt->_cooked_size >= PLT_ENTRY_SIZE);
5013
5014 sgotplt->_cooked_size -= 4;
5015 splt->_cooked_size -= PLT_ENTRY_SIZE;
5016
5017 /* Shrink _raw_sizes (see comment above). */
5018 sgotplt->_raw_size = sgotplt->_cooked_size;
5019 splt->_raw_size = splt->_cooked_size;
5020 }
5021 }
5022}
5023
5024
5025/* This is similar to relax_section except that when a target is moved,
5026 we shift addresses up. We also need to modify the size. This
5027 algorithm does NOT allow for relocations into the middle of the
5028 property sections. */
5029
5030static bfd_boolean
5031relax_property_section (abfd, sec, link_info)
5032 bfd *abfd;
5033 asection *sec;
5034 struct bfd_link_info *link_info;
5035{
5036 Elf_Internal_Rela *internal_relocs;
5037 bfd_byte *contents;
5038 unsigned i, nexti;
5039 bfd_boolean ok = TRUE;
5040
5041 internal_relocs = retrieve_internal_relocs (abfd, sec,
5042 link_info->keep_memory);
5043 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
5044 if (contents == NULL && sec->_raw_size != 0)
5045 {
5046 ok = FALSE;
5047 goto error_return;
5048 }
5049
5050 if (internal_relocs)
5051 {
5052 for (i = 0; i < sec->reloc_count; i++)
5053 {
5054 Elf_Internal_Rela *irel;
5055 xtensa_relax_info *target_relax_info;
5056 r_reloc r_rel;
5057 unsigned r_type;
5058 asection *target_sec;
5059
5060 /* Locally change the source address.
5061 Translate the target to the new target address.
5062 If it points to this section and has been removed, MOVE IT.
5063 Also, don't forget to modify the associated SIZE at
5064 (offset + 4). */
5065
5066 irel = &internal_relocs[i];
5067 r_type = ELF32_R_TYPE (irel->r_info);
5068 if (r_type == R_XTENSA_NONE)
5069 continue;
5070
5071 r_reloc_init (&r_rel, abfd, irel);
5072
5073 target_sec = r_reloc_get_section (&r_rel);
5074 target_relax_info = get_xtensa_relax_info (target_sec);
5075
5076 if (target_relax_info
5077 && target_relax_info->is_relaxable_literal_section)
5078 {
5079 /* Translate the relocation's destination. */
5080 bfd_vma new_offset;
5081 bfd_vma new_end_offset;
5082 bfd_byte *size_p;
5083 long old_size, new_size;
5084
5085 new_offset =
5086 offset_with_removed_literals (&target_relax_info->removed_list,
5087 r_rel.target_offset);
5088
5089 /* Assert that we are not out of bounds. */
5090 size_p = &contents[irel->r_offset + 4];
5091 old_size = bfd_get_32 (abfd, &contents[irel->r_offset + 4]);
5092
5093 new_end_offset =
5094 offset_with_removed_literals (&target_relax_info->removed_list,
5095 r_rel.target_offset + old_size);
5096
5097 new_size = new_end_offset - new_offset;
5098 if (new_size != old_size)
5099 {
5100 bfd_put_32 (abfd, new_size, size_p);
5101 pin_contents (sec, contents);
5102 }
5103
5104 if (new_offset != r_rel.target_offset)
5105 {
5106 bfd_vma diff = new_offset - r_rel.target_offset;
5107 irel->r_addend += diff;
5108 pin_internal_relocs (sec, internal_relocs);
5109 }
5110 }
5111 }
5112 }
5113
5114 /* Combine adjacent property table entries. This is also done in
5115 finish_dynamic_sections() but at that point it's too late to
5116 reclaim the space in the output section, so we do this twice. */
5117
5118 if (internal_relocs)
5119 {
5120 Elf_Internal_Rela *last_irel = NULL;
5121 int removed_bytes = 0;
5122 bfd_vma offset, last_irel_offset;
5123 bfd_vma section_size;
5124
5125 /* Walk over memory and irels at the same time.
5126 This REQUIRES that the internal_relocs be sorted by offset. */
5127 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
5128 internal_reloc_compare);
5129 nexti = 0; /* Index into internal_relocs. */
5130
5131 pin_internal_relocs (sec, internal_relocs);
5132 pin_contents (sec, contents);
5133
5134 last_irel_offset = (bfd_vma) -1;
5135 section_size = (sec->_cooked_size ? sec->_cooked_size : sec->_raw_size);
5136 BFD_ASSERT (section_size % 8 == 0);
5137
5138 for (offset = 0; offset < section_size; offset += 8)
5139 {
5140 Elf_Internal_Rela *irel, *next_irel;
5141 bfd_vma bytes_to_remove, size, actual_offset;
5142 bfd_boolean remove_this_irel;
5143
5144 irel = NULL;
5145 next_irel = NULL;
5146
5147 /* Find the next two relocations (if there are that many left),
5148 skipping over any R_XTENSA_NONE relocs. On entry, "nexti" is
5149 the starting reloc index. After these two loops, "i"
5150 is the index of the first non-NONE reloc past that starting
5151 index, and "nexti" is the index for the next non-NONE reloc
5152 after "i". */
5153
5154 for (i = nexti; i < sec->reloc_count; i++)
5155 {
5156 if (ELF32_R_TYPE (internal_relocs[i].r_info) != R_XTENSA_NONE)
5157 {
5158 irel = &internal_relocs[i];
5159 break;
5160 }
5161 internal_relocs[i].r_offset -= removed_bytes;
5162 }
5163
5164 for (nexti = i + 1; nexti < sec->reloc_count; nexti++)
5165 {
5166 if (ELF32_R_TYPE (internal_relocs[nexti].r_info)
5167 != R_XTENSA_NONE)
5168 {
5169 next_irel = &internal_relocs[nexti];
5170 break;
5171 }
5172 internal_relocs[nexti].r_offset -= removed_bytes;
5173 }
5174
5175 remove_this_irel = FALSE;
5176 bytes_to_remove = 0;
5177 actual_offset = offset - removed_bytes;
5178 size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
5179
5180 /* Check that the irels are sorted by offset,
5181 with only one per address. */
5182 BFD_ASSERT (!irel || (int) irel->r_offset > (int) last_irel_offset);
5183 BFD_ASSERT (!next_irel || next_irel->r_offset > irel->r_offset);
5184
5185 /* Make sure there isn't a reloc on the size field. */
5186 if (irel && irel->r_offset == offset + 4)
5187 {
5188 irel->r_offset -= removed_bytes;
5189 last_irel_offset = irel->r_offset;
5190 }
5191 else if (next_irel && next_irel->r_offset == offset + 4)
5192 {
5193 nexti += 1;
5194 irel->r_offset -= removed_bytes;
5195 next_irel->r_offset -= removed_bytes;
5196 last_irel_offset = next_irel->r_offset;
5197 }
5198 else if (size == 0)
5199 {
5200 /* Always remove entries with zero size. */
5201 bytes_to_remove = 8;
5202 if (irel && irel->r_offset == offset)
5203 {
5204 remove_this_irel = TRUE;
5205
5206 irel->r_offset -= removed_bytes;
5207 last_irel_offset = irel->r_offset;
5208 }
5209 }
5210 else if (irel && irel->r_offset == offset)
5211 {
5212 if (ELF32_R_TYPE (irel->r_info) == R_XTENSA_32)
5213 {
5214 if (last_irel)
5215 {
5216 bfd_vma old_size =
5217 bfd_get_32 (abfd, &contents[last_irel->r_offset + 4]);
5218 bfd_vma old_address =
5219 (last_irel->r_addend
5220 + bfd_get_32 (abfd, &contents[last_irel->r_offset]));
5221 bfd_vma new_address =
5222 (irel->r_addend
5223 + bfd_get_32 (abfd, &contents[actual_offset]));
5224
5225 if ((ELF32_R_SYM (irel->r_info) ==
5226 ELF32_R_SYM (last_irel->r_info))
5227 && (old_address + old_size == new_address))
5228 {
5229 /* fix the old size */
5230 bfd_put_32 (abfd, old_size + size,
5231 &contents[last_irel->r_offset + 4]);
5232 bytes_to_remove = 8;
5233 remove_this_irel = TRUE;
5234 }
5235 else
5236 last_irel = irel;
5237 }
5238 else
5239 last_irel = irel;
5240 }
5241
5242 irel->r_offset -= removed_bytes;
5243 last_irel_offset = irel->r_offset;
5244 }
5245
5246 if (remove_this_irel)
5247 {
5248 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
5249 irel->r_offset -= bytes_to_remove;
5250 }
5251
5252 if (bytes_to_remove != 0)
5253 {
5254 removed_bytes += bytes_to_remove;
5255 if (offset + 8 < section_size)
5256 memmove (&contents[actual_offset],
5257 &contents[actual_offset+8],
5258 section_size - offset - 8);
5259 }
5260 }
5261
5262 if (removed_bytes)
5263 {
5264 /* Clear the removed bytes. */
5265 memset (&contents[section_size - removed_bytes], 0, removed_bytes);
5266
5267 sec->_cooked_size = section_size - removed_bytes;
5268 /* Also shrink _raw_size. (The code in relocate_section that
5269 checks that relocations are within the section must use
5270 _raw_size because of the way the stabs sections are
5271 relaxed; shrinking _raw_size means that these checks will
5272 not be unnecessarily lax.) */
5273 sec->_raw_size = sec->_cooked_size;
e901de89
BW
5274
5275 if (xtensa_is_littable_section (sec))
5276 {
5277 bfd *dynobj = elf_hash_table (link_info)->dynobj;
5278 if (dynobj)
5279 {
5280 asection *sgotloc =
5281 bfd_get_section_by_name (dynobj, ".got.loc");
5282 if (sgotloc)
5283 {
5284 bfd_size_type sgotloc_size =
5285 (sgotloc->_cooked_size ? sgotloc->_cooked_size
5286 : sgotloc->_raw_size);
5287 sgotloc->_cooked_size = sgotloc_size - removed_bytes;
5288 sgotloc->_raw_size = sgotloc_size - removed_bytes;
5289 }
5290 }
5291 }
e0001a05
NC
5292 }
5293 }
e901de89 5294
e0001a05
NC
5295 error_return:
5296 release_internal_relocs (sec, internal_relocs);
5297 release_contents (sec, contents);
5298 return ok;
5299}
5300
5301\f
5302/* Third relaxation pass. */
5303
5304/* Change symbol values to account for removed literals. */
5305
5306bfd_boolean
5307relax_section_symbols (abfd, sec)
5308 bfd *abfd;
5309 asection *sec;
5310{
5311 xtensa_relax_info *relax_info;
5312 unsigned int sec_shndx;
5313 Elf_Internal_Shdr *symtab_hdr;
5314 Elf_Internal_Sym *isymbuf;
5315 unsigned i, num_syms, num_locals;
5316
5317 relax_info = get_xtensa_relax_info (sec);
5318 BFD_ASSERT (relax_info);
5319
5320 if (!relax_info->is_relaxable_literal_section)
5321 return TRUE;
5322
5323 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
5324
5325 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5326 isymbuf = retrieve_local_syms (abfd);
5327
5328 num_syms = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
5329 num_locals = symtab_hdr->sh_info;
5330
5331 /* Adjust the local symbols defined in this section. */
5332 for (i = 0; i < num_locals; i++)
5333 {
5334 Elf_Internal_Sym *isym = &isymbuf[i];
5335
5336 if (isym->st_shndx == sec_shndx)
5337 {
5338 bfd_vma new_address = offset_with_removed_literals
5339 (&relax_info->removed_list, isym->st_value);
5340 if (new_address != isym->st_value)
5341 isym->st_value = new_address;
5342 }
5343 }
5344
5345 /* Now adjust the global symbols defined in this section. */
5346 for (i = 0; i < (num_syms - num_locals); i++)
5347 {
5348 struct elf_link_hash_entry *sym_hash;
5349
5350 sym_hash = elf_sym_hashes (abfd)[i];
5351
5352 if (sym_hash->root.type == bfd_link_hash_warning)
5353 sym_hash = (struct elf_link_hash_entry *) sym_hash->root.u.i.link;
5354
5355 if ((sym_hash->root.type == bfd_link_hash_defined
5356 || sym_hash->root.type == bfd_link_hash_defweak)
5357 && sym_hash->root.u.def.section == sec)
5358 {
5359 bfd_vma new_address = offset_with_removed_literals
5360 (&relax_info->removed_list, sym_hash->root.u.def.value);
5361 if (new_address != sym_hash->root.u.def.value)
5362 sym_hash->root.u.def.value = new_address;
5363 }
5364 }
5365
5366 return TRUE;
5367}
5368
5369\f
5370/* "Fix" handling functions, called while performing relocations. */
5371
5372static void
1049f94e 5373do_fix_for_relocatable_link (rel, input_bfd, input_section)
e0001a05
NC
5374 Elf_Internal_Rela *rel;
5375 bfd *input_bfd;
5376 asection *input_section;
5377{
5378 r_reloc r_rel;
5379 asection *sec, *old_sec;
5380 bfd_vma old_offset;
5381 int r_type = ELF32_R_TYPE (rel->r_info);
5382 reloc_bfd_fix *fix_list;
5383 reloc_bfd_fix *fix;
5384
5385 if (r_type == R_XTENSA_NONE)
5386 return;
5387
5388 fix_list = (get_xtensa_relax_info (input_section))->fix_list;
5389 if (fix_list == NULL)
5390 return;
5391
5392 fix = get_bfd_fix (fix_list, input_section, rel->r_offset, r_type);
5393 if (fix == NULL)
5394 return;
5395
5396 r_reloc_init (&r_rel, input_bfd, rel);
5397 old_sec = r_reloc_get_section (&r_rel);
5398 old_offset = r_reloc_get_target_offset (&r_rel);
5399
5400 if (old_sec == NULL || !r_reloc_is_defined (&r_rel))
5401 {
5402 BFD_ASSERT (r_type == R_XTENSA_ASM_EXPAND);
5403 /* Leave it be. Resolution will happen in a later stage. */
5404 }
5405 else
5406 {
5407 sec = fix->target_sec;
5408 rel->r_addend += ((sec->output_offset + fix->target_offset)
5409 - (old_sec->output_offset + old_offset));
5410 }
5411}
5412
5413
5414static void
5415do_fix_for_final_link (rel, input_section, relocationp)
5416 Elf_Internal_Rela *rel;
5417 asection *input_section;
5418 bfd_vma *relocationp;
5419{
5420 asection *sec;
5421 int r_type = ELF32_R_TYPE (rel->r_info);
5422 reloc_bfd_fix *fix_list;
5423 reloc_bfd_fix *fix;
5424
5425 if (r_type == R_XTENSA_NONE)
5426 return;
5427
5428 fix_list = (get_xtensa_relax_info (input_section))->fix_list;
5429 if (fix_list == NULL)
5430 return;
5431
5432 fix = get_bfd_fix (fix_list, input_section, rel->r_offset, r_type);
5433 if (fix == NULL)
5434 return;
5435
5436 sec = fix->target_sec;
5437 *relocationp = (sec->output_section->vma
5438 + sec->output_offset
5439 + fix->target_offset - rel->r_addend);
5440}
5441
5442\f
5443/* Miscellaneous utility functions.... */
5444
5445static asection *
5446elf_xtensa_get_plt_section (dynobj, chunk)
5447 bfd *dynobj;
5448 int chunk;
5449{
5450 char plt_name[10];
5451
5452 if (chunk == 0)
5453 return bfd_get_section_by_name (dynobj, ".plt");
5454
5455 sprintf (plt_name, ".plt.%u", chunk);
5456 return bfd_get_section_by_name (dynobj, plt_name);
5457}
5458
5459
5460static asection *
5461elf_xtensa_get_gotplt_section (dynobj, chunk)
5462 bfd *dynobj;
5463 int chunk;
5464{
5465 char got_name[14];
5466
5467 if (chunk == 0)
5468 return bfd_get_section_by_name (dynobj, ".got.plt");
5469
5470 sprintf (got_name, ".got.plt.%u", chunk);
5471 return bfd_get_section_by_name (dynobj, got_name);
5472}
5473
5474
5475/* Get the input section for a given symbol index.
5476 If the symbol is:
5477 . a section symbol, return the section;
5478 . a common symbol, return the common section;
5479 . an undefined symbol, return the undefined section;
5480 . an indirect symbol, follow the links;
5481 . an absolute value, return the absolute section. */
5482
5483static asection *
5484get_elf_r_symndx_section (abfd, r_symndx)
5485 bfd *abfd;
5486 unsigned long r_symndx;
5487{
5488 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5489 asection *target_sec = NULL;
5490 if (r_symndx < symtab_hdr->sh_info)
5491 {
5492 Elf_Internal_Sym *isymbuf;
5493 unsigned int section_index;
5494
5495 isymbuf = retrieve_local_syms (abfd);
5496 section_index = isymbuf[r_symndx].st_shndx;
5497
5498 if (section_index == SHN_UNDEF)
5499 target_sec = bfd_und_section_ptr;
5500 else if (section_index > 0 && section_index < SHN_LORESERVE)
5501 target_sec = bfd_section_from_elf_index (abfd, section_index);
5502 else if (section_index == SHN_ABS)
5503 target_sec = bfd_abs_section_ptr;
5504 else if (section_index == SHN_COMMON)
5505 target_sec = bfd_com_section_ptr;
5506 else
5507 /* Who knows? */
5508 target_sec = NULL;
5509 }
5510 else
5511 {
5512 unsigned long indx = r_symndx - symtab_hdr->sh_info;
5513 struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
5514
5515 while (h->root.type == bfd_link_hash_indirect
5516 || h->root.type == bfd_link_hash_warning)
5517 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5518
5519 switch (h->root.type)
5520 {
5521 case bfd_link_hash_defined:
5522 case bfd_link_hash_defweak:
5523 target_sec = h->root.u.def.section;
5524 break;
5525 case bfd_link_hash_common:
5526 target_sec = bfd_com_section_ptr;
5527 break;
5528 case bfd_link_hash_undefined:
5529 case bfd_link_hash_undefweak:
5530 target_sec = bfd_und_section_ptr;
5531 break;
5532 default: /* New indirect warning. */
5533 target_sec = bfd_und_section_ptr;
5534 break;
5535 }
5536 }
5537 return target_sec;
5538}
5539
5540
5541static struct elf_link_hash_entry *
5542get_elf_r_symndx_hash_entry (abfd, r_symndx)
5543 bfd *abfd;
5544 unsigned long r_symndx;
5545{
5546 unsigned long indx;
5547 struct elf_link_hash_entry *h;
5548 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5549
5550 if (r_symndx < symtab_hdr->sh_info)
5551 return NULL;
5552
5553 indx = r_symndx - symtab_hdr->sh_info;
5554 h = elf_sym_hashes (abfd)[indx];
5555 while (h->root.type == bfd_link_hash_indirect
5556 || h->root.type == bfd_link_hash_warning)
5557 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5558 return h;
5559}
5560
5561
5562/* Get the section-relative offset for a symbol number. */
5563
5564static bfd_vma
5565get_elf_r_symndx_offset (abfd, r_symndx)
5566 bfd *abfd;
5567 unsigned long r_symndx;
5568{
5569 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5570 bfd_vma offset = 0;
5571
5572 if (r_symndx < symtab_hdr->sh_info)
5573 {
5574 Elf_Internal_Sym *isymbuf;
5575 isymbuf = retrieve_local_syms (abfd);
5576 offset = isymbuf[r_symndx].st_value;
5577 }
5578 else
5579 {
5580 unsigned long indx = r_symndx - symtab_hdr->sh_info;
5581 struct elf_link_hash_entry *h =
5582 elf_sym_hashes (abfd)[indx];
5583
5584 while (h->root.type == bfd_link_hash_indirect
5585 || h->root.type == bfd_link_hash_warning)
5586 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5587 if (h->root.type == bfd_link_hash_defined
5588 || h->root.type == bfd_link_hash_defweak)
5589 offset = h->root.u.def.value;
5590 }
5591 return offset;
5592}
5593
5594
5595static bfd_boolean
5596pcrel_reloc_fits (opnd, self_address, dest_address)
5597 xtensa_operand opnd;
5598 bfd_vma self_address;
5599 bfd_vma dest_address;
5600{
5601 uint32 new_address =
5602 xtensa_operand_do_reloc (opnd, dest_address, self_address);
5603 return (xtensa_operand_encode (opnd, &new_address)
5604 == xtensa_encode_result_ok);
5605}
5606
5607
5608static bfd_boolean
5609xtensa_is_property_section (sec)
5610 asection *sec;
5611{
e901de89
BW
5612 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
5613
5614 if (strncmp (".xt.insn", sec->name, 8) == 0
5615 || strncmp (".xt.lit", sec->name, 7) == 0)
5616 return TRUE;
5617
5618 if (strncmp (".gnu.linkonce.", sec->name, linkonce_len) == 0)
5619 {
5620 if (strncmp ("x.", sec->name + linkonce_len, 2) == 0
5621 || strncmp ("p.", sec->name + linkonce_len, 2) == 0)
5622 return TRUE;
5623 if (strstr (sec->name + linkonce_len, ".xt.insn") != NULL
5624 || strstr (sec->name + linkonce_len, ".xt.lit") != NULL)
5625 return TRUE;
5626 }
5627 return FALSE;
5628}
5629
5630
5631static bfd_boolean
5632xtensa_is_littable_section (sec)
5633 asection *sec;
5634{
5635 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
5636
5637 if (strncmp (".xt.lit", sec->name, 7) == 0)
5638 return TRUE;
e0001a05 5639
e901de89
BW
5640 if (strncmp (".gnu.linkonce.", sec->name, linkonce_len) == 0)
5641 {
5642 if (strncmp ("p.", sec->name + linkonce_len, 2) == 0)
5643 return TRUE;
5644 if (strstr (sec->name + linkonce_len, ".xt.lit") != NULL)
5645 return TRUE;
5646 }
5647 return FALSE;
e0001a05
NC
5648}
5649
5650
5651static bfd_boolean
5652is_literal_section (sec)
5653 asection *sec;
5654{
5655 /* FIXME: the current definition of this leaves a lot to be desired.... */
5656 if (sec == NULL || sec->name == NULL)
5657 return FALSE;
5658 return (strstr (sec->name, "literal") != NULL);
5659}
5660
5661
5662static int
5663internal_reloc_compare (ap, bp)
5664 const PTR ap;
5665 const PTR bp;
5666{
5667 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
5668 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
5669
5670 return (a->r_offset - b->r_offset);
5671}
5672
5673
5674static bfd_boolean
5675get_is_linkonce_section (abfd, sec)
5676 bfd *abfd ATTRIBUTE_UNUSED;
5677 asection *sec;
5678{
5679 flagword flags, link_once_flags;
5680 bfd_boolean is_linkonce = FALSE;;
5681
5682 flags = bfd_get_section_flags (abfd, sec);
5683 link_once_flags = (flags & SEC_LINK_ONCE);
5684 if (link_once_flags != 0)
5685 is_linkonce = TRUE;
5686
5687 /* In order for this to be useful to the assembler
5688 before the linkonce flag is set we need to
5689 check for the GNU extension name. */
5690 if (!is_linkonce &&
5691 strncmp (sec->name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
5692 is_linkonce = TRUE;
5693
5694 return is_linkonce;
5695}
5696
5697
5698char *
5699xtensa_get_property_section_name (abfd, sec, base_name)
5700 bfd *abfd;
5701 asection *sec;
5702 const char * base_name;
5703{
5704 char *table_sec_name = NULL;
5705 bfd_boolean is_linkonce;
5706
5707 is_linkonce = get_is_linkonce_section (abfd, sec);
5708
5709 if (!is_linkonce)
5710 {
5711 table_sec_name = strdup (base_name);
5712 }
5713 else
5714 {
5715 static size_t prefix_len = sizeof (".gnu.linkonce.t.") - 1;
5716 size_t len = strlen (sec->name) + 1;
5717 char repl_char = '\0';
5718 const char *segname = sec->name;
5719
5720 if (strncmp (segname, ".gnu.linkonce.t.", prefix_len) == 0)
5721 {
5722 if (strcmp (base_name, ".xt.insn") == 0)
5723 repl_char = 'x';
5724 else if (strcmp (base_name, ".xt.lit") == 0)
5725 repl_char = 'p';
5726 }
5727
5728 if (repl_char != '\0')
5729 {
5730 char *name = (char *) bfd_malloc (len);
5731 memcpy (name, sec->name, len);
5732 name[prefix_len - 2] = repl_char;
5733 table_sec_name = name;
5734 }
5735 else
5736 {
5737 size_t base_len = strlen (base_name) + 1;
5738 char *name = (char *) bfd_malloc (len + base_len);
5739 memcpy (name, sec->name, len - 1);
5740 memcpy (name + len - 1, base_name, base_len);
5741 table_sec_name = name;
5742 }
5743 }
5744
5745 return table_sec_name;
5746}
5747
5748\f
5749/* Other functions called directly by the linker. */
5750
5751bfd_boolean
5752xtensa_callback_required_dependence (abfd, sec, link_info, callback, closure)
5753 bfd *abfd;
5754 asection *sec;
5755 struct bfd_link_info *link_info;
5756 deps_callback_t callback;
5757 PTR closure;
5758{
5759 Elf_Internal_Rela *internal_relocs;
5760 bfd_byte *contents;
5761 unsigned i;
5762 bfd_boolean ok = TRUE;
5763
5764 /* ".plt*" sections have no explicit relocations but they contain L32R
5765 instructions that reference the corresponding ".got.plt*" sections. */
5766 if ((sec->flags & SEC_LINKER_CREATED) != 0
5767 && strncmp (sec->name, ".plt", 4) == 0)
5768 {
5769 asection *sgotplt;
5770
5771 /* Find the corresponding ".got.plt*" section. */
5772 if (sec->name[4] == '\0')
5773 sgotplt = bfd_get_section_by_name (sec->owner, ".got.plt");
5774 else
5775 {
5776 char got_name[14];
5777 int chunk = 0;
5778
5779 BFD_ASSERT (sec->name[4] == '.');
5780 chunk = strtol (&sec->name[5], NULL, 10);
5781
5782 sprintf (got_name, ".got.plt.%u", chunk);
5783 sgotplt = bfd_get_section_by_name (sec->owner, got_name);
5784 }
5785 BFD_ASSERT (sgotplt);
5786
5787 /* Assume worst-case offsets: L32R at the very end of the ".plt"
5788 section referencing a literal at the very beginning of
5789 ".got.plt". This is very close to the real dependence, anyway. */
5790 (*callback) (sec, sec->_raw_size, sgotplt, 0, closure);
5791 }
5792
5793 internal_relocs = retrieve_internal_relocs (abfd, sec,
5794 link_info->keep_memory);
5795 if (internal_relocs == NULL
5796 || sec->reloc_count == 0)
5797 return ok;
5798
5799 /* Cache the contents for the duration of this scan. */
5800 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
5801 if (contents == NULL && sec->_raw_size != 0)
5802 {
5803 ok = FALSE;
5804 goto error_return;
5805 }
5806
5807 if (xtensa_default_isa == NULL)
5808 xtensa_isa_init ();
5809
5810 for (i = 0; i < sec->reloc_count; i++)
5811 {
5812 Elf_Internal_Rela *irel = &internal_relocs[i];
5813 if (is_l32r_relocation (sec, contents, irel))
5814 {
5815 r_reloc l32r_rel;
5816 asection *target_sec;
5817 bfd_vma target_offset;
5818
5819 r_reloc_init (&l32r_rel, abfd, irel);
5820 target_sec = NULL;
5821 target_offset = 0;
5822 /* L32Rs must be local to the input file. */
5823 if (r_reloc_is_defined (&l32r_rel))
5824 {
5825 target_sec = r_reloc_get_section (&l32r_rel);
5826 target_offset = r_reloc_get_target_offset (&l32r_rel);
5827 }
5828 (*callback) (sec, irel->r_offset, target_sec, target_offset,
5829 closure);
5830 }
5831 }
5832
5833 error_return:
5834 release_internal_relocs (sec, internal_relocs);
5835 release_contents (sec, contents);
5836 return ok;
5837}
5838
2f89ff8d
L
5839/* The default literal sections should always be marked as "code" (i.e.,
5840 SHF_EXECINSTR). This is particularly important for the Linux kernel
5841 module loader so that the literals are not placed after the text. */
5842static struct bfd_elf_special_section const elf_xtensa_special_sections[]=
5843{
7dcb9820
AM
5844 { ".literal", 8, 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
5845 { ".init.literal", 13, 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
5846 { ".fini.literal", 13, 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
5847 { NULL, 0, 0, 0, 0 }
2f89ff8d
L
5848};
5849
e0001a05
NC
5850\f
5851#ifndef ELF_ARCH
5852#define TARGET_LITTLE_SYM bfd_elf32_xtensa_le_vec
5853#define TARGET_LITTLE_NAME "elf32-xtensa-le"
5854#define TARGET_BIG_SYM bfd_elf32_xtensa_be_vec
5855#define TARGET_BIG_NAME "elf32-xtensa-be"
5856#define ELF_ARCH bfd_arch_xtensa
5857
5858/* The new EM_XTENSA value will be recognized beginning in the Xtensa T1040
5859 release. However, we still have to generate files with the EM_XTENSA_OLD
5860 value so that pre-T1040 tools can read the files. As soon as we stop
5861 caring about pre-T1040 tools, the following two values should be
5862 swapped. At the same time, any other code that uses EM_XTENSA_OLD
5863 (e.g., prep_headers() in elf.c) should be changed to use EM_XTENSA. */
5864#define ELF_MACHINE_CODE EM_XTENSA_OLD
5865#define ELF_MACHINE_ALT1 EM_XTENSA
5866
5867#if XCHAL_HAVE_MMU
5868#define ELF_MAXPAGESIZE (1 << XCHAL_MMU_MIN_PTE_PAGE_SIZE)
5869#else /* !XCHAL_HAVE_MMU */
5870#define ELF_MAXPAGESIZE 1
5871#endif /* !XCHAL_HAVE_MMU */
5872#endif /* ELF_ARCH */
5873
5874#define elf_backend_can_gc_sections 1
5875#define elf_backend_can_refcount 1
5876#define elf_backend_plt_readonly 1
5877#define elf_backend_got_header_size 4
5878#define elf_backend_want_dynbss 0
5879#define elf_backend_want_got_plt 1
5880
5881#define elf_info_to_howto elf_xtensa_info_to_howto_rela
5882
5883#define bfd_elf32_bfd_final_link bfd_elf32_bfd_final_link
5884#define bfd_elf32_bfd_merge_private_bfd_data elf_xtensa_merge_private_bfd_data
5885#define bfd_elf32_new_section_hook elf_xtensa_new_section_hook
5886#define bfd_elf32_bfd_print_private_bfd_data elf_xtensa_print_private_bfd_data
5887#define bfd_elf32_bfd_relax_section elf_xtensa_relax_section
5888#define bfd_elf32_bfd_reloc_type_lookup elf_xtensa_reloc_type_lookup
5889#define bfd_elf32_bfd_set_private_flags elf_xtensa_set_private_flags
5890
5891#define elf_backend_adjust_dynamic_symbol elf_xtensa_adjust_dynamic_symbol
5892#define elf_backend_check_relocs elf_xtensa_check_relocs
5893#define elf_backend_copy_indirect_symbol elf_xtensa_copy_indirect_symbol
5894#define elf_backend_create_dynamic_sections elf_xtensa_create_dynamic_sections
5895#define elf_backend_discard_info elf_xtensa_discard_info
5896#define elf_backend_ignore_discarded_relocs elf_xtensa_ignore_discarded_relocs
5897#define elf_backend_final_write_processing elf_xtensa_final_write_processing
5898#define elf_backend_finish_dynamic_sections elf_xtensa_finish_dynamic_sections
5899#define elf_backend_finish_dynamic_symbol elf_xtensa_finish_dynamic_symbol
5900#define elf_backend_gc_mark_hook elf_xtensa_gc_mark_hook
5901#define elf_backend_gc_sweep_hook elf_xtensa_gc_sweep_hook
5902#define elf_backend_grok_prstatus elf_xtensa_grok_prstatus
5903#define elf_backend_grok_psinfo elf_xtensa_grok_psinfo
5904#define elf_backend_hide_symbol elf_xtensa_hide_symbol
5905#define elf_backend_modify_segment_map elf_xtensa_modify_segment_map
5906#define elf_backend_object_p elf_xtensa_object_p
5907#define elf_backend_reloc_type_class elf_xtensa_reloc_type_class
5908#define elf_backend_relocate_section elf_xtensa_relocate_section
5909#define elf_backend_size_dynamic_sections elf_xtensa_size_dynamic_sections
2f89ff8d 5910#define elf_backend_special_sections elf_xtensa_special_sections
e0001a05
NC
5911
5912#include "elf32-target.h"
This page took 0.434716 seconds and 4 git commands to generate.