1 /* Xtensa-specific support for 32-bit ELF.
2 Copyright (C) 2003-2018 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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 3 of the
9 License, or (at your option) any later version.
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.
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., 51 Franklin Street - Fifth Floor, Boston, MA
30 #include "elf/xtensa.h"
31 #include "splay-tree.h"
32 #include "xtensa-isa.h"
33 #include "xtensa-config.h"
35 #define XTENSA_NO_NOP_REMOVAL 0
37 /* Local helper functions. */
39 static bfd_boolean add_extra_plt_sections (struct bfd_link_info *, int);
40 static char *vsprint_msg (const char *, const char *, int, ...) ATTRIBUTE_PRINTF(2,4);
41 static bfd_reloc_status_type bfd_elf_xtensa_reloc
42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43 static bfd_boolean do_fix_for_relocatable_link
44 (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *);
45 static void do_fix_for_final_link
46 (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *, bfd_vma *);
48 /* Local functions to handle Xtensa configurability. */
50 static bfd_boolean is_indirect_call_opcode (xtensa_opcode);
51 static bfd_boolean is_direct_call_opcode (xtensa_opcode);
52 static bfd_boolean is_windowed_call_opcode (xtensa_opcode);
53 static xtensa_opcode get_const16_opcode (void);
54 static xtensa_opcode get_l32r_opcode (void);
55 static bfd_vma l32r_offset (bfd_vma, bfd_vma);
56 static int get_relocation_opnd (xtensa_opcode, int);
57 static int get_relocation_slot (int);
58 static xtensa_opcode get_relocation_opcode
59 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
60 static bfd_boolean is_l32r_relocation
61 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
62 static bfd_boolean is_alt_relocation (int);
63 static bfd_boolean is_operand_relocation (int);
64 static bfd_size_type insn_decode_len
65 (bfd_byte *, bfd_size_type, bfd_size_type);
66 static xtensa_opcode insn_decode_opcode
67 (bfd_byte *, bfd_size_type, bfd_size_type, int);
68 static bfd_boolean check_branch_target_aligned
69 (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
70 static bfd_boolean check_loop_aligned
71 (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
72 static bfd_boolean check_branch_target_aligned_address (bfd_vma, int);
73 static bfd_size_type get_asm_simplify_size
74 (bfd_byte *, bfd_size_type, bfd_size_type);
76 /* Functions for link-time code simplifications. */
78 static bfd_reloc_status_type elf_xtensa_do_asm_simplify
79 (bfd_byte *, bfd_vma, bfd_vma, char **);
80 static bfd_reloc_status_type contract_asm_expansion
81 (bfd_byte *, bfd_vma, Elf_Internal_Rela *, char **);
82 static xtensa_opcode swap_callx_for_call_opcode (xtensa_opcode);
83 static xtensa_opcode get_expanded_call_opcode (bfd_byte *, int, bfd_boolean *);
85 /* Access to internal relocations, section contents and symbols. */
87 static Elf_Internal_Rela *retrieve_internal_relocs
88 (bfd *, asection *, bfd_boolean);
89 static void pin_internal_relocs (asection *, Elf_Internal_Rela *);
90 static void release_internal_relocs (asection *, Elf_Internal_Rela *);
91 static bfd_byte *retrieve_contents (bfd *, asection *, bfd_boolean);
92 static void pin_contents (asection *, bfd_byte *);
93 static void release_contents (asection *, bfd_byte *);
94 static Elf_Internal_Sym *retrieve_local_syms (bfd *);
96 /* Miscellaneous utility functions. */
98 static asection *elf_xtensa_get_plt_section (struct bfd_link_info *, int);
99 static asection *elf_xtensa_get_gotplt_section (struct bfd_link_info *, int);
100 static asection *get_elf_r_symndx_section (bfd *, unsigned long);
101 static struct elf_link_hash_entry *get_elf_r_symndx_hash_entry
102 (bfd *, unsigned long);
103 static bfd_vma get_elf_r_symndx_offset (bfd *, unsigned long);
104 static bfd_boolean is_reloc_sym_weak (bfd *, Elf_Internal_Rela *);
105 static bfd_boolean pcrel_reloc_fits (xtensa_opcode, int, bfd_vma, bfd_vma);
106 static bfd_boolean xtensa_is_property_section (asection *);
107 static bfd_boolean xtensa_is_insntable_section (asection *);
108 static bfd_boolean xtensa_is_littable_section (asection *);
109 static bfd_boolean xtensa_is_proptable_section (asection *);
110 static int internal_reloc_compare (const void *, const void *);
111 static int internal_reloc_matches (const void *, const void *);
112 static asection *xtensa_get_property_section (asection *, const char *);
113 static flagword xtensa_get_property_predef_flags (asection *);
115 /* Other functions called directly by the linker. */
117 typedef void (*deps_callback_t)
118 (asection *, bfd_vma, asection *, bfd_vma, void *);
119 extern bfd_boolean xtensa_callback_required_dependence
120 (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *);
123 /* Globally visible flag for choosing size optimization of NOP removal
124 instead of branch-target-aware minimization for NOP removal.
125 When nonzero, narrow all instructions and remove all NOPs possible
126 around longcall expansions. */
128 int elf32xtensa_size_opt;
131 /* The "new_section_hook" is used to set up a per-section
132 "xtensa_relax_info" data structure with additional information used
133 during relaxation. */
135 typedef struct xtensa_relax_info_struct xtensa_relax_info;
138 /* The GNU tools do not easily allow extending interfaces to pass around
139 the pointer to the Xtensa ISA information, so instead we add a global
140 variable here (in BFD) that can be used by any of the tools that need
143 xtensa_isa xtensa_default_isa;
146 /* When this is true, relocations may have been modified to refer to
147 symbols from other input files. The per-section list of "fix"
148 records needs to be checked when resolving relocations. */
150 static bfd_boolean relaxing_section = FALSE;
152 /* When this is true, during final links, literals that cannot be
153 coalesced and their relocations may be moved to other sections. */
155 int elf32xtensa_no_literal_movement = 1;
157 /* Place property records for a section into individual property section
158 with xt.prop. prefix. */
160 bfd_boolean elf32xtensa_separate_props = FALSE;
162 /* Rename one of the generic section flags to better document how it
164 /* Whether relocations have been processed. */
165 #define reloc_done sec_flg0
167 static reloc_howto_type elf_howto_table[] =
169 HOWTO (R_XTENSA_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
170 bfd_elf_xtensa_reloc, "R_XTENSA_NONE",
172 HOWTO (R_XTENSA_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
173 bfd_elf_xtensa_reloc, "R_XTENSA_32",
174 TRUE, 0xffffffff, 0xffffffff, FALSE),
176 /* Replace a 32-bit value with a value from the runtime linker (only
177 used by linker-generated stub functions). The r_addend value is
178 special: 1 means to substitute a pointer to the runtime linker's
179 dynamic resolver function; 2 means to substitute the link map for
180 the shared object. */
181 HOWTO (R_XTENSA_RTLD, 0, 2, 32, FALSE, 0, complain_overflow_dont,
182 NULL, "R_XTENSA_RTLD", FALSE, 0, 0, FALSE),
184 HOWTO (R_XTENSA_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
185 bfd_elf_generic_reloc, "R_XTENSA_GLOB_DAT",
186 FALSE, 0, 0xffffffff, FALSE),
187 HOWTO (R_XTENSA_JMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
188 bfd_elf_generic_reloc, "R_XTENSA_JMP_SLOT",
189 FALSE, 0, 0xffffffff, FALSE),
190 HOWTO (R_XTENSA_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
191 bfd_elf_generic_reloc, "R_XTENSA_RELATIVE",
192 FALSE, 0, 0xffffffff, FALSE),
193 HOWTO (R_XTENSA_PLT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
194 bfd_elf_xtensa_reloc, "R_XTENSA_PLT",
195 FALSE, 0, 0xffffffff, FALSE),
199 /* Old relocations for backward compatibility. */
200 HOWTO (R_XTENSA_OP0, 0, 0, 0, TRUE, 0, complain_overflow_dont,
201 bfd_elf_xtensa_reloc, "R_XTENSA_OP0", FALSE, 0, 0, TRUE),
202 HOWTO (R_XTENSA_OP1, 0, 0, 0, TRUE, 0, complain_overflow_dont,
203 bfd_elf_xtensa_reloc, "R_XTENSA_OP1", FALSE, 0, 0, TRUE),
204 HOWTO (R_XTENSA_OP2, 0, 0, 0, TRUE, 0, complain_overflow_dont,
205 bfd_elf_xtensa_reloc, "R_XTENSA_OP2", FALSE, 0, 0, TRUE),
207 /* Assembly auto-expansion. */
208 HOWTO (R_XTENSA_ASM_EXPAND, 0, 0, 0, TRUE, 0, complain_overflow_dont,
209 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_EXPAND", FALSE, 0, 0, TRUE),
210 /* Relax assembly auto-expansion. */
211 HOWTO (R_XTENSA_ASM_SIMPLIFY, 0, 0, 0, TRUE, 0, complain_overflow_dont,
212 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_SIMPLIFY", FALSE, 0, 0, TRUE),
216 HOWTO (R_XTENSA_32_PCREL, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
217 bfd_elf_xtensa_reloc, "R_XTENSA_32_PCREL",
218 FALSE, 0, 0xffffffff, TRUE),
220 /* GNU extension to record C++ vtable hierarchy. */
221 HOWTO (R_XTENSA_GNU_VTINHERIT, 0, 2, 0, FALSE, 0, complain_overflow_dont,
222 NULL, "R_XTENSA_GNU_VTINHERIT",
224 /* GNU extension to record C++ vtable member usage. */
225 HOWTO (R_XTENSA_GNU_VTENTRY, 0, 2, 0, FALSE, 0, complain_overflow_dont,
226 _bfd_elf_rel_vtable_reloc_fn, "R_XTENSA_GNU_VTENTRY",
229 /* Relocations for supporting difference of symbols. */
230 HOWTO (R_XTENSA_DIFF8, 0, 0, 8, FALSE, 0, complain_overflow_signed,
231 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF8", FALSE, 0, 0xff, FALSE),
232 HOWTO (R_XTENSA_DIFF16, 0, 1, 16, FALSE, 0, complain_overflow_signed,
233 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF16", FALSE, 0, 0xffff, FALSE),
234 HOWTO (R_XTENSA_DIFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
235 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF32", FALSE, 0, 0xffffffff, FALSE),
237 /* General immediate operand relocations. */
238 HOWTO (R_XTENSA_SLOT0_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
239 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_OP", FALSE, 0, 0, TRUE),
240 HOWTO (R_XTENSA_SLOT1_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
241 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_OP", FALSE, 0, 0, TRUE),
242 HOWTO (R_XTENSA_SLOT2_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
243 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_OP", FALSE, 0, 0, TRUE),
244 HOWTO (R_XTENSA_SLOT3_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
245 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_OP", FALSE, 0, 0, TRUE),
246 HOWTO (R_XTENSA_SLOT4_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
247 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_OP", FALSE, 0, 0, TRUE),
248 HOWTO (R_XTENSA_SLOT5_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
249 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_OP", FALSE, 0, 0, TRUE),
250 HOWTO (R_XTENSA_SLOT6_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
251 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_OP", FALSE, 0, 0, TRUE),
252 HOWTO (R_XTENSA_SLOT7_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
253 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_OP", FALSE, 0, 0, TRUE),
254 HOWTO (R_XTENSA_SLOT8_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
255 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_OP", FALSE, 0, 0, TRUE),
256 HOWTO (R_XTENSA_SLOT9_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
257 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_OP", FALSE, 0, 0, TRUE),
258 HOWTO (R_XTENSA_SLOT10_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
259 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_OP", FALSE, 0, 0, TRUE),
260 HOWTO (R_XTENSA_SLOT11_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
261 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_OP", FALSE, 0, 0, TRUE),
262 HOWTO (R_XTENSA_SLOT12_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
263 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_OP", FALSE, 0, 0, TRUE),
264 HOWTO (R_XTENSA_SLOT13_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
265 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_OP", FALSE, 0, 0, TRUE),
266 HOWTO (R_XTENSA_SLOT14_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
267 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_OP", FALSE, 0, 0, TRUE),
269 /* "Alternate" relocations. The meaning of these is opcode-specific. */
270 HOWTO (R_XTENSA_SLOT0_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
271 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_ALT", FALSE, 0, 0, TRUE),
272 HOWTO (R_XTENSA_SLOT1_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
273 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_ALT", FALSE, 0, 0, TRUE),
274 HOWTO (R_XTENSA_SLOT2_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
275 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_ALT", FALSE, 0, 0, TRUE),
276 HOWTO (R_XTENSA_SLOT3_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
277 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_ALT", FALSE, 0, 0, TRUE),
278 HOWTO (R_XTENSA_SLOT4_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
279 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_ALT", FALSE, 0, 0, TRUE),
280 HOWTO (R_XTENSA_SLOT5_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
281 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_ALT", FALSE, 0, 0, TRUE),
282 HOWTO (R_XTENSA_SLOT6_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
283 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_ALT", FALSE, 0, 0, TRUE),
284 HOWTO (R_XTENSA_SLOT7_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
285 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_ALT", FALSE, 0, 0, TRUE),
286 HOWTO (R_XTENSA_SLOT8_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
287 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_ALT", FALSE, 0, 0, TRUE),
288 HOWTO (R_XTENSA_SLOT9_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
289 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_ALT", FALSE, 0, 0, TRUE),
290 HOWTO (R_XTENSA_SLOT10_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
291 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_ALT", FALSE, 0, 0, TRUE),
292 HOWTO (R_XTENSA_SLOT11_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
293 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_ALT", FALSE, 0, 0, TRUE),
294 HOWTO (R_XTENSA_SLOT12_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
295 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_ALT", FALSE, 0, 0, TRUE),
296 HOWTO (R_XTENSA_SLOT13_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
297 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_ALT", FALSE, 0, 0, TRUE),
298 HOWTO (R_XTENSA_SLOT14_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
299 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_ALT", FALSE, 0, 0, TRUE),
301 /* TLS relocations. */
302 HOWTO (R_XTENSA_TLSDESC_FN, 0, 2, 32, FALSE, 0, complain_overflow_dont,
303 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_FN",
304 FALSE, 0, 0xffffffff, FALSE),
305 HOWTO (R_XTENSA_TLSDESC_ARG, 0, 2, 32, FALSE, 0, complain_overflow_dont,
306 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_ARG",
307 FALSE, 0, 0xffffffff, FALSE),
308 HOWTO (R_XTENSA_TLS_DTPOFF, 0, 2, 32, FALSE, 0, complain_overflow_dont,
309 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_DTPOFF",
310 FALSE, 0, 0xffffffff, FALSE),
311 HOWTO (R_XTENSA_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_dont,
312 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_TPOFF",
313 FALSE, 0, 0xffffffff, FALSE),
314 HOWTO (R_XTENSA_TLS_FUNC, 0, 0, 0, FALSE, 0, complain_overflow_dont,
315 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_FUNC",
317 HOWTO (R_XTENSA_TLS_ARG, 0, 0, 0, FALSE, 0, complain_overflow_dont,
318 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_ARG",
320 HOWTO (R_XTENSA_TLS_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
321 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_CALL",
327 fprintf (stderr, "Xtensa bfd reloc lookup %d (%s)\n", code, str)
332 static reloc_howto_type *
333 elf_xtensa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
334 bfd_reloc_code_real_type code)
339 TRACE ("BFD_RELOC_NONE");
340 return &elf_howto_table[(unsigned) R_XTENSA_NONE ];
343 TRACE ("BFD_RELOC_32");
344 return &elf_howto_table[(unsigned) R_XTENSA_32 ];
346 case BFD_RELOC_32_PCREL:
347 TRACE ("BFD_RELOC_32_PCREL");
348 return &elf_howto_table[(unsigned) R_XTENSA_32_PCREL ];
350 case BFD_RELOC_XTENSA_DIFF8:
351 TRACE ("BFD_RELOC_XTENSA_DIFF8");
352 return &elf_howto_table[(unsigned) R_XTENSA_DIFF8 ];
354 case BFD_RELOC_XTENSA_DIFF16:
355 TRACE ("BFD_RELOC_XTENSA_DIFF16");
356 return &elf_howto_table[(unsigned) R_XTENSA_DIFF16 ];
358 case BFD_RELOC_XTENSA_DIFF32:
359 TRACE ("BFD_RELOC_XTENSA_DIFF32");
360 return &elf_howto_table[(unsigned) R_XTENSA_DIFF32 ];
362 case BFD_RELOC_XTENSA_RTLD:
363 TRACE ("BFD_RELOC_XTENSA_RTLD");
364 return &elf_howto_table[(unsigned) R_XTENSA_RTLD ];
366 case BFD_RELOC_XTENSA_GLOB_DAT:
367 TRACE ("BFD_RELOC_XTENSA_GLOB_DAT");
368 return &elf_howto_table[(unsigned) R_XTENSA_GLOB_DAT ];
370 case BFD_RELOC_XTENSA_JMP_SLOT:
371 TRACE ("BFD_RELOC_XTENSA_JMP_SLOT");
372 return &elf_howto_table[(unsigned) R_XTENSA_JMP_SLOT ];
374 case BFD_RELOC_XTENSA_RELATIVE:
375 TRACE ("BFD_RELOC_XTENSA_RELATIVE");
376 return &elf_howto_table[(unsigned) R_XTENSA_RELATIVE ];
378 case BFD_RELOC_XTENSA_PLT:
379 TRACE ("BFD_RELOC_XTENSA_PLT");
380 return &elf_howto_table[(unsigned) R_XTENSA_PLT ];
382 case BFD_RELOC_XTENSA_OP0:
383 TRACE ("BFD_RELOC_XTENSA_OP0");
384 return &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
386 case BFD_RELOC_XTENSA_OP1:
387 TRACE ("BFD_RELOC_XTENSA_OP1");
388 return &elf_howto_table[(unsigned) R_XTENSA_OP1 ];
390 case BFD_RELOC_XTENSA_OP2:
391 TRACE ("BFD_RELOC_XTENSA_OP2");
392 return &elf_howto_table[(unsigned) R_XTENSA_OP2 ];
394 case BFD_RELOC_XTENSA_ASM_EXPAND:
395 TRACE ("BFD_RELOC_XTENSA_ASM_EXPAND");
396 return &elf_howto_table[(unsigned) R_XTENSA_ASM_EXPAND ];
398 case BFD_RELOC_XTENSA_ASM_SIMPLIFY:
399 TRACE ("BFD_RELOC_XTENSA_ASM_SIMPLIFY");
400 return &elf_howto_table[(unsigned) R_XTENSA_ASM_SIMPLIFY ];
402 case BFD_RELOC_VTABLE_INHERIT:
403 TRACE ("BFD_RELOC_VTABLE_INHERIT");
404 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTINHERIT ];
406 case BFD_RELOC_VTABLE_ENTRY:
407 TRACE ("BFD_RELOC_VTABLE_ENTRY");
408 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTENTRY ];
410 case BFD_RELOC_XTENSA_TLSDESC_FN:
411 TRACE ("BFD_RELOC_XTENSA_TLSDESC_FN");
412 return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_FN ];
414 case BFD_RELOC_XTENSA_TLSDESC_ARG:
415 TRACE ("BFD_RELOC_XTENSA_TLSDESC_ARG");
416 return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_ARG ];
418 case BFD_RELOC_XTENSA_TLS_DTPOFF:
419 TRACE ("BFD_RELOC_XTENSA_TLS_DTPOFF");
420 return &elf_howto_table[(unsigned) R_XTENSA_TLS_DTPOFF ];
422 case BFD_RELOC_XTENSA_TLS_TPOFF:
423 TRACE ("BFD_RELOC_XTENSA_TLS_TPOFF");
424 return &elf_howto_table[(unsigned) R_XTENSA_TLS_TPOFF ];
426 case BFD_RELOC_XTENSA_TLS_FUNC:
427 TRACE ("BFD_RELOC_XTENSA_TLS_FUNC");
428 return &elf_howto_table[(unsigned) R_XTENSA_TLS_FUNC ];
430 case BFD_RELOC_XTENSA_TLS_ARG:
431 TRACE ("BFD_RELOC_XTENSA_TLS_ARG");
432 return &elf_howto_table[(unsigned) R_XTENSA_TLS_ARG ];
434 case BFD_RELOC_XTENSA_TLS_CALL:
435 TRACE ("BFD_RELOC_XTENSA_TLS_CALL");
436 return &elf_howto_table[(unsigned) R_XTENSA_TLS_CALL ];
439 if (code >= BFD_RELOC_XTENSA_SLOT0_OP
440 && code <= BFD_RELOC_XTENSA_SLOT14_OP)
442 unsigned n = (R_XTENSA_SLOT0_OP +
443 (code - BFD_RELOC_XTENSA_SLOT0_OP));
444 return &elf_howto_table[n];
447 if (code >= BFD_RELOC_XTENSA_SLOT0_ALT
448 && code <= BFD_RELOC_XTENSA_SLOT14_ALT)
450 unsigned n = (R_XTENSA_SLOT0_ALT +
451 (code - BFD_RELOC_XTENSA_SLOT0_ALT));
452 return &elf_howto_table[n];
458 /* xgettext:c-format */
459 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
460 bfd_set_error (bfd_error_bad_value);
465 static reloc_howto_type *
466 elf_xtensa_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
471 for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
472 if (elf_howto_table[i].name != NULL
473 && strcasecmp (elf_howto_table[i].name, r_name) == 0)
474 return &elf_howto_table[i];
480 /* Given an ELF "rela" relocation, find the corresponding howto and record
481 it in the BFD internal arelent representation of the relocation. */
484 elf_xtensa_info_to_howto_rela (bfd *abfd,
486 Elf_Internal_Rela *dst)
488 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
490 if (r_type >= (unsigned int) R_XTENSA_max)
492 /* xgettext:c-format */
493 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
495 bfd_set_error (bfd_error_bad_value);
498 cache_ptr->howto = &elf_howto_table[r_type];
503 /* Functions for the Xtensa ELF linker. */
505 /* The name of the dynamic interpreter. This is put in the .interp
508 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
510 /* The size in bytes of an entry in the procedure linkage table.
511 (This does _not_ include the space for the literals associated with
514 #define PLT_ENTRY_SIZE 16
516 /* For _really_ large PLTs, we may need to alternate between literals
517 and code to keep the literals within the 256K range of the L32R
518 instructions in the code. It's unlikely that anyone would ever need
519 such a big PLT, but an arbitrary limit on the PLT size would be bad.
520 Thus, we split the PLT into chunks. Since there's very little
521 overhead (2 extra literals) for each chunk, the chunk size is kept
522 small so that the code for handling multiple chunks get used and
523 tested regularly. With 254 entries, there are 1K of literals for
524 each chunk, and that seems like a nice round number. */
526 #define PLT_ENTRIES_PER_CHUNK 254
528 /* PLT entries are actually used as stub functions for lazy symbol
529 resolution. Once the symbol is resolved, the stub function is never
530 invoked. Note: the 32-byte frame size used here cannot be changed
531 without a corresponding change in the runtime linker. */
533 static const bfd_byte elf_xtensa_be_plt_entry[][PLT_ENTRY_SIZE] =
536 0x6c, 0x10, 0x04, /* entry sp, 32 */
537 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
538 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
539 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
540 0x0a, 0x80, 0x00, /* jx a8 */
544 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
545 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
546 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
547 0x0a, 0x80, 0x00, /* jx a8 */
552 static const bfd_byte elf_xtensa_le_plt_entry[][PLT_ENTRY_SIZE] =
555 0x36, 0x41, 0x00, /* entry sp, 32 */
556 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
557 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
558 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
559 0xa0, 0x08, 0x00, /* jx a8 */
563 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
564 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
565 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
566 0xa0, 0x08, 0x00, /* jx a8 */
571 /* The size of the thread control block. */
574 struct elf_xtensa_link_hash_entry
576 struct elf_link_hash_entry elf;
578 bfd_signed_vma tlsfunc_refcount;
580 #define GOT_UNKNOWN 0
582 #define GOT_TLS_GD 2 /* global or local dynamic */
583 #define GOT_TLS_IE 4 /* initial or local exec */
584 #define GOT_TLS_ANY (GOT_TLS_GD | GOT_TLS_IE)
585 unsigned char tls_type;
588 #define elf_xtensa_hash_entry(ent) ((struct elf_xtensa_link_hash_entry *)(ent))
590 struct elf_xtensa_obj_tdata
592 struct elf_obj_tdata root;
594 /* tls_type for each local got entry. */
595 char *local_got_tls_type;
597 bfd_signed_vma *local_tlsfunc_refcounts;
600 #define elf_xtensa_tdata(abfd) \
601 ((struct elf_xtensa_obj_tdata *) (abfd)->tdata.any)
603 #define elf_xtensa_local_got_tls_type(abfd) \
604 (elf_xtensa_tdata (abfd)->local_got_tls_type)
606 #define elf_xtensa_local_tlsfunc_refcounts(abfd) \
607 (elf_xtensa_tdata (abfd)->local_tlsfunc_refcounts)
609 #define is_xtensa_elf(bfd) \
610 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
611 && elf_tdata (bfd) != NULL \
612 && elf_object_id (bfd) == XTENSA_ELF_DATA)
615 elf_xtensa_mkobject (bfd *abfd)
617 return bfd_elf_allocate_object (abfd, sizeof (struct elf_xtensa_obj_tdata),
621 /* Xtensa ELF linker hash table. */
623 struct elf_xtensa_link_hash_table
625 struct elf_link_hash_table elf;
627 /* Short-cuts to get to dynamic linker sections. */
629 asection *spltlittbl;
631 /* Total count of PLT relocations seen during check_relocs.
632 The actual PLT code must be split into multiple sections and all
633 the sections have to be created before size_dynamic_sections,
634 where we figure out the exact number of PLT entries that will be
635 needed. It is OK if this count is an overestimate, e.g., some
636 relocations may be removed by GC. */
639 struct elf_xtensa_link_hash_entry *tlsbase;
642 /* Get the Xtensa ELF linker hash table from a link_info structure. */
644 #define elf_xtensa_hash_table(p) \
645 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
646 == XTENSA_ELF_DATA ? ((struct elf_xtensa_link_hash_table *) ((p)->hash)) : NULL)
648 /* Create an entry in an Xtensa ELF linker hash table. */
650 static struct bfd_hash_entry *
651 elf_xtensa_link_hash_newfunc (struct bfd_hash_entry *entry,
652 struct bfd_hash_table *table,
655 /* Allocate the structure if it has not already been allocated by a
659 entry = bfd_hash_allocate (table,
660 sizeof (struct elf_xtensa_link_hash_entry));
665 /* Call the allocation method of the superclass. */
666 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
669 struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (entry);
670 eh->tlsfunc_refcount = 0;
671 eh->tls_type = GOT_UNKNOWN;
677 /* Create an Xtensa ELF linker hash table. */
679 static struct bfd_link_hash_table *
680 elf_xtensa_link_hash_table_create (bfd *abfd)
682 struct elf_link_hash_entry *tlsbase;
683 struct elf_xtensa_link_hash_table *ret;
684 bfd_size_type amt = sizeof (struct elf_xtensa_link_hash_table);
686 ret = bfd_zmalloc (amt);
690 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
691 elf_xtensa_link_hash_newfunc,
692 sizeof (struct elf_xtensa_link_hash_entry),
699 /* Create a hash entry for "_TLS_MODULE_BASE_" to speed up checking
701 tlsbase = elf_link_hash_lookup (&ret->elf, "_TLS_MODULE_BASE_",
703 tlsbase->root.type = bfd_link_hash_new;
704 tlsbase->root.u.undef.abfd = NULL;
705 tlsbase->non_elf = 0;
706 ret->tlsbase = elf_xtensa_hash_entry (tlsbase);
707 ret->tlsbase->tls_type = GOT_UNKNOWN;
709 return &ret->elf.root;
712 /* Copy the extra info we tack onto an elf_link_hash_entry. */
715 elf_xtensa_copy_indirect_symbol (struct bfd_link_info *info,
716 struct elf_link_hash_entry *dir,
717 struct elf_link_hash_entry *ind)
719 struct elf_xtensa_link_hash_entry *edir, *eind;
721 edir = elf_xtensa_hash_entry (dir);
722 eind = elf_xtensa_hash_entry (ind);
724 if (ind->root.type == bfd_link_hash_indirect)
726 edir->tlsfunc_refcount += eind->tlsfunc_refcount;
727 eind->tlsfunc_refcount = 0;
729 if (dir->got.refcount <= 0)
731 edir->tls_type = eind->tls_type;
732 eind->tls_type = GOT_UNKNOWN;
736 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
739 static inline bfd_boolean
740 elf_xtensa_dynamic_symbol_p (struct elf_link_hash_entry *h,
741 struct bfd_link_info *info)
743 /* Check if we should do dynamic things to this symbol. The
744 "ignore_protected" argument need not be set, because Xtensa code
745 does not require special handling of STV_PROTECTED to make function
746 pointer comparisons work properly. The PLT addresses are never
747 used for function pointers. */
749 return _bfd_elf_dynamic_symbol_p (h, info, 0);
754 property_table_compare (const void *ap, const void *bp)
756 const property_table_entry *a = (const property_table_entry *) ap;
757 const property_table_entry *b = (const property_table_entry *) bp;
759 if (a->address == b->address)
761 if (a->size != b->size)
762 return (a->size - b->size);
764 if ((a->flags & XTENSA_PROP_ALIGN) != (b->flags & XTENSA_PROP_ALIGN))
765 return ((b->flags & XTENSA_PROP_ALIGN)
766 - (a->flags & XTENSA_PROP_ALIGN));
768 if ((a->flags & XTENSA_PROP_ALIGN)
769 && (GET_XTENSA_PROP_ALIGNMENT (a->flags)
770 != GET_XTENSA_PROP_ALIGNMENT (b->flags)))
771 return (GET_XTENSA_PROP_ALIGNMENT (a->flags)
772 - GET_XTENSA_PROP_ALIGNMENT (b->flags));
774 if ((a->flags & XTENSA_PROP_UNREACHABLE)
775 != (b->flags & XTENSA_PROP_UNREACHABLE))
776 return ((b->flags & XTENSA_PROP_UNREACHABLE)
777 - (a->flags & XTENSA_PROP_UNREACHABLE));
779 return (a->flags - b->flags);
782 return (a->address - b->address);
787 property_table_matches (const void *ap, const void *bp)
789 const property_table_entry *a = (const property_table_entry *) ap;
790 const property_table_entry *b = (const property_table_entry *) bp;
792 /* Check if one entry overlaps with the other. */
793 if ((b->address >= a->address && b->address < (a->address + a->size))
794 || (a->address >= b->address && a->address < (b->address + b->size)))
797 return (a->address - b->address);
801 /* Get the literal table or property table entries for the given
802 section. Sets TABLE_P and returns the number of entries. On
803 error, returns a negative value. */
806 xtensa_read_table_entries (bfd *abfd,
808 property_table_entry **table_p,
809 const char *sec_name,
810 bfd_boolean output_addr)
812 asection *table_section;
813 bfd_size_type table_size = 0;
814 bfd_byte *table_data;
815 property_table_entry *blocks;
816 int blk, block_count;
817 bfd_size_type num_records;
818 Elf_Internal_Rela *internal_relocs, *irel, *rel_end;
819 bfd_vma section_addr, off;
820 flagword predef_flags;
821 bfd_size_type table_entry_size, section_limit;
824 || !(section->flags & SEC_ALLOC)
825 || (section->flags & SEC_DEBUGGING))
831 table_section = xtensa_get_property_section (section, sec_name);
833 table_size = table_section->size;
841 predef_flags = xtensa_get_property_predef_flags (table_section);
842 table_entry_size = 12;
844 table_entry_size -= 4;
846 num_records = table_size / table_entry_size;
847 table_data = retrieve_contents (abfd, table_section, TRUE);
848 blocks = (property_table_entry *)
849 bfd_malloc (num_records * sizeof (property_table_entry));
853 section_addr = section->output_section->vma + section->output_offset;
855 section_addr = section->vma;
857 internal_relocs = retrieve_internal_relocs (abfd, table_section, TRUE);
858 if (internal_relocs && !table_section->reloc_done)
860 qsort (internal_relocs, table_section->reloc_count,
861 sizeof (Elf_Internal_Rela), internal_reloc_compare);
862 irel = internal_relocs;
867 section_limit = bfd_get_section_limit (abfd, section);
868 rel_end = internal_relocs + table_section->reloc_count;
870 for (off = 0; off < table_size; off += table_entry_size)
872 bfd_vma address = bfd_get_32 (abfd, table_data + off);
874 /* Skip any relocations before the current offset. This should help
875 avoid confusion caused by unexpected relocations for the preceding
878 (irel->r_offset < off
879 || (irel->r_offset == off
880 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_NONE)))
887 if (irel && irel->r_offset == off)
890 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
891 BFD_ASSERT (ELF32_R_TYPE (irel->r_info) == R_XTENSA_32);
893 if (get_elf_r_symndx_section (abfd, r_symndx) != section)
896 sym_off = get_elf_r_symndx_offset (abfd, r_symndx);
897 BFD_ASSERT (sym_off == 0);
898 address += (section_addr + sym_off + irel->r_addend);
902 if (address < section_addr
903 || address >= section_addr + section_limit)
907 blocks[block_count].address = address;
908 blocks[block_count].size = bfd_get_32 (abfd, table_data + off + 4);
910 blocks[block_count].flags = predef_flags;
912 blocks[block_count].flags = bfd_get_32 (abfd, table_data + off + 8);
916 release_contents (table_section, table_data);
917 release_internal_relocs (table_section, internal_relocs);
921 /* Now sort them into address order for easy reference. */
922 qsort (blocks, block_count, sizeof (property_table_entry),
923 property_table_compare);
925 /* Check that the table contents are valid. Problems may occur,
926 for example, if an unrelocated object file is stripped. */
927 for (blk = 1; blk < block_count; blk++)
929 /* The only circumstance where two entries may legitimately
930 have the same address is when one of them is a zero-size
931 placeholder to mark a place where fill can be inserted.
932 The zero-size entry should come first. */
933 if (blocks[blk - 1].address == blocks[blk].address &&
934 blocks[blk - 1].size != 0)
936 /* xgettext:c-format */
937 _bfd_error_handler (_("%pB(%pA): invalid property table"),
939 bfd_set_error (bfd_error_bad_value);
951 static property_table_entry *
952 elf_xtensa_find_property_entry (property_table_entry *property_table,
953 int property_table_size,
956 property_table_entry entry;
957 property_table_entry *rv;
959 if (property_table_size == 0)
962 entry.address = addr;
966 rv = bsearch (&entry, property_table, property_table_size,
967 sizeof (property_table_entry), property_table_matches);
973 elf_xtensa_in_literal_pool (property_table_entry *lit_table,
977 if (elf_xtensa_find_property_entry (lit_table, lit_table_size, addr))
984 /* Look through the relocs for a section during the first phase, and
985 calculate needed space in the dynamic reloc sections. */
988 elf_xtensa_check_relocs (bfd *abfd,
989 struct bfd_link_info *info,
991 const Elf_Internal_Rela *relocs)
993 struct elf_xtensa_link_hash_table *htab;
994 Elf_Internal_Shdr *symtab_hdr;
995 struct elf_link_hash_entry **sym_hashes;
996 const Elf_Internal_Rela *rel;
997 const Elf_Internal_Rela *rel_end;
999 if (bfd_link_relocatable (info) || (sec->flags & SEC_ALLOC) == 0)
1002 BFD_ASSERT (is_xtensa_elf (abfd));
1004 htab = elf_xtensa_hash_table (info);
1008 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1009 sym_hashes = elf_sym_hashes (abfd);
1011 rel_end = relocs + sec->reloc_count;
1012 for (rel = relocs; rel < rel_end; rel++)
1014 unsigned int r_type;
1016 struct elf_link_hash_entry *h = NULL;
1017 struct elf_xtensa_link_hash_entry *eh;
1018 int tls_type, old_tls_type;
1019 bfd_boolean is_got = FALSE;
1020 bfd_boolean is_plt = FALSE;
1021 bfd_boolean is_tlsfunc = FALSE;
1023 r_symndx = ELF32_R_SYM (rel->r_info);
1024 r_type = ELF32_R_TYPE (rel->r_info);
1026 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1028 /* xgettext:c-format */
1029 _bfd_error_handler (_("%pB: bad symbol index: %d"),
1034 if (r_symndx >= symtab_hdr->sh_info)
1036 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1037 while (h->root.type == bfd_link_hash_indirect
1038 || h->root.type == bfd_link_hash_warning)
1039 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1041 eh = elf_xtensa_hash_entry (h);
1045 case R_XTENSA_TLSDESC_FN:
1046 if (bfd_link_pic (info))
1048 tls_type = GOT_TLS_GD;
1053 tls_type = GOT_TLS_IE;
1056 case R_XTENSA_TLSDESC_ARG:
1057 if (bfd_link_pic (info))
1059 tls_type = GOT_TLS_GD;
1064 tls_type = GOT_TLS_IE;
1065 if (h && elf_xtensa_hash_entry (h) != htab->tlsbase)
1070 case R_XTENSA_TLS_DTPOFF:
1071 if (bfd_link_pic (info))
1072 tls_type = GOT_TLS_GD;
1074 tls_type = GOT_TLS_IE;
1077 case R_XTENSA_TLS_TPOFF:
1078 tls_type = GOT_TLS_IE;
1079 if (bfd_link_pic (info))
1080 info->flags |= DF_STATIC_TLS;
1081 if (bfd_link_pic (info) || h)
1086 tls_type = GOT_NORMAL;
1091 tls_type = GOT_NORMAL;
1095 case R_XTENSA_GNU_VTINHERIT:
1096 /* This relocation describes the C++ object vtable hierarchy.
1097 Reconstruct it for later use during GC. */
1098 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1102 case R_XTENSA_GNU_VTENTRY:
1103 /* This relocation describes which C++ vtable entries are actually
1104 used. Record for later use during GC. */
1105 BFD_ASSERT (h != NULL);
1107 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1112 /* Nothing to do for any other relocations. */
1120 if (h->plt.refcount <= 0)
1123 h->plt.refcount = 1;
1126 h->plt.refcount += 1;
1128 /* Keep track of the total PLT relocation count even if we
1129 don't yet know whether the dynamic sections will be
1131 htab->plt_reloc_count += 1;
1133 if (elf_hash_table (info)->dynamic_sections_created)
1135 if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1141 if (h->got.refcount <= 0)
1142 h->got.refcount = 1;
1144 h->got.refcount += 1;
1148 eh->tlsfunc_refcount += 1;
1150 old_tls_type = eh->tls_type;
1154 /* Allocate storage the first time. */
1155 if (elf_local_got_refcounts (abfd) == NULL)
1157 bfd_size_type size = symtab_hdr->sh_info;
1160 mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1163 elf_local_got_refcounts (abfd) = (bfd_signed_vma *) mem;
1165 mem = bfd_zalloc (abfd, size);
1168 elf_xtensa_local_got_tls_type (abfd) = (char *) mem;
1170 mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1173 elf_xtensa_local_tlsfunc_refcounts (abfd)
1174 = (bfd_signed_vma *) mem;
1177 /* This is a global offset table entry for a local symbol. */
1178 if (is_got || is_plt)
1179 elf_local_got_refcounts (abfd) [r_symndx] += 1;
1182 elf_xtensa_local_tlsfunc_refcounts (abfd) [r_symndx] += 1;
1184 old_tls_type = elf_xtensa_local_got_tls_type (abfd) [r_symndx];
1187 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1188 tls_type |= old_tls_type;
1189 /* If a TLS symbol is accessed using IE at least once,
1190 there is no point to use a dynamic model for it. */
1191 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1192 && ((old_tls_type & GOT_TLS_GD) == 0
1193 || (tls_type & GOT_TLS_IE) == 0))
1195 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_GD))
1196 tls_type = old_tls_type;
1197 else if ((old_tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_GD))
1198 tls_type |= old_tls_type;
1202 /* xgettext:c-format */
1203 (_("%pB: `%s' accessed both as normal and thread local symbol"),
1205 h ? h->root.root.string : "<local>");
1210 if (old_tls_type != tls_type)
1213 eh->tls_type = tls_type;
1215 elf_xtensa_local_got_tls_type (abfd) [r_symndx] = tls_type;
1224 elf_xtensa_make_sym_local (struct bfd_link_info *info,
1225 struct elf_link_hash_entry *h)
1227 if (bfd_link_pic (info))
1229 if (h->plt.refcount > 0)
1231 /* For shared objects, there's no need for PLT entries for local
1232 symbols (use RELATIVE relocs instead of JMP_SLOT relocs). */
1233 if (h->got.refcount < 0)
1234 h->got.refcount = 0;
1235 h->got.refcount += h->plt.refcount;
1236 h->plt.refcount = 0;
1241 /* Don't need any dynamic relocations at all. */
1242 h->plt.refcount = 0;
1243 h->got.refcount = 0;
1249 elf_xtensa_hide_symbol (struct bfd_link_info *info,
1250 struct elf_link_hash_entry *h,
1251 bfd_boolean force_local)
1253 /* For a shared link, move the plt refcount to the got refcount to leave
1254 space for RELATIVE relocs. */
1255 elf_xtensa_make_sym_local (info, h);
1257 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
1261 /* Return the section that should be marked against GC for a given
1265 elf_xtensa_gc_mark_hook (asection *sec,
1266 struct bfd_link_info *info,
1267 Elf_Internal_Rela *rel,
1268 struct elf_link_hash_entry *h,
1269 Elf_Internal_Sym *sym)
1271 /* Property sections are marked "KEEP" in the linker scripts, but they
1272 should not cause other sections to be marked. (This approach relies
1273 on elf_xtensa_discard_info to remove property table entries that
1274 describe discarded sections. Alternatively, it might be more
1275 efficient to avoid using "KEEP" in the linker scripts and instead use
1276 the gc_mark_extra_sections hook to mark only the property sections
1277 that describe marked sections. That alternative does not work well
1278 with the current property table sections, which do not correspond
1279 one-to-one with the sections they describe, but that should be fixed
1281 if (xtensa_is_property_section (sec))
1285 switch (ELF32_R_TYPE (rel->r_info))
1287 case R_XTENSA_GNU_VTINHERIT:
1288 case R_XTENSA_GNU_VTENTRY:
1292 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1296 /* Create all the dynamic sections. */
1299 elf_xtensa_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1301 struct elf_xtensa_link_hash_table *htab;
1302 flagword flags, noalloc_flags;
1304 htab = elf_xtensa_hash_table (info);
1308 /* First do all the standard stuff. */
1309 if (! _bfd_elf_create_dynamic_sections (dynobj, info))
1312 /* Create any extra PLT sections in case check_relocs has already
1313 been called on all the non-dynamic input files. */
1314 if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1317 noalloc_flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
1318 | SEC_LINKER_CREATED | SEC_READONLY);
1319 flags = noalloc_flags | SEC_ALLOC | SEC_LOAD;
1321 /* Mark the ".got.plt" section READONLY. */
1322 if (htab->elf.sgotplt == NULL
1323 || ! bfd_set_section_flags (dynobj, htab->elf.sgotplt, flags))
1326 /* Create ".got.loc" (literal tables for use by dynamic linker). */
1327 htab->sgotloc = bfd_make_section_anyway_with_flags (dynobj, ".got.loc",
1329 if (htab->sgotloc == NULL
1330 || ! bfd_set_section_alignment (dynobj, htab->sgotloc, 2))
1333 /* Create ".xt.lit.plt" (literal table for ".got.plt*"). */
1334 htab->spltlittbl = bfd_make_section_anyway_with_flags (dynobj, ".xt.lit.plt",
1336 if (htab->spltlittbl == NULL
1337 || ! bfd_set_section_alignment (dynobj, htab->spltlittbl, 2))
1345 add_extra_plt_sections (struct bfd_link_info *info, int count)
1347 bfd *dynobj = elf_hash_table (info)->dynobj;
1350 /* Iterate over all chunks except 0 which uses the standard ".plt" and
1351 ".got.plt" sections. */
1352 for (chunk = count / PLT_ENTRIES_PER_CHUNK; chunk > 0; chunk--)
1358 /* Stop when we find a section has already been created. */
1359 if (elf_xtensa_get_plt_section (info, chunk))
1362 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1363 | SEC_LINKER_CREATED | SEC_READONLY);
1365 sname = (char *) bfd_malloc (10);
1366 sprintf (sname, ".plt.%u", chunk);
1367 s = bfd_make_section_anyway_with_flags (dynobj, sname, flags | SEC_CODE);
1369 || ! bfd_set_section_alignment (dynobj, s, 2))
1372 sname = (char *) bfd_malloc (14);
1373 sprintf (sname, ".got.plt.%u", chunk);
1374 s = bfd_make_section_anyway_with_flags (dynobj, sname, flags);
1376 || ! bfd_set_section_alignment (dynobj, s, 2))
1384 /* Adjust a symbol defined by a dynamic object and referenced by a
1385 regular object. The current definition is in some section of the
1386 dynamic object, but we're not including those sections. We have to
1387 change the definition to something the rest of the link can
1391 elf_xtensa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1392 struct elf_link_hash_entry *h)
1394 /* If this is a weak symbol, and there is a real definition, the
1395 processor independent code will have arranged for us to see the
1396 real definition first, and we can just use the same value. */
1397 if (h->is_weakalias)
1399 struct elf_link_hash_entry *def = weakdef (h);
1400 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1401 h->root.u.def.section = def->root.u.def.section;
1402 h->root.u.def.value = def->root.u.def.value;
1406 /* This is a reference to a symbol defined by a dynamic object. The
1407 reference must go through the GOT, so there's no need for COPY relocs,
1415 elf_xtensa_allocate_dynrelocs (struct elf_link_hash_entry *h, void *arg)
1417 struct bfd_link_info *info;
1418 struct elf_xtensa_link_hash_table *htab;
1419 struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (h);
1421 if (h->root.type == bfd_link_hash_indirect)
1424 info = (struct bfd_link_info *) arg;
1425 htab = elf_xtensa_hash_table (info);
1429 /* If we saw any use of an IE model for this symbol, we can then optimize
1430 away GOT entries for any TLSDESC_FN relocs. */
1431 if ((eh->tls_type & GOT_TLS_IE) != 0)
1433 BFD_ASSERT (h->got.refcount >= eh->tlsfunc_refcount);
1434 h->got.refcount -= eh->tlsfunc_refcount;
1437 if (! elf_xtensa_dynamic_symbol_p (h, info))
1438 elf_xtensa_make_sym_local (info, h);
1440 if (! elf_xtensa_dynamic_symbol_p (h, info)
1441 && h->root.type == bfd_link_hash_undefweak)
1444 if (h->plt.refcount > 0)
1445 htab->elf.srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
1447 if (h->got.refcount > 0)
1448 htab->elf.srelgot->size += (h->got.refcount * sizeof (Elf32_External_Rela));
1455 elf_xtensa_allocate_local_got_size (struct bfd_link_info *info)
1457 struct elf_xtensa_link_hash_table *htab;
1460 htab = elf_xtensa_hash_table (info);
1464 for (i = info->input_bfds; i; i = i->link.next)
1466 bfd_signed_vma *local_got_refcounts;
1467 bfd_size_type j, cnt;
1468 Elf_Internal_Shdr *symtab_hdr;
1470 local_got_refcounts = elf_local_got_refcounts (i);
1471 if (!local_got_refcounts)
1474 symtab_hdr = &elf_tdata (i)->symtab_hdr;
1475 cnt = symtab_hdr->sh_info;
1477 for (j = 0; j < cnt; ++j)
1479 /* If we saw any use of an IE model for this symbol, we can
1480 then optimize away GOT entries for any TLSDESC_FN relocs. */
1481 if ((elf_xtensa_local_got_tls_type (i) [j] & GOT_TLS_IE) != 0)
1483 bfd_signed_vma *tlsfunc_refcount
1484 = &elf_xtensa_local_tlsfunc_refcounts (i) [j];
1485 BFD_ASSERT (local_got_refcounts[j] >= *tlsfunc_refcount);
1486 local_got_refcounts[j] -= *tlsfunc_refcount;
1489 if (local_got_refcounts[j] > 0)
1490 htab->elf.srelgot->size += (local_got_refcounts[j]
1491 * sizeof (Elf32_External_Rela));
1497 /* Set the sizes of the dynamic sections. */
1500 elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1501 struct bfd_link_info *info)
1503 struct elf_xtensa_link_hash_table *htab;
1505 asection *s, *srelplt, *splt, *sgotplt, *srelgot, *spltlittbl, *sgotloc;
1506 bfd_boolean relplt, relgot;
1507 int plt_entries, plt_chunks, chunk;
1512 htab = elf_xtensa_hash_table (info);
1516 dynobj = elf_hash_table (info)->dynobj;
1519 srelgot = htab->elf.srelgot;
1520 srelplt = htab->elf.srelplt;
1522 if (elf_hash_table (info)->dynamic_sections_created)
1524 BFD_ASSERT (htab->elf.srelgot != NULL
1525 && htab->elf.srelplt != NULL
1526 && htab->elf.sgot != NULL
1527 && htab->spltlittbl != NULL
1528 && htab->sgotloc != NULL);
1530 /* Set the contents of the .interp section to the interpreter. */
1531 if (bfd_link_executable (info) && !info->nointerp)
1533 s = bfd_get_linker_section (dynobj, ".interp");
1536 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1537 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1540 /* Allocate room for one word in ".got". */
1541 htab->elf.sgot->size = 4;
1543 /* Allocate space in ".rela.got" for literals that reference global
1544 symbols and space in ".rela.plt" for literals that have PLT
1546 elf_link_hash_traverse (elf_hash_table (info),
1547 elf_xtensa_allocate_dynrelocs,
1550 /* If we are generating a shared object, we also need space in
1551 ".rela.got" for R_XTENSA_RELATIVE relocs for literals that
1552 reference local symbols. */
1553 if (bfd_link_pic (info))
1554 elf_xtensa_allocate_local_got_size (info);
1556 /* Allocate space in ".plt" to match the size of ".rela.plt". For
1557 each PLT entry, we need the PLT code plus a 4-byte literal.
1558 For each chunk of ".plt", we also need two more 4-byte
1559 literals, two corresponding entries in ".rela.got", and an
1560 8-byte entry in ".xt.lit.plt". */
1561 spltlittbl = htab->spltlittbl;
1562 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
1564 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
1566 /* Iterate over all the PLT chunks, including any extra sections
1567 created earlier because the initial count of PLT relocations
1568 was an overestimate. */
1570 (splt = elf_xtensa_get_plt_section (info, chunk)) != NULL;
1575 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
1576 BFD_ASSERT (sgotplt != NULL);
1578 if (chunk < plt_chunks - 1)
1579 chunk_entries = PLT_ENTRIES_PER_CHUNK;
1580 else if (chunk == plt_chunks - 1)
1581 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
1585 if (chunk_entries != 0)
1587 sgotplt->size = 4 * (chunk_entries + 2);
1588 splt->size = PLT_ENTRY_SIZE * chunk_entries;
1589 srelgot->size += 2 * sizeof (Elf32_External_Rela);
1590 spltlittbl->size += 8;
1599 /* Allocate space in ".got.loc" to match the total size of all the
1601 sgotloc = htab->sgotloc;
1602 sgotloc->size = spltlittbl->size;
1603 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
1605 if (abfd->flags & DYNAMIC)
1607 for (s = abfd->sections; s != NULL; s = s->next)
1609 if (! discarded_section (s)
1610 && xtensa_is_littable_section (s)
1612 sgotloc->size += s->size;
1617 /* Allocate memory for dynamic sections. */
1620 for (s = dynobj->sections; s != NULL; s = s->next)
1624 if ((s->flags & SEC_LINKER_CREATED) == 0)
1627 /* It's OK to base decisions on the section name, because none
1628 of the dynobj section names depend upon the input files. */
1629 name = bfd_get_section_name (dynobj, s);
1631 if (CONST_STRNEQ (name, ".rela"))
1635 if (strcmp (name, ".rela.plt") == 0)
1637 else if (strcmp (name, ".rela.got") == 0)
1640 /* We use the reloc_count field as a counter if we need
1641 to copy relocs into the output file. */
1645 else if (! CONST_STRNEQ (name, ".plt.")
1646 && ! CONST_STRNEQ (name, ".got.plt.")
1647 && strcmp (name, ".got") != 0
1648 && strcmp (name, ".plt") != 0
1649 && strcmp (name, ".got.plt") != 0
1650 && strcmp (name, ".xt.lit.plt") != 0
1651 && strcmp (name, ".got.loc") != 0)
1653 /* It's not one of our sections, so don't allocate space. */
1659 /* If we don't need this section, strip it from the output
1660 file. We must create the ".plt*" and ".got.plt*"
1661 sections in create_dynamic_sections and/or check_relocs
1662 based on a conservative estimate of the PLT relocation
1663 count, because the sections must be created before the
1664 linker maps input sections to output sections. The
1665 linker does that before size_dynamic_sections, where we
1666 compute the exact size of the PLT, so there may be more
1667 of these sections than are actually needed. */
1668 s->flags |= SEC_EXCLUDE;
1670 else if ((s->flags & SEC_HAS_CONTENTS) != 0)
1672 /* Allocate memory for the section contents. */
1673 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1674 if (s->contents == NULL)
1679 if (elf_hash_table (info)->dynamic_sections_created)
1681 /* Add the special XTENSA_RTLD relocations now. The offsets won't be
1682 known until finish_dynamic_sections, but we need to get the relocs
1683 in place before they are sorted. */
1684 for (chunk = 0; chunk < plt_chunks; chunk++)
1686 Elf_Internal_Rela irela;
1690 irela.r_info = ELF32_R_INFO (0, R_XTENSA_RTLD);
1693 loc = (srelgot->contents
1694 + srelgot->reloc_count * sizeof (Elf32_External_Rela));
1695 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
1696 bfd_elf32_swap_reloca_out (output_bfd, &irela,
1697 loc + sizeof (Elf32_External_Rela));
1698 srelgot->reloc_count += 2;
1701 /* Add some entries to the .dynamic section. We fill in the
1702 values later, in elf_xtensa_finish_dynamic_sections, but we
1703 must add the entries now so that we get the correct size for
1704 the .dynamic section. The DT_DEBUG entry is filled in by the
1705 dynamic linker and used by the debugger. */
1706 #define add_dynamic_entry(TAG, VAL) \
1707 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1709 if (bfd_link_executable (info))
1711 if (!add_dynamic_entry (DT_DEBUG, 0))
1717 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1718 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1719 || !add_dynamic_entry (DT_JMPREL, 0))
1725 if (!add_dynamic_entry (DT_RELA, 0)
1726 || !add_dynamic_entry (DT_RELASZ, 0)
1727 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
1731 if (!add_dynamic_entry (DT_PLTGOT, 0)
1732 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0)
1733 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0))
1736 #undef add_dynamic_entry
1742 elf_xtensa_always_size_sections (bfd *output_bfd,
1743 struct bfd_link_info *info)
1745 struct elf_xtensa_link_hash_table *htab;
1748 htab = elf_xtensa_hash_table (info);
1752 tls_sec = htab->elf.tls_sec;
1754 if (tls_sec && (htab->tlsbase->tls_type & GOT_TLS_ANY) != 0)
1756 struct elf_link_hash_entry *tlsbase = &htab->tlsbase->elf;
1757 struct bfd_link_hash_entry *bh = &tlsbase->root;
1758 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
1760 tlsbase->type = STT_TLS;
1761 if (!(_bfd_generic_link_add_one_symbol
1762 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
1763 tls_sec, 0, NULL, FALSE,
1764 bed->collect, &bh)))
1766 tlsbase->def_regular = 1;
1767 tlsbase->other = STV_HIDDEN;
1768 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
1775 /* Return the base VMA address which should be subtracted from real addresses
1776 when resolving @dtpoff relocation.
1777 This is PT_TLS segment p_vaddr. */
1780 dtpoff_base (struct bfd_link_info *info)
1782 /* If tls_sec is NULL, we should have signalled an error already. */
1783 if (elf_hash_table (info)->tls_sec == NULL)
1785 return elf_hash_table (info)->tls_sec->vma;
1788 /* Return the relocation value for @tpoff relocation
1789 if STT_TLS virtual address is ADDRESS. */
1792 tpoff (struct bfd_link_info *info, bfd_vma address)
1794 struct elf_link_hash_table *htab = elf_hash_table (info);
1797 /* If tls_sec is NULL, we should have signalled an error already. */
1798 if (htab->tls_sec == NULL)
1800 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
1801 return address - htab->tls_sec->vma + base;
1804 /* Perform the specified relocation. The instruction at (contents + address)
1805 is modified to set one operand to represent the value in "relocation". The
1806 operand position is determined by the relocation type recorded in the
1809 #define CALL_SEGMENT_BITS (30)
1810 #define CALL_SEGMENT_SIZE (1 << CALL_SEGMENT_BITS)
1812 static bfd_reloc_status_type
1813 elf_xtensa_do_reloc (reloc_howto_type *howto,
1815 asection *input_section,
1819 bfd_boolean is_weak_undef,
1820 char **error_message)
1823 xtensa_opcode opcode;
1824 xtensa_isa isa = xtensa_default_isa;
1825 static xtensa_insnbuf ibuff = NULL;
1826 static xtensa_insnbuf sbuff = NULL;
1827 bfd_vma self_address;
1828 bfd_size_type input_size;
1834 ibuff = xtensa_insnbuf_alloc (isa);
1835 sbuff = xtensa_insnbuf_alloc (isa);
1838 input_size = bfd_get_section_limit (abfd, input_section);
1840 /* Calculate the PC address for this instruction. */
1841 self_address = (input_section->output_section->vma
1842 + input_section->output_offset
1845 switch (howto->type)
1848 case R_XTENSA_DIFF8:
1849 case R_XTENSA_DIFF16:
1850 case R_XTENSA_DIFF32:
1851 case R_XTENSA_TLS_FUNC:
1852 case R_XTENSA_TLS_ARG:
1853 case R_XTENSA_TLS_CALL:
1854 return bfd_reloc_ok;
1856 case R_XTENSA_ASM_EXPAND:
1859 /* Check for windowed CALL across a 1GB boundary. */
1860 opcode = get_expanded_call_opcode (contents + address,
1861 input_size - address, 0);
1862 if (is_windowed_call_opcode (opcode))
1864 if ((self_address >> CALL_SEGMENT_BITS)
1865 != (relocation >> CALL_SEGMENT_BITS))
1867 *error_message = "windowed longcall crosses 1GB boundary; "
1869 return bfd_reloc_dangerous;
1873 return bfd_reloc_ok;
1875 case R_XTENSA_ASM_SIMPLIFY:
1877 /* Convert the L32R/CALLX to CALL. */
1878 bfd_reloc_status_type retval =
1879 elf_xtensa_do_asm_simplify (contents, address, input_size,
1881 if (retval != bfd_reloc_ok)
1882 return bfd_reloc_dangerous;
1884 /* The CALL needs to be relocated. Continue below for that part. */
1887 howto = &elf_howto_table[(unsigned) R_XTENSA_SLOT0_OP ];
1894 x = bfd_get_32 (abfd, contents + address);
1896 bfd_put_32 (abfd, x, contents + address);
1898 return bfd_reloc_ok;
1900 case R_XTENSA_32_PCREL:
1901 bfd_put_32 (abfd, relocation - self_address, contents + address);
1902 return bfd_reloc_ok;
1905 case R_XTENSA_TLSDESC_FN:
1906 case R_XTENSA_TLSDESC_ARG:
1907 case R_XTENSA_TLS_DTPOFF:
1908 case R_XTENSA_TLS_TPOFF:
1909 bfd_put_32 (abfd, relocation, contents + address);
1910 return bfd_reloc_ok;
1913 /* Only instruction slot-specific relocations handled below.... */
1914 slot = get_relocation_slot (howto->type);
1915 if (slot == XTENSA_UNDEFINED)
1917 *error_message = "unexpected relocation";
1918 return bfd_reloc_dangerous;
1921 /* Read the instruction into a buffer and decode the opcode. */
1922 xtensa_insnbuf_from_chars (isa, ibuff, contents + address,
1923 input_size - address);
1924 fmt = xtensa_format_decode (isa, ibuff);
1925 if (fmt == XTENSA_UNDEFINED)
1927 *error_message = "cannot decode instruction format";
1928 return bfd_reloc_dangerous;
1931 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
1933 opcode = xtensa_opcode_decode (isa, fmt, slot, sbuff);
1934 if (opcode == XTENSA_UNDEFINED)
1936 *error_message = "cannot decode instruction opcode";
1937 return bfd_reloc_dangerous;
1940 /* Check for opcode-specific "alternate" relocations. */
1941 if (is_alt_relocation (howto->type))
1943 if (opcode == get_l32r_opcode ())
1945 /* Handle the special-case of non-PC-relative L32R instructions. */
1946 bfd *output_bfd = input_section->output_section->owner;
1947 asection *lit4_sec = bfd_get_section_by_name (output_bfd, ".lit4");
1950 *error_message = "relocation references missing .lit4 section";
1951 return bfd_reloc_dangerous;
1953 self_address = ((lit4_sec->vma & ~0xfff)
1954 + 0x40000 - 3); /* -3 to compensate for do_reloc */
1955 newval = relocation;
1958 else if (opcode == get_const16_opcode ())
1960 /* ALT used for high 16 bits. */
1961 newval = relocation >> 16;
1966 /* No other "alternate" relocations currently defined. */
1967 *error_message = "unexpected relocation";
1968 return bfd_reloc_dangerous;
1971 else /* Not an "alternate" relocation.... */
1973 if (opcode == get_const16_opcode ())
1975 newval = relocation & 0xffff;
1980 /* ...normal PC-relative relocation.... */
1982 /* Determine which operand is being relocated. */
1983 opnd = get_relocation_opnd (opcode, howto->type);
1984 if (opnd == XTENSA_UNDEFINED)
1986 *error_message = "unexpected relocation";
1987 return bfd_reloc_dangerous;
1990 if (!howto->pc_relative)
1992 *error_message = "expected PC-relative relocation";
1993 return bfd_reloc_dangerous;
1996 newval = relocation;
2000 /* Apply the relocation. */
2001 if (xtensa_operand_do_reloc (isa, opcode, opnd, &newval, self_address)
2002 || xtensa_operand_encode (isa, opcode, opnd, &newval)
2003 || xtensa_operand_set_field (isa, opcode, opnd, fmt, slot,
2006 const char *opname = xtensa_opcode_name (isa, opcode);
2009 msg = "cannot encode";
2010 if (is_direct_call_opcode (opcode))
2012 if ((relocation & 0x3) != 0)
2013 msg = "misaligned call target";
2015 msg = "call target out of range";
2017 else if (opcode == get_l32r_opcode ())
2019 if ((relocation & 0x3) != 0)
2020 msg = "misaligned literal target";
2021 else if (is_alt_relocation (howto->type))
2022 msg = "literal target out of range (too many literals)";
2023 else if (self_address > relocation)
2024 msg = "literal target out of range (try using text-section-literals)";
2026 msg = "literal placed after use";
2029 *error_message = vsprint_msg (opname, ": %s", strlen (msg) + 2, msg);
2030 return bfd_reloc_dangerous;
2033 /* Check for calls across 1GB boundaries. */
2034 if (is_direct_call_opcode (opcode)
2035 && is_windowed_call_opcode (opcode))
2037 if ((self_address >> CALL_SEGMENT_BITS)
2038 != (relocation >> CALL_SEGMENT_BITS))
2041 "windowed call crosses 1GB boundary; return may fail";
2042 return bfd_reloc_dangerous;
2046 /* Write the modified instruction back out of the buffer. */
2047 xtensa_format_set_slot (isa, fmt, slot, ibuff, sbuff);
2048 xtensa_insnbuf_to_chars (isa, ibuff, contents + address,
2049 input_size - address);
2050 return bfd_reloc_ok;
2055 vsprint_msg (const char *origmsg, const char *fmt, int arglen, ...)
2057 /* To reduce the size of the memory leak,
2058 we only use a single message buffer. */
2059 static bfd_size_type alloc_size = 0;
2060 static char *message = NULL;
2061 bfd_size_type orig_len, len = 0;
2062 bfd_boolean is_append;
2065 va_start (ap, arglen);
2067 is_append = (origmsg == message);
2069 orig_len = strlen (origmsg);
2070 len = orig_len + strlen (fmt) + arglen + 20;
2071 if (len > alloc_size)
2073 message = (char *) bfd_realloc_or_free (message, len);
2076 if (message != NULL)
2079 memcpy (message, origmsg, orig_len);
2080 vsprintf (message + orig_len, fmt, ap);
2087 /* This function is registered as the "special_function" in the
2088 Xtensa howto for handling simplify operations.
2089 bfd_perform_relocation / bfd_install_relocation use it to
2090 perform (install) the specified relocation. Since this replaces the code
2091 in bfd_perform_relocation, it is basically an Xtensa-specific,
2092 stripped-down version of bfd_perform_relocation. */
2094 static bfd_reloc_status_type
2095 bfd_elf_xtensa_reloc (bfd *abfd,
2096 arelent *reloc_entry,
2099 asection *input_section,
2101 char **error_message)
2104 bfd_reloc_status_type flag;
2105 bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2106 bfd_vma output_base = 0;
2107 reloc_howto_type *howto = reloc_entry->howto;
2108 asection *reloc_target_output_section;
2109 bfd_boolean is_weak_undef;
2111 if (!xtensa_default_isa)
2112 xtensa_default_isa = xtensa_isa_init (0, 0);
2114 /* ELF relocs are against symbols. If we are producing relocatable
2115 output, and the reloc is against an external symbol, the resulting
2116 reloc will also be against the same symbol. In such a case, we
2117 don't want to change anything about the way the reloc is handled,
2118 since it will all be done at final link time. This test is similar
2119 to what bfd_elf_generic_reloc does except that it lets relocs with
2120 howto->partial_inplace go through even if the addend is non-zero.
2121 (The real problem is that partial_inplace is set for XTENSA_32
2122 relocs to begin with, but that's a long story and there's little we
2123 can do about it now....) */
2125 if (output_bfd && (symbol->flags & BSF_SECTION_SYM) == 0)
2127 reloc_entry->address += input_section->output_offset;
2128 return bfd_reloc_ok;
2131 /* Is the address of the relocation really within the section? */
2132 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2133 return bfd_reloc_outofrange;
2135 /* Work out which section the relocation is targeted at and the
2136 initial relocation command value. */
2138 /* Get symbol value. (Common symbols are special.) */
2139 if (bfd_is_com_section (symbol->section))
2142 relocation = symbol->value;
2144 reloc_target_output_section = symbol->section->output_section;
2146 /* Convert input-section-relative symbol value to absolute. */
2147 if ((output_bfd && !howto->partial_inplace)
2148 || reloc_target_output_section == NULL)
2151 output_base = reloc_target_output_section->vma;
2153 relocation += output_base + symbol->section->output_offset;
2155 /* Add in supplied addend. */
2156 relocation += reloc_entry->addend;
2158 /* Here the variable relocation holds the final address of the
2159 symbol we are relocating against, plus any addend. */
2162 if (!howto->partial_inplace)
2164 /* This is a partial relocation, and we want to apply the relocation
2165 to the reloc entry rather than the raw data. Everything except
2166 relocations against section symbols has already been handled
2169 BFD_ASSERT (symbol->flags & BSF_SECTION_SYM);
2170 reloc_entry->addend = relocation;
2171 reloc_entry->address += input_section->output_offset;
2172 return bfd_reloc_ok;
2176 reloc_entry->address += input_section->output_offset;
2177 reloc_entry->addend = 0;
2181 is_weak_undef = (bfd_is_und_section (symbol->section)
2182 && (symbol->flags & BSF_WEAK) != 0);
2183 flag = elf_xtensa_do_reloc (howto, abfd, input_section, relocation,
2184 (bfd_byte *) data, (bfd_vma) octets,
2185 is_weak_undef, error_message);
2187 if (flag == bfd_reloc_dangerous)
2189 /* Add the symbol name to the error message. */
2190 if (! *error_message)
2191 *error_message = "";
2192 *error_message = vsprint_msg (*error_message, ": (%s + 0x%lx)",
2193 strlen (symbol->name) + 17,
2195 (unsigned long) reloc_entry->addend);
2202 /* Set up an entry in the procedure linkage table. */
2205 elf_xtensa_create_plt_entry (struct bfd_link_info *info,
2207 unsigned reloc_index)
2209 asection *splt, *sgotplt;
2210 bfd_vma plt_base, got_base;
2211 bfd_vma code_offset, lit_offset, abi_offset;
2214 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
2215 splt = elf_xtensa_get_plt_section (info, chunk);
2216 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
2217 BFD_ASSERT (splt != NULL && sgotplt != NULL);
2219 plt_base = splt->output_section->vma + splt->output_offset;
2220 got_base = sgotplt->output_section->vma + sgotplt->output_offset;
2222 lit_offset = 8 + (reloc_index % PLT_ENTRIES_PER_CHUNK) * 4;
2223 code_offset = (reloc_index % PLT_ENTRIES_PER_CHUNK) * PLT_ENTRY_SIZE;
2225 /* Fill in the literal entry. This is the offset of the dynamic
2226 relocation entry. */
2227 bfd_put_32 (output_bfd, reloc_index * sizeof (Elf32_External_Rela),
2228 sgotplt->contents + lit_offset);
2230 /* Fill in the entry in the procedure linkage table. */
2231 memcpy (splt->contents + code_offset,
2232 (bfd_big_endian (output_bfd)
2233 ? elf_xtensa_be_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED]
2234 : elf_xtensa_le_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED]),
2236 abi_offset = XSHAL_ABI == XTHAL_ABI_WINDOWED ? 3 : 0;
2237 bfd_put_16 (output_bfd, l32r_offset (got_base + 0,
2238 plt_base + code_offset + abi_offset),
2239 splt->contents + code_offset + abi_offset + 1);
2240 bfd_put_16 (output_bfd, l32r_offset (got_base + 4,
2241 plt_base + code_offset + abi_offset + 3),
2242 splt->contents + code_offset + abi_offset + 4);
2243 bfd_put_16 (output_bfd, l32r_offset (got_base + lit_offset,
2244 plt_base + code_offset + abi_offset + 6),
2245 splt->contents + code_offset + abi_offset + 7);
2247 return plt_base + code_offset;
2251 static bfd_boolean get_indirect_call_dest_reg (xtensa_opcode, unsigned *);
2254 replace_tls_insn (Elf_Internal_Rela *rel,
2256 asection *input_section,
2258 bfd_boolean is_ld_model,
2259 char **error_message)
2261 static xtensa_insnbuf ibuff = NULL;
2262 static xtensa_insnbuf sbuff = NULL;
2263 xtensa_isa isa = xtensa_default_isa;
2265 xtensa_opcode old_op, new_op;
2266 bfd_size_type input_size;
2268 unsigned dest_reg, src_reg;
2272 ibuff = xtensa_insnbuf_alloc (isa);
2273 sbuff = xtensa_insnbuf_alloc (isa);
2276 input_size = bfd_get_section_limit (abfd, input_section);
2278 /* Read the instruction into a buffer and decode the opcode. */
2279 xtensa_insnbuf_from_chars (isa, ibuff, contents + rel->r_offset,
2280 input_size - rel->r_offset);
2281 fmt = xtensa_format_decode (isa, ibuff);
2282 if (fmt == XTENSA_UNDEFINED)
2284 *error_message = "cannot decode instruction format";
2288 BFD_ASSERT (xtensa_format_num_slots (isa, fmt) == 1);
2289 xtensa_format_get_slot (isa, fmt, 0, ibuff, sbuff);
2291 old_op = xtensa_opcode_decode (isa, fmt, 0, sbuff);
2292 if (old_op == XTENSA_UNDEFINED)
2294 *error_message = "cannot decode instruction opcode";
2298 r_type = ELF32_R_TYPE (rel->r_info);
2301 case R_XTENSA_TLS_FUNC:
2302 case R_XTENSA_TLS_ARG:
2303 if (old_op != get_l32r_opcode ()
2304 || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2305 sbuff, &dest_reg) != 0)
2307 *error_message = "cannot extract L32R destination for TLS access";
2312 case R_XTENSA_TLS_CALL:
2313 if (! get_indirect_call_dest_reg (old_op, &dest_reg)
2314 || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2315 sbuff, &src_reg) != 0)
2317 *error_message = "cannot extract CALLXn operands for TLS access";
2330 case R_XTENSA_TLS_FUNC:
2331 case R_XTENSA_TLS_ARG:
2332 /* Change the instruction to a NOP (or "OR a1, a1, a1" for older
2333 versions of Xtensa). */
2334 new_op = xtensa_opcode_lookup (isa, "nop");
2335 if (new_op == XTENSA_UNDEFINED)
2337 new_op = xtensa_opcode_lookup (isa, "or");
2338 if (new_op == XTENSA_UNDEFINED
2339 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2340 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2342 || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2344 || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2347 *error_message = "cannot encode OR for TLS access";
2353 if (xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0)
2355 *error_message = "cannot encode NOP for TLS access";
2361 case R_XTENSA_TLS_CALL:
2362 /* Read THREADPTR into the CALLX's return value register. */
2363 new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2364 if (new_op == XTENSA_UNDEFINED
2365 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2366 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2367 sbuff, dest_reg + 2) != 0)
2369 *error_message = "cannot encode RUR.THREADPTR for TLS access";
2379 case R_XTENSA_TLS_FUNC:
2380 new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2381 if (new_op == XTENSA_UNDEFINED
2382 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2383 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2384 sbuff, dest_reg) != 0)
2386 *error_message = "cannot encode RUR.THREADPTR for TLS access";
2391 case R_XTENSA_TLS_ARG:
2392 /* Nothing to do. Keep the original L32R instruction. */
2395 case R_XTENSA_TLS_CALL:
2396 /* Add the CALLX's src register (holding the THREADPTR value)
2397 to the first argument register (holding the offset) and put
2398 the result in the CALLX's return value register. */
2399 new_op = xtensa_opcode_lookup (isa, "add");
2400 if (new_op == XTENSA_UNDEFINED
2401 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2402 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2403 sbuff, dest_reg + 2) != 0
2404 || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2405 sbuff, dest_reg + 2) != 0
2406 || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2407 sbuff, src_reg) != 0)
2409 *error_message = "cannot encode ADD for TLS access";
2416 xtensa_format_set_slot (isa, fmt, 0, ibuff, sbuff);
2417 xtensa_insnbuf_to_chars (isa, ibuff, contents + rel->r_offset,
2418 input_size - rel->r_offset);
2424 #define IS_XTENSA_TLS_RELOC(R_TYPE) \
2425 ((R_TYPE) == R_XTENSA_TLSDESC_FN \
2426 || (R_TYPE) == R_XTENSA_TLSDESC_ARG \
2427 || (R_TYPE) == R_XTENSA_TLS_DTPOFF \
2428 || (R_TYPE) == R_XTENSA_TLS_TPOFF \
2429 || (R_TYPE) == R_XTENSA_TLS_FUNC \
2430 || (R_TYPE) == R_XTENSA_TLS_ARG \
2431 || (R_TYPE) == R_XTENSA_TLS_CALL)
2433 /* Relocate an Xtensa ELF section. This is invoked by the linker for
2434 both relocatable and final links. */
2437 elf_xtensa_relocate_section (bfd *output_bfd,
2438 struct bfd_link_info *info,
2440 asection *input_section,
2442 Elf_Internal_Rela *relocs,
2443 Elf_Internal_Sym *local_syms,
2444 asection **local_sections)
2446 struct elf_xtensa_link_hash_table *htab;
2447 Elf_Internal_Shdr *symtab_hdr;
2448 Elf_Internal_Rela *rel;
2449 Elf_Internal_Rela *relend;
2450 struct elf_link_hash_entry **sym_hashes;
2451 property_table_entry *lit_table = 0;
2453 char *local_got_tls_types;
2454 char *error_message = NULL;
2455 bfd_size_type input_size;
2458 if (!xtensa_default_isa)
2459 xtensa_default_isa = xtensa_isa_init (0, 0);
2461 BFD_ASSERT (is_xtensa_elf (input_bfd));
2463 htab = elf_xtensa_hash_table (info);
2467 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2468 sym_hashes = elf_sym_hashes (input_bfd);
2469 local_got_tls_types = elf_xtensa_local_got_tls_type (input_bfd);
2471 if (elf_hash_table (info)->dynamic_sections_created)
2473 ltblsize = xtensa_read_table_entries (input_bfd, input_section,
2474 &lit_table, XTENSA_LIT_SEC_NAME,
2480 input_size = bfd_get_section_limit (input_bfd, input_section);
2483 relend = relocs + input_section->reloc_count;
2484 for (; rel < relend; rel++)
2487 reloc_howto_type *howto;
2488 unsigned long r_symndx;
2489 struct elf_link_hash_entry *h;
2490 Elf_Internal_Sym *sym;
2495 bfd_reloc_status_type r;
2496 bfd_boolean is_weak_undef;
2497 bfd_boolean unresolved_reloc;
2499 bfd_boolean dynamic_symbol;
2501 r_type = ELF32_R_TYPE (rel->r_info);
2502 if (r_type == (int) R_XTENSA_GNU_VTINHERIT
2503 || r_type == (int) R_XTENSA_GNU_VTENTRY)
2506 if (r_type < 0 || r_type >= (int) R_XTENSA_max)
2508 bfd_set_error (bfd_error_bad_value);
2511 howto = &elf_howto_table[r_type];
2513 r_symndx = ELF32_R_SYM (rel->r_info);
2518 is_weak_undef = FALSE;
2519 unresolved_reloc = FALSE;
2522 if (howto->partial_inplace && !bfd_link_relocatable (info))
2524 /* Because R_XTENSA_32 was made partial_inplace to fix some
2525 problems with DWARF info in partial links, there may be
2526 an addend stored in the contents. Take it out of there
2527 and move it back into the addend field of the reloc. */
2528 rel->r_addend += bfd_get_32 (input_bfd, contents + rel->r_offset);
2529 bfd_put_32 (input_bfd, 0, contents + rel->r_offset);
2532 if (r_symndx < symtab_hdr->sh_info)
2534 sym = local_syms + r_symndx;
2535 sym_type = ELF32_ST_TYPE (sym->st_info);
2536 sec = local_sections[r_symndx];
2537 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2541 bfd_boolean ignored;
2543 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2544 r_symndx, symtab_hdr, sym_hashes,
2546 unresolved_reloc, warned, ignored);
2549 && !unresolved_reloc
2550 && h->root.type == bfd_link_hash_undefweak)
2551 is_weak_undef = TRUE;
2556 if (sec != NULL && discarded_section (sec))
2557 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2558 rel, 1, relend, howto, 0, contents);
2560 if (bfd_link_relocatable (info))
2563 asection * sym_sec = get_elf_r_symndx_section (input_bfd, r_symndx);
2565 /* This is a relocatable link.
2566 1) If the reloc is against a section symbol, adjust
2567 according to the output section.
2568 2) If there is a new target for this relocation,
2569 the new target will be in the same output section.
2570 We adjust the relocation by the output section
2573 if (relaxing_section)
2575 /* Check if this references a section in another input file. */
2576 if (!do_fix_for_relocatable_link (rel, input_bfd, input_section,
2581 dest_addr = sym_sec->output_section->vma + sym_sec->output_offset
2582 + get_elf_r_symndx_offset (input_bfd, r_symndx) + rel->r_addend;
2584 if (r_type == R_XTENSA_ASM_SIMPLIFY)
2586 error_message = NULL;
2587 /* Convert ASM_SIMPLIFY into the simpler relocation
2588 so that they never escape a relaxing link. */
2589 r = contract_asm_expansion (contents, input_size, rel,
2591 if (r != bfd_reloc_ok)
2592 (*info->callbacks->reloc_dangerous)
2593 (info, error_message,
2594 input_bfd, input_section, rel->r_offset);
2596 r_type = ELF32_R_TYPE (rel->r_info);
2599 /* This is a relocatable link, so we don't have to change
2600 anything unless the reloc is against a section symbol,
2601 in which case we have to adjust according to where the
2602 section symbol winds up in the output section. */
2603 if (r_symndx < symtab_hdr->sh_info)
2605 sym = local_syms + r_symndx;
2606 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2608 sec = local_sections[r_symndx];
2609 rel->r_addend += sec->output_offset + sym->st_value;
2613 /* If there is an addend with a partial_inplace howto,
2614 then move the addend to the contents. This is a hack
2615 to work around problems with DWARF in relocatable links
2616 with some previous version of BFD. Now we can't easily get
2617 rid of the hack without breaking backward compatibility.... */
2619 howto = &elf_howto_table[r_type];
2620 if (howto->partial_inplace && rel->r_addend)
2622 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2623 rel->r_addend, contents,
2624 rel->r_offset, FALSE,
2630 /* Put the correct bits in the target instruction, even
2631 though the relocation will still be present in the output
2632 file. This makes disassembly clearer, as well as
2633 allowing loadable kernel modules to work without needing
2634 relocations on anything other than calls and l32r's. */
2636 /* If it is not in the same section, there is nothing we can do. */
2637 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP &&
2638 sym_sec->output_section == input_section->output_section)
2640 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2641 dest_addr, contents,
2642 rel->r_offset, FALSE,
2646 if (r != bfd_reloc_ok)
2647 (*info->callbacks->reloc_dangerous)
2648 (info, error_message,
2649 input_bfd, input_section, rel->r_offset);
2651 /* Done with work for relocatable link; continue with next reloc. */
2655 /* This is a final link. */
2657 if (relaxing_section)
2659 /* Check if this references a section in another input file. */
2660 do_fix_for_final_link (rel, input_bfd, input_section, contents,
2664 /* Sanity check the address. */
2665 if (rel->r_offset >= input_size
2666 && ELF32_R_TYPE (rel->r_info) != R_XTENSA_NONE)
2669 /* xgettext:c-format */
2670 (_("%pB(%pA+%#" PRIx64 "): "
2671 "relocation offset out of range (size=%#" PRIx64 ")"),
2672 input_bfd, input_section, (uint64_t) rel->r_offset,
2673 (uint64_t) input_size);
2674 bfd_set_error (bfd_error_bad_value);
2679 name = h->root.root.string;
2682 name = (bfd_elf_string_from_elf_section
2683 (input_bfd, symtab_hdr->sh_link, sym->st_name));
2684 if (name == NULL || *name == '\0')
2685 name = bfd_section_name (input_bfd, sec);
2688 if (r_symndx != STN_UNDEF
2689 && r_type != R_XTENSA_NONE
2691 || h->root.type == bfd_link_hash_defined
2692 || h->root.type == bfd_link_hash_defweak)
2693 && IS_XTENSA_TLS_RELOC (r_type) != (sym_type == STT_TLS))
2696 ((sym_type == STT_TLS
2697 /* xgettext:c-format */
2698 ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
2699 /* xgettext:c-format */
2700 : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
2703 (uint64_t) rel->r_offset,
2708 dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
2710 tls_type = GOT_UNKNOWN;
2712 tls_type = elf_xtensa_hash_entry (h)->tls_type;
2713 else if (local_got_tls_types)
2714 tls_type = local_got_tls_types [r_symndx];
2720 if (elf_hash_table (info)->dynamic_sections_created
2721 && (input_section->flags & SEC_ALLOC) != 0
2722 && (dynamic_symbol || bfd_link_pic (info)))
2724 Elf_Internal_Rela outrel;
2728 if (dynamic_symbol && r_type == R_XTENSA_PLT)
2729 srel = htab->elf.srelplt;
2731 srel = htab->elf.srelgot;
2733 BFD_ASSERT (srel != NULL);
2736 _bfd_elf_section_offset (output_bfd, info,
2737 input_section, rel->r_offset);
2739 if ((outrel.r_offset | 1) == (bfd_vma) -1)
2740 memset (&outrel, 0, sizeof outrel);
2743 outrel.r_offset += (input_section->output_section->vma
2744 + input_section->output_offset);
2746 /* Complain if the relocation is in a read-only section
2747 and not in a literal pool. */
2748 if ((input_section->flags & SEC_READONLY) != 0
2749 && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
2753 _("dynamic relocation in read-only section");
2754 (*info->callbacks->reloc_dangerous)
2755 (info, error_message,
2756 input_bfd, input_section, rel->r_offset);
2761 outrel.r_addend = rel->r_addend;
2764 if (r_type == R_XTENSA_32)
2767 ELF32_R_INFO (h->dynindx, R_XTENSA_GLOB_DAT);
2770 else /* r_type == R_XTENSA_PLT */
2773 ELF32_R_INFO (h->dynindx, R_XTENSA_JMP_SLOT);
2775 /* Create the PLT entry and set the initial
2776 contents of the literal entry to the address of
2779 elf_xtensa_create_plt_entry (info, output_bfd,
2782 unresolved_reloc = FALSE;
2784 else if (!is_weak_undef)
2786 /* Generate a RELATIVE relocation. */
2787 outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
2788 outrel.r_addend = 0;
2796 loc = (srel->contents
2797 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2798 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2799 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2802 else if (r_type == R_XTENSA_ASM_EXPAND && dynamic_symbol)
2804 /* This should only happen for non-PIC code, which is not
2805 supposed to be used on systems with dynamic linking.
2806 Just ignore these relocations. */
2811 case R_XTENSA_TLS_TPOFF:
2812 /* Switch to LE model for local symbols in an executable. */
2813 if (! bfd_link_pic (info) && ! dynamic_symbol)
2815 relocation = tpoff (info, relocation);
2820 case R_XTENSA_TLSDESC_FN:
2821 case R_XTENSA_TLSDESC_ARG:
2823 if (r_type == R_XTENSA_TLSDESC_FN)
2825 if (! bfd_link_pic (info) || (tls_type & GOT_TLS_IE) != 0)
2826 r_type = R_XTENSA_NONE;
2828 else if (r_type == R_XTENSA_TLSDESC_ARG)
2830 if (bfd_link_pic (info))
2832 if ((tls_type & GOT_TLS_IE) != 0)
2833 r_type = R_XTENSA_TLS_TPOFF;
2837 r_type = R_XTENSA_TLS_TPOFF;
2838 if (! dynamic_symbol)
2840 relocation = tpoff (info, relocation);
2846 if (r_type == R_XTENSA_NONE)
2847 /* Nothing to do here; skip to the next reloc. */
2850 if (! elf_hash_table (info)->dynamic_sections_created)
2853 _("TLS relocation invalid without dynamic sections");
2854 (*info->callbacks->reloc_dangerous)
2855 (info, error_message,
2856 input_bfd, input_section, rel->r_offset);
2860 Elf_Internal_Rela outrel;
2862 asection *srel = htab->elf.srelgot;
2865 outrel.r_offset = (input_section->output_section->vma
2866 + input_section->output_offset
2869 /* Complain if the relocation is in a read-only section
2870 and not in a literal pool. */
2871 if ((input_section->flags & SEC_READONLY) != 0
2872 && ! elf_xtensa_in_literal_pool (lit_table, ltblsize,
2876 _("dynamic relocation in read-only section");
2877 (*info->callbacks->reloc_dangerous)
2878 (info, error_message,
2879 input_bfd, input_section, rel->r_offset);
2882 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2884 outrel.r_addend = relocation - dtpoff_base (info);
2886 outrel.r_addend = 0;
2889 outrel.r_info = ELF32_R_INFO (indx, r_type);
2891 unresolved_reloc = FALSE;
2894 loc = (srel->contents
2895 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2896 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2897 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2903 case R_XTENSA_TLS_DTPOFF:
2904 if (! bfd_link_pic (info))
2905 /* Switch from LD model to LE model. */
2906 relocation = tpoff (info, relocation);
2908 relocation -= dtpoff_base (info);
2911 case R_XTENSA_TLS_FUNC:
2912 case R_XTENSA_TLS_ARG:
2913 case R_XTENSA_TLS_CALL:
2914 /* Check if optimizing to IE or LE model. */
2915 if ((tls_type & GOT_TLS_IE) != 0)
2917 bfd_boolean is_ld_model =
2918 (h && elf_xtensa_hash_entry (h) == htab->tlsbase);
2919 if (! replace_tls_insn (rel, input_bfd, input_section, contents,
2920 is_ld_model, &error_message))
2921 (*info->callbacks->reloc_dangerous)
2922 (info, error_message,
2923 input_bfd, input_section, rel->r_offset);
2925 if (r_type != R_XTENSA_TLS_ARG || is_ld_model)
2927 /* Skip subsequent relocations on the same instruction. */
2928 while (rel + 1 < relend && rel[1].r_offset == rel->r_offset)
2935 if (elf_hash_table (info)->dynamic_sections_created
2936 && dynamic_symbol && (is_operand_relocation (r_type)
2937 || r_type == R_XTENSA_32_PCREL))
2940 vsprint_msg ("invalid relocation for dynamic symbol", ": %s",
2941 strlen (name) + 2, name);
2942 (*info->callbacks->reloc_dangerous)
2943 (info, error_message, input_bfd, input_section, rel->r_offset);
2949 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2950 because such sections are not SEC_ALLOC and thus ld.so will
2951 not process them. */
2952 if (unresolved_reloc
2953 && !((input_section->flags & SEC_DEBUGGING) != 0
2955 && _bfd_elf_section_offset (output_bfd, info, input_section,
2956 rel->r_offset) != (bfd_vma) -1)
2959 /* xgettext:c-format */
2960 (_("%pB(%pA+%#" PRIx64 "): "
2961 "unresolvable %s relocation against symbol `%s'"),
2964 (uint64_t) rel->r_offset,
2970 /* TLS optimizations may have changed r_type; update "howto". */
2971 howto = &elf_howto_table[r_type];
2973 /* There's no point in calling bfd_perform_relocation here.
2974 Just go directly to our "special function". */
2975 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2976 relocation + rel->r_addend,
2977 contents, rel->r_offset, is_weak_undef,
2980 if (r != bfd_reloc_ok && !warned)
2982 BFD_ASSERT (r == bfd_reloc_dangerous || r == bfd_reloc_other);
2983 BFD_ASSERT (error_message != NULL);
2985 if (rel->r_addend == 0)
2986 error_message = vsprint_msg (error_message, ": %s",
2987 strlen (name) + 2, name);
2989 error_message = vsprint_msg (error_message, ": (%s+0x%x)",
2991 name, (int) rel->r_addend);
2993 (*info->callbacks->reloc_dangerous)
2994 (info, error_message, input_bfd, input_section, rel->r_offset);
3001 input_section->reloc_done = TRUE;
3007 /* Finish up dynamic symbol handling. There's not much to do here since
3008 the PLT and GOT entries are all set up by relocate_section. */
3011 elf_xtensa_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
3012 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3013 struct elf_link_hash_entry *h,
3014 Elf_Internal_Sym *sym)
3016 if (h->needs_plt && !h->def_regular)
3018 /* Mark the symbol as undefined, rather than as defined in
3019 the .plt section. Leave the value alone. */
3020 sym->st_shndx = SHN_UNDEF;
3021 /* If the symbol is weak, we do need to clear the value.
3022 Otherwise, the PLT entry would provide a definition for
3023 the symbol even if the symbol wasn't defined anywhere,
3024 and so the symbol would never be NULL. */
3025 if (!h->ref_regular_nonweak)
3029 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
3030 if (h == elf_hash_table (info)->hdynamic
3031 || h == elf_hash_table (info)->hgot)
3032 sym->st_shndx = SHN_ABS;
3038 /* Combine adjacent literal table entries in the output. Adjacent
3039 entries within each input section may have been removed during
3040 relaxation, but we repeat the process here, even though it's too late
3041 to shrink the output section, because it's important to minimize the
3042 number of literal table entries to reduce the start-up work for the
3043 runtime linker. Returns the number of remaining table entries or -1
3047 elf_xtensa_combine_prop_entries (bfd *output_bfd,
3052 property_table_entry *table;
3053 bfd_size_type section_size, sgotloc_size;
3057 section_size = sxtlit->size;
3058 BFD_ASSERT (section_size % 8 == 0);
3059 num = section_size / 8;
3061 sgotloc_size = sgotloc->size;
3062 if (sgotloc_size != section_size)
3065 (_("internal inconsistency in size of .got.loc section"));
3069 table = bfd_malloc (num * sizeof (property_table_entry));
3073 /* The ".xt.lit.plt" section has the SEC_IN_MEMORY flag set and this
3074 propagates to the output section, where it doesn't really apply and
3075 where it breaks the following call to bfd_malloc_and_get_section. */
3076 sxtlit->flags &= ~SEC_IN_MEMORY;
3078 if (!bfd_malloc_and_get_section (output_bfd, sxtlit, &contents))
3086 /* There should never be any relocations left at this point, so this
3087 is quite a bit easier than what is done during relaxation. */
3089 /* Copy the raw contents into a property table array and sort it. */
3091 for (n = 0; n < num; n++)
3093 table[n].address = bfd_get_32 (output_bfd, &contents[offset]);
3094 table[n].size = bfd_get_32 (output_bfd, &contents[offset + 4]);
3097 qsort (table, num, sizeof (property_table_entry), property_table_compare);
3099 for (n = 0; n < num; n++)
3101 bfd_boolean remove_entry = FALSE;
3103 if (table[n].size == 0)
3104 remove_entry = TRUE;
3106 && (table[n-1].address + table[n-1].size == table[n].address))
3108 table[n-1].size += table[n].size;
3109 remove_entry = TRUE;
3114 for (m = n; m < num - 1; m++)
3116 table[m].address = table[m+1].address;
3117 table[m].size = table[m+1].size;
3125 /* Copy the data back to the raw contents. */
3127 for (n = 0; n < num; n++)
3129 bfd_put_32 (output_bfd, table[n].address, &contents[offset]);
3130 bfd_put_32 (output_bfd, table[n].size, &contents[offset + 4]);
3134 /* Clear the removed bytes. */
3135 if ((bfd_size_type) (num * 8) < section_size)
3136 memset (&contents[num * 8], 0, section_size - num * 8);
3138 if (! bfd_set_section_contents (output_bfd, sxtlit, contents, 0,
3142 /* Copy the contents to ".got.loc". */
3143 memcpy (sgotloc->contents, contents, section_size);
3151 /* Finish up the dynamic sections. */
3154 elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
3155 struct bfd_link_info *info)
3157 struct elf_xtensa_link_hash_table *htab;
3159 asection *sdyn, *srelplt, *srelgot, *sgot, *sxtlit, *sgotloc;
3160 Elf32_External_Dyn *dyncon, *dynconend;
3161 int num_xtlit_entries = 0;
3163 if (! elf_hash_table (info)->dynamic_sections_created)
3166 htab = elf_xtensa_hash_table (info);
3170 dynobj = elf_hash_table (info)->dynobj;
3171 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3172 BFD_ASSERT (sdyn != NULL);
3174 /* Set the first entry in the global offset table to the address of
3175 the dynamic section. */
3176 sgot = htab->elf.sgot;
3179 BFD_ASSERT (sgot->size == 4);
3181 bfd_put_32 (output_bfd, 0, sgot->contents);
3183 bfd_put_32 (output_bfd,
3184 sdyn->output_section->vma + sdyn->output_offset,
3188 srelplt = htab->elf.srelplt;
3189 srelgot = htab->elf.srelgot;
3190 if (srelplt && srelplt->size != 0)
3192 asection *sgotplt, *spltlittbl;
3193 int chunk, plt_chunks, plt_entries;
3194 Elf_Internal_Rela irela;
3196 unsigned rtld_reloc;
3198 spltlittbl = htab->spltlittbl;
3199 BFD_ASSERT (srelgot != NULL && spltlittbl != NULL);
3201 /* Find the first XTENSA_RTLD relocation. Presumably the rest
3202 of them follow immediately after.... */
3203 for (rtld_reloc = 0; rtld_reloc < srelgot->reloc_count; rtld_reloc++)
3205 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3206 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3207 if (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD)
3210 BFD_ASSERT (rtld_reloc < srelgot->reloc_count);
3212 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
3214 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
3216 for (chunk = 0; chunk < plt_chunks; chunk++)
3218 int chunk_entries = 0;
3220 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
3221 BFD_ASSERT (sgotplt != NULL);
3223 /* Emit special RTLD relocations for the first two entries in
3224 each chunk of the .got.plt section. */
3226 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3227 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3228 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3229 irela.r_offset = (sgotplt->output_section->vma
3230 + sgotplt->output_offset);
3231 irela.r_addend = 1; /* tell rtld to set value to resolver function */
3232 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3234 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3236 /* Next literal immediately follows the first. */
3237 loc += sizeof (Elf32_External_Rela);
3238 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3239 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3240 irela.r_offset = (sgotplt->output_section->vma
3241 + sgotplt->output_offset + 4);
3242 /* Tell rtld to set value to object's link map. */
3244 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3246 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3248 /* Fill in the literal table. */
3249 if (chunk < plt_chunks - 1)
3250 chunk_entries = PLT_ENTRIES_PER_CHUNK;
3252 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
3254 BFD_ASSERT ((unsigned) (chunk + 1) * 8 <= spltlittbl->size);
3255 bfd_put_32 (output_bfd,
3256 sgotplt->output_section->vma + sgotplt->output_offset,
3257 spltlittbl->contents + (chunk * 8) + 0);
3258 bfd_put_32 (output_bfd,
3259 8 + (chunk_entries * 4),
3260 spltlittbl->contents + (chunk * 8) + 4);
3263 /* The .xt.lit.plt section has just been modified. This must
3264 happen before the code below which combines adjacent literal
3265 table entries, and the .xt.lit.plt contents have to be forced to
3267 if (! bfd_set_section_contents (output_bfd,
3268 spltlittbl->output_section,
3269 spltlittbl->contents,
3270 spltlittbl->output_offset,
3273 /* Clear SEC_HAS_CONTENTS so the contents won't be output again. */
3274 spltlittbl->flags &= ~SEC_HAS_CONTENTS;
3277 /* All the dynamic relocations have been emitted at this point.
3278 Make sure the relocation sections are the correct size. */
3279 if ((srelgot && srelgot->size != (sizeof (Elf32_External_Rela)
3280 * srelgot->reloc_count))
3281 || (srelplt && srelplt->size != (sizeof (Elf32_External_Rela)
3282 * srelplt->reloc_count)))
3285 /* Combine adjacent literal table entries. */
3286 BFD_ASSERT (! bfd_link_relocatable (info));
3287 sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");
3288 sgotloc = htab->sgotloc;
3289 BFD_ASSERT (sgotloc);
3293 elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc);
3294 if (num_xtlit_entries < 0)
3298 dyncon = (Elf32_External_Dyn *) sdyn->contents;
3299 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3300 for (; dyncon < dynconend; dyncon++)
3302 Elf_Internal_Dyn dyn;
3304 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3311 case DT_XTENSA_GOT_LOC_SZ:
3312 dyn.d_un.d_val = num_xtlit_entries;
3315 case DT_XTENSA_GOT_LOC_OFF:
3316 dyn.d_un.d_ptr = (htab->sgotloc->output_section->vma
3317 + htab->sgotloc->output_offset);
3321 dyn.d_un.d_ptr = (htab->elf.sgot->output_section->vma
3322 + htab->elf.sgot->output_offset);
3326 dyn.d_un.d_ptr = (htab->elf.srelplt->output_section->vma
3327 + htab->elf.srelplt->output_offset);
3331 dyn.d_un.d_val = htab->elf.srelplt->size;
3335 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3342 /* Functions for dealing with the e_flags field. */
3344 /* Merge backend specific data from an object file to the output
3345 object file when linking. */
3348 elf_xtensa_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3350 bfd *obfd = info->output_bfd;
3351 unsigned out_mach, in_mach;
3352 flagword out_flag, in_flag;
3354 /* Check if we have the same endianness. */
3355 if (!_bfd_generic_verify_endian_match (ibfd, info))
3358 /* Don't even pretend to support mixed-format linking. */
3359 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3360 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3363 out_flag = elf_elfheader (obfd)->e_flags;
3364 in_flag = elf_elfheader (ibfd)->e_flags;
3366 out_mach = out_flag & EF_XTENSA_MACH;
3367 in_mach = in_flag & EF_XTENSA_MACH;
3368 if (out_mach != in_mach)
3371 /* xgettext:c-format */
3372 (_("%pB: incompatible machine type; output is 0x%x; input is 0x%x"),
3373 ibfd, out_mach, in_mach);
3374 bfd_set_error (bfd_error_wrong_format);
3378 if (! elf_flags_init (obfd))
3380 elf_flags_init (obfd) = TRUE;
3381 elf_elfheader (obfd)->e_flags = in_flag;
3383 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
3384 && bfd_get_arch_info (obfd)->the_default)
3385 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
3386 bfd_get_mach (ibfd));
3391 if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
3392 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
3394 if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
3395 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
3402 elf_xtensa_set_private_flags (bfd *abfd, flagword flags)
3404 BFD_ASSERT (!elf_flags_init (abfd)
3405 || elf_elfheader (abfd)->e_flags == flags);
3407 elf_elfheader (abfd)->e_flags |= flags;
3408 elf_flags_init (abfd) = TRUE;
3415 elf_xtensa_print_private_bfd_data (bfd *abfd, void *farg)
3417 FILE *f = (FILE *) farg;
3418 flagword e_flags = elf_elfheader (abfd)->e_flags;
3420 fprintf (f, "\nXtensa header:\n");
3421 if ((e_flags & EF_XTENSA_MACH) == E_XTENSA_MACH)
3422 fprintf (f, "\nMachine = Base\n");
3424 fprintf (f, "\nMachine Id = 0x%x\n", e_flags & EF_XTENSA_MACH);
3426 fprintf (f, "Insn tables = %s\n",
3427 (e_flags & EF_XTENSA_XT_INSN) ? "true" : "false");
3429 fprintf (f, "Literal tables = %s\n",
3430 (e_flags & EF_XTENSA_XT_LIT) ? "true" : "false");
3432 return _bfd_elf_print_private_bfd_data (abfd, farg);
3436 /* Set the right machine number for an Xtensa ELF file. */
3439 elf_xtensa_object_p (bfd *abfd)
3442 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
3447 mach = bfd_mach_xtensa;
3453 (void) bfd_default_set_arch_mach (abfd, bfd_arch_xtensa, mach);
3458 /* The final processing done just before writing out an Xtensa ELF object
3459 file. This gets the Xtensa architecture right based on the machine
3463 elf_xtensa_final_write_processing (bfd *abfd,
3464 bfd_boolean linker ATTRIBUTE_UNUSED)
3469 switch (mach = bfd_get_mach (abfd))
3471 case bfd_mach_xtensa:
3472 val = E_XTENSA_MACH;
3478 elf_elfheader (abfd)->e_flags &= (~ EF_XTENSA_MACH);
3479 elf_elfheader (abfd)->e_flags |= val;
3483 static enum elf_reloc_type_class
3484 elf_xtensa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3485 const asection *rel_sec ATTRIBUTE_UNUSED,
3486 const Elf_Internal_Rela *rela)
3488 switch ((int) ELF32_R_TYPE (rela->r_info))
3490 case R_XTENSA_RELATIVE:
3491 return reloc_class_relative;
3492 case R_XTENSA_JMP_SLOT:
3493 return reloc_class_plt;
3495 return reloc_class_normal;
3501 elf_xtensa_discard_info_for_section (bfd *abfd,
3502 struct elf_reloc_cookie *cookie,
3503 struct bfd_link_info *info,
3507 bfd_vma offset, actual_offset;
3508 bfd_size_type removed_bytes = 0;
3509 bfd_size_type entry_size;
3511 if (sec->output_section
3512 && bfd_is_abs_section (sec->output_section))
3515 if (xtensa_is_proptable_section (sec))
3520 if (sec->size == 0 || sec->size % entry_size != 0)
3523 contents = retrieve_contents (abfd, sec, info->keep_memory);
3527 cookie->rels = retrieve_internal_relocs (abfd, sec, info->keep_memory);
3530 release_contents (sec, contents);
3534 /* Sort the relocations. They should already be in order when
3535 relaxation is enabled, but it might not be. */
3536 qsort (cookie->rels, sec->reloc_count, sizeof (Elf_Internal_Rela),
3537 internal_reloc_compare);
3539 cookie->rel = cookie->rels;
3540 cookie->relend = cookie->rels + sec->reloc_count;
3542 for (offset = 0; offset < sec->size; offset += entry_size)
3544 actual_offset = offset - removed_bytes;
3546 /* The ...symbol_deleted_p function will skip over relocs but it
3547 won't adjust their offsets, so do that here. */
3548 while (cookie->rel < cookie->relend
3549 && cookie->rel->r_offset < offset)
3551 cookie->rel->r_offset -= removed_bytes;
3555 while (cookie->rel < cookie->relend
3556 && cookie->rel->r_offset == offset)
3558 if (bfd_elf_reloc_symbol_deleted_p (offset, cookie))
3560 /* Remove the table entry. (If the reloc type is NONE, then
3561 the entry has already been merged with another and deleted
3562 during relaxation.) */
3563 if (ELF32_R_TYPE (cookie->rel->r_info) != R_XTENSA_NONE)
3565 /* Shift the contents up. */
3566 if (offset + entry_size < sec->size)
3567 memmove (&contents[actual_offset],
3568 &contents[actual_offset + entry_size],
3569 sec->size - offset - entry_size);
3570 removed_bytes += entry_size;
3573 /* Remove this relocation. */
3574 cookie->rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
3577 /* Adjust the relocation offset for previous removals. This
3578 should not be done before calling ...symbol_deleted_p
3579 because it might mess up the offset comparisons there.
3580 Make sure the offset doesn't underflow in the case where
3581 the first entry is removed. */
3582 if (cookie->rel->r_offset >= removed_bytes)
3583 cookie->rel->r_offset -= removed_bytes;
3585 cookie->rel->r_offset = 0;
3591 if (removed_bytes != 0)
3593 /* Adjust any remaining relocs (shouldn't be any). */
3594 for (; cookie->rel < cookie->relend; cookie->rel++)
3596 if (cookie->rel->r_offset >= removed_bytes)
3597 cookie->rel->r_offset -= removed_bytes;
3599 cookie->rel->r_offset = 0;
3602 /* Clear the removed bytes. */
3603 memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
3605 pin_contents (sec, contents);
3606 pin_internal_relocs (sec, cookie->rels);
3609 if (sec->rawsize == 0)
3610 sec->rawsize = sec->size;
3611 sec->size -= removed_bytes;
3613 if (xtensa_is_littable_section (sec))
3615 asection *sgotloc = elf_xtensa_hash_table (info)->sgotloc;
3617 sgotloc->size -= removed_bytes;
3622 release_contents (sec, contents);
3623 release_internal_relocs (sec, cookie->rels);
3626 return (removed_bytes != 0);
3631 elf_xtensa_discard_info (bfd *abfd,
3632 struct elf_reloc_cookie *cookie,
3633 struct bfd_link_info *info)
3636 bfd_boolean changed = FALSE;
3638 for (sec = abfd->sections; sec != NULL; sec = sec->next)
3640 if (xtensa_is_property_section (sec))
3642 if (elf_xtensa_discard_info_for_section (abfd, cookie, info, sec))
3652 elf_xtensa_ignore_discarded_relocs (asection *sec)
3654 return xtensa_is_property_section (sec);
3659 elf_xtensa_action_discarded (asection *sec)
3661 if (strcmp (".xt_except_table", sec->name) == 0)
3664 if (strcmp (".xt_except_desc", sec->name) == 0)
3667 return _bfd_elf_default_action_discarded (sec);
3671 /* Support for core dump NOTE sections. */
3674 elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3679 /* The size for Xtensa is variable, so don't try to recognize the format
3680 based on the size. Just assume this is GNU/Linux. */
3683 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3686 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
3690 size = note->descsz - offset - 4;
3692 /* Make a ".reg/999" section. */
3693 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3694 size, note->descpos + offset);
3699 elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3701 switch (note->descsz)
3706 case 128: /* GNU/Linux elf_prpsinfo */
3707 elf_tdata (abfd)->core->program
3708 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3709 elf_tdata (abfd)->core->command
3710 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3713 /* Note that for some reason, a spurious space is tacked
3714 onto the end of the args in some (at least one anyway)
3715 implementations, so strip it off if it exists. */
3718 char *command = elf_tdata (abfd)->core->command;
3719 int n = strlen (command);
3721 if (0 < n && command[n - 1] == ' ')
3722 command[n - 1] = '\0';
3729 /* Generic Xtensa configurability stuff. */
3731 static xtensa_opcode callx0_op = XTENSA_UNDEFINED;
3732 static xtensa_opcode callx4_op = XTENSA_UNDEFINED;
3733 static xtensa_opcode callx8_op = XTENSA_UNDEFINED;
3734 static xtensa_opcode callx12_op = XTENSA_UNDEFINED;
3735 static xtensa_opcode call0_op = XTENSA_UNDEFINED;
3736 static xtensa_opcode call4_op = XTENSA_UNDEFINED;
3737 static xtensa_opcode call8_op = XTENSA_UNDEFINED;
3738 static xtensa_opcode call12_op = XTENSA_UNDEFINED;
3741 init_call_opcodes (void)
3743 if (callx0_op == XTENSA_UNDEFINED)
3745 callx0_op = xtensa_opcode_lookup (xtensa_default_isa, "callx0");
3746 callx4_op = xtensa_opcode_lookup (xtensa_default_isa, "callx4");
3747 callx8_op = xtensa_opcode_lookup (xtensa_default_isa, "callx8");
3748 callx12_op = xtensa_opcode_lookup (xtensa_default_isa, "callx12");
3749 call0_op = xtensa_opcode_lookup (xtensa_default_isa, "call0");
3750 call4_op = xtensa_opcode_lookup (xtensa_default_isa, "call4");
3751 call8_op = xtensa_opcode_lookup (xtensa_default_isa, "call8");
3752 call12_op = xtensa_opcode_lookup (xtensa_default_isa, "call12");
3758 is_indirect_call_opcode (xtensa_opcode opcode)
3760 init_call_opcodes ();
3761 return (opcode == callx0_op
3762 || opcode == callx4_op
3763 || opcode == callx8_op
3764 || opcode == callx12_op);
3769 is_direct_call_opcode (xtensa_opcode opcode)
3771 init_call_opcodes ();
3772 return (opcode == call0_op
3773 || opcode == call4_op
3774 || opcode == call8_op
3775 || opcode == call12_op);
3780 is_windowed_call_opcode (xtensa_opcode opcode)
3782 init_call_opcodes ();
3783 return (opcode == call4_op
3784 || opcode == call8_op
3785 || opcode == call12_op
3786 || opcode == callx4_op
3787 || opcode == callx8_op
3788 || opcode == callx12_op);
3793 get_indirect_call_dest_reg (xtensa_opcode opcode, unsigned *pdst)
3795 unsigned dst = (unsigned) -1;
3797 init_call_opcodes ();
3798 if (opcode == callx0_op)
3800 else if (opcode == callx4_op)
3802 else if (opcode == callx8_op)
3804 else if (opcode == callx12_op)
3807 if (dst == (unsigned) -1)
3815 static xtensa_opcode
3816 get_const16_opcode (void)
3818 static bfd_boolean done_lookup = FALSE;
3819 static xtensa_opcode const16_opcode = XTENSA_UNDEFINED;
3822 const16_opcode = xtensa_opcode_lookup (xtensa_default_isa, "const16");
3825 return const16_opcode;
3829 static xtensa_opcode
3830 get_l32r_opcode (void)
3832 static xtensa_opcode l32r_opcode = XTENSA_UNDEFINED;
3833 static bfd_boolean done_lookup = FALSE;
3837 l32r_opcode = xtensa_opcode_lookup (xtensa_default_isa, "l32r");
3845 l32r_offset (bfd_vma addr, bfd_vma pc)
3849 offset = addr - ((pc+3) & -4);
3850 BFD_ASSERT ((offset & ((1 << 2) - 1)) == 0);
3851 offset = (signed int) offset >> 2;
3852 BFD_ASSERT ((signed int) offset >> 16 == -1);
3858 get_relocation_opnd (xtensa_opcode opcode, int r_type)
3860 xtensa_isa isa = xtensa_default_isa;
3861 int last_immed, last_opnd, opi;
3863 if (opcode == XTENSA_UNDEFINED)
3864 return XTENSA_UNDEFINED;
3866 /* Find the last visible PC-relative immediate operand for the opcode.
3867 If there are no PC-relative immediates, then choose the last visible
3868 immediate; otherwise, fail and return XTENSA_UNDEFINED. */
3869 last_immed = XTENSA_UNDEFINED;
3870 last_opnd = xtensa_opcode_num_operands (isa, opcode);
3871 for (opi = last_opnd - 1; opi >= 0; opi--)
3873 if (xtensa_operand_is_visible (isa, opcode, opi) == 0)
3875 if (xtensa_operand_is_PCrelative (isa, opcode, opi) == 1)
3880 if (last_immed == XTENSA_UNDEFINED
3881 && xtensa_operand_is_register (isa, opcode, opi) == 0)
3885 return XTENSA_UNDEFINED;
3887 /* If the operand number was specified in an old-style relocation,
3888 check for consistency with the operand computed above. */
3889 if (r_type >= R_XTENSA_OP0 && r_type <= R_XTENSA_OP2)
3891 int reloc_opnd = r_type - R_XTENSA_OP0;
3892 if (reloc_opnd != last_immed)
3893 return XTENSA_UNDEFINED;
3901 get_relocation_slot (int r_type)
3911 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
3912 return r_type - R_XTENSA_SLOT0_OP;
3913 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
3914 return r_type - R_XTENSA_SLOT0_ALT;
3918 return XTENSA_UNDEFINED;
3922 /* Get the opcode for a relocation. */
3924 static xtensa_opcode
3925 get_relocation_opcode (bfd *abfd,
3928 Elf_Internal_Rela *irel)
3930 static xtensa_insnbuf ibuff = NULL;
3931 static xtensa_insnbuf sbuff = NULL;
3932 xtensa_isa isa = xtensa_default_isa;
3936 if (contents == NULL)
3937 return XTENSA_UNDEFINED;
3939 if (bfd_get_section_limit (abfd, sec) <= irel->r_offset)
3940 return XTENSA_UNDEFINED;
3944 ibuff = xtensa_insnbuf_alloc (isa);
3945 sbuff = xtensa_insnbuf_alloc (isa);
3948 /* Decode the instruction. */
3949 xtensa_insnbuf_from_chars (isa, ibuff, &contents[irel->r_offset],
3950 sec->size - irel->r_offset);
3951 fmt = xtensa_format_decode (isa, ibuff);
3952 slot = get_relocation_slot (ELF32_R_TYPE (irel->r_info));
3953 if (slot == XTENSA_UNDEFINED)
3954 return XTENSA_UNDEFINED;
3955 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
3956 return xtensa_opcode_decode (isa, fmt, slot, sbuff);
3961 is_l32r_relocation (bfd *abfd,
3964 Elf_Internal_Rela *irel)
3966 xtensa_opcode opcode;
3967 if (!is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
3969 opcode = get_relocation_opcode (abfd, sec, contents, irel);
3970 return (opcode == get_l32r_opcode ());
3974 static bfd_size_type
3975 get_asm_simplify_size (bfd_byte *contents,
3976 bfd_size_type content_len,
3977 bfd_size_type offset)
3979 bfd_size_type insnlen, size = 0;
3981 /* Decode the size of the next two instructions. */
3982 insnlen = insn_decode_len (contents, content_len, offset);
3988 insnlen = insn_decode_len (contents, content_len, offset + size);
3998 is_alt_relocation (int r_type)
4000 return (r_type >= R_XTENSA_SLOT0_ALT
4001 && r_type <= R_XTENSA_SLOT14_ALT);
4006 is_operand_relocation (int r_type)
4016 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
4018 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
4027 #define MIN_INSN_LENGTH 2
4029 /* Return 0 if it fails to decode. */
4032 insn_decode_len (bfd_byte *contents,
4033 bfd_size_type content_len,
4034 bfd_size_type offset)
4037 xtensa_isa isa = xtensa_default_isa;
4039 static xtensa_insnbuf ibuff = NULL;
4041 if (offset + MIN_INSN_LENGTH > content_len)
4045 ibuff = xtensa_insnbuf_alloc (isa);
4046 xtensa_insnbuf_from_chars (isa, ibuff, &contents[offset],
4047 content_len - offset);
4048 fmt = xtensa_format_decode (isa, ibuff);
4049 if (fmt == XTENSA_UNDEFINED)
4051 insn_len = xtensa_format_length (isa, fmt);
4052 if (insn_len == XTENSA_UNDEFINED)
4058 /* Decode the opcode for a single slot instruction.
4059 Return 0 if it fails to decode or the instruction is multi-slot. */
4062 insn_decode_opcode (bfd_byte *contents,
4063 bfd_size_type content_len,
4064 bfd_size_type offset,
4067 xtensa_isa isa = xtensa_default_isa;
4069 static xtensa_insnbuf insnbuf = NULL;
4070 static xtensa_insnbuf slotbuf = NULL;
4072 if (offset + MIN_INSN_LENGTH > content_len)
4073 return XTENSA_UNDEFINED;
4075 if (insnbuf == NULL)
4077 insnbuf = xtensa_insnbuf_alloc (isa);
4078 slotbuf = xtensa_insnbuf_alloc (isa);
4081 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4082 content_len - offset);
4083 fmt = xtensa_format_decode (isa, insnbuf);
4084 if (fmt == XTENSA_UNDEFINED)
4085 return XTENSA_UNDEFINED;
4087 if (slot >= xtensa_format_num_slots (isa, fmt))
4088 return XTENSA_UNDEFINED;
4090 xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
4091 return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
4095 /* The offset is the offset in the contents.
4096 The address is the address of that offset. */
4099 check_branch_target_aligned (bfd_byte *contents,
4100 bfd_size_type content_length,
4104 bfd_size_type insn_len = insn_decode_len (contents, content_length, offset);
4107 return check_branch_target_aligned_address (address, insn_len);
4112 check_loop_aligned (bfd_byte *contents,
4113 bfd_size_type content_length,
4117 bfd_size_type loop_len, insn_len;
4118 xtensa_opcode opcode;
4120 opcode = insn_decode_opcode (contents, content_length, offset, 0);
4121 if (opcode == XTENSA_UNDEFINED
4122 || xtensa_opcode_is_loop (xtensa_default_isa, opcode) != 1)
4128 loop_len = insn_decode_len (contents, content_length, offset);
4129 insn_len = insn_decode_len (contents, content_length, offset + loop_len);
4130 if (loop_len == 0 || insn_len == 0)
4136 return check_branch_target_aligned_address (address + loop_len, insn_len);
4141 check_branch_target_aligned_address (bfd_vma addr, int len)
4144 return (addr % 8 == 0);
4145 return ((addr >> 2) == ((addr + len - 1) >> 2));
4149 /* Instruction widening and narrowing. */
4151 /* When FLIX is available we need to access certain instructions only
4152 when they are 16-bit or 24-bit instructions. This table caches
4153 information about such instructions by walking through all the
4154 opcodes and finding the smallest single-slot format into which each
4157 static xtensa_format *op_single_fmt_table = NULL;
4161 init_op_single_format_table (void)
4163 xtensa_isa isa = xtensa_default_isa;
4164 xtensa_insnbuf ibuf;
4165 xtensa_opcode opcode;
4169 if (op_single_fmt_table)
4172 ibuf = xtensa_insnbuf_alloc (isa);
4173 num_opcodes = xtensa_isa_num_opcodes (isa);
4175 op_single_fmt_table = (xtensa_format *)
4176 bfd_malloc (sizeof (xtensa_format) * num_opcodes);
4177 for (opcode = 0; opcode < num_opcodes; opcode++)
4179 op_single_fmt_table[opcode] = XTENSA_UNDEFINED;
4180 for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
4182 if (xtensa_format_num_slots (isa, fmt) == 1
4183 && xtensa_opcode_encode (isa, fmt, 0, ibuf, opcode) == 0)
4185 xtensa_opcode old_fmt = op_single_fmt_table[opcode];
4186 int fmt_length = xtensa_format_length (isa, fmt);
4187 if (old_fmt == XTENSA_UNDEFINED
4188 || fmt_length < xtensa_format_length (isa, old_fmt))
4189 op_single_fmt_table[opcode] = fmt;
4193 xtensa_insnbuf_free (isa, ibuf);
4197 static xtensa_format
4198 get_single_format (xtensa_opcode opcode)
4200 init_op_single_format_table ();
4201 return op_single_fmt_table[opcode];
4205 /* For the set of narrowable instructions we do NOT include the
4206 narrowings beqz -> beqz.n or bnez -> bnez.n because of complexities
4207 involved during linker relaxation that may require these to
4208 re-expand in some conditions. Also, the narrowing "or" -> mov.n
4209 requires special case code to ensure it only works when op1 == op2. */
4217 struct string_pair narrowable[] =
4220 { "addi", "addi.n" },
4221 { "addmi", "addi.n" },
4222 { "l32i", "l32i.n" },
4223 { "movi", "movi.n" },
4225 { "retw", "retw.n" },
4226 { "s32i", "s32i.n" },
4227 { "or", "mov.n" } /* special case only when op1 == op2 */
4230 struct string_pair widenable[] =
4233 { "addi", "addi.n" },
4234 { "addmi", "addi.n" },
4235 { "beqz", "beqz.n" },
4236 { "bnez", "bnez.n" },
4237 { "l32i", "l32i.n" },
4238 { "movi", "movi.n" },
4240 { "retw", "retw.n" },
4241 { "s32i", "s32i.n" },
4242 { "or", "mov.n" } /* special case only when op1 == op2 */
4246 /* Check if an instruction can be "narrowed", i.e., changed from a standard
4247 3-byte instruction to a 2-byte "density" instruction. If it is valid,
4248 return the instruction buffer holding the narrow instruction. Otherwise,
4249 return 0. The set of valid narrowing are specified by a string table
4250 but require some special case operand checks in some cases. */
4252 static xtensa_insnbuf
4253 can_narrow_instruction (xtensa_insnbuf slotbuf,
4255 xtensa_opcode opcode)
4257 xtensa_isa isa = xtensa_default_isa;
4258 xtensa_format o_fmt;
4261 static xtensa_insnbuf o_insnbuf = NULL;
4262 static xtensa_insnbuf o_slotbuf = NULL;
4264 if (o_insnbuf == NULL)
4266 o_insnbuf = xtensa_insnbuf_alloc (isa);
4267 o_slotbuf = xtensa_insnbuf_alloc (isa);
4270 for (opi = 0; opi < (sizeof (narrowable)/sizeof (struct string_pair)); opi++)
4272 bfd_boolean is_or = (strcmp ("or", narrowable[opi].wide) == 0);
4274 if (opcode == xtensa_opcode_lookup (isa, narrowable[opi].wide))
4276 uint32 value, newval;
4277 int i, operand_count, o_operand_count;
4278 xtensa_opcode o_opcode;
4280 /* Address does not matter in this case. We might need to
4281 fix it to handle branches/jumps. */
4282 bfd_vma self_address = 0;
4284 o_opcode = xtensa_opcode_lookup (isa, narrowable[opi].narrow);
4285 if (o_opcode == XTENSA_UNDEFINED)
4287 o_fmt = get_single_format (o_opcode);
4288 if (o_fmt == XTENSA_UNDEFINED)
4291 if (xtensa_format_length (isa, fmt) != 3
4292 || xtensa_format_length (isa, o_fmt) != 2)
4295 xtensa_format_encode (isa, o_fmt, o_insnbuf);
4296 operand_count = xtensa_opcode_num_operands (isa, opcode);
4297 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4299 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4304 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4309 uint32 rawval0, rawval1, rawval2;
4311 if (o_operand_count + 1 != operand_count
4312 || xtensa_operand_get_field (isa, opcode, 0,
4313 fmt, 0, slotbuf, &rawval0) != 0
4314 || xtensa_operand_get_field (isa, opcode, 1,
4315 fmt, 0, slotbuf, &rawval1) != 0
4316 || xtensa_operand_get_field (isa, opcode, 2,
4317 fmt, 0, slotbuf, &rawval2) != 0
4318 || rawval1 != rawval2
4319 || rawval0 == rawval1 /* it is a nop */)
4323 for (i = 0; i < o_operand_count; ++i)
4325 if (xtensa_operand_get_field (isa, opcode, i, fmt, 0,
4327 || xtensa_operand_decode (isa, opcode, i, &value))
4330 /* PC-relative branches need adjustment, but
4331 the PC-rel operand will always have a relocation. */
4333 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4335 || xtensa_operand_encode (isa, o_opcode, i, &newval)
4336 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4341 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4351 /* Attempt to narrow an instruction. If the narrowing is valid, perform
4352 the action in-place directly into the contents and return TRUE. Otherwise,
4353 the return value is FALSE and the contents are not modified. */
4356 narrow_instruction (bfd_byte *contents,
4357 bfd_size_type content_length,
4358 bfd_size_type offset)
4360 xtensa_opcode opcode;
4361 bfd_size_type insn_len;
4362 xtensa_isa isa = xtensa_default_isa;
4364 xtensa_insnbuf o_insnbuf;
4366 static xtensa_insnbuf insnbuf = NULL;
4367 static xtensa_insnbuf slotbuf = NULL;
4369 if (insnbuf == NULL)
4371 insnbuf = xtensa_insnbuf_alloc (isa);
4372 slotbuf = xtensa_insnbuf_alloc (isa);
4375 BFD_ASSERT (offset < content_length);
4377 if (content_length < 2)
4380 /* We will hand-code a few of these for a little while.
4381 These have all been specified in the assembler aleady. */
4382 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4383 content_length - offset);
4384 fmt = xtensa_format_decode (isa, insnbuf);
4385 if (xtensa_format_num_slots (isa, fmt) != 1)
4388 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4391 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4392 if (opcode == XTENSA_UNDEFINED)
4394 insn_len = xtensa_format_length (isa, fmt);
4395 if (insn_len > content_length)
4398 o_insnbuf = can_narrow_instruction (slotbuf, fmt, opcode);
4401 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4402 content_length - offset);
4410 /* Check if an instruction can be "widened", i.e., changed from a 2-byte
4411 "density" instruction to a standard 3-byte instruction. If it is valid,
4412 return the instruction buffer holding the wide instruction. Otherwise,
4413 return 0. The set of valid widenings are specified by a string table
4414 but require some special case operand checks in some cases. */
4416 static xtensa_insnbuf
4417 can_widen_instruction (xtensa_insnbuf slotbuf,
4419 xtensa_opcode opcode)
4421 xtensa_isa isa = xtensa_default_isa;
4422 xtensa_format o_fmt;
4425 static xtensa_insnbuf o_insnbuf = NULL;
4426 static xtensa_insnbuf o_slotbuf = NULL;
4428 if (o_insnbuf == NULL)
4430 o_insnbuf = xtensa_insnbuf_alloc (isa);
4431 o_slotbuf = xtensa_insnbuf_alloc (isa);
4434 for (opi = 0; opi < (sizeof (widenable)/sizeof (struct string_pair)); opi++)
4436 bfd_boolean is_or = (strcmp ("or", widenable[opi].wide) == 0);
4437 bfd_boolean is_branch = (strcmp ("beqz", widenable[opi].wide) == 0
4438 || strcmp ("bnez", widenable[opi].wide) == 0);
4440 if (opcode == xtensa_opcode_lookup (isa, widenable[opi].narrow))
4442 uint32 value, newval;
4443 int i, operand_count, o_operand_count, check_operand_count;
4444 xtensa_opcode o_opcode;
4446 /* Address does not matter in this case. We might need to fix it
4447 to handle branches/jumps. */
4448 bfd_vma self_address = 0;
4450 o_opcode = xtensa_opcode_lookup (isa, widenable[opi].wide);
4451 if (o_opcode == XTENSA_UNDEFINED)
4453 o_fmt = get_single_format (o_opcode);
4454 if (o_fmt == XTENSA_UNDEFINED)
4457 if (xtensa_format_length (isa, fmt) != 2
4458 || xtensa_format_length (isa, o_fmt) != 3)
4461 xtensa_format_encode (isa, o_fmt, o_insnbuf);
4462 operand_count = xtensa_opcode_num_operands (isa, opcode);
4463 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4464 check_operand_count = o_operand_count;
4466 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4471 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4476 uint32 rawval0, rawval1;
4478 if (o_operand_count != operand_count + 1
4479 || xtensa_operand_get_field (isa, opcode, 0,
4480 fmt, 0, slotbuf, &rawval0) != 0
4481 || xtensa_operand_get_field (isa, opcode, 1,
4482 fmt, 0, slotbuf, &rawval1) != 0
4483 || rawval0 == rawval1 /* it is a nop */)
4487 check_operand_count--;
4489 for (i = 0; i < check_operand_count; i++)
4492 if (is_or && i == o_operand_count - 1)
4494 if (xtensa_operand_get_field (isa, opcode, new_i, fmt, 0,
4496 || xtensa_operand_decode (isa, opcode, new_i, &value))
4499 /* PC-relative branches need adjustment, but
4500 the PC-rel operand will always have a relocation. */
4502 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4504 || xtensa_operand_encode (isa, o_opcode, i, &newval)
4505 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4510 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4520 /* Attempt to widen an instruction. If the widening is valid, perform
4521 the action in-place directly into the contents and return TRUE. Otherwise,
4522 the return value is FALSE and the contents are not modified. */
4525 widen_instruction (bfd_byte *contents,
4526 bfd_size_type content_length,
4527 bfd_size_type offset)
4529 xtensa_opcode opcode;
4530 bfd_size_type insn_len;
4531 xtensa_isa isa = xtensa_default_isa;
4533 xtensa_insnbuf o_insnbuf;
4535 static xtensa_insnbuf insnbuf = NULL;
4536 static xtensa_insnbuf slotbuf = NULL;
4538 if (insnbuf == NULL)
4540 insnbuf = xtensa_insnbuf_alloc (isa);
4541 slotbuf = xtensa_insnbuf_alloc (isa);
4544 BFD_ASSERT (offset < content_length);
4546 if (content_length < 2)
4549 /* We will hand-code a few of these for a little while.
4550 These have all been specified in the assembler aleady. */
4551 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4552 content_length - offset);
4553 fmt = xtensa_format_decode (isa, insnbuf);
4554 if (xtensa_format_num_slots (isa, fmt) != 1)
4557 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4560 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4561 if (opcode == XTENSA_UNDEFINED)
4563 insn_len = xtensa_format_length (isa, fmt);
4564 if (insn_len > content_length)
4567 o_insnbuf = can_widen_instruction (slotbuf, fmt, opcode);
4570 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4571 content_length - offset);
4578 /* Code for transforming CALLs at link-time. */
4580 static bfd_reloc_status_type
4581 elf_xtensa_do_asm_simplify (bfd_byte *contents,
4583 bfd_vma content_length,
4584 char **error_message)
4586 static xtensa_insnbuf insnbuf = NULL;
4587 static xtensa_insnbuf slotbuf = NULL;
4588 xtensa_format core_format = XTENSA_UNDEFINED;
4589 xtensa_opcode opcode;
4590 xtensa_opcode direct_call_opcode;
4591 xtensa_isa isa = xtensa_default_isa;
4592 bfd_byte *chbuf = contents + address;
4595 if (insnbuf == NULL)
4597 insnbuf = xtensa_insnbuf_alloc (isa);
4598 slotbuf = xtensa_insnbuf_alloc (isa);
4601 if (content_length < address)
4603 *error_message = _("attempt to convert L32R/CALLX to CALL failed");
4604 return bfd_reloc_other;
4607 opcode = get_expanded_call_opcode (chbuf, content_length - address, 0);
4608 direct_call_opcode = swap_callx_for_call_opcode (opcode);
4609 if (direct_call_opcode == XTENSA_UNDEFINED)
4611 *error_message = _("attempt to convert L32R/CALLX to CALL failed");
4612 return bfd_reloc_other;
4615 /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset. */
4616 core_format = xtensa_format_lookup (isa, "x24");
4617 opcode = xtensa_opcode_lookup (isa, "or");
4618 xtensa_opcode_encode (isa, core_format, 0, slotbuf, opcode);
4619 for (opn = 0; opn < 3; opn++)
4622 xtensa_operand_encode (isa, opcode, opn, ®no);
4623 xtensa_operand_set_field (isa, opcode, opn, core_format, 0,
4626 xtensa_format_encode (isa, core_format, insnbuf);
4627 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4628 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf, content_length - address);
4630 /* Assemble a CALL ("callN 0") into the 3 byte offset. */
4631 xtensa_opcode_encode (isa, core_format, 0, slotbuf, direct_call_opcode);
4632 xtensa_operand_set_field (isa, opcode, 0, core_format, 0, slotbuf, 0);
4634 xtensa_format_encode (isa, core_format, insnbuf);
4635 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4636 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf + 3,
4637 content_length - address - 3);
4639 return bfd_reloc_ok;
4643 static bfd_reloc_status_type
4644 contract_asm_expansion (bfd_byte *contents,
4645 bfd_vma content_length,
4646 Elf_Internal_Rela *irel,
4647 char **error_message)
4649 bfd_reloc_status_type retval =
4650 elf_xtensa_do_asm_simplify (contents, irel->r_offset, content_length,
4653 if (retval != bfd_reloc_ok)
4654 return bfd_reloc_dangerous;
4656 /* Update the irel->r_offset field so that the right immediate and
4657 the right instruction are modified during the relocation. */
4658 irel->r_offset += 3;
4659 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_XTENSA_SLOT0_OP);
4660 return bfd_reloc_ok;
4664 static xtensa_opcode
4665 swap_callx_for_call_opcode (xtensa_opcode opcode)
4667 init_call_opcodes ();
4669 if (opcode == callx0_op) return call0_op;
4670 if (opcode == callx4_op) return call4_op;
4671 if (opcode == callx8_op) return call8_op;
4672 if (opcode == callx12_op) return call12_op;
4674 /* Return XTENSA_UNDEFINED if the opcode is not an indirect call. */
4675 return XTENSA_UNDEFINED;
4679 /* Check if "buf" is pointing to a "L32R aN; CALLX aN" or "CONST16 aN;
4680 CONST16 aN; CALLX aN" sequence, and if so, return the CALLX opcode.
4681 If not, return XTENSA_UNDEFINED. */
4683 #define L32R_TARGET_REG_OPERAND 0
4684 #define CONST16_TARGET_REG_OPERAND 0
4685 #define CALLN_SOURCE_OPERAND 0
4687 static xtensa_opcode
4688 get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
4690 static xtensa_insnbuf insnbuf = NULL;
4691 static xtensa_insnbuf slotbuf = NULL;
4693 xtensa_opcode opcode;
4694 xtensa_isa isa = xtensa_default_isa;
4695 uint32 regno, const16_regno, call_regno;
4698 if (insnbuf == NULL)
4700 insnbuf = xtensa_insnbuf_alloc (isa);
4701 slotbuf = xtensa_insnbuf_alloc (isa);
4704 xtensa_insnbuf_from_chars (isa, insnbuf, buf, bufsize);
4705 fmt = xtensa_format_decode (isa, insnbuf);
4706 if (fmt == XTENSA_UNDEFINED
4707 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4708 return XTENSA_UNDEFINED;
4710 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4711 if (opcode == XTENSA_UNDEFINED)
4712 return XTENSA_UNDEFINED;
4714 if (opcode == get_l32r_opcode ())
4717 *p_uses_l32r = TRUE;
4718 if (xtensa_operand_get_field (isa, opcode, L32R_TARGET_REG_OPERAND,
4719 fmt, 0, slotbuf, ®no)
4720 || xtensa_operand_decode (isa, opcode, L32R_TARGET_REG_OPERAND,
4722 return XTENSA_UNDEFINED;
4724 else if (opcode == get_const16_opcode ())
4727 *p_uses_l32r = FALSE;
4728 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4729 fmt, 0, slotbuf, ®no)
4730 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4732 return XTENSA_UNDEFINED;
4734 /* Check that the next instruction is also CONST16. */
4735 offset += xtensa_format_length (isa, fmt);
4736 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4737 fmt = xtensa_format_decode (isa, insnbuf);
4738 if (fmt == XTENSA_UNDEFINED
4739 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4740 return XTENSA_UNDEFINED;
4741 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4742 if (opcode != get_const16_opcode ())
4743 return XTENSA_UNDEFINED;
4745 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4746 fmt, 0, slotbuf, &const16_regno)
4747 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4749 || const16_regno != regno)
4750 return XTENSA_UNDEFINED;
4753 return XTENSA_UNDEFINED;
4755 /* Next instruction should be an CALLXn with operand 0 == regno. */
4756 offset += xtensa_format_length (isa, fmt);
4757 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4758 fmt = xtensa_format_decode (isa, insnbuf);
4759 if (fmt == XTENSA_UNDEFINED
4760 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4761 return XTENSA_UNDEFINED;
4762 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4763 if (opcode == XTENSA_UNDEFINED
4764 || !is_indirect_call_opcode (opcode))
4765 return XTENSA_UNDEFINED;
4767 if (xtensa_operand_get_field (isa, opcode, CALLN_SOURCE_OPERAND,
4768 fmt, 0, slotbuf, &call_regno)
4769 || xtensa_operand_decode (isa, opcode, CALLN_SOURCE_OPERAND,
4771 return XTENSA_UNDEFINED;
4773 if (call_regno != regno)
4774 return XTENSA_UNDEFINED;
4780 /* Data structures used during relaxation. */
4782 /* r_reloc: relocation values. */
4784 /* Through the relaxation process, we need to keep track of the values
4785 that will result from evaluating relocations. The standard ELF
4786 relocation structure is not sufficient for this purpose because we're
4787 operating on multiple input files at once, so we need to know which
4788 input file a relocation refers to. The r_reloc structure thus
4789 records both the input file (bfd) and ELF relocation.
4791 For efficiency, an r_reloc also contains a "target_offset" field to
4792 cache the target-section-relative offset value that is represented by
4795 The r_reloc also contains a virtual offset that allows multiple
4796 inserted literals to be placed at the same "address" with
4797 different offsets. */
4799 typedef struct r_reloc_struct r_reloc;
4801 struct r_reloc_struct
4804 Elf_Internal_Rela rela;
4805 bfd_vma target_offset;
4806 bfd_vma virtual_offset;
4810 /* The r_reloc structure is included by value in literal_value, but not
4811 every literal_value has an associated relocation -- some are simple
4812 constants. In such cases, we set all the fields in the r_reloc
4813 struct to zero. The r_reloc_is_const function should be used to
4814 detect this case. */
4817 r_reloc_is_const (const r_reloc *r_rel)
4819 return (r_rel->abfd == NULL);
4824 r_reloc_get_target_offset (const r_reloc *r_rel)
4826 bfd_vma target_offset;
4827 unsigned long r_symndx;
4829 BFD_ASSERT (!r_reloc_is_const (r_rel));
4830 r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4831 target_offset = get_elf_r_symndx_offset (r_rel->abfd, r_symndx);
4832 return (target_offset + r_rel->rela.r_addend);
4836 static struct elf_link_hash_entry *
4837 r_reloc_get_hash_entry (const r_reloc *r_rel)
4839 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4840 return get_elf_r_symndx_hash_entry (r_rel->abfd, r_symndx);
4845 r_reloc_get_section (const r_reloc *r_rel)
4847 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4848 return get_elf_r_symndx_section (r_rel->abfd, r_symndx);
4853 r_reloc_is_defined (const r_reloc *r_rel)
4859 sec = r_reloc_get_section (r_rel);
4860 if (sec == bfd_abs_section_ptr
4861 || sec == bfd_com_section_ptr
4862 || sec == bfd_und_section_ptr)
4869 r_reloc_init (r_reloc *r_rel,
4871 Elf_Internal_Rela *irel,
4873 bfd_size_type content_length)
4876 reloc_howto_type *howto;
4880 r_rel->rela = *irel;
4882 r_rel->target_offset = r_reloc_get_target_offset (r_rel);
4883 r_rel->virtual_offset = 0;
4884 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
4885 howto = &elf_howto_table[r_type];
4886 if (howto->partial_inplace)
4888 bfd_vma inplace_val;
4889 BFD_ASSERT (r_rel->rela.r_offset < content_length);
4891 inplace_val = bfd_get_32 (abfd, &contents[r_rel->rela.r_offset]);
4892 r_rel->target_offset += inplace_val;
4896 memset (r_rel, 0, sizeof (r_reloc));
4903 print_r_reloc (FILE *fp, const r_reloc *r_rel)
4905 if (r_reloc_is_defined (r_rel))
4907 asection *sec = r_reloc_get_section (r_rel);
4908 fprintf (fp, " %s(%s + ", sec->owner->filename, sec->name);
4910 else if (r_reloc_get_hash_entry (r_rel))
4911 fprintf (fp, " %s + ", r_reloc_get_hash_entry (r_rel)->root.root.string);
4913 fprintf (fp, " ?? + ");
4915 fprintf_vma (fp, r_rel->target_offset);
4916 if (r_rel->virtual_offset)
4918 fprintf (fp, " + ");
4919 fprintf_vma (fp, r_rel->virtual_offset);
4928 /* source_reloc: relocations that reference literals. */
4930 /* To determine whether literals can be coalesced, we need to first
4931 record all the relocations that reference the literals. The
4932 source_reloc structure below is used for this purpose. The
4933 source_reloc entries are kept in a per-literal-section array, sorted
4934 by offset within the literal section (i.e., target offset).
4936 The source_sec and r_rel.rela.r_offset fields identify the source of
4937 the relocation. The r_rel field records the relocation value, i.e.,
4938 the offset of the literal being referenced. The opnd field is needed
4939 to determine the range of the immediate field to which the relocation
4940 applies, so we can determine whether another literal with the same
4941 value is within range. The is_null field is true when the relocation
4942 is being removed (e.g., when an L32R is being removed due to a CALLX
4943 that is converted to a direct CALL). */
4945 typedef struct source_reloc_struct source_reloc;
4947 struct source_reloc_struct
4949 asection *source_sec;
4951 xtensa_opcode opcode;
4953 bfd_boolean is_null;
4954 bfd_boolean is_abs_literal;
4959 init_source_reloc (source_reloc *reloc,
4960 asection *source_sec,
4961 const r_reloc *r_rel,
4962 xtensa_opcode opcode,
4964 bfd_boolean is_abs_literal)
4966 reloc->source_sec = source_sec;
4967 reloc->r_rel = *r_rel;
4968 reloc->opcode = opcode;
4970 reloc->is_null = FALSE;
4971 reloc->is_abs_literal = is_abs_literal;
4975 /* Find the source_reloc for a particular source offset and relocation
4976 type. Note that the array is sorted by _target_ offset, so this is
4977 just a linear search. */
4979 static source_reloc *
4980 find_source_reloc (source_reloc *src_relocs,
4983 Elf_Internal_Rela *irel)
4987 for (i = 0; i < src_count; i++)
4989 if (src_relocs[i].source_sec == sec
4990 && src_relocs[i].r_rel.rela.r_offset == irel->r_offset
4991 && (ELF32_R_TYPE (src_relocs[i].r_rel.rela.r_info)
4992 == ELF32_R_TYPE (irel->r_info)))
4993 return &src_relocs[i];
5001 source_reloc_compare (const void *ap, const void *bp)
5003 const source_reloc *a = (const source_reloc *) ap;
5004 const source_reloc *b = (const source_reloc *) bp;
5006 if (a->r_rel.target_offset != b->r_rel.target_offset)
5007 return (a->r_rel.target_offset - b->r_rel.target_offset);
5009 /* We don't need to sort on these criteria for correctness,
5010 but enforcing a more strict ordering prevents unstable qsort
5011 from behaving differently with different implementations.
5012 Without the code below we get correct but different results
5013 on Solaris 2.7 and 2.8. We would like to always produce the
5014 same results no matter the host. */
5016 if ((!a->is_null) - (!b->is_null))
5017 return ((!a->is_null) - (!b->is_null));
5018 return internal_reloc_compare (&a->r_rel.rela, &b->r_rel.rela);
5022 /* Literal values and value hash tables. */
5024 /* Literals with the same value can be coalesced. The literal_value
5025 structure records the value of a literal: the "r_rel" field holds the
5026 information from the relocation on the literal (if there is one) and
5027 the "value" field holds the contents of the literal word itself.
5029 The value_map structure records a literal value along with the
5030 location of a literal holding that value. The value_map hash table
5031 is indexed by the literal value, so that we can quickly check if a
5032 particular literal value has been seen before and is thus a candidate
5035 typedef struct literal_value_struct literal_value;
5036 typedef struct value_map_struct value_map;
5037 typedef struct value_map_hash_table_struct value_map_hash_table;
5039 struct literal_value_struct
5042 unsigned long value;
5043 bfd_boolean is_abs_literal;
5046 struct value_map_struct
5048 literal_value val; /* The literal value. */
5049 r_reloc loc; /* Location of the literal. */
5053 struct value_map_hash_table_struct
5055 unsigned bucket_count;
5056 value_map **buckets;
5058 bfd_boolean has_last_loc;
5064 init_literal_value (literal_value *lit,
5065 const r_reloc *r_rel,
5066 unsigned long value,
5067 bfd_boolean is_abs_literal)
5069 lit->r_rel = *r_rel;
5071 lit->is_abs_literal = is_abs_literal;
5076 literal_value_equal (const literal_value *src1,
5077 const literal_value *src2,
5078 bfd_boolean final_static_link)
5080 struct elf_link_hash_entry *h1, *h2;
5082 if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
5085 if (r_reloc_is_const (&src1->r_rel))
5086 return (src1->value == src2->value);
5088 if (ELF32_R_TYPE (src1->r_rel.rela.r_info)
5089 != ELF32_R_TYPE (src2->r_rel.rela.r_info))
5092 if (src1->r_rel.target_offset != src2->r_rel.target_offset)
5095 if (src1->r_rel.virtual_offset != src2->r_rel.virtual_offset)
5098 if (src1->value != src2->value)
5101 /* Now check for the same section (if defined) or the same elf_hash
5102 (if undefined or weak). */
5103 h1 = r_reloc_get_hash_entry (&src1->r_rel);
5104 h2 = r_reloc_get_hash_entry (&src2->r_rel);
5105 if (r_reloc_is_defined (&src1->r_rel)
5106 && (final_static_link
5107 || ((!h1 || h1->root.type != bfd_link_hash_defweak)
5108 && (!h2 || h2->root.type != bfd_link_hash_defweak))))
5110 if (r_reloc_get_section (&src1->r_rel)
5111 != r_reloc_get_section (&src2->r_rel))
5116 /* Require that the hash entries (i.e., symbols) be identical. */
5117 if (h1 != h2 || h1 == 0)
5121 if (src1->is_abs_literal != src2->is_abs_literal)
5128 /* Must be power of 2. */
5129 #define INITIAL_HASH_RELOC_BUCKET_COUNT 1024
5131 static value_map_hash_table *
5132 value_map_hash_table_init (void)
5134 value_map_hash_table *values;
5136 values = (value_map_hash_table *)
5137 bfd_zmalloc (sizeof (value_map_hash_table));
5138 values->bucket_count = INITIAL_HASH_RELOC_BUCKET_COUNT;
5140 values->buckets = (value_map **)
5141 bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
5142 if (values->buckets == NULL)
5147 values->has_last_loc = FALSE;
5154 value_map_hash_table_delete (value_map_hash_table *table)
5156 free (table->buckets);
5162 hash_bfd_vma (bfd_vma val)
5164 return (val >> 2) + (val >> 10);
5169 literal_value_hash (const literal_value *src)
5173 hash_val = hash_bfd_vma (src->value);
5174 if (!r_reloc_is_const (&src->r_rel))
5178 hash_val += hash_bfd_vma (src->is_abs_literal * 1000);
5179 hash_val += hash_bfd_vma (src->r_rel.target_offset);
5180 hash_val += hash_bfd_vma (src->r_rel.virtual_offset);
5182 /* Now check for the same section and the same elf_hash. */
5183 if (r_reloc_is_defined (&src->r_rel))
5184 sec_or_hash = r_reloc_get_section (&src->r_rel);
5186 sec_or_hash = r_reloc_get_hash_entry (&src->r_rel);
5187 hash_val += hash_bfd_vma ((bfd_vma) (size_t) sec_or_hash);
5193 /* Check if the specified literal_value has been seen before. */
5196 value_map_get_cached_value (value_map_hash_table *map,
5197 const literal_value *val,
5198 bfd_boolean final_static_link)
5204 idx = literal_value_hash (val);
5205 idx = idx & (map->bucket_count - 1);
5206 bucket = map->buckets[idx];
5207 for (map_e = bucket; map_e; map_e = map_e->next)
5209 if (literal_value_equal (&map_e->val, val, final_static_link))
5216 /* Record a new literal value. It is illegal to call this if VALUE
5217 already has an entry here. */
5220 add_value_map (value_map_hash_table *map,
5221 const literal_value *val,
5223 bfd_boolean final_static_link)
5225 value_map **bucket_p;
5228 value_map *val_e = (value_map *) bfd_zmalloc (sizeof (value_map));
5231 bfd_set_error (bfd_error_no_memory);
5235 BFD_ASSERT (!value_map_get_cached_value (map, val, final_static_link));
5239 idx = literal_value_hash (val);
5240 idx = idx & (map->bucket_count - 1);
5241 bucket_p = &map->buckets[idx];
5243 val_e->next = *bucket_p;
5246 /* FIXME: Consider resizing the hash table if we get too many entries. */
5252 /* Lists of text actions (ta_) for narrowing, widening, longcall
5253 conversion, space fill, code & literal removal, etc. */
5255 /* The following text actions are generated:
5257 "ta_remove_insn" remove an instruction or instructions
5258 "ta_remove_longcall" convert longcall to call
5259 "ta_convert_longcall" convert longcall to nop/call
5260 "ta_narrow_insn" narrow a wide instruction
5261 "ta_widen" widen a narrow instruction
5262 "ta_fill" add fill or remove fill
5263 removed < 0 is a fill; branches to the fill address will be
5264 changed to address + fill size (e.g., address - removed)
5265 removed >= 0 branches to the fill address will stay unchanged
5266 "ta_remove_literal" remove a literal; this action is
5267 indicated when a literal is removed
5269 "ta_add_literal" insert a new literal; this action is
5270 indicated when a literal has been moved.
5271 It may use a virtual_offset because
5272 multiple literals can be placed at the
5275 For each of these text actions, we also record the number of bytes
5276 removed by performing the text action. In the case of a "ta_widen"
5277 or a "ta_fill" that adds space, the removed_bytes will be negative. */
5279 typedef struct text_action_struct text_action;
5280 typedef struct text_action_list_struct text_action_list;
5281 typedef enum text_action_enum_t text_action_t;
5283 enum text_action_enum_t
5286 ta_remove_insn, /* removed = -size */
5287 ta_remove_longcall, /* removed = -size */
5288 ta_convert_longcall, /* removed = 0 */
5289 ta_narrow_insn, /* removed = -1 */
5290 ta_widen_insn, /* removed = +1 */
5291 ta_fill, /* removed = +size */
5297 /* Structure for a text action record. */
5298 struct text_action_struct
5300 text_action_t action;
5301 asection *sec; /* Optional */
5303 bfd_vma virtual_offset; /* Zero except for adding literals. */
5305 literal_value value; /* Only valid when adding literals. */
5308 struct removal_by_action_entry_struct
5313 int eq_removed_before_fill;
5315 typedef struct removal_by_action_entry_struct removal_by_action_entry;
5317 struct removal_by_action_map_struct
5320 removal_by_action_entry *entry;
5322 typedef struct removal_by_action_map_struct removal_by_action_map;
5325 /* List of all of the actions taken on a text section. */
5326 struct text_action_list_struct
5330 removal_by_action_map map;
5334 static text_action *
5335 find_fill_action (text_action_list *l, asection *sec, bfd_vma offset)
5339 /* It is not necessary to fill at the end of a section. */
5340 if (sec->size == offset)
5346 splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5348 return (text_action *)node->value;
5354 compute_removed_action_diff (const text_action *ta,
5358 int removable_space)
5361 int current_removed = 0;
5364 current_removed = ta->removed_bytes;
5366 BFD_ASSERT (ta == NULL || ta->offset == offset);
5367 BFD_ASSERT (ta == NULL || ta->action == ta_fill);
5369 /* It is not necessary to fill at the end of a section. Clean this up. */
5370 if (sec->size == offset)
5371 new_removed = removable_space - 0;
5375 int added = -removed - current_removed;
5376 /* Ignore multiples of the section alignment. */
5377 added = ((1 << sec->alignment_power) - 1) & added;
5378 new_removed = (-added);
5380 /* Modify for removable. */
5381 space = removable_space - new_removed;
5382 new_removed = (removable_space
5383 - (((1 << sec->alignment_power) - 1) & space));
5385 return (new_removed - current_removed);
5390 adjust_fill_action (text_action *ta, int fill_diff)
5392 ta->removed_bytes += fill_diff;
5397 text_action_compare (splay_tree_key a, splay_tree_key b)
5399 text_action *pa = (text_action *)a;
5400 text_action *pb = (text_action *)b;
5401 static const int action_priority[] =
5405 [ta_convert_longcall] = 2,
5406 [ta_narrow_insn] = 3,
5407 [ta_remove_insn] = 4,
5408 [ta_remove_longcall] = 5,
5409 [ta_remove_literal] = 6,
5410 [ta_widen_insn] = 7,
5411 [ta_add_literal] = 8,
5414 if (pa->offset == pb->offset)
5416 if (pa->action == pb->action)
5418 return action_priority[pa->action] - action_priority[pb->action];
5421 return pa->offset < pb->offset ? -1 : 1;
5424 static text_action *
5425 action_first (text_action_list *action_list)
5427 splay_tree_node node = splay_tree_min (action_list->tree);
5428 return node ? (text_action *)node->value : NULL;
5431 static text_action *
5432 action_next (text_action_list *action_list, text_action *action)
5434 splay_tree_node node = splay_tree_successor (action_list->tree,
5435 (splay_tree_key)action);
5436 return node ? (text_action *)node->value : NULL;
5439 /* Add a modification action to the text. For the case of adding or
5440 removing space, modify any current fill and assume that
5441 "unreachable_space" bytes can be freely contracted. Note that a
5442 negative removed value is a fill. */
5445 text_action_add (text_action_list *l,
5446 text_action_t action,
5454 /* It is not necessary to fill at the end of a section. */
5455 if (action == ta_fill && sec->size == offset)
5458 /* It is not necessary to fill 0 bytes. */
5459 if (action == ta_fill && removed == 0)
5465 if (action == ta_fill)
5467 splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5471 ta = (text_action *)node->value;
5472 ta->removed_bytes += removed;
5477 BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)&a) == NULL);
5479 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5480 ta->action = action;
5482 ta->offset = offset;
5483 ta->removed_bytes = removed;
5484 splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5490 text_action_add_literal (text_action_list *l,
5491 text_action_t action,
5493 const literal_value *value,
5497 asection *sec = r_reloc_get_section (loc);
5498 bfd_vma offset = loc->target_offset;
5499 bfd_vma virtual_offset = loc->virtual_offset;
5501 BFD_ASSERT (action == ta_add_literal);
5503 /* Create a new record and fill it up. */
5504 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5505 ta->action = action;
5507 ta->offset = offset;
5508 ta->virtual_offset = virtual_offset;
5510 ta->removed_bytes = removed;
5512 BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)ta) == NULL);
5513 splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5518 /* Find the total offset adjustment for the relaxations specified by
5519 text_actions, beginning from a particular starting action. This is
5520 typically used from offset_with_removed_text to search an entire list of
5521 actions, but it may also be called directly when adjusting adjacent offsets
5522 so that each search may begin where the previous one left off. */
5525 removed_by_actions (text_action_list *action_list,
5526 text_action **p_start_action,
5528 bfd_boolean before_fill)
5533 r = *p_start_action;
5536 splay_tree_node node = splay_tree_lookup (action_list->tree,
5538 BFD_ASSERT (node != NULL && r == (text_action *)node->value);
5543 if (r->offset > offset)
5546 if (r->offset == offset
5547 && (before_fill || r->action != ta_fill || r->removed_bytes >= 0))
5550 removed += r->removed_bytes;
5552 r = action_next (action_list, r);
5555 *p_start_action = r;
5561 offset_with_removed_text (text_action_list *action_list, bfd_vma offset)
5563 text_action *r = action_first (action_list);
5565 return offset - removed_by_actions (action_list, &r, offset, FALSE);
5570 action_list_count (text_action_list *action_list)
5572 return action_list->count;
5575 typedef struct map_action_fn_context_struct map_action_fn_context;
5576 struct map_action_fn_context_struct
5579 removal_by_action_map map;
5580 bfd_boolean eq_complete;
5584 map_action_fn (splay_tree_node node, void *p)
5586 map_action_fn_context *ctx = p;
5587 text_action *r = (text_action *)node->value;
5588 removal_by_action_entry *ientry = ctx->map.entry + ctx->map.n_entries;
5590 if (ctx->map.n_entries && (ientry - 1)->offset == r->offset)
5596 ++ctx->map.n_entries;
5597 ctx->eq_complete = FALSE;
5598 ientry->offset = r->offset;
5599 ientry->eq_removed_before_fill = ctx->removed;
5602 if (!ctx->eq_complete)
5604 if (r->action != ta_fill || r->removed_bytes >= 0)
5606 ientry->eq_removed = ctx->removed;
5607 ctx->eq_complete = TRUE;
5610 ientry->eq_removed = ctx->removed + r->removed_bytes;
5613 ctx->removed += r->removed_bytes;
5614 ientry->removed = ctx->removed;
5619 map_removal_by_action (text_action_list *action_list)
5621 map_action_fn_context ctx;
5624 ctx.map.n_entries = 0;
5625 ctx.map.entry = bfd_malloc (action_list_count (action_list) *
5626 sizeof (removal_by_action_entry));
5627 ctx.eq_complete = FALSE;
5629 splay_tree_foreach (action_list->tree, map_action_fn, &ctx);
5630 action_list->map = ctx.map;
5634 removed_by_actions_map (text_action_list *action_list, bfd_vma offset,
5635 bfd_boolean before_fill)
5639 if (!action_list->map.entry)
5640 map_removal_by_action (action_list);
5642 if (!action_list->map.n_entries)
5646 b = action_list->map.n_entries;
5650 unsigned c = (a + b) / 2;
5652 if (action_list->map.entry[c].offset <= offset)
5658 if (action_list->map.entry[a].offset < offset)
5660 return action_list->map.entry[a].removed;
5662 else if (action_list->map.entry[a].offset == offset)
5664 return before_fill ?
5665 action_list->map.entry[a].eq_removed_before_fill :
5666 action_list->map.entry[a].eq_removed;
5675 offset_with_removed_text_map (text_action_list *action_list, bfd_vma offset)
5677 int removed = removed_by_actions_map (action_list, offset, FALSE);
5678 return offset - removed;
5682 /* The find_insn_action routine will only find non-fill actions. */
5684 static text_action *
5685 find_insn_action (text_action_list *action_list, bfd_vma offset)
5687 static const text_action_t action[] =
5689 ta_convert_longcall,
5699 for (i = 0; i < sizeof (action) / sizeof (*action); ++i)
5701 splay_tree_node node;
5703 a.action = action[i];
5704 node = splay_tree_lookup (action_list->tree, (splay_tree_key)&a);
5706 return (text_action *)node->value;
5715 print_action (FILE *fp, text_action *r)
5717 const char *t = "unknown";
5720 case ta_remove_insn:
5721 t = "remove_insn"; break;
5722 case ta_remove_longcall:
5723 t = "remove_longcall"; break;
5724 case ta_convert_longcall:
5725 t = "convert_longcall"; break;
5726 case ta_narrow_insn:
5727 t = "narrow_insn"; break;
5729 t = "widen_insn"; break;
5734 case ta_remove_literal:
5735 t = "remove_literal"; break;
5736 case ta_add_literal:
5737 t = "add_literal"; break;
5740 fprintf (fp, "%s: %s[0x%lx] \"%s\" %d\n",
5741 r->sec->owner->filename,
5742 r->sec->name, (unsigned long) r->offset, t, r->removed_bytes);
5746 print_action_list_fn (splay_tree_node node, void *p)
5748 text_action *r = (text_action *)node->value;
5750 print_action (p, r);
5755 print_action_list (FILE *fp, text_action_list *action_list)
5757 fprintf (fp, "Text Action\n");
5758 splay_tree_foreach (action_list->tree, print_action_list_fn, fp);
5764 /* Lists of literals being coalesced or removed. */
5766 /* In the usual case, the literal identified by "from" is being
5767 coalesced with another literal identified by "to". If the literal is
5768 unused and is being removed altogether, "to.abfd" will be NULL.
5769 The removed_literal entries are kept on a per-section list, sorted
5770 by the "from" offset field. */
5772 typedef struct removed_literal_struct removed_literal;
5773 typedef struct removed_literal_map_entry_struct removed_literal_map_entry;
5774 typedef struct removed_literal_list_struct removed_literal_list;
5776 struct removed_literal_struct
5780 removed_literal *next;
5783 struct removed_literal_map_entry_struct
5786 removed_literal *literal;
5789 struct removed_literal_list_struct
5791 removed_literal *head;
5792 removed_literal *tail;
5795 removed_literal_map_entry *map;
5799 /* Record that the literal at "from" is being removed. If "to" is not
5800 NULL, the "from" literal is being coalesced with the "to" literal. */
5803 add_removed_literal (removed_literal_list *removed_list,
5804 const r_reloc *from,
5807 removed_literal *r, *new_r, *next_r;
5809 new_r = (removed_literal *) bfd_zmalloc (sizeof (removed_literal));
5811 new_r->from = *from;
5815 new_r->to.abfd = NULL;
5818 r = removed_list->head;
5821 removed_list->head = new_r;
5822 removed_list->tail = new_r;
5824 /* Special check for common case of append. */
5825 else if (removed_list->tail->from.target_offset < from->target_offset)
5827 removed_list->tail->next = new_r;
5828 removed_list->tail = new_r;
5832 while (r->from.target_offset < from->target_offset && r->next)
5838 new_r->next = next_r;
5840 removed_list->tail = new_r;
5845 map_removed_literal (removed_literal_list *removed_list)
5849 removed_literal_map_entry *map = NULL;
5850 removed_literal *r = removed_list->head;
5852 for (i = 0; r; ++i, r = r->next)
5856 n_map = (n_map * 2) + 2;
5857 map = bfd_realloc (map, n_map * sizeof (*map));
5859 map[i].addr = r->from.target_offset;
5862 removed_list->map = map;
5863 removed_list->n_map = i;
5867 removed_literal_compare (const void *a, const void *b)
5869 const removed_literal_map_entry *pa = a;
5870 const removed_literal_map_entry *pb = b;
5872 if (pa->addr == pb->addr)
5875 return pa->addr < pb->addr ? -1 : 1;
5878 /* Check if the list of removed literals contains an entry for the
5879 given address. Return the entry if found. */
5881 static removed_literal *
5882 find_removed_literal (removed_literal_list *removed_list, bfd_vma addr)
5884 removed_literal_map_entry *p;
5885 removed_literal *r = NULL;
5887 if (removed_list->map == NULL)
5888 map_removed_literal (removed_list);
5890 p = bsearch (&addr, removed_list->map, removed_list->n_map,
5891 sizeof (*removed_list->map), removed_literal_compare);
5894 while (p != removed_list->map && (p - 1)->addr == addr)
5905 print_removed_literals (FILE *fp, removed_literal_list *removed_list)
5908 r = removed_list->head;
5910 fprintf (fp, "Removed Literals\n");
5911 for (; r != NULL; r = r->next)
5913 print_r_reloc (fp, &r->from);
5914 fprintf (fp, " => ");
5915 if (r->to.abfd == NULL)
5916 fprintf (fp, "REMOVED");
5918 print_r_reloc (fp, &r->to);
5926 /* Per-section data for relaxation. */
5928 typedef struct reloc_bfd_fix_struct reloc_bfd_fix;
5930 struct xtensa_relax_info_struct
5932 bfd_boolean is_relaxable_literal_section;
5933 bfd_boolean is_relaxable_asm_section;
5934 int visited; /* Number of times visited. */
5936 source_reloc *src_relocs; /* Array[src_count]. */
5938 int src_next; /* Next src_relocs entry to assign. */
5940 removed_literal_list removed_list;
5941 text_action_list action_list;
5943 reloc_bfd_fix *fix_list;
5944 reloc_bfd_fix *fix_array;
5945 unsigned fix_array_count;
5947 /* Support for expanding the reloc array that is stored
5948 in the section structure. If the relocations have been
5949 reallocated, the newly allocated relocations will be referenced
5950 here along with the actual size allocated. The relocation
5951 count will always be found in the section structure. */
5952 Elf_Internal_Rela *allocated_relocs;
5953 unsigned relocs_count;
5954 unsigned allocated_relocs_count;
5957 struct elf_xtensa_section_data
5959 struct bfd_elf_section_data elf;
5960 xtensa_relax_info relax_info;
5965 elf_xtensa_new_section_hook (bfd *abfd, asection *sec)
5967 if (!sec->used_by_bfd)
5969 struct elf_xtensa_section_data *sdata;
5970 bfd_size_type amt = sizeof (*sdata);
5972 sdata = bfd_zalloc (abfd, amt);
5975 sec->used_by_bfd = sdata;
5978 return _bfd_elf_new_section_hook (abfd, sec);
5982 static xtensa_relax_info *
5983 get_xtensa_relax_info (asection *sec)
5985 struct elf_xtensa_section_data *section_data;
5987 /* No info available if no section or if it is an output section. */
5988 if (!sec || sec == sec->output_section)
5991 section_data = (struct elf_xtensa_section_data *) elf_section_data (sec);
5992 return §ion_data->relax_info;
5997 init_xtensa_relax_info (asection *sec)
5999 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6001 relax_info->is_relaxable_literal_section = FALSE;
6002 relax_info->is_relaxable_asm_section = FALSE;
6003 relax_info->visited = 0;
6005 relax_info->src_relocs = NULL;
6006 relax_info->src_count = 0;
6007 relax_info->src_next = 0;
6009 relax_info->removed_list.head = NULL;
6010 relax_info->removed_list.tail = NULL;
6012 relax_info->action_list.tree = splay_tree_new (text_action_compare,
6014 relax_info->action_list.map.n_entries = 0;
6015 relax_info->action_list.map.entry = NULL;
6017 relax_info->fix_list = NULL;
6018 relax_info->fix_array = NULL;
6019 relax_info->fix_array_count = 0;
6021 relax_info->allocated_relocs = NULL;
6022 relax_info->relocs_count = 0;
6023 relax_info->allocated_relocs_count = 0;
6027 /* Coalescing literals may require a relocation to refer to a section in
6028 a different input file, but the standard relocation information
6029 cannot express that. Instead, the reloc_bfd_fix structures are used
6030 to "fix" the relocations that refer to sections in other input files.
6031 These structures are kept on per-section lists. The "src_type" field
6032 records the relocation type in case there are multiple relocations on
6033 the same location. FIXME: This is ugly; an alternative might be to
6034 add new symbols with the "owner" field to some other input file. */
6036 struct reloc_bfd_fix_struct
6040 unsigned src_type; /* Relocation type. */
6042 asection *target_sec;
6043 bfd_vma target_offset;
6044 bfd_boolean translated;
6046 reloc_bfd_fix *next;
6050 static reloc_bfd_fix *
6051 reloc_bfd_fix_init (asection *src_sec,
6054 asection *target_sec,
6055 bfd_vma target_offset,
6056 bfd_boolean translated)
6060 fix = (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix));
6061 fix->src_sec = src_sec;
6062 fix->src_offset = src_offset;
6063 fix->src_type = src_type;
6064 fix->target_sec = target_sec;
6065 fix->target_offset = target_offset;
6066 fix->translated = translated;
6073 add_fix (asection *src_sec, reloc_bfd_fix *fix)
6075 xtensa_relax_info *relax_info;
6077 relax_info = get_xtensa_relax_info (src_sec);
6078 fix->next = relax_info->fix_list;
6079 relax_info->fix_list = fix;
6084 fix_compare (const void *ap, const void *bp)
6086 const reloc_bfd_fix *a = (const reloc_bfd_fix *) ap;
6087 const reloc_bfd_fix *b = (const reloc_bfd_fix *) bp;
6089 if (a->src_offset != b->src_offset)
6090 return (a->src_offset - b->src_offset);
6091 return (a->src_type - b->src_type);
6096 cache_fix_array (asection *sec)
6098 unsigned i, count = 0;
6100 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6102 if (relax_info == NULL)
6104 if (relax_info->fix_list == NULL)
6107 for (r = relax_info->fix_list; r != NULL; r = r->next)
6110 relax_info->fix_array =
6111 (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix) * count);
6112 relax_info->fix_array_count = count;
6114 r = relax_info->fix_list;
6115 for (i = 0; i < count; i++, r = r->next)
6117 relax_info->fix_array[count - 1 - i] = *r;
6118 relax_info->fix_array[count - 1 - i].next = NULL;
6121 qsort (relax_info->fix_array, relax_info->fix_array_count,
6122 sizeof (reloc_bfd_fix), fix_compare);
6126 static reloc_bfd_fix *
6127 get_bfd_fix (asection *sec, bfd_vma offset, unsigned type)
6129 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6133 if (relax_info == NULL)
6135 if (relax_info->fix_list == NULL)
6138 if (relax_info->fix_array == NULL)
6139 cache_fix_array (sec);
6141 key.src_offset = offset;
6142 key.src_type = type;
6143 rv = bsearch (&key, relax_info->fix_array, relax_info->fix_array_count,
6144 sizeof (reloc_bfd_fix), fix_compare);
6149 /* Section caching. */
6151 typedef struct section_cache_struct section_cache_t;
6153 struct section_cache_struct
6157 bfd_byte *contents; /* Cache of the section contents. */
6158 bfd_size_type content_length;
6160 property_table_entry *ptbl; /* Cache of the section property table. */
6163 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
6164 unsigned reloc_count;
6169 init_section_cache (section_cache_t *sec_cache)
6171 memset (sec_cache, 0, sizeof (*sec_cache));
6176 free_section_cache (section_cache_t *sec_cache)
6180 release_contents (sec_cache->sec, sec_cache->contents);
6181 release_internal_relocs (sec_cache->sec, sec_cache->relocs);
6182 if (sec_cache->ptbl)
6183 free (sec_cache->ptbl);
6189 section_cache_section (section_cache_t *sec_cache,
6191 struct bfd_link_info *link_info)
6194 property_table_entry *prop_table = NULL;
6196 bfd_byte *contents = NULL;
6197 Elf_Internal_Rela *internal_relocs = NULL;
6198 bfd_size_type sec_size;
6202 if (sec == sec_cache->sec)
6206 sec_size = bfd_get_section_limit (abfd, sec);
6208 /* Get the contents. */
6209 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6210 if (contents == NULL && sec_size != 0)
6213 /* Get the relocations. */
6214 internal_relocs = retrieve_internal_relocs (abfd, sec,
6215 link_info->keep_memory);
6217 /* Get the entry table. */
6218 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
6219 XTENSA_PROP_SEC_NAME, FALSE);
6223 /* Fill in the new section cache. */
6224 free_section_cache (sec_cache);
6225 init_section_cache (sec_cache);
6227 sec_cache->sec = sec;
6228 sec_cache->contents = contents;
6229 sec_cache->content_length = sec_size;
6230 sec_cache->relocs = internal_relocs;
6231 sec_cache->reloc_count = sec->reloc_count;
6232 sec_cache->pte_count = ptblsize;
6233 sec_cache->ptbl = prop_table;
6238 release_contents (sec, contents);
6239 release_internal_relocs (sec, internal_relocs);
6246 /* Extended basic blocks. */
6248 /* An ebb_struct represents an Extended Basic Block. Within this
6249 range, we guarantee that all instructions are decodable, the
6250 property table entries are contiguous, and no property table
6251 specifies a segment that cannot have instructions moved. This
6252 structure contains caches of the contents, property table and
6253 relocations for the specified section for easy use. The range is
6254 specified by ranges of indices for the byte offset, property table
6255 offsets and relocation offsets. These must be consistent. */
6257 typedef struct ebb_struct ebb_t;
6263 bfd_byte *contents; /* Cache of the section contents. */
6264 bfd_size_type content_length;
6266 property_table_entry *ptbl; /* Cache of the section property table. */
6269 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
6270 unsigned reloc_count;
6272 bfd_vma start_offset; /* Offset in section. */
6273 unsigned start_ptbl_idx; /* Offset in the property table. */
6274 unsigned start_reloc_idx; /* Offset in the relocations. */
6277 unsigned end_ptbl_idx;
6278 unsigned end_reloc_idx;
6280 bfd_boolean ends_section; /* Is this the last ebb in a section? */
6282 /* The unreachable property table at the end of this set of blocks;
6283 NULL if the end is not an unreachable block. */
6284 property_table_entry *ends_unreachable;
6288 enum ebb_target_enum
6291 EBB_DESIRE_TGT_ALIGN,
6292 EBB_REQUIRE_TGT_ALIGN,
6293 EBB_REQUIRE_LOOP_ALIGN,
6298 /* proposed_action_struct is similar to the text_action_struct except
6299 that is represents a potential transformation, not one that will
6300 occur. We build a list of these for an extended basic block
6301 and use them to compute the actual actions desired. We must be
6302 careful that the entire set of actual actions we perform do not
6303 break any relocations that would fit if the actions were not
6306 typedef struct proposed_action_struct proposed_action;
6308 struct proposed_action_struct
6310 enum ebb_target_enum align_type; /* for the target alignment */
6311 bfd_vma alignment_pow;
6312 text_action_t action;
6315 bfd_boolean do_action; /* If false, then we will not perform the action. */
6319 /* The ebb_constraint_struct keeps a set of proposed actions for an
6320 extended basic block. */
6322 typedef struct ebb_constraint_struct ebb_constraint;
6324 struct ebb_constraint_struct
6327 bfd_boolean start_movable;
6329 /* Bytes of extra space at the beginning if movable. */
6330 int start_extra_space;
6332 enum ebb_target_enum start_align;
6334 bfd_boolean end_movable;
6336 /* Bytes of extra space at the end if movable. */
6337 int end_extra_space;
6339 unsigned action_count;
6340 unsigned action_allocated;
6342 /* Array of proposed actions. */
6343 proposed_action *actions;
6345 /* Action alignments -- one for each proposed action. */
6346 enum ebb_target_enum *action_aligns;
6351 init_ebb_constraint (ebb_constraint *c)
6353 memset (c, 0, sizeof (ebb_constraint));
6358 free_ebb_constraint (ebb_constraint *c)
6366 init_ebb (ebb_t *ebb,
6369 bfd_size_type content_length,
6370 property_table_entry *prop_table,
6372 Elf_Internal_Rela *internal_relocs,
6373 unsigned reloc_count)
6375 memset (ebb, 0, sizeof (ebb_t));
6377 ebb->contents = contents;
6378 ebb->content_length = content_length;
6379 ebb->ptbl = prop_table;
6380 ebb->pte_count = ptblsize;
6381 ebb->relocs = internal_relocs;
6382 ebb->reloc_count = reloc_count;
6383 ebb->start_offset = 0;
6384 ebb->end_offset = ebb->content_length - 1;
6385 ebb->start_ptbl_idx = 0;
6386 ebb->end_ptbl_idx = ptblsize;
6387 ebb->start_reloc_idx = 0;
6388 ebb->end_reloc_idx = reloc_count;
6392 /* Extend the ebb to all decodable contiguous sections. The algorithm
6393 for building a basic block around an instruction is to push it
6394 forward until we hit the end of a section, an unreachable block or
6395 a block that cannot be transformed. Then we push it backwards
6396 searching for similar conditions. */
6398 static bfd_boolean extend_ebb_bounds_forward (ebb_t *);
6399 static bfd_boolean extend_ebb_bounds_backward (ebb_t *);
6400 static bfd_size_type insn_block_decodable_len
6401 (bfd_byte *, bfd_size_type, bfd_vma, bfd_size_type);
6404 extend_ebb_bounds (ebb_t *ebb)
6406 if (!extend_ebb_bounds_forward (ebb))
6408 if (!extend_ebb_bounds_backward (ebb))
6415 extend_ebb_bounds_forward (ebb_t *ebb)
6417 property_table_entry *the_entry, *new_entry;
6419 the_entry = &ebb->ptbl[ebb->end_ptbl_idx];
6421 /* Stop when (1) we cannot decode an instruction, (2) we are at
6422 the end of the property tables, (3) we hit a non-contiguous property
6423 table entry, (4) we hit a NO_TRANSFORM region. */
6428 bfd_size_type insn_block_len;
6430 entry_end = the_entry->address - ebb->sec->vma + the_entry->size;
6432 insn_block_decodable_len (ebb->contents, ebb->content_length,
6434 entry_end - ebb->end_offset);
6435 if (insn_block_len != (entry_end - ebb->end_offset))
6438 /* xgettext:c-format */
6439 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
6440 "possible configuration mismatch"),
6441 ebb->sec->owner, ebb->sec,
6442 (uint64_t) (ebb->end_offset + insn_block_len));
6445 ebb->end_offset += insn_block_len;
6447 if (ebb->end_offset == ebb->sec->size)
6448 ebb->ends_section = TRUE;
6450 /* Update the reloc counter. */
6451 while (ebb->end_reloc_idx + 1 < ebb->reloc_count
6452 && (ebb->relocs[ebb->end_reloc_idx + 1].r_offset
6455 ebb->end_reloc_idx++;
6458 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6461 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6462 if (((new_entry->flags & XTENSA_PROP_INSN) == 0)
6463 || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6464 || ((the_entry->flags & XTENSA_PROP_ALIGN) != 0))
6467 if (the_entry->address + the_entry->size != new_entry->address)
6470 the_entry = new_entry;
6471 ebb->end_ptbl_idx++;
6474 /* Quick check for an unreachable or end of file just at the end. */
6475 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6477 if (ebb->end_offset == ebb->content_length)
6478 ebb->ends_section = TRUE;
6482 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6483 if ((new_entry->flags & XTENSA_PROP_UNREACHABLE) != 0
6484 && the_entry->address + the_entry->size == new_entry->address)
6485 ebb->ends_unreachable = new_entry;
6488 /* Any other ending requires exact alignment. */
6494 extend_ebb_bounds_backward (ebb_t *ebb)
6496 property_table_entry *the_entry, *new_entry;
6498 the_entry = &ebb->ptbl[ebb->start_ptbl_idx];
6500 /* Stop when (1) we cannot decode the instructions in the current entry.
6501 (2) we are at the beginning of the property tables, (3) we hit a
6502 non-contiguous property table entry, (4) we hit a NO_TRANSFORM region. */
6506 bfd_vma block_begin;
6507 bfd_size_type insn_block_len;
6509 block_begin = the_entry->address - ebb->sec->vma;
6511 insn_block_decodable_len (ebb->contents, ebb->content_length,
6513 ebb->start_offset - block_begin);
6514 if (insn_block_len != ebb->start_offset - block_begin)
6517 /* xgettext:c-format */
6518 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
6519 "possible configuration mismatch"),
6520 ebb->sec->owner, ebb->sec,
6521 (uint64_t) (ebb->end_offset + insn_block_len));
6524 ebb->start_offset -= insn_block_len;
6526 /* Update the reloc counter. */
6527 while (ebb->start_reloc_idx > 0
6528 && (ebb->relocs[ebb->start_reloc_idx - 1].r_offset
6529 >= ebb->start_offset))
6531 ebb->start_reloc_idx--;
6534 if (ebb->start_ptbl_idx == 0)
6537 new_entry = &ebb->ptbl[ebb->start_ptbl_idx - 1];
6538 if ((new_entry->flags & XTENSA_PROP_INSN) == 0
6539 || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6540 || ((new_entry->flags & XTENSA_PROP_ALIGN) != 0))
6542 if (new_entry->address + new_entry->size != the_entry->address)
6545 the_entry = new_entry;
6546 ebb->start_ptbl_idx--;
6552 static bfd_size_type
6553 insn_block_decodable_len (bfd_byte *contents,
6554 bfd_size_type content_len,
6555 bfd_vma block_offset,
6556 bfd_size_type block_len)
6558 bfd_vma offset = block_offset;
6560 while (offset < block_offset + block_len)
6562 bfd_size_type insn_len = 0;
6564 insn_len = insn_decode_len (contents, content_len, offset);
6566 return (offset - block_offset);
6569 return (offset - block_offset);
6574 ebb_propose_action (ebb_constraint *c,
6575 enum ebb_target_enum align_type,
6576 bfd_vma alignment_pow,
6577 text_action_t action,
6580 bfd_boolean do_action)
6582 proposed_action *act;
6584 if (c->action_allocated <= c->action_count)
6586 unsigned new_allocated, i;
6587 proposed_action *new_actions;
6589 new_allocated = (c->action_count + 2) * 2;
6590 new_actions = (proposed_action *)
6591 bfd_zmalloc (sizeof (proposed_action) * new_allocated);
6593 for (i = 0; i < c->action_count; i++)
6594 new_actions[i] = c->actions[i];
6597 c->actions = new_actions;
6598 c->action_allocated = new_allocated;
6601 act = &c->actions[c->action_count];
6602 act->align_type = align_type;
6603 act->alignment_pow = alignment_pow;
6604 act->action = action;
6605 act->offset = offset;
6606 act->removed_bytes = removed_bytes;
6607 act->do_action = do_action;
6613 /* Access to internal relocations, section contents and symbols. */
6615 /* During relaxation, we need to modify relocations, section contents,
6616 and symbol definitions, and we need to keep the original values from
6617 being reloaded from the input files, i.e., we need to "pin" the
6618 modified values in memory. We also want to continue to observe the
6619 setting of the "keep-memory" flag. The following functions wrap the
6620 standard BFD functions to take care of this for us. */
6622 static Elf_Internal_Rela *
6623 retrieve_internal_relocs (bfd *abfd, asection *sec, bfd_boolean keep_memory)
6625 Elf_Internal_Rela *internal_relocs;
6627 if ((sec->flags & SEC_LINKER_CREATED) != 0)
6630 internal_relocs = elf_section_data (sec)->relocs;
6631 if (internal_relocs == NULL)
6632 internal_relocs = (_bfd_elf_link_read_relocs
6633 (abfd, sec, NULL, NULL, keep_memory));
6634 return internal_relocs;
6639 pin_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6641 elf_section_data (sec)->relocs = internal_relocs;
6646 release_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6649 && elf_section_data (sec)->relocs != internal_relocs)
6650 free (internal_relocs);
6655 retrieve_contents (bfd *abfd, asection *sec, bfd_boolean keep_memory)
6658 bfd_size_type sec_size;
6660 sec_size = bfd_get_section_limit (abfd, sec);
6661 contents = elf_section_data (sec)->this_hdr.contents;
6663 if (contents == NULL && sec_size != 0)
6665 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
6672 elf_section_data (sec)->this_hdr.contents = contents;
6679 pin_contents (asection *sec, bfd_byte *contents)
6681 elf_section_data (sec)->this_hdr.contents = contents;
6686 release_contents (asection *sec, bfd_byte *contents)
6688 if (contents && elf_section_data (sec)->this_hdr.contents != contents)
6693 static Elf_Internal_Sym *
6694 retrieve_local_syms (bfd *input_bfd)
6696 Elf_Internal_Shdr *symtab_hdr;
6697 Elf_Internal_Sym *isymbuf;
6700 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
6701 locsymcount = symtab_hdr->sh_info;
6703 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
6704 if (isymbuf == NULL && locsymcount != 0)
6705 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
6708 /* Save the symbols for this input file so they won't be read again. */
6709 if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
6710 symtab_hdr->contents = (unsigned char *) isymbuf;
6716 /* Code for link-time relaxation. */
6718 /* Initialization for relaxation: */
6719 static bfd_boolean analyze_relocations (struct bfd_link_info *);
6720 static bfd_boolean find_relaxable_sections
6721 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
6722 static bfd_boolean collect_source_relocs
6723 (bfd *, asection *, struct bfd_link_info *);
6724 static bfd_boolean is_resolvable_asm_expansion
6725 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, struct bfd_link_info *,
6727 static Elf_Internal_Rela *find_associated_l32r_irel
6728 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Rela *);
6729 static bfd_boolean compute_text_actions
6730 (bfd *, asection *, struct bfd_link_info *);
6731 static bfd_boolean compute_ebb_proposed_actions (ebb_constraint *);
6732 static bfd_boolean compute_ebb_actions (ebb_constraint *);
6733 typedef struct reloc_range_list_struct reloc_range_list;
6734 static bfd_boolean check_section_ebb_pcrels_fit
6735 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *,
6736 reloc_range_list *, const ebb_constraint *,
6737 const xtensa_opcode *);
6738 static bfd_boolean check_section_ebb_reduces (const ebb_constraint *);
6739 static void text_action_add_proposed
6740 (text_action_list *, const ebb_constraint *, asection *);
6743 static bfd_boolean compute_removed_literals
6744 (bfd *, asection *, struct bfd_link_info *, value_map_hash_table *);
6745 static Elf_Internal_Rela *get_irel_at_offset
6746 (asection *, Elf_Internal_Rela *, bfd_vma);
6747 static bfd_boolean is_removable_literal
6748 (const source_reloc *, int, const source_reloc *, int, asection *,
6749 property_table_entry *, int);
6750 static bfd_boolean remove_dead_literal
6751 (bfd *, asection *, struct bfd_link_info *, Elf_Internal_Rela *,
6752 Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
6753 static bfd_boolean identify_literal_placement
6754 (bfd *, asection *, bfd_byte *, struct bfd_link_info *,
6755 value_map_hash_table *, bfd_boolean *, Elf_Internal_Rela *, int,
6756 source_reloc *, property_table_entry *, int, section_cache_t *,
6758 static bfd_boolean relocations_reach (source_reloc *, int, const r_reloc *);
6759 static bfd_boolean coalesce_shared_literal
6760 (asection *, source_reloc *, property_table_entry *, int, value_map *);
6761 static bfd_boolean move_shared_literal
6762 (asection *, struct bfd_link_info *, source_reloc *, property_table_entry *,
6763 int, const r_reloc *, const literal_value *, section_cache_t *);
6766 static bfd_boolean relax_section (bfd *, asection *, struct bfd_link_info *);
6767 static bfd_boolean translate_section_fixes (asection *);
6768 static bfd_boolean translate_reloc_bfd_fix (reloc_bfd_fix *);
6769 static asection *translate_reloc (const r_reloc *, r_reloc *, asection *);
6770 static void shrink_dynamic_reloc_sections
6771 (struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *);
6772 static bfd_boolean move_literal
6773 (bfd *, struct bfd_link_info *, asection *, bfd_vma, bfd_byte *,
6774 xtensa_relax_info *, Elf_Internal_Rela **, const literal_value *);
6775 static bfd_boolean relax_property_section
6776 (bfd *, asection *, struct bfd_link_info *);
6779 static bfd_boolean relax_section_symbols (bfd *, asection *);
6783 elf_xtensa_relax_section (bfd *abfd,
6785 struct bfd_link_info *link_info,
6788 static value_map_hash_table *values = NULL;
6789 static bfd_boolean relocations_analyzed = FALSE;
6790 xtensa_relax_info *relax_info;
6792 if (!relocations_analyzed)
6794 /* Do some overall initialization for relaxation. */
6795 values = value_map_hash_table_init ();
6798 relaxing_section = TRUE;
6799 if (!analyze_relocations (link_info))
6801 relocations_analyzed = TRUE;
6805 /* Don't mess with linker-created sections. */
6806 if ((sec->flags & SEC_LINKER_CREATED) != 0)
6809 relax_info = get_xtensa_relax_info (sec);
6810 BFD_ASSERT (relax_info != NULL);
6812 switch (relax_info->visited)
6815 /* Note: It would be nice to fold this pass into
6816 analyze_relocations, but it is important for this step that the
6817 sections be examined in link order. */
6818 if (!compute_removed_literals (abfd, sec, link_info, values))
6825 value_map_hash_table_delete (values);
6827 if (!relax_section (abfd, sec, link_info))
6833 if (!relax_section_symbols (abfd, sec))
6838 relax_info->visited++;
6843 /* Initialization for relaxation. */
6845 /* This function is called once at the start of relaxation. It scans
6846 all the input sections and marks the ones that are relaxable (i.e.,
6847 literal sections with L32R relocations against them), and then
6848 collects source_reloc information for all the relocations against
6849 those relaxable sections. During this process, it also detects
6850 longcalls, i.e., calls relaxed by the assembler into indirect
6851 calls, that can be optimized back into direct calls. Within each
6852 extended basic block (ebb) containing an optimized longcall, it
6853 computes a set of "text actions" that can be performed to remove
6854 the L32R associated with the longcall while optionally preserving
6855 branch target alignments. */
6858 analyze_relocations (struct bfd_link_info *link_info)
6862 bfd_boolean is_relaxable = FALSE;
6864 /* Initialize the per-section relaxation info. */
6865 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6866 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6868 init_xtensa_relax_info (sec);
6871 /* Mark relaxable sections (and count relocations against each one). */
6872 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6873 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6875 if (!find_relaxable_sections (abfd, sec, link_info, &is_relaxable))
6879 /* Bail out if there are no relaxable sections. */
6883 /* Allocate space for source_relocs. */
6884 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6885 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6887 xtensa_relax_info *relax_info;
6889 relax_info = get_xtensa_relax_info (sec);
6890 if (relax_info->is_relaxable_literal_section
6891 || relax_info->is_relaxable_asm_section)
6893 relax_info->src_relocs = (source_reloc *)
6894 bfd_malloc (relax_info->src_count * sizeof (source_reloc));
6897 relax_info->src_count = 0;
6900 /* Collect info on relocations against each relaxable section. */
6901 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6902 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6904 if (!collect_source_relocs (abfd, sec, link_info))
6908 /* Compute the text actions. */
6909 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6910 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6912 if (!compute_text_actions (abfd, sec, link_info))
6920 /* Find all the sections that might be relaxed. The motivation for
6921 this pass is that collect_source_relocs() needs to record _all_ the
6922 relocations that target each relaxable section. That is expensive
6923 and unnecessary unless the target section is actually going to be
6924 relaxed. This pass identifies all such sections by checking if
6925 they have L32Rs pointing to them. In the process, the total number
6926 of relocations targeting each section is also counted so that we
6927 know how much space to allocate for source_relocs against each
6928 relaxable literal section. */
6931 find_relaxable_sections (bfd *abfd,
6933 struct bfd_link_info *link_info,
6934 bfd_boolean *is_relaxable_p)
6936 Elf_Internal_Rela *internal_relocs;
6938 bfd_boolean ok = TRUE;
6940 xtensa_relax_info *source_relax_info;
6941 bfd_boolean is_l32r_reloc;
6943 internal_relocs = retrieve_internal_relocs (abfd, sec,
6944 link_info->keep_memory);
6945 if (internal_relocs == NULL)
6948 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6949 if (contents == NULL && sec->size != 0)
6955 source_relax_info = get_xtensa_relax_info (sec);
6956 for (i = 0; i < sec->reloc_count; i++)
6958 Elf_Internal_Rela *irel = &internal_relocs[i];
6960 asection *target_sec;
6961 xtensa_relax_info *target_relax_info;
6963 /* If this section has not already been marked as "relaxable", and
6964 if it contains any ASM_EXPAND relocations (marking expanded
6965 longcalls) that can be optimized into direct calls, then mark
6966 the section as "relaxable". */
6967 if (source_relax_info
6968 && !source_relax_info->is_relaxable_asm_section
6969 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_EXPAND)
6971 bfd_boolean is_reachable = FALSE;
6972 if (is_resolvable_asm_expansion (abfd, sec, contents, irel,
6973 link_info, &is_reachable)
6976 source_relax_info->is_relaxable_asm_section = TRUE;
6977 *is_relaxable_p = TRUE;
6981 r_reloc_init (&r_rel, abfd, irel, contents,
6982 bfd_get_section_limit (abfd, sec));
6984 target_sec = r_reloc_get_section (&r_rel);
6985 target_relax_info = get_xtensa_relax_info (target_sec);
6986 if (!target_relax_info)
6989 /* Count PC-relative operand relocations against the target section.
6990 Note: The conditions tested here must match the conditions under
6991 which init_source_reloc is called in collect_source_relocs(). */
6992 is_l32r_reloc = FALSE;
6993 if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
6995 xtensa_opcode opcode =
6996 get_relocation_opcode (abfd, sec, contents, irel);
6997 if (opcode != XTENSA_UNDEFINED)
6999 is_l32r_reloc = (opcode == get_l32r_opcode ());
7000 if (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
7002 target_relax_info->src_count++;
7006 if (is_l32r_reloc && r_reloc_is_defined (&r_rel))
7008 /* Mark the target section as relaxable. */
7009 target_relax_info->is_relaxable_literal_section = TRUE;
7010 *is_relaxable_p = TRUE;
7015 release_contents (sec, contents);
7016 release_internal_relocs (sec, internal_relocs);
7021 /* Record _all_ the relocations that point to relaxable sections, and
7022 get rid of ASM_EXPAND relocs by either converting them to
7023 ASM_SIMPLIFY or by removing them. */
7026 collect_source_relocs (bfd *abfd,
7028 struct bfd_link_info *link_info)
7030 Elf_Internal_Rela *internal_relocs;
7032 bfd_boolean ok = TRUE;
7034 bfd_size_type sec_size;
7036 internal_relocs = retrieve_internal_relocs (abfd, sec,
7037 link_info->keep_memory);
7038 if (internal_relocs == NULL)
7041 sec_size = bfd_get_section_limit (abfd, sec);
7042 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7043 if (contents == NULL && sec_size != 0)
7049 /* Record relocations against relaxable literal sections. */
7050 for (i = 0; i < sec->reloc_count; i++)
7052 Elf_Internal_Rela *irel = &internal_relocs[i];
7054 asection *target_sec;
7055 xtensa_relax_info *target_relax_info;
7057 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7059 target_sec = r_reloc_get_section (&r_rel);
7060 target_relax_info = get_xtensa_relax_info (target_sec);
7062 if (target_relax_info
7063 && (target_relax_info->is_relaxable_literal_section
7064 || target_relax_info->is_relaxable_asm_section))
7066 xtensa_opcode opcode = XTENSA_UNDEFINED;
7068 bfd_boolean is_abs_literal = FALSE;
7070 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7072 /* None of the current alternate relocs are PC-relative,
7073 and only PC-relative relocs matter here. However, we
7074 still need to record the opcode for literal
7076 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7077 if (opcode == get_l32r_opcode ())
7079 is_abs_literal = TRUE;
7083 opcode = XTENSA_UNDEFINED;
7085 else if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
7087 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7088 opnd = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7091 if (opcode != XTENSA_UNDEFINED)
7093 int src_next = target_relax_info->src_next++;
7094 source_reloc *s_reloc = &target_relax_info->src_relocs[src_next];
7096 init_source_reloc (s_reloc, sec, &r_rel, opcode, opnd,
7102 /* Now get rid of ASM_EXPAND relocations. At this point, the
7103 src_relocs array for the target literal section may still be
7104 incomplete, but it must at least contain the entries for the L32R
7105 relocations associated with ASM_EXPANDs because they were just
7106 added in the preceding loop over the relocations. */
7108 for (i = 0; i < sec->reloc_count; i++)
7110 Elf_Internal_Rela *irel = &internal_relocs[i];
7111 bfd_boolean is_reachable;
7113 if (!is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
7119 Elf_Internal_Rela *l32r_irel;
7121 asection *target_sec;
7122 xtensa_relax_info *target_relax_info;
7124 /* Mark the source_reloc for the L32R so that it will be
7125 removed in compute_removed_literals(), along with the
7126 associated literal. */
7127 l32r_irel = find_associated_l32r_irel (abfd, sec, contents,
7128 irel, internal_relocs);
7129 if (l32r_irel == NULL)
7132 r_reloc_init (&r_rel, abfd, l32r_irel, contents, sec_size);
7134 target_sec = r_reloc_get_section (&r_rel);
7135 target_relax_info = get_xtensa_relax_info (target_sec);
7137 if (target_relax_info
7138 && (target_relax_info->is_relaxable_literal_section
7139 || target_relax_info->is_relaxable_asm_section))
7141 source_reloc *s_reloc;
7143 /* Search the source_relocs for the entry corresponding to
7144 the l32r_irel. Note: The src_relocs array is not yet
7145 sorted, but it wouldn't matter anyway because we're
7146 searching by source offset instead of target offset. */
7147 s_reloc = find_source_reloc (target_relax_info->src_relocs,
7148 target_relax_info->src_next,
7150 BFD_ASSERT (s_reloc);
7151 s_reloc->is_null = TRUE;
7154 /* Convert this reloc to ASM_SIMPLIFY. */
7155 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
7156 R_XTENSA_ASM_SIMPLIFY);
7157 l32r_irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7159 pin_internal_relocs (sec, internal_relocs);
7163 /* It is resolvable but doesn't reach. We resolve now
7164 by eliminating the relocation -- the call will remain
7165 expanded into L32R/CALLX. */
7166 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7167 pin_internal_relocs (sec, internal_relocs);
7172 release_contents (sec, contents);
7173 release_internal_relocs (sec, internal_relocs);
7178 /* Return TRUE if the asm expansion can be resolved. Generally it can
7179 be resolved on a final link or when a partial link locates it in the
7180 same section as the target. Set "is_reachable" flag if the target of
7181 the call is within the range of a direct call, given the current VMA
7182 for this section and the target section. */
7185 is_resolvable_asm_expansion (bfd *abfd,
7188 Elf_Internal_Rela *irel,
7189 struct bfd_link_info *link_info,
7190 bfd_boolean *is_reachable_p)
7192 asection *target_sec;
7193 bfd_vma target_offset;
7195 xtensa_opcode opcode, direct_call_opcode;
7196 bfd_vma self_address;
7197 bfd_vma dest_address;
7198 bfd_boolean uses_l32r;
7199 bfd_size_type sec_size;
7201 *is_reachable_p = FALSE;
7203 if (contents == NULL)
7206 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
7209 sec_size = bfd_get_section_limit (abfd, sec);
7210 opcode = get_expanded_call_opcode (contents + irel->r_offset,
7211 sec_size - irel->r_offset, &uses_l32r);
7212 /* Optimization of longcalls that use CONST16 is not yet implemented. */
7216 direct_call_opcode = swap_callx_for_call_opcode (opcode);
7217 if (direct_call_opcode == XTENSA_UNDEFINED)
7220 /* Check and see that the target resolves. */
7221 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7222 if (!r_reloc_is_defined (&r_rel))
7225 target_sec = r_reloc_get_section (&r_rel);
7226 target_offset = r_rel.target_offset;
7228 /* If the target is in a shared library, then it doesn't reach. This
7229 isn't supposed to come up because the compiler should never generate
7230 non-PIC calls on systems that use shared libraries, but the linker
7231 shouldn't crash regardless. */
7232 if (!target_sec->output_section)
7235 /* For relocatable sections, we can only simplify when the output
7236 section of the target is the same as the output section of the
7238 if (bfd_link_relocatable (link_info)
7239 && (target_sec->output_section != sec->output_section
7240 || is_reloc_sym_weak (abfd, irel)))
7243 if (target_sec->output_section != sec->output_section)
7245 /* If the two sections are sufficiently far away that relaxation
7246 might take the call out of range, we can't simplify. For
7247 example, a positive displacement call into another memory
7248 could get moved to a lower address due to literal removal,
7249 but the destination won't move, and so the displacment might
7252 If the displacement is negative, assume the destination could
7253 move as far back as the start of the output section. The
7254 self_address will be at least as far into the output section
7255 as it is prior to relaxation.
7257 If the displacement is postive, assume the destination will be in
7258 it's pre-relaxed location (because relaxation only makes sections
7259 smaller). The self_address could go all the way to the beginning
7260 of the output section. */
7262 dest_address = target_sec->output_section->vma;
7263 self_address = sec->output_section->vma;
7265 if (sec->output_section->vma > target_sec->output_section->vma)
7266 self_address += sec->output_offset + irel->r_offset + 3;
7268 dest_address += bfd_get_section_limit (abfd, target_sec->output_section);
7269 /* Call targets should be four-byte aligned. */
7270 dest_address = (dest_address + 3) & ~3;
7275 self_address = (sec->output_section->vma
7276 + sec->output_offset + irel->r_offset + 3);
7277 dest_address = (target_sec->output_section->vma
7278 + target_sec->output_offset + target_offset);
7281 *is_reachable_p = pcrel_reloc_fits (direct_call_opcode, 0,
7282 self_address, dest_address);
7284 if ((self_address >> CALL_SEGMENT_BITS) !=
7285 (dest_address >> CALL_SEGMENT_BITS))
7292 static Elf_Internal_Rela *
7293 find_associated_l32r_irel (bfd *abfd,
7296 Elf_Internal_Rela *other_irel,
7297 Elf_Internal_Rela *internal_relocs)
7301 for (i = 0; i < sec->reloc_count; i++)
7303 Elf_Internal_Rela *irel = &internal_relocs[i];
7305 if (irel == other_irel)
7307 if (irel->r_offset != other_irel->r_offset)
7309 if (is_l32r_relocation (abfd, sec, contents, irel))
7317 static xtensa_opcode *
7318 build_reloc_opcodes (bfd *abfd,
7321 Elf_Internal_Rela *internal_relocs)
7324 xtensa_opcode *reloc_opcodes =
7325 (xtensa_opcode *) bfd_malloc (sizeof (xtensa_opcode) * sec->reloc_count);
7326 for (i = 0; i < sec->reloc_count; i++)
7328 Elf_Internal_Rela *irel = &internal_relocs[i];
7329 reloc_opcodes[i] = get_relocation_opcode (abfd, sec, contents, irel);
7331 return reloc_opcodes;
7334 struct reloc_range_struct
7337 bfd_boolean add; /* TRUE if start of a range, FALSE otherwise. */
7338 /* Original irel index in the array of relocations for a section. */
7339 unsigned irel_index;
7341 typedef struct reloc_range_struct reloc_range;
7343 typedef struct reloc_range_list_entry_struct reloc_range_list_entry;
7344 struct reloc_range_list_entry_struct
7346 reloc_range_list_entry *next;
7347 reloc_range_list_entry *prev;
7348 Elf_Internal_Rela *irel;
7349 xtensa_opcode opcode;
7353 struct reloc_range_list_struct
7355 /* The rest of the structure is only meaningful when ok is TRUE. */
7358 unsigned n_range; /* Number of range markers. */
7359 reloc_range *range; /* Sorted range markers. */
7361 unsigned first; /* Index of a first range element in the list. */
7362 unsigned last; /* One past index of a last range element in the list. */
7364 unsigned n_list; /* Number of list elements. */
7365 reloc_range_list_entry *reloc; /* */
7366 reloc_range_list_entry list_root;
7370 reloc_range_compare (const void *a, const void *b)
7372 const reloc_range *ra = a;
7373 const reloc_range *rb = b;
7375 if (ra->addr != rb->addr)
7376 return ra->addr < rb->addr ? -1 : 1;
7377 if (ra->add != rb->add)
7378 return ra->add ? -1 : 1;
7383 build_reloc_ranges (bfd *abfd, asection *sec,
7385 Elf_Internal_Rela *internal_relocs,
7386 xtensa_opcode *reloc_opcodes,
7387 reloc_range_list *list)
7392 reloc_range *ranges = NULL;
7393 reloc_range_list_entry *reloc =
7394 bfd_malloc (sec->reloc_count * sizeof (*reloc));
7396 memset (list, 0, sizeof (*list));
7399 for (i = 0; i < sec->reloc_count; i++)
7401 Elf_Internal_Rela *irel = &internal_relocs[i];
7402 int r_type = ELF32_R_TYPE (irel->r_info);
7403 reloc_howto_type *howto = &elf_howto_table[r_type];
7406 if (r_type == R_XTENSA_ASM_SIMPLIFY
7407 || r_type == R_XTENSA_32_PCREL
7408 || !howto->pc_relative)
7411 r_reloc_init (&r_rel, abfd, irel, contents,
7412 bfd_get_section_limit (abfd, sec));
7414 if (r_reloc_get_section (&r_rel) != sec)
7419 max_n = (max_n + 2) * 2;
7420 ranges = bfd_realloc (ranges, max_n * sizeof (*ranges));
7423 ranges[n].addr = irel->r_offset;
7424 ranges[n + 1].addr = r_rel.target_offset;
7426 ranges[n].add = ranges[n].addr < ranges[n + 1].addr;
7427 ranges[n + 1].add = !ranges[n].add;
7429 ranges[n].irel_index = i;
7430 ranges[n + 1].irel_index = i;
7434 reloc[i].irel = irel;
7436 /* Every relocation won't possibly be checked in the optimized version of
7437 check_section_ebb_pcrels_fit, so this needs to be done here. */
7438 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7440 /* None of the current alternate relocs are PC-relative,
7441 and only PC-relative relocs matter here. */
7445 xtensa_opcode opcode;
7449 opcode = reloc_opcodes[i];
7451 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7453 if (opcode == XTENSA_UNDEFINED)
7459 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7460 if (opnum == XTENSA_UNDEFINED)
7466 /* Record relocation opcode and opnum as we've calculated them
7467 anyway and they won't change. */
7468 reloc[i].opcode = opcode;
7469 reloc[i].opnum = opnum;
7475 ranges = bfd_realloc (ranges, n * sizeof (*ranges));
7476 qsort (ranges, n, sizeof (*ranges), reloc_range_compare);
7479 list->range = ranges;
7480 list->reloc = reloc;
7481 list->list_root.prev = &list->list_root;
7482 list->list_root.next = &list->list_root;
7491 static void reloc_range_list_append (reloc_range_list *list,
7492 unsigned irel_index)
7494 reloc_range_list_entry *entry = list->reloc + irel_index;
7496 entry->prev = list->list_root.prev;
7497 entry->next = &list->list_root;
7498 entry->prev->next = entry;
7499 entry->next->prev = entry;
7503 static void reloc_range_list_remove (reloc_range_list *list,
7504 unsigned irel_index)
7506 reloc_range_list_entry *entry = list->reloc + irel_index;
7508 entry->next->prev = entry->prev;
7509 entry->prev->next = entry->next;
7513 /* Update relocation list object so that it lists all relocations that cross
7514 [first; last] range. Range bounds should not decrease with successive
7516 static void reloc_range_list_update_range (reloc_range_list *list,
7517 bfd_vma first, bfd_vma last)
7519 /* This should not happen: EBBs are iterated from lower addresses to higher.
7520 But even if that happens there's no need to break: just flush current list
7521 and start from scratch. */
7522 if ((list->last > 0 && list->range[list->last - 1].addr > last) ||
7523 (list->first > 0 && list->range[list->first - 1].addr >= first))
7528 list->list_root.next = &list->list_root;
7529 list->list_root.prev = &list->list_root;
7530 fprintf (stderr, "%s: move backwards requested\n", __func__);
7533 for (; list->last < list->n_range &&
7534 list->range[list->last].addr <= last; ++list->last)
7535 if (list->range[list->last].add)
7536 reloc_range_list_append (list, list->range[list->last].irel_index);
7538 for (; list->first < list->n_range &&
7539 list->range[list->first].addr < first; ++list->first)
7540 if (!list->range[list->first].add)
7541 reloc_range_list_remove (list, list->range[list->first].irel_index);
7544 static void free_reloc_range_list (reloc_range_list *list)
7550 /* The compute_text_actions function will build a list of potential
7551 transformation actions for code in the extended basic block of each
7552 longcall that is optimized to a direct call. From this list we
7553 generate a set of actions to actually perform that optimizes for
7554 space and, if not using size_opt, maintains branch target
7557 These actions to be performed are placed on a per-section list.
7558 The actual changes are performed by relax_section() in the second
7562 compute_text_actions (bfd *abfd,
7564 struct bfd_link_info *link_info)
7566 xtensa_opcode *reloc_opcodes = NULL;
7567 xtensa_relax_info *relax_info;
7569 Elf_Internal_Rela *internal_relocs;
7570 bfd_boolean ok = TRUE;
7572 property_table_entry *prop_table = 0;
7574 bfd_size_type sec_size;
7575 reloc_range_list relevant_relocs;
7577 relax_info = get_xtensa_relax_info (sec);
7578 BFD_ASSERT (relax_info);
7579 BFD_ASSERT (relax_info->src_next == relax_info->src_count);
7581 /* Do nothing if the section contains no optimized longcalls. */
7582 if (!relax_info->is_relaxable_asm_section)
7585 internal_relocs = retrieve_internal_relocs (abfd, sec,
7586 link_info->keep_memory);
7588 if (internal_relocs)
7589 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
7590 internal_reloc_compare);
7592 sec_size = bfd_get_section_limit (abfd, sec);
7593 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7594 if (contents == NULL && sec_size != 0)
7600 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
7601 XTENSA_PROP_SEC_NAME, FALSE);
7608 /* Precompute the opcode for each relocation. */
7609 reloc_opcodes = build_reloc_opcodes (abfd, sec, contents, internal_relocs);
7611 build_reloc_ranges (abfd, sec, contents, internal_relocs, reloc_opcodes,
7614 for (i = 0; i < sec->reloc_count; i++)
7616 Elf_Internal_Rela *irel = &internal_relocs[i];
7618 property_table_entry *the_entry;
7621 ebb_constraint ebb_table;
7622 bfd_size_type simplify_size;
7624 if (irel && ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_SIMPLIFY)
7626 r_offset = irel->r_offset;
7628 simplify_size = get_asm_simplify_size (contents, sec_size, r_offset);
7629 if (simplify_size == 0)
7632 /* xgettext:c-format */
7633 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction for "
7634 "XTENSA_ASM_SIMPLIFY relocation; "
7635 "possible configuration mismatch"),
7636 sec->owner, sec, (uint64_t) r_offset);
7640 /* If the instruction table is not around, then don't do this
7642 the_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7643 sec->vma + irel->r_offset);
7644 if (the_entry == NULL || XTENSA_NO_NOP_REMOVAL)
7646 text_action_add (&relax_info->action_list,
7647 ta_convert_longcall, sec, r_offset,
7652 /* If the next longcall happens to be at the same address as an
7653 unreachable section of size 0, then skip forward. */
7654 ptbl_idx = the_entry - prop_table;
7655 while ((the_entry->flags & XTENSA_PROP_UNREACHABLE)
7656 && the_entry->size == 0
7657 && ptbl_idx + 1 < ptblsize
7658 && (prop_table[ptbl_idx + 1].address
7659 == prop_table[ptbl_idx].address))
7665 if (the_entry->flags & XTENSA_PROP_NO_TRANSFORM)
7666 /* NO_REORDER is OK */
7669 init_ebb_constraint (&ebb_table);
7670 ebb = &ebb_table.ebb;
7671 init_ebb (ebb, sec, contents, sec_size, prop_table, ptblsize,
7672 internal_relocs, sec->reloc_count);
7673 ebb->start_offset = r_offset + simplify_size;
7674 ebb->end_offset = r_offset + simplify_size;
7675 ebb->start_ptbl_idx = ptbl_idx;
7676 ebb->end_ptbl_idx = ptbl_idx;
7677 ebb->start_reloc_idx = i;
7678 ebb->end_reloc_idx = i;
7680 if (!extend_ebb_bounds (ebb)
7681 || !compute_ebb_proposed_actions (&ebb_table)
7682 || !compute_ebb_actions (&ebb_table)
7683 || !check_section_ebb_pcrels_fit (abfd, sec, contents,
7686 &ebb_table, reloc_opcodes)
7687 || !check_section_ebb_reduces (&ebb_table))
7689 /* If anything goes wrong or we get unlucky and something does
7690 not fit, with our plan because of expansion between
7691 critical branches, just convert to a NOP. */
7693 text_action_add (&relax_info->action_list,
7694 ta_convert_longcall, sec, r_offset, 0);
7695 i = ebb_table.ebb.end_reloc_idx;
7696 free_ebb_constraint (&ebb_table);
7700 text_action_add_proposed (&relax_info->action_list, &ebb_table, sec);
7702 /* Update the index so we do not go looking at the relocations
7703 we have already processed. */
7704 i = ebb_table.ebb.end_reloc_idx;
7705 free_ebb_constraint (&ebb_table);
7708 free_reloc_range_list (&relevant_relocs);
7711 if (action_list_count (&relax_info->action_list))
7712 print_action_list (stderr, &relax_info->action_list);
7716 release_contents (sec, contents);
7717 release_internal_relocs (sec, internal_relocs);
7721 free (reloc_opcodes);
7727 /* Do not widen an instruction if it is preceeded by a
7728 loop opcode. It might cause misalignment. */
7731 prev_instr_is_a_loop (bfd_byte *contents,
7732 bfd_size_type content_length,
7733 bfd_size_type offset)
7735 xtensa_opcode prev_opcode;
7739 prev_opcode = insn_decode_opcode (contents, content_length, offset-3, 0);
7740 return (xtensa_opcode_is_loop (xtensa_default_isa, prev_opcode) == 1);
7744 /* Find all of the possible actions for an extended basic block. */
7747 compute_ebb_proposed_actions (ebb_constraint *ebb_table)
7749 const ebb_t *ebb = &ebb_table->ebb;
7750 unsigned rel_idx = ebb->start_reloc_idx;
7751 property_table_entry *entry, *start_entry, *end_entry;
7753 xtensa_isa isa = xtensa_default_isa;
7755 static xtensa_insnbuf insnbuf = NULL;
7756 static xtensa_insnbuf slotbuf = NULL;
7758 if (insnbuf == NULL)
7760 insnbuf = xtensa_insnbuf_alloc (isa);
7761 slotbuf = xtensa_insnbuf_alloc (isa);
7764 start_entry = &ebb->ptbl[ebb->start_ptbl_idx];
7765 end_entry = &ebb->ptbl[ebb->end_ptbl_idx];
7767 for (entry = start_entry; entry <= end_entry; entry++)
7769 bfd_vma start_offset, end_offset;
7770 bfd_size_type insn_len;
7772 start_offset = entry->address - ebb->sec->vma;
7773 end_offset = entry->address + entry->size - ebb->sec->vma;
7775 if (entry == start_entry)
7776 start_offset = ebb->start_offset;
7777 if (entry == end_entry)
7778 end_offset = ebb->end_offset;
7779 offset = start_offset;
7781 if (offset == entry->address - ebb->sec->vma
7782 && (entry->flags & XTENSA_PROP_INSN_BRANCH_TARGET) != 0)
7784 enum ebb_target_enum align_type = EBB_DESIRE_TGT_ALIGN;
7785 BFD_ASSERT (offset != end_offset);
7786 if (offset == end_offset)
7789 insn_len = insn_decode_len (ebb->contents, ebb->content_length,
7794 if (check_branch_target_aligned_address (offset, insn_len))
7795 align_type = EBB_REQUIRE_TGT_ALIGN;
7797 ebb_propose_action (ebb_table, align_type, 0,
7798 ta_none, offset, 0, TRUE);
7801 while (offset != end_offset)
7803 Elf_Internal_Rela *irel;
7804 xtensa_opcode opcode;
7806 while (rel_idx < ebb->end_reloc_idx
7807 && (ebb->relocs[rel_idx].r_offset < offset
7808 || (ebb->relocs[rel_idx].r_offset == offset
7809 && (ELF32_R_TYPE (ebb->relocs[rel_idx].r_info)
7810 != R_XTENSA_ASM_SIMPLIFY))))
7813 /* Check for longcall. */
7814 irel = &ebb->relocs[rel_idx];
7815 if (irel->r_offset == offset
7816 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY)
7818 bfd_size_type simplify_size;
7820 simplify_size = get_asm_simplify_size (ebb->contents,
7821 ebb->content_length,
7823 if (simplify_size == 0)
7826 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7827 ta_convert_longcall, offset, 0, TRUE);
7829 offset += simplify_size;
7833 if (offset + MIN_INSN_LENGTH > ebb->content_length)
7835 xtensa_insnbuf_from_chars (isa, insnbuf, &ebb->contents[offset],
7836 ebb->content_length - offset);
7837 fmt = xtensa_format_decode (isa, insnbuf);
7838 if (fmt == XTENSA_UNDEFINED)
7840 insn_len = xtensa_format_length (isa, fmt);
7841 if (insn_len == (bfd_size_type) XTENSA_UNDEFINED)
7844 if (xtensa_format_num_slots (isa, fmt) != 1)
7850 xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
7851 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
7852 if (opcode == XTENSA_UNDEFINED)
7855 if ((entry->flags & XTENSA_PROP_INSN_NO_DENSITY) == 0
7856 && (entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
7857 && can_narrow_instruction (slotbuf, fmt, opcode) != 0)
7859 /* Add an instruction narrow action. */
7860 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7861 ta_narrow_insn, offset, 0, FALSE);
7863 else if ((entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
7864 && can_widen_instruction (slotbuf, fmt, opcode) != 0
7865 && ! prev_instr_is_a_loop (ebb->contents,
7866 ebb->content_length, offset))
7868 /* Add an instruction widen action. */
7869 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7870 ta_widen_insn, offset, 0, FALSE);
7872 else if (xtensa_opcode_is_loop (xtensa_default_isa, opcode) == 1)
7874 /* Check for branch targets. */
7875 ebb_propose_action (ebb_table, EBB_REQUIRE_LOOP_ALIGN, 0,
7876 ta_none, offset, 0, TRUE);
7883 if (ebb->ends_unreachable)
7885 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7886 ta_fill, ebb->end_offset, 0, TRUE);
7893 /* xgettext:c-format */
7894 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
7895 "possible configuration mismatch"),
7896 ebb->sec->owner, ebb->sec, (uint64_t) offset);
7901 /* After all of the information has collected about the
7902 transformations possible in an EBB, compute the appropriate actions
7903 here in compute_ebb_actions. We still must check later to make
7904 sure that the actions do not break any relocations. The algorithm
7905 used here is pretty greedy. Basically, it removes as many no-ops
7906 as possible so that the end of the EBB has the same alignment
7907 characteristics as the original. First, it uses narrowing, then
7908 fill space at the end of the EBB, and finally widenings. If that
7909 does not work, it tries again with one fewer no-op removed. The
7910 optimization will only be performed if all of the branch targets
7911 that were aligned before transformation are also aligned after the
7914 When the size_opt flag is set, ignore the branch target alignments,
7915 narrow all wide instructions, and remove all no-ops unless the end
7916 of the EBB prevents it. */
7919 compute_ebb_actions (ebb_constraint *ebb_table)
7923 int removed_bytes = 0;
7924 ebb_t *ebb = &ebb_table->ebb;
7925 unsigned seg_idx_start = 0;
7926 unsigned seg_idx_end = 0;
7928 /* We perform this like the assembler relaxation algorithm: Start by
7929 assuming all instructions are narrow and all no-ops removed; then
7932 /* For each segment of this that has a solid constraint, check to
7933 see if there are any combinations that will keep the constraint.
7935 for (seg_idx_end = 0; seg_idx_end < ebb_table->action_count; seg_idx_end++)
7937 bfd_boolean requires_text_end_align = FALSE;
7938 unsigned longcall_count = 0;
7939 unsigned longcall_convert_count = 0;
7940 unsigned narrowable_count = 0;
7941 unsigned narrowable_convert_count = 0;
7942 unsigned widenable_count = 0;
7943 unsigned widenable_convert_count = 0;
7945 proposed_action *action = NULL;
7946 int align = (1 << ebb_table->ebb.sec->alignment_power);
7948 seg_idx_start = seg_idx_end;
7950 for (i = seg_idx_start; i < ebb_table->action_count; i++)
7952 action = &ebb_table->actions[i];
7953 if (action->action == ta_convert_longcall)
7955 if (action->action == ta_narrow_insn)
7957 if (action->action == ta_widen_insn)
7959 if (action->action == ta_fill)
7961 if (action->align_type == EBB_REQUIRE_LOOP_ALIGN)
7963 if (action->align_type == EBB_REQUIRE_TGT_ALIGN
7964 && !elf32xtensa_size_opt)
7969 if (seg_idx_end == ebb_table->action_count && !ebb->ends_unreachable)
7970 requires_text_end_align = TRUE;
7972 if (elf32xtensa_size_opt && !requires_text_end_align
7973 && action->align_type != EBB_REQUIRE_LOOP_ALIGN
7974 && action->align_type != EBB_REQUIRE_TGT_ALIGN)
7976 longcall_convert_count = longcall_count;
7977 narrowable_convert_count = narrowable_count;
7978 widenable_convert_count = 0;
7982 /* There is a constraint. Convert the max number of longcalls. */
7983 narrowable_convert_count = 0;
7984 longcall_convert_count = 0;
7985 widenable_convert_count = 0;
7987 for (j = 0; j < longcall_count; j++)
7989 int removed = (longcall_count - j) * 3 & (align - 1);
7990 unsigned desire_narrow = (align - removed) & (align - 1);
7991 unsigned desire_widen = removed;
7992 if (desire_narrow <= narrowable_count)
7994 narrowable_convert_count = desire_narrow;
7995 narrowable_convert_count +=
7996 (align * ((narrowable_count - narrowable_convert_count)
7998 longcall_convert_count = (longcall_count - j);
7999 widenable_convert_count = 0;
8002 if (desire_widen <= widenable_count && !elf32xtensa_size_opt)
8004 narrowable_convert_count = 0;
8005 longcall_convert_count = longcall_count - j;
8006 widenable_convert_count = desire_widen;
8012 /* Now the number of conversions are saved. Do them. */
8013 for (i = seg_idx_start; i < seg_idx_end; i++)
8015 action = &ebb_table->actions[i];
8016 switch (action->action)
8018 case ta_convert_longcall:
8019 if (longcall_convert_count != 0)
8021 action->action = ta_remove_longcall;
8022 action->do_action = TRUE;
8023 action->removed_bytes += 3;
8024 longcall_convert_count--;
8027 case ta_narrow_insn:
8028 if (narrowable_convert_count != 0)
8030 action->do_action = TRUE;
8031 action->removed_bytes += 1;
8032 narrowable_convert_count--;
8036 if (widenable_convert_count != 0)
8038 action->do_action = TRUE;
8039 action->removed_bytes -= 1;
8040 widenable_convert_count--;
8049 /* Now we move on to some local opts. Try to remove each of the
8050 remaining longcalls. */
8052 if (ebb_table->ebb.ends_section || ebb_table->ebb.ends_unreachable)
8055 for (i = 0; i < ebb_table->action_count; i++)
8057 int old_removed_bytes = removed_bytes;
8058 proposed_action *action = &ebb_table->actions[i];
8060 if (action->do_action && action->action == ta_convert_longcall)
8062 bfd_boolean bad_alignment = FALSE;
8064 for (j = i + 1; j < ebb_table->action_count; j++)
8066 proposed_action *new_action = &ebb_table->actions[j];
8067 bfd_vma offset = new_action->offset;
8068 if (new_action->align_type == EBB_REQUIRE_TGT_ALIGN)
8070 if (!check_branch_target_aligned
8071 (ebb_table->ebb.contents,
8072 ebb_table->ebb.content_length,
8073 offset, offset - removed_bytes))
8075 bad_alignment = TRUE;
8079 if (new_action->align_type == EBB_REQUIRE_LOOP_ALIGN)
8081 if (!check_loop_aligned (ebb_table->ebb.contents,
8082 ebb_table->ebb.content_length,
8084 offset - removed_bytes))
8086 bad_alignment = TRUE;
8090 if (new_action->action == ta_narrow_insn
8091 && !new_action->do_action
8092 && ebb_table->ebb.sec->alignment_power == 2)
8094 /* Narrow an instruction and we are done. */
8095 new_action->do_action = TRUE;
8096 new_action->removed_bytes += 1;
8097 bad_alignment = FALSE;
8100 if (new_action->action == ta_widen_insn
8101 && new_action->do_action
8102 && ebb_table->ebb.sec->alignment_power == 2)
8104 /* Narrow an instruction and we are done. */
8105 new_action->do_action = FALSE;
8106 new_action->removed_bytes += 1;
8107 bad_alignment = FALSE;
8110 if (new_action->do_action)
8111 removed_bytes += new_action->removed_bytes;
8115 action->removed_bytes += 3;
8116 action->action = ta_remove_longcall;
8117 action->do_action = TRUE;
8120 removed_bytes = old_removed_bytes;
8121 if (action->do_action)
8122 removed_bytes += action->removed_bytes;
8127 for (i = 0; i < ebb_table->action_count; ++i)
8129 proposed_action *action = &ebb_table->actions[i];
8130 if (action->do_action)
8131 removed_bytes += action->removed_bytes;
8134 if ((removed_bytes % (1 << ebb_table->ebb.sec->alignment_power)) != 0
8135 && ebb->ends_unreachable)
8137 proposed_action *action;
8141 BFD_ASSERT (ebb_table->action_count != 0);
8142 action = &ebb_table->actions[ebb_table->action_count - 1];
8143 BFD_ASSERT (action->action == ta_fill);
8144 BFD_ASSERT (ebb->ends_unreachable->flags & XTENSA_PROP_UNREACHABLE);
8146 extra_space = xtensa_compute_fill_extra_space (ebb->ends_unreachable);
8147 br = action->removed_bytes + removed_bytes + extra_space;
8148 br = br & ((1 << ebb->sec->alignment_power ) - 1);
8150 action->removed_bytes = extra_space - br;
8156 /* The xlate_map is a sorted array of address mappings designed to
8157 answer the offset_with_removed_text() query with a binary search instead
8158 of a linear search through the section's action_list. */
8160 typedef struct xlate_map_entry xlate_map_entry_t;
8161 typedef struct xlate_map xlate_map_t;
8163 struct xlate_map_entry
8165 bfd_vma orig_address;
8166 bfd_vma new_address;
8172 unsigned entry_count;
8173 xlate_map_entry_t *entry;
8178 xlate_compare (const void *a_v, const void *b_v)
8180 const xlate_map_entry_t *a = (const xlate_map_entry_t *) a_v;
8181 const xlate_map_entry_t *b = (const xlate_map_entry_t *) b_v;
8182 if (a->orig_address < b->orig_address)
8184 if (a->orig_address > (b->orig_address + b->size - 1))
8191 xlate_offset_with_removed_text (const xlate_map_t *map,
8192 text_action_list *action_list,
8196 xlate_map_entry_t *e;
8197 struct xlate_map_entry se;
8200 return offset_with_removed_text (action_list, offset);
8202 if (map->entry_count == 0)
8205 se.orig_address = offset;
8206 r = bsearch (&se, map->entry, map->entry_count,
8207 sizeof (xlate_map_entry_t), &xlate_compare);
8208 e = (xlate_map_entry_t *) r;
8210 /* There could be a jump past the end of the section,
8211 allow it using the last xlate map entry to translate its address. */
8214 e = map->entry + map->entry_count - 1;
8215 if (xlate_compare (&se, e) <= 0)
8218 BFD_ASSERT (e != NULL);
8221 return e->new_address - e->orig_address + offset;
8224 typedef struct xlate_map_context_struct xlate_map_context;
8225 struct xlate_map_context_struct
8228 xlate_map_entry_t *current_entry;
8233 xlate_map_fn (splay_tree_node node, void *p)
8235 text_action *r = (text_action *)node->value;
8236 xlate_map_context *ctx = p;
8237 unsigned orig_size = 0;
8242 case ta_remove_insn:
8243 case ta_convert_longcall:
8244 case ta_remove_literal:
8245 case ta_add_literal:
8247 case ta_remove_longcall:
8250 case ta_narrow_insn:
8259 ctx->current_entry->size =
8260 r->offset + orig_size - ctx->current_entry->orig_address;
8261 if (ctx->current_entry->size != 0)
8263 ctx->current_entry++;
8264 ctx->map->entry_count++;
8266 ctx->current_entry->orig_address = r->offset + orig_size;
8267 ctx->removed += r->removed_bytes;
8268 ctx->current_entry->new_address = r->offset + orig_size - ctx->removed;
8269 ctx->current_entry->size = 0;
8273 /* Build a binary searchable offset translation map from a section's
8276 static xlate_map_t *
8277 build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
8279 text_action_list *action_list = &relax_info->action_list;
8280 unsigned num_actions = 0;
8281 xlate_map_context ctx;
8283 ctx.map = (xlate_map_t *) bfd_malloc (sizeof (xlate_map_t));
8285 if (ctx.map == NULL)
8288 num_actions = action_list_count (action_list);
8289 ctx.map->entry = (xlate_map_entry_t *)
8290 bfd_malloc (sizeof (xlate_map_entry_t) * (num_actions + 1));
8291 if (ctx.map->entry == NULL)
8296 ctx.map->entry_count = 0;
8299 ctx.current_entry = &ctx.map->entry[0];
8301 ctx.current_entry->orig_address = 0;
8302 ctx.current_entry->new_address = 0;
8303 ctx.current_entry->size = 0;
8305 splay_tree_foreach (action_list->tree, xlate_map_fn, &ctx);
8307 ctx.current_entry->size = (bfd_get_section_limit (sec->owner, sec)
8308 - ctx.current_entry->orig_address);
8309 if (ctx.current_entry->size != 0)
8310 ctx.map->entry_count++;
8316 /* Free an offset translation map. */
8319 free_xlate_map (xlate_map_t *map)
8321 if (map && map->entry)
8328 /* Use check_section_ebb_pcrels_fit to make sure that all of the
8329 relocations in a section will fit if a proposed set of actions
8333 check_section_ebb_pcrels_fit (bfd *abfd,
8336 Elf_Internal_Rela *internal_relocs,
8337 reloc_range_list *relevant_relocs,
8338 const ebb_constraint *constraint,
8339 const xtensa_opcode *reloc_opcodes)
8342 unsigned n = sec->reloc_count;
8343 Elf_Internal_Rela *irel;
8344 xlate_map_t *xmap = NULL;
8345 bfd_boolean ok = TRUE;
8346 xtensa_relax_info *relax_info;
8347 reloc_range_list_entry *entry = NULL;
8349 relax_info = get_xtensa_relax_info (sec);
8351 if (relax_info && sec->reloc_count > 100)
8353 xmap = build_xlate_map (sec, relax_info);
8354 /* NULL indicates out of memory, but the slow version
8355 can still be used. */
8358 if (relevant_relocs && constraint->action_count)
8360 if (!relevant_relocs->ok)
8367 bfd_vma min_offset, max_offset;
8368 min_offset = max_offset = constraint->actions[0].offset;
8370 for (i = 1; i < constraint->action_count; ++i)
8372 proposed_action *action = &constraint->actions[i];
8373 bfd_vma offset = action->offset;
8375 if (offset < min_offset)
8376 min_offset = offset;
8377 if (offset > max_offset)
8378 max_offset = offset;
8380 reloc_range_list_update_range (relevant_relocs, min_offset,
8382 n = relevant_relocs->n_list;
8383 entry = &relevant_relocs->list_root;
8388 relevant_relocs = NULL;
8391 for (i = 0; i < n; i++)
8394 bfd_vma orig_self_offset, orig_target_offset;
8395 bfd_vma self_offset, target_offset;
8397 reloc_howto_type *howto;
8398 int self_removed_bytes, target_removed_bytes;
8400 if (relevant_relocs)
8402 entry = entry->next;
8407 irel = internal_relocs + i;
8409 r_type = ELF32_R_TYPE (irel->r_info);
8411 howto = &elf_howto_table[r_type];
8412 /* We maintain the required invariant: PC-relative relocations
8413 that fit before linking must fit after linking. Thus we only
8414 need to deal with relocations to the same section that are
8416 if (r_type == R_XTENSA_ASM_SIMPLIFY
8417 || r_type == R_XTENSA_32_PCREL
8418 || !howto->pc_relative)
8421 r_reloc_init (&r_rel, abfd, irel, contents,
8422 bfd_get_section_limit (abfd, sec));
8424 if (r_reloc_get_section (&r_rel) != sec)
8427 orig_self_offset = irel->r_offset;
8428 orig_target_offset = r_rel.target_offset;
8430 self_offset = orig_self_offset;
8431 target_offset = orig_target_offset;
8436 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8439 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8440 orig_target_offset);
8443 self_removed_bytes = 0;
8444 target_removed_bytes = 0;
8446 for (j = 0; j < constraint->action_count; ++j)
8448 proposed_action *action = &constraint->actions[j];
8449 bfd_vma offset = action->offset;
8450 int removed_bytes = action->removed_bytes;
8451 if (offset < orig_self_offset
8452 || (offset == orig_self_offset && action->action == ta_fill
8453 && action->removed_bytes < 0))
8454 self_removed_bytes += removed_bytes;
8455 if (offset < orig_target_offset
8456 || (offset == orig_target_offset && action->action == ta_fill
8457 && action->removed_bytes < 0))
8458 target_removed_bytes += removed_bytes;
8460 self_offset -= self_removed_bytes;
8461 target_offset -= target_removed_bytes;
8463 /* Try to encode it. Get the operand and check. */
8464 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
8466 /* None of the current alternate relocs are PC-relative,
8467 and only PC-relative relocs matter here. */
8471 xtensa_opcode opcode;
8474 if (relevant_relocs)
8476 opcode = entry->opcode;
8477 opnum = entry->opnum;
8482 opcode = reloc_opcodes[relevant_relocs ?
8483 (unsigned)(entry - relevant_relocs->reloc) : i];
8485 opcode = get_relocation_opcode (abfd, sec, contents, irel);
8486 if (opcode == XTENSA_UNDEFINED)
8492 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
8493 if (opnum == XTENSA_UNDEFINED)
8500 if (!pcrel_reloc_fits (opcode, opnum, self_offset, target_offset))
8509 free_xlate_map (xmap);
8516 check_section_ebb_reduces (const ebb_constraint *constraint)
8521 for (i = 0; i < constraint->action_count; i++)
8523 const proposed_action *action = &constraint->actions[i];
8524 if (action->do_action)
8525 removed += action->removed_bytes;
8535 text_action_add_proposed (text_action_list *l,
8536 const ebb_constraint *ebb_table,
8541 for (i = 0; i < ebb_table->action_count; i++)
8543 proposed_action *action = &ebb_table->actions[i];
8545 if (!action->do_action)
8547 switch (action->action)
8549 case ta_remove_insn:
8550 case ta_remove_longcall:
8551 case ta_convert_longcall:
8552 case ta_narrow_insn:
8555 case ta_remove_literal:
8556 text_action_add (l, action->action, sec, action->offset,
8557 action->removed_bytes);
8570 xtensa_compute_fill_extra_space (property_table_entry *entry)
8572 int fill_extra_space;
8577 if ((entry->flags & XTENSA_PROP_UNREACHABLE) == 0)
8580 fill_extra_space = entry->size;
8581 if ((entry->flags & XTENSA_PROP_ALIGN) != 0)
8583 /* Fill bytes for alignment:
8584 (2**n)-1 - (addr + (2**n)-1) & (2**n -1) */
8585 int pow = GET_XTENSA_PROP_ALIGNMENT (entry->flags);
8586 int nsm = (1 << pow) - 1;
8587 bfd_vma addr = entry->address + entry->size;
8588 bfd_vma align_fill = nsm - ((addr + nsm) & nsm);
8589 fill_extra_space += align_fill;
8591 return fill_extra_space;
8595 /* First relaxation pass. */
8597 /* If the section contains relaxable literals, check each literal to
8598 see if it has the same value as another literal that has already
8599 been seen, either in the current section or a previous one. If so,
8600 add an entry to the per-section list of removed literals. The
8601 actual changes are deferred until the next pass. */
8604 compute_removed_literals (bfd *abfd,
8606 struct bfd_link_info *link_info,
8607 value_map_hash_table *values)
8609 xtensa_relax_info *relax_info;
8611 Elf_Internal_Rela *internal_relocs;
8612 source_reloc *src_relocs, *rel;
8613 bfd_boolean ok = TRUE;
8614 property_table_entry *prop_table = NULL;
8617 bfd_boolean last_loc_is_prev = FALSE;
8618 bfd_vma last_target_offset = 0;
8619 section_cache_t target_sec_cache;
8620 bfd_size_type sec_size;
8622 init_section_cache (&target_sec_cache);
8624 /* Do nothing if it is not a relaxable literal section. */
8625 relax_info = get_xtensa_relax_info (sec);
8626 BFD_ASSERT (relax_info);
8627 if (!relax_info->is_relaxable_literal_section)
8630 internal_relocs = retrieve_internal_relocs (abfd, sec,
8631 link_info->keep_memory);
8633 sec_size = bfd_get_section_limit (abfd, sec);
8634 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
8635 if (contents == NULL && sec_size != 0)
8641 /* Sort the source_relocs by target offset. */
8642 src_relocs = relax_info->src_relocs;
8643 qsort (src_relocs, relax_info->src_count,
8644 sizeof (source_reloc), source_reloc_compare);
8645 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
8646 internal_reloc_compare);
8648 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
8649 XTENSA_PROP_SEC_NAME, FALSE);
8657 for (i = 0; i < relax_info->src_count; i++)
8659 Elf_Internal_Rela *irel = NULL;
8661 rel = &src_relocs[i];
8662 if (get_l32r_opcode () != rel->opcode)
8664 irel = get_irel_at_offset (sec, internal_relocs,
8665 rel->r_rel.target_offset);
8667 /* If the relocation on this is not a simple R_XTENSA_32 or
8668 R_XTENSA_PLT then do not consider it. This may happen when
8669 the difference of two symbols is used in a literal. */
8670 if (irel && (ELF32_R_TYPE (irel->r_info) != R_XTENSA_32
8671 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_PLT))
8674 /* If the target_offset for this relocation is the same as the
8675 previous relocation, then we've already considered whether the
8676 literal can be coalesced. Skip to the next one.... */
8677 if (i != 0 && prev_i != -1
8678 && src_relocs[i-1].r_rel.target_offset == rel->r_rel.target_offset)
8682 if (last_loc_is_prev &&
8683 last_target_offset + 4 != rel->r_rel.target_offset)
8684 last_loc_is_prev = FALSE;
8686 /* Check if the relocation was from an L32R that is being removed
8687 because a CALLX was converted to a direct CALL, and check if
8688 there are no other relocations to the literal. */
8689 if (is_removable_literal (rel, i, src_relocs, relax_info->src_count,
8690 sec, prop_table, ptblsize))
8692 if (!remove_dead_literal (abfd, sec, link_info, internal_relocs,
8693 irel, rel, prop_table, ptblsize))
8698 last_target_offset = rel->r_rel.target_offset;
8702 if (!identify_literal_placement (abfd, sec, contents, link_info,
8704 &last_loc_is_prev, irel,
8705 relax_info->src_count - i, rel,
8706 prop_table, ptblsize,
8707 &target_sec_cache, rel->is_abs_literal))
8712 last_target_offset = rel->r_rel.target_offset;
8716 print_removed_literals (stderr, &relax_info->removed_list);
8717 print_action_list (stderr, &relax_info->action_list);
8723 free_section_cache (&target_sec_cache);
8725 release_contents (sec, contents);
8726 release_internal_relocs (sec, internal_relocs);
8731 static Elf_Internal_Rela *
8732 get_irel_at_offset (asection *sec,
8733 Elf_Internal_Rela *internal_relocs,
8737 Elf_Internal_Rela *irel;
8739 Elf_Internal_Rela key;
8741 if (!internal_relocs)
8744 key.r_offset = offset;
8745 irel = bsearch (&key, internal_relocs, sec->reloc_count,
8746 sizeof (Elf_Internal_Rela), internal_reloc_matches);
8750 /* bsearch does not guarantee which will be returned if there are
8751 multiple matches. We need the first that is not an alignment. */
8752 i = irel - internal_relocs;
8755 if (internal_relocs[i-1].r_offset != offset)
8759 for ( ; i < sec->reloc_count; i++)
8761 irel = &internal_relocs[i];
8762 r_type = ELF32_R_TYPE (irel->r_info);
8763 if (irel->r_offset == offset && r_type != R_XTENSA_NONE)
8772 is_removable_literal (const source_reloc *rel,
8774 const source_reloc *src_relocs,
8777 property_table_entry *prop_table,
8780 const source_reloc *curr_rel;
8781 property_table_entry *entry;
8786 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8787 sec->vma + rel->r_rel.target_offset);
8788 if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
8791 for (++i; i < src_count; ++i)
8793 curr_rel = &src_relocs[i];
8794 /* If all others have the same target offset.... */
8795 if (curr_rel->r_rel.target_offset != rel->r_rel.target_offset)
8798 if (!curr_rel->is_null
8799 && !xtensa_is_property_section (curr_rel->source_sec)
8800 && !(curr_rel->source_sec->flags & SEC_DEBUGGING))
8808 remove_dead_literal (bfd *abfd,
8810 struct bfd_link_info *link_info,
8811 Elf_Internal_Rela *internal_relocs,
8812 Elf_Internal_Rela *irel,
8814 property_table_entry *prop_table,
8817 property_table_entry *entry;
8818 xtensa_relax_info *relax_info;
8820 relax_info = get_xtensa_relax_info (sec);
8824 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8825 sec->vma + rel->r_rel.target_offset);
8827 /* Mark the unused literal so that it will be removed. */
8828 add_removed_literal (&relax_info->removed_list, &rel->r_rel, NULL);
8830 text_action_add (&relax_info->action_list,
8831 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
8833 /* If the section is 4-byte aligned, do not add fill. */
8834 if (sec->alignment_power > 2)
8836 int fill_extra_space;
8837 bfd_vma entry_sec_offset;
8839 property_table_entry *the_add_entry;
8843 entry_sec_offset = entry->address - sec->vma + entry->size;
8845 entry_sec_offset = rel->r_rel.target_offset + 4;
8847 /* If the literal range is at the end of the section,
8849 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8851 fill_extra_space = xtensa_compute_fill_extra_space (the_add_entry);
8853 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
8854 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
8855 -4, fill_extra_space);
8857 adjust_fill_action (fa, removed_diff);
8859 text_action_add (&relax_info->action_list,
8860 ta_fill, sec, entry_sec_offset, removed_diff);
8863 /* Zero out the relocation on this literal location. */
8866 if (elf_hash_table (link_info)->dynamic_sections_created)
8867 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
8869 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
8870 pin_internal_relocs (sec, internal_relocs);
8873 /* Do not modify "last_loc_is_prev". */
8879 identify_literal_placement (bfd *abfd,
8882 struct bfd_link_info *link_info,
8883 value_map_hash_table *values,
8884 bfd_boolean *last_loc_is_prev_p,
8885 Elf_Internal_Rela *irel,
8886 int remaining_src_rels,
8888 property_table_entry *prop_table,
8890 section_cache_t *target_sec_cache,
8891 bfd_boolean is_abs_literal)
8895 xtensa_relax_info *relax_info;
8896 bfd_boolean literal_placed = FALSE;
8898 unsigned long value;
8899 bfd_boolean final_static_link;
8900 bfd_size_type sec_size;
8902 relax_info = get_xtensa_relax_info (sec);
8906 sec_size = bfd_get_section_limit (abfd, sec);
8909 (!bfd_link_relocatable (link_info)
8910 && !elf_hash_table (link_info)->dynamic_sections_created);
8912 /* The placement algorithm first checks to see if the literal is
8913 already in the value map. If so and the value map is reachable
8914 from all uses, then the literal is moved to that location. If
8915 not, then we identify the last location where a fresh literal was
8916 placed. If the literal can be safely moved there, then we do so.
8917 If not, then we assume that the literal is not to move and leave
8918 the literal where it is, marking it as the last literal
8921 /* Find the literal value. */
8923 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
8926 BFD_ASSERT (rel->r_rel.target_offset < sec_size);
8927 value = bfd_get_32 (abfd, contents + rel->r_rel.target_offset);
8929 init_literal_value (&val, &r_rel, value, is_abs_literal);
8931 /* Check if we've seen another literal with the same value that
8932 is in the same output section. */
8933 val_map = value_map_get_cached_value (values, &val, final_static_link);
8936 && (r_reloc_get_section (&val_map->loc)->output_section
8937 == sec->output_section)
8938 && relocations_reach (rel, remaining_src_rels, &val_map->loc)
8939 && coalesce_shared_literal (sec, rel, prop_table, ptblsize, val_map))
8941 /* No change to last_loc_is_prev. */
8942 literal_placed = TRUE;
8945 /* For relocatable links, do not try to move literals. To do it
8946 correctly might increase the number of relocations in an input
8947 section making the default relocatable linking fail. */
8948 if (!bfd_link_relocatable (link_info) && !literal_placed
8949 && values->has_last_loc && !(*last_loc_is_prev_p))
8951 asection *target_sec = r_reloc_get_section (&values->last_loc);
8952 if (target_sec && target_sec->output_section == sec->output_section)
8954 /* Increment the virtual offset. */
8955 r_reloc try_loc = values->last_loc;
8956 try_loc.virtual_offset += 4;
8958 /* There is a last loc that was in the same output section. */
8959 if (relocations_reach (rel, remaining_src_rels, &try_loc)
8960 && move_shared_literal (sec, link_info, rel,
8961 prop_table, ptblsize,
8962 &try_loc, &val, target_sec_cache))
8964 values->last_loc.virtual_offset += 4;
8965 literal_placed = TRUE;
8967 val_map = add_value_map (values, &val, &try_loc,
8970 val_map->loc = try_loc;
8975 if (!literal_placed)
8977 /* Nothing worked, leave the literal alone but update the last loc. */
8978 values->has_last_loc = TRUE;
8979 values->last_loc = rel->r_rel;
8981 val_map = add_value_map (values, &val, &rel->r_rel, final_static_link);
8983 val_map->loc = rel->r_rel;
8984 *last_loc_is_prev_p = TRUE;
8991 /* Check if the original relocations (presumably on L32R instructions)
8992 identified by reloc[0..N] can be changed to reference the literal
8993 identified by r_rel. If r_rel is out of range for any of the
8994 original relocations, then we don't want to coalesce the original
8995 literal with the one at r_rel. We only check reloc[0..N], where the
8996 offsets are all the same as for reloc[0] (i.e., they're all
8997 referencing the same literal) and where N is also bounded by the
8998 number of remaining entries in the "reloc" array. The "reloc" array
8999 is sorted by target offset so we know all the entries for the same
9000 literal will be contiguous. */
9003 relocations_reach (source_reloc *reloc,
9004 int remaining_relocs,
9005 const r_reloc *r_rel)
9007 bfd_vma from_offset, source_address, dest_address;
9011 if (!r_reloc_is_defined (r_rel))
9014 sec = r_reloc_get_section (r_rel);
9015 from_offset = reloc[0].r_rel.target_offset;
9017 for (i = 0; i < remaining_relocs; i++)
9019 if (reloc[i].r_rel.target_offset != from_offset)
9022 /* Ignore relocations that have been removed. */
9023 if (reloc[i].is_null)
9026 /* The original and new output section for these must be the same
9027 in order to coalesce. */
9028 if (r_reloc_get_section (&reloc[i].r_rel)->output_section
9029 != sec->output_section)
9032 /* Absolute literals in the same output section can always be
9034 if (reloc[i].is_abs_literal)
9037 /* A literal with no PC-relative relocations can be moved anywhere. */
9038 if (reloc[i].opnd != -1)
9040 /* Otherwise, check to see that it fits. */
9041 source_address = (reloc[i].source_sec->output_section->vma
9042 + reloc[i].source_sec->output_offset
9043 + reloc[i].r_rel.rela.r_offset);
9044 dest_address = (sec->output_section->vma
9045 + sec->output_offset
9046 + r_rel->target_offset);
9048 if (!pcrel_reloc_fits (reloc[i].opcode, reloc[i].opnd,
9049 source_address, dest_address))
9058 /* Move a literal to another literal location because it is
9059 the same as the other literal value. */
9062 coalesce_shared_literal (asection *sec,
9064 property_table_entry *prop_table,
9068 property_table_entry *entry;
9070 property_table_entry *the_add_entry;
9072 xtensa_relax_info *relax_info;
9074 relax_info = get_xtensa_relax_info (sec);
9078 entry = elf_xtensa_find_property_entry
9079 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9080 if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
9083 /* Mark that the literal will be coalesced. */
9084 add_removed_literal (&relax_info->removed_list, &rel->r_rel, &val_map->loc);
9086 text_action_add (&relax_info->action_list,
9087 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9089 /* If the section is 4-byte aligned, do not add fill. */
9090 if (sec->alignment_power > 2)
9092 int fill_extra_space;
9093 bfd_vma entry_sec_offset;
9096 entry_sec_offset = entry->address - sec->vma + entry->size;
9098 entry_sec_offset = rel->r_rel.target_offset + 4;
9100 /* If the literal range is at the end of the section,
9102 fill_extra_space = 0;
9103 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9105 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9106 fill_extra_space = the_add_entry->size;
9108 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9109 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9110 -4, fill_extra_space);
9112 adjust_fill_action (fa, removed_diff);
9114 text_action_add (&relax_info->action_list,
9115 ta_fill, sec, entry_sec_offset, removed_diff);
9122 /* Move a literal to another location. This may actually increase the
9123 total amount of space used because of alignments so we need to do
9124 this carefully. Also, it may make a branch go out of range. */
9127 move_shared_literal (asection *sec,
9128 struct bfd_link_info *link_info,
9130 property_table_entry *prop_table,
9132 const r_reloc *target_loc,
9133 const literal_value *lit_value,
9134 section_cache_t *target_sec_cache)
9136 property_table_entry *the_add_entry, *src_entry, *target_entry = NULL;
9137 text_action *fa, *target_fa;
9139 xtensa_relax_info *relax_info, *target_relax_info;
9140 asection *target_sec;
9142 ebb_constraint ebb_table;
9143 bfd_boolean relocs_fit;
9145 /* If this routine always returns FALSE, the literals that cannot be
9146 coalesced will not be moved. */
9147 if (elf32xtensa_no_literal_movement)
9150 relax_info = get_xtensa_relax_info (sec);
9154 target_sec = r_reloc_get_section (target_loc);
9155 target_relax_info = get_xtensa_relax_info (target_sec);
9157 /* Literals to undefined sections may not be moved because they
9158 must report an error. */
9159 if (bfd_is_und_section (target_sec))
9162 src_entry = elf_xtensa_find_property_entry
9163 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9165 if (!section_cache_section (target_sec_cache, target_sec, link_info))
9168 target_entry = elf_xtensa_find_property_entry
9169 (target_sec_cache->ptbl, target_sec_cache->pte_count,
9170 target_sec->vma + target_loc->target_offset);
9175 /* Make sure that we have not broken any branches. */
9178 init_ebb_constraint (&ebb_table);
9179 ebb = &ebb_table.ebb;
9180 init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
9181 target_sec_cache->content_length,
9182 target_sec_cache->ptbl, target_sec_cache->pte_count,
9183 target_sec_cache->relocs, target_sec_cache->reloc_count);
9185 /* Propose to add 4 bytes + worst-case alignment size increase to
9187 ebb_propose_action (&ebb_table, EBB_NO_ALIGN, 0,
9188 ta_fill, target_loc->target_offset,
9189 -4 - (1 << target_sec->alignment_power), TRUE);
9191 /* Check all of the PC-relative relocations to make sure they still fit. */
9192 relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
9193 target_sec_cache->contents,
9194 target_sec_cache->relocs, NULL,
9200 text_action_add_literal (&target_relax_info->action_list,
9201 ta_add_literal, target_loc, lit_value, -4);
9203 if (target_sec->alignment_power > 2 && target_entry != src_entry)
9205 /* May need to add or remove some fill to maintain alignment. */
9206 int fill_extra_space;
9207 bfd_vma entry_sec_offset;
9210 target_entry->address - target_sec->vma + target_entry->size;
9212 /* If the literal range is at the end of the section,
9214 fill_extra_space = 0;
9216 elf_xtensa_find_property_entry (target_sec_cache->ptbl,
9217 target_sec_cache->pte_count,
9219 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9220 fill_extra_space = the_add_entry->size;
9222 target_fa = find_fill_action (&target_relax_info->action_list,
9223 target_sec, entry_sec_offset);
9224 removed_diff = compute_removed_action_diff (target_fa, target_sec,
9225 entry_sec_offset, 4,
9228 adjust_fill_action (target_fa, removed_diff);
9230 text_action_add (&target_relax_info->action_list,
9231 ta_fill, target_sec, entry_sec_offset, removed_diff);
9234 /* Mark that the literal will be moved to the new location. */
9235 add_removed_literal (&relax_info->removed_list, &rel->r_rel, target_loc);
9237 /* Remove the literal. */
9238 text_action_add (&relax_info->action_list,
9239 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9241 /* If the section is 4-byte aligned, do not add fill. */
9242 if (sec->alignment_power > 2 && target_entry != src_entry)
9244 int fill_extra_space;
9245 bfd_vma entry_sec_offset;
9248 entry_sec_offset = src_entry->address - sec->vma + src_entry->size;
9250 entry_sec_offset = rel->r_rel.target_offset+4;
9252 /* If the literal range is at the end of the section,
9254 fill_extra_space = 0;
9255 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9257 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9258 fill_extra_space = the_add_entry->size;
9260 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9261 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9262 -4, fill_extra_space);
9264 adjust_fill_action (fa, removed_diff);
9266 text_action_add (&relax_info->action_list,
9267 ta_fill, sec, entry_sec_offset, removed_diff);
9274 /* Second relaxation pass. */
9277 action_remove_bytes_fn (splay_tree_node node, void *p)
9279 bfd_size_type *final_size = p;
9280 text_action *action = (text_action *)node->value;
9282 *final_size -= action->removed_bytes;
9286 /* Modify all of the relocations to point to the right spot, and if this
9287 is a relaxable section, delete the unwanted literals and fix the
9291 relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
9293 Elf_Internal_Rela *internal_relocs;
9294 xtensa_relax_info *relax_info;
9296 bfd_boolean ok = TRUE;
9298 bfd_boolean rv = FALSE;
9299 bfd_boolean virtual_action;
9300 bfd_size_type sec_size;
9302 sec_size = bfd_get_section_limit (abfd, sec);
9303 relax_info = get_xtensa_relax_info (sec);
9304 BFD_ASSERT (relax_info);
9306 /* First translate any of the fixes that have been added already. */
9307 translate_section_fixes (sec);
9309 /* Handle property sections (e.g., literal tables) specially. */
9310 if (xtensa_is_property_section (sec))
9312 BFD_ASSERT (!relax_info->is_relaxable_literal_section);
9313 return relax_property_section (abfd, sec, link_info);
9316 internal_relocs = retrieve_internal_relocs (abfd, sec,
9317 link_info->keep_memory);
9318 if (!internal_relocs && !action_list_count (&relax_info->action_list))
9321 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
9322 if (contents == NULL && sec_size != 0)
9328 if (internal_relocs)
9330 for (i = 0; i < sec->reloc_count; i++)
9332 Elf_Internal_Rela *irel;
9333 xtensa_relax_info *target_relax_info;
9334 bfd_vma source_offset, old_source_offset;
9337 asection *target_sec;
9339 /* Locally change the source address.
9340 Translate the target to the new target address.
9341 If it points to this section and has been removed,
9345 irel = &internal_relocs[i];
9346 source_offset = irel->r_offset;
9347 old_source_offset = source_offset;
9349 r_type = ELF32_R_TYPE (irel->r_info);
9350 r_reloc_init (&r_rel, abfd, irel, contents,
9351 bfd_get_section_limit (abfd, sec));
9353 /* If this section could have changed then we may need to
9354 change the relocation's offset. */
9356 if (relax_info->is_relaxable_literal_section
9357 || relax_info->is_relaxable_asm_section)
9359 pin_internal_relocs (sec, internal_relocs);
9361 if (r_type != R_XTENSA_NONE
9362 && find_removed_literal (&relax_info->removed_list,
9365 /* Remove this relocation. */
9366 if (elf_hash_table (link_info)->dynamic_sections_created)
9367 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
9368 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
9369 irel->r_offset = offset_with_removed_text_map
9370 (&relax_info->action_list, irel->r_offset);
9374 if (r_type == R_XTENSA_ASM_SIMPLIFY)
9376 text_action *action =
9377 find_insn_action (&relax_info->action_list,
9379 if (action && (action->action == ta_convert_longcall
9380 || action->action == ta_remove_longcall))
9382 bfd_reloc_status_type retval;
9383 char *error_message = NULL;
9385 retval = contract_asm_expansion (contents, sec_size,
9386 irel, &error_message);
9387 if (retval != bfd_reloc_ok)
9389 (*link_info->callbacks->reloc_dangerous)
9390 (link_info, error_message, abfd, sec,
9394 /* Update the action so that the code that moves
9395 the contents will do the right thing. */
9396 /* ta_remove_longcall and ta_remove_insn actions are
9397 grouped together in the tree as well as
9398 ta_convert_longcall and ta_none, so that changes below
9399 can be done w/o removing and reinserting action into
9402 if (action->action == ta_remove_longcall)
9403 action->action = ta_remove_insn;
9405 action->action = ta_none;
9406 /* Refresh the info in the r_rel. */
9407 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
9408 r_type = ELF32_R_TYPE (irel->r_info);
9412 source_offset = offset_with_removed_text_map
9413 (&relax_info->action_list, irel->r_offset);
9414 irel->r_offset = source_offset;
9417 /* If the target section could have changed then
9418 we may need to change the relocation's target offset. */
9420 target_sec = r_reloc_get_section (&r_rel);
9422 /* For a reference to a discarded section from a DWARF section,
9423 i.e., where action_discarded is PRETEND, the symbol will
9424 eventually be modified to refer to the kept section (at least if
9425 the kept and discarded sections are the same size). Anticipate
9426 that here and adjust things accordingly. */
9427 if (! elf_xtensa_ignore_discarded_relocs (sec)
9428 && elf_xtensa_action_discarded (sec) == PRETEND
9429 && sec->sec_info_type != SEC_INFO_TYPE_STABS
9430 && target_sec != NULL
9431 && discarded_section (target_sec))
9433 /* It would be natural to call _bfd_elf_check_kept_section
9434 here, but it's not exported from elflink.c. It's also a
9435 fairly expensive check. Adjusting the relocations to the
9436 discarded section is fairly harmless; it will only adjust
9437 some addends and difference values. If it turns out that
9438 _bfd_elf_check_kept_section fails later, it won't matter,
9439 so just compare the section names to find the right group
9441 asection *kept = target_sec->kept_section;
9444 if ((kept->flags & SEC_GROUP) != 0)
9446 asection *first = elf_next_in_group (kept);
9447 asection *s = first;
9452 if (strcmp (s->name, target_sec->name) == 0)
9457 s = elf_next_in_group (s);
9464 && ((target_sec->rawsize != 0
9465 ? target_sec->rawsize : target_sec->size)
9466 == (kept->rawsize != 0 ? kept->rawsize : kept->size)))
9470 target_relax_info = get_xtensa_relax_info (target_sec);
9471 if (target_relax_info
9472 && (target_relax_info->is_relaxable_literal_section
9473 || target_relax_info->is_relaxable_asm_section))
9476 target_sec = translate_reloc (&r_rel, &new_reloc, target_sec);
9478 if (r_type == R_XTENSA_DIFF8
9479 || r_type == R_XTENSA_DIFF16
9480 || r_type == R_XTENSA_DIFF32)
9482 bfd_signed_vma diff_value = 0;
9483 bfd_vma new_end_offset, diff_mask = 0;
9485 if (bfd_get_section_limit (abfd, sec) < old_source_offset)
9487 (*link_info->callbacks->reloc_dangerous)
9488 (link_info, _("invalid relocation address"),
9489 abfd, sec, old_source_offset);
9495 case R_XTENSA_DIFF8:
9497 bfd_get_signed_8 (abfd, &contents[old_source_offset]);
9499 case R_XTENSA_DIFF16:
9501 bfd_get_signed_16 (abfd, &contents[old_source_offset]);
9503 case R_XTENSA_DIFF32:
9505 bfd_get_signed_32 (abfd, &contents[old_source_offset]);
9509 new_end_offset = offset_with_removed_text_map
9510 (&target_relax_info->action_list,
9511 r_rel.target_offset + diff_value);
9512 diff_value = new_end_offset - new_reloc.target_offset;
9516 case R_XTENSA_DIFF8:
9518 bfd_put_signed_8 (abfd, diff_value,
9519 &contents[old_source_offset]);
9521 case R_XTENSA_DIFF16:
9523 bfd_put_signed_16 (abfd, diff_value,
9524 &contents[old_source_offset]);
9526 case R_XTENSA_DIFF32:
9527 diff_mask = 0x7fffffff;
9528 bfd_put_signed_32 (abfd, diff_value,
9529 &contents[old_source_offset]);
9533 /* Check for overflow. Sign bits must be all zeroes or all ones */
9534 if ((diff_value & ~diff_mask) != 0 &&
9535 (diff_value & ~diff_mask) != (-1 & ~diff_mask))
9537 (*link_info->callbacks->reloc_dangerous)
9538 (link_info, _("overflow after relaxation"),
9539 abfd, sec, old_source_offset);
9543 pin_contents (sec, contents);
9546 /* If the relocation still references a section in the same
9547 input file, modify the relocation directly instead of
9548 adding a "fix" record. */
9549 if (target_sec->owner == abfd)
9551 unsigned r_symndx = ELF32_R_SYM (new_reloc.rela.r_info);
9552 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
9553 irel->r_addend = new_reloc.rela.r_addend;
9554 pin_internal_relocs (sec, internal_relocs);
9558 bfd_vma addend_displacement;
9561 addend_displacement =
9562 new_reloc.target_offset + new_reloc.virtual_offset;
9563 fix = reloc_bfd_fix_init (sec, source_offset, r_type,
9565 addend_displacement, TRUE);
9572 if ((relax_info->is_relaxable_literal_section
9573 || relax_info->is_relaxable_asm_section)
9574 && action_list_count (&relax_info->action_list))
9576 /* Walk through the planned actions and build up a table
9577 of move, copy and fill records. Use the move, copy and
9578 fill records to perform the actions once. */
9580 bfd_size_type final_size, copy_size, orig_insn_size;
9581 bfd_byte *scratch = NULL;
9582 bfd_byte *dup_contents = NULL;
9583 bfd_size_type orig_size = sec->size;
9584 bfd_vma orig_dot = 0;
9585 bfd_vma orig_dot_copied = 0; /* Byte copied already from
9586 orig dot in physical memory. */
9587 bfd_vma orig_dot_vo = 0; /* Virtual offset from orig_dot. */
9588 bfd_vma dup_dot = 0;
9590 text_action *action;
9592 final_size = sec->size;
9594 splay_tree_foreach (relax_info->action_list.tree,
9595 action_remove_bytes_fn, &final_size);
9596 scratch = (bfd_byte *) bfd_zmalloc (final_size);
9597 dup_contents = (bfd_byte *) bfd_zmalloc (final_size);
9599 /* The dot is the current fill location. */
9601 print_action_list (stderr, &relax_info->action_list);
9604 for (action = action_first (&relax_info->action_list); action;
9605 action = action_next (&relax_info->action_list, action))
9607 virtual_action = FALSE;
9608 if (action->offset > orig_dot)
9610 orig_dot += orig_dot_copied;
9611 orig_dot_copied = 0;
9613 /* Out of the virtual world. */
9616 if (action->offset > orig_dot)
9618 copy_size = action->offset - orig_dot;
9619 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9620 orig_dot += copy_size;
9621 dup_dot += copy_size;
9622 BFD_ASSERT (action->offset == orig_dot);
9624 else if (action->offset < orig_dot)
9626 if (action->action == ta_fill
9627 && action->offset - action->removed_bytes == orig_dot)
9629 /* This is OK because the fill only effects the dup_dot. */
9631 else if (action->action == ta_add_literal)
9633 /* TBD. Might need to handle this. */
9636 if (action->offset == orig_dot)
9638 if (action->virtual_offset > orig_dot_vo)
9640 if (orig_dot_vo == 0)
9642 /* Need to copy virtual_offset bytes. Probably four. */
9643 copy_size = action->virtual_offset - orig_dot_vo;
9644 memmove (&dup_contents[dup_dot],
9645 &contents[orig_dot], copy_size);
9646 orig_dot_copied = copy_size;
9647 dup_dot += copy_size;
9649 virtual_action = TRUE;
9652 BFD_ASSERT (action->virtual_offset <= orig_dot_vo);
9654 switch (action->action)
9656 case ta_remove_literal:
9657 case ta_remove_insn:
9658 BFD_ASSERT (action->removed_bytes >= 0);
9659 orig_dot += action->removed_bytes;
9662 case ta_narrow_insn:
9665 memmove (scratch, &contents[orig_dot], orig_insn_size);
9666 BFD_ASSERT (action->removed_bytes == 1);
9667 rv = narrow_instruction (scratch, final_size, 0);
9669 memmove (&dup_contents[dup_dot], scratch, copy_size);
9670 orig_dot += orig_insn_size;
9671 dup_dot += copy_size;
9675 if (action->removed_bytes >= 0)
9676 orig_dot += action->removed_bytes;
9679 /* Already zeroed in dup_contents. Just bump the
9681 dup_dot += (-action->removed_bytes);
9686 BFD_ASSERT (action->removed_bytes == 0);
9689 case ta_convert_longcall:
9690 case ta_remove_longcall:
9691 /* These will be removed or converted before we get here. */
9698 memmove (scratch, &contents[orig_dot], orig_insn_size);
9699 BFD_ASSERT (action->removed_bytes == -1);
9700 rv = widen_instruction (scratch, final_size, 0);
9702 memmove (&dup_contents[dup_dot], scratch, copy_size);
9703 orig_dot += orig_insn_size;
9704 dup_dot += copy_size;
9707 case ta_add_literal:
9710 BFD_ASSERT (action->removed_bytes == -4);
9711 /* TBD -- place the literal value here and insert
9713 memset (&dup_contents[dup_dot], 0, 4);
9714 pin_internal_relocs (sec, internal_relocs);
9715 pin_contents (sec, contents);
9717 if (!move_literal (abfd, link_info, sec, dup_dot, dup_contents,
9718 relax_info, &internal_relocs, &action->value))
9722 orig_dot_vo += copy_size;
9724 orig_dot += orig_insn_size;
9725 dup_dot += copy_size;
9729 /* Not implemented yet. */
9734 BFD_ASSERT (dup_dot <= final_size);
9735 BFD_ASSERT (orig_dot <= orig_size);
9738 orig_dot += orig_dot_copied;
9739 orig_dot_copied = 0;
9741 if (orig_dot != orig_size)
9743 copy_size = orig_size - orig_dot;
9744 BFD_ASSERT (orig_size > orig_dot);
9745 BFD_ASSERT (dup_dot + copy_size == final_size);
9746 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9747 orig_dot += copy_size;
9748 dup_dot += copy_size;
9750 BFD_ASSERT (orig_size == orig_dot);
9751 BFD_ASSERT (final_size == dup_dot);
9753 /* Move the dup_contents back. */
9754 if (final_size > orig_size)
9756 /* Contents need to be reallocated. Swap the dup_contents into
9758 sec->contents = dup_contents;
9760 contents = dup_contents;
9761 pin_contents (sec, contents);
9765 BFD_ASSERT (final_size <= orig_size);
9766 memset (contents, 0, orig_size);
9767 memcpy (contents, dup_contents, final_size);
9768 free (dup_contents);
9771 pin_contents (sec, contents);
9773 if (sec->rawsize == 0)
9774 sec->rawsize = sec->size;
9775 sec->size = final_size;
9779 release_internal_relocs (sec, internal_relocs);
9780 release_contents (sec, contents);
9786 translate_section_fixes (asection *sec)
9788 xtensa_relax_info *relax_info;
9791 relax_info = get_xtensa_relax_info (sec);
9795 for (r = relax_info->fix_list; r != NULL; r = r->next)
9796 if (!translate_reloc_bfd_fix (r))
9803 /* Translate a fix given the mapping in the relax info for the target
9804 section. If it has already been translated, no work is required. */
9807 translate_reloc_bfd_fix (reloc_bfd_fix *fix)
9809 reloc_bfd_fix new_fix;
9811 xtensa_relax_info *relax_info;
9812 removed_literal *removed;
9813 bfd_vma new_offset, target_offset;
9815 if (fix->translated)
9818 sec = fix->target_sec;
9819 target_offset = fix->target_offset;
9821 relax_info = get_xtensa_relax_info (sec);
9824 fix->translated = TRUE;
9830 /* The fix does not need to be translated if the section cannot change. */
9831 if (!relax_info->is_relaxable_literal_section
9832 && !relax_info->is_relaxable_asm_section)
9834 fix->translated = TRUE;
9838 /* If the literal has been moved and this relocation was on an
9839 opcode, then the relocation should move to the new literal
9840 location. Otherwise, the relocation should move within the
9844 if (is_operand_relocation (fix->src_type))
9846 /* Check if the original relocation is against a literal being
9848 removed = find_removed_literal (&relax_info->removed_list,
9856 /* The fact that there is still a relocation to this literal indicates
9857 that the literal is being coalesced, not simply removed. */
9858 BFD_ASSERT (removed->to.abfd != NULL);
9860 /* This was moved to some other address (possibly another section). */
9861 new_sec = r_reloc_get_section (&removed->to);
9865 relax_info = get_xtensa_relax_info (sec);
9867 (!relax_info->is_relaxable_literal_section
9868 && !relax_info->is_relaxable_asm_section))
9870 target_offset = removed->to.target_offset;
9871 new_fix.target_sec = new_sec;
9872 new_fix.target_offset = target_offset;
9873 new_fix.translated = TRUE;
9878 target_offset = removed->to.target_offset;
9879 new_fix.target_sec = new_sec;
9882 /* The target address may have been moved within its section. */
9883 new_offset = offset_with_removed_text (&relax_info->action_list,
9886 new_fix.target_offset = new_offset;
9887 new_fix.target_offset = new_offset;
9888 new_fix.translated = TRUE;
9894 /* Fix up a relocation to take account of removed literals. */
9897 translate_reloc (const r_reloc *orig_rel, r_reloc *new_rel, asection *sec)
9899 xtensa_relax_info *relax_info;
9900 removed_literal *removed;
9901 bfd_vma target_offset, base_offset;
9903 *new_rel = *orig_rel;
9905 if (!r_reloc_is_defined (orig_rel))
9908 relax_info = get_xtensa_relax_info (sec);
9909 BFD_ASSERT (relax_info && (relax_info->is_relaxable_literal_section
9910 || relax_info->is_relaxable_asm_section));
9912 target_offset = orig_rel->target_offset;
9915 if (is_operand_relocation (ELF32_R_TYPE (orig_rel->rela.r_info)))
9917 /* Check if the original relocation is against a literal being
9919 removed = find_removed_literal (&relax_info->removed_list,
9922 if (removed && removed->to.abfd)
9926 /* The fact that there is still a relocation to this literal indicates
9927 that the literal is being coalesced, not simply removed. */
9928 BFD_ASSERT (removed->to.abfd != NULL);
9930 /* This was moved to some other address
9931 (possibly in another section). */
9932 *new_rel = removed->to;
9933 new_sec = r_reloc_get_section (new_rel);
9937 relax_info = get_xtensa_relax_info (sec);
9939 || (!relax_info->is_relaxable_literal_section
9940 && !relax_info->is_relaxable_asm_section))
9943 target_offset = new_rel->target_offset;
9946 /* Find the base offset of the reloc symbol, excluding any addend from the
9947 reloc or from the section contents (for a partial_inplace reloc). Then
9948 find the adjusted values of the offsets due to relaxation. The base
9949 offset is needed to determine the change to the reloc's addend; the reloc
9950 addend should not be adjusted due to relaxations located before the base
9953 base_offset = r_reloc_get_target_offset (new_rel) - new_rel->rela.r_addend;
9954 if (base_offset <= target_offset)
9956 int base_removed = removed_by_actions_map (&relax_info->action_list,
9957 base_offset, FALSE);
9958 int addend_removed = removed_by_actions_map (&relax_info->action_list,
9959 target_offset, FALSE) -
9962 new_rel->target_offset = target_offset - base_removed - addend_removed;
9963 new_rel->rela.r_addend -= addend_removed;
9967 /* Handle a negative addend. The base offset comes first. */
9968 int tgt_removed = removed_by_actions_map (&relax_info->action_list,
9969 target_offset, FALSE);
9970 int addend_removed = removed_by_actions_map (&relax_info->action_list,
9971 base_offset, FALSE) -
9974 new_rel->target_offset = target_offset - tgt_removed;
9975 new_rel->rela.r_addend += addend_removed;
9982 /* For dynamic links, there may be a dynamic relocation for each
9983 literal. The number of dynamic relocations must be computed in
9984 size_dynamic_sections, which occurs before relaxation. When a
9985 literal is removed, this function checks if there is a corresponding
9986 dynamic relocation and shrinks the size of the appropriate dynamic
9987 relocation section accordingly. At this point, the contents of the
9988 dynamic relocation sections have not yet been filled in, so there's
9989 nothing else that needs to be done. */
9992 shrink_dynamic_reloc_sections (struct bfd_link_info *info,
9994 asection *input_section,
9995 Elf_Internal_Rela *rel)
9997 struct elf_xtensa_link_hash_table *htab;
9998 Elf_Internal_Shdr *symtab_hdr;
9999 struct elf_link_hash_entry **sym_hashes;
10000 unsigned long r_symndx;
10002 struct elf_link_hash_entry *h;
10003 bfd_boolean dynamic_symbol;
10005 htab = elf_xtensa_hash_table (info);
10009 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10010 sym_hashes = elf_sym_hashes (abfd);
10012 r_type = ELF32_R_TYPE (rel->r_info);
10013 r_symndx = ELF32_R_SYM (rel->r_info);
10015 if (r_symndx < symtab_hdr->sh_info)
10018 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
10020 dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
10022 if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
10023 && (input_section->flags & SEC_ALLOC) != 0
10024 && (dynamic_symbol || bfd_link_pic (info))
10025 && (!h || h->root.type != bfd_link_hash_undefweak
10026 || (dynamic_symbol && bfd_link_dll (info))))
10029 bfd_boolean is_plt = FALSE;
10031 if (dynamic_symbol && r_type == R_XTENSA_PLT)
10033 srel = htab->elf.srelplt;
10037 srel = htab->elf.srelgot;
10039 /* Reduce size of the .rela.* section by one reloc. */
10040 BFD_ASSERT (srel != NULL);
10041 BFD_ASSERT (srel->size >= sizeof (Elf32_External_Rela));
10042 srel->size -= sizeof (Elf32_External_Rela);
10046 asection *splt, *sgotplt, *srelgot;
10047 int reloc_index, chunk;
10049 /* Find the PLT reloc index of the entry being removed. This
10050 is computed from the size of ".rela.plt". It is needed to
10051 figure out which PLT chunk to resize. Usually "last index
10052 = size - 1" since the index starts at zero, but in this
10053 context, the size has just been decremented so there's no
10054 need to subtract one. */
10055 reloc_index = srel->size / sizeof (Elf32_External_Rela);
10057 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
10058 splt = elf_xtensa_get_plt_section (info, chunk);
10059 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
10060 BFD_ASSERT (splt != NULL && sgotplt != NULL);
10062 /* Check if an entire PLT chunk has just been eliminated. */
10063 if (reloc_index % PLT_ENTRIES_PER_CHUNK == 0)
10065 /* The two magic GOT entries for that chunk can go away. */
10066 srelgot = htab->elf.srelgot;
10067 BFD_ASSERT (srelgot != NULL);
10068 srelgot->reloc_count -= 2;
10069 srelgot->size -= 2 * sizeof (Elf32_External_Rela);
10070 sgotplt->size -= 8;
10072 /* There should be only one entry left (and it will be
10074 BFD_ASSERT (sgotplt->size == 4);
10075 BFD_ASSERT (splt->size == PLT_ENTRY_SIZE);
10078 BFD_ASSERT (sgotplt->size >= 4);
10079 BFD_ASSERT (splt->size >= PLT_ENTRY_SIZE);
10081 sgotplt->size -= 4;
10082 splt->size -= PLT_ENTRY_SIZE;
10088 /* Take an r_rel and move it to another section. This usually
10089 requires extending the interal_relocation array and pinning it. If
10090 the original r_rel is from the same BFD, we can complete this here.
10091 Otherwise, we add a fix record to let the final link fix the
10092 appropriate address. Contents and internal relocations for the
10093 section must be pinned after calling this routine. */
10096 move_literal (bfd *abfd,
10097 struct bfd_link_info *link_info,
10100 bfd_byte *contents,
10101 xtensa_relax_info *relax_info,
10102 Elf_Internal_Rela **internal_relocs_p,
10103 const literal_value *lit)
10105 Elf_Internal_Rela *new_relocs = NULL;
10106 size_t new_relocs_count = 0;
10107 Elf_Internal_Rela this_rela;
10108 const r_reloc *r_rel;
10110 r_rel = &lit->r_rel;
10111 BFD_ASSERT (elf_section_data (sec)->relocs == *internal_relocs_p);
10113 if (r_reloc_is_const (r_rel))
10114 bfd_put_32 (abfd, lit->value, contents + offset);
10119 reloc_bfd_fix *fix;
10120 unsigned insert_at;
10122 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
10124 /* This is the difficult case. We have to create a fix up. */
10125 this_rela.r_offset = offset;
10126 this_rela.r_info = ELF32_R_INFO (0, r_type);
10127 this_rela.r_addend =
10128 r_rel->target_offset - r_reloc_get_target_offset (r_rel);
10129 bfd_put_32 (abfd, lit->value, contents + offset);
10131 /* Currently, we cannot move relocations during a relocatable link. */
10132 BFD_ASSERT (!bfd_link_relocatable (link_info));
10133 fix = reloc_bfd_fix_init (sec, offset, r_type,
10134 r_reloc_get_section (r_rel),
10135 r_rel->target_offset + r_rel->virtual_offset,
10137 /* We also need to mark that relocations are needed here. */
10138 sec->flags |= SEC_RELOC;
10140 translate_reloc_bfd_fix (fix);
10141 /* This fix has not yet been translated. */
10142 add_fix (sec, fix);
10144 /* Add the relocation. If we have already allocated our own
10145 space for the relocations and we have room for more, then use
10146 it. Otherwise, allocate new space and move the literals. */
10147 insert_at = sec->reloc_count;
10148 for (i = 0; i < sec->reloc_count; ++i)
10150 if (this_rela.r_offset < (*internal_relocs_p)[i].r_offset)
10157 if (*internal_relocs_p != relax_info->allocated_relocs
10158 || sec->reloc_count + 1 > relax_info->allocated_relocs_count)
10160 BFD_ASSERT (relax_info->allocated_relocs == NULL
10161 || sec->reloc_count == relax_info->relocs_count);
10163 if (relax_info->allocated_relocs_count == 0)
10164 new_relocs_count = (sec->reloc_count + 2) * 2;
10166 new_relocs_count = (relax_info->allocated_relocs_count + 2) * 2;
10168 new_relocs = (Elf_Internal_Rela *)
10169 bfd_zmalloc (sizeof (Elf_Internal_Rela) * (new_relocs_count));
10173 /* We could handle this more quickly by finding the split point. */
10174 if (insert_at != 0)
10175 memcpy (new_relocs, *internal_relocs_p,
10176 insert_at * sizeof (Elf_Internal_Rela));
10178 new_relocs[insert_at] = this_rela;
10180 if (insert_at != sec->reloc_count)
10181 memcpy (new_relocs + insert_at + 1,
10182 (*internal_relocs_p) + insert_at,
10183 (sec->reloc_count - insert_at)
10184 * sizeof (Elf_Internal_Rela));
10186 if (*internal_relocs_p != relax_info->allocated_relocs)
10188 /* The first time we re-allocate, we can only free the
10189 old relocs if they were allocated with bfd_malloc.
10190 This is not true when keep_memory is in effect. */
10191 if (!link_info->keep_memory)
10192 free (*internal_relocs_p);
10195 free (*internal_relocs_p);
10196 relax_info->allocated_relocs = new_relocs;
10197 relax_info->allocated_relocs_count = new_relocs_count;
10198 elf_section_data (sec)->relocs = new_relocs;
10199 sec->reloc_count++;
10200 relax_info->relocs_count = sec->reloc_count;
10201 *internal_relocs_p = new_relocs;
10205 if (insert_at != sec->reloc_count)
10208 for (idx = sec->reloc_count; idx > insert_at; idx--)
10209 (*internal_relocs_p)[idx] = (*internal_relocs_p)[idx-1];
10211 (*internal_relocs_p)[insert_at] = this_rela;
10212 sec->reloc_count++;
10213 if (relax_info->allocated_relocs)
10214 relax_info->relocs_count = sec->reloc_count;
10221 /* This is similar to relax_section except that when a target is moved,
10222 we shift addresses up. We also need to modify the size. This
10223 algorithm does NOT allow for relocations into the middle of the
10224 property sections. */
10227 relax_property_section (bfd *abfd,
10229 struct bfd_link_info *link_info)
10231 Elf_Internal_Rela *internal_relocs;
10232 bfd_byte *contents;
10234 bfd_boolean ok = TRUE;
10235 bfd_boolean is_full_prop_section;
10236 size_t last_zfill_target_offset = 0;
10237 asection *last_zfill_target_sec = NULL;
10238 bfd_size_type sec_size;
10239 bfd_size_type entry_size;
10241 sec_size = bfd_get_section_limit (abfd, sec);
10242 internal_relocs = retrieve_internal_relocs (abfd, sec,
10243 link_info->keep_memory);
10244 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
10245 if (contents == NULL && sec_size != 0)
10251 is_full_prop_section = xtensa_is_proptable_section (sec);
10252 if (is_full_prop_section)
10257 if (internal_relocs)
10259 for (i = 0; i < sec->reloc_count; i++)
10261 Elf_Internal_Rela *irel;
10262 xtensa_relax_info *target_relax_info;
10264 asection *target_sec;
10266 bfd_byte *size_p, *flags_p;
10268 /* Locally change the source address.
10269 Translate the target to the new target address.
10270 If it points to this section and has been removed, MOVE IT.
10271 Also, don't forget to modify the associated SIZE at
10274 irel = &internal_relocs[i];
10275 r_type = ELF32_R_TYPE (irel->r_info);
10276 if (r_type == R_XTENSA_NONE)
10279 /* Find the literal value. */
10280 r_reloc_init (&val.r_rel, abfd, irel, contents, sec_size);
10281 size_p = &contents[irel->r_offset + 4];
10283 if (is_full_prop_section)
10284 flags_p = &contents[irel->r_offset + 8];
10285 BFD_ASSERT (irel->r_offset + entry_size <= sec_size);
10287 target_sec = r_reloc_get_section (&val.r_rel);
10288 target_relax_info = get_xtensa_relax_info (target_sec);
10290 if (target_relax_info
10291 && (target_relax_info->is_relaxable_literal_section
10292 || target_relax_info->is_relaxable_asm_section ))
10294 /* Translate the relocation's destination. */
10295 bfd_vma old_offset = val.r_rel.target_offset;
10296 bfd_vma new_offset;
10297 long old_size, new_size;
10298 int removed_by_old_offset =
10299 removed_by_actions_map (&target_relax_info->action_list,
10300 old_offset, FALSE);
10301 new_offset = old_offset - removed_by_old_offset;
10303 /* Assert that we are not out of bounds. */
10304 old_size = bfd_get_32 (abfd, size_p);
10305 new_size = old_size;
10309 /* Only the first zero-sized unreachable entry is
10310 allowed to expand. In this case the new offset
10311 should be the offset before the fill and the new
10312 size is the expansion size. For other zero-sized
10313 entries the resulting size should be zero with an
10314 offset before or after the fill address depending
10315 on whether the expanding unreachable entry
10317 if (last_zfill_target_sec == 0
10318 || last_zfill_target_sec != target_sec
10319 || last_zfill_target_offset != old_offset)
10321 bfd_vma new_end_offset = new_offset;
10323 /* Recompute the new_offset, but this time don't
10324 include any fill inserted by relaxation. */
10325 removed_by_old_offset =
10326 removed_by_actions_map (&target_relax_info->action_list,
10328 new_offset = old_offset - removed_by_old_offset;
10330 /* If it is not unreachable and we have not yet
10331 seen an unreachable at this address, place it
10332 before the fill address. */
10333 if (flags_p && (bfd_get_32 (abfd, flags_p)
10334 & XTENSA_PROP_UNREACHABLE) != 0)
10336 new_size = new_end_offset - new_offset;
10338 last_zfill_target_sec = target_sec;
10339 last_zfill_target_offset = old_offset;
10345 int removed_by_old_offset_size =
10346 removed_by_actions_map (&target_relax_info->action_list,
10347 old_offset + old_size, TRUE);
10348 new_size -= removed_by_old_offset_size - removed_by_old_offset;
10351 if (new_size != old_size)
10353 bfd_put_32 (abfd, new_size, size_p);
10354 pin_contents (sec, contents);
10357 if (new_offset != old_offset)
10359 bfd_vma diff = new_offset - old_offset;
10360 irel->r_addend += diff;
10361 pin_internal_relocs (sec, internal_relocs);
10367 /* Combine adjacent property table entries. This is also done in
10368 finish_dynamic_sections() but at that point it's too late to
10369 reclaim the space in the output section, so we do this twice. */
10371 if (internal_relocs && (!bfd_link_relocatable (link_info)
10372 || xtensa_is_littable_section (sec)))
10374 Elf_Internal_Rela *last_irel = NULL;
10375 Elf_Internal_Rela *irel, *next_rel, *rel_end;
10376 int removed_bytes = 0;
10378 flagword predef_flags;
10380 predef_flags = xtensa_get_property_predef_flags (sec);
10382 /* Walk over memory and relocations at the same time.
10383 This REQUIRES that the internal_relocs be sorted by offset. */
10384 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
10385 internal_reloc_compare);
10387 pin_internal_relocs (sec, internal_relocs);
10388 pin_contents (sec, contents);
10390 next_rel = internal_relocs;
10391 rel_end = internal_relocs + sec->reloc_count;
10393 BFD_ASSERT (sec->size % entry_size == 0);
10395 for (offset = 0; offset < sec->size; offset += entry_size)
10397 Elf_Internal_Rela *offset_rel, *extra_rel;
10398 bfd_vma bytes_to_remove, size, actual_offset;
10399 bfd_boolean remove_this_rel;
10402 /* Find the first relocation for the entry at the current offset.
10403 Adjust the offsets of any extra relocations for the previous
10408 for (irel = next_rel; irel < rel_end; irel++)
10410 if ((irel->r_offset == offset
10411 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10412 || irel->r_offset > offset)
10417 irel->r_offset -= removed_bytes;
10421 /* Find the next relocation (if there are any left). */
10425 for (irel = offset_rel + 1; irel < rel_end; irel++)
10427 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10435 /* Check if there are relocations on the current entry. There
10436 should usually be a relocation on the offset field. If there
10437 are relocations on the size or flags, then we can't optimize
10438 this entry. Also, find the next relocation to examine on the
10442 if (offset_rel->r_offset >= offset + entry_size)
10444 next_rel = offset_rel;
10445 /* There are no relocations on the current entry, but we
10446 might still be able to remove it if the size is zero. */
10449 else if (offset_rel->r_offset > offset
10451 && extra_rel->r_offset < offset + entry_size))
10453 /* There is a relocation on the size or flags, so we can't
10454 do anything with this entry. Continue with the next. */
10455 next_rel = offset_rel;
10460 BFD_ASSERT (offset_rel->r_offset == offset);
10461 offset_rel->r_offset -= removed_bytes;
10462 next_rel = offset_rel + 1;
10468 remove_this_rel = FALSE;
10469 bytes_to_remove = 0;
10470 actual_offset = offset - removed_bytes;
10471 size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
10473 if (is_full_prop_section)
10474 flags = bfd_get_32 (abfd, &contents[actual_offset + 8]);
10476 flags = predef_flags;
10479 && (flags & XTENSA_PROP_ALIGN) == 0
10480 && (flags & XTENSA_PROP_UNREACHABLE) == 0)
10482 /* Always remove entries with zero size and no alignment. */
10483 bytes_to_remove = entry_size;
10485 remove_this_rel = TRUE;
10487 else if (offset_rel
10488 && ELF32_R_TYPE (offset_rel->r_info) == R_XTENSA_32)
10492 flagword old_flags;
10494 bfd_get_32 (abfd, &contents[last_irel->r_offset + 4]);
10495 bfd_vma old_address =
10496 (last_irel->r_addend
10497 + bfd_get_32 (abfd, &contents[last_irel->r_offset]));
10498 bfd_vma new_address =
10499 (offset_rel->r_addend
10500 + bfd_get_32 (abfd, &contents[actual_offset]));
10501 if (is_full_prop_section)
10502 old_flags = bfd_get_32
10503 (abfd, &contents[last_irel->r_offset + 8]);
10505 old_flags = predef_flags;
10507 if ((ELF32_R_SYM (offset_rel->r_info)
10508 == ELF32_R_SYM (last_irel->r_info))
10509 && old_address + old_size == new_address
10510 && old_flags == flags
10511 && (old_flags & XTENSA_PROP_INSN_BRANCH_TARGET) == 0
10512 && (old_flags & XTENSA_PROP_INSN_LOOP_TARGET) == 0)
10514 /* Fix the old size. */
10515 bfd_put_32 (abfd, old_size + size,
10516 &contents[last_irel->r_offset + 4]);
10517 bytes_to_remove = entry_size;
10518 remove_this_rel = TRUE;
10521 last_irel = offset_rel;
10524 last_irel = offset_rel;
10527 if (remove_this_rel)
10529 offset_rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
10530 offset_rel->r_offset = 0;
10533 if (bytes_to_remove != 0)
10535 removed_bytes += bytes_to_remove;
10536 if (offset + bytes_to_remove < sec->size)
10537 memmove (&contents[actual_offset],
10538 &contents[actual_offset + bytes_to_remove],
10539 sec->size - offset - bytes_to_remove);
10545 /* Fix up any extra relocations on the last entry. */
10546 for (irel = next_rel; irel < rel_end; irel++)
10547 irel->r_offset -= removed_bytes;
10549 /* Clear the removed bytes. */
10550 memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
10552 if (sec->rawsize == 0)
10553 sec->rawsize = sec->size;
10554 sec->size -= removed_bytes;
10556 if (xtensa_is_littable_section (sec))
10558 asection *sgotloc = elf_xtensa_hash_table (link_info)->sgotloc;
10560 sgotloc->size -= removed_bytes;
10566 release_internal_relocs (sec, internal_relocs);
10567 release_contents (sec, contents);
10572 /* Third relaxation pass. */
10574 /* Change symbol values to account for removed literals. */
10577 relax_section_symbols (bfd *abfd, asection *sec)
10579 xtensa_relax_info *relax_info;
10580 unsigned int sec_shndx;
10581 Elf_Internal_Shdr *symtab_hdr;
10582 Elf_Internal_Sym *isymbuf;
10583 unsigned i, num_syms, num_locals;
10585 relax_info = get_xtensa_relax_info (sec);
10586 BFD_ASSERT (relax_info);
10588 if (!relax_info->is_relaxable_literal_section
10589 && !relax_info->is_relaxable_asm_section)
10592 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
10594 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10595 isymbuf = retrieve_local_syms (abfd);
10597 num_syms = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
10598 num_locals = symtab_hdr->sh_info;
10600 /* Adjust the local symbols defined in this section. */
10601 for (i = 0; i < num_locals; i++)
10603 Elf_Internal_Sym *isym = &isymbuf[i];
10605 if (isym->st_shndx == sec_shndx)
10607 bfd_vma orig_addr = isym->st_value;
10608 int removed = removed_by_actions_map (&relax_info->action_list,
10611 isym->st_value -= removed;
10612 if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC)
10614 removed_by_actions_map (&relax_info->action_list,
10615 orig_addr + isym->st_size, FALSE) -
10620 /* Now adjust the global symbols defined in this section. */
10621 for (i = 0; i < (num_syms - num_locals); i++)
10623 struct elf_link_hash_entry *sym_hash;
10625 sym_hash = elf_sym_hashes (abfd)[i];
10627 if (sym_hash->root.type == bfd_link_hash_warning)
10628 sym_hash = (struct elf_link_hash_entry *) sym_hash->root.u.i.link;
10630 if ((sym_hash->root.type == bfd_link_hash_defined
10631 || sym_hash->root.type == bfd_link_hash_defweak)
10632 && sym_hash->root.u.def.section == sec)
10634 bfd_vma orig_addr = sym_hash->root.u.def.value;
10635 int removed = removed_by_actions_map (&relax_info->action_list,
10638 sym_hash->root.u.def.value -= removed;
10640 if (sym_hash->type == STT_FUNC)
10642 removed_by_actions_map (&relax_info->action_list,
10643 orig_addr + sym_hash->size, FALSE) -
10652 /* "Fix" handling functions, called while performing relocations. */
10655 do_fix_for_relocatable_link (Elf_Internal_Rela *rel,
10657 asection *input_section,
10658 bfd_byte *contents)
10661 asection *sec, *old_sec;
10662 bfd_vma old_offset;
10663 int r_type = ELF32_R_TYPE (rel->r_info);
10664 reloc_bfd_fix *fix;
10666 if (r_type == R_XTENSA_NONE)
10669 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10673 r_reloc_init (&r_rel, input_bfd, rel, contents,
10674 bfd_get_section_limit (input_bfd, input_section));
10675 old_sec = r_reloc_get_section (&r_rel);
10676 old_offset = r_rel.target_offset;
10678 if (!old_sec || !r_reloc_is_defined (&r_rel))
10680 if (r_type != R_XTENSA_ASM_EXPAND)
10683 /* xgettext:c-format */
10684 (_("%pB(%pA+%#" PRIx64 "): unexpected fix for %s relocation"),
10685 input_bfd, input_section, (uint64_t) rel->r_offset,
10686 elf_howto_table[r_type].name);
10689 /* Leave it be. Resolution will happen in a later stage. */
10693 sec = fix->target_sec;
10694 rel->r_addend += ((sec->output_offset + fix->target_offset)
10695 - (old_sec->output_offset + old_offset));
10702 do_fix_for_final_link (Elf_Internal_Rela *rel,
10704 asection *input_section,
10705 bfd_byte *contents,
10706 bfd_vma *relocationp)
10709 int r_type = ELF32_R_TYPE (rel->r_info);
10710 reloc_bfd_fix *fix;
10711 bfd_vma fixup_diff;
10713 if (r_type == R_XTENSA_NONE)
10716 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10720 sec = fix->target_sec;
10722 fixup_diff = rel->r_addend;
10723 if (elf_howto_table[fix->src_type].partial_inplace)
10725 bfd_vma inplace_val;
10726 BFD_ASSERT (fix->src_offset
10727 < bfd_get_section_limit (input_bfd, input_section));
10728 inplace_val = bfd_get_32 (input_bfd, &contents[fix->src_offset]);
10729 fixup_diff += inplace_val;
10732 *relocationp = (sec->output_section->vma
10733 + sec->output_offset
10734 + fix->target_offset - fixup_diff);
10738 /* Miscellaneous utility functions.... */
10741 elf_xtensa_get_plt_section (struct bfd_link_info *info, int chunk)
10747 return elf_hash_table (info)->splt;
10749 dynobj = elf_hash_table (info)->dynobj;
10750 sprintf (plt_name, ".plt.%u", chunk);
10751 return bfd_get_linker_section (dynobj, plt_name);
10756 elf_xtensa_get_gotplt_section (struct bfd_link_info *info, int chunk)
10762 return elf_hash_table (info)->sgotplt;
10764 dynobj = elf_hash_table (info)->dynobj;
10765 sprintf (got_name, ".got.plt.%u", chunk);
10766 return bfd_get_linker_section (dynobj, got_name);
10770 /* Get the input section for a given symbol index.
10772 . a section symbol, return the section;
10773 . a common symbol, return the common section;
10774 . an undefined symbol, return the undefined section;
10775 . an indirect symbol, follow the links;
10776 . an absolute value, return the absolute section. */
10779 get_elf_r_symndx_section (bfd *abfd, unsigned long r_symndx)
10781 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10782 asection *target_sec = NULL;
10783 if (r_symndx < symtab_hdr->sh_info)
10785 Elf_Internal_Sym *isymbuf;
10786 unsigned int section_index;
10788 isymbuf = retrieve_local_syms (abfd);
10789 section_index = isymbuf[r_symndx].st_shndx;
10791 if (section_index == SHN_UNDEF)
10792 target_sec = bfd_und_section_ptr;
10793 else if (section_index == SHN_ABS)
10794 target_sec = bfd_abs_section_ptr;
10795 else if (section_index == SHN_COMMON)
10796 target_sec = bfd_com_section_ptr;
10798 target_sec = bfd_section_from_elf_index (abfd, section_index);
10802 unsigned long indx = r_symndx - symtab_hdr->sh_info;
10803 struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
10805 while (h->root.type == bfd_link_hash_indirect
10806 || h->root.type == bfd_link_hash_warning)
10807 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10809 switch (h->root.type)
10811 case bfd_link_hash_defined:
10812 case bfd_link_hash_defweak:
10813 target_sec = h->root.u.def.section;
10815 case bfd_link_hash_common:
10816 target_sec = bfd_com_section_ptr;
10818 case bfd_link_hash_undefined:
10819 case bfd_link_hash_undefweak:
10820 target_sec = bfd_und_section_ptr;
10822 default: /* New indirect warning. */
10823 target_sec = bfd_und_section_ptr;
10831 static struct elf_link_hash_entry *
10832 get_elf_r_symndx_hash_entry (bfd *abfd, unsigned long r_symndx)
10834 unsigned long indx;
10835 struct elf_link_hash_entry *h;
10836 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10838 if (r_symndx < symtab_hdr->sh_info)
10841 indx = r_symndx - symtab_hdr->sh_info;
10842 h = elf_sym_hashes (abfd)[indx];
10843 while (h->root.type == bfd_link_hash_indirect
10844 || h->root.type == bfd_link_hash_warning)
10845 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10850 /* Get the section-relative offset for a symbol number. */
10853 get_elf_r_symndx_offset (bfd *abfd, unsigned long r_symndx)
10855 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10856 bfd_vma offset = 0;
10858 if (r_symndx < symtab_hdr->sh_info)
10860 Elf_Internal_Sym *isymbuf;
10861 isymbuf = retrieve_local_syms (abfd);
10862 offset = isymbuf[r_symndx].st_value;
10866 unsigned long indx = r_symndx - symtab_hdr->sh_info;
10867 struct elf_link_hash_entry *h =
10868 elf_sym_hashes (abfd)[indx];
10870 while (h->root.type == bfd_link_hash_indirect
10871 || h->root.type == bfd_link_hash_warning)
10872 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10873 if (h->root.type == bfd_link_hash_defined
10874 || h->root.type == bfd_link_hash_defweak)
10875 offset = h->root.u.def.value;
10882 is_reloc_sym_weak (bfd *abfd, Elf_Internal_Rela *rel)
10884 unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
10885 struct elf_link_hash_entry *h;
10887 h = get_elf_r_symndx_hash_entry (abfd, r_symndx);
10888 if (h && h->root.type == bfd_link_hash_defweak)
10895 pcrel_reloc_fits (xtensa_opcode opc,
10897 bfd_vma self_address,
10898 bfd_vma dest_address)
10900 xtensa_isa isa = xtensa_default_isa;
10901 uint32 valp = dest_address;
10902 if (xtensa_operand_do_reloc (isa, opc, opnd, &valp, self_address)
10903 || xtensa_operand_encode (isa, opc, opnd, &valp))
10910 xtensa_is_property_section (asection *sec)
10912 if (xtensa_is_insntable_section (sec)
10913 || xtensa_is_littable_section (sec)
10914 || xtensa_is_proptable_section (sec))
10922 xtensa_is_insntable_section (asection *sec)
10924 if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
10925 || CONST_STRNEQ (sec->name, ".gnu.linkonce.x."))
10933 xtensa_is_littable_section (asection *sec)
10935 if (CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME)
10936 || CONST_STRNEQ (sec->name, ".gnu.linkonce.p."))
10944 xtensa_is_proptable_section (asection *sec)
10946 if (CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME)
10947 || CONST_STRNEQ (sec->name, ".gnu.linkonce.prop."))
10955 internal_reloc_compare (const void *ap, const void *bp)
10957 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
10958 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
10960 if (a->r_offset != b->r_offset)
10961 return (a->r_offset - b->r_offset);
10963 /* We don't need to sort on these criteria for correctness,
10964 but enforcing a more strict ordering prevents unstable qsort
10965 from behaving differently with different implementations.
10966 Without the code below we get correct but different results
10967 on Solaris 2.7 and 2.8. We would like to always produce the
10968 same results no matter the host. */
10970 if (a->r_info != b->r_info)
10971 return (a->r_info - b->r_info);
10973 return (a->r_addend - b->r_addend);
10978 internal_reloc_matches (const void *ap, const void *bp)
10980 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
10981 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
10983 /* Check if one entry overlaps with the other; this shouldn't happen
10984 except when searching for a match. */
10985 return (a->r_offset - b->r_offset);
10989 /* Predicate function used to look up a section in a particular group. */
10992 match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
10994 const char *gname = inf;
10995 const char *group_name = elf_group_name (sec);
10997 return (group_name == gname
10998 || (group_name != NULL
11000 && strcmp (group_name, gname) == 0));
11005 xtensa_add_names (const char *base, const char *suffix)
11009 size_t base_len = strlen (base);
11010 size_t suffix_len = strlen (suffix);
11011 char *str = bfd_malloc (base_len + suffix_len + 1);
11013 memcpy (str, base, base_len);
11014 memcpy (str + base_len, suffix, suffix_len + 1);
11019 return strdup (base);
11023 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
11026 xtensa_property_section_name (asection *sec, const char *base_name,
11027 bfd_boolean separate_sections)
11029 const char *suffix, *group_name;
11030 char *prop_sec_name;
11032 group_name = elf_group_name (sec);
11035 suffix = strrchr (sec->name, '.');
11036 if (suffix == sec->name)
11038 prop_sec_name = xtensa_add_names (base_name, suffix);
11040 else if (strncmp (sec->name, ".gnu.linkonce.", linkonce_len) == 0)
11042 char *linkonce_kind = 0;
11044 if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
11045 linkonce_kind = "x.";
11046 else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
11047 linkonce_kind = "p.";
11048 else if (strcmp (base_name, XTENSA_PROP_SEC_NAME) == 0)
11049 linkonce_kind = "prop.";
11053 prop_sec_name = (char *) bfd_malloc (strlen (sec->name)
11054 + strlen (linkonce_kind) + 1);
11055 memcpy (prop_sec_name, ".gnu.linkonce.", linkonce_len);
11056 strcpy (prop_sec_name + linkonce_len, linkonce_kind);
11058 suffix = sec->name + linkonce_len;
11059 /* For backward compatibility, replace "t." instead of inserting
11060 the new linkonce_kind (but not for "prop" sections). */
11061 if (CONST_STRNEQ (suffix, "t.") && linkonce_kind[1] == '.')
11063 strcat (prop_sec_name + linkonce_len, suffix);
11067 prop_sec_name = xtensa_add_names (base_name,
11068 separate_sections ? sec->name : NULL);
11071 return prop_sec_name;
11076 xtensa_get_separate_property_section (asection *sec, const char *base_name,
11077 bfd_boolean separate_section)
11079 char *prop_sec_name;
11080 asection *prop_sec;
11082 prop_sec_name = xtensa_property_section_name (sec, base_name,
11084 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11085 match_section_group,
11086 (void *) elf_group_name (sec));
11087 free (prop_sec_name);
11092 xtensa_get_property_section (asection *sec, const char *base_name)
11094 asection *prop_sec;
11096 /* Try individual property section first. */
11097 prop_sec = xtensa_get_separate_property_section (sec, base_name, TRUE);
11099 /* Refer to a common property section if individual is not present. */
11101 prop_sec = xtensa_get_separate_property_section (sec, base_name, FALSE);
11108 xtensa_make_property_section (asection *sec, const char *base_name)
11110 char *prop_sec_name;
11111 asection *prop_sec;
11113 /* Check if the section already exists. */
11114 prop_sec_name = xtensa_property_section_name (sec, base_name,
11115 elf32xtensa_separate_props);
11116 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11117 match_section_group,
11118 (void *) elf_group_name (sec));
11119 /* If not, create it. */
11122 flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
11123 flags |= (bfd_get_section_flags (sec->owner, sec)
11124 & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES));
11126 prop_sec = bfd_make_section_anyway_with_flags
11127 (sec->owner, strdup (prop_sec_name), flags);
11131 elf_group_name (prop_sec) = elf_group_name (sec);
11134 free (prop_sec_name);
11140 xtensa_get_property_predef_flags (asection *sec)
11142 if (xtensa_is_insntable_section (sec))
11143 return (XTENSA_PROP_INSN
11144 | XTENSA_PROP_NO_TRANSFORM
11145 | XTENSA_PROP_INSN_NO_REORDER);
11147 if (xtensa_is_littable_section (sec))
11148 return (XTENSA_PROP_LITERAL
11149 | XTENSA_PROP_NO_TRANSFORM
11150 | XTENSA_PROP_INSN_NO_REORDER);
11156 /* Other functions called directly by the linker. */
11159 xtensa_callback_required_dependence (bfd *abfd,
11161 struct bfd_link_info *link_info,
11162 deps_callback_t callback,
11165 Elf_Internal_Rela *internal_relocs;
11166 bfd_byte *contents;
11168 bfd_boolean ok = TRUE;
11169 bfd_size_type sec_size;
11171 sec_size = bfd_get_section_limit (abfd, sec);
11173 /* ".plt*" sections have no explicit relocations but they contain L32R
11174 instructions that reference the corresponding ".got.plt*" sections. */
11175 if ((sec->flags & SEC_LINKER_CREATED) != 0
11176 && CONST_STRNEQ (sec->name, ".plt"))
11180 /* Find the corresponding ".got.plt*" section. */
11181 if (sec->name[4] == '\0')
11182 sgotplt = elf_hash_table (link_info)->sgotplt;
11188 BFD_ASSERT (sec->name[4] == '.');
11189 chunk = strtol (&sec->name[5], NULL, 10);
11191 sprintf (got_name, ".got.plt.%u", chunk);
11192 sgotplt = bfd_get_linker_section (sec->owner, got_name);
11194 BFD_ASSERT (sgotplt);
11196 /* Assume worst-case offsets: L32R at the very end of the ".plt"
11197 section referencing a literal at the very beginning of
11198 ".got.plt". This is very close to the real dependence, anyway. */
11199 (*callback) (sec, sec_size, sgotplt, 0, closure);
11202 /* Only ELF files are supported for Xtensa. Check here to avoid a segfault
11203 when building uclibc, which runs "ld -b binary /dev/null". */
11204 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
11207 internal_relocs = retrieve_internal_relocs (abfd, sec,
11208 link_info->keep_memory);
11209 if (internal_relocs == NULL
11210 || sec->reloc_count == 0)
11213 /* Cache the contents for the duration of this scan. */
11214 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
11215 if (contents == NULL && sec_size != 0)
11221 if (!xtensa_default_isa)
11222 xtensa_default_isa = xtensa_isa_init (0, 0);
11224 for (i = 0; i < sec->reloc_count; i++)
11226 Elf_Internal_Rela *irel = &internal_relocs[i];
11227 if (is_l32r_relocation (abfd, sec, contents, irel))
11230 asection *target_sec;
11231 bfd_vma target_offset;
11233 r_reloc_init (&l32r_rel, abfd, irel, contents, sec_size);
11236 /* L32Rs must be local to the input file. */
11237 if (r_reloc_is_defined (&l32r_rel))
11239 target_sec = r_reloc_get_section (&l32r_rel);
11240 target_offset = l32r_rel.target_offset;
11242 (*callback) (sec, irel->r_offset, target_sec, target_offset,
11248 release_internal_relocs (sec, internal_relocs);
11249 release_contents (sec, contents);
11253 /* The default literal sections should always be marked as "code" (i.e.,
11254 SHF_EXECINSTR). This is particularly important for the Linux kernel
11255 module loader so that the literals are not placed after the text. */
11256 static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
11258 { STRING_COMMA_LEN (".fini.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11259 { STRING_COMMA_LEN (".init.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11260 { STRING_COMMA_LEN (".literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11261 { STRING_COMMA_LEN (".xtensa.info"), 0, SHT_NOTE, 0 },
11262 { NULL, 0, 0, 0, 0 }
11265 #define ELF_TARGET_ID XTENSA_ELF_DATA
11267 #define TARGET_LITTLE_SYM xtensa_elf32_le_vec
11268 #define TARGET_LITTLE_NAME "elf32-xtensa-le"
11269 #define TARGET_BIG_SYM xtensa_elf32_be_vec
11270 #define TARGET_BIG_NAME "elf32-xtensa-be"
11271 #define ELF_ARCH bfd_arch_xtensa
11273 #define ELF_MACHINE_CODE EM_XTENSA
11274 #define ELF_MACHINE_ALT1 EM_XTENSA_OLD
11276 #define ELF_MAXPAGESIZE 0x1000
11277 #endif /* ELF_ARCH */
11279 #define elf_backend_can_gc_sections 1
11280 #define elf_backend_can_refcount 1
11281 #define elf_backend_plt_readonly 1
11282 #define elf_backend_got_header_size 4
11283 #define elf_backend_want_dynbss 0
11284 #define elf_backend_want_got_plt 1
11285 #define elf_backend_dtrel_excludes_plt 1
11287 #define elf_info_to_howto elf_xtensa_info_to_howto_rela
11289 #define bfd_elf32_mkobject elf_xtensa_mkobject
11291 #define bfd_elf32_bfd_merge_private_bfd_data elf_xtensa_merge_private_bfd_data
11292 #define bfd_elf32_new_section_hook elf_xtensa_new_section_hook
11293 #define bfd_elf32_bfd_print_private_bfd_data elf_xtensa_print_private_bfd_data
11294 #define bfd_elf32_bfd_relax_section elf_xtensa_relax_section
11295 #define bfd_elf32_bfd_reloc_type_lookup elf_xtensa_reloc_type_lookup
11296 #define bfd_elf32_bfd_reloc_name_lookup \
11297 elf_xtensa_reloc_name_lookup
11298 #define bfd_elf32_bfd_set_private_flags elf_xtensa_set_private_flags
11299 #define bfd_elf32_bfd_link_hash_table_create elf_xtensa_link_hash_table_create
11301 #define elf_backend_adjust_dynamic_symbol elf_xtensa_adjust_dynamic_symbol
11302 #define elf_backend_check_relocs elf_xtensa_check_relocs
11303 #define elf_backend_create_dynamic_sections elf_xtensa_create_dynamic_sections
11304 #define elf_backend_discard_info elf_xtensa_discard_info
11305 #define elf_backend_ignore_discarded_relocs elf_xtensa_ignore_discarded_relocs
11306 #define elf_backend_final_write_processing elf_xtensa_final_write_processing
11307 #define elf_backend_finish_dynamic_sections elf_xtensa_finish_dynamic_sections
11308 #define elf_backend_finish_dynamic_symbol elf_xtensa_finish_dynamic_symbol
11309 #define elf_backend_gc_mark_hook elf_xtensa_gc_mark_hook
11310 #define elf_backend_grok_prstatus elf_xtensa_grok_prstatus
11311 #define elf_backend_grok_psinfo elf_xtensa_grok_psinfo
11312 #define elf_backend_hide_symbol elf_xtensa_hide_symbol
11313 #define elf_backend_object_p elf_xtensa_object_p
11314 #define elf_backend_reloc_type_class elf_xtensa_reloc_type_class
11315 #define elf_backend_relocate_section elf_xtensa_relocate_section
11316 #define elf_backend_size_dynamic_sections elf_xtensa_size_dynamic_sections
11317 #define elf_backend_always_size_sections elf_xtensa_always_size_sections
11318 #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
11319 #define elf_backend_special_sections elf_xtensa_special_sections
11320 #define elf_backend_action_discarded elf_xtensa_action_discarded
11321 #define elf_backend_copy_indirect_symbol elf_xtensa_copy_indirect_symbol
11323 #include "elf32-target.h"