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