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 /* Rename one of the generic section flags to better document how it
159 /* Whether relocations have been processed. */
160 #define reloc_done sec_flg0
162 static reloc_howto_type elf_howto_table[] =
164 HOWTO (R_XTENSA_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
165 bfd_elf_xtensa_reloc, "R_XTENSA_NONE",
167 HOWTO (R_XTENSA_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
168 bfd_elf_xtensa_reloc, "R_XTENSA_32",
169 TRUE, 0xffffffff, 0xffffffff, FALSE),
171 /* Replace a 32-bit value with a value from the runtime linker (only
172 used by linker-generated stub functions). The r_addend value is
173 special: 1 means to substitute a pointer to the runtime linker's
174 dynamic resolver function; 2 means to substitute the link map for
175 the shared object. */
176 HOWTO (R_XTENSA_RTLD, 0, 2, 32, FALSE, 0, complain_overflow_dont,
177 NULL, "R_XTENSA_RTLD", FALSE, 0, 0, FALSE),
179 HOWTO (R_XTENSA_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
180 bfd_elf_generic_reloc, "R_XTENSA_GLOB_DAT",
181 FALSE, 0, 0xffffffff, FALSE),
182 HOWTO (R_XTENSA_JMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
183 bfd_elf_generic_reloc, "R_XTENSA_JMP_SLOT",
184 FALSE, 0, 0xffffffff, FALSE),
185 HOWTO (R_XTENSA_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
186 bfd_elf_generic_reloc, "R_XTENSA_RELATIVE",
187 FALSE, 0, 0xffffffff, FALSE),
188 HOWTO (R_XTENSA_PLT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
189 bfd_elf_xtensa_reloc, "R_XTENSA_PLT",
190 FALSE, 0, 0xffffffff, FALSE),
194 /* Old relocations for backward compatibility. */
195 HOWTO (R_XTENSA_OP0, 0, 0, 0, TRUE, 0, complain_overflow_dont,
196 bfd_elf_xtensa_reloc, "R_XTENSA_OP0", FALSE, 0, 0, TRUE),
197 HOWTO (R_XTENSA_OP1, 0, 0, 0, TRUE, 0, complain_overflow_dont,
198 bfd_elf_xtensa_reloc, "R_XTENSA_OP1", FALSE, 0, 0, TRUE),
199 HOWTO (R_XTENSA_OP2, 0, 0, 0, TRUE, 0, complain_overflow_dont,
200 bfd_elf_xtensa_reloc, "R_XTENSA_OP2", FALSE, 0, 0, TRUE),
202 /* Assembly auto-expansion. */
203 HOWTO (R_XTENSA_ASM_EXPAND, 0, 0, 0, TRUE, 0, complain_overflow_dont,
204 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_EXPAND", FALSE, 0, 0, TRUE),
205 /* Relax assembly auto-expansion. */
206 HOWTO (R_XTENSA_ASM_SIMPLIFY, 0, 0, 0, TRUE, 0, complain_overflow_dont,
207 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_SIMPLIFY", FALSE, 0, 0, TRUE),
211 HOWTO (R_XTENSA_32_PCREL, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
212 bfd_elf_xtensa_reloc, "R_XTENSA_32_PCREL",
213 FALSE, 0, 0xffffffff, TRUE),
215 /* GNU extension to record C++ vtable hierarchy. */
216 HOWTO (R_XTENSA_GNU_VTINHERIT, 0, 2, 0, FALSE, 0, complain_overflow_dont,
217 NULL, "R_XTENSA_GNU_VTINHERIT",
219 /* GNU extension to record C++ vtable member usage. */
220 HOWTO (R_XTENSA_GNU_VTENTRY, 0, 2, 0, FALSE, 0, complain_overflow_dont,
221 _bfd_elf_rel_vtable_reloc_fn, "R_XTENSA_GNU_VTENTRY",
224 /* Relocations for supporting difference of symbols. */
225 HOWTO (R_XTENSA_DIFF8, 0, 0, 8, FALSE, 0, complain_overflow_signed,
226 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF8", FALSE, 0, 0xff, FALSE),
227 HOWTO (R_XTENSA_DIFF16, 0, 1, 16, FALSE, 0, complain_overflow_signed,
228 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF16", FALSE, 0, 0xffff, FALSE),
229 HOWTO (R_XTENSA_DIFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
230 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF32", FALSE, 0, 0xffffffff, FALSE),
232 /* General immediate operand relocations. */
233 HOWTO (R_XTENSA_SLOT0_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
234 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_OP", FALSE, 0, 0, TRUE),
235 HOWTO (R_XTENSA_SLOT1_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
236 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_OP", FALSE, 0, 0, TRUE),
237 HOWTO (R_XTENSA_SLOT2_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
238 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_OP", FALSE, 0, 0, TRUE),
239 HOWTO (R_XTENSA_SLOT3_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
240 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_OP", FALSE, 0, 0, TRUE),
241 HOWTO (R_XTENSA_SLOT4_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
242 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_OP", FALSE, 0, 0, TRUE),
243 HOWTO (R_XTENSA_SLOT5_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
244 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_OP", FALSE, 0, 0, TRUE),
245 HOWTO (R_XTENSA_SLOT6_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
246 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_OP", FALSE, 0, 0, TRUE),
247 HOWTO (R_XTENSA_SLOT7_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
248 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_OP", FALSE, 0, 0, TRUE),
249 HOWTO (R_XTENSA_SLOT8_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
250 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_OP", FALSE, 0, 0, TRUE),
251 HOWTO (R_XTENSA_SLOT9_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
252 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_OP", FALSE, 0, 0, TRUE),
253 HOWTO (R_XTENSA_SLOT10_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
254 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_OP", FALSE, 0, 0, TRUE),
255 HOWTO (R_XTENSA_SLOT11_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
256 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_OP", FALSE, 0, 0, TRUE),
257 HOWTO (R_XTENSA_SLOT12_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
258 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_OP", FALSE, 0, 0, TRUE),
259 HOWTO (R_XTENSA_SLOT13_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
260 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_OP", FALSE, 0, 0, TRUE),
261 HOWTO (R_XTENSA_SLOT14_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
262 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_OP", FALSE, 0, 0, TRUE),
264 /* "Alternate" relocations. The meaning of these is opcode-specific. */
265 HOWTO (R_XTENSA_SLOT0_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
266 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_ALT", FALSE, 0, 0, TRUE),
267 HOWTO (R_XTENSA_SLOT1_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
268 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_ALT", FALSE, 0, 0, TRUE),
269 HOWTO (R_XTENSA_SLOT2_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
270 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_ALT", FALSE, 0, 0, TRUE),
271 HOWTO (R_XTENSA_SLOT3_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
272 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_ALT", FALSE, 0, 0, TRUE),
273 HOWTO (R_XTENSA_SLOT4_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
274 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_ALT", FALSE, 0, 0, TRUE),
275 HOWTO (R_XTENSA_SLOT5_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
276 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_ALT", FALSE, 0, 0, TRUE),
277 HOWTO (R_XTENSA_SLOT6_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
278 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_ALT", FALSE, 0, 0, TRUE),
279 HOWTO (R_XTENSA_SLOT7_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
280 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_ALT", FALSE, 0, 0, TRUE),
281 HOWTO (R_XTENSA_SLOT8_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
282 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_ALT", FALSE, 0, 0, TRUE),
283 HOWTO (R_XTENSA_SLOT9_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
284 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_ALT", FALSE, 0, 0, TRUE),
285 HOWTO (R_XTENSA_SLOT10_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
286 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_ALT", FALSE, 0, 0, TRUE),
287 HOWTO (R_XTENSA_SLOT11_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
288 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_ALT", FALSE, 0, 0, TRUE),
289 HOWTO (R_XTENSA_SLOT12_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
290 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_ALT", FALSE, 0, 0, TRUE),
291 HOWTO (R_XTENSA_SLOT13_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
292 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_ALT", FALSE, 0, 0, TRUE),
293 HOWTO (R_XTENSA_SLOT14_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
294 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_ALT", FALSE, 0, 0, TRUE),
296 /* TLS relocations. */
297 HOWTO (R_XTENSA_TLSDESC_FN, 0, 2, 32, FALSE, 0, complain_overflow_dont,
298 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_FN",
299 FALSE, 0, 0xffffffff, FALSE),
300 HOWTO (R_XTENSA_TLSDESC_ARG, 0, 2, 32, FALSE, 0, complain_overflow_dont,
301 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_ARG",
302 FALSE, 0, 0xffffffff, FALSE),
303 HOWTO (R_XTENSA_TLS_DTPOFF, 0, 2, 32, FALSE, 0, complain_overflow_dont,
304 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_DTPOFF",
305 FALSE, 0, 0xffffffff, FALSE),
306 HOWTO (R_XTENSA_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_dont,
307 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_TPOFF",
308 FALSE, 0, 0xffffffff, FALSE),
309 HOWTO (R_XTENSA_TLS_FUNC, 0, 0, 0, FALSE, 0, complain_overflow_dont,
310 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_FUNC",
312 HOWTO (R_XTENSA_TLS_ARG, 0, 0, 0, FALSE, 0, complain_overflow_dont,
313 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_ARG",
315 HOWTO (R_XTENSA_TLS_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
316 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_CALL",
322 fprintf (stderr, "Xtensa bfd reloc lookup %d (%s)\n", code, str)
327 static reloc_howto_type *
328 elf_xtensa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
329 bfd_reloc_code_real_type code)
334 TRACE ("BFD_RELOC_NONE");
335 return &elf_howto_table[(unsigned) R_XTENSA_NONE ];
338 TRACE ("BFD_RELOC_32");
339 return &elf_howto_table[(unsigned) R_XTENSA_32 ];
341 case BFD_RELOC_32_PCREL:
342 TRACE ("BFD_RELOC_32_PCREL");
343 return &elf_howto_table[(unsigned) R_XTENSA_32_PCREL ];
345 case BFD_RELOC_XTENSA_DIFF8:
346 TRACE ("BFD_RELOC_XTENSA_DIFF8");
347 return &elf_howto_table[(unsigned) R_XTENSA_DIFF8 ];
349 case BFD_RELOC_XTENSA_DIFF16:
350 TRACE ("BFD_RELOC_XTENSA_DIFF16");
351 return &elf_howto_table[(unsigned) R_XTENSA_DIFF16 ];
353 case BFD_RELOC_XTENSA_DIFF32:
354 TRACE ("BFD_RELOC_XTENSA_DIFF32");
355 return &elf_howto_table[(unsigned) R_XTENSA_DIFF32 ];
357 case BFD_RELOC_XTENSA_RTLD:
358 TRACE ("BFD_RELOC_XTENSA_RTLD");
359 return &elf_howto_table[(unsigned) R_XTENSA_RTLD ];
361 case BFD_RELOC_XTENSA_GLOB_DAT:
362 TRACE ("BFD_RELOC_XTENSA_GLOB_DAT");
363 return &elf_howto_table[(unsigned) R_XTENSA_GLOB_DAT ];
365 case BFD_RELOC_XTENSA_JMP_SLOT:
366 TRACE ("BFD_RELOC_XTENSA_JMP_SLOT");
367 return &elf_howto_table[(unsigned) R_XTENSA_JMP_SLOT ];
369 case BFD_RELOC_XTENSA_RELATIVE:
370 TRACE ("BFD_RELOC_XTENSA_RELATIVE");
371 return &elf_howto_table[(unsigned) R_XTENSA_RELATIVE ];
373 case BFD_RELOC_XTENSA_PLT:
374 TRACE ("BFD_RELOC_XTENSA_PLT");
375 return &elf_howto_table[(unsigned) R_XTENSA_PLT ];
377 case BFD_RELOC_XTENSA_OP0:
378 TRACE ("BFD_RELOC_XTENSA_OP0");
379 return &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
381 case BFD_RELOC_XTENSA_OP1:
382 TRACE ("BFD_RELOC_XTENSA_OP1");
383 return &elf_howto_table[(unsigned) R_XTENSA_OP1 ];
385 case BFD_RELOC_XTENSA_OP2:
386 TRACE ("BFD_RELOC_XTENSA_OP2");
387 return &elf_howto_table[(unsigned) R_XTENSA_OP2 ];
389 case BFD_RELOC_XTENSA_ASM_EXPAND:
390 TRACE ("BFD_RELOC_XTENSA_ASM_EXPAND");
391 return &elf_howto_table[(unsigned) R_XTENSA_ASM_EXPAND ];
393 case BFD_RELOC_XTENSA_ASM_SIMPLIFY:
394 TRACE ("BFD_RELOC_XTENSA_ASM_SIMPLIFY");
395 return &elf_howto_table[(unsigned) R_XTENSA_ASM_SIMPLIFY ];
397 case BFD_RELOC_VTABLE_INHERIT:
398 TRACE ("BFD_RELOC_VTABLE_INHERIT");
399 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTINHERIT ];
401 case BFD_RELOC_VTABLE_ENTRY:
402 TRACE ("BFD_RELOC_VTABLE_ENTRY");
403 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTENTRY ];
405 case BFD_RELOC_XTENSA_TLSDESC_FN:
406 TRACE ("BFD_RELOC_XTENSA_TLSDESC_FN");
407 return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_FN ];
409 case BFD_RELOC_XTENSA_TLSDESC_ARG:
410 TRACE ("BFD_RELOC_XTENSA_TLSDESC_ARG");
411 return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_ARG ];
413 case BFD_RELOC_XTENSA_TLS_DTPOFF:
414 TRACE ("BFD_RELOC_XTENSA_TLS_DTPOFF");
415 return &elf_howto_table[(unsigned) R_XTENSA_TLS_DTPOFF ];
417 case BFD_RELOC_XTENSA_TLS_TPOFF:
418 TRACE ("BFD_RELOC_XTENSA_TLS_TPOFF");
419 return &elf_howto_table[(unsigned) R_XTENSA_TLS_TPOFF ];
421 case BFD_RELOC_XTENSA_TLS_FUNC:
422 TRACE ("BFD_RELOC_XTENSA_TLS_FUNC");
423 return &elf_howto_table[(unsigned) R_XTENSA_TLS_FUNC ];
425 case BFD_RELOC_XTENSA_TLS_ARG:
426 TRACE ("BFD_RELOC_XTENSA_TLS_ARG");
427 return &elf_howto_table[(unsigned) R_XTENSA_TLS_ARG ];
429 case BFD_RELOC_XTENSA_TLS_CALL:
430 TRACE ("BFD_RELOC_XTENSA_TLS_CALL");
431 return &elf_howto_table[(unsigned) R_XTENSA_TLS_CALL ];
434 if (code >= BFD_RELOC_XTENSA_SLOT0_OP
435 && code <= BFD_RELOC_XTENSA_SLOT14_OP)
437 unsigned n = (R_XTENSA_SLOT0_OP +
438 (code - BFD_RELOC_XTENSA_SLOT0_OP));
439 return &elf_howto_table[n];
442 if (code >= BFD_RELOC_XTENSA_SLOT0_ALT
443 && code <= BFD_RELOC_XTENSA_SLOT14_ALT)
445 unsigned n = (R_XTENSA_SLOT0_ALT +
446 (code - BFD_RELOC_XTENSA_SLOT0_ALT));
447 return &elf_howto_table[n];
453 /* xgettext:c-format */
454 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
455 bfd_set_error (bfd_error_bad_value);
460 static reloc_howto_type *
461 elf_xtensa_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
466 for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
467 if (elf_howto_table[i].name != NULL
468 && strcasecmp (elf_howto_table[i].name, r_name) == 0)
469 return &elf_howto_table[i];
475 /* Given an ELF "rela" relocation, find the corresponding howto and record
476 it in the BFD internal arelent representation of the relocation. */
479 elf_xtensa_info_to_howto_rela (bfd *abfd,
481 Elf_Internal_Rela *dst)
483 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
485 if (r_type >= (unsigned int) R_XTENSA_max)
487 /* xgettext:c-format */
488 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
490 bfd_set_error (bfd_error_bad_value);
493 cache_ptr->howto = &elf_howto_table[r_type];
498 /* Functions for the Xtensa ELF linker. */
500 /* The name of the dynamic interpreter. This is put in the .interp
503 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
505 /* The size in bytes of an entry in the procedure linkage table.
506 (This does _not_ include the space for the literals associated with
509 #define PLT_ENTRY_SIZE 16
511 /* For _really_ large PLTs, we may need to alternate between literals
512 and code to keep the literals within the 256K range of the L32R
513 instructions in the code. It's unlikely that anyone would ever need
514 such a big PLT, but an arbitrary limit on the PLT size would be bad.
515 Thus, we split the PLT into chunks. Since there's very little
516 overhead (2 extra literals) for each chunk, the chunk size is kept
517 small so that the code for handling multiple chunks get used and
518 tested regularly. With 254 entries, there are 1K of literals for
519 each chunk, and that seems like a nice round number. */
521 #define PLT_ENTRIES_PER_CHUNK 254
523 /* PLT entries are actually used as stub functions for lazy symbol
524 resolution. Once the symbol is resolved, the stub function is never
525 invoked. Note: the 32-byte frame size used here cannot be changed
526 without a corresponding change in the runtime linker. */
528 static const bfd_byte elf_xtensa_be_plt_entry[][PLT_ENTRY_SIZE] =
531 0x6c, 0x10, 0x04, /* entry sp, 32 */
532 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
533 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
534 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
535 0x0a, 0x80, 0x00, /* jx a8 */
539 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
540 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
541 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
542 0x0a, 0x80, 0x00, /* jx a8 */
547 static const bfd_byte elf_xtensa_le_plt_entry[][PLT_ENTRY_SIZE] =
550 0x36, 0x41, 0x00, /* entry sp, 32 */
551 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
552 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
553 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
554 0xa0, 0x08, 0x00, /* jx a8 */
558 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
559 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
560 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
561 0xa0, 0x08, 0x00, /* jx a8 */
566 /* The size of the thread control block. */
569 struct elf_xtensa_link_hash_entry
571 struct elf_link_hash_entry elf;
573 bfd_signed_vma tlsfunc_refcount;
575 #define GOT_UNKNOWN 0
577 #define GOT_TLS_GD 2 /* global or local dynamic */
578 #define GOT_TLS_IE 4 /* initial or local exec */
579 #define GOT_TLS_ANY (GOT_TLS_GD | GOT_TLS_IE)
580 unsigned char tls_type;
583 #define elf_xtensa_hash_entry(ent) ((struct elf_xtensa_link_hash_entry *)(ent))
585 struct elf_xtensa_obj_tdata
587 struct elf_obj_tdata root;
589 /* tls_type for each local got entry. */
590 char *local_got_tls_type;
592 bfd_signed_vma *local_tlsfunc_refcounts;
595 #define elf_xtensa_tdata(abfd) \
596 ((struct elf_xtensa_obj_tdata *) (abfd)->tdata.any)
598 #define elf_xtensa_local_got_tls_type(abfd) \
599 (elf_xtensa_tdata (abfd)->local_got_tls_type)
601 #define elf_xtensa_local_tlsfunc_refcounts(abfd) \
602 (elf_xtensa_tdata (abfd)->local_tlsfunc_refcounts)
604 #define is_xtensa_elf(bfd) \
605 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
606 && elf_tdata (bfd) != NULL \
607 && elf_object_id (bfd) == XTENSA_ELF_DATA)
610 elf_xtensa_mkobject (bfd *abfd)
612 return bfd_elf_allocate_object (abfd, sizeof (struct elf_xtensa_obj_tdata),
616 /* Xtensa ELF linker hash table. */
618 struct elf_xtensa_link_hash_table
620 struct elf_link_hash_table elf;
622 /* Short-cuts to get to dynamic linker sections. */
624 asection *spltlittbl;
626 /* Total count of PLT relocations seen during check_relocs.
627 The actual PLT code must be split into multiple sections and all
628 the sections have to be created before size_dynamic_sections,
629 where we figure out the exact number of PLT entries that will be
630 needed. It is OK if this count is an overestimate, e.g., some
631 relocations may be removed by GC. */
634 struct elf_xtensa_link_hash_entry *tlsbase;
637 /* Get the Xtensa ELF linker hash table from a link_info structure. */
639 #define elf_xtensa_hash_table(p) \
640 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
641 == XTENSA_ELF_DATA ? ((struct elf_xtensa_link_hash_table *) ((p)->hash)) : NULL)
643 /* Create an entry in an Xtensa ELF linker hash table. */
645 static struct bfd_hash_entry *
646 elf_xtensa_link_hash_newfunc (struct bfd_hash_entry *entry,
647 struct bfd_hash_table *table,
650 /* Allocate the structure if it has not already been allocated by a
654 entry = bfd_hash_allocate (table,
655 sizeof (struct elf_xtensa_link_hash_entry));
660 /* Call the allocation method of the superclass. */
661 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
664 struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (entry);
665 eh->tlsfunc_refcount = 0;
666 eh->tls_type = GOT_UNKNOWN;
672 /* Create an Xtensa ELF linker hash table. */
674 static struct bfd_link_hash_table *
675 elf_xtensa_link_hash_table_create (bfd *abfd)
677 struct elf_link_hash_entry *tlsbase;
678 struct elf_xtensa_link_hash_table *ret;
679 bfd_size_type amt = sizeof (struct elf_xtensa_link_hash_table);
681 ret = bfd_zmalloc (amt);
685 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
686 elf_xtensa_link_hash_newfunc,
687 sizeof (struct elf_xtensa_link_hash_entry),
694 /* Create a hash entry for "_TLS_MODULE_BASE_" to speed up checking
696 tlsbase = elf_link_hash_lookup (&ret->elf, "_TLS_MODULE_BASE_",
698 tlsbase->root.type = bfd_link_hash_new;
699 tlsbase->root.u.undef.abfd = NULL;
700 tlsbase->non_elf = 0;
701 ret->tlsbase = elf_xtensa_hash_entry (tlsbase);
702 ret->tlsbase->tls_type = GOT_UNKNOWN;
704 return &ret->elf.root;
707 /* Copy the extra info we tack onto an elf_link_hash_entry. */
710 elf_xtensa_copy_indirect_symbol (struct bfd_link_info *info,
711 struct elf_link_hash_entry *dir,
712 struct elf_link_hash_entry *ind)
714 struct elf_xtensa_link_hash_entry *edir, *eind;
716 edir = elf_xtensa_hash_entry (dir);
717 eind = elf_xtensa_hash_entry (ind);
719 if (ind->root.type == bfd_link_hash_indirect)
721 edir->tlsfunc_refcount += eind->tlsfunc_refcount;
722 eind->tlsfunc_refcount = 0;
724 if (dir->got.refcount <= 0)
726 edir->tls_type = eind->tls_type;
727 eind->tls_type = GOT_UNKNOWN;
731 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
734 static inline bfd_boolean
735 elf_xtensa_dynamic_symbol_p (struct elf_link_hash_entry *h,
736 struct bfd_link_info *info)
738 /* Check if we should do dynamic things to this symbol. The
739 "ignore_protected" argument need not be set, because Xtensa code
740 does not require special handling of STV_PROTECTED to make function
741 pointer comparisons work properly. The PLT addresses are never
742 used for function pointers. */
744 return _bfd_elf_dynamic_symbol_p (h, info, 0);
749 property_table_compare (const void *ap, const void *bp)
751 const property_table_entry *a = (const property_table_entry *) ap;
752 const property_table_entry *b = (const property_table_entry *) bp;
754 if (a->address == b->address)
756 if (a->size != b->size)
757 return (a->size - b->size);
759 if ((a->flags & XTENSA_PROP_ALIGN) != (b->flags & XTENSA_PROP_ALIGN))
760 return ((b->flags & XTENSA_PROP_ALIGN)
761 - (a->flags & XTENSA_PROP_ALIGN));
763 if ((a->flags & XTENSA_PROP_ALIGN)
764 && (GET_XTENSA_PROP_ALIGNMENT (a->flags)
765 != GET_XTENSA_PROP_ALIGNMENT (b->flags)))
766 return (GET_XTENSA_PROP_ALIGNMENT (a->flags)
767 - GET_XTENSA_PROP_ALIGNMENT (b->flags));
769 if ((a->flags & XTENSA_PROP_UNREACHABLE)
770 != (b->flags & XTENSA_PROP_UNREACHABLE))
771 return ((b->flags & XTENSA_PROP_UNREACHABLE)
772 - (a->flags & XTENSA_PROP_UNREACHABLE));
774 return (a->flags - b->flags);
777 return (a->address - b->address);
782 property_table_matches (const void *ap, const void *bp)
784 const property_table_entry *a = (const property_table_entry *) ap;
785 const property_table_entry *b = (const property_table_entry *) bp;
787 /* Check if one entry overlaps with the other. */
788 if ((b->address >= a->address && b->address < (a->address + a->size))
789 || (a->address >= b->address && a->address < (b->address + b->size)))
792 return (a->address - b->address);
796 /* Get the literal table or property table entries for the given
797 section. Sets TABLE_P and returns the number of entries. On
798 error, returns a negative value. */
801 xtensa_read_table_entries (bfd *abfd,
803 property_table_entry **table_p,
804 const char *sec_name,
805 bfd_boolean output_addr)
807 asection *table_section;
808 bfd_size_type table_size = 0;
809 bfd_byte *table_data;
810 property_table_entry *blocks;
811 int blk, block_count;
812 bfd_size_type num_records;
813 Elf_Internal_Rela *internal_relocs, *irel, *rel_end;
814 bfd_vma section_addr, off;
815 flagword predef_flags;
816 bfd_size_type table_entry_size, section_limit;
819 || !(section->flags & SEC_ALLOC)
820 || (section->flags & SEC_DEBUGGING))
826 table_section = xtensa_get_property_section (section, sec_name);
828 table_size = table_section->size;
836 predef_flags = xtensa_get_property_predef_flags (table_section);
837 table_entry_size = 12;
839 table_entry_size -= 4;
841 num_records = table_size / table_entry_size;
842 table_data = retrieve_contents (abfd, table_section, TRUE);
843 blocks = (property_table_entry *)
844 bfd_malloc (num_records * sizeof (property_table_entry));
848 section_addr = section->output_section->vma + section->output_offset;
850 section_addr = section->vma;
852 internal_relocs = retrieve_internal_relocs (abfd, table_section, TRUE);
853 if (internal_relocs && !table_section->reloc_done)
855 qsort (internal_relocs, table_section->reloc_count,
856 sizeof (Elf_Internal_Rela), internal_reloc_compare);
857 irel = internal_relocs;
862 section_limit = bfd_get_section_limit (abfd, section);
863 rel_end = internal_relocs + table_section->reloc_count;
865 for (off = 0; off < table_size; off += table_entry_size)
867 bfd_vma address = bfd_get_32 (abfd, table_data + off);
869 /* Skip any relocations before the current offset. This should help
870 avoid confusion caused by unexpected relocations for the preceding
873 (irel->r_offset < off
874 || (irel->r_offset == off
875 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_NONE)))
882 if (irel && irel->r_offset == off)
885 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
886 BFD_ASSERT (ELF32_R_TYPE (irel->r_info) == R_XTENSA_32);
888 if (get_elf_r_symndx_section (abfd, r_symndx) != section)
891 sym_off = get_elf_r_symndx_offset (abfd, r_symndx);
892 BFD_ASSERT (sym_off == 0);
893 address += (section_addr + sym_off + irel->r_addend);
897 if (address < section_addr
898 || address >= section_addr + section_limit)
902 blocks[block_count].address = address;
903 blocks[block_count].size = bfd_get_32 (abfd, table_data + off + 4);
905 blocks[block_count].flags = predef_flags;
907 blocks[block_count].flags = bfd_get_32 (abfd, table_data + off + 8);
911 release_contents (table_section, table_data);
912 release_internal_relocs (table_section, internal_relocs);
916 /* Now sort them into address order for easy reference. */
917 qsort (blocks, block_count, sizeof (property_table_entry),
918 property_table_compare);
920 /* Check that the table contents are valid. Problems may occur,
921 for example, if an unrelocated object file is stripped. */
922 for (blk = 1; blk < block_count; blk++)
924 /* The only circumstance where two entries may legitimately
925 have the same address is when one of them is a zero-size
926 placeholder to mark a place where fill can be inserted.
927 The zero-size entry should come first. */
928 if (blocks[blk - 1].address == blocks[blk].address &&
929 blocks[blk - 1].size != 0)
931 /* xgettext:c-format */
932 _bfd_error_handler (_("%pB(%pA): invalid property table"),
934 bfd_set_error (bfd_error_bad_value);
946 static property_table_entry *
947 elf_xtensa_find_property_entry (property_table_entry *property_table,
948 int property_table_size,
951 property_table_entry entry;
952 property_table_entry *rv;
954 if (property_table_size == 0)
957 entry.address = addr;
961 rv = bsearch (&entry, property_table, property_table_size,
962 sizeof (property_table_entry), property_table_matches);
968 elf_xtensa_in_literal_pool (property_table_entry *lit_table,
972 if (elf_xtensa_find_property_entry (lit_table, lit_table_size, addr))
979 /* Look through the relocs for a section during the first phase, and
980 calculate needed space in the dynamic reloc sections. */
983 elf_xtensa_check_relocs (bfd *abfd,
984 struct bfd_link_info *info,
986 const Elf_Internal_Rela *relocs)
988 struct elf_xtensa_link_hash_table *htab;
989 Elf_Internal_Shdr *symtab_hdr;
990 struct elf_link_hash_entry **sym_hashes;
991 const Elf_Internal_Rela *rel;
992 const Elf_Internal_Rela *rel_end;
994 if (bfd_link_relocatable (info) || (sec->flags & SEC_ALLOC) == 0)
997 BFD_ASSERT (is_xtensa_elf (abfd));
999 htab = elf_xtensa_hash_table (info);
1003 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1004 sym_hashes = elf_sym_hashes (abfd);
1006 rel_end = relocs + sec->reloc_count;
1007 for (rel = relocs; rel < rel_end; rel++)
1009 unsigned int r_type;
1011 struct elf_link_hash_entry *h = NULL;
1012 struct elf_xtensa_link_hash_entry *eh;
1013 int tls_type, old_tls_type;
1014 bfd_boolean is_got = FALSE;
1015 bfd_boolean is_plt = FALSE;
1016 bfd_boolean is_tlsfunc = FALSE;
1018 r_symndx = ELF32_R_SYM (rel->r_info);
1019 r_type = ELF32_R_TYPE (rel->r_info);
1021 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1023 /* xgettext:c-format */
1024 _bfd_error_handler (_("%pB: bad symbol index: %d"),
1029 if (r_symndx >= symtab_hdr->sh_info)
1031 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1032 while (h->root.type == bfd_link_hash_indirect
1033 || h->root.type == bfd_link_hash_warning)
1034 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1036 eh = elf_xtensa_hash_entry (h);
1040 case R_XTENSA_TLSDESC_FN:
1041 if (bfd_link_pic (info))
1043 tls_type = GOT_TLS_GD;
1048 tls_type = GOT_TLS_IE;
1051 case R_XTENSA_TLSDESC_ARG:
1052 if (bfd_link_pic (info))
1054 tls_type = GOT_TLS_GD;
1059 tls_type = GOT_TLS_IE;
1060 if (h && elf_xtensa_hash_entry (h) != htab->tlsbase)
1065 case R_XTENSA_TLS_DTPOFF:
1066 if (bfd_link_pic (info))
1067 tls_type = GOT_TLS_GD;
1069 tls_type = GOT_TLS_IE;
1072 case R_XTENSA_TLS_TPOFF:
1073 tls_type = GOT_TLS_IE;
1074 if (bfd_link_pic (info))
1075 info->flags |= DF_STATIC_TLS;
1076 if (bfd_link_pic (info) || h)
1081 tls_type = GOT_NORMAL;
1086 tls_type = GOT_NORMAL;
1090 case R_XTENSA_GNU_VTINHERIT:
1091 /* This relocation describes the C++ object vtable hierarchy.
1092 Reconstruct it for later use during GC. */
1093 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1097 case R_XTENSA_GNU_VTENTRY:
1098 /* This relocation describes which C++ vtable entries are actually
1099 used. Record for later use during GC. */
1100 BFD_ASSERT (h != NULL);
1102 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1107 /* Nothing to do for any other relocations. */
1115 if (h->plt.refcount <= 0)
1118 h->plt.refcount = 1;
1121 h->plt.refcount += 1;
1123 /* Keep track of the total PLT relocation count even if we
1124 don't yet know whether the dynamic sections will be
1126 htab->plt_reloc_count += 1;
1128 if (elf_hash_table (info)->dynamic_sections_created)
1130 if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1136 if (h->got.refcount <= 0)
1137 h->got.refcount = 1;
1139 h->got.refcount += 1;
1143 eh->tlsfunc_refcount += 1;
1145 old_tls_type = eh->tls_type;
1149 /* Allocate storage the first time. */
1150 if (elf_local_got_refcounts (abfd) == NULL)
1152 bfd_size_type size = symtab_hdr->sh_info;
1155 mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1158 elf_local_got_refcounts (abfd) = (bfd_signed_vma *) mem;
1160 mem = bfd_zalloc (abfd, size);
1163 elf_xtensa_local_got_tls_type (abfd) = (char *) mem;
1165 mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1168 elf_xtensa_local_tlsfunc_refcounts (abfd)
1169 = (bfd_signed_vma *) mem;
1172 /* This is a global offset table entry for a local symbol. */
1173 if (is_got || is_plt)
1174 elf_local_got_refcounts (abfd) [r_symndx] += 1;
1177 elf_xtensa_local_tlsfunc_refcounts (abfd) [r_symndx] += 1;
1179 old_tls_type = elf_xtensa_local_got_tls_type (abfd) [r_symndx];
1182 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1183 tls_type |= old_tls_type;
1184 /* If a TLS symbol is accessed using IE at least once,
1185 there is no point to use a dynamic model for it. */
1186 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1187 && ((old_tls_type & GOT_TLS_GD) == 0
1188 || (tls_type & GOT_TLS_IE) == 0))
1190 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_GD))
1191 tls_type = old_tls_type;
1192 else if ((old_tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_GD))
1193 tls_type |= old_tls_type;
1197 /* xgettext:c-format */
1198 (_("%pB: `%s' accessed both as normal and thread local symbol"),
1200 h ? h->root.root.string : "<local>");
1205 if (old_tls_type != tls_type)
1208 eh->tls_type = tls_type;
1210 elf_xtensa_local_got_tls_type (abfd) [r_symndx] = tls_type;
1219 elf_xtensa_make_sym_local (struct bfd_link_info *info,
1220 struct elf_link_hash_entry *h)
1222 if (bfd_link_pic (info))
1224 if (h->plt.refcount > 0)
1226 /* For shared objects, there's no need for PLT entries for local
1227 symbols (use RELATIVE relocs instead of JMP_SLOT relocs). */
1228 if (h->got.refcount < 0)
1229 h->got.refcount = 0;
1230 h->got.refcount += h->plt.refcount;
1231 h->plt.refcount = 0;
1236 /* Don't need any dynamic relocations at all. */
1237 h->plt.refcount = 0;
1238 h->got.refcount = 0;
1244 elf_xtensa_hide_symbol (struct bfd_link_info *info,
1245 struct elf_link_hash_entry *h,
1246 bfd_boolean force_local)
1248 /* For a shared link, move the plt refcount to the got refcount to leave
1249 space for RELATIVE relocs. */
1250 elf_xtensa_make_sym_local (info, h);
1252 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
1256 /* Return the section that should be marked against GC for a given
1260 elf_xtensa_gc_mark_hook (asection *sec,
1261 struct bfd_link_info *info,
1262 Elf_Internal_Rela *rel,
1263 struct elf_link_hash_entry *h,
1264 Elf_Internal_Sym *sym)
1266 /* Property sections are marked "KEEP" in the linker scripts, but they
1267 should not cause other sections to be marked. (This approach relies
1268 on elf_xtensa_discard_info to remove property table entries that
1269 describe discarded sections. Alternatively, it might be more
1270 efficient to avoid using "KEEP" in the linker scripts and instead use
1271 the gc_mark_extra_sections hook to mark only the property sections
1272 that describe marked sections. That alternative does not work well
1273 with the current property table sections, which do not correspond
1274 one-to-one with the sections they describe, but that should be fixed
1276 if (xtensa_is_property_section (sec))
1280 switch (ELF32_R_TYPE (rel->r_info))
1282 case R_XTENSA_GNU_VTINHERIT:
1283 case R_XTENSA_GNU_VTENTRY:
1287 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1291 /* Create all the dynamic sections. */
1294 elf_xtensa_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1296 struct elf_xtensa_link_hash_table *htab;
1297 flagword flags, noalloc_flags;
1299 htab = elf_xtensa_hash_table (info);
1303 /* First do all the standard stuff. */
1304 if (! _bfd_elf_create_dynamic_sections (dynobj, info))
1307 /* Create any extra PLT sections in case check_relocs has already
1308 been called on all the non-dynamic input files. */
1309 if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1312 noalloc_flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
1313 | SEC_LINKER_CREATED | SEC_READONLY);
1314 flags = noalloc_flags | SEC_ALLOC | SEC_LOAD;
1316 /* Mark the ".got.plt" section READONLY. */
1317 if (htab->elf.sgotplt == NULL
1318 || ! bfd_set_section_flags (dynobj, htab->elf.sgotplt, flags))
1321 /* Create ".got.loc" (literal tables for use by dynamic linker). */
1322 htab->sgotloc = bfd_make_section_anyway_with_flags (dynobj, ".got.loc",
1324 if (htab->sgotloc == NULL
1325 || ! bfd_set_section_alignment (dynobj, htab->sgotloc, 2))
1328 /* Create ".xt.lit.plt" (literal table for ".got.plt*"). */
1329 htab->spltlittbl = bfd_make_section_anyway_with_flags (dynobj, ".xt.lit.plt",
1331 if (htab->spltlittbl == NULL
1332 || ! bfd_set_section_alignment (dynobj, htab->spltlittbl, 2))
1340 add_extra_plt_sections (struct bfd_link_info *info, int count)
1342 bfd *dynobj = elf_hash_table (info)->dynobj;
1345 /* Iterate over all chunks except 0 which uses the standard ".plt" and
1346 ".got.plt" sections. */
1347 for (chunk = count / PLT_ENTRIES_PER_CHUNK; chunk > 0; chunk--)
1353 /* Stop when we find a section has already been created. */
1354 if (elf_xtensa_get_plt_section (info, chunk))
1357 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1358 | SEC_LINKER_CREATED | SEC_READONLY);
1360 sname = (char *) bfd_malloc (10);
1361 sprintf (sname, ".plt.%u", chunk);
1362 s = bfd_make_section_anyway_with_flags (dynobj, sname, flags | SEC_CODE);
1364 || ! bfd_set_section_alignment (dynobj, s, 2))
1367 sname = (char *) bfd_malloc (14);
1368 sprintf (sname, ".got.plt.%u", chunk);
1369 s = bfd_make_section_anyway_with_flags (dynobj, sname, flags);
1371 || ! bfd_set_section_alignment (dynobj, s, 2))
1379 /* Adjust a symbol defined by a dynamic object and referenced by a
1380 regular object. The current definition is in some section of the
1381 dynamic object, but we're not including those sections. We have to
1382 change the definition to something the rest of the link can
1386 elf_xtensa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1387 struct elf_link_hash_entry *h)
1389 /* If this is a weak symbol, and there is a real definition, the
1390 processor independent code will have arranged for us to see the
1391 real definition first, and we can just use the same value. */
1392 if (h->is_weakalias)
1394 struct elf_link_hash_entry *def = weakdef (h);
1395 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1396 h->root.u.def.section = def->root.u.def.section;
1397 h->root.u.def.value = def->root.u.def.value;
1401 /* This is a reference to a symbol defined by a dynamic object. The
1402 reference must go through the GOT, so there's no need for COPY relocs,
1410 elf_xtensa_allocate_dynrelocs (struct elf_link_hash_entry *h, void *arg)
1412 struct bfd_link_info *info;
1413 struct elf_xtensa_link_hash_table *htab;
1414 struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (h);
1416 if (h->root.type == bfd_link_hash_indirect)
1419 info = (struct bfd_link_info *) arg;
1420 htab = elf_xtensa_hash_table (info);
1424 /* If we saw any use of an IE model for this symbol, we can then optimize
1425 away GOT entries for any TLSDESC_FN relocs. */
1426 if ((eh->tls_type & GOT_TLS_IE) != 0)
1428 BFD_ASSERT (h->got.refcount >= eh->tlsfunc_refcount);
1429 h->got.refcount -= eh->tlsfunc_refcount;
1432 if (! elf_xtensa_dynamic_symbol_p (h, info))
1433 elf_xtensa_make_sym_local (info, h);
1435 if (h->plt.refcount > 0)
1436 htab->elf.srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
1438 if (h->got.refcount > 0)
1439 htab->elf.srelgot->size += (h->got.refcount * sizeof (Elf32_External_Rela));
1446 elf_xtensa_allocate_local_got_size (struct bfd_link_info *info)
1448 struct elf_xtensa_link_hash_table *htab;
1451 htab = elf_xtensa_hash_table (info);
1455 for (i = info->input_bfds; i; i = i->link.next)
1457 bfd_signed_vma *local_got_refcounts;
1458 bfd_size_type j, cnt;
1459 Elf_Internal_Shdr *symtab_hdr;
1461 local_got_refcounts = elf_local_got_refcounts (i);
1462 if (!local_got_refcounts)
1465 symtab_hdr = &elf_tdata (i)->symtab_hdr;
1466 cnt = symtab_hdr->sh_info;
1468 for (j = 0; j < cnt; ++j)
1470 /* If we saw any use of an IE model for this symbol, we can
1471 then optimize away GOT entries for any TLSDESC_FN relocs. */
1472 if ((elf_xtensa_local_got_tls_type (i) [j] & GOT_TLS_IE) != 0)
1474 bfd_signed_vma *tlsfunc_refcount
1475 = &elf_xtensa_local_tlsfunc_refcounts (i) [j];
1476 BFD_ASSERT (local_got_refcounts[j] >= *tlsfunc_refcount);
1477 local_got_refcounts[j] -= *tlsfunc_refcount;
1480 if (local_got_refcounts[j] > 0)
1481 htab->elf.srelgot->size += (local_got_refcounts[j]
1482 * sizeof (Elf32_External_Rela));
1488 /* Set the sizes of the dynamic sections. */
1491 elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1492 struct bfd_link_info *info)
1494 struct elf_xtensa_link_hash_table *htab;
1496 asection *s, *srelplt, *splt, *sgotplt, *srelgot, *spltlittbl, *sgotloc;
1497 bfd_boolean relplt, relgot;
1498 int plt_entries, plt_chunks, chunk;
1503 htab = elf_xtensa_hash_table (info);
1507 dynobj = elf_hash_table (info)->dynobj;
1510 srelgot = htab->elf.srelgot;
1511 srelplt = htab->elf.srelplt;
1513 if (elf_hash_table (info)->dynamic_sections_created)
1515 BFD_ASSERT (htab->elf.srelgot != NULL
1516 && htab->elf.srelplt != NULL
1517 && htab->elf.sgot != NULL
1518 && htab->spltlittbl != NULL
1519 && htab->sgotloc != NULL);
1521 /* Set the contents of the .interp section to the interpreter. */
1522 if (bfd_link_executable (info) && !info->nointerp)
1524 s = bfd_get_linker_section (dynobj, ".interp");
1527 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1528 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1531 /* Allocate room for one word in ".got". */
1532 htab->elf.sgot->size = 4;
1534 /* Allocate space in ".rela.got" for literals that reference global
1535 symbols and space in ".rela.plt" for literals that have PLT
1537 elf_link_hash_traverse (elf_hash_table (info),
1538 elf_xtensa_allocate_dynrelocs,
1541 /* If we are generating a shared object, we also need space in
1542 ".rela.got" for R_XTENSA_RELATIVE relocs for literals that
1543 reference local symbols. */
1544 if (bfd_link_pic (info))
1545 elf_xtensa_allocate_local_got_size (info);
1547 /* Allocate space in ".plt" to match the size of ".rela.plt". For
1548 each PLT entry, we need the PLT code plus a 4-byte literal.
1549 For each chunk of ".plt", we also need two more 4-byte
1550 literals, two corresponding entries in ".rela.got", and an
1551 8-byte entry in ".xt.lit.plt". */
1552 spltlittbl = htab->spltlittbl;
1553 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
1555 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
1557 /* Iterate over all the PLT chunks, including any extra sections
1558 created earlier because the initial count of PLT relocations
1559 was an overestimate. */
1561 (splt = elf_xtensa_get_plt_section (info, chunk)) != NULL;
1566 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
1567 BFD_ASSERT (sgotplt != NULL);
1569 if (chunk < plt_chunks - 1)
1570 chunk_entries = PLT_ENTRIES_PER_CHUNK;
1571 else if (chunk == plt_chunks - 1)
1572 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
1576 if (chunk_entries != 0)
1578 sgotplt->size = 4 * (chunk_entries + 2);
1579 splt->size = PLT_ENTRY_SIZE * chunk_entries;
1580 srelgot->size += 2 * sizeof (Elf32_External_Rela);
1581 spltlittbl->size += 8;
1590 /* Allocate space in ".got.loc" to match the total size of all the
1592 sgotloc = htab->sgotloc;
1593 sgotloc->size = spltlittbl->size;
1594 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
1596 if (abfd->flags & DYNAMIC)
1598 for (s = abfd->sections; s != NULL; s = s->next)
1600 if (! discarded_section (s)
1601 && xtensa_is_littable_section (s)
1603 sgotloc->size += s->size;
1608 /* Allocate memory for dynamic sections. */
1611 for (s = dynobj->sections; s != NULL; s = s->next)
1615 if ((s->flags & SEC_LINKER_CREATED) == 0)
1618 /* It's OK to base decisions on the section name, because none
1619 of the dynobj section names depend upon the input files. */
1620 name = bfd_get_section_name (dynobj, s);
1622 if (CONST_STRNEQ (name, ".rela"))
1626 if (strcmp (name, ".rela.plt") == 0)
1628 else if (strcmp (name, ".rela.got") == 0)
1631 /* We use the reloc_count field as a counter if we need
1632 to copy relocs into the output file. */
1636 else if (! CONST_STRNEQ (name, ".plt.")
1637 && ! CONST_STRNEQ (name, ".got.plt.")
1638 && strcmp (name, ".got") != 0
1639 && strcmp (name, ".plt") != 0
1640 && strcmp (name, ".got.plt") != 0
1641 && strcmp (name, ".xt.lit.plt") != 0
1642 && strcmp (name, ".got.loc") != 0)
1644 /* It's not one of our sections, so don't allocate space. */
1650 /* If we don't need this section, strip it from the output
1651 file. We must create the ".plt*" and ".got.plt*"
1652 sections in create_dynamic_sections and/or check_relocs
1653 based on a conservative estimate of the PLT relocation
1654 count, because the sections must be created before the
1655 linker maps input sections to output sections. The
1656 linker does that before size_dynamic_sections, where we
1657 compute the exact size of the PLT, so there may be more
1658 of these sections than are actually needed. */
1659 s->flags |= SEC_EXCLUDE;
1661 else if ((s->flags & SEC_HAS_CONTENTS) != 0)
1663 /* Allocate memory for the section contents. */
1664 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1665 if (s->contents == NULL)
1670 if (elf_hash_table (info)->dynamic_sections_created)
1672 /* Add the special XTENSA_RTLD relocations now. The offsets won't be
1673 known until finish_dynamic_sections, but we need to get the relocs
1674 in place before they are sorted. */
1675 for (chunk = 0; chunk < plt_chunks; chunk++)
1677 Elf_Internal_Rela irela;
1681 irela.r_info = ELF32_R_INFO (0, R_XTENSA_RTLD);
1684 loc = (srelgot->contents
1685 + srelgot->reloc_count * sizeof (Elf32_External_Rela));
1686 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
1687 bfd_elf32_swap_reloca_out (output_bfd, &irela,
1688 loc + sizeof (Elf32_External_Rela));
1689 srelgot->reloc_count += 2;
1692 /* Add some entries to the .dynamic section. We fill in the
1693 values later, in elf_xtensa_finish_dynamic_sections, but we
1694 must add the entries now so that we get the correct size for
1695 the .dynamic section. The DT_DEBUG entry is filled in by the
1696 dynamic linker and used by the debugger. */
1697 #define add_dynamic_entry(TAG, VAL) \
1698 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1700 if (bfd_link_executable (info))
1702 if (!add_dynamic_entry (DT_DEBUG, 0))
1708 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1709 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1710 || !add_dynamic_entry (DT_JMPREL, 0))
1716 if (!add_dynamic_entry (DT_RELA, 0)
1717 || !add_dynamic_entry (DT_RELASZ, 0)
1718 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
1722 if (!add_dynamic_entry (DT_PLTGOT, 0)
1723 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0)
1724 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0))
1727 #undef add_dynamic_entry
1733 elf_xtensa_always_size_sections (bfd *output_bfd,
1734 struct bfd_link_info *info)
1736 struct elf_xtensa_link_hash_table *htab;
1739 htab = elf_xtensa_hash_table (info);
1743 tls_sec = htab->elf.tls_sec;
1745 if (tls_sec && (htab->tlsbase->tls_type & GOT_TLS_ANY) != 0)
1747 struct elf_link_hash_entry *tlsbase = &htab->tlsbase->elf;
1748 struct bfd_link_hash_entry *bh = &tlsbase->root;
1749 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
1751 tlsbase->type = STT_TLS;
1752 if (!(_bfd_generic_link_add_one_symbol
1753 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
1754 tls_sec, 0, NULL, FALSE,
1755 bed->collect, &bh)))
1757 tlsbase->def_regular = 1;
1758 tlsbase->other = STV_HIDDEN;
1759 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
1766 /* Return the base VMA address which should be subtracted from real addresses
1767 when resolving @dtpoff relocation.
1768 This is PT_TLS segment p_vaddr. */
1771 dtpoff_base (struct bfd_link_info *info)
1773 /* If tls_sec is NULL, we should have signalled an error already. */
1774 if (elf_hash_table (info)->tls_sec == NULL)
1776 return elf_hash_table (info)->tls_sec->vma;
1779 /* Return the relocation value for @tpoff relocation
1780 if STT_TLS virtual address is ADDRESS. */
1783 tpoff (struct bfd_link_info *info, bfd_vma address)
1785 struct elf_link_hash_table *htab = elf_hash_table (info);
1788 /* If tls_sec is NULL, we should have signalled an error already. */
1789 if (htab->tls_sec == NULL)
1791 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
1792 return address - htab->tls_sec->vma + base;
1795 /* Perform the specified relocation. The instruction at (contents + address)
1796 is modified to set one operand to represent the value in "relocation". The
1797 operand position is determined by the relocation type recorded in the
1800 #define CALL_SEGMENT_BITS (30)
1801 #define CALL_SEGMENT_SIZE (1 << CALL_SEGMENT_BITS)
1803 static bfd_reloc_status_type
1804 elf_xtensa_do_reloc (reloc_howto_type *howto,
1806 asection *input_section,
1810 bfd_boolean is_weak_undef,
1811 char **error_message)
1814 xtensa_opcode opcode;
1815 xtensa_isa isa = xtensa_default_isa;
1816 static xtensa_insnbuf ibuff = NULL;
1817 static xtensa_insnbuf sbuff = NULL;
1818 bfd_vma self_address;
1819 bfd_size_type input_size;
1825 ibuff = xtensa_insnbuf_alloc (isa);
1826 sbuff = xtensa_insnbuf_alloc (isa);
1829 input_size = bfd_get_section_limit (abfd, input_section);
1831 /* Calculate the PC address for this instruction. */
1832 self_address = (input_section->output_section->vma
1833 + input_section->output_offset
1836 switch (howto->type)
1839 case R_XTENSA_DIFF8:
1840 case R_XTENSA_DIFF16:
1841 case R_XTENSA_DIFF32:
1842 case R_XTENSA_TLS_FUNC:
1843 case R_XTENSA_TLS_ARG:
1844 case R_XTENSA_TLS_CALL:
1845 return bfd_reloc_ok;
1847 case R_XTENSA_ASM_EXPAND:
1850 /* Check for windowed CALL across a 1GB boundary. */
1851 opcode = get_expanded_call_opcode (contents + address,
1852 input_size - address, 0);
1853 if (is_windowed_call_opcode (opcode))
1855 if ((self_address >> CALL_SEGMENT_BITS)
1856 != (relocation >> CALL_SEGMENT_BITS))
1858 *error_message = "windowed longcall crosses 1GB boundary; "
1860 return bfd_reloc_dangerous;
1864 return bfd_reloc_ok;
1866 case R_XTENSA_ASM_SIMPLIFY:
1868 /* Convert the L32R/CALLX to CALL. */
1869 bfd_reloc_status_type retval =
1870 elf_xtensa_do_asm_simplify (contents, address, input_size,
1872 if (retval != bfd_reloc_ok)
1873 return bfd_reloc_dangerous;
1875 /* The CALL needs to be relocated. Continue below for that part. */
1878 howto = &elf_howto_table[(unsigned) R_XTENSA_SLOT0_OP ];
1885 x = bfd_get_32 (abfd, contents + address);
1887 bfd_put_32 (abfd, x, contents + address);
1889 return bfd_reloc_ok;
1891 case R_XTENSA_32_PCREL:
1892 bfd_put_32 (abfd, relocation - self_address, contents + address);
1893 return bfd_reloc_ok;
1896 case R_XTENSA_TLSDESC_FN:
1897 case R_XTENSA_TLSDESC_ARG:
1898 case R_XTENSA_TLS_DTPOFF:
1899 case R_XTENSA_TLS_TPOFF:
1900 bfd_put_32 (abfd, relocation, contents + address);
1901 return bfd_reloc_ok;
1904 /* Only instruction slot-specific relocations handled below.... */
1905 slot = get_relocation_slot (howto->type);
1906 if (slot == XTENSA_UNDEFINED)
1908 *error_message = "unexpected relocation";
1909 return bfd_reloc_dangerous;
1912 /* Read the instruction into a buffer and decode the opcode. */
1913 xtensa_insnbuf_from_chars (isa, ibuff, contents + address,
1914 input_size - address);
1915 fmt = xtensa_format_decode (isa, ibuff);
1916 if (fmt == XTENSA_UNDEFINED)
1918 *error_message = "cannot decode instruction format";
1919 return bfd_reloc_dangerous;
1922 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
1924 opcode = xtensa_opcode_decode (isa, fmt, slot, sbuff);
1925 if (opcode == XTENSA_UNDEFINED)
1927 *error_message = "cannot decode instruction opcode";
1928 return bfd_reloc_dangerous;
1931 /* Check for opcode-specific "alternate" relocations. */
1932 if (is_alt_relocation (howto->type))
1934 if (opcode == get_l32r_opcode ())
1936 /* Handle the special-case of non-PC-relative L32R instructions. */
1937 bfd *output_bfd = input_section->output_section->owner;
1938 asection *lit4_sec = bfd_get_section_by_name (output_bfd, ".lit4");
1941 *error_message = "relocation references missing .lit4 section";
1942 return bfd_reloc_dangerous;
1944 self_address = ((lit4_sec->vma & ~0xfff)
1945 + 0x40000 - 3); /* -3 to compensate for do_reloc */
1946 newval = relocation;
1949 else if (opcode == get_const16_opcode ())
1951 /* ALT used for high 16 bits. */
1952 newval = relocation >> 16;
1957 /* No other "alternate" relocations currently defined. */
1958 *error_message = "unexpected relocation";
1959 return bfd_reloc_dangerous;
1962 else /* Not an "alternate" relocation.... */
1964 if (opcode == get_const16_opcode ())
1966 newval = relocation & 0xffff;
1971 /* ...normal PC-relative relocation.... */
1973 /* Determine which operand is being relocated. */
1974 opnd = get_relocation_opnd (opcode, howto->type);
1975 if (opnd == XTENSA_UNDEFINED)
1977 *error_message = "unexpected relocation";
1978 return bfd_reloc_dangerous;
1981 if (!howto->pc_relative)
1983 *error_message = "expected PC-relative relocation";
1984 return bfd_reloc_dangerous;
1987 newval = relocation;
1991 /* Apply the relocation. */
1992 if (xtensa_operand_do_reloc (isa, opcode, opnd, &newval, self_address)
1993 || xtensa_operand_encode (isa, opcode, opnd, &newval)
1994 || xtensa_operand_set_field (isa, opcode, opnd, fmt, slot,
1997 const char *opname = xtensa_opcode_name (isa, opcode);
2000 msg = "cannot encode";
2001 if (is_direct_call_opcode (opcode))
2003 if ((relocation & 0x3) != 0)
2004 msg = "misaligned call target";
2006 msg = "call target out of range";
2008 else if (opcode == get_l32r_opcode ())
2010 if ((relocation & 0x3) != 0)
2011 msg = "misaligned literal target";
2012 else if (is_alt_relocation (howto->type))
2013 msg = "literal target out of range (too many literals)";
2014 else if (self_address > relocation)
2015 msg = "literal target out of range (try using text-section-literals)";
2017 msg = "literal placed after use";
2020 *error_message = vsprint_msg (opname, ": %s", strlen (msg) + 2, msg);
2021 return bfd_reloc_dangerous;
2024 /* Check for calls across 1GB boundaries. */
2025 if (is_direct_call_opcode (opcode)
2026 && is_windowed_call_opcode (opcode))
2028 if ((self_address >> CALL_SEGMENT_BITS)
2029 != (relocation >> CALL_SEGMENT_BITS))
2032 "windowed call crosses 1GB boundary; return may fail";
2033 return bfd_reloc_dangerous;
2037 /* Write the modified instruction back out of the buffer. */
2038 xtensa_format_set_slot (isa, fmt, slot, ibuff, sbuff);
2039 xtensa_insnbuf_to_chars (isa, ibuff, contents + address,
2040 input_size - address);
2041 return bfd_reloc_ok;
2046 vsprint_msg (const char *origmsg, const char *fmt, int arglen, ...)
2048 /* To reduce the size of the memory leak,
2049 we only use a single message buffer. */
2050 static bfd_size_type alloc_size = 0;
2051 static char *message = NULL;
2052 bfd_size_type orig_len, len = 0;
2053 bfd_boolean is_append;
2056 va_start (ap, arglen);
2058 is_append = (origmsg == message);
2060 orig_len = strlen (origmsg);
2061 len = orig_len + strlen (fmt) + arglen + 20;
2062 if (len > alloc_size)
2064 message = (char *) bfd_realloc_or_free (message, len);
2067 if (message != NULL)
2070 memcpy (message, origmsg, orig_len);
2071 vsprintf (message + orig_len, fmt, ap);
2078 /* This function is registered as the "special_function" in the
2079 Xtensa howto for handling simplify operations.
2080 bfd_perform_relocation / bfd_install_relocation use it to
2081 perform (install) the specified relocation. Since this replaces the code
2082 in bfd_perform_relocation, it is basically an Xtensa-specific,
2083 stripped-down version of bfd_perform_relocation. */
2085 static bfd_reloc_status_type
2086 bfd_elf_xtensa_reloc (bfd *abfd,
2087 arelent *reloc_entry,
2090 asection *input_section,
2092 char **error_message)
2095 bfd_reloc_status_type flag;
2096 bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2097 bfd_vma output_base = 0;
2098 reloc_howto_type *howto = reloc_entry->howto;
2099 asection *reloc_target_output_section;
2100 bfd_boolean is_weak_undef;
2102 if (!xtensa_default_isa)
2103 xtensa_default_isa = xtensa_isa_init (0, 0);
2105 /* ELF relocs are against symbols. If we are producing relocatable
2106 output, and the reloc is against an external symbol, the resulting
2107 reloc will also be against the same symbol. In such a case, we
2108 don't want to change anything about the way the reloc is handled,
2109 since it will all be done at final link time. This test is similar
2110 to what bfd_elf_generic_reloc does except that it lets relocs with
2111 howto->partial_inplace go through even if the addend is non-zero.
2112 (The real problem is that partial_inplace is set for XTENSA_32
2113 relocs to begin with, but that's a long story and there's little we
2114 can do about it now....) */
2116 if (output_bfd && (symbol->flags & BSF_SECTION_SYM) == 0)
2118 reloc_entry->address += input_section->output_offset;
2119 return bfd_reloc_ok;
2122 /* Is the address of the relocation really within the section? */
2123 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2124 return bfd_reloc_outofrange;
2126 /* Work out which section the relocation is targeted at and the
2127 initial relocation command value. */
2129 /* Get symbol value. (Common symbols are special.) */
2130 if (bfd_is_com_section (symbol->section))
2133 relocation = symbol->value;
2135 reloc_target_output_section = symbol->section->output_section;
2137 /* Convert input-section-relative symbol value to absolute. */
2138 if ((output_bfd && !howto->partial_inplace)
2139 || reloc_target_output_section == NULL)
2142 output_base = reloc_target_output_section->vma;
2144 relocation += output_base + symbol->section->output_offset;
2146 /* Add in supplied addend. */
2147 relocation += reloc_entry->addend;
2149 /* Here the variable relocation holds the final address of the
2150 symbol we are relocating against, plus any addend. */
2153 if (!howto->partial_inplace)
2155 /* This is a partial relocation, and we want to apply the relocation
2156 to the reloc entry rather than the raw data. Everything except
2157 relocations against section symbols has already been handled
2160 BFD_ASSERT (symbol->flags & BSF_SECTION_SYM);
2161 reloc_entry->addend = relocation;
2162 reloc_entry->address += input_section->output_offset;
2163 return bfd_reloc_ok;
2167 reloc_entry->address += input_section->output_offset;
2168 reloc_entry->addend = 0;
2172 is_weak_undef = (bfd_is_und_section (symbol->section)
2173 && (symbol->flags & BSF_WEAK) != 0);
2174 flag = elf_xtensa_do_reloc (howto, abfd, input_section, relocation,
2175 (bfd_byte *) data, (bfd_vma) octets,
2176 is_weak_undef, error_message);
2178 if (flag == bfd_reloc_dangerous)
2180 /* Add the symbol name to the error message. */
2181 if (! *error_message)
2182 *error_message = "";
2183 *error_message = vsprint_msg (*error_message, ": (%s + 0x%lx)",
2184 strlen (symbol->name) + 17,
2186 (unsigned long) reloc_entry->addend);
2193 /* Set up an entry in the procedure linkage table. */
2196 elf_xtensa_create_plt_entry (struct bfd_link_info *info,
2198 unsigned reloc_index)
2200 asection *splt, *sgotplt;
2201 bfd_vma plt_base, got_base;
2202 bfd_vma code_offset, lit_offset, abi_offset;
2205 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
2206 splt = elf_xtensa_get_plt_section (info, chunk);
2207 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
2208 BFD_ASSERT (splt != NULL && sgotplt != NULL);
2210 plt_base = splt->output_section->vma + splt->output_offset;
2211 got_base = sgotplt->output_section->vma + sgotplt->output_offset;
2213 lit_offset = 8 + (reloc_index % PLT_ENTRIES_PER_CHUNK) * 4;
2214 code_offset = (reloc_index % PLT_ENTRIES_PER_CHUNK) * PLT_ENTRY_SIZE;
2216 /* Fill in the literal entry. This is the offset of the dynamic
2217 relocation entry. */
2218 bfd_put_32 (output_bfd, reloc_index * sizeof (Elf32_External_Rela),
2219 sgotplt->contents + lit_offset);
2221 /* Fill in the entry in the procedure linkage table. */
2222 memcpy (splt->contents + code_offset,
2223 (bfd_big_endian (output_bfd)
2224 ? elf_xtensa_be_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED]
2225 : elf_xtensa_le_plt_entry[XSHAL_ABI != XTHAL_ABI_WINDOWED]),
2227 abi_offset = XSHAL_ABI == XTHAL_ABI_WINDOWED ? 3 : 0;
2228 bfd_put_16 (output_bfd, l32r_offset (got_base + 0,
2229 plt_base + code_offset + abi_offset),
2230 splt->contents + code_offset + abi_offset + 1);
2231 bfd_put_16 (output_bfd, l32r_offset (got_base + 4,
2232 plt_base + code_offset + abi_offset + 3),
2233 splt->contents + code_offset + abi_offset + 4);
2234 bfd_put_16 (output_bfd, l32r_offset (got_base + lit_offset,
2235 plt_base + code_offset + abi_offset + 6),
2236 splt->contents + code_offset + abi_offset + 7);
2238 return plt_base + code_offset;
2242 static bfd_boolean get_indirect_call_dest_reg (xtensa_opcode, unsigned *);
2245 replace_tls_insn (Elf_Internal_Rela *rel,
2247 asection *input_section,
2249 bfd_boolean is_ld_model,
2250 char **error_message)
2252 static xtensa_insnbuf ibuff = NULL;
2253 static xtensa_insnbuf sbuff = NULL;
2254 xtensa_isa isa = xtensa_default_isa;
2256 xtensa_opcode old_op, new_op;
2257 bfd_size_type input_size;
2259 unsigned dest_reg, src_reg;
2263 ibuff = xtensa_insnbuf_alloc (isa);
2264 sbuff = xtensa_insnbuf_alloc (isa);
2267 input_size = bfd_get_section_limit (abfd, input_section);
2269 /* Read the instruction into a buffer and decode the opcode. */
2270 xtensa_insnbuf_from_chars (isa, ibuff, contents + rel->r_offset,
2271 input_size - rel->r_offset);
2272 fmt = xtensa_format_decode (isa, ibuff);
2273 if (fmt == XTENSA_UNDEFINED)
2275 *error_message = "cannot decode instruction format";
2279 BFD_ASSERT (xtensa_format_num_slots (isa, fmt) == 1);
2280 xtensa_format_get_slot (isa, fmt, 0, ibuff, sbuff);
2282 old_op = xtensa_opcode_decode (isa, fmt, 0, sbuff);
2283 if (old_op == XTENSA_UNDEFINED)
2285 *error_message = "cannot decode instruction opcode";
2289 r_type = ELF32_R_TYPE (rel->r_info);
2292 case R_XTENSA_TLS_FUNC:
2293 case R_XTENSA_TLS_ARG:
2294 if (old_op != get_l32r_opcode ()
2295 || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2296 sbuff, &dest_reg) != 0)
2298 *error_message = "cannot extract L32R destination for TLS access";
2303 case R_XTENSA_TLS_CALL:
2304 if (! get_indirect_call_dest_reg (old_op, &dest_reg)
2305 || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2306 sbuff, &src_reg) != 0)
2308 *error_message = "cannot extract CALLXn operands for TLS access";
2321 case R_XTENSA_TLS_FUNC:
2322 case R_XTENSA_TLS_ARG:
2323 /* Change the instruction to a NOP (or "OR a1, a1, a1" for older
2324 versions of Xtensa). */
2325 new_op = xtensa_opcode_lookup (isa, "nop");
2326 if (new_op == XTENSA_UNDEFINED)
2328 new_op = xtensa_opcode_lookup (isa, "or");
2329 if (new_op == XTENSA_UNDEFINED
2330 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2331 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2333 || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2335 || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2338 *error_message = "cannot encode OR for TLS access";
2344 if (xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0)
2346 *error_message = "cannot encode NOP for TLS access";
2352 case R_XTENSA_TLS_CALL:
2353 /* Read THREADPTR into the CALLX's return value register. */
2354 new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2355 if (new_op == XTENSA_UNDEFINED
2356 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2357 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2358 sbuff, dest_reg + 2) != 0)
2360 *error_message = "cannot encode RUR.THREADPTR for TLS access";
2370 case R_XTENSA_TLS_FUNC:
2371 new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2372 if (new_op == XTENSA_UNDEFINED
2373 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2374 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2375 sbuff, dest_reg) != 0)
2377 *error_message = "cannot encode RUR.THREADPTR for TLS access";
2382 case R_XTENSA_TLS_ARG:
2383 /* Nothing to do. Keep the original L32R instruction. */
2386 case R_XTENSA_TLS_CALL:
2387 /* Add the CALLX's src register (holding the THREADPTR value)
2388 to the first argument register (holding the offset) and put
2389 the result in the CALLX's return value register. */
2390 new_op = xtensa_opcode_lookup (isa, "add");
2391 if (new_op == XTENSA_UNDEFINED
2392 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2393 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2394 sbuff, dest_reg + 2) != 0
2395 || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2396 sbuff, dest_reg + 2) != 0
2397 || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2398 sbuff, src_reg) != 0)
2400 *error_message = "cannot encode ADD for TLS access";
2407 xtensa_format_set_slot (isa, fmt, 0, ibuff, sbuff);
2408 xtensa_insnbuf_to_chars (isa, ibuff, contents + rel->r_offset,
2409 input_size - rel->r_offset);
2415 #define IS_XTENSA_TLS_RELOC(R_TYPE) \
2416 ((R_TYPE) == R_XTENSA_TLSDESC_FN \
2417 || (R_TYPE) == R_XTENSA_TLSDESC_ARG \
2418 || (R_TYPE) == R_XTENSA_TLS_DTPOFF \
2419 || (R_TYPE) == R_XTENSA_TLS_TPOFF \
2420 || (R_TYPE) == R_XTENSA_TLS_FUNC \
2421 || (R_TYPE) == R_XTENSA_TLS_ARG \
2422 || (R_TYPE) == R_XTENSA_TLS_CALL)
2424 /* Relocate an Xtensa ELF section. This is invoked by the linker for
2425 both relocatable and final links. */
2428 elf_xtensa_relocate_section (bfd *output_bfd,
2429 struct bfd_link_info *info,
2431 asection *input_section,
2433 Elf_Internal_Rela *relocs,
2434 Elf_Internal_Sym *local_syms,
2435 asection **local_sections)
2437 struct elf_xtensa_link_hash_table *htab;
2438 Elf_Internal_Shdr *symtab_hdr;
2439 Elf_Internal_Rela *rel;
2440 Elf_Internal_Rela *relend;
2441 struct elf_link_hash_entry **sym_hashes;
2442 property_table_entry *lit_table = 0;
2444 char *local_got_tls_types;
2445 char *error_message = NULL;
2446 bfd_size_type input_size;
2449 if (!xtensa_default_isa)
2450 xtensa_default_isa = xtensa_isa_init (0, 0);
2452 BFD_ASSERT (is_xtensa_elf (input_bfd));
2454 htab = elf_xtensa_hash_table (info);
2458 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2459 sym_hashes = elf_sym_hashes (input_bfd);
2460 local_got_tls_types = elf_xtensa_local_got_tls_type (input_bfd);
2462 if (elf_hash_table (info)->dynamic_sections_created)
2464 ltblsize = xtensa_read_table_entries (input_bfd, input_section,
2465 &lit_table, XTENSA_LIT_SEC_NAME,
2471 input_size = bfd_get_section_limit (input_bfd, input_section);
2474 relend = relocs + input_section->reloc_count;
2475 for (; rel < relend; rel++)
2478 reloc_howto_type *howto;
2479 unsigned long r_symndx;
2480 struct elf_link_hash_entry *h;
2481 Elf_Internal_Sym *sym;
2486 bfd_reloc_status_type r;
2487 bfd_boolean is_weak_undef;
2488 bfd_boolean unresolved_reloc;
2490 bfd_boolean dynamic_symbol;
2492 r_type = ELF32_R_TYPE (rel->r_info);
2493 if (r_type == (int) R_XTENSA_GNU_VTINHERIT
2494 || r_type == (int) R_XTENSA_GNU_VTENTRY)
2497 if (r_type < 0 || r_type >= (int) R_XTENSA_max)
2499 bfd_set_error (bfd_error_bad_value);
2502 howto = &elf_howto_table[r_type];
2504 r_symndx = ELF32_R_SYM (rel->r_info);
2509 is_weak_undef = FALSE;
2510 unresolved_reloc = FALSE;
2513 if (howto->partial_inplace && !bfd_link_relocatable (info))
2515 /* Because R_XTENSA_32 was made partial_inplace to fix some
2516 problems with DWARF info in partial links, there may be
2517 an addend stored in the contents. Take it out of there
2518 and move it back into the addend field of the reloc. */
2519 rel->r_addend += bfd_get_32 (input_bfd, contents + rel->r_offset);
2520 bfd_put_32 (input_bfd, 0, contents + rel->r_offset);
2523 if (r_symndx < symtab_hdr->sh_info)
2525 sym = local_syms + r_symndx;
2526 sym_type = ELF32_ST_TYPE (sym->st_info);
2527 sec = local_sections[r_symndx];
2528 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2532 bfd_boolean ignored;
2534 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2535 r_symndx, symtab_hdr, sym_hashes,
2537 unresolved_reloc, warned, ignored);
2540 && !unresolved_reloc
2541 && h->root.type == bfd_link_hash_undefweak)
2542 is_weak_undef = TRUE;
2547 if (sec != NULL && discarded_section (sec))
2548 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2549 rel, 1, relend, howto, 0, contents);
2551 if (bfd_link_relocatable (info))
2554 asection * sym_sec = get_elf_r_symndx_section (input_bfd, r_symndx);
2556 /* This is a relocatable link.
2557 1) If the reloc is against a section symbol, adjust
2558 according to the output section.
2559 2) If there is a new target for this relocation,
2560 the new target will be in the same output section.
2561 We adjust the relocation by the output section
2564 if (relaxing_section)
2566 /* Check if this references a section in another input file. */
2567 if (!do_fix_for_relocatable_link (rel, input_bfd, input_section,
2572 dest_addr = sym_sec->output_section->vma + sym_sec->output_offset
2573 + get_elf_r_symndx_offset (input_bfd, r_symndx) + rel->r_addend;
2575 if (r_type == R_XTENSA_ASM_SIMPLIFY)
2577 error_message = NULL;
2578 /* Convert ASM_SIMPLIFY into the simpler relocation
2579 so that they never escape a relaxing link. */
2580 r = contract_asm_expansion (contents, input_size, rel,
2582 if (r != bfd_reloc_ok)
2583 (*info->callbacks->reloc_dangerous)
2584 (info, error_message,
2585 input_bfd, input_section, rel->r_offset);
2587 r_type = ELF32_R_TYPE (rel->r_info);
2590 /* This is a relocatable link, so we don't have to change
2591 anything unless the reloc is against a section symbol,
2592 in which case we have to adjust according to where the
2593 section symbol winds up in the output section. */
2594 if (r_symndx < symtab_hdr->sh_info)
2596 sym = local_syms + r_symndx;
2597 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2599 sec = local_sections[r_symndx];
2600 rel->r_addend += sec->output_offset + sym->st_value;
2604 /* If there is an addend with a partial_inplace howto,
2605 then move the addend to the contents. This is a hack
2606 to work around problems with DWARF in relocatable links
2607 with some previous version of BFD. Now we can't easily get
2608 rid of the hack without breaking backward compatibility.... */
2610 howto = &elf_howto_table[r_type];
2611 if (howto->partial_inplace && rel->r_addend)
2613 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2614 rel->r_addend, contents,
2615 rel->r_offset, FALSE,
2621 /* Put the correct bits in the target instruction, even
2622 though the relocation will still be present in the output
2623 file. This makes disassembly clearer, as well as
2624 allowing loadable kernel modules to work without needing
2625 relocations on anything other than calls and l32r's. */
2627 /* If it is not in the same section, there is nothing we can do. */
2628 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP &&
2629 sym_sec->output_section == input_section->output_section)
2631 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2632 dest_addr, contents,
2633 rel->r_offset, FALSE,
2637 if (r != bfd_reloc_ok)
2638 (*info->callbacks->reloc_dangerous)
2639 (info, error_message,
2640 input_bfd, input_section, rel->r_offset);
2642 /* Done with work for relocatable link; continue with next reloc. */
2646 /* This is a final link. */
2648 if (relaxing_section)
2650 /* Check if this references a section in another input file. */
2651 do_fix_for_final_link (rel, input_bfd, input_section, contents,
2655 /* Sanity check the address. */
2656 if (rel->r_offset >= input_size
2657 && ELF32_R_TYPE (rel->r_info) != R_XTENSA_NONE)
2660 /* xgettext:c-format */
2661 (_("%pB(%pA+%#" PRIx64 "): "
2662 "relocation offset out of range (size=%#" PRIx64 ")"),
2663 input_bfd, input_section, (uint64_t) rel->r_offset,
2664 (uint64_t) input_size);
2665 bfd_set_error (bfd_error_bad_value);
2670 name = h->root.root.string;
2673 name = (bfd_elf_string_from_elf_section
2674 (input_bfd, symtab_hdr->sh_link, sym->st_name));
2675 if (name == NULL || *name == '\0')
2676 name = bfd_section_name (input_bfd, sec);
2679 if (r_symndx != STN_UNDEF
2680 && r_type != R_XTENSA_NONE
2682 || h->root.type == bfd_link_hash_defined
2683 || h->root.type == bfd_link_hash_defweak)
2684 && IS_XTENSA_TLS_RELOC (r_type) != (sym_type == STT_TLS))
2687 ((sym_type == STT_TLS
2688 /* xgettext:c-format */
2689 ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
2690 /* xgettext:c-format */
2691 : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
2694 (uint64_t) rel->r_offset,
2699 dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
2701 tls_type = GOT_UNKNOWN;
2703 tls_type = elf_xtensa_hash_entry (h)->tls_type;
2704 else if (local_got_tls_types)
2705 tls_type = local_got_tls_types [r_symndx];
2711 if (elf_hash_table (info)->dynamic_sections_created
2712 && (input_section->flags & SEC_ALLOC) != 0
2713 && (dynamic_symbol || bfd_link_pic (info)))
2715 Elf_Internal_Rela outrel;
2719 if (dynamic_symbol && r_type == R_XTENSA_PLT)
2720 srel = htab->elf.srelplt;
2722 srel = htab->elf.srelgot;
2724 BFD_ASSERT (srel != NULL);
2727 _bfd_elf_section_offset (output_bfd, info,
2728 input_section, rel->r_offset);
2730 if ((outrel.r_offset | 1) == (bfd_vma) -1)
2731 memset (&outrel, 0, sizeof outrel);
2734 outrel.r_offset += (input_section->output_section->vma
2735 + input_section->output_offset);
2737 /* Complain if the relocation is in a read-only section
2738 and not in a literal pool. */
2739 if ((input_section->flags & SEC_READONLY) != 0
2740 && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
2744 _("dynamic relocation in read-only section");
2745 (*info->callbacks->reloc_dangerous)
2746 (info, error_message,
2747 input_bfd, input_section, rel->r_offset);
2752 outrel.r_addend = rel->r_addend;
2755 if (r_type == R_XTENSA_32)
2758 ELF32_R_INFO (h->dynindx, R_XTENSA_GLOB_DAT);
2761 else /* r_type == R_XTENSA_PLT */
2764 ELF32_R_INFO (h->dynindx, R_XTENSA_JMP_SLOT);
2766 /* Create the PLT entry and set the initial
2767 contents of the literal entry to the address of
2770 elf_xtensa_create_plt_entry (info, output_bfd,
2773 unresolved_reloc = FALSE;
2777 /* Generate a RELATIVE relocation. */
2778 outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
2779 outrel.r_addend = 0;
2783 loc = (srel->contents
2784 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2785 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2786 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2789 else if (r_type == R_XTENSA_ASM_EXPAND && dynamic_symbol)
2791 /* This should only happen for non-PIC code, which is not
2792 supposed to be used on systems with dynamic linking.
2793 Just ignore these relocations. */
2798 case R_XTENSA_TLS_TPOFF:
2799 /* Switch to LE model for local symbols in an executable. */
2800 if (! bfd_link_pic (info) && ! dynamic_symbol)
2802 relocation = tpoff (info, relocation);
2807 case R_XTENSA_TLSDESC_FN:
2808 case R_XTENSA_TLSDESC_ARG:
2810 if (r_type == R_XTENSA_TLSDESC_FN)
2812 if (! bfd_link_pic (info) || (tls_type & GOT_TLS_IE) != 0)
2813 r_type = R_XTENSA_NONE;
2815 else if (r_type == R_XTENSA_TLSDESC_ARG)
2817 if (bfd_link_pic (info))
2819 if ((tls_type & GOT_TLS_IE) != 0)
2820 r_type = R_XTENSA_TLS_TPOFF;
2824 r_type = R_XTENSA_TLS_TPOFF;
2825 if (! dynamic_symbol)
2827 relocation = tpoff (info, relocation);
2833 if (r_type == R_XTENSA_NONE)
2834 /* Nothing to do here; skip to the next reloc. */
2837 if (! elf_hash_table (info)->dynamic_sections_created)
2840 _("TLS relocation invalid without dynamic sections");
2841 (*info->callbacks->reloc_dangerous)
2842 (info, error_message,
2843 input_bfd, input_section, rel->r_offset);
2847 Elf_Internal_Rela outrel;
2849 asection *srel = htab->elf.srelgot;
2852 outrel.r_offset = (input_section->output_section->vma
2853 + input_section->output_offset
2856 /* Complain if the relocation is in a read-only section
2857 and not in a literal pool. */
2858 if ((input_section->flags & SEC_READONLY) != 0
2859 && ! elf_xtensa_in_literal_pool (lit_table, ltblsize,
2863 _("dynamic relocation in read-only section");
2864 (*info->callbacks->reloc_dangerous)
2865 (info, error_message,
2866 input_bfd, input_section, rel->r_offset);
2869 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2871 outrel.r_addend = relocation - dtpoff_base (info);
2873 outrel.r_addend = 0;
2876 outrel.r_info = ELF32_R_INFO (indx, r_type);
2878 unresolved_reloc = FALSE;
2881 loc = (srel->contents
2882 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2883 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2884 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2890 case R_XTENSA_TLS_DTPOFF:
2891 if (! bfd_link_pic (info))
2892 /* Switch from LD model to LE model. */
2893 relocation = tpoff (info, relocation);
2895 relocation -= dtpoff_base (info);
2898 case R_XTENSA_TLS_FUNC:
2899 case R_XTENSA_TLS_ARG:
2900 case R_XTENSA_TLS_CALL:
2901 /* Check if optimizing to IE or LE model. */
2902 if ((tls_type & GOT_TLS_IE) != 0)
2904 bfd_boolean is_ld_model =
2905 (h && elf_xtensa_hash_entry (h) == htab->tlsbase);
2906 if (! replace_tls_insn (rel, input_bfd, input_section, contents,
2907 is_ld_model, &error_message))
2908 (*info->callbacks->reloc_dangerous)
2909 (info, error_message,
2910 input_bfd, input_section, rel->r_offset);
2912 if (r_type != R_XTENSA_TLS_ARG || is_ld_model)
2914 /* Skip subsequent relocations on the same instruction. */
2915 while (rel + 1 < relend && rel[1].r_offset == rel->r_offset)
2922 if (elf_hash_table (info)->dynamic_sections_created
2923 && dynamic_symbol && (is_operand_relocation (r_type)
2924 || r_type == R_XTENSA_32_PCREL))
2927 vsprint_msg ("invalid relocation for dynamic symbol", ": %s",
2928 strlen (name) + 2, name);
2929 (*info->callbacks->reloc_dangerous)
2930 (info, error_message, input_bfd, input_section, rel->r_offset);
2936 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2937 because such sections are not SEC_ALLOC and thus ld.so will
2938 not process them. */
2939 if (unresolved_reloc
2940 && !((input_section->flags & SEC_DEBUGGING) != 0
2942 && _bfd_elf_section_offset (output_bfd, info, input_section,
2943 rel->r_offset) != (bfd_vma) -1)
2946 /* xgettext:c-format */
2947 (_("%pB(%pA+%#" PRIx64 "): "
2948 "unresolvable %s relocation against symbol `%s'"),
2951 (uint64_t) rel->r_offset,
2957 /* TLS optimizations may have changed r_type; update "howto". */
2958 howto = &elf_howto_table[r_type];
2960 /* There's no point in calling bfd_perform_relocation here.
2961 Just go directly to our "special function". */
2962 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2963 relocation + rel->r_addend,
2964 contents, rel->r_offset, is_weak_undef,
2967 if (r != bfd_reloc_ok && !warned)
2969 BFD_ASSERT (r == bfd_reloc_dangerous || r == bfd_reloc_other);
2970 BFD_ASSERT (error_message != NULL);
2972 if (rel->r_addend == 0)
2973 error_message = vsprint_msg (error_message, ": %s",
2974 strlen (name) + 2, name);
2976 error_message = vsprint_msg (error_message, ": (%s+0x%x)",
2978 name, (int) rel->r_addend);
2980 (*info->callbacks->reloc_dangerous)
2981 (info, error_message, input_bfd, input_section, rel->r_offset);
2988 input_section->reloc_done = TRUE;
2994 /* Finish up dynamic symbol handling. There's not much to do here since
2995 the PLT and GOT entries are all set up by relocate_section. */
2998 elf_xtensa_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
2999 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3000 struct elf_link_hash_entry *h,
3001 Elf_Internal_Sym *sym)
3003 if (h->needs_plt && !h->def_regular)
3005 /* Mark the symbol as undefined, rather than as defined in
3006 the .plt section. Leave the value alone. */
3007 sym->st_shndx = SHN_UNDEF;
3008 /* If the symbol is weak, we do need to clear the value.
3009 Otherwise, the PLT entry would provide a definition for
3010 the symbol even if the symbol wasn't defined anywhere,
3011 and so the symbol would never be NULL. */
3012 if (!h->ref_regular_nonweak)
3016 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
3017 if (h == elf_hash_table (info)->hdynamic
3018 || h == elf_hash_table (info)->hgot)
3019 sym->st_shndx = SHN_ABS;
3025 /* Combine adjacent literal table entries in the output. Adjacent
3026 entries within each input section may have been removed during
3027 relaxation, but we repeat the process here, even though it's too late
3028 to shrink the output section, because it's important to minimize the
3029 number of literal table entries to reduce the start-up work for the
3030 runtime linker. Returns the number of remaining table entries or -1
3034 elf_xtensa_combine_prop_entries (bfd *output_bfd,
3039 property_table_entry *table;
3040 bfd_size_type section_size, sgotloc_size;
3044 section_size = sxtlit->size;
3045 BFD_ASSERT (section_size % 8 == 0);
3046 num = section_size / 8;
3048 sgotloc_size = sgotloc->size;
3049 if (sgotloc_size != section_size)
3052 (_("internal inconsistency in size of .got.loc section"));
3056 table = bfd_malloc (num * sizeof (property_table_entry));
3060 /* The ".xt.lit.plt" section has the SEC_IN_MEMORY flag set and this
3061 propagates to the output section, where it doesn't really apply and
3062 where it breaks the following call to bfd_malloc_and_get_section. */
3063 sxtlit->flags &= ~SEC_IN_MEMORY;
3065 if (!bfd_malloc_and_get_section (output_bfd, sxtlit, &contents))
3073 /* There should never be any relocations left at this point, so this
3074 is quite a bit easier than what is done during relaxation. */
3076 /* Copy the raw contents into a property table array and sort it. */
3078 for (n = 0; n < num; n++)
3080 table[n].address = bfd_get_32 (output_bfd, &contents[offset]);
3081 table[n].size = bfd_get_32 (output_bfd, &contents[offset + 4]);
3084 qsort (table, num, sizeof (property_table_entry), property_table_compare);
3086 for (n = 0; n < num; n++)
3088 bfd_boolean remove_entry = FALSE;
3090 if (table[n].size == 0)
3091 remove_entry = TRUE;
3093 && (table[n-1].address + table[n-1].size == table[n].address))
3095 table[n-1].size += table[n].size;
3096 remove_entry = TRUE;
3101 for (m = n; m < num - 1; m++)
3103 table[m].address = table[m+1].address;
3104 table[m].size = table[m+1].size;
3112 /* Copy the data back to the raw contents. */
3114 for (n = 0; n < num; n++)
3116 bfd_put_32 (output_bfd, table[n].address, &contents[offset]);
3117 bfd_put_32 (output_bfd, table[n].size, &contents[offset + 4]);
3121 /* Clear the removed bytes. */
3122 if ((bfd_size_type) (num * 8) < section_size)
3123 memset (&contents[num * 8], 0, section_size - num * 8);
3125 if (! bfd_set_section_contents (output_bfd, sxtlit, contents, 0,
3129 /* Copy the contents to ".got.loc". */
3130 memcpy (sgotloc->contents, contents, section_size);
3138 /* Finish up the dynamic sections. */
3141 elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
3142 struct bfd_link_info *info)
3144 struct elf_xtensa_link_hash_table *htab;
3146 asection *sdyn, *srelplt, *sgot, *sxtlit, *sgotloc;
3147 Elf32_External_Dyn *dyncon, *dynconend;
3148 int num_xtlit_entries = 0;
3150 if (! elf_hash_table (info)->dynamic_sections_created)
3153 htab = elf_xtensa_hash_table (info);
3157 dynobj = elf_hash_table (info)->dynobj;
3158 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3159 BFD_ASSERT (sdyn != NULL);
3161 /* Set the first entry in the global offset table to the address of
3162 the dynamic section. */
3163 sgot = htab->elf.sgot;
3166 BFD_ASSERT (sgot->size == 4);
3168 bfd_put_32 (output_bfd, 0, sgot->contents);
3170 bfd_put_32 (output_bfd,
3171 sdyn->output_section->vma + sdyn->output_offset,
3175 srelplt = htab->elf.srelplt;
3176 if (srelplt && srelplt->size != 0)
3178 asection *sgotplt, *srelgot, *spltlittbl;
3179 int chunk, plt_chunks, plt_entries;
3180 Elf_Internal_Rela irela;
3182 unsigned rtld_reloc;
3184 srelgot = htab->elf.srelgot;
3185 spltlittbl = htab->spltlittbl;
3186 BFD_ASSERT (srelgot != NULL && spltlittbl != NULL);
3188 /* Find the first XTENSA_RTLD relocation. Presumably the rest
3189 of them follow immediately after.... */
3190 for (rtld_reloc = 0; rtld_reloc < srelgot->reloc_count; rtld_reloc++)
3192 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3193 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3194 if (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD)
3197 BFD_ASSERT (rtld_reloc < srelgot->reloc_count);
3199 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
3201 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
3203 for (chunk = 0; chunk < plt_chunks; chunk++)
3205 int chunk_entries = 0;
3207 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
3208 BFD_ASSERT (sgotplt != NULL);
3210 /* Emit special RTLD relocations for the first two entries in
3211 each chunk of the .got.plt section. */
3213 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3214 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3215 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3216 irela.r_offset = (sgotplt->output_section->vma
3217 + sgotplt->output_offset);
3218 irela.r_addend = 1; /* tell rtld to set value to resolver function */
3219 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3221 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3223 /* Next literal immediately follows the first. */
3224 loc += sizeof (Elf32_External_Rela);
3225 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3226 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3227 irela.r_offset = (sgotplt->output_section->vma
3228 + sgotplt->output_offset + 4);
3229 /* Tell rtld to set value to object's link map. */
3231 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3233 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3235 /* Fill in the literal table. */
3236 if (chunk < plt_chunks - 1)
3237 chunk_entries = PLT_ENTRIES_PER_CHUNK;
3239 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
3241 BFD_ASSERT ((unsigned) (chunk + 1) * 8 <= spltlittbl->size);
3242 bfd_put_32 (output_bfd,
3243 sgotplt->output_section->vma + sgotplt->output_offset,
3244 spltlittbl->contents + (chunk * 8) + 0);
3245 bfd_put_32 (output_bfd,
3246 8 + (chunk_entries * 4),
3247 spltlittbl->contents + (chunk * 8) + 4);
3250 /* All the dynamic relocations have been emitted at this point.
3251 Make sure the relocation sections are the correct size. */
3252 if (srelgot->size != (sizeof (Elf32_External_Rela)
3253 * srelgot->reloc_count)
3254 || srelplt->size != (sizeof (Elf32_External_Rela)
3255 * srelplt->reloc_count))
3258 /* The .xt.lit.plt section has just been modified. This must
3259 happen before the code below which combines adjacent literal
3260 table entries, and the .xt.lit.plt contents have to be forced to
3262 if (! bfd_set_section_contents (output_bfd,
3263 spltlittbl->output_section,
3264 spltlittbl->contents,
3265 spltlittbl->output_offset,
3268 /* Clear SEC_HAS_CONTENTS so the contents won't be output again. */
3269 spltlittbl->flags &= ~SEC_HAS_CONTENTS;
3272 /* Combine adjacent literal table entries. */
3273 BFD_ASSERT (! bfd_link_relocatable (info));
3274 sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");
3275 sgotloc = htab->sgotloc;
3276 BFD_ASSERT (sgotloc);
3280 elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc);
3281 if (num_xtlit_entries < 0)
3285 dyncon = (Elf32_External_Dyn *) sdyn->contents;
3286 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3287 for (; dyncon < dynconend; dyncon++)
3289 Elf_Internal_Dyn dyn;
3291 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3298 case DT_XTENSA_GOT_LOC_SZ:
3299 dyn.d_un.d_val = num_xtlit_entries;
3302 case DT_XTENSA_GOT_LOC_OFF:
3303 dyn.d_un.d_ptr = (htab->sgotloc->output_section->vma
3304 + htab->sgotloc->output_offset);
3308 dyn.d_un.d_ptr = (htab->elf.sgot->output_section->vma
3309 + htab->elf.sgot->output_offset);
3313 dyn.d_un.d_ptr = (htab->elf.srelplt->output_section->vma
3314 + htab->elf.srelplt->output_offset);
3318 dyn.d_un.d_val = htab->elf.srelplt->size;
3322 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3329 /* Functions for dealing with the e_flags field. */
3331 /* Merge backend specific data from an object file to the output
3332 object file when linking. */
3335 elf_xtensa_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3337 bfd *obfd = info->output_bfd;
3338 unsigned out_mach, in_mach;
3339 flagword out_flag, in_flag;
3341 /* Check if we have the same endianness. */
3342 if (!_bfd_generic_verify_endian_match (ibfd, info))
3345 /* Don't even pretend to support mixed-format linking. */
3346 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3347 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3350 out_flag = elf_elfheader (obfd)->e_flags;
3351 in_flag = elf_elfheader (ibfd)->e_flags;
3353 out_mach = out_flag & EF_XTENSA_MACH;
3354 in_mach = in_flag & EF_XTENSA_MACH;
3355 if (out_mach != in_mach)
3358 /* xgettext:c-format */
3359 (_("%pB: incompatible machine type; output is 0x%x; input is 0x%x"),
3360 ibfd, out_mach, in_mach);
3361 bfd_set_error (bfd_error_wrong_format);
3365 if (! elf_flags_init (obfd))
3367 elf_flags_init (obfd) = TRUE;
3368 elf_elfheader (obfd)->e_flags = in_flag;
3370 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
3371 && bfd_get_arch_info (obfd)->the_default)
3372 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
3373 bfd_get_mach (ibfd));
3378 if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
3379 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
3381 if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
3382 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
3389 elf_xtensa_set_private_flags (bfd *abfd, flagword flags)
3391 BFD_ASSERT (!elf_flags_init (abfd)
3392 || elf_elfheader (abfd)->e_flags == flags);
3394 elf_elfheader (abfd)->e_flags |= flags;
3395 elf_flags_init (abfd) = TRUE;
3402 elf_xtensa_print_private_bfd_data (bfd *abfd, void *farg)
3404 FILE *f = (FILE *) farg;
3405 flagword e_flags = elf_elfheader (abfd)->e_flags;
3407 fprintf (f, "\nXtensa header:\n");
3408 if ((e_flags & EF_XTENSA_MACH) == E_XTENSA_MACH)
3409 fprintf (f, "\nMachine = Base\n");
3411 fprintf (f, "\nMachine Id = 0x%x\n", e_flags & EF_XTENSA_MACH);
3413 fprintf (f, "Insn tables = %s\n",
3414 (e_flags & EF_XTENSA_XT_INSN) ? "true" : "false");
3416 fprintf (f, "Literal tables = %s\n",
3417 (e_flags & EF_XTENSA_XT_LIT) ? "true" : "false");
3419 return _bfd_elf_print_private_bfd_data (abfd, farg);
3423 /* Set the right machine number for an Xtensa ELF file. */
3426 elf_xtensa_object_p (bfd *abfd)
3429 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
3434 mach = bfd_mach_xtensa;
3440 (void) bfd_default_set_arch_mach (abfd, bfd_arch_xtensa, mach);
3445 /* The final processing done just before writing out an Xtensa ELF object
3446 file. This gets the Xtensa architecture right based on the machine
3450 elf_xtensa_final_write_processing (bfd *abfd,
3451 bfd_boolean linker ATTRIBUTE_UNUSED)
3456 switch (mach = bfd_get_mach (abfd))
3458 case bfd_mach_xtensa:
3459 val = E_XTENSA_MACH;
3465 elf_elfheader (abfd)->e_flags &= (~ EF_XTENSA_MACH);
3466 elf_elfheader (abfd)->e_flags |= val;
3470 static enum elf_reloc_type_class
3471 elf_xtensa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3472 const asection *rel_sec ATTRIBUTE_UNUSED,
3473 const Elf_Internal_Rela *rela)
3475 switch ((int) ELF32_R_TYPE (rela->r_info))
3477 case R_XTENSA_RELATIVE:
3478 return reloc_class_relative;
3479 case R_XTENSA_JMP_SLOT:
3480 return reloc_class_plt;
3482 return reloc_class_normal;
3488 elf_xtensa_discard_info_for_section (bfd *abfd,
3489 struct elf_reloc_cookie *cookie,
3490 struct bfd_link_info *info,
3494 bfd_vma offset, actual_offset;
3495 bfd_size_type removed_bytes = 0;
3496 bfd_size_type entry_size;
3498 if (sec->output_section
3499 && bfd_is_abs_section (sec->output_section))
3502 if (xtensa_is_proptable_section (sec))
3507 if (sec->size == 0 || sec->size % entry_size != 0)
3510 contents = retrieve_contents (abfd, sec, info->keep_memory);
3514 cookie->rels = retrieve_internal_relocs (abfd, sec, info->keep_memory);
3517 release_contents (sec, contents);
3521 /* Sort the relocations. They should already be in order when
3522 relaxation is enabled, but it might not be. */
3523 qsort (cookie->rels, sec->reloc_count, sizeof (Elf_Internal_Rela),
3524 internal_reloc_compare);
3526 cookie->rel = cookie->rels;
3527 cookie->relend = cookie->rels + sec->reloc_count;
3529 for (offset = 0; offset < sec->size; offset += entry_size)
3531 actual_offset = offset - removed_bytes;
3533 /* The ...symbol_deleted_p function will skip over relocs but it
3534 won't adjust their offsets, so do that here. */
3535 while (cookie->rel < cookie->relend
3536 && cookie->rel->r_offset < offset)
3538 cookie->rel->r_offset -= removed_bytes;
3542 while (cookie->rel < cookie->relend
3543 && cookie->rel->r_offset == offset)
3545 if (bfd_elf_reloc_symbol_deleted_p (offset, cookie))
3547 /* Remove the table entry. (If the reloc type is NONE, then
3548 the entry has already been merged with another and deleted
3549 during relaxation.) */
3550 if (ELF32_R_TYPE (cookie->rel->r_info) != R_XTENSA_NONE)
3552 /* Shift the contents up. */
3553 if (offset + entry_size < sec->size)
3554 memmove (&contents[actual_offset],
3555 &contents[actual_offset + entry_size],
3556 sec->size - offset - entry_size);
3557 removed_bytes += entry_size;
3560 /* Remove this relocation. */
3561 cookie->rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
3564 /* Adjust the relocation offset for previous removals. This
3565 should not be done before calling ...symbol_deleted_p
3566 because it might mess up the offset comparisons there.
3567 Make sure the offset doesn't underflow in the case where
3568 the first entry is removed. */
3569 if (cookie->rel->r_offset >= removed_bytes)
3570 cookie->rel->r_offset -= removed_bytes;
3572 cookie->rel->r_offset = 0;
3578 if (removed_bytes != 0)
3580 /* Adjust any remaining relocs (shouldn't be any). */
3581 for (; cookie->rel < cookie->relend; cookie->rel++)
3583 if (cookie->rel->r_offset >= removed_bytes)
3584 cookie->rel->r_offset -= removed_bytes;
3586 cookie->rel->r_offset = 0;
3589 /* Clear the removed bytes. */
3590 memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
3592 pin_contents (sec, contents);
3593 pin_internal_relocs (sec, cookie->rels);
3596 if (sec->rawsize == 0)
3597 sec->rawsize = sec->size;
3598 sec->size -= removed_bytes;
3600 if (xtensa_is_littable_section (sec))
3602 asection *sgotloc = elf_xtensa_hash_table (info)->sgotloc;
3604 sgotloc->size -= removed_bytes;
3609 release_contents (sec, contents);
3610 release_internal_relocs (sec, cookie->rels);
3613 return (removed_bytes != 0);
3618 elf_xtensa_discard_info (bfd *abfd,
3619 struct elf_reloc_cookie *cookie,
3620 struct bfd_link_info *info)
3623 bfd_boolean changed = FALSE;
3625 for (sec = abfd->sections; sec != NULL; sec = sec->next)
3627 if (xtensa_is_property_section (sec))
3629 if (elf_xtensa_discard_info_for_section (abfd, cookie, info, sec))
3639 elf_xtensa_ignore_discarded_relocs (asection *sec)
3641 return xtensa_is_property_section (sec);
3646 elf_xtensa_action_discarded (asection *sec)
3648 if (strcmp (".xt_except_table", sec->name) == 0)
3651 if (strcmp (".xt_except_desc", sec->name) == 0)
3654 return _bfd_elf_default_action_discarded (sec);
3658 /* Support for core dump NOTE sections. */
3661 elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3666 /* The size for Xtensa is variable, so don't try to recognize the format
3667 based on the size. Just assume this is GNU/Linux. */
3670 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3673 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
3677 size = note->descsz - offset - 4;
3679 /* Make a ".reg/999" section. */
3680 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3681 size, note->descpos + offset);
3686 elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3688 switch (note->descsz)
3693 case 128: /* GNU/Linux elf_prpsinfo */
3694 elf_tdata (abfd)->core->program
3695 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3696 elf_tdata (abfd)->core->command
3697 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3700 /* Note that for some reason, a spurious space is tacked
3701 onto the end of the args in some (at least one anyway)
3702 implementations, so strip it off if it exists. */
3705 char *command = elf_tdata (abfd)->core->command;
3706 int n = strlen (command);
3708 if (0 < n && command[n - 1] == ' ')
3709 command[n - 1] = '\0';
3716 /* Generic Xtensa configurability stuff. */
3718 static xtensa_opcode callx0_op = XTENSA_UNDEFINED;
3719 static xtensa_opcode callx4_op = XTENSA_UNDEFINED;
3720 static xtensa_opcode callx8_op = XTENSA_UNDEFINED;
3721 static xtensa_opcode callx12_op = XTENSA_UNDEFINED;
3722 static xtensa_opcode call0_op = XTENSA_UNDEFINED;
3723 static xtensa_opcode call4_op = XTENSA_UNDEFINED;
3724 static xtensa_opcode call8_op = XTENSA_UNDEFINED;
3725 static xtensa_opcode call12_op = XTENSA_UNDEFINED;
3728 init_call_opcodes (void)
3730 if (callx0_op == XTENSA_UNDEFINED)
3732 callx0_op = xtensa_opcode_lookup (xtensa_default_isa, "callx0");
3733 callx4_op = xtensa_opcode_lookup (xtensa_default_isa, "callx4");
3734 callx8_op = xtensa_opcode_lookup (xtensa_default_isa, "callx8");
3735 callx12_op = xtensa_opcode_lookup (xtensa_default_isa, "callx12");
3736 call0_op = xtensa_opcode_lookup (xtensa_default_isa, "call0");
3737 call4_op = xtensa_opcode_lookup (xtensa_default_isa, "call4");
3738 call8_op = xtensa_opcode_lookup (xtensa_default_isa, "call8");
3739 call12_op = xtensa_opcode_lookup (xtensa_default_isa, "call12");
3745 is_indirect_call_opcode (xtensa_opcode opcode)
3747 init_call_opcodes ();
3748 return (opcode == callx0_op
3749 || opcode == callx4_op
3750 || opcode == callx8_op
3751 || opcode == callx12_op);
3756 is_direct_call_opcode (xtensa_opcode opcode)
3758 init_call_opcodes ();
3759 return (opcode == call0_op
3760 || opcode == call4_op
3761 || opcode == call8_op
3762 || opcode == call12_op);
3767 is_windowed_call_opcode (xtensa_opcode opcode)
3769 init_call_opcodes ();
3770 return (opcode == call4_op
3771 || opcode == call8_op
3772 || opcode == call12_op
3773 || opcode == callx4_op
3774 || opcode == callx8_op
3775 || opcode == callx12_op);
3780 get_indirect_call_dest_reg (xtensa_opcode opcode, unsigned *pdst)
3782 unsigned dst = (unsigned) -1;
3784 init_call_opcodes ();
3785 if (opcode == callx0_op)
3787 else if (opcode == callx4_op)
3789 else if (opcode == callx8_op)
3791 else if (opcode == callx12_op)
3794 if (dst == (unsigned) -1)
3802 static xtensa_opcode
3803 get_const16_opcode (void)
3805 static bfd_boolean done_lookup = FALSE;
3806 static xtensa_opcode const16_opcode = XTENSA_UNDEFINED;
3809 const16_opcode = xtensa_opcode_lookup (xtensa_default_isa, "const16");
3812 return const16_opcode;
3816 static xtensa_opcode
3817 get_l32r_opcode (void)
3819 static xtensa_opcode l32r_opcode = XTENSA_UNDEFINED;
3820 static bfd_boolean done_lookup = FALSE;
3824 l32r_opcode = xtensa_opcode_lookup (xtensa_default_isa, "l32r");
3832 l32r_offset (bfd_vma addr, bfd_vma pc)
3836 offset = addr - ((pc+3) & -4);
3837 BFD_ASSERT ((offset & ((1 << 2) - 1)) == 0);
3838 offset = (signed int) offset >> 2;
3839 BFD_ASSERT ((signed int) offset >> 16 == -1);
3845 get_relocation_opnd (xtensa_opcode opcode, int r_type)
3847 xtensa_isa isa = xtensa_default_isa;
3848 int last_immed, last_opnd, opi;
3850 if (opcode == XTENSA_UNDEFINED)
3851 return XTENSA_UNDEFINED;
3853 /* Find the last visible PC-relative immediate operand for the opcode.
3854 If there are no PC-relative immediates, then choose the last visible
3855 immediate; otherwise, fail and return XTENSA_UNDEFINED. */
3856 last_immed = XTENSA_UNDEFINED;
3857 last_opnd = xtensa_opcode_num_operands (isa, opcode);
3858 for (opi = last_opnd - 1; opi >= 0; opi--)
3860 if (xtensa_operand_is_visible (isa, opcode, opi) == 0)
3862 if (xtensa_operand_is_PCrelative (isa, opcode, opi) == 1)
3867 if (last_immed == XTENSA_UNDEFINED
3868 && xtensa_operand_is_register (isa, opcode, opi) == 0)
3872 return XTENSA_UNDEFINED;
3874 /* If the operand number was specified in an old-style relocation,
3875 check for consistency with the operand computed above. */
3876 if (r_type >= R_XTENSA_OP0 && r_type <= R_XTENSA_OP2)
3878 int reloc_opnd = r_type - R_XTENSA_OP0;
3879 if (reloc_opnd != last_immed)
3880 return XTENSA_UNDEFINED;
3888 get_relocation_slot (int r_type)
3898 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
3899 return r_type - R_XTENSA_SLOT0_OP;
3900 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
3901 return r_type - R_XTENSA_SLOT0_ALT;
3905 return XTENSA_UNDEFINED;
3909 /* Get the opcode for a relocation. */
3911 static xtensa_opcode
3912 get_relocation_opcode (bfd *abfd,
3915 Elf_Internal_Rela *irel)
3917 static xtensa_insnbuf ibuff = NULL;
3918 static xtensa_insnbuf sbuff = NULL;
3919 xtensa_isa isa = xtensa_default_isa;
3923 if (contents == NULL)
3924 return XTENSA_UNDEFINED;
3926 if (bfd_get_section_limit (abfd, sec) <= irel->r_offset)
3927 return XTENSA_UNDEFINED;
3931 ibuff = xtensa_insnbuf_alloc (isa);
3932 sbuff = xtensa_insnbuf_alloc (isa);
3935 /* Decode the instruction. */
3936 xtensa_insnbuf_from_chars (isa, ibuff, &contents[irel->r_offset],
3937 sec->size - irel->r_offset);
3938 fmt = xtensa_format_decode (isa, ibuff);
3939 slot = get_relocation_slot (ELF32_R_TYPE (irel->r_info));
3940 if (slot == XTENSA_UNDEFINED)
3941 return XTENSA_UNDEFINED;
3942 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
3943 return xtensa_opcode_decode (isa, fmt, slot, sbuff);
3948 is_l32r_relocation (bfd *abfd,
3951 Elf_Internal_Rela *irel)
3953 xtensa_opcode opcode;
3954 if (!is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
3956 opcode = get_relocation_opcode (abfd, sec, contents, irel);
3957 return (opcode == get_l32r_opcode ());
3961 static bfd_size_type
3962 get_asm_simplify_size (bfd_byte *contents,
3963 bfd_size_type content_len,
3964 bfd_size_type offset)
3966 bfd_size_type insnlen, size = 0;
3968 /* Decode the size of the next two instructions. */
3969 insnlen = insn_decode_len (contents, content_len, offset);
3975 insnlen = insn_decode_len (contents, content_len, offset + size);
3985 is_alt_relocation (int r_type)
3987 return (r_type >= R_XTENSA_SLOT0_ALT
3988 && r_type <= R_XTENSA_SLOT14_ALT);
3993 is_operand_relocation (int r_type)
4003 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
4005 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
4014 #define MIN_INSN_LENGTH 2
4016 /* Return 0 if it fails to decode. */
4019 insn_decode_len (bfd_byte *contents,
4020 bfd_size_type content_len,
4021 bfd_size_type offset)
4024 xtensa_isa isa = xtensa_default_isa;
4026 static xtensa_insnbuf ibuff = NULL;
4028 if (offset + MIN_INSN_LENGTH > content_len)
4032 ibuff = xtensa_insnbuf_alloc (isa);
4033 xtensa_insnbuf_from_chars (isa, ibuff, &contents[offset],
4034 content_len - offset);
4035 fmt = xtensa_format_decode (isa, ibuff);
4036 if (fmt == XTENSA_UNDEFINED)
4038 insn_len = xtensa_format_length (isa, fmt);
4039 if (insn_len == XTENSA_UNDEFINED)
4045 /* Decode the opcode for a single slot instruction.
4046 Return 0 if it fails to decode or the instruction is multi-slot. */
4049 insn_decode_opcode (bfd_byte *contents,
4050 bfd_size_type content_len,
4051 bfd_size_type offset,
4054 xtensa_isa isa = xtensa_default_isa;
4056 static xtensa_insnbuf insnbuf = NULL;
4057 static xtensa_insnbuf slotbuf = NULL;
4059 if (offset + MIN_INSN_LENGTH > content_len)
4060 return XTENSA_UNDEFINED;
4062 if (insnbuf == NULL)
4064 insnbuf = xtensa_insnbuf_alloc (isa);
4065 slotbuf = xtensa_insnbuf_alloc (isa);
4068 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4069 content_len - offset);
4070 fmt = xtensa_format_decode (isa, insnbuf);
4071 if (fmt == XTENSA_UNDEFINED)
4072 return XTENSA_UNDEFINED;
4074 if (slot >= xtensa_format_num_slots (isa, fmt))
4075 return XTENSA_UNDEFINED;
4077 xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
4078 return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
4082 /* The offset is the offset in the contents.
4083 The address is the address of that offset. */
4086 check_branch_target_aligned (bfd_byte *contents,
4087 bfd_size_type content_length,
4091 bfd_size_type insn_len = insn_decode_len (contents, content_length, offset);
4094 return check_branch_target_aligned_address (address, insn_len);
4099 check_loop_aligned (bfd_byte *contents,
4100 bfd_size_type content_length,
4104 bfd_size_type loop_len, insn_len;
4105 xtensa_opcode opcode;
4107 opcode = insn_decode_opcode (contents, content_length, offset, 0);
4108 if (opcode == XTENSA_UNDEFINED
4109 || xtensa_opcode_is_loop (xtensa_default_isa, opcode) != 1)
4115 loop_len = insn_decode_len (contents, content_length, offset);
4116 insn_len = insn_decode_len (contents, content_length, offset + loop_len);
4117 if (loop_len == 0 || insn_len == 0)
4123 return check_branch_target_aligned_address (address + loop_len, insn_len);
4128 check_branch_target_aligned_address (bfd_vma addr, int len)
4131 return (addr % 8 == 0);
4132 return ((addr >> 2) == ((addr + len - 1) >> 2));
4136 /* Instruction widening and narrowing. */
4138 /* When FLIX is available we need to access certain instructions only
4139 when they are 16-bit or 24-bit instructions. This table caches
4140 information about such instructions by walking through all the
4141 opcodes and finding the smallest single-slot format into which each
4144 static xtensa_format *op_single_fmt_table = NULL;
4148 init_op_single_format_table (void)
4150 xtensa_isa isa = xtensa_default_isa;
4151 xtensa_insnbuf ibuf;
4152 xtensa_opcode opcode;
4156 if (op_single_fmt_table)
4159 ibuf = xtensa_insnbuf_alloc (isa);
4160 num_opcodes = xtensa_isa_num_opcodes (isa);
4162 op_single_fmt_table = (xtensa_format *)
4163 bfd_malloc (sizeof (xtensa_format) * num_opcodes);
4164 for (opcode = 0; opcode < num_opcodes; opcode++)
4166 op_single_fmt_table[opcode] = XTENSA_UNDEFINED;
4167 for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
4169 if (xtensa_format_num_slots (isa, fmt) == 1
4170 && xtensa_opcode_encode (isa, fmt, 0, ibuf, opcode) == 0)
4172 xtensa_opcode old_fmt = op_single_fmt_table[opcode];
4173 int fmt_length = xtensa_format_length (isa, fmt);
4174 if (old_fmt == XTENSA_UNDEFINED
4175 || fmt_length < xtensa_format_length (isa, old_fmt))
4176 op_single_fmt_table[opcode] = fmt;
4180 xtensa_insnbuf_free (isa, ibuf);
4184 static xtensa_format
4185 get_single_format (xtensa_opcode opcode)
4187 init_op_single_format_table ();
4188 return op_single_fmt_table[opcode];
4192 /* For the set of narrowable instructions we do NOT include the
4193 narrowings beqz -> beqz.n or bnez -> bnez.n because of complexities
4194 involved during linker relaxation that may require these to
4195 re-expand in some conditions. Also, the narrowing "or" -> mov.n
4196 requires special case code to ensure it only works when op1 == op2. */
4204 struct string_pair narrowable[] =
4207 { "addi", "addi.n" },
4208 { "addmi", "addi.n" },
4209 { "l32i", "l32i.n" },
4210 { "movi", "movi.n" },
4212 { "retw", "retw.n" },
4213 { "s32i", "s32i.n" },
4214 { "or", "mov.n" } /* special case only when op1 == op2 */
4217 struct string_pair widenable[] =
4220 { "addi", "addi.n" },
4221 { "addmi", "addi.n" },
4222 { "beqz", "beqz.n" },
4223 { "bnez", "bnez.n" },
4224 { "l32i", "l32i.n" },
4225 { "movi", "movi.n" },
4227 { "retw", "retw.n" },
4228 { "s32i", "s32i.n" },
4229 { "or", "mov.n" } /* special case only when op1 == op2 */
4233 /* Check if an instruction can be "narrowed", i.e., changed from a standard
4234 3-byte instruction to a 2-byte "density" instruction. If it is valid,
4235 return the instruction buffer holding the narrow instruction. Otherwise,
4236 return 0. The set of valid narrowing are specified by a string table
4237 but require some special case operand checks in some cases. */
4239 static xtensa_insnbuf
4240 can_narrow_instruction (xtensa_insnbuf slotbuf,
4242 xtensa_opcode opcode)
4244 xtensa_isa isa = xtensa_default_isa;
4245 xtensa_format o_fmt;
4248 static xtensa_insnbuf o_insnbuf = NULL;
4249 static xtensa_insnbuf o_slotbuf = NULL;
4251 if (o_insnbuf == NULL)
4253 o_insnbuf = xtensa_insnbuf_alloc (isa);
4254 o_slotbuf = xtensa_insnbuf_alloc (isa);
4257 for (opi = 0; opi < (sizeof (narrowable)/sizeof (struct string_pair)); opi++)
4259 bfd_boolean is_or = (strcmp ("or", narrowable[opi].wide) == 0);
4261 if (opcode == xtensa_opcode_lookup (isa, narrowable[opi].wide))
4263 uint32 value, newval;
4264 int i, operand_count, o_operand_count;
4265 xtensa_opcode o_opcode;
4267 /* Address does not matter in this case. We might need to
4268 fix it to handle branches/jumps. */
4269 bfd_vma self_address = 0;
4271 o_opcode = xtensa_opcode_lookup (isa, narrowable[opi].narrow);
4272 if (o_opcode == XTENSA_UNDEFINED)
4274 o_fmt = get_single_format (o_opcode);
4275 if (o_fmt == XTENSA_UNDEFINED)
4278 if (xtensa_format_length (isa, fmt) != 3
4279 || xtensa_format_length (isa, o_fmt) != 2)
4282 xtensa_format_encode (isa, o_fmt, o_insnbuf);
4283 operand_count = xtensa_opcode_num_operands (isa, opcode);
4284 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4286 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4291 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4296 uint32 rawval0, rawval1, rawval2;
4298 if (o_operand_count + 1 != operand_count
4299 || xtensa_operand_get_field (isa, opcode, 0,
4300 fmt, 0, slotbuf, &rawval0) != 0
4301 || xtensa_operand_get_field (isa, opcode, 1,
4302 fmt, 0, slotbuf, &rawval1) != 0
4303 || xtensa_operand_get_field (isa, opcode, 2,
4304 fmt, 0, slotbuf, &rawval2) != 0
4305 || rawval1 != rawval2
4306 || rawval0 == rawval1 /* it is a nop */)
4310 for (i = 0; i < o_operand_count; ++i)
4312 if (xtensa_operand_get_field (isa, opcode, i, fmt, 0,
4314 || xtensa_operand_decode (isa, opcode, i, &value))
4317 /* PC-relative branches need adjustment, but
4318 the PC-rel operand will always have a relocation. */
4320 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4322 || xtensa_operand_encode (isa, o_opcode, i, &newval)
4323 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4328 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4338 /* Attempt to narrow an instruction. If the narrowing is valid, perform
4339 the action in-place directly into the contents and return TRUE. Otherwise,
4340 the return value is FALSE and the contents are not modified. */
4343 narrow_instruction (bfd_byte *contents,
4344 bfd_size_type content_length,
4345 bfd_size_type offset)
4347 xtensa_opcode opcode;
4348 bfd_size_type insn_len;
4349 xtensa_isa isa = xtensa_default_isa;
4351 xtensa_insnbuf o_insnbuf;
4353 static xtensa_insnbuf insnbuf = NULL;
4354 static xtensa_insnbuf slotbuf = NULL;
4356 if (insnbuf == NULL)
4358 insnbuf = xtensa_insnbuf_alloc (isa);
4359 slotbuf = xtensa_insnbuf_alloc (isa);
4362 BFD_ASSERT (offset < content_length);
4364 if (content_length < 2)
4367 /* We will hand-code a few of these for a little while.
4368 These have all been specified in the assembler aleady. */
4369 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4370 content_length - offset);
4371 fmt = xtensa_format_decode (isa, insnbuf);
4372 if (xtensa_format_num_slots (isa, fmt) != 1)
4375 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4378 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4379 if (opcode == XTENSA_UNDEFINED)
4381 insn_len = xtensa_format_length (isa, fmt);
4382 if (insn_len > content_length)
4385 o_insnbuf = can_narrow_instruction (slotbuf, fmt, opcode);
4388 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4389 content_length - offset);
4397 /* Check if an instruction can be "widened", i.e., changed from a 2-byte
4398 "density" instruction to a standard 3-byte instruction. If it is valid,
4399 return the instruction buffer holding the wide instruction. Otherwise,
4400 return 0. The set of valid widenings are specified by a string table
4401 but require some special case operand checks in some cases. */
4403 static xtensa_insnbuf
4404 can_widen_instruction (xtensa_insnbuf slotbuf,
4406 xtensa_opcode opcode)
4408 xtensa_isa isa = xtensa_default_isa;
4409 xtensa_format o_fmt;
4412 static xtensa_insnbuf o_insnbuf = NULL;
4413 static xtensa_insnbuf o_slotbuf = NULL;
4415 if (o_insnbuf == NULL)
4417 o_insnbuf = xtensa_insnbuf_alloc (isa);
4418 o_slotbuf = xtensa_insnbuf_alloc (isa);
4421 for (opi = 0; opi < (sizeof (widenable)/sizeof (struct string_pair)); opi++)
4423 bfd_boolean is_or = (strcmp ("or", widenable[opi].wide) == 0);
4424 bfd_boolean is_branch = (strcmp ("beqz", widenable[opi].wide) == 0
4425 || strcmp ("bnez", widenable[opi].wide) == 0);
4427 if (opcode == xtensa_opcode_lookup (isa, widenable[opi].narrow))
4429 uint32 value, newval;
4430 int i, operand_count, o_operand_count, check_operand_count;
4431 xtensa_opcode o_opcode;
4433 /* Address does not matter in this case. We might need to fix it
4434 to handle branches/jumps. */
4435 bfd_vma self_address = 0;
4437 o_opcode = xtensa_opcode_lookup (isa, widenable[opi].wide);
4438 if (o_opcode == XTENSA_UNDEFINED)
4440 o_fmt = get_single_format (o_opcode);
4441 if (o_fmt == XTENSA_UNDEFINED)
4444 if (xtensa_format_length (isa, fmt) != 2
4445 || xtensa_format_length (isa, o_fmt) != 3)
4448 xtensa_format_encode (isa, o_fmt, o_insnbuf);
4449 operand_count = xtensa_opcode_num_operands (isa, opcode);
4450 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4451 check_operand_count = o_operand_count;
4453 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4458 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4463 uint32 rawval0, rawval1;
4465 if (o_operand_count != operand_count + 1
4466 || xtensa_operand_get_field (isa, opcode, 0,
4467 fmt, 0, slotbuf, &rawval0) != 0
4468 || xtensa_operand_get_field (isa, opcode, 1,
4469 fmt, 0, slotbuf, &rawval1) != 0
4470 || rawval0 == rawval1 /* it is a nop */)
4474 check_operand_count--;
4476 for (i = 0; i < check_operand_count; i++)
4479 if (is_or && i == o_operand_count - 1)
4481 if (xtensa_operand_get_field (isa, opcode, new_i, fmt, 0,
4483 || xtensa_operand_decode (isa, opcode, new_i, &value))
4486 /* PC-relative branches need adjustment, but
4487 the PC-rel operand will always have a relocation. */
4489 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4491 || xtensa_operand_encode (isa, o_opcode, i, &newval)
4492 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4497 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4507 /* Attempt to widen an instruction. If the widening is valid, perform
4508 the action in-place directly into the contents and return TRUE. Otherwise,
4509 the return value is FALSE and the contents are not modified. */
4512 widen_instruction (bfd_byte *contents,
4513 bfd_size_type content_length,
4514 bfd_size_type offset)
4516 xtensa_opcode opcode;
4517 bfd_size_type insn_len;
4518 xtensa_isa isa = xtensa_default_isa;
4520 xtensa_insnbuf o_insnbuf;
4522 static xtensa_insnbuf insnbuf = NULL;
4523 static xtensa_insnbuf slotbuf = NULL;
4525 if (insnbuf == NULL)
4527 insnbuf = xtensa_insnbuf_alloc (isa);
4528 slotbuf = xtensa_insnbuf_alloc (isa);
4531 BFD_ASSERT (offset < content_length);
4533 if (content_length < 2)
4536 /* We will hand-code a few of these for a little while.
4537 These have all been specified in the assembler aleady. */
4538 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4539 content_length - offset);
4540 fmt = xtensa_format_decode (isa, insnbuf);
4541 if (xtensa_format_num_slots (isa, fmt) != 1)
4544 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4547 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4548 if (opcode == XTENSA_UNDEFINED)
4550 insn_len = xtensa_format_length (isa, fmt);
4551 if (insn_len > content_length)
4554 o_insnbuf = can_widen_instruction (slotbuf, fmt, opcode);
4557 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4558 content_length - offset);
4565 /* Code for transforming CALLs at link-time. */
4567 static bfd_reloc_status_type
4568 elf_xtensa_do_asm_simplify (bfd_byte *contents,
4570 bfd_vma content_length,
4571 char **error_message)
4573 static xtensa_insnbuf insnbuf = NULL;
4574 static xtensa_insnbuf slotbuf = NULL;
4575 xtensa_format core_format = XTENSA_UNDEFINED;
4576 xtensa_opcode opcode;
4577 xtensa_opcode direct_call_opcode;
4578 xtensa_isa isa = xtensa_default_isa;
4579 bfd_byte *chbuf = contents + address;
4582 if (insnbuf == NULL)
4584 insnbuf = xtensa_insnbuf_alloc (isa);
4585 slotbuf = xtensa_insnbuf_alloc (isa);
4588 if (content_length < address)
4590 *error_message = _("attempt to convert L32R/CALLX to CALL failed");
4591 return bfd_reloc_other;
4594 opcode = get_expanded_call_opcode (chbuf, content_length - address, 0);
4595 direct_call_opcode = swap_callx_for_call_opcode (opcode);
4596 if (direct_call_opcode == XTENSA_UNDEFINED)
4598 *error_message = _("attempt to convert L32R/CALLX to CALL failed");
4599 return bfd_reloc_other;
4602 /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset. */
4603 core_format = xtensa_format_lookup (isa, "x24");
4604 opcode = xtensa_opcode_lookup (isa, "or");
4605 xtensa_opcode_encode (isa, core_format, 0, slotbuf, opcode);
4606 for (opn = 0; opn < 3; opn++)
4609 xtensa_operand_encode (isa, opcode, opn, ®no);
4610 xtensa_operand_set_field (isa, opcode, opn, core_format, 0,
4613 xtensa_format_encode (isa, core_format, insnbuf);
4614 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4615 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf, content_length - address);
4617 /* Assemble a CALL ("callN 0") into the 3 byte offset. */
4618 xtensa_opcode_encode (isa, core_format, 0, slotbuf, direct_call_opcode);
4619 xtensa_operand_set_field (isa, opcode, 0, core_format, 0, slotbuf, 0);
4621 xtensa_format_encode (isa, core_format, insnbuf);
4622 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4623 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf + 3,
4624 content_length - address - 3);
4626 return bfd_reloc_ok;
4630 static bfd_reloc_status_type
4631 contract_asm_expansion (bfd_byte *contents,
4632 bfd_vma content_length,
4633 Elf_Internal_Rela *irel,
4634 char **error_message)
4636 bfd_reloc_status_type retval =
4637 elf_xtensa_do_asm_simplify (contents, irel->r_offset, content_length,
4640 if (retval != bfd_reloc_ok)
4641 return bfd_reloc_dangerous;
4643 /* Update the irel->r_offset field so that the right immediate and
4644 the right instruction are modified during the relocation. */
4645 irel->r_offset += 3;
4646 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_XTENSA_SLOT0_OP);
4647 return bfd_reloc_ok;
4651 static xtensa_opcode
4652 swap_callx_for_call_opcode (xtensa_opcode opcode)
4654 init_call_opcodes ();
4656 if (opcode == callx0_op) return call0_op;
4657 if (opcode == callx4_op) return call4_op;
4658 if (opcode == callx8_op) return call8_op;
4659 if (opcode == callx12_op) return call12_op;
4661 /* Return XTENSA_UNDEFINED if the opcode is not an indirect call. */
4662 return XTENSA_UNDEFINED;
4666 /* Check if "buf" is pointing to a "L32R aN; CALLX aN" or "CONST16 aN;
4667 CONST16 aN; CALLX aN" sequence, and if so, return the CALLX opcode.
4668 If not, return XTENSA_UNDEFINED. */
4670 #define L32R_TARGET_REG_OPERAND 0
4671 #define CONST16_TARGET_REG_OPERAND 0
4672 #define CALLN_SOURCE_OPERAND 0
4674 static xtensa_opcode
4675 get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
4677 static xtensa_insnbuf insnbuf = NULL;
4678 static xtensa_insnbuf slotbuf = NULL;
4680 xtensa_opcode opcode;
4681 xtensa_isa isa = xtensa_default_isa;
4682 uint32 regno, const16_regno, call_regno;
4685 if (insnbuf == NULL)
4687 insnbuf = xtensa_insnbuf_alloc (isa);
4688 slotbuf = xtensa_insnbuf_alloc (isa);
4691 xtensa_insnbuf_from_chars (isa, insnbuf, buf, bufsize);
4692 fmt = xtensa_format_decode (isa, insnbuf);
4693 if (fmt == XTENSA_UNDEFINED
4694 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4695 return XTENSA_UNDEFINED;
4697 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4698 if (opcode == XTENSA_UNDEFINED)
4699 return XTENSA_UNDEFINED;
4701 if (opcode == get_l32r_opcode ())
4704 *p_uses_l32r = TRUE;
4705 if (xtensa_operand_get_field (isa, opcode, L32R_TARGET_REG_OPERAND,
4706 fmt, 0, slotbuf, ®no)
4707 || xtensa_operand_decode (isa, opcode, L32R_TARGET_REG_OPERAND,
4709 return XTENSA_UNDEFINED;
4711 else if (opcode == get_const16_opcode ())
4714 *p_uses_l32r = FALSE;
4715 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4716 fmt, 0, slotbuf, ®no)
4717 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4719 return XTENSA_UNDEFINED;
4721 /* Check that the next instruction is also CONST16. */
4722 offset += xtensa_format_length (isa, fmt);
4723 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4724 fmt = xtensa_format_decode (isa, insnbuf);
4725 if (fmt == XTENSA_UNDEFINED
4726 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4727 return XTENSA_UNDEFINED;
4728 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4729 if (opcode != get_const16_opcode ())
4730 return XTENSA_UNDEFINED;
4732 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4733 fmt, 0, slotbuf, &const16_regno)
4734 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4736 || const16_regno != regno)
4737 return XTENSA_UNDEFINED;
4740 return XTENSA_UNDEFINED;
4742 /* Next instruction should be an CALLXn with operand 0 == regno. */
4743 offset += xtensa_format_length (isa, fmt);
4744 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4745 fmt = xtensa_format_decode (isa, insnbuf);
4746 if (fmt == XTENSA_UNDEFINED
4747 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4748 return XTENSA_UNDEFINED;
4749 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4750 if (opcode == XTENSA_UNDEFINED
4751 || !is_indirect_call_opcode (opcode))
4752 return XTENSA_UNDEFINED;
4754 if (xtensa_operand_get_field (isa, opcode, CALLN_SOURCE_OPERAND,
4755 fmt, 0, slotbuf, &call_regno)
4756 || xtensa_operand_decode (isa, opcode, CALLN_SOURCE_OPERAND,
4758 return XTENSA_UNDEFINED;
4760 if (call_regno != regno)
4761 return XTENSA_UNDEFINED;
4767 /* Data structures used during relaxation. */
4769 /* r_reloc: relocation values. */
4771 /* Through the relaxation process, we need to keep track of the values
4772 that will result from evaluating relocations. The standard ELF
4773 relocation structure is not sufficient for this purpose because we're
4774 operating on multiple input files at once, so we need to know which
4775 input file a relocation refers to. The r_reloc structure thus
4776 records both the input file (bfd) and ELF relocation.
4778 For efficiency, an r_reloc also contains a "target_offset" field to
4779 cache the target-section-relative offset value that is represented by
4782 The r_reloc also contains a virtual offset that allows multiple
4783 inserted literals to be placed at the same "address" with
4784 different offsets. */
4786 typedef struct r_reloc_struct r_reloc;
4788 struct r_reloc_struct
4791 Elf_Internal_Rela rela;
4792 bfd_vma target_offset;
4793 bfd_vma virtual_offset;
4797 /* The r_reloc structure is included by value in literal_value, but not
4798 every literal_value has an associated relocation -- some are simple
4799 constants. In such cases, we set all the fields in the r_reloc
4800 struct to zero. The r_reloc_is_const function should be used to
4801 detect this case. */
4804 r_reloc_is_const (const r_reloc *r_rel)
4806 return (r_rel->abfd == NULL);
4811 r_reloc_get_target_offset (const r_reloc *r_rel)
4813 bfd_vma target_offset;
4814 unsigned long r_symndx;
4816 BFD_ASSERT (!r_reloc_is_const (r_rel));
4817 r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4818 target_offset = get_elf_r_symndx_offset (r_rel->abfd, r_symndx);
4819 return (target_offset + r_rel->rela.r_addend);
4823 static struct elf_link_hash_entry *
4824 r_reloc_get_hash_entry (const r_reloc *r_rel)
4826 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4827 return get_elf_r_symndx_hash_entry (r_rel->abfd, r_symndx);
4832 r_reloc_get_section (const r_reloc *r_rel)
4834 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4835 return get_elf_r_symndx_section (r_rel->abfd, r_symndx);
4840 r_reloc_is_defined (const r_reloc *r_rel)
4846 sec = r_reloc_get_section (r_rel);
4847 if (sec == bfd_abs_section_ptr
4848 || sec == bfd_com_section_ptr
4849 || sec == bfd_und_section_ptr)
4856 r_reloc_init (r_reloc *r_rel,
4858 Elf_Internal_Rela *irel,
4860 bfd_size_type content_length)
4863 reloc_howto_type *howto;
4867 r_rel->rela = *irel;
4869 r_rel->target_offset = r_reloc_get_target_offset (r_rel);
4870 r_rel->virtual_offset = 0;
4871 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
4872 howto = &elf_howto_table[r_type];
4873 if (howto->partial_inplace)
4875 bfd_vma inplace_val;
4876 BFD_ASSERT (r_rel->rela.r_offset < content_length);
4878 inplace_val = bfd_get_32 (abfd, &contents[r_rel->rela.r_offset]);
4879 r_rel->target_offset += inplace_val;
4883 memset (r_rel, 0, sizeof (r_reloc));
4890 print_r_reloc (FILE *fp, const r_reloc *r_rel)
4892 if (r_reloc_is_defined (r_rel))
4894 asection *sec = r_reloc_get_section (r_rel);
4895 fprintf (fp, " %s(%s + ", sec->owner->filename, sec->name);
4897 else if (r_reloc_get_hash_entry (r_rel))
4898 fprintf (fp, " %s + ", r_reloc_get_hash_entry (r_rel)->root.root.string);
4900 fprintf (fp, " ?? + ");
4902 fprintf_vma (fp, r_rel->target_offset);
4903 if (r_rel->virtual_offset)
4905 fprintf (fp, " + ");
4906 fprintf_vma (fp, r_rel->virtual_offset);
4915 /* source_reloc: relocations that reference literals. */
4917 /* To determine whether literals can be coalesced, we need to first
4918 record all the relocations that reference the literals. The
4919 source_reloc structure below is used for this purpose. The
4920 source_reloc entries are kept in a per-literal-section array, sorted
4921 by offset within the literal section (i.e., target offset).
4923 The source_sec and r_rel.rela.r_offset fields identify the source of
4924 the relocation. The r_rel field records the relocation value, i.e.,
4925 the offset of the literal being referenced. The opnd field is needed
4926 to determine the range of the immediate field to which the relocation
4927 applies, so we can determine whether another literal with the same
4928 value is within range. The is_null field is true when the relocation
4929 is being removed (e.g., when an L32R is being removed due to a CALLX
4930 that is converted to a direct CALL). */
4932 typedef struct source_reloc_struct source_reloc;
4934 struct source_reloc_struct
4936 asection *source_sec;
4938 xtensa_opcode opcode;
4940 bfd_boolean is_null;
4941 bfd_boolean is_abs_literal;
4946 init_source_reloc (source_reloc *reloc,
4947 asection *source_sec,
4948 const r_reloc *r_rel,
4949 xtensa_opcode opcode,
4951 bfd_boolean is_abs_literal)
4953 reloc->source_sec = source_sec;
4954 reloc->r_rel = *r_rel;
4955 reloc->opcode = opcode;
4957 reloc->is_null = FALSE;
4958 reloc->is_abs_literal = is_abs_literal;
4962 /* Find the source_reloc for a particular source offset and relocation
4963 type. Note that the array is sorted by _target_ offset, so this is
4964 just a linear search. */
4966 static source_reloc *
4967 find_source_reloc (source_reloc *src_relocs,
4970 Elf_Internal_Rela *irel)
4974 for (i = 0; i < src_count; i++)
4976 if (src_relocs[i].source_sec == sec
4977 && src_relocs[i].r_rel.rela.r_offset == irel->r_offset
4978 && (ELF32_R_TYPE (src_relocs[i].r_rel.rela.r_info)
4979 == ELF32_R_TYPE (irel->r_info)))
4980 return &src_relocs[i];
4988 source_reloc_compare (const void *ap, const void *bp)
4990 const source_reloc *a = (const source_reloc *) ap;
4991 const source_reloc *b = (const source_reloc *) bp;
4993 if (a->r_rel.target_offset != b->r_rel.target_offset)
4994 return (a->r_rel.target_offset - b->r_rel.target_offset);
4996 /* We don't need to sort on these criteria for correctness,
4997 but enforcing a more strict ordering prevents unstable qsort
4998 from behaving differently with different implementations.
4999 Without the code below we get correct but different results
5000 on Solaris 2.7 and 2.8. We would like to always produce the
5001 same results no matter the host. */
5003 if ((!a->is_null) - (!b->is_null))
5004 return ((!a->is_null) - (!b->is_null));
5005 return internal_reloc_compare (&a->r_rel.rela, &b->r_rel.rela);
5009 /* Literal values and value hash tables. */
5011 /* Literals with the same value can be coalesced. The literal_value
5012 structure records the value of a literal: the "r_rel" field holds the
5013 information from the relocation on the literal (if there is one) and
5014 the "value" field holds the contents of the literal word itself.
5016 The value_map structure records a literal value along with the
5017 location of a literal holding that value. The value_map hash table
5018 is indexed by the literal value, so that we can quickly check if a
5019 particular literal value has been seen before and is thus a candidate
5022 typedef struct literal_value_struct literal_value;
5023 typedef struct value_map_struct value_map;
5024 typedef struct value_map_hash_table_struct value_map_hash_table;
5026 struct literal_value_struct
5029 unsigned long value;
5030 bfd_boolean is_abs_literal;
5033 struct value_map_struct
5035 literal_value val; /* The literal value. */
5036 r_reloc loc; /* Location of the literal. */
5040 struct value_map_hash_table_struct
5042 unsigned bucket_count;
5043 value_map **buckets;
5045 bfd_boolean has_last_loc;
5051 init_literal_value (literal_value *lit,
5052 const r_reloc *r_rel,
5053 unsigned long value,
5054 bfd_boolean is_abs_literal)
5056 lit->r_rel = *r_rel;
5058 lit->is_abs_literal = is_abs_literal;
5063 literal_value_equal (const literal_value *src1,
5064 const literal_value *src2,
5065 bfd_boolean final_static_link)
5067 struct elf_link_hash_entry *h1, *h2;
5069 if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
5072 if (r_reloc_is_const (&src1->r_rel))
5073 return (src1->value == src2->value);
5075 if (ELF32_R_TYPE (src1->r_rel.rela.r_info)
5076 != ELF32_R_TYPE (src2->r_rel.rela.r_info))
5079 if (src1->r_rel.target_offset != src2->r_rel.target_offset)
5082 if (src1->r_rel.virtual_offset != src2->r_rel.virtual_offset)
5085 if (src1->value != src2->value)
5088 /* Now check for the same section (if defined) or the same elf_hash
5089 (if undefined or weak). */
5090 h1 = r_reloc_get_hash_entry (&src1->r_rel);
5091 h2 = r_reloc_get_hash_entry (&src2->r_rel);
5092 if (r_reloc_is_defined (&src1->r_rel)
5093 && (final_static_link
5094 || ((!h1 || h1->root.type != bfd_link_hash_defweak)
5095 && (!h2 || h2->root.type != bfd_link_hash_defweak))))
5097 if (r_reloc_get_section (&src1->r_rel)
5098 != r_reloc_get_section (&src2->r_rel))
5103 /* Require that the hash entries (i.e., symbols) be identical. */
5104 if (h1 != h2 || h1 == 0)
5108 if (src1->is_abs_literal != src2->is_abs_literal)
5115 /* Must be power of 2. */
5116 #define INITIAL_HASH_RELOC_BUCKET_COUNT 1024
5118 static value_map_hash_table *
5119 value_map_hash_table_init (void)
5121 value_map_hash_table *values;
5123 values = (value_map_hash_table *)
5124 bfd_zmalloc (sizeof (value_map_hash_table));
5125 values->bucket_count = INITIAL_HASH_RELOC_BUCKET_COUNT;
5127 values->buckets = (value_map **)
5128 bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
5129 if (values->buckets == NULL)
5134 values->has_last_loc = FALSE;
5141 value_map_hash_table_delete (value_map_hash_table *table)
5143 free (table->buckets);
5149 hash_bfd_vma (bfd_vma val)
5151 return (val >> 2) + (val >> 10);
5156 literal_value_hash (const literal_value *src)
5160 hash_val = hash_bfd_vma (src->value);
5161 if (!r_reloc_is_const (&src->r_rel))
5165 hash_val += hash_bfd_vma (src->is_abs_literal * 1000);
5166 hash_val += hash_bfd_vma (src->r_rel.target_offset);
5167 hash_val += hash_bfd_vma (src->r_rel.virtual_offset);
5169 /* Now check for the same section and the same elf_hash. */
5170 if (r_reloc_is_defined (&src->r_rel))
5171 sec_or_hash = r_reloc_get_section (&src->r_rel);
5173 sec_or_hash = r_reloc_get_hash_entry (&src->r_rel);
5174 hash_val += hash_bfd_vma ((bfd_vma) (size_t) sec_or_hash);
5180 /* Check if the specified literal_value has been seen before. */
5183 value_map_get_cached_value (value_map_hash_table *map,
5184 const literal_value *val,
5185 bfd_boolean final_static_link)
5191 idx = literal_value_hash (val);
5192 idx = idx & (map->bucket_count - 1);
5193 bucket = map->buckets[idx];
5194 for (map_e = bucket; map_e; map_e = map_e->next)
5196 if (literal_value_equal (&map_e->val, val, final_static_link))
5203 /* Record a new literal value. It is illegal to call this if VALUE
5204 already has an entry here. */
5207 add_value_map (value_map_hash_table *map,
5208 const literal_value *val,
5210 bfd_boolean final_static_link)
5212 value_map **bucket_p;
5215 value_map *val_e = (value_map *) bfd_zmalloc (sizeof (value_map));
5218 bfd_set_error (bfd_error_no_memory);
5222 BFD_ASSERT (!value_map_get_cached_value (map, val, final_static_link));
5226 idx = literal_value_hash (val);
5227 idx = idx & (map->bucket_count - 1);
5228 bucket_p = &map->buckets[idx];
5230 val_e->next = *bucket_p;
5233 /* FIXME: Consider resizing the hash table if we get too many entries. */
5239 /* Lists of text actions (ta_) for narrowing, widening, longcall
5240 conversion, space fill, code & literal removal, etc. */
5242 /* The following text actions are generated:
5244 "ta_remove_insn" remove an instruction or instructions
5245 "ta_remove_longcall" convert longcall to call
5246 "ta_convert_longcall" convert longcall to nop/call
5247 "ta_narrow_insn" narrow a wide instruction
5248 "ta_widen" widen a narrow instruction
5249 "ta_fill" add fill or remove fill
5250 removed < 0 is a fill; branches to the fill address will be
5251 changed to address + fill size (e.g., address - removed)
5252 removed >= 0 branches to the fill address will stay unchanged
5253 "ta_remove_literal" remove a literal; this action is
5254 indicated when a literal is removed
5256 "ta_add_literal" insert a new literal; this action is
5257 indicated when a literal has been moved.
5258 It may use a virtual_offset because
5259 multiple literals can be placed at the
5262 For each of these text actions, we also record the number of bytes
5263 removed by performing the text action. In the case of a "ta_widen"
5264 or a "ta_fill" that adds space, the removed_bytes will be negative. */
5266 typedef struct text_action_struct text_action;
5267 typedef struct text_action_list_struct text_action_list;
5268 typedef enum text_action_enum_t text_action_t;
5270 enum text_action_enum_t
5273 ta_remove_insn, /* removed = -size */
5274 ta_remove_longcall, /* removed = -size */
5275 ta_convert_longcall, /* removed = 0 */
5276 ta_narrow_insn, /* removed = -1 */
5277 ta_widen_insn, /* removed = +1 */
5278 ta_fill, /* removed = +size */
5284 /* Structure for a text action record. */
5285 struct text_action_struct
5287 text_action_t action;
5288 asection *sec; /* Optional */
5290 bfd_vma virtual_offset; /* Zero except for adding literals. */
5292 literal_value value; /* Only valid when adding literals. */
5295 struct removal_by_action_entry_struct
5300 int eq_removed_before_fill;
5302 typedef struct removal_by_action_entry_struct removal_by_action_entry;
5304 struct removal_by_action_map_struct
5307 removal_by_action_entry *entry;
5309 typedef struct removal_by_action_map_struct removal_by_action_map;
5312 /* List of all of the actions taken on a text section. */
5313 struct text_action_list_struct
5317 removal_by_action_map map;
5321 static text_action *
5322 find_fill_action (text_action_list *l, asection *sec, bfd_vma offset)
5326 /* It is not necessary to fill at the end of a section. */
5327 if (sec->size == offset)
5333 splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5335 return (text_action *)node->value;
5341 compute_removed_action_diff (const text_action *ta,
5345 int removable_space)
5348 int current_removed = 0;
5351 current_removed = ta->removed_bytes;
5353 BFD_ASSERT (ta == NULL || ta->offset == offset);
5354 BFD_ASSERT (ta == NULL || ta->action == ta_fill);
5356 /* It is not necessary to fill at the end of a section. Clean this up. */
5357 if (sec->size == offset)
5358 new_removed = removable_space - 0;
5362 int added = -removed - current_removed;
5363 /* Ignore multiples of the section alignment. */
5364 added = ((1 << sec->alignment_power) - 1) & added;
5365 new_removed = (-added);
5367 /* Modify for removable. */
5368 space = removable_space - new_removed;
5369 new_removed = (removable_space
5370 - (((1 << sec->alignment_power) - 1) & space));
5372 return (new_removed - current_removed);
5377 adjust_fill_action (text_action *ta, int fill_diff)
5379 ta->removed_bytes += fill_diff;
5384 text_action_compare (splay_tree_key a, splay_tree_key b)
5386 text_action *pa = (text_action *)a;
5387 text_action *pb = (text_action *)b;
5388 static const int action_priority[] =
5392 [ta_convert_longcall] = 2,
5393 [ta_narrow_insn] = 3,
5394 [ta_remove_insn] = 4,
5395 [ta_remove_longcall] = 5,
5396 [ta_remove_literal] = 6,
5397 [ta_widen_insn] = 7,
5398 [ta_add_literal] = 8,
5401 if (pa->offset == pb->offset)
5403 if (pa->action == pb->action)
5405 return action_priority[pa->action] - action_priority[pb->action];
5408 return pa->offset < pb->offset ? -1 : 1;
5411 static text_action *
5412 action_first (text_action_list *action_list)
5414 splay_tree_node node = splay_tree_min (action_list->tree);
5415 return node ? (text_action *)node->value : NULL;
5418 static text_action *
5419 action_next (text_action_list *action_list, text_action *action)
5421 splay_tree_node node = splay_tree_successor (action_list->tree,
5422 (splay_tree_key)action);
5423 return node ? (text_action *)node->value : NULL;
5426 /* Add a modification action to the text. For the case of adding or
5427 removing space, modify any current fill and assume that
5428 "unreachable_space" bytes can be freely contracted. Note that a
5429 negative removed value is a fill. */
5432 text_action_add (text_action_list *l,
5433 text_action_t action,
5441 /* It is not necessary to fill at the end of a section. */
5442 if (action == ta_fill && sec->size == offset)
5445 /* It is not necessary to fill 0 bytes. */
5446 if (action == ta_fill && removed == 0)
5452 if (action == ta_fill)
5454 splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5458 ta = (text_action *)node->value;
5459 ta->removed_bytes += removed;
5464 BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)&a) == NULL);
5466 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5467 ta->action = action;
5469 ta->offset = offset;
5470 ta->removed_bytes = removed;
5471 splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5477 text_action_add_literal (text_action_list *l,
5478 text_action_t action,
5480 const literal_value *value,
5484 asection *sec = r_reloc_get_section (loc);
5485 bfd_vma offset = loc->target_offset;
5486 bfd_vma virtual_offset = loc->virtual_offset;
5488 BFD_ASSERT (action == ta_add_literal);
5490 /* Create a new record and fill it up. */
5491 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5492 ta->action = action;
5494 ta->offset = offset;
5495 ta->virtual_offset = virtual_offset;
5497 ta->removed_bytes = removed;
5499 BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)ta) == NULL);
5500 splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5505 /* Find the total offset adjustment for the relaxations specified by
5506 text_actions, beginning from a particular starting action. This is
5507 typically used from offset_with_removed_text to search an entire list of
5508 actions, but it may also be called directly when adjusting adjacent offsets
5509 so that each search may begin where the previous one left off. */
5512 removed_by_actions (text_action_list *action_list,
5513 text_action **p_start_action,
5515 bfd_boolean before_fill)
5520 r = *p_start_action;
5523 splay_tree_node node = splay_tree_lookup (action_list->tree,
5525 BFD_ASSERT (node != NULL && r == (text_action *)node->value);
5530 if (r->offset > offset)
5533 if (r->offset == offset
5534 && (before_fill || r->action != ta_fill || r->removed_bytes >= 0))
5537 removed += r->removed_bytes;
5539 r = action_next (action_list, r);
5542 *p_start_action = r;
5548 offset_with_removed_text (text_action_list *action_list, bfd_vma offset)
5550 text_action *r = action_first (action_list);
5552 return offset - removed_by_actions (action_list, &r, offset, FALSE);
5557 action_list_count (text_action_list *action_list)
5559 return action_list->count;
5562 typedef struct map_action_fn_context_struct map_action_fn_context;
5563 struct map_action_fn_context_struct
5566 removal_by_action_map map;
5567 bfd_boolean eq_complete;
5571 map_action_fn (splay_tree_node node, void *p)
5573 map_action_fn_context *ctx = p;
5574 text_action *r = (text_action *)node->value;
5575 removal_by_action_entry *ientry = ctx->map.entry + ctx->map.n_entries;
5577 if (ctx->map.n_entries && (ientry - 1)->offset == r->offset)
5583 ++ctx->map.n_entries;
5584 ctx->eq_complete = FALSE;
5585 ientry->offset = r->offset;
5586 ientry->eq_removed_before_fill = ctx->removed;
5589 if (!ctx->eq_complete)
5591 if (r->action != ta_fill || r->removed_bytes >= 0)
5593 ientry->eq_removed = ctx->removed;
5594 ctx->eq_complete = TRUE;
5597 ientry->eq_removed = ctx->removed + r->removed_bytes;
5600 ctx->removed += r->removed_bytes;
5601 ientry->removed = ctx->removed;
5606 map_removal_by_action (text_action_list *action_list)
5608 map_action_fn_context ctx;
5611 ctx.map.n_entries = 0;
5612 ctx.map.entry = bfd_malloc (action_list_count (action_list) *
5613 sizeof (removal_by_action_entry));
5614 ctx.eq_complete = FALSE;
5616 splay_tree_foreach (action_list->tree, map_action_fn, &ctx);
5617 action_list->map = ctx.map;
5621 removed_by_actions_map (text_action_list *action_list, bfd_vma offset,
5622 bfd_boolean before_fill)
5626 if (!action_list->map.entry)
5627 map_removal_by_action (action_list);
5629 if (!action_list->map.n_entries)
5633 b = action_list->map.n_entries;
5637 unsigned c = (a + b) / 2;
5639 if (action_list->map.entry[c].offset <= offset)
5645 if (action_list->map.entry[a].offset < offset)
5647 return action_list->map.entry[a].removed;
5649 else if (action_list->map.entry[a].offset == offset)
5651 return before_fill ?
5652 action_list->map.entry[a].eq_removed_before_fill :
5653 action_list->map.entry[a].eq_removed;
5662 offset_with_removed_text_map (text_action_list *action_list, bfd_vma offset)
5664 int removed = removed_by_actions_map (action_list, offset, FALSE);
5665 return offset - removed;
5669 /* The find_insn_action routine will only find non-fill actions. */
5671 static text_action *
5672 find_insn_action (text_action_list *action_list, bfd_vma offset)
5674 static const text_action_t action[] =
5676 ta_convert_longcall,
5686 for (i = 0; i < sizeof (action) / sizeof (*action); ++i)
5688 splay_tree_node node;
5690 a.action = action[i];
5691 node = splay_tree_lookup (action_list->tree, (splay_tree_key)&a);
5693 return (text_action *)node->value;
5702 print_action (FILE *fp, text_action *r)
5704 const char *t = "unknown";
5707 case ta_remove_insn:
5708 t = "remove_insn"; break;
5709 case ta_remove_longcall:
5710 t = "remove_longcall"; break;
5711 case ta_convert_longcall:
5712 t = "convert_longcall"; break;
5713 case ta_narrow_insn:
5714 t = "narrow_insn"; break;
5716 t = "widen_insn"; break;
5721 case ta_remove_literal:
5722 t = "remove_literal"; break;
5723 case ta_add_literal:
5724 t = "add_literal"; break;
5727 fprintf (fp, "%s: %s[0x%lx] \"%s\" %d\n",
5728 r->sec->owner->filename,
5729 r->sec->name, (unsigned long) r->offset, t, r->removed_bytes);
5733 print_action_list_fn (splay_tree_node node, void *p)
5735 text_action *r = (text_action *)node->value;
5737 print_action (p, r);
5742 print_action_list (FILE *fp, text_action_list *action_list)
5744 fprintf (fp, "Text Action\n");
5745 splay_tree_foreach (action_list->tree, print_action_list_fn, fp);
5751 /* Lists of literals being coalesced or removed. */
5753 /* In the usual case, the literal identified by "from" is being
5754 coalesced with another literal identified by "to". If the literal is
5755 unused and is being removed altogether, "to.abfd" will be NULL.
5756 The removed_literal entries are kept on a per-section list, sorted
5757 by the "from" offset field. */
5759 typedef struct removed_literal_struct removed_literal;
5760 typedef struct removed_literal_map_entry_struct removed_literal_map_entry;
5761 typedef struct removed_literal_list_struct removed_literal_list;
5763 struct removed_literal_struct
5767 removed_literal *next;
5770 struct removed_literal_map_entry_struct
5773 removed_literal *literal;
5776 struct removed_literal_list_struct
5778 removed_literal *head;
5779 removed_literal *tail;
5782 removed_literal_map_entry *map;
5786 /* Record that the literal at "from" is being removed. If "to" is not
5787 NULL, the "from" literal is being coalesced with the "to" literal. */
5790 add_removed_literal (removed_literal_list *removed_list,
5791 const r_reloc *from,
5794 removed_literal *r, *new_r, *next_r;
5796 new_r = (removed_literal *) bfd_zmalloc (sizeof (removed_literal));
5798 new_r->from = *from;
5802 new_r->to.abfd = NULL;
5805 r = removed_list->head;
5808 removed_list->head = new_r;
5809 removed_list->tail = new_r;
5811 /* Special check for common case of append. */
5812 else if (removed_list->tail->from.target_offset < from->target_offset)
5814 removed_list->tail->next = new_r;
5815 removed_list->tail = new_r;
5819 while (r->from.target_offset < from->target_offset && r->next)
5825 new_r->next = next_r;
5827 removed_list->tail = new_r;
5832 map_removed_literal (removed_literal_list *removed_list)
5836 removed_literal_map_entry *map = NULL;
5837 removed_literal *r = removed_list->head;
5839 for (i = 0; r; ++i, r = r->next)
5843 n_map = (n_map * 2) + 2;
5844 map = bfd_realloc (map, n_map * sizeof (*map));
5846 map[i].addr = r->from.target_offset;
5849 removed_list->map = map;
5850 removed_list->n_map = i;
5854 removed_literal_compare (const void *a, const void *b)
5856 const removed_literal_map_entry *pa = a;
5857 const removed_literal_map_entry *pb = b;
5859 if (pa->addr == pb->addr)
5862 return pa->addr < pb->addr ? -1 : 1;
5865 /* Check if the list of removed literals contains an entry for the
5866 given address. Return the entry if found. */
5868 static removed_literal *
5869 find_removed_literal (removed_literal_list *removed_list, bfd_vma addr)
5871 removed_literal_map_entry *p;
5872 removed_literal *r = NULL;
5874 if (removed_list->map == NULL)
5875 map_removed_literal (removed_list);
5877 p = bsearch (&addr, removed_list->map, removed_list->n_map,
5878 sizeof (*removed_list->map), removed_literal_compare);
5881 while (p != removed_list->map && (p - 1)->addr == addr)
5892 print_removed_literals (FILE *fp, removed_literal_list *removed_list)
5895 r = removed_list->head;
5897 fprintf (fp, "Removed Literals\n");
5898 for (; r != NULL; r = r->next)
5900 print_r_reloc (fp, &r->from);
5901 fprintf (fp, " => ");
5902 if (r->to.abfd == NULL)
5903 fprintf (fp, "REMOVED");
5905 print_r_reloc (fp, &r->to);
5913 /* Per-section data for relaxation. */
5915 typedef struct reloc_bfd_fix_struct reloc_bfd_fix;
5917 struct xtensa_relax_info_struct
5919 bfd_boolean is_relaxable_literal_section;
5920 bfd_boolean is_relaxable_asm_section;
5921 int visited; /* Number of times visited. */
5923 source_reloc *src_relocs; /* Array[src_count]. */
5925 int src_next; /* Next src_relocs entry to assign. */
5927 removed_literal_list removed_list;
5928 text_action_list action_list;
5930 reloc_bfd_fix *fix_list;
5931 reloc_bfd_fix *fix_array;
5932 unsigned fix_array_count;
5934 /* Support for expanding the reloc array that is stored
5935 in the section structure. If the relocations have been
5936 reallocated, the newly allocated relocations will be referenced
5937 here along with the actual size allocated. The relocation
5938 count will always be found in the section structure. */
5939 Elf_Internal_Rela *allocated_relocs;
5940 unsigned relocs_count;
5941 unsigned allocated_relocs_count;
5944 struct elf_xtensa_section_data
5946 struct bfd_elf_section_data elf;
5947 xtensa_relax_info relax_info;
5952 elf_xtensa_new_section_hook (bfd *abfd, asection *sec)
5954 if (!sec->used_by_bfd)
5956 struct elf_xtensa_section_data *sdata;
5957 bfd_size_type amt = sizeof (*sdata);
5959 sdata = bfd_zalloc (abfd, amt);
5962 sec->used_by_bfd = sdata;
5965 return _bfd_elf_new_section_hook (abfd, sec);
5969 static xtensa_relax_info *
5970 get_xtensa_relax_info (asection *sec)
5972 struct elf_xtensa_section_data *section_data;
5974 /* No info available if no section or if it is an output section. */
5975 if (!sec || sec == sec->output_section)
5978 section_data = (struct elf_xtensa_section_data *) elf_section_data (sec);
5979 return §ion_data->relax_info;
5984 init_xtensa_relax_info (asection *sec)
5986 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
5988 relax_info->is_relaxable_literal_section = FALSE;
5989 relax_info->is_relaxable_asm_section = FALSE;
5990 relax_info->visited = 0;
5992 relax_info->src_relocs = NULL;
5993 relax_info->src_count = 0;
5994 relax_info->src_next = 0;
5996 relax_info->removed_list.head = NULL;
5997 relax_info->removed_list.tail = NULL;
5999 relax_info->action_list.tree = splay_tree_new (text_action_compare,
6001 relax_info->action_list.map.n_entries = 0;
6002 relax_info->action_list.map.entry = NULL;
6004 relax_info->fix_list = NULL;
6005 relax_info->fix_array = NULL;
6006 relax_info->fix_array_count = 0;
6008 relax_info->allocated_relocs = NULL;
6009 relax_info->relocs_count = 0;
6010 relax_info->allocated_relocs_count = 0;
6014 /* Coalescing literals may require a relocation to refer to a section in
6015 a different input file, but the standard relocation information
6016 cannot express that. Instead, the reloc_bfd_fix structures are used
6017 to "fix" the relocations that refer to sections in other input files.
6018 These structures are kept on per-section lists. The "src_type" field
6019 records the relocation type in case there are multiple relocations on
6020 the same location. FIXME: This is ugly; an alternative might be to
6021 add new symbols with the "owner" field to some other input file. */
6023 struct reloc_bfd_fix_struct
6027 unsigned src_type; /* Relocation type. */
6029 asection *target_sec;
6030 bfd_vma target_offset;
6031 bfd_boolean translated;
6033 reloc_bfd_fix *next;
6037 static reloc_bfd_fix *
6038 reloc_bfd_fix_init (asection *src_sec,
6041 asection *target_sec,
6042 bfd_vma target_offset,
6043 bfd_boolean translated)
6047 fix = (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix));
6048 fix->src_sec = src_sec;
6049 fix->src_offset = src_offset;
6050 fix->src_type = src_type;
6051 fix->target_sec = target_sec;
6052 fix->target_offset = target_offset;
6053 fix->translated = translated;
6060 add_fix (asection *src_sec, reloc_bfd_fix *fix)
6062 xtensa_relax_info *relax_info;
6064 relax_info = get_xtensa_relax_info (src_sec);
6065 fix->next = relax_info->fix_list;
6066 relax_info->fix_list = fix;
6071 fix_compare (const void *ap, const void *bp)
6073 const reloc_bfd_fix *a = (const reloc_bfd_fix *) ap;
6074 const reloc_bfd_fix *b = (const reloc_bfd_fix *) bp;
6076 if (a->src_offset != b->src_offset)
6077 return (a->src_offset - b->src_offset);
6078 return (a->src_type - b->src_type);
6083 cache_fix_array (asection *sec)
6085 unsigned i, count = 0;
6087 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6089 if (relax_info == NULL)
6091 if (relax_info->fix_list == NULL)
6094 for (r = relax_info->fix_list; r != NULL; r = r->next)
6097 relax_info->fix_array =
6098 (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix) * count);
6099 relax_info->fix_array_count = count;
6101 r = relax_info->fix_list;
6102 for (i = 0; i < count; i++, r = r->next)
6104 relax_info->fix_array[count - 1 - i] = *r;
6105 relax_info->fix_array[count - 1 - i].next = NULL;
6108 qsort (relax_info->fix_array, relax_info->fix_array_count,
6109 sizeof (reloc_bfd_fix), fix_compare);
6113 static reloc_bfd_fix *
6114 get_bfd_fix (asection *sec, bfd_vma offset, unsigned type)
6116 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6120 if (relax_info == NULL)
6122 if (relax_info->fix_list == NULL)
6125 if (relax_info->fix_array == NULL)
6126 cache_fix_array (sec);
6128 key.src_offset = offset;
6129 key.src_type = type;
6130 rv = bsearch (&key, relax_info->fix_array, relax_info->fix_array_count,
6131 sizeof (reloc_bfd_fix), fix_compare);
6136 /* Section caching. */
6138 typedef struct section_cache_struct section_cache_t;
6140 struct section_cache_struct
6144 bfd_byte *contents; /* Cache of the section contents. */
6145 bfd_size_type content_length;
6147 property_table_entry *ptbl; /* Cache of the section property table. */
6150 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
6151 unsigned reloc_count;
6156 init_section_cache (section_cache_t *sec_cache)
6158 memset (sec_cache, 0, sizeof (*sec_cache));
6163 free_section_cache (section_cache_t *sec_cache)
6167 release_contents (sec_cache->sec, sec_cache->contents);
6168 release_internal_relocs (sec_cache->sec, sec_cache->relocs);
6169 if (sec_cache->ptbl)
6170 free (sec_cache->ptbl);
6176 section_cache_section (section_cache_t *sec_cache,
6178 struct bfd_link_info *link_info)
6181 property_table_entry *prop_table = NULL;
6183 bfd_byte *contents = NULL;
6184 Elf_Internal_Rela *internal_relocs = NULL;
6185 bfd_size_type sec_size;
6189 if (sec == sec_cache->sec)
6193 sec_size = bfd_get_section_limit (abfd, sec);
6195 /* Get the contents. */
6196 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6197 if (contents == NULL && sec_size != 0)
6200 /* Get the relocations. */
6201 internal_relocs = retrieve_internal_relocs (abfd, sec,
6202 link_info->keep_memory);
6204 /* Get the entry table. */
6205 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
6206 XTENSA_PROP_SEC_NAME, FALSE);
6210 /* Fill in the new section cache. */
6211 free_section_cache (sec_cache);
6212 init_section_cache (sec_cache);
6214 sec_cache->sec = sec;
6215 sec_cache->contents = contents;
6216 sec_cache->content_length = sec_size;
6217 sec_cache->relocs = internal_relocs;
6218 sec_cache->reloc_count = sec->reloc_count;
6219 sec_cache->pte_count = ptblsize;
6220 sec_cache->ptbl = prop_table;
6225 release_contents (sec, contents);
6226 release_internal_relocs (sec, internal_relocs);
6233 /* Extended basic blocks. */
6235 /* An ebb_struct represents an Extended Basic Block. Within this
6236 range, we guarantee that all instructions are decodable, the
6237 property table entries are contiguous, and no property table
6238 specifies a segment that cannot have instructions moved. This
6239 structure contains caches of the contents, property table and
6240 relocations for the specified section for easy use. The range is
6241 specified by ranges of indices for the byte offset, property table
6242 offsets and relocation offsets. These must be consistent. */
6244 typedef struct ebb_struct ebb_t;
6250 bfd_byte *contents; /* Cache of the section contents. */
6251 bfd_size_type content_length;
6253 property_table_entry *ptbl; /* Cache of the section property table. */
6256 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
6257 unsigned reloc_count;
6259 bfd_vma start_offset; /* Offset in section. */
6260 unsigned start_ptbl_idx; /* Offset in the property table. */
6261 unsigned start_reloc_idx; /* Offset in the relocations. */
6264 unsigned end_ptbl_idx;
6265 unsigned end_reloc_idx;
6267 bfd_boolean ends_section; /* Is this the last ebb in a section? */
6269 /* The unreachable property table at the end of this set of blocks;
6270 NULL if the end is not an unreachable block. */
6271 property_table_entry *ends_unreachable;
6275 enum ebb_target_enum
6278 EBB_DESIRE_TGT_ALIGN,
6279 EBB_REQUIRE_TGT_ALIGN,
6280 EBB_REQUIRE_LOOP_ALIGN,
6285 /* proposed_action_struct is similar to the text_action_struct except
6286 that is represents a potential transformation, not one that will
6287 occur. We build a list of these for an extended basic block
6288 and use them to compute the actual actions desired. We must be
6289 careful that the entire set of actual actions we perform do not
6290 break any relocations that would fit if the actions were not
6293 typedef struct proposed_action_struct proposed_action;
6295 struct proposed_action_struct
6297 enum ebb_target_enum align_type; /* for the target alignment */
6298 bfd_vma alignment_pow;
6299 text_action_t action;
6302 bfd_boolean do_action; /* If false, then we will not perform the action. */
6306 /* The ebb_constraint_struct keeps a set of proposed actions for an
6307 extended basic block. */
6309 typedef struct ebb_constraint_struct ebb_constraint;
6311 struct ebb_constraint_struct
6314 bfd_boolean start_movable;
6316 /* Bytes of extra space at the beginning if movable. */
6317 int start_extra_space;
6319 enum ebb_target_enum start_align;
6321 bfd_boolean end_movable;
6323 /* Bytes of extra space at the end if movable. */
6324 int end_extra_space;
6326 unsigned action_count;
6327 unsigned action_allocated;
6329 /* Array of proposed actions. */
6330 proposed_action *actions;
6332 /* Action alignments -- one for each proposed action. */
6333 enum ebb_target_enum *action_aligns;
6338 init_ebb_constraint (ebb_constraint *c)
6340 memset (c, 0, sizeof (ebb_constraint));
6345 free_ebb_constraint (ebb_constraint *c)
6353 init_ebb (ebb_t *ebb,
6356 bfd_size_type content_length,
6357 property_table_entry *prop_table,
6359 Elf_Internal_Rela *internal_relocs,
6360 unsigned reloc_count)
6362 memset (ebb, 0, sizeof (ebb_t));
6364 ebb->contents = contents;
6365 ebb->content_length = content_length;
6366 ebb->ptbl = prop_table;
6367 ebb->pte_count = ptblsize;
6368 ebb->relocs = internal_relocs;
6369 ebb->reloc_count = reloc_count;
6370 ebb->start_offset = 0;
6371 ebb->end_offset = ebb->content_length - 1;
6372 ebb->start_ptbl_idx = 0;
6373 ebb->end_ptbl_idx = ptblsize;
6374 ebb->start_reloc_idx = 0;
6375 ebb->end_reloc_idx = reloc_count;
6379 /* Extend the ebb to all decodable contiguous sections. The algorithm
6380 for building a basic block around an instruction is to push it
6381 forward until we hit the end of a section, an unreachable block or
6382 a block that cannot be transformed. Then we push it backwards
6383 searching for similar conditions. */
6385 static bfd_boolean extend_ebb_bounds_forward (ebb_t *);
6386 static bfd_boolean extend_ebb_bounds_backward (ebb_t *);
6387 static bfd_size_type insn_block_decodable_len
6388 (bfd_byte *, bfd_size_type, bfd_vma, bfd_size_type);
6391 extend_ebb_bounds (ebb_t *ebb)
6393 if (!extend_ebb_bounds_forward (ebb))
6395 if (!extend_ebb_bounds_backward (ebb))
6402 extend_ebb_bounds_forward (ebb_t *ebb)
6404 property_table_entry *the_entry, *new_entry;
6406 the_entry = &ebb->ptbl[ebb->end_ptbl_idx];
6408 /* Stop when (1) we cannot decode an instruction, (2) we are at
6409 the end of the property tables, (3) we hit a non-contiguous property
6410 table entry, (4) we hit a NO_TRANSFORM region. */
6415 bfd_size_type insn_block_len;
6417 entry_end = the_entry->address - ebb->sec->vma + the_entry->size;
6419 insn_block_decodable_len (ebb->contents, ebb->content_length,
6421 entry_end - ebb->end_offset);
6422 if (insn_block_len != (entry_end - ebb->end_offset))
6425 /* xgettext:c-format */
6426 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
6427 "possible configuration mismatch"),
6428 ebb->sec->owner, ebb->sec,
6429 (uint64_t) (ebb->end_offset + insn_block_len));
6432 ebb->end_offset += insn_block_len;
6434 if (ebb->end_offset == ebb->sec->size)
6435 ebb->ends_section = TRUE;
6437 /* Update the reloc counter. */
6438 while (ebb->end_reloc_idx + 1 < ebb->reloc_count
6439 && (ebb->relocs[ebb->end_reloc_idx + 1].r_offset
6442 ebb->end_reloc_idx++;
6445 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6448 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6449 if (((new_entry->flags & XTENSA_PROP_INSN) == 0)
6450 || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6451 || ((the_entry->flags & XTENSA_PROP_ALIGN) != 0))
6454 if (the_entry->address + the_entry->size != new_entry->address)
6457 the_entry = new_entry;
6458 ebb->end_ptbl_idx++;
6461 /* Quick check for an unreachable or end of file just at the end. */
6462 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6464 if (ebb->end_offset == ebb->content_length)
6465 ebb->ends_section = TRUE;
6469 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6470 if ((new_entry->flags & XTENSA_PROP_UNREACHABLE) != 0
6471 && the_entry->address + the_entry->size == new_entry->address)
6472 ebb->ends_unreachable = new_entry;
6475 /* Any other ending requires exact alignment. */
6481 extend_ebb_bounds_backward (ebb_t *ebb)
6483 property_table_entry *the_entry, *new_entry;
6485 the_entry = &ebb->ptbl[ebb->start_ptbl_idx];
6487 /* Stop when (1) we cannot decode the instructions in the current entry.
6488 (2) we are at the beginning of the property tables, (3) we hit a
6489 non-contiguous property table entry, (4) we hit a NO_TRANSFORM region. */
6493 bfd_vma block_begin;
6494 bfd_size_type insn_block_len;
6496 block_begin = the_entry->address - ebb->sec->vma;
6498 insn_block_decodable_len (ebb->contents, ebb->content_length,
6500 ebb->start_offset - block_begin);
6501 if (insn_block_len != ebb->start_offset - block_begin)
6504 /* xgettext:c-format */
6505 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
6506 "possible configuration mismatch"),
6507 ebb->sec->owner, ebb->sec,
6508 (uint64_t) (ebb->end_offset + insn_block_len));
6511 ebb->start_offset -= insn_block_len;
6513 /* Update the reloc counter. */
6514 while (ebb->start_reloc_idx > 0
6515 && (ebb->relocs[ebb->start_reloc_idx - 1].r_offset
6516 >= ebb->start_offset))
6518 ebb->start_reloc_idx--;
6521 if (ebb->start_ptbl_idx == 0)
6524 new_entry = &ebb->ptbl[ebb->start_ptbl_idx - 1];
6525 if ((new_entry->flags & XTENSA_PROP_INSN) == 0
6526 || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6527 || ((new_entry->flags & XTENSA_PROP_ALIGN) != 0))
6529 if (new_entry->address + new_entry->size != the_entry->address)
6532 the_entry = new_entry;
6533 ebb->start_ptbl_idx--;
6539 static bfd_size_type
6540 insn_block_decodable_len (bfd_byte *contents,
6541 bfd_size_type content_len,
6542 bfd_vma block_offset,
6543 bfd_size_type block_len)
6545 bfd_vma offset = block_offset;
6547 while (offset < block_offset + block_len)
6549 bfd_size_type insn_len = 0;
6551 insn_len = insn_decode_len (contents, content_len, offset);
6553 return (offset - block_offset);
6556 return (offset - block_offset);
6561 ebb_propose_action (ebb_constraint *c,
6562 enum ebb_target_enum align_type,
6563 bfd_vma alignment_pow,
6564 text_action_t action,
6567 bfd_boolean do_action)
6569 proposed_action *act;
6571 if (c->action_allocated <= c->action_count)
6573 unsigned new_allocated, i;
6574 proposed_action *new_actions;
6576 new_allocated = (c->action_count + 2) * 2;
6577 new_actions = (proposed_action *)
6578 bfd_zmalloc (sizeof (proposed_action) * new_allocated);
6580 for (i = 0; i < c->action_count; i++)
6581 new_actions[i] = c->actions[i];
6584 c->actions = new_actions;
6585 c->action_allocated = new_allocated;
6588 act = &c->actions[c->action_count];
6589 act->align_type = align_type;
6590 act->alignment_pow = alignment_pow;
6591 act->action = action;
6592 act->offset = offset;
6593 act->removed_bytes = removed_bytes;
6594 act->do_action = do_action;
6600 /* Access to internal relocations, section contents and symbols. */
6602 /* During relaxation, we need to modify relocations, section contents,
6603 and symbol definitions, and we need to keep the original values from
6604 being reloaded from the input files, i.e., we need to "pin" the
6605 modified values in memory. We also want to continue to observe the
6606 setting of the "keep-memory" flag. The following functions wrap the
6607 standard BFD functions to take care of this for us. */
6609 static Elf_Internal_Rela *
6610 retrieve_internal_relocs (bfd *abfd, asection *sec, bfd_boolean keep_memory)
6612 Elf_Internal_Rela *internal_relocs;
6614 if ((sec->flags & SEC_LINKER_CREATED) != 0)
6617 internal_relocs = elf_section_data (sec)->relocs;
6618 if (internal_relocs == NULL)
6619 internal_relocs = (_bfd_elf_link_read_relocs
6620 (abfd, sec, NULL, NULL, keep_memory));
6621 return internal_relocs;
6626 pin_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6628 elf_section_data (sec)->relocs = internal_relocs;
6633 release_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6636 && elf_section_data (sec)->relocs != internal_relocs)
6637 free (internal_relocs);
6642 retrieve_contents (bfd *abfd, asection *sec, bfd_boolean keep_memory)
6645 bfd_size_type sec_size;
6647 sec_size = bfd_get_section_limit (abfd, sec);
6648 contents = elf_section_data (sec)->this_hdr.contents;
6650 if (contents == NULL && sec_size != 0)
6652 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
6659 elf_section_data (sec)->this_hdr.contents = contents;
6666 pin_contents (asection *sec, bfd_byte *contents)
6668 elf_section_data (sec)->this_hdr.contents = contents;
6673 release_contents (asection *sec, bfd_byte *contents)
6675 if (contents && elf_section_data (sec)->this_hdr.contents != contents)
6680 static Elf_Internal_Sym *
6681 retrieve_local_syms (bfd *input_bfd)
6683 Elf_Internal_Shdr *symtab_hdr;
6684 Elf_Internal_Sym *isymbuf;
6687 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
6688 locsymcount = symtab_hdr->sh_info;
6690 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
6691 if (isymbuf == NULL && locsymcount != 0)
6692 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
6695 /* Save the symbols for this input file so they won't be read again. */
6696 if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
6697 symtab_hdr->contents = (unsigned char *) isymbuf;
6703 /* Code for link-time relaxation. */
6705 /* Initialization for relaxation: */
6706 static bfd_boolean analyze_relocations (struct bfd_link_info *);
6707 static bfd_boolean find_relaxable_sections
6708 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
6709 static bfd_boolean collect_source_relocs
6710 (bfd *, asection *, struct bfd_link_info *);
6711 static bfd_boolean is_resolvable_asm_expansion
6712 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, struct bfd_link_info *,
6714 static Elf_Internal_Rela *find_associated_l32r_irel
6715 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Rela *);
6716 static bfd_boolean compute_text_actions
6717 (bfd *, asection *, struct bfd_link_info *);
6718 static bfd_boolean compute_ebb_proposed_actions (ebb_constraint *);
6719 static bfd_boolean compute_ebb_actions (ebb_constraint *);
6720 typedef struct reloc_range_list_struct reloc_range_list;
6721 static bfd_boolean check_section_ebb_pcrels_fit
6722 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *,
6723 reloc_range_list *, const ebb_constraint *,
6724 const xtensa_opcode *);
6725 static bfd_boolean check_section_ebb_reduces (const ebb_constraint *);
6726 static void text_action_add_proposed
6727 (text_action_list *, const ebb_constraint *, asection *);
6728 static int compute_fill_extra_space (property_table_entry *);
6731 static bfd_boolean compute_removed_literals
6732 (bfd *, asection *, struct bfd_link_info *, value_map_hash_table *);
6733 static Elf_Internal_Rela *get_irel_at_offset
6734 (asection *, Elf_Internal_Rela *, bfd_vma);
6735 static bfd_boolean is_removable_literal
6736 (const source_reloc *, int, const source_reloc *, int, asection *,
6737 property_table_entry *, int);
6738 static bfd_boolean remove_dead_literal
6739 (bfd *, asection *, struct bfd_link_info *, Elf_Internal_Rela *,
6740 Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
6741 static bfd_boolean identify_literal_placement
6742 (bfd *, asection *, bfd_byte *, struct bfd_link_info *,
6743 value_map_hash_table *, bfd_boolean *, Elf_Internal_Rela *, int,
6744 source_reloc *, property_table_entry *, int, section_cache_t *,
6746 static bfd_boolean relocations_reach (source_reloc *, int, const r_reloc *);
6747 static bfd_boolean coalesce_shared_literal
6748 (asection *, source_reloc *, property_table_entry *, int, value_map *);
6749 static bfd_boolean move_shared_literal
6750 (asection *, struct bfd_link_info *, source_reloc *, property_table_entry *,
6751 int, const r_reloc *, const literal_value *, section_cache_t *);
6754 static bfd_boolean relax_section (bfd *, asection *, struct bfd_link_info *);
6755 static bfd_boolean translate_section_fixes (asection *);
6756 static bfd_boolean translate_reloc_bfd_fix (reloc_bfd_fix *);
6757 static asection *translate_reloc (const r_reloc *, r_reloc *, asection *);
6758 static void shrink_dynamic_reloc_sections
6759 (struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *);
6760 static bfd_boolean move_literal
6761 (bfd *, struct bfd_link_info *, asection *, bfd_vma, bfd_byte *,
6762 xtensa_relax_info *, Elf_Internal_Rela **, const literal_value *);
6763 static bfd_boolean relax_property_section
6764 (bfd *, asection *, struct bfd_link_info *);
6767 static bfd_boolean relax_section_symbols (bfd *, asection *);
6771 elf_xtensa_relax_section (bfd *abfd,
6773 struct bfd_link_info *link_info,
6776 static value_map_hash_table *values = NULL;
6777 static bfd_boolean relocations_analyzed = FALSE;
6778 xtensa_relax_info *relax_info;
6780 if (!relocations_analyzed)
6782 /* Do some overall initialization for relaxation. */
6783 values = value_map_hash_table_init ();
6786 relaxing_section = TRUE;
6787 if (!analyze_relocations (link_info))
6789 relocations_analyzed = TRUE;
6793 /* Don't mess with linker-created sections. */
6794 if ((sec->flags & SEC_LINKER_CREATED) != 0)
6797 relax_info = get_xtensa_relax_info (sec);
6798 BFD_ASSERT (relax_info != NULL);
6800 switch (relax_info->visited)
6803 /* Note: It would be nice to fold this pass into
6804 analyze_relocations, but it is important for this step that the
6805 sections be examined in link order. */
6806 if (!compute_removed_literals (abfd, sec, link_info, values))
6813 value_map_hash_table_delete (values);
6815 if (!relax_section (abfd, sec, link_info))
6821 if (!relax_section_symbols (abfd, sec))
6826 relax_info->visited++;
6831 /* Initialization for relaxation. */
6833 /* This function is called once at the start of relaxation. It scans
6834 all the input sections and marks the ones that are relaxable (i.e.,
6835 literal sections with L32R relocations against them), and then
6836 collects source_reloc information for all the relocations against
6837 those relaxable sections. During this process, it also detects
6838 longcalls, i.e., calls relaxed by the assembler into indirect
6839 calls, that can be optimized back into direct calls. Within each
6840 extended basic block (ebb) containing an optimized longcall, it
6841 computes a set of "text actions" that can be performed to remove
6842 the L32R associated with the longcall while optionally preserving
6843 branch target alignments. */
6846 analyze_relocations (struct bfd_link_info *link_info)
6850 bfd_boolean is_relaxable = FALSE;
6852 /* Initialize the per-section relaxation info. */
6853 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6854 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6856 init_xtensa_relax_info (sec);
6859 /* Mark relaxable sections (and count relocations against each one). */
6860 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6861 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6863 if (!find_relaxable_sections (abfd, sec, link_info, &is_relaxable))
6867 /* Bail out if there are no relaxable sections. */
6871 /* Allocate space for source_relocs. */
6872 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6873 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6875 xtensa_relax_info *relax_info;
6877 relax_info = get_xtensa_relax_info (sec);
6878 if (relax_info->is_relaxable_literal_section
6879 || relax_info->is_relaxable_asm_section)
6881 relax_info->src_relocs = (source_reloc *)
6882 bfd_malloc (relax_info->src_count * sizeof (source_reloc));
6885 relax_info->src_count = 0;
6888 /* Collect info on relocations against each relaxable section. */
6889 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6890 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6892 if (!collect_source_relocs (abfd, sec, link_info))
6896 /* Compute the text actions. */
6897 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6898 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6900 if (!compute_text_actions (abfd, sec, link_info))
6908 /* Find all the sections that might be relaxed. The motivation for
6909 this pass is that collect_source_relocs() needs to record _all_ the
6910 relocations that target each relaxable section. That is expensive
6911 and unnecessary unless the target section is actually going to be
6912 relaxed. This pass identifies all such sections by checking if
6913 they have L32Rs pointing to them. In the process, the total number
6914 of relocations targeting each section is also counted so that we
6915 know how much space to allocate for source_relocs against each
6916 relaxable literal section. */
6919 find_relaxable_sections (bfd *abfd,
6921 struct bfd_link_info *link_info,
6922 bfd_boolean *is_relaxable_p)
6924 Elf_Internal_Rela *internal_relocs;
6926 bfd_boolean ok = TRUE;
6928 xtensa_relax_info *source_relax_info;
6929 bfd_boolean is_l32r_reloc;
6931 internal_relocs = retrieve_internal_relocs (abfd, sec,
6932 link_info->keep_memory);
6933 if (internal_relocs == NULL)
6936 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6937 if (contents == NULL && sec->size != 0)
6943 source_relax_info = get_xtensa_relax_info (sec);
6944 for (i = 0; i < sec->reloc_count; i++)
6946 Elf_Internal_Rela *irel = &internal_relocs[i];
6948 asection *target_sec;
6949 xtensa_relax_info *target_relax_info;
6951 /* If this section has not already been marked as "relaxable", and
6952 if it contains any ASM_EXPAND relocations (marking expanded
6953 longcalls) that can be optimized into direct calls, then mark
6954 the section as "relaxable". */
6955 if (source_relax_info
6956 && !source_relax_info->is_relaxable_asm_section
6957 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_EXPAND)
6959 bfd_boolean is_reachable = FALSE;
6960 if (is_resolvable_asm_expansion (abfd, sec, contents, irel,
6961 link_info, &is_reachable)
6964 source_relax_info->is_relaxable_asm_section = TRUE;
6965 *is_relaxable_p = TRUE;
6969 r_reloc_init (&r_rel, abfd, irel, contents,
6970 bfd_get_section_limit (abfd, sec));
6972 target_sec = r_reloc_get_section (&r_rel);
6973 target_relax_info = get_xtensa_relax_info (target_sec);
6974 if (!target_relax_info)
6977 /* Count PC-relative operand relocations against the target section.
6978 Note: The conditions tested here must match the conditions under
6979 which init_source_reloc is called in collect_source_relocs(). */
6980 is_l32r_reloc = FALSE;
6981 if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
6983 xtensa_opcode opcode =
6984 get_relocation_opcode (abfd, sec, contents, irel);
6985 if (opcode != XTENSA_UNDEFINED)
6987 is_l32r_reloc = (opcode == get_l32r_opcode ());
6988 if (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
6990 target_relax_info->src_count++;
6994 if (is_l32r_reloc && r_reloc_is_defined (&r_rel))
6996 /* Mark the target section as relaxable. */
6997 target_relax_info->is_relaxable_literal_section = TRUE;
6998 *is_relaxable_p = TRUE;
7003 release_contents (sec, contents);
7004 release_internal_relocs (sec, internal_relocs);
7009 /* Record _all_ the relocations that point to relaxable sections, and
7010 get rid of ASM_EXPAND relocs by either converting them to
7011 ASM_SIMPLIFY or by removing them. */
7014 collect_source_relocs (bfd *abfd,
7016 struct bfd_link_info *link_info)
7018 Elf_Internal_Rela *internal_relocs;
7020 bfd_boolean ok = TRUE;
7022 bfd_size_type sec_size;
7024 internal_relocs = retrieve_internal_relocs (abfd, sec,
7025 link_info->keep_memory);
7026 if (internal_relocs == NULL)
7029 sec_size = bfd_get_section_limit (abfd, sec);
7030 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7031 if (contents == NULL && sec_size != 0)
7037 /* Record relocations against relaxable literal sections. */
7038 for (i = 0; i < sec->reloc_count; i++)
7040 Elf_Internal_Rela *irel = &internal_relocs[i];
7042 asection *target_sec;
7043 xtensa_relax_info *target_relax_info;
7045 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7047 target_sec = r_reloc_get_section (&r_rel);
7048 target_relax_info = get_xtensa_relax_info (target_sec);
7050 if (target_relax_info
7051 && (target_relax_info->is_relaxable_literal_section
7052 || target_relax_info->is_relaxable_asm_section))
7054 xtensa_opcode opcode = XTENSA_UNDEFINED;
7056 bfd_boolean is_abs_literal = FALSE;
7058 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7060 /* None of the current alternate relocs are PC-relative,
7061 and only PC-relative relocs matter here. However, we
7062 still need to record the opcode for literal
7064 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7065 if (opcode == get_l32r_opcode ())
7067 is_abs_literal = TRUE;
7071 opcode = XTENSA_UNDEFINED;
7073 else if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
7075 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7076 opnd = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7079 if (opcode != XTENSA_UNDEFINED)
7081 int src_next = target_relax_info->src_next++;
7082 source_reloc *s_reloc = &target_relax_info->src_relocs[src_next];
7084 init_source_reloc (s_reloc, sec, &r_rel, opcode, opnd,
7090 /* Now get rid of ASM_EXPAND relocations. At this point, the
7091 src_relocs array for the target literal section may still be
7092 incomplete, but it must at least contain the entries for the L32R
7093 relocations associated with ASM_EXPANDs because they were just
7094 added in the preceding loop over the relocations. */
7096 for (i = 0; i < sec->reloc_count; i++)
7098 Elf_Internal_Rela *irel = &internal_relocs[i];
7099 bfd_boolean is_reachable;
7101 if (!is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
7107 Elf_Internal_Rela *l32r_irel;
7109 asection *target_sec;
7110 xtensa_relax_info *target_relax_info;
7112 /* Mark the source_reloc for the L32R so that it will be
7113 removed in compute_removed_literals(), along with the
7114 associated literal. */
7115 l32r_irel = find_associated_l32r_irel (abfd, sec, contents,
7116 irel, internal_relocs);
7117 if (l32r_irel == NULL)
7120 r_reloc_init (&r_rel, abfd, l32r_irel, contents, sec_size);
7122 target_sec = r_reloc_get_section (&r_rel);
7123 target_relax_info = get_xtensa_relax_info (target_sec);
7125 if (target_relax_info
7126 && (target_relax_info->is_relaxable_literal_section
7127 || target_relax_info->is_relaxable_asm_section))
7129 source_reloc *s_reloc;
7131 /* Search the source_relocs for the entry corresponding to
7132 the l32r_irel. Note: The src_relocs array is not yet
7133 sorted, but it wouldn't matter anyway because we're
7134 searching by source offset instead of target offset. */
7135 s_reloc = find_source_reloc (target_relax_info->src_relocs,
7136 target_relax_info->src_next,
7138 BFD_ASSERT (s_reloc);
7139 s_reloc->is_null = TRUE;
7142 /* Convert this reloc to ASM_SIMPLIFY. */
7143 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
7144 R_XTENSA_ASM_SIMPLIFY);
7145 l32r_irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7147 pin_internal_relocs (sec, internal_relocs);
7151 /* It is resolvable but doesn't reach. We resolve now
7152 by eliminating the relocation -- the call will remain
7153 expanded into L32R/CALLX. */
7154 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7155 pin_internal_relocs (sec, internal_relocs);
7160 release_contents (sec, contents);
7161 release_internal_relocs (sec, internal_relocs);
7166 /* Return TRUE if the asm expansion can be resolved. Generally it can
7167 be resolved on a final link or when a partial link locates it in the
7168 same section as the target. Set "is_reachable" flag if the target of
7169 the call is within the range of a direct call, given the current VMA
7170 for this section and the target section. */
7173 is_resolvable_asm_expansion (bfd *abfd,
7176 Elf_Internal_Rela *irel,
7177 struct bfd_link_info *link_info,
7178 bfd_boolean *is_reachable_p)
7180 asection *target_sec;
7181 bfd_vma target_offset;
7183 xtensa_opcode opcode, direct_call_opcode;
7184 bfd_vma self_address;
7185 bfd_vma dest_address;
7186 bfd_boolean uses_l32r;
7187 bfd_size_type sec_size;
7189 *is_reachable_p = FALSE;
7191 if (contents == NULL)
7194 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
7197 sec_size = bfd_get_section_limit (abfd, sec);
7198 opcode = get_expanded_call_opcode (contents + irel->r_offset,
7199 sec_size - irel->r_offset, &uses_l32r);
7200 /* Optimization of longcalls that use CONST16 is not yet implemented. */
7204 direct_call_opcode = swap_callx_for_call_opcode (opcode);
7205 if (direct_call_opcode == XTENSA_UNDEFINED)
7208 /* Check and see that the target resolves. */
7209 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7210 if (!r_reloc_is_defined (&r_rel))
7213 target_sec = r_reloc_get_section (&r_rel);
7214 target_offset = r_rel.target_offset;
7216 /* If the target is in a shared library, then it doesn't reach. This
7217 isn't supposed to come up because the compiler should never generate
7218 non-PIC calls on systems that use shared libraries, but the linker
7219 shouldn't crash regardless. */
7220 if (!target_sec->output_section)
7223 /* For relocatable sections, we can only simplify when the output
7224 section of the target is the same as the output section of the
7226 if (bfd_link_relocatable (link_info)
7227 && (target_sec->output_section != sec->output_section
7228 || is_reloc_sym_weak (abfd, irel)))
7231 if (target_sec->output_section != sec->output_section)
7233 /* If the two sections are sufficiently far away that relaxation
7234 might take the call out of range, we can't simplify. For
7235 example, a positive displacement call into another memory
7236 could get moved to a lower address due to literal removal,
7237 but the destination won't move, and so the displacment might
7240 If the displacement is negative, assume the destination could
7241 move as far back as the start of the output section. The
7242 self_address will be at least as far into the output section
7243 as it is prior to relaxation.
7245 If the displacement is postive, assume the destination will be in
7246 it's pre-relaxed location (because relaxation only makes sections
7247 smaller). The self_address could go all the way to the beginning
7248 of the output section. */
7250 dest_address = target_sec->output_section->vma;
7251 self_address = sec->output_section->vma;
7253 if (sec->output_section->vma > target_sec->output_section->vma)
7254 self_address += sec->output_offset + irel->r_offset + 3;
7256 dest_address += bfd_get_section_limit (abfd, target_sec->output_section);
7257 /* Call targets should be four-byte aligned. */
7258 dest_address = (dest_address + 3) & ~3;
7263 self_address = (sec->output_section->vma
7264 + sec->output_offset + irel->r_offset + 3);
7265 dest_address = (target_sec->output_section->vma
7266 + target_sec->output_offset + target_offset);
7269 *is_reachable_p = pcrel_reloc_fits (direct_call_opcode, 0,
7270 self_address, dest_address);
7272 if ((self_address >> CALL_SEGMENT_BITS) !=
7273 (dest_address >> CALL_SEGMENT_BITS))
7280 static Elf_Internal_Rela *
7281 find_associated_l32r_irel (bfd *abfd,
7284 Elf_Internal_Rela *other_irel,
7285 Elf_Internal_Rela *internal_relocs)
7289 for (i = 0; i < sec->reloc_count; i++)
7291 Elf_Internal_Rela *irel = &internal_relocs[i];
7293 if (irel == other_irel)
7295 if (irel->r_offset != other_irel->r_offset)
7297 if (is_l32r_relocation (abfd, sec, contents, irel))
7305 static xtensa_opcode *
7306 build_reloc_opcodes (bfd *abfd,
7309 Elf_Internal_Rela *internal_relocs)
7312 xtensa_opcode *reloc_opcodes =
7313 (xtensa_opcode *) bfd_malloc (sizeof (xtensa_opcode) * sec->reloc_count);
7314 for (i = 0; i < sec->reloc_count; i++)
7316 Elf_Internal_Rela *irel = &internal_relocs[i];
7317 reloc_opcodes[i] = get_relocation_opcode (abfd, sec, contents, irel);
7319 return reloc_opcodes;
7322 struct reloc_range_struct
7325 bfd_boolean add; /* TRUE if start of a range, FALSE otherwise. */
7326 /* Original irel index in the array of relocations for a section. */
7327 unsigned irel_index;
7329 typedef struct reloc_range_struct reloc_range;
7331 typedef struct reloc_range_list_entry_struct reloc_range_list_entry;
7332 struct reloc_range_list_entry_struct
7334 reloc_range_list_entry *next;
7335 reloc_range_list_entry *prev;
7336 Elf_Internal_Rela *irel;
7337 xtensa_opcode opcode;
7341 struct reloc_range_list_struct
7343 /* The rest of the structure is only meaningful when ok is TRUE. */
7346 unsigned n_range; /* Number of range markers. */
7347 reloc_range *range; /* Sorted range markers. */
7349 unsigned first; /* Index of a first range element in the list. */
7350 unsigned last; /* One past index of a last range element in the list. */
7352 unsigned n_list; /* Number of list elements. */
7353 reloc_range_list_entry *reloc; /* */
7354 reloc_range_list_entry list_root;
7358 reloc_range_compare (const void *a, const void *b)
7360 const reloc_range *ra = a;
7361 const reloc_range *rb = b;
7363 if (ra->addr != rb->addr)
7364 return ra->addr < rb->addr ? -1 : 1;
7365 if (ra->add != rb->add)
7366 return ra->add ? -1 : 1;
7371 build_reloc_ranges (bfd *abfd, asection *sec,
7373 Elf_Internal_Rela *internal_relocs,
7374 xtensa_opcode *reloc_opcodes,
7375 reloc_range_list *list)
7380 reloc_range *ranges = NULL;
7381 reloc_range_list_entry *reloc =
7382 bfd_malloc (sec->reloc_count * sizeof (*reloc));
7384 memset (list, 0, sizeof (*list));
7387 for (i = 0; i < sec->reloc_count; i++)
7389 Elf_Internal_Rela *irel = &internal_relocs[i];
7390 int r_type = ELF32_R_TYPE (irel->r_info);
7391 reloc_howto_type *howto = &elf_howto_table[r_type];
7394 if (r_type == R_XTENSA_ASM_SIMPLIFY
7395 || r_type == R_XTENSA_32_PCREL
7396 || !howto->pc_relative)
7399 r_reloc_init (&r_rel, abfd, irel, contents,
7400 bfd_get_section_limit (abfd, sec));
7402 if (r_reloc_get_section (&r_rel) != sec)
7407 max_n = (max_n + 2) * 2;
7408 ranges = bfd_realloc (ranges, max_n * sizeof (*ranges));
7411 ranges[n].addr = irel->r_offset;
7412 ranges[n + 1].addr = r_rel.target_offset;
7414 ranges[n].add = ranges[n].addr < ranges[n + 1].addr;
7415 ranges[n + 1].add = !ranges[n].add;
7417 ranges[n].irel_index = i;
7418 ranges[n + 1].irel_index = i;
7422 reloc[i].irel = irel;
7424 /* Every relocation won't possibly be checked in the optimized version of
7425 check_section_ebb_pcrels_fit, so this needs to be done here. */
7426 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7428 /* None of the current alternate relocs are PC-relative,
7429 and only PC-relative relocs matter here. */
7433 xtensa_opcode opcode;
7437 opcode = reloc_opcodes[i];
7439 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7441 if (opcode == XTENSA_UNDEFINED)
7447 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7448 if (opnum == XTENSA_UNDEFINED)
7454 /* Record relocation opcode and opnum as we've calculated them
7455 anyway and they won't change. */
7456 reloc[i].opcode = opcode;
7457 reloc[i].opnum = opnum;
7463 ranges = bfd_realloc (ranges, n * sizeof (*ranges));
7464 qsort (ranges, n, sizeof (*ranges), reloc_range_compare);
7467 list->range = ranges;
7468 list->reloc = reloc;
7469 list->list_root.prev = &list->list_root;
7470 list->list_root.next = &list->list_root;
7479 static void reloc_range_list_append (reloc_range_list *list,
7480 unsigned irel_index)
7482 reloc_range_list_entry *entry = list->reloc + irel_index;
7484 entry->prev = list->list_root.prev;
7485 entry->next = &list->list_root;
7486 entry->prev->next = entry;
7487 entry->next->prev = entry;
7491 static void reloc_range_list_remove (reloc_range_list *list,
7492 unsigned irel_index)
7494 reloc_range_list_entry *entry = list->reloc + irel_index;
7496 entry->next->prev = entry->prev;
7497 entry->prev->next = entry->next;
7501 /* Update relocation list object so that it lists all relocations that cross
7502 [first; last] range. Range bounds should not decrease with successive
7504 static void reloc_range_list_update_range (reloc_range_list *list,
7505 bfd_vma first, bfd_vma last)
7507 /* This should not happen: EBBs are iterated from lower addresses to higher.
7508 But even if that happens there's no need to break: just flush current list
7509 and start from scratch. */
7510 if ((list->last > 0 && list->range[list->last - 1].addr > last) ||
7511 (list->first > 0 && list->range[list->first - 1].addr >= first))
7516 list->list_root.next = &list->list_root;
7517 list->list_root.prev = &list->list_root;
7518 fprintf (stderr, "%s: move backwards requested\n", __func__);
7521 for (; list->last < list->n_range &&
7522 list->range[list->last].addr <= last; ++list->last)
7523 if (list->range[list->last].add)
7524 reloc_range_list_append (list, list->range[list->last].irel_index);
7526 for (; list->first < list->n_range &&
7527 list->range[list->first].addr < first; ++list->first)
7528 if (!list->range[list->first].add)
7529 reloc_range_list_remove (list, list->range[list->first].irel_index);
7532 static void free_reloc_range_list (reloc_range_list *list)
7538 /* The compute_text_actions function will build a list of potential
7539 transformation actions for code in the extended basic block of each
7540 longcall that is optimized to a direct call. From this list we
7541 generate a set of actions to actually perform that optimizes for
7542 space and, if not using size_opt, maintains branch target
7545 These actions to be performed are placed on a per-section list.
7546 The actual changes are performed by relax_section() in the second
7550 compute_text_actions (bfd *abfd,
7552 struct bfd_link_info *link_info)
7554 xtensa_opcode *reloc_opcodes = NULL;
7555 xtensa_relax_info *relax_info;
7557 Elf_Internal_Rela *internal_relocs;
7558 bfd_boolean ok = TRUE;
7560 property_table_entry *prop_table = 0;
7562 bfd_size_type sec_size;
7563 reloc_range_list relevant_relocs;
7565 relax_info = get_xtensa_relax_info (sec);
7566 BFD_ASSERT (relax_info);
7567 BFD_ASSERT (relax_info->src_next == relax_info->src_count);
7569 /* Do nothing if the section contains no optimized longcalls. */
7570 if (!relax_info->is_relaxable_asm_section)
7573 internal_relocs = retrieve_internal_relocs (abfd, sec,
7574 link_info->keep_memory);
7576 if (internal_relocs)
7577 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
7578 internal_reloc_compare);
7580 sec_size = bfd_get_section_limit (abfd, sec);
7581 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7582 if (contents == NULL && sec_size != 0)
7588 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
7589 XTENSA_PROP_SEC_NAME, FALSE);
7596 /* Precompute the opcode for each relocation. */
7597 reloc_opcodes = build_reloc_opcodes (abfd, sec, contents, internal_relocs);
7599 build_reloc_ranges (abfd, sec, contents, internal_relocs, reloc_opcodes,
7602 for (i = 0; i < sec->reloc_count; i++)
7604 Elf_Internal_Rela *irel = &internal_relocs[i];
7606 property_table_entry *the_entry;
7609 ebb_constraint ebb_table;
7610 bfd_size_type simplify_size;
7612 if (irel && ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_SIMPLIFY)
7614 r_offset = irel->r_offset;
7616 simplify_size = get_asm_simplify_size (contents, sec_size, r_offset);
7617 if (simplify_size == 0)
7620 /* xgettext:c-format */
7621 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction for "
7622 "XTENSA_ASM_SIMPLIFY relocation; "
7623 "possible configuration mismatch"),
7624 sec->owner, sec, (uint64_t) r_offset);
7628 /* If the instruction table is not around, then don't do this
7630 the_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7631 sec->vma + irel->r_offset);
7632 if (the_entry == NULL || XTENSA_NO_NOP_REMOVAL)
7634 text_action_add (&relax_info->action_list,
7635 ta_convert_longcall, sec, r_offset,
7640 /* If the next longcall happens to be at the same address as an
7641 unreachable section of size 0, then skip forward. */
7642 ptbl_idx = the_entry - prop_table;
7643 while ((the_entry->flags & XTENSA_PROP_UNREACHABLE)
7644 && the_entry->size == 0
7645 && ptbl_idx + 1 < ptblsize
7646 && (prop_table[ptbl_idx + 1].address
7647 == prop_table[ptbl_idx].address))
7653 if (the_entry->flags & XTENSA_PROP_NO_TRANSFORM)
7654 /* NO_REORDER is OK */
7657 init_ebb_constraint (&ebb_table);
7658 ebb = &ebb_table.ebb;
7659 init_ebb (ebb, sec, contents, sec_size, prop_table, ptblsize,
7660 internal_relocs, sec->reloc_count);
7661 ebb->start_offset = r_offset + simplify_size;
7662 ebb->end_offset = r_offset + simplify_size;
7663 ebb->start_ptbl_idx = ptbl_idx;
7664 ebb->end_ptbl_idx = ptbl_idx;
7665 ebb->start_reloc_idx = i;
7666 ebb->end_reloc_idx = i;
7668 if (!extend_ebb_bounds (ebb)
7669 || !compute_ebb_proposed_actions (&ebb_table)
7670 || !compute_ebb_actions (&ebb_table)
7671 || !check_section_ebb_pcrels_fit (abfd, sec, contents,
7674 &ebb_table, reloc_opcodes)
7675 || !check_section_ebb_reduces (&ebb_table))
7677 /* If anything goes wrong or we get unlucky and something does
7678 not fit, with our plan because of expansion between
7679 critical branches, just convert to a NOP. */
7681 text_action_add (&relax_info->action_list,
7682 ta_convert_longcall, sec, r_offset, 0);
7683 i = ebb_table.ebb.end_reloc_idx;
7684 free_ebb_constraint (&ebb_table);
7688 text_action_add_proposed (&relax_info->action_list, &ebb_table, sec);
7690 /* Update the index so we do not go looking at the relocations
7691 we have already processed. */
7692 i = ebb_table.ebb.end_reloc_idx;
7693 free_ebb_constraint (&ebb_table);
7696 free_reloc_range_list (&relevant_relocs);
7699 if (action_list_count (&relax_info->action_list))
7700 print_action_list (stderr, &relax_info->action_list);
7704 release_contents (sec, contents);
7705 release_internal_relocs (sec, internal_relocs);
7709 free (reloc_opcodes);
7715 /* Do not widen an instruction if it is preceeded by a
7716 loop opcode. It might cause misalignment. */
7719 prev_instr_is_a_loop (bfd_byte *contents,
7720 bfd_size_type content_length,
7721 bfd_size_type offset)
7723 xtensa_opcode prev_opcode;
7727 prev_opcode = insn_decode_opcode (contents, content_length, offset-3, 0);
7728 return (xtensa_opcode_is_loop (xtensa_default_isa, prev_opcode) == 1);
7732 /* Find all of the possible actions for an extended basic block. */
7735 compute_ebb_proposed_actions (ebb_constraint *ebb_table)
7737 const ebb_t *ebb = &ebb_table->ebb;
7738 unsigned rel_idx = ebb->start_reloc_idx;
7739 property_table_entry *entry, *start_entry, *end_entry;
7741 xtensa_isa isa = xtensa_default_isa;
7743 static xtensa_insnbuf insnbuf = NULL;
7744 static xtensa_insnbuf slotbuf = NULL;
7746 if (insnbuf == NULL)
7748 insnbuf = xtensa_insnbuf_alloc (isa);
7749 slotbuf = xtensa_insnbuf_alloc (isa);
7752 start_entry = &ebb->ptbl[ebb->start_ptbl_idx];
7753 end_entry = &ebb->ptbl[ebb->end_ptbl_idx];
7755 for (entry = start_entry; entry <= end_entry; entry++)
7757 bfd_vma start_offset, end_offset;
7758 bfd_size_type insn_len;
7760 start_offset = entry->address - ebb->sec->vma;
7761 end_offset = entry->address + entry->size - ebb->sec->vma;
7763 if (entry == start_entry)
7764 start_offset = ebb->start_offset;
7765 if (entry == end_entry)
7766 end_offset = ebb->end_offset;
7767 offset = start_offset;
7769 if (offset == entry->address - ebb->sec->vma
7770 && (entry->flags & XTENSA_PROP_INSN_BRANCH_TARGET) != 0)
7772 enum ebb_target_enum align_type = EBB_DESIRE_TGT_ALIGN;
7773 BFD_ASSERT (offset != end_offset);
7774 if (offset == end_offset)
7777 insn_len = insn_decode_len (ebb->contents, ebb->content_length,
7782 if (check_branch_target_aligned_address (offset, insn_len))
7783 align_type = EBB_REQUIRE_TGT_ALIGN;
7785 ebb_propose_action (ebb_table, align_type, 0,
7786 ta_none, offset, 0, TRUE);
7789 while (offset != end_offset)
7791 Elf_Internal_Rela *irel;
7792 xtensa_opcode opcode;
7794 while (rel_idx < ebb->end_reloc_idx
7795 && (ebb->relocs[rel_idx].r_offset < offset
7796 || (ebb->relocs[rel_idx].r_offset == offset
7797 && (ELF32_R_TYPE (ebb->relocs[rel_idx].r_info)
7798 != R_XTENSA_ASM_SIMPLIFY))))
7801 /* Check for longcall. */
7802 irel = &ebb->relocs[rel_idx];
7803 if (irel->r_offset == offset
7804 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY)
7806 bfd_size_type simplify_size;
7808 simplify_size = get_asm_simplify_size (ebb->contents,
7809 ebb->content_length,
7811 if (simplify_size == 0)
7814 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7815 ta_convert_longcall, offset, 0, TRUE);
7817 offset += simplify_size;
7821 if (offset + MIN_INSN_LENGTH > ebb->content_length)
7823 xtensa_insnbuf_from_chars (isa, insnbuf, &ebb->contents[offset],
7824 ebb->content_length - offset);
7825 fmt = xtensa_format_decode (isa, insnbuf);
7826 if (fmt == XTENSA_UNDEFINED)
7828 insn_len = xtensa_format_length (isa, fmt);
7829 if (insn_len == (bfd_size_type) XTENSA_UNDEFINED)
7832 if (xtensa_format_num_slots (isa, fmt) != 1)
7838 xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
7839 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
7840 if (opcode == XTENSA_UNDEFINED)
7843 if ((entry->flags & XTENSA_PROP_INSN_NO_DENSITY) == 0
7844 && (entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
7845 && can_narrow_instruction (slotbuf, fmt, opcode) != 0)
7847 /* Add an instruction narrow action. */
7848 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7849 ta_narrow_insn, offset, 0, FALSE);
7851 else if ((entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
7852 && can_widen_instruction (slotbuf, fmt, opcode) != 0
7853 && ! prev_instr_is_a_loop (ebb->contents,
7854 ebb->content_length, offset))
7856 /* Add an instruction widen action. */
7857 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7858 ta_widen_insn, offset, 0, FALSE);
7860 else if (xtensa_opcode_is_loop (xtensa_default_isa, opcode) == 1)
7862 /* Check for branch targets. */
7863 ebb_propose_action (ebb_table, EBB_REQUIRE_LOOP_ALIGN, 0,
7864 ta_none, offset, 0, TRUE);
7871 if (ebb->ends_unreachable)
7873 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7874 ta_fill, ebb->end_offset, 0, TRUE);
7881 /* xgettext:c-format */
7882 (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
7883 "possible configuration mismatch"),
7884 ebb->sec->owner, ebb->sec, (uint64_t) offset);
7889 /* After all of the information has collected about the
7890 transformations possible in an EBB, compute the appropriate actions
7891 here in compute_ebb_actions. We still must check later to make
7892 sure that the actions do not break any relocations. The algorithm
7893 used here is pretty greedy. Basically, it removes as many no-ops
7894 as possible so that the end of the EBB has the same alignment
7895 characteristics as the original. First, it uses narrowing, then
7896 fill space at the end of the EBB, and finally widenings. If that
7897 does not work, it tries again with one fewer no-op removed. The
7898 optimization will only be performed if all of the branch targets
7899 that were aligned before transformation are also aligned after the
7902 When the size_opt flag is set, ignore the branch target alignments,
7903 narrow all wide instructions, and remove all no-ops unless the end
7904 of the EBB prevents it. */
7907 compute_ebb_actions (ebb_constraint *ebb_table)
7911 int removed_bytes = 0;
7912 ebb_t *ebb = &ebb_table->ebb;
7913 unsigned seg_idx_start = 0;
7914 unsigned seg_idx_end = 0;
7916 /* We perform this like the assembler relaxation algorithm: Start by
7917 assuming all instructions are narrow and all no-ops removed; then
7920 /* For each segment of this that has a solid constraint, check to
7921 see if there are any combinations that will keep the constraint.
7923 for (seg_idx_end = 0; seg_idx_end < ebb_table->action_count; seg_idx_end++)
7925 bfd_boolean requires_text_end_align = FALSE;
7926 unsigned longcall_count = 0;
7927 unsigned longcall_convert_count = 0;
7928 unsigned narrowable_count = 0;
7929 unsigned narrowable_convert_count = 0;
7930 unsigned widenable_count = 0;
7931 unsigned widenable_convert_count = 0;
7933 proposed_action *action = NULL;
7934 int align = (1 << ebb_table->ebb.sec->alignment_power);
7936 seg_idx_start = seg_idx_end;
7938 for (i = seg_idx_start; i < ebb_table->action_count; i++)
7940 action = &ebb_table->actions[i];
7941 if (action->action == ta_convert_longcall)
7943 if (action->action == ta_narrow_insn)
7945 if (action->action == ta_widen_insn)
7947 if (action->action == ta_fill)
7949 if (action->align_type == EBB_REQUIRE_LOOP_ALIGN)
7951 if (action->align_type == EBB_REQUIRE_TGT_ALIGN
7952 && !elf32xtensa_size_opt)
7957 if (seg_idx_end == ebb_table->action_count && !ebb->ends_unreachable)
7958 requires_text_end_align = TRUE;
7960 if (elf32xtensa_size_opt && !requires_text_end_align
7961 && action->align_type != EBB_REQUIRE_LOOP_ALIGN
7962 && action->align_type != EBB_REQUIRE_TGT_ALIGN)
7964 longcall_convert_count = longcall_count;
7965 narrowable_convert_count = narrowable_count;
7966 widenable_convert_count = 0;
7970 /* There is a constraint. Convert the max number of longcalls. */
7971 narrowable_convert_count = 0;
7972 longcall_convert_count = 0;
7973 widenable_convert_count = 0;
7975 for (j = 0; j < longcall_count; j++)
7977 int removed = (longcall_count - j) * 3 & (align - 1);
7978 unsigned desire_narrow = (align - removed) & (align - 1);
7979 unsigned desire_widen = removed;
7980 if (desire_narrow <= narrowable_count)
7982 narrowable_convert_count = desire_narrow;
7983 narrowable_convert_count +=
7984 (align * ((narrowable_count - narrowable_convert_count)
7986 longcall_convert_count = (longcall_count - j);
7987 widenable_convert_count = 0;
7990 if (desire_widen <= widenable_count && !elf32xtensa_size_opt)
7992 narrowable_convert_count = 0;
7993 longcall_convert_count = longcall_count - j;
7994 widenable_convert_count = desire_widen;
8000 /* Now the number of conversions are saved. Do them. */
8001 for (i = seg_idx_start; i < seg_idx_end; i++)
8003 action = &ebb_table->actions[i];
8004 switch (action->action)
8006 case ta_convert_longcall:
8007 if (longcall_convert_count != 0)
8009 action->action = ta_remove_longcall;
8010 action->do_action = TRUE;
8011 action->removed_bytes += 3;
8012 longcall_convert_count--;
8015 case ta_narrow_insn:
8016 if (narrowable_convert_count != 0)
8018 action->do_action = TRUE;
8019 action->removed_bytes += 1;
8020 narrowable_convert_count--;
8024 if (widenable_convert_count != 0)
8026 action->do_action = TRUE;
8027 action->removed_bytes -= 1;
8028 widenable_convert_count--;
8037 /* Now we move on to some local opts. Try to remove each of the
8038 remaining longcalls. */
8040 if (ebb_table->ebb.ends_section || ebb_table->ebb.ends_unreachable)
8043 for (i = 0; i < ebb_table->action_count; i++)
8045 int old_removed_bytes = removed_bytes;
8046 proposed_action *action = &ebb_table->actions[i];
8048 if (action->do_action && action->action == ta_convert_longcall)
8050 bfd_boolean bad_alignment = FALSE;
8052 for (j = i + 1; j < ebb_table->action_count; j++)
8054 proposed_action *new_action = &ebb_table->actions[j];
8055 bfd_vma offset = new_action->offset;
8056 if (new_action->align_type == EBB_REQUIRE_TGT_ALIGN)
8058 if (!check_branch_target_aligned
8059 (ebb_table->ebb.contents,
8060 ebb_table->ebb.content_length,
8061 offset, offset - removed_bytes))
8063 bad_alignment = TRUE;
8067 if (new_action->align_type == EBB_REQUIRE_LOOP_ALIGN)
8069 if (!check_loop_aligned (ebb_table->ebb.contents,
8070 ebb_table->ebb.content_length,
8072 offset - removed_bytes))
8074 bad_alignment = TRUE;
8078 if (new_action->action == ta_narrow_insn
8079 && !new_action->do_action
8080 && ebb_table->ebb.sec->alignment_power == 2)
8082 /* Narrow an instruction and we are done. */
8083 new_action->do_action = TRUE;
8084 new_action->removed_bytes += 1;
8085 bad_alignment = FALSE;
8088 if (new_action->action == ta_widen_insn
8089 && new_action->do_action
8090 && ebb_table->ebb.sec->alignment_power == 2)
8092 /* Narrow an instruction and we are done. */
8093 new_action->do_action = FALSE;
8094 new_action->removed_bytes += 1;
8095 bad_alignment = FALSE;
8098 if (new_action->do_action)
8099 removed_bytes += new_action->removed_bytes;
8103 action->removed_bytes += 3;
8104 action->action = ta_remove_longcall;
8105 action->do_action = TRUE;
8108 removed_bytes = old_removed_bytes;
8109 if (action->do_action)
8110 removed_bytes += action->removed_bytes;
8115 for (i = 0; i < ebb_table->action_count; ++i)
8117 proposed_action *action = &ebb_table->actions[i];
8118 if (action->do_action)
8119 removed_bytes += action->removed_bytes;
8122 if ((removed_bytes % (1 << ebb_table->ebb.sec->alignment_power)) != 0
8123 && ebb->ends_unreachable)
8125 proposed_action *action;
8129 BFD_ASSERT (ebb_table->action_count != 0);
8130 action = &ebb_table->actions[ebb_table->action_count - 1];
8131 BFD_ASSERT (action->action == ta_fill);
8132 BFD_ASSERT (ebb->ends_unreachable->flags & XTENSA_PROP_UNREACHABLE);
8134 extra_space = compute_fill_extra_space (ebb->ends_unreachable);
8135 br = action->removed_bytes + removed_bytes + extra_space;
8136 br = br & ((1 << ebb->sec->alignment_power ) - 1);
8138 action->removed_bytes = extra_space - br;
8144 /* The xlate_map is a sorted array of address mappings designed to
8145 answer the offset_with_removed_text() query with a binary search instead
8146 of a linear search through the section's action_list. */
8148 typedef struct xlate_map_entry xlate_map_entry_t;
8149 typedef struct xlate_map xlate_map_t;
8151 struct xlate_map_entry
8153 bfd_vma orig_address;
8154 bfd_vma new_address;
8160 unsigned entry_count;
8161 xlate_map_entry_t *entry;
8166 xlate_compare (const void *a_v, const void *b_v)
8168 const xlate_map_entry_t *a = (const xlate_map_entry_t *) a_v;
8169 const xlate_map_entry_t *b = (const xlate_map_entry_t *) b_v;
8170 if (a->orig_address < b->orig_address)
8172 if (a->orig_address > (b->orig_address + b->size - 1))
8179 xlate_offset_with_removed_text (const xlate_map_t *map,
8180 text_action_list *action_list,
8184 xlate_map_entry_t *e;
8185 struct xlate_map_entry se;
8188 return offset_with_removed_text (action_list, offset);
8190 if (map->entry_count == 0)
8193 se.orig_address = offset;
8194 r = bsearch (&se, map->entry, map->entry_count,
8195 sizeof (xlate_map_entry_t), &xlate_compare);
8196 e = (xlate_map_entry_t *) r;
8198 /* There could be a jump past the end of the section,
8199 allow it using the last xlate map entry to translate its address. */
8202 e = map->entry + map->entry_count - 1;
8203 if (xlate_compare (&se, e) <= 0)
8206 BFD_ASSERT (e != NULL);
8209 return e->new_address - e->orig_address + offset;
8212 typedef struct xlate_map_context_struct xlate_map_context;
8213 struct xlate_map_context_struct
8216 xlate_map_entry_t *current_entry;
8221 xlate_map_fn (splay_tree_node node, void *p)
8223 text_action *r = (text_action *)node->value;
8224 xlate_map_context *ctx = p;
8225 unsigned orig_size = 0;
8230 case ta_remove_insn:
8231 case ta_convert_longcall:
8232 case ta_remove_literal:
8233 case ta_add_literal:
8235 case ta_remove_longcall:
8238 case ta_narrow_insn:
8247 ctx->current_entry->size =
8248 r->offset + orig_size - ctx->current_entry->orig_address;
8249 if (ctx->current_entry->size != 0)
8251 ctx->current_entry++;
8252 ctx->map->entry_count++;
8254 ctx->current_entry->orig_address = r->offset + orig_size;
8255 ctx->removed += r->removed_bytes;
8256 ctx->current_entry->new_address = r->offset + orig_size - ctx->removed;
8257 ctx->current_entry->size = 0;
8261 /* Build a binary searchable offset translation map from a section's
8264 static xlate_map_t *
8265 build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
8267 text_action_list *action_list = &relax_info->action_list;
8268 unsigned num_actions = 0;
8269 xlate_map_context ctx;
8271 ctx.map = (xlate_map_t *) bfd_malloc (sizeof (xlate_map_t));
8273 if (ctx.map == NULL)
8276 num_actions = action_list_count (action_list);
8277 ctx.map->entry = (xlate_map_entry_t *)
8278 bfd_malloc (sizeof (xlate_map_entry_t) * (num_actions + 1));
8279 if (ctx.map->entry == NULL)
8284 ctx.map->entry_count = 0;
8287 ctx.current_entry = &ctx.map->entry[0];
8289 ctx.current_entry->orig_address = 0;
8290 ctx.current_entry->new_address = 0;
8291 ctx.current_entry->size = 0;
8293 splay_tree_foreach (action_list->tree, xlate_map_fn, &ctx);
8295 ctx.current_entry->size = (bfd_get_section_limit (sec->owner, sec)
8296 - ctx.current_entry->orig_address);
8297 if (ctx.current_entry->size != 0)
8298 ctx.map->entry_count++;
8304 /* Free an offset translation map. */
8307 free_xlate_map (xlate_map_t *map)
8309 if (map && map->entry)
8316 /* Use check_section_ebb_pcrels_fit to make sure that all of the
8317 relocations in a section will fit if a proposed set of actions
8321 check_section_ebb_pcrels_fit (bfd *abfd,
8324 Elf_Internal_Rela *internal_relocs,
8325 reloc_range_list *relevant_relocs,
8326 const ebb_constraint *constraint,
8327 const xtensa_opcode *reloc_opcodes)
8330 unsigned n = sec->reloc_count;
8331 Elf_Internal_Rela *irel;
8332 xlate_map_t *xmap = NULL;
8333 bfd_boolean ok = TRUE;
8334 xtensa_relax_info *relax_info;
8335 reloc_range_list_entry *entry = NULL;
8337 relax_info = get_xtensa_relax_info (sec);
8339 if (relax_info && sec->reloc_count > 100)
8341 xmap = build_xlate_map (sec, relax_info);
8342 /* NULL indicates out of memory, but the slow version
8343 can still be used. */
8346 if (relevant_relocs && constraint->action_count)
8348 if (!relevant_relocs->ok)
8355 bfd_vma min_offset, max_offset;
8356 min_offset = max_offset = constraint->actions[0].offset;
8358 for (i = 1; i < constraint->action_count; ++i)
8360 proposed_action *action = &constraint->actions[i];
8361 bfd_vma offset = action->offset;
8363 if (offset < min_offset)
8364 min_offset = offset;
8365 if (offset > max_offset)
8366 max_offset = offset;
8368 reloc_range_list_update_range (relevant_relocs, min_offset,
8370 n = relevant_relocs->n_list;
8371 entry = &relevant_relocs->list_root;
8376 relevant_relocs = NULL;
8379 for (i = 0; i < n; i++)
8382 bfd_vma orig_self_offset, orig_target_offset;
8383 bfd_vma self_offset, target_offset;
8385 reloc_howto_type *howto;
8386 int self_removed_bytes, target_removed_bytes;
8388 if (relevant_relocs)
8390 entry = entry->next;
8395 irel = internal_relocs + i;
8397 r_type = ELF32_R_TYPE (irel->r_info);
8399 howto = &elf_howto_table[r_type];
8400 /* We maintain the required invariant: PC-relative relocations
8401 that fit before linking must fit after linking. Thus we only
8402 need to deal with relocations to the same section that are
8404 if (r_type == R_XTENSA_ASM_SIMPLIFY
8405 || r_type == R_XTENSA_32_PCREL
8406 || !howto->pc_relative)
8409 r_reloc_init (&r_rel, abfd, irel, contents,
8410 bfd_get_section_limit (abfd, sec));
8412 if (r_reloc_get_section (&r_rel) != sec)
8415 orig_self_offset = irel->r_offset;
8416 orig_target_offset = r_rel.target_offset;
8418 self_offset = orig_self_offset;
8419 target_offset = orig_target_offset;
8424 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8427 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8428 orig_target_offset);
8431 self_removed_bytes = 0;
8432 target_removed_bytes = 0;
8434 for (j = 0; j < constraint->action_count; ++j)
8436 proposed_action *action = &constraint->actions[j];
8437 bfd_vma offset = action->offset;
8438 int removed_bytes = action->removed_bytes;
8439 if (offset < orig_self_offset
8440 || (offset == orig_self_offset && action->action == ta_fill
8441 && action->removed_bytes < 0))
8442 self_removed_bytes += removed_bytes;
8443 if (offset < orig_target_offset
8444 || (offset == orig_target_offset && action->action == ta_fill
8445 && action->removed_bytes < 0))
8446 target_removed_bytes += removed_bytes;
8448 self_offset -= self_removed_bytes;
8449 target_offset -= target_removed_bytes;
8451 /* Try to encode it. Get the operand and check. */
8452 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
8454 /* None of the current alternate relocs are PC-relative,
8455 and only PC-relative relocs matter here. */
8459 xtensa_opcode opcode;
8462 if (relevant_relocs)
8464 opcode = entry->opcode;
8465 opnum = entry->opnum;
8470 opcode = reloc_opcodes[relevant_relocs ?
8471 (unsigned)(entry - relevant_relocs->reloc) : i];
8473 opcode = get_relocation_opcode (abfd, sec, contents, irel);
8474 if (opcode == XTENSA_UNDEFINED)
8480 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
8481 if (opnum == XTENSA_UNDEFINED)
8488 if (!pcrel_reloc_fits (opcode, opnum, self_offset, target_offset))
8497 free_xlate_map (xmap);
8504 check_section_ebb_reduces (const ebb_constraint *constraint)
8509 for (i = 0; i < constraint->action_count; i++)
8511 const proposed_action *action = &constraint->actions[i];
8512 if (action->do_action)
8513 removed += action->removed_bytes;
8523 text_action_add_proposed (text_action_list *l,
8524 const ebb_constraint *ebb_table,
8529 for (i = 0; i < ebb_table->action_count; i++)
8531 proposed_action *action = &ebb_table->actions[i];
8533 if (!action->do_action)
8535 switch (action->action)
8537 case ta_remove_insn:
8538 case ta_remove_longcall:
8539 case ta_convert_longcall:
8540 case ta_narrow_insn:
8543 case ta_remove_literal:
8544 text_action_add (l, action->action, sec, action->offset,
8545 action->removed_bytes);
8558 compute_fill_extra_space (property_table_entry *entry)
8560 int fill_extra_space;
8565 if ((entry->flags & XTENSA_PROP_UNREACHABLE) == 0)
8568 fill_extra_space = entry->size;
8569 if ((entry->flags & XTENSA_PROP_ALIGN) != 0)
8571 /* Fill bytes for alignment:
8572 (2**n)-1 - (addr + (2**n)-1) & (2**n -1) */
8573 int pow = GET_XTENSA_PROP_ALIGNMENT (entry->flags);
8574 int nsm = (1 << pow) - 1;
8575 bfd_vma addr = entry->address + entry->size;
8576 bfd_vma align_fill = nsm - ((addr + nsm) & nsm);
8577 fill_extra_space += align_fill;
8579 return fill_extra_space;
8583 /* First relaxation pass. */
8585 /* If the section contains relaxable literals, check each literal to
8586 see if it has the same value as another literal that has already
8587 been seen, either in the current section or a previous one. If so,
8588 add an entry to the per-section list of removed literals. The
8589 actual changes are deferred until the next pass. */
8592 compute_removed_literals (bfd *abfd,
8594 struct bfd_link_info *link_info,
8595 value_map_hash_table *values)
8597 xtensa_relax_info *relax_info;
8599 Elf_Internal_Rela *internal_relocs;
8600 source_reloc *src_relocs, *rel;
8601 bfd_boolean ok = TRUE;
8602 property_table_entry *prop_table = NULL;
8605 bfd_boolean last_loc_is_prev = FALSE;
8606 bfd_vma last_target_offset = 0;
8607 section_cache_t target_sec_cache;
8608 bfd_size_type sec_size;
8610 init_section_cache (&target_sec_cache);
8612 /* Do nothing if it is not a relaxable literal section. */
8613 relax_info = get_xtensa_relax_info (sec);
8614 BFD_ASSERT (relax_info);
8615 if (!relax_info->is_relaxable_literal_section)
8618 internal_relocs = retrieve_internal_relocs (abfd, sec,
8619 link_info->keep_memory);
8621 sec_size = bfd_get_section_limit (abfd, sec);
8622 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
8623 if (contents == NULL && sec_size != 0)
8629 /* Sort the source_relocs by target offset. */
8630 src_relocs = relax_info->src_relocs;
8631 qsort (src_relocs, relax_info->src_count,
8632 sizeof (source_reloc), source_reloc_compare);
8633 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
8634 internal_reloc_compare);
8636 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
8637 XTENSA_PROP_SEC_NAME, FALSE);
8645 for (i = 0; i < relax_info->src_count; i++)
8647 Elf_Internal_Rela *irel = NULL;
8649 rel = &src_relocs[i];
8650 if (get_l32r_opcode () != rel->opcode)
8652 irel = get_irel_at_offset (sec, internal_relocs,
8653 rel->r_rel.target_offset);
8655 /* If the relocation on this is not a simple R_XTENSA_32 or
8656 R_XTENSA_PLT then do not consider it. This may happen when
8657 the difference of two symbols is used in a literal. */
8658 if (irel && (ELF32_R_TYPE (irel->r_info) != R_XTENSA_32
8659 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_PLT))
8662 /* If the target_offset for this relocation is the same as the
8663 previous relocation, then we've already considered whether the
8664 literal can be coalesced. Skip to the next one.... */
8665 if (i != 0 && prev_i != -1
8666 && src_relocs[i-1].r_rel.target_offset == rel->r_rel.target_offset)
8670 if (last_loc_is_prev &&
8671 last_target_offset + 4 != rel->r_rel.target_offset)
8672 last_loc_is_prev = FALSE;
8674 /* Check if the relocation was from an L32R that is being removed
8675 because a CALLX was converted to a direct CALL, and check if
8676 there are no other relocations to the literal. */
8677 if (is_removable_literal (rel, i, src_relocs, relax_info->src_count,
8678 sec, prop_table, ptblsize))
8680 if (!remove_dead_literal (abfd, sec, link_info, internal_relocs,
8681 irel, rel, prop_table, ptblsize))
8686 last_target_offset = rel->r_rel.target_offset;
8690 if (!identify_literal_placement (abfd, sec, contents, link_info,
8692 &last_loc_is_prev, irel,
8693 relax_info->src_count - i, rel,
8694 prop_table, ptblsize,
8695 &target_sec_cache, rel->is_abs_literal))
8700 last_target_offset = rel->r_rel.target_offset;
8704 print_removed_literals (stderr, &relax_info->removed_list);
8705 print_action_list (stderr, &relax_info->action_list);
8711 free_section_cache (&target_sec_cache);
8713 release_contents (sec, contents);
8714 release_internal_relocs (sec, internal_relocs);
8719 static Elf_Internal_Rela *
8720 get_irel_at_offset (asection *sec,
8721 Elf_Internal_Rela *internal_relocs,
8725 Elf_Internal_Rela *irel;
8727 Elf_Internal_Rela key;
8729 if (!internal_relocs)
8732 key.r_offset = offset;
8733 irel = bsearch (&key, internal_relocs, sec->reloc_count,
8734 sizeof (Elf_Internal_Rela), internal_reloc_matches);
8738 /* bsearch does not guarantee which will be returned if there are
8739 multiple matches. We need the first that is not an alignment. */
8740 i = irel - internal_relocs;
8743 if (internal_relocs[i-1].r_offset != offset)
8747 for ( ; i < sec->reloc_count; i++)
8749 irel = &internal_relocs[i];
8750 r_type = ELF32_R_TYPE (irel->r_info);
8751 if (irel->r_offset == offset && r_type != R_XTENSA_NONE)
8760 is_removable_literal (const source_reloc *rel,
8762 const source_reloc *src_relocs,
8765 property_table_entry *prop_table,
8768 const source_reloc *curr_rel;
8769 property_table_entry *entry;
8774 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8775 sec->vma + rel->r_rel.target_offset);
8776 if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
8779 for (++i; i < src_count; ++i)
8781 curr_rel = &src_relocs[i];
8782 /* If all others have the same target offset.... */
8783 if (curr_rel->r_rel.target_offset != rel->r_rel.target_offset)
8786 if (!curr_rel->is_null
8787 && !xtensa_is_property_section (curr_rel->source_sec)
8788 && !(curr_rel->source_sec->flags & SEC_DEBUGGING))
8796 remove_dead_literal (bfd *abfd,
8798 struct bfd_link_info *link_info,
8799 Elf_Internal_Rela *internal_relocs,
8800 Elf_Internal_Rela *irel,
8802 property_table_entry *prop_table,
8805 property_table_entry *entry;
8806 xtensa_relax_info *relax_info;
8808 relax_info = get_xtensa_relax_info (sec);
8812 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8813 sec->vma + rel->r_rel.target_offset);
8815 /* Mark the unused literal so that it will be removed. */
8816 add_removed_literal (&relax_info->removed_list, &rel->r_rel, NULL);
8818 text_action_add (&relax_info->action_list,
8819 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
8821 /* If the section is 4-byte aligned, do not add fill. */
8822 if (sec->alignment_power > 2)
8824 int fill_extra_space;
8825 bfd_vma entry_sec_offset;
8827 property_table_entry *the_add_entry;
8831 entry_sec_offset = entry->address - sec->vma + entry->size;
8833 entry_sec_offset = rel->r_rel.target_offset + 4;
8835 /* If the literal range is at the end of the section,
8837 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8839 fill_extra_space = compute_fill_extra_space (the_add_entry);
8841 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
8842 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
8843 -4, fill_extra_space);
8845 adjust_fill_action (fa, removed_diff);
8847 text_action_add (&relax_info->action_list,
8848 ta_fill, sec, entry_sec_offset, removed_diff);
8851 /* Zero out the relocation on this literal location. */
8854 if (elf_hash_table (link_info)->dynamic_sections_created)
8855 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
8857 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
8858 pin_internal_relocs (sec, internal_relocs);
8861 /* Do not modify "last_loc_is_prev". */
8867 identify_literal_placement (bfd *abfd,
8870 struct bfd_link_info *link_info,
8871 value_map_hash_table *values,
8872 bfd_boolean *last_loc_is_prev_p,
8873 Elf_Internal_Rela *irel,
8874 int remaining_src_rels,
8876 property_table_entry *prop_table,
8878 section_cache_t *target_sec_cache,
8879 bfd_boolean is_abs_literal)
8883 xtensa_relax_info *relax_info;
8884 bfd_boolean literal_placed = FALSE;
8886 unsigned long value;
8887 bfd_boolean final_static_link;
8888 bfd_size_type sec_size;
8890 relax_info = get_xtensa_relax_info (sec);
8894 sec_size = bfd_get_section_limit (abfd, sec);
8897 (!bfd_link_relocatable (link_info)
8898 && !elf_hash_table (link_info)->dynamic_sections_created);
8900 /* The placement algorithm first checks to see if the literal is
8901 already in the value map. If so and the value map is reachable
8902 from all uses, then the literal is moved to that location. If
8903 not, then we identify the last location where a fresh literal was
8904 placed. If the literal can be safely moved there, then we do so.
8905 If not, then we assume that the literal is not to move and leave
8906 the literal where it is, marking it as the last literal
8909 /* Find the literal value. */
8911 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
8914 BFD_ASSERT (rel->r_rel.target_offset < sec_size);
8915 value = bfd_get_32 (abfd, contents + rel->r_rel.target_offset);
8917 init_literal_value (&val, &r_rel, value, is_abs_literal);
8919 /* Check if we've seen another literal with the same value that
8920 is in the same output section. */
8921 val_map = value_map_get_cached_value (values, &val, final_static_link);
8924 && (r_reloc_get_section (&val_map->loc)->output_section
8925 == sec->output_section)
8926 && relocations_reach (rel, remaining_src_rels, &val_map->loc)
8927 && coalesce_shared_literal (sec, rel, prop_table, ptblsize, val_map))
8929 /* No change to last_loc_is_prev. */
8930 literal_placed = TRUE;
8933 /* For relocatable links, do not try to move literals. To do it
8934 correctly might increase the number of relocations in an input
8935 section making the default relocatable linking fail. */
8936 if (!bfd_link_relocatable (link_info) && !literal_placed
8937 && values->has_last_loc && !(*last_loc_is_prev_p))
8939 asection *target_sec = r_reloc_get_section (&values->last_loc);
8940 if (target_sec && target_sec->output_section == sec->output_section)
8942 /* Increment the virtual offset. */
8943 r_reloc try_loc = values->last_loc;
8944 try_loc.virtual_offset += 4;
8946 /* There is a last loc that was in the same output section. */
8947 if (relocations_reach (rel, remaining_src_rels, &try_loc)
8948 && move_shared_literal (sec, link_info, rel,
8949 prop_table, ptblsize,
8950 &try_loc, &val, target_sec_cache))
8952 values->last_loc.virtual_offset += 4;
8953 literal_placed = TRUE;
8955 val_map = add_value_map (values, &val, &try_loc,
8958 val_map->loc = try_loc;
8963 if (!literal_placed)
8965 /* Nothing worked, leave the literal alone but update the last loc. */
8966 values->has_last_loc = TRUE;
8967 values->last_loc = rel->r_rel;
8969 val_map = add_value_map (values, &val, &rel->r_rel, final_static_link);
8971 val_map->loc = rel->r_rel;
8972 *last_loc_is_prev_p = TRUE;
8979 /* Check if the original relocations (presumably on L32R instructions)
8980 identified by reloc[0..N] can be changed to reference the literal
8981 identified by r_rel. If r_rel is out of range for any of the
8982 original relocations, then we don't want to coalesce the original
8983 literal with the one at r_rel. We only check reloc[0..N], where the
8984 offsets are all the same as for reloc[0] (i.e., they're all
8985 referencing the same literal) and where N is also bounded by the
8986 number of remaining entries in the "reloc" array. The "reloc" array
8987 is sorted by target offset so we know all the entries for the same
8988 literal will be contiguous. */
8991 relocations_reach (source_reloc *reloc,
8992 int remaining_relocs,
8993 const r_reloc *r_rel)
8995 bfd_vma from_offset, source_address, dest_address;
8999 if (!r_reloc_is_defined (r_rel))
9002 sec = r_reloc_get_section (r_rel);
9003 from_offset = reloc[0].r_rel.target_offset;
9005 for (i = 0; i < remaining_relocs; i++)
9007 if (reloc[i].r_rel.target_offset != from_offset)
9010 /* Ignore relocations that have been removed. */
9011 if (reloc[i].is_null)
9014 /* The original and new output section for these must be the same
9015 in order to coalesce. */
9016 if (r_reloc_get_section (&reloc[i].r_rel)->output_section
9017 != sec->output_section)
9020 /* Absolute literals in the same output section can always be
9022 if (reloc[i].is_abs_literal)
9025 /* A literal with no PC-relative relocations can be moved anywhere. */
9026 if (reloc[i].opnd != -1)
9028 /* Otherwise, check to see that it fits. */
9029 source_address = (reloc[i].source_sec->output_section->vma
9030 + reloc[i].source_sec->output_offset
9031 + reloc[i].r_rel.rela.r_offset);
9032 dest_address = (sec->output_section->vma
9033 + sec->output_offset
9034 + r_rel->target_offset);
9036 if (!pcrel_reloc_fits (reloc[i].opcode, reloc[i].opnd,
9037 source_address, dest_address))
9046 /* Move a literal to another literal location because it is
9047 the same as the other literal value. */
9050 coalesce_shared_literal (asection *sec,
9052 property_table_entry *prop_table,
9056 property_table_entry *entry;
9058 property_table_entry *the_add_entry;
9060 xtensa_relax_info *relax_info;
9062 relax_info = get_xtensa_relax_info (sec);
9066 entry = elf_xtensa_find_property_entry
9067 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9068 if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
9071 /* Mark that the literal will be coalesced. */
9072 add_removed_literal (&relax_info->removed_list, &rel->r_rel, &val_map->loc);
9074 text_action_add (&relax_info->action_list,
9075 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9077 /* If the section is 4-byte aligned, do not add fill. */
9078 if (sec->alignment_power > 2)
9080 int fill_extra_space;
9081 bfd_vma entry_sec_offset;
9084 entry_sec_offset = entry->address - sec->vma + entry->size;
9086 entry_sec_offset = rel->r_rel.target_offset + 4;
9088 /* If the literal range is at the end of the section,
9090 fill_extra_space = 0;
9091 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9093 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9094 fill_extra_space = the_add_entry->size;
9096 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9097 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9098 -4, fill_extra_space);
9100 adjust_fill_action (fa, removed_diff);
9102 text_action_add (&relax_info->action_list,
9103 ta_fill, sec, entry_sec_offset, removed_diff);
9110 /* Move a literal to another location. This may actually increase the
9111 total amount of space used because of alignments so we need to do
9112 this carefully. Also, it may make a branch go out of range. */
9115 move_shared_literal (asection *sec,
9116 struct bfd_link_info *link_info,
9118 property_table_entry *prop_table,
9120 const r_reloc *target_loc,
9121 const literal_value *lit_value,
9122 section_cache_t *target_sec_cache)
9124 property_table_entry *the_add_entry, *src_entry, *target_entry = NULL;
9125 text_action *fa, *target_fa;
9127 xtensa_relax_info *relax_info, *target_relax_info;
9128 asection *target_sec;
9130 ebb_constraint ebb_table;
9131 bfd_boolean relocs_fit;
9133 /* If this routine always returns FALSE, the literals that cannot be
9134 coalesced will not be moved. */
9135 if (elf32xtensa_no_literal_movement)
9138 relax_info = get_xtensa_relax_info (sec);
9142 target_sec = r_reloc_get_section (target_loc);
9143 target_relax_info = get_xtensa_relax_info (target_sec);
9145 /* Literals to undefined sections may not be moved because they
9146 must report an error. */
9147 if (bfd_is_und_section (target_sec))
9150 src_entry = elf_xtensa_find_property_entry
9151 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9153 if (!section_cache_section (target_sec_cache, target_sec, link_info))
9156 target_entry = elf_xtensa_find_property_entry
9157 (target_sec_cache->ptbl, target_sec_cache->pte_count,
9158 target_sec->vma + target_loc->target_offset);
9163 /* Make sure that we have not broken any branches. */
9166 init_ebb_constraint (&ebb_table);
9167 ebb = &ebb_table.ebb;
9168 init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
9169 target_sec_cache->content_length,
9170 target_sec_cache->ptbl, target_sec_cache->pte_count,
9171 target_sec_cache->relocs, target_sec_cache->reloc_count);
9173 /* Propose to add 4 bytes + worst-case alignment size increase to
9175 ebb_propose_action (&ebb_table, EBB_NO_ALIGN, 0,
9176 ta_fill, target_loc->target_offset,
9177 -4 - (1 << target_sec->alignment_power), TRUE);
9179 /* Check all of the PC-relative relocations to make sure they still fit. */
9180 relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
9181 target_sec_cache->contents,
9182 target_sec_cache->relocs, NULL,
9188 text_action_add_literal (&target_relax_info->action_list,
9189 ta_add_literal, target_loc, lit_value, -4);
9191 if (target_sec->alignment_power > 2 && target_entry != src_entry)
9193 /* May need to add or remove some fill to maintain alignment. */
9194 int fill_extra_space;
9195 bfd_vma entry_sec_offset;
9198 target_entry->address - target_sec->vma + target_entry->size;
9200 /* If the literal range is at the end of the section,
9202 fill_extra_space = 0;
9204 elf_xtensa_find_property_entry (target_sec_cache->ptbl,
9205 target_sec_cache->pte_count,
9207 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9208 fill_extra_space = the_add_entry->size;
9210 target_fa = find_fill_action (&target_relax_info->action_list,
9211 target_sec, entry_sec_offset);
9212 removed_diff = compute_removed_action_diff (target_fa, target_sec,
9213 entry_sec_offset, 4,
9216 adjust_fill_action (target_fa, removed_diff);
9218 text_action_add (&target_relax_info->action_list,
9219 ta_fill, target_sec, entry_sec_offset, removed_diff);
9222 /* Mark that the literal will be moved to the new location. */
9223 add_removed_literal (&relax_info->removed_list, &rel->r_rel, target_loc);
9225 /* Remove the literal. */
9226 text_action_add (&relax_info->action_list,
9227 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9229 /* If the section is 4-byte aligned, do not add fill. */
9230 if (sec->alignment_power > 2 && target_entry != src_entry)
9232 int fill_extra_space;
9233 bfd_vma entry_sec_offset;
9236 entry_sec_offset = src_entry->address - sec->vma + src_entry->size;
9238 entry_sec_offset = rel->r_rel.target_offset+4;
9240 /* If the literal range is at the end of the section,
9242 fill_extra_space = 0;
9243 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9245 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9246 fill_extra_space = the_add_entry->size;
9248 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9249 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9250 -4, fill_extra_space);
9252 adjust_fill_action (fa, removed_diff);
9254 text_action_add (&relax_info->action_list,
9255 ta_fill, sec, entry_sec_offset, removed_diff);
9262 /* Second relaxation pass. */
9265 action_remove_bytes_fn (splay_tree_node node, void *p)
9267 bfd_size_type *final_size = p;
9268 text_action *action = (text_action *)node->value;
9270 *final_size -= action->removed_bytes;
9274 /* Modify all of the relocations to point to the right spot, and if this
9275 is a relaxable section, delete the unwanted literals and fix the
9279 relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
9281 Elf_Internal_Rela *internal_relocs;
9282 xtensa_relax_info *relax_info;
9284 bfd_boolean ok = TRUE;
9286 bfd_boolean rv = FALSE;
9287 bfd_boolean virtual_action;
9288 bfd_size_type sec_size;
9290 sec_size = bfd_get_section_limit (abfd, sec);
9291 relax_info = get_xtensa_relax_info (sec);
9292 BFD_ASSERT (relax_info);
9294 /* First translate any of the fixes that have been added already. */
9295 translate_section_fixes (sec);
9297 /* Handle property sections (e.g., literal tables) specially. */
9298 if (xtensa_is_property_section (sec))
9300 BFD_ASSERT (!relax_info->is_relaxable_literal_section);
9301 return relax_property_section (abfd, sec, link_info);
9304 internal_relocs = retrieve_internal_relocs (abfd, sec,
9305 link_info->keep_memory);
9306 if (!internal_relocs && !action_list_count (&relax_info->action_list))
9309 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
9310 if (contents == NULL && sec_size != 0)
9316 if (internal_relocs)
9318 for (i = 0; i < sec->reloc_count; i++)
9320 Elf_Internal_Rela *irel;
9321 xtensa_relax_info *target_relax_info;
9322 bfd_vma source_offset, old_source_offset;
9325 asection *target_sec;
9327 /* Locally change the source address.
9328 Translate the target to the new target address.
9329 If it points to this section and has been removed,
9333 irel = &internal_relocs[i];
9334 source_offset = irel->r_offset;
9335 old_source_offset = source_offset;
9337 r_type = ELF32_R_TYPE (irel->r_info);
9338 r_reloc_init (&r_rel, abfd, irel, contents,
9339 bfd_get_section_limit (abfd, sec));
9341 /* If this section could have changed then we may need to
9342 change the relocation's offset. */
9344 if (relax_info->is_relaxable_literal_section
9345 || relax_info->is_relaxable_asm_section)
9347 pin_internal_relocs (sec, internal_relocs);
9349 if (r_type != R_XTENSA_NONE
9350 && find_removed_literal (&relax_info->removed_list,
9353 /* Remove this relocation. */
9354 if (elf_hash_table (link_info)->dynamic_sections_created)
9355 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
9356 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
9357 irel->r_offset = offset_with_removed_text_map
9358 (&relax_info->action_list, irel->r_offset);
9362 if (r_type == R_XTENSA_ASM_SIMPLIFY)
9364 text_action *action =
9365 find_insn_action (&relax_info->action_list,
9367 if (action && (action->action == ta_convert_longcall
9368 || action->action == ta_remove_longcall))
9370 bfd_reloc_status_type retval;
9371 char *error_message = NULL;
9373 retval = contract_asm_expansion (contents, sec_size,
9374 irel, &error_message);
9375 if (retval != bfd_reloc_ok)
9377 (*link_info->callbacks->reloc_dangerous)
9378 (link_info, error_message, abfd, sec,
9382 /* Update the action so that the code that moves
9383 the contents will do the right thing. */
9384 /* ta_remove_longcall and ta_remove_insn actions are
9385 grouped together in the tree as well as
9386 ta_convert_longcall and ta_none, so that changes below
9387 can be done w/o removing and reinserting action into
9390 if (action->action == ta_remove_longcall)
9391 action->action = ta_remove_insn;
9393 action->action = ta_none;
9394 /* Refresh the info in the r_rel. */
9395 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
9396 r_type = ELF32_R_TYPE (irel->r_info);
9400 source_offset = offset_with_removed_text_map
9401 (&relax_info->action_list, irel->r_offset);
9402 irel->r_offset = source_offset;
9405 /* If the target section could have changed then
9406 we may need to change the relocation's target offset. */
9408 target_sec = r_reloc_get_section (&r_rel);
9410 /* For a reference to a discarded section from a DWARF section,
9411 i.e., where action_discarded is PRETEND, the symbol will
9412 eventually be modified to refer to the kept section (at least if
9413 the kept and discarded sections are the same size). Anticipate
9414 that here and adjust things accordingly. */
9415 if (! elf_xtensa_ignore_discarded_relocs (sec)
9416 && elf_xtensa_action_discarded (sec) == PRETEND
9417 && sec->sec_info_type != SEC_INFO_TYPE_STABS
9418 && target_sec != NULL
9419 && discarded_section (target_sec))
9421 /* It would be natural to call _bfd_elf_check_kept_section
9422 here, but it's not exported from elflink.c. It's also a
9423 fairly expensive check. Adjusting the relocations to the
9424 discarded section is fairly harmless; it will only adjust
9425 some addends and difference values. If it turns out that
9426 _bfd_elf_check_kept_section fails later, it won't matter,
9427 so just compare the section names to find the right group
9429 asection *kept = target_sec->kept_section;
9432 if ((kept->flags & SEC_GROUP) != 0)
9434 asection *first = elf_next_in_group (kept);
9435 asection *s = first;
9440 if (strcmp (s->name, target_sec->name) == 0)
9445 s = elf_next_in_group (s);
9452 && ((target_sec->rawsize != 0
9453 ? target_sec->rawsize : target_sec->size)
9454 == (kept->rawsize != 0 ? kept->rawsize : kept->size)))
9458 target_relax_info = get_xtensa_relax_info (target_sec);
9459 if (target_relax_info
9460 && (target_relax_info->is_relaxable_literal_section
9461 || target_relax_info->is_relaxable_asm_section))
9464 target_sec = translate_reloc (&r_rel, &new_reloc, target_sec);
9466 if (r_type == R_XTENSA_DIFF8
9467 || r_type == R_XTENSA_DIFF16
9468 || r_type == R_XTENSA_DIFF32)
9470 bfd_signed_vma diff_value = 0;
9471 bfd_vma new_end_offset, diff_mask = 0;
9473 if (bfd_get_section_limit (abfd, sec) < old_source_offset)
9475 (*link_info->callbacks->reloc_dangerous)
9476 (link_info, _("invalid relocation address"),
9477 abfd, sec, old_source_offset);
9483 case R_XTENSA_DIFF8:
9485 bfd_get_signed_8 (abfd, &contents[old_source_offset]);
9487 case R_XTENSA_DIFF16:
9489 bfd_get_signed_16 (abfd, &contents[old_source_offset]);
9491 case R_XTENSA_DIFF32:
9493 bfd_get_signed_32 (abfd, &contents[old_source_offset]);
9497 new_end_offset = offset_with_removed_text_map
9498 (&target_relax_info->action_list,
9499 r_rel.target_offset + diff_value);
9500 diff_value = new_end_offset - new_reloc.target_offset;
9504 case R_XTENSA_DIFF8:
9506 bfd_put_signed_8 (abfd, diff_value,
9507 &contents[old_source_offset]);
9509 case R_XTENSA_DIFF16:
9511 bfd_put_signed_16 (abfd, diff_value,
9512 &contents[old_source_offset]);
9514 case R_XTENSA_DIFF32:
9515 diff_mask = 0x7fffffff;
9516 bfd_put_signed_32 (abfd, diff_value,
9517 &contents[old_source_offset]);
9521 /* Check for overflow. Sign bits must be all zeroes or all ones */
9522 if ((diff_value & ~diff_mask) != 0 &&
9523 (diff_value & ~diff_mask) != (-1 & ~diff_mask))
9525 (*link_info->callbacks->reloc_dangerous)
9526 (link_info, _("overflow after relaxation"),
9527 abfd, sec, old_source_offset);
9531 pin_contents (sec, contents);
9534 /* If the relocation still references a section in the same
9535 input file, modify the relocation directly instead of
9536 adding a "fix" record. */
9537 if (target_sec->owner == abfd)
9539 unsigned r_symndx = ELF32_R_SYM (new_reloc.rela.r_info);
9540 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
9541 irel->r_addend = new_reloc.rela.r_addend;
9542 pin_internal_relocs (sec, internal_relocs);
9546 bfd_vma addend_displacement;
9549 addend_displacement =
9550 new_reloc.target_offset + new_reloc.virtual_offset;
9551 fix = reloc_bfd_fix_init (sec, source_offset, r_type,
9553 addend_displacement, TRUE);
9560 if ((relax_info->is_relaxable_literal_section
9561 || relax_info->is_relaxable_asm_section)
9562 && action_list_count (&relax_info->action_list))
9564 /* Walk through the planned actions and build up a table
9565 of move, copy and fill records. Use the move, copy and
9566 fill records to perform the actions once. */
9568 bfd_size_type final_size, copy_size, orig_insn_size;
9569 bfd_byte *scratch = NULL;
9570 bfd_byte *dup_contents = NULL;
9571 bfd_size_type orig_size = sec->size;
9572 bfd_vma orig_dot = 0;
9573 bfd_vma orig_dot_copied = 0; /* Byte copied already from
9574 orig dot in physical memory. */
9575 bfd_vma orig_dot_vo = 0; /* Virtual offset from orig_dot. */
9576 bfd_vma dup_dot = 0;
9578 text_action *action;
9580 final_size = sec->size;
9582 splay_tree_foreach (relax_info->action_list.tree,
9583 action_remove_bytes_fn, &final_size);
9584 scratch = (bfd_byte *) bfd_zmalloc (final_size);
9585 dup_contents = (bfd_byte *) bfd_zmalloc (final_size);
9587 /* The dot is the current fill location. */
9589 print_action_list (stderr, &relax_info->action_list);
9592 for (action = action_first (&relax_info->action_list); action;
9593 action = action_next (&relax_info->action_list, action))
9595 virtual_action = FALSE;
9596 if (action->offset > orig_dot)
9598 orig_dot += orig_dot_copied;
9599 orig_dot_copied = 0;
9601 /* Out of the virtual world. */
9604 if (action->offset > orig_dot)
9606 copy_size = action->offset - orig_dot;
9607 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9608 orig_dot += copy_size;
9609 dup_dot += copy_size;
9610 BFD_ASSERT (action->offset == orig_dot);
9612 else if (action->offset < orig_dot)
9614 if (action->action == ta_fill
9615 && action->offset - action->removed_bytes == orig_dot)
9617 /* This is OK because the fill only effects the dup_dot. */
9619 else if (action->action == ta_add_literal)
9621 /* TBD. Might need to handle this. */
9624 if (action->offset == orig_dot)
9626 if (action->virtual_offset > orig_dot_vo)
9628 if (orig_dot_vo == 0)
9630 /* Need to copy virtual_offset bytes. Probably four. */
9631 copy_size = action->virtual_offset - orig_dot_vo;
9632 memmove (&dup_contents[dup_dot],
9633 &contents[orig_dot], copy_size);
9634 orig_dot_copied = copy_size;
9635 dup_dot += copy_size;
9637 virtual_action = TRUE;
9640 BFD_ASSERT (action->virtual_offset <= orig_dot_vo);
9642 switch (action->action)
9644 case ta_remove_literal:
9645 case ta_remove_insn:
9646 BFD_ASSERT (action->removed_bytes >= 0);
9647 orig_dot += action->removed_bytes;
9650 case ta_narrow_insn:
9653 memmove (scratch, &contents[orig_dot], orig_insn_size);
9654 BFD_ASSERT (action->removed_bytes == 1);
9655 rv = narrow_instruction (scratch, final_size, 0);
9657 memmove (&dup_contents[dup_dot], scratch, copy_size);
9658 orig_dot += orig_insn_size;
9659 dup_dot += copy_size;
9663 if (action->removed_bytes >= 0)
9664 orig_dot += action->removed_bytes;
9667 /* Already zeroed in dup_contents. Just bump the
9669 dup_dot += (-action->removed_bytes);
9674 BFD_ASSERT (action->removed_bytes == 0);
9677 case ta_convert_longcall:
9678 case ta_remove_longcall:
9679 /* These will be removed or converted before we get here. */
9686 memmove (scratch, &contents[orig_dot], orig_insn_size);
9687 BFD_ASSERT (action->removed_bytes == -1);
9688 rv = widen_instruction (scratch, final_size, 0);
9690 memmove (&dup_contents[dup_dot], scratch, copy_size);
9691 orig_dot += orig_insn_size;
9692 dup_dot += copy_size;
9695 case ta_add_literal:
9698 BFD_ASSERT (action->removed_bytes == -4);
9699 /* TBD -- place the literal value here and insert
9701 memset (&dup_contents[dup_dot], 0, 4);
9702 pin_internal_relocs (sec, internal_relocs);
9703 pin_contents (sec, contents);
9705 if (!move_literal (abfd, link_info, sec, dup_dot, dup_contents,
9706 relax_info, &internal_relocs, &action->value))
9710 orig_dot_vo += copy_size;
9712 orig_dot += orig_insn_size;
9713 dup_dot += copy_size;
9717 /* Not implemented yet. */
9722 BFD_ASSERT (dup_dot <= final_size);
9723 BFD_ASSERT (orig_dot <= orig_size);
9726 orig_dot += orig_dot_copied;
9727 orig_dot_copied = 0;
9729 if (orig_dot != orig_size)
9731 copy_size = orig_size - orig_dot;
9732 BFD_ASSERT (orig_size > orig_dot);
9733 BFD_ASSERT (dup_dot + copy_size == final_size);
9734 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9735 orig_dot += copy_size;
9736 dup_dot += copy_size;
9738 BFD_ASSERT (orig_size == orig_dot);
9739 BFD_ASSERT (final_size == dup_dot);
9741 /* Move the dup_contents back. */
9742 if (final_size > orig_size)
9744 /* Contents need to be reallocated. Swap the dup_contents into
9746 sec->contents = dup_contents;
9748 contents = dup_contents;
9749 pin_contents (sec, contents);
9753 BFD_ASSERT (final_size <= orig_size);
9754 memset (contents, 0, orig_size);
9755 memcpy (contents, dup_contents, final_size);
9756 free (dup_contents);
9759 pin_contents (sec, contents);
9761 if (sec->rawsize == 0)
9762 sec->rawsize = sec->size;
9763 sec->size = final_size;
9767 release_internal_relocs (sec, internal_relocs);
9768 release_contents (sec, contents);
9774 translate_section_fixes (asection *sec)
9776 xtensa_relax_info *relax_info;
9779 relax_info = get_xtensa_relax_info (sec);
9783 for (r = relax_info->fix_list; r != NULL; r = r->next)
9784 if (!translate_reloc_bfd_fix (r))
9791 /* Translate a fix given the mapping in the relax info for the target
9792 section. If it has already been translated, no work is required. */
9795 translate_reloc_bfd_fix (reloc_bfd_fix *fix)
9797 reloc_bfd_fix new_fix;
9799 xtensa_relax_info *relax_info;
9800 removed_literal *removed;
9801 bfd_vma new_offset, target_offset;
9803 if (fix->translated)
9806 sec = fix->target_sec;
9807 target_offset = fix->target_offset;
9809 relax_info = get_xtensa_relax_info (sec);
9812 fix->translated = TRUE;
9818 /* The fix does not need to be translated if the section cannot change. */
9819 if (!relax_info->is_relaxable_literal_section
9820 && !relax_info->is_relaxable_asm_section)
9822 fix->translated = TRUE;
9826 /* If the literal has been moved and this relocation was on an
9827 opcode, then the relocation should move to the new literal
9828 location. Otherwise, the relocation should move within the
9832 if (is_operand_relocation (fix->src_type))
9834 /* Check if the original relocation is against a literal being
9836 removed = find_removed_literal (&relax_info->removed_list,
9844 /* The fact that there is still a relocation to this literal indicates
9845 that the literal is being coalesced, not simply removed. */
9846 BFD_ASSERT (removed->to.abfd != NULL);
9848 /* This was moved to some other address (possibly another section). */
9849 new_sec = r_reloc_get_section (&removed->to);
9853 relax_info = get_xtensa_relax_info (sec);
9855 (!relax_info->is_relaxable_literal_section
9856 && !relax_info->is_relaxable_asm_section))
9858 target_offset = removed->to.target_offset;
9859 new_fix.target_sec = new_sec;
9860 new_fix.target_offset = target_offset;
9861 new_fix.translated = TRUE;
9866 target_offset = removed->to.target_offset;
9867 new_fix.target_sec = new_sec;
9870 /* The target address may have been moved within its section. */
9871 new_offset = offset_with_removed_text (&relax_info->action_list,
9874 new_fix.target_offset = new_offset;
9875 new_fix.target_offset = new_offset;
9876 new_fix.translated = TRUE;
9882 /* Fix up a relocation to take account of removed literals. */
9885 translate_reloc (const r_reloc *orig_rel, r_reloc *new_rel, asection *sec)
9887 xtensa_relax_info *relax_info;
9888 removed_literal *removed;
9889 bfd_vma target_offset, base_offset;
9891 *new_rel = *orig_rel;
9893 if (!r_reloc_is_defined (orig_rel))
9896 relax_info = get_xtensa_relax_info (sec);
9897 BFD_ASSERT (relax_info && (relax_info->is_relaxable_literal_section
9898 || relax_info->is_relaxable_asm_section));
9900 target_offset = orig_rel->target_offset;
9903 if (is_operand_relocation (ELF32_R_TYPE (orig_rel->rela.r_info)))
9905 /* Check if the original relocation is against a literal being
9907 removed = find_removed_literal (&relax_info->removed_list,
9910 if (removed && removed->to.abfd)
9914 /* The fact that there is still a relocation to this literal indicates
9915 that the literal is being coalesced, not simply removed. */
9916 BFD_ASSERT (removed->to.abfd != NULL);
9918 /* This was moved to some other address
9919 (possibly in another section). */
9920 *new_rel = removed->to;
9921 new_sec = r_reloc_get_section (new_rel);
9925 relax_info = get_xtensa_relax_info (sec);
9927 || (!relax_info->is_relaxable_literal_section
9928 && !relax_info->is_relaxable_asm_section))
9931 target_offset = new_rel->target_offset;
9934 /* Find the base offset of the reloc symbol, excluding any addend from the
9935 reloc or from the section contents (for a partial_inplace reloc). Then
9936 find the adjusted values of the offsets due to relaxation. The base
9937 offset is needed to determine the change to the reloc's addend; the reloc
9938 addend should not be adjusted due to relaxations located before the base
9941 base_offset = r_reloc_get_target_offset (new_rel) - new_rel->rela.r_addend;
9942 if (base_offset <= target_offset)
9944 int base_removed = removed_by_actions_map (&relax_info->action_list,
9945 base_offset, FALSE);
9946 int addend_removed = removed_by_actions_map (&relax_info->action_list,
9947 target_offset, FALSE) -
9950 new_rel->target_offset = target_offset - base_removed - addend_removed;
9951 new_rel->rela.r_addend -= addend_removed;
9955 /* Handle a negative addend. The base offset comes first. */
9956 int tgt_removed = removed_by_actions_map (&relax_info->action_list,
9957 target_offset, FALSE);
9958 int addend_removed = removed_by_actions_map (&relax_info->action_list,
9959 base_offset, FALSE) -
9962 new_rel->target_offset = target_offset - tgt_removed;
9963 new_rel->rela.r_addend += addend_removed;
9970 /* For dynamic links, there may be a dynamic relocation for each
9971 literal. The number of dynamic relocations must be computed in
9972 size_dynamic_sections, which occurs before relaxation. When a
9973 literal is removed, this function checks if there is a corresponding
9974 dynamic relocation and shrinks the size of the appropriate dynamic
9975 relocation section accordingly. At this point, the contents of the
9976 dynamic relocation sections have not yet been filled in, so there's
9977 nothing else that needs to be done. */
9980 shrink_dynamic_reloc_sections (struct bfd_link_info *info,
9982 asection *input_section,
9983 Elf_Internal_Rela *rel)
9985 struct elf_xtensa_link_hash_table *htab;
9986 Elf_Internal_Shdr *symtab_hdr;
9987 struct elf_link_hash_entry **sym_hashes;
9988 unsigned long r_symndx;
9990 struct elf_link_hash_entry *h;
9991 bfd_boolean dynamic_symbol;
9993 htab = elf_xtensa_hash_table (info);
9997 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9998 sym_hashes = elf_sym_hashes (abfd);
10000 r_type = ELF32_R_TYPE (rel->r_info);
10001 r_symndx = ELF32_R_SYM (rel->r_info);
10003 if (r_symndx < symtab_hdr->sh_info)
10006 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
10008 dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
10010 if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
10011 && (input_section->flags & SEC_ALLOC) != 0
10012 && (dynamic_symbol || bfd_link_pic (info)))
10015 bfd_boolean is_plt = FALSE;
10017 if (dynamic_symbol && r_type == R_XTENSA_PLT)
10019 srel = htab->elf.srelplt;
10023 srel = htab->elf.srelgot;
10025 /* Reduce size of the .rela.* section by one reloc. */
10026 BFD_ASSERT (srel != NULL);
10027 BFD_ASSERT (srel->size >= sizeof (Elf32_External_Rela));
10028 srel->size -= sizeof (Elf32_External_Rela);
10032 asection *splt, *sgotplt, *srelgot;
10033 int reloc_index, chunk;
10035 /* Find the PLT reloc index of the entry being removed. This
10036 is computed from the size of ".rela.plt". It is needed to
10037 figure out which PLT chunk to resize. Usually "last index
10038 = size - 1" since the index starts at zero, but in this
10039 context, the size has just been decremented so there's no
10040 need to subtract one. */
10041 reloc_index = srel->size / sizeof (Elf32_External_Rela);
10043 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
10044 splt = elf_xtensa_get_plt_section (info, chunk);
10045 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
10046 BFD_ASSERT (splt != NULL && sgotplt != NULL);
10048 /* Check if an entire PLT chunk has just been eliminated. */
10049 if (reloc_index % PLT_ENTRIES_PER_CHUNK == 0)
10051 /* The two magic GOT entries for that chunk can go away. */
10052 srelgot = htab->elf.srelgot;
10053 BFD_ASSERT (srelgot != NULL);
10054 srelgot->reloc_count -= 2;
10055 srelgot->size -= 2 * sizeof (Elf32_External_Rela);
10056 sgotplt->size -= 8;
10058 /* There should be only one entry left (and it will be
10060 BFD_ASSERT (sgotplt->size == 4);
10061 BFD_ASSERT (splt->size == PLT_ENTRY_SIZE);
10064 BFD_ASSERT (sgotplt->size >= 4);
10065 BFD_ASSERT (splt->size >= PLT_ENTRY_SIZE);
10067 sgotplt->size -= 4;
10068 splt->size -= PLT_ENTRY_SIZE;
10074 /* Take an r_rel and move it to another section. This usually
10075 requires extending the interal_relocation array and pinning it. If
10076 the original r_rel is from the same BFD, we can complete this here.
10077 Otherwise, we add a fix record to let the final link fix the
10078 appropriate address. Contents and internal relocations for the
10079 section must be pinned after calling this routine. */
10082 move_literal (bfd *abfd,
10083 struct bfd_link_info *link_info,
10086 bfd_byte *contents,
10087 xtensa_relax_info *relax_info,
10088 Elf_Internal_Rela **internal_relocs_p,
10089 const literal_value *lit)
10091 Elf_Internal_Rela *new_relocs = NULL;
10092 size_t new_relocs_count = 0;
10093 Elf_Internal_Rela this_rela;
10094 const r_reloc *r_rel;
10096 r_rel = &lit->r_rel;
10097 BFD_ASSERT (elf_section_data (sec)->relocs == *internal_relocs_p);
10099 if (r_reloc_is_const (r_rel))
10100 bfd_put_32 (abfd, lit->value, contents + offset);
10105 reloc_bfd_fix *fix;
10106 unsigned insert_at;
10108 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
10110 /* This is the difficult case. We have to create a fix up. */
10111 this_rela.r_offset = offset;
10112 this_rela.r_info = ELF32_R_INFO (0, r_type);
10113 this_rela.r_addend =
10114 r_rel->target_offset - r_reloc_get_target_offset (r_rel);
10115 bfd_put_32 (abfd, lit->value, contents + offset);
10117 /* Currently, we cannot move relocations during a relocatable link. */
10118 BFD_ASSERT (!bfd_link_relocatable (link_info));
10119 fix = reloc_bfd_fix_init (sec, offset, r_type,
10120 r_reloc_get_section (r_rel),
10121 r_rel->target_offset + r_rel->virtual_offset,
10123 /* We also need to mark that relocations are needed here. */
10124 sec->flags |= SEC_RELOC;
10126 translate_reloc_bfd_fix (fix);
10127 /* This fix has not yet been translated. */
10128 add_fix (sec, fix);
10130 /* Add the relocation. If we have already allocated our own
10131 space for the relocations and we have room for more, then use
10132 it. Otherwise, allocate new space and move the literals. */
10133 insert_at = sec->reloc_count;
10134 for (i = 0; i < sec->reloc_count; ++i)
10136 if (this_rela.r_offset < (*internal_relocs_p)[i].r_offset)
10143 if (*internal_relocs_p != relax_info->allocated_relocs
10144 || sec->reloc_count + 1 > relax_info->allocated_relocs_count)
10146 BFD_ASSERT (relax_info->allocated_relocs == NULL
10147 || sec->reloc_count == relax_info->relocs_count);
10149 if (relax_info->allocated_relocs_count == 0)
10150 new_relocs_count = (sec->reloc_count + 2) * 2;
10152 new_relocs_count = (relax_info->allocated_relocs_count + 2) * 2;
10154 new_relocs = (Elf_Internal_Rela *)
10155 bfd_zmalloc (sizeof (Elf_Internal_Rela) * (new_relocs_count));
10159 /* We could handle this more quickly by finding the split point. */
10160 if (insert_at != 0)
10161 memcpy (new_relocs, *internal_relocs_p,
10162 insert_at * sizeof (Elf_Internal_Rela));
10164 new_relocs[insert_at] = this_rela;
10166 if (insert_at != sec->reloc_count)
10167 memcpy (new_relocs + insert_at + 1,
10168 (*internal_relocs_p) + insert_at,
10169 (sec->reloc_count - insert_at)
10170 * sizeof (Elf_Internal_Rela));
10172 if (*internal_relocs_p != relax_info->allocated_relocs)
10174 /* The first time we re-allocate, we can only free the
10175 old relocs if they were allocated with bfd_malloc.
10176 This is not true when keep_memory is in effect. */
10177 if (!link_info->keep_memory)
10178 free (*internal_relocs_p);
10181 free (*internal_relocs_p);
10182 relax_info->allocated_relocs = new_relocs;
10183 relax_info->allocated_relocs_count = new_relocs_count;
10184 elf_section_data (sec)->relocs = new_relocs;
10185 sec->reloc_count++;
10186 relax_info->relocs_count = sec->reloc_count;
10187 *internal_relocs_p = new_relocs;
10191 if (insert_at != sec->reloc_count)
10194 for (idx = sec->reloc_count; idx > insert_at; idx--)
10195 (*internal_relocs_p)[idx] = (*internal_relocs_p)[idx-1];
10197 (*internal_relocs_p)[insert_at] = this_rela;
10198 sec->reloc_count++;
10199 if (relax_info->allocated_relocs)
10200 relax_info->relocs_count = sec->reloc_count;
10207 /* This is similar to relax_section except that when a target is moved,
10208 we shift addresses up. We also need to modify the size. This
10209 algorithm does NOT allow for relocations into the middle of the
10210 property sections. */
10213 relax_property_section (bfd *abfd,
10215 struct bfd_link_info *link_info)
10217 Elf_Internal_Rela *internal_relocs;
10218 bfd_byte *contents;
10220 bfd_boolean ok = TRUE;
10221 bfd_boolean is_full_prop_section;
10222 size_t last_zfill_target_offset = 0;
10223 asection *last_zfill_target_sec = NULL;
10224 bfd_size_type sec_size;
10225 bfd_size_type entry_size;
10227 sec_size = bfd_get_section_limit (abfd, sec);
10228 internal_relocs = retrieve_internal_relocs (abfd, sec,
10229 link_info->keep_memory);
10230 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
10231 if (contents == NULL && sec_size != 0)
10237 is_full_prop_section = xtensa_is_proptable_section (sec);
10238 if (is_full_prop_section)
10243 if (internal_relocs)
10245 for (i = 0; i < sec->reloc_count; i++)
10247 Elf_Internal_Rela *irel;
10248 xtensa_relax_info *target_relax_info;
10250 asection *target_sec;
10252 bfd_byte *size_p, *flags_p;
10254 /* Locally change the source address.
10255 Translate the target to the new target address.
10256 If it points to this section and has been removed, MOVE IT.
10257 Also, don't forget to modify the associated SIZE at
10260 irel = &internal_relocs[i];
10261 r_type = ELF32_R_TYPE (irel->r_info);
10262 if (r_type == R_XTENSA_NONE)
10265 /* Find the literal value. */
10266 r_reloc_init (&val.r_rel, abfd, irel, contents, sec_size);
10267 size_p = &contents[irel->r_offset + 4];
10269 if (is_full_prop_section)
10270 flags_p = &contents[irel->r_offset + 8];
10271 BFD_ASSERT (irel->r_offset + entry_size <= sec_size);
10273 target_sec = r_reloc_get_section (&val.r_rel);
10274 target_relax_info = get_xtensa_relax_info (target_sec);
10276 if (target_relax_info
10277 && (target_relax_info->is_relaxable_literal_section
10278 || target_relax_info->is_relaxable_asm_section ))
10280 /* Translate the relocation's destination. */
10281 bfd_vma old_offset = val.r_rel.target_offset;
10282 bfd_vma new_offset;
10283 long old_size, new_size;
10284 int removed_by_old_offset =
10285 removed_by_actions_map (&target_relax_info->action_list,
10286 old_offset, FALSE);
10287 new_offset = old_offset - removed_by_old_offset;
10289 /* Assert that we are not out of bounds. */
10290 old_size = bfd_get_32 (abfd, size_p);
10291 new_size = old_size;
10295 /* Only the first zero-sized unreachable entry is
10296 allowed to expand. In this case the new offset
10297 should be the offset before the fill and the new
10298 size is the expansion size. For other zero-sized
10299 entries the resulting size should be zero with an
10300 offset before or after the fill address depending
10301 on whether the expanding unreachable entry
10303 if (last_zfill_target_sec == 0
10304 || last_zfill_target_sec != target_sec
10305 || last_zfill_target_offset != old_offset)
10307 bfd_vma new_end_offset = new_offset;
10309 /* Recompute the new_offset, but this time don't
10310 include any fill inserted by relaxation. */
10311 removed_by_old_offset =
10312 removed_by_actions_map (&target_relax_info->action_list,
10314 new_offset = old_offset - removed_by_old_offset;
10316 /* If it is not unreachable and we have not yet
10317 seen an unreachable at this address, place it
10318 before the fill address. */
10319 if (flags_p && (bfd_get_32 (abfd, flags_p)
10320 & XTENSA_PROP_UNREACHABLE) != 0)
10322 new_size = new_end_offset - new_offset;
10324 last_zfill_target_sec = target_sec;
10325 last_zfill_target_offset = old_offset;
10331 int removed_by_old_offset_size =
10332 removed_by_actions_map (&target_relax_info->action_list,
10333 old_offset + old_size, TRUE);
10334 new_size -= removed_by_old_offset_size - removed_by_old_offset;
10337 if (new_size != old_size)
10339 bfd_put_32 (abfd, new_size, size_p);
10340 pin_contents (sec, contents);
10343 if (new_offset != old_offset)
10345 bfd_vma diff = new_offset - old_offset;
10346 irel->r_addend += diff;
10347 pin_internal_relocs (sec, internal_relocs);
10353 /* Combine adjacent property table entries. This is also done in
10354 finish_dynamic_sections() but at that point it's too late to
10355 reclaim the space in the output section, so we do this twice. */
10357 if (internal_relocs && (!bfd_link_relocatable (link_info)
10358 || xtensa_is_littable_section (sec)))
10360 Elf_Internal_Rela *last_irel = NULL;
10361 Elf_Internal_Rela *irel, *next_rel, *rel_end;
10362 int removed_bytes = 0;
10364 flagword predef_flags;
10366 predef_flags = xtensa_get_property_predef_flags (sec);
10368 /* Walk over memory and relocations at the same time.
10369 This REQUIRES that the internal_relocs be sorted by offset. */
10370 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
10371 internal_reloc_compare);
10373 pin_internal_relocs (sec, internal_relocs);
10374 pin_contents (sec, contents);
10376 next_rel = internal_relocs;
10377 rel_end = internal_relocs + sec->reloc_count;
10379 BFD_ASSERT (sec->size % entry_size == 0);
10381 for (offset = 0; offset < sec->size; offset += entry_size)
10383 Elf_Internal_Rela *offset_rel, *extra_rel;
10384 bfd_vma bytes_to_remove, size, actual_offset;
10385 bfd_boolean remove_this_rel;
10388 /* Find the first relocation for the entry at the current offset.
10389 Adjust the offsets of any extra relocations for the previous
10394 for (irel = next_rel; irel < rel_end; irel++)
10396 if ((irel->r_offset == offset
10397 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10398 || irel->r_offset > offset)
10403 irel->r_offset -= removed_bytes;
10407 /* Find the next relocation (if there are any left). */
10411 for (irel = offset_rel + 1; irel < rel_end; irel++)
10413 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10421 /* Check if there are relocations on the current entry. There
10422 should usually be a relocation on the offset field. If there
10423 are relocations on the size or flags, then we can't optimize
10424 this entry. Also, find the next relocation to examine on the
10428 if (offset_rel->r_offset >= offset + entry_size)
10430 next_rel = offset_rel;
10431 /* There are no relocations on the current entry, but we
10432 might still be able to remove it if the size is zero. */
10435 else if (offset_rel->r_offset > offset
10437 && extra_rel->r_offset < offset + entry_size))
10439 /* There is a relocation on the size or flags, so we can't
10440 do anything with this entry. Continue with the next. */
10441 next_rel = offset_rel;
10446 BFD_ASSERT (offset_rel->r_offset == offset);
10447 offset_rel->r_offset -= removed_bytes;
10448 next_rel = offset_rel + 1;
10454 remove_this_rel = FALSE;
10455 bytes_to_remove = 0;
10456 actual_offset = offset - removed_bytes;
10457 size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
10459 if (is_full_prop_section)
10460 flags = bfd_get_32 (abfd, &contents[actual_offset + 8]);
10462 flags = predef_flags;
10465 && (flags & XTENSA_PROP_ALIGN) == 0
10466 && (flags & XTENSA_PROP_UNREACHABLE) == 0)
10468 /* Always remove entries with zero size and no alignment. */
10469 bytes_to_remove = entry_size;
10471 remove_this_rel = TRUE;
10473 else if (offset_rel
10474 && ELF32_R_TYPE (offset_rel->r_info) == R_XTENSA_32)
10478 flagword old_flags;
10480 bfd_get_32 (abfd, &contents[last_irel->r_offset + 4]);
10481 bfd_vma old_address =
10482 (last_irel->r_addend
10483 + bfd_get_32 (abfd, &contents[last_irel->r_offset]));
10484 bfd_vma new_address =
10485 (offset_rel->r_addend
10486 + bfd_get_32 (abfd, &contents[actual_offset]));
10487 if (is_full_prop_section)
10488 old_flags = bfd_get_32
10489 (abfd, &contents[last_irel->r_offset + 8]);
10491 old_flags = predef_flags;
10493 if ((ELF32_R_SYM (offset_rel->r_info)
10494 == ELF32_R_SYM (last_irel->r_info))
10495 && old_address + old_size == new_address
10496 && old_flags == flags
10497 && (old_flags & XTENSA_PROP_INSN_BRANCH_TARGET) == 0
10498 && (old_flags & XTENSA_PROP_INSN_LOOP_TARGET) == 0)
10500 /* Fix the old size. */
10501 bfd_put_32 (abfd, old_size + size,
10502 &contents[last_irel->r_offset + 4]);
10503 bytes_to_remove = entry_size;
10504 remove_this_rel = TRUE;
10507 last_irel = offset_rel;
10510 last_irel = offset_rel;
10513 if (remove_this_rel)
10515 offset_rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
10516 offset_rel->r_offset = 0;
10519 if (bytes_to_remove != 0)
10521 removed_bytes += bytes_to_remove;
10522 if (offset + bytes_to_remove < sec->size)
10523 memmove (&contents[actual_offset],
10524 &contents[actual_offset + bytes_to_remove],
10525 sec->size - offset - bytes_to_remove);
10531 /* Fix up any extra relocations on the last entry. */
10532 for (irel = next_rel; irel < rel_end; irel++)
10533 irel->r_offset -= removed_bytes;
10535 /* Clear the removed bytes. */
10536 memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
10538 if (sec->rawsize == 0)
10539 sec->rawsize = sec->size;
10540 sec->size -= removed_bytes;
10542 if (xtensa_is_littable_section (sec))
10544 asection *sgotloc = elf_xtensa_hash_table (link_info)->sgotloc;
10546 sgotloc->size -= removed_bytes;
10552 release_internal_relocs (sec, internal_relocs);
10553 release_contents (sec, contents);
10558 /* Third relaxation pass. */
10560 /* Change symbol values to account for removed literals. */
10563 relax_section_symbols (bfd *abfd, asection *sec)
10565 xtensa_relax_info *relax_info;
10566 unsigned int sec_shndx;
10567 Elf_Internal_Shdr *symtab_hdr;
10568 Elf_Internal_Sym *isymbuf;
10569 unsigned i, num_syms, num_locals;
10571 relax_info = get_xtensa_relax_info (sec);
10572 BFD_ASSERT (relax_info);
10574 if (!relax_info->is_relaxable_literal_section
10575 && !relax_info->is_relaxable_asm_section)
10578 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
10580 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10581 isymbuf = retrieve_local_syms (abfd);
10583 num_syms = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
10584 num_locals = symtab_hdr->sh_info;
10586 /* Adjust the local symbols defined in this section. */
10587 for (i = 0; i < num_locals; i++)
10589 Elf_Internal_Sym *isym = &isymbuf[i];
10591 if (isym->st_shndx == sec_shndx)
10593 bfd_vma orig_addr = isym->st_value;
10594 int removed = removed_by_actions_map (&relax_info->action_list,
10597 isym->st_value -= removed;
10598 if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC)
10600 removed_by_actions_map (&relax_info->action_list,
10601 orig_addr + isym->st_size, FALSE) -
10606 /* Now adjust the global symbols defined in this section. */
10607 for (i = 0; i < (num_syms - num_locals); i++)
10609 struct elf_link_hash_entry *sym_hash;
10611 sym_hash = elf_sym_hashes (abfd)[i];
10613 if (sym_hash->root.type == bfd_link_hash_warning)
10614 sym_hash = (struct elf_link_hash_entry *) sym_hash->root.u.i.link;
10616 if ((sym_hash->root.type == bfd_link_hash_defined
10617 || sym_hash->root.type == bfd_link_hash_defweak)
10618 && sym_hash->root.u.def.section == sec)
10620 bfd_vma orig_addr = sym_hash->root.u.def.value;
10621 int removed = removed_by_actions_map (&relax_info->action_list,
10624 sym_hash->root.u.def.value -= removed;
10626 if (sym_hash->type == STT_FUNC)
10628 removed_by_actions_map (&relax_info->action_list,
10629 orig_addr + sym_hash->size, FALSE) -
10638 /* "Fix" handling functions, called while performing relocations. */
10641 do_fix_for_relocatable_link (Elf_Internal_Rela *rel,
10643 asection *input_section,
10644 bfd_byte *contents)
10647 asection *sec, *old_sec;
10648 bfd_vma old_offset;
10649 int r_type = ELF32_R_TYPE (rel->r_info);
10650 reloc_bfd_fix *fix;
10652 if (r_type == R_XTENSA_NONE)
10655 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10659 r_reloc_init (&r_rel, input_bfd, rel, contents,
10660 bfd_get_section_limit (input_bfd, input_section));
10661 old_sec = r_reloc_get_section (&r_rel);
10662 old_offset = r_rel.target_offset;
10664 if (!old_sec || !r_reloc_is_defined (&r_rel))
10666 if (r_type != R_XTENSA_ASM_EXPAND)
10669 /* xgettext:c-format */
10670 (_("%pB(%pA+%#" PRIx64 "): unexpected fix for %s relocation"),
10671 input_bfd, input_section, (uint64_t) rel->r_offset,
10672 elf_howto_table[r_type].name);
10675 /* Leave it be. Resolution will happen in a later stage. */
10679 sec = fix->target_sec;
10680 rel->r_addend += ((sec->output_offset + fix->target_offset)
10681 - (old_sec->output_offset + old_offset));
10688 do_fix_for_final_link (Elf_Internal_Rela *rel,
10690 asection *input_section,
10691 bfd_byte *contents,
10692 bfd_vma *relocationp)
10695 int r_type = ELF32_R_TYPE (rel->r_info);
10696 reloc_bfd_fix *fix;
10697 bfd_vma fixup_diff;
10699 if (r_type == R_XTENSA_NONE)
10702 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10706 sec = fix->target_sec;
10708 fixup_diff = rel->r_addend;
10709 if (elf_howto_table[fix->src_type].partial_inplace)
10711 bfd_vma inplace_val;
10712 BFD_ASSERT (fix->src_offset
10713 < bfd_get_section_limit (input_bfd, input_section));
10714 inplace_val = bfd_get_32 (input_bfd, &contents[fix->src_offset]);
10715 fixup_diff += inplace_val;
10718 *relocationp = (sec->output_section->vma
10719 + sec->output_offset
10720 + fix->target_offset - fixup_diff);
10724 /* Miscellaneous utility functions.... */
10727 elf_xtensa_get_plt_section (struct bfd_link_info *info, int chunk)
10733 return elf_hash_table (info)->splt;
10735 dynobj = elf_hash_table (info)->dynobj;
10736 sprintf (plt_name, ".plt.%u", chunk);
10737 return bfd_get_linker_section (dynobj, plt_name);
10742 elf_xtensa_get_gotplt_section (struct bfd_link_info *info, int chunk)
10748 return elf_hash_table (info)->sgotplt;
10750 dynobj = elf_hash_table (info)->dynobj;
10751 sprintf (got_name, ".got.plt.%u", chunk);
10752 return bfd_get_linker_section (dynobj, got_name);
10756 /* Get the input section for a given symbol index.
10758 . a section symbol, return the section;
10759 . a common symbol, return the common section;
10760 . an undefined symbol, return the undefined section;
10761 . an indirect symbol, follow the links;
10762 . an absolute value, return the absolute section. */
10765 get_elf_r_symndx_section (bfd *abfd, unsigned long r_symndx)
10767 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10768 asection *target_sec = NULL;
10769 if (r_symndx < symtab_hdr->sh_info)
10771 Elf_Internal_Sym *isymbuf;
10772 unsigned int section_index;
10774 isymbuf = retrieve_local_syms (abfd);
10775 section_index = isymbuf[r_symndx].st_shndx;
10777 if (section_index == SHN_UNDEF)
10778 target_sec = bfd_und_section_ptr;
10779 else if (section_index == SHN_ABS)
10780 target_sec = bfd_abs_section_ptr;
10781 else if (section_index == SHN_COMMON)
10782 target_sec = bfd_com_section_ptr;
10784 target_sec = bfd_section_from_elf_index (abfd, section_index);
10788 unsigned long indx = r_symndx - symtab_hdr->sh_info;
10789 struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
10791 while (h->root.type == bfd_link_hash_indirect
10792 || h->root.type == bfd_link_hash_warning)
10793 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10795 switch (h->root.type)
10797 case bfd_link_hash_defined:
10798 case bfd_link_hash_defweak:
10799 target_sec = h->root.u.def.section;
10801 case bfd_link_hash_common:
10802 target_sec = bfd_com_section_ptr;
10804 case bfd_link_hash_undefined:
10805 case bfd_link_hash_undefweak:
10806 target_sec = bfd_und_section_ptr;
10808 default: /* New indirect warning. */
10809 target_sec = bfd_und_section_ptr;
10817 static struct elf_link_hash_entry *
10818 get_elf_r_symndx_hash_entry (bfd *abfd, unsigned long r_symndx)
10820 unsigned long indx;
10821 struct elf_link_hash_entry *h;
10822 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10824 if (r_symndx < symtab_hdr->sh_info)
10827 indx = r_symndx - symtab_hdr->sh_info;
10828 h = elf_sym_hashes (abfd)[indx];
10829 while (h->root.type == bfd_link_hash_indirect
10830 || h->root.type == bfd_link_hash_warning)
10831 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10836 /* Get the section-relative offset for a symbol number. */
10839 get_elf_r_symndx_offset (bfd *abfd, unsigned long r_symndx)
10841 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10842 bfd_vma offset = 0;
10844 if (r_symndx < symtab_hdr->sh_info)
10846 Elf_Internal_Sym *isymbuf;
10847 isymbuf = retrieve_local_syms (abfd);
10848 offset = isymbuf[r_symndx].st_value;
10852 unsigned long indx = r_symndx - symtab_hdr->sh_info;
10853 struct elf_link_hash_entry *h =
10854 elf_sym_hashes (abfd)[indx];
10856 while (h->root.type == bfd_link_hash_indirect
10857 || h->root.type == bfd_link_hash_warning)
10858 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10859 if (h->root.type == bfd_link_hash_defined
10860 || h->root.type == bfd_link_hash_defweak)
10861 offset = h->root.u.def.value;
10868 is_reloc_sym_weak (bfd *abfd, Elf_Internal_Rela *rel)
10870 unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
10871 struct elf_link_hash_entry *h;
10873 h = get_elf_r_symndx_hash_entry (abfd, r_symndx);
10874 if (h && h->root.type == bfd_link_hash_defweak)
10881 pcrel_reloc_fits (xtensa_opcode opc,
10883 bfd_vma self_address,
10884 bfd_vma dest_address)
10886 xtensa_isa isa = xtensa_default_isa;
10887 uint32 valp = dest_address;
10888 if (xtensa_operand_do_reloc (isa, opc, opnd, &valp, self_address)
10889 || xtensa_operand_encode (isa, opc, opnd, &valp))
10896 xtensa_is_property_section (asection *sec)
10898 if (xtensa_is_insntable_section (sec)
10899 || xtensa_is_littable_section (sec)
10900 || xtensa_is_proptable_section (sec))
10908 xtensa_is_insntable_section (asection *sec)
10910 if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
10911 || CONST_STRNEQ (sec->name, ".gnu.linkonce.x."))
10919 xtensa_is_littable_section (asection *sec)
10921 if (CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME)
10922 || CONST_STRNEQ (sec->name, ".gnu.linkonce.p."))
10930 xtensa_is_proptable_section (asection *sec)
10932 if (CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME)
10933 || CONST_STRNEQ (sec->name, ".gnu.linkonce.prop."))
10941 internal_reloc_compare (const void *ap, const void *bp)
10943 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
10944 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
10946 if (a->r_offset != b->r_offset)
10947 return (a->r_offset - b->r_offset);
10949 /* We don't need to sort on these criteria for correctness,
10950 but enforcing a more strict ordering prevents unstable qsort
10951 from behaving differently with different implementations.
10952 Without the code below we get correct but different results
10953 on Solaris 2.7 and 2.8. We would like to always produce the
10954 same results no matter the host. */
10956 if (a->r_info != b->r_info)
10957 return (a->r_info - b->r_info);
10959 return (a->r_addend - b->r_addend);
10964 internal_reloc_matches (const void *ap, const void *bp)
10966 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
10967 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
10969 /* Check if one entry overlaps with the other; this shouldn't happen
10970 except when searching for a match. */
10971 return (a->r_offset - b->r_offset);
10975 /* Predicate function used to look up a section in a particular group. */
10978 match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
10980 const char *gname = inf;
10981 const char *group_name = elf_group_name (sec);
10983 return (group_name == gname
10984 || (group_name != NULL
10986 && strcmp (group_name, gname) == 0));
10990 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
10993 xtensa_property_section_name (asection *sec, const char *base_name)
10995 const char *suffix, *group_name;
10996 char *prop_sec_name;
10998 group_name = elf_group_name (sec);
11001 suffix = strrchr (sec->name, '.');
11002 if (suffix == sec->name)
11004 prop_sec_name = (char *) bfd_malloc (strlen (base_name) + 1
11005 + (suffix ? strlen (suffix) : 0));
11006 strcpy (prop_sec_name, base_name);
11008 strcat (prop_sec_name, suffix);
11010 else if (strncmp (sec->name, ".gnu.linkonce.", linkonce_len) == 0)
11012 char *linkonce_kind = 0;
11014 if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
11015 linkonce_kind = "x.";
11016 else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
11017 linkonce_kind = "p.";
11018 else if (strcmp (base_name, XTENSA_PROP_SEC_NAME) == 0)
11019 linkonce_kind = "prop.";
11023 prop_sec_name = (char *) bfd_malloc (strlen (sec->name)
11024 + strlen (linkonce_kind) + 1);
11025 memcpy (prop_sec_name, ".gnu.linkonce.", linkonce_len);
11026 strcpy (prop_sec_name + linkonce_len, linkonce_kind);
11028 suffix = sec->name + linkonce_len;
11029 /* For backward compatibility, replace "t." instead of inserting
11030 the new linkonce_kind (but not for "prop" sections). */
11031 if (CONST_STRNEQ (suffix, "t.") && linkonce_kind[1] == '.')
11033 strcat (prop_sec_name + linkonce_len, suffix);
11036 prop_sec_name = strdup (base_name);
11038 return prop_sec_name;
11043 xtensa_get_property_section (asection *sec, const char *base_name)
11045 char *prop_sec_name;
11046 asection *prop_sec;
11048 prop_sec_name = xtensa_property_section_name (sec, base_name);
11049 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11050 match_section_group,
11051 (void *) elf_group_name (sec));
11052 free (prop_sec_name);
11058 xtensa_make_property_section (asection *sec, const char *base_name)
11060 char *prop_sec_name;
11061 asection *prop_sec;
11063 /* Check if the section already exists. */
11064 prop_sec_name = xtensa_property_section_name (sec, base_name);
11065 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11066 match_section_group,
11067 (void *) elf_group_name (sec));
11068 /* If not, create it. */
11071 flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
11072 flags |= (bfd_get_section_flags (sec->owner, sec)
11073 & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES));
11075 prop_sec = bfd_make_section_anyway_with_flags
11076 (sec->owner, strdup (prop_sec_name), flags);
11080 elf_group_name (prop_sec) = elf_group_name (sec);
11083 free (prop_sec_name);
11089 xtensa_get_property_predef_flags (asection *sec)
11091 if (xtensa_is_insntable_section (sec))
11092 return (XTENSA_PROP_INSN
11093 | XTENSA_PROP_NO_TRANSFORM
11094 | XTENSA_PROP_INSN_NO_REORDER);
11096 if (xtensa_is_littable_section (sec))
11097 return (XTENSA_PROP_LITERAL
11098 | XTENSA_PROP_NO_TRANSFORM
11099 | XTENSA_PROP_INSN_NO_REORDER);
11105 /* Other functions called directly by the linker. */
11108 xtensa_callback_required_dependence (bfd *abfd,
11110 struct bfd_link_info *link_info,
11111 deps_callback_t callback,
11114 Elf_Internal_Rela *internal_relocs;
11115 bfd_byte *contents;
11117 bfd_boolean ok = TRUE;
11118 bfd_size_type sec_size;
11120 sec_size = bfd_get_section_limit (abfd, sec);
11122 /* ".plt*" sections have no explicit relocations but they contain L32R
11123 instructions that reference the corresponding ".got.plt*" sections. */
11124 if ((sec->flags & SEC_LINKER_CREATED) != 0
11125 && CONST_STRNEQ (sec->name, ".plt"))
11129 /* Find the corresponding ".got.plt*" section. */
11130 if (sec->name[4] == '\0')
11131 sgotplt = elf_hash_table (link_info)->sgotplt;
11137 BFD_ASSERT (sec->name[4] == '.');
11138 chunk = strtol (&sec->name[5], NULL, 10);
11140 sprintf (got_name, ".got.plt.%u", chunk);
11141 sgotplt = bfd_get_linker_section (sec->owner, got_name);
11143 BFD_ASSERT (sgotplt);
11145 /* Assume worst-case offsets: L32R at the very end of the ".plt"
11146 section referencing a literal at the very beginning of
11147 ".got.plt". This is very close to the real dependence, anyway. */
11148 (*callback) (sec, sec_size, sgotplt, 0, closure);
11151 /* Only ELF files are supported for Xtensa. Check here to avoid a segfault
11152 when building uclibc, which runs "ld -b binary /dev/null". */
11153 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
11156 internal_relocs = retrieve_internal_relocs (abfd, sec,
11157 link_info->keep_memory);
11158 if (internal_relocs == NULL
11159 || sec->reloc_count == 0)
11162 /* Cache the contents for the duration of this scan. */
11163 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
11164 if (contents == NULL && sec_size != 0)
11170 if (!xtensa_default_isa)
11171 xtensa_default_isa = xtensa_isa_init (0, 0);
11173 for (i = 0; i < sec->reloc_count; i++)
11175 Elf_Internal_Rela *irel = &internal_relocs[i];
11176 if (is_l32r_relocation (abfd, sec, contents, irel))
11179 asection *target_sec;
11180 bfd_vma target_offset;
11182 r_reloc_init (&l32r_rel, abfd, irel, contents, sec_size);
11185 /* L32Rs must be local to the input file. */
11186 if (r_reloc_is_defined (&l32r_rel))
11188 target_sec = r_reloc_get_section (&l32r_rel);
11189 target_offset = l32r_rel.target_offset;
11191 (*callback) (sec, irel->r_offset, target_sec, target_offset,
11197 release_internal_relocs (sec, internal_relocs);
11198 release_contents (sec, contents);
11202 /* The default literal sections should always be marked as "code" (i.e.,
11203 SHF_EXECINSTR). This is particularly important for the Linux kernel
11204 module loader so that the literals are not placed after the text. */
11205 static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
11207 { STRING_COMMA_LEN (".fini.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11208 { STRING_COMMA_LEN (".init.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11209 { STRING_COMMA_LEN (".literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11210 { STRING_COMMA_LEN (".xtensa.info"), 0, SHT_NOTE, 0 },
11211 { NULL, 0, 0, 0, 0 }
11214 #define ELF_TARGET_ID XTENSA_ELF_DATA
11216 #define TARGET_LITTLE_SYM xtensa_elf32_le_vec
11217 #define TARGET_LITTLE_NAME "elf32-xtensa-le"
11218 #define TARGET_BIG_SYM xtensa_elf32_be_vec
11219 #define TARGET_BIG_NAME "elf32-xtensa-be"
11220 #define ELF_ARCH bfd_arch_xtensa
11222 #define ELF_MACHINE_CODE EM_XTENSA
11223 #define ELF_MACHINE_ALT1 EM_XTENSA_OLD
11225 #define ELF_MAXPAGESIZE 0x1000
11226 #endif /* ELF_ARCH */
11228 #define elf_backend_can_gc_sections 1
11229 #define elf_backend_can_refcount 1
11230 #define elf_backend_plt_readonly 1
11231 #define elf_backend_got_header_size 4
11232 #define elf_backend_want_dynbss 0
11233 #define elf_backend_want_got_plt 1
11234 #define elf_backend_dtrel_excludes_plt 1
11236 #define elf_info_to_howto elf_xtensa_info_to_howto_rela
11238 #define bfd_elf32_mkobject elf_xtensa_mkobject
11240 #define bfd_elf32_bfd_merge_private_bfd_data elf_xtensa_merge_private_bfd_data
11241 #define bfd_elf32_new_section_hook elf_xtensa_new_section_hook
11242 #define bfd_elf32_bfd_print_private_bfd_data elf_xtensa_print_private_bfd_data
11243 #define bfd_elf32_bfd_relax_section elf_xtensa_relax_section
11244 #define bfd_elf32_bfd_reloc_type_lookup elf_xtensa_reloc_type_lookup
11245 #define bfd_elf32_bfd_reloc_name_lookup \
11246 elf_xtensa_reloc_name_lookup
11247 #define bfd_elf32_bfd_set_private_flags elf_xtensa_set_private_flags
11248 #define bfd_elf32_bfd_link_hash_table_create elf_xtensa_link_hash_table_create
11250 #define elf_backend_adjust_dynamic_symbol elf_xtensa_adjust_dynamic_symbol
11251 #define elf_backend_check_relocs elf_xtensa_check_relocs
11252 #define elf_backend_create_dynamic_sections elf_xtensa_create_dynamic_sections
11253 #define elf_backend_discard_info elf_xtensa_discard_info
11254 #define elf_backend_ignore_discarded_relocs elf_xtensa_ignore_discarded_relocs
11255 #define elf_backend_final_write_processing elf_xtensa_final_write_processing
11256 #define elf_backend_finish_dynamic_sections elf_xtensa_finish_dynamic_sections
11257 #define elf_backend_finish_dynamic_symbol elf_xtensa_finish_dynamic_symbol
11258 #define elf_backend_gc_mark_hook elf_xtensa_gc_mark_hook
11259 #define elf_backend_grok_prstatus elf_xtensa_grok_prstatus
11260 #define elf_backend_grok_psinfo elf_xtensa_grok_psinfo
11261 #define elf_backend_hide_symbol elf_xtensa_hide_symbol
11262 #define elf_backend_object_p elf_xtensa_object_p
11263 #define elf_backend_reloc_type_class elf_xtensa_reloc_type_class
11264 #define elf_backend_relocate_section elf_xtensa_relocate_section
11265 #define elf_backend_size_dynamic_sections elf_xtensa_size_dynamic_sections
11266 #define elf_backend_always_size_sections elf_xtensa_always_size_sections
11267 #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
11268 #define elf_backend_special_sections elf_xtensa_special_sections
11269 #define elf_backend_action_discarded elf_xtensa_action_discarded
11270 #define elf_backend_copy_indirect_symbol elf_xtensa_copy_indirect_symbol
11272 #include "elf32-target.h"