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