1 /* Xtensa-specific support for 32-bit ELF.
2 Copyright 2003, 2004, 2005, 2006 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 2 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 "xtensa-isa.h"
32 #include "xtensa-config.h"
34 #define XTENSA_NO_NOP_REMOVAL 0
36 /* Local helper functions. */
38 static bfd_boolean add_extra_plt_sections (bfd *, int);
39 static char *vsprint_msg (const char *, const char *, int, ...) ATTRIBUTE_PRINTF(2,4);
40 static bfd_reloc_status_type bfd_elf_xtensa_reloc
41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_boolean do_fix_for_relocatable_link
43 (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *);
44 static void do_fix_for_final_link
45 (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *, bfd_vma *);
47 /* Local functions to handle Xtensa configurability. */
49 static bfd_boolean is_indirect_call_opcode (xtensa_opcode);
50 static bfd_boolean is_direct_call_opcode (xtensa_opcode);
51 static bfd_boolean is_windowed_call_opcode (xtensa_opcode);
52 static xtensa_opcode get_const16_opcode (void);
53 static xtensa_opcode get_l32r_opcode (void);
54 static bfd_vma l32r_offset (bfd_vma, bfd_vma);
55 static int get_relocation_opnd (xtensa_opcode, int);
56 static int get_relocation_slot (int);
57 static xtensa_opcode get_relocation_opcode
58 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
59 static bfd_boolean is_l32r_relocation
60 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
61 static bfd_boolean is_alt_relocation (int);
62 static bfd_boolean is_operand_relocation (int);
63 static bfd_size_type insn_decode_len
64 (bfd_byte *, bfd_size_type, bfd_size_type);
65 static xtensa_opcode insn_decode_opcode
66 (bfd_byte *, bfd_size_type, bfd_size_type, int);
67 static bfd_boolean check_branch_target_aligned
68 (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
69 static bfd_boolean check_loop_aligned
70 (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
71 static bfd_boolean check_branch_target_aligned_address (bfd_vma, int);
72 static bfd_size_type get_asm_simplify_size
73 (bfd_byte *, bfd_size_type, bfd_size_type);
75 /* Functions for link-time code simplifications. */
77 static bfd_reloc_status_type elf_xtensa_do_asm_simplify
78 (bfd_byte *, bfd_vma, bfd_vma, char **);
79 static bfd_reloc_status_type contract_asm_expansion
80 (bfd_byte *, bfd_vma, Elf_Internal_Rela *, char **);
81 static xtensa_opcode swap_callx_for_call_opcode (xtensa_opcode);
82 static xtensa_opcode get_expanded_call_opcode (bfd_byte *, int, bfd_boolean *);
84 /* Access to internal relocations, section contents and symbols. */
86 static Elf_Internal_Rela *retrieve_internal_relocs
87 (bfd *, asection *, bfd_boolean);
88 static void pin_internal_relocs (asection *, Elf_Internal_Rela *);
89 static void release_internal_relocs (asection *, Elf_Internal_Rela *);
90 static bfd_byte *retrieve_contents (bfd *, asection *, bfd_boolean);
91 static void pin_contents (asection *, bfd_byte *);
92 static void release_contents (asection *, bfd_byte *);
93 static Elf_Internal_Sym *retrieve_local_syms (bfd *);
95 /* Miscellaneous utility functions. */
97 static asection *elf_xtensa_get_plt_section (bfd *, int);
98 static asection *elf_xtensa_get_gotplt_section (bfd *, int);
99 static asection *get_elf_r_symndx_section (bfd *, unsigned long);
100 static struct elf_link_hash_entry *get_elf_r_symndx_hash_entry
101 (bfd *, unsigned long);
102 static bfd_vma get_elf_r_symndx_offset (bfd *, unsigned long);
103 static bfd_boolean is_reloc_sym_weak (bfd *, Elf_Internal_Rela *);
104 static bfd_boolean pcrel_reloc_fits (xtensa_opcode, int, bfd_vma, bfd_vma);
105 static bfd_boolean xtensa_is_property_section (asection *);
106 static bfd_boolean xtensa_is_littable_section (asection *);
107 static int internal_reloc_compare (const void *, const void *);
108 static int internal_reloc_matches (const void *, const void *);
109 extern asection *xtensa_get_property_section (asection *, const char *);
110 static flagword xtensa_get_property_predef_flags (asection *);
112 /* Other functions called directly by the linker. */
114 typedef void (*deps_callback_t)
115 (asection *, bfd_vma, asection *, bfd_vma, void *);
116 extern bfd_boolean xtensa_callback_required_dependence
117 (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *);
120 /* Globally visible flag for choosing size optimization of NOP removal
121 instead of branch-target-aware minimization for NOP removal.
122 When nonzero, narrow all instructions and remove all NOPs possible
123 around longcall expansions. */
125 int elf32xtensa_size_opt;
128 /* The "new_section_hook" is used to set up a per-section
129 "xtensa_relax_info" data structure with additional information used
130 during relaxation. */
132 typedef struct xtensa_relax_info_struct xtensa_relax_info;
135 /* Total count of PLT relocations seen during check_relocs.
136 The actual PLT code must be split into multiple sections and all
137 the sections have to be created before size_dynamic_sections,
138 where we figure out the exact number of PLT entries that will be
139 needed. It is OK if this count is an overestimate, e.g., some
140 relocations may be removed by GC. */
142 static int plt_reloc_count = 0;
145 /* The GNU tools do not easily allow extending interfaces to pass around
146 the pointer to the Xtensa ISA information, so instead we add a global
147 variable here (in BFD) that can be used by any of the tools that need
150 xtensa_isa xtensa_default_isa;
153 /* When this is true, relocations may have been modified to refer to
154 symbols from other input files. The per-section list of "fix"
155 records needs to be checked when resolving relocations. */
157 static bfd_boolean relaxing_section = FALSE;
159 /* When this is true, during final links, literals that cannot be
160 coalesced and their relocations may be moved to other sections. */
162 int elf32xtensa_no_literal_movement = 1;
165 static reloc_howto_type elf_howto_table[] =
167 HOWTO (R_XTENSA_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
168 bfd_elf_xtensa_reloc, "R_XTENSA_NONE",
169 FALSE, 0x00000000, 0x00000000, FALSE),
170 HOWTO (R_XTENSA_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
171 bfd_elf_xtensa_reloc, "R_XTENSA_32",
172 TRUE, 0xffffffff, 0xffffffff, FALSE),
173 /* Replace a 32-bit value with a value from the runtime linker (only
174 used by linker-generated stub functions). The r_addend value is
175 special: 1 means to substitute a pointer to the runtime linker's
176 dynamic resolver function; 2 means to substitute the link map for
177 the shared object. */
178 HOWTO (R_XTENSA_RTLD, 0, 2, 32, FALSE, 0, complain_overflow_dont,
179 NULL, "R_XTENSA_RTLD",
180 FALSE, 0x00000000, 0x00000000, FALSE),
181 HOWTO (R_XTENSA_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
182 bfd_elf_generic_reloc, "R_XTENSA_GLOB_DAT",
183 FALSE, 0xffffffff, 0xffffffff, FALSE),
184 HOWTO (R_XTENSA_JMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
185 bfd_elf_generic_reloc, "R_XTENSA_JMP_SLOT",
186 FALSE, 0xffffffff, 0xffffffff, FALSE),
187 HOWTO (R_XTENSA_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
188 bfd_elf_generic_reloc, "R_XTENSA_RELATIVE",
189 FALSE, 0xffffffff, 0xffffffff, FALSE),
190 HOWTO (R_XTENSA_PLT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
191 bfd_elf_xtensa_reloc, "R_XTENSA_PLT",
192 FALSE, 0xffffffff, 0xffffffff, FALSE),
194 HOWTO (R_XTENSA_OP0, 0, 0, 0, TRUE, 0, complain_overflow_dont,
195 bfd_elf_xtensa_reloc, "R_XTENSA_OP0",
196 FALSE, 0x00000000, 0x00000000, TRUE),
197 HOWTO (R_XTENSA_OP1, 0, 0, 0, TRUE, 0, complain_overflow_dont,
198 bfd_elf_xtensa_reloc, "R_XTENSA_OP1",
199 FALSE, 0x00000000, 0x00000000, TRUE),
200 HOWTO (R_XTENSA_OP2, 0, 0, 0, TRUE, 0, complain_overflow_dont,
201 bfd_elf_xtensa_reloc, "R_XTENSA_OP2",
202 FALSE, 0x00000000, 0x00000000, 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",
206 FALSE, 0x00000000, 0x00000000, FALSE),
207 /* Relax assembly auto-expansion. */
208 HOWTO (R_XTENSA_ASM_SIMPLIFY, 0, 0, 0, TRUE, 0, complain_overflow_dont,
209 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_SIMPLIFY",
210 FALSE, 0x00000000, 0x00000000, TRUE),
213 /* GNU extension to record C++ vtable hierarchy. */
214 HOWTO (R_XTENSA_GNU_VTINHERIT, 0, 2, 0, FALSE, 0, complain_overflow_dont,
215 NULL, "R_XTENSA_GNU_VTINHERIT",
216 FALSE, 0x00000000, 0x00000000, FALSE),
217 /* GNU extension to record C++ vtable member usage. */
218 HOWTO (R_XTENSA_GNU_VTENTRY, 0, 2, 0, FALSE, 0, complain_overflow_dont,
219 _bfd_elf_rel_vtable_reloc_fn, "R_XTENSA_GNU_VTENTRY",
220 FALSE, 0x00000000, 0x00000000, FALSE),
222 /* Relocations for supporting difference of symbols. */
223 HOWTO (R_XTENSA_DIFF8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
224 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF8",
225 FALSE, 0xffffffff, 0xffffffff, FALSE),
226 HOWTO (R_XTENSA_DIFF16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
227 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF16",
228 FALSE, 0xffffffff, 0xffffffff, FALSE),
229 HOWTO (R_XTENSA_DIFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
230 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF32",
231 FALSE, 0xffffffff, 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",
236 FALSE, 0x00000000, 0x00000000, TRUE),
237 HOWTO (R_XTENSA_SLOT1_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
238 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_OP",
239 FALSE, 0x00000000, 0x00000000, TRUE),
240 HOWTO (R_XTENSA_SLOT2_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
241 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_OP",
242 FALSE, 0x00000000, 0x00000000, TRUE),
243 HOWTO (R_XTENSA_SLOT3_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
244 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_OP",
245 FALSE, 0x00000000, 0x00000000, TRUE),
246 HOWTO (R_XTENSA_SLOT4_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
247 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_OP",
248 FALSE, 0x00000000, 0x00000000, TRUE),
249 HOWTO (R_XTENSA_SLOT5_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
250 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_OP",
251 FALSE, 0x00000000, 0x00000000, TRUE),
252 HOWTO (R_XTENSA_SLOT6_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
253 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_OP",
254 FALSE, 0x00000000, 0x00000000, TRUE),
255 HOWTO (R_XTENSA_SLOT7_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
256 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_OP",
257 FALSE, 0x00000000, 0x00000000, TRUE),
258 HOWTO (R_XTENSA_SLOT8_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
259 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_OP",
260 FALSE, 0x00000000, 0x00000000, TRUE),
261 HOWTO (R_XTENSA_SLOT9_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
262 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_OP",
263 FALSE, 0x00000000, 0x00000000, TRUE),
264 HOWTO (R_XTENSA_SLOT10_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
265 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_OP",
266 FALSE, 0x00000000, 0x00000000, TRUE),
267 HOWTO (R_XTENSA_SLOT11_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
268 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_OP",
269 FALSE, 0x00000000, 0x00000000, TRUE),
270 HOWTO (R_XTENSA_SLOT12_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
271 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_OP",
272 FALSE, 0x00000000, 0x00000000, TRUE),
273 HOWTO (R_XTENSA_SLOT13_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
274 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_OP",
275 FALSE, 0x00000000, 0x00000000, TRUE),
276 HOWTO (R_XTENSA_SLOT14_OP, 0, 0, 0, TRUE, 0, complain_overflow_dont,
277 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_OP",
278 FALSE, 0x00000000, 0x00000000, TRUE),
280 /* "Alternate" relocations. The meaning of these is opcode-specific. */
281 HOWTO (R_XTENSA_SLOT0_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
282 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_ALT",
283 FALSE, 0x00000000, 0x00000000, TRUE),
284 HOWTO (R_XTENSA_SLOT1_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
285 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_ALT",
286 FALSE, 0x00000000, 0x00000000, TRUE),
287 HOWTO (R_XTENSA_SLOT2_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
288 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_ALT",
289 FALSE, 0x00000000, 0x00000000, TRUE),
290 HOWTO (R_XTENSA_SLOT3_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
291 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_ALT",
292 FALSE, 0x00000000, 0x00000000, TRUE),
293 HOWTO (R_XTENSA_SLOT4_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
294 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_ALT",
295 FALSE, 0x00000000, 0x00000000, TRUE),
296 HOWTO (R_XTENSA_SLOT5_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
297 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_ALT",
298 FALSE, 0x00000000, 0x00000000, TRUE),
299 HOWTO (R_XTENSA_SLOT6_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
300 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_ALT",
301 FALSE, 0x00000000, 0x00000000, TRUE),
302 HOWTO (R_XTENSA_SLOT7_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
303 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_ALT",
304 FALSE, 0x00000000, 0x00000000, TRUE),
305 HOWTO (R_XTENSA_SLOT8_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
306 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_ALT",
307 FALSE, 0x00000000, 0x00000000, TRUE),
308 HOWTO (R_XTENSA_SLOT9_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
309 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_ALT",
310 FALSE, 0x00000000, 0x00000000, TRUE),
311 HOWTO (R_XTENSA_SLOT10_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
312 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_ALT",
313 FALSE, 0x00000000, 0x00000000, TRUE),
314 HOWTO (R_XTENSA_SLOT11_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
315 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_ALT",
316 FALSE, 0x00000000, 0x00000000, TRUE),
317 HOWTO (R_XTENSA_SLOT12_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
318 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_ALT",
319 FALSE, 0x00000000, 0x00000000, TRUE),
320 HOWTO (R_XTENSA_SLOT13_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
321 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_ALT",
322 FALSE, 0x00000000, 0x00000000, TRUE),
323 HOWTO (R_XTENSA_SLOT14_ALT, 0, 0, 0, TRUE, 0, complain_overflow_dont,
324 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_ALT",
325 FALSE, 0x00000000, 0x00000000, TRUE)
330 fprintf (stderr, "Xtensa bfd reloc lookup %d (%s)\n", code, str)
335 static reloc_howto_type *
336 elf_xtensa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
337 bfd_reloc_code_real_type code)
342 TRACE ("BFD_RELOC_NONE");
343 return &elf_howto_table[(unsigned) R_XTENSA_NONE ];
346 TRACE ("BFD_RELOC_32");
347 return &elf_howto_table[(unsigned) R_XTENSA_32 ];
349 case BFD_RELOC_XTENSA_DIFF8:
350 TRACE ("BFD_RELOC_XTENSA_DIFF8");
351 return &elf_howto_table[(unsigned) R_XTENSA_DIFF8 ];
353 case BFD_RELOC_XTENSA_DIFF16:
354 TRACE ("BFD_RELOC_XTENSA_DIFF16");
355 return &elf_howto_table[(unsigned) R_XTENSA_DIFF16 ];
357 case BFD_RELOC_XTENSA_DIFF32:
358 TRACE ("BFD_RELOC_XTENSA_DIFF32");
359 return &elf_howto_table[(unsigned) R_XTENSA_DIFF32 ];
361 case BFD_RELOC_XTENSA_RTLD:
362 TRACE ("BFD_RELOC_XTENSA_RTLD");
363 return &elf_howto_table[(unsigned) R_XTENSA_RTLD ];
365 case BFD_RELOC_XTENSA_GLOB_DAT:
366 TRACE ("BFD_RELOC_XTENSA_GLOB_DAT");
367 return &elf_howto_table[(unsigned) R_XTENSA_GLOB_DAT ];
369 case BFD_RELOC_XTENSA_JMP_SLOT:
370 TRACE ("BFD_RELOC_XTENSA_JMP_SLOT");
371 return &elf_howto_table[(unsigned) R_XTENSA_JMP_SLOT ];
373 case BFD_RELOC_XTENSA_RELATIVE:
374 TRACE ("BFD_RELOC_XTENSA_RELATIVE");
375 return &elf_howto_table[(unsigned) R_XTENSA_RELATIVE ];
377 case BFD_RELOC_XTENSA_PLT:
378 TRACE ("BFD_RELOC_XTENSA_PLT");
379 return &elf_howto_table[(unsigned) R_XTENSA_PLT ];
381 case BFD_RELOC_XTENSA_OP0:
382 TRACE ("BFD_RELOC_XTENSA_OP0");
383 return &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
385 case BFD_RELOC_XTENSA_OP1:
386 TRACE ("BFD_RELOC_XTENSA_OP1");
387 return &elf_howto_table[(unsigned) R_XTENSA_OP1 ];
389 case BFD_RELOC_XTENSA_OP2:
390 TRACE ("BFD_RELOC_XTENSA_OP2");
391 return &elf_howto_table[(unsigned) R_XTENSA_OP2 ];
393 case BFD_RELOC_XTENSA_ASM_EXPAND:
394 TRACE ("BFD_RELOC_XTENSA_ASM_EXPAND");
395 return &elf_howto_table[(unsigned) R_XTENSA_ASM_EXPAND ];
397 case BFD_RELOC_XTENSA_ASM_SIMPLIFY:
398 TRACE ("BFD_RELOC_XTENSA_ASM_SIMPLIFY");
399 return &elf_howto_table[(unsigned) R_XTENSA_ASM_SIMPLIFY ];
401 case BFD_RELOC_VTABLE_INHERIT:
402 TRACE ("BFD_RELOC_VTABLE_INHERIT");
403 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTINHERIT ];
405 case BFD_RELOC_VTABLE_ENTRY:
406 TRACE ("BFD_RELOC_VTABLE_ENTRY");
407 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTENTRY ];
410 if (code >= BFD_RELOC_XTENSA_SLOT0_OP
411 && code <= BFD_RELOC_XTENSA_SLOT14_OP)
413 unsigned n = (R_XTENSA_SLOT0_OP +
414 (code - BFD_RELOC_XTENSA_SLOT0_OP));
415 return &elf_howto_table[n];
418 if (code >= BFD_RELOC_XTENSA_SLOT0_ALT
419 && code <= BFD_RELOC_XTENSA_SLOT14_ALT)
421 unsigned n = (R_XTENSA_SLOT0_ALT +
422 (code - BFD_RELOC_XTENSA_SLOT0_ALT));
423 return &elf_howto_table[n];
434 /* Given an ELF "rela" relocation, find the corresponding howto and record
435 it in the BFD internal arelent representation of the relocation. */
438 elf_xtensa_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
440 Elf_Internal_Rela *dst)
442 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
444 BFD_ASSERT (r_type < (unsigned int) R_XTENSA_max);
445 cache_ptr->howto = &elf_howto_table[r_type];
449 /* Functions for the Xtensa ELF linker. */
451 /* The name of the dynamic interpreter. This is put in the .interp
454 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
456 /* The size in bytes of an entry in the procedure linkage table.
457 (This does _not_ include the space for the literals associated with
460 #define PLT_ENTRY_SIZE 16
462 /* For _really_ large PLTs, we may need to alternate between literals
463 and code to keep the literals within the 256K range of the L32R
464 instructions in the code. It's unlikely that anyone would ever need
465 such a big PLT, but an arbitrary limit on the PLT size would be bad.
466 Thus, we split the PLT into chunks. Since there's very little
467 overhead (2 extra literals) for each chunk, the chunk size is kept
468 small so that the code for handling multiple chunks get used and
469 tested regularly. With 254 entries, there are 1K of literals for
470 each chunk, and that seems like a nice round number. */
472 #define PLT_ENTRIES_PER_CHUNK 254
474 /* PLT entries are actually used as stub functions for lazy symbol
475 resolution. Once the symbol is resolved, the stub function is never
476 invoked. Note: the 32-byte frame size used here cannot be changed
477 without a corresponding change in the runtime linker. */
479 static const bfd_byte elf_xtensa_be_plt_entry[PLT_ENTRY_SIZE] =
481 0x6c, 0x10, 0x04, /* entry sp, 32 */
482 0x18, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
483 0x1a, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
484 0x1b, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
485 0x0a, 0x80, 0x00, /* jx a8 */
489 static const bfd_byte elf_xtensa_le_plt_entry[PLT_ENTRY_SIZE] =
491 0x36, 0x41, 0x00, /* entry sp, 32 */
492 0x81, 0x00, 0x00, /* l32r a8, [got entry for rtld's resolver] */
493 0xa1, 0x00, 0x00, /* l32r a10, [got entry for rtld's link map] */
494 0xb1, 0x00, 0x00, /* l32r a11, [literal for reloc index] */
495 0xa0, 0x08, 0x00, /* jx a8 */
500 static inline bfd_boolean
501 xtensa_elf_dynamic_symbol_p (struct elf_link_hash_entry *h,
502 struct bfd_link_info *info)
504 /* Check if we should do dynamic things to this symbol. The
505 "ignore_protected" argument need not be set, because Xtensa code
506 does not require special handling of STV_PROTECTED to make function
507 pointer comparisons work properly. The PLT addresses are never
508 used for function pointers. */
510 return _bfd_elf_dynamic_symbol_p (h, info, 0);
515 property_table_compare (const void *ap, const void *bp)
517 const property_table_entry *a = (const property_table_entry *) ap;
518 const property_table_entry *b = (const property_table_entry *) bp;
520 if (a->address == b->address)
522 if (a->size != b->size)
523 return (a->size - b->size);
525 if ((a->flags & XTENSA_PROP_ALIGN) != (b->flags & XTENSA_PROP_ALIGN))
526 return ((b->flags & XTENSA_PROP_ALIGN)
527 - (a->flags & XTENSA_PROP_ALIGN));
529 if ((a->flags & XTENSA_PROP_ALIGN)
530 && (GET_XTENSA_PROP_ALIGNMENT (a->flags)
531 != GET_XTENSA_PROP_ALIGNMENT (b->flags)))
532 return (GET_XTENSA_PROP_ALIGNMENT (a->flags)
533 - GET_XTENSA_PROP_ALIGNMENT (b->flags));
535 if ((a->flags & XTENSA_PROP_UNREACHABLE)
536 != (b->flags & XTENSA_PROP_UNREACHABLE))
537 return ((b->flags & XTENSA_PROP_UNREACHABLE)
538 - (a->flags & XTENSA_PROP_UNREACHABLE));
540 return (a->flags - b->flags);
543 return (a->address - b->address);
548 property_table_matches (const void *ap, const void *bp)
550 const property_table_entry *a = (const property_table_entry *) ap;
551 const property_table_entry *b = (const property_table_entry *) bp;
553 /* Check if one entry overlaps with the other. */
554 if ((b->address >= a->address && b->address < (a->address + a->size))
555 || (a->address >= b->address && a->address < (b->address + b->size)))
558 return (a->address - b->address);
562 /* Get the literal table or property table entries for the given
563 section. Sets TABLE_P and returns the number of entries. On
564 error, returns a negative value. */
567 xtensa_read_table_entries (bfd *abfd,
569 property_table_entry **table_p,
570 const char *sec_name,
571 bfd_boolean output_addr)
573 asection *table_section;
574 bfd_size_type table_size = 0;
575 bfd_byte *table_data;
576 property_table_entry *blocks;
577 int blk, block_count;
578 bfd_size_type num_records;
579 Elf_Internal_Rela *internal_relocs;
580 bfd_vma section_addr;
581 flagword predef_flags;
582 bfd_size_type table_entry_size;
585 || !(section->flags & SEC_ALLOC)
586 || (section->flags & SEC_DEBUGGING))
592 table_section = xtensa_get_property_section (section, sec_name);
594 table_size = table_section->size;
602 predef_flags = xtensa_get_property_predef_flags (table_section);
603 table_entry_size = 12;
605 table_entry_size -= 4;
607 num_records = table_size / table_entry_size;
608 table_data = retrieve_contents (abfd, table_section, TRUE);
609 blocks = (property_table_entry *)
610 bfd_malloc (num_records * sizeof (property_table_entry));
614 section_addr = section->output_section->vma + section->output_offset;
616 section_addr = section->vma;
618 /* If the file has not yet been relocated, process the relocations
619 and sort out the table entries that apply to the specified section. */
620 internal_relocs = retrieve_internal_relocs (abfd, table_section, TRUE);
621 if (internal_relocs && !table_section->reloc_done)
625 for (i = 0; i < table_section->reloc_count; i++)
627 Elf_Internal_Rela *rel = &internal_relocs[i];
628 unsigned long r_symndx;
630 if (ELF32_R_TYPE (rel->r_info) == R_XTENSA_NONE)
633 BFD_ASSERT (ELF32_R_TYPE (rel->r_info) == R_XTENSA_32);
634 r_symndx = ELF32_R_SYM (rel->r_info);
636 if (get_elf_r_symndx_section (abfd, r_symndx) == section)
638 bfd_vma sym_off = get_elf_r_symndx_offset (abfd, r_symndx);
639 BFD_ASSERT (sym_off == 0);
640 blocks[block_count].address =
641 (section_addr + sym_off + rel->r_addend
642 + bfd_get_32 (abfd, table_data + rel->r_offset));
643 blocks[block_count].size =
644 bfd_get_32 (abfd, table_data + rel->r_offset + 4);
646 blocks[block_count].flags = predef_flags;
648 blocks[block_count].flags =
649 bfd_get_32 (abfd, table_data + rel->r_offset + 8);
656 /* The file has already been relocated and the addresses are
657 already in the table. */
659 bfd_size_type section_limit = bfd_get_section_limit (abfd, section);
661 for (off = 0; off < table_size; off += table_entry_size)
663 bfd_vma address = bfd_get_32 (abfd, table_data + off);
665 if (address >= section_addr
666 && address < section_addr + section_limit)
668 blocks[block_count].address = address;
669 blocks[block_count].size =
670 bfd_get_32 (abfd, table_data + off + 4);
672 blocks[block_count].flags = predef_flags;
674 blocks[block_count].flags =
675 bfd_get_32 (abfd, table_data + off + 8);
681 release_contents (table_section, table_data);
682 release_internal_relocs (table_section, internal_relocs);
686 /* Now sort them into address order for easy reference. */
687 qsort (blocks, block_count, sizeof (property_table_entry),
688 property_table_compare);
690 /* Check that the table contents are valid. Problems may occur,
691 for example, if an unrelocated object file is stripped. */
692 for (blk = 1; blk < block_count; blk++)
694 /* The only circumstance where two entries may legitimately
695 have the same address is when one of them is a zero-size
696 placeholder to mark a place where fill can be inserted.
697 The zero-size entry should come first. */
698 if (blocks[blk - 1].address == blocks[blk].address &&
699 blocks[blk - 1].size != 0)
701 (*_bfd_error_handler) (_("%B(%A): invalid property table"),
703 bfd_set_error (bfd_error_bad_value);
715 static property_table_entry *
716 elf_xtensa_find_property_entry (property_table_entry *property_table,
717 int property_table_size,
720 property_table_entry entry;
721 property_table_entry *rv;
723 if (property_table_size == 0)
726 entry.address = addr;
730 rv = bsearch (&entry, property_table, property_table_size,
731 sizeof (property_table_entry), property_table_matches);
737 elf_xtensa_in_literal_pool (property_table_entry *lit_table,
741 if (elf_xtensa_find_property_entry (lit_table, lit_table_size, addr))
748 /* Look through the relocs for a section during the first phase, and
749 calculate needed space in the dynamic reloc sections. */
752 elf_xtensa_check_relocs (bfd *abfd,
753 struct bfd_link_info *info,
755 const Elf_Internal_Rela *relocs)
757 Elf_Internal_Shdr *symtab_hdr;
758 struct elf_link_hash_entry **sym_hashes;
759 const Elf_Internal_Rela *rel;
760 const Elf_Internal_Rela *rel_end;
762 if (info->relocatable)
765 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
766 sym_hashes = elf_sym_hashes (abfd);
768 rel_end = relocs + sec->reloc_count;
769 for (rel = relocs; rel < rel_end; rel++)
772 unsigned long r_symndx;
773 struct elf_link_hash_entry *h;
775 r_symndx = ELF32_R_SYM (rel->r_info);
776 r_type = ELF32_R_TYPE (rel->r_info);
778 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
780 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
785 if (r_symndx < symtab_hdr->sh_info)
789 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
790 while (h->root.type == bfd_link_hash_indirect
791 || h->root.type == bfd_link_hash_warning)
792 h = (struct elf_link_hash_entry *) h->root.u.i.link;
801 if ((sec->flags & SEC_ALLOC) != 0)
803 if (h->got.refcount <= 0)
806 h->got.refcount += 1;
811 /* If this relocation is against a local symbol, then it's
812 exactly the same as a normal local GOT entry. */
816 if ((sec->flags & SEC_ALLOC) != 0)
818 if (h->plt.refcount <= 0)
824 h->plt.refcount += 1;
826 /* Keep track of the total PLT relocation count even if we
827 don't yet know whether the dynamic sections will be
829 plt_reloc_count += 1;
831 if (elf_hash_table (info)->dynamic_sections_created)
833 if (!add_extra_plt_sections (elf_hash_table (info)->dynobj,
841 if ((sec->flags & SEC_ALLOC) != 0)
843 bfd_signed_vma *local_got_refcounts;
845 /* This is a global offset table entry for a local symbol. */
846 local_got_refcounts = elf_local_got_refcounts (abfd);
847 if (local_got_refcounts == NULL)
851 size = symtab_hdr->sh_info;
852 size *= sizeof (bfd_signed_vma);
853 local_got_refcounts =
854 (bfd_signed_vma *) bfd_zalloc (abfd, size);
855 if (local_got_refcounts == NULL)
857 elf_local_got_refcounts (abfd) = local_got_refcounts;
859 local_got_refcounts[r_symndx] += 1;
866 case R_XTENSA_SLOT0_OP:
867 case R_XTENSA_SLOT1_OP:
868 case R_XTENSA_SLOT2_OP:
869 case R_XTENSA_SLOT3_OP:
870 case R_XTENSA_SLOT4_OP:
871 case R_XTENSA_SLOT5_OP:
872 case R_XTENSA_SLOT6_OP:
873 case R_XTENSA_SLOT7_OP:
874 case R_XTENSA_SLOT8_OP:
875 case R_XTENSA_SLOT9_OP:
876 case R_XTENSA_SLOT10_OP:
877 case R_XTENSA_SLOT11_OP:
878 case R_XTENSA_SLOT12_OP:
879 case R_XTENSA_SLOT13_OP:
880 case R_XTENSA_SLOT14_OP:
881 case R_XTENSA_SLOT0_ALT:
882 case R_XTENSA_SLOT1_ALT:
883 case R_XTENSA_SLOT2_ALT:
884 case R_XTENSA_SLOT3_ALT:
885 case R_XTENSA_SLOT4_ALT:
886 case R_XTENSA_SLOT5_ALT:
887 case R_XTENSA_SLOT6_ALT:
888 case R_XTENSA_SLOT7_ALT:
889 case R_XTENSA_SLOT8_ALT:
890 case R_XTENSA_SLOT9_ALT:
891 case R_XTENSA_SLOT10_ALT:
892 case R_XTENSA_SLOT11_ALT:
893 case R_XTENSA_SLOT12_ALT:
894 case R_XTENSA_SLOT13_ALT:
895 case R_XTENSA_SLOT14_ALT:
896 case R_XTENSA_ASM_EXPAND:
897 case R_XTENSA_ASM_SIMPLIFY:
899 case R_XTENSA_DIFF16:
900 case R_XTENSA_DIFF32:
901 /* Nothing to do for these. */
904 case R_XTENSA_GNU_VTINHERIT:
905 /* This relocation describes the C++ object vtable hierarchy.
906 Reconstruct it for later use during GC. */
907 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
911 case R_XTENSA_GNU_VTENTRY:
912 /* This relocation describes which C++ vtable entries are actually
913 used. Record for later use during GC. */
914 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
928 elf_xtensa_make_sym_local (struct bfd_link_info *info,
929 struct elf_link_hash_entry *h)
933 if (h->plt.refcount > 0)
935 /* Will use RELATIVE relocs instead of JMP_SLOT relocs. */
936 if (h->got.refcount < 0)
938 h->got.refcount += h->plt.refcount;
944 /* Don't need any dynamic relocations at all. */
952 elf_xtensa_hide_symbol (struct bfd_link_info *info,
953 struct elf_link_hash_entry *h,
954 bfd_boolean force_local)
956 /* For a shared link, move the plt refcount to the got refcount to leave
957 space for RELATIVE relocs. */
958 elf_xtensa_make_sym_local (info, h);
960 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
964 /* Return the section that should be marked against GC for a given
968 elf_xtensa_gc_mark_hook (asection *sec,
969 struct bfd_link_info *info,
970 Elf_Internal_Rela *rel,
971 struct elf_link_hash_entry *h,
972 Elf_Internal_Sym *sym)
975 switch (ELF32_R_TYPE (rel->r_info))
977 case R_XTENSA_GNU_VTINHERIT:
978 case R_XTENSA_GNU_VTENTRY:
982 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
986 /* Update the GOT & PLT entry reference counts
987 for the section being removed. */
990 elf_xtensa_gc_sweep_hook (bfd *abfd,
991 struct bfd_link_info *info ATTRIBUTE_UNUSED,
993 const Elf_Internal_Rela *relocs)
995 Elf_Internal_Shdr *symtab_hdr;
996 struct elf_link_hash_entry **sym_hashes;
997 bfd_signed_vma *local_got_refcounts;
998 const Elf_Internal_Rela *rel, *relend;
1000 if ((sec->flags & SEC_ALLOC) == 0)
1003 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1004 sym_hashes = elf_sym_hashes (abfd);
1005 local_got_refcounts = elf_local_got_refcounts (abfd);
1007 relend = relocs + sec->reloc_count;
1008 for (rel = relocs; rel < relend; rel++)
1010 unsigned long r_symndx;
1011 unsigned int r_type;
1012 struct elf_link_hash_entry *h = NULL;
1014 r_symndx = ELF32_R_SYM (rel->r_info);
1015 if (r_symndx >= symtab_hdr->sh_info)
1017 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1018 while (h->root.type == bfd_link_hash_indirect
1019 || h->root.type == bfd_link_hash_warning)
1020 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1023 r_type = ELF32_R_TYPE (rel->r_info);
1029 if (h->got.refcount > 0)
1036 if (h->plt.refcount > 0)
1041 if (local_got_refcounts[r_symndx] > 0)
1042 local_got_refcounts[r_symndx] -= 1;
1054 /* Create all the dynamic sections. */
1057 elf_xtensa_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1059 flagword flags, noalloc_flags;
1062 /* First do all the standard stuff. */
1063 if (! _bfd_elf_create_dynamic_sections (dynobj, info))
1066 /* Create any extra PLT sections in case check_relocs has already
1067 been called on all the non-dynamic input files. */
1068 if (!add_extra_plt_sections (dynobj, plt_reloc_count))
1071 noalloc_flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
1072 | SEC_LINKER_CREATED | SEC_READONLY);
1073 flags = noalloc_flags | SEC_ALLOC | SEC_LOAD;
1075 /* Mark the ".got.plt" section READONLY. */
1076 s = bfd_get_section_by_name (dynobj, ".got.plt");
1078 || ! bfd_set_section_flags (dynobj, s, flags))
1081 /* Create ".rela.got". */
1082 s = bfd_make_section_with_flags (dynobj, ".rela.got", flags);
1084 || ! bfd_set_section_alignment (dynobj, s, 2))
1087 /* Create ".got.loc" (literal tables for use by dynamic linker). */
1088 s = bfd_make_section_with_flags (dynobj, ".got.loc", flags);
1090 || ! bfd_set_section_alignment (dynobj, s, 2))
1093 /* Create ".xt.lit.plt" (literal table for ".got.plt*"). */
1094 s = bfd_make_section_with_flags (dynobj, ".xt.lit.plt",
1097 || ! bfd_set_section_alignment (dynobj, s, 2))
1105 add_extra_plt_sections (bfd *dynobj, int count)
1109 /* Iterate over all chunks except 0 which uses the standard ".plt" and
1110 ".got.plt" sections. */
1111 for (chunk = count / PLT_ENTRIES_PER_CHUNK; chunk > 0; chunk--)
1117 /* Stop when we find a section has already been created. */
1118 if (elf_xtensa_get_plt_section (dynobj, chunk))
1121 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1122 | SEC_LINKER_CREATED | SEC_READONLY);
1124 sname = (char *) bfd_malloc (10);
1125 sprintf (sname, ".plt.%u", chunk);
1126 s = bfd_make_section_with_flags (dynobj, sname, flags | SEC_CODE);
1128 || ! bfd_set_section_alignment (dynobj, s, 2))
1131 sname = (char *) bfd_malloc (14);
1132 sprintf (sname, ".got.plt.%u", chunk);
1133 s = bfd_make_section_with_flags (dynobj, sname, flags);
1135 || ! bfd_set_section_alignment (dynobj, s, 2))
1143 /* Adjust a symbol defined by a dynamic object and referenced by a
1144 regular object. The current definition is in some section of the
1145 dynamic object, but we're not including those sections. We have to
1146 change the definition to something the rest of the link can
1150 elf_xtensa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1151 struct elf_link_hash_entry *h)
1153 /* If this is a weak symbol, and there is a real definition, the
1154 processor independent code will have arranged for us to see the
1155 real definition first, and we can just use the same value. */
1158 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1159 || h->u.weakdef->root.type == bfd_link_hash_defweak);
1160 h->root.u.def.section = h->u.weakdef->root.u.def.section;
1161 h->root.u.def.value = h->u.weakdef->root.u.def.value;
1165 /* This is a reference to a symbol defined by a dynamic object. The
1166 reference must go through the GOT, so there's no need for COPY relocs,
1174 elf_xtensa_fix_refcounts (struct elf_link_hash_entry *h, void *arg)
1176 struct bfd_link_info *info = (struct bfd_link_info *) arg;
1178 if (h->root.type == bfd_link_hash_warning)
1179 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1181 if (! xtensa_elf_dynamic_symbol_p (h, info))
1182 elf_xtensa_make_sym_local (info, h);
1189 elf_xtensa_allocate_plt_size (struct elf_link_hash_entry *h, void *arg)
1191 asection *srelplt = (asection *) arg;
1193 if (h->root.type == bfd_link_hash_warning)
1194 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1196 if (h->plt.refcount > 0)
1197 srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
1204 elf_xtensa_allocate_got_size (struct elf_link_hash_entry *h, void *arg)
1206 asection *srelgot = (asection *) arg;
1208 if (h->root.type == bfd_link_hash_warning)
1209 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1211 if (h->got.refcount > 0)
1212 srelgot->size += (h->got.refcount * sizeof (Elf32_External_Rela));
1219 elf_xtensa_allocate_local_got_size (struct bfd_link_info *info,
1224 for (i = info->input_bfds; i; i = i->link_next)
1226 bfd_signed_vma *local_got_refcounts;
1227 bfd_size_type j, cnt;
1228 Elf_Internal_Shdr *symtab_hdr;
1230 local_got_refcounts = elf_local_got_refcounts (i);
1231 if (!local_got_refcounts)
1234 symtab_hdr = &elf_tdata (i)->symtab_hdr;
1235 cnt = symtab_hdr->sh_info;
1237 for (j = 0; j < cnt; ++j)
1239 if (local_got_refcounts[j] > 0)
1240 srelgot->size += (local_got_refcounts[j]
1241 * sizeof (Elf32_External_Rela));
1247 /* Set the sizes of the dynamic sections. */
1250 elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1251 struct bfd_link_info *info)
1254 asection *s, *srelplt, *splt, *sgotplt, *srelgot, *spltlittbl, *sgotloc;
1255 bfd_boolean relplt, relgot;
1256 int plt_entries, plt_chunks, chunk;
1262 dynobj = elf_hash_table (info)->dynobj;
1266 if (elf_hash_table (info)->dynamic_sections_created)
1268 /* Set the contents of the .interp section to the interpreter. */
1269 if (info->executable)
1271 s = bfd_get_section_by_name (dynobj, ".interp");
1274 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1275 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1278 /* Allocate room for one word in ".got". */
1279 s = bfd_get_section_by_name (dynobj, ".got");
1284 /* Adjust refcounts for symbols that we now know are not "dynamic". */
1285 elf_link_hash_traverse (elf_hash_table (info),
1286 elf_xtensa_fix_refcounts,
1289 /* Allocate space in ".rela.got" for literals that reference
1291 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1292 if (srelgot == NULL)
1294 elf_link_hash_traverse (elf_hash_table (info),
1295 elf_xtensa_allocate_got_size,
1298 /* If we are generating a shared object, we also need space in
1299 ".rela.got" for R_XTENSA_RELATIVE relocs for literals that
1300 reference local symbols. */
1302 elf_xtensa_allocate_local_got_size (info, srelgot);
1304 /* Allocate space in ".rela.plt" for literals that have PLT entries. */
1305 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
1306 if (srelplt == NULL)
1308 elf_link_hash_traverse (elf_hash_table (info),
1309 elf_xtensa_allocate_plt_size,
1312 /* Allocate space in ".plt" to match the size of ".rela.plt". For
1313 each PLT entry, we need the PLT code plus a 4-byte literal.
1314 For each chunk of ".plt", we also need two more 4-byte
1315 literals, two corresponding entries in ".rela.got", and an
1316 8-byte entry in ".xt.lit.plt". */
1317 spltlittbl = bfd_get_section_by_name (dynobj, ".xt.lit.plt");
1318 if (spltlittbl == NULL)
1321 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
1323 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
1325 /* Iterate over all the PLT chunks, including any extra sections
1326 created earlier because the initial count of PLT relocations
1327 was an overestimate. */
1329 (splt = elf_xtensa_get_plt_section (dynobj, chunk)) != NULL;
1334 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
1335 if (sgotplt == NULL)
1338 if (chunk < plt_chunks - 1)
1339 chunk_entries = PLT_ENTRIES_PER_CHUNK;
1340 else if (chunk == plt_chunks - 1)
1341 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
1345 if (chunk_entries != 0)
1347 sgotplt->size = 4 * (chunk_entries + 2);
1348 splt->size = PLT_ENTRY_SIZE * chunk_entries;
1349 srelgot->size += 2 * sizeof (Elf32_External_Rela);
1350 spltlittbl->size += 8;
1359 /* Allocate space in ".got.loc" to match the total size of all the
1361 sgotloc = bfd_get_section_by_name (dynobj, ".got.loc");
1362 if (sgotloc == NULL)
1364 sgotloc->size = spltlittbl->size;
1365 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1367 if (abfd->flags & DYNAMIC)
1369 for (s = abfd->sections; s != NULL; s = s->next)
1371 if (! elf_discarded_section (s)
1372 && xtensa_is_littable_section (s)
1374 sgotloc->size += s->size;
1379 /* Allocate memory for dynamic sections. */
1382 for (s = dynobj->sections; s != NULL; s = s->next)
1386 if ((s->flags & SEC_LINKER_CREATED) == 0)
1389 /* It's OK to base decisions on the section name, because none
1390 of the dynobj section names depend upon the input files. */
1391 name = bfd_get_section_name (dynobj, s);
1393 if (CONST_STRNEQ (name, ".rela"))
1397 if (strcmp (name, ".rela.plt") == 0)
1399 else if (strcmp (name, ".rela.got") == 0)
1402 /* We use the reloc_count field as a counter if we need
1403 to copy relocs into the output file. */
1407 else if (! CONST_STRNEQ (name, ".plt.")
1408 && ! CONST_STRNEQ (name, ".got.plt.")
1409 && strcmp (name, ".got") != 0
1410 && strcmp (name, ".plt") != 0
1411 && strcmp (name, ".got.plt") != 0
1412 && strcmp (name, ".xt.lit.plt") != 0
1413 && strcmp (name, ".got.loc") != 0)
1415 /* It's not one of our sections, so don't allocate space. */
1421 /* If we don't need this section, strip it from the output
1422 file. We must create the ".plt*" and ".got.plt*"
1423 sections in create_dynamic_sections and/or check_relocs
1424 based on a conservative estimate of the PLT relocation
1425 count, because the sections must be created before the
1426 linker maps input sections to output sections. The
1427 linker does that before size_dynamic_sections, where we
1428 compute the exact size of the PLT, so there may be more
1429 of these sections than are actually needed. */
1430 s->flags |= SEC_EXCLUDE;
1432 else if ((s->flags & SEC_HAS_CONTENTS) != 0)
1434 /* Allocate memory for the section contents. */
1435 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1436 if (s->contents == NULL)
1441 if (elf_hash_table (info)->dynamic_sections_created)
1443 /* Add the special XTENSA_RTLD relocations now. The offsets won't be
1444 known until finish_dynamic_sections, but we need to get the relocs
1445 in place before they are sorted. */
1446 if (srelgot == NULL)
1448 for (chunk = 0; chunk < plt_chunks; chunk++)
1450 Elf_Internal_Rela irela;
1454 irela.r_info = ELF32_R_INFO (0, R_XTENSA_RTLD);
1457 loc = (srelgot->contents
1458 + srelgot->reloc_count * sizeof (Elf32_External_Rela));
1459 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
1460 bfd_elf32_swap_reloca_out (output_bfd, &irela,
1461 loc + sizeof (Elf32_External_Rela));
1462 srelgot->reloc_count += 2;
1465 /* Add some entries to the .dynamic section. We fill in the
1466 values later, in elf_xtensa_finish_dynamic_sections, but we
1467 must add the entries now so that we get the correct size for
1468 the .dynamic section. The DT_DEBUG entry is filled in by the
1469 dynamic linker and used by the debugger. */
1470 #define add_dynamic_entry(TAG, VAL) \
1471 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1473 if (info->executable)
1475 if (!add_dynamic_entry (DT_DEBUG, 0))
1481 if (!add_dynamic_entry (DT_PLTGOT, 0)
1482 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1483 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1484 || !add_dynamic_entry (DT_JMPREL, 0))
1490 if (!add_dynamic_entry (DT_RELA, 0)
1491 || !add_dynamic_entry (DT_RELASZ, 0)
1492 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
1496 if (!add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0)
1497 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0))
1500 #undef add_dynamic_entry
1506 /* Perform the specified relocation. The instruction at (contents + address)
1507 is modified to set one operand to represent the value in "relocation". The
1508 operand position is determined by the relocation type recorded in the
1511 #define CALL_SEGMENT_BITS (30)
1512 #define CALL_SEGMENT_SIZE (1 << CALL_SEGMENT_BITS)
1514 static bfd_reloc_status_type
1515 elf_xtensa_do_reloc (reloc_howto_type *howto,
1517 asection *input_section,
1521 bfd_boolean is_weak_undef,
1522 char **error_message)
1525 xtensa_opcode opcode;
1526 xtensa_isa isa = xtensa_default_isa;
1527 static xtensa_insnbuf ibuff = NULL;
1528 static xtensa_insnbuf sbuff = NULL;
1529 bfd_vma self_address = 0;
1530 bfd_size_type input_size;
1536 ibuff = xtensa_insnbuf_alloc (isa);
1537 sbuff = xtensa_insnbuf_alloc (isa);
1540 input_size = bfd_get_section_limit (abfd, input_section);
1542 switch (howto->type)
1545 case R_XTENSA_DIFF8:
1546 case R_XTENSA_DIFF16:
1547 case R_XTENSA_DIFF32:
1548 return bfd_reloc_ok;
1550 case R_XTENSA_ASM_EXPAND:
1553 /* Check for windowed CALL across a 1GB boundary. */
1554 xtensa_opcode opcode =
1555 get_expanded_call_opcode (contents + address,
1556 input_size - address, 0);
1557 if (is_windowed_call_opcode (opcode))
1559 self_address = (input_section->output_section->vma
1560 + input_section->output_offset
1562 if ((self_address >> CALL_SEGMENT_BITS)
1563 != (relocation >> CALL_SEGMENT_BITS))
1565 *error_message = "windowed longcall crosses 1GB boundary; "
1567 return bfd_reloc_dangerous;
1571 return bfd_reloc_ok;
1573 case R_XTENSA_ASM_SIMPLIFY:
1575 /* Convert the L32R/CALLX to CALL. */
1576 bfd_reloc_status_type retval =
1577 elf_xtensa_do_asm_simplify (contents, address, input_size,
1579 if (retval != bfd_reloc_ok)
1580 return bfd_reloc_dangerous;
1582 /* The CALL needs to be relocated. Continue below for that part. */
1584 howto = &elf_howto_table[(unsigned) R_XTENSA_SLOT0_OP ];
1592 x = bfd_get_32 (abfd, contents + address);
1594 bfd_put_32 (abfd, x, contents + address);
1596 return bfd_reloc_ok;
1599 /* Only instruction slot-specific relocations handled below.... */
1600 slot = get_relocation_slot (howto->type);
1601 if (slot == XTENSA_UNDEFINED)
1603 *error_message = "unexpected relocation";
1604 return bfd_reloc_dangerous;
1607 /* Read the instruction into a buffer and decode the opcode. */
1608 xtensa_insnbuf_from_chars (isa, ibuff, contents + address,
1609 input_size - address);
1610 fmt = xtensa_format_decode (isa, ibuff);
1611 if (fmt == XTENSA_UNDEFINED)
1613 *error_message = "cannot decode instruction format";
1614 return bfd_reloc_dangerous;
1617 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
1619 opcode = xtensa_opcode_decode (isa, fmt, slot, sbuff);
1620 if (opcode == XTENSA_UNDEFINED)
1622 *error_message = "cannot decode instruction opcode";
1623 return bfd_reloc_dangerous;
1626 /* Check for opcode-specific "alternate" relocations. */
1627 if (is_alt_relocation (howto->type))
1629 if (opcode == get_l32r_opcode ())
1631 /* Handle the special-case of non-PC-relative L32R instructions. */
1632 bfd *output_bfd = input_section->output_section->owner;
1633 asection *lit4_sec = bfd_get_section_by_name (output_bfd, ".lit4");
1636 *error_message = "relocation references missing .lit4 section";
1637 return bfd_reloc_dangerous;
1639 self_address = ((lit4_sec->vma & ~0xfff)
1640 + 0x40000 - 3); /* -3 to compensate for do_reloc */
1641 newval = relocation;
1644 else if (opcode == get_const16_opcode ())
1646 /* ALT used for high 16 bits. */
1647 newval = relocation >> 16;
1652 /* No other "alternate" relocations currently defined. */
1653 *error_message = "unexpected relocation";
1654 return bfd_reloc_dangerous;
1657 else /* Not an "alternate" relocation.... */
1659 if (opcode == get_const16_opcode ())
1661 newval = relocation & 0xffff;
1666 /* ...normal PC-relative relocation.... */
1668 /* Determine which operand is being relocated. */
1669 opnd = get_relocation_opnd (opcode, howto->type);
1670 if (opnd == XTENSA_UNDEFINED)
1672 *error_message = "unexpected relocation";
1673 return bfd_reloc_dangerous;
1676 if (!howto->pc_relative)
1678 *error_message = "expected PC-relative relocation";
1679 return bfd_reloc_dangerous;
1682 /* Calculate the PC address for this instruction. */
1683 self_address = (input_section->output_section->vma
1684 + input_section->output_offset
1687 newval = relocation;
1691 /* Apply the relocation. */
1692 if (xtensa_operand_do_reloc (isa, opcode, opnd, &newval, self_address)
1693 || xtensa_operand_encode (isa, opcode, opnd, &newval)
1694 || xtensa_operand_set_field (isa, opcode, opnd, fmt, slot,
1697 const char *opname = xtensa_opcode_name (isa, opcode);
1700 msg = "cannot encode";
1701 if (is_direct_call_opcode (opcode))
1703 if ((relocation & 0x3) != 0)
1704 msg = "misaligned call target";
1706 msg = "call target out of range";
1708 else if (opcode == get_l32r_opcode ())
1710 if ((relocation & 0x3) != 0)
1711 msg = "misaligned literal target";
1712 else if (is_alt_relocation (howto->type))
1713 msg = "literal target out of range (too many literals)";
1714 else if (self_address > relocation)
1715 msg = "literal target out of range (try using text-section-literals)";
1717 msg = "literal placed after use";
1720 *error_message = vsprint_msg (opname, ": %s", strlen (msg) + 2, msg);
1721 return bfd_reloc_dangerous;
1724 /* Check for calls across 1GB boundaries. */
1725 if (is_direct_call_opcode (opcode)
1726 && is_windowed_call_opcode (opcode))
1728 if ((self_address >> CALL_SEGMENT_BITS)
1729 != (relocation >> CALL_SEGMENT_BITS))
1732 "windowed call crosses 1GB boundary; return may fail";
1733 return bfd_reloc_dangerous;
1737 /* Write the modified instruction back out of the buffer. */
1738 xtensa_format_set_slot (isa, fmt, slot, ibuff, sbuff);
1739 xtensa_insnbuf_to_chars (isa, ibuff, contents + address,
1740 input_size - address);
1741 return bfd_reloc_ok;
1746 vsprint_msg (const char *origmsg, const char *fmt, int arglen, ...)
1748 /* To reduce the size of the memory leak,
1749 we only use a single message buffer. */
1750 static bfd_size_type alloc_size = 0;
1751 static char *message = NULL;
1752 bfd_size_type orig_len, len = 0;
1753 bfd_boolean is_append;
1755 VA_OPEN (ap, arglen);
1756 VA_FIXEDARG (ap, const char *, origmsg);
1758 is_append = (origmsg == message);
1760 orig_len = strlen (origmsg);
1761 len = orig_len + strlen (fmt) + arglen + 20;
1762 if (len > alloc_size)
1764 message = (char *) bfd_realloc (message, len);
1768 memcpy (message, origmsg, orig_len);
1769 vsprintf (message + orig_len, fmt, ap);
1775 /* This function is registered as the "special_function" in the
1776 Xtensa howto for handling simplify operations.
1777 bfd_perform_relocation / bfd_install_relocation use it to
1778 perform (install) the specified relocation. Since this replaces the code
1779 in bfd_perform_relocation, it is basically an Xtensa-specific,
1780 stripped-down version of bfd_perform_relocation. */
1782 static bfd_reloc_status_type
1783 bfd_elf_xtensa_reloc (bfd *abfd,
1784 arelent *reloc_entry,
1787 asection *input_section,
1789 char **error_message)
1792 bfd_reloc_status_type flag;
1793 bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
1794 bfd_vma output_base = 0;
1795 reloc_howto_type *howto = reloc_entry->howto;
1796 asection *reloc_target_output_section;
1797 bfd_boolean is_weak_undef;
1799 if (!xtensa_default_isa)
1800 xtensa_default_isa = xtensa_isa_init (0, 0);
1802 /* ELF relocs are against symbols. If we are producing relocatable
1803 output, and the reloc is against an external symbol, the resulting
1804 reloc will also be against the same symbol. In such a case, we
1805 don't want to change anything about the way the reloc is handled,
1806 since it will all be done at final link time. This test is similar
1807 to what bfd_elf_generic_reloc does except that it lets relocs with
1808 howto->partial_inplace go through even if the addend is non-zero.
1809 (The real problem is that partial_inplace is set for XTENSA_32
1810 relocs to begin with, but that's a long story and there's little we
1811 can do about it now....) */
1813 if (output_bfd && (symbol->flags & BSF_SECTION_SYM) == 0)
1815 reloc_entry->address += input_section->output_offset;
1816 return bfd_reloc_ok;
1819 /* Is the address of the relocation really within the section? */
1820 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1821 return bfd_reloc_outofrange;
1823 /* Work out which section the relocation is targeted at and the
1824 initial relocation command value. */
1826 /* Get symbol value. (Common symbols are special.) */
1827 if (bfd_is_com_section (symbol->section))
1830 relocation = symbol->value;
1832 reloc_target_output_section = symbol->section->output_section;
1834 /* Convert input-section-relative symbol value to absolute. */
1835 if ((output_bfd && !howto->partial_inplace)
1836 || reloc_target_output_section == NULL)
1839 output_base = reloc_target_output_section->vma;
1841 relocation += output_base + symbol->section->output_offset;
1843 /* Add in supplied addend. */
1844 relocation += reloc_entry->addend;
1846 /* Here the variable relocation holds the final address of the
1847 symbol we are relocating against, plus any addend. */
1850 if (!howto->partial_inplace)
1852 /* This is a partial relocation, and we want to apply the relocation
1853 to the reloc entry rather than the raw data. Everything except
1854 relocations against section symbols has already been handled
1857 BFD_ASSERT (symbol->flags & BSF_SECTION_SYM);
1858 reloc_entry->addend = relocation;
1859 reloc_entry->address += input_section->output_offset;
1860 return bfd_reloc_ok;
1864 reloc_entry->address += input_section->output_offset;
1865 reloc_entry->addend = 0;
1869 is_weak_undef = (bfd_is_und_section (symbol->section)
1870 && (symbol->flags & BSF_WEAK) != 0);
1871 flag = elf_xtensa_do_reloc (howto, abfd, input_section, relocation,
1872 (bfd_byte *) data, (bfd_vma) octets,
1873 is_weak_undef, error_message);
1875 if (flag == bfd_reloc_dangerous)
1877 /* Add the symbol name to the error message. */
1878 if (! *error_message)
1879 *error_message = "";
1880 *error_message = vsprint_msg (*error_message, ": (%s + 0x%lx)",
1881 strlen (symbol->name) + 17,
1883 (unsigned long) reloc_entry->addend);
1890 /* Set up an entry in the procedure linkage table. */
1893 elf_xtensa_create_plt_entry (bfd *dynobj,
1895 unsigned reloc_index)
1897 asection *splt, *sgotplt;
1898 bfd_vma plt_base, got_base;
1899 bfd_vma code_offset, lit_offset;
1902 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
1903 splt = elf_xtensa_get_plt_section (dynobj, chunk);
1904 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
1905 BFD_ASSERT (splt != NULL && sgotplt != NULL);
1907 plt_base = splt->output_section->vma + splt->output_offset;
1908 got_base = sgotplt->output_section->vma + sgotplt->output_offset;
1910 lit_offset = 8 + (reloc_index % PLT_ENTRIES_PER_CHUNK) * 4;
1911 code_offset = (reloc_index % PLT_ENTRIES_PER_CHUNK) * PLT_ENTRY_SIZE;
1913 /* Fill in the literal entry. This is the offset of the dynamic
1914 relocation entry. */
1915 bfd_put_32 (output_bfd, reloc_index * sizeof (Elf32_External_Rela),
1916 sgotplt->contents + lit_offset);
1918 /* Fill in the entry in the procedure linkage table. */
1919 memcpy (splt->contents + code_offset,
1920 (bfd_big_endian (output_bfd)
1921 ? elf_xtensa_be_plt_entry
1922 : elf_xtensa_le_plt_entry),
1924 bfd_put_16 (output_bfd, l32r_offset (got_base + 0,
1925 plt_base + code_offset + 3),
1926 splt->contents + code_offset + 4);
1927 bfd_put_16 (output_bfd, l32r_offset (got_base + 4,
1928 plt_base + code_offset + 6),
1929 splt->contents + code_offset + 7);
1930 bfd_put_16 (output_bfd, l32r_offset (got_base + lit_offset,
1931 plt_base + code_offset + 9),
1932 splt->contents + code_offset + 10);
1934 return plt_base + code_offset;
1938 /* Relocate an Xtensa ELF section. This is invoked by the linker for
1939 both relocatable and final links. */
1942 elf_xtensa_relocate_section (bfd *output_bfd,
1943 struct bfd_link_info *info,
1945 asection *input_section,
1947 Elf_Internal_Rela *relocs,
1948 Elf_Internal_Sym *local_syms,
1949 asection **local_sections)
1951 Elf_Internal_Shdr *symtab_hdr;
1952 Elf_Internal_Rela *rel;
1953 Elf_Internal_Rela *relend;
1954 struct elf_link_hash_entry **sym_hashes;
1955 asection *srelgot, *srelplt;
1957 property_table_entry *lit_table = 0;
1959 char *error_message = NULL;
1960 bfd_size_type input_size;
1962 if (!xtensa_default_isa)
1963 xtensa_default_isa = xtensa_isa_init (0, 0);
1965 dynobj = elf_hash_table (info)->dynobj;
1966 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1967 sym_hashes = elf_sym_hashes (input_bfd);
1973 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");;
1974 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
1977 if (elf_hash_table (info)->dynamic_sections_created)
1979 ltblsize = xtensa_read_table_entries (input_bfd, input_section,
1980 &lit_table, XTENSA_LIT_SEC_NAME,
1986 input_size = bfd_get_section_limit (input_bfd, input_section);
1989 relend = relocs + input_section->reloc_count;
1990 for (; rel < relend; rel++)
1993 reloc_howto_type *howto;
1994 unsigned long r_symndx;
1995 struct elf_link_hash_entry *h;
1996 Elf_Internal_Sym *sym;
1999 bfd_reloc_status_type r;
2000 bfd_boolean is_weak_undef;
2001 bfd_boolean unresolved_reloc;
2004 r_type = ELF32_R_TYPE (rel->r_info);
2005 if (r_type == (int) R_XTENSA_GNU_VTINHERIT
2006 || r_type == (int) R_XTENSA_GNU_VTENTRY)
2009 if (r_type < 0 || r_type >= (int) R_XTENSA_max)
2011 bfd_set_error (bfd_error_bad_value);
2014 howto = &elf_howto_table[r_type];
2016 r_symndx = ELF32_R_SYM (rel->r_info);
2018 if (info->relocatable)
2020 /* This is a relocatable link.
2021 1) If the reloc is against a section symbol, adjust
2022 according to the output section.
2023 2) If there is a new target for this relocation,
2024 the new target will be in the same output section.
2025 We adjust the relocation by the output section
2028 if (relaxing_section)
2030 /* Check if this references a section in another input file. */
2031 if (!do_fix_for_relocatable_link (rel, input_bfd, input_section,
2034 r_type = ELF32_R_TYPE (rel->r_info);
2037 if (r_type == R_XTENSA_ASM_SIMPLIFY)
2039 char *error_message = NULL;
2040 /* Convert ASM_SIMPLIFY into the simpler relocation
2041 so that they never escape a relaxing link. */
2042 r = contract_asm_expansion (contents, input_size, rel,
2044 if (r != bfd_reloc_ok)
2046 if (!((*info->callbacks->reloc_dangerous)
2047 (info, error_message, input_bfd, input_section,
2051 r_type = ELF32_R_TYPE (rel->r_info);
2054 /* This is a relocatable link, so we don't have to change
2055 anything unless the reloc is against a section symbol,
2056 in which case we have to adjust according to where the
2057 section symbol winds up in the output section. */
2058 if (r_symndx < symtab_hdr->sh_info)
2060 sym = local_syms + r_symndx;
2061 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2063 sec = local_sections[r_symndx];
2064 rel->r_addend += sec->output_offset + sym->st_value;
2068 /* If there is an addend with a partial_inplace howto,
2069 then move the addend to the contents. This is a hack
2070 to work around problems with DWARF in relocatable links
2071 with some previous version of BFD. Now we can't easily get
2072 rid of the hack without breaking backward compatibility.... */
2075 howto = &elf_howto_table[r_type];
2076 if (howto->partial_inplace)
2078 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2079 rel->r_addend, contents,
2080 rel->r_offset, FALSE,
2082 if (r != bfd_reloc_ok)
2084 if (!((*info->callbacks->reloc_dangerous)
2085 (info, error_message, input_bfd, input_section,
2093 /* Done with work for relocatable link; continue with next reloc. */
2097 /* This is a final link. */
2102 is_weak_undef = FALSE;
2103 unresolved_reloc = FALSE;
2106 if (howto->partial_inplace)
2108 /* Because R_XTENSA_32 was made partial_inplace to fix some
2109 problems with DWARF info in partial links, there may be
2110 an addend stored in the contents. Take it out of there
2111 and move it back into the addend field of the reloc. */
2112 rel->r_addend += bfd_get_32 (input_bfd, contents + rel->r_offset);
2113 bfd_put_32 (input_bfd, 0, contents + rel->r_offset);
2116 if (r_symndx < symtab_hdr->sh_info)
2118 sym = local_syms + r_symndx;
2119 sec = local_sections[r_symndx];
2120 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2124 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2125 r_symndx, symtab_hdr, sym_hashes,
2127 unresolved_reloc, warned);
2130 && !unresolved_reloc
2131 && h->root.type == bfd_link_hash_undefweak)
2132 is_weak_undef = TRUE;
2135 if (relaxing_section)
2137 /* Check if this references a section in another input file. */
2138 do_fix_for_final_link (rel, input_bfd, input_section, contents,
2141 /* Update some already cached values. */
2142 r_type = ELF32_R_TYPE (rel->r_info);
2143 howto = &elf_howto_table[r_type];
2146 /* Sanity check the address. */
2147 if (rel->r_offset >= input_size
2148 && ELF32_R_TYPE (rel->r_info) != R_XTENSA_NONE)
2150 (*_bfd_error_handler)
2151 (_("%B(%A+0x%lx): relocation offset out of range (size=0x%x)"),
2152 input_bfd, input_section, rel->r_offset, input_size);
2153 bfd_set_error (bfd_error_bad_value);
2157 /* Generate dynamic relocations. */
2158 if (elf_hash_table (info)->dynamic_sections_created)
2160 bfd_boolean dynamic_symbol = xtensa_elf_dynamic_symbol_p (h, info);
2162 if (dynamic_symbol && is_operand_relocation (r_type))
2164 /* This is an error. The symbol's real value won't be known
2165 until runtime and it's likely to be out of range anyway. */
2166 const char *name = h->root.root.string;
2167 error_message = vsprint_msg ("invalid relocation for dynamic "
2169 strlen (name) + 2, name);
2170 if (!((*info->callbacks->reloc_dangerous)
2171 (info, error_message, input_bfd, input_section,
2175 else if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
2176 && (input_section->flags & SEC_ALLOC) != 0
2177 && (dynamic_symbol || info->shared))
2179 Elf_Internal_Rela outrel;
2183 if (dynamic_symbol && r_type == R_XTENSA_PLT)
2188 BFD_ASSERT (srel != NULL);
2191 _bfd_elf_section_offset (output_bfd, info,
2192 input_section, rel->r_offset);
2194 if ((outrel.r_offset | 1) == (bfd_vma) -1)
2195 memset (&outrel, 0, sizeof outrel);
2198 outrel.r_offset += (input_section->output_section->vma
2199 + input_section->output_offset);
2201 /* Complain if the relocation is in a read-only section
2202 and not in a literal pool. */
2203 if ((input_section->flags & SEC_READONLY) != 0
2204 && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
2208 _("dynamic relocation in read-only section");
2209 if (!((*info->callbacks->reloc_dangerous)
2210 (info, error_message, input_bfd, input_section,
2217 outrel.r_addend = rel->r_addend;
2220 if (r_type == R_XTENSA_32)
2223 ELF32_R_INFO (h->dynindx, R_XTENSA_GLOB_DAT);
2226 else /* r_type == R_XTENSA_PLT */
2229 ELF32_R_INFO (h->dynindx, R_XTENSA_JMP_SLOT);
2231 /* Create the PLT entry and set the initial
2232 contents of the literal entry to the address of
2235 elf_xtensa_create_plt_entry (dynobj, output_bfd,
2238 unresolved_reloc = FALSE;
2242 /* Generate a RELATIVE relocation. */
2243 outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
2244 outrel.r_addend = 0;
2248 loc = (srel->contents
2249 + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2250 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2251 BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2256 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2257 because such sections are not SEC_ALLOC and thus ld.so will
2258 not process them. */
2259 if (unresolved_reloc
2260 && !((input_section->flags & SEC_DEBUGGING) != 0
2263 (*_bfd_error_handler)
2264 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
2267 (long) rel->r_offset,
2269 h->root.root.string);
2273 /* There's no point in calling bfd_perform_relocation here.
2274 Just go directly to our "special function". */
2275 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2276 relocation + rel->r_addend,
2277 contents, rel->r_offset, is_weak_undef,
2280 if (r != bfd_reloc_ok && !warned)
2284 BFD_ASSERT (r == bfd_reloc_dangerous || r == bfd_reloc_other);
2285 BFD_ASSERT (error_message != NULL);
2288 name = h->root.root.string;
2291 name = bfd_elf_string_from_elf_section
2292 (input_bfd, symtab_hdr->sh_link, sym->st_name);
2293 if (name && *name == '\0')
2294 name = bfd_section_name (input_bfd, sec);
2298 if (rel->r_addend == 0)
2299 error_message = vsprint_msg (error_message, ": %s",
2300 strlen (name) + 2, name);
2302 error_message = vsprint_msg (error_message, ": (%s+0x%x)",
2304 name, (int)rel->r_addend);
2307 if (!((*info->callbacks->reloc_dangerous)
2308 (info, error_message, input_bfd, input_section,
2317 input_section->reloc_done = TRUE;
2323 /* Finish up dynamic symbol handling. There's not much to do here since
2324 the PLT and GOT entries are all set up by relocate_section. */
2327 elf_xtensa_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
2328 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2329 struct elf_link_hash_entry *h,
2330 Elf_Internal_Sym *sym)
2332 if (h->needs_plt && !h->def_regular)
2334 /* Mark the symbol as undefined, rather than as defined in
2335 the .plt section. Leave the value alone. */
2336 sym->st_shndx = SHN_UNDEF;
2337 /* If the symbol is weak, we do need to clear the value.
2338 Otherwise, the PLT entry would provide a definition for
2339 the symbol even if the symbol wasn't defined anywhere,
2340 and so the symbol would never be NULL. */
2341 if (!h->ref_regular_nonweak)
2345 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2346 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2347 || h == elf_hash_table (info)->hgot)
2348 sym->st_shndx = SHN_ABS;
2354 /* Combine adjacent literal table entries in the output. Adjacent
2355 entries within each input section may have been removed during
2356 relaxation, but we repeat the process here, even though it's too late
2357 to shrink the output section, because it's important to minimize the
2358 number of literal table entries to reduce the start-up work for the
2359 runtime linker. Returns the number of remaining table entries or -1
2363 elf_xtensa_combine_prop_entries (bfd *output_bfd,
2368 property_table_entry *table;
2369 bfd_size_type section_size, sgotloc_size;
2373 section_size = sxtlit->size;
2374 BFD_ASSERT (section_size % 8 == 0);
2375 num = section_size / 8;
2377 sgotloc_size = sgotloc->size;
2378 if (sgotloc_size != section_size)
2380 (*_bfd_error_handler)
2381 (_("internal inconsistency in size of .got.loc section"));
2385 table = bfd_malloc (num * sizeof (property_table_entry));
2389 /* The ".xt.lit.plt" section has the SEC_IN_MEMORY flag set and this
2390 propagates to the output section, where it doesn't really apply and
2391 where it breaks the following call to bfd_malloc_and_get_section. */
2392 sxtlit->flags &= ~SEC_IN_MEMORY;
2394 if (!bfd_malloc_and_get_section (output_bfd, sxtlit, &contents))
2402 /* There should never be any relocations left at this point, so this
2403 is quite a bit easier than what is done during relaxation. */
2405 /* Copy the raw contents into a property table array and sort it. */
2407 for (n = 0; n < num; n++)
2409 table[n].address = bfd_get_32 (output_bfd, &contents[offset]);
2410 table[n].size = bfd_get_32 (output_bfd, &contents[offset + 4]);
2413 qsort (table, num, sizeof (property_table_entry), property_table_compare);
2415 for (n = 0; n < num; n++)
2417 bfd_boolean remove = FALSE;
2419 if (table[n].size == 0)
2422 (table[n-1].address + table[n-1].size == table[n].address))
2424 table[n-1].size += table[n].size;
2430 for (m = n; m < num - 1; m++)
2432 table[m].address = table[m+1].address;
2433 table[m].size = table[m+1].size;
2441 /* Copy the data back to the raw contents. */
2443 for (n = 0; n < num; n++)
2445 bfd_put_32 (output_bfd, table[n].address, &contents[offset]);
2446 bfd_put_32 (output_bfd, table[n].size, &contents[offset + 4]);
2450 /* Clear the removed bytes. */
2451 if ((bfd_size_type) (num * 8) < section_size)
2452 memset (&contents[num * 8], 0, section_size - num * 8);
2454 if (! bfd_set_section_contents (output_bfd, sxtlit, contents, 0,
2458 /* Copy the contents to ".got.loc". */
2459 memcpy (sgotloc->contents, contents, section_size);
2467 /* Finish up the dynamic sections. */
2470 elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
2471 struct bfd_link_info *info)
2474 asection *sdyn, *srelplt, *sgot, *sxtlit, *sgotloc;
2475 Elf32_External_Dyn *dyncon, *dynconend;
2476 int num_xtlit_entries;
2478 if (! elf_hash_table (info)->dynamic_sections_created)
2481 dynobj = elf_hash_table (info)->dynobj;
2482 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2483 BFD_ASSERT (sdyn != NULL);
2485 /* Set the first entry in the global offset table to the address of
2486 the dynamic section. */
2487 sgot = bfd_get_section_by_name (dynobj, ".got");
2490 BFD_ASSERT (sgot->size == 4);
2492 bfd_put_32 (output_bfd, 0, sgot->contents);
2494 bfd_put_32 (output_bfd,
2495 sdyn->output_section->vma + sdyn->output_offset,
2499 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
2500 if (srelplt && srelplt->size != 0)
2502 asection *sgotplt, *srelgot, *spltlittbl;
2503 int chunk, plt_chunks, plt_entries;
2504 Elf_Internal_Rela irela;
2506 unsigned rtld_reloc;
2508 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");;
2509 BFD_ASSERT (srelgot != NULL);
2511 spltlittbl = bfd_get_section_by_name (dynobj, ".xt.lit.plt");
2512 BFD_ASSERT (spltlittbl != NULL);
2514 /* Find the first XTENSA_RTLD relocation. Presumably the rest
2515 of them follow immediately after.... */
2516 for (rtld_reloc = 0; rtld_reloc < srelgot->reloc_count; rtld_reloc++)
2518 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
2519 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
2520 if (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD)
2523 BFD_ASSERT (rtld_reloc < srelgot->reloc_count);
2525 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
2527 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
2529 for (chunk = 0; chunk < plt_chunks; chunk++)
2531 int chunk_entries = 0;
2533 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
2534 BFD_ASSERT (sgotplt != NULL);
2536 /* Emit special RTLD relocations for the first two entries in
2537 each chunk of the .got.plt section. */
2539 loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
2540 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
2541 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
2542 irela.r_offset = (sgotplt->output_section->vma
2543 + sgotplt->output_offset);
2544 irela.r_addend = 1; /* tell rtld to set value to resolver function */
2545 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
2547 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
2549 /* Next literal immediately follows the first. */
2550 loc += sizeof (Elf32_External_Rela);
2551 bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
2552 BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
2553 irela.r_offset = (sgotplt->output_section->vma
2554 + sgotplt->output_offset + 4);
2555 /* Tell rtld to set value to object's link map. */
2557 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
2559 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
2561 /* Fill in the literal table. */
2562 if (chunk < plt_chunks - 1)
2563 chunk_entries = PLT_ENTRIES_PER_CHUNK;
2565 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
2567 BFD_ASSERT ((unsigned) (chunk + 1) * 8 <= spltlittbl->size);
2568 bfd_put_32 (output_bfd,
2569 sgotplt->output_section->vma + sgotplt->output_offset,
2570 spltlittbl->contents + (chunk * 8) + 0);
2571 bfd_put_32 (output_bfd,
2572 8 + (chunk_entries * 4),
2573 spltlittbl->contents + (chunk * 8) + 4);
2576 /* All the dynamic relocations have been emitted at this point.
2577 Make sure the relocation sections are the correct size. */
2578 if (srelgot->size != (sizeof (Elf32_External_Rela)
2579 * srelgot->reloc_count)
2580 || srelplt->size != (sizeof (Elf32_External_Rela)
2581 * srelplt->reloc_count))
2584 /* The .xt.lit.plt section has just been modified. This must
2585 happen before the code below which combines adjacent literal
2586 table entries, and the .xt.lit.plt contents have to be forced to
2588 if (! bfd_set_section_contents (output_bfd,
2589 spltlittbl->output_section,
2590 spltlittbl->contents,
2591 spltlittbl->output_offset,
2594 /* Clear SEC_HAS_CONTENTS so the contents won't be output again. */
2595 spltlittbl->flags &= ~SEC_HAS_CONTENTS;
2598 /* Combine adjacent literal table entries. */
2599 BFD_ASSERT (! info->relocatable);
2600 sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");
2601 sgotloc = bfd_get_section_by_name (dynobj, ".got.loc");
2602 BFD_ASSERT (sxtlit && sgotloc);
2604 elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc);
2605 if (num_xtlit_entries < 0)
2608 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2609 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
2610 for (; dyncon < dynconend; dyncon++)
2612 Elf_Internal_Dyn dyn;
2616 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2623 case DT_XTENSA_GOT_LOC_SZ:
2624 dyn.d_un.d_val = num_xtlit_entries;
2627 case DT_XTENSA_GOT_LOC_OFF:
2636 s = bfd_get_section_by_name (output_bfd, name);
2638 dyn.d_un.d_ptr = s->vma;
2642 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2644 dyn.d_un.d_val = s->size;
2648 /* Adjust RELASZ to not include JMPREL. This matches what
2649 glibc expects and what is done for several other ELF
2650 targets (e.g., i386, alpha), but the "correct" behavior
2651 seems to be unresolved. Since the linker script arranges
2652 for .rela.plt to follow all other relocation sections, we
2653 don't have to worry about changing the DT_RELA entry. */
2654 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2656 dyn.d_un.d_val -= s->size;
2660 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2667 /* Functions for dealing with the e_flags field. */
2669 /* Merge backend specific data from an object file to the output
2670 object file when linking. */
2673 elf_xtensa_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2675 unsigned out_mach, in_mach;
2676 flagword out_flag, in_flag;
2678 /* Check if we have the same endianess. */
2679 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
2682 /* Don't even pretend to support mixed-format linking. */
2683 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2684 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2687 out_flag = elf_elfheader (obfd)->e_flags;
2688 in_flag = elf_elfheader (ibfd)->e_flags;
2690 out_mach = out_flag & EF_XTENSA_MACH;
2691 in_mach = in_flag & EF_XTENSA_MACH;
2692 if (out_mach != in_mach)
2694 (*_bfd_error_handler)
2695 (_("%B: incompatible machine type. Output is 0x%x. Input is 0x%x"),
2696 ibfd, out_mach, in_mach);
2697 bfd_set_error (bfd_error_wrong_format);
2701 if (! elf_flags_init (obfd))
2703 elf_flags_init (obfd) = TRUE;
2704 elf_elfheader (obfd)->e_flags = in_flag;
2706 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2707 && bfd_get_arch_info (obfd)->the_default)
2708 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
2709 bfd_get_mach (ibfd));
2714 if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
2715 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
2717 if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
2718 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
2725 elf_xtensa_set_private_flags (bfd *abfd, flagword flags)
2727 BFD_ASSERT (!elf_flags_init (abfd)
2728 || elf_elfheader (abfd)->e_flags == flags);
2730 elf_elfheader (abfd)->e_flags |= flags;
2731 elf_flags_init (abfd) = TRUE;
2738 elf_xtensa_print_private_bfd_data (bfd *abfd, void *farg)
2740 FILE *f = (FILE *) farg;
2741 flagword e_flags = elf_elfheader (abfd)->e_flags;
2743 fprintf (f, "\nXtensa header:\n");
2744 if ((e_flags & EF_XTENSA_MACH) == E_XTENSA_MACH)
2745 fprintf (f, "\nMachine = Base\n");
2747 fprintf (f, "\nMachine Id = 0x%x\n", e_flags & EF_XTENSA_MACH);
2749 fprintf (f, "Insn tables = %s\n",
2750 (e_flags & EF_XTENSA_XT_INSN) ? "true" : "false");
2752 fprintf (f, "Literal tables = %s\n",
2753 (e_flags & EF_XTENSA_XT_LIT) ? "true" : "false");
2755 return _bfd_elf_print_private_bfd_data (abfd, farg);
2759 /* Set the right machine number for an Xtensa ELF file. */
2762 elf_xtensa_object_p (bfd *abfd)
2765 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
2770 mach = bfd_mach_xtensa;
2776 (void) bfd_default_set_arch_mach (abfd, bfd_arch_xtensa, mach);
2781 /* The final processing done just before writing out an Xtensa ELF object
2782 file. This gets the Xtensa architecture right based on the machine
2786 elf_xtensa_final_write_processing (bfd *abfd,
2787 bfd_boolean linker ATTRIBUTE_UNUSED)
2792 switch (mach = bfd_get_mach (abfd))
2794 case bfd_mach_xtensa:
2795 val = E_XTENSA_MACH;
2801 elf_elfheader (abfd)->e_flags &= (~ EF_XTENSA_MACH);
2802 elf_elfheader (abfd)->e_flags |= val;
2806 static enum elf_reloc_type_class
2807 elf_xtensa_reloc_type_class (const Elf_Internal_Rela *rela)
2809 switch ((int) ELF32_R_TYPE (rela->r_info))
2811 case R_XTENSA_RELATIVE:
2812 return reloc_class_relative;
2813 case R_XTENSA_JMP_SLOT:
2814 return reloc_class_plt;
2816 return reloc_class_normal;
2822 elf_xtensa_discard_info_for_section (bfd *abfd,
2823 struct elf_reloc_cookie *cookie,
2824 struct bfd_link_info *info,
2828 bfd_vma section_size;
2829 bfd_vma offset, actual_offset;
2830 size_t removed_bytes = 0;
2832 section_size = sec->size;
2833 if (section_size == 0 || section_size % 8 != 0)
2836 if (sec->output_section
2837 && bfd_is_abs_section (sec->output_section))
2840 contents = retrieve_contents (abfd, sec, info->keep_memory);
2844 cookie->rels = retrieve_internal_relocs (abfd, sec, info->keep_memory);
2847 release_contents (sec, contents);
2851 cookie->rel = cookie->rels;
2852 cookie->relend = cookie->rels + sec->reloc_count;
2854 for (offset = 0; offset < section_size; offset += 8)
2856 actual_offset = offset - removed_bytes;
2858 /* The ...symbol_deleted_p function will skip over relocs but it
2859 won't adjust their offsets, so do that here. */
2860 while (cookie->rel < cookie->relend
2861 && cookie->rel->r_offset < offset)
2863 cookie->rel->r_offset -= removed_bytes;
2867 while (cookie->rel < cookie->relend
2868 && cookie->rel->r_offset == offset)
2870 if (bfd_elf_reloc_symbol_deleted_p (offset, cookie))
2872 /* Remove the table entry. (If the reloc type is NONE, then
2873 the entry has already been merged with another and deleted
2874 during relaxation.) */
2875 if (ELF32_R_TYPE (cookie->rel->r_info) != R_XTENSA_NONE)
2877 /* Shift the contents up. */
2878 if (offset + 8 < section_size)
2879 memmove (&contents[actual_offset],
2880 &contents[actual_offset+8],
2881 section_size - offset - 8);
2885 /* Remove this relocation. */
2886 cookie->rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
2889 /* Adjust the relocation offset for previous removals. This
2890 should not be done before calling ...symbol_deleted_p
2891 because it might mess up the offset comparisons there.
2892 Make sure the offset doesn't underflow in the case where
2893 the first entry is removed. */
2894 if (cookie->rel->r_offset >= removed_bytes)
2895 cookie->rel->r_offset -= removed_bytes;
2897 cookie->rel->r_offset = 0;
2903 if (removed_bytes != 0)
2905 /* Adjust any remaining relocs (shouldn't be any). */
2906 for (; cookie->rel < cookie->relend; cookie->rel++)
2908 if (cookie->rel->r_offset >= removed_bytes)
2909 cookie->rel->r_offset -= removed_bytes;
2911 cookie->rel->r_offset = 0;
2914 /* Clear the removed bytes. */
2915 memset (&contents[section_size - removed_bytes], 0, removed_bytes);
2917 pin_contents (sec, contents);
2918 pin_internal_relocs (sec, cookie->rels);
2921 sec->size = section_size - removed_bytes;
2923 if (xtensa_is_littable_section (sec))
2925 bfd *dynobj = elf_hash_table (info)->dynobj;
2929 bfd_get_section_by_name (dynobj, ".got.loc");
2931 sgotloc->size -= removed_bytes;
2937 release_contents (sec, contents);
2938 release_internal_relocs (sec, cookie->rels);
2941 return (removed_bytes != 0);
2946 elf_xtensa_discard_info (bfd *abfd,
2947 struct elf_reloc_cookie *cookie,
2948 struct bfd_link_info *info)
2951 bfd_boolean changed = FALSE;
2953 for (sec = abfd->sections; sec != NULL; sec = sec->next)
2955 if (xtensa_is_property_section (sec))
2957 if (elf_xtensa_discard_info_for_section (abfd, cookie, info, sec))
2967 elf_xtensa_ignore_discarded_relocs (asection *sec)
2969 return xtensa_is_property_section (sec);
2974 elf_xtensa_action_discarded (asection *sec)
2976 if (strcmp (".xt_except_table", sec->name) == 0)
2979 if (strcmp (".xt_except_desc", sec->name) == 0)
2982 return _bfd_elf_default_action_discarded (sec);
2986 /* Support for core dump NOTE sections. */
2989 elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2994 /* The size for Xtensa is variable, so don't try to recognize the format
2995 based on the size. Just assume this is GNU/Linux. */
2998 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
3001 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
3005 size = note->descsz - offset - 4;
3007 /* Make a ".reg/999" section. */
3008 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3009 size, note->descpos + offset);
3014 elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3016 switch (note->descsz)
3021 case 128: /* GNU/Linux elf_prpsinfo */
3022 elf_tdata (abfd)->core_program
3023 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3024 elf_tdata (abfd)->core_command
3025 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3028 /* Note that for some reason, a spurious space is tacked
3029 onto the end of the args in some (at least one anyway)
3030 implementations, so strip it off if it exists. */
3033 char *command = elf_tdata (abfd)->core_command;
3034 int n = strlen (command);
3036 if (0 < n && command[n - 1] == ' ')
3037 command[n - 1] = '\0';
3044 /* Generic Xtensa configurability stuff. */
3046 static xtensa_opcode callx0_op = XTENSA_UNDEFINED;
3047 static xtensa_opcode callx4_op = XTENSA_UNDEFINED;
3048 static xtensa_opcode callx8_op = XTENSA_UNDEFINED;
3049 static xtensa_opcode callx12_op = XTENSA_UNDEFINED;
3050 static xtensa_opcode call0_op = XTENSA_UNDEFINED;
3051 static xtensa_opcode call4_op = XTENSA_UNDEFINED;
3052 static xtensa_opcode call8_op = XTENSA_UNDEFINED;
3053 static xtensa_opcode call12_op = XTENSA_UNDEFINED;
3056 init_call_opcodes (void)
3058 if (callx0_op == XTENSA_UNDEFINED)
3060 callx0_op = xtensa_opcode_lookup (xtensa_default_isa, "callx0");
3061 callx4_op = xtensa_opcode_lookup (xtensa_default_isa, "callx4");
3062 callx8_op = xtensa_opcode_lookup (xtensa_default_isa, "callx8");
3063 callx12_op = xtensa_opcode_lookup (xtensa_default_isa, "callx12");
3064 call0_op = xtensa_opcode_lookup (xtensa_default_isa, "call0");
3065 call4_op = xtensa_opcode_lookup (xtensa_default_isa, "call4");
3066 call8_op = xtensa_opcode_lookup (xtensa_default_isa, "call8");
3067 call12_op = xtensa_opcode_lookup (xtensa_default_isa, "call12");
3073 is_indirect_call_opcode (xtensa_opcode opcode)
3075 init_call_opcodes ();
3076 return (opcode == callx0_op
3077 || opcode == callx4_op
3078 || opcode == callx8_op
3079 || opcode == callx12_op);
3084 is_direct_call_opcode (xtensa_opcode opcode)
3086 init_call_opcodes ();
3087 return (opcode == call0_op
3088 || opcode == call4_op
3089 || opcode == call8_op
3090 || opcode == call12_op);
3095 is_windowed_call_opcode (xtensa_opcode opcode)
3097 init_call_opcodes ();
3098 return (opcode == call4_op
3099 || opcode == call8_op
3100 || opcode == call12_op
3101 || opcode == callx4_op
3102 || opcode == callx8_op
3103 || opcode == callx12_op);
3107 static xtensa_opcode
3108 get_const16_opcode (void)
3110 static bfd_boolean done_lookup = FALSE;
3111 static xtensa_opcode const16_opcode = XTENSA_UNDEFINED;
3114 const16_opcode = xtensa_opcode_lookup (xtensa_default_isa, "const16");
3117 return const16_opcode;
3121 static xtensa_opcode
3122 get_l32r_opcode (void)
3124 static xtensa_opcode l32r_opcode = XTENSA_UNDEFINED;
3125 static bfd_boolean done_lookup = FALSE;
3129 l32r_opcode = xtensa_opcode_lookup (xtensa_default_isa, "l32r");
3137 l32r_offset (bfd_vma addr, bfd_vma pc)
3141 offset = addr - ((pc+3) & -4);
3142 BFD_ASSERT ((offset & ((1 << 2) - 1)) == 0);
3143 offset = (signed int) offset >> 2;
3144 BFD_ASSERT ((signed int) offset >> 16 == -1);
3150 get_relocation_opnd (xtensa_opcode opcode, int r_type)
3152 xtensa_isa isa = xtensa_default_isa;
3153 int last_immed, last_opnd, opi;
3155 if (opcode == XTENSA_UNDEFINED)
3156 return XTENSA_UNDEFINED;
3158 /* Find the last visible PC-relative immediate operand for the opcode.
3159 If there are no PC-relative immediates, then choose the last visible
3160 immediate; otherwise, fail and return XTENSA_UNDEFINED. */
3161 last_immed = XTENSA_UNDEFINED;
3162 last_opnd = xtensa_opcode_num_operands (isa, opcode);
3163 for (opi = last_opnd - 1; opi >= 0; opi--)
3165 if (xtensa_operand_is_visible (isa, opcode, opi) == 0)
3167 if (xtensa_operand_is_PCrelative (isa, opcode, opi) == 1)
3172 if (last_immed == XTENSA_UNDEFINED
3173 && xtensa_operand_is_register (isa, opcode, opi) == 0)
3177 return XTENSA_UNDEFINED;
3179 /* If the operand number was specified in an old-style relocation,
3180 check for consistency with the operand computed above. */
3181 if (r_type >= R_XTENSA_OP0 && r_type <= R_XTENSA_OP2)
3183 int reloc_opnd = r_type - R_XTENSA_OP0;
3184 if (reloc_opnd != last_immed)
3185 return XTENSA_UNDEFINED;
3193 get_relocation_slot (int r_type)
3203 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
3204 return r_type - R_XTENSA_SLOT0_OP;
3205 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
3206 return r_type - R_XTENSA_SLOT0_ALT;
3210 return XTENSA_UNDEFINED;
3214 /* Get the opcode for a relocation. */
3216 static xtensa_opcode
3217 get_relocation_opcode (bfd *abfd,
3220 Elf_Internal_Rela *irel)
3222 static xtensa_insnbuf ibuff = NULL;
3223 static xtensa_insnbuf sbuff = NULL;
3224 xtensa_isa isa = xtensa_default_isa;
3228 if (contents == NULL)
3229 return XTENSA_UNDEFINED;
3231 if (bfd_get_section_limit (abfd, sec) <= irel->r_offset)
3232 return XTENSA_UNDEFINED;
3236 ibuff = xtensa_insnbuf_alloc (isa);
3237 sbuff = xtensa_insnbuf_alloc (isa);
3240 /* Decode the instruction. */
3241 xtensa_insnbuf_from_chars (isa, ibuff, &contents[irel->r_offset],
3242 sec->size - irel->r_offset);
3243 fmt = xtensa_format_decode (isa, ibuff);
3244 slot = get_relocation_slot (ELF32_R_TYPE (irel->r_info));
3245 if (slot == XTENSA_UNDEFINED)
3246 return XTENSA_UNDEFINED;
3247 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
3248 return xtensa_opcode_decode (isa, fmt, slot, sbuff);
3253 is_l32r_relocation (bfd *abfd,
3256 Elf_Internal_Rela *irel)
3258 xtensa_opcode opcode;
3259 if (!is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
3261 opcode = get_relocation_opcode (abfd, sec, contents, irel);
3262 return (opcode == get_l32r_opcode ());
3266 static bfd_size_type
3267 get_asm_simplify_size (bfd_byte *contents,
3268 bfd_size_type content_len,
3269 bfd_size_type offset)
3271 bfd_size_type insnlen, size = 0;
3273 /* Decode the size of the next two instructions. */
3274 insnlen = insn_decode_len (contents, content_len, offset);
3280 insnlen = insn_decode_len (contents, content_len, offset + size);
3290 is_alt_relocation (int r_type)
3292 return (r_type >= R_XTENSA_SLOT0_ALT
3293 && r_type <= R_XTENSA_SLOT14_ALT);
3298 is_operand_relocation (int r_type)
3308 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
3310 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
3319 #define MIN_INSN_LENGTH 2
3321 /* Return 0 if it fails to decode. */
3324 insn_decode_len (bfd_byte *contents,
3325 bfd_size_type content_len,
3326 bfd_size_type offset)
3329 xtensa_isa isa = xtensa_default_isa;
3331 static xtensa_insnbuf ibuff = NULL;
3333 if (offset + MIN_INSN_LENGTH > content_len)
3337 ibuff = xtensa_insnbuf_alloc (isa);
3338 xtensa_insnbuf_from_chars (isa, ibuff, &contents[offset],
3339 content_len - offset);
3340 fmt = xtensa_format_decode (isa, ibuff);
3341 if (fmt == XTENSA_UNDEFINED)
3343 insn_len = xtensa_format_length (isa, fmt);
3344 if (insn_len == XTENSA_UNDEFINED)
3350 /* Decode the opcode for a single slot instruction.
3351 Return 0 if it fails to decode or the instruction is multi-slot. */
3354 insn_decode_opcode (bfd_byte *contents,
3355 bfd_size_type content_len,
3356 bfd_size_type offset,
3359 xtensa_isa isa = xtensa_default_isa;
3361 static xtensa_insnbuf insnbuf = NULL;
3362 static xtensa_insnbuf slotbuf = NULL;
3364 if (offset + MIN_INSN_LENGTH > content_len)
3365 return XTENSA_UNDEFINED;
3367 if (insnbuf == NULL)
3369 insnbuf = xtensa_insnbuf_alloc (isa);
3370 slotbuf = xtensa_insnbuf_alloc (isa);
3373 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
3374 content_len - offset);
3375 fmt = xtensa_format_decode (isa, insnbuf);
3376 if (fmt == XTENSA_UNDEFINED)
3377 return XTENSA_UNDEFINED;
3379 if (slot >= xtensa_format_num_slots (isa, fmt))
3380 return XTENSA_UNDEFINED;
3382 xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
3383 return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
3387 /* The offset is the offset in the contents.
3388 The address is the address of that offset. */
3391 check_branch_target_aligned (bfd_byte *contents,
3392 bfd_size_type content_length,
3396 bfd_size_type insn_len = insn_decode_len (contents, content_length, offset);
3399 return check_branch_target_aligned_address (address, insn_len);
3404 check_loop_aligned (bfd_byte *contents,
3405 bfd_size_type content_length,
3409 bfd_size_type loop_len, insn_len;
3410 xtensa_opcode opcode;
3412 opcode = insn_decode_opcode (contents, content_length, offset, 0);
3413 if (opcode == XTENSA_UNDEFINED
3414 || xtensa_opcode_is_loop (xtensa_default_isa, opcode) != 1)
3420 loop_len = insn_decode_len (contents, content_length, offset);
3421 insn_len = insn_decode_len (contents, content_length, offset + loop_len);
3422 if (loop_len == 0 || insn_len == 0)
3428 return check_branch_target_aligned_address (address + loop_len, insn_len);
3433 check_branch_target_aligned_address (bfd_vma addr, int len)
3436 return (addr % 8 == 0);
3437 return ((addr >> 2) == ((addr + len - 1) >> 2));
3441 /* Instruction widening and narrowing. */
3443 /* When FLIX is available we need to access certain instructions only
3444 when they are 16-bit or 24-bit instructions. This table caches
3445 information about such instructions by walking through all the
3446 opcodes and finding the smallest single-slot format into which each
3449 static xtensa_format *op_single_fmt_table = NULL;
3453 init_op_single_format_table (void)
3455 xtensa_isa isa = xtensa_default_isa;
3456 xtensa_insnbuf ibuf;
3457 xtensa_opcode opcode;
3461 if (op_single_fmt_table)
3464 ibuf = xtensa_insnbuf_alloc (isa);
3465 num_opcodes = xtensa_isa_num_opcodes (isa);
3467 op_single_fmt_table = (xtensa_format *)
3468 bfd_malloc (sizeof (xtensa_format) * num_opcodes);
3469 for (opcode = 0; opcode < num_opcodes; opcode++)
3471 op_single_fmt_table[opcode] = XTENSA_UNDEFINED;
3472 for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
3474 if (xtensa_format_num_slots (isa, fmt) == 1
3475 && xtensa_opcode_encode (isa, fmt, 0, ibuf, opcode) == 0)
3477 xtensa_opcode old_fmt = op_single_fmt_table[opcode];
3478 int fmt_length = xtensa_format_length (isa, fmt);
3479 if (old_fmt == XTENSA_UNDEFINED
3480 || fmt_length < xtensa_format_length (isa, old_fmt))
3481 op_single_fmt_table[opcode] = fmt;
3485 xtensa_insnbuf_free (isa, ibuf);
3489 static xtensa_format
3490 get_single_format (xtensa_opcode opcode)
3492 init_op_single_format_table ();
3493 return op_single_fmt_table[opcode];
3497 /* For the set of narrowable instructions we do NOT include the
3498 narrowings beqz -> beqz.n or bnez -> bnez.n because of complexities
3499 involved during linker relaxation that may require these to
3500 re-expand in some conditions. Also, the narrowing "or" -> mov.n
3501 requires special case code to ensure it only works when op1 == op2. */
3509 struct string_pair narrowable[] =
3512 { "addi", "addi.n" },
3513 { "addmi", "addi.n" },
3514 { "l32i", "l32i.n" },
3515 { "movi", "movi.n" },
3517 { "retw", "retw.n" },
3518 { "s32i", "s32i.n" },
3519 { "or", "mov.n" } /* special case only when op1 == op2 */
3522 struct string_pair widenable[] =
3525 { "addi", "addi.n" },
3526 { "addmi", "addi.n" },
3527 { "beqz", "beqz.n" },
3528 { "bnez", "bnez.n" },
3529 { "l32i", "l32i.n" },
3530 { "movi", "movi.n" },
3532 { "retw", "retw.n" },
3533 { "s32i", "s32i.n" },
3534 { "or", "mov.n" } /* special case only when op1 == op2 */
3538 /* Check if an instruction can be "narrowed", i.e., changed from a standard
3539 3-byte instruction to a 2-byte "density" instruction. If it is valid,
3540 return the instruction buffer holding the narrow instruction. Otherwise,
3541 return 0. The set of valid narrowing are specified by a string table
3542 but require some special case operand checks in some cases. */
3544 static xtensa_insnbuf
3545 can_narrow_instruction (xtensa_insnbuf slotbuf,
3547 xtensa_opcode opcode)
3549 xtensa_isa isa = xtensa_default_isa;
3550 xtensa_format o_fmt;
3553 static xtensa_insnbuf o_insnbuf = NULL;
3554 static xtensa_insnbuf o_slotbuf = NULL;
3556 if (o_insnbuf == NULL)
3558 o_insnbuf = xtensa_insnbuf_alloc (isa);
3559 o_slotbuf = xtensa_insnbuf_alloc (isa);
3562 for (opi = 0; opi < (sizeof (narrowable)/sizeof (struct string_pair)); opi++)
3564 bfd_boolean is_or = (strcmp ("or", narrowable[opi].wide) == 0);
3566 if (opcode == xtensa_opcode_lookup (isa, narrowable[opi].wide))
3568 uint32 value, newval;
3569 int i, operand_count, o_operand_count;
3570 xtensa_opcode o_opcode;
3572 /* Address does not matter in this case. We might need to
3573 fix it to handle branches/jumps. */
3574 bfd_vma self_address = 0;
3576 o_opcode = xtensa_opcode_lookup (isa, narrowable[opi].narrow);
3577 if (o_opcode == XTENSA_UNDEFINED)
3579 o_fmt = get_single_format (o_opcode);
3580 if (o_fmt == XTENSA_UNDEFINED)
3583 if (xtensa_format_length (isa, fmt) != 3
3584 || xtensa_format_length (isa, o_fmt) != 2)
3587 xtensa_format_encode (isa, o_fmt, o_insnbuf);
3588 operand_count = xtensa_opcode_num_operands (isa, opcode);
3589 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
3591 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
3596 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
3601 uint32 rawval0, rawval1, rawval2;
3603 if (o_operand_count + 1 != operand_count
3604 || xtensa_operand_get_field (isa, opcode, 0,
3605 fmt, 0, slotbuf, &rawval0) != 0
3606 || xtensa_operand_get_field (isa, opcode, 1,
3607 fmt, 0, slotbuf, &rawval1) != 0
3608 || xtensa_operand_get_field (isa, opcode, 2,
3609 fmt, 0, slotbuf, &rawval2) != 0
3610 || rawval1 != rawval2
3611 || rawval0 == rawval1 /* it is a nop */)
3615 for (i = 0; i < o_operand_count; ++i)
3617 if (xtensa_operand_get_field (isa, opcode, i, fmt, 0,
3619 || xtensa_operand_decode (isa, opcode, i, &value))
3622 /* PC-relative branches need adjustment, but
3623 the PC-rel operand will always have a relocation. */
3625 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
3627 || xtensa_operand_encode (isa, o_opcode, i, &newval)
3628 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
3633 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
3643 /* Attempt to narrow an instruction. If the narrowing is valid, perform
3644 the action in-place directly into the contents and return TRUE. Otherwise,
3645 the return value is FALSE and the contents are not modified. */
3648 narrow_instruction (bfd_byte *contents,
3649 bfd_size_type content_length,
3650 bfd_size_type offset)
3652 xtensa_opcode opcode;
3653 bfd_size_type insn_len;
3654 xtensa_isa isa = xtensa_default_isa;
3656 xtensa_insnbuf o_insnbuf;
3658 static xtensa_insnbuf insnbuf = NULL;
3659 static xtensa_insnbuf slotbuf = NULL;
3661 if (insnbuf == NULL)
3663 insnbuf = xtensa_insnbuf_alloc (isa);
3664 slotbuf = xtensa_insnbuf_alloc (isa);
3667 BFD_ASSERT (offset < content_length);
3669 if (content_length < 2)
3672 /* We will hand-code a few of these for a little while.
3673 These have all been specified in the assembler aleady. */
3674 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
3675 content_length - offset);
3676 fmt = xtensa_format_decode (isa, insnbuf);
3677 if (xtensa_format_num_slots (isa, fmt) != 1)
3680 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
3683 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
3684 if (opcode == XTENSA_UNDEFINED)
3686 insn_len = xtensa_format_length (isa, fmt);
3687 if (insn_len > content_length)
3690 o_insnbuf = can_narrow_instruction (slotbuf, fmt, opcode);
3693 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
3694 content_length - offset);
3702 /* Check if an instruction can be "widened", i.e., changed from a 2-byte
3703 "density" instruction to a standard 3-byte instruction. If it is valid,
3704 return the instruction buffer holding the wide instruction. Otherwise,
3705 return 0. The set of valid widenings are specified by a string table
3706 but require some special case operand checks in some cases. */
3708 static xtensa_insnbuf
3709 can_widen_instruction (xtensa_insnbuf slotbuf,
3711 xtensa_opcode opcode)
3713 xtensa_isa isa = xtensa_default_isa;
3714 xtensa_format o_fmt;
3717 static xtensa_insnbuf o_insnbuf = NULL;
3718 static xtensa_insnbuf o_slotbuf = NULL;
3720 if (o_insnbuf == NULL)
3722 o_insnbuf = xtensa_insnbuf_alloc (isa);
3723 o_slotbuf = xtensa_insnbuf_alloc (isa);
3726 for (opi = 0; opi < (sizeof (widenable)/sizeof (struct string_pair)); opi++)
3728 bfd_boolean is_or = (strcmp ("or", widenable[opi].wide) == 0);
3729 bfd_boolean is_branch = (strcmp ("beqz", widenable[opi].wide) == 0
3730 || strcmp ("bnez", widenable[opi].wide) == 0);
3732 if (opcode == xtensa_opcode_lookup (isa, widenable[opi].narrow))
3734 uint32 value, newval;
3735 int i, operand_count, o_operand_count, check_operand_count;
3736 xtensa_opcode o_opcode;
3738 /* Address does not matter in this case. We might need to fix it
3739 to handle branches/jumps. */
3740 bfd_vma self_address = 0;
3742 o_opcode = xtensa_opcode_lookup (isa, widenable[opi].wide);
3743 if (o_opcode == XTENSA_UNDEFINED)
3745 o_fmt = get_single_format (o_opcode);
3746 if (o_fmt == XTENSA_UNDEFINED)
3749 if (xtensa_format_length (isa, fmt) != 2
3750 || xtensa_format_length (isa, o_fmt) != 3)
3753 xtensa_format_encode (isa, o_fmt, o_insnbuf);
3754 operand_count = xtensa_opcode_num_operands (isa, opcode);
3755 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
3756 check_operand_count = o_operand_count;
3758 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
3763 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
3768 uint32 rawval0, rawval1;
3770 if (o_operand_count != operand_count + 1
3771 || xtensa_operand_get_field (isa, opcode, 0,
3772 fmt, 0, slotbuf, &rawval0) != 0
3773 || xtensa_operand_get_field (isa, opcode, 1,
3774 fmt, 0, slotbuf, &rawval1) != 0
3775 || rawval0 == rawval1 /* it is a nop */)
3779 check_operand_count--;
3781 for (i = 0; i < check_operand_count; i++)
3784 if (is_or && i == o_operand_count - 1)
3786 if (xtensa_operand_get_field (isa, opcode, new_i, fmt, 0,
3788 || xtensa_operand_decode (isa, opcode, new_i, &value))
3791 /* PC-relative branches need adjustment, but
3792 the PC-rel operand will always have a relocation. */
3794 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
3796 || xtensa_operand_encode (isa, o_opcode, i, &newval)
3797 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
3802 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
3812 /* Attempt to widen an instruction. If the widening is valid, perform
3813 the action in-place directly into the contents and return TRUE. Otherwise,
3814 the return value is FALSE and the contents are not modified. */
3817 widen_instruction (bfd_byte *contents,
3818 bfd_size_type content_length,
3819 bfd_size_type offset)
3821 xtensa_opcode opcode;
3822 bfd_size_type insn_len;
3823 xtensa_isa isa = xtensa_default_isa;
3825 xtensa_insnbuf o_insnbuf;
3827 static xtensa_insnbuf insnbuf = NULL;
3828 static xtensa_insnbuf slotbuf = NULL;
3830 if (insnbuf == NULL)
3832 insnbuf = xtensa_insnbuf_alloc (isa);
3833 slotbuf = xtensa_insnbuf_alloc (isa);
3836 BFD_ASSERT (offset < content_length);
3838 if (content_length < 2)
3841 /* We will hand-code a few of these for a little while.
3842 These have all been specified in the assembler aleady. */
3843 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
3844 content_length - offset);
3845 fmt = xtensa_format_decode (isa, insnbuf);
3846 if (xtensa_format_num_slots (isa, fmt) != 1)
3849 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
3852 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
3853 if (opcode == XTENSA_UNDEFINED)
3855 insn_len = xtensa_format_length (isa, fmt);
3856 if (insn_len > content_length)
3859 o_insnbuf = can_widen_instruction (slotbuf, fmt, opcode);
3862 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
3863 content_length - offset);
3870 /* Code for transforming CALLs at link-time. */
3872 static bfd_reloc_status_type
3873 elf_xtensa_do_asm_simplify (bfd_byte *contents,
3875 bfd_vma content_length,
3876 char **error_message)
3878 static xtensa_insnbuf insnbuf = NULL;
3879 static xtensa_insnbuf slotbuf = NULL;
3880 xtensa_format core_format = XTENSA_UNDEFINED;
3881 xtensa_opcode opcode;
3882 xtensa_opcode direct_call_opcode;
3883 xtensa_isa isa = xtensa_default_isa;
3884 bfd_byte *chbuf = contents + address;
3887 if (insnbuf == NULL)
3889 insnbuf = xtensa_insnbuf_alloc (isa);
3890 slotbuf = xtensa_insnbuf_alloc (isa);
3893 if (content_length < address)
3895 *error_message = _("Attempt to convert L32R/CALLX to CALL failed");
3896 return bfd_reloc_other;
3899 opcode = get_expanded_call_opcode (chbuf, content_length - address, 0);
3900 direct_call_opcode = swap_callx_for_call_opcode (opcode);
3901 if (direct_call_opcode == XTENSA_UNDEFINED)
3903 *error_message = _("Attempt to convert L32R/CALLX to CALL failed");
3904 return bfd_reloc_other;
3907 /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset. */
3908 core_format = xtensa_format_lookup (isa, "x24");
3909 opcode = xtensa_opcode_lookup (isa, "or");
3910 xtensa_opcode_encode (isa, core_format, 0, slotbuf, opcode);
3911 for (opn = 0; opn < 3; opn++)
3914 xtensa_operand_encode (isa, opcode, opn, ®no);
3915 xtensa_operand_set_field (isa, opcode, opn, core_format, 0,
3918 xtensa_format_encode (isa, core_format, insnbuf);
3919 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
3920 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf, content_length - address);
3922 /* Assemble a CALL ("callN 0") into the 3 byte offset. */
3923 xtensa_opcode_encode (isa, core_format, 0, slotbuf, direct_call_opcode);
3924 xtensa_operand_set_field (isa, opcode, 0, core_format, 0, slotbuf, 0);
3926 xtensa_format_encode (isa, core_format, insnbuf);
3927 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
3928 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf + 3,
3929 content_length - address - 3);
3931 return bfd_reloc_ok;
3935 static bfd_reloc_status_type
3936 contract_asm_expansion (bfd_byte *contents,
3937 bfd_vma content_length,
3938 Elf_Internal_Rela *irel,
3939 char **error_message)
3941 bfd_reloc_status_type retval =
3942 elf_xtensa_do_asm_simplify (contents, irel->r_offset, content_length,
3945 if (retval != bfd_reloc_ok)
3946 return bfd_reloc_dangerous;
3948 /* Update the irel->r_offset field so that the right immediate and
3949 the right instruction are modified during the relocation. */
3950 irel->r_offset += 3;
3951 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_XTENSA_SLOT0_OP);
3952 return bfd_reloc_ok;
3956 static xtensa_opcode
3957 swap_callx_for_call_opcode (xtensa_opcode opcode)
3959 init_call_opcodes ();
3961 if (opcode == callx0_op) return call0_op;
3962 if (opcode == callx4_op) return call4_op;
3963 if (opcode == callx8_op) return call8_op;
3964 if (opcode == callx12_op) return call12_op;
3966 /* Return XTENSA_UNDEFINED if the opcode is not an indirect call. */
3967 return XTENSA_UNDEFINED;
3971 /* Check if "buf" is pointing to a "L32R aN; CALLX aN" or "CONST16 aN;
3972 CONST16 aN; CALLX aN" sequence, and if so, return the CALLX opcode.
3973 If not, return XTENSA_UNDEFINED. */
3975 #define L32R_TARGET_REG_OPERAND 0
3976 #define CONST16_TARGET_REG_OPERAND 0
3977 #define CALLN_SOURCE_OPERAND 0
3979 static xtensa_opcode
3980 get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
3982 static xtensa_insnbuf insnbuf = NULL;
3983 static xtensa_insnbuf slotbuf = NULL;
3985 xtensa_opcode opcode;
3986 xtensa_isa isa = xtensa_default_isa;
3987 uint32 regno, const16_regno, call_regno;
3990 if (insnbuf == NULL)
3992 insnbuf = xtensa_insnbuf_alloc (isa);
3993 slotbuf = xtensa_insnbuf_alloc (isa);
3996 xtensa_insnbuf_from_chars (isa, insnbuf, buf, bufsize);
3997 fmt = xtensa_format_decode (isa, insnbuf);
3998 if (fmt == XTENSA_UNDEFINED
3999 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4000 return XTENSA_UNDEFINED;
4002 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4003 if (opcode == XTENSA_UNDEFINED)
4004 return XTENSA_UNDEFINED;
4006 if (opcode == get_l32r_opcode ())
4009 *p_uses_l32r = TRUE;
4010 if (xtensa_operand_get_field (isa, opcode, L32R_TARGET_REG_OPERAND,
4011 fmt, 0, slotbuf, ®no)
4012 || xtensa_operand_decode (isa, opcode, L32R_TARGET_REG_OPERAND,
4014 return XTENSA_UNDEFINED;
4016 else if (opcode == get_const16_opcode ())
4019 *p_uses_l32r = FALSE;
4020 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4021 fmt, 0, slotbuf, ®no)
4022 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4024 return XTENSA_UNDEFINED;
4026 /* Check that the next instruction is also CONST16. */
4027 offset += xtensa_format_length (isa, fmt);
4028 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4029 fmt = xtensa_format_decode (isa, insnbuf);
4030 if (fmt == XTENSA_UNDEFINED
4031 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4032 return XTENSA_UNDEFINED;
4033 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4034 if (opcode != get_const16_opcode ())
4035 return XTENSA_UNDEFINED;
4037 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4038 fmt, 0, slotbuf, &const16_regno)
4039 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4041 || const16_regno != regno)
4042 return XTENSA_UNDEFINED;
4045 return XTENSA_UNDEFINED;
4047 /* Next instruction should be an CALLXn with operand 0 == regno. */
4048 offset += xtensa_format_length (isa, fmt);
4049 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4050 fmt = xtensa_format_decode (isa, insnbuf);
4051 if (fmt == XTENSA_UNDEFINED
4052 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4053 return XTENSA_UNDEFINED;
4054 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4055 if (opcode == XTENSA_UNDEFINED
4056 || !is_indirect_call_opcode (opcode))
4057 return XTENSA_UNDEFINED;
4059 if (xtensa_operand_get_field (isa, opcode, CALLN_SOURCE_OPERAND,
4060 fmt, 0, slotbuf, &call_regno)
4061 || xtensa_operand_decode (isa, opcode, CALLN_SOURCE_OPERAND,
4063 return XTENSA_UNDEFINED;
4065 if (call_regno != regno)
4066 return XTENSA_UNDEFINED;
4072 /* Data structures used during relaxation. */
4074 /* r_reloc: relocation values. */
4076 /* Through the relaxation process, we need to keep track of the values
4077 that will result from evaluating relocations. The standard ELF
4078 relocation structure is not sufficient for this purpose because we're
4079 operating on multiple input files at once, so we need to know which
4080 input file a relocation refers to. The r_reloc structure thus
4081 records both the input file (bfd) and ELF relocation.
4083 For efficiency, an r_reloc also contains a "target_offset" field to
4084 cache the target-section-relative offset value that is represented by
4087 The r_reloc also contains a virtual offset that allows multiple
4088 inserted literals to be placed at the same "address" with
4089 different offsets. */
4091 typedef struct r_reloc_struct r_reloc;
4093 struct r_reloc_struct
4096 Elf_Internal_Rela rela;
4097 bfd_vma target_offset;
4098 bfd_vma virtual_offset;
4102 /* The r_reloc structure is included by value in literal_value, but not
4103 every literal_value has an associated relocation -- some are simple
4104 constants. In such cases, we set all the fields in the r_reloc
4105 struct to zero. The r_reloc_is_const function should be used to
4106 detect this case. */
4109 r_reloc_is_const (const r_reloc *r_rel)
4111 return (r_rel->abfd == NULL);
4116 r_reloc_get_target_offset (const r_reloc *r_rel)
4118 bfd_vma target_offset;
4119 unsigned long r_symndx;
4121 BFD_ASSERT (!r_reloc_is_const (r_rel));
4122 r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4123 target_offset = get_elf_r_symndx_offset (r_rel->abfd, r_symndx);
4124 return (target_offset + r_rel->rela.r_addend);
4128 static struct elf_link_hash_entry *
4129 r_reloc_get_hash_entry (const r_reloc *r_rel)
4131 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4132 return get_elf_r_symndx_hash_entry (r_rel->abfd, r_symndx);
4137 r_reloc_get_section (const r_reloc *r_rel)
4139 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4140 return get_elf_r_symndx_section (r_rel->abfd, r_symndx);
4145 r_reloc_is_defined (const r_reloc *r_rel)
4151 sec = r_reloc_get_section (r_rel);
4152 if (sec == bfd_abs_section_ptr
4153 || sec == bfd_com_section_ptr
4154 || sec == bfd_und_section_ptr)
4161 r_reloc_init (r_reloc *r_rel,
4163 Elf_Internal_Rela *irel,
4165 bfd_size_type content_length)
4168 reloc_howto_type *howto;
4172 r_rel->rela = *irel;
4174 r_rel->target_offset = r_reloc_get_target_offset (r_rel);
4175 r_rel->virtual_offset = 0;
4176 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
4177 howto = &elf_howto_table[r_type];
4178 if (howto->partial_inplace)
4180 bfd_vma inplace_val;
4181 BFD_ASSERT (r_rel->rela.r_offset < content_length);
4183 inplace_val = bfd_get_32 (abfd, &contents[r_rel->rela.r_offset]);
4184 r_rel->target_offset += inplace_val;
4188 memset (r_rel, 0, sizeof (r_reloc));
4195 print_r_reloc (FILE *fp, const r_reloc *r_rel)
4197 if (r_reloc_is_defined (r_rel))
4199 asection *sec = r_reloc_get_section (r_rel);
4200 fprintf (fp, " %s(%s + ", sec->owner->filename, sec->name);
4202 else if (r_reloc_get_hash_entry (r_rel))
4203 fprintf (fp, " %s + ", r_reloc_get_hash_entry (r_rel)->root.root.string);
4205 fprintf (fp, " ?? + ");
4207 fprintf_vma (fp, r_rel->target_offset);
4208 if (r_rel->virtual_offset)
4210 fprintf (fp, " + ");
4211 fprintf_vma (fp, r_rel->virtual_offset);
4220 /* source_reloc: relocations that reference literals. */
4222 /* To determine whether literals can be coalesced, we need to first
4223 record all the relocations that reference the literals. The
4224 source_reloc structure below is used for this purpose. The
4225 source_reloc entries are kept in a per-literal-section array, sorted
4226 by offset within the literal section (i.e., target offset).
4228 The source_sec and r_rel.rela.r_offset fields identify the source of
4229 the relocation. The r_rel field records the relocation value, i.e.,
4230 the offset of the literal being referenced. The opnd field is needed
4231 to determine the range of the immediate field to which the relocation
4232 applies, so we can determine whether another literal with the same
4233 value is within range. The is_null field is true when the relocation
4234 is being removed (e.g., when an L32R is being removed due to a CALLX
4235 that is converted to a direct CALL). */
4237 typedef struct source_reloc_struct source_reloc;
4239 struct source_reloc_struct
4241 asection *source_sec;
4243 xtensa_opcode opcode;
4245 bfd_boolean is_null;
4246 bfd_boolean is_abs_literal;
4251 init_source_reloc (source_reloc *reloc,
4252 asection *source_sec,
4253 const r_reloc *r_rel,
4254 xtensa_opcode opcode,
4256 bfd_boolean is_abs_literal)
4258 reloc->source_sec = source_sec;
4259 reloc->r_rel = *r_rel;
4260 reloc->opcode = opcode;
4262 reloc->is_null = FALSE;
4263 reloc->is_abs_literal = is_abs_literal;
4267 /* Find the source_reloc for a particular source offset and relocation
4268 type. Note that the array is sorted by _target_ offset, so this is
4269 just a linear search. */
4271 static source_reloc *
4272 find_source_reloc (source_reloc *src_relocs,
4275 Elf_Internal_Rela *irel)
4279 for (i = 0; i < src_count; i++)
4281 if (src_relocs[i].source_sec == sec
4282 && src_relocs[i].r_rel.rela.r_offset == irel->r_offset
4283 && (ELF32_R_TYPE (src_relocs[i].r_rel.rela.r_info)
4284 == ELF32_R_TYPE (irel->r_info)))
4285 return &src_relocs[i];
4293 source_reloc_compare (const void *ap, const void *bp)
4295 const source_reloc *a = (const source_reloc *) ap;
4296 const source_reloc *b = (const source_reloc *) bp;
4298 if (a->r_rel.target_offset != b->r_rel.target_offset)
4299 return (a->r_rel.target_offset - b->r_rel.target_offset);
4301 /* We don't need to sort on these criteria for correctness,
4302 but enforcing a more strict ordering prevents unstable qsort
4303 from behaving differently with different implementations.
4304 Without the code below we get correct but different results
4305 on Solaris 2.7 and 2.8. We would like to always produce the
4306 same results no matter the host. */
4308 if ((!a->is_null) - (!b->is_null))
4309 return ((!a->is_null) - (!b->is_null));
4310 return internal_reloc_compare (&a->r_rel.rela, &b->r_rel.rela);
4314 /* Literal values and value hash tables. */
4316 /* Literals with the same value can be coalesced. The literal_value
4317 structure records the value of a literal: the "r_rel" field holds the
4318 information from the relocation on the literal (if there is one) and
4319 the "value" field holds the contents of the literal word itself.
4321 The value_map structure records a literal value along with the
4322 location of a literal holding that value. The value_map hash table
4323 is indexed by the literal value, so that we can quickly check if a
4324 particular literal value has been seen before and is thus a candidate
4327 typedef struct literal_value_struct literal_value;
4328 typedef struct value_map_struct value_map;
4329 typedef struct value_map_hash_table_struct value_map_hash_table;
4331 struct literal_value_struct
4334 unsigned long value;
4335 bfd_boolean is_abs_literal;
4338 struct value_map_struct
4340 literal_value val; /* The literal value. */
4341 r_reloc loc; /* Location of the literal. */
4345 struct value_map_hash_table_struct
4347 unsigned bucket_count;
4348 value_map **buckets;
4350 bfd_boolean has_last_loc;
4356 init_literal_value (literal_value *lit,
4357 const r_reloc *r_rel,
4358 unsigned long value,
4359 bfd_boolean is_abs_literal)
4361 lit->r_rel = *r_rel;
4363 lit->is_abs_literal = is_abs_literal;
4368 literal_value_equal (const literal_value *src1,
4369 const literal_value *src2,
4370 bfd_boolean final_static_link)
4372 struct elf_link_hash_entry *h1, *h2;
4374 if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
4377 if (r_reloc_is_const (&src1->r_rel))
4378 return (src1->value == src2->value);
4380 if (ELF32_R_TYPE (src1->r_rel.rela.r_info)
4381 != ELF32_R_TYPE (src2->r_rel.rela.r_info))
4384 if (src1->r_rel.target_offset != src2->r_rel.target_offset)
4387 if (src1->r_rel.virtual_offset != src2->r_rel.virtual_offset)
4390 if (src1->value != src2->value)
4393 /* Now check for the same section (if defined) or the same elf_hash
4394 (if undefined or weak). */
4395 h1 = r_reloc_get_hash_entry (&src1->r_rel);
4396 h2 = r_reloc_get_hash_entry (&src2->r_rel);
4397 if (r_reloc_is_defined (&src1->r_rel)
4398 && (final_static_link
4399 || ((!h1 || h1->root.type != bfd_link_hash_defweak)
4400 && (!h2 || h2->root.type != bfd_link_hash_defweak))))
4402 if (r_reloc_get_section (&src1->r_rel)
4403 != r_reloc_get_section (&src2->r_rel))
4408 /* Require that the hash entries (i.e., symbols) be identical. */
4409 if (h1 != h2 || h1 == 0)
4413 if (src1->is_abs_literal != src2->is_abs_literal)
4420 /* Must be power of 2. */
4421 #define INITIAL_HASH_RELOC_BUCKET_COUNT 1024
4423 static value_map_hash_table *
4424 value_map_hash_table_init (void)
4426 value_map_hash_table *values;
4428 values = (value_map_hash_table *)
4429 bfd_zmalloc (sizeof (value_map_hash_table));
4430 values->bucket_count = INITIAL_HASH_RELOC_BUCKET_COUNT;
4432 values->buckets = (value_map **)
4433 bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
4434 if (values->buckets == NULL)
4439 values->has_last_loc = FALSE;
4446 value_map_hash_table_delete (value_map_hash_table *table)
4448 free (table->buckets);
4454 hash_bfd_vma (bfd_vma val)
4456 return (val >> 2) + (val >> 10);
4461 literal_value_hash (const literal_value *src)
4465 hash_val = hash_bfd_vma (src->value);
4466 if (!r_reloc_is_const (&src->r_rel))
4470 hash_val += hash_bfd_vma (src->is_abs_literal * 1000);
4471 hash_val += hash_bfd_vma (src->r_rel.target_offset);
4472 hash_val += hash_bfd_vma (src->r_rel.virtual_offset);
4474 /* Now check for the same section and the same elf_hash. */
4475 if (r_reloc_is_defined (&src->r_rel))
4476 sec_or_hash = r_reloc_get_section (&src->r_rel);
4478 sec_or_hash = r_reloc_get_hash_entry (&src->r_rel);
4479 hash_val += hash_bfd_vma ((bfd_vma) (size_t) sec_or_hash);
4485 /* Check if the specified literal_value has been seen before. */
4488 value_map_get_cached_value (value_map_hash_table *map,
4489 const literal_value *val,
4490 bfd_boolean final_static_link)
4496 idx = literal_value_hash (val);
4497 idx = idx & (map->bucket_count - 1);
4498 bucket = map->buckets[idx];
4499 for (map_e = bucket; map_e; map_e = map_e->next)
4501 if (literal_value_equal (&map_e->val, val, final_static_link))
4508 /* Record a new literal value. It is illegal to call this if VALUE
4509 already has an entry here. */
4512 add_value_map (value_map_hash_table *map,
4513 const literal_value *val,
4515 bfd_boolean final_static_link)
4517 value_map **bucket_p;
4520 value_map *val_e = (value_map *) bfd_zmalloc (sizeof (value_map));
4523 bfd_set_error (bfd_error_no_memory);
4527 BFD_ASSERT (!value_map_get_cached_value (map, val, final_static_link));
4531 idx = literal_value_hash (val);
4532 idx = idx & (map->bucket_count - 1);
4533 bucket_p = &map->buckets[idx];
4535 val_e->next = *bucket_p;
4538 /* FIXME: Consider resizing the hash table if we get too many entries. */
4544 /* Lists of text actions (ta_) for narrowing, widening, longcall
4545 conversion, space fill, code & literal removal, etc. */
4547 /* The following text actions are generated:
4549 "ta_remove_insn" remove an instruction or instructions
4550 "ta_remove_longcall" convert longcall to call
4551 "ta_convert_longcall" convert longcall to nop/call
4552 "ta_narrow_insn" narrow a wide instruction
4553 "ta_widen" widen a narrow instruction
4554 "ta_fill" add fill or remove fill
4555 removed < 0 is a fill; branches to the fill address will be
4556 changed to address + fill size (e.g., address - removed)
4557 removed >= 0 branches to the fill address will stay unchanged
4558 "ta_remove_literal" remove a literal; this action is
4559 indicated when a literal is removed
4561 "ta_add_literal" insert a new literal; this action is
4562 indicated when a literal has been moved.
4563 It may use a virtual_offset because
4564 multiple literals can be placed at the
4567 For each of these text actions, we also record the number of bytes
4568 removed by performing the text action. In the case of a "ta_widen"
4569 or a "ta_fill" that adds space, the removed_bytes will be negative. */
4571 typedef struct text_action_struct text_action;
4572 typedef struct text_action_list_struct text_action_list;
4573 typedef enum text_action_enum_t text_action_t;
4575 enum text_action_enum_t
4578 ta_remove_insn, /* removed = -size */
4579 ta_remove_longcall, /* removed = -size */
4580 ta_convert_longcall, /* removed = 0 */
4581 ta_narrow_insn, /* removed = -1 */
4582 ta_widen_insn, /* removed = +1 */
4583 ta_fill, /* removed = +size */
4589 /* Structure for a text action record. */
4590 struct text_action_struct
4592 text_action_t action;
4593 asection *sec; /* Optional */
4595 bfd_vma virtual_offset; /* Zero except for adding literals. */
4597 literal_value value; /* Only valid when adding literals. */
4603 /* List of all of the actions taken on a text section. */
4604 struct text_action_list_struct
4610 static text_action *
4611 find_fill_action (text_action_list *l, asection *sec, bfd_vma offset)
4615 /* It is not necessary to fill at the end of a section. */
4616 if (sec->size == offset)
4619 for (m_p = &l->head; *m_p && (*m_p)->offset <= offset; m_p = &(*m_p)->next)
4621 text_action *t = *m_p;
4622 /* When the action is another fill at the same address,
4623 just increase the size. */
4624 if (t->offset == offset && t->action == ta_fill)
4632 compute_removed_action_diff (const text_action *ta,
4636 int removable_space)
4639 int current_removed = 0;
4642 current_removed = ta->removed_bytes;
4644 BFD_ASSERT (ta == NULL || ta->offset == offset);
4645 BFD_ASSERT (ta == NULL || ta->action == ta_fill);
4647 /* It is not necessary to fill at the end of a section. Clean this up. */
4648 if (sec->size == offset)
4649 new_removed = removable_space - 0;
4653 int added = -removed - current_removed;
4654 /* Ignore multiples of the section alignment. */
4655 added = ((1 << sec->alignment_power) - 1) & added;
4656 new_removed = (-added);
4658 /* Modify for removable. */
4659 space = removable_space - new_removed;
4660 new_removed = (removable_space
4661 - (((1 << sec->alignment_power) - 1) & space));
4663 return (new_removed - current_removed);
4668 adjust_fill_action (text_action *ta, int fill_diff)
4670 ta->removed_bytes += fill_diff;
4674 /* Add a modification action to the text. For the case of adding or
4675 removing space, modify any current fill and assume that
4676 "unreachable_space" bytes can be freely contracted. Note that a
4677 negative removed value is a fill. */
4680 text_action_add (text_action_list *l,
4681 text_action_t action,
4689 /* It is not necessary to fill at the end of a section. */
4690 if (action == ta_fill && sec->size == offset)
4693 /* It is not necessary to fill 0 bytes. */
4694 if (action == ta_fill && removed == 0)
4697 for (m_p = &l->head; *m_p && (*m_p)->offset <= offset; m_p = &(*m_p)->next)
4699 text_action *t = *m_p;
4700 /* When the action is another fill at the same address,
4701 just increase the size. */
4702 if (t->offset == offset && t->action == ta_fill && action == ta_fill)
4704 t->removed_bytes += removed;
4709 /* Create a new record and fill it up. */
4710 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
4711 ta->action = action;
4713 ta->offset = offset;
4714 ta->removed_bytes = removed;
4721 text_action_add_literal (text_action_list *l,
4722 text_action_t action,
4724 const literal_value *value,
4729 asection *sec = r_reloc_get_section (loc);
4730 bfd_vma offset = loc->target_offset;
4731 bfd_vma virtual_offset = loc->virtual_offset;
4733 BFD_ASSERT (action == ta_add_literal);
4735 for (m_p = &l->head; *m_p != NULL; m_p = &(*m_p)->next)
4737 if ((*m_p)->offset > offset
4738 && ((*m_p)->offset != offset
4739 || (*m_p)->virtual_offset > virtual_offset))
4743 /* Create a new record and fill it up. */
4744 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
4745 ta->action = action;
4747 ta->offset = offset;
4748 ta->virtual_offset = virtual_offset;
4750 ta->removed_bytes = removed;
4757 offset_with_removed_text (text_action_list *action_list, bfd_vma offset)
4762 for (r = action_list->head; r && r->offset <= offset; r = r->next)
4764 if (r->offset < offset
4765 || (r->action == ta_fill && r->removed_bytes < 0))
4766 removed += r->removed_bytes;
4769 return (offset - removed);
4774 action_list_count (text_action_list *action_list)
4776 text_action *r = action_list->head;
4778 for (r = action_list->head; r != NULL; r = r->next)
4787 offset_with_removed_text_before_fill (text_action_list *action_list,
4793 for (r = action_list->head; r && r->offset < offset; r = r->next)
4794 removed += r->removed_bytes;
4796 return (offset - removed);
4800 /* The find_insn_action routine will only find non-fill actions. */
4802 static text_action *
4803 find_insn_action (text_action_list *action_list, bfd_vma offset)
4806 for (t = action_list->head; t; t = t->next)
4808 if (t->offset == offset)
4815 case ta_remove_insn:
4816 case ta_remove_longcall:
4817 case ta_convert_longcall:
4818 case ta_narrow_insn:
4821 case ta_remove_literal:
4822 case ta_add_literal:
4835 print_action_list (FILE *fp, text_action_list *action_list)
4839 fprintf (fp, "Text Action\n");
4840 for (r = action_list->head; r != NULL; r = r->next)
4842 const char *t = "unknown";
4845 case ta_remove_insn:
4846 t = "remove_insn"; break;
4847 case ta_remove_longcall:
4848 t = "remove_longcall"; break;
4849 case ta_convert_longcall:
4850 t = "remove_longcall"; break;
4851 case ta_narrow_insn:
4852 t = "narrow_insn"; break;
4854 t = "widen_insn"; break;
4859 case ta_remove_literal:
4860 t = "remove_literal"; break;
4861 case ta_add_literal:
4862 t = "add_literal"; break;
4865 fprintf (fp, "%s: %s[0x%lx] \"%s\" %d\n",
4866 r->sec->owner->filename,
4867 r->sec->name, r->offset, t, r->removed_bytes);
4874 /* Lists of literals being coalesced or removed. */
4876 /* In the usual case, the literal identified by "from" is being
4877 coalesced with another literal identified by "to". If the literal is
4878 unused and is being removed altogether, "to.abfd" will be NULL.
4879 The removed_literal entries are kept on a per-section list, sorted
4880 by the "from" offset field. */
4882 typedef struct removed_literal_struct removed_literal;
4883 typedef struct removed_literal_list_struct removed_literal_list;
4885 struct removed_literal_struct
4889 removed_literal *next;
4892 struct removed_literal_list_struct
4894 removed_literal *head;
4895 removed_literal *tail;
4899 /* Record that the literal at "from" is being removed. If "to" is not
4900 NULL, the "from" literal is being coalesced with the "to" literal. */
4903 add_removed_literal (removed_literal_list *removed_list,
4904 const r_reloc *from,
4907 removed_literal *r, *new_r, *next_r;
4909 new_r = (removed_literal *) bfd_zmalloc (sizeof (removed_literal));
4911 new_r->from = *from;
4915 new_r->to.abfd = NULL;
4918 r = removed_list->head;
4921 removed_list->head = new_r;
4922 removed_list->tail = new_r;
4924 /* Special check for common case of append. */
4925 else if (removed_list->tail->from.target_offset < from->target_offset)
4927 removed_list->tail->next = new_r;
4928 removed_list->tail = new_r;
4932 while (r->from.target_offset < from->target_offset && r->next)
4938 new_r->next = next_r;
4940 removed_list->tail = new_r;
4945 /* Check if the list of removed literals contains an entry for the
4946 given address. Return the entry if found. */
4948 static removed_literal *
4949 find_removed_literal (removed_literal_list *removed_list, bfd_vma addr)
4951 removed_literal *r = removed_list->head;
4952 while (r && r->from.target_offset < addr)
4954 if (r && r->from.target_offset == addr)
4963 print_removed_literals (FILE *fp, removed_literal_list *removed_list)
4966 r = removed_list->head;
4968 fprintf (fp, "Removed Literals\n");
4969 for (; r != NULL; r = r->next)
4971 print_r_reloc (fp, &r->from);
4972 fprintf (fp, " => ");
4973 if (r->to.abfd == NULL)
4974 fprintf (fp, "REMOVED");
4976 print_r_reloc (fp, &r->to);
4984 /* Per-section data for relaxation. */
4986 typedef struct reloc_bfd_fix_struct reloc_bfd_fix;
4988 struct xtensa_relax_info_struct
4990 bfd_boolean is_relaxable_literal_section;
4991 bfd_boolean is_relaxable_asm_section;
4992 int visited; /* Number of times visited. */
4994 source_reloc *src_relocs; /* Array[src_count]. */
4996 int src_next; /* Next src_relocs entry to assign. */
4998 removed_literal_list removed_list;
4999 text_action_list action_list;
5001 reloc_bfd_fix *fix_list;
5002 reloc_bfd_fix *fix_array;
5003 unsigned fix_array_count;
5005 /* Support for expanding the reloc array that is stored
5006 in the section structure. If the relocations have been
5007 reallocated, the newly allocated relocations will be referenced
5008 here along with the actual size allocated. The relocation
5009 count will always be found in the section structure. */
5010 Elf_Internal_Rela *allocated_relocs;
5011 unsigned relocs_count;
5012 unsigned allocated_relocs_count;
5015 struct elf_xtensa_section_data
5017 struct bfd_elf_section_data elf;
5018 xtensa_relax_info relax_info;
5023 elf_xtensa_new_section_hook (bfd *abfd, asection *sec)
5025 if (!sec->used_by_bfd)
5027 struct elf_xtensa_section_data *sdata;
5028 bfd_size_type amt = sizeof (*sdata);
5030 sdata = bfd_zalloc (abfd, amt);
5033 sec->used_by_bfd = sdata;
5036 return _bfd_elf_new_section_hook (abfd, sec);
5040 static xtensa_relax_info *
5041 get_xtensa_relax_info (asection *sec)
5043 struct elf_xtensa_section_data *section_data;
5045 /* No info available if no section or if it is an output section. */
5046 if (!sec || sec == sec->output_section)
5049 section_data = (struct elf_xtensa_section_data *) elf_section_data (sec);
5050 return §ion_data->relax_info;
5055 init_xtensa_relax_info (asection *sec)
5057 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
5059 relax_info->is_relaxable_literal_section = FALSE;
5060 relax_info->is_relaxable_asm_section = FALSE;
5061 relax_info->visited = 0;
5063 relax_info->src_relocs = NULL;
5064 relax_info->src_count = 0;
5065 relax_info->src_next = 0;
5067 relax_info->removed_list.head = NULL;
5068 relax_info->removed_list.tail = NULL;
5070 relax_info->action_list.head = NULL;
5072 relax_info->fix_list = NULL;
5073 relax_info->fix_array = NULL;
5074 relax_info->fix_array_count = 0;
5076 relax_info->allocated_relocs = NULL;
5077 relax_info->relocs_count = 0;
5078 relax_info->allocated_relocs_count = 0;
5082 /* Coalescing literals may require a relocation to refer to a section in
5083 a different input file, but the standard relocation information
5084 cannot express that. Instead, the reloc_bfd_fix structures are used
5085 to "fix" the relocations that refer to sections in other input files.
5086 These structures are kept on per-section lists. The "src_type" field
5087 records the relocation type in case there are multiple relocations on
5088 the same location. FIXME: This is ugly; an alternative might be to
5089 add new symbols with the "owner" field to some other input file. */
5091 struct reloc_bfd_fix_struct
5095 unsigned src_type; /* Relocation type. */
5098 asection *target_sec;
5099 bfd_vma target_offset;
5100 bfd_boolean translated;
5102 reloc_bfd_fix *next;
5106 static reloc_bfd_fix *
5107 reloc_bfd_fix_init (asection *src_sec,
5111 asection *target_sec,
5112 bfd_vma target_offset,
5113 bfd_boolean translated)
5117 fix = (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix));
5118 fix->src_sec = src_sec;
5119 fix->src_offset = src_offset;
5120 fix->src_type = src_type;
5121 fix->target_abfd = target_abfd;
5122 fix->target_sec = target_sec;
5123 fix->target_offset = target_offset;
5124 fix->translated = translated;
5131 add_fix (asection *src_sec, reloc_bfd_fix *fix)
5133 xtensa_relax_info *relax_info;
5135 relax_info = get_xtensa_relax_info (src_sec);
5136 fix->next = relax_info->fix_list;
5137 relax_info->fix_list = fix;
5142 fix_compare (const void *ap, const void *bp)
5144 const reloc_bfd_fix *a = (const reloc_bfd_fix *) ap;
5145 const reloc_bfd_fix *b = (const reloc_bfd_fix *) bp;
5147 if (a->src_offset != b->src_offset)
5148 return (a->src_offset - b->src_offset);
5149 return (a->src_type - b->src_type);
5154 cache_fix_array (asection *sec)
5156 unsigned i, count = 0;
5158 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
5160 if (relax_info == NULL)
5162 if (relax_info->fix_list == NULL)
5165 for (r = relax_info->fix_list; r != NULL; r = r->next)
5168 relax_info->fix_array =
5169 (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix) * count);
5170 relax_info->fix_array_count = count;
5172 r = relax_info->fix_list;
5173 for (i = 0; i < count; i++, r = r->next)
5175 relax_info->fix_array[count - 1 - i] = *r;
5176 relax_info->fix_array[count - 1 - i].next = NULL;
5179 qsort (relax_info->fix_array, relax_info->fix_array_count,
5180 sizeof (reloc_bfd_fix), fix_compare);
5184 static reloc_bfd_fix *
5185 get_bfd_fix (asection *sec, bfd_vma offset, unsigned type)
5187 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
5191 if (relax_info == NULL)
5193 if (relax_info->fix_list == NULL)
5196 if (relax_info->fix_array == NULL)
5197 cache_fix_array (sec);
5199 key.src_offset = offset;
5200 key.src_type = type;
5201 rv = bsearch (&key, relax_info->fix_array, relax_info->fix_array_count,
5202 sizeof (reloc_bfd_fix), fix_compare);
5207 /* Section caching. */
5209 typedef struct section_cache_struct section_cache_t;
5211 struct section_cache_struct
5215 bfd_byte *contents; /* Cache of the section contents. */
5216 bfd_size_type content_length;
5218 property_table_entry *ptbl; /* Cache of the section property table. */
5221 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
5222 unsigned reloc_count;
5227 init_section_cache (section_cache_t *sec_cache)
5229 memset (sec_cache, 0, sizeof (*sec_cache));
5234 clear_section_cache (section_cache_t *sec_cache)
5238 release_contents (sec_cache->sec, sec_cache->contents);
5239 release_internal_relocs (sec_cache->sec, sec_cache->relocs);
5240 if (sec_cache->ptbl)
5241 free (sec_cache->ptbl);
5242 memset (sec_cache, 0, sizeof (sec_cache));
5248 section_cache_section (section_cache_t *sec_cache,
5250 struct bfd_link_info *link_info)
5253 property_table_entry *prop_table = NULL;
5255 bfd_byte *contents = NULL;
5256 Elf_Internal_Rela *internal_relocs = NULL;
5257 bfd_size_type sec_size;
5261 if (sec == sec_cache->sec)
5265 sec_size = bfd_get_section_limit (abfd, sec);
5267 /* Get the contents. */
5268 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
5269 if (contents == NULL && sec_size != 0)
5272 /* Get the relocations. */
5273 internal_relocs = retrieve_internal_relocs (abfd, sec,
5274 link_info->keep_memory);
5276 /* Get the entry table. */
5277 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
5278 XTENSA_PROP_SEC_NAME, FALSE);
5282 /* Fill in the new section cache. */
5283 clear_section_cache (sec_cache);
5284 memset (sec_cache, 0, sizeof (sec_cache));
5286 sec_cache->sec = sec;
5287 sec_cache->contents = contents;
5288 sec_cache->content_length = sec_size;
5289 sec_cache->relocs = internal_relocs;
5290 sec_cache->reloc_count = sec->reloc_count;
5291 sec_cache->pte_count = ptblsize;
5292 sec_cache->ptbl = prop_table;
5297 release_contents (sec, contents);
5298 release_internal_relocs (sec, internal_relocs);
5305 /* Extended basic blocks. */
5307 /* An ebb_struct represents an Extended Basic Block. Within this
5308 range, we guarantee that all instructions are decodable, the
5309 property table entries are contiguous, and no property table
5310 specifies a segment that cannot have instructions moved. This
5311 structure contains caches of the contents, property table and
5312 relocations for the specified section for easy use. The range is
5313 specified by ranges of indices for the byte offset, property table
5314 offsets and relocation offsets. These must be consistent. */
5316 typedef struct ebb_struct ebb_t;
5322 bfd_byte *contents; /* Cache of the section contents. */
5323 bfd_size_type content_length;
5325 property_table_entry *ptbl; /* Cache of the section property table. */
5328 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
5329 unsigned reloc_count;
5331 bfd_vma start_offset; /* Offset in section. */
5332 unsigned start_ptbl_idx; /* Offset in the property table. */
5333 unsigned start_reloc_idx; /* Offset in the relocations. */
5336 unsigned end_ptbl_idx;
5337 unsigned end_reloc_idx;
5339 bfd_boolean ends_section; /* Is this the last ebb in a section? */
5341 /* The unreachable property table at the end of this set of blocks;
5342 NULL if the end is not an unreachable block. */
5343 property_table_entry *ends_unreachable;
5347 enum ebb_target_enum
5350 EBB_DESIRE_TGT_ALIGN,
5351 EBB_REQUIRE_TGT_ALIGN,
5352 EBB_REQUIRE_LOOP_ALIGN,
5357 /* proposed_action_struct is similar to the text_action_struct except
5358 that is represents a potential transformation, not one that will
5359 occur. We build a list of these for an extended basic block
5360 and use them to compute the actual actions desired. We must be
5361 careful that the entire set of actual actions we perform do not
5362 break any relocations that would fit if the actions were not
5365 typedef struct proposed_action_struct proposed_action;
5367 struct proposed_action_struct
5369 enum ebb_target_enum align_type; /* for the target alignment */
5370 bfd_vma alignment_pow;
5371 text_action_t action;
5374 bfd_boolean do_action; /* If false, then we will not perform the action. */
5378 /* The ebb_constraint_struct keeps a set of proposed actions for an
5379 extended basic block. */
5381 typedef struct ebb_constraint_struct ebb_constraint;
5383 struct ebb_constraint_struct
5386 bfd_boolean start_movable;
5388 /* Bytes of extra space at the beginning if movable. */
5389 int start_extra_space;
5391 enum ebb_target_enum start_align;
5393 bfd_boolean end_movable;
5395 /* Bytes of extra space at the end if movable. */
5396 int end_extra_space;
5398 unsigned action_count;
5399 unsigned action_allocated;
5401 /* Array of proposed actions. */
5402 proposed_action *actions;
5404 /* Action alignments -- one for each proposed action. */
5405 enum ebb_target_enum *action_aligns;
5410 init_ebb_constraint (ebb_constraint *c)
5412 memset (c, 0, sizeof (ebb_constraint));
5417 free_ebb_constraint (ebb_constraint *c)
5425 init_ebb (ebb_t *ebb,
5428 bfd_size_type content_length,
5429 property_table_entry *prop_table,
5431 Elf_Internal_Rela *internal_relocs,
5432 unsigned reloc_count)
5434 memset (ebb, 0, sizeof (ebb_t));
5436 ebb->contents = contents;
5437 ebb->content_length = content_length;
5438 ebb->ptbl = prop_table;
5439 ebb->pte_count = ptblsize;
5440 ebb->relocs = internal_relocs;
5441 ebb->reloc_count = reloc_count;
5442 ebb->start_offset = 0;
5443 ebb->end_offset = ebb->content_length - 1;
5444 ebb->start_ptbl_idx = 0;
5445 ebb->end_ptbl_idx = ptblsize;
5446 ebb->start_reloc_idx = 0;
5447 ebb->end_reloc_idx = reloc_count;
5451 /* Extend the ebb to all decodable contiguous sections. The algorithm
5452 for building a basic block around an instruction is to push it
5453 forward until we hit the end of a section, an unreachable block or
5454 a block that cannot be transformed. Then we push it backwards
5455 searching for similar conditions. */
5457 static bfd_boolean extend_ebb_bounds_forward (ebb_t *);
5458 static bfd_boolean extend_ebb_bounds_backward (ebb_t *);
5459 static bfd_size_type insn_block_decodable_len
5460 (bfd_byte *, bfd_size_type, bfd_vma, bfd_size_type);
5463 extend_ebb_bounds (ebb_t *ebb)
5465 if (!extend_ebb_bounds_forward (ebb))
5467 if (!extend_ebb_bounds_backward (ebb))
5474 extend_ebb_bounds_forward (ebb_t *ebb)
5476 property_table_entry *the_entry, *new_entry;
5478 the_entry = &ebb->ptbl[ebb->end_ptbl_idx];
5480 /* Stop when (1) we cannot decode an instruction, (2) we are at
5481 the end of the property tables, (3) we hit a non-contiguous property
5482 table entry, (4) we hit a NO_TRANSFORM region. */
5487 bfd_size_type insn_block_len;
5489 entry_end = the_entry->address - ebb->sec->vma + the_entry->size;
5491 insn_block_decodable_len (ebb->contents, ebb->content_length,
5493 entry_end - ebb->end_offset);
5494 if (insn_block_len != (entry_end - ebb->end_offset))
5496 (*_bfd_error_handler)
5497 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
5498 ebb->sec->owner, ebb->sec, ebb->end_offset + insn_block_len);
5501 ebb->end_offset += insn_block_len;
5503 if (ebb->end_offset == ebb->sec->size)
5504 ebb->ends_section = TRUE;
5506 /* Update the reloc counter. */
5507 while (ebb->end_reloc_idx + 1 < ebb->reloc_count
5508 && (ebb->relocs[ebb->end_reloc_idx + 1].r_offset
5511 ebb->end_reloc_idx++;
5514 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
5517 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
5518 if (((new_entry->flags & XTENSA_PROP_INSN) == 0)
5519 || ((new_entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) != 0)
5520 || ((the_entry->flags & XTENSA_PROP_ALIGN) != 0))
5523 if (the_entry->address + the_entry->size != new_entry->address)
5526 the_entry = new_entry;
5527 ebb->end_ptbl_idx++;
5530 /* Quick check for an unreachable or end of file just at the end. */
5531 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
5533 if (ebb->end_offset == ebb->content_length)
5534 ebb->ends_section = TRUE;
5538 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
5539 if ((new_entry->flags & XTENSA_PROP_UNREACHABLE) != 0
5540 && the_entry->address + the_entry->size == new_entry->address)
5541 ebb->ends_unreachable = new_entry;
5544 /* Any other ending requires exact alignment. */
5550 extend_ebb_bounds_backward (ebb_t *ebb)
5552 property_table_entry *the_entry, *new_entry;
5554 the_entry = &ebb->ptbl[ebb->start_ptbl_idx];
5556 /* Stop when (1) we cannot decode the instructions in the current entry.
5557 (2) we are at the beginning of the property tables, (3) we hit a
5558 non-contiguous property table entry, (4) we hit a NO_TRANSFORM region. */
5562 bfd_vma block_begin;
5563 bfd_size_type insn_block_len;
5565 block_begin = the_entry->address - ebb->sec->vma;
5567 insn_block_decodable_len (ebb->contents, ebb->content_length,
5569 ebb->start_offset - block_begin);
5570 if (insn_block_len != ebb->start_offset - block_begin)
5572 (*_bfd_error_handler)
5573 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
5574 ebb->sec->owner, ebb->sec, ebb->end_offset + insn_block_len);
5577 ebb->start_offset -= insn_block_len;
5579 /* Update the reloc counter. */
5580 while (ebb->start_reloc_idx > 0
5581 && (ebb->relocs[ebb->start_reloc_idx - 1].r_offset
5582 >= ebb->start_offset))
5584 ebb->start_reloc_idx--;
5587 if (ebb->start_ptbl_idx == 0)
5590 new_entry = &ebb->ptbl[ebb->start_ptbl_idx - 1];
5591 if ((new_entry->flags & XTENSA_PROP_INSN) == 0
5592 || ((new_entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) != 0)
5593 || ((new_entry->flags & XTENSA_PROP_ALIGN) != 0))
5595 if (new_entry->address + new_entry->size != the_entry->address)
5598 the_entry = new_entry;
5599 ebb->start_ptbl_idx--;
5605 static bfd_size_type
5606 insn_block_decodable_len (bfd_byte *contents,
5607 bfd_size_type content_len,
5608 bfd_vma block_offset,
5609 bfd_size_type block_len)
5611 bfd_vma offset = block_offset;
5613 while (offset < block_offset + block_len)
5615 bfd_size_type insn_len = 0;
5617 insn_len = insn_decode_len (contents, content_len, offset);
5619 return (offset - block_offset);
5622 return (offset - block_offset);
5627 ebb_propose_action (ebb_constraint *c,
5628 enum ebb_target_enum align_type,
5629 bfd_vma alignment_pow,
5630 text_action_t action,
5633 bfd_boolean do_action)
5635 proposed_action *act;
5637 if (c->action_allocated <= c->action_count)
5639 unsigned new_allocated, i;
5640 proposed_action *new_actions;
5642 new_allocated = (c->action_count + 2) * 2;
5643 new_actions = (proposed_action *)
5644 bfd_zmalloc (sizeof (proposed_action) * new_allocated);
5646 for (i = 0; i < c->action_count; i++)
5647 new_actions[i] = c->actions[i];
5650 c->actions = new_actions;
5651 c->action_allocated = new_allocated;
5654 act = &c->actions[c->action_count];
5655 act->align_type = align_type;
5656 act->alignment_pow = alignment_pow;
5657 act->action = action;
5658 act->offset = offset;
5659 act->removed_bytes = removed_bytes;
5660 act->do_action = do_action;
5666 /* Access to internal relocations, section contents and symbols. */
5668 /* During relaxation, we need to modify relocations, section contents,
5669 and symbol definitions, and we need to keep the original values from
5670 being reloaded from the input files, i.e., we need to "pin" the
5671 modified values in memory. We also want to continue to observe the
5672 setting of the "keep-memory" flag. The following functions wrap the
5673 standard BFD functions to take care of this for us. */
5675 static Elf_Internal_Rela *
5676 retrieve_internal_relocs (bfd *abfd, asection *sec, bfd_boolean keep_memory)
5678 Elf_Internal_Rela *internal_relocs;
5680 if ((sec->flags & SEC_LINKER_CREATED) != 0)
5683 internal_relocs = elf_section_data (sec)->relocs;
5684 if (internal_relocs == NULL)
5685 internal_relocs = (_bfd_elf_link_read_relocs
5686 (abfd, sec, NULL, NULL, keep_memory));
5687 return internal_relocs;
5692 pin_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
5694 elf_section_data (sec)->relocs = internal_relocs;
5699 release_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
5702 && elf_section_data (sec)->relocs != internal_relocs)
5703 free (internal_relocs);
5708 retrieve_contents (bfd *abfd, asection *sec, bfd_boolean keep_memory)
5711 bfd_size_type sec_size;
5713 sec_size = bfd_get_section_limit (abfd, sec);
5714 contents = elf_section_data (sec)->this_hdr.contents;
5716 if (contents == NULL && sec_size != 0)
5718 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
5725 elf_section_data (sec)->this_hdr.contents = contents;
5732 pin_contents (asection *sec, bfd_byte *contents)
5734 elf_section_data (sec)->this_hdr.contents = contents;
5739 release_contents (asection *sec, bfd_byte *contents)
5741 if (contents && elf_section_data (sec)->this_hdr.contents != contents)
5746 static Elf_Internal_Sym *
5747 retrieve_local_syms (bfd *input_bfd)
5749 Elf_Internal_Shdr *symtab_hdr;
5750 Elf_Internal_Sym *isymbuf;
5753 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5754 locsymcount = symtab_hdr->sh_info;
5756 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5757 if (isymbuf == NULL && locsymcount != 0)
5758 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
5761 /* Save the symbols for this input file so they won't be read again. */
5762 if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
5763 symtab_hdr->contents = (unsigned char *) isymbuf;
5769 /* Code for link-time relaxation. */
5771 /* Initialization for relaxation: */
5772 static bfd_boolean analyze_relocations (struct bfd_link_info *);
5773 static bfd_boolean find_relaxable_sections
5774 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
5775 static bfd_boolean collect_source_relocs
5776 (bfd *, asection *, struct bfd_link_info *);
5777 static bfd_boolean is_resolvable_asm_expansion
5778 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, struct bfd_link_info *,
5780 static Elf_Internal_Rela *find_associated_l32r_irel
5781 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Rela *);
5782 static bfd_boolean compute_text_actions
5783 (bfd *, asection *, struct bfd_link_info *);
5784 static bfd_boolean compute_ebb_proposed_actions (ebb_constraint *);
5785 static bfd_boolean compute_ebb_actions (ebb_constraint *);
5786 static bfd_boolean check_section_ebb_pcrels_fit
5787 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, const ebb_constraint *,
5788 const xtensa_opcode *);
5789 static bfd_boolean check_section_ebb_reduces (const ebb_constraint *);
5790 static void text_action_add_proposed
5791 (text_action_list *, const ebb_constraint *, asection *);
5792 static int compute_fill_extra_space (property_table_entry *);
5795 static bfd_boolean compute_removed_literals
5796 (bfd *, asection *, struct bfd_link_info *, value_map_hash_table *);
5797 static Elf_Internal_Rela *get_irel_at_offset
5798 (asection *, Elf_Internal_Rela *, bfd_vma);
5799 static bfd_boolean is_removable_literal
5800 (const source_reloc *, int, const source_reloc *, int);
5801 static bfd_boolean remove_dead_literal
5802 (bfd *, asection *, struct bfd_link_info *, Elf_Internal_Rela *,
5803 Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
5804 static bfd_boolean identify_literal_placement
5805 (bfd *, asection *, bfd_byte *, struct bfd_link_info *,
5806 value_map_hash_table *, bfd_boolean *, Elf_Internal_Rela *, int,
5807 source_reloc *, property_table_entry *, int, section_cache_t *,
5809 static bfd_boolean relocations_reach (source_reloc *, int, const r_reloc *);
5810 static bfd_boolean coalesce_shared_literal
5811 (asection *, source_reloc *, property_table_entry *, int, value_map *);
5812 static bfd_boolean move_shared_literal
5813 (asection *, struct bfd_link_info *, source_reloc *, property_table_entry *,
5814 int, const r_reloc *, const literal_value *, section_cache_t *);
5817 static bfd_boolean relax_section (bfd *, asection *, struct bfd_link_info *);
5818 static bfd_boolean translate_section_fixes (asection *);
5819 static bfd_boolean translate_reloc_bfd_fix (reloc_bfd_fix *);
5820 static void translate_reloc (const r_reloc *, r_reloc *);
5821 static void shrink_dynamic_reloc_sections
5822 (struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *);
5823 static bfd_boolean move_literal
5824 (bfd *, struct bfd_link_info *, asection *, bfd_vma, bfd_byte *,
5825 xtensa_relax_info *, Elf_Internal_Rela **, const literal_value *);
5826 static bfd_boolean relax_property_section
5827 (bfd *, asection *, struct bfd_link_info *);
5830 static bfd_boolean relax_section_symbols (bfd *, asection *);
5834 elf_xtensa_relax_section (bfd *abfd,
5836 struct bfd_link_info *link_info,
5839 static value_map_hash_table *values = NULL;
5840 static bfd_boolean relocations_analyzed = FALSE;
5841 xtensa_relax_info *relax_info;
5843 if (!relocations_analyzed)
5845 /* Do some overall initialization for relaxation. */
5846 values = value_map_hash_table_init ();
5849 relaxing_section = TRUE;
5850 if (!analyze_relocations (link_info))
5852 relocations_analyzed = TRUE;
5856 /* Don't mess with linker-created sections. */
5857 if ((sec->flags & SEC_LINKER_CREATED) != 0)
5860 relax_info = get_xtensa_relax_info (sec);
5861 BFD_ASSERT (relax_info != NULL);
5863 switch (relax_info->visited)
5866 /* Note: It would be nice to fold this pass into
5867 analyze_relocations, but it is important for this step that the
5868 sections be examined in link order. */
5869 if (!compute_removed_literals (abfd, sec, link_info, values))
5876 value_map_hash_table_delete (values);
5878 if (!relax_section (abfd, sec, link_info))
5884 if (!relax_section_symbols (abfd, sec))
5889 relax_info->visited++;
5894 /* Initialization for relaxation. */
5896 /* This function is called once at the start of relaxation. It scans
5897 all the input sections and marks the ones that are relaxable (i.e.,
5898 literal sections with L32R relocations against them), and then
5899 collects source_reloc information for all the relocations against
5900 those relaxable sections. During this process, it also detects
5901 longcalls, i.e., calls relaxed by the assembler into indirect
5902 calls, that can be optimized back into direct calls. Within each
5903 extended basic block (ebb) containing an optimized longcall, it
5904 computes a set of "text actions" that can be performed to remove
5905 the L32R associated with the longcall while optionally preserving
5906 branch target alignments. */
5909 analyze_relocations (struct bfd_link_info *link_info)
5913 bfd_boolean is_relaxable = FALSE;
5915 /* Initialize the per-section relaxation info. */
5916 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5917 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5919 init_xtensa_relax_info (sec);
5922 /* Mark relaxable sections (and count relocations against each one). */
5923 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5924 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5926 if (!find_relaxable_sections (abfd, sec, link_info, &is_relaxable))
5930 /* Bail out if there are no relaxable sections. */
5934 /* Allocate space for source_relocs. */
5935 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5936 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5938 xtensa_relax_info *relax_info;
5940 relax_info = get_xtensa_relax_info (sec);
5941 if (relax_info->is_relaxable_literal_section
5942 || relax_info->is_relaxable_asm_section)
5944 relax_info->src_relocs = (source_reloc *)
5945 bfd_malloc (relax_info->src_count * sizeof (source_reloc));
5949 /* Collect info on relocations against each relaxable section. */
5950 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5951 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5953 if (!collect_source_relocs (abfd, sec, link_info))
5957 /* Compute the text actions. */
5958 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5959 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5961 if (!compute_text_actions (abfd, sec, link_info))
5969 /* Find all the sections that might be relaxed. The motivation for
5970 this pass is that collect_source_relocs() needs to record _all_ the
5971 relocations that target each relaxable section. That is expensive
5972 and unnecessary unless the target section is actually going to be
5973 relaxed. This pass identifies all such sections by checking if
5974 they have L32Rs pointing to them. In the process, the total number
5975 of relocations targeting each section is also counted so that we
5976 know how much space to allocate for source_relocs against each
5977 relaxable literal section. */
5980 find_relaxable_sections (bfd *abfd,
5982 struct bfd_link_info *link_info,
5983 bfd_boolean *is_relaxable_p)
5985 Elf_Internal_Rela *internal_relocs;
5987 bfd_boolean ok = TRUE;
5989 xtensa_relax_info *source_relax_info;
5991 internal_relocs = retrieve_internal_relocs (abfd, sec,
5992 link_info->keep_memory);
5993 if (internal_relocs == NULL)
5996 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
5997 if (contents == NULL && sec->size != 0)
6003 source_relax_info = get_xtensa_relax_info (sec);
6004 for (i = 0; i < sec->reloc_count; i++)
6006 Elf_Internal_Rela *irel = &internal_relocs[i];
6008 asection *target_sec;
6009 xtensa_relax_info *target_relax_info;
6011 /* If this section has not already been marked as "relaxable", and
6012 if it contains any ASM_EXPAND relocations (marking expanded
6013 longcalls) that can be optimized into direct calls, then mark
6014 the section as "relaxable". */
6015 if (source_relax_info
6016 && !source_relax_info->is_relaxable_asm_section
6017 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_EXPAND)
6019 bfd_boolean is_reachable = FALSE;
6020 if (is_resolvable_asm_expansion (abfd, sec, contents, irel,
6021 link_info, &is_reachable)
6024 source_relax_info->is_relaxable_asm_section = TRUE;
6025 *is_relaxable_p = TRUE;
6029 r_reloc_init (&r_rel, abfd, irel, contents,
6030 bfd_get_section_limit (abfd, sec));
6032 target_sec = r_reloc_get_section (&r_rel);
6033 target_relax_info = get_xtensa_relax_info (target_sec);
6034 if (!target_relax_info)
6037 /* Count PC-relative operand relocations against the target section.
6038 Note: The conditions tested here must match the conditions under
6039 which init_source_reloc is called in collect_source_relocs(). */
6040 if (is_operand_relocation (ELF32_R_TYPE (irel->r_info))
6041 && (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
6042 || is_l32r_relocation (abfd, sec, contents, irel)))
6043 target_relax_info->src_count++;
6045 if (is_l32r_relocation (abfd, sec, contents, irel)
6046 && r_reloc_is_defined (&r_rel))
6048 /* Mark the target section as relaxable. */
6049 target_relax_info->is_relaxable_literal_section = TRUE;
6050 *is_relaxable_p = TRUE;
6055 release_contents (sec, contents);
6056 release_internal_relocs (sec, internal_relocs);
6061 /* Record _all_ the relocations that point to relaxable sections, and
6062 get rid of ASM_EXPAND relocs by either converting them to
6063 ASM_SIMPLIFY or by removing them. */
6066 collect_source_relocs (bfd *abfd,
6068 struct bfd_link_info *link_info)
6070 Elf_Internal_Rela *internal_relocs;
6072 bfd_boolean ok = TRUE;
6074 bfd_size_type sec_size;
6076 internal_relocs = retrieve_internal_relocs (abfd, sec,
6077 link_info->keep_memory);
6078 if (internal_relocs == NULL)
6081 sec_size = bfd_get_section_limit (abfd, sec);
6082 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6083 if (contents == NULL && sec_size != 0)
6089 /* Record relocations against relaxable literal sections. */
6090 for (i = 0; i < sec->reloc_count; i++)
6092 Elf_Internal_Rela *irel = &internal_relocs[i];
6094 asection *target_sec;
6095 xtensa_relax_info *target_relax_info;
6097 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
6099 target_sec = r_reloc_get_section (&r_rel);
6100 target_relax_info = get_xtensa_relax_info (target_sec);
6102 if (target_relax_info
6103 && (target_relax_info->is_relaxable_literal_section
6104 || target_relax_info->is_relaxable_asm_section))
6106 xtensa_opcode opcode = XTENSA_UNDEFINED;
6108 bfd_boolean is_abs_literal = FALSE;
6110 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
6112 /* None of the current alternate relocs are PC-relative,
6113 and only PC-relative relocs matter here. However, we
6114 still need to record the opcode for literal
6116 opcode = get_relocation_opcode (abfd, sec, contents, irel);
6117 if (opcode == get_l32r_opcode ())
6119 is_abs_literal = TRUE;
6123 opcode = XTENSA_UNDEFINED;
6125 else if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
6127 opcode = get_relocation_opcode (abfd, sec, contents, irel);
6128 opnd = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
6131 if (opcode != XTENSA_UNDEFINED)
6133 int src_next = target_relax_info->src_next++;
6134 source_reloc *s_reloc = &target_relax_info->src_relocs[src_next];
6136 init_source_reloc (s_reloc, sec, &r_rel, opcode, opnd,
6142 /* Now get rid of ASM_EXPAND relocations. At this point, the
6143 src_relocs array for the target literal section may still be
6144 incomplete, but it must at least contain the entries for the L32R
6145 relocations associated with ASM_EXPANDs because they were just
6146 added in the preceding loop over the relocations. */
6148 for (i = 0; i < sec->reloc_count; i++)
6150 Elf_Internal_Rela *irel = &internal_relocs[i];
6151 bfd_boolean is_reachable;
6153 if (!is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
6159 Elf_Internal_Rela *l32r_irel;
6161 asection *target_sec;
6162 xtensa_relax_info *target_relax_info;
6164 /* Mark the source_reloc for the L32R so that it will be
6165 removed in compute_removed_literals(), along with the
6166 associated literal. */
6167 l32r_irel = find_associated_l32r_irel (abfd, sec, contents,
6168 irel, internal_relocs);
6169 if (l32r_irel == NULL)
6172 r_reloc_init (&r_rel, abfd, l32r_irel, contents, sec_size);
6174 target_sec = r_reloc_get_section (&r_rel);
6175 target_relax_info = get_xtensa_relax_info (target_sec);
6177 if (target_relax_info
6178 && (target_relax_info->is_relaxable_literal_section
6179 || target_relax_info->is_relaxable_asm_section))
6181 source_reloc *s_reloc;
6183 /* Search the source_relocs for the entry corresponding to
6184 the l32r_irel. Note: The src_relocs array is not yet
6185 sorted, but it wouldn't matter anyway because we're
6186 searching by source offset instead of target offset. */
6187 s_reloc = find_source_reloc (target_relax_info->src_relocs,
6188 target_relax_info->src_next,
6190 BFD_ASSERT (s_reloc);
6191 s_reloc->is_null = TRUE;
6194 /* Convert this reloc to ASM_SIMPLIFY. */
6195 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
6196 R_XTENSA_ASM_SIMPLIFY);
6197 l32r_irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
6199 pin_internal_relocs (sec, internal_relocs);
6203 /* It is resolvable but doesn't reach. We resolve now
6204 by eliminating the relocation -- the call will remain
6205 expanded into L32R/CALLX. */
6206 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
6207 pin_internal_relocs (sec, internal_relocs);
6212 release_contents (sec, contents);
6213 release_internal_relocs (sec, internal_relocs);
6218 /* Return TRUE if the asm expansion can be resolved. Generally it can
6219 be resolved on a final link or when a partial link locates it in the
6220 same section as the target. Set "is_reachable" flag if the target of
6221 the call is within the range of a direct call, given the current VMA
6222 for this section and the target section. */
6225 is_resolvable_asm_expansion (bfd *abfd,
6228 Elf_Internal_Rela *irel,
6229 struct bfd_link_info *link_info,
6230 bfd_boolean *is_reachable_p)
6232 asection *target_sec;
6233 bfd_vma target_offset;
6235 xtensa_opcode opcode, direct_call_opcode;
6236 bfd_vma self_address;
6237 bfd_vma dest_address;
6238 bfd_boolean uses_l32r;
6239 bfd_size_type sec_size;
6241 *is_reachable_p = FALSE;
6243 if (contents == NULL)
6246 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
6249 sec_size = bfd_get_section_limit (abfd, sec);
6250 opcode = get_expanded_call_opcode (contents + irel->r_offset,
6251 sec_size - irel->r_offset, &uses_l32r);
6252 /* Optimization of longcalls that use CONST16 is not yet implemented. */
6256 direct_call_opcode = swap_callx_for_call_opcode (opcode);
6257 if (direct_call_opcode == XTENSA_UNDEFINED)
6260 /* Check and see that the target resolves. */
6261 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
6262 if (!r_reloc_is_defined (&r_rel))
6265 target_sec = r_reloc_get_section (&r_rel);
6266 target_offset = r_rel.target_offset;
6268 /* If the target is in a shared library, then it doesn't reach. This
6269 isn't supposed to come up because the compiler should never generate
6270 non-PIC calls on systems that use shared libraries, but the linker
6271 shouldn't crash regardless. */
6272 if (!target_sec->output_section)
6275 /* For relocatable sections, we can only simplify when the output
6276 section of the target is the same as the output section of the
6278 if (link_info->relocatable
6279 && (target_sec->output_section != sec->output_section
6280 || is_reloc_sym_weak (abfd, irel)))
6283 self_address = (sec->output_section->vma
6284 + sec->output_offset + irel->r_offset + 3);
6285 dest_address = (target_sec->output_section->vma
6286 + target_sec->output_offset + target_offset);
6288 *is_reachable_p = pcrel_reloc_fits (direct_call_opcode, 0,
6289 self_address, dest_address);
6291 if ((self_address >> CALL_SEGMENT_BITS) !=
6292 (dest_address >> CALL_SEGMENT_BITS))
6299 static Elf_Internal_Rela *
6300 find_associated_l32r_irel (bfd *abfd,
6303 Elf_Internal_Rela *other_irel,
6304 Elf_Internal_Rela *internal_relocs)
6308 for (i = 0; i < sec->reloc_count; i++)
6310 Elf_Internal_Rela *irel = &internal_relocs[i];
6312 if (irel == other_irel)
6314 if (irel->r_offset != other_irel->r_offset)
6316 if (is_l32r_relocation (abfd, sec, contents, irel))
6324 static xtensa_opcode *
6325 build_reloc_opcodes (bfd *abfd,
6328 Elf_Internal_Rela *internal_relocs)
6331 xtensa_opcode *reloc_opcodes =
6332 (xtensa_opcode *) bfd_malloc (sizeof (xtensa_opcode) * sec->reloc_count);
6333 for (i = 0; i < sec->reloc_count; i++)
6335 Elf_Internal_Rela *irel = &internal_relocs[i];
6336 reloc_opcodes[i] = get_relocation_opcode (abfd, sec, contents, irel);
6338 return reloc_opcodes;
6342 /* The compute_text_actions function will build a list of potential
6343 transformation actions for code in the extended basic block of each
6344 longcall that is optimized to a direct call. From this list we
6345 generate a set of actions to actually perform that optimizes for
6346 space and, if not using size_opt, maintains branch target
6349 These actions to be performed are placed on a per-section list.
6350 The actual changes are performed by relax_section() in the second
6354 compute_text_actions (bfd *abfd,
6356 struct bfd_link_info *link_info)
6358 xtensa_opcode *reloc_opcodes = NULL;
6359 xtensa_relax_info *relax_info;
6361 Elf_Internal_Rela *internal_relocs;
6362 bfd_boolean ok = TRUE;
6364 property_table_entry *prop_table = 0;
6366 bfd_size_type sec_size;
6367 static bfd_boolean no_insn_move = FALSE;
6372 /* Do nothing if the section contains no optimized longcalls. */
6373 relax_info = get_xtensa_relax_info (sec);
6374 BFD_ASSERT (relax_info);
6375 if (!relax_info->is_relaxable_asm_section)
6378 internal_relocs = retrieve_internal_relocs (abfd, sec,
6379 link_info->keep_memory);
6381 if (internal_relocs)
6382 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
6383 internal_reloc_compare);
6385 sec_size = bfd_get_section_limit (abfd, sec);
6386 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6387 if (contents == NULL && sec_size != 0)
6393 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
6394 XTENSA_PROP_SEC_NAME, FALSE);
6401 for (i = 0; i < sec->reloc_count; i++)
6403 Elf_Internal_Rela *irel = &internal_relocs[i];
6405 property_table_entry *the_entry;
6408 ebb_constraint ebb_table;
6409 bfd_size_type simplify_size;
6411 if (irel && ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_SIMPLIFY)
6413 r_offset = irel->r_offset;
6415 simplify_size = get_asm_simplify_size (contents, sec_size, r_offset);
6416 if (simplify_size == 0)
6418 (*_bfd_error_handler)
6419 (_("%B(%A+0x%lx): could not decode instruction for XTENSA_ASM_SIMPLIFY relocation; possible configuration mismatch"),
6420 sec->owner, sec, r_offset);
6424 /* If the instruction table is not around, then don't do this
6426 the_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
6427 sec->vma + irel->r_offset);
6428 if (the_entry == NULL || XTENSA_NO_NOP_REMOVAL)
6430 text_action_add (&relax_info->action_list,
6431 ta_convert_longcall, sec, r_offset,
6436 /* If the next longcall happens to be at the same address as an
6437 unreachable section of size 0, then skip forward. */
6438 ptbl_idx = the_entry - prop_table;
6439 while ((the_entry->flags & XTENSA_PROP_UNREACHABLE)
6440 && the_entry->size == 0
6441 && ptbl_idx + 1 < ptblsize
6442 && (prop_table[ptbl_idx + 1].address
6443 == prop_table[ptbl_idx].address))
6449 if (the_entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM)
6450 /* NO_REORDER is OK */
6453 init_ebb_constraint (&ebb_table);
6454 ebb = &ebb_table.ebb;
6455 init_ebb (ebb, sec, contents, sec_size, prop_table, ptblsize,
6456 internal_relocs, sec->reloc_count);
6457 ebb->start_offset = r_offset + simplify_size;
6458 ebb->end_offset = r_offset + simplify_size;
6459 ebb->start_ptbl_idx = ptbl_idx;
6460 ebb->end_ptbl_idx = ptbl_idx;
6461 ebb->start_reloc_idx = i;
6462 ebb->end_reloc_idx = i;
6464 /* Precompute the opcode for each relocation. */
6465 if (reloc_opcodes == NULL)
6466 reloc_opcodes = build_reloc_opcodes (abfd, sec, contents,
6469 if (!extend_ebb_bounds (ebb)
6470 || !compute_ebb_proposed_actions (&ebb_table)
6471 || !compute_ebb_actions (&ebb_table)
6472 || !check_section_ebb_pcrels_fit (abfd, sec, contents,
6473 internal_relocs, &ebb_table,
6475 || !check_section_ebb_reduces (&ebb_table))
6477 /* If anything goes wrong or we get unlucky and something does
6478 not fit, with our plan because of expansion between
6479 critical branches, just convert to a NOP. */
6481 text_action_add (&relax_info->action_list,
6482 ta_convert_longcall, sec, r_offset, 0);
6483 i = ebb_table.ebb.end_reloc_idx;
6484 free_ebb_constraint (&ebb_table);
6488 text_action_add_proposed (&relax_info->action_list, &ebb_table, sec);
6490 /* Update the index so we do not go looking at the relocations
6491 we have already processed. */
6492 i = ebb_table.ebb.end_reloc_idx;
6493 free_ebb_constraint (&ebb_table);
6497 if (relax_info->action_list.head)
6498 print_action_list (stderr, &relax_info->action_list);
6502 release_contents (sec, contents);
6503 release_internal_relocs (sec, internal_relocs);
6507 free (reloc_opcodes);
6513 /* Do not widen an instruction if it is preceeded by a
6514 loop opcode. It might cause misalignment. */
6517 prev_instr_is_a_loop (bfd_byte *contents,
6518 bfd_size_type content_length,
6519 bfd_size_type offset)
6521 xtensa_opcode prev_opcode;
6525 prev_opcode = insn_decode_opcode (contents, content_length, offset-3, 0);
6526 return (xtensa_opcode_is_loop (xtensa_default_isa, prev_opcode) == 1);
6530 /* Find all of the possible actions for an extended basic block. */
6533 compute_ebb_proposed_actions (ebb_constraint *ebb_table)
6535 const ebb_t *ebb = &ebb_table->ebb;
6536 unsigned rel_idx = ebb->start_reloc_idx;
6537 property_table_entry *entry, *start_entry, *end_entry;
6539 xtensa_isa isa = xtensa_default_isa;
6541 static xtensa_insnbuf insnbuf = NULL;
6542 static xtensa_insnbuf slotbuf = NULL;
6544 if (insnbuf == NULL)
6546 insnbuf = xtensa_insnbuf_alloc (isa);
6547 slotbuf = xtensa_insnbuf_alloc (isa);
6550 start_entry = &ebb->ptbl[ebb->start_ptbl_idx];
6551 end_entry = &ebb->ptbl[ebb->end_ptbl_idx];
6553 for (entry = start_entry; entry <= end_entry; entry++)
6555 bfd_vma start_offset, end_offset;
6556 bfd_size_type insn_len;
6558 start_offset = entry->address - ebb->sec->vma;
6559 end_offset = entry->address + entry->size - ebb->sec->vma;
6561 if (entry == start_entry)
6562 start_offset = ebb->start_offset;
6563 if (entry == end_entry)
6564 end_offset = ebb->end_offset;
6565 offset = start_offset;
6567 if (offset == entry->address - ebb->sec->vma
6568 && (entry->flags & XTENSA_PROP_INSN_BRANCH_TARGET) != 0)
6570 enum ebb_target_enum align_type = EBB_DESIRE_TGT_ALIGN;
6571 BFD_ASSERT (offset != end_offset);
6572 if (offset == end_offset)
6575 insn_len = insn_decode_len (ebb->contents, ebb->content_length,
6580 if (check_branch_target_aligned_address (offset, insn_len))
6581 align_type = EBB_REQUIRE_TGT_ALIGN;
6583 ebb_propose_action (ebb_table, align_type, 0,
6584 ta_none, offset, 0, TRUE);
6587 while (offset != end_offset)
6589 Elf_Internal_Rela *irel;
6590 xtensa_opcode opcode;
6592 while (rel_idx < ebb->end_reloc_idx
6593 && (ebb->relocs[rel_idx].r_offset < offset
6594 || (ebb->relocs[rel_idx].r_offset == offset
6595 && (ELF32_R_TYPE (ebb->relocs[rel_idx].r_info)
6596 != R_XTENSA_ASM_SIMPLIFY))))
6599 /* Check for longcall. */
6600 irel = &ebb->relocs[rel_idx];
6601 if (irel->r_offset == offset
6602 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY)
6604 bfd_size_type simplify_size;
6606 simplify_size = get_asm_simplify_size (ebb->contents,
6607 ebb->content_length,
6609 if (simplify_size == 0)
6612 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6613 ta_convert_longcall, offset, 0, TRUE);
6615 offset += simplify_size;
6619 if (offset + MIN_INSN_LENGTH > ebb->content_length)
6621 xtensa_insnbuf_from_chars (isa, insnbuf, &ebb->contents[offset],
6622 ebb->content_length - offset);
6623 fmt = xtensa_format_decode (isa, insnbuf);
6624 if (fmt == XTENSA_UNDEFINED)
6626 insn_len = xtensa_format_length (isa, fmt);
6627 if (insn_len == (bfd_size_type) XTENSA_UNDEFINED)
6630 if (xtensa_format_num_slots (isa, fmt) != 1)
6636 xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
6637 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
6638 if (opcode == XTENSA_UNDEFINED)
6641 if ((entry->flags & XTENSA_PROP_INSN_NO_DENSITY) == 0
6642 && (entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) == 0
6643 && can_narrow_instruction (slotbuf, fmt, opcode) != 0)
6645 /* Add an instruction narrow action. */
6646 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6647 ta_narrow_insn, offset, 0, FALSE);
6649 else if ((entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) == 0
6650 && can_widen_instruction (slotbuf, fmt, opcode) != 0
6651 && ! prev_instr_is_a_loop (ebb->contents,
6652 ebb->content_length, offset))
6654 /* Add an instruction widen action. */
6655 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6656 ta_widen_insn, offset, 0, FALSE);
6658 else if (xtensa_opcode_is_loop (xtensa_default_isa, opcode) == 1)
6660 /* Check for branch targets. */
6661 ebb_propose_action (ebb_table, EBB_REQUIRE_LOOP_ALIGN, 0,
6662 ta_none, offset, 0, TRUE);
6669 if (ebb->ends_unreachable)
6671 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6672 ta_fill, ebb->end_offset, 0, TRUE);
6678 (*_bfd_error_handler)
6679 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
6680 ebb->sec->owner, ebb->sec, offset);
6685 /* After all of the information has collected about the
6686 transformations possible in an EBB, compute the appropriate actions
6687 here in compute_ebb_actions. We still must check later to make
6688 sure that the actions do not break any relocations. The algorithm
6689 used here is pretty greedy. Basically, it removes as many no-ops
6690 as possible so that the end of the EBB has the same alignment
6691 characteristics as the original. First, it uses narrowing, then
6692 fill space at the end of the EBB, and finally widenings. If that
6693 does not work, it tries again with one fewer no-op removed. The
6694 optimization will only be performed if all of the branch targets
6695 that were aligned before transformation are also aligned after the
6698 When the size_opt flag is set, ignore the branch target alignments,
6699 narrow all wide instructions, and remove all no-ops unless the end
6700 of the EBB prevents it. */
6703 compute_ebb_actions (ebb_constraint *ebb_table)
6707 int removed_bytes = 0;
6708 ebb_t *ebb = &ebb_table->ebb;
6709 unsigned seg_idx_start = 0;
6710 unsigned seg_idx_end = 0;
6712 /* We perform this like the assembler relaxation algorithm: Start by
6713 assuming all instructions are narrow and all no-ops removed; then
6716 /* For each segment of this that has a solid constraint, check to
6717 see if there are any combinations that will keep the constraint.
6719 for (seg_idx_end = 0; seg_idx_end < ebb_table->action_count; seg_idx_end++)
6721 bfd_boolean requires_text_end_align = FALSE;
6722 unsigned longcall_count = 0;
6723 unsigned longcall_convert_count = 0;
6724 unsigned narrowable_count = 0;
6725 unsigned narrowable_convert_count = 0;
6726 unsigned widenable_count = 0;
6727 unsigned widenable_convert_count = 0;
6729 proposed_action *action = NULL;
6730 int align = (1 << ebb_table->ebb.sec->alignment_power);
6732 seg_idx_start = seg_idx_end;
6734 for (i = seg_idx_start; i < ebb_table->action_count; i++)
6736 action = &ebb_table->actions[i];
6737 if (action->action == ta_convert_longcall)
6739 if (action->action == ta_narrow_insn)
6741 if (action->action == ta_widen_insn)
6743 if (action->action == ta_fill)
6745 if (action->align_type == EBB_REQUIRE_LOOP_ALIGN)
6747 if (action->align_type == EBB_REQUIRE_TGT_ALIGN
6748 && !elf32xtensa_size_opt)
6753 if (seg_idx_end == ebb_table->action_count && !ebb->ends_unreachable)
6754 requires_text_end_align = TRUE;
6756 if (elf32xtensa_size_opt && !requires_text_end_align
6757 && action->align_type != EBB_REQUIRE_LOOP_ALIGN
6758 && action->align_type != EBB_REQUIRE_TGT_ALIGN)
6760 longcall_convert_count = longcall_count;
6761 narrowable_convert_count = narrowable_count;
6762 widenable_convert_count = 0;
6766 /* There is a constraint. Convert the max number of longcalls. */
6767 narrowable_convert_count = 0;
6768 longcall_convert_count = 0;
6769 widenable_convert_count = 0;
6771 for (j = 0; j < longcall_count; j++)
6773 int removed = (longcall_count - j) * 3 & (align - 1);
6774 unsigned desire_narrow = (align - removed) & (align - 1);
6775 unsigned desire_widen = removed;
6776 if (desire_narrow <= narrowable_count)
6778 narrowable_convert_count = desire_narrow;
6779 narrowable_convert_count +=
6780 (align * ((narrowable_count - narrowable_convert_count)
6782 longcall_convert_count = (longcall_count - j);
6783 widenable_convert_count = 0;
6786 if (desire_widen <= widenable_count && !elf32xtensa_size_opt)
6788 narrowable_convert_count = 0;
6789 longcall_convert_count = longcall_count - j;
6790 widenable_convert_count = desire_widen;
6796 /* Now the number of conversions are saved. Do them. */
6797 for (i = seg_idx_start; i < seg_idx_end; i++)
6799 action = &ebb_table->actions[i];
6800 switch (action->action)
6802 case ta_convert_longcall:
6803 if (longcall_convert_count != 0)
6805 action->action = ta_remove_longcall;
6806 action->do_action = TRUE;
6807 action->removed_bytes += 3;
6808 longcall_convert_count--;
6811 case ta_narrow_insn:
6812 if (narrowable_convert_count != 0)
6814 action->do_action = TRUE;
6815 action->removed_bytes += 1;
6816 narrowable_convert_count--;
6820 if (widenable_convert_count != 0)
6822 action->do_action = TRUE;
6823 action->removed_bytes -= 1;
6824 widenable_convert_count--;
6833 /* Now we move on to some local opts. Try to remove each of the
6834 remaining longcalls. */
6836 if (ebb_table->ebb.ends_section || ebb_table->ebb.ends_unreachable)
6839 for (i = 0; i < ebb_table->action_count; i++)
6841 int old_removed_bytes = removed_bytes;
6842 proposed_action *action = &ebb_table->actions[i];
6844 if (action->do_action && action->action == ta_convert_longcall)
6846 bfd_boolean bad_alignment = FALSE;
6848 for (j = i + 1; j < ebb_table->action_count; j++)
6850 proposed_action *new_action = &ebb_table->actions[j];
6851 bfd_vma offset = new_action->offset;
6852 if (new_action->align_type == EBB_REQUIRE_TGT_ALIGN)
6854 if (!check_branch_target_aligned
6855 (ebb_table->ebb.contents,
6856 ebb_table->ebb.content_length,
6857 offset, offset - removed_bytes))
6859 bad_alignment = TRUE;
6863 if (new_action->align_type == EBB_REQUIRE_LOOP_ALIGN)
6865 if (!check_loop_aligned (ebb_table->ebb.contents,
6866 ebb_table->ebb.content_length,
6868 offset - removed_bytes))
6870 bad_alignment = TRUE;
6874 if (new_action->action == ta_narrow_insn
6875 && !new_action->do_action
6876 && ebb_table->ebb.sec->alignment_power == 2)
6878 /* Narrow an instruction and we are done. */
6879 new_action->do_action = TRUE;
6880 new_action->removed_bytes += 1;
6881 bad_alignment = FALSE;
6884 if (new_action->action == ta_widen_insn
6885 && new_action->do_action
6886 && ebb_table->ebb.sec->alignment_power == 2)
6888 /* Narrow an instruction and we are done. */
6889 new_action->do_action = FALSE;
6890 new_action->removed_bytes += 1;
6891 bad_alignment = FALSE;
6897 action->removed_bytes += 3;
6898 action->action = ta_remove_longcall;
6899 action->do_action = TRUE;
6902 removed_bytes = old_removed_bytes;
6903 if (action->do_action)
6904 removed_bytes += action->removed_bytes;
6909 for (i = 0; i < ebb_table->action_count; ++i)
6911 proposed_action *action = &ebb_table->actions[i];
6912 if (action->do_action)
6913 removed_bytes += action->removed_bytes;
6916 if ((removed_bytes % (1 << ebb_table->ebb.sec->alignment_power)) != 0
6917 && ebb->ends_unreachable)
6919 proposed_action *action;
6923 BFD_ASSERT (ebb_table->action_count != 0);
6924 action = &ebb_table->actions[ebb_table->action_count - 1];
6925 BFD_ASSERT (action->action == ta_fill);
6926 BFD_ASSERT (ebb->ends_unreachable->flags & XTENSA_PROP_UNREACHABLE);
6928 extra_space = compute_fill_extra_space (ebb->ends_unreachable);
6929 br = action->removed_bytes + removed_bytes + extra_space;
6930 br = br & ((1 << ebb->sec->alignment_power ) - 1);
6932 action->removed_bytes = extra_space - br;
6938 /* The xlate_map is a sorted array of address mappings designed to
6939 answer the offset_with_removed_text() query with a binary search instead
6940 of a linear search through the section's action_list. */
6942 typedef struct xlate_map_entry xlate_map_entry_t;
6943 typedef struct xlate_map xlate_map_t;
6945 struct xlate_map_entry
6947 unsigned orig_address;
6948 unsigned new_address;
6954 unsigned entry_count;
6955 xlate_map_entry_t *entry;
6960 xlate_compare (const void *a_v, const void *b_v)
6962 const xlate_map_entry_t *a = (const xlate_map_entry_t *) a_v;
6963 const xlate_map_entry_t *b = (const xlate_map_entry_t *) b_v;
6964 if (a->orig_address < b->orig_address)
6966 if (a->orig_address > (b->orig_address + b->size - 1))
6973 xlate_offset_with_removed_text (const xlate_map_t *map,
6974 text_action_list *action_list,
6977 xlate_map_entry_t tmp;
6979 xlate_map_entry_t *e;
6982 return offset_with_removed_text (action_list, offset);
6984 if (map->entry_count == 0)
6987 tmp.orig_address = offset;
6988 tmp.new_address = offset;
6991 r = bsearch (&offset, map->entry, map->entry_count,
6992 sizeof (xlate_map_entry_t), &xlate_compare);
6993 e = (xlate_map_entry_t *) r;
6995 BFD_ASSERT (e != NULL);
6998 return e->new_address - e->orig_address + offset;
7002 /* Build a binary searchable offset translation map from a section's
7005 static xlate_map_t *
7006 build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
7008 xlate_map_t *map = (xlate_map_t *) bfd_malloc (sizeof (xlate_map_t));
7009 text_action_list *action_list = &relax_info->action_list;
7010 unsigned num_actions = 0;
7013 xlate_map_entry_t *current_entry;
7018 num_actions = action_list_count (action_list);
7019 map->entry = (xlate_map_entry_t *)
7020 bfd_malloc (sizeof (xlate_map_entry_t) * (num_actions + 1));
7021 if (map->entry == NULL)
7026 map->entry_count = 0;
7029 current_entry = &map->entry[0];
7031 current_entry->orig_address = 0;
7032 current_entry->new_address = 0;
7033 current_entry->size = 0;
7035 for (r = action_list->head; r != NULL; r = r->next)
7037 unsigned orig_size = 0;
7041 case ta_remove_insn:
7042 case ta_convert_longcall:
7043 case ta_remove_literal:
7044 case ta_add_literal:
7046 case ta_remove_longcall:
7049 case ta_narrow_insn:
7058 current_entry->size =
7059 r->offset + orig_size - current_entry->orig_address;
7060 if (current_entry->size != 0)
7065 current_entry->orig_address = r->offset + orig_size;
7066 removed += r->removed_bytes;
7067 current_entry->new_address = r->offset + orig_size - removed;
7068 current_entry->size = 0;
7071 current_entry->size = (bfd_get_section_limit (sec->owner, sec)
7072 - current_entry->orig_address);
7073 if (current_entry->size != 0)
7080 /* Free an offset translation map. */
7083 free_xlate_map (xlate_map_t *map)
7085 if (map && map->entry)
7092 /* Use check_section_ebb_pcrels_fit to make sure that all of the
7093 relocations in a section will fit if a proposed set of actions
7097 check_section_ebb_pcrels_fit (bfd *abfd,
7100 Elf_Internal_Rela *internal_relocs,
7101 const ebb_constraint *constraint,
7102 const xtensa_opcode *reloc_opcodes)
7105 Elf_Internal_Rela *irel;
7106 xlate_map_t *xmap = NULL;
7107 bfd_boolean ok = TRUE;
7108 xtensa_relax_info *relax_info;
7110 relax_info = get_xtensa_relax_info (sec);
7112 if (relax_info && sec->reloc_count > 100)
7114 xmap = build_xlate_map (sec, relax_info);
7115 /* NULL indicates out of memory, but the slow version
7116 can still be used. */
7119 for (i = 0; i < sec->reloc_count; i++)
7122 bfd_vma orig_self_offset, orig_target_offset;
7123 bfd_vma self_offset, target_offset;
7125 reloc_howto_type *howto;
7126 int self_removed_bytes, target_removed_bytes;
7128 irel = &internal_relocs[i];
7129 r_type = ELF32_R_TYPE (irel->r_info);
7131 howto = &elf_howto_table[r_type];
7132 /* We maintain the required invariant: PC-relative relocations
7133 that fit before linking must fit after linking. Thus we only
7134 need to deal with relocations to the same section that are
7136 if (ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY
7137 || !howto->pc_relative)
7140 r_reloc_init (&r_rel, abfd, irel, contents,
7141 bfd_get_section_limit (abfd, sec));
7143 if (r_reloc_get_section (&r_rel) != sec)
7146 orig_self_offset = irel->r_offset;
7147 orig_target_offset = r_rel.target_offset;
7149 self_offset = orig_self_offset;
7150 target_offset = orig_target_offset;
7155 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
7158 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
7159 orig_target_offset);
7162 self_removed_bytes = 0;
7163 target_removed_bytes = 0;
7165 for (j = 0; j < constraint->action_count; ++j)
7167 proposed_action *action = &constraint->actions[j];
7168 bfd_vma offset = action->offset;
7169 int removed_bytes = action->removed_bytes;
7170 if (offset < orig_self_offset
7171 || (offset == orig_self_offset && action->action == ta_fill
7172 && action->removed_bytes < 0))
7173 self_removed_bytes += removed_bytes;
7174 if (offset < orig_target_offset
7175 || (offset == orig_target_offset && action->action == ta_fill
7176 && action->removed_bytes < 0))
7177 target_removed_bytes += removed_bytes;
7179 self_offset -= self_removed_bytes;
7180 target_offset -= target_removed_bytes;
7182 /* Try to encode it. Get the operand and check. */
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. */
7190 xtensa_opcode opcode;
7194 opcode = reloc_opcodes[i];
7196 opcode = get_relocation_opcode (abfd, sec, contents, irel);
7197 if (opcode == XTENSA_UNDEFINED)
7203 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7204 if (opnum == XTENSA_UNDEFINED)
7210 if (!pcrel_reloc_fits (opcode, opnum, self_offset, target_offset))
7219 free_xlate_map (xmap);
7226 check_section_ebb_reduces (const ebb_constraint *constraint)
7231 for (i = 0; i < constraint->action_count; i++)
7233 const proposed_action *action = &constraint->actions[i];
7234 if (action->do_action)
7235 removed += action->removed_bytes;
7245 text_action_add_proposed (text_action_list *l,
7246 const ebb_constraint *ebb_table,
7251 for (i = 0; i < ebb_table->action_count; i++)
7253 proposed_action *action = &ebb_table->actions[i];
7255 if (!action->do_action)
7257 switch (action->action)
7259 case ta_remove_insn:
7260 case ta_remove_longcall:
7261 case ta_convert_longcall:
7262 case ta_narrow_insn:
7265 case ta_remove_literal:
7266 text_action_add (l, action->action, sec, action->offset,
7267 action->removed_bytes);
7280 compute_fill_extra_space (property_table_entry *entry)
7282 int fill_extra_space;
7287 if ((entry->flags & XTENSA_PROP_UNREACHABLE) == 0)
7290 fill_extra_space = entry->size;
7291 if ((entry->flags & XTENSA_PROP_ALIGN) != 0)
7293 /* Fill bytes for alignment:
7294 (2**n)-1 - (addr + (2**n)-1) & (2**n -1) */
7295 int pow = GET_XTENSA_PROP_ALIGNMENT (entry->flags);
7296 int nsm = (1 << pow) - 1;
7297 bfd_vma addr = entry->address + entry->size;
7298 bfd_vma align_fill = nsm - ((addr + nsm) & nsm);
7299 fill_extra_space += align_fill;
7301 return fill_extra_space;
7305 /* First relaxation pass. */
7307 /* If the section contains relaxable literals, check each literal to
7308 see if it has the same value as another literal that has already
7309 been seen, either in the current section or a previous one. If so,
7310 add an entry to the per-section list of removed literals. The
7311 actual changes are deferred until the next pass. */
7314 compute_removed_literals (bfd *abfd,
7316 struct bfd_link_info *link_info,
7317 value_map_hash_table *values)
7319 xtensa_relax_info *relax_info;
7321 Elf_Internal_Rela *internal_relocs;
7322 source_reloc *src_relocs, *rel;
7323 bfd_boolean ok = TRUE;
7324 property_table_entry *prop_table = NULL;
7327 bfd_boolean last_loc_is_prev = FALSE;
7328 bfd_vma last_target_offset = 0;
7329 section_cache_t target_sec_cache;
7330 bfd_size_type sec_size;
7332 init_section_cache (&target_sec_cache);
7334 /* Do nothing if it is not a relaxable literal section. */
7335 relax_info = get_xtensa_relax_info (sec);
7336 BFD_ASSERT (relax_info);
7337 if (!relax_info->is_relaxable_literal_section)
7340 internal_relocs = retrieve_internal_relocs (abfd, sec,
7341 link_info->keep_memory);
7343 sec_size = bfd_get_section_limit (abfd, sec);
7344 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7345 if (contents == NULL && sec_size != 0)
7351 /* Sort the source_relocs by target offset. */
7352 src_relocs = relax_info->src_relocs;
7353 qsort (src_relocs, relax_info->src_count,
7354 sizeof (source_reloc), source_reloc_compare);
7355 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
7356 internal_reloc_compare);
7358 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
7359 XTENSA_PROP_SEC_NAME, FALSE);
7367 for (i = 0; i < relax_info->src_count; i++)
7369 Elf_Internal_Rela *irel = NULL;
7371 rel = &src_relocs[i];
7372 if (get_l32r_opcode () != rel->opcode)
7374 irel = get_irel_at_offset (sec, internal_relocs,
7375 rel->r_rel.target_offset);
7377 /* If the relocation on this is not a simple R_XTENSA_32 or
7378 R_XTENSA_PLT then do not consider it. This may happen when
7379 the difference of two symbols is used in a literal. */
7380 if (irel && (ELF32_R_TYPE (irel->r_info) != R_XTENSA_32
7381 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_PLT))
7384 /* If the target_offset for this relocation is the same as the
7385 previous relocation, then we've already considered whether the
7386 literal can be coalesced. Skip to the next one.... */
7387 if (i != 0 && prev_i != -1
7388 && src_relocs[i-1].r_rel.target_offset == rel->r_rel.target_offset)
7392 if (last_loc_is_prev &&
7393 last_target_offset + 4 != rel->r_rel.target_offset)
7394 last_loc_is_prev = FALSE;
7396 /* Check if the relocation was from an L32R that is being removed
7397 because a CALLX was converted to a direct CALL, and check if
7398 there are no other relocations to the literal. */
7399 if (is_removable_literal (rel, i, src_relocs, relax_info->src_count))
7401 if (!remove_dead_literal (abfd, sec, link_info, internal_relocs,
7402 irel, rel, prop_table, ptblsize))
7407 last_target_offset = rel->r_rel.target_offset;
7411 if (!identify_literal_placement (abfd, sec, contents, link_info,
7413 &last_loc_is_prev, irel,
7414 relax_info->src_count - i, rel,
7415 prop_table, ptblsize,
7416 &target_sec_cache, rel->is_abs_literal))
7421 last_target_offset = rel->r_rel.target_offset;
7425 print_removed_literals (stderr, &relax_info->removed_list);
7426 print_action_list (stderr, &relax_info->action_list);
7430 if (prop_table) free (prop_table);
7431 clear_section_cache (&target_sec_cache);
7433 release_contents (sec, contents);
7434 release_internal_relocs (sec, internal_relocs);
7439 static Elf_Internal_Rela *
7440 get_irel_at_offset (asection *sec,
7441 Elf_Internal_Rela *internal_relocs,
7445 Elf_Internal_Rela *irel;
7447 Elf_Internal_Rela key;
7449 if (!internal_relocs)
7452 key.r_offset = offset;
7453 irel = bsearch (&key, internal_relocs, sec->reloc_count,
7454 sizeof (Elf_Internal_Rela), internal_reloc_matches);
7458 /* bsearch does not guarantee which will be returned if there are
7459 multiple matches. We need the first that is not an alignment. */
7460 i = irel - internal_relocs;
7463 if (internal_relocs[i-1].r_offset != offset)
7467 for ( ; i < sec->reloc_count; i++)
7469 irel = &internal_relocs[i];
7470 r_type = ELF32_R_TYPE (irel->r_info);
7471 if (irel->r_offset == offset && r_type != R_XTENSA_NONE)
7480 is_removable_literal (const source_reloc *rel,
7482 const source_reloc *src_relocs,
7485 const source_reloc *curr_rel;
7489 for (++i; i < src_count; ++i)
7491 curr_rel = &src_relocs[i];
7492 /* If all others have the same target offset.... */
7493 if (curr_rel->r_rel.target_offset != rel->r_rel.target_offset)
7496 if (!curr_rel->is_null
7497 && !xtensa_is_property_section (curr_rel->source_sec)
7498 && !(curr_rel->source_sec->flags & SEC_DEBUGGING))
7506 remove_dead_literal (bfd *abfd,
7508 struct bfd_link_info *link_info,
7509 Elf_Internal_Rela *internal_relocs,
7510 Elf_Internal_Rela *irel,
7512 property_table_entry *prop_table,
7515 property_table_entry *entry;
7516 xtensa_relax_info *relax_info;
7518 relax_info = get_xtensa_relax_info (sec);
7522 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7523 sec->vma + rel->r_rel.target_offset);
7525 /* Mark the unused literal so that it will be removed. */
7526 add_removed_literal (&relax_info->removed_list, &rel->r_rel, NULL);
7528 text_action_add (&relax_info->action_list,
7529 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
7531 /* If the section is 4-byte aligned, do not add fill. */
7532 if (sec->alignment_power > 2)
7534 int fill_extra_space;
7535 bfd_vma entry_sec_offset;
7537 property_table_entry *the_add_entry;
7541 entry_sec_offset = entry->address - sec->vma + entry->size;
7543 entry_sec_offset = rel->r_rel.target_offset + 4;
7545 /* If the literal range is at the end of the section,
7547 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7549 fill_extra_space = compute_fill_extra_space (the_add_entry);
7551 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
7552 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
7553 -4, fill_extra_space);
7555 adjust_fill_action (fa, removed_diff);
7557 text_action_add (&relax_info->action_list,
7558 ta_fill, sec, entry_sec_offset, removed_diff);
7561 /* Zero out the relocation on this literal location. */
7564 if (elf_hash_table (link_info)->dynamic_sections_created)
7565 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
7567 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7568 pin_internal_relocs (sec, internal_relocs);
7571 /* Do not modify "last_loc_is_prev". */
7577 identify_literal_placement (bfd *abfd,
7580 struct bfd_link_info *link_info,
7581 value_map_hash_table *values,
7582 bfd_boolean *last_loc_is_prev_p,
7583 Elf_Internal_Rela *irel,
7584 int remaining_src_rels,
7586 property_table_entry *prop_table,
7588 section_cache_t *target_sec_cache,
7589 bfd_boolean is_abs_literal)
7593 xtensa_relax_info *relax_info;
7594 bfd_boolean literal_placed = FALSE;
7596 unsigned long value;
7597 bfd_boolean final_static_link;
7598 bfd_size_type sec_size;
7600 relax_info = get_xtensa_relax_info (sec);
7604 sec_size = bfd_get_section_limit (abfd, sec);
7607 (!link_info->relocatable
7608 && !elf_hash_table (link_info)->dynamic_sections_created);
7610 /* The placement algorithm first checks to see if the literal is
7611 already in the value map. If so and the value map is reachable
7612 from all uses, then the literal is moved to that location. If
7613 not, then we identify the last location where a fresh literal was
7614 placed. If the literal can be safely moved there, then we do so.
7615 If not, then we assume that the literal is not to move and leave
7616 the literal where it is, marking it as the last literal
7619 /* Find the literal value. */
7621 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7624 BFD_ASSERT (rel->r_rel.target_offset < sec_size);
7625 value = bfd_get_32 (abfd, contents + rel->r_rel.target_offset);
7627 init_literal_value (&val, &r_rel, value, is_abs_literal);
7629 /* Check if we've seen another literal with the same value that
7630 is in the same output section. */
7631 val_map = value_map_get_cached_value (values, &val, final_static_link);
7634 && (r_reloc_get_section (&val_map->loc)->output_section
7635 == sec->output_section)
7636 && relocations_reach (rel, remaining_src_rels, &val_map->loc)
7637 && coalesce_shared_literal (sec, rel, prop_table, ptblsize, val_map))
7639 /* No change to last_loc_is_prev. */
7640 literal_placed = TRUE;
7643 /* For relocatable links, do not try to move literals. To do it
7644 correctly might increase the number of relocations in an input
7645 section making the default relocatable linking fail. */
7646 if (!link_info->relocatable && !literal_placed
7647 && values->has_last_loc && !(*last_loc_is_prev_p))
7649 asection *target_sec = r_reloc_get_section (&values->last_loc);
7650 if (target_sec && target_sec->output_section == sec->output_section)
7652 /* Increment the virtual offset. */
7653 r_reloc try_loc = values->last_loc;
7654 try_loc.virtual_offset += 4;
7656 /* There is a last loc that was in the same output section. */
7657 if (relocations_reach (rel, remaining_src_rels, &try_loc)
7658 && move_shared_literal (sec, link_info, rel,
7659 prop_table, ptblsize,
7660 &try_loc, &val, target_sec_cache))
7662 values->last_loc.virtual_offset += 4;
7663 literal_placed = TRUE;
7665 val_map = add_value_map (values, &val, &try_loc,
7668 val_map->loc = try_loc;
7673 if (!literal_placed)
7675 /* Nothing worked, leave the literal alone but update the last loc. */
7676 values->has_last_loc = TRUE;
7677 values->last_loc = rel->r_rel;
7679 val_map = add_value_map (values, &val, &rel->r_rel, final_static_link);
7681 val_map->loc = rel->r_rel;
7682 *last_loc_is_prev_p = TRUE;
7689 /* Check if the original relocations (presumably on L32R instructions)
7690 identified by reloc[0..N] can be changed to reference the literal
7691 identified by r_rel. If r_rel is out of range for any of the
7692 original relocations, then we don't want to coalesce the original
7693 literal with the one at r_rel. We only check reloc[0..N], where the
7694 offsets are all the same as for reloc[0] (i.e., they're all
7695 referencing the same literal) and where N is also bounded by the
7696 number of remaining entries in the "reloc" array. The "reloc" array
7697 is sorted by target offset so we know all the entries for the same
7698 literal will be contiguous. */
7701 relocations_reach (source_reloc *reloc,
7702 int remaining_relocs,
7703 const r_reloc *r_rel)
7705 bfd_vma from_offset, source_address, dest_address;
7709 if (!r_reloc_is_defined (r_rel))
7712 sec = r_reloc_get_section (r_rel);
7713 from_offset = reloc[0].r_rel.target_offset;
7715 for (i = 0; i < remaining_relocs; i++)
7717 if (reloc[i].r_rel.target_offset != from_offset)
7720 /* Ignore relocations that have been removed. */
7721 if (reloc[i].is_null)
7724 /* The original and new output section for these must be the same
7725 in order to coalesce. */
7726 if (r_reloc_get_section (&reloc[i].r_rel)->output_section
7727 != sec->output_section)
7730 /* Absolute literals in the same output section can always be
7732 if (reloc[i].is_abs_literal)
7735 /* A literal with no PC-relative relocations can be moved anywhere. */
7736 if (reloc[i].opnd != -1)
7738 /* Otherwise, check to see that it fits. */
7739 source_address = (reloc[i].source_sec->output_section->vma
7740 + reloc[i].source_sec->output_offset
7741 + reloc[i].r_rel.rela.r_offset);
7742 dest_address = (sec->output_section->vma
7743 + sec->output_offset
7744 + r_rel->target_offset);
7746 if (!pcrel_reloc_fits (reloc[i].opcode, reloc[i].opnd,
7747 source_address, dest_address))
7756 /* Move a literal to another literal location because it is
7757 the same as the other literal value. */
7760 coalesce_shared_literal (asection *sec,
7762 property_table_entry *prop_table,
7766 property_table_entry *entry;
7768 property_table_entry *the_add_entry;
7770 xtensa_relax_info *relax_info;
7772 relax_info = get_xtensa_relax_info (sec);
7776 entry = elf_xtensa_find_property_entry
7777 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
7778 if (entry && (entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM))
7781 /* Mark that the literal will be coalesced. */
7782 add_removed_literal (&relax_info->removed_list, &rel->r_rel, &val_map->loc);
7784 text_action_add (&relax_info->action_list,
7785 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
7787 /* If the section is 4-byte aligned, do not add fill. */
7788 if (sec->alignment_power > 2)
7790 int fill_extra_space;
7791 bfd_vma entry_sec_offset;
7794 entry_sec_offset = entry->address - sec->vma + entry->size;
7796 entry_sec_offset = rel->r_rel.target_offset + 4;
7798 /* If the literal range is at the end of the section,
7800 fill_extra_space = 0;
7801 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7803 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
7804 fill_extra_space = the_add_entry->size;
7806 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
7807 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
7808 -4, fill_extra_space);
7810 adjust_fill_action (fa, removed_diff);
7812 text_action_add (&relax_info->action_list,
7813 ta_fill, sec, entry_sec_offset, removed_diff);
7820 /* Move a literal to another location. This may actually increase the
7821 total amount of space used because of alignments so we need to do
7822 this carefully. Also, it may make a branch go out of range. */
7825 move_shared_literal (asection *sec,
7826 struct bfd_link_info *link_info,
7828 property_table_entry *prop_table,
7830 const r_reloc *target_loc,
7831 const literal_value *lit_value,
7832 section_cache_t *target_sec_cache)
7834 property_table_entry *the_add_entry, *src_entry, *target_entry = NULL;
7835 text_action *fa, *target_fa;
7837 xtensa_relax_info *relax_info, *target_relax_info;
7838 asection *target_sec;
7840 ebb_constraint ebb_table;
7841 bfd_boolean relocs_fit;
7843 /* If this routine always returns FALSE, the literals that cannot be
7844 coalesced will not be moved. */
7845 if (elf32xtensa_no_literal_movement)
7848 relax_info = get_xtensa_relax_info (sec);
7852 target_sec = r_reloc_get_section (target_loc);
7853 target_relax_info = get_xtensa_relax_info (target_sec);
7855 /* Literals to undefined sections may not be moved because they
7856 must report an error. */
7857 if (bfd_is_und_section (target_sec))
7860 src_entry = elf_xtensa_find_property_entry
7861 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
7863 if (!section_cache_section (target_sec_cache, target_sec, link_info))
7866 target_entry = elf_xtensa_find_property_entry
7867 (target_sec_cache->ptbl, target_sec_cache->pte_count,
7868 target_sec->vma + target_loc->target_offset);
7873 /* Make sure that we have not broken any branches. */
7876 init_ebb_constraint (&ebb_table);
7877 ebb = &ebb_table.ebb;
7878 init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
7879 target_sec_cache->content_length,
7880 target_sec_cache->ptbl, target_sec_cache->pte_count,
7881 target_sec_cache->relocs, target_sec_cache->reloc_count);
7883 /* Propose to add 4 bytes + worst-case alignment size increase to
7885 ebb_propose_action (&ebb_table, EBB_NO_ALIGN, 0,
7886 ta_fill, target_loc->target_offset,
7887 -4 - (1 << target_sec->alignment_power), TRUE);
7889 /* Check all of the PC-relative relocations to make sure they still fit. */
7890 relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
7891 target_sec_cache->contents,
7892 target_sec_cache->relocs,
7898 text_action_add_literal (&target_relax_info->action_list,
7899 ta_add_literal, target_loc, lit_value, -4);
7901 if (target_sec->alignment_power > 2 && target_entry != src_entry)
7903 /* May need to add or remove some fill to maintain alignment. */
7904 int fill_extra_space;
7905 bfd_vma entry_sec_offset;
7908 target_entry->address - target_sec->vma + target_entry->size;
7910 /* If the literal range is at the end of the section,
7912 fill_extra_space = 0;
7914 elf_xtensa_find_property_entry (target_sec_cache->ptbl,
7915 target_sec_cache->pte_count,
7917 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
7918 fill_extra_space = the_add_entry->size;
7920 target_fa = find_fill_action (&target_relax_info->action_list,
7921 target_sec, entry_sec_offset);
7922 removed_diff = compute_removed_action_diff (target_fa, target_sec,
7923 entry_sec_offset, 4,
7926 adjust_fill_action (target_fa, removed_diff);
7928 text_action_add (&target_relax_info->action_list,
7929 ta_fill, target_sec, entry_sec_offset, removed_diff);
7932 /* Mark that the literal will be moved to the new location. */
7933 add_removed_literal (&relax_info->removed_list, &rel->r_rel, target_loc);
7935 /* Remove the literal. */
7936 text_action_add (&relax_info->action_list,
7937 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
7939 /* If the section is 4-byte aligned, do not add fill. */
7940 if (sec->alignment_power > 2 && target_entry != src_entry)
7942 int fill_extra_space;
7943 bfd_vma entry_sec_offset;
7946 entry_sec_offset = src_entry->address - sec->vma + src_entry->size;
7948 entry_sec_offset = rel->r_rel.target_offset+4;
7950 /* If the literal range is at the end of the section,
7952 fill_extra_space = 0;
7953 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7955 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
7956 fill_extra_space = the_add_entry->size;
7958 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
7959 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
7960 -4, fill_extra_space);
7962 adjust_fill_action (fa, removed_diff);
7964 text_action_add (&relax_info->action_list,
7965 ta_fill, sec, entry_sec_offset, removed_diff);
7972 /* Second relaxation pass. */
7974 /* Modify all of the relocations to point to the right spot, and if this
7975 is a relaxable section, delete the unwanted literals and fix the
7979 relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
7981 Elf_Internal_Rela *internal_relocs;
7982 xtensa_relax_info *relax_info;
7984 bfd_boolean ok = TRUE;
7986 bfd_boolean rv = FALSE;
7987 bfd_boolean virtual_action;
7988 bfd_size_type sec_size;
7990 sec_size = bfd_get_section_limit (abfd, sec);
7991 relax_info = get_xtensa_relax_info (sec);
7992 BFD_ASSERT (relax_info);
7994 /* First translate any of the fixes that have been added already. */
7995 translate_section_fixes (sec);
7997 /* Handle property sections (e.g., literal tables) specially. */
7998 if (xtensa_is_property_section (sec))
8000 BFD_ASSERT (!relax_info->is_relaxable_literal_section);
8001 return relax_property_section (abfd, sec, link_info);
8004 internal_relocs = retrieve_internal_relocs (abfd, sec,
8005 link_info->keep_memory);
8006 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
8007 if (contents == NULL && sec_size != 0)
8013 if (internal_relocs)
8015 for (i = 0; i < sec->reloc_count; i++)
8017 Elf_Internal_Rela *irel;
8018 xtensa_relax_info *target_relax_info;
8019 bfd_vma source_offset, old_source_offset;
8022 asection *target_sec;
8024 /* Locally change the source address.
8025 Translate the target to the new target address.
8026 If it points to this section and has been removed,
8030 irel = &internal_relocs[i];
8031 source_offset = irel->r_offset;
8032 old_source_offset = source_offset;
8034 r_type = ELF32_R_TYPE (irel->r_info);
8035 r_reloc_init (&r_rel, abfd, irel, contents,
8036 bfd_get_section_limit (abfd, sec));
8038 /* If this section could have changed then we may need to
8039 change the relocation's offset. */
8041 if (relax_info->is_relaxable_literal_section
8042 || relax_info->is_relaxable_asm_section)
8044 if (r_type != R_XTENSA_NONE
8045 && find_removed_literal (&relax_info->removed_list,
8048 /* Remove this relocation. */
8049 if (elf_hash_table (link_info)->dynamic_sections_created)
8050 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
8051 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
8052 irel->r_offset = offset_with_removed_text
8053 (&relax_info->action_list, irel->r_offset);
8054 pin_internal_relocs (sec, internal_relocs);
8058 if (r_type == R_XTENSA_ASM_SIMPLIFY)
8060 text_action *action =
8061 find_insn_action (&relax_info->action_list,
8063 if (action && (action->action == ta_convert_longcall
8064 || action->action == ta_remove_longcall))
8066 bfd_reloc_status_type retval;
8067 char *error_message = NULL;
8069 retval = contract_asm_expansion (contents, sec_size,
8070 irel, &error_message);
8071 if (retval != bfd_reloc_ok)
8073 (*link_info->callbacks->reloc_dangerous)
8074 (link_info, error_message, abfd, sec,
8078 /* Update the action so that the code that moves
8079 the contents will do the right thing. */
8080 if (action->action == ta_remove_longcall)
8081 action->action = ta_remove_insn;
8083 action->action = ta_none;
8084 /* Refresh the info in the r_rel. */
8085 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
8086 r_type = ELF32_R_TYPE (irel->r_info);
8090 source_offset = offset_with_removed_text
8091 (&relax_info->action_list, irel->r_offset);
8092 irel->r_offset = source_offset;
8095 /* If the target section could have changed then
8096 we may need to change the relocation's target offset. */
8098 target_sec = r_reloc_get_section (&r_rel);
8099 target_relax_info = get_xtensa_relax_info (target_sec);
8101 if (target_relax_info
8102 && (target_relax_info->is_relaxable_literal_section
8103 || target_relax_info->is_relaxable_asm_section))
8107 bfd_vma addend_displacement;
8109 translate_reloc (&r_rel, &new_reloc);
8111 if (r_type == R_XTENSA_DIFF8
8112 || r_type == R_XTENSA_DIFF16
8113 || r_type == R_XTENSA_DIFF32)
8115 bfd_vma diff_value = 0, new_end_offset, diff_mask = 0;
8117 if (bfd_get_section_limit (abfd, sec) < old_source_offset)
8119 (*link_info->callbacks->reloc_dangerous)
8120 (link_info, _("invalid relocation address"),
8121 abfd, sec, old_source_offset);
8127 case R_XTENSA_DIFF8:
8129 bfd_get_8 (abfd, &contents[old_source_offset]);
8131 case R_XTENSA_DIFF16:
8133 bfd_get_16 (abfd, &contents[old_source_offset]);
8135 case R_XTENSA_DIFF32:
8137 bfd_get_32 (abfd, &contents[old_source_offset]);
8141 new_end_offset = offset_with_removed_text
8142 (&target_relax_info->action_list,
8143 r_rel.target_offset + diff_value);
8144 diff_value = new_end_offset - new_reloc.target_offset;
8148 case R_XTENSA_DIFF8:
8150 bfd_put_8 (abfd, diff_value,
8151 &contents[old_source_offset]);
8153 case R_XTENSA_DIFF16:
8155 bfd_put_16 (abfd, diff_value,
8156 &contents[old_source_offset]);
8158 case R_XTENSA_DIFF32:
8159 diff_mask = 0xffffffff;
8160 bfd_put_32 (abfd, diff_value,
8161 &contents[old_source_offset]);
8165 /* Check for overflow. */
8166 if ((diff_value & ~diff_mask) != 0)
8168 (*link_info->callbacks->reloc_dangerous)
8169 (link_info, _("overflow after relaxation"),
8170 abfd, sec, old_source_offset);
8174 pin_contents (sec, contents);
8177 /* FIXME: If the relocation still references a section in
8178 the same input file, the relocation should be modified
8179 directly instead of adding a "fix" record. */
8181 addend_displacement =
8182 new_reloc.target_offset + new_reloc.virtual_offset;
8184 fix = reloc_bfd_fix_init (sec, source_offset, r_type, 0,
8185 r_reloc_get_section (&new_reloc),
8186 addend_displacement, TRUE);
8190 pin_internal_relocs (sec, internal_relocs);
8194 if ((relax_info->is_relaxable_literal_section
8195 || relax_info->is_relaxable_asm_section)
8196 && relax_info->action_list.head)
8198 /* Walk through the planned actions and build up a table
8199 of move, copy and fill records. Use the move, copy and
8200 fill records to perform the actions once. */
8202 bfd_size_type size = sec->size;
8204 bfd_size_type final_size, copy_size, orig_insn_size;
8205 bfd_byte *scratch = NULL;
8206 bfd_byte *dup_contents = NULL;
8207 bfd_size_type orig_size = size;
8208 bfd_vma orig_dot = 0;
8209 bfd_vma orig_dot_copied = 0; /* Byte copied already from
8210 orig dot in physical memory. */
8211 bfd_vma orig_dot_vo = 0; /* Virtual offset from orig_dot. */
8212 bfd_vma dup_dot = 0;
8214 text_action *action = relax_info->action_list.head;
8216 final_size = sec->size;
8217 for (action = relax_info->action_list.head; action;
8218 action = action->next)
8220 final_size -= action->removed_bytes;
8223 scratch = (bfd_byte *) bfd_zmalloc (final_size);
8224 dup_contents = (bfd_byte *) bfd_zmalloc (final_size);
8226 /* The dot is the current fill location. */
8228 print_action_list (stderr, &relax_info->action_list);
8231 for (action = relax_info->action_list.head; action;
8232 action = action->next)
8234 virtual_action = FALSE;
8235 if (action->offset > orig_dot)
8237 orig_dot += orig_dot_copied;
8238 orig_dot_copied = 0;
8240 /* Out of the virtual world. */
8243 if (action->offset > orig_dot)
8245 copy_size = action->offset - orig_dot;
8246 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
8247 orig_dot += copy_size;
8248 dup_dot += copy_size;
8249 BFD_ASSERT (action->offset == orig_dot);
8251 else if (action->offset < orig_dot)
8253 if (action->action == ta_fill
8254 && action->offset - action->removed_bytes == orig_dot)
8256 /* This is OK because the fill only effects the dup_dot. */
8258 else if (action->action == ta_add_literal)
8260 /* TBD. Might need to handle this. */
8263 if (action->offset == orig_dot)
8265 if (action->virtual_offset > orig_dot_vo)
8267 if (orig_dot_vo == 0)
8269 /* Need to copy virtual_offset bytes. Probably four. */
8270 copy_size = action->virtual_offset - orig_dot_vo;
8271 memmove (&dup_contents[dup_dot],
8272 &contents[orig_dot], copy_size);
8273 orig_dot_copied = copy_size;
8274 dup_dot += copy_size;
8276 virtual_action = TRUE;
8279 BFD_ASSERT (action->virtual_offset <= orig_dot_vo);
8281 switch (action->action)
8283 case ta_remove_literal:
8284 case ta_remove_insn:
8285 BFD_ASSERT (action->removed_bytes >= 0);
8286 orig_dot += action->removed_bytes;
8289 case ta_narrow_insn:
8292 memmove (scratch, &contents[orig_dot], orig_insn_size);
8293 BFD_ASSERT (action->removed_bytes == 1);
8294 rv = narrow_instruction (scratch, final_size, 0);
8296 memmove (&dup_contents[dup_dot], scratch, copy_size);
8297 orig_dot += orig_insn_size;
8298 dup_dot += copy_size;
8302 if (action->removed_bytes >= 0)
8303 orig_dot += action->removed_bytes;
8306 /* Already zeroed in dup_contents. Just bump the
8308 dup_dot += (-action->removed_bytes);
8313 BFD_ASSERT (action->removed_bytes == 0);
8316 case ta_convert_longcall:
8317 case ta_remove_longcall:
8318 /* These will be removed or converted before we get here. */
8325 memmove (scratch, &contents[orig_dot], orig_insn_size);
8326 BFD_ASSERT (action->removed_bytes == -1);
8327 rv = widen_instruction (scratch, final_size, 0);
8329 memmove (&dup_contents[dup_dot], scratch, copy_size);
8330 orig_dot += orig_insn_size;
8331 dup_dot += copy_size;
8334 case ta_add_literal:
8337 BFD_ASSERT (action->removed_bytes == -4);
8338 /* TBD -- place the literal value here and insert
8340 memset (&dup_contents[dup_dot], 0, 4);
8341 pin_internal_relocs (sec, internal_relocs);
8342 pin_contents (sec, contents);
8344 if (!move_literal (abfd, link_info, sec, dup_dot, dup_contents,
8345 relax_info, &internal_relocs, &action->value))
8349 orig_dot_vo += copy_size;
8351 orig_dot += orig_insn_size;
8352 dup_dot += copy_size;
8356 /* Not implemented yet. */
8361 size -= action->removed_bytes;
8362 removed += action->removed_bytes;
8363 BFD_ASSERT (dup_dot <= final_size);
8364 BFD_ASSERT (orig_dot <= orig_size);
8367 orig_dot += orig_dot_copied;
8368 orig_dot_copied = 0;
8370 if (orig_dot != orig_size)
8372 copy_size = orig_size - orig_dot;
8373 BFD_ASSERT (orig_size > orig_dot);
8374 BFD_ASSERT (dup_dot + copy_size == final_size);
8375 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
8376 orig_dot += copy_size;
8377 dup_dot += copy_size;
8379 BFD_ASSERT (orig_size == orig_dot);
8380 BFD_ASSERT (final_size == dup_dot);
8382 /* Move the dup_contents back. */
8383 if (final_size > orig_size)
8385 /* Contents need to be reallocated. Swap the dup_contents into
8387 sec->contents = dup_contents;
8389 contents = dup_contents;
8390 pin_contents (sec, contents);
8394 BFD_ASSERT (final_size <= orig_size);
8395 memset (contents, 0, orig_size);
8396 memcpy (contents, dup_contents, final_size);
8397 free (dup_contents);
8400 pin_contents (sec, contents);
8402 sec->size = final_size;
8406 release_internal_relocs (sec, internal_relocs);
8407 release_contents (sec, contents);
8413 translate_section_fixes (asection *sec)
8415 xtensa_relax_info *relax_info;
8418 relax_info = get_xtensa_relax_info (sec);
8422 for (r = relax_info->fix_list; r != NULL; r = r->next)
8423 if (!translate_reloc_bfd_fix (r))
8430 /* Translate a fix given the mapping in the relax info for the target
8431 section. If it has already been translated, no work is required. */
8434 translate_reloc_bfd_fix (reloc_bfd_fix *fix)
8436 reloc_bfd_fix new_fix;
8438 xtensa_relax_info *relax_info;
8439 removed_literal *removed;
8440 bfd_vma new_offset, target_offset;
8442 if (fix->translated)
8445 sec = fix->target_sec;
8446 target_offset = fix->target_offset;
8448 relax_info = get_xtensa_relax_info (sec);
8451 fix->translated = TRUE;
8457 /* The fix does not need to be translated if the section cannot change. */
8458 if (!relax_info->is_relaxable_literal_section
8459 && !relax_info->is_relaxable_asm_section)
8461 fix->translated = TRUE;
8465 /* If the literal has been moved and this relocation was on an
8466 opcode, then the relocation should move to the new literal
8467 location. Otherwise, the relocation should move within the
8471 if (is_operand_relocation (fix->src_type))
8473 /* Check if the original relocation is against a literal being
8475 removed = find_removed_literal (&relax_info->removed_list,
8483 /* The fact that there is still a relocation to this literal indicates
8484 that the literal is being coalesced, not simply removed. */
8485 BFD_ASSERT (removed->to.abfd != NULL);
8487 /* This was moved to some other address (possibly another section). */
8488 new_sec = r_reloc_get_section (&removed->to);
8492 relax_info = get_xtensa_relax_info (sec);
8494 (!relax_info->is_relaxable_literal_section
8495 && !relax_info->is_relaxable_asm_section))
8497 target_offset = removed->to.target_offset;
8498 new_fix.target_sec = new_sec;
8499 new_fix.target_offset = target_offset;
8500 new_fix.translated = TRUE;
8505 target_offset = removed->to.target_offset;
8506 new_fix.target_sec = new_sec;
8509 /* The target address may have been moved within its section. */
8510 new_offset = offset_with_removed_text (&relax_info->action_list,
8513 new_fix.target_offset = new_offset;
8514 new_fix.target_offset = new_offset;
8515 new_fix.translated = TRUE;
8521 /* Fix up a relocation to take account of removed literals. */
8524 translate_reloc (const r_reloc *orig_rel, r_reloc *new_rel)
8527 xtensa_relax_info *relax_info;
8528 removed_literal *removed;
8529 bfd_vma new_offset, target_offset, removed_bytes;
8531 *new_rel = *orig_rel;
8533 if (!r_reloc_is_defined (orig_rel))
8535 sec = r_reloc_get_section (orig_rel);
8537 relax_info = get_xtensa_relax_info (sec);
8538 BFD_ASSERT (relax_info);
8540 if (!relax_info->is_relaxable_literal_section
8541 && !relax_info->is_relaxable_asm_section)
8544 target_offset = orig_rel->target_offset;
8547 if (is_operand_relocation (ELF32_R_TYPE (orig_rel->rela.r_info)))
8549 /* Check if the original relocation is against a literal being
8551 removed = find_removed_literal (&relax_info->removed_list,
8554 if (removed && removed->to.abfd)
8558 /* The fact that there is still a relocation to this literal indicates
8559 that the literal is being coalesced, not simply removed. */
8560 BFD_ASSERT (removed->to.abfd != NULL);
8562 /* This was moved to some other address
8563 (possibly in another section). */
8564 *new_rel = removed->to;
8565 new_sec = r_reloc_get_section (new_rel);
8569 relax_info = get_xtensa_relax_info (sec);
8571 || (!relax_info->is_relaxable_literal_section
8572 && !relax_info->is_relaxable_asm_section))
8575 target_offset = new_rel->target_offset;
8578 /* ...and the target address may have been moved within its section. */
8579 new_offset = offset_with_removed_text (&relax_info->action_list,
8582 /* Modify the offset and addend. */
8583 removed_bytes = target_offset - new_offset;
8584 new_rel->target_offset = new_offset;
8585 new_rel->rela.r_addend -= removed_bytes;
8589 /* For dynamic links, there may be a dynamic relocation for each
8590 literal. The number of dynamic relocations must be computed in
8591 size_dynamic_sections, which occurs before relaxation. When a
8592 literal is removed, this function checks if there is a corresponding
8593 dynamic relocation and shrinks the size of the appropriate dynamic
8594 relocation section accordingly. At this point, the contents of the
8595 dynamic relocation sections have not yet been filled in, so there's
8596 nothing else that needs to be done. */
8599 shrink_dynamic_reloc_sections (struct bfd_link_info *info,
8601 asection *input_section,
8602 Elf_Internal_Rela *rel)
8604 Elf_Internal_Shdr *symtab_hdr;
8605 struct elf_link_hash_entry **sym_hashes;
8606 unsigned long r_symndx;
8608 struct elf_link_hash_entry *h;
8609 bfd_boolean dynamic_symbol;
8611 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8612 sym_hashes = elf_sym_hashes (abfd);
8614 r_type = ELF32_R_TYPE (rel->r_info);
8615 r_symndx = ELF32_R_SYM (rel->r_info);
8617 if (r_symndx < symtab_hdr->sh_info)
8620 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8622 dynamic_symbol = xtensa_elf_dynamic_symbol_p (h, info);
8624 if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
8625 && (input_section->flags & SEC_ALLOC) != 0
8626 && (dynamic_symbol || info->shared))
8629 const char *srel_name;
8631 bfd_boolean is_plt = FALSE;
8633 dynobj = elf_hash_table (info)->dynobj;
8634 BFD_ASSERT (dynobj != NULL);
8636 if (dynamic_symbol && r_type == R_XTENSA_PLT)
8638 srel_name = ".rela.plt";
8642 srel_name = ".rela.got";
8644 /* Reduce size of the .rela.* section by one reloc. */
8645 srel = bfd_get_section_by_name (dynobj, srel_name);
8646 BFD_ASSERT (srel != NULL);
8647 BFD_ASSERT (srel->size >= sizeof (Elf32_External_Rela));
8648 srel->size -= sizeof (Elf32_External_Rela);
8652 asection *splt, *sgotplt, *srelgot;
8653 int reloc_index, chunk;
8655 /* Find the PLT reloc index of the entry being removed. This
8656 is computed from the size of ".rela.plt". It is needed to
8657 figure out which PLT chunk to resize. Usually "last index
8658 = size - 1" since the index starts at zero, but in this
8659 context, the size has just been decremented so there's no
8660 need to subtract one. */
8661 reloc_index = srel->size / sizeof (Elf32_External_Rela);
8663 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
8664 splt = elf_xtensa_get_plt_section (dynobj, chunk);
8665 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
8666 BFD_ASSERT (splt != NULL && sgotplt != NULL);
8668 /* Check if an entire PLT chunk has just been eliminated. */
8669 if (reloc_index % PLT_ENTRIES_PER_CHUNK == 0)
8671 /* The two magic GOT entries for that chunk can go away. */
8672 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
8673 BFD_ASSERT (srelgot != NULL);
8674 srelgot->reloc_count -= 2;
8675 srelgot->size -= 2 * sizeof (Elf32_External_Rela);
8678 /* There should be only one entry left (and it will be
8680 BFD_ASSERT (sgotplt->size == 4);
8681 BFD_ASSERT (splt->size == PLT_ENTRY_SIZE);
8684 BFD_ASSERT (sgotplt->size >= 4);
8685 BFD_ASSERT (splt->size >= PLT_ENTRY_SIZE);
8688 splt->size -= PLT_ENTRY_SIZE;
8694 /* Take an r_rel and move it to another section. This usually
8695 requires extending the interal_relocation array and pinning it. If
8696 the original r_rel is from the same BFD, we can complete this here.
8697 Otherwise, we add a fix record to let the final link fix the
8698 appropriate address. Contents and internal relocations for the
8699 section must be pinned after calling this routine. */
8702 move_literal (bfd *abfd,
8703 struct bfd_link_info *link_info,
8707 xtensa_relax_info *relax_info,
8708 Elf_Internal_Rela **internal_relocs_p,
8709 const literal_value *lit)
8711 Elf_Internal_Rela *new_relocs = NULL;
8712 size_t new_relocs_count = 0;
8713 Elf_Internal_Rela this_rela;
8714 const r_reloc *r_rel;
8716 r_rel = &lit->r_rel;
8717 BFD_ASSERT (elf_section_data (sec)->relocs == *internal_relocs_p);
8719 if (r_reloc_is_const (r_rel))
8720 bfd_put_32 (abfd, lit->value, contents + offset);
8725 asection *target_sec;
8729 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
8730 target_sec = r_reloc_get_section (r_rel);
8732 /* This is the difficult case. We have to create a fix up. */
8733 this_rela.r_offset = offset;
8734 this_rela.r_info = ELF32_R_INFO (0, r_type);
8735 this_rela.r_addend =
8736 r_rel->target_offset - r_reloc_get_target_offset (r_rel);
8737 bfd_put_32 (abfd, lit->value, contents + offset);
8739 /* Currently, we cannot move relocations during a relocatable link. */
8740 BFD_ASSERT (!link_info->relocatable);
8741 fix = reloc_bfd_fix_init (sec, offset, r_type, r_rel->abfd,
8742 r_reloc_get_section (r_rel),
8743 r_rel->target_offset + r_rel->virtual_offset,
8745 /* We also need to mark that relocations are needed here. */
8746 sec->flags |= SEC_RELOC;
8748 translate_reloc_bfd_fix (fix);
8749 /* This fix has not yet been translated. */
8752 /* Add the relocation. If we have already allocated our own
8753 space for the relocations and we have room for more, then use
8754 it. Otherwise, allocate new space and move the literals. */
8755 insert_at = sec->reloc_count;
8756 for (i = 0; i < sec->reloc_count; ++i)
8758 if (this_rela.r_offset < (*internal_relocs_p)[i].r_offset)
8765 if (*internal_relocs_p != relax_info->allocated_relocs
8766 || sec->reloc_count + 1 > relax_info->allocated_relocs_count)
8768 BFD_ASSERT (relax_info->allocated_relocs == NULL
8769 || sec->reloc_count == relax_info->relocs_count);
8771 if (relax_info->allocated_relocs_count == 0)
8772 new_relocs_count = (sec->reloc_count + 2) * 2;
8774 new_relocs_count = (relax_info->allocated_relocs_count + 2) * 2;
8776 new_relocs = (Elf_Internal_Rela *)
8777 bfd_zmalloc (sizeof (Elf_Internal_Rela) * (new_relocs_count));
8781 /* We could handle this more quickly by finding the split point. */
8783 memcpy (new_relocs, *internal_relocs_p,
8784 insert_at * sizeof (Elf_Internal_Rela));
8786 new_relocs[insert_at] = this_rela;
8788 if (insert_at != sec->reloc_count)
8789 memcpy (new_relocs + insert_at + 1,
8790 (*internal_relocs_p) + insert_at,
8791 (sec->reloc_count - insert_at)
8792 * sizeof (Elf_Internal_Rela));
8794 if (*internal_relocs_p != relax_info->allocated_relocs)
8796 /* The first time we re-allocate, we can only free the
8797 old relocs if they were allocated with bfd_malloc.
8798 This is not true when keep_memory is in effect. */
8799 if (!link_info->keep_memory)
8800 free (*internal_relocs_p);
8803 free (*internal_relocs_p);
8804 relax_info->allocated_relocs = new_relocs;
8805 relax_info->allocated_relocs_count = new_relocs_count;
8806 elf_section_data (sec)->relocs = new_relocs;
8808 relax_info->relocs_count = sec->reloc_count;
8809 *internal_relocs_p = new_relocs;
8813 if (insert_at != sec->reloc_count)
8816 for (idx = sec->reloc_count; idx > insert_at; idx--)
8817 (*internal_relocs_p)[idx] = (*internal_relocs_p)[idx-1];
8819 (*internal_relocs_p)[insert_at] = this_rela;
8821 if (relax_info->allocated_relocs)
8822 relax_info->relocs_count = sec->reloc_count;
8829 /* This is similar to relax_section except that when a target is moved,
8830 we shift addresses up. We also need to modify the size. This
8831 algorithm does NOT allow for relocations into the middle of the
8832 property sections. */
8835 relax_property_section (bfd *abfd,
8837 struct bfd_link_info *link_info)
8839 Elf_Internal_Rela *internal_relocs;
8842 bfd_boolean ok = TRUE;
8843 bfd_boolean is_full_prop_section;
8844 size_t last_zfill_target_offset = 0;
8845 asection *last_zfill_target_sec = NULL;
8846 bfd_size_type sec_size;
8848 sec_size = bfd_get_section_limit (abfd, sec);
8849 internal_relocs = retrieve_internal_relocs (abfd, sec,
8850 link_info->keep_memory);
8851 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
8852 if (contents == NULL && sec_size != 0)
8858 is_full_prop_section =
8859 ( CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME)
8860 || CONST_STRNEQ (sec->name, ".gnu.linkonce.prop."));
8862 if (internal_relocs)
8864 for (i = 0; i < sec->reloc_count; i++)
8866 Elf_Internal_Rela *irel;
8867 xtensa_relax_info *target_relax_info;
8869 asection *target_sec;
8871 bfd_byte *size_p, *flags_p;
8873 /* Locally change the source address.
8874 Translate the target to the new target address.
8875 If it points to this section and has been removed, MOVE IT.
8876 Also, don't forget to modify the associated SIZE at
8879 irel = &internal_relocs[i];
8880 r_type = ELF32_R_TYPE (irel->r_info);
8881 if (r_type == R_XTENSA_NONE)
8884 /* Find the literal value. */
8885 r_reloc_init (&val.r_rel, abfd, irel, contents, sec_size);
8886 size_p = &contents[irel->r_offset + 4];
8888 if (is_full_prop_section)
8890 flags_p = &contents[irel->r_offset + 8];
8891 BFD_ASSERT (irel->r_offset + 12 <= sec_size);
8894 BFD_ASSERT (irel->r_offset + 8 <= sec_size);
8896 target_sec = r_reloc_get_section (&val.r_rel);
8897 target_relax_info = get_xtensa_relax_info (target_sec);
8899 if (target_relax_info
8900 && (target_relax_info->is_relaxable_literal_section
8901 || target_relax_info->is_relaxable_asm_section ))
8903 /* Translate the relocation's destination. */
8904 bfd_vma new_offset, new_end_offset;
8905 long old_size, new_size;
8907 new_offset = offset_with_removed_text
8908 (&target_relax_info->action_list, val.r_rel.target_offset);
8910 /* Assert that we are not out of bounds. */
8911 old_size = bfd_get_32 (abfd, size_p);
8915 /* Only the first zero-sized unreachable entry is
8916 allowed to expand. In this case the new offset
8917 should be the offset before the fill and the new
8918 size is the expansion size. For other zero-sized
8919 entries the resulting size should be zero with an
8920 offset before or after the fill address depending
8921 on whether the expanding unreachable entry
8923 if (last_zfill_target_sec
8924 && last_zfill_target_sec == target_sec
8925 && last_zfill_target_offset == val.r_rel.target_offset)
8926 new_end_offset = new_offset;
8929 new_end_offset = new_offset;
8930 new_offset = offset_with_removed_text_before_fill
8931 (&target_relax_info->action_list,
8932 val.r_rel.target_offset);
8934 /* If it is not unreachable and we have not yet
8935 seen an unreachable at this address, place it
8936 before the fill address. */
8938 || (bfd_get_32 (abfd, flags_p)
8939 & XTENSA_PROP_UNREACHABLE) == 0)
8940 new_end_offset = new_offset;
8943 last_zfill_target_sec = target_sec;
8944 last_zfill_target_offset = val.r_rel.target_offset;
8950 new_end_offset = offset_with_removed_text_before_fill
8951 (&target_relax_info->action_list,
8952 val.r_rel.target_offset + old_size);
8955 new_size = new_end_offset - new_offset;
8957 if (new_size != old_size)
8959 bfd_put_32 (abfd, new_size, size_p);
8960 pin_contents (sec, contents);
8963 if (new_offset != val.r_rel.target_offset)
8965 bfd_vma diff = new_offset - val.r_rel.target_offset;
8966 irel->r_addend += diff;
8967 pin_internal_relocs (sec, internal_relocs);
8973 /* Combine adjacent property table entries. This is also done in
8974 finish_dynamic_sections() but at that point it's too late to
8975 reclaim the space in the output section, so we do this twice. */
8977 if (internal_relocs && (!link_info->relocatable
8978 || strcmp (sec->name, XTENSA_LIT_SEC_NAME) == 0))
8980 Elf_Internal_Rela *last_irel = NULL;
8981 int removed_bytes = 0;
8982 bfd_vma offset, last_irel_offset;
8983 bfd_vma section_size;
8984 bfd_size_type entry_size;
8985 flagword predef_flags;
8987 if (is_full_prop_section)
8992 predef_flags = xtensa_get_property_predef_flags (sec);
8994 /* Walk over memory and irels at the same time.
8995 This REQUIRES that the internal_relocs be sorted by offset. */
8996 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
8997 internal_reloc_compare);
8998 nexti = 0; /* Index into internal_relocs. */
9000 pin_internal_relocs (sec, internal_relocs);
9001 pin_contents (sec, contents);
9003 last_irel_offset = (bfd_vma) -1;
9004 section_size = sec->size;
9005 BFD_ASSERT (section_size % entry_size == 0);
9007 for (offset = 0; offset < section_size; offset += entry_size)
9009 Elf_Internal_Rela *irel, *next_irel;
9010 bfd_vma bytes_to_remove, size, actual_offset;
9011 bfd_boolean remove_this_irel;
9017 /* Find the next two relocations (if there are that many left),
9018 skipping over any R_XTENSA_NONE relocs. On entry, "nexti" is
9019 the starting reloc index. After these two loops, "i"
9020 is the index of the first non-NONE reloc past that starting
9021 index, and "nexti" is the index for the next non-NONE reloc
9024 for (i = nexti; i < sec->reloc_count; i++)
9026 if (ELF32_R_TYPE (internal_relocs[i].r_info) != R_XTENSA_NONE)
9028 irel = &internal_relocs[i];
9031 internal_relocs[i].r_offset -= removed_bytes;
9034 for (nexti = i + 1; nexti < sec->reloc_count; nexti++)
9036 if (ELF32_R_TYPE (internal_relocs[nexti].r_info)
9039 next_irel = &internal_relocs[nexti];
9042 internal_relocs[nexti].r_offset -= removed_bytes;
9045 remove_this_irel = FALSE;
9046 bytes_to_remove = 0;
9047 actual_offset = offset - removed_bytes;
9048 size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
9050 if (is_full_prop_section)
9051 flags = bfd_get_32 (abfd, &contents[actual_offset + 8]);
9053 flags = predef_flags;
9055 /* Check that the irels are sorted by offset,
9056 with only one per address. */
9057 BFD_ASSERT (!irel || (int) irel->r_offset > (int) last_irel_offset);
9058 BFD_ASSERT (!next_irel || next_irel->r_offset > irel->r_offset);
9060 /* Make sure there aren't relocs on the size or flag fields. */
9061 if ((irel && irel->r_offset == offset + 4)
9062 || (is_full_prop_section
9063 && irel && irel->r_offset == offset + 8))
9065 irel->r_offset -= removed_bytes;
9066 last_irel_offset = irel->r_offset;
9068 else if (next_irel && (next_irel->r_offset == offset + 4
9069 || (is_full_prop_section
9070 && next_irel->r_offset == offset + 8)))
9073 irel->r_offset -= removed_bytes;
9074 next_irel->r_offset -= removed_bytes;
9075 last_irel_offset = next_irel->r_offset;
9077 else if (size == 0 && (flags & XTENSA_PROP_ALIGN) == 0
9078 && (flags & XTENSA_PROP_UNREACHABLE) == 0)
9080 /* Always remove entries with zero size and no alignment. */
9081 bytes_to_remove = entry_size;
9082 if (irel && irel->r_offset == offset)
9084 remove_this_irel = TRUE;
9086 irel->r_offset -= removed_bytes;
9087 last_irel_offset = irel->r_offset;
9090 else if (irel && irel->r_offset == offset)
9092 if (ELF32_R_TYPE (irel->r_info) == R_XTENSA_32)
9098 bfd_get_32 (abfd, &contents[last_irel->r_offset + 4]);
9099 bfd_vma old_address =
9100 (last_irel->r_addend
9101 + bfd_get_32 (abfd, &contents[last_irel->r_offset]));
9102 bfd_vma new_address =
9104 + bfd_get_32 (abfd, &contents[actual_offset]));
9105 if (is_full_prop_section)
9106 old_flags = bfd_get_32
9107 (abfd, &contents[last_irel->r_offset + 8]);
9109 old_flags = predef_flags;
9111 if ((ELF32_R_SYM (irel->r_info)
9112 == ELF32_R_SYM (last_irel->r_info))
9113 && old_address + old_size == new_address
9114 && old_flags == flags
9115 && (old_flags & XTENSA_PROP_INSN_BRANCH_TARGET) == 0
9116 && (old_flags & XTENSA_PROP_INSN_LOOP_TARGET) == 0)
9118 /* Fix the old size. */
9119 bfd_put_32 (abfd, old_size + size,
9120 &contents[last_irel->r_offset + 4]);
9121 bytes_to_remove = entry_size;
9122 remove_this_irel = TRUE;
9131 irel->r_offset -= removed_bytes;
9132 last_irel_offset = irel->r_offset;
9135 if (remove_this_irel)
9137 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
9138 irel->r_offset -= bytes_to_remove;
9141 if (bytes_to_remove != 0)
9143 removed_bytes += bytes_to_remove;
9144 if (offset + bytes_to_remove < section_size)
9145 memmove (&contents[actual_offset],
9146 &contents[actual_offset + bytes_to_remove],
9147 section_size - offset - bytes_to_remove);
9153 /* Clear the removed bytes. */
9154 memset (&contents[section_size - removed_bytes], 0, removed_bytes);
9156 sec->size = section_size - removed_bytes;
9158 if (xtensa_is_littable_section (sec))
9160 bfd *dynobj = elf_hash_table (link_info)->dynobj;
9164 bfd_get_section_by_name (dynobj, ".got.loc");
9166 sgotloc->size -= removed_bytes;
9173 release_internal_relocs (sec, internal_relocs);
9174 release_contents (sec, contents);
9179 /* Third relaxation pass. */
9181 /* Change symbol values to account for removed literals. */
9184 relax_section_symbols (bfd *abfd, asection *sec)
9186 xtensa_relax_info *relax_info;
9187 unsigned int sec_shndx;
9188 Elf_Internal_Shdr *symtab_hdr;
9189 Elf_Internal_Sym *isymbuf;
9190 unsigned i, num_syms, num_locals;
9192 relax_info = get_xtensa_relax_info (sec);
9193 BFD_ASSERT (relax_info);
9195 if (!relax_info->is_relaxable_literal_section
9196 && !relax_info->is_relaxable_asm_section)
9199 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
9201 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9202 isymbuf = retrieve_local_syms (abfd);
9204 num_syms = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
9205 num_locals = symtab_hdr->sh_info;
9207 /* Adjust the local symbols defined in this section. */
9208 for (i = 0; i < num_locals; i++)
9210 Elf_Internal_Sym *isym = &isymbuf[i];
9212 if (isym->st_shndx == sec_shndx)
9214 bfd_vma new_address = offset_with_removed_text
9215 (&relax_info->action_list, isym->st_value);
9216 bfd_vma new_size = isym->st_size;
9218 if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC)
9220 bfd_vma new_end = offset_with_removed_text
9221 (&relax_info->action_list, isym->st_value + isym->st_size);
9222 new_size = new_end - new_address;
9225 isym->st_value = new_address;
9226 isym->st_size = new_size;
9230 /* Now adjust the global symbols defined in this section. */
9231 for (i = 0; i < (num_syms - num_locals); i++)
9233 struct elf_link_hash_entry *sym_hash;
9235 sym_hash = elf_sym_hashes (abfd)[i];
9237 if (sym_hash->root.type == bfd_link_hash_warning)
9238 sym_hash = (struct elf_link_hash_entry *) sym_hash->root.u.i.link;
9240 if ((sym_hash->root.type == bfd_link_hash_defined
9241 || sym_hash->root.type == bfd_link_hash_defweak)
9242 && sym_hash->root.u.def.section == sec)
9244 bfd_vma new_address = offset_with_removed_text
9245 (&relax_info->action_list, sym_hash->root.u.def.value);
9246 bfd_vma new_size = sym_hash->size;
9248 if (sym_hash->type == STT_FUNC)
9250 bfd_vma new_end = offset_with_removed_text
9251 (&relax_info->action_list,
9252 sym_hash->root.u.def.value + sym_hash->size);
9253 new_size = new_end - new_address;
9256 sym_hash->root.u.def.value = new_address;
9257 sym_hash->size = new_size;
9265 /* "Fix" handling functions, called while performing relocations. */
9268 do_fix_for_relocatable_link (Elf_Internal_Rela *rel,
9270 asection *input_section,
9274 asection *sec, *old_sec;
9276 int r_type = ELF32_R_TYPE (rel->r_info);
9279 if (r_type == R_XTENSA_NONE)
9282 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
9286 r_reloc_init (&r_rel, input_bfd, rel, contents,
9287 bfd_get_section_limit (input_bfd, input_section));
9288 old_sec = r_reloc_get_section (&r_rel);
9289 old_offset = r_rel.target_offset;
9291 if (!old_sec || !r_reloc_is_defined (&r_rel))
9293 if (r_type != R_XTENSA_ASM_EXPAND)
9295 (*_bfd_error_handler)
9296 (_("%B(%A+0x%lx): unexpected fix for %s relocation"),
9297 input_bfd, input_section, rel->r_offset,
9298 elf_howto_table[r_type].name);
9301 /* Leave it be. Resolution will happen in a later stage. */
9305 sec = fix->target_sec;
9306 rel->r_addend += ((sec->output_offset + fix->target_offset)
9307 - (old_sec->output_offset + old_offset));
9314 do_fix_for_final_link (Elf_Internal_Rela *rel,
9316 asection *input_section,
9318 bfd_vma *relocationp)
9321 int r_type = ELF32_R_TYPE (rel->r_info);
9325 if (r_type == R_XTENSA_NONE)
9328 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
9332 sec = fix->target_sec;
9334 fixup_diff = rel->r_addend;
9335 if (elf_howto_table[fix->src_type].partial_inplace)
9337 bfd_vma inplace_val;
9338 BFD_ASSERT (fix->src_offset
9339 < bfd_get_section_limit (input_bfd, input_section));
9340 inplace_val = bfd_get_32 (input_bfd, &contents[fix->src_offset]);
9341 fixup_diff += inplace_val;
9344 *relocationp = (sec->output_section->vma
9345 + sec->output_offset
9346 + fix->target_offset - fixup_diff);
9350 /* Miscellaneous utility functions.... */
9353 elf_xtensa_get_plt_section (bfd *dynobj, int chunk)
9358 return bfd_get_section_by_name (dynobj, ".plt");
9360 sprintf (plt_name, ".plt.%u", chunk);
9361 return bfd_get_section_by_name (dynobj, plt_name);
9366 elf_xtensa_get_gotplt_section (bfd *dynobj, int chunk)
9371 return bfd_get_section_by_name (dynobj, ".got.plt");
9373 sprintf (got_name, ".got.plt.%u", chunk);
9374 return bfd_get_section_by_name (dynobj, got_name);
9378 /* Get the input section for a given symbol index.
9380 . a section symbol, return the section;
9381 . a common symbol, return the common section;
9382 . an undefined symbol, return the undefined section;
9383 . an indirect symbol, follow the links;
9384 . an absolute value, return the absolute section. */
9387 get_elf_r_symndx_section (bfd *abfd, unsigned long r_symndx)
9389 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9390 asection *target_sec = NULL;
9391 if (r_symndx < symtab_hdr->sh_info)
9393 Elf_Internal_Sym *isymbuf;
9394 unsigned int section_index;
9396 isymbuf = retrieve_local_syms (abfd);
9397 section_index = isymbuf[r_symndx].st_shndx;
9399 if (section_index == SHN_UNDEF)
9400 target_sec = bfd_und_section_ptr;
9401 else if (section_index > 0 && section_index < SHN_LORESERVE)
9402 target_sec = bfd_section_from_elf_index (abfd, section_index);
9403 else if (section_index == SHN_ABS)
9404 target_sec = bfd_abs_section_ptr;
9405 else if (section_index == SHN_COMMON)
9406 target_sec = bfd_com_section_ptr;
9413 unsigned long indx = r_symndx - symtab_hdr->sh_info;
9414 struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
9416 while (h->root.type == bfd_link_hash_indirect
9417 || h->root.type == bfd_link_hash_warning)
9418 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9420 switch (h->root.type)
9422 case bfd_link_hash_defined:
9423 case bfd_link_hash_defweak:
9424 target_sec = h->root.u.def.section;
9426 case bfd_link_hash_common:
9427 target_sec = bfd_com_section_ptr;
9429 case bfd_link_hash_undefined:
9430 case bfd_link_hash_undefweak:
9431 target_sec = bfd_und_section_ptr;
9433 default: /* New indirect warning. */
9434 target_sec = bfd_und_section_ptr;
9442 static struct elf_link_hash_entry *
9443 get_elf_r_symndx_hash_entry (bfd *abfd, unsigned long r_symndx)
9446 struct elf_link_hash_entry *h;
9447 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9449 if (r_symndx < symtab_hdr->sh_info)
9452 indx = r_symndx - symtab_hdr->sh_info;
9453 h = elf_sym_hashes (abfd)[indx];
9454 while (h->root.type == bfd_link_hash_indirect
9455 || h->root.type == bfd_link_hash_warning)
9456 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9461 /* Get the section-relative offset for a symbol number. */
9464 get_elf_r_symndx_offset (bfd *abfd, unsigned long r_symndx)
9466 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9469 if (r_symndx < symtab_hdr->sh_info)
9471 Elf_Internal_Sym *isymbuf;
9472 isymbuf = retrieve_local_syms (abfd);
9473 offset = isymbuf[r_symndx].st_value;
9477 unsigned long indx = r_symndx - symtab_hdr->sh_info;
9478 struct elf_link_hash_entry *h =
9479 elf_sym_hashes (abfd)[indx];
9481 while (h->root.type == bfd_link_hash_indirect
9482 || h->root.type == bfd_link_hash_warning)
9483 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9484 if (h->root.type == bfd_link_hash_defined
9485 || h->root.type == bfd_link_hash_defweak)
9486 offset = h->root.u.def.value;
9493 is_reloc_sym_weak (bfd *abfd, Elf_Internal_Rela *rel)
9495 unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
9496 struct elf_link_hash_entry *h;
9498 h = get_elf_r_symndx_hash_entry (abfd, r_symndx);
9499 if (h && h->root.type == bfd_link_hash_defweak)
9506 pcrel_reloc_fits (xtensa_opcode opc,
9508 bfd_vma self_address,
9509 bfd_vma dest_address)
9511 xtensa_isa isa = xtensa_default_isa;
9512 uint32 valp = dest_address;
9513 if (xtensa_operand_do_reloc (isa, opc, opnd, &valp, self_address)
9514 || xtensa_operand_encode (isa, opc, opnd, &valp))
9520 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
9523 xtensa_is_property_section (asection *sec)
9525 if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
9526 || CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME)
9527 || CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME))
9530 if (strncmp (".gnu.linkonce.", sec->name, linkonce_len) == 0
9531 && (CONST_STRNEQ (&sec->name[linkonce_len], "x.")
9532 || CONST_STRNEQ (&sec->name[linkonce_len], "p.")
9533 || CONST_STRNEQ (&sec->name[linkonce_len], "prop.")))
9541 xtensa_is_littable_section (asection *sec)
9543 if (CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME))
9546 if (strncmp (".gnu.linkonce.", sec->name, linkonce_len) == 0
9547 && sec->name[linkonce_len] == 'p'
9548 && sec->name[linkonce_len + 1] == '.')
9556 internal_reloc_compare (const void *ap, const void *bp)
9558 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
9559 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
9561 if (a->r_offset != b->r_offset)
9562 return (a->r_offset - b->r_offset);
9564 /* We don't need to sort on these criteria for correctness,
9565 but enforcing a more strict ordering prevents unstable qsort
9566 from behaving differently with different implementations.
9567 Without the code below we get correct but different results
9568 on Solaris 2.7 and 2.8. We would like to always produce the
9569 same results no matter the host. */
9571 if (a->r_info != b->r_info)
9572 return (a->r_info - b->r_info);
9574 return (a->r_addend - b->r_addend);
9579 internal_reloc_matches (const void *ap, const void *bp)
9581 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
9582 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
9584 /* Check if one entry overlaps with the other; this shouldn't happen
9585 except when searching for a match. */
9586 return (a->r_offset - b->r_offset);
9590 /* Predicate function used to look up a section in a particular group. */
9593 match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
9595 const char *gname = inf;
9596 const char *group_name = elf_group_name (sec);
9598 return (group_name == gname
9599 || (group_name != NULL
9601 && strcmp (group_name, gname) == 0));
9606 xtensa_get_property_section (asection *sec, const char *base_name)
9608 const char *suffix, *group_name;
9609 char *prop_sec_name;
9612 group_name = elf_group_name (sec);
9615 suffix = strrchr (sec->name, '.');
9616 if (suffix == sec->name)
9618 prop_sec_name = (char *) bfd_malloc (strlen (base_name) + 1
9619 + (suffix ? strlen (suffix) : 0));
9620 strcpy (prop_sec_name, base_name);
9622 strcat (prop_sec_name, suffix);
9624 else if (strncmp (sec->name, ".gnu.linkonce.", linkonce_len) == 0)
9626 char *linkonce_kind = 0;
9628 if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
9629 linkonce_kind = "x.";
9630 else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
9631 linkonce_kind = "p.";
9632 else if (strcmp (base_name, XTENSA_PROP_SEC_NAME) == 0)
9633 linkonce_kind = "prop.";
9637 prop_sec_name = (char *) bfd_malloc (strlen (sec->name)
9638 + strlen (linkonce_kind) + 1);
9639 memcpy (prop_sec_name, ".gnu.linkonce.", linkonce_len);
9640 strcpy (prop_sec_name + linkonce_len, linkonce_kind);
9642 suffix = sec->name + linkonce_len;
9643 /* For backward compatibility, replace "t." instead of inserting
9644 the new linkonce_kind (but not for "prop" sections). */
9645 if (CONST_STRNEQ (suffix, "t.") && linkonce_kind[1] == '.')
9647 strcat (prop_sec_name + linkonce_len, suffix);
9650 prop_sec_name = strdup (base_name);
9652 /* Check if the section already exists. */
9653 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
9654 match_section_group,
9655 (void *) group_name);
9656 /* If not, create it. */
9659 flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
9660 flags |= (bfd_get_section_flags (sec->owner, sec)
9661 & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES));
9663 prop_sec = bfd_make_section_anyway_with_flags
9664 (sec->owner, strdup (prop_sec_name), flags);
9668 elf_group_name (prop_sec) = group_name;
9671 free (prop_sec_name);
9677 xtensa_get_property_predef_flags (asection *sec)
9679 if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
9680 || CONST_STRNEQ (sec->name, ".gnu.linkonce.x."))
9681 return (XTENSA_PROP_INSN
9682 | XTENSA_PROP_INSN_NO_TRANSFORM
9683 | XTENSA_PROP_INSN_NO_REORDER);
9685 if (xtensa_is_littable_section (sec))
9686 return (XTENSA_PROP_LITERAL
9687 | XTENSA_PROP_INSN_NO_TRANSFORM
9688 | XTENSA_PROP_INSN_NO_REORDER);
9694 /* Other functions called directly by the linker. */
9697 xtensa_callback_required_dependence (bfd *abfd,
9699 struct bfd_link_info *link_info,
9700 deps_callback_t callback,
9703 Elf_Internal_Rela *internal_relocs;
9706 bfd_boolean ok = TRUE;
9707 bfd_size_type sec_size;
9709 sec_size = bfd_get_section_limit (abfd, sec);
9711 /* ".plt*" sections have no explicit relocations but they contain L32R
9712 instructions that reference the corresponding ".got.plt*" sections. */
9713 if ((sec->flags & SEC_LINKER_CREATED) != 0
9714 && CONST_STRNEQ (sec->name, ".plt"))
9718 /* Find the corresponding ".got.plt*" section. */
9719 if (sec->name[4] == '\0')
9720 sgotplt = bfd_get_section_by_name (sec->owner, ".got.plt");
9726 BFD_ASSERT (sec->name[4] == '.');
9727 chunk = strtol (&sec->name[5], NULL, 10);
9729 sprintf (got_name, ".got.plt.%u", chunk);
9730 sgotplt = bfd_get_section_by_name (sec->owner, got_name);
9732 BFD_ASSERT (sgotplt);
9734 /* Assume worst-case offsets: L32R at the very end of the ".plt"
9735 section referencing a literal at the very beginning of
9736 ".got.plt". This is very close to the real dependence, anyway. */
9737 (*callback) (sec, sec_size, sgotplt, 0, closure);
9740 internal_relocs = retrieve_internal_relocs (abfd, sec,
9741 link_info->keep_memory);
9742 if (internal_relocs == NULL
9743 || sec->reloc_count == 0)
9746 /* Cache the contents for the duration of this scan. */
9747 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
9748 if (contents == NULL && sec_size != 0)
9754 if (!xtensa_default_isa)
9755 xtensa_default_isa = xtensa_isa_init (0, 0);
9757 for (i = 0; i < sec->reloc_count; i++)
9759 Elf_Internal_Rela *irel = &internal_relocs[i];
9760 if (is_l32r_relocation (abfd, sec, contents, irel))
9763 asection *target_sec;
9764 bfd_vma target_offset;
9766 r_reloc_init (&l32r_rel, abfd, irel, contents, sec_size);
9769 /* L32Rs must be local to the input file. */
9770 if (r_reloc_is_defined (&l32r_rel))
9772 target_sec = r_reloc_get_section (&l32r_rel);
9773 target_offset = l32r_rel.target_offset;
9775 (*callback) (sec, irel->r_offset, target_sec, target_offset,
9781 release_internal_relocs (sec, internal_relocs);
9782 release_contents (sec, contents);
9786 /* The default literal sections should always be marked as "code" (i.e.,
9787 SHF_EXECINSTR). This is particularly important for the Linux kernel
9788 module loader so that the literals are not placed after the text. */
9789 static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
9791 { STRING_COMMA_LEN (".fini.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
9792 { STRING_COMMA_LEN (".init.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
9793 { STRING_COMMA_LEN (".literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
9794 { NULL, 0, 0, 0, 0 }
9798 #define TARGET_LITTLE_SYM bfd_elf32_xtensa_le_vec
9799 #define TARGET_LITTLE_NAME "elf32-xtensa-le"
9800 #define TARGET_BIG_SYM bfd_elf32_xtensa_be_vec
9801 #define TARGET_BIG_NAME "elf32-xtensa-be"
9802 #define ELF_ARCH bfd_arch_xtensa
9804 #define ELF_MACHINE_CODE EM_XTENSA
9805 #define ELF_MACHINE_ALT1 EM_XTENSA_OLD
9808 #define ELF_MAXPAGESIZE (1 << XCHAL_MMU_MIN_PTE_PAGE_SIZE)
9809 #else /* !XCHAL_HAVE_MMU */
9810 #define ELF_MAXPAGESIZE 1
9811 #endif /* !XCHAL_HAVE_MMU */
9812 #endif /* ELF_ARCH */
9814 #define elf_backend_can_gc_sections 1
9815 #define elf_backend_can_refcount 1
9816 #define elf_backend_plt_readonly 1
9817 #define elf_backend_got_header_size 4
9818 #define elf_backend_want_dynbss 0
9819 #define elf_backend_want_got_plt 1
9821 #define elf_info_to_howto elf_xtensa_info_to_howto_rela
9823 #define bfd_elf32_bfd_merge_private_bfd_data elf_xtensa_merge_private_bfd_data
9824 #define bfd_elf32_new_section_hook elf_xtensa_new_section_hook
9825 #define bfd_elf32_bfd_print_private_bfd_data elf_xtensa_print_private_bfd_data
9826 #define bfd_elf32_bfd_relax_section elf_xtensa_relax_section
9827 #define bfd_elf32_bfd_reloc_type_lookup elf_xtensa_reloc_type_lookup
9828 #define bfd_elf32_bfd_set_private_flags elf_xtensa_set_private_flags
9830 #define elf_backend_adjust_dynamic_symbol elf_xtensa_adjust_dynamic_symbol
9831 #define elf_backend_check_relocs elf_xtensa_check_relocs
9832 #define elf_backend_create_dynamic_sections elf_xtensa_create_dynamic_sections
9833 #define elf_backend_discard_info elf_xtensa_discard_info
9834 #define elf_backend_ignore_discarded_relocs elf_xtensa_ignore_discarded_relocs
9835 #define elf_backend_final_write_processing elf_xtensa_final_write_processing
9836 #define elf_backend_finish_dynamic_sections elf_xtensa_finish_dynamic_sections
9837 #define elf_backend_finish_dynamic_symbol elf_xtensa_finish_dynamic_symbol
9838 #define elf_backend_gc_mark_hook elf_xtensa_gc_mark_hook
9839 #define elf_backend_gc_sweep_hook elf_xtensa_gc_sweep_hook
9840 #define elf_backend_grok_prstatus elf_xtensa_grok_prstatus
9841 #define elf_backend_grok_psinfo elf_xtensa_grok_psinfo
9842 #define elf_backend_hide_symbol elf_xtensa_hide_symbol
9843 #define elf_backend_object_p elf_xtensa_object_p
9844 #define elf_backend_reloc_type_class elf_xtensa_reloc_type_class
9845 #define elf_backend_relocate_section elf_xtensa_relocate_section
9846 #define elf_backend_size_dynamic_sections elf_xtensa_size_dynamic_sections
9847 #define elf_backend_special_sections elf_xtensa_special_sections
9848 #define elf_backend_action_discarded elf_xtensa_action_discarded
9850 #include "elf32-target.h"