* gdb.base/annota1.exp, gdb.base/maint.exp: Use string_to_regexp.
[deliverable/binutils-gdb.git] / bfd / elf32-xtensa.c
CommitLineData
e0001a05 1/* Xtensa-specific support for 32-bit ELF.
f592407e 2 Copyright 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
e0001a05
NC
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
3e110533 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
53e09e0a 19 02110-1301, USA. */
e0001a05
NC
20
21#include "bfd.h"
22#include "sysdep.h"
23
e0001a05 24#include <stdarg.h>
e0001a05
NC
25#include <strings.h>
26
27#include "bfdlink.h"
28#include "libbfd.h"
29#include "elf-bfd.h"
30#include "elf/xtensa.h"
31#include "xtensa-isa.h"
32#include "xtensa-config.h"
33
43cd72b9
BW
34#define XTENSA_NO_NOP_REMOVAL 0
35
e0001a05
NC
36/* Local helper functions. */
37
7fa3d080 38static bfd_boolean add_extra_plt_sections (bfd *, int);
2db662be 39static char *vsprint_msg (const char *, const char *, int, ...) ATTRIBUTE_PRINTF(2,4);
e0001a05 40static bfd_reloc_status_type bfd_elf_xtensa_reloc
7fa3d080 41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43cd72b9 42static bfd_boolean do_fix_for_relocatable_link
7fa3d080 43 (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *);
e0001a05 44static void do_fix_for_final_link
7fa3d080 45 (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *, bfd_vma *);
e0001a05
NC
46
47/* Local functions to handle Xtensa configurability. */
48
7fa3d080
BW
49static bfd_boolean is_indirect_call_opcode (xtensa_opcode);
50static bfd_boolean is_direct_call_opcode (xtensa_opcode);
51static bfd_boolean is_windowed_call_opcode (xtensa_opcode);
52static xtensa_opcode get_const16_opcode (void);
53static xtensa_opcode get_l32r_opcode (void);
54static bfd_vma l32r_offset (bfd_vma, bfd_vma);
55static int get_relocation_opnd (xtensa_opcode, int);
56static int get_relocation_slot (int);
e0001a05 57static xtensa_opcode get_relocation_opcode
7fa3d080 58 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
e0001a05 59static bfd_boolean is_l32r_relocation
7fa3d080
BW
60 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
61static bfd_boolean is_alt_relocation (int);
62static bfd_boolean is_operand_relocation (int);
43cd72b9 63static bfd_size_type insn_decode_len
7fa3d080 64 (bfd_byte *, bfd_size_type, bfd_size_type);
43cd72b9 65static xtensa_opcode insn_decode_opcode
7fa3d080 66 (bfd_byte *, bfd_size_type, bfd_size_type, int);
43cd72b9 67static bfd_boolean check_branch_target_aligned
7fa3d080 68 (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
43cd72b9 69static bfd_boolean check_loop_aligned
7fa3d080
BW
70 (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
71static bfd_boolean check_branch_target_aligned_address (bfd_vma, int);
43cd72b9 72static bfd_size_type get_asm_simplify_size
7fa3d080 73 (bfd_byte *, bfd_size_type, bfd_size_type);
e0001a05
NC
74
75/* Functions for link-time code simplifications. */
76
43cd72b9 77static bfd_reloc_status_type elf_xtensa_do_asm_simplify
7fa3d080 78 (bfd_byte *, bfd_vma, bfd_vma, char **);
e0001a05 79static bfd_reloc_status_type contract_asm_expansion
7fa3d080
BW
80 (bfd_byte *, bfd_vma, Elf_Internal_Rela *, char **);
81static xtensa_opcode swap_callx_for_call_opcode (xtensa_opcode);
82static xtensa_opcode get_expanded_call_opcode (bfd_byte *, int, bfd_boolean *);
e0001a05
NC
83
84/* Access to internal relocations, section contents and symbols. */
85
86static Elf_Internal_Rela *retrieve_internal_relocs
7fa3d080
BW
87 (bfd *, asection *, bfd_boolean);
88static void pin_internal_relocs (asection *, Elf_Internal_Rela *);
89static void release_internal_relocs (asection *, Elf_Internal_Rela *);
90static bfd_byte *retrieve_contents (bfd *, asection *, bfd_boolean);
91static void pin_contents (asection *, bfd_byte *);
92static void release_contents (asection *, bfd_byte *);
93static Elf_Internal_Sym *retrieve_local_syms (bfd *);
e0001a05
NC
94
95/* Miscellaneous utility functions. */
96
7fa3d080
BW
97static asection *elf_xtensa_get_plt_section (bfd *, int);
98static asection *elf_xtensa_get_gotplt_section (bfd *, int);
99static asection *get_elf_r_symndx_section (bfd *, unsigned long);
e0001a05 100static struct elf_link_hash_entry *get_elf_r_symndx_hash_entry
7fa3d080
BW
101 (bfd *, unsigned long);
102static bfd_vma get_elf_r_symndx_offset (bfd *, unsigned long);
103static bfd_boolean is_reloc_sym_weak (bfd *, Elf_Internal_Rela *);
104static bfd_boolean pcrel_reloc_fits (xtensa_opcode, int, bfd_vma, bfd_vma);
105static bfd_boolean xtensa_is_property_section (asection *);
106static bfd_boolean xtensa_is_littable_section (asection *);
107static int internal_reloc_compare (const void *, const void *);
108static int internal_reloc_matches (const void *, const void *);
74869ac7 109extern asection *xtensa_get_property_section (asection *, const char *);
7fa3d080 110static flagword xtensa_get_property_predef_flags (asection *);
e0001a05
NC
111
112/* Other functions called directly by the linker. */
113
114typedef void (*deps_callback_t)
7fa3d080 115 (asection *, bfd_vma, asection *, bfd_vma, void *);
e0001a05 116extern bfd_boolean xtensa_callback_required_dependence
7fa3d080 117 (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *);
e0001a05
NC
118
119
43cd72b9
BW
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. */
7fa3d080 124
43cd72b9
BW
125int elf32xtensa_size_opt;
126
127
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. */
e0001a05 131
7fa3d080 132typedef struct xtensa_relax_info_struct xtensa_relax_info;
e0001a05 133
43cd72b9 134
e0001a05
NC
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
b536dc1e 139 needed. It is OK if this count is an overestimate, e.g., some
e0001a05
NC
140 relocations may be removed by GC. */
141
142static int plt_reloc_count = 0;
143
144
43cd72b9
BW
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
148 this information. */
149
150xtensa_isa xtensa_default_isa;
151
152
e0001a05
NC
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. */
156
157static bfd_boolean relaxing_section = FALSE;
158
43cd72b9
BW
159/* When this is true, during final links, literals that cannot be
160 coalesced and their relocations may be moved to other sections. */
161
162int elf32xtensa_no_literal_movement = 1;
163
e0001a05
NC
164\f
165static reloc_howto_type elf_howto_table[] =
166{
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),
193 EMPTY_HOWTO (7),
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),
211 EMPTY_HOWTO (13),
212 EMPTY_HOWTO (14),
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",
43cd72b9
BW
220 FALSE, 0x00000000, 0x00000000, FALSE),
221
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),
232
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),
279
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)
e0001a05
NC
326};
327
43cd72b9 328#if DEBUG_GEN_RELOC
e0001a05
NC
329#define TRACE(str) \
330 fprintf (stderr, "Xtensa bfd reloc lookup %d (%s)\n", code, str)
331#else
332#define TRACE(str)
333#endif
334
335static reloc_howto_type *
7fa3d080
BW
336elf_xtensa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
337 bfd_reloc_code_real_type code)
e0001a05
NC
338{
339 switch (code)
340 {
341 case BFD_RELOC_NONE:
342 TRACE ("BFD_RELOC_NONE");
343 return &elf_howto_table[(unsigned) R_XTENSA_NONE ];
344
345 case BFD_RELOC_32:
346 TRACE ("BFD_RELOC_32");
347 return &elf_howto_table[(unsigned) R_XTENSA_32 ];
348
43cd72b9
BW
349 case BFD_RELOC_XTENSA_DIFF8:
350 TRACE ("BFD_RELOC_XTENSA_DIFF8");
351 return &elf_howto_table[(unsigned) R_XTENSA_DIFF8 ];
352
353 case BFD_RELOC_XTENSA_DIFF16:
354 TRACE ("BFD_RELOC_XTENSA_DIFF16");
355 return &elf_howto_table[(unsigned) R_XTENSA_DIFF16 ];
356
357 case BFD_RELOC_XTENSA_DIFF32:
358 TRACE ("BFD_RELOC_XTENSA_DIFF32");
359 return &elf_howto_table[(unsigned) R_XTENSA_DIFF32 ];
360
e0001a05
NC
361 case BFD_RELOC_XTENSA_RTLD:
362 TRACE ("BFD_RELOC_XTENSA_RTLD");
363 return &elf_howto_table[(unsigned) R_XTENSA_RTLD ];
364
365 case BFD_RELOC_XTENSA_GLOB_DAT:
366 TRACE ("BFD_RELOC_XTENSA_GLOB_DAT");
367 return &elf_howto_table[(unsigned) R_XTENSA_GLOB_DAT ];
368
369 case BFD_RELOC_XTENSA_JMP_SLOT:
370 TRACE ("BFD_RELOC_XTENSA_JMP_SLOT");
371 return &elf_howto_table[(unsigned) R_XTENSA_JMP_SLOT ];
372
373 case BFD_RELOC_XTENSA_RELATIVE:
374 TRACE ("BFD_RELOC_XTENSA_RELATIVE");
375 return &elf_howto_table[(unsigned) R_XTENSA_RELATIVE ];
376
377 case BFD_RELOC_XTENSA_PLT:
378 TRACE ("BFD_RELOC_XTENSA_PLT");
379 return &elf_howto_table[(unsigned) R_XTENSA_PLT ];
380
381 case BFD_RELOC_XTENSA_OP0:
382 TRACE ("BFD_RELOC_XTENSA_OP0");
383 return &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
384
385 case BFD_RELOC_XTENSA_OP1:
386 TRACE ("BFD_RELOC_XTENSA_OP1");
387 return &elf_howto_table[(unsigned) R_XTENSA_OP1 ];
388
389 case BFD_RELOC_XTENSA_OP2:
390 TRACE ("BFD_RELOC_XTENSA_OP2");
391 return &elf_howto_table[(unsigned) R_XTENSA_OP2 ];
392
393 case BFD_RELOC_XTENSA_ASM_EXPAND:
394 TRACE ("BFD_RELOC_XTENSA_ASM_EXPAND");
395 return &elf_howto_table[(unsigned) R_XTENSA_ASM_EXPAND ];
396
397 case BFD_RELOC_XTENSA_ASM_SIMPLIFY:
398 TRACE ("BFD_RELOC_XTENSA_ASM_SIMPLIFY");
399 return &elf_howto_table[(unsigned) R_XTENSA_ASM_SIMPLIFY ];
400
401 case BFD_RELOC_VTABLE_INHERIT:
402 TRACE ("BFD_RELOC_VTABLE_INHERIT");
403 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTINHERIT ];
404
405 case BFD_RELOC_VTABLE_ENTRY:
406 TRACE ("BFD_RELOC_VTABLE_ENTRY");
407 return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTENTRY ];
408
409 default:
43cd72b9
BW
410 if (code >= BFD_RELOC_XTENSA_SLOT0_OP
411 && code <= BFD_RELOC_XTENSA_SLOT14_OP)
412 {
413 unsigned n = (R_XTENSA_SLOT0_OP +
414 (code - BFD_RELOC_XTENSA_SLOT0_OP));
415 return &elf_howto_table[n];
416 }
417
418 if (code >= BFD_RELOC_XTENSA_SLOT0_ALT
419 && code <= BFD_RELOC_XTENSA_SLOT14_ALT)
420 {
421 unsigned n = (R_XTENSA_SLOT0_ALT +
422 (code - BFD_RELOC_XTENSA_SLOT0_ALT));
423 return &elf_howto_table[n];
424 }
425
e0001a05
NC
426 break;
427 }
428
429 TRACE ("Unknown");
430 return NULL;
431}
432
433
434/* Given an ELF "rela" relocation, find the corresponding howto and record
435 it in the BFD internal arelent representation of the relocation. */
436
437static void
7fa3d080
BW
438elf_xtensa_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
439 arelent *cache_ptr,
440 Elf_Internal_Rela *dst)
e0001a05
NC
441{
442 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
443
444 BFD_ASSERT (r_type < (unsigned int) R_XTENSA_max);
445 cache_ptr->howto = &elf_howto_table[r_type];
446}
447
448\f
449/* Functions for the Xtensa ELF linker. */
450
451/* The name of the dynamic interpreter. This is put in the .interp
452 section. */
453
454#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
455
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
458 the PLT entry.) */
459
460#define PLT_ENTRY_SIZE 16
461
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. */
471
472#define PLT_ENTRIES_PER_CHUNK 254
473
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. */
478
479static const bfd_byte elf_xtensa_be_plt_entry[PLT_ENTRY_SIZE] =
480{
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 */
486 0 /* unused */
487};
488
489static const bfd_byte elf_xtensa_le_plt_entry[PLT_ENTRY_SIZE] =
490{
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 */
496 0 /* unused */
497};
498
571b5725
BW
499
500static inline bfd_boolean
7fa3d080
BW
501xtensa_elf_dynamic_symbol_p (struct elf_link_hash_entry *h,
502 struct bfd_link_info *info)
571b5725
BW
503{
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. */
509
510 return _bfd_elf_dynamic_symbol_p (h, info, 0);
511}
512
e0001a05
NC
513\f
514static int
7fa3d080 515property_table_compare (const void *ap, const void *bp)
e0001a05
NC
516{
517 const property_table_entry *a = (const property_table_entry *) ap;
518 const property_table_entry *b = (const property_table_entry *) bp;
519
43cd72b9
BW
520 if (a->address == b->address)
521 {
43cd72b9
BW
522 if (a->size != b->size)
523 return (a->size - b->size);
524
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));
528
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));
534
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));
539
540 return (a->flags - b->flags);
541 }
542
543 return (a->address - b->address);
544}
545
546
547static int
7fa3d080 548property_table_matches (const void *ap, const void *bp)
43cd72b9
BW
549{
550 const property_table_entry *a = (const property_table_entry *) ap;
551 const property_table_entry *b = (const property_table_entry *) bp;
552
553 /* Check if one entry overlaps with the other. */
e0001a05
NC
554 if ((b->address >= a->address && b->address < (a->address + a->size))
555 || (a->address >= b->address && a->address < (b->address + b->size)))
556 return 0;
557
558 return (a->address - b->address);
559}
560
561
43cd72b9
BW
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. */
e0001a05 565
7fa3d080
BW
566static int
567xtensa_read_table_entries (bfd *abfd,
568 asection *section,
569 property_table_entry **table_p,
570 const char *sec_name,
571 bfd_boolean output_addr)
e0001a05
NC
572{
573 asection *table_section;
e0001a05
NC
574 bfd_size_type table_size = 0;
575 bfd_byte *table_data;
576 property_table_entry *blocks;
e4115460 577 int blk, block_count;
e0001a05
NC
578 bfd_size_type num_records;
579 Elf_Internal_Rela *internal_relocs;
3ba3bc8c 580 bfd_vma section_addr;
43cd72b9
BW
581 flagword predef_flags;
582 bfd_size_type table_entry_size;
583
584 if (!section
585 || !(section->flags & SEC_ALLOC)
586 || (section->flags & SEC_DEBUGGING))
587 {
588 *table_p = NULL;
589 return 0;
590 }
e0001a05 591
74869ac7 592 table_section = xtensa_get_property_section (section, sec_name);
43cd72b9 593 if (table_section)
eea6121a 594 table_size = table_section->size;
43cd72b9 595
e0001a05
NC
596 if (table_size == 0)
597 {
598 *table_p = NULL;
599 return 0;
600 }
601
43cd72b9
BW
602 predef_flags = xtensa_get_property_predef_flags (table_section);
603 table_entry_size = 12;
604 if (predef_flags)
605 table_entry_size -= 4;
606
607 num_records = table_size / table_entry_size;
e0001a05
NC
608 table_data = retrieve_contents (abfd, table_section, TRUE);
609 blocks = (property_table_entry *)
610 bfd_malloc (num_records * sizeof (property_table_entry));
611 block_count = 0;
43cd72b9
BW
612
613 if (output_addr)
614 section_addr = section->output_section->vma + section->output_offset;
615 else
616 section_addr = section->vma;
3ba3bc8c 617
e0001a05
NC
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);
3ba3bc8c 621 if (internal_relocs && !table_section->reloc_done)
e0001a05
NC
622 {
623 unsigned i;
624
625 for (i = 0; i < table_section->reloc_count; i++)
626 {
627 Elf_Internal_Rela *rel = &internal_relocs[i];
628 unsigned long r_symndx;
629
630 if (ELF32_R_TYPE (rel->r_info) == R_XTENSA_NONE)
631 continue;
632
633 BFD_ASSERT (ELF32_R_TYPE (rel->r_info) == R_XTENSA_32);
634 r_symndx = ELF32_R_SYM (rel->r_info);
635
636 if (get_elf_r_symndx_section (abfd, r_symndx) == section)
637 {
638 bfd_vma sym_off = get_elf_r_symndx_offset (abfd, r_symndx);
43cd72b9 639 BFD_ASSERT (sym_off == 0);
e0001a05 640 blocks[block_count].address =
3ba3bc8c 641 (section_addr + sym_off + rel->r_addend
e0001a05
NC
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);
43cd72b9
BW
645 if (predef_flags)
646 blocks[block_count].flags = predef_flags;
647 else
648 blocks[block_count].flags =
649 bfd_get_32 (abfd, table_data + rel->r_offset + 8);
e0001a05
NC
650 block_count++;
651 }
652 }
653 }
654 else
655 {
3ba3bc8c
BW
656 /* The file has already been relocated and the addresses are
657 already in the table. */
e0001a05 658 bfd_vma off;
43cd72b9 659 bfd_size_type section_limit = bfd_get_section_limit (abfd, section);
e0001a05 660
43cd72b9 661 for (off = 0; off < table_size; off += table_entry_size)
e0001a05
NC
662 {
663 bfd_vma address = bfd_get_32 (abfd, table_data + off);
664
3ba3bc8c 665 if (address >= section_addr
43cd72b9 666 && address < section_addr + section_limit)
e0001a05
NC
667 {
668 blocks[block_count].address = address;
669 blocks[block_count].size =
670 bfd_get_32 (abfd, table_data + off + 4);
43cd72b9
BW
671 if (predef_flags)
672 blocks[block_count].flags = predef_flags;
673 else
674 blocks[block_count].flags =
675 bfd_get_32 (abfd, table_data + off + 8);
e0001a05
NC
676 block_count++;
677 }
678 }
679 }
680
681 release_contents (table_section, table_data);
682 release_internal_relocs (table_section, internal_relocs);
683
43cd72b9 684 if (block_count > 0)
e0001a05
NC
685 {
686 /* Now sort them into address order for easy reference. */
687 qsort (blocks, block_count, sizeof (property_table_entry),
688 property_table_compare);
e4115460
BW
689
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++)
693 {
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)
700 {
701 (*_bfd_error_handler) (_("%B(%A): invalid property table"),
702 abfd, section);
703 bfd_set_error (bfd_error_bad_value);
704 free (blocks);
705 return -1;
706 }
707 }
e0001a05 708 }
43cd72b9 709
e0001a05
NC
710 *table_p = blocks;
711 return block_count;
712}
713
714
7fa3d080
BW
715static property_table_entry *
716elf_xtensa_find_property_entry (property_table_entry *property_table,
717 int property_table_size,
718 bfd_vma addr)
e0001a05
NC
719{
720 property_table_entry entry;
43cd72b9 721 property_table_entry *rv;
e0001a05 722
43cd72b9
BW
723 if (property_table_size == 0)
724 return NULL;
e0001a05
NC
725
726 entry.address = addr;
727 entry.size = 1;
43cd72b9 728 entry.flags = 0;
e0001a05 729
43cd72b9
BW
730 rv = bsearch (&entry, property_table, property_table_size,
731 sizeof (property_table_entry), property_table_matches);
732 return rv;
733}
734
735
736static bfd_boolean
7fa3d080
BW
737elf_xtensa_in_literal_pool (property_table_entry *lit_table,
738 int lit_table_size,
739 bfd_vma addr)
43cd72b9
BW
740{
741 if (elf_xtensa_find_property_entry (lit_table, lit_table_size, addr))
e0001a05
NC
742 return TRUE;
743
744 return FALSE;
745}
746
747\f
748/* Look through the relocs for a section during the first phase, and
749 calculate needed space in the dynamic reloc sections. */
750
751static bfd_boolean
7fa3d080
BW
752elf_xtensa_check_relocs (bfd *abfd,
753 struct bfd_link_info *info,
754 asection *sec,
755 const Elf_Internal_Rela *relocs)
e0001a05
NC
756{
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;
e0001a05 761
1049f94e 762 if (info->relocatable)
e0001a05
NC
763 return TRUE;
764
765 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
766 sym_hashes = elf_sym_hashes (abfd);
767
e0001a05
NC
768 rel_end = relocs + sec->reloc_count;
769 for (rel = relocs; rel < rel_end; rel++)
770 {
771 unsigned int r_type;
772 unsigned long r_symndx;
773 struct elf_link_hash_entry *h;
774
775 r_symndx = ELF32_R_SYM (rel->r_info);
776 r_type = ELF32_R_TYPE (rel->r_info);
777
778 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
779 {
d003868e
AM
780 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
781 abfd, r_symndx);
e0001a05
NC
782 return FALSE;
783 }
784
785 if (r_symndx < symtab_hdr->sh_info)
786 h = NULL;
787 else
788 {
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;
793 }
794
795 switch (r_type)
796 {
797 case R_XTENSA_32:
798 if (h == NULL)
799 goto local_literal;
800
801 if ((sec->flags & SEC_ALLOC) != 0)
802 {
e0001a05
NC
803 if (h->got.refcount <= 0)
804 h->got.refcount = 1;
805 else
806 h->got.refcount += 1;
807 }
808 break;
809
810 case R_XTENSA_PLT:
811 /* If this relocation is against a local symbol, then it's
812 exactly the same as a normal local GOT entry. */
813 if (h == NULL)
814 goto local_literal;
815
816 if ((sec->flags & SEC_ALLOC) != 0)
817 {
e0001a05
NC
818 if (h->plt.refcount <= 0)
819 {
f5385ebf 820 h->needs_plt = 1;
e0001a05
NC
821 h->plt.refcount = 1;
822 }
823 else
824 h->plt.refcount += 1;
825
826 /* Keep track of the total PLT relocation count even if we
827 don't yet know whether the dynamic sections will be
828 created. */
829 plt_reloc_count += 1;
830
831 if (elf_hash_table (info)->dynamic_sections_created)
832 {
833 if (!add_extra_plt_sections (elf_hash_table (info)->dynobj,
834 plt_reloc_count))
835 return FALSE;
836 }
837 }
838 break;
839
840 local_literal:
841 if ((sec->flags & SEC_ALLOC) != 0)
842 {
843 bfd_signed_vma *local_got_refcounts;
844
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)
848 {
849 bfd_size_type size;
850
851 size = symtab_hdr->sh_info;
852 size *= sizeof (bfd_signed_vma);
43cd72b9
BW
853 local_got_refcounts =
854 (bfd_signed_vma *) bfd_zalloc (abfd, size);
e0001a05
NC
855 if (local_got_refcounts == NULL)
856 return FALSE;
857 elf_local_got_refcounts (abfd) = local_got_refcounts;
858 }
859 local_got_refcounts[r_symndx] += 1;
e0001a05
NC
860 }
861 break;
862
863 case R_XTENSA_OP0:
864 case R_XTENSA_OP1:
865 case R_XTENSA_OP2:
43cd72b9
BW
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:
e0001a05
NC
896 case R_XTENSA_ASM_EXPAND:
897 case R_XTENSA_ASM_SIMPLIFY:
43cd72b9
BW
898 case R_XTENSA_DIFF8:
899 case R_XTENSA_DIFF16:
900 case R_XTENSA_DIFF32:
e0001a05
NC
901 /* Nothing to do for these. */
902 break;
903
904 case R_XTENSA_GNU_VTINHERIT:
905 /* This relocation describes the C++ object vtable hierarchy.
906 Reconstruct it for later use during GC. */
c152c796 907 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
e0001a05
NC
908 return FALSE;
909 break;
910
911 case R_XTENSA_GNU_VTENTRY:
912 /* This relocation describes which C++ vtable entries are actually
913 used. Record for later use during GC. */
c152c796 914 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
e0001a05
NC
915 return FALSE;
916 break;
917
918 default:
919 break;
920 }
921 }
922
e0001a05
NC
923 return TRUE;
924}
925
926
927static void
7fa3d080
BW
928elf_xtensa_make_sym_local (struct bfd_link_info *info,
929 struct elf_link_hash_entry *h)
930{
931 if (info->shared)
932 {
933 if (h->plt.refcount > 0)
934 {
935 /* Will use RELATIVE relocs instead of JMP_SLOT relocs. */
936 if (h->got.refcount < 0)
937 h->got.refcount = 0;
938 h->got.refcount += h->plt.refcount;
939 h->plt.refcount = 0;
940 }
941 }
942 else
943 {
944 /* Don't need any dynamic relocations at all. */
945 h->plt.refcount = 0;
946 h->got.refcount = 0;
947 }
948}
949
950
951static void
952elf_xtensa_hide_symbol (struct bfd_link_info *info,
953 struct elf_link_hash_entry *h,
954 bfd_boolean force_local)
e0001a05
NC
955{
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);
959
960 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
961}
962
963
e0001a05
NC
964/* Return the section that should be marked against GC for a given
965 relocation. */
966
967static asection *
7fa3d080 968elf_xtensa_gc_mark_hook (asection *sec,
07adf181 969 struct bfd_link_info *info,
7fa3d080
BW
970 Elf_Internal_Rela *rel,
971 struct elf_link_hash_entry *h,
972 Elf_Internal_Sym *sym)
e0001a05 973{
07adf181
AM
974 if (h != NULL)
975 switch (ELF32_R_TYPE (rel->r_info))
976 {
977 case R_XTENSA_GNU_VTINHERIT:
978 case R_XTENSA_GNU_VTENTRY:
979 return NULL;
980 }
981
982 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
e0001a05
NC
983}
984
7fa3d080 985
e0001a05
NC
986/* Update the GOT & PLT entry reference counts
987 for the section being removed. */
988
989static bfd_boolean
7fa3d080
BW
990elf_xtensa_gc_sweep_hook (bfd *abfd,
991 struct bfd_link_info *info ATTRIBUTE_UNUSED,
992 asection *sec,
993 const Elf_Internal_Rela *relocs)
e0001a05
NC
994{
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;
999
1000 if ((sec->flags & SEC_ALLOC) == 0)
1001 return TRUE;
1002
1003 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1004 sym_hashes = elf_sym_hashes (abfd);
1005 local_got_refcounts = elf_local_got_refcounts (abfd);
1006
1007 relend = relocs + sec->reloc_count;
1008 for (rel = relocs; rel < relend; rel++)
1009 {
1010 unsigned long r_symndx;
1011 unsigned int r_type;
1012 struct elf_link_hash_entry *h = NULL;
1013
1014 r_symndx = ELF32_R_SYM (rel->r_info);
1015 if (r_symndx >= symtab_hdr->sh_info)
3eb128b2
AM
1016 {
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;
1021 }
e0001a05
NC
1022
1023 r_type = ELF32_R_TYPE (rel->r_info);
1024 switch (r_type)
1025 {
1026 case R_XTENSA_32:
1027 if (h == NULL)
1028 goto local_literal;
1029 if (h->got.refcount > 0)
1030 h->got.refcount--;
1031 break;
1032
1033 case R_XTENSA_PLT:
1034 if (h == NULL)
1035 goto local_literal;
1036 if (h->plt.refcount > 0)
1037 h->plt.refcount--;
1038 break;
1039
1040 local_literal:
1041 if (local_got_refcounts[r_symndx] > 0)
1042 local_got_refcounts[r_symndx] -= 1;
1043 break;
1044
1045 default:
1046 break;
1047 }
1048 }
1049
1050 return TRUE;
1051}
1052
1053
1054/* Create all the dynamic sections. */
1055
1056static bfd_boolean
7fa3d080 1057elf_xtensa_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
e0001a05 1058{
e901de89 1059 flagword flags, noalloc_flags;
e0001a05
NC
1060 asection *s;
1061
1062 /* First do all the standard stuff. */
1063 if (! _bfd_elf_create_dynamic_sections (dynobj, info))
1064 return FALSE;
1065
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))
1069 return FALSE;
1070
e901de89
BW
1071 noalloc_flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
1072 | SEC_LINKER_CREATED | SEC_READONLY);
1073 flags = noalloc_flags | SEC_ALLOC | SEC_LOAD;
e0001a05
NC
1074
1075 /* Mark the ".got.plt" section READONLY. */
1076 s = bfd_get_section_by_name (dynobj, ".got.plt");
1077 if (s == NULL
1078 || ! bfd_set_section_flags (dynobj, s, flags))
1079 return FALSE;
1080
1081 /* Create ".rela.got". */
3496cb2a 1082 s = bfd_make_section_with_flags (dynobj, ".rela.got", flags);
e0001a05 1083 if (s == NULL
e0001a05
NC
1084 || ! bfd_set_section_alignment (dynobj, s, 2))
1085 return FALSE;
1086
e901de89 1087 /* Create ".got.loc" (literal tables for use by dynamic linker). */
3496cb2a 1088 s = bfd_make_section_with_flags (dynobj, ".got.loc", flags);
e901de89 1089 if (s == NULL
e901de89
BW
1090 || ! bfd_set_section_alignment (dynobj, s, 2))
1091 return FALSE;
1092
e0001a05 1093 /* Create ".xt.lit.plt" (literal table for ".got.plt*"). */
3496cb2a
L
1094 s = bfd_make_section_with_flags (dynobj, ".xt.lit.plt",
1095 noalloc_flags);
e0001a05 1096 if (s == NULL
e0001a05
NC
1097 || ! bfd_set_section_alignment (dynobj, s, 2))
1098 return FALSE;
1099
1100 return TRUE;
1101}
1102
1103
1104static bfd_boolean
7fa3d080 1105add_extra_plt_sections (bfd *dynobj, int count)
e0001a05
NC
1106{
1107 int chunk;
1108
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--)
1112 {
1113 char *sname;
1114 flagword flags;
1115 asection *s;
1116
1117 /* Stop when we find a section has already been created. */
1118 if (elf_xtensa_get_plt_section (dynobj, chunk))
1119 break;
1120
1121 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1122 | SEC_LINKER_CREATED | SEC_READONLY);
1123
1124 sname = (char *) bfd_malloc (10);
1125 sprintf (sname, ".plt.%u", chunk);
ba05963f 1126 s = bfd_make_section_with_flags (dynobj, sname, flags | SEC_CODE);
e0001a05 1127 if (s == NULL
e0001a05
NC
1128 || ! bfd_set_section_alignment (dynobj, s, 2))
1129 return FALSE;
1130
1131 sname = (char *) bfd_malloc (14);
1132 sprintf (sname, ".got.plt.%u", chunk);
3496cb2a 1133 s = bfd_make_section_with_flags (dynobj, sname, flags);
e0001a05 1134 if (s == NULL
e0001a05
NC
1135 || ! bfd_set_section_alignment (dynobj, s, 2))
1136 return FALSE;
1137 }
1138
1139 return TRUE;
1140}
1141
1142
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
1147 understand. */
1148
1149static bfd_boolean
7fa3d080
BW
1150elf_xtensa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1151 struct elf_link_hash_entry *h)
e0001a05
NC
1152{
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. */
7fa3d080 1156 if (h->u.weakdef)
e0001a05 1157 {
f6e332e6
AM
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;
e0001a05
NC
1162 return TRUE;
1163 }
1164
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,
1167 .dynbss, etc. */
1168
1169 return TRUE;
1170}
1171
1172
e0001a05 1173static bfd_boolean
7fa3d080 1174elf_xtensa_fix_refcounts (struct elf_link_hash_entry *h, void *arg)
e0001a05
NC
1175{
1176 struct bfd_link_info *info = (struct bfd_link_info *) arg;
1177
1178 if (h->root.type == bfd_link_hash_warning)
1179 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1180
571b5725 1181 if (! xtensa_elf_dynamic_symbol_p (h, info))
e0001a05
NC
1182 elf_xtensa_make_sym_local (info, h);
1183
e0001a05
NC
1184 return TRUE;
1185}
1186
1187
1188static bfd_boolean
7fa3d080 1189elf_xtensa_allocate_plt_size (struct elf_link_hash_entry *h, void *arg)
e0001a05
NC
1190{
1191 asection *srelplt = (asection *) arg;
1192
1193 if (h->root.type == bfd_link_hash_warning)
1194 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1195
1196 if (h->plt.refcount > 0)
eea6121a 1197 srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
e0001a05
NC
1198
1199 return TRUE;
1200}
1201
1202
1203static bfd_boolean
7fa3d080 1204elf_xtensa_allocate_got_size (struct elf_link_hash_entry *h, void *arg)
e0001a05
NC
1205{
1206 asection *srelgot = (asection *) arg;
1207
1208 if (h->root.type == bfd_link_hash_warning)
1209 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1210
1211 if (h->got.refcount > 0)
eea6121a 1212 srelgot->size += (h->got.refcount * sizeof (Elf32_External_Rela));
e0001a05
NC
1213
1214 return TRUE;
1215}
1216
1217
1218static void
7fa3d080
BW
1219elf_xtensa_allocate_local_got_size (struct bfd_link_info *info,
1220 asection *srelgot)
e0001a05
NC
1221{
1222 bfd *i;
1223
1224 for (i = info->input_bfds; i; i = i->link_next)
1225 {
1226 bfd_signed_vma *local_got_refcounts;
1227 bfd_size_type j, cnt;
1228 Elf_Internal_Shdr *symtab_hdr;
1229
1230 local_got_refcounts = elf_local_got_refcounts (i);
1231 if (!local_got_refcounts)
1232 continue;
1233
1234 symtab_hdr = &elf_tdata (i)->symtab_hdr;
1235 cnt = symtab_hdr->sh_info;
1236
1237 for (j = 0; j < cnt; ++j)
1238 {
1239 if (local_got_refcounts[j] > 0)
eea6121a
AM
1240 srelgot->size += (local_got_refcounts[j]
1241 * sizeof (Elf32_External_Rela));
e0001a05
NC
1242 }
1243 }
1244}
1245
1246
1247/* Set the sizes of the dynamic sections. */
1248
1249static bfd_boolean
7fa3d080
BW
1250elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1251 struct bfd_link_info *info)
e0001a05 1252{
e901de89
BW
1253 bfd *dynobj, *abfd;
1254 asection *s, *srelplt, *splt, *sgotplt, *srelgot, *spltlittbl, *sgotloc;
e0001a05
NC
1255 bfd_boolean relplt, relgot;
1256 int plt_entries, plt_chunks, chunk;
1257
1258 plt_entries = 0;
1259 plt_chunks = 0;
1260 srelgot = 0;
1261
1262 dynobj = elf_hash_table (info)->dynobj;
1263 if (dynobj == NULL)
1264 abort ();
1265
1266 if (elf_hash_table (info)->dynamic_sections_created)
1267 {
1268 /* Set the contents of the .interp section to the interpreter. */
893c4fe2 1269 if (info->executable)
e0001a05
NC
1270 {
1271 s = bfd_get_section_by_name (dynobj, ".interp");
1272 if (s == NULL)
1273 abort ();
eea6121a 1274 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
e0001a05
NC
1275 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1276 }
1277
1278 /* Allocate room for one word in ".got". */
1279 s = bfd_get_section_by_name (dynobj, ".got");
1280 if (s == NULL)
1281 abort ();
eea6121a 1282 s->size = 4;
e0001a05
NC
1283
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,
7fa3d080 1287 (void *) info);
e0001a05
NC
1288
1289 /* Allocate space in ".rela.got" for literals that reference
1290 global symbols. */
1291 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1292 if (srelgot == NULL)
1293 abort ();
1294 elf_link_hash_traverse (elf_hash_table (info),
1295 elf_xtensa_allocate_got_size,
7fa3d080 1296 (void *) srelgot);
e0001a05
NC
1297
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. */
1301 if (info->shared)
1302 elf_xtensa_allocate_local_got_size (info, srelgot);
1303
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)
1307 abort ();
1308 elf_link_hash_traverse (elf_hash_table (info),
1309 elf_xtensa_allocate_plt_size,
7fa3d080 1310 (void *) srelplt);
e0001a05
NC
1311
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)
1319 abort ();
1320
eea6121a 1321 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
e0001a05
NC
1322 plt_chunks =
1323 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
1324
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. */
1328 for (chunk = 0;
1329 (splt = elf_xtensa_get_plt_section (dynobj, chunk)) != NULL;
1330 chunk++)
1331 {
1332 int chunk_entries;
1333
1334 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
1335 if (sgotplt == NULL)
1336 abort ();
1337
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);
1342 else
1343 chunk_entries = 0;
1344
1345 if (chunk_entries != 0)
1346 {
eea6121a
AM
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;
e0001a05
NC
1351 }
1352 else
1353 {
eea6121a
AM
1354 sgotplt->size = 0;
1355 splt->size = 0;
e0001a05
NC
1356 }
1357 }
e901de89
BW
1358
1359 /* Allocate space in ".got.loc" to match the total size of all the
1360 literal tables. */
1361 sgotloc = bfd_get_section_by_name (dynobj, ".got.loc");
1362 if (sgotloc == NULL)
1363 abort ();
eea6121a 1364 sgotloc->size = spltlittbl->size;
e901de89
BW
1365 for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1366 {
1367 if (abfd->flags & DYNAMIC)
1368 continue;
1369 for (s = abfd->sections; s != NULL; s = s->next)
1370 {
b536dc1e
BW
1371 if (! elf_discarded_section (s)
1372 && xtensa_is_littable_section (s)
1373 && s != spltlittbl)
eea6121a 1374 sgotloc->size += s->size;
e901de89
BW
1375 }
1376 }
e0001a05
NC
1377 }
1378
1379 /* Allocate memory for dynamic sections. */
1380 relplt = FALSE;
1381 relgot = FALSE;
1382 for (s = dynobj->sections; s != NULL; s = s->next)
1383 {
1384 const char *name;
e0001a05
NC
1385
1386 if ((s->flags & SEC_LINKER_CREATED) == 0)
1387 continue;
1388
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);
1392
0112cd26 1393 if (CONST_STRNEQ (name, ".rela"))
e0001a05 1394 {
c456f082 1395 if (s->size != 0)
e0001a05 1396 {
c456f082
AM
1397 if (strcmp (name, ".rela.plt") == 0)
1398 relplt = TRUE;
1399 else if (strcmp (name, ".rela.got") == 0)
1400 relgot = TRUE;
1401
1402 /* We use the reloc_count field as a counter if we need
1403 to copy relocs into the output file. */
1404 s->reloc_count = 0;
e0001a05
NC
1405 }
1406 }
0112cd26
NC
1407 else if (! CONST_STRNEQ (name, ".plt.")
1408 && ! CONST_STRNEQ (name, ".got.plt.")
c456f082 1409 && strcmp (name, ".got") != 0
e0001a05
NC
1410 && strcmp (name, ".plt") != 0
1411 && strcmp (name, ".got.plt") != 0
e901de89
BW
1412 && strcmp (name, ".xt.lit.plt") != 0
1413 && strcmp (name, ".got.loc") != 0)
e0001a05
NC
1414 {
1415 /* It's not one of our sections, so don't allocate space. */
1416 continue;
1417 }
1418
c456f082
AM
1419 if (s->size == 0)
1420 {
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;
1431 }
1432 else if ((s->flags & SEC_HAS_CONTENTS) != 0)
e0001a05
NC
1433 {
1434 /* Allocate memory for the section contents. */
eea6121a 1435 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
c456f082 1436 if (s->contents == NULL)
e0001a05
NC
1437 return FALSE;
1438 }
1439 }
1440
1441 if (elf_hash_table (info)->dynamic_sections_created)
1442 {
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)
1447 abort ();
1448 for (chunk = 0; chunk < plt_chunks; chunk++)
1449 {
1450 Elf_Internal_Rela irela;
1451 bfd_byte *loc;
1452
1453 irela.r_offset = 0;
1454 irela.r_info = ELF32_R_INFO (0, R_XTENSA_RTLD);
1455 irela.r_addend = 0;
1456
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;
1463 }
1464
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) \
5a580b3a 1471 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
e0001a05 1472
ba05963f 1473 if (info->executable)
e0001a05
NC
1474 {
1475 if (!add_dynamic_entry (DT_DEBUG, 0))
1476 return FALSE;
1477 }
1478
1479 if (relplt)
1480 {
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))
1485 return FALSE;
1486 }
1487
1488 if (relgot)
1489 {
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)))
1493 return FALSE;
1494 }
1495
e0001a05
NC
1496 if (!add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0)
1497 || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0))
1498 return FALSE;
1499 }
1500#undef add_dynamic_entry
1501
1502 return TRUE;
1503}
1504
e0001a05
NC
1505\f
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
1509 howto. */
1510
1511#define CALL_SEGMENT_BITS (30)
7fa3d080 1512#define CALL_SEGMENT_SIZE (1 << CALL_SEGMENT_BITS)
e0001a05
NC
1513
1514static bfd_reloc_status_type
7fa3d080
BW
1515elf_xtensa_do_reloc (reloc_howto_type *howto,
1516 bfd *abfd,
1517 asection *input_section,
1518 bfd_vma relocation,
1519 bfd_byte *contents,
1520 bfd_vma address,
1521 bfd_boolean is_weak_undef,
1522 char **error_message)
e0001a05 1523{
43cd72b9 1524 xtensa_format fmt;
e0001a05 1525 xtensa_opcode opcode;
e0001a05 1526 xtensa_isa isa = xtensa_default_isa;
43cd72b9
BW
1527 static xtensa_insnbuf ibuff = NULL;
1528 static xtensa_insnbuf sbuff = NULL;
1529 bfd_vma self_address = 0;
1530 bfd_size_type input_size;
1531 int opnd, slot;
e0001a05
NC
1532 uint32 newval;
1533
43cd72b9
BW
1534 if (!ibuff)
1535 {
1536 ibuff = xtensa_insnbuf_alloc (isa);
1537 sbuff = xtensa_insnbuf_alloc (isa);
1538 }
1539
1540 input_size = bfd_get_section_limit (abfd, input_section);
1541
e0001a05
NC
1542 switch (howto->type)
1543 {
1544 case R_XTENSA_NONE:
43cd72b9
BW
1545 case R_XTENSA_DIFF8:
1546 case R_XTENSA_DIFF16:
1547 case R_XTENSA_DIFF32:
e0001a05
NC
1548 return bfd_reloc_ok;
1549
1550 case R_XTENSA_ASM_EXPAND:
1551 if (!is_weak_undef)
1552 {
1553 /* Check for windowed CALL across a 1GB boundary. */
1554 xtensa_opcode opcode =
1555 get_expanded_call_opcode (contents + address,
43cd72b9 1556 input_size - address, 0);
e0001a05
NC
1557 if (is_windowed_call_opcode (opcode))
1558 {
1559 self_address = (input_section->output_section->vma
1560 + input_section->output_offset
1561 + address);
43cd72b9
BW
1562 if ((self_address >> CALL_SEGMENT_BITS)
1563 != (relocation >> CALL_SEGMENT_BITS))
e0001a05
NC
1564 {
1565 *error_message = "windowed longcall crosses 1GB boundary; "
1566 "return may fail";
1567 return bfd_reloc_dangerous;
1568 }
1569 }
1570 }
1571 return bfd_reloc_ok;
1572
1573 case R_XTENSA_ASM_SIMPLIFY:
43cd72b9 1574 {
e0001a05 1575 /* Convert the L32R/CALLX to CALL. */
43cd72b9
BW
1576 bfd_reloc_status_type retval =
1577 elf_xtensa_do_asm_simplify (contents, address, input_size,
1578 error_message);
e0001a05 1579 if (retval != bfd_reloc_ok)
43cd72b9 1580 return bfd_reloc_dangerous;
e0001a05
NC
1581
1582 /* The CALL needs to be relocated. Continue below for that part. */
1583 address += 3;
43cd72b9 1584 howto = &elf_howto_table[(unsigned) R_XTENSA_SLOT0_OP ];
e0001a05
NC
1585 }
1586 break;
1587
1588 case R_XTENSA_32:
1589 case R_XTENSA_PLT:
1590 {
1591 bfd_vma x;
1592 x = bfd_get_32 (abfd, contents + address);
1593 x = x + relocation;
1594 bfd_put_32 (abfd, x, contents + address);
1595 }
1596 return bfd_reloc_ok;
1597 }
1598
43cd72b9
BW
1599 /* Only instruction slot-specific relocations handled below.... */
1600 slot = get_relocation_slot (howto->type);
1601 if (slot == XTENSA_UNDEFINED)
e0001a05 1602 {
43cd72b9 1603 *error_message = "unexpected relocation";
e0001a05
NC
1604 return bfd_reloc_dangerous;
1605 }
1606
43cd72b9
BW
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)
e0001a05 1612 {
43cd72b9 1613 *error_message = "cannot decode instruction format";
e0001a05
NC
1614 return bfd_reloc_dangerous;
1615 }
1616
43cd72b9 1617 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
e0001a05 1618
43cd72b9
BW
1619 opcode = xtensa_opcode_decode (isa, fmt, slot, sbuff);
1620 if (opcode == XTENSA_UNDEFINED)
e0001a05 1621 {
43cd72b9 1622 *error_message = "cannot decode instruction opcode";
e0001a05
NC
1623 return bfd_reloc_dangerous;
1624 }
1625
43cd72b9
BW
1626 /* Check for opcode-specific "alternate" relocations. */
1627 if (is_alt_relocation (howto->type))
1628 {
1629 if (opcode == get_l32r_opcode ())
1630 {
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");
1634 if (!lit4_sec)
1635 {
1636 *error_message = "relocation references missing .lit4 section";
1637 return bfd_reloc_dangerous;
1638 }
1639 self_address = ((lit4_sec->vma & ~0xfff)
1640 + 0x40000 - 3); /* -3 to compensate for do_reloc */
1641 newval = relocation;
1642 opnd = 1;
1643 }
1644 else if (opcode == get_const16_opcode ())
1645 {
1646 /* ALT used for high 16 bits. */
1647 newval = relocation >> 16;
1648 opnd = 1;
1649 }
1650 else
1651 {
1652 /* No other "alternate" relocations currently defined. */
1653 *error_message = "unexpected relocation";
1654 return bfd_reloc_dangerous;
1655 }
1656 }
1657 else /* Not an "alternate" relocation.... */
1658 {
1659 if (opcode == get_const16_opcode ())
1660 {
1661 newval = relocation & 0xffff;
1662 opnd = 1;
1663 }
1664 else
1665 {
1666 /* ...normal PC-relative relocation.... */
1667
1668 /* Determine which operand is being relocated. */
1669 opnd = get_relocation_opnd (opcode, howto->type);
1670 if (opnd == XTENSA_UNDEFINED)
1671 {
1672 *error_message = "unexpected relocation";
1673 return bfd_reloc_dangerous;
1674 }
1675
1676 if (!howto->pc_relative)
1677 {
1678 *error_message = "expected PC-relative relocation";
1679 return bfd_reloc_dangerous;
1680 }
e0001a05 1681
43cd72b9
BW
1682 /* Calculate the PC address for this instruction. */
1683 self_address = (input_section->output_section->vma
1684 + input_section->output_offset
1685 + address);
e0001a05 1686
43cd72b9
BW
1687 newval = relocation;
1688 }
1689 }
e0001a05 1690
43cd72b9
BW
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,
1695 sbuff, newval))
e0001a05 1696 {
2db662be
BW
1697 const char *opname = xtensa_opcode_name (isa, opcode);
1698 const char *msg;
1699
1700 msg = "cannot encode";
1701 if (is_direct_call_opcode (opcode))
1702 {
1703 if ((relocation & 0x3) != 0)
1704 msg = "misaligned call target";
1705 else
1706 msg = "call target out of range";
1707 }
1708 else if (opcode == get_l32r_opcode ())
1709 {
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)";
1716 else
1717 msg = "literal placed after use";
1718 }
1719
1720 *error_message = vsprint_msg (opname, ": %s", strlen (msg) + 2, msg);
e0001a05
NC
1721 return bfd_reloc_dangerous;
1722 }
1723
43cd72b9 1724 /* Check for calls across 1GB boundaries. */
e0001a05
NC
1725 if (is_direct_call_opcode (opcode)
1726 && is_windowed_call_opcode (opcode))
1727 {
43cd72b9
BW
1728 if ((self_address >> CALL_SEGMENT_BITS)
1729 != (relocation >> CALL_SEGMENT_BITS))
e0001a05 1730 {
43cd72b9
BW
1731 *error_message =
1732 "windowed call crosses 1GB boundary; return may fail";
e0001a05
NC
1733 return bfd_reloc_dangerous;
1734 }
1735 }
1736
43cd72b9
BW
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);
e0001a05
NC
1741 return bfd_reloc_ok;
1742}
1743
1744
2db662be 1745static char *
7fa3d080 1746vsprint_msg (const char *origmsg, const char *fmt, int arglen, ...)
e0001a05
NC
1747{
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;
1754
1755 VA_OPEN (ap, arglen);
1756 VA_FIXEDARG (ap, const char *, origmsg);
1757
1758 is_append = (origmsg == message);
1759
1760 orig_len = strlen (origmsg);
1761 len = orig_len + strlen (fmt) + arglen + 20;
1762 if (len > alloc_size)
1763 {
1764 message = (char *) bfd_realloc (message, len);
1765 alloc_size = len;
1766 }
1767 if (!is_append)
1768 memcpy (message, origmsg, orig_len);
1769 vsprintf (message + orig_len, fmt, ap);
1770 VA_CLOSE (ap);
1771 return message;
1772}
1773
1774
e0001a05
NC
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. */
1781
1782static bfd_reloc_status_type
7fa3d080
BW
1783bfd_elf_xtensa_reloc (bfd *abfd,
1784 arelent *reloc_entry,
1785 asymbol *symbol,
1786 void *data,
1787 asection *input_section,
1788 bfd *output_bfd,
1789 char **error_message)
e0001a05
NC
1790{
1791 bfd_vma relocation;
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;
1798
dd1a320b
BW
1799 if (!xtensa_default_isa)
1800 xtensa_default_isa = xtensa_isa_init (0, 0);
1801
1049f94e 1802 /* ELF relocs are against symbols. If we are producing relocatable
e0001a05
NC
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....) */
1812
7fa3d080 1813 if (output_bfd && (symbol->flags & BSF_SECTION_SYM) == 0)
e0001a05
NC
1814 {
1815 reloc_entry->address += input_section->output_offset;
1816 return bfd_reloc_ok;
1817 }
1818
1819 /* Is the address of the relocation really within the section? */
07515404 1820 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
e0001a05
NC
1821 return bfd_reloc_outofrange;
1822
4cc11e76 1823 /* Work out which section the relocation is targeted at and the
e0001a05
NC
1824 initial relocation command value. */
1825
1826 /* Get symbol value. (Common symbols are special.) */
1827 if (bfd_is_com_section (symbol->section))
1828 relocation = 0;
1829 else
1830 relocation = symbol->value;
1831
1832 reloc_target_output_section = symbol->section->output_section;
1833
1834 /* Convert input-section-relative symbol value to absolute. */
1835 if ((output_bfd && !howto->partial_inplace)
1836 || reloc_target_output_section == NULL)
1837 output_base = 0;
1838 else
1839 output_base = reloc_target_output_section->vma;
1840
1841 relocation += output_base + symbol->section->output_offset;
1842
1843 /* Add in supplied addend. */
1844 relocation += reloc_entry->addend;
1845
1846 /* Here the variable relocation holds the final address of the
1847 symbol we are relocating against, plus any addend. */
1848 if (output_bfd)
1849 {
1850 if (!howto->partial_inplace)
1851 {
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
1855 above. */
43cd72b9 1856
e0001a05
NC
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;
1861 }
1862 else
1863 {
1864 reloc_entry->address += input_section->output_offset;
1865 reloc_entry->addend = 0;
1866 }
1867 }
1868
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);
1874
1875 if (flag == bfd_reloc_dangerous)
1876 {
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,
70961b9d
AM
1882 symbol->name,
1883 (unsigned long) reloc_entry->addend);
e0001a05
NC
1884 }
1885
1886 return flag;
1887}
1888
1889
1890/* Set up an entry in the procedure linkage table. */
1891
1892static bfd_vma
7fa3d080
BW
1893elf_xtensa_create_plt_entry (bfd *dynobj,
1894 bfd *output_bfd,
1895 unsigned reloc_index)
e0001a05
NC
1896{
1897 asection *splt, *sgotplt;
1898 bfd_vma plt_base, got_base;
1899 bfd_vma code_offset, lit_offset;
1900 int chunk;
1901
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);
1906
1907 plt_base = splt->output_section->vma + splt->output_offset;
1908 got_base = sgotplt->output_section->vma + sgotplt->output_offset;
1909
1910 lit_offset = 8 + (reloc_index % PLT_ENTRIES_PER_CHUNK) * 4;
1911 code_offset = (reloc_index % PLT_ENTRIES_PER_CHUNK) * PLT_ENTRY_SIZE;
1912
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);
1917
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),
1923 PLT_ENTRY_SIZE);
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);
1933
1934 return plt_base + code_offset;
1935}
1936
1937
e0001a05 1938/* Relocate an Xtensa ELF section. This is invoked by the linker for
1049f94e 1939 both relocatable and final links. */
e0001a05
NC
1940
1941static bfd_boolean
7fa3d080
BW
1942elf_xtensa_relocate_section (bfd *output_bfd,
1943 struct bfd_link_info *info,
1944 bfd *input_bfd,
1945 asection *input_section,
1946 bfd_byte *contents,
1947 Elf_Internal_Rela *relocs,
1948 Elf_Internal_Sym *local_syms,
1949 asection **local_sections)
e0001a05
NC
1950{
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;
1956 bfd *dynobj;
88d65ad6
BW
1957 property_table_entry *lit_table = 0;
1958 int ltblsize = 0;
e0001a05 1959 char *error_message = NULL;
43cd72b9 1960 bfd_size_type input_size;
e0001a05 1961
43cd72b9
BW
1962 if (!xtensa_default_isa)
1963 xtensa_default_isa = xtensa_isa_init (0, 0);
e0001a05
NC
1964
1965 dynobj = elf_hash_table (info)->dynobj;
1966 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1967 sym_hashes = elf_sym_hashes (input_bfd);
1968
1969 srelgot = NULL;
1970 srelplt = NULL;
7fa3d080 1971 if (dynobj)
e0001a05
NC
1972 {
1973 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");;
1974 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
1975 }
1976
88d65ad6
BW
1977 if (elf_hash_table (info)->dynamic_sections_created)
1978 {
1979 ltblsize = xtensa_read_table_entries (input_bfd, input_section,
43cd72b9
BW
1980 &lit_table, XTENSA_LIT_SEC_NAME,
1981 TRUE);
88d65ad6
BW
1982 if (ltblsize < 0)
1983 return FALSE;
1984 }
1985
43cd72b9
BW
1986 input_size = bfd_get_section_limit (input_bfd, input_section);
1987
e0001a05
NC
1988 rel = relocs;
1989 relend = relocs + input_section->reloc_count;
1990 for (; rel < relend; rel++)
1991 {
1992 int r_type;
1993 reloc_howto_type *howto;
1994 unsigned long r_symndx;
1995 struct elf_link_hash_entry *h;
1996 Elf_Internal_Sym *sym;
1997 asection *sec;
1998 bfd_vma relocation;
1999 bfd_reloc_status_type r;
2000 bfd_boolean is_weak_undef;
2001 bfd_boolean unresolved_reloc;
9b8c98a4 2002 bfd_boolean warned;
e0001a05
NC
2003
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)
2007 continue;
2008
2009 if (r_type < 0 || r_type >= (int) R_XTENSA_max)
2010 {
2011 bfd_set_error (bfd_error_bad_value);
2012 return FALSE;
2013 }
2014 howto = &elf_howto_table[r_type];
2015
2016 r_symndx = ELF32_R_SYM (rel->r_info);
2017
1049f94e 2018 if (info->relocatable)
e0001a05 2019 {
43cd72b9 2020 /* This is a relocatable link.
e0001a05
NC
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
2026 difference. */
2027
2028 if (relaxing_section)
2029 {
2030 /* Check if this references a section in another input file. */
43cd72b9
BW
2031 if (!do_fix_for_relocatable_link (rel, input_bfd, input_section,
2032 contents))
2033 return FALSE;
e0001a05
NC
2034 r_type = ELF32_R_TYPE (rel->r_info);
2035 }
2036
43cd72b9 2037 if (r_type == R_XTENSA_ASM_SIMPLIFY)
e0001a05 2038 {
43cd72b9 2039 char *error_message = NULL;
e0001a05
NC
2040 /* Convert ASM_SIMPLIFY into the simpler relocation
2041 so that they never escape a relaxing link. */
43cd72b9
BW
2042 r = contract_asm_expansion (contents, input_size, rel,
2043 &error_message);
2044 if (r != bfd_reloc_ok)
2045 {
2046 if (!((*info->callbacks->reloc_dangerous)
2047 (info, error_message, input_bfd, input_section,
2048 rel->r_offset)))
2049 return FALSE;
2050 }
e0001a05
NC
2051 r_type = ELF32_R_TYPE (rel->r_info);
2052 }
2053
1049f94e 2054 /* This is a relocatable link, so we don't have to change
e0001a05
NC
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)
2059 {
2060 sym = local_syms + r_symndx;
2061 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2062 {
2063 sec = local_sections[r_symndx];
2064 rel->r_addend += sec->output_offset + sym->st_value;
2065 }
2066 }
2067
2068 /* If there is an addend with a partial_inplace howto,
2069 then move the addend to the contents. This is a hack
1049f94e 2070 to work around problems with DWARF in relocatable links
e0001a05
NC
2071 with some previous version of BFD. Now we can't easily get
2072 rid of the hack without breaking backward compatibility.... */
2073 if (rel->r_addend)
2074 {
2075 howto = &elf_howto_table[r_type];
2076 if (howto->partial_inplace)
2077 {
2078 r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2079 rel->r_addend, contents,
2080 rel->r_offset, FALSE,
2081 &error_message);
2082 if (r != bfd_reloc_ok)
2083 {
2084 if (!((*info->callbacks->reloc_dangerous)
2085 (info, error_message, input_bfd, input_section,
2086 rel->r_offset)))
2087 return FALSE;
2088 }
2089 rel->r_addend = 0;
2090 }
2091 }
2092
1049f94e 2093 /* Done with work for relocatable link; continue with next reloc. */
e0001a05
NC
2094 continue;
2095 }
2096
2097 /* This is a final link. */
2098
2099 h = NULL;
2100 sym = NULL;
2101 sec = NULL;
2102 is_weak_undef = FALSE;
2103 unresolved_reloc = FALSE;
9b8c98a4 2104 warned = FALSE;
e0001a05
NC
2105
2106 if (howto->partial_inplace)
2107 {
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);
2114 }
2115
2116 if (r_symndx < symtab_hdr->sh_info)
2117 {
2118 sym = local_syms + r_symndx;
2119 sec = local_sections[r_symndx];
8517fae7 2120 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
e0001a05
NC
2121 }
2122 else
2123 {
b2a8e766
AM
2124 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2125 r_symndx, symtab_hdr, sym_hashes,
2126 h, sec, relocation,
2127 unresolved_reloc, warned);
560e09e9
NC
2128
2129 if (relocation == 0
2130 && !unresolved_reloc
2131 && h->root.type == bfd_link_hash_undefweak)
e0001a05 2132 is_weak_undef = TRUE;
e0001a05
NC
2133 }
2134
2135 if (relaxing_section)
2136 {
2137 /* Check if this references a section in another input file. */
43cd72b9
BW
2138 do_fix_for_final_link (rel, input_bfd, input_section, contents,
2139 &relocation);
e0001a05
NC
2140
2141 /* Update some already cached values. */
2142 r_type = ELF32_R_TYPE (rel->r_info);
2143 howto = &elf_howto_table[r_type];
2144 }
2145
2146 /* Sanity check the address. */
43cd72b9 2147 if (rel->r_offset >= input_size
e0001a05
NC
2148 && ELF32_R_TYPE (rel->r_info) != R_XTENSA_NONE)
2149 {
43cd72b9
BW
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);
e0001a05
NC
2153 bfd_set_error (bfd_error_bad_value);
2154 return FALSE;
2155 }
2156
2157 /* Generate dynamic relocations. */
2158 if (elf_hash_table (info)->dynamic_sections_created)
2159 {
571b5725 2160 bfd_boolean dynamic_symbol = xtensa_elf_dynamic_symbol_p (h, info);
e0001a05 2161
43cd72b9 2162 if (dynamic_symbol && is_operand_relocation (r_type))
e0001a05
NC
2163 {
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 "
2168 "symbol", ": %s",
2169 strlen (name) + 2, name);
2170 if (!((*info->callbacks->reloc_dangerous)
2171 (info, error_message, input_bfd, input_section,
2172 rel->r_offset)))
2173 return FALSE;
2174 }
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))
2178 {
2179 Elf_Internal_Rela outrel;
2180 bfd_byte *loc;
2181 asection *srel;
2182
2183 if (dynamic_symbol && r_type == R_XTENSA_PLT)
2184 srel = srelplt;
2185 else
2186 srel = srelgot;
2187
2188 BFD_ASSERT (srel != NULL);
2189
2190 outrel.r_offset =
2191 _bfd_elf_section_offset (output_bfd, info,
2192 input_section, rel->r_offset);
2193
2194 if ((outrel.r_offset | 1) == (bfd_vma) -1)
2195 memset (&outrel, 0, sizeof outrel);
2196 else
2197 {
f0578e28
BW
2198 outrel.r_offset += (input_section->output_section->vma
2199 + input_section->output_offset);
e0001a05 2200
88d65ad6
BW
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,
3ba3bc8c 2205 outrel.r_offset))
88d65ad6
BW
2206 {
2207 error_message =
2208 _("dynamic relocation in read-only section");
2209 if (!((*info->callbacks->reloc_dangerous)
2210 (info, error_message, input_bfd, input_section,
2211 rel->r_offset)))
2212 return FALSE;
2213 }
2214
e0001a05
NC
2215 if (dynamic_symbol)
2216 {
2217 outrel.r_addend = rel->r_addend;
2218 rel->r_addend = 0;
2219
2220 if (r_type == R_XTENSA_32)
2221 {
2222 outrel.r_info =
2223 ELF32_R_INFO (h->dynindx, R_XTENSA_GLOB_DAT);
2224 relocation = 0;
2225 }
2226 else /* r_type == R_XTENSA_PLT */
2227 {
2228 outrel.r_info =
2229 ELF32_R_INFO (h->dynindx, R_XTENSA_JMP_SLOT);
2230
2231 /* Create the PLT entry and set the initial
2232 contents of the literal entry to the address of
2233 the PLT entry. */
43cd72b9 2234 relocation =
e0001a05
NC
2235 elf_xtensa_create_plt_entry (dynobj, output_bfd,
2236 srel->reloc_count);
2237 }
2238 unresolved_reloc = FALSE;
2239 }
2240 else
2241 {
2242 /* Generate a RELATIVE relocation. */
2243 outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
2244 outrel.r_addend = 0;
2245 }
2246 }
2247
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
eea6121a 2252 <= srel->size);
e0001a05
NC
2253 }
2254 }
2255
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
f5385ebf 2261 && h->def_dynamic))
bf1747de
BW
2262 {
2263 (*_bfd_error_handler)
2264 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
2265 input_bfd,
2266 input_section,
2267 (long) rel->r_offset,
2268 howto->name,
2269 h->root.root.string);
2270 return FALSE;
2271 }
e0001a05
NC
2272
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,
2278 &error_message);
43cd72b9 2279
9b8c98a4 2280 if (r != bfd_reloc_ok && !warned)
e0001a05
NC
2281 {
2282 const char *name;
2283
43cd72b9 2284 BFD_ASSERT (r == bfd_reloc_dangerous || r == bfd_reloc_other);
7fa3d080 2285 BFD_ASSERT (error_message != NULL);
e0001a05 2286
7fa3d080 2287 if (h)
e0001a05
NC
2288 name = h->root.root.string;
2289 else
2290 {
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);
2295 }
2296 if (name)
43cd72b9
BW
2297 {
2298 if (rel->r_addend == 0)
2299 error_message = vsprint_msg (error_message, ": %s",
2300 strlen (name) + 2, name);
2301 else
2302 error_message = vsprint_msg (error_message, ": (%s+0x%x)",
2303 strlen (name) + 22,
0fd3a477 2304 name, (int)rel->r_addend);
43cd72b9
BW
2305 }
2306
e0001a05
NC
2307 if (!((*info->callbacks->reloc_dangerous)
2308 (info, error_message, input_bfd, input_section,
2309 rel->r_offset)))
2310 return FALSE;
2311 }
2312 }
2313
88d65ad6
BW
2314 if (lit_table)
2315 free (lit_table);
2316
3ba3bc8c
BW
2317 input_section->reloc_done = TRUE;
2318
e0001a05
NC
2319 return TRUE;
2320}
2321
2322
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. */
2325
2326static bfd_boolean
7fa3d080
BW
2327elf_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)
e0001a05 2331{
bf1747de 2332 if (h->needs_plt && !h->def_regular)
e0001a05
NC
2333 {
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;
bf1747de
BW
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)
2342 sym->st_value = 0;
e0001a05
NC
2343 }
2344
2345 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2346 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
22edb2f1 2347 || h == elf_hash_table (info)->hgot)
e0001a05
NC
2348 sym->st_shndx = SHN_ABS;
2349
2350 return TRUE;
2351}
2352
2353
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
2360 on error. */
2361
2362static int
7fa3d080
BW
2363elf_xtensa_combine_prop_entries (bfd *output_bfd,
2364 asection *sxtlit,
2365 asection *sgotloc)
e0001a05 2366{
e0001a05
NC
2367 bfd_byte *contents;
2368 property_table_entry *table;
e901de89 2369 bfd_size_type section_size, sgotloc_size;
e0001a05
NC
2370 bfd_vma offset;
2371 int n, m, num;
2372
eea6121a 2373 section_size = sxtlit->size;
e0001a05
NC
2374 BFD_ASSERT (section_size % 8 == 0);
2375 num = section_size / 8;
2376
eea6121a 2377 sgotloc_size = sgotloc->size;
e901de89 2378 if (sgotloc_size != section_size)
b536dc1e
BW
2379 {
2380 (*_bfd_error_handler)
43cd72b9 2381 (_("internal inconsistency in size of .got.loc section"));
b536dc1e
BW
2382 return -1;
2383 }
e901de89 2384
eea6121a
AM
2385 table = bfd_malloc (num * sizeof (property_table_entry));
2386 if (table == 0)
e0001a05
NC
2387 return -1;
2388
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
eea6121a 2391 where it breaks the following call to bfd_malloc_and_get_section. */
e901de89 2392 sxtlit->flags &= ~SEC_IN_MEMORY;
e0001a05 2393
eea6121a
AM
2394 if (!bfd_malloc_and_get_section (output_bfd, sxtlit, &contents))
2395 {
2396 if (contents != 0)
2397 free (contents);
2398 free (table);
2399 return -1;
2400 }
e0001a05
NC
2401
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. */
2404
2405 /* Copy the raw contents into a property table array and sort it. */
2406 offset = 0;
2407 for (n = 0; n < num; n++)
2408 {
2409 table[n].address = bfd_get_32 (output_bfd, &contents[offset]);
2410 table[n].size = bfd_get_32 (output_bfd, &contents[offset + 4]);
2411 offset += 8;
2412 }
2413 qsort (table, num, sizeof (property_table_entry), property_table_compare);
2414
2415 for (n = 0; n < num; n++)
2416 {
2417 bfd_boolean remove = FALSE;
2418
2419 if (table[n].size == 0)
2420 remove = TRUE;
2421 else if (n > 0 &&
2422 (table[n-1].address + table[n-1].size == table[n].address))
2423 {
2424 table[n-1].size += table[n].size;
2425 remove = TRUE;
2426 }
2427
2428 if (remove)
2429 {
2430 for (m = n; m < num - 1; m++)
2431 {
2432 table[m].address = table[m+1].address;
2433 table[m].size = table[m+1].size;
2434 }
2435
2436 n--;
2437 num--;
2438 }
2439 }
2440
2441 /* Copy the data back to the raw contents. */
2442 offset = 0;
2443 for (n = 0; n < num; n++)
2444 {
2445 bfd_put_32 (output_bfd, table[n].address, &contents[offset]);
2446 bfd_put_32 (output_bfd, table[n].size, &contents[offset + 4]);
2447 offset += 8;
2448 }
2449
2450 /* Clear the removed bytes. */
2451 if ((bfd_size_type) (num * 8) < section_size)
b54d4b07 2452 memset (&contents[num * 8], 0, section_size - num * 8);
e0001a05 2453
e901de89
BW
2454 if (! bfd_set_section_contents (output_bfd, sxtlit, contents, 0,
2455 section_size))
e0001a05
NC
2456 return -1;
2457
e901de89
BW
2458 /* Copy the contents to ".got.loc". */
2459 memcpy (sgotloc->contents, contents, section_size);
2460
e0001a05 2461 free (contents);
b614a702 2462 free (table);
e0001a05
NC
2463 return num;
2464}
2465
2466
2467/* Finish up the dynamic sections. */
2468
2469static bfd_boolean
7fa3d080
BW
2470elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
2471 struct bfd_link_info *info)
e0001a05
NC
2472{
2473 bfd *dynobj;
e901de89 2474 asection *sdyn, *srelplt, *sgot, *sxtlit, *sgotloc;
e0001a05
NC
2475 Elf32_External_Dyn *dyncon, *dynconend;
2476 int num_xtlit_entries;
2477
2478 if (! elf_hash_table (info)->dynamic_sections_created)
2479 return TRUE;
2480
2481 dynobj = elf_hash_table (info)->dynobj;
2482 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2483 BFD_ASSERT (sdyn != NULL);
2484
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");
2488 if (sgot)
2489 {
eea6121a 2490 BFD_ASSERT (sgot->size == 4);
e0001a05 2491 if (sdyn == NULL)
7fa3d080 2492 bfd_put_32 (output_bfd, 0, sgot->contents);
e0001a05
NC
2493 else
2494 bfd_put_32 (output_bfd,
2495 sdyn->output_section->vma + sdyn->output_offset,
2496 sgot->contents);
2497 }
2498
2499 srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
7fa3d080 2500 if (srelplt && srelplt->size != 0)
e0001a05
NC
2501 {
2502 asection *sgotplt, *srelgot, *spltlittbl;
2503 int chunk, plt_chunks, plt_entries;
2504 Elf_Internal_Rela irela;
2505 bfd_byte *loc;
2506 unsigned rtld_reloc;
2507
2508 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");;
2509 BFD_ASSERT (srelgot != NULL);
2510
2511 spltlittbl = bfd_get_section_by_name (dynobj, ".xt.lit.plt");
2512 BFD_ASSERT (spltlittbl != NULL);
2513
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++)
2517 {
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)
2521 break;
2522 }
2523 BFD_ASSERT (rtld_reloc < srelgot->reloc_count);
2524
eea6121a 2525 plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
e0001a05
NC
2526 plt_chunks =
2527 (plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
2528
2529 for (chunk = 0; chunk < plt_chunks; chunk++)
2530 {
2531 int chunk_entries = 0;
2532
2533 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
2534 BFD_ASSERT (sgotplt != NULL);
2535
2536 /* Emit special RTLD relocations for the first two entries in
2537 each chunk of the .got.plt section. */
2538
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);
2546 rtld_reloc += 1;
2547 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
2548
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. */
2556 irela.r_addend = 2;
2557 bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
2558 rtld_reloc += 1;
2559 BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
2560
2561 /* Fill in the literal table. */
2562 if (chunk < plt_chunks - 1)
2563 chunk_entries = PLT_ENTRIES_PER_CHUNK;
2564 else
2565 chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
2566
eea6121a 2567 BFD_ASSERT ((unsigned) (chunk + 1) * 8 <= spltlittbl->size);
e0001a05
NC
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);
2574 }
2575
2576 /* All the dynamic relocations have been emitted at this point.
2577 Make sure the relocation sections are the correct size. */
eea6121a
AM
2578 if (srelgot->size != (sizeof (Elf32_External_Rela)
2579 * srelgot->reloc_count)
2580 || srelplt->size != (sizeof (Elf32_External_Rela)
2581 * srelplt->reloc_count))
e0001a05
NC
2582 abort ();
2583
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
2587 the output here. */
2588 if (! bfd_set_section_contents (output_bfd,
2589 spltlittbl->output_section,
2590 spltlittbl->contents,
2591 spltlittbl->output_offset,
eea6121a 2592 spltlittbl->size))
e0001a05
NC
2593 return FALSE;
2594 /* Clear SEC_HAS_CONTENTS so the contents won't be output again. */
2595 spltlittbl->flags &= ~SEC_HAS_CONTENTS;
2596 }
2597
2598 /* Combine adjacent literal table entries. */
1049f94e 2599 BFD_ASSERT (! info->relocatable);
e901de89
BW
2600 sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");
2601 sgotloc = bfd_get_section_by_name (dynobj, ".got.loc");
b536dc1e 2602 BFD_ASSERT (sxtlit && sgotloc);
e901de89
BW
2603 num_xtlit_entries =
2604 elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc);
e0001a05
NC
2605 if (num_xtlit_entries < 0)
2606 return FALSE;
2607
2608 dyncon = (Elf32_External_Dyn *) sdyn->contents;
eea6121a 2609 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
e0001a05
NC
2610 for (; dyncon < dynconend; dyncon++)
2611 {
2612 Elf_Internal_Dyn dyn;
2613 const char *name;
2614 asection *s;
2615
2616 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2617
2618 switch (dyn.d_tag)
2619 {
2620 default:
2621 break;
2622
2623 case DT_XTENSA_GOT_LOC_SZ:
e0001a05
NC
2624 dyn.d_un.d_val = num_xtlit_entries;
2625 break;
2626
2627 case DT_XTENSA_GOT_LOC_OFF:
e901de89 2628 name = ".got.loc";
e0001a05
NC
2629 goto get_vma;
2630 case DT_PLTGOT:
2631 name = ".got";
2632 goto get_vma;
2633 case DT_JMPREL:
2634 name = ".rela.plt";
2635 get_vma:
2636 s = bfd_get_section_by_name (output_bfd, name);
2637 BFD_ASSERT (s);
2638 dyn.d_un.d_ptr = s->vma;
2639 break;
2640
2641 case DT_PLTRELSZ:
2642 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2643 BFD_ASSERT (s);
eea6121a 2644 dyn.d_un.d_val = s->size;
e0001a05
NC
2645 break;
2646
2647 case DT_RELASZ:
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");
2655 if (s)
eea6121a 2656 dyn.d_un.d_val -= s->size;
e0001a05
NC
2657 break;
2658 }
2659
2660 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2661 }
2662
2663 return TRUE;
2664}
2665
2666\f
2667/* Functions for dealing with the e_flags field. */
2668
2669/* Merge backend specific data from an object file to the output
2670 object file when linking. */
2671
2672static bfd_boolean
7fa3d080 2673elf_xtensa_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
e0001a05
NC
2674{
2675 unsigned out_mach, in_mach;
2676 flagword out_flag, in_flag;
2677
2678 /* Check if we have the same endianess. */
2679 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
2680 return FALSE;
2681
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)
2685 return FALSE;
2686
2687 out_flag = elf_elfheader (obfd)->e_flags;
2688 in_flag = elf_elfheader (ibfd)->e_flags;
2689
2690 out_mach = out_flag & EF_XTENSA_MACH;
2691 in_mach = in_flag & EF_XTENSA_MACH;
43cd72b9 2692 if (out_mach != in_mach)
e0001a05
NC
2693 {
2694 (*_bfd_error_handler)
43cd72b9 2695 (_("%B: incompatible machine type. Output is 0x%x. Input is 0x%x"),
d003868e 2696 ibfd, out_mach, in_mach);
e0001a05
NC
2697 bfd_set_error (bfd_error_wrong_format);
2698 return FALSE;
2699 }
2700
2701 if (! elf_flags_init (obfd))
2702 {
2703 elf_flags_init (obfd) = TRUE;
2704 elf_elfheader (obfd)->e_flags = in_flag;
43cd72b9 2705
e0001a05
NC
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));
43cd72b9 2710
e0001a05
NC
2711 return TRUE;
2712 }
2713
43cd72b9
BW
2714 if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
2715 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
e0001a05 2716
43cd72b9
BW
2717 if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
2718 elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
e0001a05
NC
2719
2720 return TRUE;
2721}
2722
2723
2724static bfd_boolean
7fa3d080 2725elf_xtensa_set_private_flags (bfd *abfd, flagword flags)
e0001a05
NC
2726{
2727 BFD_ASSERT (!elf_flags_init (abfd)
2728 || elf_elfheader (abfd)->e_flags == flags);
2729
2730 elf_elfheader (abfd)->e_flags |= flags;
2731 elf_flags_init (abfd) = TRUE;
2732
2733 return TRUE;
2734}
2735
2736
e0001a05 2737static bfd_boolean
7fa3d080 2738elf_xtensa_print_private_bfd_data (bfd *abfd, void *farg)
e0001a05
NC
2739{
2740 FILE *f = (FILE *) farg;
2741 flagword e_flags = elf_elfheader (abfd)->e_flags;
2742
2743 fprintf (f, "\nXtensa header:\n");
43cd72b9 2744 if ((e_flags & EF_XTENSA_MACH) == E_XTENSA_MACH)
e0001a05
NC
2745 fprintf (f, "\nMachine = Base\n");
2746 else
2747 fprintf (f, "\nMachine Id = 0x%x\n", e_flags & EF_XTENSA_MACH);
2748
2749 fprintf (f, "Insn tables = %s\n",
2750 (e_flags & EF_XTENSA_XT_INSN) ? "true" : "false");
2751
2752 fprintf (f, "Literal tables = %s\n",
2753 (e_flags & EF_XTENSA_XT_LIT) ? "true" : "false");
2754
2755 return _bfd_elf_print_private_bfd_data (abfd, farg);
2756}
2757
2758
2759/* Set the right machine number for an Xtensa ELF file. */
2760
2761static bfd_boolean
7fa3d080 2762elf_xtensa_object_p (bfd *abfd)
e0001a05
NC
2763{
2764 int mach;
2765 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
2766
2767 switch (arch)
2768 {
2769 case E_XTENSA_MACH:
2770 mach = bfd_mach_xtensa;
2771 break;
2772 default:
2773 return FALSE;
2774 }
2775
2776 (void) bfd_default_set_arch_mach (abfd, bfd_arch_xtensa, mach);
2777 return TRUE;
2778}
2779
2780
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
2783 number. */
2784
2785static void
7fa3d080
BW
2786elf_xtensa_final_write_processing (bfd *abfd,
2787 bfd_boolean linker ATTRIBUTE_UNUSED)
e0001a05
NC
2788{
2789 int mach;
2790 unsigned long val;
2791
2792 switch (mach = bfd_get_mach (abfd))
2793 {
2794 case bfd_mach_xtensa:
2795 val = E_XTENSA_MACH;
2796 break;
2797 default:
2798 return;
2799 }
2800
2801 elf_elfheader (abfd)->e_flags &= (~ EF_XTENSA_MACH);
2802 elf_elfheader (abfd)->e_flags |= val;
2803}
2804
2805
2806static enum elf_reloc_type_class
7fa3d080 2807elf_xtensa_reloc_type_class (const Elf_Internal_Rela *rela)
e0001a05
NC
2808{
2809 switch ((int) ELF32_R_TYPE (rela->r_info))
2810 {
2811 case R_XTENSA_RELATIVE:
2812 return reloc_class_relative;
2813 case R_XTENSA_JMP_SLOT:
2814 return reloc_class_plt;
2815 default:
2816 return reloc_class_normal;
2817 }
2818}
2819
2820\f
2821static bfd_boolean
7fa3d080
BW
2822elf_xtensa_discard_info_for_section (bfd *abfd,
2823 struct elf_reloc_cookie *cookie,
2824 struct bfd_link_info *info,
2825 asection *sec)
e0001a05
NC
2826{
2827 bfd_byte *contents;
2828 bfd_vma section_size;
2829 bfd_vma offset, actual_offset;
2830 size_t removed_bytes = 0;
2831
eea6121a 2832 section_size = sec->size;
e0001a05
NC
2833 if (section_size == 0 || section_size % 8 != 0)
2834 return FALSE;
2835
2836 if (sec->output_section
2837 && bfd_is_abs_section (sec->output_section))
2838 return FALSE;
2839
2840 contents = retrieve_contents (abfd, sec, info->keep_memory);
2841 if (!contents)
2842 return FALSE;
2843
2844 cookie->rels = retrieve_internal_relocs (abfd, sec, info->keep_memory);
2845 if (!cookie->rels)
2846 {
2847 release_contents (sec, contents);
2848 return FALSE;
2849 }
2850
2851 cookie->rel = cookie->rels;
2852 cookie->relend = cookie->rels + sec->reloc_count;
2853
2854 for (offset = 0; offset < section_size; offset += 8)
2855 {
2856 actual_offset = offset - removed_bytes;
2857
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)
2862 {
2863 cookie->rel->r_offset -= removed_bytes;
2864 cookie->rel++;
2865 }
2866
2867 while (cookie->rel < cookie->relend
2868 && cookie->rel->r_offset == offset)
2869 {
c152c796 2870 if (bfd_elf_reloc_symbol_deleted_p (offset, cookie))
e0001a05
NC
2871 {
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)
2876 {
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);
2882 removed_bytes += 8;
2883 }
2884
2885 /* Remove this relocation. */
2886 cookie->rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
2887 }
2888
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;
2896 else
2897 cookie->rel->r_offset = 0;
2898
2899 cookie->rel++;
2900 }
2901 }
2902
2903 if (removed_bytes != 0)
2904 {
2905 /* Adjust any remaining relocs (shouldn't be any). */
2906 for (; cookie->rel < cookie->relend; cookie->rel++)
2907 {
2908 if (cookie->rel->r_offset >= removed_bytes)
2909 cookie->rel->r_offset -= removed_bytes;
2910 else
2911 cookie->rel->r_offset = 0;
2912 }
2913
2914 /* Clear the removed bytes. */
2915 memset (&contents[section_size - removed_bytes], 0, removed_bytes);
2916
2917 pin_contents (sec, contents);
2918 pin_internal_relocs (sec, cookie->rels);
2919
eea6121a
AM
2920 /* Shrink size. */
2921 sec->size = section_size - removed_bytes;
b536dc1e
BW
2922
2923 if (xtensa_is_littable_section (sec))
2924 {
2925 bfd *dynobj = elf_hash_table (info)->dynobj;
2926 if (dynobj)
2927 {
2928 asection *sgotloc =
2929 bfd_get_section_by_name (dynobj, ".got.loc");
2930 if (sgotloc)
eea6121a 2931 sgotloc->size -= removed_bytes;
b536dc1e
BW
2932 }
2933 }
e0001a05
NC
2934 }
2935 else
2936 {
2937 release_contents (sec, contents);
2938 release_internal_relocs (sec, cookie->rels);
2939 }
2940
2941 return (removed_bytes != 0);
2942}
2943
2944
2945static bfd_boolean
7fa3d080
BW
2946elf_xtensa_discard_info (bfd *abfd,
2947 struct elf_reloc_cookie *cookie,
2948 struct bfd_link_info *info)
e0001a05
NC
2949{
2950 asection *sec;
2951 bfd_boolean changed = FALSE;
2952
2953 for (sec = abfd->sections; sec != NULL; sec = sec->next)
2954 {
2955 if (xtensa_is_property_section (sec))
2956 {
2957 if (elf_xtensa_discard_info_for_section (abfd, cookie, info, sec))
2958 changed = TRUE;
2959 }
2960 }
2961
2962 return changed;
2963}
2964
2965
2966static bfd_boolean
7fa3d080 2967elf_xtensa_ignore_discarded_relocs (asection *sec)
e0001a05
NC
2968{
2969 return xtensa_is_property_section (sec);
2970}
2971
2972\f
2973/* Support for core dump NOTE sections. */
2974
2975static bfd_boolean
7fa3d080 2976elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
e0001a05
NC
2977{
2978 int offset;
eea6121a 2979 unsigned int size;
e0001a05
NC
2980
2981 /* The size for Xtensa is variable, so don't try to recognize the format
2982 based on the size. Just assume this is GNU/Linux. */
2983
2984 /* pr_cursig */
2985 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2986
2987 /* pr_pid */
2988 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2989
2990 /* pr_reg */
2991 offset = 72;
eea6121a 2992 size = note->descsz - offset - 4;
e0001a05
NC
2993
2994 /* Make a ".reg/999" section. */
2995 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 2996 size, note->descpos + offset);
e0001a05
NC
2997}
2998
2999
3000static bfd_boolean
7fa3d080 3001elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
e0001a05
NC
3002{
3003 switch (note->descsz)
3004 {
3005 default:
3006 return FALSE;
3007
3008 case 128: /* GNU/Linux elf_prpsinfo */
3009 elf_tdata (abfd)->core_program
3010 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3011 elf_tdata (abfd)->core_command
3012 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3013 }
3014
3015 /* Note that for some reason, a spurious space is tacked
3016 onto the end of the args in some (at least one anyway)
3017 implementations, so strip it off if it exists. */
3018
3019 {
3020 char *command = elf_tdata (abfd)->core_command;
3021 int n = strlen (command);
3022
3023 if (0 < n && command[n - 1] == ' ')
3024 command[n - 1] = '\0';
3025 }
3026
3027 return TRUE;
3028}
3029
3030\f
3031/* Generic Xtensa configurability stuff. */
3032
3033static xtensa_opcode callx0_op = XTENSA_UNDEFINED;
3034static xtensa_opcode callx4_op = XTENSA_UNDEFINED;
3035static xtensa_opcode callx8_op = XTENSA_UNDEFINED;
3036static xtensa_opcode callx12_op = XTENSA_UNDEFINED;
3037static xtensa_opcode call0_op = XTENSA_UNDEFINED;
3038static xtensa_opcode call4_op = XTENSA_UNDEFINED;
3039static xtensa_opcode call8_op = XTENSA_UNDEFINED;
3040static xtensa_opcode call12_op = XTENSA_UNDEFINED;
3041
3042static void
7fa3d080 3043init_call_opcodes (void)
e0001a05
NC
3044{
3045 if (callx0_op == XTENSA_UNDEFINED)
3046 {
3047 callx0_op = xtensa_opcode_lookup (xtensa_default_isa, "callx0");
3048 callx4_op = xtensa_opcode_lookup (xtensa_default_isa, "callx4");
3049 callx8_op = xtensa_opcode_lookup (xtensa_default_isa, "callx8");
3050 callx12_op = xtensa_opcode_lookup (xtensa_default_isa, "callx12");
3051 call0_op = xtensa_opcode_lookup (xtensa_default_isa, "call0");
3052 call4_op = xtensa_opcode_lookup (xtensa_default_isa, "call4");
3053 call8_op = xtensa_opcode_lookup (xtensa_default_isa, "call8");
3054 call12_op = xtensa_opcode_lookup (xtensa_default_isa, "call12");
3055 }
3056}
3057
3058
3059static bfd_boolean
7fa3d080 3060is_indirect_call_opcode (xtensa_opcode opcode)
e0001a05
NC
3061{
3062 init_call_opcodes ();
3063 return (opcode == callx0_op
3064 || opcode == callx4_op
3065 || opcode == callx8_op
3066 || opcode == callx12_op);
3067}
3068
3069
3070static bfd_boolean
7fa3d080 3071is_direct_call_opcode (xtensa_opcode opcode)
e0001a05
NC
3072{
3073 init_call_opcodes ();
3074 return (opcode == call0_op
3075 || opcode == call4_op
3076 || opcode == call8_op
3077 || opcode == call12_op);
3078}
3079
3080
3081static bfd_boolean
7fa3d080 3082is_windowed_call_opcode (xtensa_opcode opcode)
e0001a05
NC
3083{
3084 init_call_opcodes ();
3085 return (opcode == call4_op
3086 || opcode == call8_op
3087 || opcode == call12_op
3088 || opcode == callx4_op
3089 || opcode == callx8_op
3090 || opcode == callx12_op);
3091}
3092
3093
43cd72b9
BW
3094static xtensa_opcode
3095get_const16_opcode (void)
3096{
3097 static bfd_boolean done_lookup = FALSE;
3098 static xtensa_opcode const16_opcode = XTENSA_UNDEFINED;
3099 if (!done_lookup)
3100 {
3101 const16_opcode = xtensa_opcode_lookup (xtensa_default_isa, "const16");
3102 done_lookup = TRUE;
3103 }
3104 return const16_opcode;
3105}
3106
3107
e0001a05
NC
3108static xtensa_opcode
3109get_l32r_opcode (void)
3110{
3111 static xtensa_opcode l32r_opcode = XTENSA_UNDEFINED;
43cd72b9
BW
3112 static bfd_boolean done_lookup = FALSE;
3113
3114 if (!done_lookup)
e0001a05
NC
3115 {
3116 l32r_opcode = xtensa_opcode_lookup (xtensa_default_isa, "l32r");
43cd72b9 3117 done_lookup = TRUE;
e0001a05
NC
3118 }
3119 return l32r_opcode;
3120}
3121
3122
3123static bfd_vma
7fa3d080 3124l32r_offset (bfd_vma addr, bfd_vma pc)
e0001a05
NC
3125{
3126 bfd_vma offset;
3127
3128 offset = addr - ((pc+3) & -4);
3129 BFD_ASSERT ((offset & ((1 << 2) - 1)) == 0);
3130 offset = (signed int) offset >> 2;
3131 BFD_ASSERT ((signed int) offset >> 16 == -1);
3132 return offset;
3133}
3134
3135
e0001a05 3136static int
7fa3d080 3137get_relocation_opnd (xtensa_opcode opcode, int r_type)
e0001a05 3138{
43cd72b9
BW
3139 xtensa_isa isa = xtensa_default_isa;
3140 int last_immed, last_opnd, opi;
3141
3142 if (opcode == XTENSA_UNDEFINED)
3143 return XTENSA_UNDEFINED;
3144
3145 /* Find the last visible PC-relative immediate operand for the opcode.
3146 If there are no PC-relative immediates, then choose the last visible
3147 immediate; otherwise, fail and return XTENSA_UNDEFINED. */
3148 last_immed = XTENSA_UNDEFINED;
3149 last_opnd = xtensa_opcode_num_operands (isa, opcode);
3150 for (opi = last_opnd - 1; opi >= 0; opi--)
3151 {
3152 if (xtensa_operand_is_visible (isa, opcode, opi) == 0)
3153 continue;
3154 if (xtensa_operand_is_PCrelative (isa, opcode, opi) == 1)
3155 {
3156 last_immed = opi;
3157 break;
3158 }
3159 if (last_immed == XTENSA_UNDEFINED
3160 && xtensa_operand_is_register (isa, opcode, opi) == 0)
3161 last_immed = opi;
3162 }
3163 if (last_immed < 0)
3164 return XTENSA_UNDEFINED;
3165
3166 /* If the operand number was specified in an old-style relocation,
3167 check for consistency with the operand computed above. */
3168 if (r_type >= R_XTENSA_OP0 && r_type <= R_XTENSA_OP2)
3169 {
3170 int reloc_opnd = r_type - R_XTENSA_OP0;
3171 if (reloc_opnd != last_immed)
3172 return XTENSA_UNDEFINED;
3173 }
3174
3175 return last_immed;
3176}
3177
3178
3179int
7fa3d080 3180get_relocation_slot (int r_type)
43cd72b9
BW
3181{
3182 switch (r_type)
3183 {
3184 case R_XTENSA_OP0:
3185 case R_XTENSA_OP1:
3186 case R_XTENSA_OP2:
3187 return 0;
3188
3189 default:
3190 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
3191 return r_type - R_XTENSA_SLOT0_OP;
3192 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
3193 return r_type - R_XTENSA_SLOT0_ALT;
3194 break;
3195 }
3196
3197 return XTENSA_UNDEFINED;
e0001a05
NC
3198}
3199
3200
3201/* Get the opcode for a relocation. */
3202
3203static xtensa_opcode
7fa3d080
BW
3204get_relocation_opcode (bfd *abfd,
3205 asection *sec,
3206 bfd_byte *contents,
3207 Elf_Internal_Rela *irel)
e0001a05
NC
3208{
3209 static xtensa_insnbuf ibuff = NULL;
43cd72b9 3210 static xtensa_insnbuf sbuff = NULL;
e0001a05 3211 xtensa_isa isa = xtensa_default_isa;
43cd72b9
BW
3212 xtensa_format fmt;
3213 int slot;
e0001a05
NC
3214
3215 if (contents == NULL)
3216 return XTENSA_UNDEFINED;
3217
43cd72b9 3218 if (bfd_get_section_limit (abfd, sec) <= irel->r_offset)
e0001a05
NC
3219 return XTENSA_UNDEFINED;
3220
3221 if (ibuff == NULL)
43cd72b9
BW
3222 {
3223 ibuff = xtensa_insnbuf_alloc (isa);
3224 sbuff = xtensa_insnbuf_alloc (isa);
3225 }
3226
e0001a05 3227 /* Decode the instruction. */
43cd72b9
BW
3228 xtensa_insnbuf_from_chars (isa, ibuff, &contents[irel->r_offset],
3229 sec->size - irel->r_offset);
3230 fmt = xtensa_format_decode (isa, ibuff);
3231 slot = get_relocation_slot (ELF32_R_TYPE (irel->r_info));
3232 if (slot == XTENSA_UNDEFINED)
3233 return XTENSA_UNDEFINED;
3234 xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
3235 return xtensa_opcode_decode (isa, fmt, slot, sbuff);
e0001a05
NC
3236}
3237
3238
3239bfd_boolean
7fa3d080
BW
3240is_l32r_relocation (bfd *abfd,
3241 asection *sec,
3242 bfd_byte *contents,
3243 Elf_Internal_Rela *irel)
e0001a05
NC
3244{
3245 xtensa_opcode opcode;
43cd72b9 3246 if (!is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
e0001a05 3247 return FALSE;
43cd72b9 3248 opcode = get_relocation_opcode (abfd, sec, contents, irel);
e0001a05
NC
3249 return (opcode == get_l32r_opcode ());
3250}
3251
e0001a05 3252
43cd72b9 3253static bfd_size_type
7fa3d080
BW
3254get_asm_simplify_size (bfd_byte *contents,
3255 bfd_size_type content_len,
3256 bfd_size_type offset)
e0001a05 3257{
43cd72b9 3258 bfd_size_type insnlen, size = 0;
e0001a05 3259
43cd72b9
BW
3260 /* Decode the size of the next two instructions. */
3261 insnlen = insn_decode_len (contents, content_len, offset);
3262 if (insnlen == 0)
3263 return 0;
e0001a05 3264
43cd72b9 3265 size += insnlen;
e0001a05 3266
43cd72b9
BW
3267 insnlen = insn_decode_len (contents, content_len, offset + size);
3268 if (insnlen == 0)
3269 return 0;
e0001a05 3270
43cd72b9
BW
3271 size += insnlen;
3272 return size;
3273}
e0001a05 3274
43cd72b9
BW
3275
3276bfd_boolean
7fa3d080 3277is_alt_relocation (int r_type)
43cd72b9
BW
3278{
3279 return (r_type >= R_XTENSA_SLOT0_ALT
3280 && r_type <= R_XTENSA_SLOT14_ALT);
e0001a05
NC
3281}
3282
3283
43cd72b9 3284bfd_boolean
7fa3d080 3285is_operand_relocation (int r_type)
e0001a05 3286{
43cd72b9
BW
3287 switch (r_type)
3288 {
3289 case R_XTENSA_OP0:
3290 case R_XTENSA_OP1:
3291 case R_XTENSA_OP2:
3292 return TRUE;
e0001a05 3293
43cd72b9
BW
3294 default:
3295 if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
3296 return TRUE;
3297 if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
3298 return TRUE;
3299 break;
3300 }
e0001a05 3301
43cd72b9 3302 return FALSE;
e0001a05
NC
3303}
3304
43cd72b9
BW
3305
3306#define MIN_INSN_LENGTH 2
e0001a05 3307
43cd72b9
BW
3308/* Return 0 if it fails to decode. */
3309
3310bfd_size_type
7fa3d080
BW
3311insn_decode_len (bfd_byte *contents,
3312 bfd_size_type content_len,
3313 bfd_size_type offset)
e0001a05 3314{
43cd72b9
BW
3315 int insn_len;
3316 xtensa_isa isa = xtensa_default_isa;
3317 xtensa_format fmt;
3318 static xtensa_insnbuf ibuff = NULL;
e0001a05 3319
43cd72b9
BW
3320 if (offset + MIN_INSN_LENGTH > content_len)
3321 return 0;
e0001a05 3322
43cd72b9
BW
3323 if (ibuff == NULL)
3324 ibuff = xtensa_insnbuf_alloc (isa);
3325 xtensa_insnbuf_from_chars (isa, ibuff, &contents[offset],
3326 content_len - offset);
3327 fmt = xtensa_format_decode (isa, ibuff);
3328 if (fmt == XTENSA_UNDEFINED)
3329 return 0;
3330 insn_len = xtensa_format_length (isa, fmt);
3331 if (insn_len == XTENSA_UNDEFINED)
3332 return 0;
3333 return insn_len;
e0001a05
NC
3334}
3335
3336
43cd72b9
BW
3337/* Decode the opcode for a single slot instruction.
3338 Return 0 if it fails to decode or the instruction is multi-slot. */
e0001a05 3339
43cd72b9 3340xtensa_opcode
7fa3d080
BW
3341insn_decode_opcode (bfd_byte *contents,
3342 bfd_size_type content_len,
3343 bfd_size_type offset,
3344 int slot)
e0001a05 3345{
e0001a05 3346 xtensa_isa isa = xtensa_default_isa;
43cd72b9
BW
3347 xtensa_format fmt;
3348 static xtensa_insnbuf insnbuf = NULL;
3349 static xtensa_insnbuf slotbuf = NULL;
3350
3351 if (offset + MIN_INSN_LENGTH > content_len)
e0001a05
NC
3352 return XTENSA_UNDEFINED;
3353
3354 if (insnbuf == NULL)
43cd72b9
BW
3355 {
3356 insnbuf = xtensa_insnbuf_alloc (isa);
3357 slotbuf = xtensa_insnbuf_alloc (isa);
3358 }
3359
3360 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
3361 content_len - offset);
3362 fmt = xtensa_format_decode (isa, insnbuf);
3363 if (fmt == XTENSA_UNDEFINED)
e0001a05 3364 return XTENSA_UNDEFINED;
43cd72b9
BW
3365
3366 if (slot >= xtensa_format_num_slots (isa, fmt))
e0001a05 3367 return XTENSA_UNDEFINED;
e0001a05 3368
43cd72b9
BW
3369 xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
3370 return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
3371}
e0001a05 3372
e0001a05 3373
43cd72b9
BW
3374/* The offset is the offset in the contents.
3375 The address is the address of that offset. */
e0001a05 3376
43cd72b9 3377static bfd_boolean
7fa3d080
BW
3378check_branch_target_aligned (bfd_byte *contents,
3379 bfd_size_type content_length,
3380 bfd_vma offset,
3381 bfd_vma address)
43cd72b9
BW
3382{
3383 bfd_size_type insn_len = insn_decode_len (contents, content_length, offset);
3384 if (insn_len == 0)
3385 return FALSE;
3386 return check_branch_target_aligned_address (address, insn_len);
3387}
e0001a05 3388
e0001a05 3389
43cd72b9 3390static bfd_boolean
7fa3d080
BW
3391check_loop_aligned (bfd_byte *contents,
3392 bfd_size_type content_length,
3393 bfd_vma offset,
3394 bfd_vma address)
e0001a05 3395{
43cd72b9 3396 bfd_size_type loop_len, insn_len;
64b607e6 3397 xtensa_opcode opcode;
e0001a05 3398
64b607e6
BW
3399 opcode = insn_decode_opcode (contents, content_length, offset, 0);
3400 if (opcode == XTENSA_UNDEFINED
3401 || xtensa_opcode_is_loop (xtensa_default_isa, opcode) != 1)
3402 {
3403 BFD_ASSERT (FALSE);
3404 return FALSE;
3405 }
3406
43cd72b9 3407 loop_len = insn_decode_len (contents, content_length, offset);
43cd72b9 3408 insn_len = insn_decode_len (contents, content_length, offset + loop_len);
64b607e6
BW
3409 if (loop_len == 0 || insn_len == 0)
3410 {
3411 BFD_ASSERT (FALSE);
3412 return FALSE;
3413 }
e0001a05 3414
43cd72b9
BW
3415 return check_branch_target_aligned_address (address + loop_len, insn_len);
3416}
e0001a05 3417
e0001a05
NC
3418
3419static bfd_boolean
7fa3d080 3420check_branch_target_aligned_address (bfd_vma addr, int len)
e0001a05 3421{
43cd72b9
BW
3422 if (len == 8)
3423 return (addr % 8 == 0);
3424 return ((addr >> 2) == ((addr + len - 1) >> 2));
e0001a05
NC
3425}
3426
43cd72b9
BW
3427\f
3428/* Instruction widening and narrowing. */
e0001a05 3429
7fa3d080
BW
3430/* When FLIX is available we need to access certain instructions only
3431 when they are 16-bit or 24-bit instructions. This table caches
3432 information about such instructions by walking through all the
3433 opcodes and finding the smallest single-slot format into which each
3434 can be encoded. */
3435
3436static xtensa_format *op_single_fmt_table = NULL;
e0001a05
NC
3437
3438
7fa3d080
BW
3439static void
3440init_op_single_format_table (void)
e0001a05 3441{
7fa3d080
BW
3442 xtensa_isa isa = xtensa_default_isa;
3443 xtensa_insnbuf ibuf;
3444 xtensa_opcode opcode;
3445 xtensa_format fmt;
3446 int num_opcodes;
3447
3448 if (op_single_fmt_table)
3449 return;
3450
3451 ibuf = xtensa_insnbuf_alloc (isa);
3452 num_opcodes = xtensa_isa_num_opcodes (isa);
3453
3454 op_single_fmt_table = (xtensa_format *)
3455 bfd_malloc (sizeof (xtensa_format) * num_opcodes);
3456 for (opcode = 0; opcode < num_opcodes; opcode++)
3457 {
3458 op_single_fmt_table[opcode] = XTENSA_UNDEFINED;
3459 for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
3460 {
3461 if (xtensa_format_num_slots (isa, fmt) == 1
3462 && xtensa_opcode_encode (isa, fmt, 0, ibuf, opcode) == 0)
3463 {
3464 xtensa_opcode old_fmt = op_single_fmt_table[opcode];
3465 int fmt_length = xtensa_format_length (isa, fmt);
3466 if (old_fmt == XTENSA_UNDEFINED
3467 || fmt_length < xtensa_format_length (isa, old_fmt))
3468 op_single_fmt_table[opcode] = fmt;
3469 }
3470 }
3471 }
3472 xtensa_insnbuf_free (isa, ibuf);
3473}
3474
3475
3476static xtensa_format
3477get_single_format (xtensa_opcode opcode)
3478{
3479 init_op_single_format_table ();
3480 return op_single_fmt_table[opcode];
3481}
e0001a05 3482
e0001a05 3483
43cd72b9
BW
3484/* For the set of narrowable instructions we do NOT include the
3485 narrowings beqz -> beqz.n or bnez -> bnez.n because of complexities
3486 involved during linker relaxation that may require these to
3487 re-expand in some conditions. Also, the narrowing "or" -> mov.n
3488 requires special case code to ensure it only works when op1 == op2. */
e0001a05 3489
7fa3d080
BW
3490struct string_pair
3491{
3492 const char *wide;
3493 const char *narrow;
3494};
3495
43cd72b9 3496struct string_pair narrowable[] =
e0001a05 3497{
43cd72b9
BW
3498 { "add", "add.n" },
3499 { "addi", "addi.n" },
3500 { "addmi", "addi.n" },
3501 { "l32i", "l32i.n" },
3502 { "movi", "movi.n" },
3503 { "ret", "ret.n" },
3504 { "retw", "retw.n" },
3505 { "s32i", "s32i.n" },
3506 { "or", "mov.n" } /* special case only when op1 == op2 */
3507};
e0001a05 3508
43cd72b9 3509struct string_pair widenable[] =
e0001a05 3510{
43cd72b9
BW
3511 { "add", "add.n" },
3512 { "addi", "addi.n" },
3513 { "addmi", "addi.n" },
3514 { "beqz", "beqz.n" },
3515 { "bnez", "bnez.n" },
3516 { "l32i", "l32i.n" },
3517 { "movi", "movi.n" },
3518 { "ret", "ret.n" },
3519 { "retw", "retw.n" },
3520 { "s32i", "s32i.n" },
3521 { "or", "mov.n" } /* special case only when op1 == op2 */
3522};
e0001a05
NC
3523
3524
64b607e6
BW
3525/* Check if an instruction can be "narrowed", i.e., changed from a standard
3526 3-byte instruction to a 2-byte "density" instruction. If it is valid,
3527 return the instruction buffer holding the narrow instruction. Otherwise,
3528 return 0. The set of valid narrowing are specified by a string table
43cd72b9
BW
3529 but require some special case operand checks in some cases. */
3530
64b607e6
BW
3531static xtensa_insnbuf
3532can_narrow_instruction (xtensa_insnbuf slotbuf,
3533 xtensa_format fmt,
3534 xtensa_opcode opcode)
e0001a05 3535{
43cd72b9 3536 xtensa_isa isa = xtensa_default_isa;
64b607e6
BW
3537 xtensa_format o_fmt;
3538 unsigned opi;
e0001a05 3539
43cd72b9
BW
3540 static xtensa_insnbuf o_insnbuf = NULL;
3541 static xtensa_insnbuf o_slotbuf = NULL;
e0001a05 3542
64b607e6 3543 if (o_insnbuf == NULL)
43cd72b9 3544 {
43cd72b9
BW
3545 o_insnbuf = xtensa_insnbuf_alloc (isa);
3546 o_slotbuf = xtensa_insnbuf_alloc (isa);
3547 }
e0001a05 3548
64b607e6 3549 for (opi = 0; opi < (sizeof (narrowable)/sizeof (struct string_pair)); opi++)
43cd72b9
BW
3550 {
3551 bfd_boolean is_or = (strcmp ("or", narrowable[opi].wide) == 0);
e0001a05 3552
43cd72b9
BW
3553 if (opcode == xtensa_opcode_lookup (isa, narrowable[opi].wide))
3554 {
3555 uint32 value, newval;
3556 int i, operand_count, o_operand_count;
3557 xtensa_opcode o_opcode;
e0001a05 3558
43cd72b9
BW
3559 /* Address does not matter in this case. We might need to
3560 fix it to handle branches/jumps. */
3561 bfd_vma self_address = 0;
e0001a05 3562
43cd72b9
BW
3563 o_opcode = xtensa_opcode_lookup (isa, narrowable[opi].narrow);
3564 if (o_opcode == XTENSA_UNDEFINED)
64b607e6 3565 return 0;
43cd72b9
BW
3566 o_fmt = get_single_format (o_opcode);
3567 if (o_fmt == XTENSA_UNDEFINED)
64b607e6 3568 return 0;
e0001a05 3569
43cd72b9
BW
3570 if (xtensa_format_length (isa, fmt) != 3
3571 || xtensa_format_length (isa, o_fmt) != 2)
64b607e6 3572 return 0;
e0001a05 3573
43cd72b9
BW
3574 xtensa_format_encode (isa, o_fmt, o_insnbuf);
3575 operand_count = xtensa_opcode_num_operands (isa, opcode);
3576 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
e0001a05 3577
43cd72b9 3578 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
64b607e6 3579 return 0;
e0001a05 3580
43cd72b9
BW
3581 if (!is_or)
3582 {
3583 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
64b607e6 3584 return 0;
43cd72b9
BW
3585 }
3586 else
3587 {
3588 uint32 rawval0, rawval1, rawval2;
e0001a05 3589
64b607e6
BW
3590 if (o_operand_count + 1 != operand_count
3591 || xtensa_operand_get_field (isa, opcode, 0,
3592 fmt, 0, slotbuf, &rawval0) != 0
3593 || xtensa_operand_get_field (isa, opcode, 1,
3594 fmt, 0, slotbuf, &rawval1) != 0
3595 || xtensa_operand_get_field (isa, opcode, 2,
3596 fmt, 0, slotbuf, &rawval2) != 0
3597 || rawval1 != rawval2
3598 || rawval0 == rawval1 /* it is a nop */)
3599 return 0;
43cd72b9 3600 }
e0001a05 3601
43cd72b9
BW
3602 for (i = 0; i < o_operand_count; ++i)
3603 {
3604 if (xtensa_operand_get_field (isa, opcode, i, fmt, 0,
3605 slotbuf, &value)
3606 || xtensa_operand_decode (isa, opcode, i, &value))
64b607e6 3607 return 0;
e0001a05 3608
43cd72b9
BW
3609 /* PC-relative branches need adjustment, but
3610 the PC-rel operand will always have a relocation. */
3611 newval = value;
3612 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
3613 self_address)
3614 || xtensa_operand_encode (isa, o_opcode, i, &newval)
3615 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
3616 o_slotbuf, newval))
64b607e6 3617 return 0;
43cd72b9 3618 }
e0001a05 3619
64b607e6
BW
3620 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
3621 return 0;
e0001a05 3622
64b607e6 3623 return o_insnbuf;
43cd72b9
BW
3624 }
3625 }
64b607e6 3626 return 0;
43cd72b9 3627}
e0001a05 3628
e0001a05 3629
64b607e6
BW
3630/* Attempt to narrow an instruction. If the narrowing is valid, perform
3631 the action in-place directly into the contents and return TRUE. Otherwise,
3632 the return value is FALSE and the contents are not modified. */
e0001a05 3633
43cd72b9 3634static bfd_boolean
64b607e6
BW
3635narrow_instruction (bfd_byte *contents,
3636 bfd_size_type content_length,
3637 bfd_size_type offset)
e0001a05 3638{
43cd72b9 3639 xtensa_opcode opcode;
64b607e6 3640 bfd_size_type insn_len;
43cd72b9 3641 xtensa_isa isa = xtensa_default_isa;
64b607e6
BW
3642 xtensa_format fmt;
3643 xtensa_insnbuf o_insnbuf;
e0001a05 3644
43cd72b9
BW
3645 static xtensa_insnbuf insnbuf = NULL;
3646 static xtensa_insnbuf slotbuf = NULL;
e0001a05 3647
43cd72b9
BW
3648 if (insnbuf == NULL)
3649 {
3650 insnbuf = xtensa_insnbuf_alloc (isa);
3651 slotbuf = xtensa_insnbuf_alloc (isa);
43cd72b9 3652 }
e0001a05 3653
43cd72b9 3654 BFD_ASSERT (offset < content_length);
2c8c90bc 3655
43cd72b9 3656 if (content_length < 2)
e0001a05
NC
3657 return FALSE;
3658
64b607e6 3659 /* We will hand-code a few of these for a little while.
43cd72b9
BW
3660 These have all been specified in the assembler aleady. */
3661 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
3662 content_length - offset);
3663 fmt = xtensa_format_decode (isa, insnbuf);
3664 if (xtensa_format_num_slots (isa, fmt) != 1)
e0001a05
NC
3665 return FALSE;
3666
43cd72b9 3667 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
e0001a05
NC
3668 return FALSE;
3669
43cd72b9
BW
3670 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
3671 if (opcode == XTENSA_UNDEFINED)
e0001a05 3672 return FALSE;
43cd72b9
BW
3673 insn_len = xtensa_format_length (isa, fmt);
3674 if (insn_len > content_length)
3675 return FALSE;
3676
64b607e6
BW
3677 o_insnbuf = can_narrow_instruction (slotbuf, fmt, opcode);
3678 if (o_insnbuf)
3679 {
3680 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
3681 content_length - offset);
3682 return TRUE;
3683 }
3684
3685 return FALSE;
3686}
3687
3688
3689/* Check if an instruction can be "widened", i.e., changed from a 2-byte
3690 "density" instruction to a standard 3-byte instruction. If it is valid,
3691 return the instruction buffer holding the wide instruction. Otherwise,
3692 return 0. The set of valid widenings are specified by a string table
3693 but require some special case operand checks in some cases. */
3694
3695static xtensa_insnbuf
3696can_widen_instruction (xtensa_insnbuf slotbuf,
3697 xtensa_format fmt,
3698 xtensa_opcode opcode)
3699{
3700 xtensa_isa isa = xtensa_default_isa;
3701 xtensa_format o_fmt;
3702 unsigned opi;
3703
3704 static xtensa_insnbuf o_insnbuf = NULL;
3705 static xtensa_insnbuf o_slotbuf = NULL;
3706
3707 if (o_insnbuf == NULL)
3708 {
3709 o_insnbuf = xtensa_insnbuf_alloc (isa);
3710 o_slotbuf = xtensa_insnbuf_alloc (isa);
3711 }
3712
3713 for (opi = 0; opi < (sizeof (widenable)/sizeof (struct string_pair)); opi++)
e0001a05 3714 {
43cd72b9
BW
3715 bfd_boolean is_or = (strcmp ("or", widenable[opi].wide) == 0);
3716 bfd_boolean is_branch = (strcmp ("beqz", widenable[opi].wide) == 0
3717 || strcmp ("bnez", widenable[opi].wide) == 0);
e0001a05 3718
43cd72b9
BW
3719 if (opcode == xtensa_opcode_lookup (isa, widenable[opi].narrow))
3720 {
3721 uint32 value, newval;
3722 int i, operand_count, o_operand_count, check_operand_count;
3723 xtensa_opcode o_opcode;
e0001a05 3724
43cd72b9
BW
3725 /* Address does not matter in this case. We might need to fix it
3726 to handle branches/jumps. */
3727 bfd_vma self_address = 0;
e0001a05 3728
43cd72b9
BW
3729 o_opcode = xtensa_opcode_lookup (isa, widenable[opi].wide);
3730 if (o_opcode == XTENSA_UNDEFINED)
64b607e6 3731 return 0;
43cd72b9
BW
3732 o_fmt = get_single_format (o_opcode);
3733 if (o_fmt == XTENSA_UNDEFINED)
64b607e6 3734 return 0;
e0001a05 3735
43cd72b9
BW
3736 if (xtensa_format_length (isa, fmt) != 2
3737 || xtensa_format_length (isa, o_fmt) != 3)
64b607e6 3738 return 0;
e0001a05 3739
43cd72b9
BW
3740 xtensa_format_encode (isa, o_fmt, o_insnbuf);
3741 operand_count = xtensa_opcode_num_operands (isa, opcode);
3742 o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
3743 check_operand_count = o_operand_count;
e0001a05 3744
43cd72b9 3745 if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
64b607e6 3746 return 0;
e0001a05 3747
43cd72b9
BW
3748 if (!is_or)
3749 {
3750 if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
64b607e6 3751 return 0;
43cd72b9
BW
3752 }
3753 else
3754 {
3755 uint32 rawval0, rawval1;
3756
64b607e6
BW
3757 if (o_operand_count != operand_count + 1
3758 || xtensa_operand_get_field (isa, opcode, 0,
3759 fmt, 0, slotbuf, &rawval0) != 0
3760 || xtensa_operand_get_field (isa, opcode, 1,
3761 fmt, 0, slotbuf, &rawval1) != 0
3762 || rawval0 == rawval1 /* it is a nop */)
3763 return 0;
43cd72b9
BW
3764 }
3765 if (is_branch)
3766 check_operand_count--;
3767
64b607e6 3768 for (i = 0; i < check_operand_count; i++)
43cd72b9
BW
3769 {
3770 int new_i = i;
3771 if (is_or && i == o_operand_count - 1)
3772 new_i = i - 1;
3773 if (xtensa_operand_get_field (isa, opcode, new_i, fmt, 0,
3774 slotbuf, &value)
3775 || xtensa_operand_decode (isa, opcode, new_i, &value))
64b607e6 3776 return 0;
43cd72b9
BW
3777
3778 /* PC-relative branches need adjustment, but
3779 the PC-rel operand will always have a relocation. */
3780 newval = value;
3781 if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
3782 self_address)
3783 || xtensa_operand_encode (isa, o_opcode, i, &newval)
3784 || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
3785 o_slotbuf, newval))
64b607e6 3786 return 0;
43cd72b9
BW
3787 }
3788
3789 if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
64b607e6 3790 return 0;
43cd72b9 3791
64b607e6 3792 return o_insnbuf;
43cd72b9
BW
3793 }
3794 }
64b607e6
BW
3795 return 0;
3796}
3797
3798
3799/* Attempt to widen an instruction. If the widening is valid, perform
3800 the action in-place directly into the contents and return TRUE. Otherwise,
3801 the return value is FALSE and the contents are not modified. */
3802
3803static bfd_boolean
3804widen_instruction (bfd_byte *contents,
3805 bfd_size_type content_length,
3806 bfd_size_type offset)
3807{
3808 xtensa_opcode opcode;
3809 bfd_size_type insn_len;
3810 xtensa_isa isa = xtensa_default_isa;
3811 xtensa_format fmt;
3812 xtensa_insnbuf o_insnbuf;
3813
3814 static xtensa_insnbuf insnbuf = NULL;
3815 static xtensa_insnbuf slotbuf = NULL;
3816
3817 if (insnbuf == NULL)
3818 {
3819 insnbuf = xtensa_insnbuf_alloc (isa);
3820 slotbuf = xtensa_insnbuf_alloc (isa);
3821 }
3822
3823 BFD_ASSERT (offset < content_length);
3824
3825 if (content_length < 2)
3826 return FALSE;
3827
3828 /* We will hand-code a few of these for a little while.
3829 These have all been specified in the assembler aleady. */
3830 xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
3831 content_length - offset);
3832 fmt = xtensa_format_decode (isa, insnbuf);
3833 if (xtensa_format_num_slots (isa, fmt) != 1)
3834 return FALSE;
3835
3836 if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
3837 return FALSE;
3838
3839 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
3840 if (opcode == XTENSA_UNDEFINED)
3841 return FALSE;
3842 insn_len = xtensa_format_length (isa, fmt);
3843 if (insn_len > content_length)
3844 return FALSE;
3845
3846 o_insnbuf = can_widen_instruction (slotbuf, fmt, opcode);
3847 if (o_insnbuf)
3848 {
3849 xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
3850 content_length - offset);
3851 return TRUE;
3852 }
43cd72b9 3853 return FALSE;
e0001a05
NC
3854}
3855
43cd72b9
BW
3856\f
3857/* Code for transforming CALLs at link-time. */
e0001a05 3858
43cd72b9 3859static bfd_reloc_status_type
7fa3d080
BW
3860elf_xtensa_do_asm_simplify (bfd_byte *contents,
3861 bfd_vma address,
3862 bfd_vma content_length,
3863 char **error_message)
e0001a05 3864{
43cd72b9
BW
3865 static xtensa_insnbuf insnbuf = NULL;
3866 static xtensa_insnbuf slotbuf = NULL;
3867 xtensa_format core_format = XTENSA_UNDEFINED;
3868 xtensa_opcode opcode;
3869 xtensa_opcode direct_call_opcode;
3870 xtensa_isa isa = xtensa_default_isa;
3871 bfd_byte *chbuf = contents + address;
3872 int opn;
e0001a05 3873
43cd72b9 3874 if (insnbuf == NULL)
e0001a05 3875 {
43cd72b9
BW
3876 insnbuf = xtensa_insnbuf_alloc (isa);
3877 slotbuf = xtensa_insnbuf_alloc (isa);
e0001a05 3878 }
e0001a05 3879
43cd72b9
BW
3880 if (content_length < address)
3881 {
3882 *error_message = _("Attempt to convert L32R/CALLX to CALL failed");
3883 return bfd_reloc_other;
3884 }
e0001a05 3885
43cd72b9
BW
3886 opcode = get_expanded_call_opcode (chbuf, content_length - address, 0);
3887 direct_call_opcode = swap_callx_for_call_opcode (opcode);
3888 if (direct_call_opcode == XTENSA_UNDEFINED)
3889 {
3890 *error_message = _("Attempt to convert L32R/CALLX to CALL failed");
3891 return bfd_reloc_other;
3892 }
3893
3894 /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset. */
3895 core_format = xtensa_format_lookup (isa, "x24");
3896 opcode = xtensa_opcode_lookup (isa, "or");
3897 xtensa_opcode_encode (isa, core_format, 0, slotbuf, opcode);
3898 for (opn = 0; opn < 3; opn++)
3899 {
3900 uint32 regno = 1;
3901 xtensa_operand_encode (isa, opcode, opn, &regno);
3902 xtensa_operand_set_field (isa, opcode, opn, core_format, 0,
3903 slotbuf, regno);
3904 }
3905 xtensa_format_encode (isa, core_format, insnbuf);
3906 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
3907 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf, content_length - address);
e0001a05 3908
43cd72b9
BW
3909 /* Assemble a CALL ("callN 0") into the 3 byte offset. */
3910 xtensa_opcode_encode (isa, core_format, 0, slotbuf, direct_call_opcode);
3911 xtensa_operand_set_field (isa, opcode, 0, core_format, 0, slotbuf, 0);
e0001a05 3912
43cd72b9
BW
3913 xtensa_format_encode (isa, core_format, insnbuf);
3914 xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
3915 xtensa_insnbuf_to_chars (isa, insnbuf, chbuf + 3,
3916 content_length - address - 3);
e0001a05 3917
43cd72b9
BW
3918 return bfd_reloc_ok;
3919}
e0001a05 3920
e0001a05 3921
43cd72b9 3922static bfd_reloc_status_type
7fa3d080
BW
3923contract_asm_expansion (bfd_byte *contents,
3924 bfd_vma content_length,
3925 Elf_Internal_Rela *irel,
3926 char **error_message)
43cd72b9
BW
3927{
3928 bfd_reloc_status_type retval =
3929 elf_xtensa_do_asm_simplify (contents, irel->r_offset, content_length,
3930 error_message);
e0001a05 3931
43cd72b9
BW
3932 if (retval != bfd_reloc_ok)
3933 return bfd_reloc_dangerous;
e0001a05 3934
43cd72b9
BW
3935 /* Update the irel->r_offset field so that the right immediate and
3936 the right instruction are modified during the relocation. */
3937 irel->r_offset += 3;
3938 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_XTENSA_SLOT0_OP);
3939 return bfd_reloc_ok;
3940}
e0001a05 3941
e0001a05 3942
43cd72b9 3943static xtensa_opcode
7fa3d080 3944swap_callx_for_call_opcode (xtensa_opcode opcode)
e0001a05 3945{
43cd72b9 3946 init_call_opcodes ();
e0001a05 3947
43cd72b9
BW
3948 if (opcode == callx0_op) return call0_op;
3949 if (opcode == callx4_op) return call4_op;
3950 if (opcode == callx8_op) return call8_op;
3951 if (opcode == callx12_op) return call12_op;
e0001a05 3952
43cd72b9
BW
3953 /* Return XTENSA_UNDEFINED if the opcode is not an indirect call. */
3954 return XTENSA_UNDEFINED;
3955}
e0001a05 3956
e0001a05 3957
43cd72b9
BW
3958/* Check if "buf" is pointing to a "L32R aN; CALLX aN" or "CONST16 aN;
3959 CONST16 aN; CALLX aN" sequence, and if so, return the CALLX opcode.
3960 If not, return XTENSA_UNDEFINED. */
e0001a05 3961
43cd72b9
BW
3962#define L32R_TARGET_REG_OPERAND 0
3963#define CONST16_TARGET_REG_OPERAND 0
3964#define CALLN_SOURCE_OPERAND 0
e0001a05 3965
43cd72b9 3966static xtensa_opcode
7fa3d080 3967get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
e0001a05 3968{
43cd72b9
BW
3969 static xtensa_insnbuf insnbuf = NULL;
3970 static xtensa_insnbuf slotbuf = NULL;
3971 xtensa_format fmt;
3972 xtensa_opcode opcode;
3973 xtensa_isa isa = xtensa_default_isa;
3974 uint32 regno, const16_regno, call_regno;
3975 int offset = 0;
e0001a05 3976
43cd72b9 3977 if (insnbuf == NULL)
e0001a05 3978 {
43cd72b9
BW
3979 insnbuf = xtensa_insnbuf_alloc (isa);
3980 slotbuf = xtensa_insnbuf_alloc (isa);
e0001a05 3981 }
43cd72b9
BW
3982
3983 xtensa_insnbuf_from_chars (isa, insnbuf, buf, bufsize);
3984 fmt = xtensa_format_decode (isa, insnbuf);
3985 if (fmt == XTENSA_UNDEFINED
3986 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
3987 return XTENSA_UNDEFINED;
3988
3989 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
3990 if (opcode == XTENSA_UNDEFINED)
3991 return XTENSA_UNDEFINED;
3992
3993 if (opcode == get_l32r_opcode ())
e0001a05 3994 {
43cd72b9
BW
3995 if (p_uses_l32r)
3996 *p_uses_l32r = TRUE;
3997 if (xtensa_operand_get_field (isa, opcode, L32R_TARGET_REG_OPERAND,
3998 fmt, 0, slotbuf, &regno)
3999 || xtensa_operand_decode (isa, opcode, L32R_TARGET_REG_OPERAND,
4000 &regno))
4001 return XTENSA_UNDEFINED;
e0001a05 4002 }
43cd72b9 4003 else if (opcode == get_const16_opcode ())
e0001a05 4004 {
43cd72b9
BW
4005 if (p_uses_l32r)
4006 *p_uses_l32r = FALSE;
4007 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4008 fmt, 0, slotbuf, &regno)
4009 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4010 &regno))
4011 return XTENSA_UNDEFINED;
4012
4013 /* Check that the next instruction is also CONST16. */
4014 offset += xtensa_format_length (isa, fmt);
4015 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4016 fmt = xtensa_format_decode (isa, insnbuf);
4017 if (fmt == XTENSA_UNDEFINED
4018 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4019 return XTENSA_UNDEFINED;
4020 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4021 if (opcode != get_const16_opcode ())
4022 return XTENSA_UNDEFINED;
4023
4024 if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4025 fmt, 0, slotbuf, &const16_regno)
4026 || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4027 &const16_regno)
4028 || const16_regno != regno)
4029 return XTENSA_UNDEFINED;
e0001a05 4030 }
43cd72b9
BW
4031 else
4032 return XTENSA_UNDEFINED;
e0001a05 4033
43cd72b9
BW
4034 /* Next instruction should be an CALLXn with operand 0 == regno. */
4035 offset += xtensa_format_length (isa, fmt);
4036 xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4037 fmt = xtensa_format_decode (isa, insnbuf);
4038 if (fmt == XTENSA_UNDEFINED
4039 || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4040 return XTENSA_UNDEFINED;
4041 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4042 if (opcode == XTENSA_UNDEFINED
4043 || !is_indirect_call_opcode (opcode))
4044 return XTENSA_UNDEFINED;
e0001a05 4045
43cd72b9
BW
4046 if (xtensa_operand_get_field (isa, opcode, CALLN_SOURCE_OPERAND,
4047 fmt, 0, slotbuf, &call_regno)
4048 || xtensa_operand_decode (isa, opcode, CALLN_SOURCE_OPERAND,
4049 &call_regno))
4050 return XTENSA_UNDEFINED;
e0001a05 4051
43cd72b9
BW
4052 if (call_regno != regno)
4053 return XTENSA_UNDEFINED;
e0001a05 4054
43cd72b9
BW
4055 return opcode;
4056}
e0001a05 4057
43cd72b9
BW
4058\f
4059/* Data structures used during relaxation. */
e0001a05 4060
43cd72b9 4061/* r_reloc: relocation values. */
e0001a05 4062
43cd72b9
BW
4063/* Through the relaxation process, we need to keep track of the values
4064 that will result from evaluating relocations. The standard ELF
4065 relocation structure is not sufficient for this purpose because we're
4066 operating on multiple input files at once, so we need to know which
4067 input file a relocation refers to. The r_reloc structure thus
4068 records both the input file (bfd) and ELF relocation.
e0001a05 4069
43cd72b9
BW
4070 For efficiency, an r_reloc also contains a "target_offset" field to
4071 cache the target-section-relative offset value that is represented by
4072 the relocation.
4073
4074 The r_reloc also contains a virtual offset that allows multiple
4075 inserted literals to be placed at the same "address" with
4076 different offsets. */
e0001a05 4077
43cd72b9 4078typedef struct r_reloc_struct r_reloc;
e0001a05 4079
43cd72b9 4080struct r_reloc_struct
e0001a05 4081{
43cd72b9
BW
4082 bfd *abfd;
4083 Elf_Internal_Rela rela;
e0001a05 4084 bfd_vma target_offset;
43cd72b9 4085 bfd_vma virtual_offset;
e0001a05
NC
4086};
4087
e0001a05 4088
43cd72b9
BW
4089/* The r_reloc structure is included by value in literal_value, but not
4090 every literal_value has an associated relocation -- some are simple
4091 constants. In such cases, we set all the fields in the r_reloc
4092 struct to zero. The r_reloc_is_const function should be used to
4093 detect this case. */
e0001a05 4094
43cd72b9 4095static bfd_boolean
7fa3d080 4096r_reloc_is_const (const r_reloc *r_rel)
e0001a05 4097{
43cd72b9 4098 return (r_rel->abfd == NULL);
e0001a05
NC
4099}
4100
4101
43cd72b9 4102static bfd_vma
7fa3d080 4103r_reloc_get_target_offset (const r_reloc *r_rel)
e0001a05 4104{
43cd72b9
BW
4105 bfd_vma target_offset;
4106 unsigned long r_symndx;
e0001a05 4107
43cd72b9
BW
4108 BFD_ASSERT (!r_reloc_is_const (r_rel));
4109 r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4110 target_offset = get_elf_r_symndx_offset (r_rel->abfd, r_symndx);
4111 return (target_offset + r_rel->rela.r_addend);
4112}
e0001a05 4113
e0001a05 4114
43cd72b9 4115static struct elf_link_hash_entry *
7fa3d080 4116r_reloc_get_hash_entry (const r_reloc *r_rel)
e0001a05 4117{
43cd72b9
BW
4118 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4119 return get_elf_r_symndx_hash_entry (r_rel->abfd, r_symndx);
4120}
e0001a05 4121
43cd72b9
BW
4122
4123static asection *
7fa3d080 4124r_reloc_get_section (const r_reloc *r_rel)
43cd72b9
BW
4125{
4126 unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4127 return get_elf_r_symndx_section (r_rel->abfd, r_symndx);
4128}
e0001a05
NC
4129
4130
4131static bfd_boolean
7fa3d080 4132r_reloc_is_defined (const r_reloc *r_rel)
e0001a05 4133{
43cd72b9
BW
4134 asection *sec;
4135 if (r_rel == NULL)
e0001a05 4136 return FALSE;
e0001a05 4137
43cd72b9
BW
4138 sec = r_reloc_get_section (r_rel);
4139 if (sec == bfd_abs_section_ptr
4140 || sec == bfd_com_section_ptr
4141 || sec == bfd_und_section_ptr)
4142 return FALSE;
4143 return TRUE;
e0001a05
NC
4144}
4145
4146
7fa3d080
BW
4147static void
4148r_reloc_init (r_reloc *r_rel,
4149 bfd *abfd,
4150 Elf_Internal_Rela *irel,
4151 bfd_byte *contents,
4152 bfd_size_type content_length)
4153{
4154 int r_type;
4155 reloc_howto_type *howto;
4156
4157 if (irel)
4158 {
4159 r_rel->rela = *irel;
4160 r_rel->abfd = abfd;
4161 r_rel->target_offset = r_reloc_get_target_offset (r_rel);
4162 r_rel->virtual_offset = 0;
4163 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
4164 howto = &elf_howto_table[r_type];
4165 if (howto->partial_inplace)
4166 {
4167 bfd_vma inplace_val;
4168 BFD_ASSERT (r_rel->rela.r_offset < content_length);
4169
4170 inplace_val = bfd_get_32 (abfd, &contents[r_rel->rela.r_offset]);
4171 r_rel->target_offset += inplace_val;
4172 }
4173 }
4174 else
4175 memset (r_rel, 0, sizeof (r_reloc));
4176}
4177
4178
43cd72b9
BW
4179#if DEBUG
4180
e0001a05 4181static void
7fa3d080 4182print_r_reloc (FILE *fp, const r_reloc *r_rel)
e0001a05 4183{
43cd72b9
BW
4184 if (r_reloc_is_defined (r_rel))
4185 {
4186 asection *sec = r_reloc_get_section (r_rel);
4187 fprintf (fp, " %s(%s + ", sec->owner->filename, sec->name);
4188 }
4189 else if (r_reloc_get_hash_entry (r_rel))
4190 fprintf (fp, " %s + ", r_reloc_get_hash_entry (r_rel)->root.root.string);
4191 else
4192 fprintf (fp, " ?? + ");
e0001a05 4193
43cd72b9
BW
4194 fprintf_vma (fp, r_rel->target_offset);
4195 if (r_rel->virtual_offset)
4196 {
4197 fprintf (fp, " + ");
4198 fprintf_vma (fp, r_rel->virtual_offset);
4199 }
4200
4201 fprintf (fp, ")");
4202}
e0001a05 4203
43cd72b9 4204#endif /* DEBUG */
e0001a05 4205
43cd72b9
BW
4206\f
4207/* source_reloc: relocations that reference literals. */
e0001a05 4208
43cd72b9
BW
4209/* To determine whether literals can be coalesced, we need to first
4210 record all the relocations that reference the literals. The
4211 source_reloc structure below is used for this purpose. The
4212 source_reloc entries are kept in a per-literal-section array, sorted
4213 by offset within the literal section (i.e., target offset).
e0001a05 4214
43cd72b9
BW
4215 The source_sec and r_rel.rela.r_offset fields identify the source of
4216 the relocation. The r_rel field records the relocation value, i.e.,
4217 the offset of the literal being referenced. The opnd field is needed
4218 to determine the range of the immediate field to which the relocation
4219 applies, so we can determine whether another literal with the same
4220 value is within range. The is_null field is true when the relocation
4221 is being removed (e.g., when an L32R is being removed due to a CALLX
4222 that is converted to a direct CALL). */
e0001a05 4223
43cd72b9
BW
4224typedef struct source_reloc_struct source_reloc;
4225
4226struct source_reloc_struct
e0001a05 4227{
43cd72b9
BW
4228 asection *source_sec;
4229 r_reloc r_rel;
4230 xtensa_opcode opcode;
4231 int opnd;
4232 bfd_boolean is_null;
4233 bfd_boolean is_abs_literal;
4234};
e0001a05 4235
e0001a05 4236
e0001a05 4237static void
7fa3d080
BW
4238init_source_reloc (source_reloc *reloc,
4239 asection *source_sec,
4240 const r_reloc *r_rel,
4241 xtensa_opcode opcode,
4242 int opnd,
4243 bfd_boolean is_abs_literal)
e0001a05 4244{
43cd72b9
BW
4245 reloc->source_sec = source_sec;
4246 reloc->r_rel = *r_rel;
4247 reloc->opcode = opcode;
4248 reloc->opnd = opnd;
4249 reloc->is_null = FALSE;
4250 reloc->is_abs_literal = is_abs_literal;
e0001a05
NC
4251}
4252
e0001a05 4253
43cd72b9
BW
4254/* Find the source_reloc for a particular source offset and relocation
4255 type. Note that the array is sorted by _target_ offset, so this is
4256 just a linear search. */
e0001a05 4257
43cd72b9 4258static source_reloc *
7fa3d080
BW
4259find_source_reloc (source_reloc *src_relocs,
4260 int src_count,
4261 asection *sec,
4262 Elf_Internal_Rela *irel)
e0001a05 4263{
43cd72b9 4264 int i;
e0001a05 4265
43cd72b9
BW
4266 for (i = 0; i < src_count; i++)
4267 {
4268 if (src_relocs[i].source_sec == sec
4269 && src_relocs[i].r_rel.rela.r_offset == irel->r_offset
4270 && (ELF32_R_TYPE (src_relocs[i].r_rel.rela.r_info)
4271 == ELF32_R_TYPE (irel->r_info)))
4272 return &src_relocs[i];
4273 }
e0001a05 4274
43cd72b9 4275 return NULL;
e0001a05
NC
4276}
4277
4278
43cd72b9 4279static int
7fa3d080 4280source_reloc_compare (const void *ap, const void *bp)
e0001a05 4281{
43cd72b9
BW
4282 const source_reloc *a = (const source_reloc *) ap;
4283 const source_reloc *b = (const source_reloc *) bp;
e0001a05 4284
43cd72b9
BW
4285 if (a->r_rel.target_offset != b->r_rel.target_offset)
4286 return (a->r_rel.target_offset - b->r_rel.target_offset);
e0001a05 4287
43cd72b9
BW
4288 /* We don't need to sort on these criteria for correctness,
4289 but enforcing a more strict ordering prevents unstable qsort
4290 from behaving differently with different implementations.
4291 Without the code below we get correct but different results
4292 on Solaris 2.7 and 2.8. We would like to always produce the
4293 same results no matter the host. */
4294
4295 if ((!a->is_null) - (!b->is_null))
4296 return ((!a->is_null) - (!b->is_null));
4297 return internal_reloc_compare (&a->r_rel.rela, &b->r_rel.rela);
e0001a05
NC
4298}
4299
43cd72b9
BW
4300\f
4301/* Literal values and value hash tables. */
e0001a05 4302
43cd72b9
BW
4303/* Literals with the same value can be coalesced. The literal_value
4304 structure records the value of a literal: the "r_rel" field holds the
4305 information from the relocation on the literal (if there is one) and
4306 the "value" field holds the contents of the literal word itself.
e0001a05 4307
43cd72b9
BW
4308 The value_map structure records a literal value along with the
4309 location of a literal holding that value. The value_map hash table
4310 is indexed by the literal value, so that we can quickly check if a
4311 particular literal value has been seen before and is thus a candidate
4312 for coalescing. */
e0001a05 4313
43cd72b9
BW
4314typedef struct literal_value_struct literal_value;
4315typedef struct value_map_struct value_map;
4316typedef struct value_map_hash_table_struct value_map_hash_table;
e0001a05 4317
43cd72b9 4318struct literal_value_struct
e0001a05 4319{
43cd72b9
BW
4320 r_reloc r_rel;
4321 unsigned long value;
4322 bfd_boolean is_abs_literal;
4323};
4324
4325struct value_map_struct
4326{
4327 literal_value val; /* The literal value. */
4328 r_reloc loc; /* Location of the literal. */
4329 value_map *next;
4330};
4331
4332struct value_map_hash_table_struct
4333{
4334 unsigned bucket_count;
4335 value_map **buckets;
4336 unsigned count;
4337 bfd_boolean has_last_loc;
4338 r_reloc last_loc;
4339};
4340
4341
e0001a05 4342static void
7fa3d080
BW
4343init_literal_value (literal_value *lit,
4344 const r_reloc *r_rel,
4345 unsigned long value,
4346 bfd_boolean is_abs_literal)
e0001a05 4347{
43cd72b9
BW
4348 lit->r_rel = *r_rel;
4349 lit->value = value;
4350 lit->is_abs_literal = is_abs_literal;
e0001a05
NC
4351}
4352
4353
43cd72b9 4354static bfd_boolean
7fa3d080
BW
4355literal_value_equal (const literal_value *src1,
4356 const literal_value *src2,
4357 bfd_boolean final_static_link)
e0001a05 4358{
43cd72b9 4359 struct elf_link_hash_entry *h1, *h2;
e0001a05 4360
43cd72b9
BW
4361 if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
4362 return FALSE;
e0001a05 4363
43cd72b9
BW
4364 if (r_reloc_is_const (&src1->r_rel))
4365 return (src1->value == src2->value);
e0001a05 4366
43cd72b9
BW
4367 if (ELF32_R_TYPE (src1->r_rel.rela.r_info)
4368 != ELF32_R_TYPE (src2->r_rel.rela.r_info))
4369 return FALSE;
e0001a05 4370
43cd72b9
BW
4371 if (src1->r_rel.target_offset != src2->r_rel.target_offset)
4372 return FALSE;
4373
4374 if (src1->r_rel.virtual_offset != src2->r_rel.virtual_offset)
4375 return FALSE;
4376
4377 if (src1->value != src2->value)
4378 return FALSE;
4379
4380 /* Now check for the same section (if defined) or the same elf_hash
4381 (if undefined or weak). */
4382 h1 = r_reloc_get_hash_entry (&src1->r_rel);
4383 h2 = r_reloc_get_hash_entry (&src2->r_rel);
4384 if (r_reloc_is_defined (&src1->r_rel)
4385 && (final_static_link
4386 || ((!h1 || h1->root.type != bfd_link_hash_defweak)
4387 && (!h2 || h2->root.type != bfd_link_hash_defweak))))
4388 {
4389 if (r_reloc_get_section (&src1->r_rel)
4390 != r_reloc_get_section (&src2->r_rel))
4391 return FALSE;
4392 }
4393 else
4394 {
4395 /* Require that the hash entries (i.e., symbols) be identical. */
4396 if (h1 != h2 || h1 == 0)
4397 return FALSE;
4398 }
4399
4400 if (src1->is_abs_literal != src2->is_abs_literal)
4401 return FALSE;
4402
4403 return TRUE;
e0001a05
NC
4404}
4405
e0001a05 4406
43cd72b9
BW
4407/* Must be power of 2. */
4408#define INITIAL_HASH_RELOC_BUCKET_COUNT 1024
e0001a05 4409
43cd72b9 4410static value_map_hash_table *
7fa3d080 4411value_map_hash_table_init (void)
43cd72b9
BW
4412{
4413 value_map_hash_table *values;
e0001a05 4414
43cd72b9
BW
4415 values = (value_map_hash_table *)
4416 bfd_zmalloc (sizeof (value_map_hash_table));
4417 values->bucket_count = INITIAL_HASH_RELOC_BUCKET_COUNT;
4418 values->count = 0;
4419 values->buckets = (value_map **)
4420 bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
4421 if (values->buckets == NULL)
4422 {
4423 free (values);
4424 return NULL;
4425 }
4426 values->has_last_loc = FALSE;
4427
4428 return values;
4429}
4430
4431
4432static void
7fa3d080 4433value_map_hash_table_delete (value_map_hash_table *table)
e0001a05 4434{
43cd72b9
BW
4435 free (table->buckets);
4436 free (table);
4437}
4438
4439
4440static unsigned
7fa3d080 4441hash_bfd_vma (bfd_vma val)
43cd72b9
BW
4442{
4443 return (val >> 2) + (val >> 10);
4444}
4445
4446
4447static unsigned
7fa3d080 4448literal_value_hash (const literal_value *src)
43cd72b9
BW
4449{
4450 unsigned hash_val;
e0001a05 4451
43cd72b9
BW
4452 hash_val = hash_bfd_vma (src->value);
4453 if (!r_reloc_is_const (&src->r_rel))
e0001a05 4454 {
43cd72b9
BW
4455 void *sec_or_hash;
4456
4457 hash_val += hash_bfd_vma (src->is_abs_literal * 1000);
4458 hash_val += hash_bfd_vma (src->r_rel.target_offset);
4459 hash_val += hash_bfd_vma (src->r_rel.virtual_offset);
4460
4461 /* Now check for the same section and the same elf_hash. */
4462 if (r_reloc_is_defined (&src->r_rel))
4463 sec_or_hash = r_reloc_get_section (&src->r_rel);
4464 else
4465 sec_or_hash = r_reloc_get_hash_entry (&src->r_rel);
f60ca5e3 4466 hash_val += hash_bfd_vma ((bfd_vma) (size_t) sec_or_hash);
e0001a05 4467 }
43cd72b9
BW
4468 return hash_val;
4469}
e0001a05 4470
e0001a05 4471
43cd72b9 4472/* Check if the specified literal_value has been seen before. */
e0001a05 4473
43cd72b9 4474static value_map *
7fa3d080
BW
4475value_map_get_cached_value (value_map_hash_table *map,
4476 const literal_value *val,
4477 bfd_boolean final_static_link)
43cd72b9
BW
4478{
4479 value_map *map_e;
4480 value_map *bucket;
4481 unsigned idx;
4482
4483 idx = literal_value_hash (val);
4484 idx = idx & (map->bucket_count - 1);
4485 bucket = map->buckets[idx];
4486 for (map_e = bucket; map_e; map_e = map_e->next)
e0001a05 4487 {
43cd72b9
BW
4488 if (literal_value_equal (&map_e->val, val, final_static_link))
4489 return map_e;
4490 }
4491 return NULL;
4492}
e0001a05 4493
e0001a05 4494
43cd72b9
BW
4495/* Record a new literal value. It is illegal to call this if VALUE
4496 already has an entry here. */
4497
4498static value_map *
7fa3d080
BW
4499add_value_map (value_map_hash_table *map,
4500 const literal_value *val,
4501 const r_reloc *loc,
4502 bfd_boolean final_static_link)
43cd72b9
BW
4503{
4504 value_map **bucket_p;
4505 unsigned idx;
4506
4507 value_map *val_e = (value_map *) bfd_zmalloc (sizeof (value_map));
4508 if (val_e == NULL)
4509 {
4510 bfd_set_error (bfd_error_no_memory);
4511 return NULL;
e0001a05
NC
4512 }
4513
43cd72b9
BW
4514 BFD_ASSERT (!value_map_get_cached_value (map, val, final_static_link));
4515 val_e->val = *val;
4516 val_e->loc = *loc;
4517
4518 idx = literal_value_hash (val);
4519 idx = idx & (map->bucket_count - 1);
4520 bucket_p = &map->buckets[idx];
4521
4522 val_e->next = *bucket_p;
4523 *bucket_p = val_e;
4524 map->count++;
4525 /* FIXME: Consider resizing the hash table if we get too many entries. */
4526
4527 return val_e;
e0001a05
NC
4528}
4529
43cd72b9
BW
4530\f
4531/* Lists of text actions (ta_) for narrowing, widening, longcall
4532 conversion, space fill, code & literal removal, etc. */
4533
4534/* The following text actions are generated:
4535
4536 "ta_remove_insn" remove an instruction or instructions
4537 "ta_remove_longcall" convert longcall to call
4538 "ta_convert_longcall" convert longcall to nop/call
4539 "ta_narrow_insn" narrow a wide instruction
4540 "ta_widen" widen a narrow instruction
4541 "ta_fill" add fill or remove fill
4542 removed < 0 is a fill; branches to the fill address will be
4543 changed to address + fill size (e.g., address - removed)
4544 removed >= 0 branches to the fill address will stay unchanged
4545 "ta_remove_literal" remove a literal; this action is
4546 indicated when a literal is removed
4547 or replaced.
4548 "ta_add_literal" insert a new literal; this action is
4549 indicated when a literal has been moved.
4550 It may use a virtual_offset because
4551 multiple literals can be placed at the
4552 same location.
4553
4554 For each of these text actions, we also record the number of bytes
4555 removed by performing the text action. In the case of a "ta_widen"
4556 or a "ta_fill" that adds space, the removed_bytes will be negative. */
4557
4558typedef struct text_action_struct text_action;
4559typedef struct text_action_list_struct text_action_list;
4560typedef enum text_action_enum_t text_action_t;
4561
4562enum text_action_enum_t
4563{
4564 ta_none,
4565 ta_remove_insn, /* removed = -size */
4566 ta_remove_longcall, /* removed = -size */
4567 ta_convert_longcall, /* removed = 0 */
4568 ta_narrow_insn, /* removed = -1 */
4569 ta_widen_insn, /* removed = +1 */
4570 ta_fill, /* removed = +size */
4571 ta_remove_literal,
4572 ta_add_literal
4573};
e0001a05 4574
e0001a05 4575
43cd72b9
BW
4576/* Structure for a text action record. */
4577struct text_action_struct
e0001a05 4578{
43cd72b9
BW
4579 text_action_t action;
4580 asection *sec; /* Optional */
4581 bfd_vma offset;
4582 bfd_vma virtual_offset; /* Zero except for adding literals. */
4583 int removed_bytes;
4584 literal_value value; /* Only valid when adding literals. */
e0001a05 4585
43cd72b9
BW
4586 text_action *next;
4587};
e0001a05 4588
e0001a05 4589
43cd72b9
BW
4590/* List of all of the actions taken on a text section. */
4591struct text_action_list_struct
4592{
4593 text_action *head;
4594};
e0001a05 4595
e0001a05 4596
7fa3d080
BW
4597static text_action *
4598find_fill_action (text_action_list *l, asection *sec, bfd_vma offset)
43cd72b9
BW
4599{
4600 text_action **m_p;
4601
4602 /* It is not necessary to fill at the end of a section. */
4603 if (sec->size == offset)
4604 return NULL;
4605
7fa3d080 4606 for (m_p = &l->head; *m_p && (*m_p)->offset <= offset; m_p = &(*m_p)->next)
43cd72b9
BW
4607 {
4608 text_action *t = *m_p;
4609 /* When the action is another fill at the same address,
4610 just increase the size. */
4611 if (t->offset == offset && t->action == ta_fill)
4612 return t;
4613 }
4614 return NULL;
4615}
4616
4617
4618static int
7fa3d080
BW
4619compute_removed_action_diff (const text_action *ta,
4620 asection *sec,
4621 bfd_vma offset,
4622 int removed,
4623 int removable_space)
43cd72b9
BW
4624{
4625 int new_removed;
4626 int current_removed = 0;
4627
7fa3d080 4628 if (ta)
43cd72b9
BW
4629 current_removed = ta->removed_bytes;
4630
4631 BFD_ASSERT (ta == NULL || ta->offset == offset);
4632 BFD_ASSERT (ta == NULL || ta->action == ta_fill);
4633
4634 /* It is not necessary to fill at the end of a section. Clean this up. */
4635 if (sec->size == offset)
4636 new_removed = removable_space - 0;
4637 else
4638 {
4639 int space;
4640 int added = -removed - current_removed;
4641 /* Ignore multiples of the section alignment. */
4642 added = ((1 << sec->alignment_power) - 1) & added;
4643 new_removed = (-added);
4644
4645 /* Modify for removable. */
4646 space = removable_space - new_removed;
4647 new_removed = (removable_space
4648 - (((1 << sec->alignment_power) - 1) & space));
4649 }
4650 return (new_removed - current_removed);
4651}
4652
4653
7fa3d080
BW
4654static void
4655adjust_fill_action (text_action *ta, int fill_diff)
43cd72b9
BW
4656{
4657 ta->removed_bytes += fill_diff;
4658}
4659
4660
4661/* Add a modification action to the text. For the case of adding or
4662 removing space, modify any current fill and assume that
4663 "unreachable_space" bytes can be freely contracted. Note that a
4664 negative removed value is a fill. */
4665
4666static void
7fa3d080
BW
4667text_action_add (text_action_list *l,
4668 text_action_t action,
4669 asection *sec,
4670 bfd_vma offset,
4671 int removed)
43cd72b9
BW
4672{
4673 text_action **m_p;
4674 text_action *ta;
4675
4676 /* It is not necessary to fill at the end of a section. */
4677 if (action == ta_fill && sec->size == offset)
4678 return;
4679
4680 /* It is not necessary to fill 0 bytes. */
4681 if (action == ta_fill && removed == 0)
4682 return;
4683
7fa3d080 4684 for (m_p = &l->head; *m_p && (*m_p)->offset <= offset; m_p = &(*m_p)->next)
43cd72b9
BW
4685 {
4686 text_action *t = *m_p;
4687 /* When the action is another fill at the same address,
4688 just increase the size. */
4689 if (t->offset == offset && t->action == ta_fill && action == ta_fill)
4690 {
4691 t->removed_bytes += removed;
4692 return;
4693 }
4694 }
4695
4696 /* Create a new record and fill it up. */
4697 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
4698 ta->action = action;
4699 ta->sec = sec;
4700 ta->offset = offset;
4701 ta->removed_bytes = removed;
4702 ta->next = (*m_p);
4703 *m_p = ta;
4704}
4705
4706
4707static void
7fa3d080
BW
4708text_action_add_literal (text_action_list *l,
4709 text_action_t action,
4710 const r_reloc *loc,
4711 const literal_value *value,
4712 int removed)
43cd72b9
BW
4713{
4714 text_action **m_p;
4715 text_action *ta;
4716 asection *sec = r_reloc_get_section (loc);
4717 bfd_vma offset = loc->target_offset;
4718 bfd_vma virtual_offset = loc->virtual_offset;
4719
4720 BFD_ASSERT (action == ta_add_literal);
4721
4722 for (m_p = &l->head; *m_p != NULL; m_p = &(*m_p)->next)
4723 {
4724 if ((*m_p)->offset > offset
4725 && ((*m_p)->offset != offset
4726 || (*m_p)->virtual_offset > virtual_offset))
4727 break;
4728 }
4729
4730 /* Create a new record and fill it up. */
4731 ta = (text_action *) bfd_zmalloc (sizeof (text_action));
4732 ta->action = action;
4733 ta->sec = sec;
4734 ta->offset = offset;
4735 ta->virtual_offset = virtual_offset;
4736 ta->value = *value;
4737 ta->removed_bytes = removed;
4738 ta->next = (*m_p);
4739 *m_p = ta;
4740}
4741
4742
7fa3d080
BW
4743static bfd_vma
4744offset_with_removed_text (text_action_list *action_list, bfd_vma offset)
43cd72b9
BW
4745{
4746 text_action *r;
4747 int removed = 0;
4748
4749 for (r = action_list->head; r && r->offset <= offset; r = r->next)
4750 {
4751 if (r->offset < offset
4752 || (r->action == ta_fill && r->removed_bytes < 0))
4753 removed += r->removed_bytes;
4754 }
4755
4756 return (offset - removed);
4757}
4758
4759
03e94c08
BW
4760static unsigned
4761action_list_count (text_action_list *action_list)
4762{
4763 text_action *r = action_list->head;
4764 unsigned count = 0;
4765 for (r = action_list->head; r != NULL; r = r->next)
4766 {
4767 count++;
4768 }
4769 return count;
4770}
4771
4772
7fa3d080
BW
4773static bfd_vma
4774offset_with_removed_text_before_fill (text_action_list *action_list,
4775 bfd_vma offset)
43cd72b9
BW
4776{
4777 text_action *r;
4778 int removed = 0;
4779
4780 for (r = action_list->head; r && r->offset < offset; r = r->next)
4781 removed += r->removed_bytes;
4782
4783 return (offset - removed);
4784}
4785
4786
4787/* The find_insn_action routine will only find non-fill actions. */
4788
7fa3d080
BW
4789static text_action *
4790find_insn_action (text_action_list *action_list, bfd_vma offset)
43cd72b9
BW
4791{
4792 text_action *t;
4793 for (t = action_list->head; t; t = t->next)
4794 {
4795 if (t->offset == offset)
4796 {
4797 switch (t->action)
4798 {
4799 case ta_none:
4800 case ta_fill:
4801 break;
4802 case ta_remove_insn:
4803 case ta_remove_longcall:
4804 case ta_convert_longcall:
4805 case ta_narrow_insn:
4806 case ta_widen_insn:
4807 return t;
4808 case ta_remove_literal:
4809 case ta_add_literal:
4810 BFD_ASSERT (0);
4811 break;
4812 }
4813 }
4814 }
4815 return NULL;
4816}
4817
4818
4819#if DEBUG
4820
4821static void
7fa3d080 4822print_action_list (FILE *fp, text_action_list *action_list)
43cd72b9
BW
4823{
4824 text_action *r;
4825
4826 fprintf (fp, "Text Action\n");
4827 for (r = action_list->head; r != NULL; r = r->next)
4828 {
4829 const char *t = "unknown";
4830 switch (r->action)
4831 {
4832 case ta_remove_insn:
4833 t = "remove_insn"; break;
4834 case ta_remove_longcall:
4835 t = "remove_longcall"; break;
4836 case ta_convert_longcall:
4837 t = "remove_longcall"; break;
4838 case ta_narrow_insn:
4839 t = "narrow_insn"; break;
4840 case ta_widen_insn:
4841 t = "widen_insn"; break;
4842 case ta_fill:
4843 t = "fill"; break;
4844 case ta_none:
4845 t = "none"; break;
4846 case ta_remove_literal:
4847 t = "remove_literal"; break;
4848 case ta_add_literal:
4849 t = "add_literal"; break;
4850 }
4851
4852 fprintf (fp, "%s: %s[0x%lx] \"%s\" %d\n",
4853 r->sec->owner->filename,
4854 r->sec->name, r->offset, t, r->removed_bytes);
4855 }
4856}
4857
4858#endif /* DEBUG */
4859
4860\f
4861/* Lists of literals being coalesced or removed. */
4862
4863/* In the usual case, the literal identified by "from" is being
4864 coalesced with another literal identified by "to". If the literal is
4865 unused and is being removed altogether, "to.abfd" will be NULL.
4866 The removed_literal entries are kept on a per-section list, sorted
4867 by the "from" offset field. */
4868
4869typedef struct removed_literal_struct removed_literal;
4870typedef struct removed_literal_list_struct removed_literal_list;
4871
4872struct removed_literal_struct
4873{
4874 r_reloc from;
4875 r_reloc to;
4876 removed_literal *next;
4877};
4878
4879struct removed_literal_list_struct
4880{
4881 removed_literal *head;
4882 removed_literal *tail;
4883};
4884
4885
43cd72b9
BW
4886/* Record that the literal at "from" is being removed. If "to" is not
4887 NULL, the "from" literal is being coalesced with the "to" literal. */
4888
4889static void
7fa3d080
BW
4890add_removed_literal (removed_literal_list *removed_list,
4891 const r_reloc *from,
4892 const r_reloc *to)
43cd72b9
BW
4893{
4894 removed_literal *r, *new_r, *next_r;
4895
4896 new_r = (removed_literal *) bfd_zmalloc (sizeof (removed_literal));
4897
4898 new_r->from = *from;
4899 if (to)
4900 new_r->to = *to;
4901 else
4902 new_r->to.abfd = NULL;
4903 new_r->next = NULL;
4904
4905 r = removed_list->head;
4906 if (r == NULL)
4907 {
4908 removed_list->head = new_r;
4909 removed_list->tail = new_r;
4910 }
4911 /* Special check for common case of append. */
4912 else if (removed_list->tail->from.target_offset < from->target_offset)
4913 {
4914 removed_list->tail->next = new_r;
4915 removed_list->tail = new_r;
4916 }
4917 else
4918 {
7fa3d080 4919 while (r->from.target_offset < from->target_offset && r->next)
43cd72b9
BW
4920 {
4921 r = r->next;
4922 }
4923 next_r = r->next;
4924 r->next = new_r;
4925 new_r->next = next_r;
4926 if (next_r == NULL)
4927 removed_list->tail = new_r;
4928 }
4929}
4930
4931
4932/* Check if the list of removed literals contains an entry for the
4933 given address. Return the entry if found. */
4934
4935static removed_literal *
7fa3d080 4936find_removed_literal (removed_literal_list *removed_list, bfd_vma addr)
43cd72b9
BW
4937{
4938 removed_literal *r = removed_list->head;
4939 while (r && r->from.target_offset < addr)
4940 r = r->next;
4941 if (r && r->from.target_offset == addr)
4942 return r;
4943 return NULL;
4944}
4945
4946
4947#if DEBUG
4948
4949static void
7fa3d080 4950print_removed_literals (FILE *fp, removed_literal_list *removed_list)
43cd72b9
BW
4951{
4952 removed_literal *r;
4953 r = removed_list->head;
4954 if (r)
4955 fprintf (fp, "Removed Literals\n");
4956 for (; r != NULL; r = r->next)
4957 {
4958 print_r_reloc (fp, &r->from);
4959 fprintf (fp, " => ");
4960 if (r->to.abfd == NULL)
4961 fprintf (fp, "REMOVED");
4962 else
4963 print_r_reloc (fp, &r->to);
4964 fprintf (fp, "\n");
4965 }
4966}
4967
4968#endif /* DEBUG */
4969
4970\f
4971/* Per-section data for relaxation. */
4972
4973typedef struct reloc_bfd_fix_struct reloc_bfd_fix;
4974
4975struct xtensa_relax_info_struct
4976{
4977 bfd_boolean is_relaxable_literal_section;
4978 bfd_boolean is_relaxable_asm_section;
4979 int visited; /* Number of times visited. */
4980
4981 source_reloc *src_relocs; /* Array[src_count]. */
4982 int src_count;
4983 int src_next; /* Next src_relocs entry to assign. */
4984
4985 removed_literal_list removed_list;
4986 text_action_list action_list;
4987
4988 reloc_bfd_fix *fix_list;
4989 reloc_bfd_fix *fix_array;
4990 unsigned fix_array_count;
4991
4992 /* Support for expanding the reloc array that is stored
4993 in the section structure. If the relocations have been
4994 reallocated, the newly allocated relocations will be referenced
4995 here along with the actual size allocated. The relocation
4996 count will always be found in the section structure. */
4997 Elf_Internal_Rela *allocated_relocs;
4998 unsigned relocs_count;
4999 unsigned allocated_relocs_count;
5000};
5001
5002struct elf_xtensa_section_data
5003{
5004 struct bfd_elf_section_data elf;
5005 xtensa_relax_info relax_info;
5006};
5007
43cd72b9
BW
5008
5009static bfd_boolean
7fa3d080 5010elf_xtensa_new_section_hook (bfd *abfd, asection *sec)
43cd72b9 5011{
f592407e
AM
5012 if (!sec->used_by_bfd)
5013 {
5014 struct elf_xtensa_section_data *sdata;
5015 bfd_size_type amt = sizeof (*sdata);
43cd72b9 5016
f592407e
AM
5017 sdata = bfd_zalloc (abfd, amt);
5018 if (sdata == NULL)
5019 return FALSE;
5020 sec->used_by_bfd = sdata;
5021 }
43cd72b9
BW
5022
5023 return _bfd_elf_new_section_hook (abfd, sec);
5024}
5025
5026
7fa3d080
BW
5027static xtensa_relax_info *
5028get_xtensa_relax_info (asection *sec)
5029{
5030 struct elf_xtensa_section_data *section_data;
5031
5032 /* No info available if no section or if it is an output section. */
5033 if (!sec || sec == sec->output_section)
5034 return NULL;
5035
5036 section_data = (struct elf_xtensa_section_data *) elf_section_data (sec);
5037 return &section_data->relax_info;
5038}
5039
5040
43cd72b9 5041static void
7fa3d080 5042init_xtensa_relax_info (asection *sec)
43cd72b9
BW
5043{
5044 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
5045
5046 relax_info->is_relaxable_literal_section = FALSE;
5047 relax_info->is_relaxable_asm_section = FALSE;
5048 relax_info->visited = 0;
5049
5050 relax_info->src_relocs = NULL;
5051 relax_info->src_count = 0;
5052 relax_info->src_next = 0;
5053
5054 relax_info->removed_list.head = NULL;
5055 relax_info->removed_list.tail = NULL;
5056
5057 relax_info->action_list.head = NULL;
5058
5059 relax_info->fix_list = NULL;
5060 relax_info->fix_array = NULL;
5061 relax_info->fix_array_count = 0;
5062
5063 relax_info->allocated_relocs = NULL;
5064 relax_info->relocs_count = 0;
5065 relax_info->allocated_relocs_count = 0;
5066}
5067
43cd72b9
BW
5068\f
5069/* Coalescing literals may require a relocation to refer to a section in
5070 a different input file, but the standard relocation information
5071 cannot express that. Instead, the reloc_bfd_fix structures are used
5072 to "fix" the relocations that refer to sections in other input files.
5073 These structures are kept on per-section lists. The "src_type" field
5074 records the relocation type in case there are multiple relocations on
5075 the same location. FIXME: This is ugly; an alternative might be to
5076 add new symbols with the "owner" field to some other input file. */
5077
5078struct reloc_bfd_fix_struct
5079{
5080 asection *src_sec;
5081 bfd_vma src_offset;
5082 unsigned src_type; /* Relocation type. */
5083
5084 bfd *target_abfd;
5085 asection *target_sec;
5086 bfd_vma target_offset;
5087 bfd_boolean translated;
5088
5089 reloc_bfd_fix *next;
5090};
5091
5092
43cd72b9 5093static reloc_bfd_fix *
7fa3d080
BW
5094reloc_bfd_fix_init (asection *src_sec,
5095 bfd_vma src_offset,
5096 unsigned src_type,
5097 bfd *target_abfd,
5098 asection *target_sec,
5099 bfd_vma target_offset,
5100 bfd_boolean translated)
43cd72b9
BW
5101{
5102 reloc_bfd_fix *fix;
5103
5104 fix = (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix));
5105 fix->src_sec = src_sec;
5106 fix->src_offset = src_offset;
5107 fix->src_type = src_type;
5108 fix->target_abfd = target_abfd;
5109 fix->target_sec = target_sec;
5110 fix->target_offset = target_offset;
5111 fix->translated = translated;
5112
5113 return fix;
5114}
5115
5116
5117static void
7fa3d080 5118add_fix (asection *src_sec, reloc_bfd_fix *fix)
43cd72b9
BW
5119{
5120 xtensa_relax_info *relax_info;
5121
5122 relax_info = get_xtensa_relax_info (src_sec);
5123 fix->next = relax_info->fix_list;
5124 relax_info->fix_list = fix;
5125}
5126
5127
5128static int
7fa3d080 5129fix_compare (const void *ap, const void *bp)
43cd72b9
BW
5130{
5131 const reloc_bfd_fix *a = (const reloc_bfd_fix *) ap;
5132 const reloc_bfd_fix *b = (const reloc_bfd_fix *) bp;
5133
5134 if (a->src_offset != b->src_offset)
5135 return (a->src_offset - b->src_offset);
5136 return (a->src_type - b->src_type);
5137}
5138
5139
5140static void
7fa3d080 5141cache_fix_array (asection *sec)
43cd72b9
BW
5142{
5143 unsigned i, count = 0;
5144 reloc_bfd_fix *r;
5145 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
5146
5147 if (relax_info == NULL)
5148 return;
5149 if (relax_info->fix_list == NULL)
5150 return;
5151
5152 for (r = relax_info->fix_list; r != NULL; r = r->next)
5153 count++;
5154
5155 relax_info->fix_array =
5156 (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix) * count);
5157 relax_info->fix_array_count = count;
5158
5159 r = relax_info->fix_list;
5160 for (i = 0; i < count; i++, r = r->next)
5161 {
5162 relax_info->fix_array[count - 1 - i] = *r;
5163 relax_info->fix_array[count - 1 - i].next = NULL;
5164 }
5165
5166 qsort (relax_info->fix_array, relax_info->fix_array_count,
5167 sizeof (reloc_bfd_fix), fix_compare);
5168}
5169
5170
5171static reloc_bfd_fix *
7fa3d080 5172get_bfd_fix (asection *sec, bfd_vma offset, unsigned type)
43cd72b9
BW
5173{
5174 xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
5175 reloc_bfd_fix *rv;
5176 reloc_bfd_fix key;
5177
5178 if (relax_info == NULL)
5179 return NULL;
5180 if (relax_info->fix_list == NULL)
5181 return NULL;
5182
5183 if (relax_info->fix_array == NULL)
5184 cache_fix_array (sec);
5185
5186 key.src_offset = offset;
5187 key.src_type = type;
5188 rv = bsearch (&key, relax_info->fix_array, relax_info->fix_array_count,
5189 sizeof (reloc_bfd_fix), fix_compare);
5190 return rv;
5191}
5192
5193\f
5194/* Section caching. */
5195
5196typedef struct section_cache_struct section_cache_t;
5197
5198struct section_cache_struct
5199{
5200 asection *sec;
5201
5202 bfd_byte *contents; /* Cache of the section contents. */
5203 bfd_size_type content_length;
5204
5205 property_table_entry *ptbl; /* Cache of the section property table. */
5206 unsigned pte_count;
5207
5208 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
5209 unsigned reloc_count;
5210};
5211
5212
7fa3d080
BW
5213static void
5214init_section_cache (section_cache_t *sec_cache)
5215{
5216 memset (sec_cache, 0, sizeof (*sec_cache));
5217}
43cd72b9
BW
5218
5219
5220static void
7fa3d080 5221clear_section_cache (section_cache_t *sec_cache)
43cd72b9 5222{
7fa3d080
BW
5223 if (sec_cache->sec)
5224 {
5225 release_contents (sec_cache->sec, sec_cache->contents);
5226 release_internal_relocs (sec_cache->sec, sec_cache->relocs);
5227 if (sec_cache->ptbl)
5228 free (sec_cache->ptbl);
5229 memset (sec_cache, 0, sizeof (sec_cache));
5230 }
43cd72b9
BW
5231}
5232
5233
5234static bfd_boolean
7fa3d080
BW
5235section_cache_section (section_cache_t *sec_cache,
5236 asection *sec,
5237 struct bfd_link_info *link_info)
43cd72b9
BW
5238{
5239 bfd *abfd;
5240 property_table_entry *prop_table = NULL;
5241 int ptblsize = 0;
5242 bfd_byte *contents = NULL;
5243 Elf_Internal_Rela *internal_relocs = NULL;
5244 bfd_size_type sec_size;
5245
5246 if (sec == NULL)
5247 return FALSE;
5248 if (sec == sec_cache->sec)
5249 return TRUE;
5250
5251 abfd = sec->owner;
5252 sec_size = bfd_get_section_limit (abfd, sec);
5253
5254 /* Get the contents. */
5255 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
5256 if (contents == NULL && sec_size != 0)
5257 goto err;
5258
5259 /* Get the relocations. */
5260 internal_relocs = retrieve_internal_relocs (abfd, sec,
5261 link_info->keep_memory);
5262
5263 /* Get the entry table. */
5264 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
5265 XTENSA_PROP_SEC_NAME, FALSE);
5266 if (ptblsize < 0)
5267 goto err;
5268
5269 /* Fill in the new section cache. */
5270 clear_section_cache (sec_cache);
5271 memset (sec_cache, 0, sizeof (sec_cache));
5272
5273 sec_cache->sec = sec;
5274 sec_cache->contents = contents;
5275 sec_cache->content_length = sec_size;
5276 sec_cache->relocs = internal_relocs;
5277 sec_cache->reloc_count = sec->reloc_count;
5278 sec_cache->pte_count = ptblsize;
5279 sec_cache->ptbl = prop_table;
5280
5281 return TRUE;
5282
5283 err:
5284 release_contents (sec, contents);
5285 release_internal_relocs (sec, internal_relocs);
5286 if (prop_table)
5287 free (prop_table);
5288 return FALSE;
5289}
5290
43cd72b9
BW
5291\f
5292/* Extended basic blocks. */
5293
5294/* An ebb_struct represents an Extended Basic Block. Within this
5295 range, we guarantee that all instructions are decodable, the
5296 property table entries are contiguous, and no property table
5297 specifies a segment that cannot have instructions moved. This
5298 structure contains caches of the contents, property table and
5299 relocations for the specified section for easy use. The range is
5300 specified by ranges of indices for the byte offset, property table
5301 offsets and relocation offsets. These must be consistent. */
5302
5303typedef struct ebb_struct ebb_t;
5304
5305struct ebb_struct
5306{
5307 asection *sec;
5308
5309 bfd_byte *contents; /* Cache of the section contents. */
5310 bfd_size_type content_length;
5311
5312 property_table_entry *ptbl; /* Cache of the section property table. */
5313 unsigned pte_count;
5314
5315 Elf_Internal_Rela *relocs; /* Cache of the section relocations. */
5316 unsigned reloc_count;
5317
5318 bfd_vma start_offset; /* Offset in section. */
5319 unsigned start_ptbl_idx; /* Offset in the property table. */
5320 unsigned start_reloc_idx; /* Offset in the relocations. */
5321
5322 bfd_vma end_offset;
5323 unsigned end_ptbl_idx;
5324 unsigned end_reloc_idx;
5325
5326 bfd_boolean ends_section; /* Is this the last ebb in a section? */
5327
5328 /* The unreachable property table at the end of this set of blocks;
5329 NULL if the end is not an unreachable block. */
5330 property_table_entry *ends_unreachable;
5331};
5332
5333
5334enum ebb_target_enum
5335{
5336 EBB_NO_ALIGN = 0,
5337 EBB_DESIRE_TGT_ALIGN,
5338 EBB_REQUIRE_TGT_ALIGN,
5339 EBB_REQUIRE_LOOP_ALIGN,
5340 EBB_REQUIRE_ALIGN
5341};
5342
5343
5344/* proposed_action_struct is similar to the text_action_struct except
5345 that is represents a potential transformation, not one that will
5346 occur. We build a list of these for an extended basic block
5347 and use them to compute the actual actions desired. We must be
5348 careful that the entire set of actual actions we perform do not
5349 break any relocations that would fit if the actions were not
5350 performed. */
5351
5352typedef struct proposed_action_struct proposed_action;
5353
5354struct proposed_action_struct
5355{
5356 enum ebb_target_enum align_type; /* for the target alignment */
5357 bfd_vma alignment_pow;
5358 text_action_t action;
5359 bfd_vma offset;
5360 int removed_bytes;
5361 bfd_boolean do_action; /* If false, then we will not perform the action. */
5362};
5363
5364
5365/* The ebb_constraint_struct keeps a set of proposed actions for an
5366 extended basic block. */
5367
5368typedef struct ebb_constraint_struct ebb_constraint;
5369
5370struct ebb_constraint_struct
5371{
5372 ebb_t ebb;
5373 bfd_boolean start_movable;
5374
5375 /* Bytes of extra space at the beginning if movable. */
5376 int start_extra_space;
5377
5378 enum ebb_target_enum start_align;
5379
5380 bfd_boolean end_movable;
5381
5382 /* Bytes of extra space at the end if movable. */
5383 int end_extra_space;
5384
5385 unsigned action_count;
5386 unsigned action_allocated;
5387
5388 /* Array of proposed actions. */
5389 proposed_action *actions;
5390
5391 /* Action alignments -- one for each proposed action. */
5392 enum ebb_target_enum *action_aligns;
5393};
5394
5395
43cd72b9 5396static void
7fa3d080 5397init_ebb_constraint (ebb_constraint *c)
43cd72b9
BW
5398{
5399 memset (c, 0, sizeof (ebb_constraint));
5400}
5401
5402
5403static void
7fa3d080 5404free_ebb_constraint (ebb_constraint *c)
43cd72b9 5405{
7fa3d080 5406 if (c->actions)
43cd72b9
BW
5407 free (c->actions);
5408}
5409
5410
5411static void
7fa3d080
BW
5412init_ebb (ebb_t *ebb,
5413 asection *sec,
5414 bfd_byte *contents,
5415 bfd_size_type content_length,
5416 property_table_entry *prop_table,
5417 unsigned ptblsize,
5418 Elf_Internal_Rela *internal_relocs,
5419 unsigned reloc_count)
43cd72b9
BW
5420{
5421 memset (ebb, 0, sizeof (ebb_t));
5422 ebb->sec = sec;
5423 ebb->contents = contents;
5424 ebb->content_length = content_length;
5425 ebb->ptbl = prop_table;
5426 ebb->pte_count = ptblsize;
5427 ebb->relocs = internal_relocs;
5428 ebb->reloc_count = reloc_count;
5429 ebb->start_offset = 0;
5430 ebb->end_offset = ebb->content_length - 1;
5431 ebb->start_ptbl_idx = 0;
5432 ebb->end_ptbl_idx = ptblsize;
5433 ebb->start_reloc_idx = 0;
5434 ebb->end_reloc_idx = reloc_count;
5435}
5436
5437
5438/* Extend the ebb to all decodable contiguous sections. The algorithm
5439 for building a basic block around an instruction is to push it
5440 forward until we hit the end of a section, an unreachable block or
5441 a block that cannot be transformed. Then we push it backwards
5442 searching for similar conditions. */
5443
7fa3d080
BW
5444static bfd_boolean extend_ebb_bounds_forward (ebb_t *);
5445static bfd_boolean extend_ebb_bounds_backward (ebb_t *);
5446static bfd_size_type insn_block_decodable_len
5447 (bfd_byte *, bfd_size_type, bfd_vma, bfd_size_type);
5448
43cd72b9 5449static bfd_boolean
7fa3d080 5450extend_ebb_bounds (ebb_t *ebb)
43cd72b9
BW
5451{
5452 if (!extend_ebb_bounds_forward (ebb))
5453 return FALSE;
5454 if (!extend_ebb_bounds_backward (ebb))
5455 return FALSE;
5456 return TRUE;
5457}
5458
5459
5460static bfd_boolean
7fa3d080 5461extend_ebb_bounds_forward (ebb_t *ebb)
43cd72b9
BW
5462{
5463 property_table_entry *the_entry, *new_entry;
5464
5465 the_entry = &ebb->ptbl[ebb->end_ptbl_idx];
5466
5467 /* Stop when (1) we cannot decode an instruction, (2) we are at
5468 the end of the property tables, (3) we hit a non-contiguous property
5469 table entry, (4) we hit a NO_TRANSFORM region. */
5470
5471 while (1)
5472 {
5473 bfd_vma entry_end;
5474 bfd_size_type insn_block_len;
5475
5476 entry_end = the_entry->address - ebb->sec->vma + the_entry->size;
5477 insn_block_len =
5478 insn_block_decodable_len (ebb->contents, ebb->content_length,
5479 ebb->end_offset,
5480 entry_end - ebb->end_offset);
5481 if (insn_block_len != (entry_end - ebb->end_offset))
5482 {
5483 (*_bfd_error_handler)
5484 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
5485 ebb->sec->owner, ebb->sec, ebb->end_offset + insn_block_len);
5486 return FALSE;
5487 }
5488 ebb->end_offset += insn_block_len;
5489
5490 if (ebb->end_offset == ebb->sec->size)
5491 ebb->ends_section = TRUE;
5492
5493 /* Update the reloc counter. */
5494 while (ebb->end_reloc_idx + 1 < ebb->reloc_count
5495 && (ebb->relocs[ebb->end_reloc_idx + 1].r_offset
5496 < ebb->end_offset))
5497 {
5498 ebb->end_reloc_idx++;
5499 }
5500
5501 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
5502 return TRUE;
5503
5504 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
5505 if (((new_entry->flags & XTENSA_PROP_INSN) == 0)
5506 || ((new_entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) != 0)
5507 || ((the_entry->flags & XTENSA_PROP_ALIGN) != 0))
5508 break;
5509
5510 if (the_entry->address + the_entry->size != new_entry->address)
5511 break;
5512
5513 the_entry = new_entry;
5514 ebb->end_ptbl_idx++;
5515 }
5516
5517 /* Quick check for an unreachable or end of file just at the end. */
5518 if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
5519 {
5520 if (ebb->end_offset == ebb->content_length)
5521 ebb->ends_section = TRUE;
5522 }
5523 else
5524 {
5525 new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
5526 if ((new_entry->flags & XTENSA_PROP_UNREACHABLE) != 0
5527 && the_entry->address + the_entry->size == new_entry->address)
5528 ebb->ends_unreachable = new_entry;
5529 }
5530
5531 /* Any other ending requires exact alignment. */
5532 return TRUE;
5533}
5534
5535
5536static bfd_boolean
7fa3d080 5537extend_ebb_bounds_backward (ebb_t *ebb)
43cd72b9
BW
5538{
5539 property_table_entry *the_entry, *new_entry;
5540
5541 the_entry = &ebb->ptbl[ebb->start_ptbl_idx];
5542
5543 /* Stop when (1) we cannot decode the instructions in the current entry.
5544 (2) we are at the beginning of the property tables, (3) we hit a
5545 non-contiguous property table entry, (4) we hit a NO_TRANSFORM region. */
5546
5547 while (1)
5548 {
5549 bfd_vma block_begin;
5550 bfd_size_type insn_block_len;
5551
5552 block_begin = the_entry->address - ebb->sec->vma;
5553 insn_block_len =
5554 insn_block_decodable_len (ebb->contents, ebb->content_length,
5555 block_begin,
5556 ebb->start_offset - block_begin);
5557 if (insn_block_len != ebb->start_offset - block_begin)
5558 {
5559 (*_bfd_error_handler)
5560 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
5561 ebb->sec->owner, ebb->sec, ebb->end_offset + insn_block_len);
5562 return FALSE;
5563 }
5564 ebb->start_offset -= insn_block_len;
5565
5566 /* Update the reloc counter. */
5567 while (ebb->start_reloc_idx > 0
5568 && (ebb->relocs[ebb->start_reloc_idx - 1].r_offset
5569 >= ebb->start_offset))
5570 {
5571 ebb->start_reloc_idx--;
5572 }
5573
5574 if (ebb->start_ptbl_idx == 0)
5575 return TRUE;
5576
5577 new_entry = &ebb->ptbl[ebb->start_ptbl_idx - 1];
5578 if ((new_entry->flags & XTENSA_PROP_INSN) == 0
5579 || ((new_entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) != 0)
5580 || ((new_entry->flags & XTENSA_PROP_ALIGN) != 0))
5581 return TRUE;
5582 if (new_entry->address + new_entry->size != the_entry->address)
5583 return TRUE;
5584
5585 the_entry = new_entry;
5586 ebb->start_ptbl_idx--;
5587 }
5588 return TRUE;
5589}
5590
5591
5592static bfd_size_type
7fa3d080
BW
5593insn_block_decodable_len (bfd_byte *contents,
5594 bfd_size_type content_len,
5595 bfd_vma block_offset,
5596 bfd_size_type block_len)
43cd72b9
BW
5597{
5598 bfd_vma offset = block_offset;
5599
5600 while (offset < block_offset + block_len)
5601 {
5602 bfd_size_type insn_len = 0;
5603
5604 insn_len = insn_decode_len (contents, content_len, offset);
5605 if (insn_len == 0)
5606 return (offset - block_offset);
5607 offset += insn_len;
5608 }
5609 return (offset - block_offset);
5610}
5611
5612
5613static void
7fa3d080 5614ebb_propose_action (ebb_constraint *c,
7fa3d080 5615 enum ebb_target_enum align_type,
288f74fa 5616 bfd_vma alignment_pow,
7fa3d080
BW
5617 text_action_t action,
5618 bfd_vma offset,
5619 int removed_bytes,
5620 bfd_boolean do_action)
43cd72b9 5621{
b08b5071 5622 proposed_action *act;
43cd72b9 5623
43cd72b9
BW
5624 if (c->action_allocated <= c->action_count)
5625 {
b08b5071 5626 unsigned new_allocated, i;
823fc61f 5627 proposed_action *new_actions;
b08b5071
BW
5628
5629 new_allocated = (c->action_count + 2) * 2;
823fc61f 5630 new_actions = (proposed_action *)
43cd72b9
BW
5631 bfd_zmalloc (sizeof (proposed_action) * new_allocated);
5632
5633 for (i = 0; i < c->action_count; i++)
5634 new_actions[i] = c->actions[i];
7fa3d080 5635 if (c->actions)
43cd72b9
BW
5636 free (c->actions);
5637 c->actions = new_actions;
5638 c->action_allocated = new_allocated;
5639 }
b08b5071
BW
5640
5641 act = &c->actions[c->action_count];
5642 act->align_type = align_type;
5643 act->alignment_pow = alignment_pow;
5644 act->action = action;
5645 act->offset = offset;
5646 act->removed_bytes = removed_bytes;
5647 act->do_action = do_action;
5648
43cd72b9
BW
5649 c->action_count++;
5650}
5651
5652\f
5653/* Access to internal relocations, section contents and symbols. */
5654
5655/* During relaxation, we need to modify relocations, section contents,
5656 and symbol definitions, and we need to keep the original values from
5657 being reloaded from the input files, i.e., we need to "pin" the
5658 modified values in memory. We also want to continue to observe the
5659 setting of the "keep-memory" flag. The following functions wrap the
5660 standard BFD functions to take care of this for us. */
5661
5662static Elf_Internal_Rela *
7fa3d080 5663retrieve_internal_relocs (bfd *abfd, asection *sec, bfd_boolean keep_memory)
43cd72b9
BW
5664{
5665 Elf_Internal_Rela *internal_relocs;
5666
5667 if ((sec->flags & SEC_LINKER_CREATED) != 0)
5668 return NULL;
5669
5670 internal_relocs = elf_section_data (sec)->relocs;
5671 if (internal_relocs == NULL)
5672 internal_relocs = (_bfd_elf_link_read_relocs
7fa3d080 5673 (abfd, sec, NULL, NULL, keep_memory));
43cd72b9
BW
5674 return internal_relocs;
5675}
5676
5677
5678static void
7fa3d080 5679pin_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
43cd72b9
BW
5680{
5681 elf_section_data (sec)->relocs = internal_relocs;
5682}
5683
5684
5685static void
7fa3d080 5686release_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
43cd72b9
BW
5687{
5688 if (internal_relocs
5689 && elf_section_data (sec)->relocs != internal_relocs)
5690 free (internal_relocs);
5691}
5692
5693
5694static bfd_byte *
7fa3d080 5695retrieve_contents (bfd *abfd, asection *sec, bfd_boolean keep_memory)
43cd72b9
BW
5696{
5697 bfd_byte *contents;
5698 bfd_size_type sec_size;
5699
5700 sec_size = bfd_get_section_limit (abfd, sec);
5701 contents = elf_section_data (sec)->this_hdr.contents;
5702
5703 if (contents == NULL && sec_size != 0)
5704 {
5705 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
5706 {
7fa3d080 5707 if (contents)
43cd72b9
BW
5708 free (contents);
5709 return NULL;
5710 }
5711 if (keep_memory)
5712 elf_section_data (sec)->this_hdr.contents = contents;
5713 }
5714 return contents;
5715}
5716
5717
5718static void
7fa3d080 5719pin_contents (asection *sec, bfd_byte *contents)
43cd72b9
BW
5720{
5721 elf_section_data (sec)->this_hdr.contents = contents;
5722}
5723
5724
5725static void
7fa3d080 5726release_contents (asection *sec, bfd_byte *contents)
43cd72b9
BW
5727{
5728 if (contents && elf_section_data (sec)->this_hdr.contents != contents)
5729 free (contents);
5730}
5731
5732
5733static Elf_Internal_Sym *
7fa3d080 5734retrieve_local_syms (bfd *input_bfd)
43cd72b9
BW
5735{
5736 Elf_Internal_Shdr *symtab_hdr;
5737 Elf_Internal_Sym *isymbuf;
5738 size_t locsymcount;
5739
5740 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5741 locsymcount = symtab_hdr->sh_info;
5742
5743 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5744 if (isymbuf == NULL && locsymcount != 0)
5745 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
5746 NULL, NULL, NULL);
5747
5748 /* Save the symbols for this input file so they won't be read again. */
5749 if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
5750 symtab_hdr->contents = (unsigned char *) isymbuf;
5751
5752 return isymbuf;
5753}
5754
5755\f
5756/* Code for link-time relaxation. */
5757
5758/* Initialization for relaxation: */
7fa3d080 5759static bfd_boolean analyze_relocations (struct bfd_link_info *);
43cd72b9 5760static bfd_boolean find_relaxable_sections
7fa3d080 5761 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
43cd72b9 5762static bfd_boolean collect_source_relocs
7fa3d080 5763 (bfd *, asection *, struct bfd_link_info *);
43cd72b9 5764static bfd_boolean is_resolvable_asm_expansion
7fa3d080
BW
5765 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, struct bfd_link_info *,
5766 bfd_boolean *);
43cd72b9 5767static Elf_Internal_Rela *find_associated_l32r_irel
7fa3d080 5768 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Rela *);
43cd72b9 5769static bfd_boolean compute_text_actions
7fa3d080
BW
5770 (bfd *, asection *, struct bfd_link_info *);
5771static bfd_boolean compute_ebb_proposed_actions (ebb_constraint *);
5772static bfd_boolean compute_ebb_actions (ebb_constraint *);
43cd72b9 5773static bfd_boolean check_section_ebb_pcrels_fit
cb337148
BW
5774 (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, const ebb_constraint *,
5775 const xtensa_opcode *);
7fa3d080 5776static bfd_boolean check_section_ebb_reduces (const ebb_constraint *);
43cd72b9 5777static void text_action_add_proposed
7fa3d080
BW
5778 (text_action_list *, const ebb_constraint *, asection *);
5779static int compute_fill_extra_space (property_table_entry *);
43cd72b9
BW
5780
5781/* First pass: */
5782static bfd_boolean compute_removed_literals
7fa3d080 5783 (bfd *, asection *, struct bfd_link_info *, value_map_hash_table *);
43cd72b9 5784static Elf_Internal_Rela *get_irel_at_offset
7fa3d080 5785 (asection *, Elf_Internal_Rela *, bfd_vma);
43cd72b9 5786static bfd_boolean is_removable_literal
7fa3d080 5787 (const source_reloc *, int, const source_reloc *, int);
43cd72b9 5788static bfd_boolean remove_dead_literal
7fa3d080
BW
5789 (bfd *, asection *, struct bfd_link_info *, Elf_Internal_Rela *,
5790 Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
5791static bfd_boolean identify_literal_placement
5792 (bfd *, asection *, bfd_byte *, struct bfd_link_info *,
5793 value_map_hash_table *, bfd_boolean *, Elf_Internal_Rela *, int,
5794 source_reloc *, property_table_entry *, int, section_cache_t *,
5795 bfd_boolean);
5796static bfd_boolean relocations_reach (source_reloc *, int, const r_reloc *);
43cd72b9 5797static bfd_boolean coalesce_shared_literal
7fa3d080 5798 (asection *, source_reloc *, property_table_entry *, int, value_map *);
43cd72b9 5799static bfd_boolean move_shared_literal
7fa3d080
BW
5800 (asection *, struct bfd_link_info *, source_reloc *, property_table_entry *,
5801 int, const r_reloc *, const literal_value *, section_cache_t *);
43cd72b9
BW
5802
5803/* Second pass: */
7fa3d080
BW
5804static bfd_boolean relax_section (bfd *, asection *, struct bfd_link_info *);
5805static bfd_boolean translate_section_fixes (asection *);
5806static bfd_boolean translate_reloc_bfd_fix (reloc_bfd_fix *);
5807static void translate_reloc (const r_reloc *, r_reloc *);
43cd72b9 5808static void shrink_dynamic_reloc_sections
7fa3d080 5809 (struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *);
43cd72b9 5810static bfd_boolean move_literal
7fa3d080
BW
5811 (bfd *, struct bfd_link_info *, asection *, bfd_vma, bfd_byte *,
5812 xtensa_relax_info *, Elf_Internal_Rela **, const literal_value *);
43cd72b9 5813static bfd_boolean relax_property_section
7fa3d080 5814 (bfd *, asection *, struct bfd_link_info *);
43cd72b9
BW
5815
5816/* Third pass: */
7fa3d080 5817static bfd_boolean relax_section_symbols (bfd *, asection *);
43cd72b9
BW
5818
5819
5820static bfd_boolean
7fa3d080
BW
5821elf_xtensa_relax_section (bfd *abfd,
5822 asection *sec,
5823 struct bfd_link_info *link_info,
5824 bfd_boolean *again)
43cd72b9
BW
5825{
5826 static value_map_hash_table *values = NULL;
5827 static bfd_boolean relocations_analyzed = FALSE;
5828 xtensa_relax_info *relax_info;
5829
5830 if (!relocations_analyzed)
5831 {
5832 /* Do some overall initialization for relaxation. */
5833 values = value_map_hash_table_init ();
5834 if (values == NULL)
5835 return FALSE;
5836 relaxing_section = TRUE;
5837 if (!analyze_relocations (link_info))
5838 return FALSE;
5839 relocations_analyzed = TRUE;
5840 }
5841 *again = FALSE;
5842
5843 /* Don't mess with linker-created sections. */
5844 if ((sec->flags & SEC_LINKER_CREATED) != 0)
5845 return TRUE;
5846
5847 relax_info = get_xtensa_relax_info (sec);
5848 BFD_ASSERT (relax_info != NULL);
5849
5850 switch (relax_info->visited)
5851 {
5852 case 0:
5853 /* Note: It would be nice to fold this pass into
5854 analyze_relocations, but it is important for this step that the
5855 sections be examined in link order. */
5856 if (!compute_removed_literals (abfd, sec, link_info, values))
5857 return FALSE;
5858 *again = TRUE;
5859 break;
5860
5861 case 1:
5862 if (values)
5863 value_map_hash_table_delete (values);
5864 values = NULL;
5865 if (!relax_section (abfd, sec, link_info))
5866 return FALSE;
5867 *again = TRUE;
5868 break;
5869
5870 case 2:
5871 if (!relax_section_symbols (abfd, sec))
5872 return FALSE;
5873 break;
5874 }
5875
5876 relax_info->visited++;
5877 return TRUE;
5878}
5879
5880\f
5881/* Initialization for relaxation. */
5882
5883/* This function is called once at the start of relaxation. It scans
5884 all the input sections and marks the ones that are relaxable (i.e.,
5885 literal sections with L32R relocations against them), and then
5886 collects source_reloc information for all the relocations against
5887 those relaxable sections. During this process, it also detects
5888 longcalls, i.e., calls relaxed by the assembler into indirect
5889 calls, that can be optimized back into direct calls. Within each
5890 extended basic block (ebb) containing an optimized longcall, it
5891 computes a set of "text actions" that can be performed to remove
5892 the L32R associated with the longcall while optionally preserving
5893 branch target alignments. */
5894
5895static bfd_boolean
7fa3d080 5896analyze_relocations (struct bfd_link_info *link_info)
43cd72b9
BW
5897{
5898 bfd *abfd;
5899 asection *sec;
5900 bfd_boolean is_relaxable = FALSE;
5901
5902 /* Initialize the per-section relaxation info. */
5903 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5904 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5905 {
5906 init_xtensa_relax_info (sec);
5907 }
5908
5909 /* Mark relaxable sections (and count relocations against each one). */
5910 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5911 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5912 {
5913 if (!find_relaxable_sections (abfd, sec, link_info, &is_relaxable))
5914 return FALSE;
5915 }
5916
5917 /* Bail out if there are no relaxable sections. */
5918 if (!is_relaxable)
5919 return TRUE;
5920
5921 /* Allocate space for source_relocs. */
5922 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5923 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5924 {
5925 xtensa_relax_info *relax_info;
5926
5927 relax_info = get_xtensa_relax_info (sec);
5928 if (relax_info->is_relaxable_literal_section
5929 || relax_info->is_relaxable_asm_section)
5930 {
5931 relax_info->src_relocs = (source_reloc *)
5932 bfd_malloc (relax_info->src_count * sizeof (source_reloc));
5933 }
5934 }
5935
5936 /* Collect info on relocations against each relaxable section. */
5937 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5938 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5939 {
5940 if (!collect_source_relocs (abfd, sec, link_info))
5941 return FALSE;
5942 }
5943
5944 /* Compute the text actions. */
5945 for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link_next)
5946 for (sec = abfd->sections; sec != NULL; sec = sec->next)
5947 {
5948 if (!compute_text_actions (abfd, sec, link_info))
5949 return FALSE;
5950 }
5951
5952 return TRUE;
5953}
5954
5955
5956/* Find all the sections that might be relaxed. The motivation for
5957 this pass is that collect_source_relocs() needs to record _all_ the
5958 relocations that target each relaxable section. That is expensive
5959 and unnecessary unless the target section is actually going to be
5960 relaxed. This pass identifies all such sections by checking if
5961 they have L32Rs pointing to them. In the process, the total number
5962 of relocations targeting each section is also counted so that we
5963 know how much space to allocate for source_relocs against each
5964 relaxable literal section. */
5965
5966static bfd_boolean
7fa3d080
BW
5967find_relaxable_sections (bfd *abfd,
5968 asection *sec,
5969 struct bfd_link_info *link_info,
5970 bfd_boolean *is_relaxable_p)
43cd72b9
BW
5971{
5972 Elf_Internal_Rela *internal_relocs;
5973 bfd_byte *contents;
5974 bfd_boolean ok = TRUE;
5975 unsigned i;
5976 xtensa_relax_info *source_relax_info;
5977
5978 internal_relocs = retrieve_internal_relocs (abfd, sec,
5979 link_info->keep_memory);
5980 if (internal_relocs == NULL)
5981 return ok;
5982
5983 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
5984 if (contents == NULL && sec->size != 0)
5985 {
5986 ok = FALSE;
5987 goto error_return;
5988 }
5989
5990 source_relax_info = get_xtensa_relax_info (sec);
5991 for (i = 0; i < sec->reloc_count; i++)
5992 {
5993 Elf_Internal_Rela *irel = &internal_relocs[i];
5994 r_reloc r_rel;
5995 asection *target_sec;
5996 xtensa_relax_info *target_relax_info;
5997
5998 /* If this section has not already been marked as "relaxable", and
5999 if it contains any ASM_EXPAND relocations (marking expanded
6000 longcalls) that can be optimized into direct calls, then mark
6001 the section as "relaxable". */
6002 if (source_relax_info
6003 && !source_relax_info->is_relaxable_asm_section
6004 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_EXPAND)
6005 {
6006 bfd_boolean is_reachable = FALSE;
6007 if (is_resolvable_asm_expansion (abfd, sec, contents, irel,
6008 link_info, &is_reachable)
6009 && is_reachable)
6010 {
6011 source_relax_info->is_relaxable_asm_section = TRUE;
6012 *is_relaxable_p = TRUE;
6013 }
6014 }
6015
6016 r_reloc_init (&r_rel, abfd, irel, contents,
6017 bfd_get_section_limit (abfd, sec));
6018
6019 target_sec = r_reloc_get_section (&r_rel);
6020 target_relax_info = get_xtensa_relax_info (target_sec);
6021 if (!target_relax_info)
6022 continue;
6023
6024 /* Count PC-relative operand relocations against the target section.
6025 Note: The conditions tested here must match the conditions under
6026 which init_source_reloc is called in collect_source_relocs(). */
6027 if (is_operand_relocation (ELF32_R_TYPE (irel->r_info))
6028 && (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
6029 || is_l32r_relocation (abfd, sec, contents, irel)))
6030 target_relax_info->src_count++;
6031
6032 if (is_l32r_relocation (abfd, sec, contents, irel)
6033 && r_reloc_is_defined (&r_rel))
6034 {
6035 /* Mark the target section as relaxable. */
6036 target_relax_info->is_relaxable_literal_section = TRUE;
6037 *is_relaxable_p = TRUE;
6038 }
6039 }
6040
6041 error_return:
6042 release_contents (sec, contents);
6043 release_internal_relocs (sec, internal_relocs);
6044 return ok;
6045}
6046
6047
6048/* Record _all_ the relocations that point to relaxable sections, and
6049 get rid of ASM_EXPAND relocs by either converting them to
6050 ASM_SIMPLIFY or by removing them. */
6051
6052static bfd_boolean
7fa3d080
BW
6053collect_source_relocs (bfd *abfd,
6054 asection *sec,
6055 struct bfd_link_info *link_info)
43cd72b9
BW
6056{
6057 Elf_Internal_Rela *internal_relocs;
6058 bfd_byte *contents;
6059 bfd_boolean ok = TRUE;
6060 unsigned i;
6061 bfd_size_type sec_size;
6062
6063 internal_relocs = retrieve_internal_relocs (abfd, sec,
6064 link_info->keep_memory);
6065 if (internal_relocs == NULL)
6066 return ok;
6067
6068 sec_size = bfd_get_section_limit (abfd, sec);
6069 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6070 if (contents == NULL && sec_size != 0)
6071 {
6072 ok = FALSE;
6073 goto error_return;
6074 }
6075
6076 /* Record relocations against relaxable literal sections. */
6077 for (i = 0; i < sec->reloc_count; i++)
6078 {
6079 Elf_Internal_Rela *irel = &internal_relocs[i];
6080 r_reloc r_rel;
6081 asection *target_sec;
6082 xtensa_relax_info *target_relax_info;
6083
6084 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
6085
6086 target_sec = r_reloc_get_section (&r_rel);
6087 target_relax_info = get_xtensa_relax_info (target_sec);
6088
6089 if (target_relax_info
6090 && (target_relax_info->is_relaxable_literal_section
6091 || target_relax_info->is_relaxable_asm_section))
6092 {
6093 xtensa_opcode opcode = XTENSA_UNDEFINED;
6094 int opnd = -1;
6095 bfd_boolean is_abs_literal = FALSE;
6096
6097 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
6098 {
6099 /* None of the current alternate relocs are PC-relative,
6100 and only PC-relative relocs matter here. However, we
6101 still need to record the opcode for literal
6102 coalescing. */
6103 opcode = get_relocation_opcode (abfd, sec, contents, irel);
6104 if (opcode == get_l32r_opcode ())
6105 {
6106 is_abs_literal = TRUE;
6107 opnd = 1;
6108 }
6109 else
6110 opcode = XTENSA_UNDEFINED;
6111 }
6112 else if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
6113 {
6114 opcode = get_relocation_opcode (abfd, sec, contents, irel);
6115 opnd = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
6116 }
6117
6118 if (opcode != XTENSA_UNDEFINED)
6119 {
6120 int src_next = target_relax_info->src_next++;
6121 source_reloc *s_reloc = &target_relax_info->src_relocs[src_next];
6122
6123 init_source_reloc (s_reloc, sec, &r_rel, opcode, opnd,
6124 is_abs_literal);
6125 }
6126 }
6127 }
6128
6129 /* Now get rid of ASM_EXPAND relocations. At this point, the
6130 src_relocs array for the target literal section may still be
6131 incomplete, but it must at least contain the entries for the L32R
6132 relocations associated with ASM_EXPANDs because they were just
6133 added in the preceding loop over the relocations. */
6134
6135 for (i = 0; i < sec->reloc_count; i++)
6136 {
6137 Elf_Internal_Rela *irel = &internal_relocs[i];
6138 bfd_boolean is_reachable;
6139
6140 if (!is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
6141 &is_reachable))
6142 continue;
6143
6144 if (is_reachable)
6145 {
6146 Elf_Internal_Rela *l32r_irel;
6147 r_reloc r_rel;
6148 asection *target_sec;
6149 xtensa_relax_info *target_relax_info;
6150
6151 /* Mark the source_reloc for the L32R so that it will be
6152 removed in compute_removed_literals(), along with the
6153 associated literal. */
6154 l32r_irel = find_associated_l32r_irel (abfd, sec, contents,
6155 irel, internal_relocs);
6156 if (l32r_irel == NULL)
6157 continue;
6158
6159 r_reloc_init (&r_rel, abfd, l32r_irel, contents, sec_size);
6160
6161 target_sec = r_reloc_get_section (&r_rel);
6162 target_relax_info = get_xtensa_relax_info (target_sec);
6163
6164 if (target_relax_info
6165 && (target_relax_info->is_relaxable_literal_section
6166 || target_relax_info->is_relaxable_asm_section))
6167 {
6168 source_reloc *s_reloc;
6169
6170 /* Search the source_relocs for the entry corresponding to
6171 the l32r_irel. Note: The src_relocs array is not yet
6172 sorted, but it wouldn't matter anyway because we're
6173 searching by source offset instead of target offset. */
6174 s_reloc = find_source_reloc (target_relax_info->src_relocs,
6175 target_relax_info->src_next,
6176 sec, l32r_irel);
6177 BFD_ASSERT (s_reloc);
6178 s_reloc->is_null = TRUE;
6179 }
6180
6181 /* Convert this reloc to ASM_SIMPLIFY. */
6182 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
6183 R_XTENSA_ASM_SIMPLIFY);
6184 l32r_irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
6185
6186 pin_internal_relocs (sec, internal_relocs);
6187 }
6188 else
6189 {
6190 /* It is resolvable but doesn't reach. We resolve now
6191 by eliminating the relocation -- the call will remain
6192 expanded into L32R/CALLX. */
6193 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
6194 pin_internal_relocs (sec, internal_relocs);
6195 }
6196 }
6197
6198 error_return:
6199 release_contents (sec, contents);
6200 release_internal_relocs (sec, internal_relocs);
6201 return ok;
6202}
6203
6204
6205/* Return TRUE if the asm expansion can be resolved. Generally it can
6206 be resolved on a final link or when a partial link locates it in the
6207 same section as the target. Set "is_reachable" flag if the target of
6208 the call is within the range of a direct call, given the current VMA
6209 for this section and the target section. */
6210
6211bfd_boolean
7fa3d080
BW
6212is_resolvable_asm_expansion (bfd *abfd,
6213 asection *sec,
6214 bfd_byte *contents,
6215 Elf_Internal_Rela *irel,
6216 struct bfd_link_info *link_info,
6217 bfd_boolean *is_reachable_p)
43cd72b9
BW
6218{
6219 asection *target_sec;
6220 bfd_vma target_offset;
6221 r_reloc r_rel;
6222 xtensa_opcode opcode, direct_call_opcode;
6223 bfd_vma self_address;
6224 bfd_vma dest_address;
6225 bfd_boolean uses_l32r;
6226 bfd_size_type sec_size;
6227
6228 *is_reachable_p = FALSE;
6229
6230 if (contents == NULL)
6231 return FALSE;
6232
6233 if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
6234 return FALSE;
6235
6236 sec_size = bfd_get_section_limit (abfd, sec);
6237 opcode = get_expanded_call_opcode (contents + irel->r_offset,
6238 sec_size - irel->r_offset, &uses_l32r);
6239 /* Optimization of longcalls that use CONST16 is not yet implemented. */
6240 if (!uses_l32r)
6241 return FALSE;
6242
6243 direct_call_opcode = swap_callx_for_call_opcode (opcode);
6244 if (direct_call_opcode == XTENSA_UNDEFINED)
6245 return FALSE;
6246
6247 /* Check and see that the target resolves. */
6248 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
6249 if (!r_reloc_is_defined (&r_rel))
6250 return FALSE;
6251
6252 target_sec = r_reloc_get_section (&r_rel);
6253 target_offset = r_rel.target_offset;
6254
6255 /* If the target is in a shared library, then it doesn't reach. This
6256 isn't supposed to come up because the compiler should never generate
6257 non-PIC calls on systems that use shared libraries, but the linker
6258 shouldn't crash regardless. */
6259 if (!target_sec->output_section)
6260 return FALSE;
6261
6262 /* For relocatable sections, we can only simplify when the output
6263 section of the target is the same as the output section of the
6264 source. */
6265 if (link_info->relocatable
6266 && (target_sec->output_section != sec->output_section
6267 || is_reloc_sym_weak (abfd, irel)))
6268 return FALSE;
6269
6270 self_address = (sec->output_section->vma
6271 + sec->output_offset + irel->r_offset + 3);
6272 dest_address = (target_sec->output_section->vma
6273 + target_sec->output_offset + target_offset);
6274
6275 *is_reachable_p = pcrel_reloc_fits (direct_call_opcode, 0,
6276 self_address, dest_address);
6277
6278 if ((self_address >> CALL_SEGMENT_BITS) !=
6279 (dest_address >> CALL_SEGMENT_BITS))
6280 return FALSE;
6281
6282 return TRUE;
6283}
6284
6285
6286static Elf_Internal_Rela *
7fa3d080
BW
6287find_associated_l32r_irel (bfd *abfd,
6288 asection *sec,
6289 bfd_byte *contents,
6290 Elf_Internal_Rela *other_irel,
6291 Elf_Internal_Rela *internal_relocs)
43cd72b9
BW
6292{
6293 unsigned i;
e0001a05 6294
43cd72b9
BW
6295 for (i = 0; i < sec->reloc_count; i++)
6296 {
6297 Elf_Internal_Rela *irel = &internal_relocs[i];
e0001a05 6298
43cd72b9
BW
6299 if (irel == other_irel)
6300 continue;
6301 if (irel->r_offset != other_irel->r_offset)
6302 continue;
6303 if (is_l32r_relocation (abfd, sec, contents, irel))
6304 return irel;
6305 }
6306
6307 return NULL;
e0001a05
NC
6308}
6309
6310
cb337148
BW
6311static xtensa_opcode *
6312build_reloc_opcodes (bfd *abfd,
6313 asection *sec,
6314 bfd_byte *contents,
6315 Elf_Internal_Rela *internal_relocs)
6316{
6317 unsigned i;
6318 xtensa_opcode *reloc_opcodes =
6319 (xtensa_opcode *) bfd_malloc (sizeof (xtensa_opcode) * sec->reloc_count);
6320 for (i = 0; i < sec->reloc_count; i++)
6321 {
6322 Elf_Internal_Rela *irel = &internal_relocs[i];
6323 reloc_opcodes[i] = get_relocation_opcode (abfd, sec, contents, irel);
6324 }
6325 return reloc_opcodes;
6326}
6327
6328
43cd72b9
BW
6329/* The compute_text_actions function will build a list of potential
6330 transformation actions for code in the extended basic block of each
6331 longcall that is optimized to a direct call. From this list we
6332 generate a set of actions to actually perform that optimizes for
6333 space and, if not using size_opt, maintains branch target
6334 alignments.
e0001a05 6335
43cd72b9
BW
6336 These actions to be performed are placed on a per-section list.
6337 The actual changes are performed by relax_section() in the second
6338 pass. */
6339
6340bfd_boolean
7fa3d080
BW
6341compute_text_actions (bfd *abfd,
6342 asection *sec,
6343 struct bfd_link_info *link_info)
e0001a05 6344{
cb337148 6345 xtensa_opcode *reloc_opcodes = NULL;
43cd72b9 6346 xtensa_relax_info *relax_info;
e0001a05 6347 bfd_byte *contents;
43cd72b9 6348 Elf_Internal_Rela *internal_relocs;
e0001a05
NC
6349 bfd_boolean ok = TRUE;
6350 unsigned i;
43cd72b9
BW
6351 property_table_entry *prop_table = 0;
6352 int ptblsize = 0;
6353 bfd_size_type sec_size;
6354 static bfd_boolean no_insn_move = FALSE;
6355
6356 if (no_insn_move)
6357 return ok;
6358
6359 /* Do nothing if the section contains no optimized longcalls. */
6360 relax_info = get_xtensa_relax_info (sec);
6361 BFD_ASSERT (relax_info);
6362 if (!relax_info->is_relaxable_asm_section)
6363 return ok;
e0001a05
NC
6364
6365 internal_relocs = retrieve_internal_relocs (abfd, sec,
6366 link_info->keep_memory);
e0001a05 6367
43cd72b9
BW
6368 if (internal_relocs)
6369 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
6370 internal_reloc_compare);
6371
6372 sec_size = bfd_get_section_limit (abfd, sec);
e0001a05 6373 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
43cd72b9 6374 if (contents == NULL && sec_size != 0)
e0001a05
NC
6375 {
6376 ok = FALSE;
6377 goto error_return;
6378 }
6379
43cd72b9
BW
6380 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
6381 XTENSA_PROP_SEC_NAME, FALSE);
6382 if (ptblsize < 0)
6383 {
6384 ok = FALSE;
6385 goto error_return;
6386 }
6387
6388 for (i = 0; i < sec->reloc_count; i++)
e0001a05
NC
6389 {
6390 Elf_Internal_Rela *irel = &internal_relocs[i];
43cd72b9
BW
6391 bfd_vma r_offset;
6392 property_table_entry *the_entry;
6393 int ptbl_idx;
6394 ebb_t *ebb;
6395 ebb_constraint ebb_table;
6396 bfd_size_type simplify_size;
6397
6398 if (irel && ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_SIMPLIFY)
6399 continue;
6400 r_offset = irel->r_offset;
e0001a05 6401
43cd72b9
BW
6402 simplify_size = get_asm_simplify_size (contents, sec_size, r_offset);
6403 if (simplify_size == 0)
6404 {
6405 (*_bfd_error_handler)
6406 (_("%B(%A+0x%lx): could not decode instruction for XTENSA_ASM_SIMPLIFY relocation; possible configuration mismatch"),
6407 sec->owner, sec, r_offset);
6408 continue;
6409 }
e0001a05 6410
43cd72b9
BW
6411 /* If the instruction table is not around, then don't do this
6412 relaxation. */
6413 the_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
6414 sec->vma + irel->r_offset);
6415 if (the_entry == NULL || XTENSA_NO_NOP_REMOVAL)
6416 {
6417 text_action_add (&relax_info->action_list,
6418 ta_convert_longcall, sec, r_offset,
6419 0);
6420 continue;
6421 }
6422
6423 /* If the next longcall happens to be at the same address as an
6424 unreachable section of size 0, then skip forward. */
6425 ptbl_idx = the_entry - prop_table;
6426 while ((the_entry->flags & XTENSA_PROP_UNREACHABLE)
6427 && the_entry->size == 0
6428 && ptbl_idx + 1 < ptblsize
6429 && (prop_table[ptbl_idx + 1].address
6430 == prop_table[ptbl_idx].address))
6431 {
6432 ptbl_idx++;
6433 the_entry++;
6434 }
e0001a05 6435
43cd72b9
BW
6436 if (the_entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM)
6437 /* NO_REORDER is OK */
6438 continue;
e0001a05 6439
43cd72b9
BW
6440 init_ebb_constraint (&ebb_table);
6441 ebb = &ebb_table.ebb;
6442 init_ebb (ebb, sec, contents, sec_size, prop_table, ptblsize,
6443 internal_relocs, sec->reloc_count);
6444 ebb->start_offset = r_offset + simplify_size;
6445 ebb->end_offset = r_offset + simplify_size;
6446 ebb->start_ptbl_idx = ptbl_idx;
6447 ebb->end_ptbl_idx = ptbl_idx;
6448 ebb->start_reloc_idx = i;
6449 ebb->end_reloc_idx = i;
6450
cb337148
BW
6451 /* Precompute the opcode for each relocation. */
6452 if (reloc_opcodes == NULL)
6453 reloc_opcodes = build_reloc_opcodes (abfd, sec, contents,
6454 internal_relocs);
6455
43cd72b9
BW
6456 if (!extend_ebb_bounds (ebb)
6457 || !compute_ebb_proposed_actions (&ebb_table)
6458 || !compute_ebb_actions (&ebb_table)
6459 || !check_section_ebb_pcrels_fit (abfd, sec, contents,
cb337148
BW
6460 internal_relocs, &ebb_table,
6461 reloc_opcodes)
43cd72b9 6462 || !check_section_ebb_reduces (&ebb_table))
e0001a05 6463 {
43cd72b9
BW
6464 /* If anything goes wrong or we get unlucky and something does
6465 not fit, with our plan because of expansion between
6466 critical branches, just convert to a NOP. */
6467
6468 text_action_add (&relax_info->action_list,
6469 ta_convert_longcall, sec, r_offset, 0);
6470 i = ebb_table.ebb.end_reloc_idx;
6471 free_ebb_constraint (&ebb_table);
6472 continue;
e0001a05 6473 }
43cd72b9
BW
6474
6475 text_action_add_proposed (&relax_info->action_list, &ebb_table, sec);
6476
6477 /* Update the index so we do not go looking at the relocations
6478 we have already processed. */
6479 i = ebb_table.ebb.end_reloc_idx;
6480 free_ebb_constraint (&ebb_table);
e0001a05
NC
6481 }
6482
43cd72b9 6483#if DEBUG
7fa3d080 6484 if (relax_info->action_list.head)
43cd72b9
BW
6485 print_action_list (stderr, &relax_info->action_list);
6486#endif
6487
6488error_return:
e0001a05
NC
6489 release_contents (sec, contents);
6490 release_internal_relocs (sec, internal_relocs);
43cd72b9
BW
6491 if (prop_table)
6492 free (prop_table);
cb337148
BW
6493 if (reloc_opcodes)
6494 free (reloc_opcodes);
43cd72b9 6495
e0001a05
NC
6496 return ok;
6497}
6498
6499
64b607e6
BW
6500/* Do not widen an instruction if it is preceeded by a
6501 loop opcode. It might cause misalignment. */
6502
6503static bfd_boolean
6504prev_instr_is_a_loop (bfd_byte *contents,
6505 bfd_size_type content_length,
6506 bfd_size_type offset)
6507{
6508 xtensa_opcode prev_opcode;
6509
6510 if (offset < 3)
6511 return FALSE;
6512 prev_opcode = insn_decode_opcode (contents, content_length, offset-3, 0);
6513 return (xtensa_opcode_is_loop (xtensa_default_isa, prev_opcode) == 1);
6514}
6515
6516
43cd72b9 6517/* Find all of the possible actions for an extended basic block. */
e0001a05 6518
43cd72b9 6519bfd_boolean
7fa3d080 6520compute_ebb_proposed_actions (ebb_constraint *ebb_table)
e0001a05 6521{
43cd72b9
BW
6522 const ebb_t *ebb = &ebb_table->ebb;
6523 unsigned rel_idx = ebb->start_reloc_idx;
6524 property_table_entry *entry, *start_entry, *end_entry;
64b607e6
BW
6525 bfd_vma offset = 0;
6526 xtensa_isa isa = xtensa_default_isa;
6527 xtensa_format fmt;
6528 static xtensa_insnbuf insnbuf = NULL;
6529 static xtensa_insnbuf slotbuf = NULL;
6530
6531 if (insnbuf == NULL)
6532 {
6533 insnbuf = xtensa_insnbuf_alloc (isa);
6534 slotbuf = xtensa_insnbuf_alloc (isa);
6535 }
e0001a05 6536
43cd72b9
BW
6537 start_entry = &ebb->ptbl[ebb->start_ptbl_idx];
6538 end_entry = &ebb->ptbl[ebb->end_ptbl_idx];
e0001a05 6539
43cd72b9 6540 for (entry = start_entry; entry <= end_entry; entry++)
e0001a05 6541 {
64b607e6 6542 bfd_vma start_offset, end_offset;
43cd72b9 6543 bfd_size_type insn_len;
e0001a05 6544
43cd72b9
BW
6545 start_offset = entry->address - ebb->sec->vma;
6546 end_offset = entry->address + entry->size - ebb->sec->vma;
e0001a05 6547
43cd72b9
BW
6548 if (entry == start_entry)
6549 start_offset = ebb->start_offset;
6550 if (entry == end_entry)
6551 end_offset = ebb->end_offset;
6552 offset = start_offset;
e0001a05 6553
43cd72b9
BW
6554 if (offset == entry->address - ebb->sec->vma
6555 && (entry->flags & XTENSA_PROP_INSN_BRANCH_TARGET) != 0)
6556 {
6557 enum ebb_target_enum align_type = EBB_DESIRE_TGT_ALIGN;
6558 BFD_ASSERT (offset != end_offset);
6559 if (offset == end_offset)
6560 return FALSE;
e0001a05 6561
43cd72b9
BW
6562 insn_len = insn_decode_len (ebb->contents, ebb->content_length,
6563 offset);
43cd72b9 6564 if (insn_len == 0)
64b607e6
BW
6565 goto decode_error;
6566
43cd72b9
BW
6567 if (check_branch_target_aligned_address (offset, insn_len))
6568 align_type = EBB_REQUIRE_TGT_ALIGN;
6569
6570 ebb_propose_action (ebb_table, align_type, 0,
6571 ta_none, offset, 0, TRUE);
6572 }
6573
6574 while (offset != end_offset)
e0001a05 6575 {
43cd72b9 6576 Elf_Internal_Rela *irel;
e0001a05 6577 xtensa_opcode opcode;
e0001a05 6578
43cd72b9
BW
6579 while (rel_idx < ebb->end_reloc_idx
6580 && (ebb->relocs[rel_idx].r_offset < offset
6581 || (ebb->relocs[rel_idx].r_offset == offset
6582 && (ELF32_R_TYPE (ebb->relocs[rel_idx].r_info)
6583 != R_XTENSA_ASM_SIMPLIFY))))
6584 rel_idx++;
6585
6586 /* Check for longcall. */
6587 irel = &ebb->relocs[rel_idx];
6588 if (irel->r_offset == offset
6589 && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY)
6590 {
6591 bfd_size_type simplify_size;
e0001a05 6592
43cd72b9
BW
6593 simplify_size = get_asm_simplify_size (ebb->contents,
6594 ebb->content_length,
6595 irel->r_offset);
6596 if (simplify_size == 0)
64b607e6 6597 goto decode_error;
43cd72b9
BW
6598
6599 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6600 ta_convert_longcall, offset, 0, TRUE);
6601
6602 offset += simplify_size;
6603 continue;
6604 }
e0001a05 6605
64b607e6
BW
6606 if (offset + MIN_INSN_LENGTH > ebb->content_length)
6607 goto decode_error;
6608 xtensa_insnbuf_from_chars (isa, insnbuf, &ebb->contents[offset],
6609 ebb->content_length - offset);
6610 fmt = xtensa_format_decode (isa, insnbuf);
6611 if (fmt == XTENSA_UNDEFINED)
6612 goto decode_error;
6613 insn_len = xtensa_format_length (isa, fmt);
6614 if (insn_len == (bfd_size_type) XTENSA_UNDEFINED)
6615 goto decode_error;
6616
6617 if (xtensa_format_num_slots (isa, fmt) != 1)
43cd72b9 6618 {
64b607e6
BW
6619 offset += insn_len;
6620 continue;
43cd72b9 6621 }
64b607e6
BW
6622
6623 xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
6624 opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
6625 if (opcode == XTENSA_UNDEFINED)
6626 goto decode_error;
6627
43cd72b9
BW
6628 if ((entry->flags & XTENSA_PROP_INSN_NO_DENSITY) == 0
6629 && (entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) == 0
64b607e6 6630 && can_narrow_instruction (slotbuf, fmt, opcode) != 0)
43cd72b9
BW
6631 {
6632 /* Add an instruction narrow action. */
6633 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6634 ta_narrow_insn, offset, 0, FALSE);
43cd72b9 6635 }
64b607e6
BW
6636 else if ((entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM) == 0
6637 && can_widen_instruction (slotbuf, fmt, opcode) != 0
6638 && ! prev_instr_is_a_loop (ebb->contents,
6639 ebb->content_length, offset))
43cd72b9
BW
6640 {
6641 /* Add an instruction widen action. */
6642 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6643 ta_widen_insn, offset, 0, FALSE);
43cd72b9 6644 }
64b607e6 6645 else if (xtensa_opcode_is_loop (xtensa_default_isa, opcode) == 1)
43cd72b9
BW
6646 {
6647 /* Check for branch targets. */
6648 ebb_propose_action (ebb_table, EBB_REQUIRE_LOOP_ALIGN, 0,
6649 ta_none, offset, 0, TRUE);
43cd72b9
BW
6650 }
6651
6652 offset += insn_len;
e0001a05
NC
6653 }
6654 }
6655
43cd72b9
BW
6656 if (ebb->ends_unreachable)
6657 {
6658 ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
6659 ta_fill, ebb->end_offset, 0, TRUE);
6660 }
e0001a05 6661
43cd72b9 6662 return TRUE;
64b607e6
BW
6663
6664 decode_error:
6665 (*_bfd_error_handler)
6666 (_("%B(%A+0x%lx): could not decode instruction; possible configuration mismatch"),
6667 ebb->sec->owner, ebb->sec, offset);
6668 return FALSE;
43cd72b9
BW
6669}
6670
6671
6672/* After all of the information has collected about the
6673 transformations possible in an EBB, compute the appropriate actions
6674 here in compute_ebb_actions. We still must check later to make
6675 sure that the actions do not break any relocations. The algorithm
6676 used here is pretty greedy. Basically, it removes as many no-ops
6677 as possible so that the end of the EBB has the same alignment
6678 characteristics as the original. First, it uses narrowing, then
6679 fill space at the end of the EBB, and finally widenings. If that
6680 does not work, it tries again with one fewer no-op removed. The
6681 optimization will only be performed if all of the branch targets
6682 that were aligned before transformation are also aligned after the
6683 transformation.
6684
6685 When the size_opt flag is set, ignore the branch target alignments,
6686 narrow all wide instructions, and remove all no-ops unless the end
6687 of the EBB prevents it. */
6688
6689bfd_boolean
7fa3d080 6690compute_ebb_actions (ebb_constraint *ebb_table)
43cd72b9
BW
6691{
6692 unsigned i = 0;
6693 unsigned j;
6694 int removed_bytes = 0;
6695 ebb_t *ebb = &ebb_table->ebb;
6696 unsigned seg_idx_start = 0;
6697 unsigned seg_idx_end = 0;
6698
6699 /* We perform this like the assembler relaxation algorithm: Start by
6700 assuming all instructions are narrow and all no-ops removed; then
6701 walk through.... */
6702
6703 /* For each segment of this that has a solid constraint, check to
6704 see if there are any combinations that will keep the constraint.
6705 If so, use it. */
6706 for (seg_idx_end = 0; seg_idx_end < ebb_table->action_count; seg_idx_end++)
e0001a05 6707 {
43cd72b9
BW
6708 bfd_boolean requires_text_end_align = FALSE;
6709 unsigned longcall_count = 0;
6710 unsigned longcall_convert_count = 0;
6711 unsigned narrowable_count = 0;
6712 unsigned narrowable_convert_count = 0;
6713 unsigned widenable_count = 0;
6714 unsigned widenable_convert_count = 0;
e0001a05 6715
43cd72b9
BW
6716 proposed_action *action = NULL;
6717 int align = (1 << ebb_table->ebb.sec->alignment_power);
e0001a05 6718
43cd72b9 6719 seg_idx_start = seg_idx_end;
e0001a05 6720
43cd72b9
BW
6721 for (i = seg_idx_start; i < ebb_table->action_count; i++)
6722 {
6723 action = &ebb_table->actions[i];
6724 if (action->action == ta_convert_longcall)
6725 longcall_count++;
6726 if (action->action == ta_narrow_insn)
6727 narrowable_count++;
6728 if (action->action == ta_widen_insn)
6729 widenable_count++;
6730 if (action->action == ta_fill)
6731 break;
6732 if (action->align_type == EBB_REQUIRE_LOOP_ALIGN)
6733 break;
6734 if (action->align_type == EBB_REQUIRE_TGT_ALIGN
6735 && !elf32xtensa_size_opt)
6736 break;
6737 }
6738 seg_idx_end = i;
e0001a05 6739
43cd72b9
BW
6740 if (seg_idx_end == ebb_table->action_count && !ebb->ends_unreachable)
6741 requires_text_end_align = TRUE;
e0001a05 6742
43cd72b9
BW
6743 if (elf32xtensa_size_opt && !requires_text_end_align
6744 && action->align_type != EBB_REQUIRE_LOOP_ALIGN
6745 && action->align_type != EBB_REQUIRE_TGT_ALIGN)
6746 {
6747 longcall_convert_count = longcall_count;
6748 narrowable_convert_count = narrowable_count;
6749 widenable_convert_count = 0;
6750 }
6751 else
6752 {
6753 /* There is a constraint. Convert the max number of longcalls. */
6754 narrowable_convert_count = 0;
6755 longcall_convert_count = 0;
6756 widenable_convert_count = 0;
e0001a05 6757
43cd72b9 6758 for (j = 0; j < longcall_count; j++)
e0001a05 6759 {
43cd72b9
BW
6760 int removed = (longcall_count - j) * 3 & (align - 1);
6761 unsigned desire_narrow = (align - removed) & (align - 1);
6762 unsigned desire_widen = removed;
6763 if (desire_narrow <= narrowable_count)
6764 {
6765 narrowable_convert_count = desire_narrow;
6766 narrowable_convert_count +=
6767 (align * ((narrowable_count - narrowable_convert_count)
6768 / align));
6769 longcall_convert_count = (longcall_count - j);
6770 widenable_convert_count = 0;
6771 break;
6772 }
6773 if (desire_widen <= widenable_count && !elf32xtensa_size_opt)
6774 {
6775 narrowable_convert_count = 0;
6776 longcall_convert_count = longcall_count - j;
6777 widenable_convert_count = desire_widen;
6778 break;
6779 }
6780 }
6781 }
e0001a05 6782
43cd72b9
BW
6783 /* Now the number of conversions are saved. Do them. */
6784 for (i = seg_idx_start; i < seg_idx_end; i++)
6785 {
6786 action = &ebb_table->actions[i];
6787 switch (action->action)
6788 {
6789 case ta_convert_longcall:
6790 if (longcall_convert_count != 0)
6791 {
6792 action->action = ta_remove_longcall;
6793 action->do_action = TRUE;
6794 action->removed_bytes += 3;
6795 longcall_convert_count--;
6796 }
6797 break;
6798 case ta_narrow_insn:
6799 if (narrowable_convert_count != 0)
6800 {
6801 action->do_action = TRUE;
6802 action->removed_bytes += 1;
6803 narrowable_convert_count--;
6804 }
6805 break;
6806 case ta_widen_insn:
6807 if (widenable_convert_count != 0)
6808 {
6809 action->do_action = TRUE;
6810 action->removed_bytes -= 1;
6811 widenable_convert_count--;
6812 }
6813 break;
6814 default:
6815 break;
e0001a05 6816 }
43cd72b9
BW
6817 }
6818 }
e0001a05 6819
43cd72b9
BW
6820 /* Now we move on to some local opts. Try to remove each of the
6821 remaining longcalls. */
e0001a05 6822
43cd72b9
BW
6823 if (ebb_table->ebb.ends_section || ebb_table->ebb.ends_unreachable)
6824 {
6825 removed_bytes = 0;
6826 for (i = 0; i < ebb_table->action_count; i++)
e0001a05 6827 {
43cd72b9
BW
6828 int old_removed_bytes = removed_bytes;
6829 proposed_action *action = &ebb_table->actions[i];
6830
6831 if (action->do_action && action->action == ta_convert_longcall)
6832 {
6833 bfd_boolean bad_alignment = FALSE;
6834 removed_bytes += 3;
6835 for (j = i + 1; j < ebb_table->action_count; j++)
6836 {
6837 proposed_action *new_action = &ebb_table->actions[j];
6838 bfd_vma offset = new_action->offset;
6839 if (new_action->align_type == EBB_REQUIRE_TGT_ALIGN)
6840 {
6841 if (!check_branch_target_aligned
6842 (ebb_table->ebb.contents,
6843 ebb_table->ebb.content_length,
6844 offset, offset - removed_bytes))
6845 {
6846 bad_alignment = TRUE;
6847 break;
6848 }
6849 }
6850 if (new_action->align_type == EBB_REQUIRE_LOOP_ALIGN)
6851 {
6852 if (!check_loop_aligned (ebb_table->ebb.contents,
6853 ebb_table->ebb.content_length,
6854 offset,
6855 offset - removed_bytes))
6856 {
6857 bad_alignment = TRUE;
6858 break;
6859 }
6860 }
6861 if (new_action->action == ta_narrow_insn
6862 && !new_action->do_action
6863 && ebb_table->ebb.sec->alignment_power == 2)
6864 {
6865 /* Narrow an instruction and we are done. */
6866 new_action->do_action = TRUE;
6867 new_action->removed_bytes += 1;
6868 bad_alignment = FALSE;
6869 break;
6870 }
6871 if (new_action->action == ta_widen_insn
6872 && new_action->do_action
6873 && ebb_table->ebb.sec->alignment_power == 2)
6874 {
6875 /* Narrow an instruction and we are done. */
6876 new_action->do_action = FALSE;
6877 new_action->removed_bytes += 1;
6878 bad_alignment = FALSE;
6879 break;
6880 }
6881 }
6882 if (!bad_alignment)
6883 {
6884 action->removed_bytes += 3;
6885 action->action = ta_remove_longcall;
6886 action->do_action = TRUE;
6887 }
6888 }
6889 removed_bytes = old_removed_bytes;
6890 if (action->do_action)
6891 removed_bytes += action->removed_bytes;
e0001a05
NC
6892 }
6893 }
6894
43cd72b9
BW
6895 removed_bytes = 0;
6896 for (i = 0; i < ebb_table->action_count; ++i)
6897 {
6898 proposed_action *action = &ebb_table->actions[i];
6899 if (action->do_action)
6900 removed_bytes += action->removed_bytes;
6901 }
6902
6903 if ((removed_bytes % (1 << ebb_table->ebb.sec->alignment_power)) != 0
6904 && ebb->ends_unreachable)
6905 {
6906 proposed_action *action;
6907 int br;
6908 int extra_space;
6909
6910 BFD_ASSERT (ebb_table->action_count != 0);
6911 action = &ebb_table->actions[ebb_table->action_count - 1];
6912 BFD_ASSERT (action->action == ta_fill);
6913 BFD_ASSERT (ebb->ends_unreachable->flags & XTENSA_PROP_UNREACHABLE);
6914
6915 extra_space = compute_fill_extra_space (ebb->ends_unreachable);
6916 br = action->removed_bytes + removed_bytes + extra_space;
6917 br = br & ((1 << ebb->sec->alignment_power ) - 1);
6918
6919 action->removed_bytes = extra_space - br;
6920 }
6921 return TRUE;
e0001a05
NC
6922}
6923
6924
03e94c08
BW
6925/* The xlate_map is a sorted array of address mappings designed to
6926 answer the offset_with_removed_text() query with a binary search instead
6927 of a linear search through the section's action_list. */
6928
6929typedef struct xlate_map_entry xlate_map_entry_t;
6930typedef struct xlate_map xlate_map_t;
6931
6932struct xlate_map_entry
6933{
6934 unsigned orig_address;
6935 unsigned new_address;
6936 unsigned size;
6937};
6938
6939struct xlate_map
6940{
6941 unsigned entry_count;
6942 xlate_map_entry_t *entry;
6943};
6944
6945
6946static int
6947xlate_compare (const void *a_v, const void *b_v)
6948{
6949 const xlate_map_entry_t *a = (const xlate_map_entry_t *) a_v;
6950 const xlate_map_entry_t *b = (const xlate_map_entry_t *) b_v;
6951 if (a->orig_address < b->orig_address)
6952 return -1;
6953 if (a->orig_address > (b->orig_address + b->size - 1))
6954 return 1;
6955 return 0;
6956}
6957
6958
6959static bfd_vma
6960xlate_offset_with_removed_text (const xlate_map_t *map,
6961 text_action_list *action_list,
6962 bfd_vma offset)
6963{
6964 xlate_map_entry_t tmp;
6965 void *r;
6966 xlate_map_entry_t *e;
6967
6968 if (map == NULL)
6969 return offset_with_removed_text (action_list, offset);
6970
6971 if (map->entry_count == 0)
6972 return offset;
6973
6974 tmp.orig_address = offset;
6975 tmp.new_address = offset;
6976 tmp.size = 1;
6977
6978 r = bsearch (&offset, map->entry, map->entry_count,
6979 sizeof (xlate_map_entry_t), &xlate_compare);
6980 e = (xlate_map_entry_t *) r;
6981
6982 BFD_ASSERT (e != NULL);
6983 if (e == NULL)
6984 return offset;
6985 return e->new_address - e->orig_address + offset;
6986}
6987
6988
6989/* Build a binary searchable offset translation map from a section's
6990 action list. */
6991
6992static xlate_map_t *
6993build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
6994{
6995 xlate_map_t *map = (xlate_map_t *) bfd_malloc (sizeof (xlate_map_t));
6996 text_action_list *action_list = &relax_info->action_list;
6997 unsigned num_actions = 0;
6998 text_action *r;
6999 int removed;
7000 xlate_map_entry_t *current_entry;
7001
7002 if (map == NULL)
7003 return NULL;
7004
7005 num_actions = action_list_count (action_list);
7006 map->entry = (xlate_map_entry_t *)
7007 bfd_malloc (sizeof (xlate_map_entry_t) * (num_actions + 1));
7008 if (map->entry == NULL)
7009 {
7010 free (map);
7011 return NULL;
7012 }
7013 map->entry_count = 0;
7014
7015 removed = 0;
7016 current_entry = &map->entry[0];
7017
7018 current_entry->orig_address = 0;
7019 current_entry->new_address = 0;
7020 current_entry->size = 0;
7021
7022 for (r = action_list->head; r != NULL; r = r->next)
7023 {
7024 unsigned orig_size = 0;
7025 switch (r->action)
7026 {
7027 case ta_none:
7028 case ta_remove_insn:
7029 case ta_convert_longcall:
7030 case ta_remove_literal:
7031 case ta_add_literal:
7032 break;
7033 case ta_remove_longcall:
7034 orig_size = 6;
7035 break;
7036 case ta_narrow_insn:
7037 orig_size = 3;
7038 break;
7039 case ta_widen_insn:
7040 orig_size = 2;
7041 break;
7042 case ta_fill:
7043 break;
7044 }
7045 current_entry->size =
7046 r->offset + orig_size - current_entry->orig_address;
7047 if (current_entry->size != 0)
7048 {
7049 current_entry++;
7050 map->entry_count++;
7051 }
7052 current_entry->orig_address = r->offset + orig_size;
7053 removed += r->removed_bytes;
7054 current_entry->new_address = r->offset + orig_size - removed;
7055 current_entry->size = 0;
7056 }
7057
7058 current_entry->size = (bfd_get_section_limit (sec->owner, sec)
7059 - current_entry->orig_address);
7060 if (current_entry->size != 0)
7061 map->entry_count++;
7062
7063 return map;
7064}
7065
7066
7067/* Free an offset translation map. */
7068
7069static void
7070free_xlate_map (xlate_map_t *map)
7071{
7072 if (map && map->entry)
7073 free (map->entry);
7074 if (map)
7075 free (map);
7076}
7077
7078
43cd72b9
BW
7079/* Use check_section_ebb_pcrels_fit to make sure that all of the
7080 relocations in a section will fit if a proposed set of actions
7081 are performed. */
e0001a05 7082
43cd72b9 7083static bfd_boolean
7fa3d080
BW
7084check_section_ebb_pcrels_fit (bfd *abfd,
7085 asection *sec,
7086 bfd_byte *contents,
7087 Elf_Internal_Rela *internal_relocs,
cb337148
BW
7088 const ebb_constraint *constraint,
7089 const xtensa_opcode *reloc_opcodes)
e0001a05 7090{
43cd72b9
BW
7091 unsigned i, j;
7092 Elf_Internal_Rela *irel;
03e94c08
BW
7093 xlate_map_t *xmap = NULL;
7094 bfd_boolean ok = TRUE;
43cd72b9 7095 xtensa_relax_info *relax_info;
e0001a05 7096
43cd72b9 7097 relax_info = get_xtensa_relax_info (sec);
e0001a05 7098
03e94c08
BW
7099 if (relax_info && sec->reloc_count > 100)
7100 {
7101 xmap = build_xlate_map (sec, relax_info);
7102 /* NULL indicates out of memory, but the slow version
7103 can still be used. */
7104 }
7105
43cd72b9
BW
7106 for (i = 0; i < sec->reloc_count; i++)
7107 {
7108 r_reloc r_rel;
7109 bfd_vma orig_self_offset, orig_target_offset;
7110 bfd_vma self_offset, target_offset;
7111 int r_type;
7112 reloc_howto_type *howto;
7113 int self_removed_bytes, target_removed_bytes;
e0001a05 7114
43cd72b9
BW
7115 irel = &internal_relocs[i];
7116 r_type = ELF32_R_TYPE (irel->r_info);
e0001a05 7117
43cd72b9
BW
7118 howto = &elf_howto_table[r_type];
7119 /* We maintain the required invariant: PC-relative relocations
7120 that fit before linking must fit after linking. Thus we only
7121 need to deal with relocations to the same section that are
7122 PC-relative. */
7123 if (ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY
7124 || !howto->pc_relative)
7125 continue;
e0001a05 7126
43cd72b9
BW
7127 r_reloc_init (&r_rel, abfd, irel, contents,
7128 bfd_get_section_limit (abfd, sec));
e0001a05 7129
43cd72b9
BW
7130 if (r_reloc_get_section (&r_rel) != sec)
7131 continue;
e0001a05 7132
43cd72b9
BW
7133 orig_self_offset = irel->r_offset;
7134 orig_target_offset = r_rel.target_offset;
e0001a05 7135
43cd72b9
BW
7136 self_offset = orig_self_offset;
7137 target_offset = orig_target_offset;
7138
7139 if (relax_info)
7140 {
03e94c08
BW
7141 self_offset =
7142 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
7143 orig_self_offset);
7144 target_offset =
7145 xlate_offset_with_removed_text (xmap, &relax_info->action_list,
7146 orig_target_offset);
43cd72b9
BW
7147 }
7148
7149 self_removed_bytes = 0;
7150 target_removed_bytes = 0;
7151
7152 for (j = 0; j < constraint->action_count; ++j)
7153 {
7154 proposed_action *action = &constraint->actions[j];
7155 bfd_vma offset = action->offset;
7156 int removed_bytes = action->removed_bytes;
7157 if (offset < orig_self_offset
7158 || (offset == orig_self_offset && action->action == ta_fill
7159 && action->removed_bytes < 0))
7160 self_removed_bytes += removed_bytes;
7161 if (offset < orig_target_offset
7162 || (offset == orig_target_offset && action->action == ta_fill
7163 && action->removed_bytes < 0))
7164 target_removed_bytes += removed_bytes;
7165 }
7166 self_offset -= self_removed_bytes;
7167 target_offset -= target_removed_bytes;
7168
7169 /* Try to encode it. Get the operand and check. */
7170 if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7171 {
7172 /* None of the current alternate relocs are PC-relative,
7173 and only PC-relative relocs matter here. */
7174 }
7175 else
7176 {
7177 xtensa_opcode opcode;
7178 int opnum;
7179
cb337148
BW
7180 if (reloc_opcodes)
7181 opcode = reloc_opcodes[i];
7182 else
7183 opcode = get_relocation_opcode (abfd, sec, contents, irel);
43cd72b9 7184 if (opcode == XTENSA_UNDEFINED)
03e94c08
BW
7185 {
7186 ok = FALSE;
7187 break;
7188 }
43cd72b9
BW
7189
7190 opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7191 if (opnum == XTENSA_UNDEFINED)
03e94c08
BW
7192 {
7193 ok = FALSE;
7194 break;
7195 }
43cd72b9
BW
7196
7197 if (!pcrel_reloc_fits (opcode, opnum, self_offset, target_offset))
03e94c08
BW
7198 {
7199 ok = FALSE;
7200 break;
7201 }
43cd72b9
BW
7202 }
7203 }
7204
03e94c08
BW
7205 if (xmap)
7206 free_xlate_map (xmap);
7207
7208 return ok;
43cd72b9
BW
7209}
7210
7211
7212static bfd_boolean
7fa3d080 7213check_section_ebb_reduces (const ebb_constraint *constraint)
43cd72b9
BW
7214{
7215 int removed = 0;
7216 unsigned i;
7217
7218 for (i = 0; i < constraint->action_count; i++)
7219 {
7220 const proposed_action *action = &constraint->actions[i];
7221 if (action->do_action)
7222 removed += action->removed_bytes;
7223 }
7224 if (removed < 0)
e0001a05
NC
7225 return FALSE;
7226
7227 return TRUE;
7228}
7229
7230
43cd72b9 7231void
7fa3d080
BW
7232text_action_add_proposed (text_action_list *l,
7233 const ebb_constraint *ebb_table,
7234 asection *sec)
e0001a05
NC
7235{
7236 unsigned i;
7237
43cd72b9 7238 for (i = 0; i < ebb_table->action_count; i++)
e0001a05 7239 {
43cd72b9 7240 proposed_action *action = &ebb_table->actions[i];
e0001a05 7241
43cd72b9 7242 if (!action->do_action)
e0001a05 7243 continue;
43cd72b9
BW
7244 switch (action->action)
7245 {
7246 case ta_remove_insn:
7247 case ta_remove_longcall:
7248 case ta_convert_longcall:
7249 case ta_narrow_insn:
7250 case ta_widen_insn:
7251 case ta_fill:
7252 case ta_remove_literal:
7253 text_action_add (l, action->action, sec, action->offset,
7254 action->removed_bytes);
7255 break;
7256 case ta_none:
7257 break;
7258 default:
7259 BFD_ASSERT (0);
7260 break;
7261 }
e0001a05 7262 }
43cd72b9 7263}
e0001a05 7264
43cd72b9
BW
7265
7266int
7fa3d080 7267compute_fill_extra_space (property_table_entry *entry)
43cd72b9
BW
7268{
7269 int fill_extra_space;
7270
7271 if (!entry)
7272 return 0;
7273
7274 if ((entry->flags & XTENSA_PROP_UNREACHABLE) == 0)
7275 return 0;
7276
7277 fill_extra_space = entry->size;
7278 if ((entry->flags & XTENSA_PROP_ALIGN) != 0)
7279 {
7280 /* Fill bytes for alignment:
7281 (2**n)-1 - (addr + (2**n)-1) & (2**n -1) */
7282 int pow = GET_XTENSA_PROP_ALIGNMENT (entry->flags);
7283 int nsm = (1 << pow) - 1;
7284 bfd_vma addr = entry->address + entry->size;
7285 bfd_vma align_fill = nsm - ((addr + nsm) & nsm);
7286 fill_extra_space += align_fill;
7287 }
7288 return fill_extra_space;
e0001a05
NC
7289}
7290
43cd72b9 7291\f
e0001a05
NC
7292/* First relaxation pass. */
7293
43cd72b9
BW
7294/* If the section contains relaxable literals, check each literal to
7295 see if it has the same value as another literal that has already
7296 been seen, either in the current section or a previous one. If so,
7297 add an entry to the per-section list of removed literals. The
e0001a05
NC
7298 actual changes are deferred until the next pass. */
7299
7300static bfd_boolean
7fa3d080
BW
7301compute_removed_literals (bfd *abfd,
7302 asection *sec,
7303 struct bfd_link_info *link_info,
7304 value_map_hash_table *values)
e0001a05
NC
7305{
7306 xtensa_relax_info *relax_info;
7307 bfd_byte *contents;
7308 Elf_Internal_Rela *internal_relocs;
43cd72b9 7309 source_reloc *src_relocs, *rel;
e0001a05 7310 bfd_boolean ok = TRUE;
43cd72b9
BW
7311 property_table_entry *prop_table = NULL;
7312 int ptblsize;
7313 int i, prev_i;
7314 bfd_boolean last_loc_is_prev = FALSE;
7315 bfd_vma last_target_offset = 0;
7316 section_cache_t target_sec_cache;
7317 bfd_size_type sec_size;
7318
7319 init_section_cache (&target_sec_cache);
e0001a05
NC
7320
7321 /* Do nothing if it is not a relaxable literal section. */
7322 relax_info = get_xtensa_relax_info (sec);
7323 BFD_ASSERT (relax_info);
e0001a05
NC
7324 if (!relax_info->is_relaxable_literal_section)
7325 return ok;
7326
7327 internal_relocs = retrieve_internal_relocs (abfd, sec,
7328 link_info->keep_memory);
7329
43cd72b9 7330 sec_size = bfd_get_section_limit (abfd, sec);
e0001a05 7331 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
43cd72b9 7332 if (contents == NULL && sec_size != 0)
e0001a05
NC
7333 {
7334 ok = FALSE;
7335 goto error_return;
7336 }
7337
7338 /* Sort the source_relocs by target offset. */
7339 src_relocs = relax_info->src_relocs;
7340 qsort (src_relocs, relax_info->src_count,
7341 sizeof (source_reloc), source_reloc_compare);
43cd72b9
BW
7342 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
7343 internal_reloc_compare);
e0001a05 7344
43cd72b9
BW
7345 ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
7346 XTENSA_PROP_SEC_NAME, FALSE);
7347 if (ptblsize < 0)
7348 {
7349 ok = FALSE;
7350 goto error_return;
7351 }
7352
7353 prev_i = -1;
e0001a05
NC
7354 for (i = 0; i < relax_info->src_count; i++)
7355 {
e0001a05 7356 Elf_Internal_Rela *irel = NULL;
e0001a05
NC
7357
7358 rel = &src_relocs[i];
43cd72b9
BW
7359 if (get_l32r_opcode () != rel->opcode)
7360 continue;
e0001a05
NC
7361 irel = get_irel_at_offset (sec, internal_relocs,
7362 rel->r_rel.target_offset);
7363
43cd72b9
BW
7364 /* If the relocation on this is not a simple R_XTENSA_32 or
7365 R_XTENSA_PLT then do not consider it. This may happen when
7366 the difference of two symbols is used in a literal. */
7367 if (irel && (ELF32_R_TYPE (irel->r_info) != R_XTENSA_32
7368 && ELF32_R_TYPE (irel->r_info) != R_XTENSA_PLT))
7369 continue;
7370
e0001a05
NC
7371 /* If the target_offset for this relocation is the same as the
7372 previous relocation, then we've already considered whether the
7373 literal can be coalesced. Skip to the next one.... */
43cd72b9
BW
7374 if (i != 0 && prev_i != -1
7375 && src_relocs[i-1].r_rel.target_offset == rel->r_rel.target_offset)
e0001a05 7376 continue;
43cd72b9
BW
7377 prev_i = i;
7378
7379 if (last_loc_is_prev &&
7380 last_target_offset + 4 != rel->r_rel.target_offset)
7381 last_loc_is_prev = FALSE;
e0001a05
NC
7382
7383 /* Check if the relocation was from an L32R that is being removed
7384 because a CALLX was converted to a direct CALL, and check if
7385 there are no other relocations to the literal. */
43cd72b9 7386 if (is_removable_literal (rel, i, src_relocs, relax_info->src_count))
e0001a05 7387 {
43cd72b9
BW
7388 if (!remove_dead_literal (abfd, sec, link_info, internal_relocs,
7389 irel, rel, prop_table, ptblsize))
e0001a05 7390 {
43cd72b9
BW
7391 ok = FALSE;
7392 goto error_return;
e0001a05 7393 }
43cd72b9 7394 last_target_offset = rel->r_rel.target_offset;
e0001a05
NC
7395 continue;
7396 }
7397
43cd72b9
BW
7398 if (!identify_literal_placement (abfd, sec, contents, link_info,
7399 values,
7400 &last_loc_is_prev, irel,
7401 relax_info->src_count - i, rel,
7402 prop_table, ptblsize,
7403 &target_sec_cache, rel->is_abs_literal))
e0001a05 7404 {
43cd72b9
BW
7405 ok = FALSE;
7406 goto error_return;
7407 }
7408 last_target_offset = rel->r_rel.target_offset;
7409 }
e0001a05 7410
43cd72b9
BW
7411#if DEBUG
7412 print_removed_literals (stderr, &relax_info->removed_list);
7413 print_action_list (stderr, &relax_info->action_list);
7414#endif /* DEBUG */
7415
7416error_return:
7417 if (prop_table) free (prop_table);
7418 clear_section_cache (&target_sec_cache);
7419
7420 release_contents (sec, contents);
7421 release_internal_relocs (sec, internal_relocs);
7422 return ok;
7423}
7424
7425
7426static Elf_Internal_Rela *
7fa3d080
BW
7427get_irel_at_offset (asection *sec,
7428 Elf_Internal_Rela *internal_relocs,
7429 bfd_vma offset)
43cd72b9
BW
7430{
7431 unsigned i;
7432 Elf_Internal_Rela *irel;
7433 unsigned r_type;
7434 Elf_Internal_Rela key;
7435
7436 if (!internal_relocs)
7437 return NULL;
7438
7439 key.r_offset = offset;
7440 irel = bsearch (&key, internal_relocs, sec->reloc_count,
7441 sizeof (Elf_Internal_Rela), internal_reloc_matches);
7442 if (!irel)
7443 return NULL;
7444
7445 /* bsearch does not guarantee which will be returned if there are
7446 multiple matches. We need the first that is not an alignment. */
7447 i = irel - internal_relocs;
7448 while (i > 0)
7449 {
7450 if (internal_relocs[i-1].r_offset != offset)
7451 break;
7452 i--;
7453 }
7454 for ( ; i < sec->reloc_count; i++)
7455 {
7456 irel = &internal_relocs[i];
7457 r_type = ELF32_R_TYPE (irel->r_info);
7458 if (irel->r_offset == offset && r_type != R_XTENSA_NONE)
7459 return irel;
7460 }
7461
7462 return NULL;
7463}
7464
7465
7466bfd_boolean
7fa3d080
BW
7467is_removable_literal (const source_reloc *rel,
7468 int i,
7469 const source_reloc *src_relocs,
7470 int src_count)
43cd72b9
BW
7471{
7472 const source_reloc *curr_rel;
7473 if (!rel->is_null)
7474 return FALSE;
7475
7476 for (++i; i < src_count; ++i)
7477 {
7478 curr_rel = &src_relocs[i];
7479 /* If all others have the same target offset.... */
7480 if (curr_rel->r_rel.target_offset != rel->r_rel.target_offset)
7481 return TRUE;
7482
7483 if (!curr_rel->is_null
7484 && !xtensa_is_property_section (curr_rel->source_sec)
7485 && !(curr_rel->source_sec->flags & SEC_DEBUGGING))
7486 return FALSE;
7487 }
7488 return TRUE;
7489}
7490
7491
7492bfd_boolean
7fa3d080
BW
7493remove_dead_literal (bfd *abfd,
7494 asection *sec,
7495 struct bfd_link_info *link_info,
7496 Elf_Internal_Rela *internal_relocs,
7497 Elf_Internal_Rela *irel,
7498 source_reloc *rel,
7499 property_table_entry *prop_table,
7500 int ptblsize)
43cd72b9
BW
7501{
7502 property_table_entry *entry;
7503 xtensa_relax_info *relax_info;
7504
7505 relax_info = get_xtensa_relax_info (sec);
7506 if (!relax_info)
7507 return FALSE;
7508
7509 entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7510 sec->vma + rel->r_rel.target_offset);
7511
7512 /* Mark the unused literal so that it will be removed. */
7513 add_removed_literal (&relax_info->removed_list, &rel->r_rel, NULL);
7514
7515 text_action_add (&relax_info->action_list,
7516 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
7517
7518 /* If the section is 4-byte aligned, do not add fill. */
7519 if (sec->alignment_power > 2)
7520 {
7521 int fill_extra_space;
7522 bfd_vma entry_sec_offset;
7523 text_action *fa;
7524 property_table_entry *the_add_entry;
7525 int removed_diff;
7526
7527 if (entry)
7528 entry_sec_offset = entry->address - sec->vma + entry->size;
7529 else
7530 entry_sec_offset = rel->r_rel.target_offset + 4;
7531
7532 /* If the literal range is at the end of the section,
7533 do not add fill. */
7534 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7535 entry_sec_offset);
7536 fill_extra_space = compute_fill_extra_space (the_add_entry);
7537
7538 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
7539 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
7540 -4, fill_extra_space);
7541 if (fa)
7542 adjust_fill_action (fa, removed_diff);
7543 else
7544 text_action_add (&relax_info->action_list,
7545 ta_fill, sec, entry_sec_offset, removed_diff);
7546 }
7547
7548 /* Zero out the relocation on this literal location. */
7549 if (irel)
7550 {
7551 if (elf_hash_table (link_info)->dynamic_sections_created)
7552 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
7553
7554 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7555 pin_internal_relocs (sec, internal_relocs);
7556 }
7557
7558 /* Do not modify "last_loc_is_prev". */
7559 return TRUE;
7560}
7561
7562
7563bfd_boolean
7fa3d080
BW
7564identify_literal_placement (bfd *abfd,
7565 asection *sec,
7566 bfd_byte *contents,
7567 struct bfd_link_info *link_info,
7568 value_map_hash_table *values,
7569 bfd_boolean *last_loc_is_prev_p,
7570 Elf_Internal_Rela *irel,
7571 int remaining_src_rels,
7572 source_reloc *rel,
7573 property_table_entry *prop_table,
7574 int ptblsize,
7575 section_cache_t *target_sec_cache,
7576 bfd_boolean is_abs_literal)
43cd72b9
BW
7577{
7578 literal_value val;
7579 value_map *val_map;
7580 xtensa_relax_info *relax_info;
7581 bfd_boolean literal_placed = FALSE;
7582 r_reloc r_rel;
7583 unsigned long value;
7584 bfd_boolean final_static_link;
7585 bfd_size_type sec_size;
7586
7587 relax_info = get_xtensa_relax_info (sec);
7588 if (!relax_info)
7589 return FALSE;
7590
7591 sec_size = bfd_get_section_limit (abfd, sec);
7592
7593 final_static_link =
7594 (!link_info->relocatable
7595 && !elf_hash_table (link_info)->dynamic_sections_created);
7596
7597 /* The placement algorithm first checks to see if the literal is
7598 already in the value map. If so and the value map is reachable
7599 from all uses, then the literal is moved to that location. If
7600 not, then we identify the last location where a fresh literal was
7601 placed. If the literal can be safely moved there, then we do so.
7602 If not, then we assume that the literal is not to move and leave
7603 the literal where it is, marking it as the last literal
7604 location. */
7605
7606 /* Find the literal value. */
7607 value = 0;
7608 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7609 if (!irel)
7610 {
7611 BFD_ASSERT (rel->r_rel.target_offset < sec_size);
7612 value = bfd_get_32 (abfd, contents + rel->r_rel.target_offset);
7613 }
7614 init_literal_value (&val, &r_rel, value, is_abs_literal);
7615
7616 /* Check if we've seen another literal with the same value that
7617 is in the same output section. */
7618 val_map = value_map_get_cached_value (values, &val, final_static_link);
7619
7620 if (val_map
7621 && (r_reloc_get_section (&val_map->loc)->output_section
7622 == sec->output_section)
7623 && relocations_reach (rel, remaining_src_rels, &val_map->loc)
7624 && coalesce_shared_literal (sec, rel, prop_table, ptblsize, val_map))
7625 {
7626 /* No change to last_loc_is_prev. */
7627 literal_placed = TRUE;
7628 }
7629
7630 /* For relocatable links, do not try to move literals. To do it
7631 correctly might increase the number of relocations in an input
7632 section making the default relocatable linking fail. */
7633 if (!link_info->relocatable && !literal_placed
7634 && values->has_last_loc && !(*last_loc_is_prev_p))
7635 {
7636 asection *target_sec = r_reloc_get_section (&values->last_loc);
7637 if (target_sec && target_sec->output_section == sec->output_section)
7638 {
7639 /* Increment the virtual offset. */
7640 r_reloc try_loc = values->last_loc;
7641 try_loc.virtual_offset += 4;
7642
7643 /* There is a last loc that was in the same output section. */
7644 if (relocations_reach (rel, remaining_src_rels, &try_loc)
7645 && move_shared_literal (sec, link_info, rel,
7646 prop_table, ptblsize,
7647 &try_loc, &val, target_sec_cache))
e0001a05 7648 {
43cd72b9
BW
7649 values->last_loc.virtual_offset += 4;
7650 literal_placed = TRUE;
7651 if (!val_map)
7652 val_map = add_value_map (values, &val, &try_loc,
7653 final_static_link);
7654 else
7655 val_map->loc = try_loc;
e0001a05
NC
7656 }
7657 }
43cd72b9
BW
7658 }
7659
7660 if (!literal_placed)
7661 {
7662 /* Nothing worked, leave the literal alone but update the last loc. */
7663 values->has_last_loc = TRUE;
7664 values->last_loc = rel->r_rel;
7665 if (!val_map)
7666 val_map = add_value_map (values, &val, &rel->r_rel, final_static_link);
e0001a05 7667 else
43cd72b9
BW
7668 val_map->loc = rel->r_rel;
7669 *last_loc_is_prev_p = TRUE;
e0001a05
NC
7670 }
7671
43cd72b9 7672 return TRUE;
e0001a05
NC
7673}
7674
7675
7676/* Check if the original relocations (presumably on L32R instructions)
7677 identified by reloc[0..N] can be changed to reference the literal
7678 identified by r_rel. If r_rel is out of range for any of the
7679 original relocations, then we don't want to coalesce the original
7680 literal with the one at r_rel. We only check reloc[0..N], where the
7681 offsets are all the same as for reloc[0] (i.e., they're all
7682 referencing the same literal) and where N is also bounded by the
7683 number of remaining entries in the "reloc" array. The "reloc" array
7684 is sorted by target offset so we know all the entries for the same
7685 literal will be contiguous. */
7686
7687static bfd_boolean
7fa3d080
BW
7688relocations_reach (source_reloc *reloc,
7689 int remaining_relocs,
7690 const r_reloc *r_rel)
e0001a05
NC
7691{
7692 bfd_vma from_offset, source_address, dest_address;
7693 asection *sec;
7694 int i;
7695
7696 if (!r_reloc_is_defined (r_rel))
7697 return FALSE;
7698
7699 sec = r_reloc_get_section (r_rel);
7700 from_offset = reloc[0].r_rel.target_offset;
7701
7702 for (i = 0; i < remaining_relocs; i++)
7703 {
7704 if (reloc[i].r_rel.target_offset != from_offset)
7705 break;
7706
7707 /* Ignore relocations that have been removed. */
7708 if (reloc[i].is_null)
7709 continue;
7710
7711 /* The original and new output section for these must be the same
7712 in order to coalesce. */
7713 if (r_reloc_get_section (&reloc[i].r_rel)->output_section
7714 != sec->output_section)
7715 return FALSE;
7716
d638e0ac
BW
7717 /* Absolute literals in the same output section can always be
7718 combined. */
7719 if (reloc[i].is_abs_literal)
7720 continue;
7721
43cd72b9
BW
7722 /* A literal with no PC-relative relocations can be moved anywhere. */
7723 if (reloc[i].opnd != -1)
e0001a05
NC
7724 {
7725 /* Otherwise, check to see that it fits. */
7726 source_address = (reloc[i].source_sec->output_section->vma
7727 + reloc[i].source_sec->output_offset
7728 + reloc[i].r_rel.rela.r_offset);
7729 dest_address = (sec->output_section->vma
7730 + sec->output_offset
7731 + r_rel->target_offset);
7732
43cd72b9
BW
7733 if (!pcrel_reloc_fits (reloc[i].opcode, reloc[i].opnd,
7734 source_address, dest_address))
e0001a05
NC
7735 return FALSE;
7736 }
7737 }
7738
7739 return TRUE;
7740}
7741
7742
43cd72b9
BW
7743/* Move a literal to another literal location because it is
7744 the same as the other literal value. */
e0001a05 7745
43cd72b9 7746static bfd_boolean
7fa3d080
BW
7747coalesce_shared_literal (asection *sec,
7748 source_reloc *rel,
7749 property_table_entry *prop_table,
7750 int ptblsize,
7751 value_map *val_map)
e0001a05 7752{
43cd72b9
BW
7753 property_table_entry *entry;
7754 text_action *fa;
7755 property_table_entry *the_add_entry;
7756 int removed_diff;
7757 xtensa_relax_info *relax_info;
7758
7759 relax_info = get_xtensa_relax_info (sec);
7760 if (!relax_info)
7761 return FALSE;
7762
7763 entry = elf_xtensa_find_property_entry
7764 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
7765 if (entry && (entry->flags & XTENSA_PROP_INSN_NO_TRANSFORM))
7766 return TRUE;
7767
7768 /* Mark that the literal will be coalesced. */
7769 add_removed_literal (&relax_info->removed_list, &rel->r_rel, &val_map->loc);
7770
7771 text_action_add (&relax_info->action_list,
7772 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
7773
7774 /* If the section is 4-byte aligned, do not add fill. */
7775 if (sec->alignment_power > 2)
e0001a05 7776 {
43cd72b9
BW
7777 int fill_extra_space;
7778 bfd_vma entry_sec_offset;
7779
7780 if (entry)
7781 entry_sec_offset = entry->address - sec->vma + entry->size;
7782 else
7783 entry_sec_offset = rel->r_rel.target_offset + 4;
7784
7785 /* If the literal range is at the end of the section,
7786 do not add fill. */
7787 fill_extra_space = 0;
7788 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7789 entry_sec_offset);
7790 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
7791 fill_extra_space = the_add_entry->size;
7792
7793 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
7794 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
7795 -4, fill_extra_space);
7796 if (fa)
7797 adjust_fill_action (fa, removed_diff);
7798 else
7799 text_action_add (&relax_info->action_list,
7800 ta_fill, sec, entry_sec_offset, removed_diff);
e0001a05 7801 }
43cd72b9
BW
7802
7803 return TRUE;
7804}
7805
7806
7807/* Move a literal to another location. This may actually increase the
7808 total amount of space used because of alignments so we need to do
7809 this carefully. Also, it may make a branch go out of range. */
7810
7811static bfd_boolean
7fa3d080
BW
7812move_shared_literal (asection *sec,
7813 struct bfd_link_info *link_info,
7814 source_reloc *rel,
7815 property_table_entry *prop_table,
7816 int ptblsize,
7817 const r_reloc *target_loc,
7818 const literal_value *lit_value,
7819 section_cache_t *target_sec_cache)
43cd72b9
BW
7820{
7821 property_table_entry *the_add_entry, *src_entry, *target_entry = NULL;
7822 text_action *fa, *target_fa;
7823 int removed_diff;
7824 xtensa_relax_info *relax_info, *target_relax_info;
7825 asection *target_sec;
7826 ebb_t *ebb;
7827 ebb_constraint ebb_table;
7828 bfd_boolean relocs_fit;
7829
7830 /* If this routine always returns FALSE, the literals that cannot be
7831 coalesced will not be moved. */
7832 if (elf32xtensa_no_literal_movement)
7833 return FALSE;
7834
7835 relax_info = get_xtensa_relax_info (sec);
7836 if (!relax_info)
7837 return FALSE;
7838
7839 target_sec = r_reloc_get_section (target_loc);
7840 target_relax_info = get_xtensa_relax_info (target_sec);
7841
7842 /* Literals to undefined sections may not be moved because they
7843 must report an error. */
7844 if (bfd_is_und_section (target_sec))
7845 return FALSE;
7846
7847 src_entry = elf_xtensa_find_property_entry
7848 (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
7849
7850 if (!section_cache_section (target_sec_cache, target_sec, link_info))
7851 return FALSE;
7852
7853 target_entry = elf_xtensa_find_property_entry
7854 (target_sec_cache->ptbl, target_sec_cache->pte_count,
7855 target_sec->vma + target_loc->target_offset);
7856
7857 if (!target_entry)
7858 return FALSE;
7859
7860 /* Make sure that we have not broken any branches. */
7861 relocs_fit = FALSE;
7862
7863 init_ebb_constraint (&ebb_table);
7864 ebb = &ebb_table.ebb;
7865 init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
7866 target_sec_cache->content_length,
7867 target_sec_cache->ptbl, target_sec_cache->pte_count,
7868 target_sec_cache->relocs, target_sec_cache->reloc_count);
7869
7870 /* Propose to add 4 bytes + worst-case alignment size increase to
7871 destination. */
7872 ebb_propose_action (&ebb_table, EBB_NO_ALIGN, 0,
7873 ta_fill, target_loc->target_offset,
7874 -4 - (1 << target_sec->alignment_power), TRUE);
7875
7876 /* Check all of the PC-relative relocations to make sure they still fit. */
7877 relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
7878 target_sec_cache->contents,
7879 target_sec_cache->relocs,
cb337148 7880 &ebb_table, NULL);
43cd72b9
BW
7881
7882 if (!relocs_fit)
7883 return FALSE;
7884
7885 text_action_add_literal (&target_relax_info->action_list,
7886 ta_add_literal, target_loc, lit_value, -4);
7887
7888 if (target_sec->alignment_power > 2 && target_entry != src_entry)
7889 {
7890 /* May need to add or remove some fill to maintain alignment. */
7891 int fill_extra_space;
7892 bfd_vma entry_sec_offset;
7893
7894 entry_sec_offset =
7895 target_entry->address - target_sec->vma + target_entry->size;
7896
7897 /* If the literal range is at the end of the section,
7898 do not add fill. */
7899 fill_extra_space = 0;
7900 the_add_entry =
7901 elf_xtensa_find_property_entry (target_sec_cache->ptbl,
7902 target_sec_cache->pte_count,
7903 entry_sec_offset);
7904 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
7905 fill_extra_space = the_add_entry->size;
7906
7907 target_fa = find_fill_action (&target_relax_info->action_list,
7908 target_sec, entry_sec_offset);
7909 removed_diff = compute_removed_action_diff (target_fa, target_sec,
7910 entry_sec_offset, 4,
7911 fill_extra_space);
7912 if (target_fa)
7913 adjust_fill_action (target_fa, removed_diff);
7914 else
7915 text_action_add (&target_relax_info->action_list,
7916 ta_fill, target_sec, entry_sec_offset, removed_diff);
7917 }
7918
7919 /* Mark that the literal will be moved to the new location. */
7920 add_removed_literal (&relax_info->removed_list, &rel->r_rel, target_loc);
7921
7922 /* Remove the literal. */
7923 text_action_add (&relax_info->action_list,
7924 ta_remove_literal, sec, rel->r_rel.target_offset, 4);
7925
7926 /* If the section is 4-byte aligned, do not add fill. */
7927 if (sec->alignment_power > 2 && target_entry != src_entry)
7928 {
7929 int fill_extra_space;
7930 bfd_vma entry_sec_offset;
7931
7932 if (src_entry)
7933 entry_sec_offset = src_entry->address - sec->vma + src_entry->size;
7934 else
7935 entry_sec_offset = rel->r_rel.target_offset+4;
7936
7937 /* If the literal range is at the end of the section,
7938 do not add fill. */
7939 fill_extra_space = 0;
7940 the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7941 entry_sec_offset);
7942 if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
7943 fill_extra_space = the_add_entry->size;
7944
7945 fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
7946 removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
7947 -4, fill_extra_space);
7948 if (fa)
7949 adjust_fill_action (fa, removed_diff);
7950 else
7951 text_action_add (&relax_info->action_list,
7952 ta_fill, sec, entry_sec_offset, removed_diff);
7953 }
7954
7955 return TRUE;
e0001a05
NC
7956}
7957
7958\f
7959/* Second relaxation pass. */
7960
7961/* Modify all of the relocations to point to the right spot, and if this
7962 is a relaxable section, delete the unwanted literals and fix the
43cd72b9 7963 section size. */
e0001a05 7964
43cd72b9 7965bfd_boolean
7fa3d080 7966relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
e0001a05
NC
7967{
7968 Elf_Internal_Rela *internal_relocs;
7969 xtensa_relax_info *relax_info;
7970 bfd_byte *contents;
7971 bfd_boolean ok = TRUE;
7972 unsigned i;
43cd72b9
BW
7973 bfd_boolean rv = FALSE;
7974 bfd_boolean virtual_action;
7975 bfd_size_type sec_size;
e0001a05 7976
43cd72b9 7977 sec_size = bfd_get_section_limit (abfd, sec);
e0001a05
NC
7978 relax_info = get_xtensa_relax_info (sec);
7979 BFD_ASSERT (relax_info);
7980
43cd72b9
BW
7981 /* First translate any of the fixes that have been added already. */
7982 translate_section_fixes (sec);
7983
e0001a05
NC
7984 /* Handle property sections (e.g., literal tables) specially. */
7985 if (xtensa_is_property_section (sec))
7986 {
7987 BFD_ASSERT (!relax_info->is_relaxable_literal_section);
7988 return relax_property_section (abfd, sec, link_info);
7989 }
7990
43cd72b9
BW
7991 internal_relocs = retrieve_internal_relocs (abfd, sec,
7992 link_info->keep_memory);
7993 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7994 if (contents == NULL && sec_size != 0)
7995 {
7996 ok = FALSE;
7997 goto error_return;
7998 }
7999
8000 if (internal_relocs)
8001 {
8002 for (i = 0; i < sec->reloc_count; i++)
8003 {
8004 Elf_Internal_Rela *irel;
8005 xtensa_relax_info *target_relax_info;
8006 bfd_vma source_offset, old_source_offset;
8007 r_reloc r_rel;
8008 unsigned r_type;
8009 asection *target_sec;
8010
8011 /* Locally change the source address.
8012 Translate the target to the new target address.
8013 If it points to this section and has been removed,
8014 NULLify it.
8015 Write it back. */
8016
8017 irel = &internal_relocs[i];
8018 source_offset = irel->r_offset;
8019 old_source_offset = source_offset;
8020
8021 r_type = ELF32_R_TYPE (irel->r_info);
8022 r_reloc_init (&r_rel, abfd, irel, contents,
8023 bfd_get_section_limit (abfd, sec));
8024
8025 /* If this section could have changed then we may need to
8026 change the relocation's offset. */
8027
8028 if (relax_info->is_relaxable_literal_section
8029 || relax_info->is_relaxable_asm_section)
8030 {
8031 if (r_type != R_XTENSA_NONE
8032 && find_removed_literal (&relax_info->removed_list,
8033 irel->r_offset))
8034 {
8035 /* Remove this relocation. */
8036 if (elf_hash_table (link_info)->dynamic_sections_created)
8037 shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
8038 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
8039 irel->r_offset = offset_with_removed_text
8040 (&relax_info->action_list, irel->r_offset);
8041 pin_internal_relocs (sec, internal_relocs);
8042 continue;
8043 }
8044
8045 if (r_type == R_XTENSA_ASM_SIMPLIFY)
8046 {
8047 text_action *action =
8048 find_insn_action (&relax_info->action_list,
8049 irel->r_offset);
8050 if (action && (action->action == ta_convert_longcall
8051 || action->action == ta_remove_longcall))
8052 {
8053 bfd_reloc_status_type retval;
8054 char *error_message = NULL;
8055
8056 retval = contract_asm_expansion (contents, sec_size,
8057 irel, &error_message);
8058 if (retval != bfd_reloc_ok)
8059 {
8060 (*link_info->callbacks->reloc_dangerous)
8061 (link_info, error_message, abfd, sec,
8062 irel->r_offset);
8063 goto error_return;
8064 }
8065 /* Update the action so that the code that moves
8066 the contents will do the right thing. */
8067 if (action->action == ta_remove_longcall)
8068 action->action = ta_remove_insn;
8069 else
8070 action->action = ta_none;
8071 /* Refresh the info in the r_rel. */
8072 r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
8073 r_type = ELF32_R_TYPE (irel->r_info);
8074 }
8075 }
8076
8077 source_offset = offset_with_removed_text
8078 (&relax_info->action_list, irel->r_offset);
8079 irel->r_offset = source_offset;
8080 }
8081
8082 /* If the target section could have changed then
8083 we may need to change the relocation's target offset. */
8084
8085 target_sec = r_reloc_get_section (&r_rel);
8086 target_relax_info = get_xtensa_relax_info (target_sec);
8087
8088 if (target_relax_info
8089 && (target_relax_info->is_relaxable_literal_section
8090 || target_relax_info->is_relaxable_asm_section))
8091 {
8092 r_reloc new_reloc;
8093 reloc_bfd_fix *fix;
8094 bfd_vma addend_displacement;
8095
8096 translate_reloc (&r_rel, &new_reloc);
8097
8098 if (r_type == R_XTENSA_DIFF8
8099 || r_type == R_XTENSA_DIFF16
8100 || r_type == R_XTENSA_DIFF32)
8101 {
8102 bfd_vma diff_value = 0, new_end_offset, diff_mask = 0;
8103
8104 if (bfd_get_section_limit (abfd, sec) < old_source_offset)
8105 {
8106 (*link_info->callbacks->reloc_dangerous)
8107 (link_info, _("invalid relocation address"),
8108 abfd, sec, old_source_offset);
8109 goto error_return;
8110 }
8111
8112 switch (r_type)
8113 {
8114 case R_XTENSA_DIFF8:
8115 diff_value =
8116 bfd_get_8 (abfd, &contents[old_source_offset]);
8117 break;
8118 case R_XTENSA_DIFF16:
8119 diff_value =
8120 bfd_get_16 (abfd, &contents[old_source_offset]);
8121 break;
8122 case R_XTENSA_DIFF32:
8123 diff_value =
8124 bfd_get_32 (abfd, &contents[old_source_offset]);
8125 break;
8126 }
8127
8128 new_end_offset = offset_with_removed_text
8129 (&target_relax_info->action_list,
8130 r_rel.target_offset + diff_value);
8131 diff_value = new_end_offset - new_reloc.target_offset;
8132
8133 switch (r_type)
8134 {
8135 case R_XTENSA_DIFF8:
8136 diff_mask = 0xff;
8137 bfd_put_8 (abfd, diff_value,
8138 &contents[old_source_offset]);
8139 break;
8140 case R_XTENSA_DIFF16:
8141 diff_mask = 0xffff;
8142 bfd_put_16 (abfd, diff_value,
8143 &contents[old_source_offset]);
8144 break;
8145 case R_XTENSA_DIFF32:
8146 diff_mask = 0xffffffff;
8147 bfd_put_32 (abfd, diff_value,
8148 &contents[old_source_offset]);
8149 break;
8150 }
8151
8152 /* Check for overflow. */
8153 if ((diff_value & ~diff_mask) != 0)
8154 {
8155 (*link_info->callbacks->reloc_dangerous)
8156 (link_info, _("overflow after relaxation"),
8157 abfd, sec, old_source_offset);
8158 goto error_return;
8159 }
8160
8161 pin_contents (sec, contents);
8162 }
8163
8164 /* FIXME: If the relocation still references a section in
8165 the same input file, the relocation should be modified
8166 directly instead of adding a "fix" record. */
8167
8168 addend_displacement =
8169 new_reloc.target_offset + new_reloc.virtual_offset;
8170
8171 fix = reloc_bfd_fix_init (sec, source_offset, r_type, 0,
8172 r_reloc_get_section (&new_reloc),
8173 addend_displacement, TRUE);
8174 add_fix (sec, fix);
8175 }
8176
8177 pin_internal_relocs (sec, internal_relocs);
8178 }
8179 }
8180
8181 if ((relax_info->is_relaxable_literal_section
8182 || relax_info->is_relaxable_asm_section)
8183 && relax_info->action_list.head)
8184 {
8185 /* Walk through the planned actions and build up a table
8186 of move, copy and fill records. Use the move, copy and
8187 fill records to perform the actions once. */
8188
8189 bfd_size_type size = sec->size;
8190 int removed = 0;
8191 bfd_size_type final_size, copy_size, orig_insn_size;
8192 bfd_byte *scratch = NULL;
8193 bfd_byte *dup_contents = NULL;
8194 bfd_size_type orig_size = size;
8195 bfd_vma orig_dot = 0;
8196 bfd_vma orig_dot_copied = 0; /* Byte copied already from
8197 orig dot in physical memory. */
8198 bfd_vma orig_dot_vo = 0; /* Virtual offset from orig_dot. */
8199 bfd_vma dup_dot = 0;
8200
8201 text_action *action = relax_info->action_list.head;
8202
8203 final_size = sec->size;
8204 for (action = relax_info->action_list.head; action;
8205 action = action->next)
8206 {
8207 final_size -= action->removed_bytes;
8208 }
8209
8210 scratch = (bfd_byte *) bfd_zmalloc (final_size);
8211 dup_contents = (bfd_byte *) bfd_zmalloc (final_size);
8212
8213 /* The dot is the current fill location. */
8214#if DEBUG
8215 print_action_list (stderr, &relax_info->action_list);
8216#endif
8217
8218 for (action = relax_info->action_list.head; action;
8219 action = action->next)
8220 {
8221 virtual_action = FALSE;
8222 if (action->offset > orig_dot)
8223 {
8224 orig_dot += orig_dot_copied;
8225 orig_dot_copied = 0;
8226 orig_dot_vo = 0;
8227 /* Out of the virtual world. */
8228 }
8229
8230 if (action->offset > orig_dot)
8231 {
8232 copy_size = action->offset - orig_dot;
8233 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
8234 orig_dot += copy_size;
8235 dup_dot += copy_size;
8236 BFD_ASSERT (action->offset == orig_dot);
8237 }
8238 else if (action->offset < orig_dot)
8239 {
8240 if (action->action == ta_fill
8241 && action->offset - action->removed_bytes == orig_dot)
8242 {
8243 /* This is OK because the fill only effects the dup_dot. */
8244 }
8245 else if (action->action == ta_add_literal)
8246 {
8247 /* TBD. Might need to handle this. */
8248 }
8249 }
8250 if (action->offset == orig_dot)
8251 {
8252 if (action->virtual_offset > orig_dot_vo)
8253 {
8254 if (orig_dot_vo == 0)
8255 {
8256 /* Need to copy virtual_offset bytes. Probably four. */
8257 copy_size = action->virtual_offset - orig_dot_vo;
8258 memmove (&dup_contents[dup_dot],
8259 &contents[orig_dot], copy_size);
8260 orig_dot_copied = copy_size;
8261 dup_dot += copy_size;
8262 }
8263 virtual_action = TRUE;
8264 }
8265 else
8266 BFD_ASSERT (action->virtual_offset <= orig_dot_vo);
8267 }
8268 switch (action->action)
8269 {
8270 case ta_remove_literal:
8271 case ta_remove_insn:
8272 BFD_ASSERT (action->removed_bytes >= 0);
8273 orig_dot += action->removed_bytes;
8274 break;
8275
8276 case ta_narrow_insn:
8277 orig_insn_size = 3;
8278 copy_size = 2;
8279 memmove (scratch, &contents[orig_dot], orig_insn_size);
8280 BFD_ASSERT (action->removed_bytes == 1);
64b607e6 8281 rv = narrow_instruction (scratch, final_size, 0);
43cd72b9
BW
8282 BFD_ASSERT (rv);
8283 memmove (&dup_contents[dup_dot], scratch, copy_size);
8284 orig_dot += orig_insn_size;
8285 dup_dot += copy_size;
8286 break;
8287
8288 case ta_fill:
8289 if (action->removed_bytes >= 0)
8290 orig_dot += action->removed_bytes;
8291 else
8292 {
8293 /* Already zeroed in dup_contents. Just bump the
8294 counters. */
8295 dup_dot += (-action->removed_bytes);
8296 }
8297 break;
8298
8299 case ta_none:
8300 BFD_ASSERT (action->removed_bytes == 0);
8301 break;
8302
8303 case ta_convert_longcall:
8304 case ta_remove_longcall:
8305 /* These will be removed or converted before we get here. */
8306 BFD_ASSERT (0);
8307 break;
8308
8309 case ta_widen_insn:
8310 orig_insn_size = 2;
8311 copy_size = 3;
8312 memmove (scratch, &contents[orig_dot], orig_insn_size);
8313 BFD_ASSERT (action->removed_bytes == -1);
64b607e6 8314 rv = widen_instruction (scratch, final_size, 0);
43cd72b9
BW
8315 BFD_ASSERT (rv);
8316 memmove (&dup_contents[dup_dot], scratch, copy_size);
8317 orig_dot += orig_insn_size;
8318 dup_dot += copy_size;
8319 break;
8320
8321 case ta_add_literal:
8322 orig_insn_size = 0;
8323 copy_size = 4;
8324 BFD_ASSERT (action->removed_bytes == -4);
8325 /* TBD -- place the literal value here and insert
8326 into the table. */
8327 memset (&dup_contents[dup_dot], 0, 4);
8328 pin_internal_relocs (sec, internal_relocs);
8329 pin_contents (sec, contents);
8330
8331 if (!move_literal (abfd, link_info, sec, dup_dot, dup_contents,
8332 relax_info, &internal_relocs, &action->value))
8333 goto error_return;
8334
8335 if (virtual_action)
8336 orig_dot_vo += copy_size;
8337
8338 orig_dot += orig_insn_size;
8339 dup_dot += copy_size;
8340 break;
8341
8342 default:
8343 /* Not implemented yet. */
8344 BFD_ASSERT (0);
8345 break;
8346 }
8347
8348 size -= action->removed_bytes;
8349 removed += action->removed_bytes;
8350 BFD_ASSERT (dup_dot <= final_size);
8351 BFD_ASSERT (orig_dot <= orig_size);
8352 }
8353
8354 orig_dot += orig_dot_copied;
8355 orig_dot_copied = 0;
8356
8357 if (orig_dot != orig_size)
8358 {
8359 copy_size = orig_size - orig_dot;
8360 BFD_ASSERT (orig_size > orig_dot);
8361 BFD_ASSERT (dup_dot + copy_size == final_size);
8362 memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
8363 orig_dot += copy_size;
8364 dup_dot += copy_size;
8365 }
8366 BFD_ASSERT (orig_size == orig_dot);
8367 BFD_ASSERT (final_size == dup_dot);
8368
8369 /* Move the dup_contents back. */
8370 if (final_size > orig_size)
8371 {
8372 /* Contents need to be reallocated. Swap the dup_contents into
8373 contents. */
8374 sec->contents = dup_contents;
8375 free (contents);
8376 contents = dup_contents;
8377 pin_contents (sec, contents);
8378 }
8379 else
8380 {
8381 BFD_ASSERT (final_size <= orig_size);
8382 memset (contents, 0, orig_size);
8383 memcpy (contents, dup_contents, final_size);
8384 free (dup_contents);
8385 }
8386 free (scratch);
8387 pin_contents (sec, contents);
8388
8389 sec->size = final_size;
8390 }
8391
8392 error_return:
8393 release_internal_relocs (sec, internal_relocs);
8394 release_contents (sec, contents);
8395 return ok;
8396}
8397
8398
8399static bfd_boolean
7fa3d080 8400translate_section_fixes (asection *sec)
43cd72b9
BW
8401{
8402 xtensa_relax_info *relax_info;
8403 reloc_bfd_fix *r;
8404
8405 relax_info = get_xtensa_relax_info (sec);
8406 if (!relax_info)
8407 return TRUE;
8408
8409 for (r = relax_info->fix_list; r != NULL; r = r->next)
8410 if (!translate_reloc_bfd_fix (r))
8411 return FALSE;
e0001a05 8412
43cd72b9
BW
8413 return TRUE;
8414}
e0001a05 8415
e0001a05 8416
43cd72b9
BW
8417/* Translate a fix given the mapping in the relax info for the target
8418 section. If it has already been translated, no work is required. */
e0001a05 8419
43cd72b9 8420static bfd_boolean
7fa3d080 8421translate_reloc_bfd_fix (reloc_bfd_fix *fix)
43cd72b9
BW
8422{
8423 reloc_bfd_fix new_fix;
8424 asection *sec;
8425 xtensa_relax_info *relax_info;
8426 removed_literal *removed;
8427 bfd_vma new_offset, target_offset;
e0001a05 8428
43cd72b9
BW
8429 if (fix->translated)
8430 return TRUE;
e0001a05 8431
43cd72b9
BW
8432 sec = fix->target_sec;
8433 target_offset = fix->target_offset;
e0001a05 8434
43cd72b9
BW
8435 relax_info = get_xtensa_relax_info (sec);
8436 if (!relax_info)
8437 {
8438 fix->translated = TRUE;
8439 return TRUE;
8440 }
e0001a05 8441
43cd72b9 8442 new_fix = *fix;
e0001a05 8443
43cd72b9
BW
8444 /* The fix does not need to be translated if the section cannot change. */
8445 if (!relax_info->is_relaxable_literal_section
8446 && !relax_info->is_relaxable_asm_section)
8447 {
8448 fix->translated = TRUE;
8449 return TRUE;
8450 }
e0001a05 8451
43cd72b9
BW
8452 /* If the literal has been moved and this relocation was on an
8453 opcode, then the relocation should move to the new literal
8454 location. Otherwise, the relocation should move within the
8455 section. */
8456
8457 removed = FALSE;
8458 if (is_operand_relocation (fix->src_type))
8459 {
8460 /* Check if the original relocation is against a literal being
8461 removed. */
8462 removed = find_removed_literal (&relax_info->removed_list,
8463 target_offset);
e0001a05
NC
8464 }
8465
43cd72b9 8466 if (removed)
e0001a05 8467 {
43cd72b9 8468 asection *new_sec;
e0001a05 8469
43cd72b9
BW
8470 /* The fact that there is still a relocation to this literal indicates
8471 that the literal is being coalesced, not simply removed. */
8472 BFD_ASSERT (removed->to.abfd != NULL);
e0001a05 8473
43cd72b9
BW
8474 /* This was moved to some other address (possibly another section). */
8475 new_sec = r_reloc_get_section (&removed->to);
8476 if (new_sec != sec)
e0001a05 8477 {
43cd72b9
BW
8478 sec = new_sec;
8479 relax_info = get_xtensa_relax_info (sec);
8480 if (!relax_info ||
8481 (!relax_info->is_relaxable_literal_section
8482 && !relax_info->is_relaxable_asm_section))
e0001a05 8483 {
43cd72b9
BW
8484 target_offset = removed->to.target_offset;
8485 new_fix.target_sec = new_sec;
8486 new_fix.target_offset = target_offset;
8487 new_fix.translated = TRUE;
8488 *fix = new_fix;
8489 return TRUE;
e0001a05 8490 }
e0001a05 8491 }
43cd72b9
BW
8492 target_offset = removed->to.target_offset;
8493 new_fix.target_sec = new_sec;
e0001a05 8494 }
43cd72b9
BW
8495
8496 /* The target address may have been moved within its section. */
8497 new_offset = offset_with_removed_text (&relax_info->action_list,
8498 target_offset);
8499
8500 new_fix.target_offset = new_offset;
8501 new_fix.target_offset = new_offset;
8502 new_fix.translated = TRUE;
8503 *fix = new_fix;
8504 return TRUE;
e0001a05
NC
8505}
8506
8507
8508/* Fix up a relocation to take account of removed literals. */
8509
8510static void
7fa3d080 8511translate_reloc (const r_reloc *orig_rel, r_reloc *new_rel)
e0001a05
NC
8512{
8513 asection *sec;
8514 xtensa_relax_info *relax_info;
8515 removed_literal *removed;
43cd72b9 8516 bfd_vma new_offset, target_offset, removed_bytes;
e0001a05
NC
8517
8518 *new_rel = *orig_rel;
8519
8520 if (!r_reloc_is_defined (orig_rel))
8521 return;
8522 sec = r_reloc_get_section (orig_rel);
8523
8524 relax_info = get_xtensa_relax_info (sec);
8525 BFD_ASSERT (relax_info);
8526
43cd72b9
BW
8527 if (!relax_info->is_relaxable_literal_section
8528 && !relax_info->is_relaxable_asm_section)
e0001a05
NC
8529 return;
8530
43cd72b9
BW
8531 target_offset = orig_rel->target_offset;
8532
8533 removed = FALSE;
8534 if (is_operand_relocation (ELF32_R_TYPE (orig_rel->rela.r_info)))
8535 {
8536 /* Check if the original relocation is against a literal being
8537 removed. */
8538 removed = find_removed_literal (&relax_info->removed_list,
8539 target_offset);
8540 }
8541 if (removed && removed->to.abfd)
e0001a05
NC
8542 {
8543 asection *new_sec;
8544
8545 /* The fact that there is still a relocation to this literal indicates
8546 that the literal is being coalesced, not simply removed. */
8547 BFD_ASSERT (removed->to.abfd != NULL);
8548
43cd72b9
BW
8549 /* This was moved to some other address
8550 (possibly in another section). */
e0001a05
NC
8551 *new_rel = removed->to;
8552 new_sec = r_reloc_get_section (new_rel);
43cd72b9 8553 if (new_sec != sec)
e0001a05
NC
8554 {
8555 sec = new_sec;
8556 relax_info = get_xtensa_relax_info (sec);
43cd72b9
BW
8557 if (!relax_info
8558 || (!relax_info->is_relaxable_literal_section
8559 && !relax_info->is_relaxable_asm_section))
e0001a05
NC
8560 return;
8561 }
43cd72b9 8562 target_offset = new_rel->target_offset;
e0001a05
NC
8563 }
8564
8565 /* ...and the target address may have been moved within its section. */
43cd72b9
BW
8566 new_offset = offset_with_removed_text (&relax_info->action_list,
8567 target_offset);
e0001a05
NC
8568
8569 /* Modify the offset and addend. */
43cd72b9 8570 removed_bytes = target_offset - new_offset;
e0001a05 8571 new_rel->target_offset = new_offset;
43cd72b9 8572 new_rel->rela.r_addend -= removed_bytes;
e0001a05
NC
8573}
8574
8575
8576/* For dynamic links, there may be a dynamic relocation for each
8577 literal. The number of dynamic relocations must be computed in
8578 size_dynamic_sections, which occurs before relaxation. When a
8579 literal is removed, this function checks if there is a corresponding
8580 dynamic relocation and shrinks the size of the appropriate dynamic
8581 relocation section accordingly. At this point, the contents of the
8582 dynamic relocation sections have not yet been filled in, so there's
8583 nothing else that needs to be done. */
8584
8585static void
7fa3d080
BW
8586shrink_dynamic_reloc_sections (struct bfd_link_info *info,
8587 bfd *abfd,
8588 asection *input_section,
8589 Elf_Internal_Rela *rel)
e0001a05
NC
8590{
8591 Elf_Internal_Shdr *symtab_hdr;
8592 struct elf_link_hash_entry **sym_hashes;
8593 unsigned long r_symndx;
8594 int r_type;
8595 struct elf_link_hash_entry *h;
8596 bfd_boolean dynamic_symbol;
8597
8598 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8599 sym_hashes = elf_sym_hashes (abfd);
8600
8601 r_type = ELF32_R_TYPE (rel->r_info);
8602 r_symndx = ELF32_R_SYM (rel->r_info);
8603
8604 if (r_symndx < symtab_hdr->sh_info)
8605 h = NULL;
8606 else
8607 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8608
571b5725 8609 dynamic_symbol = xtensa_elf_dynamic_symbol_p (h, info);
e0001a05
NC
8610
8611 if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
8612 && (input_section->flags & SEC_ALLOC) != 0
8613 && (dynamic_symbol || info->shared))
8614 {
8615 bfd *dynobj;
8616 const char *srel_name;
8617 asection *srel;
8618 bfd_boolean is_plt = FALSE;
8619
8620 dynobj = elf_hash_table (info)->dynobj;
8621 BFD_ASSERT (dynobj != NULL);
8622
8623 if (dynamic_symbol && r_type == R_XTENSA_PLT)
8624 {
8625 srel_name = ".rela.plt";
8626 is_plt = TRUE;
8627 }
8628 else
8629 srel_name = ".rela.got";
8630
8631 /* Reduce size of the .rela.* section by one reloc. */
8632 srel = bfd_get_section_by_name (dynobj, srel_name);
8633 BFD_ASSERT (srel != NULL);
eea6121a
AM
8634 BFD_ASSERT (srel->size >= sizeof (Elf32_External_Rela));
8635 srel->size -= sizeof (Elf32_External_Rela);
e0001a05
NC
8636
8637 if (is_plt)
8638 {
8639 asection *splt, *sgotplt, *srelgot;
8640 int reloc_index, chunk;
8641
8642 /* Find the PLT reloc index of the entry being removed. This
8643 is computed from the size of ".rela.plt". It is needed to
8644 figure out which PLT chunk to resize. Usually "last index
8645 = size - 1" since the index starts at zero, but in this
8646 context, the size has just been decremented so there's no
8647 need to subtract one. */
eea6121a 8648 reloc_index = srel->size / sizeof (Elf32_External_Rela);
e0001a05
NC
8649
8650 chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
8651 splt = elf_xtensa_get_plt_section (dynobj, chunk);
8652 sgotplt = elf_xtensa_get_gotplt_section (dynobj, chunk);
8653 BFD_ASSERT (splt != NULL && sgotplt != NULL);
8654
8655 /* Check if an entire PLT chunk has just been eliminated. */
8656 if (reloc_index % PLT_ENTRIES_PER_CHUNK == 0)
8657 {
8658 /* The two magic GOT entries for that chunk can go away. */
8659 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
8660 BFD_ASSERT (srelgot != NULL);
8661 srelgot->reloc_count -= 2;
eea6121a
AM
8662 srelgot->size -= 2 * sizeof (Elf32_External_Rela);
8663 sgotplt->size -= 8;
e0001a05
NC
8664
8665 /* There should be only one entry left (and it will be
8666 removed below). */
eea6121a
AM
8667 BFD_ASSERT (sgotplt->size == 4);
8668 BFD_ASSERT (splt->size == PLT_ENTRY_SIZE);
e0001a05
NC
8669 }
8670
eea6121a
AM
8671 BFD_ASSERT (sgotplt->size >= 4);
8672 BFD_ASSERT (splt->size >= PLT_ENTRY_SIZE);
e0001a05 8673
eea6121a
AM
8674 sgotplt->size -= 4;
8675 splt->size -= PLT_ENTRY_SIZE;
e0001a05
NC
8676 }
8677 }
8678}
8679
8680
43cd72b9
BW
8681/* Take an r_rel and move it to another section. This usually
8682 requires extending the interal_relocation array and pinning it. If
8683 the original r_rel is from the same BFD, we can complete this here.
8684 Otherwise, we add a fix record to let the final link fix the
8685 appropriate address. Contents and internal relocations for the
8686 section must be pinned after calling this routine. */
8687
8688static bfd_boolean
7fa3d080
BW
8689move_literal (bfd *abfd,
8690 struct bfd_link_info *link_info,
8691 asection *sec,
8692 bfd_vma offset,
8693 bfd_byte *contents,
8694 xtensa_relax_info *relax_info,
8695 Elf_Internal_Rela **internal_relocs_p,
8696 const literal_value *lit)
43cd72b9
BW
8697{
8698 Elf_Internal_Rela *new_relocs = NULL;
8699 size_t new_relocs_count = 0;
8700 Elf_Internal_Rela this_rela;
8701 const r_reloc *r_rel;
8702
8703 r_rel = &lit->r_rel;
8704 BFD_ASSERT (elf_section_data (sec)->relocs == *internal_relocs_p);
8705
8706 if (r_reloc_is_const (r_rel))
8707 bfd_put_32 (abfd, lit->value, contents + offset);
8708 else
8709 {
8710 int r_type;
8711 unsigned i;
8712 asection *target_sec;
8713 reloc_bfd_fix *fix;
8714 unsigned insert_at;
8715
8716 r_type = ELF32_R_TYPE (r_rel->rela.r_info);
8717 target_sec = r_reloc_get_section (r_rel);
8718
8719 /* This is the difficult case. We have to create a fix up. */
8720 this_rela.r_offset = offset;
8721 this_rela.r_info = ELF32_R_INFO (0, r_type);
8722 this_rela.r_addend =
8723 r_rel->target_offset - r_reloc_get_target_offset (r_rel);
8724 bfd_put_32 (abfd, lit->value, contents + offset);
8725
8726 /* Currently, we cannot move relocations during a relocatable link. */
8727 BFD_ASSERT (!link_info->relocatable);
8728 fix = reloc_bfd_fix_init (sec, offset, r_type, r_rel->abfd,
8729 r_reloc_get_section (r_rel),
8730 r_rel->target_offset + r_rel->virtual_offset,
8731 FALSE);
8732 /* We also need to mark that relocations are needed here. */
8733 sec->flags |= SEC_RELOC;
8734
8735 translate_reloc_bfd_fix (fix);
8736 /* This fix has not yet been translated. */
8737 add_fix (sec, fix);
8738
8739 /* Add the relocation. If we have already allocated our own
8740 space for the relocations and we have room for more, then use
8741 it. Otherwise, allocate new space and move the literals. */
8742 insert_at = sec->reloc_count;
8743 for (i = 0; i < sec->reloc_count; ++i)
8744 {
8745 if (this_rela.r_offset < (*internal_relocs_p)[i].r_offset)
8746 {
8747 insert_at = i;
8748 break;
8749 }
8750 }
8751
8752 if (*internal_relocs_p != relax_info->allocated_relocs
8753 || sec->reloc_count + 1 > relax_info->allocated_relocs_count)
8754 {
8755 BFD_ASSERT (relax_info->allocated_relocs == NULL
8756 || sec->reloc_count == relax_info->relocs_count);
8757
8758 if (relax_info->allocated_relocs_count == 0)
8759 new_relocs_count = (sec->reloc_count + 2) * 2;
8760 else
8761 new_relocs_count = (relax_info->allocated_relocs_count + 2) * 2;
8762
8763 new_relocs = (Elf_Internal_Rela *)
8764 bfd_zmalloc (sizeof (Elf_Internal_Rela) * (new_relocs_count));
8765 if (!new_relocs)
8766 return FALSE;
8767
8768 /* We could handle this more quickly by finding the split point. */
8769 if (insert_at != 0)
8770 memcpy (new_relocs, *internal_relocs_p,
8771 insert_at * sizeof (Elf_Internal_Rela));
8772
8773 new_relocs[insert_at] = this_rela;
8774
8775 if (insert_at != sec->reloc_count)
8776 memcpy (new_relocs + insert_at + 1,
8777 (*internal_relocs_p) + insert_at,
8778 (sec->reloc_count - insert_at)
8779 * sizeof (Elf_Internal_Rela));
8780
8781 if (*internal_relocs_p != relax_info->allocated_relocs)
8782 {
8783 /* The first time we re-allocate, we can only free the
8784 old relocs if they were allocated with bfd_malloc.
8785 This is not true when keep_memory is in effect. */
8786 if (!link_info->keep_memory)
8787 free (*internal_relocs_p);
8788 }
8789 else
8790 free (*internal_relocs_p);
8791 relax_info->allocated_relocs = new_relocs;
8792 relax_info->allocated_relocs_count = new_relocs_count;
8793 elf_section_data (sec)->relocs = new_relocs;
8794 sec->reloc_count++;
8795 relax_info->relocs_count = sec->reloc_count;
8796 *internal_relocs_p = new_relocs;
8797 }
8798 else
8799 {
8800 if (insert_at != sec->reloc_count)
8801 {
8802 unsigned idx;
8803 for (idx = sec->reloc_count; idx > insert_at; idx--)
8804 (*internal_relocs_p)[idx] = (*internal_relocs_p)[idx-1];
8805 }
8806 (*internal_relocs_p)[insert_at] = this_rela;
8807 sec->reloc_count++;
8808 if (relax_info->allocated_relocs)
8809 relax_info->relocs_count = sec->reloc_count;
8810 }
8811 }
8812 return TRUE;
8813}
8814
8815
e0001a05
NC
8816/* This is similar to relax_section except that when a target is moved,
8817 we shift addresses up. We also need to modify the size. This
8818 algorithm does NOT allow for relocations into the middle of the
8819 property sections. */
8820
43cd72b9 8821static bfd_boolean
7fa3d080
BW
8822relax_property_section (bfd *abfd,
8823 asection *sec,
8824 struct bfd_link_info *link_info)
e0001a05
NC
8825{
8826 Elf_Internal_Rela *internal_relocs;
8827 bfd_byte *contents;
8828 unsigned i, nexti;
8829 bfd_boolean ok = TRUE;
43cd72b9
BW
8830 bfd_boolean is_full_prop_section;
8831 size_t last_zfill_target_offset = 0;
8832 asection *last_zfill_target_sec = NULL;
8833 bfd_size_type sec_size;
e0001a05 8834
43cd72b9 8835 sec_size = bfd_get_section_limit (abfd, sec);
e0001a05
NC
8836 internal_relocs = retrieve_internal_relocs (abfd, sec,
8837 link_info->keep_memory);
8838 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
43cd72b9 8839 if (contents == NULL && sec_size != 0)
e0001a05
NC
8840 {
8841 ok = FALSE;
8842 goto error_return;
8843 }
8844
43cd72b9 8845 is_full_prop_section =
0112cd26
NC
8846 ( CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME)
8847 || CONST_STRNEQ (sec->name, ".gnu.linkonce.prop."));
43cd72b9
BW
8848
8849 if (internal_relocs)
e0001a05 8850 {
43cd72b9 8851 for (i = 0; i < sec->reloc_count; i++)
e0001a05
NC
8852 {
8853 Elf_Internal_Rela *irel;
8854 xtensa_relax_info *target_relax_info;
e0001a05
NC
8855 unsigned r_type;
8856 asection *target_sec;
43cd72b9
BW
8857 literal_value val;
8858 bfd_byte *size_p, *flags_p;
e0001a05
NC
8859
8860 /* Locally change the source address.
8861 Translate the target to the new target address.
8862 If it points to this section and has been removed, MOVE IT.
8863 Also, don't forget to modify the associated SIZE at
8864 (offset + 4). */
8865
8866 irel = &internal_relocs[i];
8867 r_type = ELF32_R_TYPE (irel->r_info);
8868 if (r_type == R_XTENSA_NONE)
8869 continue;
8870
43cd72b9
BW
8871 /* Find the literal value. */
8872 r_reloc_init (&val.r_rel, abfd, irel, contents, sec_size);
8873 size_p = &contents[irel->r_offset + 4];
8874 flags_p = NULL;
8875 if (is_full_prop_section)
8876 {
8877 flags_p = &contents[irel->r_offset + 8];
8878 BFD_ASSERT (irel->r_offset + 12 <= sec_size);
8879 }
8880 else
8881 BFD_ASSERT (irel->r_offset + 8 <= sec_size);
e0001a05 8882
43cd72b9 8883 target_sec = r_reloc_get_section (&val.r_rel);
e0001a05
NC
8884 target_relax_info = get_xtensa_relax_info (target_sec);
8885
8886 if (target_relax_info
43cd72b9
BW
8887 && (target_relax_info->is_relaxable_literal_section
8888 || target_relax_info->is_relaxable_asm_section ))
e0001a05
NC
8889 {
8890 /* Translate the relocation's destination. */
43cd72b9 8891 bfd_vma new_offset, new_end_offset;
e0001a05
NC
8892 long old_size, new_size;
8893
43cd72b9
BW
8894 new_offset = offset_with_removed_text
8895 (&target_relax_info->action_list, val.r_rel.target_offset);
e0001a05
NC
8896
8897 /* Assert that we are not out of bounds. */
43cd72b9
BW
8898 old_size = bfd_get_32 (abfd, size_p);
8899
8900 if (old_size == 0)
8901 {
8902 /* Only the first zero-sized unreachable entry is
8903 allowed to expand. In this case the new offset
8904 should be the offset before the fill and the new
8905 size is the expansion size. For other zero-sized
8906 entries the resulting size should be zero with an
8907 offset before or after the fill address depending
8908 on whether the expanding unreachable entry
8909 preceeds it. */
8910 if (last_zfill_target_sec
8911 && last_zfill_target_sec == target_sec
8912 && last_zfill_target_offset == val.r_rel.target_offset)
8913 new_end_offset = new_offset;
8914 else
8915 {
8916 new_end_offset = new_offset;
8917 new_offset = offset_with_removed_text_before_fill
8918 (&target_relax_info->action_list,
8919 val.r_rel.target_offset);
8920
8921 /* If it is not unreachable and we have not yet
8922 seen an unreachable at this address, place it
8923 before the fill address. */
8924 if (!flags_p
8925 || (bfd_get_32 (abfd, flags_p)
8926 & XTENSA_PROP_UNREACHABLE) == 0)
8927 new_end_offset = new_offset;
8928 else
8929 {
8930 last_zfill_target_sec = target_sec;
8931 last_zfill_target_offset = val.r_rel.target_offset;
8932 }
8933 }
8934 }
8935 else
8936 {
8937 new_end_offset = offset_with_removed_text_before_fill
8938 (&target_relax_info->action_list,
8939 val.r_rel.target_offset + old_size);
8940 }
e0001a05 8941
e0001a05 8942 new_size = new_end_offset - new_offset;
43cd72b9 8943
e0001a05
NC
8944 if (new_size != old_size)
8945 {
8946 bfd_put_32 (abfd, new_size, size_p);
8947 pin_contents (sec, contents);
8948 }
43cd72b9
BW
8949
8950 if (new_offset != val.r_rel.target_offset)
e0001a05 8951 {
43cd72b9 8952 bfd_vma diff = new_offset - val.r_rel.target_offset;
e0001a05
NC
8953 irel->r_addend += diff;
8954 pin_internal_relocs (sec, internal_relocs);
8955 }
8956 }
8957 }
8958 }
8959
8960 /* Combine adjacent property table entries. This is also done in
8961 finish_dynamic_sections() but at that point it's too late to
8962 reclaim the space in the output section, so we do this twice. */
8963
43cd72b9
BW
8964 if (internal_relocs && (!link_info->relocatable
8965 || strcmp (sec->name, XTENSA_LIT_SEC_NAME) == 0))
e0001a05
NC
8966 {
8967 Elf_Internal_Rela *last_irel = NULL;
8968 int removed_bytes = 0;
8969 bfd_vma offset, last_irel_offset;
8970 bfd_vma section_size;
43cd72b9
BW
8971 bfd_size_type entry_size;
8972 flagword predef_flags;
8973
8974 if (is_full_prop_section)
8975 entry_size = 12;
8976 else
8977 entry_size = 8;
8978
8979 predef_flags = xtensa_get_property_predef_flags (sec);
e0001a05
NC
8980
8981 /* Walk over memory and irels at the same time.
8982 This REQUIRES that the internal_relocs be sorted by offset. */
8983 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
8984 internal_reloc_compare);
8985 nexti = 0; /* Index into internal_relocs. */
8986
8987 pin_internal_relocs (sec, internal_relocs);
8988 pin_contents (sec, contents);
8989
8990 last_irel_offset = (bfd_vma) -1;
eea6121a 8991 section_size = sec->size;
43cd72b9 8992 BFD_ASSERT (section_size % entry_size == 0);
e0001a05 8993
43cd72b9 8994 for (offset = 0; offset < section_size; offset += entry_size)
e0001a05
NC
8995 {
8996 Elf_Internal_Rela *irel, *next_irel;
8997 bfd_vma bytes_to_remove, size, actual_offset;
8998 bfd_boolean remove_this_irel;
43cd72b9 8999 flagword flags;
e0001a05
NC
9000
9001 irel = NULL;
9002 next_irel = NULL;
9003
9004 /* Find the next two relocations (if there are that many left),
9005 skipping over any R_XTENSA_NONE relocs. On entry, "nexti" is
9006 the starting reloc index. After these two loops, "i"
9007 is the index of the first non-NONE reloc past that starting
9008 index, and "nexti" is the index for the next non-NONE reloc
9009 after "i". */
9010
9011 for (i = nexti; i < sec->reloc_count; i++)
9012 {
9013 if (ELF32_R_TYPE (internal_relocs[i].r_info) != R_XTENSA_NONE)
9014 {
9015 irel = &internal_relocs[i];
9016 break;
9017 }
9018 internal_relocs[i].r_offset -= removed_bytes;
9019 }
9020
9021 for (nexti = i + 1; nexti < sec->reloc_count; nexti++)
9022 {
9023 if (ELF32_R_TYPE (internal_relocs[nexti].r_info)
9024 != R_XTENSA_NONE)
9025 {
9026 next_irel = &internal_relocs[nexti];
9027 break;
9028 }
9029 internal_relocs[nexti].r_offset -= removed_bytes;
9030 }
9031
9032 remove_this_irel = FALSE;
9033 bytes_to_remove = 0;
9034 actual_offset = offset - removed_bytes;
9035 size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
9036
43cd72b9
BW
9037 if (is_full_prop_section)
9038 flags = bfd_get_32 (abfd, &contents[actual_offset + 8]);
9039 else
9040 flags = predef_flags;
9041
e0001a05
NC
9042 /* Check that the irels are sorted by offset,
9043 with only one per address. */
9044 BFD_ASSERT (!irel || (int) irel->r_offset > (int) last_irel_offset);
9045 BFD_ASSERT (!next_irel || next_irel->r_offset > irel->r_offset);
9046
43cd72b9
BW
9047 /* Make sure there aren't relocs on the size or flag fields. */
9048 if ((irel && irel->r_offset == offset + 4)
9049 || (is_full_prop_section
9050 && irel && irel->r_offset == offset + 8))
e0001a05
NC
9051 {
9052 irel->r_offset -= removed_bytes;
9053 last_irel_offset = irel->r_offset;
9054 }
43cd72b9
BW
9055 else if (next_irel && (next_irel->r_offset == offset + 4
9056 || (is_full_prop_section
9057 && next_irel->r_offset == offset + 8)))
e0001a05
NC
9058 {
9059 nexti += 1;
9060 irel->r_offset -= removed_bytes;
9061 next_irel->r_offset -= removed_bytes;
9062 last_irel_offset = next_irel->r_offset;
9063 }
43cd72b9
BW
9064 else if (size == 0 && (flags & XTENSA_PROP_ALIGN) == 0
9065 && (flags & XTENSA_PROP_UNREACHABLE) == 0)
e0001a05 9066 {
43cd72b9
BW
9067 /* Always remove entries with zero size and no alignment. */
9068 bytes_to_remove = entry_size;
e0001a05
NC
9069 if (irel && irel->r_offset == offset)
9070 {
9071 remove_this_irel = TRUE;
9072
9073 irel->r_offset -= removed_bytes;
9074 last_irel_offset = irel->r_offset;
9075 }
9076 }
9077 else if (irel && irel->r_offset == offset)
9078 {
9079 if (ELF32_R_TYPE (irel->r_info) == R_XTENSA_32)
9080 {
9081 if (last_irel)
9082 {
43cd72b9
BW
9083 flagword old_flags;
9084 bfd_vma old_size =
e0001a05 9085 bfd_get_32 (abfd, &contents[last_irel->r_offset + 4]);
43cd72b9
BW
9086 bfd_vma old_address =
9087 (last_irel->r_addend
e0001a05 9088 + bfd_get_32 (abfd, &contents[last_irel->r_offset]));
43cd72b9
BW
9089 bfd_vma new_address =
9090 (irel->r_addend
e0001a05 9091 + bfd_get_32 (abfd, &contents[actual_offset]));
43cd72b9
BW
9092 if (is_full_prop_section)
9093 old_flags = bfd_get_32
9094 (abfd, &contents[last_irel->r_offset + 8]);
9095 else
9096 old_flags = predef_flags;
9097
9098 if ((ELF32_R_SYM (irel->r_info)
9099 == ELF32_R_SYM (last_irel->r_info))
9100 && old_address + old_size == new_address
9101 && old_flags == flags
9102 && (old_flags & XTENSA_PROP_INSN_BRANCH_TARGET) == 0
9103 && (old_flags & XTENSA_PROP_INSN_LOOP_TARGET) == 0)
e0001a05 9104 {
43cd72b9 9105 /* Fix the old size. */
e0001a05
NC
9106 bfd_put_32 (abfd, old_size + size,
9107 &contents[last_irel->r_offset + 4]);
43cd72b9 9108 bytes_to_remove = entry_size;
e0001a05
NC
9109 remove_this_irel = TRUE;
9110 }
9111 else
9112 last_irel = irel;
9113 }
9114 else
9115 last_irel = irel;
9116 }
9117
9118 irel->r_offset -= removed_bytes;
9119 last_irel_offset = irel->r_offset;
9120 }
9121
9122 if (remove_this_irel)
9123 {
9124 irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
9125 irel->r_offset -= bytes_to_remove;
9126 }
9127
9128 if (bytes_to_remove != 0)
9129 {
9130 removed_bytes += bytes_to_remove;
43cd72b9 9131 if (offset + bytes_to_remove < section_size)
e0001a05 9132 memmove (&contents[actual_offset],
43cd72b9
BW
9133 &contents[actual_offset + bytes_to_remove],
9134 section_size - offset - bytes_to_remove);
e0001a05
NC
9135 }
9136 }
9137
43cd72b9 9138 if (removed_bytes)
e0001a05
NC
9139 {
9140 /* Clear the removed bytes. */
9141 memset (&contents[section_size - removed_bytes], 0, removed_bytes);
9142
eea6121a 9143 sec->size = section_size - removed_bytes;
e901de89
BW
9144
9145 if (xtensa_is_littable_section (sec))
9146 {
9147 bfd *dynobj = elf_hash_table (link_info)->dynobj;
9148 if (dynobj)
9149 {
9150 asection *sgotloc =
9151 bfd_get_section_by_name (dynobj, ".got.loc");
9152 if (sgotloc)
eea6121a 9153 sgotloc->size -= removed_bytes;
e901de89
BW
9154 }
9155 }
e0001a05
NC
9156 }
9157 }
e901de89 9158
e0001a05
NC
9159 error_return:
9160 release_internal_relocs (sec, internal_relocs);
9161 release_contents (sec, contents);
9162 return ok;
9163}
9164
9165\f
9166/* Third relaxation pass. */
9167
9168/* Change symbol values to account for removed literals. */
9169
43cd72b9 9170bfd_boolean
7fa3d080 9171relax_section_symbols (bfd *abfd, asection *sec)
e0001a05
NC
9172{
9173 xtensa_relax_info *relax_info;
9174 unsigned int sec_shndx;
9175 Elf_Internal_Shdr *symtab_hdr;
9176 Elf_Internal_Sym *isymbuf;
9177 unsigned i, num_syms, num_locals;
9178
9179 relax_info = get_xtensa_relax_info (sec);
9180 BFD_ASSERT (relax_info);
9181
43cd72b9
BW
9182 if (!relax_info->is_relaxable_literal_section
9183 && !relax_info->is_relaxable_asm_section)
e0001a05
NC
9184 return TRUE;
9185
9186 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
9187
9188 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9189 isymbuf = retrieve_local_syms (abfd);
9190
9191 num_syms = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
9192 num_locals = symtab_hdr->sh_info;
9193
9194 /* Adjust the local symbols defined in this section. */
9195 for (i = 0; i < num_locals; i++)
9196 {
9197 Elf_Internal_Sym *isym = &isymbuf[i];
9198
9199 if (isym->st_shndx == sec_shndx)
9200 {
43cd72b9
BW
9201 bfd_vma new_address = offset_with_removed_text
9202 (&relax_info->action_list, isym->st_value);
9203 bfd_vma new_size = isym->st_size;
9204
9205 if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC)
9206 {
9207 bfd_vma new_end = offset_with_removed_text
9208 (&relax_info->action_list, isym->st_value + isym->st_size);
9209 new_size = new_end - new_address;
9210 }
9211
9212 isym->st_value = new_address;
9213 isym->st_size = new_size;
e0001a05
NC
9214 }
9215 }
9216
9217 /* Now adjust the global symbols defined in this section. */
9218 for (i = 0; i < (num_syms - num_locals); i++)
9219 {
9220 struct elf_link_hash_entry *sym_hash;
9221
9222 sym_hash = elf_sym_hashes (abfd)[i];
9223
9224 if (sym_hash->root.type == bfd_link_hash_warning)
9225 sym_hash = (struct elf_link_hash_entry *) sym_hash->root.u.i.link;
9226
9227 if ((sym_hash->root.type == bfd_link_hash_defined
9228 || sym_hash->root.type == bfd_link_hash_defweak)
9229 && sym_hash->root.u.def.section == sec)
9230 {
43cd72b9
BW
9231 bfd_vma new_address = offset_with_removed_text
9232 (&relax_info->action_list, sym_hash->root.u.def.value);
9233 bfd_vma new_size = sym_hash->size;
9234
9235 if (sym_hash->type == STT_FUNC)
9236 {
9237 bfd_vma new_end = offset_with_removed_text
9238 (&relax_info->action_list,
9239 sym_hash->root.u.def.value + sym_hash->size);
9240 new_size = new_end - new_address;
9241 }
9242
9243 sym_hash->root.u.def.value = new_address;
9244 sym_hash->size = new_size;
e0001a05
NC
9245 }
9246 }
9247
9248 return TRUE;
9249}
9250
9251\f
9252/* "Fix" handling functions, called while performing relocations. */
9253
43cd72b9 9254static bfd_boolean
7fa3d080
BW
9255do_fix_for_relocatable_link (Elf_Internal_Rela *rel,
9256 bfd *input_bfd,
9257 asection *input_section,
9258 bfd_byte *contents)
e0001a05
NC
9259{
9260 r_reloc r_rel;
9261 asection *sec, *old_sec;
9262 bfd_vma old_offset;
9263 int r_type = ELF32_R_TYPE (rel->r_info);
e0001a05
NC
9264 reloc_bfd_fix *fix;
9265
9266 if (r_type == R_XTENSA_NONE)
43cd72b9 9267 return TRUE;
e0001a05 9268
43cd72b9
BW
9269 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
9270 if (!fix)
9271 return TRUE;
e0001a05 9272
43cd72b9
BW
9273 r_reloc_init (&r_rel, input_bfd, rel, contents,
9274 bfd_get_section_limit (input_bfd, input_section));
e0001a05 9275 old_sec = r_reloc_get_section (&r_rel);
43cd72b9
BW
9276 old_offset = r_rel.target_offset;
9277
9278 if (!old_sec || !r_reloc_is_defined (&r_rel))
e0001a05 9279 {
43cd72b9
BW
9280 if (r_type != R_XTENSA_ASM_EXPAND)
9281 {
9282 (*_bfd_error_handler)
9283 (_("%B(%A+0x%lx): unexpected fix for %s relocation"),
9284 input_bfd, input_section, rel->r_offset,
9285 elf_howto_table[r_type].name);
9286 return FALSE;
9287 }
e0001a05
NC
9288 /* Leave it be. Resolution will happen in a later stage. */
9289 }
9290 else
9291 {
9292 sec = fix->target_sec;
9293 rel->r_addend += ((sec->output_offset + fix->target_offset)
9294 - (old_sec->output_offset + old_offset));
9295 }
43cd72b9 9296 return TRUE;
e0001a05
NC
9297}
9298
9299
9300static void
7fa3d080
BW
9301do_fix_for_final_link (Elf_Internal_Rela *rel,
9302 bfd *input_bfd,
9303 asection *input_section,
9304 bfd_byte *contents,
9305 bfd_vma *relocationp)
e0001a05
NC
9306{
9307 asection *sec;
9308 int r_type = ELF32_R_TYPE (rel->r_info);
e0001a05 9309 reloc_bfd_fix *fix;
43cd72b9 9310 bfd_vma fixup_diff;
e0001a05
NC
9311
9312 if (r_type == R_XTENSA_NONE)
9313 return;
9314
43cd72b9
BW
9315 fix = get_bfd_fix (input_section, rel->r_offset, r_type);
9316 if (!fix)
e0001a05
NC
9317 return;
9318
9319 sec = fix->target_sec;
43cd72b9
BW
9320
9321 fixup_diff = rel->r_addend;
9322 if (elf_howto_table[fix->src_type].partial_inplace)
9323 {
9324 bfd_vma inplace_val;
9325 BFD_ASSERT (fix->src_offset
9326 < bfd_get_section_limit (input_bfd, input_section));
9327 inplace_val = bfd_get_32 (input_bfd, &contents[fix->src_offset]);
9328 fixup_diff += inplace_val;
9329 }
9330
e0001a05
NC
9331 *relocationp = (sec->output_section->vma
9332 + sec->output_offset
43cd72b9 9333 + fix->target_offset - fixup_diff);
e0001a05
NC
9334}
9335
9336\f
9337/* Miscellaneous utility functions.... */
9338
9339static asection *
7fa3d080 9340elf_xtensa_get_plt_section (bfd *dynobj, int chunk)
e0001a05
NC
9341{
9342 char plt_name[10];
9343
9344 if (chunk == 0)
9345 return bfd_get_section_by_name (dynobj, ".plt");
9346
9347 sprintf (plt_name, ".plt.%u", chunk);
9348 return bfd_get_section_by_name (dynobj, plt_name);
9349}
9350
9351
9352static asection *
7fa3d080 9353elf_xtensa_get_gotplt_section (bfd *dynobj, int chunk)
e0001a05
NC
9354{
9355 char got_name[14];
9356
9357 if (chunk == 0)
9358 return bfd_get_section_by_name (dynobj, ".got.plt");
9359
9360 sprintf (got_name, ".got.plt.%u", chunk);
9361 return bfd_get_section_by_name (dynobj, got_name);
9362}
9363
9364
9365/* Get the input section for a given symbol index.
9366 If the symbol is:
9367 . a section symbol, return the section;
9368 . a common symbol, return the common section;
9369 . an undefined symbol, return the undefined section;
9370 . an indirect symbol, follow the links;
9371 . an absolute value, return the absolute section. */
9372
9373static asection *
7fa3d080 9374get_elf_r_symndx_section (bfd *abfd, unsigned long r_symndx)
e0001a05
NC
9375{
9376 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9377 asection *target_sec = NULL;
43cd72b9 9378 if (r_symndx < symtab_hdr->sh_info)
e0001a05
NC
9379 {
9380 Elf_Internal_Sym *isymbuf;
9381 unsigned int section_index;
9382
9383 isymbuf = retrieve_local_syms (abfd);
9384 section_index = isymbuf[r_symndx].st_shndx;
9385
9386 if (section_index == SHN_UNDEF)
9387 target_sec = bfd_und_section_ptr;
9388 else if (section_index > 0 && section_index < SHN_LORESERVE)
9389 target_sec = bfd_section_from_elf_index (abfd, section_index);
9390 else if (section_index == SHN_ABS)
9391 target_sec = bfd_abs_section_ptr;
9392 else if (section_index == SHN_COMMON)
9393 target_sec = bfd_com_section_ptr;
43cd72b9 9394 else
e0001a05
NC
9395 /* Who knows? */
9396 target_sec = NULL;
9397 }
9398 else
9399 {
9400 unsigned long indx = r_symndx - symtab_hdr->sh_info;
9401 struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
9402
9403 while (h->root.type == bfd_link_hash_indirect
9404 || h->root.type == bfd_link_hash_warning)
9405 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9406
9407 switch (h->root.type)
9408 {
9409 case bfd_link_hash_defined:
9410 case bfd_link_hash_defweak:
9411 target_sec = h->root.u.def.section;
9412 break;
9413 case bfd_link_hash_common:
9414 target_sec = bfd_com_section_ptr;
9415 break;
9416 case bfd_link_hash_undefined:
9417 case bfd_link_hash_undefweak:
9418 target_sec = bfd_und_section_ptr;
9419 break;
9420 default: /* New indirect warning. */
9421 target_sec = bfd_und_section_ptr;
9422 break;
9423 }
9424 }
9425 return target_sec;
9426}
9427
9428
9429static struct elf_link_hash_entry *
7fa3d080 9430get_elf_r_symndx_hash_entry (bfd *abfd, unsigned long r_symndx)
e0001a05
NC
9431{
9432 unsigned long indx;
9433 struct elf_link_hash_entry *h;
9434 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9435
9436 if (r_symndx < symtab_hdr->sh_info)
9437 return NULL;
43cd72b9 9438
e0001a05
NC
9439 indx = r_symndx - symtab_hdr->sh_info;
9440 h = elf_sym_hashes (abfd)[indx];
9441 while (h->root.type == bfd_link_hash_indirect
9442 || h->root.type == bfd_link_hash_warning)
9443 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9444 return h;
9445}
9446
9447
9448/* Get the section-relative offset for a symbol number. */
9449
9450static bfd_vma
7fa3d080 9451get_elf_r_symndx_offset (bfd *abfd, unsigned long r_symndx)
e0001a05
NC
9452{
9453 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9454 bfd_vma offset = 0;
9455
43cd72b9 9456 if (r_symndx < symtab_hdr->sh_info)
e0001a05
NC
9457 {
9458 Elf_Internal_Sym *isymbuf;
9459 isymbuf = retrieve_local_syms (abfd);
9460 offset = isymbuf[r_symndx].st_value;
9461 }
9462 else
9463 {
9464 unsigned long indx = r_symndx - symtab_hdr->sh_info;
9465 struct elf_link_hash_entry *h =
9466 elf_sym_hashes (abfd)[indx];
9467
9468 while (h->root.type == bfd_link_hash_indirect
9469 || h->root.type == bfd_link_hash_warning)
9470 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9471 if (h->root.type == bfd_link_hash_defined
9472 || h->root.type == bfd_link_hash_defweak)
9473 offset = h->root.u.def.value;
9474 }
9475 return offset;
9476}
9477
9478
9479static bfd_boolean
7fa3d080 9480is_reloc_sym_weak (bfd *abfd, Elf_Internal_Rela *rel)
43cd72b9
BW
9481{
9482 unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
9483 struct elf_link_hash_entry *h;
9484
9485 h = get_elf_r_symndx_hash_entry (abfd, r_symndx);
9486 if (h && h->root.type == bfd_link_hash_defweak)
9487 return TRUE;
9488 return FALSE;
9489}
9490
9491
9492static bfd_boolean
7fa3d080
BW
9493pcrel_reloc_fits (xtensa_opcode opc,
9494 int opnd,
9495 bfd_vma self_address,
9496 bfd_vma dest_address)
e0001a05 9497{
43cd72b9
BW
9498 xtensa_isa isa = xtensa_default_isa;
9499 uint32 valp = dest_address;
9500 if (xtensa_operand_do_reloc (isa, opc, opnd, &valp, self_address)
9501 || xtensa_operand_encode (isa, opc, opnd, &valp))
9502 return FALSE;
9503 return TRUE;
e0001a05
NC
9504}
9505
9506
b614a702 9507static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
b614a702 9508
e0001a05 9509static bfd_boolean
7fa3d080 9510xtensa_is_property_section (asection *sec)
e0001a05 9511{
0112cd26
NC
9512 if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
9513 || CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME)
9514 || CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME))
b614a702 9515 return TRUE;
e901de89 9516
b614a702 9517 if (strncmp (".gnu.linkonce.", sec->name, linkonce_len) == 0
0112cd26
NC
9518 && (CONST_STRNEQ (&sec->name[linkonce_len], "x.")
9519 || CONST_STRNEQ (&sec->name[linkonce_len], "p.")
9520 || CONST_STRNEQ (&sec->name[linkonce_len], "prop.")))
e901de89
BW
9521 return TRUE;
9522
e901de89
BW
9523 return FALSE;
9524}
9525
9526
9527static bfd_boolean
7fa3d080 9528xtensa_is_littable_section (asection *sec)
e901de89 9529{
0112cd26 9530 if (CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME))
b614a702 9531 return TRUE;
e901de89 9532
b614a702
BW
9533 if (strncmp (".gnu.linkonce.", sec->name, linkonce_len) == 0
9534 && sec->name[linkonce_len] == 'p'
9535 && sec->name[linkonce_len + 1] == '.')
e901de89 9536 return TRUE;
e0001a05 9537
e901de89 9538 return FALSE;
e0001a05
NC
9539}
9540
9541
43cd72b9 9542static int
7fa3d080 9543internal_reloc_compare (const void *ap, const void *bp)
e0001a05 9544{
43cd72b9
BW
9545 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
9546 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
9547
9548 if (a->r_offset != b->r_offset)
9549 return (a->r_offset - b->r_offset);
9550
9551 /* We don't need to sort on these criteria for correctness,
9552 but enforcing a more strict ordering prevents unstable qsort
9553 from behaving differently with different implementations.
9554 Without the code below we get correct but different results
9555 on Solaris 2.7 and 2.8. We would like to always produce the
9556 same results no matter the host. */
9557
9558 if (a->r_info != b->r_info)
9559 return (a->r_info - b->r_info);
9560
9561 return (a->r_addend - b->r_addend);
e0001a05
NC
9562}
9563
9564
9565static int
7fa3d080 9566internal_reloc_matches (const void *ap, const void *bp)
e0001a05
NC
9567{
9568 const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
9569 const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
9570
43cd72b9
BW
9571 /* Check if one entry overlaps with the other; this shouldn't happen
9572 except when searching for a match. */
e0001a05
NC
9573 return (a->r_offset - b->r_offset);
9574}
9575
9576
74869ac7
BW
9577/* Predicate function used to look up a section in a particular group. */
9578
9579static bfd_boolean
9580match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
9581{
9582 const char *gname = inf;
9583 const char *group_name = elf_group_name (sec);
9584
9585 return (group_name == gname
9586 || (group_name != NULL
9587 && gname != NULL
9588 && strcmp (group_name, gname) == 0));
9589}
9590
9591
9592asection *
9593xtensa_get_property_section (asection *sec, const char *base_name)
e0001a05 9594{
74869ac7
BW
9595 const char *suffix, *group_name;
9596 char *prop_sec_name;
9597 asection *prop_sec;
9598
9599 group_name = elf_group_name (sec);
9600 if (group_name)
9601 {
9602 suffix = strrchr (sec->name, '.');
9603 if (suffix == sec->name)
9604 suffix = 0;
9605 prop_sec_name = (char *) bfd_malloc (strlen (base_name) + 1
9606 + (suffix ? strlen (suffix) : 0));
9607 strcpy (prop_sec_name, base_name);
9608 if (suffix)
9609 strcat (prop_sec_name, suffix);
9610 }
9611 else if (strncmp (sec->name, ".gnu.linkonce.", linkonce_len) == 0)
e0001a05 9612 {
43cd72b9 9613 char *linkonce_kind = 0;
b614a702
BW
9614
9615 if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
7db48a12 9616 linkonce_kind = "x.";
b614a702 9617 else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
7db48a12 9618 linkonce_kind = "p.";
43cd72b9
BW
9619 else if (strcmp (base_name, XTENSA_PROP_SEC_NAME) == 0)
9620 linkonce_kind = "prop.";
e0001a05 9621 else
b614a702
BW
9622 abort ();
9623
43cd72b9
BW
9624 prop_sec_name = (char *) bfd_malloc (strlen (sec->name)
9625 + strlen (linkonce_kind) + 1);
b614a702 9626 memcpy (prop_sec_name, ".gnu.linkonce.", linkonce_len);
43cd72b9 9627 strcpy (prop_sec_name + linkonce_len, linkonce_kind);
b614a702
BW
9628
9629 suffix = sec->name + linkonce_len;
096c35a7 9630 /* For backward compatibility, replace "t." instead of inserting
43cd72b9 9631 the new linkonce_kind (but not for "prop" sections). */
0112cd26 9632 if (CONST_STRNEQ (suffix, "t.") && linkonce_kind[1] == '.')
43cd72b9
BW
9633 suffix += 2;
9634 strcat (prop_sec_name + linkonce_len, suffix);
74869ac7
BW
9635 }
9636 else
9637 prop_sec_name = strdup (base_name);
9638
9639 /* Check if the section already exists. */
9640 prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
9641 match_section_group,
9642 (void *) group_name);
9643 /* If not, create it. */
9644 if (! prop_sec)
9645 {
9646 flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
9647 flags |= (bfd_get_section_flags (sec->owner, sec)
9648 & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES));
9649
9650 prop_sec = bfd_make_section_anyway_with_flags
9651 (sec->owner, strdup (prop_sec_name), flags);
9652 if (! prop_sec)
9653 return 0;
b614a702 9654
74869ac7 9655 elf_group_name (prop_sec) = group_name;
e0001a05
NC
9656 }
9657
74869ac7
BW
9658 free (prop_sec_name);
9659 return prop_sec;
e0001a05
NC
9660}
9661
43cd72b9
BW
9662
9663flagword
7fa3d080 9664xtensa_get_property_predef_flags (asection *sec)
43cd72b9 9665{
0112cd26
NC
9666 if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
9667 || CONST_STRNEQ (sec->name, ".gnu.linkonce.x."))
43cd72b9
BW
9668 return (XTENSA_PROP_INSN
9669 | XTENSA_PROP_INSN_NO_TRANSFORM
9670 | XTENSA_PROP_INSN_NO_REORDER);
9671
9672 if (xtensa_is_littable_section (sec))
9673 return (XTENSA_PROP_LITERAL
9674 | XTENSA_PROP_INSN_NO_TRANSFORM
9675 | XTENSA_PROP_INSN_NO_REORDER);
9676
9677 return 0;
9678}
9679
e0001a05
NC
9680\f
9681/* Other functions called directly by the linker. */
9682
9683bfd_boolean
7fa3d080
BW
9684xtensa_callback_required_dependence (bfd *abfd,
9685 asection *sec,
9686 struct bfd_link_info *link_info,
9687 deps_callback_t callback,
9688 void *closure)
e0001a05
NC
9689{
9690 Elf_Internal_Rela *internal_relocs;
9691 bfd_byte *contents;
9692 unsigned i;
9693 bfd_boolean ok = TRUE;
43cd72b9
BW
9694 bfd_size_type sec_size;
9695
9696 sec_size = bfd_get_section_limit (abfd, sec);
e0001a05
NC
9697
9698 /* ".plt*" sections have no explicit relocations but they contain L32R
9699 instructions that reference the corresponding ".got.plt*" sections. */
9700 if ((sec->flags & SEC_LINKER_CREATED) != 0
0112cd26 9701 && CONST_STRNEQ (sec->name, ".plt"))
e0001a05
NC
9702 {
9703 asection *sgotplt;
9704
9705 /* Find the corresponding ".got.plt*" section. */
9706 if (sec->name[4] == '\0')
9707 sgotplt = bfd_get_section_by_name (sec->owner, ".got.plt");
9708 else
9709 {
9710 char got_name[14];
9711 int chunk = 0;
9712
9713 BFD_ASSERT (sec->name[4] == '.');
9714 chunk = strtol (&sec->name[5], NULL, 10);
9715
9716 sprintf (got_name, ".got.plt.%u", chunk);
9717 sgotplt = bfd_get_section_by_name (sec->owner, got_name);
9718 }
9719 BFD_ASSERT (sgotplt);
9720
9721 /* Assume worst-case offsets: L32R at the very end of the ".plt"
9722 section referencing a literal at the very beginning of
9723 ".got.plt". This is very close to the real dependence, anyway. */
43cd72b9 9724 (*callback) (sec, sec_size, sgotplt, 0, closure);
e0001a05
NC
9725 }
9726
9727 internal_relocs = retrieve_internal_relocs (abfd, sec,
9728 link_info->keep_memory);
9729 if (internal_relocs == NULL
43cd72b9 9730 || sec->reloc_count == 0)
e0001a05
NC
9731 return ok;
9732
9733 /* Cache the contents for the duration of this scan. */
9734 contents = retrieve_contents (abfd, sec, link_info->keep_memory);
43cd72b9 9735 if (contents == NULL && sec_size != 0)
e0001a05
NC
9736 {
9737 ok = FALSE;
9738 goto error_return;
9739 }
9740
43cd72b9
BW
9741 if (!xtensa_default_isa)
9742 xtensa_default_isa = xtensa_isa_init (0, 0);
e0001a05 9743
43cd72b9 9744 for (i = 0; i < sec->reloc_count; i++)
e0001a05
NC
9745 {
9746 Elf_Internal_Rela *irel = &internal_relocs[i];
43cd72b9 9747 if (is_l32r_relocation (abfd, sec, contents, irel))
e0001a05
NC
9748 {
9749 r_reloc l32r_rel;
9750 asection *target_sec;
9751 bfd_vma target_offset;
43cd72b9
BW
9752
9753 r_reloc_init (&l32r_rel, abfd, irel, contents, sec_size);
e0001a05
NC
9754 target_sec = NULL;
9755 target_offset = 0;
9756 /* L32Rs must be local to the input file. */
9757 if (r_reloc_is_defined (&l32r_rel))
9758 {
9759 target_sec = r_reloc_get_section (&l32r_rel);
43cd72b9 9760 target_offset = l32r_rel.target_offset;
e0001a05
NC
9761 }
9762 (*callback) (sec, irel->r_offset, target_sec, target_offset,
9763 closure);
9764 }
9765 }
9766
9767 error_return:
9768 release_internal_relocs (sec, internal_relocs);
9769 release_contents (sec, contents);
9770 return ok;
9771}
9772
2f89ff8d
L
9773/* The default literal sections should always be marked as "code" (i.e.,
9774 SHF_EXECINSTR). This is particularly important for the Linux kernel
9775 module loader so that the literals are not placed after the text. */
b35d266b 9776static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
2f89ff8d 9777{
0112cd26
NC
9778 { STRING_COMMA_LEN (".fini.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
9779 { STRING_COMMA_LEN (".init.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
9780 { STRING_COMMA_LEN (".literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
9781 { NULL, 0, 0, 0, 0 }
7f4d3958 9782};
e0001a05
NC
9783\f
9784#ifndef ELF_ARCH
9785#define TARGET_LITTLE_SYM bfd_elf32_xtensa_le_vec
9786#define TARGET_LITTLE_NAME "elf32-xtensa-le"
9787#define TARGET_BIG_SYM bfd_elf32_xtensa_be_vec
9788#define TARGET_BIG_NAME "elf32-xtensa-be"
9789#define ELF_ARCH bfd_arch_xtensa
9790
4af0a1d8
BW
9791#define ELF_MACHINE_CODE EM_XTENSA
9792#define ELF_MACHINE_ALT1 EM_XTENSA_OLD
e0001a05
NC
9793
9794#if XCHAL_HAVE_MMU
9795#define ELF_MAXPAGESIZE (1 << XCHAL_MMU_MIN_PTE_PAGE_SIZE)
9796#else /* !XCHAL_HAVE_MMU */
9797#define ELF_MAXPAGESIZE 1
9798#endif /* !XCHAL_HAVE_MMU */
9799#endif /* ELF_ARCH */
9800
9801#define elf_backend_can_gc_sections 1
9802#define elf_backend_can_refcount 1
9803#define elf_backend_plt_readonly 1
9804#define elf_backend_got_header_size 4
9805#define elf_backend_want_dynbss 0
9806#define elf_backend_want_got_plt 1
9807
9808#define elf_info_to_howto elf_xtensa_info_to_howto_rela
9809
e0001a05
NC
9810#define bfd_elf32_bfd_merge_private_bfd_data elf_xtensa_merge_private_bfd_data
9811#define bfd_elf32_new_section_hook elf_xtensa_new_section_hook
9812#define bfd_elf32_bfd_print_private_bfd_data elf_xtensa_print_private_bfd_data
9813#define bfd_elf32_bfd_relax_section elf_xtensa_relax_section
9814#define bfd_elf32_bfd_reloc_type_lookup elf_xtensa_reloc_type_lookup
9815#define bfd_elf32_bfd_set_private_flags elf_xtensa_set_private_flags
9816
9817#define elf_backend_adjust_dynamic_symbol elf_xtensa_adjust_dynamic_symbol
9818#define elf_backend_check_relocs elf_xtensa_check_relocs
e0001a05
NC
9819#define elf_backend_create_dynamic_sections elf_xtensa_create_dynamic_sections
9820#define elf_backend_discard_info elf_xtensa_discard_info
9821#define elf_backend_ignore_discarded_relocs elf_xtensa_ignore_discarded_relocs
9822#define elf_backend_final_write_processing elf_xtensa_final_write_processing
9823#define elf_backend_finish_dynamic_sections elf_xtensa_finish_dynamic_sections
9824#define elf_backend_finish_dynamic_symbol elf_xtensa_finish_dynamic_symbol
9825#define elf_backend_gc_mark_hook elf_xtensa_gc_mark_hook
9826#define elf_backend_gc_sweep_hook elf_xtensa_gc_sweep_hook
9827#define elf_backend_grok_prstatus elf_xtensa_grok_prstatus
9828#define elf_backend_grok_psinfo elf_xtensa_grok_psinfo
9829#define elf_backend_hide_symbol elf_xtensa_hide_symbol
e0001a05
NC
9830#define elf_backend_object_p elf_xtensa_object_p
9831#define elf_backend_reloc_type_class elf_xtensa_reloc_type_class
9832#define elf_backend_relocate_section elf_xtensa_relocate_section
9833#define elf_backend_size_dynamic_sections elf_xtensa_size_dynamic_sections
29ef7005 9834#define elf_backend_special_sections elf_xtensa_special_sections
e0001a05
NC
9835
9836#include "elf32-target.h"
This page took 0.71113 seconds and 4 git commands to generate.