1 /* Xtensa-specific support for 32-bit ELF.
2 Copyright (C) 2003-2015 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 extern asection *xtensa_make_property_section (asection *, const char *);
114 static flagword xtensa_get_property_predef_flags (asection *);
116 /* Other functions called directly by the linker. */
118 typedef void (*deps_callback_t)
119 (asection *, bfd_vma, asection *, bfd_vma, void *);
120 extern bfd_boolean xtensa_callback_required_dependence
121 (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *);
124 /* Globally visible flag for choosing size optimization of NOP removal
125 instead of branch-target-aware minimization for NOP removal.
126 When nonzero, narrow all instructions and remove all NOPs possible
127 around longcall expansions. */
129 int elf32xtensa_size_opt;
132 /* The "new_section_hook" is used to set up a per-section
133 "xtensa_relax_info" data structure with additional information used
134 during relaxation. */
136 typedef struct xtensa_relax_info_struct xtensa_relax_info;
139 /* The GNU tools do not easily allow extending interfaces to pass around
140 the pointer to the Xtensa ISA information, so instead we add a global
141 variable here (in BFD) that can be used by any of the tools that need
144 xtensa_isa xtensa_default_isa;
147 /* When this is true, relocations may have been modified to refer to
148 symbols from other input files. The per-section list of "fix"
149 records needs to be checked when resolving relocations. */
151 static bfd_boolean relaxing_section = FALSE;
153 /* When this is true, during final links, literals that cannot be
154 coalesced and their relocations may be moved to other sections. */
156 int elf32xtensa_no_literal_movement = 1;
158 /* Rename one of the generic section flags to better document how it
160 /* Whether relocations have been processed. */
161 #define reloc_done sec_flg0
163 static reloc_howto_type elf_howto_table[] =
165 HOWTO (R_XTENSA_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
166 bfd_elf_xtensa_reloc, "R_XTENSA_NONE",
168 HOWTO (R_XTENSA_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
169 bfd_elf_xtensa_reloc, "R_XTENSA_32",
170 TRUE, 0xffffffff, 0xffffffff, FALSE),
172 /* Replace a 32-bit value with a value from the runtime linker (only
173 used by linker-generated stub functions). The r_addend value is
174 special: 1 means to substitute a pointer to the runtime linker's
175 dynamic resolver function; 2 means to substitute the link map for
176 the shared object. */
177 HOWTO (R_XTENSA_RTLD, 0, 2, 32, FALSE, 0, complain_overflow_dont,
178 NULL, "R_XTENSA_RTLD", FALSE, 0, 0, FALSE),
180 HOWTO (R_XTENSA_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
181 bfd_elf_generic_reloc, "R_XTENSA_GLOB_DAT",
182 FALSE, 0, 0xffffffff, FALSE),
183 HOWTO (R_XTENSA_JMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
184 bfd_elf_generic_reloc, "R_XTENSA_JMP_SLOT",
185 FALSE, 0, 0xffffffff, FALSE),
186 HOWTO (R_XTENSA_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
187 bfd_elf_generic_reloc, "R_XTENSA_RELATIVE",
188 FALSE, 0, 0xffffffff, FALSE),
189 HOWTO (R_XTENSA_PLT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
190 bfd_elf_xtensa_reloc, "R_XTENSA_PLT",
191 FALSE, 0, 0xffffffff, FALSE),
195 /* Old relocations for backward compatibility. */
196 HOWTO (R_XTENSA_OP0, 0, 0, 0, TRUE, 0, complain_overflow_dont,
197 bfd_elf_xtensa_reloc, "R_XTENSA_OP0", FALSE, 0, 0, TRUE),
198 HOWTO (R_XTENSA_OP1, 0, 0, 0, TRUE, 0, complain_overflow_dont,
199 bfd_elf_xtensa_reloc, "R_XTENSA_OP1", FALSE, 0, 0, TRUE),
200 HOWTO (R_XTENSA_OP2, 0, 0, 0, TRUE, 0, complain_overflow_dont,
201 bfd_elf_xtensa_reloc, "R_XTENSA_OP2", FALSE, 0, 0, TRUE),
203 /* Assembly auto-expansion. */
204 HOWTO (R_XTENSA_ASM_EXPAND, 0, 0, 0, TRUE, 0, complain_overflow_dont,
205 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_EXPAND", FALSE, 0, 0, TRUE),
206 /* Relax assembly auto-expansion. */
207 HOWTO (R_XTENSA_ASM_SIMPLIFY, 0, 0, 0, TRUE, 0, complain_overflow_dont,
208 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_SIMPLIFY", FALSE, 0, 0, TRUE),
212 HOWTO (R_XTENSA_32_PCREL, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
213 bfd_elf_xtensa_reloc, "R_XTENSA_32_PCREL",
214 FALSE, 0, 0xffffffff, TRUE),
216 /* GNU extension to record C++ vtable hierarchy. */
217 HOWTO (R_XTENSA_GNU_VTINHERIT, 0, 2, 0, FALSE, 0, complain_overflow_dont,
218 NULL, "R_XTENSA_GNU_VTINHERIT",
220 /* GNU extension to record C++ vtable member usage. */
221 HOWTO (R_XTENSA_GNU_VTENTRY, 0, 2, 0, FALSE, 0, complain_overflow_dont,
222 _bfd_elf_rel_vtable_reloc_fn, "R_XTENSA_GNU_VTENTRY",
225 /* Relocations for supporting difference of symbols. */
226 HOWTO (R_XTENSA_DIFF8, 0, 0, 8, FALSE, 0, complain_overflow_signed,
227 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF8", FALSE, 0, 0xff, FALSE),
228 HOWTO (R_XTENSA_DIFF16, 0, 1, 16, FALSE, 0, complain_overflow_signed,
229 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF16", FALSE, 0, 0xffff, FALSE),
230 HOWTO (R_XTENSA_DIFF32, 0, 2, 32, FALSE, 0, complain_overflow_signed,
231 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF32", FALSE, 0, 0xffffffff, FALSE),
233 /* General immediate operand relocations. */
234 HOWTO (R_XTENSA_SLOT0_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
235 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_OP", FALSE, 0, 0, TRUE),
236 HOWTO (R_XTENSA_SLOT1_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
237 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_OP", FALSE, 0, 0, TRUE),
238 HOWTO (R_XTENSA_SLOT2_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
239 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_OP", FALSE, 0, 0, TRUE),
240 HOWTO (R_XTENSA_SLOT3_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
241 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_OP", FALSE, 0, 0, TRUE),
242 HOWTO (R_XTENSA_SLOT4_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
243 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_OP", FALSE, 0, 0, TRUE),
244 HOWTO (R_XTENSA_SLOT5_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
245 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_OP", FALSE, 0, 0, TRUE),
246 HOWTO (R_XTENSA_SLOT6_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
247 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_OP", FALSE, 0, 0, TRUE),
248 HOWTO (R_XTENSA_SLOT7_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
249 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_OP", FALSE, 0, 0, TRUE),
250 HOWTO (R_XTENSA_SLOT8_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
251 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_OP", FALSE, 0, 0, TRUE),
252 HOWTO (R_XTENSA_SLOT9_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
253 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_OP", FALSE, 0, 0, TRUE),
254 HOWTO (R_XTENSA_SLOT10_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
255 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_OP", FALSE, 0, 0, TRUE),
256 HOWTO (R_XTENSA_SLOT11_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
257 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_OP", FALSE, 0, 0, TRUE),
258 HOWTO (R_XTENSA_SLOT12_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
259 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_OP", FALSE, 0, 0, TRUE),
260 HOWTO (R_XTENSA_SLOT13_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
261 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_OP", FALSE, 0, 0, TRUE),
262 HOWTO (R_XTENSA_SLOT14_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
263 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_OP", FALSE, 0, 0, TRUE),
265 /* "Alternate" relocations. The meaning of these is opcode-specific. */
266 HOWTO (R_XTENSA_SLOT0_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
267 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_ALT", FALSE, 0, 0, TRUE),
268 HOWTO (R_XTENSA_SLOT1_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
269 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_ALT", FALSE, 0, 0, TRUE),
270 HOWTO (R_XTENSA_SLOT2_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
271 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_ALT", FALSE, 0, 0, TRUE),
272 HOWTO (R_XTENSA_SLOT3_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
273 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_ALT", FALSE, 0, 0, TRUE),
274 HOWTO (R_XTENSA_SLOT4_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
275 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_ALT", FALSE, 0, 0, TRUE),
276 HOWTO (R_XTENSA_SLOT5_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
277 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_ALT", FALSE, 0, 0, TRUE),
278 HOWTO (R_XTENSA_SLOT6_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
279 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_ALT", FALSE, 0, 0, TRUE),
280 HOWTO (R_XTENSA_SLOT7_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
281 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_ALT", FALSE, 0, 0, TRUE),
282 HOWTO (R_XTENSA_SLOT8_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
283 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_ALT", FALSE, 0, 0, TRUE),
284 HOWTO (R_XTENSA_SLOT9_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
285 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_ALT", FALSE, 0, 0, TRUE),
286 HOWTO (R_XTENSA_SLOT10_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
287 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_ALT", FALSE, 0, 0, TRUE),
288 HOWTO (R_XTENSA_SLOT11_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
289 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_ALT", FALSE, 0, 0, TRUE),
290 HOWTO (R_XTENSA_SLOT12_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
291 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_ALT", FALSE, 0, 0, TRUE),
292 HOWTO (R_XTENSA_SLOT13_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
293 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_ALT", FALSE, 0, 0, TRUE),
294 HOWTO (R_XTENSA_SLOT14_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
295 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_ALT", FALSE, 0, 0, TRUE),
297 /* TLS relocations. */
298 HOWTO (R_XTENSA_TLSDESC_FN, 0, 2, 32, FALSE, 0, complain_overflow_dont,
299 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_FN",
300 FALSE, 0, 0xffffffff, FALSE),
301 HOWTO (R_XTENSA_TLSDESC_ARG, 0, 2, 32, FALSE, 0, complain_overflow_dont,
302 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_ARG",
303 FALSE, 0, 0xffffffff, FALSE),
304 HOWTO (R_XTENSA_TLS_DTPOFF, 0, 2, 32, FALSE, 0, complain_overflow_dont,
305 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_DTPOFF",
306 FALSE, 0, 0xffffffff, FALSE),
307 HOWTO (R_XTENSA_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_dont,
308 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_TPOFF",
309 FALSE, 0, 0xffffffff, FALSE),
310 HOWTO (R_XTENSA_TLS_FUNC, 0, 0, 0, FALSE, 0, complain_overflow_dont,
311 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_FUNC",
313 HOWTO (R_XTENSA_TLS_ARG, 0, 0, 0, FALSE, 0, complain_overflow_dont,
314 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_ARG",
316 HOWTO (R_XTENSA_TLS_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
317 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_CALL",
323 fprintf (stderr, "Xtensa bfd reloc lookup %d (%s)\n", code, str)
328 static reloc_howto_type *
329 elf_xtensa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
330 bfd_reloc_code_real_type code)
335 TRACE ("BFD_RELOC_NONE");
336 return &elf_howto_table[(unsigned) R_XTENSA_NONE ];
339 TRACE ("BFD_RELOC_32");
340 return &elf_howto_table[(unsigned) R_XTENSA_32 ];
342 case BFD_RELOC_32_PCREL:
343 TRACE ("BFD_RELOC_32_PCREL");
344 return &elf_howto_table[(unsigned) R_XTENSA_32_PCREL ];
346 case BFD_RELOC_XTENSA_DIFF8:
347 TRACE ("BFD_RELOC_XTENSA_DIFF8");
348 return &elf_howto_table[(unsigned) R_XTENSA_DIFF8 ];
350 case BFD_RELOC_XTENSA_DIFF16:
351 TRACE ("BFD_RELOC_XTENSA_DIFF16");
352 return &elf_howto_table[(unsigned) R_XTENSA_DIFF16 ];
354 case BFD_RELOC_XTENSA_DIFF32:
355 TRACE ("BFD_RELOC_XTENSA_DIFF32");
356 return &elf_howto_table[(unsigned) R_XTENSA_DIFF32 ];
358 case BFD_RELOC_XTENSA_RTLD:
359 TRACE ("BFD_RELOC_XTENSA_RTLD");
360 return &elf_howto_table[(unsigned) R_XTENSA_RTLD ];
362 case BFD_RELOC_XTENSA_GLOB_DAT:
363 TRACE ("BFD_RELOC_XTENSA_GLOB_DAT");
364 return &elf_howto_table[(unsigned) R_XTENSA_GLOB_DAT ];
366 case BFD_RELOC_XTENSA_JMP_SLOT:
367 TRACE ("BFD_RELOC_XTENSA_JMP_SLOT");
368 return &elf_howto_table[(unsigned) R_XTENSA_JMP_SLOT ];
370 case BFD_RELOC_XTENSA_RELATIVE:
371 TRACE ("BFD_RELOC_XTENSA_RELATIVE");
372 return &elf_howto_table[(unsigned) R_XTENSA_RELATIVE ];
374 case BFD_RELOC_XTENSA_PLT:
375 TRACE ("BFD_RELOC_XTENSA_PLT");
376 return &elf_howto_table[(unsigned) R_XTENSA_PLT ];
378 case BFD_RELOC_XTENSA_OP0:
379 TRACE ("BFD_RELOC_XTENSA_OP0");
380 return &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
382 case BFD_RELOC_XTENSA_OP1:
383 TRACE ("BFD_RELOC_XTENSA_OP1");
384 return &elf_howto_table[(unsigned) R_XTENSA_OP1 ];
386 case BFD_RELOC_XTENSA_OP2:
387 TRACE ("BFD_RELOC_XTENSA_OP2");
388 return &elf_howto_table[(unsigned) R_XTENSA_OP2 ];
390 case BFD_RELOC_XTENSA_ASM_EXPAND:
391 TRACE ("BFD_RELOC_XTENSA_ASM_EXPAND");
392 return &elf_howto_table[(unsigned) R_XTENSA_ASM_EXPAND ];
394 case BFD_RELOC_XTENSA_ASM_SIMPLIFY:
395 TRACE ("BFD_RELOC_XTENSA_ASM_SIMPLIFY");
396 return &elf_howto_table[(unsigned) R_XTENSA_ASM_SIMPLIFY ];
398 case BFD_RELOC_VTABLE_INHERIT:
399 TRACE ("BFD_RELOC_VTABLE_INHERIT");
400 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTINHERIT ];
402 case BFD_RELOC_VTABLE_ENTRY:
403 TRACE ("BFD_RELOC_VTABLE_ENTRY");
404 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTENTRY ];
406 case BFD_RELOC_XTENSA_TLSDESC_FN:
407 TRACE ("BFD_RELOC_XTENSA_TLSDESC_FN");
408 return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_FN ];
410 case BFD_RELOC_XTENSA_TLSDESC_ARG:
411 TRACE ("BFD_RELOC_XTENSA_TLSDESC_ARG");
412 return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_ARG ];
414 case BFD_RELOC_XTENSA_TLS_DTPOFF:
415 TRACE ("BFD_RELOC_XTENSA_TLS_DTPOFF");
416 return &elf_howto_table[(unsigned) R_XTENSA_TLS_DTPOFF ];
418 case BFD_RELOC_XTENSA_TLS_TPOFF:
419 TRACE ("BFD_RELOC_XTENSA_TLS_TPOFF");
420 return &elf_howto_table[(unsigned) R_XTENSA_TLS_TPOFF ];
422 case BFD_RELOC_XTENSA_TLS_FUNC:
423 TRACE ("BFD_RELOC_XTENSA_TLS_FUNC");
424 return &elf_howto_table[(unsigned) R_XTENSA_TLS_FUNC ];
426 case BFD_RELOC_XTENSA_TLS_ARG:
427 TRACE ("BFD_RELOC_XTENSA_TLS_ARG");
428 return &elf_howto_table[(unsigned) R_XTENSA_TLS_ARG ];
430 case BFD_RELOC_XTENSA_TLS_CALL:
431 TRACE ("BFD_RELOC_XTENSA_TLS_CALL");
432 return &elf_howto_table[(unsigned) R_XTENSA_TLS_CALL ];
435 if (code >= BFD_RELOC_XTENSA_SLOT0_OP
436 && code <= BFD_RELOC_XTENSA_SLOT14_OP)
438 unsigned n = (R_XTENSA_SLOT0_OP +
439 (code - BFD_RELOC_XTENSA_SLOT0_OP));
440 return &elf_howto_table[n];
443 if (code >= BFD_RELOC_XTENSA_SLOT0_ALT
444 && code <= BFD_RELOC_XTENSA_SLOT14_ALT)
446 unsigned n = (R_XTENSA_SLOT0_ALT +
447 (code - BFD_RELOC_XTENSA_SLOT0_ALT));
448 return &elf_howto_table[n];
458 static reloc_howto_type *
459 elf_xtensa_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
464 for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
465 if (elf_howto_table[i].name != NULL
466 && strcasecmp (elf_howto_table[i].name, r_name) == 0)
467 return &elf_howto_table[i];
473 /* Given an ELF "rela" relocation, find the corresponding howto and record
474 it in the BFD internal arelent representation of the relocation. */
477 elf_xtensa_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
479 Elf_Internal_Rela *dst)
481 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
483 if (r_type >= (unsigned int) R_XTENSA_max)
485 _bfd_error_handler (_("%B: invalid XTENSA reloc number: %d"), abfd, r_type);
488 cache_ptr->howto = &elf_howto_table[r_type];
492 /* Functions for the Xtensa ELF linker. */
494 /* The name of the dynamic interpreter. This is put in the .interp
497 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
499 /* The size in bytes of an entry in the procedure linkage table.
500 (This does _not_ include the space for the literals associated with
503 #define PLT_ENTRY_SIZE 16
505 /* For _really_ large PLTs, we may need to alternate between literals
506 and code to keep the literals within the 256K range of the L32R
507 instructions in the code. It's unlikely that anyone would ever need
508 such a big PLT, but an arbitrary limit on the PLT size would be bad.
509 Thus, we split the PLT into chunks. Since there's very little
510 overhead (2 extra literals) for each chunk, the chunk size is kept
511 small so that the code for handling multiple chunks get used and
512 tested regularly. With 254 entries, there are 1K of literals for
513 each chunk, and that seems like a nice round number. */
515 #define PLT_ENTRIES_PER_CHUNK 254
517 /* PLT entries are actually used as stub functions for lazy symbol
518 resolution. Once the symbol is resolved, the stub function is never
519 invoked. Note: the 32-byte frame size used here cannot be changed
520 without a corresponding change in the runtime linker. */
522 static const bfd_byte elf_xtensa_be_plt_entry[PLT_ENTRY_SIZE] =
524 0x6c, 0x10, 0x04, /* entry sp, 32 */
525 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
526 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
527 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
528 0x0a, 0x80, 0x00, /* jx a8 */
532 static const bfd_byte elf_xtensa_le_plt_entry[PLT_ENTRY_SIZE] =
534 0x36, 0x41, 0x00, /* entry sp, 32 */
535 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
536 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
537 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
538 0xa0, 0x08, 0x00, /* jx a8 */
542 /* The size of the thread control block. */
545 struct elf_xtensa_link_hash_entry
547 struct elf_link_hash_entry elf;
549 bfd_signed_vma tlsfunc_refcount;
551 #define GOT_UNKNOWN 0
553 #define GOT_TLS_GD 2 /* global or local dynamic */
554 #define GOT_TLS_IE 4 /* initial or local exec */
555 #define GOT_TLS_ANY (GOT_TLS_GD | GOT_TLS_IE)
556 unsigned char tls_type;
559 #define elf_xtensa_hash_entry(ent) ((struct elf_xtensa_link_hash_entry *)(ent))
561 struct elf_xtensa_obj_tdata
563 struct elf_obj_tdata root;
565 /* tls_type for each local got entry. */
566 char *local_got_tls_type;
568 bfd_signed_vma *local_tlsfunc_refcounts;
571 #define elf_xtensa_tdata(abfd) \
572 ((struct elf_xtensa_obj_tdata *) (abfd)->tdata.any)
574 #define elf_xtensa_local_got_tls_type(abfd) \
575 (elf_xtensa_tdata (abfd)->local_got_tls_type)
577 #define elf_xtensa_local_tlsfunc_refcounts(abfd) \
578 (elf_xtensa_tdata (abfd)->local_tlsfunc_refcounts)
580 #define is_xtensa_elf(bfd) \
581 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
582 && elf_tdata (bfd) != NULL \
583 && elf_object_id (bfd) == XTENSA_ELF_DATA)
586 elf_xtensa_mkobject (bfd *abfd)
588 return bfd_elf_allocate_object (abfd, sizeof (struct elf_xtensa_obj_tdata),
592 /* Xtensa ELF linker hash table. */
594 struct elf_xtensa_link_hash_table
596 struct elf_link_hash_table elf;
598 /* Short-cuts to get to dynamic linker sections. */
605 asection *spltlittbl;
607 /* Total count of PLT relocations seen during check_relocs.
608 The actual PLT code must be split into multiple sections and all
609 the sections have to be created before size_dynamic_sections,
610 where we figure out the exact number of PLT entries that will be
611 needed. It is OK if this count is an overestimate, e.g., some
612 relocations may be removed by GC. */
615 struct elf_xtensa_link_hash_entry *tlsbase;
618 /* Get the Xtensa ELF linker hash table from a link_info structure. */
620 #define elf_xtensa_hash_table(p) \
621 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
622 == XTENSA_ELF_DATA ? ((struct elf_xtensa_link_hash_table *) ((p)->hash)) : NULL)
624 /* Create an entry in an Xtensa ELF linker hash table. */
626 static struct bfd_hash_entry *
627 elf_xtensa_link_hash_newfunc (struct bfd_hash_entry *entry,
628 struct bfd_hash_table *table,
631 /* Allocate the structure if it has not already been allocated by a
635 entry = bfd_hash_allocate (table,
636 sizeof (struct elf_xtensa_link_hash_entry));
641 /* Call the allocation method of the superclass. */
642 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
645 struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (entry);
646 eh->tlsfunc_refcount = 0;
647 eh->tls_type = GOT_UNKNOWN;
653 /* Create an Xtensa ELF linker hash table. */
655 static struct bfd_link_hash_table *
656 elf_xtensa_link_hash_table_create (bfd *abfd)
658 struct elf_link_hash_entry *tlsbase;
659 struct elf_xtensa_link_hash_table *ret;
660 bfd_size_type amt = sizeof (struct elf_xtensa_link_hash_table);
662 ret = bfd_zmalloc (amt);
666 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
667 elf_xtensa_link_hash_newfunc,
668 sizeof (struct elf_xtensa_link_hash_entry),
675 /* Create a hash entry for "_TLS_MODULE_BASE_" to speed up checking
677 tlsbase = elf_link_hash_lookup (&ret->elf, "_TLS_MODULE_BASE_",
679 tlsbase->root.type = bfd_link_hash_new;
680 tlsbase->root.u.undef.abfd = NULL;
681 tlsbase->non_elf = 0;
682 ret->tlsbase = elf_xtensa_hash_entry (tlsbase);
683 ret->tlsbase->tls_type = GOT_UNKNOWN;
685 return &ret->elf.root;
688 /* Copy the extra info we tack onto an elf_link_hash_entry. */
691 elf_xtensa_copy_indirect_symbol (struct bfd_link_info *info,
692 struct elf_link_hash_entry *dir,
693 struct elf_link_hash_entry *ind)
695 struct elf_xtensa_link_hash_entry *edir, *eind;
697 edir = elf_xtensa_hash_entry (dir);
698 eind = elf_xtensa_hash_entry (ind);
700 if (ind->root.type == bfd_link_hash_indirect)
702 edir->tlsfunc_refcount += eind->tlsfunc_refcount;
703 eind->tlsfunc_refcount = 0;
705 if (dir->got.refcount <= 0)
707 edir->tls_type = eind->tls_type;
708 eind->tls_type = GOT_UNKNOWN;
712 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
715 static inline bfd_boolean
716 elf_xtensa_dynamic_symbol_p (struct elf_link_hash_entry *h,
717 struct bfd_link_info *info)
719 /* Check if we should do dynamic things to this symbol. The
720 "ignore_protected" argument need not be set, because Xtensa code
721 does not require special handling of STV_PROTECTED to make function
722 pointer comparisons work properly. The PLT addresses are never
723 used for function pointers. */
725 return _bfd_elf_dynamic_symbol_p (h, info, 0);
730 property_table_compare (const void *ap, const void *bp)
732 const property_table_entry *a = (const property_table_entry *) ap;
733 const property_table_entry *b = (const property_table_entry *) bp;
735 if (a->address == b->address)
737 if (a->size != b->size)
738 return (a->size - b->size);
740 if ((a->flags & XTENSA_PROP_ALIGN) != (b->flags & XTENSA_PROP_ALIGN))
741 return ((b->flags & XTENSA_PROP_ALIGN)
742 - (a->flags & XTENSA_PROP_ALIGN));
744 if ((a->flags & XTENSA_PROP_ALIGN)
745 && (GET_XTENSA_PROP_ALIGNMENT (a->flags)
746 != GET_XTENSA_PROP_ALIGNMENT (b->flags)))
747 return (GET_XTENSA_PROP_ALIGNMENT (a->flags)
748 - GET_XTENSA_PROP_ALIGNMENT (b->flags));
750 if ((a->flags & XTENSA_PROP_UNREACHABLE)
751 != (b->flags & XTENSA_PROP_UNREACHABLE))
752 return ((b->flags & XTENSA_PROP_UNREACHABLE)
753 - (a->flags & XTENSA_PROP_UNREACHABLE));
755 return (a->flags - b->flags);
758 return (a->address - b->address);
763 property_table_matches (const void *ap, const void *bp)
765 const property_table_entry *a = (const property_table_entry *) ap;
766 const property_table_entry *b = (const property_table_entry *) bp;
768 /* Check if one entry overlaps with the other. */
769 if ((b->address >= a->address && b->address < (a->address + a->size))
770 || (a->address >= b->address && a->address < (b->address + b->size)))
773 return (a->address - b->address);
777 /* Get the literal table or property table entries for the given
778 section. Sets TABLE_P and returns the number of entries. On
779 error, returns a negative value. */
782 xtensa_read_table_entries (bfd *abfd,
784 property_table_entry **table_p,
785 const char *sec_name,
786 bfd_boolean output_addr)
788 asection *table_section;
789 bfd_size_type table_size = 0;
790 bfd_byte *table_data;
791 property_table_entry *blocks;
792 int blk, block_count;
793 bfd_size_type num_records;
794 Elf_Internal_Rela *internal_relocs, *irel, *rel_end;
795 bfd_vma section_addr, off;
796 flagword predef_flags;
797 bfd_size_type table_entry_size, section_limit;
800 || !(section->flags & SEC_ALLOC)
801 || (section->flags & SEC_DEBUGGING))
807 table_section = xtensa_get_property_section (section, sec_name);
809 table_size = table_section->size;
817 predef_flags = xtensa_get_property_predef_flags (table_section);
818 table_entry_size = 12;
820 table_entry_size -= 4;
822 num_records = table_size / table_entry_size;
823 table_data = retrieve_contents (abfd, table_section, TRUE);
824 blocks = (property_table_entry *)
825 bfd_malloc (num_records * sizeof (property_table_entry));
829 section_addr = section->output_section->vma + section->output_offset;
831 section_addr = section->vma;
833 internal_relocs = retrieve_internal_relocs (abfd, table_section, TRUE);
834 if (internal_relocs && !table_section->reloc_done)
836 qsort (internal_relocs, table_section->reloc_count,
837 sizeof (Elf_Internal_Rela), internal_reloc_compare);
838 irel = internal_relocs;
843 section_limit = bfd_get_section_limit (abfd, section);
844 rel_end = internal_relocs + table_section->reloc_count;
846 for (off = 0; off < table_size; off += table_entry_size)
848 bfd_vma address = bfd_get_32 (abfd, table_data + off);
850 /* Skip any relocations before the current offset. This should help
851 avoid confusion caused by unexpected relocations for the preceding
854 (irel->r_offset < off
855 || (irel->r_offset == off
856 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_NONE)))
863 if (irel && irel->r_offset == off)
866 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
867 BFD_ASSERT (ELF32_R_TYPE (irel->r_info) == R_XTENSA_32);
869 if (get_elf_r_symndx_section (abfd, r_symndx) != section)
872 sym_off = get_elf_r_symndx_offset (abfd, r_symndx);
873 BFD_ASSERT (sym_off == 0);
874 address += (section_addr + sym_off + irel->r_addend);
878 if (address < section_addr
879 || address >= section_addr + section_limit)
883 blocks[block_count].address = address;
884 blocks[block_count].size = bfd_get_32 (abfd, table_data + off + 4);
886 blocks[block_count].flags = predef_flags;
888 blocks[block_count].flags = bfd_get_32 (abfd, table_data + off + 8);
892 release_contents (table_section, table_data);
893 release_internal_relocs (table_section, internal_relocs);
897 /* Now sort them into address order for easy reference. */
898 qsort (blocks, block_count, sizeof (property_table_entry),
899 property_table_compare);
901 /* Check that the table contents are valid. Problems may occur,
902 for example, if an unrelocated object file is stripped. */
903 for (blk = 1; blk < block_count; blk++)
905 /* The only circumstance where two entries may legitimately
906 have the same address is when one of them is a zero-size
907 placeholder to mark a place where fill can be inserted.
908 The zero-size entry should come first. */
909 if (blocks[blk - 1].address == blocks[blk].address &&
910 blocks[blk - 1].size != 0)
912 (*_bfd_error_handler) (_("%B(%A): invalid property table"),
914 bfd_set_error (bfd_error_bad_value);
926 static property_table_entry *
927 elf_xtensa_find_property_entry (property_table_entry *property_table,
928 int property_table_size,
931 property_table_entry entry;
932 property_table_entry *rv;
934 if (property_table_size == 0)
937 entry.address = addr;
941 rv = bsearch (&entry, property_table, property_table_size,
942 sizeof (property_table_entry), property_table_matches);
948 elf_xtensa_in_literal_pool (property_table_entry *lit_table,
952 if (elf_xtensa_find_property_entry (lit_table, lit_table_size, addr))
959 /* Look through the relocs for a section during the first phase, and
960 calculate needed space in the dynamic reloc sections. */
963 elf_xtensa_check_relocs (bfd *abfd,
964 struct bfd_link_info *info,
966 const Elf_Internal_Rela *relocs)
968 struct elf_xtensa_link_hash_table *htab;
969 Elf_Internal_Shdr *symtab_hdr;
970 struct elf_link_hash_entry **sym_hashes;
971 const Elf_Internal_Rela *rel;
972 const Elf_Internal_Rela *rel_end;
974 if (info->relocatable || (sec->flags & SEC_ALLOC) == 0)
977 BFD_ASSERT (is_xtensa_elf (abfd));
979 htab = elf_xtensa_hash_table (info);
983 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
984 sym_hashes = elf_sym_hashes (abfd);
986 rel_end = relocs + sec->reloc_count;
987 for (rel = relocs; rel < rel_end; rel++)
990 unsigned long r_symndx;
991 struct elf_link_hash_entry *h = NULL;
992 struct elf_xtensa_link_hash_entry *eh;
993 int tls_type, old_tls_type;
994 bfd_boolean is_got = FALSE;
995 bfd_boolean is_plt = FALSE;
996 bfd_boolean is_tlsfunc = FALSE;
998 r_symndx = ELF32_R_SYM (rel->r_info);
999 r_type = ELF32_R_TYPE (rel->r_info);
1001 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1003 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1008 if (r_symndx >= symtab_hdr->sh_info)
1010 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1011 while (h->root.type == bfd_link_hash_indirect
1012 || h->root.type == bfd_link_hash_warning)
1013 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1015 /* PR15323, ref flags aren't set for references in the same
1017 h->root.non_ir_ref = 1;
1019 eh = elf_xtensa_hash_entry (h);
1023 case R_XTENSA_TLSDESC_FN:
1026 tls_type = GOT_TLS_GD;
1031 tls_type = GOT_TLS_IE;
1034 case R_XTENSA_TLSDESC_ARG:
1037 tls_type = GOT_TLS_GD;
1042 tls_type = GOT_TLS_IE;
1043 if (h && elf_xtensa_hash_entry (h) != htab->tlsbase)
1048 case R_XTENSA_TLS_DTPOFF:
1050 tls_type = GOT_TLS_GD;
1052 tls_type = GOT_TLS_IE;
1055 case R_XTENSA_TLS_TPOFF:
1056 tls_type = GOT_TLS_IE;
1058 info->flags |= DF_STATIC_TLS;
1059 if (info->shared || h)
1064 tls_type = GOT_NORMAL;
1069 tls_type = GOT_NORMAL;
1073 case R_XTENSA_GNU_VTINHERIT:
1074 /* This relocation describes the C++ object vtable hierarchy.
1075 Reconstruct it for later use during GC. */
1076 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1080 case R_XTENSA_GNU_VTENTRY:
1081 /* This relocation describes which C++ vtable entries are actually
1082 used. Record for later use during GC. */
1083 BFD_ASSERT (h != NULL);
1085 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1090 /* Nothing to do for any other relocations. */
1098 if (h->plt.refcount <= 0)
1101 h->plt.refcount = 1;
1104 h->plt.refcount += 1;
1106 /* Keep track of the total PLT relocation count even if we
1107 don't yet know whether the dynamic sections will be
1109 htab->plt_reloc_count += 1;
1111 if (elf_hash_table (info)->dynamic_sections_created)
1113 if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1119 if (h->got.refcount <= 0)
1120 h->got.refcount = 1;
1122 h->got.refcount += 1;
1126 eh->tlsfunc_refcount += 1;
1128 old_tls_type = eh->tls_type;
1132 /* Allocate storage the first time. */
1133 if (elf_local_got_refcounts (abfd) == NULL)
1135 bfd_size_type size = symtab_hdr->sh_info;
1138 mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1141 elf_local_got_refcounts (abfd) = (bfd_signed_vma *) mem;
1143 mem = bfd_zalloc (abfd, size);
1146 elf_xtensa_local_got_tls_type (abfd) = (char *) mem;
1148 mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1151 elf_xtensa_local_tlsfunc_refcounts (abfd)
1152 = (bfd_signed_vma *) mem;
1155 /* This is a global offset table entry for a local symbol. */
1156 if (is_got || is_plt)
1157 elf_local_got_refcounts (abfd) [r_symndx] += 1;
1160 elf_xtensa_local_tlsfunc_refcounts (abfd) [r_symndx] += 1;
1162 old_tls_type = elf_xtensa_local_got_tls_type (abfd) [r_symndx];
1165 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1166 tls_type |= old_tls_type;
1167 /* If a TLS symbol is accessed using IE at least once,
1168 there is no point to use a dynamic model for it. */
1169 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1170 && ((old_tls_type & GOT_TLS_GD) == 0
1171 || (tls_type & GOT_TLS_IE) == 0))
1173 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_GD))
1174 tls_type = old_tls_type;
1175 else if ((old_tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_GD))
1176 tls_type |= old_tls_type;
1179 (*_bfd_error_handler)
1180 (_("%B: `%s' accessed both as normal and thread local symbol"),
1182 h ? h->root.root.string : "<local>");
1187 if (old_tls_type != tls_type)
1190 eh->tls_type = tls_type;
1192 elf_xtensa_local_got_tls_type (abfd) [r_symndx] = tls_type;
1201 elf_xtensa_make_sym_local (struct bfd_link_info *info,
1202 struct elf_link_hash_entry *h)
1206 if (h->plt.refcount > 0)
1208 /* For shared objects, there's no need for PLT entries for local
1209 symbols (use RELATIVE relocs instead of JMP_SLOT relocs). */
1210 if (h->got.refcount < 0)
1211 h->got.refcount = 0;
1212 h->got.refcount += h->plt.refcount;
1213 h->plt.refcount = 0;
1218 /* Don't need any dynamic relocations at all. */
1219 h->plt.refcount = 0;
1220 h->got.refcount = 0;
1226 elf_xtensa_hide_symbol (struct bfd_link_info *info,
1227 struct elf_link_hash_entry *h,
1228 bfd_boolean force_local)
1230 /* For a shared link, move the plt refcount to the got refcount to leave
1231 space for RELATIVE relocs. */
1232 elf_xtensa_make_sym_local (info, h);
1234 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
1238 /* Return the section that should be marked against GC for a given
1242 elf_xtensa_gc_mark_hook (asection *sec,
1243 struct bfd_link_info *info,
1244 Elf_Internal_Rela *rel,
1245 struct elf_link_hash_entry *h,
1246 Elf_Internal_Sym *sym)
1248 /* Property sections are marked "KEEP" in the linker scripts, but they
1249 should not cause other sections to be marked. (This approach relies
1250 on elf_xtensa_discard_info to remove property table entries that
1251 describe discarded sections. Alternatively, it might be more
1252 efficient to avoid using "KEEP" in the linker scripts and instead use
1253 the gc_mark_extra_sections hook to mark only the property sections
1254 that describe marked sections. That alternative does not work well
1255 with the current property table sections, which do not correspond
1256 one-to-one with the sections they describe, but that should be fixed
1258 if (xtensa_is_property_section (sec))
1262 switch (ELF32_R_TYPE (rel->r_info))
1264 case R_XTENSA_GNU_VTINHERIT:
1265 case R_XTENSA_GNU_VTENTRY:
1269 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1273 /* Update the GOT & PLT entry reference counts
1274 for the section being removed. */
1277 elf_xtensa_gc_sweep_hook (bfd *abfd,
1278 struct bfd_link_info *info,
1280 const Elf_Internal_Rela *relocs)
1282 Elf_Internal_Shdr *symtab_hdr;
1283 struct elf_link_hash_entry **sym_hashes;
1284 const Elf_Internal_Rela *rel, *relend;
1285 struct elf_xtensa_link_hash_table *htab;
1287 htab = elf_xtensa_hash_table (info);
1291 if (info->relocatable)
1294 if ((sec->flags & SEC_ALLOC) == 0)
1297 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1298 sym_hashes = elf_sym_hashes (abfd);
1300 relend = relocs + sec->reloc_count;
1301 for (rel = relocs; rel < relend; rel++)
1303 unsigned long r_symndx;
1304 unsigned int r_type;
1305 struct elf_link_hash_entry *h = NULL;
1306 struct elf_xtensa_link_hash_entry *eh;
1307 bfd_boolean is_got = FALSE;
1308 bfd_boolean is_plt = FALSE;
1309 bfd_boolean is_tlsfunc = FALSE;
1311 r_symndx = ELF32_R_SYM (rel->r_info);
1312 if (r_symndx >= symtab_hdr->sh_info)
1314 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1315 while (h->root.type == bfd_link_hash_indirect
1316 || h->root.type == bfd_link_hash_warning)
1317 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1319 eh = elf_xtensa_hash_entry (h);
1321 r_type = ELF32_R_TYPE (rel->r_info);
1324 case R_XTENSA_TLSDESC_FN:
1332 case R_XTENSA_TLSDESC_ARG:
1337 if (h && elf_xtensa_hash_entry (h) != htab->tlsbase)
1342 case R_XTENSA_TLS_TPOFF:
1343 if (info->shared || h)
1363 /* If the symbol has been localized its plt.refcount got moved
1364 to got.refcount. Handle it as GOT. */
1365 if (h->plt.refcount > 0)
1372 if (h->got.refcount > 0)
1377 if (eh->tlsfunc_refcount > 0)
1378 eh->tlsfunc_refcount--;
1383 if (is_got || is_plt)
1385 bfd_signed_vma *got_refcount
1386 = &elf_local_got_refcounts (abfd) [r_symndx];
1387 if (*got_refcount > 0)
1392 bfd_signed_vma *tlsfunc_refcount
1393 = &elf_xtensa_local_tlsfunc_refcounts (abfd) [r_symndx];
1394 if (*tlsfunc_refcount > 0)
1395 *tlsfunc_refcount -= 1;
1404 /* Create all the dynamic sections. */
1407 elf_xtensa_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1409 struct elf_xtensa_link_hash_table *htab;
1410 flagword flags, noalloc_flags;
1412 htab = elf_xtensa_hash_table (info);
1416 /* First do all the standard stuff. */
1417 if (! _bfd_elf_create_dynamic_sections (dynobj, info))
1419 htab->splt = bfd_get_linker_section (dynobj, ".plt");
1420 htab->srelplt = bfd_get_linker_section (dynobj, ".rela.plt");
1421 htab->sgot = bfd_get_linker_section (dynobj, ".got");
1422 htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
1423 htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got");
1425 /* Create any extra PLT sections in case check_relocs has already
1426 been called on all the non-dynamic input files. */
1427 if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1430 noalloc_flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
1431 | SEC_LINKER_CREATED | SEC_READONLY);
1432 flags = noalloc_flags | SEC_ALLOC | SEC_LOAD;
1434 /* Mark the ".got.plt" section READONLY. */
1435 if (htab->sgotplt == NULL
1436 || ! bfd_set_section_flags (dynobj, htab->sgotplt, flags))
1439 /* Create ".got.loc" (literal tables for use by dynamic linker). */
1440 htab->sgotloc = bfd_make_section_anyway_with_flags (dynobj, ".got.loc",
1442 if (htab->sgotloc == NULL
1443 || ! bfd_set_section_alignment (dynobj, htab->sgotloc, 2))
1446 /* Create ".xt.lit.plt" (literal table for ".got.plt*"). */
1447 htab->spltlittbl = bfd_make_section_anyway_with_flags (dynobj, ".xt.lit.plt",
1449 if (htab->spltlittbl == NULL
1450 || ! bfd_set_section_alignment (dynobj, htab->spltlittbl, 2))
1458 add_extra_plt_sections (struct bfd_link_info *info, int count)
1460 bfd *dynobj = elf_hash_table (info)->dynobj;
1463 /* Iterate over all chunks except 0 which uses the standard ".plt" and
1464 ".got.plt" sections. */
1465 for (chunk = count / PLT_ENTRIES_PER_CHUNK; chunk > 0; chunk--)
1471 /* Stop when we find a section has already been created. */
1472 if (elf_xtensa_get_plt_section (info, chunk))
1475 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1476 | SEC_LINKER_CREATED | SEC_READONLY);
1478 sname = (char *) bfd_malloc (10);
1479 sprintf (sname, ".plt.%u", chunk);
1480 s = bfd_make_section_anyway_with_flags (dynobj, sname, flags | SEC_CODE);
1482 || ! bfd_set_section_alignment (dynobj, s, 2))
1485 sname = (char *) bfd_malloc (14);
1486 sprintf (sname, ".got.plt.%u", chunk);
1487 s = bfd_make_section_anyway_with_flags (dynobj, sname, flags);
1489 || ! bfd_set_section_alignment (dynobj, s, 2))
1497 /* Adjust a symbol defined by a dynamic object and referenced by a
1498 regular object. The current definition is in some section of the
1499 dynamic object, but we're not including those sections. We have to
1500 change the definition to something the rest of the link can
1504 elf_xtensa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1505 struct elf_link_hash_entry *h)
1507 /* If this is a weak symbol, and there is a real definition, the
1508 processor independent code will have arranged for us to see the
1509 real definition first, and we can just use the same value. */
1512 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1513 || h->u.weakdef->root.type == bfd_link_hash_defweak);
1514 h->root.u.def.section = h->u.weakdef->root.u.def.section;
1515 h->root.u.def.value = h->u.weakdef->root.u.def.value;
1519 /* This is a reference to a symbol defined by a dynamic object. The
1520 reference must go through the GOT, so there's no need for COPY relocs,
1528 elf_xtensa_allocate_dynrelocs (struct elf_link_hash_entry *h, void *arg)
1530 struct bfd_link_info *info;
1531 struct elf_xtensa_link_hash_table *htab;
1532 struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (h);
1534 if (h->root.type == bfd_link_hash_indirect)
1537 info = (struct bfd_link_info *) arg;
1538 htab = elf_xtensa_hash_table (info);
1542 /* If we saw any use of an IE model for this symbol, we can then optimize
1543 away GOT entries for any TLSDESC_FN relocs. */
1544 if ((eh->tls_type & GOT_TLS_IE) != 0)
1546 BFD_ASSERT (h->got.refcount >= eh->tlsfunc_refcount);
1547 h->got.refcount -= eh->tlsfunc_refcount;
1550 if (! elf_xtensa_dynamic_symbol_p (h, info))
1551 elf_xtensa_make_sym_local (info, h);
1553 if (h->plt.refcount > 0)
1554 htab->srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
1556 if (h->got.refcount > 0)
1557 htab->srelgot->size += (h->got.refcount * sizeof (Elf32_External_Rela));
1564 elf_xtensa_allocate_local_got_size (struct bfd_link_info *info)
1566 struct elf_xtensa_link_hash_table *htab;
1569 htab = elf_xtensa_hash_table (info);
1573 for (i = info->input_bfds; i; i = i->link.next)
1575 bfd_signed_vma *local_got_refcounts;
1576 bfd_size_type j, cnt;
1577 Elf_Internal_Shdr *symtab_hdr;
1579 local_got_refcounts = elf_local_got_refcounts (i);
1580 if (!local_got_refcounts)
1583 symtab_hdr = &elf_tdata (i)->symtab_hdr;
1584 cnt = symtab_hdr->sh_info;
1586 for (j = 0; j < cnt; ++j)
1588 /* If we saw any use of an IE model for this symbol, we can
1589 then optimize away GOT entries for any TLSDESC_FN relocs. */
1590 if ((elf_xtensa_local_got_tls_type (i) [j] & GOT_TLS_IE) != 0)
1592 bfd_signed_vma *tlsfunc_refcount
1593 = &elf_xtensa_local_tlsfunc_refcounts (i) [j];
1594 BFD_ASSERT (local_got_refcounts[j] >= *tlsfunc_refcount);
1595 local_got_refcounts[j] -= *tlsfunc_refcount;
1598 if (local_got_refcounts[j] > 0)
1599 htab->srelgot->size += (local_got_refcounts[j]
1600 * sizeof (Elf32_External_Rela));
1606 /* Set the sizes of the dynamic sections. */
1609 elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1610 struct bfd_link_info *info)
1612 struct elf_xtensa_link_hash_table *htab;
1614 asection *s, *srelplt, *splt, *sgotplt, *srelgot, *spltlittbl, *sgotloc;
1615 bfd_boolean relplt, relgot;
1616 int plt_entries, plt_chunks, chunk;
1621 htab = elf_xtensa_hash_table (info);
1625 dynobj = elf_hash_table (info)->dynobj;
1628 srelgot = htab->srelgot;
1629 srelplt = htab->srelplt;
1631 if (elf_hash_table (info)->dynamic_sections_created)
1633 BFD_ASSERT (htab->srelgot != NULL
1634 && htab->srelplt != NULL
1635 && htab->sgot != NULL
1636 && htab->spltlittbl != NULL
1637 && htab->sgotloc != NULL);
1639 /* Set the contents of the .interp section to the interpreter. */
1640 if (info->executable)
1642 s = bfd_get_linker_section (dynobj, ".interp");
1645 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1646 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1649 /* Allocate room for one word in ".got". */
1650 htab->sgot->size = 4;
1652 /* Allocate space in ".rela.got" for literals that reference global
1653 symbols and space in ".rela.plt" for literals that have PLT
1655 elf_link_hash_traverse (elf_hash_table (info),
1656 elf_xtensa_allocate_dynrelocs,
1659 /* If we are generating a shared object, we also need space in
1660 ".rela.got" for R_XTENSA_RELATIVE relocs for literals that
1661 reference local symbols. */
1663 elf_xtensa_allocate_local_got_size (info);
1665 /* Allocate space in ".plt" to match the size of ".rela.plt". For
1666 each PLT entry, we need the PLT code plus a 4-byte literal.
1667 For each chunk of ".plt", we also need two more 4-byte
1668 literals, two corresponding entries in ".rela.got", and an
1669 8-byte entry in ".xt.lit.plt". */
1670 spltlittbl = htab->spltlittbl;
1671 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
1673 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
1675 /* Iterate over all the PLT chunks, including any extra sections
1676 created earlier because the initial count of PLT relocations
1677 was an overestimate. */
1679 (splt = elf_xtensa_get_plt_section (info, chunk)) != NULL;
1684 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
1685 BFD_ASSERT (sgotplt != NULL);
1687 if (chunk < plt_chunks - 1)
1688 chunk_entries = PLT_ENTRIES_PER_CHUNK;
1689 else if (chunk == plt_chunks - 1)
1690 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
1694 if (chunk_entries != 0)
1696 sgotplt->size = 4 * (chunk_entries + 2);
1697 splt->size = PLT_ENTRY_SIZE * chunk_entries;
1698 srelgot->size += 2 * sizeof (Elf32_External_Rela);
1699 spltlittbl->size += 8;
1708 /* Allocate space in ".got.loc" to match the total size of all the
1710 sgotloc = htab->sgotloc;
1711 sgotloc->size = spltlittbl->size;
1712 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
1714 if (abfd->flags & DYNAMIC)
1716 for (s = abfd->sections; s != NULL; s = s->next)
1718 if (! discarded_section (s)
1719 && xtensa_is_littable_section (s)
1721 sgotloc->size += s->size;
1726 /* Allocate memory for dynamic sections. */
1729 for (s = dynobj->sections; s != NULL; s = s->next)
1733 if ((s->flags & SEC_LINKER_CREATED) == 0)
1736 /* It's OK to base decisions on the section name, because none
1737 of the dynobj section names depend upon the input files. */
1738 name = bfd_get_section_name (dynobj, s);
1740 if (CONST_STRNEQ (name, ".rela"))
1744 if (strcmp (name, ".rela.plt") == 0)
1746 else if (strcmp (name, ".rela.got") == 0)
1749 /* We use the reloc_count field as a counter if we need
1750 to copy relocs into the output file. */
1754 else if (! CONST_STRNEQ (name, ".plt.")
1755 && ! CONST_STRNEQ (name, ".got.plt.")
1756 && strcmp (name, ".got") != 0
1757 && strcmp (name, ".plt") != 0
1758 && strcmp (name, ".got.plt") != 0
1759 && strcmp (name, ".xt.lit.plt") != 0
1760 && strcmp (name, ".got.loc") != 0)
1762 /* It's not one of our sections, so don't allocate space. */
1768 /* If we don't need this section, strip it from the output
1769 file. We must create the ".plt*" and ".got.plt*"
1770 sections in create_dynamic_sections and/or check_relocs
1771 based on a conservative estimate of the PLT relocation
1772 count, because the sections must be created before the
1773 linker maps input sections to output sections. The
1774 linker does that before size_dynamic_sections, where we
1775 compute the exact size of the PLT, so there may be more
1776 of these sections than are actually needed. */
1777 s->flags |= SEC_EXCLUDE;
1779 else if ((s->flags & SEC_HAS_CONTENTS) != 0)
1781 /* Allocate memory for the section contents. */
1782 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1783 if (s->contents == NULL)
1788 if (elf_hash_table (info)->dynamic_sections_created)
1790 /* Add the special XTENSA_RTLD relocations now. The offsets won't be
1791 known until finish_dynamic_sections, but we need to get the relocs
1792 in place before they are sorted. */
1793 for (chunk = 0; chunk < plt_chunks; chunk++)
1795 Elf_Internal_Rela irela;
1799 irela.r_info = ELF32_R_INFO (0, R_XTENSA_RTLD);
1802 loc = (srelgot->contents
1803 + srelgot->reloc_count * sizeof (Elf32_External_Rela));
1804 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
1805 bfd_elf32_swap_reloca_out (output_bfd, &irela,
1806 loc + sizeof (Elf32_External_Rela));
1807 srelgot->reloc_count += 2;
1810 /* Add some entries to the .dynamic section. We fill in the
1811 values later, in elf_xtensa_finish_dynamic_sections, but we
1812 must add the entries now so that we get the correct size for
1813 the .dynamic section. The DT_DEBUG entry is filled in by the
1814 dynamic linker and used by the debugger. */
1815 #define add_dynamic_entry(TAG, VAL) \
1816 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1818 if (info->executable)
1820 if (!add_dynamic_entry (DT_DEBUG, 0))
1826 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1827 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1828 || !add_dynamic_entry (DT_JMPREL, 0))
1834 if (!add_dynamic_entry (DT_RELA, 0)
1835 || !add_dynamic_entry (DT_RELASZ, 0)
1836 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
1840 if (!add_dynamic_entry (DT_PLTGOT, 0)
1841 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0)
1842 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0))
1845 #undef add_dynamic_entry
1851 elf_xtensa_always_size_sections (bfd *output_bfd,
1852 struct bfd_link_info *info)
1854 struct elf_xtensa_link_hash_table *htab;
1857 htab = elf_xtensa_hash_table (info);
1861 tls_sec = htab->elf.tls_sec;
1863 if (tls_sec && (htab->tlsbase->tls_type & GOT_TLS_ANY) != 0)
1865 struct elf_link_hash_entry *tlsbase = &htab->tlsbase->elf;
1866 struct bfd_link_hash_entry *bh = &tlsbase->root;
1867 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
1869 tlsbase->type = STT_TLS;
1870 if (!(_bfd_generic_link_add_one_symbol
1871 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
1872 tls_sec, 0, NULL, FALSE,
1873 bed->collect, &bh)))
1875 tlsbase->def_regular = 1;
1876 tlsbase->other = STV_HIDDEN;
1877 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
1884 /* Return the base VMA address which should be subtracted from real addresses
1885 when resolving @dtpoff relocation.
1886 This is PT_TLS segment p_vaddr. */
1889 dtpoff_base (struct bfd_link_info *info)
1891 /* If tls_sec is NULL, we should have signalled an error already. */
1892 if (elf_hash_table (info)->tls_sec == NULL)
1894 return elf_hash_table (info)->tls_sec->vma;
1897 /* Return the relocation value for @tpoff relocation
1898 if STT_TLS virtual address is ADDRESS. */
1901 tpoff (struct bfd_link_info *info, bfd_vma address)
1903 struct elf_link_hash_table *htab = elf_hash_table (info);
1906 /* If tls_sec is NULL, we should have signalled an error already. */
1907 if (htab->tls_sec == NULL)
1909 base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
1910 return address - htab->tls_sec->vma + base;
1913 /* Perform the specified relocation. The instruction at (contents + address)
1914 is modified to set one operand to represent the value in "relocation". The
1915 operand position is determined by the relocation type recorded in the
1918 #define CALL_SEGMENT_BITS (30)
1919 #define CALL_SEGMENT_SIZE (1 << CALL_SEGMENT_BITS)
1921 static bfd_reloc_status_type
1922 elf_xtensa_do_reloc (reloc_howto_type *howto,
1924 asection *input_section,
1928 bfd_boolean is_weak_undef,
1929 char **error_message)
1932 xtensa_opcode opcode;
1933 xtensa_isa isa = xtensa_default_isa;
1934 static xtensa_insnbuf ibuff = NULL;
1935 static xtensa_insnbuf sbuff = NULL;
1936 bfd_vma self_address;
1937 bfd_size_type input_size;
1943 ibuff = xtensa_insnbuf_alloc (isa);
1944 sbuff = xtensa_insnbuf_alloc (isa);
1947 input_size = bfd_get_section_limit (abfd, input_section);
1949 /* Calculate the PC address for this instruction. */
1950 self_address = (input_section->output_section->vma
1951 + input_section->output_offset
1954 switch (howto->type)
1957 case R_XTENSA_DIFF8:
1958 case R_XTENSA_DIFF16:
1959 case R_XTENSA_DIFF32:
1960 case R_XTENSA_TLS_FUNC:
1961 case R_XTENSA_TLS_ARG:
1962 case R_XTENSA_TLS_CALL:
1963 return bfd_reloc_ok;
1965 case R_XTENSA_ASM_EXPAND:
1968 /* Check for windowed CALL across a 1GB boundary. */
1969 opcode = get_expanded_call_opcode (contents + address,
1970 input_size - address, 0);
1971 if (is_windowed_call_opcode (opcode))
1973 if ((self_address >> CALL_SEGMENT_BITS)
1974 != (relocation >> CALL_SEGMENT_BITS))
1976 *error_message = "windowed longcall crosses 1GB boundary; "
1978 return bfd_reloc_dangerous;
1982 return bfd_reloc_ok;
1984 case R_XTENSA_ASM_SIMPLIFY:
1986 /* Convert the L32R/CALLX to CALL. */
1987 bfd_reloc_status_type retval =
1988 elf_xtensa_do_asm_simplify (contents, address, input_size,
1990 if (retval != bfd_reloc_ok)
1991 return bfd_reloc_dangerous;
1993 /* The CALL needs to be relocated. Continue below for that part. */
1996 howto = &elf_howto_table[(unsigned) R_XTENSA_SLOT0_OP ];
2003 x = bfd_get_32 (abfd, contents + address);
2005 bfd_put_32 (abfd, x, contents + address);
2007 return bfd_reloc_ok;
2009 case R_XTENSA_32_PCREL:
2010 bfd_put_32 (abfd, relocation - self_address, contents + address);
2011 return bfd_reloc_ok;
2014 case R_XTENSA_TLSDESC_FN:
2015 case R_XTENSA_TLSDESC_ARG:
2016 case R_XTENSA_TLS_DTPOFF:
2017 case R_XTENSA_TLS_TPOFF:
2018 bfd_put_32 (abfd, relocation, contents + address);
2019 return bfd_reloc_ok;
2022 /* Only instruction slot-specific relocations handled below.... */
2023 slot = get_relocation_slot (howto->type);
2024 if (slot == XTENSA_UNDEFINED)
2026 *error_message = "unexpected relocation";
2027 return bfd_reloc_dangerous;
2030 /* Read the instruction into a buffer and decode the opcode. */
2031 xtensa_insnbuf_from_chars (isa, ibuff, contents + address,
2032 input_size - address);
2033 fmt = xtensa_format_decode (isa, ibuff);
2034 if (fmt == XTENSA_UNDEFINED)
2036 *error_message = "cannot decode instruction format";
2037 return bfd_reloc_dangerous;
2040 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
2042 opcode = xtensa_opcode_decode (isa, fmt, slot, sbuff);
2043 if (opcode == XTENSA_UNDEFINED)
2045 *error_message = "cannot decode instruction opcode";
2046 return bfd_reloc_dangerous;
2049 /* Check for opcode-specific "alternate" relocations. */
2050 if (is_alt_relocation (howto->type))
2052 if (opcode == get_l32r_opcode ())
2054 /* Handle the special-case of non-PC-relative L32R instructions. */
2055 bfd *output_bfd = input_section->output_section->owner;
2056 asection *lit4_sec = bfd_get_section_by_name (output_bfd, ".lit4");
2059 *error_message = "relocation references missing .lit4 section";
2060 return bfd_reloc_dangerous;
2062 self_address = ((lit4_sec->vma & ~0xfff)
2063 + 0x40000 - 3); /* -3 to compensate for do_reloc */
2064 newval = relocation;
2067 else if (opcode == get_const16_opcode ())
2069 /* ALT used for high 16 bits. */
2070 newval = relocation >> 16;
2075 /* No other "alternate" relocations currently defined. */
2076 *error_message = "unexpected relocation";
2077 return bfd_reloc_dangerous;
2080 else /* Not an "alternate" relocation.... */
2082 if (opcode == get_const16_opcode ())
2084 newval = relocation & 0xffff;
2089 /* ...normal PC-relative relocation.... */
2091 /* Determine which operand is being relocated. */
2092 opnd = get_relocation_opnd (opcode, howto->type);
2093 if (opnd == XTENSA_UNDEFINED)
2095 *error_message = "unexpected relocation";
2096 return bfd_reloc_dangerous;
2099 if (!howto->pc_relative)
2101 *error_message = "expected PC-relative relocation";
2102 return bfd_reloc_dangerous;
2105 newval = relocation;
2109 /* Apply the relocation. */
2110 if (xtensa_operand_do_reloc (isa, opcode, opnd, &newval, self_address)
2111 || xtensa_operand_encode (isa, opcode, opnd, &newval)
2112 || xtensa_operand_set_field (isa, opcode, opnd, fmt, slot,
2115 const char *opname = xtensa_opcode_name (isa, opcode);
2118 msg = "cannot encode";
2119 if (is_direct_call_opcode (opcode))
2121 if ((relocation & 0x3) != 0)
2122 msg = "misaligned call target";
2124 msg = "call target out of range";
2126 else if (opcode == get_l32r_opcode ())
2128 if ((relocation & 0x3) != 0)
2129 msg = "misaligned literal target";
2130 else if (is_alt_relocation (howto->type))
2131 msg = "literal target out of range (too many literals)";
2132 else if (self_address > relocation)
2133 msg = "literal target out of range (try using text-section-literals)";
2135 msg = "literal placed after use";
2138 *error_message = vsprint_msg (opname, ": %s", strlen (msg) + 2, msg);
2139 return bfd_reloc_dangerous;
2142 /* Check for calls across 1GB boundaries. */
2143 if (is_direct_call_opcode (opcode)
2144 && is_windowed_call_opcode (opcode))
2146 if ((self_address >> CALL_SEGMENT_BITS)
2147 != (relocation >> CALL_SEGMENT_BITS))
2150 "windowed call crosses 1GB boundary; return may fail";
2151 return bfd_reloc_dangerous;
2155 /* Write the modified instruction back out of the buffer. */
2156 xtensa_format_set_slot (isa, fmt, slot, ibuff, sbuff);
2157 xtensa_insnbuf_to_chars (isa, ibuff, contents + address,
2158 input_size - address);
2159 return bfd_reloc_ok;
2164 vsprint_msg (const char *origmsg, const char *fmt, int arglen, ...)
2166 /* To reduce the size of the memory leak,
2167 we only use a single message buffer. */
2168 static bfd_size_type alloc_size = 0;
2169 static char *message = NULL;
2170 bfd_size_type orig_len, len = 0;
2171 bfd_boolean is_append;
2174 va_start (ap, arglen);
2176 is_append = (origmsg == message);
2178 orig_len = strlen (origmsg);
2179 len = orig_len + strlen (fmt) + arglen + 20;
2180 if (len > alloc_size)
2182 message = (char *) bfd_realloc_or_free (message, len);
2185 if (message != NULL)
2188 memcpy (message, origmsg, orig_len);
2189 vsprintf (message + orig_len, fmt, ap);
2196 /* This function is registered as the "special_function" in the
2197 Xtensa howto for handling simplify operations.
2198 bfd_perform_relocation / bfd_install_relocation use it to
2199 perform (install) the specified relocation. Since this replaces the code
2200 in bfd_perform_relocation, it is basically an Xtensa-specific,
2201 stripped-down version of bfd_perform_relocation. */
2203 static bfd_reloc_status_type
2204 bfd_elf_xtensa_reloc (bfd *abfd,
2205 arelent *reloc_entry,
2208 asection *input_section,
2210 char **error_message)
2213 bfd_reloc_status_type flag;
2214 bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2215 bfd_vma output_base = 0;
2216 reloc_howto_type *howto = reloc_entry->howto;
2217 asection *reloc_target_output_section;
2218 bfd_boolean is_weak_undef;
2220 if (!xtensa_default_isa)
2221 xtensa_default_isa = xtensa_isa_init (0, 0);
2223 /* ELF relocs are against symbols. If we are producing relocatable
2224 output, and the reloc is against an external symbol, the resulting
2225 reloc will also be against the same symbol. In such a case, we
2226 don't want to change anything about the way the reloc is handled,
2227 since it will all be done at final link time. This test is similar
2228 to what bfd_elf_generic_reloc does except that it lets relocs with
2229 howto->partial_inplace go through even if the addend is non-zero.
2230 (The real problem is that partial_inplace is set for XTENSA_32
2231 relocs to begin with, but that's a long story and there's little we
2232 can do about it now....) */
2234 if (output_bfd && (symbol->flags & BSF_SECTION_SYM) == 0)
2236 reloc_entry->address += input_section->output_offset;
2237 return bfd_reloc_ok;
2240 /* Is the address of the relocation really within the section? */
2241 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2242 return bfd_reloc_outofrange;
2244 /* Work out which section the relocation is targeted at and the
2245 initial relocation command value. */
2247 /* Get symbol value. (Common symbols are special.) */
2248 if (bfd_is_com_section (symbol->section))
2251 relocation = symbol->value;
2253 reloc_target_output_section = symbol->section->output_section;
2255 /* Convert input-section-relative symbol value to absolute. */
2256 if ((output_bfd && !howto->partial_inplace)
2257 || reloc_target_output_section == NULL)
2260 output_base = reloc_target_output_section->vma;
2262 relocation += output_base + symbol->section->output_offset;
2264 /* Add in supplied addend. */
2265 relocation += reloc_entry->addend;
2267 /* Here the variable relocation holds the final address of the
2268 symbol we are relocating against, plus any addend. */
2271 if (!howto->partial_inplace)
2273 /* This is a partial relocation, and we want to apply the relocation
2274 to the reloc entry rather than the raw data. Everything except
2275 relocations against section symbols has already been handled
2278 BFD_ASSERT (symbol->flags & BSF_SECTION_SYM);
2279 reloc_entry->addend = relocation;
2280 reloc_entry->address += input_section->output_offset;
2281 return bfd_reloc_ok;
2285 reloc_entry->address += input_section->output_offset;
2286 reloc_entry->addend = 0;
2290 is_weak_undef = (bfd_is_und_section (symbol->section)
2291 && (symbol->flags & BSF_WEAK) != 0);
2292 flag = elf_xtensa_do_reloc (howto, abfd, input_section, relocation,
2293 (bfd_byte *) data, (bfd_vma) octets,
2294 is_weak_undef, error_message);
2296 if (flag == bfd_reloc_dangerous)
2298 /* Add the symbol name to the error message. */
2299 if (! *error_message)
2300 *error_message = "";
2301 *error_message = vsprint_msg (*error_message, ": (%s + 0x%lx)",
2302 strlen (symbol->name) + 17,
2304 (unsigned long) reloc_entry->addend);
2311 /* Set up an entry in the procedure linkage table. */
2314 elf_xtensa_create_plt_entry (struct bfd_link_info *info,
2316 unsigned reloc_index)
2318 asection *splt, *sgotplt;
2319 bfd_vma plt_base, got_base;
2320 bfd_vma code_offset, lit_offset;
2323 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
2324 splt = elf_xtensa_get_plt_section (info, chunk);
2325 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
2326 BFD_ASSERT (splt != NULL && sgotplt != NULL);
2328 plt_base = splt->output_section->vma + splt->output_offset;
2329 got_base = sgotplt->output_section->vma + sgotplt->output_offset;
2331 lit_offset = 8 + (reloc_index % PLT_ENTRIES_PER_CHUNK) * 4;
2332 code_offset = (reloc_index % PLT_ENTRIES_PER_CHUNK) * PLT_ENTRY_SIZE;
2334 /* Fill in the literal entry. This is the offset of the dynamic
2335 relocation entry. */
2336 bfd_put_32 (output_bfd, reloc_index * sizeof (Elf32_External_Rela),
2337 sgotplt->contents + lit_offset);
2339 /* Fill in the entry in the procedure linkage table. */
2340 memcpy (splt->contents + code_offset,
2341 (bfd_big_endian (output_bfd)
2342 ? elf_xtensa_be_plt_entry
2343 : elf_xtensa_le_plt_entry),
2345 bfd_put_16 (output_bfd, l32r_offset (got_base + 0,
2346 plt_base + code_offset + 3),
2347 splt->contents + code_offset + 4);
2348 bfd_put_16 (output_bfd, l32r_offset (got_base + 4,
2349 plt_base + code_offset + 6),
2350 splt->contents + code_offset + 7);
2351 bfd_put_16 (output_bfd, l32r_offset (got_base + lit_offset,
2352 plt_base + code_offset + 9),
2353 splt->contents + code_offset + 10);
2355 return plt_base + code_offset;
2359 static bfd_boolean get_indirect_call_dest_reg (xtensa_opcode, unsigned *);
2362 replace_tls_insn (Elf_Internal_Rela *rel,
2364 asection *input_section,
2366 bfd_boolean is_ld_model,
2367 char **error_message)
2369 static xtensa_insnbuf ibuff = NULL;
2370 static xtensa_insnbuf sbuff = NULL;
2371 xtensa_isa isa = xtensa_default_isa;
2373 xtensa_opcode old_op, new_op;
2374 bfd_size_type input_size;
2376 unsigned dest_reg, src_reg;
2380 ibuff = xtensa_insnbuf_alloc (isa);
2381 sbuff = xtensa_insnbuf_alloc (isa);
2384 input_size = bfd_get_section_limit (abfd, input_section);
2386 /* Read the instruction into a buffer and decode the opcode. */
2387 xtensa_insnbuf_from_chars (isa, ibuff, contents + rel->r_offset,
2388 input_size - rel->r_offset);
2389 fmt = xtensa_format_decode (isa, ibuff);
2390 if (fmt == XTENSA_UNDEFINED)
2392 *error_message = "cannot decode instruction format";
2396 BFD_ASSERT (xtensa_format_num_slots (isa, fmt) == 1);
2397 xtensa_format_get_slot (isa, fmt, 0, ibuff, sbuff);
2399 old_op = xtensa_opcode_decode (isa, fmt, 0, sbuff);
2400 if (old_op == XTENSA_UNDEFINED)
2402 *error_message = "cannot decode instruction opcode";
2406 r_type = ELF32_R_TYPE (rel->r_info);
2409 case R_XTENSA_TLS_FUNC:
2410 case R_XTENSA_TLS_ARG:
2411 if (old_op != get_l32r_opcode ()
2412 || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2413 sbuff, &dest_reg) != 0)
2415 *error_message = "cannot extract L32R destination for TLS access";
2420 case R_XTENSA_TLS_CALL:
2421 if (! get_indirect_call_dest_reg (old_op, &dest_reg)
2422 || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2423 sbuff, &src_reg) != 0)
2425 *error_message = "cannot extract CALLXn operands for TLS access";
2438 case R_XTENSA_TLS_FUNC:
2439 case R_XTENSA_TLS_ARG:
2440 /* Change the instruction to a NOP (or "OR a1, a1, a1" for older
2441 versions of Xtensa). */
2442 new_op = xtensa_opcode_lookup (isa, "nop");
2443 if (new_op == XTENSA_UNDEFINED)
2445 new_op = xtensa_opcode_lookup (isa, "or");
2446 if (new_op == XTENSA_UNDEFINED
2447 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2448 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2450 || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2452 || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2455 *error_message = "cannot encode OR for TLS access";
2461 if (xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0)
2463 *error_message = "cannot encode NOP for TLS access";
2469 case R_XTENSA_TLS_CALL:
2470 /* Read THREADPTR into the CALLX's return value register. */
2471 new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2472 if (new_op == XTENSA_UNDEFINED
2473 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2474 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2475 sbuff, dest_reg + 2) != 0)
2477 *error_message = "cannot encode RUR.THREADPTR for TLS access";
2487 case R_XTENSA_TLS_FUNC:
2488 new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2489 if (new_op == XTENSA_UNDEFINED
2490 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2491 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2492 sbuff, dest_reg) != 0)
2494 *error_message = "cannot encode RUR.THREADPTR for TLS access";
2499 case R_XTENSA_TLS_ARG:
2500 /* Nothing to do. Keep the original L32R instruction. */
2503 case R_XTENSA_TLS_CALL:
2504 /* Add the CALLX's src register (holding the THREADPTR value)
2505 to the first argument register (holding the offset) and put
2506 the result in the CALLX's return value register. */
2507 new_op = xtensa_opcode_lookup (isa, "add");
2508 if (new_op == XTENSA_UNDEFINED
2509 || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2510 || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2511 sbuff, dest_reg + 2) != 0
2512 || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2513 sbuff, dest_reg + 2) != 0
2514 || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2515 sbuff, src_reg) != 0)
2517 *error_message = "cannot encode ADD for TLS access";
2524 xtensa_format_set_slot (isa, fmt, 0, ibuff, sbuff);
2525 xtensa_insnbuf_to_chars (isa, ibuff, contents + rel->r_offset,
2526 input_size - rel->r_offset);
2532 #define IS_XTENSA_TLS_RELOC(R_TYPE) \
2533 ((R_TYPE) == R_XTENSA_TLSDESC_FN \
2534 || (R_TYPE) == R_XTENSA_TLSDESC_ARG \
2535 || (R_TYPE) == R_XTENSA_TLS_DTPOFF \
2536 || (R_TYPE) == R_XTENSA_TLS_TPOFF \
2537 || (R_TYPE) == R_XTENSA_TLS_FUNC \
2538 || (R_TYPE) == R_XTENSA_TLS_ARG \
2539 || (R_TYPE) == R_XTENSA_TLS_CALL)
2541 /* Relocate an Xtensa ELF section. This is invoked by the linker for
2542 both relocatable and final links. */
2545 elf_xtensa_relocate_section (bfd *output_bfd,
2546 struct bfd_link_info *info,
2548 asection *input_section,
2550 Elf_Internal_Rela *relocs,
2551 Elf_Internal_Sym *local_syms,
2552 asection **local_sections)
2554 struct elf_xtensa_link_hash_table *htab;
2555 Elf_Internal_Shdr *symtab_hdr;
2556 Elf_Internal_Rela *rel;
2557 Elf_Internal_Rela *relend;
2558 struct elf_link_hash_entry **sym_hashes;
2559 property_table_entry *lit_table = 0;
2561 char *local_got_tls_types;
2562 char *error_message = NULL;
2563 bfd_size_type input_size;
2566 if (!xtensa_default_isa)
2567 xtensa_default_isa = xtensa_isa_init (0, 0);
2569 BFD_ASSERT (is_xtensa_elf (input_bfd));
2571 htab = elf_xtensa_hash_table (info);
2575 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2576 sym_hashes = elf_sym_hashes (input_bfd);
2577 local_got_tls_types = elf_xtensa_local_got_tls_type (input_bfd);
2579 if (elf_hash_table (info)->dynamic_sections_created)
2581 ltblsize = xtensa_read_table_entries (input_bfd, input_section,
2582 &lit_table, XTENSA_LIT_SEC_NAME,
2588 input_size = bfd_get_section_limit (input_bfd, input_section);
2591 relend = relocs + input_section->reloc_count;
2592 for (; rel < relend; rel++)
2595 reloc_howto_type *howto;
2596 unsigned long r_symndx;
2597 struct elf_link_hash_entry *h;
2598 Elf_Internal_Sym *sym;
2603 bfd_reloc_status_type r;
2604 bfd_boolean is_weak_undef;
2605 bfd_boolean unresolved_reloc;
2607 bfd_boolean dynamic_symbol;
2609 r_type = ELF32_R_TYPE (rel->r_info);
2610 if (r_type == (int) R_XTENSA_GNU_VTINHERIT
2611 || r_type == (int) R_XTENSA_GNU_VTENTRY)
2614 if (r_type < 0 || r_type >= (int) R_XTENSA_max)
2616 bfd_set_error (bfd_error_bad_value);
2619 howto = &elf_howto_table[r_type];
2621 r_symndx = ELF32_R_SYM (rel->r_info);
2626 is_weak_undef = FALSE;
2627 unresolved_reloc = FALSE;
2630 if (howto->partial_inplace && !info->relocatable)
2632 /* Because R_XTENSA_32 was made partial_inplace to fix some
2633 problems with DWARF info in partial links, there may be
2634 an addend stored in the contents. Take it out of there
2635 and move it back into the addend field of the reloc. */
2636 rel->r_addend += bfd_get_32 (input_bfd, contents + rel->r_offset);
2637 bfd_put_32 (input_bfd, 0, contents + rel->r_offset);
2640 if (r_symndx < symtab_hdr->sh_info)
2642 sym = local_syms + r_symndx;
2643 sym_type = ELF32_ST_TYPE (sym->st_info);
2644 sec = local_sections[r_symndx];
2645 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2649 bfd_boolean ignored;
2651 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2652 r_symndx, symtab_hdr, sym_hashes,
2654 unresolved_reloc, warned, ignored);
2657 && !unresolved_reloc
2658 && h->root.type == bfd_link_hash_undefweak)
2659 is_weak_undef = TRUE;
2664 if (sec != NULL && discarded_section (sec))
2665 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2666 rel, 1, relend, howto, 0, contents);
2668 if (info->relocatable)
2671 asection * sym_sec = get_elf_r_symndx_section (input_bfd, r_symndx);
2673 /* This is a relocatable link.
2674 1) If the reloc is against a section symbol, adjust
2675 according to the output section.
2676 2) If there is a new target for this relocation,
2677 the new target will be in the same output section.
2678 We adjust the relocation by the output section
2681 if (relaxing_section)
2683 /* Check if this references a section in another input file. */
2684 if (!do_fix_for_relocatable_link (rel, input_bfd, input_section,
2689 dest_addr = sym_sec->output_section->vma + sym_sec->output_offset
2690 + get_elf_r_symndx_offset (input_bfd, r_symndx) + rel->r_addend;
2692 if (r_type == R_XTENSA_ASM_SIMPLIFY)
2694 error_message = NULL;
2695 /* Convert ASM_SIMPLIFY into the simpler relocation
2696 so that they never escape a relaxing link. */
2697 r = contract_asm_expansion (contents, input_size, rel,
2699 if (r != bfd_reloc_ok)
2701 if (!((*info->callbacks->reloc_dangerous)
2702 (info, error_message, input_bfd, input_section,
2706 r_type = ELF32_R_TYPE (rel->r_info);
2709 /* This is a relocatable link, so we don't have to change
2710 anything unless the reloc is against a section symbol,
2711 in which case we have to adjust according to where the
2712 section symbol winds up in the output section. */
2713 if (r_symndx < symtab_hdr->sh_info)
2715 sym = local_syms + r_symndx;
2716 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2718 sec = local_sections[r_symndx];
2719 rel->r_addend += sec->output_offset + sym->st_value;
2723 /* If there is an addend with a partial_inplace howto,
2724 then move the addend to the contents. This is a hack
2725 to work around problems with DWARF in relocatable links
2726 with some previous version of BFD. Now we can't easily get
2727 rid of the hack without breaking backward compatibility.... */
2729 howto = &elf_howto_table[r_type];
2730 if (howto->partial_inplace && rel->r_addend)
2732 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2733 rel->r_addend, contents,
2734 rel->r_offset, FALSE,
2740 /* Put the correct bits in the target instruction, even
2741 though the relocation will still be present in the output
2742 file. This makes disassembly clearer, as well as
2743 allowing loadable kernel modules to work without needing
2744 relocations on anything other than calls and l32r's. */
2746 /* If it is not in the same section, there is nothing we can do. */
2747 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP &&
2748 sym_sec->output_section == input_section->output_section)
2750 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2751 dest_addr, contents,
2752 rel->r_offset, FALSE,
2756 if (r != bfd_reloc_ok)
2758 if (!((*info->callbacks->reloc_dangerous)
2759 (info, error_message, input_bfd, input_section,
2764 /* Done with work for relocatable link; continue with next reloc. */
2768 /* This is a final link. */
2770 if (relaxing_section)
2772 /* Check if this references a section in another input file. */
2773 do_fix_for_final_link (rel, input_bfd, input_section, contents,
2777 /* Sanity check the address. */
2778 if (rel->r_offset >= input_size
2779 && ELF32_R_TYPE (rel->r_info) != R_XTENSA_NONE)
2781 (*_bfd_error_handler)
2782 (_("%B(%A+0x%lx): relocation offset out of range (size=0x%x)"),
2783 input_bfd, input_section, rel->r_offset, input_size);
2784 bfd_set_error (bfd_error_bad_value);
2789 name = h->root.root.string;
2792 name = (bfd_elf_string_from_elf_section
2793 (input_bfd, symtab_hdr->sh_link, sym->st_name));
2794 if (name == NULL || *name == '\0')
2795 name = bfd_section_name (input_bfd, sec);
2798 if (r_symndx != STN_UNDEF
2799 && r_type != R_XTENSA_NONE
2801 || h->root.type == bfd_link_hash_defined
2802 || h->root.type == bfd_link_hash_defweak)
2803 && IS_XTENSA_TLS_RELOC (r_type) != (sym_type == STT_TLS))
2805 (*_bfd_error_handler)
2806 ((sym_type == STT_TLS
2807 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
2808 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
2811 (long) rel->r_offset,
2816 dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
2818 tls_type = GOT_UNKNOWN;
2820 tls_type = elf_xtensa_hash_entry (h)->tls_type;
2821 else if (local_got_tls_types)
2822 tls_type = local_got_tls_types [r_symndx];
2828 if (elf_hash_table (info)->dynamic_sections_created
2829 && (input_section->flags & SEC_ALLOC) != 0
2830 && (dynamic_symbol || info->shared))
2832 Elf_Internal_Rela outrel;
2836 if (dynamic_symbol && r_type == R_XTENSA_PLT)
2837 srel = htab->srelplt;
2839 srel = htab->srelgot;
2841 BFD_ASSERT (srel != NULL);
2844 _bfd_elf_section_offset (output_bfd, info,
2845 input_section, rel->r_offset);
2847 if ((outrel.r_offset | 1) == (bfd_vma) -1)
2848 memset (&outrel, 0, sizeof outrel);
2851 outrel.r_offset += (input_section->output_section->vma
2852 + input_section->output_offset);
2854 /* Complain if the relocation is in a read-only section
2855 and not in a literal pool. */
2856 if ((input_section->flags & SEC_READONLY) != 0
2857 && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
2861 _("dynamic relocation in read-only section");
2862 if (!((*info->callbacks->reloc_dangerous)
2863 (info, error_message, input_bfd, input_section,
2870 outrel.r_addend = rel->r_addend;
2873 if (r_type == R_XTENSA_32)
2876 ELF32_R_INFO (h->dynindx, R_XTENSA_GLOB_DAT);
2879 else /* r_type == R_XTENSA_PLT */
2882 ELF32_R_INFO (h->dynindx, R_XTENSA_JMP_SLOT);
2884 /* Create the PLT entry and set the initial
2885 contents of the literal entry to the address of
2888 elf_xtensa_create_plt_entry (info, output_bfd,
2891 unresolved_reloc = FALSE;
2895 /* Generate a RELATIVE relocation. */
2896 outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
2897 outrel.r_addend = 0;
2901 loc = (srel->contents
2902 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2903 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2904 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2907 else if (r_type == R_XTENSA_ASM_EXPAND && dynamic_symbol)
2909 /* This should only happen for non-PIC code, which is not
2910 supposed to be used on systems with dynamic linking.
2911 Just ignore these relocations. */
2916 case R_XTENSA_TLS_TPOFF:
2917 /* Switch to LE model for local symbols in an executable. */
2918 if (! info->shared && ! dynamic_symbol)
2920 relocation = tpoff (info, relocation);
2925 case R_XTENSA_TLSDESC_FN:
2926 case R_XTENSA_TLSDESC_ARG:
2928 if (r_type == R_XTENSA_TLSDESC_FN)
2930 if (! info->shared || (tls_type & GOT_TLS_IE) != 0)
2931 r_type = R_XTENSA_NONE;
2933 else if (r_type == R_XTENSA_TLSDESC_ARG)
2937 if ((tls_type & GOT_TLS_IE) != 0)
2938 r_type = R_XTENSA_TLS_TPOFF;
2942 r_type = R_XTENSA_TLS_TPOFF;
2943 if (! dynamic_symbol)
2945 relocation = tpoff (info, relocation);
2951 if (r_type == R_XTENSA_NONE)
2952 /* Nothing to do here; skip to the next reloc. */
2955 if (! elf_hash_table (info)->dynamic_sections_created)
2958 _("TLS relocation invalid without dynamic sections");
2959 if (!((*info->callbacks->reloc_dangerous)
2960 (info, error_message, input_bfd, input_section,
2966 Elf_Internal_Rela outrel;
2968 asection *srel = htab->srelgot;
2971 outrel.r_offset = (input_section->output_section->vma
2972 + input_section->output_offset
2975 /* Complain if the relocation is in a read-only section
2976 and not in a literal pool. */
2977 if ((input_section->flags & SEC_READONLY) != 0
2978 && ! elf_xtensa_in_literal_pool (lit_table, ltblsize,
2982 _("dynamic relocation in read-only section");
2983 if (!((*info->callbacks->reloc_dangerous)
2984 (info, error_message, input_bfd, input_section,
2989 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2991 outrel.r_addend = relocation - dtpoff_base (info);
2993 outrel.r_addend = 0;
2996 outrel.r_info = ELF32_R_INFO (indx, r_type);
2998 unresolved_reloc = FALSE;
3001 loc = (srel->contents
3002 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
3003 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3004 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
3010 case R_XTENSA_TLS_DTPOFF:
3012 /* Switch from LD model to LE model. */
3013 relocation = tpoff (info, relocation);
3015 relocation -= dtpoff_base (info);
3018 case R_XTENSA_TLS_FUNC:
3019 case R_XTENSA_TLS_ARG:
3020 case R_XTENSA_TLS_CALL:
3021 /* Check if optimizing to IE or LE model. */
3022 if ((tls_type & GOT_TLS_IE) != 0)
3024 bfd_boolean is_ld_model =
3025 (h && elf_xtensa_hash_entry (h) == htab->tlsbase);
3026 if (! replace_tls_insn (rel, input_bfd, input_section, contents,
3027 is_ld_model, &error_message))
3029 if (!((*info->callbacks->reloc_dangerous)
3030 (info, error_message, input_bfd, input_section,
3035 if (r_type != R_XTENSA_TLS_ARG || is_ld_model)
3037 /* Skip subsequent relocations on the same instruction. */
3038 while (rel + 1 < relend && rel[1].r_offset == rel->r_offset)
3045 if (elf_hash_table (info)->dynamic_sections_created
3046 && dynamic_symbol && (is_operand_relocation (r_type)
3047 || r_type == R_XTENSA_32_PCREL))
3050 vsprint_msg ("invalid relocation for dynamic symbol", ": %s",
3051 strlen (name) + 2, name);
3052 if (!((*info->callbacks->reloc_dangerous)
3053 (info, error_message, input_bfd, input_section,
3061 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3062 because such sections are not SEC_ALLOC and thus ld.so will
3063 not process them. */
3064 if (unresolved_reloc
3065 && !((input_section->flags & SEC_DEBUGGING) != 0
3067 && _bfd_elf_section_offset (output_bfd, info, input_section,
3068 rel->r_offset) != (bfd_vma) -1)
3070 (*_bfd_error_handler)
3071 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3074 (long) rel->r_offset,
3080 /* TLS optimizations may have changed r_type; update "howto". */
3081 howto = &elf_howto_table[r_type];
3083 /* There's no point in calling bfd_perform_relocation here.
3084 Just go directly to our "special function". */
3085 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
3086 relocation + rel->r_addend,
3087 contents, rel->r_offset, is_weak_undef,
3090 if (r != bfd_reloc_ok && !warned)
3092 BFD_ASSERT (r == bfd_reloc_dangerous || r == bfd_reloc_other);
3093 BFD_ASSERT (error_message != NULL);
3095 if (rel->r_addend == 0)
3096 error_message = vsprint_msg (error_message, ": %s",
3097 strlen (name) + 2, name);
3099 error_message = vsprint_msg (error_message, ": (%s+0x%x)",
3101 name, (int) rel->r_addend);
3103 if (!((*info->callbacks->reloc_dangerous)
3104 (info, error_message, input_bfd, input_section,
3113 input_section->reloc_done = TRUE;
3119 /* Finish up dynamic symbol handling. There's not much to do here since
3120 the PLT and GOT entries are all set up by relocate_section. */
3123 elf_xtensa_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
3124 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3125 struct elf_link_hash_entry *h,
3126 Elf_Internal_Sym *sym)
3128 if (h->needs_plt && !h->def_regular)
3130 /* Mark the symbol as undefined, rather than as defined in
3131 the .plt section. Leave the value alone. */
3132 sym->st_shndx = SHN_UNDEF;
3133 /* If the symbol is weak, we do need to clear the value.
3134 Otherwise, the PLT entry would provide a definition for
3135 the symbol even if the symbol wasn't defined anywhere,
3136 and so the symbol would never be NULL. */
3137 if (!h->ref_regular_nonweak)
3141 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
3142 if (h == elf_hash_table (info)->hdynamic
3143 || h == elf_hash_table (info)->hgot)
3144 sym->st_shndx = SHN_ABS;
3150 /* Combine adjacent literal table entries in the output. Adjacent
3151 entries within each input section may have been removed during
3152 relaxation, but we repeat the process here, even though it's too late
3153 to shrink the output section, because it's important to minimize the
3154 number of literal table entries to reduce the start-up work for the
3155 runtime linker. Returns the number of remaining table entries or -1
3159 elf_xtensa_combine_prop_entries (bfd *output_bfd,
3164 property_table_entry *table;
3165 bfd_size_type section_size, sgotloc_size;
3169 section_size = sxtlit->size;
3170 BFD_ASSERT (section_size % 8 == 0);
3171 num = section_size / 8;
3173 sgotloc_size = sgotloc->size;
3174 if (sgotloc_size != section_size)
3176 (*_bfd_error_handler)
3177 (_("internal inconsistency in size of .got.loc section"));
3181 table = bfd_malloc (num * sizeof (property_table_entry));
3185 /* The ".xt.lit.plt" section has the SEC_IN_MEMORY flag set and this
3186 propagates to the output section, where it doesn't really apply and
3187 where it breaks the following call to bfd_malloc_and_get_section. */
3188 sxtlit->flags &= ~SEC_IN_MEMORY;
3190 if (!bfd_malloc_and_get_section (output_bfd, sxtlit, &contents))
3198 /* There should never be any relocations left at this point, so this
3199 is quite a bit easier than what is done during relaxation. */
3201 /* Copy the raw contents into a property table array and sort it. */
3203 for (n = 0; n < num; n++)
3205 table[n].address = bfd_get_32 (output_bfd, &contents[offset]);
3206 table[n].size = bfd_get_32 (output_bfd, &contents[offset + 4]);
3209 qsort (table, num, sizeof (property_table_entry), property_table_compare);
3211 for (n = 0; n < num; n++)
3213 bfd_boolean remove_entry = FALSE;
3215 if (table[n].size == 0)
3216 remove_entry = TRUE;
3218 && (table[n-1].address + table[n-1].size == table[n].address))
3220 table[n-1].size += table[n].size;
3221 remove_entry = TRUE;
3226 for (m = n; m < num - 1; m++)
3228 table[m].address = table[m+1].address;
3229 table[m].size = table[m+1].size;
3237 /* Copy the data back to the raw contents. */
3239 for (n = 0; n < num; n++)
3241 bfd_put_32 (output_bfd, table[n].address, &contents[offset]);
3242 bfd_put_32 (output_bfd, table[n].size, &contents[offset + 4]);
3246 /* Clear the removed bytes. */
3247 if ((bfd_size_type) (num * 8) < section_size)
3248 memset (&contents[num * 8], 0, section_size - num * 8);
3250 if (! bfd_set_section_contents (output_bfd, sxtlit, contents, 0,
3254 /* Copy the contents to ".got.loc". */
3255 memcpy (sgotloc->contents, contents, section_size);
3263 /* Finish up the dynamic sections. */
3266 elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
3267 struct bfd_link_info *info)
3269 struct elf_xtensa_link_hash_table *htab;
3271 asection *sdyn, *srelplt, *sgot, *sxtlit, *sgotloc;
3272 Elf32_External_Dyn *dyncon, *dynconend;
3273 int num_xtlit_entries = 0;
3275 if (! elf_hash_table (info)->dynamic_sections_created)
3278 htab = elf_xtensa_hash_table (info);
3282 dynobj = elf_hash_table (info)->dynobj;
3283 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3284 BFD_ASSERT (sdyn != NULL);
3286 /* Set the first entry in the global offset table to the address of
3287 the dynamic section. */
3291 BFD_ASSERT (sgot->size == 4);
3293 bfd_put_32 (output_bfd, 0, sgot->contents);
3295 bfd_put_32 (output_bfd,
3296 sdyn->output_section->vma + sdyn->output_offset,
3300 srelplt = htab->srelplt;
3301 if (srelplt && srelplt->size != 0)
3303 asection *sgotplt, *srelgot, *spltlittbl;
3304 int chunk, plt_chunks, plt_entries;
3305 Elf_Internal_Rela irela;
3307 unsigned rtld_reloc;
3309 srelgot = htab->srelgot;
3310 spltlittbl = htab->spltlittbl;
3311 BFD_ASSERT (srelgot != NULL && spltlittbl != NULL);
3313 /* Find the first XTENSA_RTLD relocation. Presumably the rest
3314 of them follow immediately after.... */
3315 for (rtld_reloc = 0; rtld_reloc < srelgot->reloc_count; rtld_reloc++)
3317 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3318 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3319 if (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD)
3322 BFD_ASSERT (rtld_reloc < srelgot->reloc_count);
3324 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
3326 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
3328 for (chunk = 0; chunk < plt_chunks; chunk++)
3330 int chunk_entries = 0;
3332 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
3333 BFD_ASSERT (sgotplt != NULL);
3335 /* Emit special RTLD relocations for the first two entries in
3336 each chunk of the .got.plt section. */
3338 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3339 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3340 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3341 irela.r_offset = (sgotplt->output_section->vma
3342 + sgotplt->output_offset);
3343 irela.r_addend = 1; /* tell rtld to set value to resolver function */
3344 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3346 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3348 /* Next literal immediately follows the first. */
3349 loc += sizeof (Elf32_External_Rela);
3350 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3351 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3352 irela.r_offset = (sgotplt->output_section->vma
3353 + sgotplt->output_offset + 4);
3354 /* Tell rtld to set value to object's link map. */
3356 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3358 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3360 /* Fill in the literal table. */
3361 if (chunk < plt_chunks - 1)
3362 chunk_entries = PLT_ENTRIES_PER_CHUNK;
3364 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
3366 BFD_ASSERT ((unsigned) (chunk + 1) * 8 <= spltlittbl->size);
3367 bfd_put_32 (output_bfd,
3368 sgotplt->output_section->vma + sgotplt->output_offset,
3369 spltlittbl->contents + (chunk * 8) + 0);
3370 bfd_put_32 (output_bfd,
3371 8 + (chunk_entries * 4),
3372 spltlittbl->contents + (chunk * 8) + 4);
3375 /* All the dynamic relocations have been emitted at this point.
3376 Make sure the relocation sections are the correct size. */
3377 if (srelgot->size != (sizeof (Elf32_External_Rela)
3378 * srelgot->reloc_count)
3379 || srelplt->size != (sizeof (Elf32_External_Rela)
3380 * srelplt->reloc_count))
3383 /* The .xt.lit.plt section has just been modified. This must
3384 happen before the code below which combines adjacent literal
3385 table entries, and the .xt.lit.plt contents have to be forced to
3387 if (! bfd_set_section_contents (output_bfd,
3388 spltlittbl->output_section,
3389 spltlittbl->contents,
3390 spltlittbl->output_offset,
3393 /* Clear SEC_HAS_CONTENTS so the contents won't be output again. */
3394 spltlittbl->flags &= ~SEC_HAS_CONTENTS;
3397 /* Combine adjacent literal table entries. */
3398 BFD_ASSERT (! info->relocatable);
3399 sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");
3400 sgotloc = htab->sgotloc;
3401 BFD_ASSERT (sgotloc);
3405 elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc);
3406 if (num_xtlit_entries < 0)
3410 dyncon = (Elf32_External_Dyn *) sdyn->contents;
3411 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3412 for (; dyncon < dynconend; dyncon++)
3414 Elf_Internal_Dyn dyn;
3416 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3423 case DT_XTENSA_GOT_LOC_SZ:
3424 dyn.d_un.d_val = num_xtlit_entries;
3427 case DT_XTENSA_GOT_LOC_OFF:
3428 dyn.d_un.d_ptr = htab->sgotloc->output_section->vma;
3432 dyn.d_un.d_ptr = htab->sgot->output_section->vma;
3436 dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
3440 dyn.d_un.d_val = htab->srelplt->output_section->size;
3444 /* Adjust RELASZ to not include JMPREL. This matches what
3445 glibc expects and what is done for several other ELF
3446 targets (e.g., i386, alpha), but the "correct" behavior
3447 seems to be unresolved. Since the linker script arranges
3448 for .rela.plt to follow all other relocation sections, we
3449 don't have to worry about changing the DT_RELA entry. */
3451 dyn.d_un.d_val -= htab->srelplt->output_section->size;
3455 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3462 /* Functions for dealing with the e_flags field. */
3464 /* Merge backend specific data from an object file to the output
3465 object file when linking. */
3468 elf_xtensa_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3470 unsigned out_mach, in_mach;
3471 flagword out_flag, in_flag;
3473 /* Check if we have the same endianness. */
3474 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
3477 /* Don't even pretend to support mixed-format linking. */
3478 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3479 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3482 out_flag = elf_elfheader (obfd)->e_flags;
3483 in_flag = elf_elfheader (ibfd)->e_flags;
3485 out_mach = out_flag & EF_XTENSA_MACH;
3486 in_mach = in_flag & EF_XTENSA_MACH;
3487 if (out_mach != in_mach)
3489 (*_bfd_error_handler)
3490 (_("%B: incompatible machine type. Output is 0x%x. Input is 0x%x"),
3491 ibfd, out_mach, in_mach);
3492 bfd_set_error (bfd_error_wrong_format);
3496 if (! elf_flags_init (obfd))
3498 elf_flags_init (obfd) = TRUE;
3499 elf_elfheader (obfd)->e_flags = in_flag;
3501 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
3502 && bfd_get_arch_info (obfd)->the_default)
3503 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
3504 bfd_get_mach (ibfd));
3509 if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
3510 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
3512 if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
3513 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
3520 elf_xtensa_set_private_flags (bfd *abfd, flagword flags)
3522 BFD_ASSERT (!elf_flags_init (abfd)
3523 || elf_elfheader (abfd)->e_flags == flags);
3525 elf_elfheader (abfd)->e_flags |= flags;
3526 elf_flags_init (abfd) = TRUE;
3533 elf_xtensa_print_private_bfd_data (bfd *abfd, void *farg)
3535 FILE *f = (FILE *) farg;
3536 flagword e_flags = elf_elfheader (abfd)->e_flags;
3538 fprintf (f, "\nXtensa header:\n");
3539 if ((e_flags & EF_XTENSA_MACH) == E_XTENSA_MACH)
3540 fprintf (f, "\nMachine = Base\n");
3542 fprintf (f, "\nMachine Id = 0x%x\n", e_flags & EF_XTENSA_MACH);
3544 fprintf (f, "Insn tables = %s\n",
3545 (e_flags & EF_XTENSA_XT_INSN) ? "true" : "false");
3547 fprintf (f, "Literal tables = %s\n",
3548 (e_flags & EF_XTENSA_XT_LIT) ? "true" : "false");
3550 return _bfd_elf_print_private_bfd_data (abfd, farg);
3554 /* Set the right machine number for an Xtensa ELF file. */
3557 elf_xtensa_object_p (bfd *abfd)
3560 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
3565 mach = bfd_mach_xtensa;
3571 (void) bfd_default_set_arch_mach (abfd, bfd_arch_xtensa, mach);
3576 /* The final processing done just before writing out an Xtensa ELF object
3577 file. This gets the Xtensa architecture right based on the machine
3581 elf_xtensa_final_write_processing (bfd *abfd,
3582 bfd_boolean linker ATTRIBUTE_UNUSED)
3587 switch (mach = bfd_get_mach (abfd))
3589 case bfd_mach_xtensa:
3590 val = E_XTENSA_MACH;
3596 elf_elfheader (abfd)->e_flags &= (~ EF_XTENSA_MACH);
3597 elf_elfheader (abfd)->e_flags |= val;
3601 static enum elf_reloc_type_class
3602 elf_xtensa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3603 const asection *rel_sec ATTRIBUTE_UNUSED,
3604 const Elf_Internal_Rela *rela)
3606 switch ((int) ELF32_R_TYPE (rela->r_info))
3608 case R_XTENSA_RELATIVE:
3609 return reloc_class_relative;
3610 case R_XTENSA_JMP_SLOT:
3611 return reloc_class_plt;
3613 return reloc_class_normal;
3619 elf_xtensa_discard_info_for_section (bfd *abfd,
3620 struct elf_reloc_cookie *cookie,
3621 struct bfd_link_info *info,
3625 bfd_vma offset, actual_offset;
3626 bfd_size_type removed_bytes = 0;
3627 bfd_size_type entry_size;
3629 if (sec->output_section
3630 && bfd_is_abs_section (sec->output_section))
3633 if (xtensa_is_proptable_section (sec))
3638 if (sec->size == 0 || sec->size % entry_size != 0)
3641 contents = retrieve_contents (abfd, sec, info->keep_memory);
3645 cookie->rels = retrieve_internal_relocs (abfd, sec, info->keep_memory);
3648 release_contents (sec, contents);
3652 /* Sort the relocations. They should already be in order when
3653 relaxation is enabled, but it might not be. */
3654 qsort (cookie->rels, sec->reloc_count, sizeof (Elf_Internal_Rela),
3655 internal_reloc_compare);
3657 cookie->rel = cookie->rels;
3658 cookie->relend = cookie->rels + sec->reloc_count;
3660 for (offset = 0; offset < sec->size; offset += entry_size)
3662 actual_offset = offset - removed_bytes;
3664 /* The ...symbol_deleted_p function will skip over relocs but it
3665 won't adjust their offsets, so do that here. */
3666 while (cookie->rel < cookie->relend
3667 && cookie->rel->r_offset < offset)
3669 cookie->rel->r_offset -= removed_bytes;
3673 while (cookie->rel < cookie->relend
3674 && cookie->rel->r_offset == offset)
3676 if (bfd_elf_reloc_symbol_deleted_p (offset, cookie))
3678 /* Remove the table entry. (If the reloc type is NONE, then
3679 the entry has already been merged with another and deleted
3680 during relaxation.) */
3681 if (ELF32_R_TYPE (cookie->rel->r_info) != R_XTENSA_NONE)
3683 /* Shift the contents up. */
3684 if (offset + entry_size < sec->size)
3685 memmove (&contents[actual_offset],
3686 &contents[actual_offset + entry_size],
3687 sec->size - offset - entry_size);
3688 removed_bytes += entry_size;
3691 /* Remove this relocation. */
3692 cookie->rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
3695 /* Adjust the relocation offset for previous removals. This
3696 should not be done before calling ...symbol_deleted_p
3697 because it might mess up the offset comparisons there.
3698 Make sure the offset doesn't underflow in the case where
3699 the first entry is removed. */
3700 if (cookie->rel->r_offset >= removed_bytes)
3701 cookie->rel->r_offset -= removed_bytes;
3703 cookie->rel->r_offset = 0;
3709 if (removed_bytes != 0)
3711 /* Adjust any remaining relocs (shouldn't be any). */
3712 for (; cookie->rel < cookie->relend; cookie->rel++)
3714 if (cookie->rel->r_offset >= removed_bytes)
3715 cookie->rel->r_offset -= removed_bytes;
3717 cookie->rel->r_offset = 0;
3720 /* Clear the removed bytes. */
3721 memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
3723 pin_contents (sec, contents);
3724 pin_internal_relocs (sec, cookie->rels);
3727 if (sec->rawsize == 0)
3728 sec->rawsize = sec->size;
3729 sec->size -= removed_bytes;
3731 if (xtensa_is_littable_section (sec))
3733 asection *sgotloc = elf_xtensa_hash_table (info)->sgotloc;
3735 sgotloc->size -= removed_bytes;
3740 release_contents (sec, contents);
3741 release_internal_relocs (sec, cookie->rels);
3744 return (removed_bytes != 0);
3749 elf_xtensa_discard_info (bfd *abfd,
3750 struct elf_reloc_cookie *cookie,
3751 struct bfd_link_info *info)
3754 bfd_boolean changed = FALSE;
3756 for (sec = abfd->sections; sec != NULL; sec = sec->next)
3758 if (xtensa_is_property_section (sec))
3760 if (elf_xtensa_discard_info_for_section (abfd, cookie, info, sec))
3770 elf_xtensa_ignore_discarded_relocs (asection *sec)
3772 return xtensa_is_property_section (sec);
3777 elf_xtensa_action_discarded (asection *sec)
3779 if (strcmp (".xt_except_table", sec->name) == 0)
3782 if (strcmp (".xt_except_desc", sec->name) == 0)
3785 return _bfd_elf_default_action_discarded (sec);
3789 /* Support for core dump NOTE sections. */
3792 elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3797 /* The size for Xtensa is variable, so don't try to recognize the format
3798 based on the size. Just assume this is GNU/Linux. */
3801 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3804 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
3808 size = note->descsz - offset - 4;
3810 /* Make a ".reg/999" section. */
3811 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3812 size, note->descpos + offset);
3817 elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3819 switch (note->descsz)
3824 case 128: /* GNU/Linux elf_prpsinfo */
3825 elf_tdata (abfd)->core->program
3826 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3827 elf_tdata (abfd)->core->command
3828 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3831 /* Note that for some reason, a spurious space is tacked
3832 onto the end of the args in some (at least one anyway)
3833 implementations, so strip it off if it exists. */
3836 char *command = elf_tdata (abfd)->core->command;
3837 int n = strlen (command);
3839 if (0 < n && command[n - 1] == ' ')
3840 command[n - 1] = '\0';
3847 /* Generic Xtensa configurability stuff. */
3849 static xtensa_opcode callx0_op = XTENSA_UNDEFINED;
3850 static xtensa_opcode callx4_op = XTENSA_UNDEFINED;
3851 static xtensa_opcode callx8_op = XTENSA_UNDEFINED;
3852 static xtensa_opcode callx12_op = XTENSA_UNDEFINED;
3853 static xtensa_opcode call0_op = XTENSA_UNDEFINED;
3854 static xtensa_opcode call4_op = XTENSA_UNDEFINED;
3855 static xtensa_opcode call8_op = XTENSA_UNDEFINED;
3856 static xtensa_opcode call12_op = XTENSA_UNDEFINED;
3859 init_call_opcodes (void)
3861 if (callx0_op == XTENSA_UNDEFINED)
3863 callx0_op = xtensa_opcode_lookup (xtensa_default_isa, "callx0");
3864 callx4_op = xtensa_opcode_lookup (xtensa_default_isa, "callx4");
3865 callx8_op = xtensa_opcode_lookup (xtensa_default_isa, "callx8");
3866 callx12_op = xtensa_opcode_lookup (xtensa_default_isa, "callx12");
3867 call0_op = xtensa_opcode_lookup (xtensa_default_isa, "call0");
3868 call4_op = xtensa_opcode_lookup (xtensa_default_isa, "call4");
3869 call8_op = xtensa_opcode_lookup (xtensa_default_isa, "call8");
3870 call12_op = xtensa_opcode_lookup (xtensa_default_isa, "call12");
3876 is_indirect_call_opcode (xtensa_opcode opcode)
3878 init_call_opcodes ();
3879 return (opcode == callx0_op
3880 || opcode == callx4_op
3881 || opcode == callx8_op
3882 || opcode == callx12_op);
3887 is_direct_call_opcode (xtensa_opcode opcode)
3889 init_call_opcodes ();
3890 return (opcode == call0_op
3891 || opcode == call4_op
3892 || opcode == call8_op
3893 || opcode == call12_op);
3898 is_windowed_call_opcode (xtensa_opcode opcode)
3900 init_call_opcodes ();
3901 return (opcode == call4_op
3902 || opcode == call8_op
3903 || opcode == call12_op
3904 || opcode == callx4_op
3905 || opcode == callx8_op
3906 || opcode == callx12_op);
3911 get_indirect_call_dest_reg (xtensa_opcode opcode, unsigned *pdst)
3913 unsigned dst = (unsigned) -1;
3915 init_call_opcodes ();
3916 if (opcode == callx0_op)
3918 else if (opcode == callx4_op)
3920 else if (opcode == callx8_op)
3922 else if (opcode == callx12_op)
3925 if (dst == (unsigned) -1)
3933 static xtensa_opcode
3934 get_const16_opcode (void)
3936 static bfd_boolean done_lookup = FALSE;
3937 static xtensa_opcode const16_opcode = XTENSA_UNDEFINED;
3940 const16_opcode = xtensa_opcode_lookup (xtensa_default_isa, "const16");
3943 return const16_opcode;
3947 static xtensa_opcode
3948 get_l32r_opcode (void)
3950 static xtensa_opcode l32r_opcode = XTENSA_UNDEFINED;
3951 static bfd_boolean done_lookup = FALSE;
3955 l32r_opcode = xtensa_opcode_lookup (xtensa_default_isa, "l32r");
3963 l32r_offset (bfd_vma addr, bfd_vma pc)
3967 offset = addr - ((pc+3) & -4);
3968 BFD_ASSERT ((offset & ((1 << 2) - 1)) == 0);
3969 offset = (signed int) offset >> 2;
3970 BFD_ASSERT ((signed int) offset >> 16 == -1);
3976 get_relocation_opnd (xtensa_opcode opcode, int r_type)
3978 xtensa_isa isa = xtensa_default_isa;
3979 int last_immed, last_opnd, opi;
3981 if (opcode == XTENSA_UNDEFINED)
3982 return XTENSA_UNDEFINED;
3984 /* Find the last visible PC-relative immediate operand for the opcode.
3985 If there are no PC-relative immediates, then choose the last visible
3986 immediate; otherwise, fail and return XTENSA_UNDEFINED. */
3987 last_immed = XTENSA_UNDEFINED;
3988 last_opnd = xtensa_opcode_num_operands (isa, opcode);
3989 for (opi = last_opnd - 1; opi >= 0; opi--)
3991 if (xtensa_operand_is_visible (isa, opcode, opi) == 0)
3993 if (xtensa_operand_is_PCrelative (isa, opcode, opi) == 1)
3998 if (last_immed == XTENSA_UNDEFINED
3999 && xtensa_operand_is_register (isa, opcode, opi) == 0)
4003 return XTENSA_UNDEFINED;
4005 /* If the operand number was specified in an old-style relocation,
4006 check for consistency with the operand computed above. */
4007 if (r_type >= R_XTENSA_OP0 && r_type <= R_XTENSA_OP2)
4009 int reloc_opnd = r_type - R_XTENSA_OP0;
4010 if (reloc_opnd != last_immed)
4011 return XTENSA_UNDEFINED;
4019 get_relocation_slot (int r_type)
4029 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
4030 return r_type - R_XTENSA_SLOT0_OP;
4031 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
4032 return r_type - R_XTENSA_SLOT0_ALT;
4036 return XTENSA_UNDEFINED;
4040 /* Get the opcode for a relocation. */
4042 static xtensa_opcode
4043 get_relocation_opcode (bfd *abfd,
4046 Elf_Internal_Rela *irel)
4048 static xtensa_insnbuf ibuff = NULL;
4049 static xtensa_insnbuf sbuff = NULL;
4050 xtensa_isa isa = xtensa_default_isa;
4054 if (contents == NULL)
4055 return XTENSA_UNDEFINED;
4057 if (bfd_get_section_limit (abfd, sec) <= irel->r_offset)
4058 return XTENSA_UNDEFINED;
4062 ibuff = xtensa_insnbuf_alloc (isa);
4063 sbuff = xtensa_insnbuf_alloc (isa);
4066 /* Decode the instruction. */
4067 xtensa_insnbuf_from_chars (isa, ibuff, &contents[irel->r_offset],
4068 sec->size - irel->r_offset);
4069 fmt = xtensa_format_decode (isa, ibuff);
4070 slot = get_relocation_slot (ELF32_R_TYPE (irel->r_info));
4071 if (slot == XTENSA_UNDEFINED)
4072 return XTENSA_UNDEFINED;
4073 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
4074 return xtensa_opcode_decode (isa, fmt, slot, sbuff);
4079 is_l32r_relocation (bfd *abfd,
4082 Elf_Internal_Rela *irel)
4084 xtensa_opcode opcode;
4085 if (!is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
4087 opcode = get_relocation_opcode (abfd, sec, contents, irel);
4088 return (opcode == get_l32r_opcode ());
4092 static bfd_size_type
4093 get_asm_simplify_size (bfd_byte *contents,
4094 bfd_size_type content_len,
4095 bfd_size_type offset)
4097 bfd_size_type insnlen, size = 0;
4099 /* Decode the size of the next two instructions. */
4100 insnlen = insn_decode_len (contents, content_len, offset);
4106 insnlen = insn_decode_len (contents, content_len, offset + size);
4116 is_alt_relocation (int r_type)
4118 return (r_type >= R_XTENSA_SLOT0_ALT
4119 && r_type <= R_XTENSA_SLOT14_ALT);
4124 is_operand_relocation (int r_type)
4134 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
4136 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
4145 #define MIN_INSN_LENGTH 2
4147 /* Return 0 if it fails to decode. */
4150 insn_decode_len (bfd_byte *contents,
4151 bfd_size_type content_len,
4152 bfd_size_type offset)
4155 xtensa_isa isa = xtensa_default_isa;
4157 static xtensa_insnbuf ibuff = NULL;
4159 if (offset + MIN_INSN_LENGTH > content_len)
4163 ibuff = xtensa_insnbuf_alloc (isa);
4164 xtensa_insnbuf_from_chars (isa, ibuff, &contents[offset],
4165 content_len - offset);
4166 fmt = xtensa_format_decode (isa, ibuff);
4167 if (fmt == XTENSA_UNDEFINED)
4169 insn_len = xtensa_format_length (isa, fmt);
4170 if (insn_len == XTENSA_UNDEFINED)
4176 /* Decode the opcode for a single slot instruction.
4177 Return 0 if it fails to decode or the instruction is multi-slot. */
4180 insn_decode_opcode (bfd_byte *contents,
4181 bfd_size_type content_len,
4182 bfd_size_type offset,
4185 xtensa_isa isa = xtensa_default_isa;
4187 static xtensa_insnbuf insnbuf = NULL;
4188 static xtensa_insnbuf slotbuf = NULL;
4190 if (offset + MIN_INSN_LENGTH > content_len)
4191 return XTENSA_UNDEFINED;
4193 if (insnbuf == NULL)
4195 insnbuf = xtensa_insnbuf_alloc (isa);
4196 slotbuf = xtensa_insnbuf_alloc (isa);
4199 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4200 content_len - offset);
4201 fmt = xtensa_format_decode (isa, insnbuf);
4202 if (fmt == XTENSA_UNDEFINED)
4203 return XTENSA_UNDEFINED;
4205 if (slot >= xtensa_format_num_slots (isa, fmt))
4206 return XTENSA_UNDEFINED;
4208 xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
4209 return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
4213 /* The offset is the offset in the contents.
4214 The address is the address of that offset. */
4217 check_branch_target_aligned (bfd_byte *contents,
4218 bfd_size_type content_length,
4222 bfd_size_type insn_len = insn_decode_len (contents, content_length, offset);
4225 return check_branch_target_aligned_address (address, insn_len);
4230 check_loop_aligned (bfd_byte *contents,
4231 bfd_size_type content_length,
4235 bfd_size_type loop_len, insn_len;
4236 xtensa_opcode opcode;
4238 opcode = insn_decode_opcode (contents, content_length, offset, 0);
4239 if (opcode == XTENSA_UNDEFINED
4240 || xtensa_opcode_is_loop (xtensa_default_isa, opcode) != 1)
4246 loop_len = insn_decode_len (contents, content_length, offset);
4247 insn_len = insn_decode_len (contents, content_length, offset + loop_len);
4248 if (loop_len == 0 || insn_len == 0)
4254 return check_branch_target_aligned_address (address + loop_len, insn_len);
4259 check_branch_target_aligned_address (bfd_vma addr, int len)
4262 return (addr % 8 == 0);
4263 return ((addr >> 2) == ((addr + len - 1) >> 2));
4267 /* Instruction widening and narrowing. */
4269 /* When FLIX is available we need to access certain instructions only
4270 when they are 16-bit or 24-bit instructions. This table caches
4271 information about such instructions by walking through all the
4272 opcodes and finding the smallest single-slot format into which each
4275 static xtensa_format *op_single_fmt_table = NULL;
4279 init_op_single_format_table (void)
4281 xtensa_isa isa = xtensa_default_isa;
4282 xtensa_insnbuf ibuf;
4283 xtensa_opcode opcode;
4287 if (op_single_fmt_table)
4290 ibuf = xtensa_insnbuf_alloc (isa);
4291 num_opcodes = xtensa_isa_num_opcodes (isa);
4293 op_single_fmt_table = (xtensa_format *)
4294 bfd_malloc (sizeof (xtensa_format) * num_opcodes);
4295 for (opcode = 0; opcode < num_opcodes; opcode++)
4297 op_single_fmt_table[opcode] = XTENSA_UNDEFINED;
4298 for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
4300 if (xtensa_format_num_slots (isa, fmt) == 1
4301 && xtensa_opcode_encode (isa, fmt, 0, ibuf, opcode) == 0)
4303 xtensa_opcode old_fmt = op_single_fmt_table[opcode];
4304 int fmt_length = xtensa_format_length (isa, fmt);
4305 if (old_fmt == XTENSA_UNDEFINED
4306 || fmt_length < xtensa_format_length (isa, old_fmt))
4307 op_single_fmt_table[opcode] = fmt;
4311 xtensa_insnbuf_free (isa, ibuf);
4315 static xtensa_format
4316 get_single_format (xtensa_opcode opcode)
4318 init_op_single_format_table ();
4319 return op_single_fmt_table[opcode];
4323 /* For the set of narrowable instructions we do NOT include the
4324 narrowings beqz -> beqz.n or bnez -> bnez.n because of complexities
4325 involved during linker relaxation that may require these to
4326 re-expand in some conditions. Also, the narrowing "or" -> mov.n
4327 requires special case code to ensure it only works when op1 == op2. */
4335 struct string_pair narrowable[] =
4338 { "addi", "addi.n" },
4339 { "addmi", "addi.n" },
4340 { "l32i", "l32i.n" },
4341 { "movi", "movi.n" },
4343 { "retw", "retw.n" },
4344 { "s32i", "s32i.n" },
4345 { "or", "mov.n" } /* special case only when op1 == op2 */
4348 struct string_pair widenable[] =
4351 { "addi", "addi.n" },
4352 { "addmi", "addi.n" },
4353 { "beqz", "beqz.n" },
4354 { "bnez", "bnez.n" },
4355 { "l32i", "l32i.n" },
4356 { "movi", "movi.n" },
4358 { "retw", "retw.n" },
4359 { "s32i", "s32i.n" },
4360 { "or", "mov.n" } /* special case only when op1 == op2 */
4364 /* Check if an instruction can be "narrowed", i.e., changed from a standard
4365 3-byte instruction to a 2-byte "density" instruction. If it is valid,
4366 return the instruction buffer holding the narrow instruction. Otherwise,
4367 return 0. The set of valid narrowing are specified by a string table
4368 but require some special case operand checks in some cases. */
4370 static xtensa_insnbuf
4371 can_narrow_instruction (xtensa_insnbuf slotbuf,
4373 xtensa_opcode opcode)
4375 xtensa_isa isa = xtensa_default_isa;
4376 xtensa_format o_fmt;
4379 static xtensa_insnbuf o_insnbuf = NULL;
4380 static xtensa_insnbuf o_slotbuf = NULL;
4382 if (o_insnbuf == NULL)
4384 o_insnbuf = xtensa_insnbuf_alloc (isa);
4385 o_slotbuf = xtensa_insnbuf_alloc (isa);
4388 for (opi = 0; opi < (sizeof (narrowable)/sizeof (struct string_pair)); opi++)
4390 bfd_boolean is_or = (strcmp ("or", narrowable[opi].wide) == 0);
4392 if (opcode == xtensa_opcode_lookup (isa, narrowable[opi].wide))
4394 uint32 value, newval;
4395 int i, operand_count, o_operand_count;
4396 xtensa_opcode o_opcode;
4398 /* Address does not matter in this case. We might need to
4399 fix it to handle branches/jumps. */
4400 bfd_vma self_address = 0;
4402 o_opcode = xtensa_opcode_lookup (isa, narrowable[opi].narrow);
4403 if (o_opcode == XTENSA_UNDEFINED)
4405 o_fmt = get_single_format (o_opcode);
4406 if (o_fmt == XTENSA_UNDEFINED)
4409 if (xtensa_format_length (isa, fmt) != 3
4410 || xtensa_format_length (isa, o_fmt) != 2)
4413 xtensa_format_encode (isa, o_fmt, o_insnbuf);
4414 operand_count = xtensa_opcode_num_operands (isa, opcode);
4415 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4417 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4422 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4427 uint32 rawval0, rawval1, rawval2;
4429 if (o_operand_count + 1 != operand_count
4430 || xtensa_operand_get_field (isa, opcode, 0,
4431 fmt, 0, slotbuf, &rawval0) != 0
4432 || xtensa_operand_get_field (isa, opcode, 1,
4433 fmt, 0, slotbuf, &rawval1) != 0
4434 || xtensa_operand_get_field (isa, opcode, 2,
4435 fmt, 0, slotbuf, &rawval2) != 0
4436 || rawval1 != rawval2
4437 || rawval0 == rawval1 /* it is a nop */)
4441 for (i = 0; i < o_operand_count; ++i)
4443 if (xtensa_operand_get_field (isa, opcode, i, fmt, 0,
4445 || xtensa_operand_decode (isa, opcode, i, &value))
4448 /* PC-relative branches need adjustment, but
4449 the PC-rel operand will always have a relocation. */
4451 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4453 || xtensa_operand_encode (isa, o_opcode, i, &newval)
4454 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4459 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4469 /* Attempt to narrow an instruction. If the narrowing is valid, perform
4470 the action in-place directly into the contents and return TRUE. Otherwise,
4471 the return value is FALSE and the contents are not modified. */
4474 narrow_instruction (bfd_byte *contents,
4475 bfd_size_type content_length,
4476 bfd_size_type offset)
4478 xtensa_opcode opcode;
4479 bfd_size_type insn_len;
4480 xtensa_isa isa = xtensa_default_isa;
4482 xtensa_insnbuf o_insnbuf;
4484 static xtensa_insnbuf insnbuf = NULL;
4485 static xtensa_insnbuf slotbuf = NULL;
4487 if (insnbuf == NULL)
4489 insnbuf = xtensa_insnbuf_alloc (isa);
4490 slotbuf = xtensa_insnbuf_alloc (isa);
4493 BFD_ASSERT (offset < content_length);
4495 if (content_length < 2)
4498 /* We will hand-code a few of these for a little while.
4499 These have all been specified in the assembler aleady. */
4500 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4501 content_length - offset);
4502 fmt = xtensa_format_decode (isa, insnbuf);
4503 if (xtensa_format_num_slots (isa, fmt) != 1)
4506 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4509 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4510 if (opcode == XTENSA_UNDEFINED)
4512 insn_len = xtensa_format_length (isa, fmt);
4513 if (insn_len > content_length)
4516 o_insnbuf = can_narrow_instruction (slotbuf, fmt, opcode);
4519 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4520 content_length - offset);
4528 /* Check if an instruction can be "widened", i.e., changed from a 2-byte
4529 "density" instruction to a standard 3-byte instruction. If it is valid,
4530 return the instruction buffer holding the wide instruction. Otherwise,
4531 return 0. The set of valid widenings are specified by a string table
4532 but require some special case operand checks in some cases. */
4534 static xtensa_insnbuf
4535 can_widen_instruction (xtensa_insnbuf slotbuf,
4537 xtensa_opcode opcode)
4539 xtensa_isa isa = xtensa_default_isa;
4540 xtensa_format o_fmt;
4543 static xtensa_insnbuf o_insnbuf = NULL;
4544 static xtensa_insnbuf o_slotbuf = NULL;
4546 if (o_insnbuf == NULL)
4548 o_insnbuf = xtensa_insnbuf_alloc (isa);
4549 o_slotbuf = xtensa_insnbuf_alloc (isa);
4552 for (opi = 0; opi < (sizeof (widenable)/sizeof (struct string_pair)); opi++)
4554 bfd_boolean is_or = (strcmp ("or", widenable[opi].wide) == 0);
4555 bfd_boolean is_branch = (strcmp ("beqz", widenable[opi].wide) == 0
4556 || strcmp ("bnez", widenable[opi].wide) == 0);
4558 if (opcode == xtensa_opcode_lookup (isa, widenable[opi].narrow))
4560 uint32 value, newval;
4561 int i, operand_count, o_operand_count, check_operand_count;
4562 xtensa_opcode o_opcode;
4564 /* Address does not matter in this case. We might need to fix it
4565 to handle branches/jumps. */
4566 bfd_vma self_address = 0;
4568 o_opcode = xtensa_opcode_lookup (isa, widenable[opi].wide);
4569 if (o_opcode == XTENSA_UNDEFINED)
4571 o_fmt = get_single_format (o_opcode);
4572 if (o_fmt == XTENSA_UNDEFINED)
4575 if (xtensa_format_length (isa, fmt) != 2
4576 || xtensa_format_length (isa, o_fmt) != 3)
4579 xtensa_format_encode (isa, o_fmt, o_insnbuf);
4580 operand_count = xtensa_opcode_num_operands (isa, opcode);
4581 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4582 check_operand_count = o_operand_count;
4584 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4589 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4594 uint32 rawval0, rawval1;
4596 if (o_operand_count != operand_count + 1
4597 || xtensa_operand_get_field (isa, opcode, 0,
4598 fmt, 0, slotbuf, &rawval0) != 0
4599 || xtensa_operand_get_field (isa, opcode, 1,
4600 fmt, 0, slotbuf, &rawval1) != 0
4601 || rawval0 == rawval1 /* it is a nop */)
4605 check_operand_count--;
4607 for (i = 0; i < check_operand_count; i++)
4610 if (is_or && i == o_operand_count - 1)
4612 if (xtensa_operand_get_field (isa, opcode, new_i, fmt, 0,
4614 || xtensa_operand_decode (isa, opcode, new_i, &value))
4617 /* PC-relative branches need adjustment, but
4618 the PC-rel operand will always have a relocation. */
4620 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4622 || xtensa_operand_encode (isa, o_opcode, i, &newval)
4623 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4628 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4638 /* Attempt to widen an instruction. If the widening is valid, perform
4639 the action in-place directly into the contents and return TRUE. Otherwise,
4640 the return value is FALSE and the contents are not modified. */
4643 widen_instruction (bfd_byte *contents,
4644 bfd_size_type content_length,
4645 bfd_size_type offset)
4647 xtensa_opcode opcode;
4648 bfd_size_type insn_len;
4649 xtensa_isa isa = xtensa_default_isa;
4651 xtensa_insnbuf o_insnbuf;
4653 static xtensa_insnbuf insnbuf = NULL;
4654 static xtensa_insnbuf slotbuf = NULL;
4656 if (insnbuf == NULL)
4658 insnbuf = xtensa_insnbuf_alloc (isa);
4659 slotbuf = xtensa_insnbuf_alloc (isa);
4662 BFD_ASSERT (offset < content_length);
4664 if (content_length < 2)
4667 /* We will hand-code a few of these for a little while.
4668 These have all been specified in the assembler aleady. */
4669 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4670 content_length - offset);
4671 fmt = xtensa_format_decode (isa, insnbuf);
4672 if (xtensa_format_num_slots (isa, fmt) != 1)
4675 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4678 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4679 if (opcode == XTENSA_UNDEFINED)
4681 insn_len = xtensa_format_length (isa, fmt);
4682 if (insn_len > content_length)
4685 o_insnbuf = can_widen_instruction (slotbuf, fmt, opcode);
4688 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4689 content_length - offset);
4696 /* Code for transforming CALLs at link-time. */
4698 static bfd_reloc_status_type
4699 elf_xtensa_do_asm_simplify (bfd_byte *contents,
4701 bfd_vma content_length,
4702 char **error_message)
4704 static xtensa_insnbuf insnbuf = NULL;
4705 static xtensa_insnbuf slotbuf = NULL;
4706 xtensa_format core_format = XTENSA_UNDEFINED;
4707 xtensa_opcode opcode;
4708 xtensa_opcode direct_call_opcode;
4709 xtensa_isa isa = xtensa_default_isa;
4710 bfd_byte *chbuf = contents + address;
4713 if (insnbuf == NULL)
4715 insnbuf = xtensa_insnbuf_alloc (isa);
4716 slotbuf = xtensa_insnbuf_alloc (isa);
4719 if (content_length < address)
4721 *error_message = _("Attempt to convert L32R/CALLX to CALL failed");
4722 return bfd_reloc_other;
4725 opcode = get_expanded_call_opcode (chbuf, content_length - address, 0);
4726 direct_call_opcode = swap_callx_for_call_opcode (opcode);
4727 if (direct_call_opcode == XTENSA_UNDEFINED)
4729 *error_message = _("Attempt to convert L32R/CALLX to CALL failed");
4730 return bfd_reloc_other;
4733 /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset. */
4734 core_format = xtensa_format_lookup (isa, "x24");
4735 opcode = xtensa_opcode_lookup (isa, "or");
4736 xtensa_opcode_encode (isa, core_format, 0, slotbuf, opcode);
4737 for (opn = 0; opn < 3; opn++)
4740 xtensa_operand_encode (isa, opcode, opn, ®no);
4741 xtensa_operand_set_field (isa, opcode, opn, core_format, 0,
4744 xtensa_format_encode (isa, core_format, insnbuf);
4745 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4746 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf, content_length - address);
4748 /* Assemble a CALL ("callN 0") into the 3 byte offset. */
4749 xtensa_opcode_encode (isa, core_format, 0, slotbuf, direct_call_opcode);
4750 xtensa_operand_set_field (isa, opcode, 0, core_format, 0, slotbuf, 0);
4752 xtensa_format_encode (isa, core_format, insnbuf);
4753 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4754 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf + 3,
4755 content_length - address - 3);
4757 return bfd_reloc_ok;
4761 static bfd_reloc_status_type
4762 contract_asm_expansion (bfd_byte *contents,
4763 bfd_vma content_length,
4764 Elf_Internal_Rela *irel,
4765 char **error_message)
4767 bfd_reloc_status_type retval =
4768 elf_xtensa_do_asm_simplify (contents, irel->r_offset, content_length,
4771 if (retval != bfd_reloc_ok)
4772 return bfd_reloc_dangerous;
4774 /* Update the irel->r_offset field so that the right immediate and
4775 the right instruction are modified during the relocation. */
4776 irel->r_offset += 3;
4777 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_XTENSA_SLOT0_OP);
4778 return bfd_reloc_ok;
4782 static xtensa_opcode
4783 swap_callx_for_call_opcode (xtensa_opcode opcode)
4785 init_call_opcodes ();
4787 if (opcode == callx0_op) return call0_op;
4788 if (opcode == callx4_op) return call4_op;
4789 if (opcode == callx8_op) return call8_op;
4790 if (opcode == callx12_op) return call12_op;
4792 /* Return XTENSA_UNDEFINED if the opcode is not an indirect call. */
4793 return XTENSA_UNDEFINED;
4797 /* Check if "buf" is pointing to a "L32R aN; CALLX aN" or "CONST16 aN;
4798 CONST16 aN; CALLX aN" sequence, and if so, return the CALLX opcode.
4799 If not, return XTENSA_UNDEFINED. */
4801 #define L32R_TARGET_REG_OPERAND 0
4802 #define CONST16_TARGET_REG_OPERAND 0
4803 #define CALLN_SOURCE_OPERAND 0
4805 static xtensa_opcode
4806 get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
4808 static xtensa_insnbuf insnbuf = NULL;
4809 static xtensa_insnbuf slotbuf = NULL;
4811 xtensa_opcode opcode;
4812 xtensa_isa isa = xtensa_default_isa;
4813 uint32 regno, const16_regno, call_regno;
4816 if (insnbuf == NULL)
4818 insnbuf = xtensa_insnbuf_alloc (isa);
4819 slotbuf = xtensa_insnbuf_alloc (isa);
4822 xtensa_insnbuf_from_chars (isa, insnbuf, buf, bufsize);
4823 fmt = xtensa_format_decode (isa, insnbuf);
4824 if (fmt == XTENSA_UNDEFINED
4825 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4826 return XTENSA_UNDEFINED;
4828 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4829 if (opcode == XTENSA_UNDEFINED)
4830 return XTENSA_UNDEFINED;
4832 if (opcode == get_l32r_opcode ())
4835 *p_uses_l32r = TRUE;
4836 if (xtensa_operand_get_field (isa, opcode, L32R_TARGET_REG_OPERAND,
4837 fmt, 0, slotbuf, ®no)
4838 || xtensa_operand_decode (isa, opcode, L32R_TARGET_REG_OPERAND,
4840 return XTENSA_UNDEFINED;
4842 else if (opcode == get_const16_opcode ())
4845 *p_uses_l32r = FALSE;
4846 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4847 fmt, 0, slotbuf, ®no)
4848 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4850 return XTENSA_UNDEFINED;
4852 /* Check that the next instruction is also CONST16. */
4853 offset += xtensa_format_length (isa, fmt);
4854 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4855 fmt = xtensa_format_decode (isa, insnbuf);
4856 if (fmt == XTENSA_UNDEFINED
4857 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4858 return XTENSA_UNDEFINED;
4859 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4860 if (opcode != get_const16_opcode ())
4861 return XTENSA_UNDEFINED;
4863 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4864 fmt, 0, slotbuf, &const16_regno)
4865 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4867 || const16_regno != regno)
4868 return XTENSA_UNDEFINED;
4871 return XTENSA_UNDEFINED;
4873 /* Next instruction should be an CALLXn with operand 0 == regno. */
4874 offset += xtensa_format_length (isa, fmt);
4875 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4876 fmt = xtensa_format_decode (isa, insnbuf);
4877 if (fmt == XTENSA_UNDEFINED
4878 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4879 return XTENSA_UNDEFINED;
4880 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4881 if (opcode == XTENSA_UNDEFINED
4882 || !is_indirect_call_opcode (opcode))
4883 return XTENSA_UNDEFINED;
4885 if (xtensa_operand_get_field (isa, opcode, CALLN_SOURCE_OPERAND,
4886 fmt, 0, slotbuf, &call_regno)
4887 || xtensa_operand_decode (isa, opcode, CALLN_SOURCE_OPERAND,
4889 return XTENSA_UNDEFINED;
4891 if (call_regno != regno)
4892 return XTENSA_UNDEFINED;
4898 /* Data structures used during relaxation. */
4900 /* r_reloc: relocation values. */
4902 /* Through the relaxation process, we need to keep track of the values
4903 that will result from evaluating relocations. The standard ELF
4904 relocation structure is not sufficient for this purpose because we're
4905 operating on multiple input files at once, so we need to know which
4906 input file a relocation refers to. The r_reloc structure thus
4907 records both the input file (bfd) and ELF relocation.
4909 For efficiency, an r_reloc also contains a "target_offset" field to
4910 cache the target-section-relative offset value that is represented by
4913 The r_reloc also contains a virtual offset that allows multiple
4914 inserted literals to be placed at the same "address" with
4915 different offsets. */
4917 typedef struct r_reloc_struct r_reloc;
4919 struct r_reloc_struct
4922 Elf_Internal_Rela rela;
4923 bfd_vma target_offset;
4924 bfd_vma virtual_offset;
4928 /* The r_reloc structure is included by value in literal_value, but not
4929 every literal_value has an associated relocation -- some are simple
4930 constants. In such cases, we set all the fields in the r_reloc
4931 struct to zero. The r_reloc_is_const function should be used to
4932 detect this case. */
4935 r_reloc_is_const (const r_reloc *r_rel)
4937 return (r_rel->abfd == NULL);
4942 r_reloc_get_target_offset (const r_reloc *r_rel)
4944 bfd_vma target_offset;
4945 unsigned long r_symndx;
4947 BFD_ASSERT (!r_reloc_is_const (r_rel));
4948 r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4949 target_offset = get_elf_r_symndx_offset (r_rel->abfd, r_symndx);
4950 return (target_offset + r_rel->rela.r_addend);
4954 static struct elf_link_hash_entry *
4955 r_reloc_get_hash_entry (const r_reloc *r_rel)
4957 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4958 return get_elf_r_symndx_hash_entry (r_rel->abfd, r_symndx);
4963 r_reloc_get_section (const r_reloc *r_rel)
4965 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4966 return get_elf_r_symndx_section (r_rel->abfd, r_symndx);
4971 r_reloc_is_defined (const r_reloc *r_rel)
4977 sec = r_reloc_get_section (r_rel);
4978 if (sec == bfd_abs_section_ptr
4979 || sec == bfd_com_section_ptr
4980 || sec == bfd_und_section_ptr)
4987 r_reloc_init (r_reloc *r_rel,
4989 Elf_Internal_Rela *irel,
4991 bfd_size_type content_length)
4994 reloc_howto_type *howto;
4998 r_rel->rela = *irel;
5000 r_rel->target_offset = r_reloc_get_target_offset (r_rel);
5001 r_rel->virtual_offset = 0;
5002 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
5003 howto = &elf_howto_table[r_type];
5004 if (howto->partial_inplace)
5006 bfd_vma inplace_val;
5007 BFD_ASSERT (r_rel->rela.r_offset < content_length);
5009 inplace_val = bfd_get_32 (abfd, &contents[r_rel->rela.r_offset]);
5010 r_rel->target_offset += inplace_val;
5014 memset (r_rel, 0, sizeof (r_reloc));
5021 print_r_reloc (FILE *fp, const r_reloc *r_rel)
5023 if (r_reloc_is_defined (r_rel))
5025 asection *sec = r_reloc_get_section (r_rel);
5026 fprintf (fp, " %s(%s + ", sec->owner->filename, sec->name);
5028 else if (r_reloc_get_hash_entry (r_rel))
5029 fprintf (fp, " %s + ", r_reloc_get_hash_entry (r_rel)->root.root.string);
5031 fprintf (fp, " ?? + ");
5033 fprintf_vma (fp, r_rel->target_offset);
5034 if (r_rel->virtual_offset)
5036 fprintf (fp, " + ");
5037 fprintf_vma (fp, r_rel->virtual_offset);
5046 /* source_reloc: relocations that reference literals. */
5048 /* To determine whether literals can be coalesced, we need to first
5049 record all the relocations that reference the literals. The
5050 source_reloc structure below is used for this purpose. The
5051 source_reloc entries are kept in a per-literal-section array, sorted
5052 by offset within the literal section (i.e., target offset).
5054 The source_sec and r_rel.rela.r_offset fields identify the source of
5055 the relocation. The r_rel field records the relocation value, i.e.,
5056 the offset of the literal being referenced. The opnd field is needed
5057 to determine the range of the immediate field to which the relocation
5058 applies, so we can determine whether another literal with the same
5059 value is within range. The is_null field is true when the relocation
5060 is being removed (e.g., when an L32R is being removed due to a CALLX
5061 that is converted to a direct CALL). */
5063 typedef struct source_reloc_struct source_reloc;
5065 struct source_reloc_struct
5067 asection *source_sec;
5069 xtensa_opcode opcode;
5071 bfd_boolean is_null;
5072 bfd_boolean is_abs_literal;
5077 init_source_reloc (source_reloc *reloc,
5078 asection *source_sec,
5079 const r_reloc *r_rel,
5080 xtensa_opcode opcode,
5082 bfd_boolean is_abs_literal)
5084 reloc->source_sec = source_sec;
5085 reloc->r_rel = *r_rel;
5086 reloc->opcode = opcode;
5088 reloc->is_null = FALSE;
5089 reloc->is_abs_literal = is_abs_literal;
5093 /* Find the source_reloc for a particular source offset and relocation
5094 type. Note that the array is sorted by _target_ offset, so this is
5095 just a linear search. */
5097 static source_reloc *
5098 find_source_reloc (source_reloc *src_relocs,
5101 Elf_Internal_Rela *irel)
5105 for (i = 0; i < src_count; i++)
5107 if (src_relocs[i].source_sec == sec
5108 && src_relocs[i].r_rel.rela.r_offset == irel->r_offset
5109 && (ELF32_R_TYPE (src_relocs[i].r_rel.rela.r_info)
5110 == ELF32_R_TYPE (irel->r_info)))
5111 return &src_relocs[i];
5119 source_reloc_compare (const void *ap, const void *bp)
5121 const source_reloc *a = (const source_reloc *) ap;
5122 const source_reloc *b = (const source_reloc *) bp;
5124 if (a->r_rel.target_offset != b->r_rel.target_offset)
5125 return (a->r_rel.target_offset - b->r_rel.target_offset);
5127 /* We don't need to sort on these criteria for correctness,
5128 but enforcing a more strict ordering prevents unstable qsort
5129 from behaving differently with different implementations.
5130 Without the code below we get correct but different results
5131 on Solaris 2.7 and 2.8. We would like to always produce the
5132 same results no matter the host. */
5134 if ((!a->is_null) - (!b->is_null))
5135 return ((!a->is_null) - (!b->is_null));
5136 return internal_reloc_compare (&a->r_rel.rela, &b->r_rel.rela);
5140 /* Literal values and value hash tables. */
5142 /* Literals with the same value can be coalesced. The literal_value
5143 structure records the value of a literal: the "r_rel" field holds the
5144 information from the relocation on the literal (if there is one) and
5145 the "value" field holds the contents of the literal word itself.
5147 The value_map structure records a literal value along with the
5148 location of a literal holding that value. The value_map hash table
5149 is indexed by the literal value, so that we can quickly check if a
5150 particular literal value has been seen before and is thus a candidate
5153 typedef struct literal_value_struct literal_value;
5154 typedef struct value_map_struct value_map;
5155 typedef struct value_map_hash_table_struct value_map_hash_table;
5157 struct literal_value_struct
5160 unsigned long value;
5161 bfd_boolean is_abs_literal;
5164 struct value_map_struct
5166 literal_value val; /* The literal value. */
5167 r_reloc loc; /* Location of the literal. */
5171 struct value_map_hash_table_struct
5173 unsigned bucket_count;
5174 value_map **buckets;
5176 bfd_boolean has_last_loc;
5182 init_literal_value (literal_value *lit,
5183 const r_reloc *r_rel,
5184 unsigned long value,
5185 bfd_boolean is_abs_literal)
5187 lit->r_rel = *r_rel;
5189 lit->is_abs_literal = is_abs_literal;
5194 literal_value_equal (const literal_value *src1,
5195 const literal_value *src2,
5196 bfd_boolean final_static_link)
5198 struct elf_link_hash_entry *h1, *h2;
5200 if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
5203 if (r_reloc_is_const (&src1->r_rel))
5204 return (src1->value == src2->value);
5206 if (ELF32_R_TYPE (src1->r_rel.rela.r_info)
5207 != ELF32_R_TYPE (src2->r_rel.rela.r_info))
5210 if (src1->r_rel.target_offset != src2->r_rel.target_offset)
5213 if (src1->r_rel.virtual_offset != src2->r_rel.virtual_offset)
5216 if (src1->value != src2->value)
5219 /* Now check for the same section (if defined) or the same elf_hash
5220 (if undefined or weak). */
5221 h1 = r_reloc_get_hash_entry (&src1->r_rel);
5222 h2 = r_reloc_get_hash_entry (&src2->r_rel);
5223 if (r_reloc_is_defined (&src1->r_rel)
5224 && (final_static_link
5225 || ((!h1 || h1->root.type != bfd_link_hash_defweak)
5226 && (!h2 || h2->root.type != bfd_link_hash_defweak))))
5228 if (r_reloc_get_section (&src1->r_rel)
5229 != r_reloc_get_section (&src2->r_rel))
5234 /* Require that the hash entries (i.e., symbols) be identical. */
5235 if (h1 != h2 || h1 == 0)
5239 if (src1->is_abs_literal != src2->is_abs_literal)
5246 /* Must be power of 2. */
5247 #define INITIAL_HASH_RELOC_BUCKET_COUNT 1024
5249 static value_map_hash_table *
5250 value_map_hash_table_init (void)
5252 value_map_hash_table *values;
5254 values = (value_map_hash_table *)
5255 bfd_zmalloc (sizeof (value_map_hash_table));
5256 values->bucket_count = INITIAL_HASH_RELOC_BUCKET_COUNT;
5258 values->buckets = (value_map **)
5259 bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
5260 if (values->buckets == NULL)
5265 values->has_last_loc = FALSE;
5272 value_map_hash_table_delete (value_map_hash_table *table)
5274 free (table->buckets);
5280 hash_bfd_vma (bfd_vma val)
5282 return (val >> 2) + (val >> 10);
5287 literal_value_hash (const literal_value *src)
5291 hash_val = hash_bfd_vma (src->value);
5292 if (!r_reloc_is_const (&src->r_rel))
5296 hash_val += hash_bfd_vma (src->is_abs_literal * 1000);
5297 hash_val += hash_bfd_vma (src->r_rel.target_offset);
5298 hash_val += hash_bfd_vma (src->r_rel.virtual_offset);
5300 /* Now check for the same section and the same elf_hash. */
5301 if (r_reloc_is_defined (&src->r_rel))
5302 sec_or_hash = r_reloc_get_section (&src->r_rel);
5304 sec_or_hash = r_reloc_get_hash_entry (&src->r_rel);
5305 hash_val += hash_bfd_vma ((bfd_vma) (size_t) sec_or_hash);
5311 /* Check if the specified literal_value has been seen before. */
5314 value_map_get_cached_value (value_map_hash_table *map,
5315 const literal_value *val,
5316 bfd_boolean final_static_link)
5322 idx = literal_value_hash (val);
5323 idx = idx & (map->bucket_count - 1);
5324 bucket = map->buckets[idx];
5325 for (map_e = bucket; map_e; map_e = map_e->next)
5327 if (literal_value_equal (&map_e->val, val, final_static_link))
5334 /* Record a new literal value. It is illegal to call this if VALUE
5335 already has an entry here. */
5338 add_value_map (value_map_hash_table *map,
5339 const literal_value *val,
5341 bfd_boolean final_static_link)
5343 value_map **bucket_p;
5346 value_map *val_e = (value_map *) bfd_zmalloc (sizeof (value_map));
5349 bfd_set_error (bfd_error_no_memory);
5353 BFD_ASSERT (!value_map_get_cached_value (map, val, final_static_link));
5357 idx = literal_value_hash (val);
5358 idx = idx & (map->bucket_count - 1);
5359 bucket_p = &map->buckets[idx];
5361 val_e->next = *bucket_p;
5364 /* FIXME: Consider resizing the hash table if we get too many entries. */
5370 /* Lists of text actions (ta_) for narrowing, widening, longcall
5371 conversion, space fill, code & literal removal, etc. */
5373 /* The following text actions are generated:
5375 "ta_remove_insn" remove an instruction or instructions
5376 "ta_remove_longcall" convert longcall to call
5377 "ta_convert_longcall" convert longcall to nop/call
5378 "ta_narrow_insn" narrow a wide instruction
5379 "ta_widen" widen a narrow instruction
5380 "ta_fill" add fill or remove fill
5381 removed < 0 is a fill; branches to the fill address will be
5382 changed to address + fill size (e.g., address - removed)
5383 removed >= 0 branches to the fill address will stay unchanged
5384 "ta_remove_literal" remove a literal; this action is
5385 indicated when a literal is removed
5387 "ta_add_literal" insert a new literal; this action is
5388 indicated when a literal has been moved.
5389 It may use a virtual_offset because
5390 multiple literals can be placed at the
5393 For each of these text actions, we also record the number of bytes
5394 removed by performing the text action. In the case of a "ta_widen"
5395 or a "ta_fill" that adds space, the removed_bytes will be negative. */
5397 typedef struct text_action_struct text_action;
5398 typedef struct text_action_list_struct text_action_list;
5399 typedef enum text_action_enum_t text_action_t;
5401 enum text_action_enum_t
5404 ta_remove_insn, /* removed = -size */
5405 ta_remove_longcall, /* removed = -size */
5406 ta_convert_longcall, /* removed = 0 */
5407 ta_narrow_insn, /* removed = -1 */
5408 ta_widen_insn, /* removed = +1 */
5409 ta_fill, /* removed = +size */
5415 /* Structure for a text action record. */
5416 struct text_action_struct
5418 text_action_t action;
5419 asection *sec; /* Optional */
5421 bfd_vma virtual_offset; /* Zero except for adding literals. */
5423 literal_value value; /* Only valid when adding literals. */
5426 struct removal_by_action_entry_struct
5431 int eq_removed_before_fill;
5433 typedef struct removal_by_action_entry_struct removal_by_action_entry;
5435 struct removal_by_action_map_struct
5438 removal_by_action_entry *entry;
5440 typedef struct removal_by_action_map_struct removal_by_action_map;
5443 /* List of all of the actions taken on a text section. */
5444 struct text_action_list_struct
5448 removal_by_action_map map;
5452 static text_action *
5453 find_fill_action (text_action_list *l, asection *sec, bfd_vma offset)
5457 /* It is not necessary to fill at the end of a section. */
5458 if (sec->size == offset)
5464 splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5466 return (text_action *)node->value;
5472 compute_removed_action_diff (const text_action *ta,
5476 int removable_space)
5479 int current_removed = 0;
5482 current_removed = ta->removed_bytes;
5484 BFD_ASSERT (ta == NULL || ta->offset == offset);
5485 BFD_ASSERT (ta == NULL || ta->action == ta_fill);
5487 /* It is not necessary to fill at the end of a section. Clean this up. */
5488 if (sec->size == offset)
5489 new_removed = removable_space - 0;
5493 int added = -removed - current_removed;
5494 /* Ignore multiples of the section alignment. */
5495 added = ((1 << sec->alignment_power) - 1) & added;
5496 new_removed = (-added);
5498 /* Modify for removable. */
5499 space = removable_space - new_removed;
5500 new_removed = (removable_space
5501 - (((1 << sec->alignment_power) - 1) & space));
5503 return (new_removed - current_removed);
5508 adjust_fill_action (text_action *ta, int fill_diff)
5510 ta->removed_bytes += fill_diff;
5515 text_action_compare (splay_tree_key a, splay_tree_key b)
5517 text_action *pa = (text_action *)a;
5518 text_action *pb = (text_action *)b;
5519 static const int action_priority[] =
5523 [ta_convert_longcall] = 2,
5524 [ta_narrow_insn] = 3,
5525 [ta_remove_insn] = 4,
5526 [ta_remove_longcall] = 5,
5527 [ta_remove_literal] = 6,
5528 [ta_widen_insn] = 7,
5529 [ta_add_literal] = 8,
5532 if (pa->offset == pb->offset)
5534 if (pa->action == pb->action)
5536 return action_priority[pa->action] - action_priority[pb->action];
5539 return pa->offset < pb->offset ? -1 : 1;
5542 static text_action *
5543 action_first (text_action_list *action_list)
5545 splay_tree_node node = splay_tree_min (action_list->tree);
5546 return node ? (text_action *)node->value : NULL;
5549 static text_action *
5550 action_next (text_action_list *action_list, text_action *action)
5552 splay_tree_node node = splay_tree_successor (action_list->tree,
5553 (splay_tree_key)action);
5554 return node ? (text_action *)node->value : NULL;
5557 /* Add a modification action to the text. For the case of adding or
5558 removing space, modify any current fill and assume that
5559 "unreachable_space" bytes can be freely contracted. Note that a
5560 negative removed value is a fill. */
5563 text_action_add (text_action_list *l,
5564 text_action_t action,
5572 /* It is not necessary to fill at the end of a section. */
5573 if (action == ta_fill && sec->size == offset)
5576 /* It is not necessary to fill 0 bytes. */
5577 if (action == ta_fill && removed == 0)
5583 if (action == ta_fill)
5585 splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5589 ta = (text_action *)node->value;
5590 ta->removed_bytes += removed;
5595 BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)&a) == NULL);
5597 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5598 ta->action = action;
5600 ta->offset = offset;
5601 ta->removed_bytes = removed;
5602 splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5608 text_action_add_literal (text_action_list *l,
5609 text_action_t action,
5611 const literal_value *value,
5615 asection *sec = r_reloc_get_section (loc);
5616 bfd_vma offset = loc->target_offset;
5617 bfd_vma virtual_offset = loc->virtual_offset;
5619 BFD_ASSERT (action == ta_add_literal);
5621 /* Create a new record and fill it up. */
5622 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5623 ta->action = action;
5625 ta->offset = offset;
5626 ta->virtual_offset = virtual_offset;
5628 ta->removed_bytes = removed;
5630 BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)ta) == NULL);
5631 splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5636 /* Find the total offset adjustment for the relaxations specified by
5637 text_actions, beginning from a particular starting action. This is
5638 typically used from offset_with_removed_text to search an entire list of
5639 actions, but it may also be called directly when adjusting adjacent offsets
5640 so that each search may begin where the previous one left off. */
5643 removed_by_actions (text_action_list *action_list,
5644 text_action **p_start_action,
5646 bfd_boolean before_fill)
5651 r = *p_start_action;
5654 splay_tree_node node = splay_tree_lookup (action_list->tree,
5656 BFD_ASSERT (node != NULL && r == (text_action *)node->value);
5661 if (r->offset > offset)
5664 if (r->offset == offset
5665 && (before_fill || r->action != ta_fill || r->removed_bytes >= 0))
5668 removed += r->removed_bytes;
5670 r = action_next (action_list, r);
5673 *p_start_action = r;
5679 offset_with_removed_text (text_action_list *action_list, bfd_vma offset)
5681 text_action *r = action_first (action_list);
5683 return offset - removed_by_actions (action_list, &r, offset, FALSE);
5688 action_list_count (text_action_list *action_list)
5690 return action_list->count;
5693 typedef struct map_action_fn_context_struct map_action_fn_context;
5694 struct map_action_fn_context_struct
5697 removal_by_action_map map;
5698 bfd_boolean eq_complete;
5702 map_action_fn (splay_tree_node node, void *p)
5704 map_action_fn_context *ctx = p;
5705 text_action *r = (text_action *)node->value;
5706 removal_by_action_entry *ientry = ctx->map.entry + ctx->map.n_entries;
5708 if (ctx->map.n_entries && (ientry - 1)->offset == r->offset)
5714 ++ctx->map.n_entries;
5715 ctx->eq_complete = FALSE;
5716 ientry->offset = r->offset;
5717 ientry->eq_removed_before_fill = ctx->removed;
5720 if (!ctx->eq_complete)
5722 if (r->action != ta_fill || r->removed_bytes >= 0)
5724 ientry->eq_removed = ctx->removed;
5725 ctx->eq_complete = TRUE;
5728 ientry->eq_removed = ctx->removed + r->removed_bytes;
5731 ctx->removed += r->removed_bytes;
5732 ientry->removed = ctx->removed;
5737 map_removal_by_action (text_action_list *action_list)
5739 map_action_fn_context ctx;
5742 ctx.map.n_entries = 0;
5743 ctx.map.entry = bfd_malloc (action_list_count (action_list) *
5744 sizeof (removal_by_action_entry));
5745 ctx.eq_complete = FALSE;
5747 splay_tree_foreach (action_list->tree, map_action_fn, &ctx);
5748 action_list->map = ctx.map;
5752 removed_by_actions_map (text_action_list *action_list, bfd_vma offset,
5753 bfd_boolean before_fill)
5757 if (!action_list->map.entry)
5758 map_removal_by_action (action_list);
5760 if (!action_list->map.n_entries)
5764 b = action_list->map.n_entries;
5768 unsigned c = (a + b) / 2;
5770 if (action_list->map.entry[c].offset <= offset)
5776 if (action_list->map.entry[a].offset < offset)
5778 return action_list->map.entry[a].removed;
5780 else if (action_list->map.entry[a].offset == offset)
5782 return before_fill ?
5783 action_list->map.entry[a].eq_removed_before_fill :
5784 action_list->map.entry[a].eq_removed;
5793 offset_with_removed_text_map (text_action_list *action_list, bfd_vma offset)
5795 int removed = removed_by_actions_map (action_list, offset, FALSE);
5796 return offset - removed;
5800 /* The find_insn_action routine will only find non-fill actions. */
5802 static text_action *
5803 find_insn_action (text_action_list *action_list, bfd_vma offset)
5805 static const text_action_t action[] =
5807 ta_convert_longcall,
5817 for (i = 0; i < sizeof (action) / sizeof (*action); ++i)
5819 splay_tree_node node;
5821 a.action = action[i];
5822 node = splay_tree_lookup (action_list->tree, (splay_tree_key)&a);
5824 return (text_action *)node->value;
5833 print_action (FILE *fp, text_action *r)
5835 const char *t = "unknown";
5838 case ta_remove_insn:
5839 t = "remove_insn"; break;
5840 case ta_remove_longcall:
5841 t = "remove_longcall"; break;
5842 case ta_convert_longcall:
5843 t = "convert_longcall"; break;
5844 case ta_narrow_insn:
5845 t = "narrow_insn"; break;
5847 t = "widen_insn"; break;
5852 case ta_remove_literal:
5853 t = "remove_literal"; break;
5854 case ta_add_literal:
5855 t = "add_literal"; break;
5858 fprintf (fp, "%s: %s[0x%lx] \"%s\" %d\n",
5859 r->sec->owner->filename,
5860 r->sec->name, (unsigned long) r->offset, t, r->removed_bytes);
5864 print_action_list_fn (splay_tree_node node, void *p)
5866 text_action *r = (text_action *)node->value;
5868 print_action (p, r);
5873 print_action_list (FILE *fp, text_action_list *action_list)
5875 fprintf (fp, "Text Action\n");
5876 splay_tree_foreach (action_list->tree, print_action_list_fn, fp);
5882 /* Lists of literals being coalesced or removed. */
5884 /* In the usual case, the literal identified by "from" is being
5885 coalesced with another literal identified by "to". If the literal is
5886 unused and is being removed altogether, "to.abfd" will be NULL.
5887 The removed_literal entries are kept on a per-section list, sorted
5888 by the "from" offset field. */
5890 typedef struct removed_literal_struct removed_literal;
5891 typedef struct removed_literal_map_entry_struct removed_literal_map_entry;
5892 typedef struct removed_literal_list_struct removed_literal_list;
5894 struct removed_literal_struct
5898 removed_literal *next;
5901 struct removed_literal_map_entry_struct
5904 removed_literal *literal;
5907 struct removed_literal_list_struct
5909 removed_literal *head;
5910 removed_literal *tail;
5913 removed_literal_map_entry *map;
5917 /* Record that the literal at "from" is being removed. If "to" is not
5918 NULL, the "from" literal is being coalesced with the "to" literal. */
5921 add_removed_literal (removed_literal_list *removed_list,
5922 const r_reloc *from,
5925 removed_literal *r, *new_r, *next_r;
5927 new_r = (removed_literal *) bfd_zmalloc (sizeof (removed_literal));
5929 new_r->from = *from;
5933 new_r->to.abfd = NULL;
5936 r = removed_list->head;
5939 removed_list->head = new_r;
5940 removed_list->tail = new_r;
5942 /* Special check for common case of append. */
5943 else if (removed_list->tail->from.target_offset < from->target_offset)
5945 removed_list->tail->next = new_r;
5946 removed_list->tail = new_r;
5950 while (r->from.target_offset < from->target_offset && r->next)
5956 new_r->next = next_r;
5958 removed_list->tail = new_r;
5963 map_removed_literal (removed_literal_list *removed_list)
5967 removed_literal_map_entry *map = NULL;
5968 removed_literal *r = removed_list->head;
5970 for (i = 0; r; ++i, r = r->next)
5974 n_map = (n_map * 2) + 2;
5975 map = bfd_realloc (map, n_map * sizeof (*map));
5977 map[i].addr = r->from.target_offset;
5980 removed_list->map = map;
5981 removed_list->n_map = i;
5985 removed_literal_compare (const void *a, const void *b)
5987 const removed_literal_map_entry *pa = a;
5988 const removed_literal_map_entry *pb = b;
5990 if (pa->addr == pb->addr)
5993 return pa->addr < pb->addr ? -1 : 1;
5996 /* Check if the list of removed literals contains an entry for the
5997 given address. Return the entry if found. */
5999 static removed_literal *
6000 find_removed_literal (removed_literal_list *removed_list, bfd_vma addr)
6002 removed_literal_map_entry *p;
6003 removed_literal *r = NULL;
6005 if (removed_list->map == NULL)
6006 map_removed_literal (removed_list);
6008 p = bsearch (&addr, removed_list->map, removed_list->n_map,
6009 sizeof (*removed_list->map), removed_literal_compare);
6012 while (p != removed_list->map && (p - 1)->addr == addr)
6023 print_removed_literals (FILE *fp, removed_literal_list *removed_list)
6026 r = removed_list->head;
6028 fprintf (fp, "Removed Literals\n");
6029 for (; r != NULL; r = r->next)
6031 print_r_reloc (fp, &r->from);
6032 fprintf (fp, " => ");
6033 if (r->to.abfd == NULL)
6034 fprintf (fp, "REMOVED");
6036 print_r_reloc (fp, &r->to);
6044 /* Per-section data for relaxation. */
6046 typedef struct reloc_bfd_fix_struct reloc_bfd_fix;
6048 struct xtensa_relax_info_struct
6050 bfd_boolean is_relaxable_literal_section;
6051 bfd_boolean is_relaxable_asm_section;
6052 int visited; /* Number of times visited. */
6054 source_reloc *src_relocs; /* Array[src_count]. */
6056 int src_next; /* Next src_relocs entry to assign. */
6058 removed_literal_list removed_list;
6059 text_action_list action_list;
6061 reloc_bfd_fix *fix_list;
6062 reloc_bfd_fix *fix_array;
6063 unsigned fix_array_count;
6065 /* Support for expanding the reloc array that is stored
6066 in the section structure. If the relocations have been
6067 reallocated, the newly allocated relocations will be referenced
6068 here along with the actual size allocated. The relocation
6069 count will always be found in the section structure. */
6070 Elf_Internal_Rela *allocated_relocs;
6071 unsigned relocs_count;
6072 unsigned allocated_relocs_count;
6075 struct elf_xtensa_section_data
6077 struct bfd_elf_section_data elf;
6078 xtensa_relax_info relax_info;
6083 elf_xtensa_new_section_hook (bfd *abfd, asection *sec)
6085 if (!sec->used_by_bfd)
6087 struct elf_xtensa_section_data *sdata;
6088 bfd_size_type amt = sizeof (*sdata);
6090 sdata = bfd_zalloc (abfd, amt);
6093 sec->used_by_bfd = sdata;
6096 return _bfd_elf_new_section_hook (abfd, sec);
6100 static xtensa_relax_info *
6101 get_xtensa_relax_info (asection *sec)
6103 struct elf_xtensa_section_data *section_data;
6105 /* No info available if no section or if it is an output section. */
6106 if (!sec || sec == sec->output_section)
6109 section_data = (struct elf_xtensa_section_data *) elf_section_data (sec);
6110 return §ion_data->relax_info;
6115 init_xtensa_relax_info (asection *sec)
6117 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6119 relax_info->is_relaxable_literal_section = FALSE;
6120 relax_info->is_relaxable_asm_section = FALSE;
6121 relax_info->visited = 0;
6123 relax_info->src_relocs = NULL;
6124 relax_info->src_count = 0;
6125 relax_info->src_next = 0;
6127 relax_info->removed_list.head = NULL;
6128 relax_info->removed_list.tail = NULL;
6130 relax_info->action_list.tree = splay_tree_new (text_action_compare,
6132 relax_info->action_list.map.n_entries = 0;
6133 relax_info->action_list.map.entry = NULL;
6135 relax_info->fix_list = NULL;
6136 relax_info->fix_array = NULL;
6137 relax_info->fix_array_count = 0;
6139 relax_info->allocated_relocs = NULL;
6140 relax_info->relocs_count = 0;
6141 relax_info->allocated_relocs_count = 0;
6145 /* Coalescing literals may require a relocation to refer to a section in
6146 a different input file, but the standard relocation information
6147 cannot express that. Instead, the reloc_bfd_fix structures are used
6148 to "fix" the relocations that refer to sections in other input files.
6149 These structures are kept on per-section lists. The "src_type" field
6150 records the relocation type in case there are multiple relocations on
6151 the same location. FIXME: This is ugly; an alternative might be to
6152 add new symbols with the "owner" field to some other input file. */
6154 struct reloc_bfd_fix_struct
6158 unsigned src_type; /* Relocation type. */
6160 asection *target_sec;
6161 bfd_vma target_offset;
6162 bfd_boolean translated;
6164 reloc_bfd_fix *next;
6168 static reloc_bfd_fix *
6169 reloc_bfd_fix_init (asection *src_sec,
6172 asection *target_sec,
6173 bfd_vma target_offset,
6174 bfd_boolean translated)
6178 fix = (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix));
6179 fix->src_sec = src_sec;
6180 fix->src_offset = src_offset;
6181 fix->src_type = src_type;
6182 fix->target_sec = target_sec;
6183 fix->target_offset = target_offset;
6184 fix->translated = translated;
6191 add_fix (asection *src_sec, reloc_bfd_fix *fix)
6193 xtensa_relax_info *relax_info;
6195 relax_info = get_xtensa_relax_info (src_sec);
6196 fix->next = relax_info->fix_list;
6197 relax_info->fix_list = fix;
6202 fix_compare (const void *ap, const void *bp)
6204 const reloc_bfd_fix *a = (const reloc_bfd_fix *) ap;
6205 const reloc_bfd_fix *b = (const reloc_bfd_fix *) bp;
6207 if (a->src_offset != b->src_offset)
6208 return (a->src_offset - b->src_offset);
6209 return (a->src_type - b->src_type);
6214 cache_fix_array (asection *sec)
6216 unsigned i, count = 0;
6218 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6220 if (relax_info == NULL)
6222 if (relax_info->fix_list == NULL)
6225 for (r = relax_info->fix_list; r != NULL; r = r->next)
6228 relax_info->fix_array =
6229 (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix) * count);
6230 relax_info->fix_array_count = count;
6232 r = relax_info->fix_list;
6233 for (i = 0; i < count; i++, r = r->next)
6235 relax_info->fix_array[count - 1 - i] = *r;
6236 relax_info->fix_array[count - 1 - i].next = NULL;
6239 qsort (relax_info->fix_array, relax_info->fix_array_count,
6240 sizeof (reloc_bfd_fix), fix_compare);
6244 static reloc_bfd_fix *
6245 get_bfd_fix (asection *sec, bfd_vma offset, unsigned type)
6247 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6251 if (relax_info == NULL)
6253 if (relax_info->fix_list == NULL)
6256 if (relax_info->fix_array == NULL)
6257 cache_fix_array (sec);
6259 key.src_offset = offset;
6260 key.src_type = type;
6261 rv = bsearch (&key, relax_info->fix_array, relax_info->fix_array_count,
6262 sizeof (reloc_bfd_fix), fix_compare);
6267 /* Section caching. */
6269 typedef struct section_cache_struct section_cache_t;
6271 struct section_cache_struct
6275 bfd_byte *contents; /* Cache of the section contents. */
6276 bfd_size_type content_length;
6278 property_table_entry *ptbl; /* Cache of the section property table. */
6281 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
6282 unsigned reloc_count;
6287 init_section_cache (section_cache_t *sec_cache)
6289 memset (sec_cache, 0, sizeof (*sec_cache));
6294 free_section_cache (section_cache_t *sec_cache)
6298 release_contents (sec_cache->sec, sec_cache->contents);
6299 release_internal_relocs (sec_cache->sec, sec_cache->relocs);
6300 if (sec_cache->ptbl)
6301 free (sec_cache->ptbl);
6307 section_cache_section (section_cache_t *sec_cache,
6309 struct bfd_link_info *link_info)
6312 property_table_entry *prop_table = NULL;
6314 bfd_byte *contents = NULL;
6315 Elf_Internal_Rela *internal_relocs = NULL;
6316 bfd_size_type sec_size;
6320 if (sec == sec_cache->sec)
6324 sec_size = bfd_get_section_limit (abfd, sec);
6326 /* Get the contents. */
6327 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6328 if (contents == NULL && sec_size != 0)
6331 /* Get the relocations. */
6332 internal_relocs = retrieve_internal_relocs (abfd, sec,
6333 link_info->keep_memory);
6335 /* Get the entry table. */
6336 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
6337 XTENSA_PROP_SEC_NAME, FALSE);
6341 /* Fill in the new section cache. */
6342 free_section_cache (sec_cache);
6343 init_section_cache (sec_cache);
6345 sec_cache->sec = sec;
6346 sec_cache->contents = contents;
6347 sec_cache->content_length = sec_size;
6348 sec_cache->relocs = internal_relocs;
6349 sec_cache->reloc_count = sec->reloc_count;
6350 sec_cache->pte_count = ptblsize;
6351 sec_cache->ptbl = prop_table;
6356 release_contents (sec, contents);
6357 release_internal_relocs (sec, internal_relocs);
6364 /* Extended basic blocks. */
6366 /* An ebb_struct represents an Extended Basic Block. Within this
6367 range, we guarantee that all instructions are decodable, the
6368 property table entries are contiguous, and no property table
6369 specifies a segment that cannot have instructions moved. This
6370 structure contains caches of the contents, property table and
6371 relocations for the specified section for easy use. The range is
6372 specified by ranges of indices for the byte offset, property table
6373 offsets and relocation offsets. These must be consistent. */
6375 typedef struct ebb_struct ebb_t;
6381 bfd_byte *contents; /* Cache of the section contents. */
6382 bfd_size_type content_length;
6384 property_table_entry *ptbl; /* Cache of the section property table. */
6387 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
6388 unsigned reloc_count;
6390 bfd_vma start_offset; /* Offset in section. */
6391 unsigned start_ptbl_idx; /* Offset in the property table. */
6392 unsigned start_reloc_idx; /* Offset in the relocations. */
6395 unsigned end_ptbl_idx;
6396 unsigned end_reloc_idx;
6398 bfd_boolean ends_section; /* Is this the last ebb in a section? */
6400 /* The unreachable property table at the end of this set of blocks;
6401 NULL if the end is not an unreachable block. */
6402 property_table_entry *ends_unreachable;
6406 enum ebb_target_enum
6409 EBB_DESIRE_TGT_ALIGN,
6410 EBB_REQUIRE_TGT_ALIGN,
6411 EBB_REQUIRE_LOOP_ALIGN,
6416 /* proposed_action_struct is similar to the text_action_struct except
6417 that is represents a potential transformation, not one that will
6418 occur. We build a list of these for an extended basic block
6419 and use them to compute the actual actions desired. We must be
6420 careful that the entire set of actual actions we perform do not
6421 break any relocations that would fit if the actions were not
6424 typedef struct proposed_action_struct proposed_action;
6426 struct proposed_action_struct
6428 enum ebb_target_enum align_type; /* for the target alignment */
6429 bfd_vma alignment_pow;
6430 text_action_t action;
6433 bfd_boolean do_action; /* If false, then we will not perform the action. */
6437 /* The ebb_constraint_struct keeps a set of proposed actions for an
6438 extended basic block. */
6440 typedef struct ebb_constraint_struct ebb_constraint;
6442 struct ebb_constraint_struct
6445 bfd_boolean start_movable;
6447 /* Bytes of extra space at the beginning if movable. */
6448 int start_extra_space;
6450 enum ebb_target_enum start_align;
6452 bfd_boolean end_movable;
6454 /* Bytes of extra space at the end if movable. */
6455 int end_extra_space;
6457 unsigned action_count;
6458 unsigned action_allocated;
6460 /* Array of proposed actions. */
6461 proposed_action *actions;
6463 /* Action alignments -- one for each proposed action. */
6464 enum ebb_target_enum *action_aligns;
6469 init_ebb_constraint (ebb_constraint *c)
6471 memset (c, 0, sizeof (ebb_constraint));
6476 free_ebb_constraint (ebb_constraint *c)
6484 init_ebb (ebb_t *ebb,
6487 bfd_size_type content_length,
6488 property_table_entry *prop_table,
6490 Elf_Internal_Rela *internal_relocs,
6491 unsigned reloc_count)
6493 memset (ebb, 0, sizeof (ebb_t));
6495 ebb->contents = contents;
6496 ebb->content_length = content_length;
6497 ebb->ptbl = prop_table;
6498 ebb->pte_count = ptblsize;
6499 ebb->relocs = internal_relocs;
6500 ebb->reloc_count = reloc_count;
6501 ebb->start_offset = 0;
6502 ebb->end_offset = ebb->content_length - 1;
6503 ebb->start_ptbl_idx = 0;
6504 ebb->end_ptbl_idx = ptblsize;
6505 ebb->start_reloc_idx = 0;
6506 ebb->end_reloc_idx = reloc_count;
6510 /* Extend the ebb to all decodable contiguous sections. The algorithm
6511 for building a basic block around an instruction is to push it
6512 forward until we hit the end of a section, an unreachable block or
6513 a block that cannot be transformed. Then we push it backwards
6514 searching for similar conditions. */
6516 static bfd_boolean extend_ebb_bounds_forward (ebb_t *);
6517 static bfd_boolean extend_ebb_bounds_backward (ebb_t *);
6518 static bfd_size_type insn_block_decodable_len
6519 (bfd_byte *, bfd_size_type, bfd_vma, bfd_size_type);
6522 extend_ebb_bounds (ebb_t *ebb)
6524 if (!extend_ebb_bounds_forward (ebb))
6526 if (!extend_ebb_bounds_backward (ebb))
6533 extend_ebb_bounds_forward (ebb_t *ebb)
6535 property_table_entry *the_entry, *new_entry;
6537 the_entry = &ebb->ptbl[ebb->end_ptbl_idx];
6539 /* Stop when (1) we cannot decode an instruction, (2) we are at
6540 the end of the property tables, (3) we hit a non-contiguous property
6541 table entry, (4) we hit a NO_TRANSFORM region. */
6546 bfd_size_type insn_block_len;
6548 entry_end = the_entry->address - ebb->sec->vma + the_entry->size;
6550 insn_block_decodable_len (ebb->contents, ebb->content_length,
6552 entry_end - ebb->end_offset);
6553 if (insn_block_len != (entry_end - ebb->end_offset))
6555 (*_bfd_error_handler)
6556 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
6557 ebb->sec->owner, ebb->sec, ebb->end_offset + insn_block_len);
6560 ebb->end_offset += insn_block_len;
6562 if (ebb->end_offset == ebb->sec->size)
6563 ebb->ends_section = TRUE;
6565 /* Update the reloc counter. */
6566 while (ebb->end_reloc_idx + 1 < ebb->reloc_count
6567 && (ebb->relocs[ebb->end_reloc_idx + 1].r_offset
6570 ebb->end_reloc_idx++;
6573 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6576 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6577 if (((new_entry->flags & XTENSA_PROP_INSN) == 0)
6578 || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6579 || ((the_entry->flags & XTENSA_PROP_ALIGN) != 0))
6582 if (the_entry->address + the_entry->size != new_entry->address)
6585 the_entry = new_entry;
6586 ebb->end_ptbl_idx++;
6589 /* Quick check for an unreachable or end of file just at the end. */
6590 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6592 if (ebb->end_offset == ebb->content_length)
6593 ebb->ends_section = TRUE;
6597 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6598 if ((new_entry->flags & XTENSA_PROP_UNREACHABLE) != 0
6599 && the_entry->address + the_entry->size == new_entry->address)
6600 ebb->ends_unreachable = new_entry;
6603 /* Any other ending requires exact alignment. */
6609 extend_ebb_bounds_backward (ebb_t *ebb)
6611 property_table_entry *the_entry, *new_entry;
6613 the_entry = &ebb->ptbl[ebb->start_ptbl_idx];
6615 /* Stop when (1) we cannot decode the instructions in the current entry.
6616 (2) we are at the beginning of the property tables, (3) we hit a
6617 non-contiguous property table entry, (4) we hit a NO_TRANSFORM region. */
6621 bfd_vma block_begin;
6622 bfd_size_type insn_block_len;
6624 block_begin = the_entry->address - ebb->sec->vma;
6626 insn_block_decodable_len (ebb->contents, ebb->content_length,
6628 ebb->start_offset - block_begin);
6629 if (insn_block_len != ebb->start_offset - block_begin)
6631 (*_bfd_error_handler)
6632 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
6633 ebb->sec->owner, ebb->sec, ebb->end_offset + insn_block_len);
6636 ebb->start_offset -= insn_block_len;
6638 /* Update the reloc counter. */
6639 while (ebb->start_reloc_idx > 0
6640 && (ebb->relocs[ebb->start_reloc_idx - 1].r_offset
6641 >= ebb->start_offset))
6643 ebb->start_reloc_idx--;
6646 if (ebb->start_ptbl_idx == 0)
6649 new_entry = &ebb->ptbl[ebb->start_ptbl_idx - 1];
6650 if ((new_entry->flags & XTENSA_PROP_INSN) == 0
6651 || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6652 || ((new_entry->flags & XTENSA_PROP_ALIGN) != 0))
6654 if (new_entry->address + new_entry->size != the_entry->address)
6657 the_entry = new_entry;
6658 ebb->start_ptbl_idx--;
6664 static bfd_size_type
6665 insn_block_decodable_len (bfd_byte *contents,
6666 bfd_size_type content_len,
6667 bfd_vma block_offset,
6668 bfd_size_type block_len)
6670 bfd_vma offset = block_offset;
6672 while (offset < block_offset + block_len)
6674 bfd_size_type insn_len = 0;
6676 insn_len = insn_decode_len (contents, content_len, offset);
6678 return (offset - block_offset);
6681 return (offset - block_offset);
6686 ebb_propose_action (ebb_constraint *c,
6687 enum ebb_target_enum align_type,
6688 bfd_vma alignment_pow,
6689 text_action_t action,
6692 bfd_boolean do_action)
6694 proposed_action *act;
6696 if (c->action_allocated <= c->action_count)
6698 unsigned new_allocated, i;
6699 proposed_action *new_actions;
6701 new_allocated = (c->action_count + 2) * 2;
6702 new_actions = (proposed_action *)
6703 bfd_zmalloc (sizeof (proposed_action) * new_allocated);
6705 for (i = 0; i < c->action_count; i++)
6706 new_actions[i] = c->actions[i];
6709 c->actions = new_actions;
6710 c->action_allocated = new_allocated;
6713 act = &c->actions[c->action_count];
6714 act->align_type = align_type;
6715 act->alignment_pow = alignment_pow;
6716 act->action = action;
6717 act->offset = offset;
6718 act->removed_bytes = removed_bytes;
6719 act->do_action = do_action;
6725 /* Access to internal relocations, section contents and symbols. */
6727 /* During relaxation, we need to modify relocations, section contents,
6728 and symbol definitions, and we need to keep the original values from
6729 being reloaded from the input files, i.e., we need to "pin" the
6730 modified values in memory. We also want to continue to observe the
6731 setting of the "keep-memory" flag. The following functions wrap the
6732 standard BFD functions to take care of this for us. */
6734 static Elf_Internal_Rela *
6735 retrieve_internal_relocs (bfd *abfd, asection *sec, bfd_boolean keep_memory)
6737 Elf_Internal_Rela *internal_relocs;
6739 if ((sec->flags & SEC_LINKER_CREATED) != 0)
6742 internal_relocs = elf_section_data (sec)->relocs;
6743 if (internal_relocs == NULL)
6744 internal_relocs = (_bfd_elf_link_read_relocs
6745 (abfd, sec, NULL, NULL, keep_memory));
6746 return internal_relocs;
6751 pin_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6753 elf_section_data (sec)->relocs = internal_relocs;
6758 release_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6761 && elf_section_data (sec)->relocs != internal_relocs)
6762 free (internal_relocs);
6767 retrieve_contents (bfd *abfd, asection *sec, bfd_boolean keep_memory)
6770 bfd_size_type sec_size;
6772 sec_size = bfd_get_section_limit (abfd, sec);
6773 contents = elf_section_data (sec)->this_hdr.contents;
6775 if (contents == NULL && sec_size != 0)
6777 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
6784 elf_section_data (sec)->this_hdr.contents = contents;
6791 pin_contents (asection *sec, bfd_byte *contents)
6793 elf_section_data (sec)->this_hdr.contents = contents;
6798 release_contents (asection *sec, bfd_byte *contents)
6800 if (contents && elf_section_data (sec)->this_hdr.contents != contents)
6805 static Elf_Internal_Sym *
6806 retrieve_local_syms (bfd *input_bfd)
6808 Elf_Internal_Shdr *symtab_hdr;
6809 Elf_Internal_Sym *isymbuf;
6812 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
6813 locsymcount = symtab_hdr->sh_info;
6815 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
6816 if (isymbuf == NULL && locsymcount != 0)
6817 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
6820 /* Save the symbols for this input file so they won't be read again. */
6821 if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
6822 symtab_hdr->contents = (unsigned char *) isymbuf;
6828 /* Code for link-time relaxation. */
6830 /* Initialization for relaxation: */
6831 static bfd_boolean analyze_relocations (struct bfd_link_info *);
6832 static bfd_boolean find_relaxable_sections
6833 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
6834 static bfd_boolean collect_source_relocs
6835 (bfd *, asection *, struct bfd_link_info *);
6836 static bfd_boolean is_resolvable_asm_expansion
6837 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, struct bfd_link_info *,
6839 static Elf_Internal_Rela *find_associated_l32r_irel
6840 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Rela *);
6841 static bfd_boolean compute_text_actions
6842 (bfd *, asection *, struct bfd_link_info *);
6843 static bfd_boolean compute_ebb_proposed_actions (ebb_constraint *);
6844 static bfd_boolean compute_ebb_actions (ebb_constraint *);
6845 typedef struct reloc_range_list_struct reloc_range_list;
6846 static bfd_boolean check_section_ebb_pcrels_fit
6847 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *,
6848 reloc_range_list *, const ebb_constraint *,
6849 const xtensa_opcode *);
6850 static bfd_boolean check_section_ebb_reduces (const ebb_constraint *);
6851 static void text_action_add_proposed
6852 (text_action_list *, const ebb_constraint *, asection *);
6853 static int compute_fill_extra_space (property_table_entry *);
6856 static bfd_boolean compute_removed_literals
6857 (bfd *, asection *, struct bfd_link_info *, value_map_hash_table *);
6858 static Elf_Internal_Rela *get_irel_at_offset
6859 (asection *, Elf_Internal_Rela *, bfd_vma);
6860 static bfd_boolean is_removable_literal
6861 (const source_reloc *, int, const source_reloc *, int, asection *,
6862 property_table_entry *, int);
6863 static bfd_boolean remove_dead_literal
6864 (bfd *, asection *, struct bfd_link_info *, Elf_Internal_Rela *,
6865 Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
6866 static bfd_boolean identify_literal_placement
6867 (bfd *, asection *, bfd_byte *, struct bfd_link_info *,
6868 value_map_hash_table *, bfd_boolean *, Elf_Internal_Rela *, int,
6869 source_reloc *, property_table_entry *, int, section_cache_t *,
6871 static bfd_boolean relocations_reach (source_reloc *, int, const r_reloc *);
6872 static bfd_boolean coalesce_shared_literal
6873 (asection *, source_reloc *, property_table_entry *, int, value_map *);
6874 static bfd_boolean move_shared_literal
6875 (asection *, struct bfd_link_info *, source_reloc *, property_table_entry *,
6876 int, const r_reloc *, const literal_value *, section_cache_t *);
6879 static bfd_boolean relax_section (bfd *, asection *, struct bfd_link_info *);
6880 static bfd_boolean translate_section_fixes (asection *);
6881 static bfd_boolean translate_reloc_bfd_fix (reloc_bfd_fix *);
6882 static asection *translate_reloc (const r_reloc *, r_reloc *, asection *);
6883 static void shrink_dynamic_reloc_sections
6884 (struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *);
6885 static bfd_boolean move_literal
6886 (bfd *, struct bfd_link_info *, asection *, bfd_vma, bfd_byte *,
6887 xtensa_relax_info *, Elf_Internal_Rela **, const literal_value *);
6888 static bfd_boolean relax_property_section
6889 (bfd *, asection *, struct bfd_link_info *);
6892 static bfd_boolean relax_section_symbols (bfd *, asection *);
6896 elf_xtensa_relax_section (bfd *abfd,
6898 struct bfd_link_info *link_info,
6901 static value_map_hash_table *values = NULL;
6902 static bfd_boolean relocations_analyzed = FALSE;
6903 xtensa_relax_info *relax_info;
6905 if (!relocations_analyzed)
6907 /* Do some overall initialization for relaxation. */
6908 values = value_map_hash_table_init ();
6911 relaxing_section = TRUE;
6912 if (!analyze_relocations (link_info))
6914 relocations_analyzed = TRUE;
6918 /* Don't mess with linker-created sections. */
6919 if ((sec->flags & SEC_LINKER_CREATED) != 0)
6922 relax_info = get_xtensa_relax_info (sec);
6923 BFD_ASSERT (relax_info != NULL);
6925 switch (relax_info->visited)
6928 /* Note: It would be nice to fold this pass into
6929 analyze_relocations, but it is important for this step that the
6930 sections be examined in link order. */
6931 if (!compute_removed_literals (abfd, sec, link_info, values))
6938 value_map_hash_table_delete (values);
6940 if (!relax_section (abfd, sec, link_info))
6946 if (!relax_section_symbols (abfd, sec))
6951 relax_info->visited++;
6956 /* Initialization for relaxation. */
6958 /* This function is called once at the start of relaxation. It scans
6959 all the input sections and marks the ones that are relaxable (i.e.,
6960 literal sections with L32R relocations against them), and then
6961 collects source_reloc information for all the relocations against
6962 those relaxable sections. During this process, it also detects
6963 longcalls, i.e., calls relaxed by the assembler into indirect
6964 calls, that can be optimized back into direct calls. Within each
6965 extended basic block (ebb) containing an optimized longcall, it
6966 computes a set of "text actions" that can be performed to remove
6967 the L32R associated with the longcall while optionally preserving
6968 branch target alignments. */
6971 analyze_relocations (struct bfd_link_info *link_info)
6975 bfd_boolean is_relaxable = FALSE;
6977 /* Initialize the per-section relaxation info. */
6978 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6979 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6981 init_xtensa_relax_info (sec);
6984 /* Mark relaxable sections (and count relocations against each one). */
6985 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6986 for (sec = abfd->sections; sec != NULL; sec = sec->next)
6988 if (!find_relaxable_sections (abfd, sec, link_info, &is_relaxable))
6992 /* Bail out if there are no relaxable sections. */
6996 /* Allocate space for source_relocs. */
6997 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
6998 for (sec = abfd->sections; sec != NULL; sec = sec->next)
7000 xtensa_relax_info *relax_info;
7002 relax_info = get_xtensa_relax_info (sec);
7003 if (relax_info->is_relaxable_literal_section
7004 || relax_info->is_relaxable_asm_section)
7006 relax_info->src_relocs = (source_reloc *)
7007 bfd_malloc (relax_info->src_count * sizeof (source_reloc));
7010 relax_info->src_count = 0;
7013 /* Collect info on relocations against each relaxable section. */
7014 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
7015 for (sec = abfd->sections; sec != NULL; sec = sec->next)
7017 if (!collect_source_relocs (abfd, sec, link_info))
7021 /* Compute the text actions. */
7022 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
7023 for (sec = abfd->sections; sec != NULL; sec = sec->next)
7025 if (!compute_text_actions (abfd, sec, link_info))
7033 /* Find all the sections that might be relaxed. The motivation for
7034 this pass is that collect_source_relocs() needs to record _all_ the
7035 relocations that target each relaxable section. That is expensive
7036 and unnecessary unless the target section is actually going to be
7037 relaxed. This pass identifies all such sections by checking if
7038 they have L32Rs pointing to them. In the process, the total number
7039 of relocations targeting each section is also counted so that we
7040 know how much space to allocate for source_relocs against each
7041 relaxable literal section. */
7044 find_relaxable_sections (bfd *abfd,
7046 struct bfd_link_info *link_info,
7047 bfd_boolean *is_relaxable_p)
7049 Elf_Internal_Rela *internal_relocs;
7051 bfd_boolean ok = TRUE;
7053 xtensa_relax_info *source_relax_info;
7054 bfd_boolean is_l32r_reloc;
7056 internal_relocs = retrieve_internal_relocs (abfd, sec,
7057 link_info->keep_memory);
7058 if (internal_relocs == NULL)
7061 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7062 if (contents == NULL && sec->size != 0)
7068 source_relax_info = get_xtensa_relax_info (sec);
7069 for (i = 0; i < sec->reloc_count; i++)
7071 Elf_Internal_Rela *irel = &internal_relocs[i];
7073 asection *target_sec;
7074 xtensa_relax_info *target_relax_info;
7076 /* If this section has not already been marked as "relaxable", and
7077 if it contains any ASM_EXPAND relocations (marking expanded
7078 longcalls) that can be optimized into direct calls, then mark
7079 the section as "relaxable". */
7080 if (source_relax_info
7081 && !source_relax_info->is_relaxable_asm_section
7082 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_EXPAND)
7084 bfd_boolean is_reachable = FALSE;
7085 if (is_resolvable_asm_expansion (abfd, sec, contents, irel,
7086 link_info, &is_reachable)
7089 source_relax_info->is_relaxable_asm_section = TRUE;
7090 *is_relaxable_p = TRUE;
7094 r_reloc_init (&r_rel, abfd, irel, contents,
7095 bfd_get_section_limit (abfd, sec));
7097 target_sec = r_reloc_get_section (&r_rel);
7098 target_relax_info = get_xtensa_relax_info (target_sec);
7099 if (!target_relax_info)
7102 /* Count PC-relative operand relocations against the target section.
7103 Note: The conditions tested here must match the conditions under
7104 which init_source_reloc is called in collect_source_relocs(). */
7105 is_l32r_reloc = FALSE;
7106 if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
7108 xtensa_opcode opcode =
7109 get_relocation_opcode (abfd, sec, contents, irel);
7110 if (opcode != XTENSA_UNDEFINED)
7112 is_l32r_reloc = (opcode == get_l32r_opcode ());
7113 if (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
7115 target_relax_info->src_count++;
7119 if (is_l32r_reloc && r_reloc_is_defined (&r_rel))
7121 /* Mark the target section as relaxable. */
7122 target_relax_info->is_relaxable_literal_section = TRUE;
7123 *is_relaxable_p = TRUE;
7128 release_contents (sec, contents);
7129 release_internal_relocs (sec, internal_relocs);
7134 /* Record _all_ the relocations that point to relaxable sections, and
7135 get rid of ASM_EXPAND relocs by either converting them to
7136 ASM_SIMPLIFY or by removing them. */
7139 collect_source_relocs (bfd *abfd,
7141 struct bfd_link_info *link_info)
7143 Elf_Internal_Rela *internal_relocs;
7145 bfd_boolean ok = TRUE;
7147 bfd_size_type sec_size;
7149 internal_relocs = retrieve_internal_relocs (abfd, sec,
7150 link_info->keep_memory);
7151 if (internal_relocs == NULL)
7154 sec_size = bfd_get_section_limit (abfd, sec);
7155 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7156 if (contents == NULL && sec_size != 0)
7162 /* Record relocations against relaxable literal sections. */
7163 for (i = 0; i < sec->reloc_count; i++)
7165 Elf_Internal_Rela *irel = &internal_relocs[i];
7167 asection *target_sec;
7168 xtensa_relax_info *target_relax_info;
7170 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7172 target_sec = r_reloc_get_section (&r_rel);
7173 target_relax_info = get_xtensa_relax_info (target_sec);
7175 if (target_relax_info
7176 && (target_relax_info->is_relaxable_literal_section
7177 || target_relax_info->is_relaxable_asm_section))
7179 xtensa_opcode opcode = XTENSA_UNDEFINED;
7181 bfd_boolean is_abs_literal = FALSE;
7183 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7185 /* None of the current alternate relocs are PC-relative,
7186 and only PC-relative relocs matter here. However, we
7187 still need to record the opcode for literal
7189 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7190 if (opcode == get_l32r_opcode ())
7192 is_abs_literal = TRUE;
7196 opcode = XTENSA_UNDEFINED;
7198 else if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
7200 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7201 opnd = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7204 if (opcode != XTENSA_UNDEFINED)
7206 int src_next = target_relax_info->src_next++;
7207 source_reloc *s_reloc = &target_relax_info->src_relocs[src_next];
7209 init_source_reloc (s_reloc, sec, &r_rel, opcode, opnd,
7215 /* Now get rid of ASM_EXPAND relocations. At this point, the
7216 src_relocs array for the target literal section may still be
7217 incomplete, but it must at least contain the entries for the L32R
7218 relocations associated with ASM_EXPANDs because they were just
7219 added in the preceding loop over the relocations. */
7221 for (i = 0; i < sec->reloc_count; i++)
7223 Elf_Internal_Rela *irel = &internal_relocs[i];
7224 bfd_boolean is_reachable;
7226 if (!is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
7232 Elf_Internal_Rela *l32r_irel;
7234 asection *target_sec;
7235 xtensa_relax_info *target_relax_info;
7237 /* Mark the source_reloc for the L32R so that it will be
7238 removed in compute_removed_literals(), along with the
7239 associated literal. */
7240 l32r_irel = find_associated_l32r_irel (abfd, sec, contents,
7241 irel, internal_relocs);
7242 if (l32r_irel == NULL)
7245 r_reloc_init (&r_rel, abfd, l32r_irel, contents, sec_size);
7247 target_sec = r_reloc_get_section (&r_rel);
7248 target_relax_info = get_xtensa_relax_info (target_sec);
7250 if (target_relax_info
7251 && (target_relax_info->is_relaxable_literal_section
7252 || target_relax_info->is_relaxable_asm_section))
7254 source_reloc *s_reloc;
7256 /* Search the source_relocs for the entry corresponding to
7257 the l32r_irel. Note: The src_relocs array is not yet
7258 sorted, but it wouldn't matter anyway because we're
7259 searching by source offset instead of target offset. */
7260 s_reloc = find_source_reloc (target_relax_info->src_relocs,
7261 target_relax_info->src_next,
7263 BFD_ASSERT (s_reloc);
7264 s_reloc->is_null = TRUE;
7267 /* Convert this reloc to ASM_SIMPLIFY. */
7268 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
7269 R_XTENSA_ASM_SIMPLIFY);
7270 l32r_irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7272 pin_internal_relocs (sec, internal_relocs);
7276 /* It is resolvable but doesn't reach. We resolve now
7277 by eliminating the relocation -- the call will remain
7278 expanded into L32R/CALLX. */
7279 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7280 pin_internal_relocs (sec, internal_relocs);
7285 release_contents (sec, contents);
7286 release_internal_relocs (sec, internal_relocs);
7291 /* Return TRUE if the asm expansion can be resolved. Generally it can
7292 be resolved on a final link or when a partial link locates it in the
7293 same section as the target. Set "is_reachable" flag if the target of
7294 the call is within the range of a direct call, given the current VMA
7295 for this section and the target section. */
7298 is_resolvable_asm_expansion (bfd *abfd,
7301 Elf_Internal_Rela *irel,
7302 struct bfd_link_info *link_info,
7303 bfd_boolean *is_reachable_p)
7305 asection *target_sec;
7306 bfd_vma target_offset;
7308 xtensa_opcode opcode, direct_call_opcode;
7309 bfd_vma self_address;
7310 bfd_vma dest_address;
7311 bfd_boolean uses_l32r;
7312 bfd_size_type sec_size;
7314 *is_reachable_p = FALSE;
7316 if (contents == NULL)
7319 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
7322 sec_size = bfd_get_section_limit (abfd, sec);
7323 opcode = get_expanded_call_opcode (contents + irel->r_offset,
7324 sec_size - irel->r_offset, &uses_l32r);
7325 /* Optimization of longcalls that use CONST16 is not yet implemented. */
7329 direct_call_opcode = swap_callx_for_call_opcode (opcode);
7330 if (direct_call_opcode == XTENSA_UNDEFINED)
7333 /* Check and see that the target resolves. */
7334 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7335 if (!r_reloc_is_defined (&r_rel))
7338 target_sec = r_reloc_get_section (&r_rel);
7339 target_offset = r_rel.target_offset;
7341 /* If the target is in a shared library, then it doesn't reach. This
7342 isn't supposed to come up because the compiler should never generate
7343 non-PIC calls on systems that use shared libraries, but the linker
7344 shouldn't crash regardless. */
7345 if (!target_sec->output_section)
7348 /* For relocatable sections, we can only simplify when the output
7349 section of the target is the same as the output section of the
7351 if (link_info->relocatable
7352 && (target_sec->output_section != sec->output_section
7353 || is_reloc_sym_weak (abfd, irel)))
7356 if (target_sec->output_section != sec->output_section)
7358 /* If the two sections are sufficiently far away that relaxation
7359 might take the call out of range, we can't simplify. For
7360 example, a positive displacement call into another memory
7361 could get moved to a lower address due to literal removal,
7362 but the destination won't move, and so the displacment might
7365 If the displacement is negative, assume the destination could
7366 move as far back as the start of the output section. The
7367 self_address will be at least as far into the output section
7368 as it is prior to relaxation.
7370 If the displacement is postive, assume the destination will be in
7371 it's pre-relaxed location (because relaxation only makes sections
7372 smaller). The self_address could go all the way to the beginning
7373 of the output section. */
7375 dest_address = target_sec->output_section->vma;
7376 self_address = sec->output_section->vma;
7378 if (sec->output_section->vma > target_sec->output_section->vma)
7379 self_address += sec->output_offset + irel->r_offset + 3;
7381 dest_address += bfd_get_section_limit (abfd, target_sec->output_section);
7382 /* Call targets should be four-byte aligned. */
7383 dest_address = (dest_address + 3) & ~3;
7388 self_address = (sec->output_section->vma
7389 + sec->output_offset + irel->r_offset + 3);
7390 dest_address = (target_sec->output_section->vma
7391 + target_sec->output_offset + target_offset);
7394 *is_reachable_p = pcrel_reloc_fits (direct_call_opcode, 0,
7395 self_address, dest_address);
7397 if ((self_address >> CALL_SEGMENT_BITS) !=
7398 (dest_address >> CALL_SEGMENT_BITS))
7405 static Elf_Internal_Rela *
7406 find_associated_l32r_irel (bfd *abfd,
7409 Elf_Internal_Rela *other_irel,
7410 Elf_Internal_Rela *internal_relocs)
7414 for (i = 0; i < sec->reloc_count; i++)
7416 Elf_Internal_Rela *irel = &internal_relocs[i];
7418 if (irel == other_irel)
7420 if (irel->r_offset != other_irel->r_offset)
7422 if (is_l32r_relocation (abfd, sec, contents, irel))
7430 static xtensa_opcode *
7431 build_reloc_opcodes (bfd *abfd,
7434 Elf_Internal_Rela *internal_relocs)
7437 xtensa_opcode *reloc_opcodes =
7438 (xtensa_opcode *) bfd_malloc (sizeof (xtensa_opcode) * sec->reloc_count);
7439 for (i = 0; i < sec->reloc_count; i++)
7441 Elf_Internal_Rela *irel = &internal_relocs[i];
7442 reloc_opcodes[i] = get_relocation_opcode (abfd, sec, contents, irel);
7444 return reloc_opcodes;
7447 struct reloc_range_struct
7450 bfd_boolean add; /* TRUE if start of a range, FALSE otherwise. */
7451 /* Original irel index in the array of relocations for a section. */
7452 unsigned irel_index;
7454 typedef struct reloc_range_struct reloc_range;
7456 typedef struct reloc_range_list_entry_struct reloc_range_list_entry;
7457 struct reloc_range_list_entry_struct
7459 reloc_range_list_entry *next;
7460 reloc_range_list_entry *prev;
7461 Elf_Internal_Rela *irel;
7462 xtensa_opcode opcode;
7466 struct reloc_range_list_struct
7468 /* The rest of the structure is only meaningful when ok is TRUE. */
7471 unsigned n_range; /* Number of range markers. */
7472 reloc_range *range; /* Sorted range markers. */
7474 unsigned first; /* Index of a first range element in the list. */
7475 unsigned last; /* One past index of a last range element in the list. */
7477 unsigned n_list; /* Number of list elements. */
7478 reloc_range_list_entry *reloc; /* */
7479 reloc_range_list_entry list_root;
7483 reloc_range_compare (const void *a, const void *b)
7485 const reloc_range *ra = a;
7486 const reloc_range *rb = b;
7488 if (ra->addr != rb->addr)
7489 return ra->addr < rb->addr ? -1 : 1;
7490 if (ra->add != rb->add)
7491 return ra->add ? -1 : 1;
7496 build_reloc_ranges (bfd *abfd, asection *sec,
7498 Elf_Internal_Rela *internal_relocs,
7499 xtensa_opcode *reloc_opcodes,
7500 reloc_range_list *list)
7505 reloc_range *ranges = NULL;
7506 reloc_range_list_entry *reloc =
7507 bfd_malloc (sec->reloc_count * sizeof (*reloc));
7509 memset (list, 0, sizeof (*list));
7512 for (i = 0; i < sec->reloc_count; i++)
7514 Elf_Internal_Rela *irel = &internal_relocs[i];
7515 int r_type = ELF32_R_TYPE (irel->r_info);
7516 reloc_howto_type *howto = &elf_howto_table[r_type];
7519 if (r_type == R_XTENSA_ASM_SIMPLIFY
7520 || r_type == R_XTENSA_32_PCREL
7521 || !howto->pc_relative)
7524 r_reloc_init (&r_rel, abfd, irel, contents,
7525 bfd_get_section_limit (abfd, sec));
7527 if (r_reloc_get_section (&r_rel) != sec)
7532 max_n = (max_n + 2) * 2;
7533 ranges = bfd_realloc (ranges, max_n * sizeof (*ranges));
7536 ranges[n].addr = irel->r_offset;
7537 ranges[n + 1].addr = r_rel.target_offset;
7539 ranges[n].add = ranges[n].addr < ranges[n + 1].addr;
7540 ranges[n + 1].add = !ranges[n].add;
7542 ranges[n].irel_index = i;
7543 ranges[n + 1].irel_index = i;
7547 reloc[i].irel = irel;
7549 /* Every relocation won't possibly be checked in the optimized version of
7550 check_section_ebb_pcrels_fit, so this needs to be done here. */
7551 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7553 /* None of the current alternate relocs are PC-relative,
7554 and only PC-relative relocs matter here. */
7558 xtensa_opcode opcode;
7562 opcode = reloc_opcodes[i];
7564 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7566 if (opcode == XTENSA_UNDEFINED)
7572 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7573 if (opnum == XTENSA_UNDEFINED)
7579 /* Record relocation opcode and opnum as we've calculated them
7580 anyway and they won't change. */
7581 reloc[i].opcode = opcode;
7582 reloc[i].opnum = opnum;
7588 ranges = bfd_realloc (ranges, n * sizeof (*ranges));
7589 qsort (ranges, n, sizeof (*ranges), reloc_range_compare);
7592 list->range = ranges;
7593 list->reloc = reloc;
7594 list->list_root.prev = &list->list_root;
7595 list->list_root.next = &list->list_root;
7604 static void reloc_range_list_append (reloc_range_list *list,
7605 unsigned irel_index)
7607 reloc_range_list_entry *entry = list->reloc + irel_index;
7609 entry->prev = list->list_root.prev;
7610 entry->next = &list->list_root;
7611 entry->prev->next = entry;
7612 entry->next->prev = entry;
7616 static void reloc_range_list_remove (reloc_range_list *list,
7617 unsigned irel_index)
7619 reloc_range_list_entry *entry = list->reloc + irel_index;
7621 entry->next->prev = entry->prev;
7622 entry->prev->next = entry->next;
7626 /* Update relocation list object so that it lists all relocations that cross
7627 [first; last] range. Range bounds should not decrease with successive
7629 static void reloc_range_list_update_range (reloc_range_list *list,
7630 bfd_vma first, bfd_vma last)
7632 /* This should not happen: EBBs are iterated from lower addresses to higher.
7633 But even if that happens there's no need to break: just flush current list
7634 and start from scratch. */
7635 if ((list->last > 0 && list->range[list->last - 1].addr > last) ||
7636 (list->first > 0 && list->range[list->first - 1].addr >= first))
7641 list->list_root.next = &list->list_root;
7642 list->list_root.prev = &list->list_root;
7643 fprintf (stderr, "%s: move backwards requested\n", __func__);
7646 for (; list->last < list->n_range &&
7647 list->range[list->last].addr <= last; ++list->last)
7648 if (list->range[list->last].add)
7649 reloc_range_list_append (list, list->range[list->last].irel_index);
7651 for (; list->first < list->n_range &&
7652 list->range[list->first].addr < first; ++list->first)
7653 if (!list->range[list->first].add)
7654 reloc_range_list_remove (list, list->range[list->first].irel_index);
7657 static void free_reloc_range_list (reloc_range_list *list)
7663 /* The compute_text_actions function will build a list of potential
7664 transformation actions for code in the extended basic block of each
7665 longcall that is optimized to a direct call. From this list we
7666 generate a set of actions to actually perform that optimizes for
7667 space and, if not using size_opt, maintains branch target
7670 These actions to be performed are placed on a per-section list.
7671 The actual changes are performed by relax_section() in the second
7675 compute_text_actions (bfd *abfd,
7677 struct bfd_link_info *link_info)
7679 xtensa_opcode *reloc_opcodes = NULL;
7680 xtensa_relax_info *relax_info;
7682 Elf_Internal_Rela *internal_relocs;
7683 bfd_boolean ok = TRUE;
7685 property_table_entry *prop_table = 0;
7687 bfd_size_type sec_size;
7688 reloc_range_list relevant_relocs;
7690 relax_info = get_xtensa_relax_info (sec);
7691 BFD_ASSERT (relax_info);
7692 BFD_ASSERT (relax_info->src_next == relax_info->src_count);
7694 /* Do nothing if the section contains no optimized longcalls. */
7695 if (!relax_info->is_relaxable_asm_section)
7698 internal_relocs = retrieve_internal_relocs (abfd, sec,
7699 link_info->keep_memory);
7701 if (internal_relocs)
7702 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
7703 internal_reloc_compare);
7705 sec_size = bfd_get_section_limit (abfd, sec);
7706 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7707 if (contents == NULL && sec_size != 0)
7713 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
7714 XTENSA_PROP_SEC_NAME, FALSE);
7721 /* Precompute the opcode for each relocation. */
7722 reloc_opcodes = build_reloc_opcodes (abfd, sec, contents, internal_relocs);
7724 build_reloc_ranges (abfd, sec, contents, internal_relocs, reloc_opcodes,
7727 for (i = 0; i < sec->reloc_count; i++)
7729 Elf_Internal_Rela *irel = &internal_relocs[i];
7731 property_table_entry *the_entry;
7734 ebb_constraint ebb_table;
7735 bfd_size_type simplify_size;
7737 if (irel && ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_SIMPLIFY)
7739 r_offset = irel->r_offset;
7741 simplify_size = get_asm_simplify_size (contents, sec_size, r_offset);
7742 if (simplify_size == 0)
7744 (*_bfd_error_handler)
7745 (_("%B(%A+0x%lx): could not decode instruction for XTENSA_ASM_SIMPLIFY relocation; possible configuration mismatch"),
7746 sec->owner, sec, r_offset);
7750 /* If the instruction table is not around, then don't do this
7752 the_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7753 sec->vma + irel->r_offset);
7754 if (the_entry == NULL || XTENSA_NO_NOP_REMOVAL)
7756 text_action_add (&relax_info->action_list,
7757 ta_convert_longcall, sec, r_offset,
7762 /* If the next longcall happens to be at the same address as an
7763 unreachable section of size 0, then skip forward. */
7764 ptbl_idx = the_entry - prop_table;
7765 while ((the_entry->flags & XTENSA_PROP_UNREACHABLE)
7766 && the_entry->size == 0
7767 && ptbl_idx + 1 < ptblsize
7768 && (prop_table[ptbl_idx + 1].address
7769 == prop_table[ptbl_idx].address))
7775 if (the_entry->flags & XTENSA_PROP_NO_TRANSFORM)
7776 /* NO_REORDER is OK */
7779 init_ebb_constraint (&ebb_table);
7780 ebb = &ebb_table.ebb;
7781 init_ebb (ebb, sec, contents, sec_size, prop_table, ptblsize,
7782 internal_relocs, sec->reloc_count);
7783 ebb->start_offset = r_offset + simplify_size;
7784 ebb->end_offset = r_offset + simplify_size;
7785 ebb->start_ptbl_idx = ptbl_idx;
7786 ebb->end_ptbl_idx = ptbl_idx;
7787 ebb->start_reloc_idx = i;
7788 ebb->end_reloc_idx = i;
7790 if (!extend_ebb_bounds (ebb)
7791 || !compute_ebb_proposed_actions (&ebb_table)
7792 || !compute_ebb_actions (&ebb_table)
7793 || !check_section_ebb_pcrels_fit (abfd, sec, contents,
7796 &ebb_table, reloc_opcodes)
7797 || !check_section_ebb_reduces (&ebb_table))
7799 /* If anything goes wrong or we get unlucky and something does
7800 not fit, with our plan because of expansion between
7801 critical branches, just convert to a NOP. */
7803 text_action_add (&relax_info->action_list,
7804 ta_convert_longcall, sec, r_offset, 0);
7805 i = ebb_table.ebb.end_reloc_idx;
7806 free_ebb_constraint (&ebb_table);
7810 text_action_add_proposed (&relax_info->action_list, &ebb_table, sec);
7812 /* Update the index so we do not go looking at the relocations
7813 we have already processed. */
7814 i = ebb_table.ebb.end_reloc_idx;
7815 free_ebb_constraint (&ebb_table);
7818 free_reloc_range_list (&relevant_relocs);
7821 if (action_list_count (&relax_info->action_list))
7822 print_action_list (stderr, &relax_info->action_list);
7826 release_contents (sec, contents);
7827 release_internal_relocs (sec, internal_relocs);
7831 free (reloc_opcodes);
7837 /* Do not widen an instruction if it is preceeded by a
7838 loop opcode. It might cause misalignment. */
7841 prev_instr_is_a_loop (bfd_byte *contents,
7842 bfd_size_type content_length,
7843 bfd_size_type offset)
7845 xtensa_opcode prev_opcode;
7849 prev_opcode = insn_decode_opcode (contents, content_length, offset-3, 0);
7850 return (xtensa_opcode_is_loop (xtensa_default_isa, prev_opcode) == 1);
7854 /* Find all of the possible actions for an extended basic block. */
7857 compute_ebb_proposed_actions (ebb_constraint *ebb_table)
7859 const ebb_t *ebb = &ebb_table->ebb;
7860 unsigned rel_idx = ebb->start_reloc_idx;
7861 property_table_entry *entry, *start_entry, *end_entry;
7863 xtensa_isa isa = xtensa_default_isa;
7865 static xtensa_insnbuf insnbuf = NULL;
7866 static xtensa_insnbuf slotbuf = NULL;
7868 if (insnbuf == NULL)
7870 insnbuf = xtensa_insnbuf_alloc (isa);
7871 slotbuf = xtensa_insnbuf_alloc (isa);
7874 start_entry = &ebb->ptbl[ebb->start_ptbl_idx];
7875 end_entry = &ebb->ptbl[ebb->end_ptbl_idx];
7877 for (entry = start_entry; entry <= end_entry; entry++)
7879 bfd_vma start_offset, end_offset;
7880 bfd_size_type insn_len;
7882 start_offset = entry->address - ebb->sec->vma;
7883 end_offset = entry->address + entry->size - ebb->sec->vma;
7885 if (entry == start_entry)
7886 start_offset = ebb->start_offset;
7887 if (entry == end_entry)
7888 end_offset = ebb->end_offset;
7889 offset = start_offset;
7891 if (offset == entry->address - ebb->sec->vma
7892 && (entry->flags & XTENSA_PROP_INSN_BRANCH_TARGET) != 0)
7894 enum ebb_target_enum align_type = EBB_DESIRE_TGT_ALIGN;
7895 BFD_ASSERT (offset != end_offset);
7896 if (offset == end_offset)
7899 insn_len = insn_decode_len (ebb->contents, ebb->content_length,
7904 if (check_branch_target_aligned_address (offset, insn_len))
7905 align_type = EBB_REQUIRE_TGT_ALIGN;
7907 ebb_propose_action (ebb_table, align_type, 0,
7908 ta_none, offset, 0, TRUE);
7911 while (offset != end_offset)
7913 Elf_Internal_Rela *irel;
7914 xtensa_opcode opcode;
7916 while (rel_idx < ebb->end_reloc_idx
7917 && (ebb->relocs[rel_idx].r_offset < offset
7918 || (ebb->relocs[rel_idx].r_offset == offset
7919 && (ELF32_R_TYPE (ebb->relocs[rel_idx].r_info)
7920 != R_XTENSA_ASM_SIMPLIFY))))
7923 /* Check for longcall. */
7924 irel = &ebb->relocs[rel_idx];
7925 if (irel->r_offset == offset
7926 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY)
7928 bfd_size_type simplify_size;
7930 simplify_size = get_asm_simplify_size (ebb->contents,
7931 ebb->content_length,
7933 if (simplify_size == 0)
7936 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7937 ta_convert_longcall, offset, 0, TRUE);
7939 offset += simplify_size;
7943 if (offset + MIN_INSN_LENGTH > ebb->content_length)
7945 xtensa_insnbuf_from_chars (isa, insnbuf, &ebb->contents[offset],
7946 ebb->content_length - offset);
7947 fmt = xtensa_format_decode (isa, insnbuf);
7948 if (fmt == XTENSA_UNDEFINED)
7950 insn_len = xtensa_format_length (isa, fmt);
7951 if (insn_len == (bfd_size_type) XTENSA_UNDEFINED)
7954 if (xtensa_format_num_slots (isa, fmt) != 1)
7960 xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
7961 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
7962 if (opcode == XTENSA_UNDEFINED)
7965 if ((entry->flags & XTENSA_PROP_INSN_NO_DENSITY) == 0
7966 && (entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
7967 && can_narrow_instruction (slotbuf, fmt, opcode) != 0)
7969 /* Add an instruction narrow action. */
7970 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7971 ta_narrow_insn, offset, 0, FALSE);
7973 else if ((entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
7974 && can_widen_instruction (slotbuf, fmt, opcode) != 0
7975 && ! prev_instr_is_a_loop (ebb->contents,
7976 ebb->content_length, offset))
7978 /* Add an instruction widen action. */
7979 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7980 ta_widen_insn, offset, 0, FALSE);
7982 else if (xtensa_opcode_is_loop (xtensa_default_isa, opcode) == 1)
7984 /* Check for branch targets. */
7985 ebb_propose_action (ebb_table, EBB_REQUIRE_LOOP_ALIGN, 0,
7986 ta_none, offset, 0, TRUE);
7993 if (ebb->ends_unreachable)
7995 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
7996 ta_fill, ebb->end_offset, 0, TRUE);
8002 (*_bfd_error_handler)
8003 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
8004 ebb->sec->owner, ebb->sec, offset);
8009 /* After all of the information has collected about the
8010 transformations possible in an EBB, compute the appropriate actions
8011 here in compute_ebb_actions. We still must check later to make
8012 sure that the actions do not break any relocations. The algorithm
8013 used here is pretty greedy. Basically, it removes as many no-ops
8014 as possible so that the end of the EBB has the same alignment
8015 characteristics as the original. First, it uses narrowing, then
8016 fill space at the end of the EBB, and finally widenings. If that
8017 does not work, it tries again with one fewer no-op removed. The
8018 optimization will only be performed if all of the branch targets
8019 that were aligned before transformation are also aligned after the
8022 When the size_opt flag is set, ignore the branch target alignments,
8023 narrow all wide instructions, and remove all no-ops unless the end
8024 of the EBB prevents it. */
8027 compute_ebb_actions (ebb_constraint *ebb_table)
8031 int removed_bytes = 0;
8032 ebb_t *ebb = &ebb_table->ebb;
8033 unsigned seg_idx_start = 0;
8034 unsigned seg_idx_end = 0;
8036 /* We perform this like the assembler relaxation algorithm: Start by
8037 assuming all instructions are narrow and all no-ops removed; then
8040 /* For each segment of this that has a solid constraint, check to
8041 see if there are any combinations that will keep the constraint.
8043 for (seg_idx_end = 0; seg_idx_end < ebb_table->action_count; seg_idx_end++)
8045 bfd_boolean requires_text_end_align = FALSE;
8046 unsigned longcall_count = 0;
8047 unsigned longcall_convert_count = 0;
8048 unsigned narrowable_count = 0;
8049 unsigned narrowable_convert_count = 0;
8050 unsigned widenable_count = 0;
8051 unsigned widenable_convert_count = 0;
8053 proposed_action *action = NULL;
8054 int align = (1 << ebb_table->ebb.sec->alignment_power);
8056 seg_idx_start = seg_idx_end;
8058 for (i = seg_idx_start; i < ebb_table->action_count; i++)
8060 action = &ebb_table->actions[i];
8061 if (action->action == ta_convert_longcall)
8063 if (action->action == ta_narrow_insn)
8065 if (action->action == ta_widen_insn)
8067 if (action->action == ta_fill)
8069 if (action->align_type == EBB_REQUIRE_LOOP_ALIGN)
8071 if (action->align_type == EBB_REQUIRE_TGT_ALIGN
8072 && !elf32xtensa_size_opt)
8077 if (seg_idx_end == ebb_table->action_count && !ebb->ends_unreachable)
8078 requires_text_end_align = TRUE;
8080 if (elf32xtensa_size_opt && !requires_text_end_align
8081 && action->align_type != EBB_REQUIRE_LOOP_ALIGN
8082 && action->align_type != EBB_REQUIRE_TGT_ALIGN)
8084 longcall_convert_count = longcall_count;
8085 narrowable_convert_count = narrowable_count;
8086 widenable_convert_count = 0;
8090 /* There is a constraint. Convert the max number of longcalls. */
8091 narrowable_convert_count = 0;
8092 longcall_convert_count = 0;
8093 widenable_convert_count = 0;
8095 for (j = 0; j < longcall_count; j++)
8097 int removed = (longcall_count - j) * 3 & (align - 1);
8098 unsigned desire_narrow = (align - removed) & (align - 1);
8099 unsigned desire_widen = removed;
8100 if (desire_narrow <= narrowable_count)
8102 narrowable_convert_count = desire_narrow;
8103 narrowable_convert_count +=
8104 (align * ((narrowable_count - narrowable_convert_count)
8106 longcall_convert_count = (longcall_count - j);
8107 widenable_convert_count = 0;
8110 if (desire_widen <= widenable_count && !elf32xtensa_size_opt)
8112 narrowable_convert_count = 0;
8113 longcall_convert_count = longcall_count - j;
8114 widenable_convert_count = desire_widen;
8120 /* Now the number of conversions are saved. Do them. */
8121 for (i = seg_idx_start; i < seg_idx_end; i++)
8123 action = &ebb_table->actions[i];
8124 switch (action->action)
8126 case ta_convert_longcall:
8127 if (longcall_convert_count != 0)
8129 action->action = ta_remove_longcall;
8130 action->do_action = TRUE;
8131 action->removed_bytes += 3;
8132 longcall_convert_count--;
8135 case ta_narrow_insn:
8136 if (narrowable_convert_count != 0)
8138 action->do_action = TRUE;
8139 action->removed_bytes += 1;
8140 narrowable_convert_count--;
8144 if (widenable_convert_count != 0)
8146 action->do_action = TRUE;
8147 action->removed_bytes -= 1;
8148 widenable_convert_count--;
8157 /* Now we move on to some local opts. Try to remove each of the
8158 remaining longcalls. */
8160 if (ebb_table->ebb.ends_section || ebb_table->ebb.ends_unreachable)
8163 for (i = 0; i < ebb_table->action_count; i++)
8165 int old_removed_bytes = removed_bytes;
8166 proposed_action *action = &ebb_table->actions[i];
8168 if (action->do_action && action->action == ta_convert_longcall)
8170 bfd_boolean bad_alignment = FALSE;
8172 for (j = i + 1; j < ebb_table->action_count; j++)
8174 proposed_action *new_action = &ebb_table->actions[j];
8175 bfd_vma offset = new_action->offset;
8176 if (new_action->align_type == EBB_REQUIRE_TGT_ALIGN)
8178 if (!check_branch_target_aligned
8179 (ebb_table->ebb.contents,
8180 ebb_table->ebb.content_length,
8181 offset, offset - removed_bytes))
8183 bad_alignment = TRUE;
8187 if (new_action->align_type == EBB_REQUIRE_LOOP_ALIGN)
8189 if (!check_loop_aligned (ebb_table->ebb.contents,
8190 ebb_table->ebb.content_length,
8192 offset - removed_bytes))
8194 bad_alignment = TRUE;
8198 if (new_action->action == ta_narrow_insn
8199 && !new_action->do_action
8200 && ebb_table->ebb.sec->alignment_power == 2)
8202 /* Narrow an instruction and we are done. */
8203 new_action->do_action = TRUE;
8204 new_action->removed_bytes += 1;
8205 bad_alignment = FALSE;
8208 if (new_action->action == ta_widen_insn
8209 && new_action->do_action
8210 && ebb_table->ebb.sec->alignment_power == 2)
8212 /* Narrow an instruction and we are done. */
8213 new_action->do_action = FALSE;
8214 new_action->removed_bytes += 1;
8215 bad_alignment = FALSE;
8218 if (new_action->do_action)
8219 removed_bytes += new_action->removed_bytes;
8223 action->removed_bytes += 3;
8224 action->action = ta_remove_longcall;
8225 action->do_action = TRUE;
8228 removed_bytes = old_removed_bytes;
8229 if (action->do_action)
8230 removed_bytes += action->removed_bytes;
8235 for (i = 0; i < ebb_table->action_count; ++i)
8237 proposed_action *action = &ebb_table->actions[i];
8238 if (action->do_action)
8239 removed_bytes += action->removed_bytes;
8242 if ((removed_bytes % (1 << ebb_table->ebb.sec->alignment_power)) != 0
8243 && ebb->ends_unreachable)
8245 proposed_action *action;
8249 BFD_ASSERT (ebb_table->action_count != 0);
8250 action = &ebb_table->actions[ebb_table->action_count - 1];
8251 BFD_ASSERT (action->action == ta_fill);
8252 BFD_ASSERT (ebb->ends_unreachable->flags & XTENSA_PROP_UNREACHABLE);
8254 extra_space = compute_fill_extra_space (ebb->ends_unreachable);
8255 br = action->removed_bytes + removed_bytes + extra_space;
8256 br = br & ((1 << ebb->sec->alignment_power ) - 1);
8258 action->removed_bytes = extra_space - br;
8264 /* The xlate_map is a sorted array of address mappings designed to
8265 answer the offset_with_removed_text() query with a binary search instead
8266 of a linear search through the section's action_list. */
8268 typedef struct xlate_map_entry xlate_map_entry_t;
8269 typedef struct xlate_map xlate_map_t;
8271 struct xlate_map_entry
8273 unsigned orig_address;
8274 unsigned new_address;
8280 unsigned entry_count;
8281 xlate_map_entry_t *entry;
8286 xlate_compare (const void *a_v, const void *b_v)
8288 const xlate_map_entry_t *a = (const xlate_map_entry_t *) a_v;
8289 const xlate_map_entry_t *b = (const xlate_map_entry_t *) b_v;
8290 if (a->orig_address < b->orig_address)
8292 if (a->orig_address > (b->orig_address + b->size - 1))
8299 xlate_offset_with_removed_text (const xlate_map_t *map,
8300 text_action_list *action_list,
8304 xlate_map_entry_t *e;
8307 return offset_with_removed_text (action_list, offset);
8309 if (map->entry_count == 0)
8312 r = bsearch (&offset, map->entry, map->entry_count,
8313 sizeof (xlate_map_entry_t), &xlate_compare);
8314 e = (xlate_map_entry_t *) r;
8316 BFD_ASSERT (e != NULL);
8319 return e->new_address - e->orig_address + offset;
8322 typedef struct xlate_map_context_struct xlate_map_context;
8323 struct xlate_map_context_struct
8326 xlate_map_entry_t *current_entry;
8331 xlate_map_fn (splay_tree_node node, void *p)
8333 text_action *r = (text_action *)node->value;
8334 xlate_map_context *ctx = p;
8335 unsigned orig_size = 0;
8340 case ta_remove_insn:
8341 case ta_convert_longcall:
8342 case ta_remove_literal:
8343 case ta_add_literal:
8345 case ta_remove_longcall:
8348 case ta_narrow_insn:
8357 ctx->current_entry->size =
8358 r->offset + orig_size - ctx->current_entry->orig_address;
8359 if (ctx->current_entry->size != 0)
8361 ctx->current_entry++;
8362 ctx->map->entry_count++;
8364 ctx->current_entry->orig_address = r->offset + orig_size;
8365 ctx->removed += r->removed_bytes;
8366 ctx->current_entry->new_address = r->offset + orig_size - ctx->removed;
8367 ctx->current_entry->size = 0;
8371 /* Build a binary searchable offset translation map from a section's
8374 static xlate_map_t *
8375 build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
8377 text_action_list *action_list = &relax_info->action_list;
8378 unsigned num_actions = 0;
8379 xlate_map_context ctx;
8381 ctx.map = (xlate_map_t *) bfd_malloc (sizeof (xlate_map_t));
8383 if (ctx.map == NULL)
8386 num_actions = action_list_count (action_list);
8387 ctx.map->entry = (xlate_map_entry_t *)
8388 bfd_malloc (sizeof (xlate_map_entry_t) * (num_actions + 1));
8389 if (ctx.map->entry == NULL)
8394 ctx.map->entry_count = 0;
8397 ctx.current_entry = &ctx.map->entry[0];
8399 ctx.current_entry->orig_address = 0;
8400 ctx.current_entry->new_address = 0;
8401 ctx.current_entry->size = 0;
8403 splay_tree_foreach (action_list->tree, xlate_map_fn, &ctx);
8405 ctx.current_entry->size = (bfd_get_section_limit (sec->owner, sec)
8406 - ctx.current_entry->orig_address);
8407 if (ctx.current_entry->size != 0)
8408 ctx.map->entry_count++;
8414 /* Free an offset translation map. */
8417 free_xlate_map (xlate_map_t *map)
8419 if (map && map->entry)
8426 /* Use check_section_ebb_pcrels_fit to make sure that all of the
8427 relocations in a section will fit if a proposed set of actions
8431 check_section_ebb_pcrels_fit (bfd *abfd,
8434 Elf_Internal_Rela *internal_relocs,
8435 reloc_range_list *relevant_relocs,
8436 const ebb_constraint *constraint,
8437 const xtensa_opcode *reloc_opcodes)
8440 unsigned n = sec->reloc_count;
8441 Elf_Internal_Rela *irel;
8442 xlate_map_t *xmap = NULL;
8443 bfd_boolean ok = TRUE;
8444 xtensa_relax_info *relax_info;
8445 reloc_range_list_entry *entry = NULL;
8447 relax_info = get_xtensa_relax_info (sec);
8449 if (relax_info && sec->reloc_count > 100)
8451 xmap = build_xlate_map (sec, relax_info);
8452 /* NULL indicates out of memory, but the slow version
8453 can still be used. */
8456 if (relevant_relocs && constraint->action_count)
8458 if (!relevant_relocs->ok)
8465 bfd_vma min_offset, max_offset;
8466 min_offset = max_offset = constraint->actions[0].offset;
8468 for (i = 1; i < constraint->action_count; ++i)
8470 proposed_action *action = &constraint->actions[i];
8471 bfd_vma offset = action->offset;
8473 if (offset < min_offset)
8474 min_offset = offset;
8475 if (offset > max_offset)
8476 max_offset = offset;
8478 reloc_range_list_update_range (relevant_relocs, min_offset,
8480 n = relevant_relocs->n_list;
8481 entry = &relevant_relocs->list_root;
8486 relevant_relocs = NULL;
8489 for (i = 0; i < n; i++)
8492 bfd_vma orig_self_offset, orig_target_offset;
8493 bfd_vma self_offset, target_offset;
8495 reloc_howto_type *howto;
8496 int self_removed_bytes, target_removed_bytes;
8498 if (relevant_relocs)
8500 entry = entry->next;
8505 irel = internal_relocs + i;
8507 r_type = ELF32_R_TYPE (irel->r_info);
8509 howto = &elf_howto_table[r_type];
8510 /* We maintain the required invariant: PC-relative relocations
8511 that fit before linking must fit after linking. Thus we only
8512 need to deal with relocations to the same section that are
8514 if (r_type == R_XTENSA_ASM_SIMPLIFY
8515 || r_type == R_XTENSA_32_PCREL
8516 || !howto->pc_relative)
8519 r_reloc_init (&r_rel, abfd, irel, contents,
8520 bfd_get_section_limit (abfd, sec));
8522 if (r_reloc_get_section (&r_rel) != sec)
8525 orig_self_offset = irel->r_offset;
8526 orig_target_offset = r_rel.target_offset;
8528 self_offset = orig_self_offset;
8529 target_offset = orig_target_offset;
8534 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8537 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8538 orig_target_offset);
8541 self_removed_bytes = 0;
8542 target_removed_bytes = 0;
8544 for (j = 0; j < constraint->action_count; ++j)
8546 proposed_action *action = &constraint->actions[j];
8547 bfd_vma offset = action->offset;
8548 int removed_bytes = action->removed_bytes;
8549 if (offset < orig_self_offset
8550 || (offset == orig_self_offset && action->action == ta_fill
8551 && action->removed_bytes < 0))
8552 self_removed_bytes += removed_bytes;
8553 if (offset < orig_target_offset
8554 || (offset == orig_target_offset && action->action == ta_fill
8555 && action->removed_bytes < 0))
8556 target_removed_bytes += removed_bytes;
8558 self_offset -= self_removed_bytes;
8559 target_offset -= target_removed_bytes;
8561 /* Try to encode it. Get the operand and check. */
8562 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
8564 /* None of the current alternate relocs are PC-relative,
8565 and only PC-relative relocs matter here. */
8569 xtensa_opcode opcode;
8572 if (relevant_relocs)
8574 opcode = entry->opcode;
8575 opnum = entry->opnum;
8580 opcode = reloc_opcodes[relevant_relocs ?
8581 (unsigned)(entry - relevant_relocs->reloc) : i];
8583 opcode = get_relocation_opcode (abfd, sec, contents, irel);
8584 if (opcode == XTENSA_UNDEFINED)
8590 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
8591 if (opnum == XTENSA_UNDEFINED)
8598 if (!pcrel_reloc_fits (opcode, opnum, self_offset, target_offset))
8607 free_xlate_map (xmap);
8614 check_section_ebb_reduces (const ebb_constraint *constraint)
8619 for (i = 0; i < constraint->action_count; i++)
8621 const proposed_action *action = &constraint->actions[i];
8622 if (action->do_action)
8623 removed += action->removed_bytes;
8633 text_action_add_proposed (text_action_list *l,
8634 const ebb_constraint *ebb_table,
8639 for (i = 0; i < ebb_table->action_count; i++)
8641 proposed_action *action = &ebb_table->actions[i];
8643 if (!action->do_action)
8645 switch (action->action)
8647 case ta_remove_insn:
8648 case ta_remove_longcall:
8649 case ta_convert_longcall:
8650 case ta_narrow_insn:
8653 case ta_remove_literal:
8654 text_action_add (l, action->action, sec, action->offset,
8655 action->removed_bytes);
8668 compute_fill_extra_space (property_table_entry *entry)
8670 int fill_extra_space;
8675 if ((entry->flags & XTENSA_PROP_UNREACHABLE) == 0)
8678 fill_extra_space = entry->size;
8679 if ((entry->flags & XTENSA_PROP_ALIGN) != 0)
8681 /* Fill bytes for alignment:
8682 (2**n)-1 - (addr + (2**n)-1) & (2**n -1) */
8683 int pow = GET_XTENSA_PROP_ALIGNMENT (entry->flags);
8684 int nsm = (1 << pow) - 1;
8685 bfd_vma addr = entry->address + entry->size;
8686 bfd_vma align_fill = nsm - ((addr + nsm) & nsm);
8687 fill_extra_space += align_fill;
8689 return fill_extra_space;
8693 /* First relaxation pass. */
8695 /* If the section contains relaxable literals, check each literal to
8696 see if it has the same value as another literal that has already
8697 been seen, either in the current section or a previous one. If so,
8698 add an entry to the per-section list of removed literals. The
8699 actual changes are deferred until the next pass. */
8702 compute_removed_literals (bfd *abfd,
8704 struct bfd_link_info *link_info,
8705 value_map_hash_table *values)
8707 xtensa_relax_info *relax_info;
8709 Elf_Internal_Rela *internal_relocs;
8710 source_reloc *src_relocs, *rel;
8711 bfd_boolean ok = TRUE;
8712 property_table_entry *prop_table = NULL;
8715 bfd_boolean last_loc_is_prev = FALSE;
8716 bfd_vma last_target_offset = 0;
8717 section_cache_t target_sec_cache;
8718 bfd_size_type sec_size;
8720 init_section_cache (&target_sec_cache);
8722 /* Do nothing if it is not a relaxable literal section. */
8723 relax_info = get_xtensa_relax_info (sec);
8724 BFD_ASSERT (relax_info);
8725 if (!relax_info->is_relaxable_literal_section)
8728 internal_relocs = retrieve_internal_relocs (abfd, sec,
8729 link_info->keep_memory);
8731 sec_size = bfd_get_section_limit (abfd, sec);
8732 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
8733 if (contents == NULL && sec_size != 0)
8739 /* Sort the source_relocs by target offset. */
8740 src_relocs = relax_info->src_relocs;
8741 qsort (src_relocs, relax_info->src_count,
8742 sizeof (source_reloc), source_reloc_compare);
8743 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
8744 internal_reloc_compare);
8746 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
8747 XTENSA_PROP_SEC_NAME, FALSE);
8755 for (i = 0; i < relax_info->src_count; i++)
8757 Elf_Internal_Rela *irel = NULL;
8759 rel = &src_relocs[i];
8760 if (get_l32r_opcode () != rel->opcode)
8762 irel = get_irel_at_offset (sec, internal_relocs,
8763 rel->r_rel.target_offset);
8765 /* If the relocation on this is not a simple R_XTENSA_32 or
8766 R_XTENSA_PLT then do not consider it. This may happen when
8767 the difference of two symbols is used in a literal. */
8768 if (irel && (ELF32_R_TYPE (irel->r_info) != R_XTENSA_32
8769 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_PLT))
8772 /* If the target_offset for this relocation is the same as the
8773 previous relocation, then we've already considered whether the
8774 literal can be coalesced. Skip to the next one.... */
8775 if (i != 0 && prev_i != -1
8776 && src_relocs[i-1].r_rel.target_offset == rel->r_rel.target_offset)
8780 if (last_loc_is_prev &&
8781 last_target_offset + 4 != rel->r_rel.target_offset)
8782 last_loc_is_prev = FALSE;
8784 /* Check if the relocation was from an L32R that is being removed
8785 because a CALLX was converted to a direct CALL, and check if
8786 there are no other relocations to the literal. */
8787 if (is_removable_literal (rel, i, src_relocs, relax_info->src_count,
8788 sec, prop_table, ptblsize))
8790 if (!remove_dead_literal (abfd, sec, link_info, internal_relocs,
8791 irel, rel, prop_table, ptblsize))
8796 last_target_offset = rel->r_rel.target_offset;
8800 if (!identify_literal_placement (abfd, sec, contents, link_info,
8802 &last_loc_is_prev, irel,
8803 relax_info->src_count - i, rel,
8804 prop_table, ptblsize,
8805 &target_sec_cache, rel->is_abs_literal))
8810 last_target_offset = rel->r_rel.target_offset;
8814 print_removed_literals (stderr, &relax_info->removed_list);
8815 print_action_list (stderr, &relax_info->action_list);
8821 free_section_cache (&target_sec_cache);
8823 release_contents (sec, contents);
8824 release_internal_relocs (sec, internal_relocs);
8829 static Elf_Internal_Rela *
8830 get_irel_at_offset (asection *sec,
8831 Elf_Internal_Rela *internal_relocs,
8835 Elf_Internal_Rela *irel;
8837 Elf_Internal_Rela key;
8839 if (!internal_relocs)
8842 key.r_offset = offset;
8843 irel = bsearch (&key, internal_relocs, sec->reloc_count,
8844 sizeof (Elf_Internal_Rela), internal_reloc_matches);
8848 /* bsearch does not guarantee which will be returned if there are
8849 multiple matches. We need the first that is not an alignment. */
8850 i = irel - internal_relocs;
8853 if (internal_relocs[i-1].r_offset != offset)
8857 for ( ; i < sec->reloc_count; i++)
8859 irel = &internal_relocs[i];
8860 r_type = ELF32_R_TYPE (irel->r_info);
8861 if (irel->r_offset == offset && r_type != R_XTENSA_NONE)
8870 is_removable_literal (const source_reloc *rel,
8872 const source_reloc *src_relocs,
8875 property_table_entry *prop_table,
8878 const source_reloc *curr_rel;
8879 property_table_entry *entry;
8884 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8885 sec->vma + rel->r_rel.target_offset);
8886 if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
8889 for (++i; i < src_count; ++i)
8891 curr_rel = &src_relocs[i];
8892 /* If all others have the same target offset.... */
8893 if (curr_rel->r_rel.target_offset != rel->r_rel.target_offset)
8896 if (!curr_rel->is_null
8897 && !xtensa_is_property_section (curr_rel->source_sec)
8898 && !(curr_rel->source_sec->flags & SEC_DEBUGGING))
8906 remove_dead_literal (bfd *abfd,
8908 struct bfd_link_info *link_info,
8909 Elf_Internal_Rela *internal_relocs,
8910 Elf_Internal_Rela *irel,
8912 property_table_entry *prop_table,
8915 property_table_entry *entry;
8916 xtensa_relax_info *relax_info;
8918 relax_info = get_xtensa_relax_info (sec);
8922 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8923 sec->vma + rel->r_rel.target_offset);
8925 /* Mark the unused literal so that it will be removed. */
8926 add_removed_literal (&relax_info->removed_list, &rel->r_rel, NULL);
8928 text_action_add (&relax_info->action_list,
8929 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
8931 /* If the section is 4-byte aligned, do not add fill. */
8932 if (sec->alignment_power > 2)
8934 int fill_extra_space;
8935 bfd_vma entry_sec_offset;
8937 property_table_entry *the_add_entry;
8941 entry_sec_offset = entry->address - sec->vma + entry->size;
8943 entry_sec_offset = rel->r_rel.target_offset + 4;
8945 /* If the literal range is at the end of the section,
8947 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8949 fill_extra_space = compute_fill_extra_space (the_add_entry);
8951 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
8952 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
8953 -4, fill_extra_space);
8955 adjust_fill_action (fa, removed_diff);
8957 text_action_add (&relax_info->action_list,
8958 ta_fill, sec, entry_sec_offset, removed_diff);
8961 /* Zero out the relocation on this literal location. */
8964 if (elf_hash_table (link_info)->dynamic_sections_created)
8965 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
8967 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
8968 pin_internal_relocs (sec, internal_relocs);
8971 /* Do not modify "last_loc_is_prev". */
8977 identify_literal_placement (bfd *abfd,
8980 struct bfd_link_info *link_info,
8981 value_map_hash_table *values,
8982 bfd_boolean *last_loc_is_prev_p,
8983 Elf_Internal_Rela *irel,
8984 int remaining_src_rels,
8986 property_table_entry *prop_table,
8988 section_cache_t *target_sec_cache,
8989 bfd_boolean is_abs_literal)
8993 xtensa_relax_info *relax_info;
8994 bfd_boolean literal_placed = FALSE;
8996 unsigned long value;
8997 bfd_boolean final_static_link;
8998 bfd_size_type sec_size;
9000 relax_info = get_xtensa_relax_info (sec);
9004 sec_size = bfd_get_section_limit (abfd, sec);
9007 (!link_info->relocatable
9008 && !elf_hash_table (link_info)->dynamic_sections_created);
9010 /* The placement algorithm first checks to see if the literal is
9011 already in the value map. If so and the value map is reachable
9012 from all uses, then the literal is moved to that location. If
9013 not, then we identify the last location where a fresh literal was
9014 placed. If the literal can be safely moved there, then we do so.
9015 If not, then we assume that the literal is not to move and leave
9016 the literal where it is, marking it as the last literal
9019 /* Find the literal value. */
9021 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
9024 BFD_ASSERT (rel->r_rel.target_offset < sec_size);
9025 value = bfd_get_32 (abfd, contents + rel->r_rel.target_offset);
9027 init_literal_value (&val, &r_rel, value, is_abs_literal);
9029 /* Check if we've seen another literal with the same value that
9030 is in the same output section. */
9031 val_map = value_map_get_cached_value (values, &val, final_static_link);
9034 && (r_reloc_get_section (&val_map->loc)->output_section
9035 == sec->output_section)
9036 && relocations_reach (rel, remaining_src_rels, &val_map->loc)
9037 && coalesce_shared_literal (sec, rel, prop_table, ptblsize, val_map))
9039 /* No change to last_loc_is_prev. */
9040 literal_placed = TRUE;
9043 /* For relocatable links, do not try to move literals. To do it
9044 correctly might increase the number of relocations in an input
9045 section making the default relocatable linking fail. */
9046 if (!link_info->relocatable && !literal_placed
9047 && values->has_last_loc && !(*last_loc_is_prev_p))
9049 asection *target_sec = r_reloc_get_section (&values->last_loc);
9050 if (target_sec && target_sec->output_section == sec->output_section)
9052 /* Increment the virtual offset. */
9053 r_reloc try_loc = values->last_loc;
9054 try_loc.virtual_offset += 4;
9056 /* There is a last loc that was in the same output section. */
9057 if (relocations_reach (rel, remaining_src_rels, &try_loc)
9058 && move_shared_literal (sec, link_info, rel,
9059 prop_table, ptblsize,
9060 &try_loc, &val, target_sec_cache))
9062 values->last_loc.virtual_offset += 4;
9063 literal_placed = TRUE;
9065 val_map = add_value_map (values, &val, &try_loc,
9068 val_map->loc = try_loc;
9073 if (!literal_placed)
9075 /* Nothing worked, leave the literal alone but update the last loc. */
9076 values->has_last_loc = TRUE;
9077 values->last_loc = rel->r_rel;
9079 val_map = add_value_map (values, &val, &rel->r_rel, final_static_link);
9081 val_map->loc = rel->r_rel;
9082 *last_loc_is_prev_p = TRUE;
9089 /* Check if the original relocations (presumably on L32R instructions)
9090 identified by reloc[0..N] can be changed to reference the literal
9091 identified by r_rel. If r_rel is out of range for any of the
9092 original relocations, then we don't want to coalesce the original
9093 literal with the one at r_rel. We only check reloc[0..N], where the
9094 offsets are all the same as for reloc[0] (i.e., they're all
9095 referencing the same literal) and where N is also bounded by the
9096 number of remaining entries in the "reloc" array. The "reloc" array
9097 is sorted by target offset so we know all the entries for the same
9098 literal will be contiguous. */
9101 relocations_reach (source_reloc *reloc,
9102 int remaining_relocs,
9103 const r_reloc *r_rel)
9105 bfd_vma from_offset, source_address, dest_address;
9109 if (!r_reloc_is_defined (r_rel))
9112 sec = r_reloc_get_section (r_rel);
9113 from_offset = reloc[0].r_rel.target_offset;
9115 for (i = 0; i < remaining_relocs; i++)
9117 if (reloc[i].r_rel.target_offset != from_offset)
9120 /* Ignore relocations that have been removed. */
9121 if (reloc[i].is_null)
9124 /* The original and new output section for these must be the same
9125 in order to coalesce. */
9126 if (r_reloc_get_section (&reloc[i].r_rel)->output_section
9127 != sec->output_section)
9130 /* Absolute literals in the same output section can always be
9132 if (reloc[i].is_abs_literal)
9135 /* A literal with no PC-relative relocations can be moved anywhere. */
9136 if (reloc[i].opnd != -1)
9138 /* Otherwise, check to see that it fits. */
9139 source_address = (reloc[i].source_sec->output_section->vma
9140 + reloc[i].source_sec->output_offset
9141 + reloc[i].r_rel.rela.r_offset);
9142 dest_address = (sec->output_section->vma
9143 + sec->output_offset
9144 + r_rel->target_offset);
9146 if (!pcrel_reloc_fits (reloc[i].opcode, reloc[i].opnd,
9147 source_address, dest_address))
9156 /* Move a literal to another literal location because it is
9157 the same as the other literal value. */
9160 coalesce_shared_literal (asection *sec,
9162 property_table_entry *prop_table,
9166 property_table_entry *entry;
9168 property_table_entry *the_add_entry;
9170 xtensa_relax_info *relax_info;
9172 relax_info = get_xtensa_relax_info (sec);
9176 entry = elf_xtensa_find_property_entry
9177 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9178 if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
9181 /* Mark that the literal will be coalesced. */
9182 add_removed_literal (&relax_info->removed_list, &rel->r_rel, &val_map->loc);
9184 text_action_add (&relax_info->action_list,
9185 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9187 /* If the section is 4-byte aligned, do not add fill. */
9188 if (sec->alignment_power > 2)
9190 int fill_extra_space;
9191 bfd_vma entry_sec_offset;
9194 entry_sec_offset = entry->address - sec->vma + entry->size;
9196 entry_sec_offset = rel->r_rel.target_offset + 4;
9198 /* If the literal range is at the end of the section,
9200 fill_extra_space = 0;
9201 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9203 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9204 fill_extra_space = the_add_entry->size;
9206 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9207 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9208 -4, fill_extra_space);
9210 adjust_fill_action (fa, removed_diff);
9212 text_action_add (&relax_info->action_list,
9213 ta_fill, sec, entry_sec_offset, removed_diff);
9220 /* Move a literal to another location. This may actually increase the
9221 total amount of space used because of alignments so we need to do
9222 this carefully. Also, it may make a branch go out of range. */
9225 move_shared_literal (asection *sec,
9226 struct bfd_link_info *link_info,
9228 property_table_entry *prop_table,
9230 const r_reloc *target_loc,
9231 const literal_value *lit_value,
9232 section_cache_t *target_sec_cache)
9234 property_table_entry *the_add_entry, *src_entry, *target_entry = NULL;
9235 text_action *fa, *target_fa;
9237 xtensa_relax_info *relax_info, *target_relax_info;
9238 asection *target_sec;
9240 ebb_constraint ebb_table;
9241 bfd_boolean relocs_fit;
9243 /* If this routine always returns FALSE, the literals that cannot be
9244 coalesced will not be moved. */
9245 if (elf32xtensa_no_literal_movement)
9248 relax_info = get_xtensa_relax_info (sec);
9252 target_sec = r_reloc_get_section (target_loc);
9253 target_relax_info = get_xtensa_relax_info (target_sec);
9255 /* Literals to undefined sections may not be moved because they
9256 must report an error. */
9257 if (bfd_is_und_section (target_sec))
9260 src_entry = elf_xtensa_find_property_entry
9261 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9263 if (!section_cache_section (target_sec_cache, target_sec, link_info))
9266 target_entry = elf_xtensa_find_property_entry
9267 (target_sec_cache->ptbl, target_sec_cache->pte_count,
9268 target_sec->vma + target_loc->target_offset);
9273 /* Make sure that we have not broken any branches. */
9276 init_ebb_constraint (&ebb_table);
9277 ebb = &ebb_table.ebb;
9278 init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
9279 target_sec_cache->content_length,
9280 target_sec_cache->ptbl, target_sec_cache->pte_count,
9281 target_sec_cache->relocs, target_sec_cache->reloc_count);
9283 /* Propose to add 4 bytes + worst-case alignment size increase to
9285 ebb_propose_action (&ebb_table, EBB_NO_ALIGN, 0,
9286 ta_fill, target_loc->target_offset,
9287 -4 - (1 << target_sec->alignment_power), TRUE);
9289 /* Check all of the PC-relative relocations to make sure they still fit. */
9290 relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
9291 target_sec_cache->contents,
9292 target_sec_cache->relocs, NULL,
9298 text_action_add_literal (&target_relax_info->action_list,
9299 ta_add_literal, target_loc, lit_value, -4);
9301 if (target_sec->alignment_power > 2 && target_entry != src_entry)
9303 /* May need to add or remove some fill to maintain alignment. */
9304 int fill_extra_space;
9305 bfd_vma entry_sec_offset;
9308 target_entry->address - target_sec->vma + target_entry->size;
9310 /* If the literal range is at the end of the section,
9312 fill_extra_space = 0;
9314 elf_xtensa_find_property_entry (target_sec_cache->ptbl,
9315 target_sec_cache->pte_count,
9317 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9318 fill_extra_space = the_add_entry->size;
9320 target_fa = find_fill_action (&target_relax_info->action_list,
9321 target_sec, entry_sec_offset);
9322 removed_diff = compute_removed_action_diff (target_fa, target_sec,
9323 entry_sec_offset, 4,
9326 adjust_fill_action (target_fa, removed_diff);
9328 text_action_add (&target_relax_info->action_list,
9329 ta_fill, target_sec, entry_sec_offset, removed_diff);
9332 /* Mark that the literal will be moved to the new location. */
9333 add_removed_literal (&relax_info->removed_list, &rel->r_rel, target_loc);
9335 /* Remove the literal. */
9336 text_action_add (&relax_info->action_list,
9337 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9339 /* If the section is 4-byte aligned, do not add fill. */
9340 if (sec->alignment_power > 2 && target_entry != src_entry)
9342 int fill_extra_space;
9343 bfd_vma entry_sec_offset;
9346 entry_sec_offset = src_entry->address - sec->vma + src_entry->size;
9348 entry_sec_offset = rel->r_rel.target_offset+4;
9350 /* If the literal range is at the end of the section,
9352 fill_extra_space = 0;
9353 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9355 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9356 fill_extra_space = the_add_entry->size;
9358 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9359 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9360 -4, fill_extra_space);
9362 adjust_fill_action (fa, removed_diff);
9364 text_action_add (&relax_info->action_list,
9365 ta_fill, sec, entry_sec_offset, removed_diff);
9372 /* Second relaxation pass. */
9375 action_remove_bytes_fn (splay_tree_node node, void *p)
9377 bfd_size_type *final_size = p;
9378 text_action *action = (text_action *)node->value;
9380 *final_size -= action->removed_bytes;
9384 /* Modify all of the relocations to point to the right spot, and if this
9385 is a relaxable section, delete the unwanted literals and fix the
9389 relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
9391 Elf_Internal_Rela *internal_relocs;
9392 xtensa_relax_info *relax_info;
9394 bfd_boolean ok = TRUE;
9396 bfd_boolean rv = FALSE;
9397 bfd_boolean virtual_action;
9398 bfd_size_type sec_size;
9400 sec_size = bfd_get_section_limit (abfd, sec);
9401 relax_info = get_xtensa_relax_info (sec);
9402 BFD_ASSERT (relax_info);
9404 /* First translate any of the fixes that have been added already. */
9405 translate_section_fixes (sec);
9407 /* Handle property sections (e.g., literal tables) specially. */
9408 if (xtensa_is_property_section (sec))
9410 BFD_ASSERT (!relax_info->is_relaxable_literal_section);
9411 return relax_property_section (abfd, sec, link_info);
9414 internal_relocs = retrieve_internal_relocs (abfd, sec,
9415 link_info->keep_memory);
9416 if (!internal_relocs && !action_list_count (&relax_info->action_list))
9419 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
9420 if (contents == NULL && sec_size != 0)
9426 if (internal_relocs)
9428 for (i = 0; i < sec->reloc_count; i++)
9430 Elf_Internal_Rela *irel;
9431 xtensa_relax_info *target_relax_info;
9432 bfd_vma source_offset, old_source_offset;
9435 asection *target_sec;
9437 /* Locally change the source address.
9438 Translate the target to the new target address.
9439 If it points to this section and has been removed,
9443 irel = &internal_relocs[i];
9444 source_offset = irel->r_offset;
9445 old_source_offset = source_offset;
9447 r_type = ELF32_R_TYPE (irel->r_info);
9448 r_reloc_init (&r_rel, abfd, irel, contents,
9449 bfd_get_section_limit (abfd, sec));
9451 /* If this section could have changed then we may need to
9452 change the relocation's offset. */
9454 if (relax_info->is_relaxable_literal_section
9455 || relax_info->is_relaxable_asm_section)
9457 pin_internal_relocs (sec, internal_relocs);
9459 if (r_type != R_XTENSA_NONE
9460 && find_removed_literal (&relax_info->removed_list,
9463 /* Remove this relocation. */
9464 if (elf_hash_table (link_info)->dynamic_sections_created)
9465 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
9466 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
9467 irel->r_offset = offset_with_removed_text_map
9468 (&relax_info->action_list, irel->r_offset);
9472 if (r_type == R_XTENSA_ASM_SIMPLIFY)
9474 text_action *action =
9475 find_insn_action (&relax_info->action_list,
9477 if (action && (action->action == ta_convert_longcall
9478 || action->action == ta_remove_longcall))
9480 bfd_reloc_status_type retval;
9481 char *error_message = NULL;
9483 retval = contract_asm_expansion (contents, sec_size,
9484 irel, &error_message);
9485 if (retval != bfd_reloc_ok)
9487 (*link_info->callbacks->reloc_dangerous)
9488 (link_info, error_message, abfd, sec,
9492 /* Update the action so that the code that moves
9493 the contents will do the right thing. */
9494 /* ta_remove_longcall and ta_remove_insn actions are
9495 grouped together in the tree as well as
9496 ta_convert_longcall and ta_none, so that changes below
9497 can be done w/o removing and reinserting action into
9500 if (action->action == ta_remove_longcall)
9501 action->action = ta_remove_insn;
9503 action->action = ta_none;
9504 /* Refresh the info in the r_rel. */
9505 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
9506 r_type = ELF32_R_TYPE (irel->r_info);
9510 source_offset = offset_with_removed_text_map
9511 (&relax_info->action_list, irel->r_offset);
9512 irel->r_offset = source_offset;
9515 /* If the target section could have changed then
9516 we may need to change the relocation's target offset. */
9518 target_sec = r_reloc_get_section (&r_rel);
9520 /* For a reference to a discarded section from a DWARF section,
9521 i.e., where action_discarded is PRETEND, the symbol will
9522 eventually be modified to refer to the kept section (at least if
9523 the kept and discarded sections are the same size). Anticipate
9524 that here and adjust things accordingly. */
9525 if (! elf_xtensa_ignore_discarded_relocs (sec)
9526 && elf_xtensa_action_discarded (sec) == PRETEND
9527 && sec->sec_info_type != SEC_INFO_TYPE_STABS
9528 && target_sec != NULL
9529 && discarded_section (target_sec))
9531 /* It would be natural to call _bfd_elf_check_kept_section
9532 here, but it's not exported from elflink.c. It's also a
9533 fairly expensive check. Adjusting the relocations to the
9534 discarded section is fairly harmless; it will only adjust
9535 some addends and difference values. If it turns out that
9536 _bfd_elf_check_kept_section fails later, it won't matter,
9537 so just compare the section names to find the right group
9539 asection *kept = target_sec->kept_section;
9542 if ((kept->flags & SEC_GROUP) != 0)
9544 asection *first = elf_next_in_group (kept);
9545 asection *s = first;
9550 if (strcmp (s->name, target_sec->name) == 0)
9555 s = elf_next_in_group (s);
9562 && ((target_sec->rawsize != 0
9563 ? target_sec->rawsize : target_sec->size)
9564 == (kept->rawsize != 0 ? kept->rawsize : kept->size)))
9568 target_relax_info = get_xtensa_relax_info (target_sec);
9569 if (target_relax_info
9570 && (target_relax_info->is_relaxable_literal_section
9571 || target_relax_info->is_relaxable_asm_section))
9574 target_sec = translate_reloc (&r_rel, &new_reloc, target_sec);
9576 if (r_type == R_XTENSA_DIFF8
9577 || r_type == R_XTENSA_DIFF16
9578 || r_type == R_XTENSA_DIFF32)
9580 bfd_signed_vma diff_value = 0;
9581 bfd_vma new_end_offset, diff_mask = 0;
9583 if (bfd_get_section_limit (abfd, sec) < old_source_offset)
9585 (*link_info->callbacks->reloc_dangerous)
9586 (link_info, _("invalid relocation address"),
9587 abfd, sec, old_source_offset);
9593 case R_XTENSA_DIFF8:
9595 bfd_get_signed_8 (abfd, &contents[old_source_offset]);
9597 case R_XTENSA_DIFF16:
9599 bfd_get_signed_16 (abfd, &contents[old_source_offset]);
9601 case R_XTENSA_DIFF32:
9603 bfd_get_signed_32 (abfd, &contents[old_source_offset]);
9607 new_end_offset = offset_with_removed_text_map
9608 (&target_relax_info->action_list,
9609 r_rel.target_offset + diff_value);
9610 diff_value = new_end_offset - new_reloc.target_offset;
9614 case R_XTENSA_DIFF8:
9616 bfd_put_signed_8 (abfd, diff_value,
9617 &contents[old_source_offset]);
9619 case R_XTENSA_DIFF16:
9621 bfd_put_signed_16 (abfd, diff_value,
9622 &contents[old_source_offset]);
9624 case R_XTENSA_DIFF32:
9625 diff_mask = 0x7fffffff;
9626 bfd_put_signed_32 (abfd, diff_value,
9627 &contents[old_source_offset]);
9631 /* Check for overflow. Sign bits must be all zeroes or all ones */
9632 if ((diff_value & ~diff_mask) != 0 &&
9633 (diff_value & ~diff_mask) != (-1 & ~diff_mask))
9635 (*link_info->callbacks->reloc_dangerous)
9636 (link_info, _("overflow after relaxation"),
9637 abfd, sec, old_source_offset);
9641 pin_contents (sec, contents);
9644 /* If the relocation still references a section in the same
9645 input file, modify the relocation directly instead of
9646 adding a "fix" record. */
9647 if (target_sec->owner == abfd)
9649 unsigned r_symndx = ELF32_R_SYM (new_reloc.rela.r_info);
9650 irel->r_info = ELF32_R_INFO (r_symndx, r_type);
9651 irel->r_addend = new_reloc.rela.r_addend;
9652 pin_internal_relocs (sec, internal_relocs);
9656 bfd_vma addend_displacement;
9659 addend_displacement =
9660 new_reloc.target_offset + new_reloc.virtual_offset;
9661 fix = reloc_bfd_fix_init (sec, source_offset, r_type,
9663 addend_displacement, TRUE);
9670 if ((relax_info->is_relaxable_literal_section
9671 || relax_info->is_relaxable_asm_section)
9672 && action_list_count (&relax_info->action_list))
9674 /* Walk through the planned actions and build up a table
9675 of move, copy and fill records. Use the move, copy and
9676 fill records to perform the actions once. */
9678 bfd_size_type final_size, copy_size, orig_insn_size;
9679 bfd_byte *scratch = NULL;
9680 bfd_byte *dup_contents = NULL;
9681 bfd_size_type orig_size = sec->size;
9682 bfd_vma orig_dot = 0;
9683 bfd_vma orig_dot_copied = 0; /* Byte copied already from
9684 orig dot in physical memory. */
9685 bfd_vma orig_dot_vo = 0; /* Virtual offset from orig_dot. */
9686 bfd_vma dup_dot = 0;
9688 text_action *action;
9690 final_size = sec->size;
9692 splay_tree_foreach (relax_info->action_list.tree,
9693 action_remove_bytes_fn, &final_size);
9694 scratch = (bfd_byte *) bfd_zmalloc (final_size);
9695 dup_contents = (bfd_byte *) bfd_zmalloc (final_size);
9697 /* The dot is the current fill location. */
9699 print_action_list (stderr, &relax_info->action_list);
9702 for (action = action_first (&relax_info->action_list); action;
9703 action = action_next (&relax_info->action_list, action))
9705 virtual_action = FALSE;
9706 if (action->offset > orig_dot)
9708 orig_dot += orig_dot_copied;
9709 orig_dot_copied = 0;
9711 /* Out of the virtual world. */
9714 if (action->offset > orig_dot)
9716 copy_size = action->offset - orig_dot;
9717 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9718 orig_dot += copy_size;
9719 dup_dot += copy_size;
9720 BFD_ASSERT (action->offset == orig_dot);
9722 else if (action->offset < orig_dot)
9724 if (action->action == ta_fill
9725 && action->offset - action->removed_bytes == orig_dot)
9727 /* This is OK because the fill only effects the dup_dot. */
9729 else if (action->action == ta_add_literal)
9731 /* TBD. Might need to handle this. */
9734 if (action->offset == orig_dot)
9736 if (action->virtual_offset > orig_dot_vo)
9738 if (orig_dot_vo == 0)
9740 /* Need to copy virtual_offset bytes. Probably four. */
9741 copy_size = action->virtual_offset - orig_dot_vo;
9742 memmove (&dup_contents[dup_dot],
9743 &contents[orig_dot], copy_size);
9744 orig_dot_copied = copy_size;
9745 dup_dot += copy_size;
9747 virtual_action = TRUE;
9750 BFD_ASSERT (action->virtual_offset <= orig_dot_vo);
9752 switch (action->action)
9754 case ta_remove_literal:
9755 case ta_remove_insn:
9756 BFD_ASSERT (action->removed_bytes >= 0);
9757 orig_dot += action->removed_bytes;
9760 case ta_narrow_insn:
9763 memmove (scratch, &contents[orig_dot], orig_insn_size);
9764 BFD_ASSERT (action->removed_bytes == 1);
9765 rv = narrow_instruction (scratch, final_size, 0);
9767 memmove (&dup_contents[dup_dot], scratch, copy_size);
9768 orig_dot += orig_insn_size;
9769 dup_dot += copy_size;
9773 if (action->removed_bytes >= 0)
9774 orig_dot += action->removed_bytes;
9777 /* Already zeroed in dup_contents. Just bump the
9779 dup_dot += (-action->removed_bytes);
9784 BFD_ASSERT (action->removed_bytes == 0);
9787 case ta_convert_longcall:
9788 case ta_remove_longcall:
9789 /* These will be removed or converted before we get here. */
9796 memmove (scratch, &contents[orig_dot], orig_insn_size);
9797 BFD_ASSERT (action->removed_bytes == -1);
9798 rv = widen_instruction (scratch, final_size, 0);
9800 memmove (&dup_contents[dup_dot], scratch, copy_size);
9801 orig_dot += orig_insn_size;
9802 dup_dot += copy_size;
9805 case ta_add_literal:
9808 BFD_ASSERT (action->removed_bytes == -4);
9809 /* TBD -- place the literal value here and insert
9811 memset (&dup_contents[dup_dot], 0, 4);
9812 pin_internal_relocs (sec, internal_relocs);
9813 pin_contents (sec, contents);
9815 if (!move_literal (abfd, link_info, sec, dup_dot, dup_contents,
9816 relax_info, &internal_relocs, &action->value))
9820 orig_dot_vo += copy_size;
9822 orig_dot += orig_insn_size;
9823 dup_dot += copy_size;
9827 /* Not implemented yet. */
9832 BFD_ASSERT (dup_dot <= final_size);
9833 BFD_ASSERT (orig_dot <= orig_size);
9836 orig_dot += orig_dot_copied;
9837 orig_dot_copied = 0;
9839 if (orig_dot != orig_size)
9841 copy_size = orig_size - orig_dot;
9842 BFD_ASSERT (orig_size > orig_dot);
9843 BFD_ASSERT (dup_dot + copy_size == final_size);
9844 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9845 orig_dot += copy_size;
9846 dup_dot += copy_size;
9848 BFD_ASSERT (orig_size == orig_dot);
9849 BFD_ASSERT (final_size == dup_dot);
9851 /* Move the dup_contents back. */
9852 if (final_size > orig_size)
9854 /* Contents need to be reallocated. Swap the dup_contents into
9856 sec->contents = dup_contents;
9858 contents = dup_contents;
9859 pin_contents (sec, contents);
9863 BFD_ASSERT (final_size <= orig_size);
9864 memset (contents, 0, orig_size);
9865 memcpy (contents, dup_contents, final_size);
9866 free (dup_contents);
9869 pin_contents (sec, contents);
9871 if (sec->rawsize == 0)
9872 sec->rawsize = sec->size;
9873 sec->size = final_size;
9877 release_internal_relocs (sec, internal_relocs);
9878 release_contents (sec, contents);
9884 translate_section_fixes (asection *sec)
9886 xtensa_relax_info *relax_info;
9889 relax_info = get_xtensa_relax_info (sec);
9893 for (r = relax_info->fix_list; r != NULL; r = r->next)
9894 if (!translate_reloc_bfd_fix (r))
9901 /* Translate a fix given the mapping in the relax info for the target
9902 section. If it has already been translated, no work is required. */
9905 translate_reloc_bfd_fix (reloc_bfd_fix *fix)
9907 reloc_bfd_fix new_fix;
9909 xtensa_relax_info *relax_info;
9910 removed_literal *removed;
9911 bfd_vma new_offset, target_offset;
9913 if (fix->translated)
9916 sec = fix->target_sec;
9917 target_offset = fix->target_offset;
9919 relax_info = get_xtensa_relax_info (sec);
9922 fix->translated = TRUE;
9928 /* The fix does not need to be translated if the section cannot change. */
9929 if (!relax_info->is_relaxable_literal_section
9930 && !relax_info->is_relaxable_asm_section)
9932 fix->translated = TRUE;
9936 /* If the literal has been moved and this relocation was on an
9937 opcode, then the relocation should move to the new literal
9938 location. Otherwise, the relocation should move within the
9942 if (is_operand_relocation (fix->src_type))
9944 /* Check if the original relocation is against a literal being
9946 removed = find_removed_literal (&relax_info->removed_list,
9954 /* The fact that there is still a relocation to this literal indicates
9955 that the literal is being coalesced, not simply removed. */
9956 BFD_ASSERT (removed->to.abfd != NULL);
9958 /* This was moved to some other address (possibly another section). */
9959 new_sec = r_reloc_get_section (&removed->to);
9963 relax_info = get_xtensa_relax_info (sec);
9965 (!relax_info->is_relaxable_literal_section
9966 && !relax_info->is_relaxable_asm_section))
9968 target_offset = removed->to.target_offset;
9969 new_fix.target_sec = new_sec;
9970 new_fix.target_offset = target_offset;
9971 new_fix.translated = TRUE;
9976 target_offset = removed->to.target_offset;
9977 new_fix.target_sec = new_sec;
9980 /* The target address may have been moved within its section. */
9981 new_offset = offset_with_removed_text (&relax_info->action_list,
9984 new_fix.target_offset = new_offset;
9985 new_fix.target_offset = new_offset;
9986 new_fix.translated = TRUE;
9992 /* Fix up a relocation to take account of removed literals. */
9995 translate_reloc (const r_reloc *orig_rel, r_reloc *new_rel, asection *sec)
9997 xtensa_relax_info *relax_info;
9998 removed_literal *removed;
9999 bfd_vma target_offset, base_offset;
10001 *new_rel = *orig_rel;
10003 if (!r_reloc_is_defined (orig_rel))
10006 relax_info = get_xtensa_relax_info (sec);
10007 BFD_ASSERT (relax_info && (relax_info->is_relaxable_literal_section
10008 || relax_info->is_relaxable_asm_section));
10010 target_offset = orig_rel->target_offset;
10013 if (is_operand_relocation (ELF32_R_TYPE (orig_rel->rela.r_info)))
10015 /* Check if the original relocation is against a literal being
10017 removed = find_removed_literal (&relax_info->removed_list,
10020 if (removed && removed->to.abfd)
10024 /* The fact that there is still a relocation to this literal indicates
10025 that the literal is being coalesced, not simply removed. */
10026 BFD_ASSERT (removed->to.abfd != NULL);
10028 /* This was moved to some other address
10029 (possibly in another section). */
10030 *new_rel = removed->to;
10031 new_sec = r_reloc_get_section (new_rel);
10032 if (new_sec != sec)
10035 relax_info = get_xtensa_relax_info (sec);
10037 || (!relax_info->is_relaxable_literal_section
10038 && !relax_info->is_relaxable_asm_section))
10041 target_offset = new_rel->target_offset;
10044 /* Find the base offset of the reloc symbol, excluding any addend from the
10045 reloc or from the section contents (for a partial_inplace reloc). Then
10046 find the adjusted values of the offsets due to relaxation. The base
10047 offset is needed to determine the change to the reloc's addend; the reloc
10048 addend should not be adjusted due to relaxations located before the base
10051 base_offset = r_reloc_get_target_offset (new_rel) - new_rel->rela.r_addend;
10052 if (base_offset <= target_offset)
10054 int base_removed = removed_by_actions_map (&relax_info->action_list,
10055 base_offset, FALSE);
10056 int addend_removed = removed_by_actions_map (&relax_info->action_list,
10057 target_offset, FALSE) -
10060 new_rel->target_offset = target_offset - base_removed - addend_removed;
10061 new_rel->rela.r_addend -= addend_removed;
10065 /* Handle a negative addend. The base offset comes first. */
10066 int tgt_removed = removed_by_actions_map (&relax_info->action_list,
10067 target_offset, FALSE);
10068 int addend_removed = removed_by_actions_map (&relax_info->action_list,
10069 base_offset, FALSE) -
10072 new_rel->target_offset = target_offset - tgt_removed;
10073 new_rel->rela.r_addend += addend_removed;
10080 /* For dynamic links, there may be a dynamic relocation for each
10081 literal. The number of dynamic relocations must be computed in
10082 size_dynamic_sections, which occurs before relaxation. When a
10083 literal is removed, this function checks if there is a corresponding
10084 dynamic relocation and shrinks the size of the appropriate dynamic
10085 relocation section accordingly. At this point, the contents of the
10086 dynamic relocation sections have not yet been filled in, so there's
10087 nothing else that needs to be done. */
10090 shrink_dynamic_reloc_sections (struct bfd_link_info *info,
10092 asection *input_section,
10093 Elf_Internal_Rela *rel)
10095 struct elf_xtensa_link_hash_table *htab;
10096 Elf_Internal_Shdr *symtab_hdr;
10097 struct elf_link_hash_entry **sym_hashes;
10098 unsigned long r_symndx;
10100 struct elf_link_hash_entry *h;
10101 bfd_boolean dynamic_symbol;
10103 htab = elf_xtensa_hash_table (info);
10107 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10108 sym_hashes = elf_sym_hashes (abfd);
10110 r_type = ELF32_R_TYPE (rel->r_info);
10111 r_symndx = ELF32_R_SYM (rel->r_info);
10113 if (r_symndx < symtab_hdr->sh_info)
10116 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
10118 dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
10120 if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
10121 && (input_section->flags & SEC_ALLOC) != 0
10122 && (dynamic_symbol || info->shared))
10125 bfd_boolean is_plt = FALSE;
10127 if (dynamic_symbol && r_type == R_XTENSA_PLT)
10129 srel = htab->srelplt;
10133 srel = htab->srelgot;
10135 /* Reduce size of the .rela.* section by one reloc. */
10136 BFD_ASSERT (srel != NULL);
10137 BFD_ASSERT (srel->size >= sizeof (Elf32_External_Rela));
10138 srel->size -= sizeof (Elf32_External_Rela);
10142 asection *splt, *sgotplt, *srelgot;
10143 int reloc_index, chunk;
10145 /* Find the PLT reloc index of the entry being removed. This
10146 is computed from the size of ".rela.plt". It is needed to
10147 figure out which PLT chunk to resize. Usually "last index
10148 = size - 1" since the index starts at zero, but in this
10149 context, the size has just been decremented so there's no
10150 need to subtract one. */
10151 reloc_index = srel->size / sizeof (Elf32_External_Rela);
10153 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
10154 splt = elf_xtensa_get_plt_section (info, chunk);
10155 sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
10156 BFD_ASSERT (splt != NULL && sgotplt != NULL);
10158 /* Check if an entire PLT chunk has just been eliminated. */
10159 if (reloc_index % PLT_ENTRIES_PER_CHUNK == 0)
10161 /* The two magic GOT entries for that chunk can go away. */
10162 srelgot = htab->srelgot;
10163 BFD_ASSERT (srelgot != NULL);
10164 srelgot->reloc_count -= 2;
10165 srelgot->size -= 2 * sizeof (Elf32_External_Rela);
10166 sgotplt->size -= 8;
10168 /* There should be only one entry left (and it will be
10170 BFD_ASSERT (sgotplt->size == 4);
10171 BFD_ASSERT (splt->size == PLT_ENTRY_SIZE);
10174 BFD_ASSERT (sgotplt->size >= 4);
10175 BFD_ASSERT (splt->size >= PLT_ENTRY_SIZE);
10177 sgotplt->size -= 4;
10178 splt->size -= PLT_ENTRY_SIZE;
10184 /* Take an r_rel and move it to another section. This usually
10185 requires extending the interal_relocation array and pinning it. If
10186 the original r_rel is from the same BFD, we can complete this here.
10187 Otherwise, we add a fix record to let the final link fix the
10188 appropriate address. Contents and internal relocations for the
10189 section must be pinned after calling this routine. */
10192 move_literal (bfd *abfd,
10193 struct bfd_link_info *link_info,
10196 bfd_byte *contents,
10197 xtensa_relax_info *relax_info,
10198 Elf_Internal_Rela **internal_relocs_p,
10199 const literal_value *lit)
10201 Elf_Internal_Rela *new_relocs = NULL;
10202 size_t new_relocs_count = 0;
10203 Elf_Internal_Rela this_rela;
10204 const r_reloc *r_rel;
10206 r_rel = &lit->r_rel;
10207 BFD_ASSERT (elf_section_data (sec)->relocs == *internal_relocs_p);
10209 if (r_reloc_is_const (r_rel))
10210 bfd_put_32 (abfd, lit->value, contents + offset);
10215 reloc_bfd_fix *fix;
10216 unsigned insert_at;
10218 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
10220 /* This is the difficult case. We have to create a fix up. */
10221 this_rela.r_offset = offset;
10222 this_rela.r_info = ELF32_R_INFO (0, r_type);
10223 this_rela.r_addend =
10224 r_rel->target_offset - r_reloc_get_target_offset (r_rel);
10225 bfd_put_32 (abfd, lit->value, contents + offset);
10227 /* Currently, we cannot move relocations during a relocatable link. */
10228 BFD_ASSERT (!link_info->relocatable);
10229 fix = reloc_bfd_fix_init (sec, offset, r_type,
10230 r_reloc_get_section (r_rel),
10231 r_rel->target_offset + r_rel->virtual_offset,
10233 /* We also need to mark that relocations are needed here. */
10234 sec->flags |= SEC_RELOC;
10236 translate_reloc_bfd_fix (fix);
10237 /* This fix has not yet been translated. */
10238 add_fix (sec, fix);
10240 /* Add the relocation. If we have already allocated our own
10241 space for the relocations and we have room for more, then use
10242 it. Otherwise, allocate new space and move the literals. */
10243 insert_at = sec->reloc_count;
10244 for (i = 0; i < sec->reloc_count; ++i)
10246 if (this_rela.r_offset < (*internal_relocs_p)[i].r_offset)
10253 if (*internal_relocs_p != relax_info->allocated_relocs
10254 || sec->reloc_count + 1 > relax_info->allocated_relocs_count)
10256 BFD_ASSERT (relax_info->allocated_relocs == NULL
10257 || sec->reloc_count == relax_info->relocs_count);
10259 if (relax_info->allocated_relocs_count == 0)
10260 new_relocs_count = (sec->reloc_count + 2) * 2;
10262 new_relocs_count = (relax_info->allocated_relocs_count + 2) * 2;
10264 new_relocs = (Elf_Internal_Rela *)
10265 bfd_zmalloc (sizeof (Elf_Internal_Rela) * (new_relocs_count));
10269 /* We could handle this more quickly by finding the split point. */
10270 if (insert_at != 0)
10271 memcpy (new_relocs, *internal_relocs_p,
10272 insert_at * sizeof (Elf_Internal_Rela));
10274 new_relocs[insert_at] = this_rela;
10276 if (insert_at != sec->reloc_count)
10277 memcpy (new_relocs + insert_at + 1,
10278 (*internal_relocs_p) + insert_at,
10279 (sec->reloc_count - insert_at)
10280 * sizeof (Elf_Internal_Rela));
10282 if (*internal_relocs_p != relax_info->allocated_relocs)
10284 /* The first time we re-allocate, we can only free the
10285 old relocs if they were allocated with bfd_malloc.
10286 This is not true when keep_memory is in effect. */
10287 if (!link_info->keep_memory)
10288 free (*internal_relocs_p);
10291 free (*internal_relocs_p);
10292 relax_info->allocated_relocs = new_relocs;
10293 relax_info->allocated_relocs_count = new_relocs_count;
10294 elf_section_data (sec)->relocs = new_relocs;
10295 sec->reloc_count++;
10296 relax_info->relocs_count = sec->reloc_count;
10297 *internal_relocs_p = new_relocs;
10301 if (insert_at != sec->reloc_count)
10304 for (idx = sec->reloc_count; idx > insert_at; idx--)
10305 (*internal_relocs_p)[idx] = (*internal_relocs_p)[idx-1];
10307 (*internal_relocs_p)[insert_at] = this_rela;
10308 sec->reloc_count++;
10309 if (relax_info->allocated_relocs)
10310 relax_info->relocs_count = sec->reloc_count;
10317 /* This is similar to relax_section except that when a target is moved,
10318 we shift addresses up. We also need to modify the size. This
10319 algorithm does NOT allow for relocations into the middle of the
10320 property sections. */
10323 relax_property_section (bfd *abfd,
10325 struct bfd_link_info *link_info)
10327 Elf_Internal_Rela *internal_relocs;
10328 bfd_byte *contents;
10330 bfd_boolean ok = TRUE;
10331 bfd_boolean is_full_prop_section;
10332 size_t last_zfill_target_offset = 0;
10333 asection *last_zfill_target_sec = NULL;
10334 bfd_size_type sec_size;
10335 bfd_size_type entry_size;
10337 sec_size = bfd_get_section_limit (abfd, sec);
10338 internal_relocs = retrieve_internal_relocs (abfd, sec,
10339 link_info->keep_memory);
10340 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
10341 if (contents == NULL && sec_size != 0)
10347 is_full_prop_section = xtensa_is_proptable_section (sec);
10348 if (is_full_prop_section)
10353 if (internal_relocs)
10355 for (i = 0; i < sec->reloc_count; i++)
10357 Elf_Internal_Rela *irel;
10358 xtensa_relax_info *target_relax_info;
10360 asection *target_sec;
10362 bfd_byte *size_p, *flags_p;
10364 /* Locally change the source address.
10365 Translate the target to the new target address.
10366 If it points to this section and has been removed, MOVE IT.
10367 Also, don't forget to modify the associated SIZE at
10370 irel = &internal_relocs[i];
10371 r_type = ELF32_R_TYPE (irel->r_info);
10372 if (r_type == R_XTENSA_NONE)
10375 /* Find the literal value. */
10376 r_reloc_init (&val.r_rel, abfd, irel, contents, sec_size);
10377 size_p = &contents[irel->r_offset + 4];
10379 if (is_full_prop_section)
10380 flags_p = &contents[irel->r_offset + 8];
10381 BFD_ASSERT (irel->r_offset + entry_size <= sec_size);
10383 target_sec = r_reloc_get_section (&val.r_rel);
10384 target_relax_info = get_xtensa_relax_info (target_sec);
10386 if (target_relax_info
10387 && (target_relax_info->is_relaxable_literal_section
10388 || target_relax_info->is_relaxable_asm_section ))
10390 /* Translate the relocation's destination. */
10391 bfd_vma old_offset = val.r_rel.target_offset;
10392 bfd_vma new_offset;
10393 long old_size, new_size;
10394 int removed_by_old_offset =
10395 removed_by_actions_map (&target_relax_info->action_list,
10396 old_offset, FALSE);
10397 new_offset = old_offset - removed_by_old_offset;
10399 /* Assert that we are not out of bounds. */
10400 old_size = bfd_get_32 (abfd, size_p);
10401 new_size = old_size;
10405 /* Only the first zero-sized unreachable entry is
10406 allowed to expand. In this case the new offset
10407 should be the offset before the fill and the new
10408 size is the expansion size. For other zero-sized
10409 entries the resulting size should be zero with an
10410 offset before or after the fill address depending
10411 on whether the expanding unreachable entry
10413 if (last_zfill_target_sec == 0
10414 || last_zfill_target_sec != target_sec
10415 || last_zfill_target_offset != old_offset)
10417 bfd_vma new_end_offset = new_offset;
10419 /* Recompute the new_offset, but this time don't
10420 include any fill inserted by relaxation. */
10421 removed_by_old_offset =
10422 removed_by_actions_map (&target_relax_info->action_list,
10424 new_offset = old_offset - removed_by_old_offset;
10426 /* If it is not unreachable and we have not yet
10427 seen an unreachable at this address, place it
10428 before the fill address. */
10429 if (flags_p && (bfd_get_32 (abfd, flags_p)
10430 & XTENSA_PROP_UNREACHABLE) != 0)
10432 new_size = new_end_offset - new_offset;
10434 last_zfill_target_sec = target_sec;
10435 last_zfill_target_offset = old_offset;
10441 int removed_by_old_offset_size =
10442 removed_by_actions_map (&target_relax_info->action_list,
10443 old_offset + old_size, TRUE);
10444 new_size -= removed_by_old_offset_size - removed_by_old_offset;
10447 if (new_size != old_size)
10449 bfd_put_32 (abfd, new_size, size_p);
10450 pin_contents (sec, contents);
10453 if (new_offset != old_offset)
10455 bfd_vma diff = new_offset - old_offset;
10456 irel->r_addend += diff;
10457 pin_internal_relocs (sec, internal_relocs);
10463 /* Combine adjacent property table entries. This is also done in
10464 finish_dynamic_sections() but at that point it's too late to
10465 reclaim the space in the output section, so we do this twice. */
10467 if (internal_relocs && (!link_info->relocatable
10468 || xtensa_is_littable_section (sec)))
10470 Elf_Internal_Rela *last_irel = NULL;
10471 Elf_Internal_Rela *irel, *next_rel, *rel_end;
10472 int removed_bytes = 0;
10474 flagword predef_flags;
10476 predef_flags = xtensa_get_property_predef_flags (sec);
10478 /* Walk over memory and relocations at the same time.
10479 This REQUIRES that the internal_relocs be sorted by offset. */
10480 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
10481 internal_reloc_compare);
10483 pin_internal_relocs (sec, internal_relocs);
10484 pin_contents (sec, contents);
10486 next_rel = internal_relocs;
10487 rel_end = internal_relocs + sec->reloc_count;
10489 BFD_ASSERT (sec->size % entry_size == 0);
10491 for (offset = 0; offset < sec->size; offset += entry_size)
10493 Elf_Internal_Rela *offset_rel, *extra_rel;
10494 bfd_vma bytes_to_remove, size, actual_offset;
10495 bfd_boolean remove_this_rel;
10498 /* Find the first relocation for the entry at the current offset.
10499 Adjust the offsets of any extra relocations for the previous
10504 for (irel = next_rel; irel < rel_end; irel++)
10506 if ((irel->r_offset == offset
10507 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10508 || irel->r_offset > offset)
10513 irel->r_offset -= removed_bytes;
10517 /* Find the next relocation (if there are any left). */
10521 for (irel = offset_rel + 1; irel < rel_end; irel++)
10523 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10531 /* Check if there are relocations on the current entry. There
10532 should usually be a relocation on the offset field. If there
10533 are relocations on the size or flags, then we can't optimize
10534 this entry. Also, find the next relocation to examine on the
10538 if (offset_rel->r_offset >= offset + entry_size)
10540 next_rel = offset_rel;
10541 /* There are no relocations on the current entry, but we
10542 might still be able to remove it if the size is zero. */
10545 else if (offset_rel->r_offset > offset
10547 && extra_rel->r_offset < offset + entry_size))
10549 /* There is a relocation on the size or flags, so we can't
10550 do anything with this entry. Continue with the next. */
10551 next_rel = offset_rel;
10556 BFD_ASSERT (offset_rel->r_offset == offset);
10557 offset_rel->r_offset -= removed_bytes;
10558 next_rel = offset_rel + 1;
10564 remove_this_rel = FALSE;
10565 bytes_to_remove = 0;
10566 actual_offset = offset - removed_bytes;
10567 size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
10569 if (is_full_prop_section)
10570 flags = bfd_get_32 (abfd, &contents[actual_offset + 8]);
10572 flags = predef_flags;
10575 && (flags & XTENSA_PROP_ALIGN) == 0
10576 && (flags & XTENSA_PROP_UNREACHABLE) == 0)
10578 /* Always remove entries with zero size and no alignment. */
10579 bytes_to_remove = entry_size;
10581 remove_this_rel = TRUE;
10583 else if (offset_rel
10584 && ELF32_R_TYPE (offset_rel->r_info) == R_XTENSA_32)
10588 flagword old_flags;
10590 bfd_get_32 (abfd, &contents[last_irel->r_offset + 4]);
10591 bfd_vma old_address =
10592 (last_irel->r_addend
10593 + bfd_get_32 (abfd, &contents[last_irel->r_offset]));
10594 bfd_vma new_address =
10595 (offset_rel->r_addend
10596 + bfd_get_32 (abfd, &contents[actual_offset]));
10597 if (is_full_prop_section)
10598 old_flags = bfd_get_32
10599 (abfd, &contents[last_irel->r_offset + 8]);
10601 old_flags = predef_flags;
10603 if ((ELF32_R_SYM (offset_rel->r_info)
10604 == ELF32_R_SYM (last_irel->r_info))
10605 && old_address + old_size == new_address
10606 && old_flags == flags
10607 && (old_flags & XTENSA_PROP_INSN_BRANCH_TARGET) == 0
10608 && (old_flags & XTENSA_PROP_INSN_LOOP_TARGET) == 0)
10610 /* Fix the old size. */
10611 bfd_put_32 (abfd, old_size + size,
10612 &contents[last_irel->r_offset + 4]);
10613 bytes_to_remove = entry_size;
10614 remove_this_rel = TRUE;
10617 last_irel = offset_rel;
10620 last_irel = offset_rel;
10623 if (remove_this_rel)
10625 offset_rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
10626 offset_rel->r_offset = 0;
10629 if (bytes_to_remove != 0)
10631 removed_bytes += bytes_to_remove;
10632 if (offset + bytes_to_remove < sec->size)
10633 memmove (&contents[actual_offset],
10634 &contents[actual_offset + bytes_to_remove],
10635 sec->size - offset - bytes_to_remove);
10641 /* Fix up any extra relocations on the last entry. */
10642 for (irel = next_rel; irel < rel_end; irel++)
10643 irel->r_offset -= removed_bytes;
10645 /* Clear the removed bytes. */
10646 memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
10648 if (sec->rawsize == 0)
10649 sec->rawsize = sec->size;
10650 sec->size -= removed_bytes;
10652 if (xtensa_is_littable_section (sec))
10654 asection *sgotloc = elf_xtensa_hash_table (link_info)->sgotloc;
10656 sgotloc->size -= removed_bytes;
10662 release_internal_relocs (sec, internal_relocs);
10663 release_contents (sec, contents);
10668 /* Third relaxation pass. */
10670 /* Change symbol values to account for removed literals. */
10673 relax_section_symbols (bfd *abfd, asection *sec)
10675 xtensa_relax_info *relax_info;
10676 unsigned int sec_shndx;
10677 Elf_Internal_Shdr *symtab_hdr;
10678 Elf_Internal_Sym *isymbuf;
10679 unsigned i, num_syms, num_locals;
10681 relax_info = get_xtensa_relax_info (sec);
10682 BFD_ASSERT (relax_info);
10684 if (!relax_info->is_relaxable_literal_section
10685 && !relax_info->is_relaxable_asm_section)
10688 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
10690 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10691 isymbuf = retrieve_local_syms (abfd);
10693 num_syms = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
10694 num_locals = symtab_hdr->sh_info;
10696 /* Adjust the local symbols defined in this section. */
10697 for (i = 0; i < num_locals; i++)
10699 Elf_Internal_Sym *isym = &isymbuf[i];
10701 if (isym->st_shndx == sec_shndx)
10703 bfd_vma orig_addr = isym->st_value;
10704 int removed = removed_by_actions_map (&relax_info->action_list,
10707 isym->st_value -= removed;
10708 if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC)
10710 removed_by_actions_map (&relax_info->action_list,
10711 orig_addr + isym->st_size, FALSE) -
10716 /* Now adjust the global symbols defined in this section. */
10717 for (i = 0; i < (num_syms - num_locals); i++)
10719 struct elf_link_hash_entry *sym_hash;
10721 sym_hash = elf_sym_hashes (abfd)[i];
10723 if (sym_hash->root.type == bfd_link_hash_warning)
10724 sym_hash = (struct elf_link_hash_entry *) sym_hash->root.u.i.link;
10726 if ((sym_hash->root.type == bfd_link_hash_defined
10727 || sym_hash->root.type == bfd_link_hash_defweak)
10728 && sym_hash->root.u.def.section == sec)
10730 bfd_vma orig_addr = sym_hash->root.u.def.value;
10731 int removed = removed_by_actions_map (&relax_info->action_list,
10734 sym_hash->root.u.def.value -= removed;
10736 if (sym_hash->type == STT_FUNC)
10738 removed_by_actions_map (&relax_info->action_list,
10739 orig_addr + sym_hash->size, FALSE) -
10748 /* "Fix" handling functions, called while performing relocations. */
10751 do_fix_for_relocatable_link (Elf_Internal_Rela *rel,
10753 asection *input_section,
10754 bfd_byte *contents)
10757 asection *sec, *old_sec;
10758 bfd_vma old_offset;
10759 int r_type = ELF32_R_TYPE (rel->r_info);
10760 reloc_bfd_fix *fix;
10762 if (r_type == R_XTENSA_NONE)
10765 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10769 r_reloc_init (&r_rel, input_bfd, rel, contents,
10770 bfd_get_section_limit (input_bfd, input_section));
10771 old_sec = r_reloc_get_section (&r_rel);
10772 old_offset = r_rel.target_offset;
10774 if (!old_sec || !r_reloc_is_defined (&r_rel))
10776 if (r_type != R_XTENSA_ASM_EXPAND)
10778 (*_bfd_error_handler)
10779 (_("%B(%A+0x%lx): unexpected fix for %s relocation"),
10780 input_bfd, input_section, rel->r_offset,
10781 elf_howto_table[r_type].name);
10784 /* Leave it be. Resolution will happen in a later stage. */
10788 sec = fix->target_sec;
10789 rel->r_addend += ((sec->output_offset + fix->target_offset)
10790 - (old_sec->output_offset + old_offset));
10797 do_fix_for_final_link (Elf_Internal_Rela *rel,
10799 asection *input_section,
10800 bfd_byte *contents,
10801 bfd_vma *relocationp)
10804 int r_type = ELF32_R_TYPE (rel->r_info);
10805 reloc_bfd_fix *fix;
10806 bfd_vma fixup_diff;
10808 if (r_type == R_XTENSA_NONE)
10811 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10815 sec = fix->target_sec;
10817 fixup_diff = rel->r_addend;
10818 if (elf_howto_table[fix->src_type].partial_inplace)
10820 bfd_vma inplace_val;
10821 BFD_ASSERT (fix->src_offset
10822 < bfd_get_section_limit (input_bfd, input_section));
10823 inplace_val = bfd_get_32 (input_bfd, &contents[fix->src_offset]);
10824 fixup_diff += inplace_val;
10827 *relocationp = (sec->output_section->vma
10828 + sec->output_offset
10829 + fix->target_offset - fixup_diff);
10833 /* Miscellaneous utility functions.... */
10836 elf_xtensa_get_plt_section (struct bfd_link_info *info, int chunk)
10838 struct elf_xtensa_link_hash_table *htab;
10844 htab = elf_xtensa_hash_table (info);
10851 dynobj = elf_hash_table (info)->dynobj;
10852 sprintf (plt_name, ".plt.%u", chunk);
10853 return bfd_get_linker_section (dynobj, plt_name);
10858 elf_xtensa_get_gotplt_section (struct bfd_link_info *info, int chunk)
10860 struct elf_xtensa_link_hash_table *htab;
10866 htab = elf_xtensa_hash_table (info);
10869 return htab->sgotplt;
10872 dynobj = elf_hash_table (info)->dynobj;
10873 sprintf (got_name, ".got.plt.%u", chunk);
10874 return bfd_get_linker_section (dynobj, got_name);
10878 /* Get the input section for a given symbol index.
10880 . a section symbol, return the section;
10881 . a common symbol, return the common section;
10882 . an undefined symbol, return the undefined section;
10883 . an indirect symbol, follow the links;
10884 . an absolute value, return the absolute section. */
10887 get_elf_r_symndx_section (bfd *abfd, unsigned long r_symndx)
10889 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10890 asection *target_sec = NULL;
10891 if (r_symndx < symtab_hdr->sh_info)
10893 Elf_Internal_Sym *isymbuf;
10894 unsigned int section_index;
10896 isymbuf = retrieve_local_syms (abfd);
10897 section_index = isymbuf[r_symndx].st_shndx;
10899 if (section_index == SHN_UNDEF)
10900 target_sec = bfd_und_section_ptr;
10901 else if (section_index == SHN_ABS)
10902 target_sec = bfd_abs_section_ptr;
10903 else if (section_index == SHN_COMMON)
10904 target_sec = bfd_com_section_ptr;
10906 target_sec = bfd_section_from_elf_index (abfd, section_index);
10910 unsigned long indx = r_symndx - symtab_hdr->sh_info;
10911 struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
10913 while (h->root.type == bfd_link_hash_indirect
10914 || h->root.type == bfd_link_hash_warning)
10915 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10917 switch (h->root.type)
10919 case bfd_link_hash_defined:
10920 case bfd_link_hash_defweak:
10921 target_sec = h->root.u.def.section;
10923 case bfd_link_hash_common:
10924 target_sec = bfd_com_section_ptr;
10926 case bfd_link_hash_undefined:
10927 case bfd_link_hash_undefweak:
10928 target_sec = bfd_und_section_ptr;
10930 default: /* New indirect warning. */
10931 target_sec = bfd_und_section_ptr;
10939 static struct elf_link_hash_entry *
10940 get_elf_r_symndx_hash_entry (bfd *abfd, unsigned long r_symndx)
10942 unsigned long indx;
10943 struct elf_link_hash_entry *h;
10944 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10946 if (r_symndx < symtab_hdr->sh_info)
10949 indx = r_symndx - symtab_hdr->sh_info;
10950 h = elf_sym_hashes (abfd)[indx];
10951 while (h->root.type == bfd_link_hash_indirect
10952 || h->root.type == bfd_link_hash_warning)
10953 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10958 /* Get the section-relative offset for a symbol number. */
10961 get_elf_r_symndx_offset (bfd *abfd, unsigned long r_symndx)
10963 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10964 bfd_vma offset = 0;
10966 if (r_symndx < symtab_hdr->sh_info)
10968 Elf_Internal_Sym *isymbuf;
10969 isymbuf = retrieve_local_syms (abfd);
10970 offset = isymbuf[r_symndx].st_value;
10974 unsigned long indx = r_symndx - symtab_hdr->sh_info;
10975 struct elf_link_hash_entry *h =
10976 elf_sym_hashes (abfd)[indx];
10978 while (h->root.type == bfd_link_hash_indirect
10979 || h->root.type == bfd_link_hash_warning)
10980 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10981 if (h->root.type == bfd_link_hash_defined
10982 || h->root.type == bfd_link_hash_defweak)
10983 offset = h->root.u.def.value;
10990 is_reloc_sym_weak (bfd *abfd, Elf_Internal_Rela *rel)
10992 unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
10993 struct elf_link_hash_entry *h;
10995 h = get_elf_r_symndx_hash_entry (abfd, r_symndx);
10996 if (h && h->root.type == bfd_link_hash_defweak)
11003 pcrel_reloc_fits (xtensa_opcode opc,
11005 bfd_vma self_address,
11006 bfd_vma dest_address)
11008 xtensa_isa isa = xtensa_default_isa;
11009 uint32 valp = dest_address;
11010 if (xtensa_operand_do_reloc (isa, opc, opnd, &valp, self_address)
11011 || xtensa_operand_encode (isa, opc, opnd, &valp))
11018 xtensa_is_property_section (asection *sec)
11020 if (xtensa_is_insntable_section (sec)
11021 || xtensa_is_littable_section (sec)
11022 || xtensa_is_proptable_section (sec))
11030 xtensa_is_insntable_section (asection *sec)
11032 if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
11033 || CONST_STRNEQ (sec->name, ".gnu.linkonce.x."))
11041 xtensa_is_littable_section (asection *sec)
11043 if (CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME)
11044 || CONST_STRNEQ (sec->name, ".gnu.linkonce.p."))
11052 xtensa_is_proptable_section (asection *sec)
11054 if (CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME)
11055 || CONST_STRNEQ (sec->name, ".gnu.linkonce.prop."))
11063 internal_reloc_compare (const void *ap, const void *bp)
11065 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
11066 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
11068 if (a->r_offset != b->r_offset)
11069 return (a->r_offset - b->r_offset);
11071 /* We don't need to sort on these criteria for correctness,
11072 but enforcing a more strict ordering prevents unstable qsort
11073 from behaving differently with different implementations.
11074 Without the code below we get correct but different results
11075 on Solaris 2.7 and 2.8. We would like to always produce the
11076 same results no matter the host. */
11078 if (a->r_info != b->r_info)
11079 return (a->r_info - b->r_info);
11081 return (a->r_addend - b->r_addend);
11086 internal_reloc_matches (const void *ap, const void *bp)
11088 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
11089 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
11091 /* Check if one entry overlaps with the other; this shouldn't happen
11092 except when searching for a match. */
11093 return (a->r_offset - b->r_offset);
11097 /* Predicate function used to look up a section in a particular group. */
11100 match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
11102 const char *gname = inf;
11103 const char *group_name = elf_group_name (sec);
11105 return (group_name == gname
11106 || (group_name != NULL
11108 && strcmp (group_name, gname) == 0));
11112 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
11115 xtensa_property_section_name (asection *sec, const char *base_name)
11117 const char *suffix, *group_name;
11118 char *prop_sec_name;
11120 group_name = elf_group_name (sec);
11123 suffix = strrchr (sec->name, '.');
11124 if (suffix == sec->name)
11126 prop_sec_name = (char *) bfd_malloc (strlen (base_name) + 1
11127 + (suffix ? strlen (suffix) : 0));
11128 strcpy (prop_sec_name, base_name);
11130 strcat (prop_sec_name, suffix);
11132 else if (strncmp (sec->name, ".gnu.linkonce.", linkonce_len) == 0)
11134 char *linkonce_kind = 0;
11136 if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
11137 linkonce_kind = "x.";
11138 else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
11139 linkonce_kind = "p.";
11140 else if (strcmp (base_name, XTENSA_PROP_SEC_NAME) == 0)
11141 linkonce_kind = "prop.";
11145 prop_sec_name = (char *) bfd_malloc (strlen (sec->name)
11146 + strlen (linkonce_kind) + 1);
11147 memcpy (prop_sec_name, ".gnu.linkonce.", linkonce_len);
11148 strcpy (prop_sec_name + linkonce_len, linkonce_kind);
11150 suffix = sec->name + linkonce_len;
11151 /* For backward compatibility, replace "t." instead of inserting
11152 the new linkonce_kind (but not for "prop" sections). */
11153 if (CONST_STRNEQ (suffix, "t.") && linkonce_kind[1] == '.')
11155 strcat (prop_sec_name + linkonce_len, suffix);
11158 prop_sec_name = strdup (base_name);
11160 return prop_sec_name;
11165 xtensa_get_property_section (asection *sec, const char *base_name)
11167 char *prop_sec_name;
11168 asection *prop_sec;
11170 prop_sec_name = xtensa_property_section_name (sec, base_name);
11171 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11172 match_section_group,
11173 (void *) elf_group_name (sec));
11174 free (prop_sec_name);
11180 xtensa_make_property_section (asection *sec, const char *base_name)
11182 char *prop_sec_name;
11183 asection *prop_sec;
11185 /* Check if the section already exists. */
11186 prop_sec_name = xtensa_property_section_name (sec, base_name);
11187 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11188 match_section_group,
11189 (void *) elf_group_name (sec));
11190 /* If not, create it. */
11193 flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
11194 flags |= (bfd_get_section_flags (sec->owner, sec)
11195 & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES));
11197 prop_sec = bfd_make_section_anyway_with_flags
11198 (sec->owner, strdup (prop_sec_name), flags);
11202 elf_group_name (prop_sec) = elf_group_name (sec);
11205 free (prop_sec_name);
11211 xtensa_get_property_predef_flags (asection *sec)
11213 if (xtensa_is_insntable_section (sec))
11214 return (XTENSA_PROP_INSN
11215 | XTENSA_PROP_NO_TRANSFORM
11216 | XTENSA_PROP_INSN_NO_REORDER);
11218 if (xtensa_is_littable_section (sec))
11219 return (XTENSA_PROP_LITERAL
11220 | XTENSA_PROP_NO_TRANSFORM
11221 | XTENSA_PROP_INSN_NO_REORDER);
11227 /* Other functions called directly by the linker. */
11230 xtensa_callback_required_dependence (bfd *abfd,
11232 struct bfd_link_info *link_info,
11233 deps_callback_t callback,
11236 Elf_Internal_Rela *internal_relocs;
11237 bfd_byte *contents;
11239 bfd_boolean ok = TRUE;
11240 bfd_size_type sec_size;
11242 sec_size = bfd_get_section_limit (abfd, sec);
11244 /* ".plt*" sections have no explicit relocations but they contain L32R
11245 instructions that reference the corresponding ".got.plt*" sections. */
11246 if ((sec->flags & SEC_LINKER_CREATED) != 0
11247 && CONST_STRNEQ (sec->name, ".plt"))
11251 /* Find the corresponding ".got.plt*" section. */
11252 if (sec->name[4] == '\0')
11253 sgotplt = bfd_get_linker_section (sec->owner, ".got.plt");
11259 BFD_ASSERT (sec->name[4] == '.');
11260 chunk = strtol (&sec->name[5], NULL, 10);
11262 sprintf (got_name, ".got.plt.%u", chunk);
11263 sgotplt = bfd_get_linker_section (sec->owner, got_name);
11265 BFD_ASSERT (sgotplt);
11267 /* Assume worst-case offsets: L32R at the very end of the ".plt"
11268 section referencing a literal at the very beginning of
11269 ".got.plt". This is very close to the real dependence, anyway. */
11270 (*callback) (sec, sec_size, sgotplt, 0, closure);
11273 /* Only ELF files are supported for Xtensa. Check here to avoid a segfault
11274 when building uclibc, which runs "ld -b binary /dev/null". */
11275 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
11278 internal_relocs = retrieve_internal_relocs (abfd, sec,
11279 link_info->keep_memory);
11280 if (internal_relocs == NULL
11281 || sec->reloc_count == 0)
11284 /* Cache the contents for the duration of this scan. */
11285 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
11286 if (contents == NULL && sec_size != 0)
11292 if (!xtensa_default_isa)
11293 xtensa_default_isa = xtensa_isa_init (0, 0);
11295 for (i = 0; i < sec->reloc_count; i++)
11297 Elf_Internal_Rela *irel = &internal_relocs[i];
11298 if (is_l32r_relocation (abfd, sec, contents, irel))
11301 asection *target_sec;
11302 bfd_vma target_offset;
11304 r_reloc_init (&l32r_rel, abfd, irel, contents, sec_size);
11307 /* L32Rs must be local to the input file. */
11308 if (r_reloc_is_defined (&l32r_rel))
11310 target_sec = r_reloc_get_section (&l32r_rel);
11311 target_offset = l32r_rel.target_offset;
11313 (*callback) (sec, irel->r_offset, target_sec, target_offset,
11319 release_internal_relocs (sec, internal_relocs);
11320 release_contents (sec, contents);
11324 /* The default literal sections should always be marked as "code" (i.e.,
11325 SHF_EXECINSTR). This is particularly important for the Linux kernel
11326 module loader so that the literals are not placed after the text. */
11327 static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
11329 { STRING_COMMA_LEN (".fini.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11330 { STRING_COMMA_LEN (".init.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11331 { STRING_COMMA_LEN (".literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11332 { STRING_COMMA_LEN (".xtensa.info"), 0, SHT_NOTE, 0 },
11333 { NULL, 0, 0, 0, 0 }
11336 #define ELF_TARGET_ID XTENSA_ELF_DATA
11338 #define TARGET_LITTLE_SYM xtensa_elf32_le_vec
11339 #define TARGET_LITTLE_NAME "elf32-xtensa-le"
11340 #define TARGET_BIG_SYM xtensa_elf32_be_vec
11341 #define TARGET_BIG_NAME "elf32-xtensa-be"
11342 #define ELF_ARCH bfd_arch_xtensa
11344 #define ELF_MACHINE_CODE EM_XTENSA
11345 #define ELF_MACHINE_ALT1 EM_XTENSA_OLD
11348 #define ELF_MAXPAGESIZE (1 << XCHAL_MMU_MIN_PTE_PAGE_SIZE)
11349 #else /* !XCHAL_HAVE_MMU */
11350 #define ELF_MAXPAGESIZE 1
11351 #endif /* !XCHAL_HAVE_MMU */
11352 #endif /* ELF_ARCH */
11354 #define elf_backend_can_gc_sections 1
11355 #define elf_backend_can_refcount 1
11356 #define elf_backend_plt_readonly 1
11357 #define elf_backend_got_header_size 4
11358 #define elf_backend_want_dynbss 0
11359 #define elf_backend_want_got_plt 1
11361 #define elf_info_to_howto elf_xtensa_info_to_howto_rela
11363 #define bfd_elf32_mkobject elf_xtensa_mkobject
11365 #define bfd_elf32_bfd_merge_private_bfd_data elf_xtensa_merge_private_bfd_data
11366 #define bfd_elf32_new_section_hook elf_xtensa_new_section_hook
11367 #define bfd_elf32_bfd_print_private_bfd_data elf_xtensa_print_private_bfd_data
11368 #define bfd_elf32_bfd_relax_section elf_xtensa_relax_section
11369 #define bfd_elf32_bfd_reloc_type_lookup elf_xtensa_reloc_type_lookup
11370 #define bfd_elf32_bfd_reloc_name_lookup \
11371 elf_xtensa_reloc_name_lookup
11372 #define bfd_elf32_bfd_set_private_flags elf_xtensa_set_private_flags
11373 #define bfd_elf32_bfd_link_hash_table_create elf_xtensa_link_hash_table_create
11375 #define elf_backend_adjust_dynamic_symbol elf_xtensa_adjust_dynamic_symbol
11376 #define elf_backend_check_relocs elf_xtensa_check_relocs
11377 #define elf_backend_create_dynamic_sections elf_xtensa_create_dynamic_sections
11378 #define elf_backend_discard_info elf_xtensa_discard_info
11379 #define elf_backend_ignore_discarded_relocs elf_xtensa_ignore_discarded_relocs
11380 #define elf_backend_final_write_processing elf_xtensa_final_write_processing
11381 #define elf_backend_finish_dynamic_sections elf_xtensa_finish_dynamic_sections
11382 #define elf_backend_finish_dynamic_symbol elf_xtensa_finish_dynamic_symbol
11383 #define elf_backend_gc_mark_hook elf_xtensa_gc_mark_hook
11384 #define elf_backend_gc_sweep_hook elf_xtensa_gc_sweep_hook
11385 #define elf_backend_grok_prstatus elf_xtensa_grok_prstatus
11386 #define elf_backend_grok_psinfo elf_xtensa_grok_psinfo
11387 #define elf_backend_hide_symbol elf_xtensa_hide_symbol
11388 #define elf_backend_object_p elf_xtensa_object_p
11389 #define elf_backend_reloc_type_class elf_xtensa_reloc_type_class
11390 #define elf_backend_relocate_section elf_xtensa_relocate_section
11391 #define elf_backend_size_dynamic_sections elf_xtensa_size_dynamic_sections
11392 #define elf_backend_always_size_sections elf_xtensa_always_size_sections
11393 #define elf_backend_omit_section_dynsym \
11394 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
11395 #define elf_backend_special_sections elf_xtensa_special_sections
11396 #define elf_backend_action_discarded elf_xtensa_action_discarded
11397 #define elf_backend_copy_indirect_symbol elf_xtensa_copy_indirect_symbol
11399 #include "elf32-target.h"