1/* Xtensa-specific support for 32-bit ELF.
2   Copyright (C) 2003-2022 Free Software Foundation, Inc.
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 3 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
18   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19   02110-1301, USA.  */
20
21#include "sysdep.h"
22#include "bfd.h"
23
24#include <stdarg.h>
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 "splay-tree.h"
32#include "xtensa-isa.h"
33#include "xtensa-config.h"
34
35/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1.  */
36#define OCTETS_PER_BYTE(ABFD, SEC) 1
37
38#define XTENSA_NO_NOP_REMOVAL 0
39
40#ifndef XSHAL_ABI
41#define XSHAL_ABI 0
42#endif
43
44#ifndef XTHAL_ABI_UNDEFINED
45#define XTHAL_ABI_UNDEFINED -1
46#endif
47
48#ifndef XTHAL_ABI_WINDOWED
49#define XTHAL_ABI_WINDOWED 0
50#endif
51
52#ifndef XTHAL_ABI_CALL0
53#define XTHAL_ABI_CALL0 1
54#endif
55
56/* Local helper functions.  */
57
58static bool add_extra_plt_sections (struct bfd_link_info *, int);
59static char *vsprint_msg (const char *, const char *, int, ...) ATTRIBUTE_PRINTF(2,4);
60static bfd_reloc_status_type bfd_elf_xtensa_reloc
61  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
62static bool do_fix_for_relocatable_link
63  (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *);
64static void do_fix_for_final_link
65  (Elf_Internal_Rela *, bfd *, asection *, bfd_byte *, bfd_vma *);
66
67/* Local functions to handle Xtensa configurability.  */
68
69static bool is_indirect_call_opcode (xtensa_opcode);
70static bool is_direct_call_opcode (xtensa_opcode);
71static bool is_windowed_call_opcode (xtensa_opcode);
72static xtensa_opcode get_const16_opcode (void);
73static xtensa_opcode get_l32r_opcode (void);
74static bfd_vma l32r_offset (bfd_vma, bfd_vma);
75static int get_relocation_opnd (xtensa_opcode, int);
76static int get_relocation_slot (int);
77static xtensa_opcode get_relocation_opcode
78  (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
79static bool is_l32r_relocation
80  (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *);
81static bool is_alt_relocation (int);
82static bool is_operand_relocation (int);
83static bfd_size_type insn_decode_len
84  (bfd_byte *, bfd_size_type, bfd_size_type);
85static int insn_num_slots
86  (bfd_byte *, bfd_size_type, bfd_size_type);
87static xtensa_opcode insn_decode_opcode
88  (bfd_byte *, bfd_size_type, bfd_size_type, int);
89static bool check_branch_target_aligned
90  (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
91static bool check_loop_aligned
92  (bfd_byte *, bfd_size_type, bfd_vma, bfd_vma);
93static bool check_branch_target_aligned_address (bfd_vma, int);
94static bfd_size_type get_asm_simplify_size
95  (bfd_byte *, bfd_size_type, bfd_size_type);
96
97/* Functions for link-time code simplifications.  */
98
99static bfd_reloc_status_type elf_xtensa_do_asm_simplify
100  (bfd_byte *, bfd_vma, bfd_vma, char **);
101static bfd_reloc_status_type contract_asm_expansion
102  (bfd_byte *, bfd_vma, Elf_Internal_Rela *, char **);
103static xtensa_opcode swap_callx_for_call_opcode (xtensa_opcode);
104static xtensa_opcode get_expanded_call_opcode (bfd_byte *, int, bool *);
105
106/* Access to internal relocations, section contents and symbols.  */
107
108static Elf_Internal_Rela *retrieve_internal_relocs
109  (bfd *, asection *, bool);
110static void pin_internal_relocs (asection *, Elf_Internal_Rela *);
111static void release_internal_relocs (asection *, Elf_Internal_Rela *);
112static bfd_byte *retrieve_contents (bfd *, asection *, bool);
113static void pin_contents (asection *, bfd_byte *);
114static void release_contents (asection *, bfd_byte *);
115static Elf_Internal_Sym *retrieve_local_syms (bfd *);
116
117/* Miscellaneous utility functions.  */
118
119static asection *elf_xtensa_get_plt_section (struct bfd_link_info *, int);
120static asection *elf_xtensa_get_gotplt_section (struct bfd_link_info *, int);
121static asection *get_elf_r_symndx_section (bfd *, unsigned long);
122static struct elf_link_hash_entry *get_elf_r_symndx_hash_entry
123  (bfd *, unsigned long);
124static bfd_vma get_elf_r_symndx_offset (bfd *, unsigned long);
125static bool is_reloc_sym_weak (bfd *, Elf_Internal_Rela *);
126static bool pcrel_reloc_fits (xtensa_opcode, int, bfd_vma, bfd_vma);
127static bool xtensa_is_property_section (asection *);
128static bool xtensa_is_insntable_section (asection *);
129static bool xtensa_is_littable_section (asection *);
130static bool xtensa_is_proptable_section (asection *);
131static int internal_reloc_compare (const void *, const void *);
132static int internal_reloc_matches (const void *, const void *);
133static asection *xtensa_get_property_section (asection *, const char *);
134static flagword xtensa_get_property_predef_flags (asection *);
135
136/* Other functions called directly by the linker.  */
137
138typedef void (*deps_callback_t)
139  (asection *, bfd_vma, asection *, bfd_vma, void *);
140extern bool xtensa_callback_required_dependence
141  (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *);
142
143
144/* Globally visible flag for choosing size optimization of NOP removal
145   instead of branch-target-aware minimization for NOP removal.
146   When nonzero, narrow all instructions and remove all NOPs possible
147   around longcall expansions.  */
148
149int elf32xtensa_size_opt;
150
151
152/* The "new_section_hook" is used to set up a per-section
153   "xtensa_relax_info" data structure with additional information used
154   during relaxation.  */
155
156typedef struct xtensa_relax_info_struct xtensa_relax_info;
157
158
159/* The GNU tools do not easily allow extending interfaces to pass around
160   the pointer to the Xtensa ISA information, so instead we add a global
161   variable here (in BFD) that can be used by any of the tools that need
162   this information. */
163
164xtensa_isa xtensa_default_isa;
165
166
167/* When this is true, relocations may have been modified to refer to
168   symbols from other input files.  The per-section list of "fix"
169   records needs to be checked when resolving relocations.  */
170
171static bool relaxing_section = false;
172
173/* When this is true, during final links, literals that cannot be
174   coalesced and their relocations may be moved to other sections.  */
175
176int elf32xtensa_no_literal_movement = 1;
177
178/* Place property records for a section into individual property section
179   with xt.prop. prefix.  */
180
181bool elf32xtensa_separate_props = false;
182
183/* Xtensa ABI.  It affects PLT entry code.  */
184
185int elf32xtensa_abi = XTHAL_ABI_UNDEFINED;
186
187/* Rename one of the generic section flags to better document how it
188   is used here.  */
189/* Whether relocations have been processed.  */
190#define reloc_done sec_flg0
191
192static reloc_howto_type elf_howto_table[] =
193{
194  HOWTO (R_XTENSA_NONE, 0, 0, 0, false, 0, complain_overflow_dont,
195	 bfd_elf_xtensa_reloc, "R_XTENSA_NONE",
196	 false, 0, 0, false),
197  HOWTO (R_XTENSA_32, 0, 4, 32, false, 0, complain_overflow_bitfield,
198	 bfd_elf_xtensa_reloc, "R_XTENSA_32",
199	 true, 0xffffffff, 0xffffffff, false),
200
201  /* Replace a 32-bit value with a value from the runtime linker (only
202     used by linker-generated stub functions).  The r_addend value is
203     special: 1 means to substitute a pointer to the runtime linker's
204     dynamic resolver function; 2 means to substitute the link map for
205     the shared object.  */
206  HOWTO (R_XTENSA_RTLD, 0, 4, 32, false, 0, complain_overflow_dont,
207	 NULL, "R_XTENSA_RTLD", false, 0, 0, false),
208
209  HOWTO (R_XTENSA_GLOB_DAT, 0, 4, 32, false, 0, complain_overflow_bitfield,
210	 bfd_elf_generic_reloc, "R_XTENSA_GLOB_DAT",
211	 false, 0, 0xffffffff, false),
212  HOWTO (R_XTENSA_JMP_SLOT, 0, 4, 32, false, 0, complain_overflow_bitfield,
213	 bfd_elf_generic_reloc, "R_XTENSA_JMP_SLOT",
214	 false, 0, 0xffffffff, false),
215  HOWTO (R_XTENSA_RELATIVE, 0, 4, 32, false, 0, complain_overflow_bitfield,
216	 bfd_elf_generic_reloc, "R_XTENSA_RELATIVE",
217	 false, 0, 0xffffffff, false),
218  HOWTO (R_XTENSA_PLT, 0, 4, 32, false, 0, complain_overflow_bitfield,
219	 bfd_elf_xtensa_reloc, "R_XTENSA_PLT",
220	 false, 0, 0xffffffff, false),
221
222  EMPTY_HOWTO (7),
223
224  /* Old relocations for backward compatibility.  */
225  HOWTO (R_XTENSA_OP0, 0, 0, 0, true, 0, complain_overflow_dont,
226	 bfd_elf_xtensa_reloc, "R_XTENSA_OP0", false, 0, 0, true),
227  HOWTO (R_XTENSA_OP1, 0, 0, 0, true, 0, complain_overflow_dont,
228	 bfd_elf_xtensa_reloc, "R_XTENSA_OP1", false, 0, 0, true),
229  HOWTO (R_XTENSA_OP2, 0, 0, 0, true, 0, complain_overflow_dont,
230	 bfd_elf_xtensa_reloc, "R_XTENSA_OP2", false, 0, 0, true),
231
232  /* Assembly auto-expansion.  */
233  HOWTO (R_XTENSA_ASM_EXPAND, 0, 0, 0, true, 0, complain_overflow_dont,
234	 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_EXPAND", false, 0, 0, true),
235  /* Relax assembly auto-expansion.  */
236  HOWTO (R_XTENSA_ASM_SIMPLIFY, 0, 0, 0, true, 0, complain_overflow_dont,
237	 bfd_elf_xtensa_reloc, "R_XTENSA_ASM_SIMPLIFY", false, 0, 0, true),
238
239  EMPTY_HOWTO (13),
240
241  HOWTO (R_XTENSA_32_PCREL, 0, 4, 32, true, 0, complain_overflow_bitfield,
242	 bfd_elf_xtensa_reloc, "R_XTENSA_32_PCREL",
243	 false, 0, 0xffffffff, true),
244
245  /* GNU extension to record C++ vtable hierarchy.  */
246  HOWTO (R_XTENSA_GNU_VTINHERIT, 0, 4, 0, false, 0, complain_overflow_dont,
247	 NULL, "R_XTENSA_GNU_VTINHERIT",
248	 false, 0, 0, false),
249  /* GNU extension to record C++ vtable member usage.  */
250  HOWTO (R_XTENSA_GNU_VTENTRY, 0, 4, 0, false, 0, complain_overflow_dont,
251	 _bfd_elf_rel_vtable_reloc_fn, "R_XTENSA_GNU_VTENTRY",
252	 false, 0, 0, false),
253
254  /* Relocations for supporting difference of symbols.  */
255  HOWTO (R_XTENSA_DIFF8, 0, 1, 8, false, 0, complain_overflow_signed,
256	 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF8", false, 0, 0xff, false),
257  HOWTO (R_XTENSA_DIFF16, 0, 2, 16, false, 0, complain_overflow_signed,
258	 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF16", false, 0, 0xffff, false),
259  HOWTO (R_XTENSA_DIFF32, 0, 4, 32, false, 0, complain_overflow_signed,
260	 bfd_elf_xtensa_reloc, "R_XTENSA_DIFF32", false, 0, 0xffffffff, false),
261
262  /* General immediate operand relocations.  */
263  HOWTO (R_XTENSA_SLOT0_OP, 0, 0, 0, true, 0, complain_overflow_dont,
264	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_OP", false, 0, 0, true),
265  HOWTO (R_XTENSA_SLOT1_OP, 0, 0, 0, true, 0, complain_overflow_dont,
266	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_OP", false, 0, 0, true),
267  HOWTO (R_XTENSA_SLOT2_OP, 0, 0, 0, true, 0, complain_overflow_dont,
268	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_OP", false, 0, 0, true),
269  HOWTO (R_XTENSA_SLOT3_OP, 0, 0, 0, true, 0, complain_overflow_dont,
270	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_OP", false, 0, 0, true),
271  HOWTO (R_XTENSA_SLOT4_OP, 0, 0, 0, true, 0, complain_overflow_dont,
272	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_OP", false, 0, 0, true),
273  HOWTO (R_XTENSA_SLOT5_OP, 0, 0, 0, true, 0, complain_overflow_dont,
274	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_OP", false, 0, 0, true),
275  HOWTO (R_XTENSA_SLOT6_OP, 0, 0, 0, true, 0, complain_overflow_dont,
276	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_OP", false, 0, 0, true),
277  HOWTO (R_XTENSA_SLOT7_OP, 0, 0, 0, true, 0, complain_overflow_dont,
278	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_OP", false, 0, 0, true),
279  HOWTO (R_XTENSA_SLOT8_OP, 0, 0, 0, true, 0, complain_overflow_dont,
280	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_OP", false, 0, 0, true),
281  HOWTO (R_XTENSA_SLOT9_OP, 0, 0, 0, true, 0, complain_overflow_dont,
282	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_OP", false, 0, 0, true),
283  HOWTO (R_XTENSA_SLOT10_OP, 0, 0, 0, true, 0, complain_overflow_dont,
284	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_OP", false, 0, 0, true),
285  HOWTO (R_XTENSA_SLOT11_OP, 0, 0, 0, true, 0, complain_overflow_dont,
286	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_OP", false, 0, 0, true),
287  HOWTO (R_XTENSA_SLOT12_OP, 0, 0, 0, true, 0, complain_overflow_dont,
288	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_OP", false, 0, 0, true),
289  HOWTO (R_XTENSA_SLOT13_OP, 0, 0, 0, true, 0, complain_overflow_dont,
290	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_OP", false, 0, 0, true),
291  HOWTO (R_XTENSA_SLOT14_OP, 0, 0, 0, true, 0, complain_overflow_dont,
292	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_OP", false, 0, 0, true),
293
294  /* "Alternate" relocations.  The meaning of these is opcode-specific.  */
295  HOWTO (R_XTENSA_SLOT0_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
296	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT0_ALT", false, 0, 0, true),
297  HOWTO (R_XTENSA_SLOT1_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
298	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT1_ALT", false, 0, 0, true),
299  HOWTO (R_XTENSA_SLOT2_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
300	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT2_ALT", false, 0, 0, true),
301  HOWTO (R_XTENSA_SLOT3_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
302	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT3_ALT", false, 0, 0, true),
303  HOWTO (R_XTENSA_SLOT4_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
304	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT4_ALT", false, 0, 0, true),
305  HOWTO (R_XTENSA_SLOT5_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
306	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT5_ALT", false, 0, 0, true),
307  HOWTO (R_XTENSA_SLOT6_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
308	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT6_ALT", false, 0, 0, true),
309  HOWTO (R_XTENSA_SLOT7_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
310	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT7_ALT", false, 0, 0, true),
311  HOWTO (R_XTENSA_SLOT8_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
312	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT8_ALT", false, 0, 0, true),
313  HOWTO (R_XTENSA_SLOT9_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
314	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT9_ALT", false, 0, 0, true),
315  HOWTO (R_XTENSA_SLOT10_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
316	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT10_ALT", false, 0, 0, true),
317  HOWTO (R_XTENSA_SLOT11_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
318	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT11_ALT", false, 0, 0, true),
319  HOWTO (R_XTENSA_SLOT12_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
320	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT12_ALT", false, 0, 0, true),
321  HOWTO (R_XTENSA_SLOT13_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
322	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT13_ALT", false, 0, 0, true),
323  HOWTO (R_XTENSA_SLOT14_ALT, 0, 0, 0, true, 0, complain_overflow_dont,
324	 bfd_elf_xtensa_reloc, "R_XTENSA_SLOT14_ALT", false, 0, 0, true),
325
326  /* TLS relocations.  */
327  HOWTO (R_XTENSA_TLSDESC_FN, 0, 4, 32, false, 0, complain_overflow_dont,
328	 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_FN",
329	 false, 0, 0xffffffff, false),
330  HOWTO (R_XTENSA_TLSDESC_ARG, 0, 4, 32, false, 0, complain_overflow_dont,
331	 bfd_elf_xtensa_reloc, "R_XTENSA_TLSDESC_ARG",
332	 false, 0, 0xffffffff, false),
333  HOWTO (R_XTENSA_TLS_DTPOFF, 0, 4, 32, false, 0, complain_overflow_dont,
334	 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_DTPOFF",
335	 false, 0, 0xffffffff, false),
336  HOWTO (R_XTENSA_TLS_TPOFF, 0, 4, 32, false, 0, complain_overflow_dont,
337	 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_TPOFF",
338	 false, 0, 0xffffffff, false),
339  HOWTO (R_XTENSA_TLS_FUNC, 0, 0, 0, false, 0, complain_overflow_dont,
340	 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_FUNC",
341	 false, 0, 0, false),
342  HOWTO (R_XTENSA_TLS_ARG, 0, 0, 0, false, 0, complain_overflow_dont,
343	 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_ARG",
344	 false, 0, 0, false),
345  HOWTO (R_XTENSA_TLS_CALL, 0, 0, 0, false, 0, complain_overflow_dont,
346	 bfd_elf_xtensa_reloc, "R_XTENSA_TLS_CALL",
347	 false, 0, 0, false),
348
349  HOWTO (R_XTENSA_PDIFF8, 0, 1, 8, false, 0, complain_overflow_bitfield,
350	 bfd_elf_xtensa_reloc, "R_XTENSA_PDIFF8", false, 0, 0xff, false),
351  HOWTO (R_XTENSA_PDIFF16, 0, 2, 16, false, 0, complain_overflow_bitfield,
352	 bfd_elf_xtensa_reloc, "R_XTENSA_PDIFF16", false, 0, 0xffff, false),
353  HOWTO (R_XTENSA_PDIFF32, 0, 4, 32, false, 0, complain_overflow_bitfield,
354	 bfd_elf_xtensa_reloc, "R_XTENSA_PDIFF32", false, 0, 0xffffffff, false),
355
356  HOWTO (R_XTENSA_NDIFF8, 0, 1, 8, false, 0, complain_overflow_bitfield,
357	 bfd_elf_xtensa_reloc, "R_XTENSA_NDIFF8", false, 0, 0xff, false),
358  HOWTO (R_XTENSA_NDIFF16, 0, 2, 16, false, 0, complain_overflow_bitfield,
359	 bfd_elf_xtensa_reloc, "R_XTENSA_NDIFF16", false, 0, 0xffff, false),
360  HOWTO (R_XTENSA_NDIFF32, 0, 4, 32, false, 0, complain_overflow_bitfield,
361	 bfd_elf_xtensa_reloc, "R_XTENSA_NDIFF32", false, 0, 0xffffffff, false),
362};
363
364#if DEBUG_GEN_RELOC
365#define TRACE(str) \
366  fprintf (stderr, "Xtensa bfd reloc lookup %d (%s)\n", code, str)
367#else
368#define TRACE(str)
369#endif
370
371static reloc_howto_type *
372elf_xtensa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
373			      bfd_reloc_code_real_type code)
374{
375  switch (code)
376    {
377    case BFD_RELOC_NONE:
378      TRACE ("BFD_RELOC_NONE");
379      return &elf_howto_table[(unsigned) R_XTENSA_NONE ];
380
381    case BFD_RELOC_32:
382      TRACE ("BFD_RELOC_32");
383      return &elf_howto_table[(unsigned) R_XTENSA_32 ];
384
385    case BFD_RELOC_32_PCREL:
386      TRACE ("BFD_RELOC_32_PCREL");
387      return &elf_howto_table[(unsigned) R_XTENSA_32_PCREL ];
388
389    case BFD_RELOC_XTENSA_DIFF8:
390      TRACE ("BFD_RELOC_XTENSA_DIFF8");
391      return &elf_howto_table[(unsigned) R_XTENSA_DIFF8 ];
392
393    case BFD_RELOC_XTENSA_DIFF16:
394      TRACE ("BFD_RELOC_XTENSA_DIFF16");
395      return &elf_howto_table[(unsigned) R_XTENSA_DIFF16 ];
396
397    case BFD_RELOC_XTENSA_DIFF32:
398      TRACE ("BFD_RELOC_XTENSA_DIFF32");
399      return &elf_howto_table[(unsigned) R_XTENSA_DIFF32 ];
400
401    case BFD_RELOC_XTENSA_PDIFF8:
402      TRACE ("BFD_RELOC_XTENSA_PDIFF8");
403      return &elf_howto_table[(unsigned) R_XTENSA_PDIFF8 ];
404
405    case BFD_RELOC_XTENSA_PDIFF16:
406      TRACE ("BFD_RELOC_XTENSA_PDIFF16");
407      return &elf_howto_table[(unsigned) R_XTENSA_PDIFF16 ];
408
409    case BFD_RELOC_XTENSA_PDIFF32:
410      TRACE ("BFD_RELOC_XTENSA_PDIFF32");
411      return &elf_howto_table[(unsigned) R_XTENSA_PDIFF32 ];
412
413    case BFD_RELOC_XTENSA_NDIFF8:
414      TRACE ("BFD_RELOC_XTENSA_NDIFF8");
415      return &elf_howto_table[(unsigned) R_XTENSA_NDIFF8 ];
416
417    case BFD_RELOC_XTENSA_NDIFF16:
418      TRACE ("BFD_RELOC_XTENSA_NDIFF16");
419      return &elf_howto_table[(unsigned) R_XTENSA_NDIFF16 ];
420
421    case BFD_RELOC_XTENSA_NDIFF32:
422      TRACE ("BFD_RELOC_XTENSA_NDIFF32");
423      return &elf_howto_table[(unsigned) R_XTENSA_NDIFF32 ];
424
425    case BFD_RELOC_XTENSA_RTLD:
426      TRACE ("BFD_RELOC_XTENSA_RTLD");
427      return &elf_howto_table[(unsigned) R_XTENSA_RTLD ];
428
429    case BFD_RELOC_XTENSA_GLOB_DAT:
430      TRACE ("BFD_RELOC_XTENSA_GLOB_DAT");
431      return &elf_howto_table[(unsigned) R_XTENSA_GLOB_DAT ];
432
433    case BFD_RELOC_XTENSA_JMP_SLOT:
434      TRACE ("BFD_RELOC_XTENSA_JMP_SLOT");
435      return &elf_howto_table[(unsigned) R_XTENSA_JMP_SLOT ];
436
437    case BFD_RELOC_XTENSA_RELATIVE:
438      TRACE ("BFD_RELOC_XTENSA_RELATIVE");
439      return &elf_howto_table[(unsigned) R_XTENSA_RELATIVE ];
440
441    case BFD_RELOC_XTENSA_PLT:
442      TRACE ("BFD_RELOC_XTENSA_PLT");
443      return &elf_howto_table[(unsigned) R_XTENSA_PLT ];
444
445    case BFD_RELOC_XTENSA_OP0:
446      TRACE ("BFD_RELOC_XTENSA_OP0");
447      return &elf_howto_table[(unsigned) R_XTENSA_OP0 ];
448
449    case BFD_RELOC_XTENSA_OP1:
450      TRACE ("BFD_RELOC_XTENSA_OP1");
451      return &elf_howto_table[(unsigned) R_XTENSA_OP1 ];
452
453    case BFD_RELOC_XTENSA_OP2:
454      TRACE ("BFD_RELOC_XTENSA_OP2");
455      return &elf_howto_table[(unsigned) R_XTENSA_OP2 ];
456
457    case BFD_RELOC_XTENSA_ASM_EXPAND:
458      TRACE ("BFD_RELOC_XTENSA_ASM_EXPAND");
459      return &elf_howto_table[(unsigned) R_XTENSA_ASM_EXPAND ];
460
461    case BFD_RELOC_XTENSA_ASM_SIMPLIFY:
462      TRACE ("BFD_RELOC_XTENSA_ASM_SIMPLIFY");
463      return &elf_howto_table[(unsigned) R_XTENSA_ASM_SIMPLIFY ];
464
465    case BFD_RELOC_VTABLE_INHERIT:
466      TRACE ("BFD_RELOC_VTABLE_INHERIT");
467      return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTINHERIT ];
468
469    case BFD_RELOC_VTABLE_ENTRY:
470      TRACE ("BFD_RELOC_VTABLE_ENTRY");
471      return &elf_howto_table[(unsigned) R_XTENSA_GNU_VTENTRY ];
472
473    case BFD_RELOC_XTENSA_TLSDESC_FN:
474      TRACE ("BFD_RELOC_XTENSA_TLSDESC_FN");
475      return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_FN ];
476
477    case BFD_RELOC_XTENSA_TLSDESC_ARG:
478      TRACE ("BFD_RELOC_XTENSA_TLSDESC_ARG");
479      return &elf_howto_table[(unsigned) R_XTENSA_TLSDESC_ARG ];
480
481    case BFD_RELOC_XTENSA_TLS_DTPOFF:
482      TRACE ("BFD_RELOC_XTENSA_TLS_DTPOFF");
483      return &elf_howto_table[(unsigned) R_XTENSA_TLS_DTPOFF ];
484
485    case BFD_RELOC_XTENSA_TLS_TPOFF:
486      TRACE ("BFD_RELOC_XTENSA_TLS_TPOFF");
487      return &elf_howto_table[(unsigned) R_XTENSA_TLS_TPOFF ];
488
489    case BFD_RELOC_XTENSA_TLS_FUNC:
490      TRACE ("BFD_RELOC_XTENSA_TLS_FUNC");
491      return &elf_howto_table[(unsigned) R_XTENSA_TLS_FUNC ];
492
493    case BFD_RELOC_XTENSA_TLS_ARG:
494      TRACE ("BFD_RELOC_XTENSA_TLS_ARG");
495      return &elf_howto_table[(unsigned) R_XTENSA_TLS_ARG ];
496
497    case BFD_RELOC_XTENSA_TLS_CALL:
498      TRACE ("BFD_RELOC_XTENSA_TLS_CALL");
499      return &elf_howto_table[(unsigned) R_XTENSA_TLS_CALL ];
500
501    default:
502      if (code >= BFD_RELOC_XTENSA_SLOT0_OP
503	  && code <= BFD_RELOC_XTENSA_SLOT14_OP)
504	{
505	  unsigned n = (R_XTENSA_SLOT0_OP +
506			(code - BFD_RELOC_XTENSA_SLOT0_OP));
507	  return &elf_howto_table[n];
508	}
509
510      if (code >= BFD_RELOC_XTENSA_SLOT0_ALT
511	  && code <= BFD_RELOC_XTENSA_SLOT14_ALT)
512	{
513	  unsigned n = (R_XTENSA_SLOT0_ALT +
514			(code - BFD_RELOC_XTENSA_SLOT0_ALT));
515	  return &elf_howto_table[n];
516	}
517
518      break;
519    }
520
521  /* xgettext:c-format */
522  _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
523  bfd_set_error (bfd_error_bad_value);
524  TRACE ("Unknown");
525  return NULL;
526}
527
528static reloc_howto_type *
529elf_xtensa_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
530			      const char *r_name)
531{
532  unsigned int i;
533
534  for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
535    if (elf_howto_table[i].name != NULL
536	&& strcasecmp (elf_howto_table[i].name, r_name) == 0)
537      return &elf_howto_table[i];
538
539  return NULL;
540}
541
542
543/* Given an ELF "rela" relocation, find the corresponding howto and record
544   it in the BFD internal arelent representation of the relocation.  */
545
546static bool
547elf_xtensa_info_to_howto_rela (bfd *abfd,
548			       arelent *cache_ptr,
549			       Elf_Internal_Rela *dst)
550{
551  unsigned int r_type = ELF32_R_TYPE (dst->r_info);
552
553  if (r_type >= (unsigned int) R_XTENSA_max)
554    {
555      /* xgettext:c-format */
556      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
557			  abfd, r_type);
558      bfd_set_error (bfd_error_bad_value);
559      return false;
560    }
561  cache_ptr->howto = &elf_howto_table[r_type];
562  return true;
563}
564
565
566/* Functions for the Xtensa ELF linker.  */
567
568/* The name of the dynamic interpreter.  This is put in the .interp
569   section.  */
570
571#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
572
573/* The size in bytes of an entry in the procedure linkage table.
574   (This does _not_ include the space for the literals associated with
575   the PLT entry.) */
576
577#define PLT_ENTRY_SIZE 16
578
579/* For _really_ large PLTs, we may need to alternate between literals
580   and code to keep the literals within the 256K range of the L32R
581   instructions in the code.  It's unlikely that anyone would ever need
582   such a big PLT, but an arbitrary limit on the PLT size would be bad.
583   Thus, we split the PLT into chunks.  Since there's very little
584   overhead (2 extra literals) for each chunk, the chunk size is kept
585   small so that the code for handling multiple chunks get used and
586   tested regularly.  With 254 entries, there are 1K of literals for
587   each chunk, and that seems like a nice round number.  */
588
589#define PLT_ENTRIES_PER_CHUNK 254
590
591/* PLT entries are actually used as stub functions for lazy symbol
592   resolution.  Once the symbol is resolved, the stub function is never
593   invoked.  Note: the 32-byte frame size used here cannot be changed
594   without a corresponding change in the runtime linker.  */
595
596static const bfd_byte elf_xtensa_be_plt_entry[][PLT_ENTRY_SIZE] =
597{
598    {
599      0x6c, 0x10, 0x04,	/* entry sp, 32 */
600      0x18, 0x00, 0x00,	/* l32r  a8, [got entry for rtld's resolver] */
601      0x1a, 0x00, 0x00,	/* l32r  a10, [got entry for rtld's link map] */
602      0x1b, 0x00, 0x00,	/* l32r  a11, [literal for reloc index] */
603      0x0a, 0x80, 0x00,	/* jx    a8 */
604      0			/* unused */
605    },
606    {
607      0x18, 0x00, 0x00,	/* l32r  a8, [got entry for rtld's resolver] */
608      0x1a, 0x00, 0x00,	/* l32r  a10, [got entry for rtld's link map] */
609      0x1b, 0x00, 0x00,	/* l32r  a11, [literal for reloc index] */
610      0x0a, 0x80, 0x00,	/* jx    a8 */
611      0			/* unused */
612    }
613};
614
615static const bfd_byte elf_xtensa_le_plt_entry[][PLT_ENTRY_SIZE] =
616{
617    {
618      0x36, 0x41, 0x00,	/* entry sp, 32 */
619      0x81, 0x00, 0x00,	/* l32r  a8, [got entry for rtld's resolver] */
620      0xa1, 0x00, 0x00,	/* l32r  a10, [got entry for rtld's link map] */
621      0xb1, 0x00, 0x00,	/* l32r  a11, [literal for reloc index] */
622      0xa0, 0x08, 0x00,	/* jx    a8 */
623      0			/* unused */
624    },
625    {
626      0x81, 0x00, 0x00,	/* l32r  a8, [got entry for rtld's resolver] */
627      0xa1, 0x00, 0x00,	/* l32r  a10, [got entry for rtld's link map] */
628      0xb1, 0x00, 0x00,	/* l32r  a11, [literal for reloc index] */
629      0xa0, 0x08, 0x00,	/* jx    a8 */
630      0			/* unused */
631    }
632};
633
634/* The size of the thread control block.  */
635#define TCB_SIZE	8
636
637struct elf_xtensa_link_hash_entry
638{
639  struct elf_link_hash_entry elf;
640
641  bfd_signed_vma tlsfunc_refcount;
642
643#define GOT_UNKNOWN	0
644#define GOT_NORMAL	1
645#define GOT_TLS_GD	2	/* global or local dynamic */
646#define GOT_TLS_IE	4	/* initial or local exec */
647#define GOT_TLS_ANY	(GOT_TLS_GD | GOT_TLS_IE)
648  unsigned char tls_type;
649};
650
651#define elf_xtensa_hash_entry(ent) ((struct elf_xtensa_link_hash_entry *)(ent))
652
653struct elf_xtensa_obj_tdata
654{
655  struct elf_obj_tdata root;
656
657  /* tls_type for each local got entry.  */
658  char *local_got_tls_type;
659
660  bfd_signed_vma *local_tlsfunc_refcounts;
661};
662
663#define elf_xtensa_tdata(abfd) \
664  ((struct elf_xtensa_obj_tdata *) (abfd)->tdata.any)
665
666#define elf_xtensa_local_got_tls_type(abfd) \
667  (elf_xtensa_tdata (abfd)->local_got_tls_type)
668
669#define elf_xtensa_local_tlsfunc_refcounts(abfd) \
670  (elf_xtensa_tdata (abfd)->local_tlsfunc_refcounts)
671
672#define is_xtensa_elf(bfd) \
673  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
674   && elf_tdata (bfd) != NULL \
675   && elf_object_id (bfd) == XTENSA_ELF_DATA)
676
677static bool
678elf_xtensa_mkobject (bfd *abfd)
679{
680  return bfd_elf_allocate_object (abfd, sizeof (struct elf_xtensa_obj_tdata),
681				  XTENSA_ELF_DATA);
682}
683
684/* Xtensa ELF linker hash table.  */
685
686struct elf_xtensa_link_hash_table
687{
688  struct elf_link_hash_table elf;
689
690  /* Short-cuts to get to dynamic linker sections.  */
691  asection *sgotloc;
692  asection *spltlittbl;
693
694  /* Total count of PLT relocations seen during check_relocs.
695     The actual PLT code must be split into multiple sections and all
696     the sections have to be created before size_dynamic_sections,
697     where we figure out the exact number of PLT entries that will be
698     needed.  It is OK if this count is an overestimate, e.g., some
699     relocations may be removed by GC.  */
700  int plt_reloc_count;
701
702  struct elf_xtensa_link_hash_entry *tlsbase;
703};
704
705/* Get the Xtensa ELF linker hash table from a link_info structure.  */
706
707#define elf_xtensa_hash_table(p) \
708  ((is_elf_hash_table ((p)->hash)					\
709    && elf_hash_table_id (elf_hash_table (p)) == XTENSA_ELF_DATA)	\
710   ? (struct elf_xtensa_link_hash_table *) (p)->hash : NULL)
711
712/* Create an entry in an Xtensa ELF linker hash table.  */
713
714static struct bfd_hash_entry *
715elf_xtensa_link_hash_newfunc (struct bfd_hash_entry *entry,
716			      struct bfd_hash_table *table,
717			      const char *string)
718{
719  /* Allocate the structure if it has not already been allocated by a
720     subclass.  */
721  if (entry == NULL)
722    {
723      entry = bfd_hash_allocate (table,
724				 sizeof (struct elf_xtensa_link_hash_entry));
725      if (entry == NULL)
726	return entry;
727    }
728
729  /* Call the allocation method of the superclass.  */
730  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
731  if (entry != NULL)
732    {
733      struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (entry);
734      eh->tlsfunc_refcount = 0;
735      eh->tls_type = GOT_UNKNOWN;
736    }
737
738  return entry;
739}
740
741/* Create an Xtensa ELF linker hash table.  */
742
743static struct bfd_link_hash_table *
744elf_xtensa_link_hash_table_create (bfd *abfd)
745{
746  struct elf_link_hash_entry *tlsbase;
747  struct elf_xtensa_link_hash_table *ret;
748  size_t amt = sizeof (struct elf_xtensa_link_hash_table);
749
750  ret = bfd_zmalloc (amt);
751  if (ret == NULL)
752    return NULL;
753
754  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
755				      elf_xtensa_link_hash_newfunc,
756				      sizeof (struct elf_xtensa_link_hash_entry),
757				      XTENSA_ELF_DATA))
758    {
759      free (ret);
760      return NULL;
761    }
762
763  /* Create a hash entry for "_TLS_MODULE_BASE_" to speed up checking
764     for it later.  */
765  tlsbase = elf_link_hash_lookup (&ret->elf, "_TLS_MODULE_BASE_",
766				  true, false, false);
767  tlsbase->root.type = bfd_link_hash_new;
768  tlsbase->root.u.undef.abfd = NULL;
769  tlsbase->non_elf = 0;
770  ret->elf.dt_pltgot_required = true;
771  ret->tlsbase = elf_xtensa_hash_entry (tlsbase);
772  ret->tlsbase->tls_type = GOT_UNKNOWN;
773
774  return &ret->elf.root;
775}
776
777/* Copy the extra info we tack onto an elf_link_hash_entry.  */
778
779static void
780elf_xtensa_copy_indirect_symbol (struct bfd_link_info *info,
781				 struct elf_link_hash_entry *dir,
782				 struct elf_link_hash_entry *ind)
783{
784  struct elf_xtensa_link_hash_entry *edir, *eind;
785
786  edir = elf_xtensa_hash_entry (dir);
787  eind = elf_xtensa_hash_entry (ind);
788
789  if (ind->root.type == bfd_link_hash_indirect)
790    {
791      edir->tlsfunc_refcount += eind->tlsfunc_refcount;
792      eind->tlsfunc_refcount = 0;
793
794      if (dir->got.refcount <= 0)
795	{
796	  edir->tls_type = eind->tls_type;
797	  eind->tls_type = GOT_UNKNOWN;
798	}
799    }
800
801  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
802}
803
804static inline bool
805elf_xtensa_dynamic_symbol_p (struct elf_link_hash_entry *h,
806			     struct bfd_link_info *info)
807{
808  /* Check if we should do dynamic things to this symbol.  The
809     "ignore_protected" argument need not be set, because Xtensa code
810     does not require special handling of STV_PROTECTED to make function
811     pointer comparisons work properly.  The PLT addresses are never
812     used for function pointers.  */
813
814  return _bfd_elf_dynamic_symbol_p (h, info, 0);
815}
816
817
818static int
819property_table_compare (const void *ap, const void *bp)
820{
821  const property_table_entry *a = (const property_table_entry *) ap;
822  const property_table_entry *b = (const property_table_entry *) bp;
823
824  if (a->address == b->address)
825    {
826      if (a->size != b->size)
827	return (a->size - b->size);
828
829      if ((a->flags & XTENSA_PROP_ALIGN) != (b->flags & XTENSA_PROP_ALIGN))
830	return ((b->flags & XTENSA_PROP_ALIGN)
831		- (a->flags & XTENSA_PROP_ALIGN));
832
833      if ((a->flags & XTENSA_PROP_ALIGN)
834	  && (GET_XTENSA_PROP_ALIGNMENT (a->flags)
835	      != GET_XTENSA_PROP_ALIGNMENT (b->flags)))
836	return (GET_XTENSA_PROP_ALIGNMENT (a->flags)
837		- GET_XTENSA_PROP_ALIGNMENT (b->flags));
838
839      if ((a->flags & XTENSA_PROP_UNREACHABLE)
840	  != (b->flags & XTENSA_PROP_UNREACHABLE))
841	return ((b->flags & XTENSA_PROP_UNREACHABLE)
842		- (a->flags & XTENSA_PROP_UNREACHABLE));
843
844      return (a->flags - b->flags);
845    }
846
847  return (a->address - b->address);
848}
849
850
851static int
852property_table_matches (const void *ap, const void *bp)
853{
854  const property_table_entry *a = (const property_table_entry *) ap;
855  const property_table_entry *b = (const property_table_entry *) bp;
856
857  /* Check if one entry overlaps with the other.  */
858  if ((b->address >= a->address && b->address < (a->address + a->size))
859      || (a->address >= b->address && a->address < (b->address + b->size)))
860    return 0;
861
862  return (a->address - b->address);
863}
864
865
866/* Get the literal table or property table entries for the given
867   section.  Sets TABLE_P and returns the number of entries.  On
868   error, returns a negative value.  */
869
870int
871xtensa_read_table_entries (bfd *abfd,
872			   asection *section,
873			   property_table_entry **table_p,
874			   const char *sec_name,
875			   bool output_addr)
876{
877  asection *table_section;
878  bfd_size_type table_size = 0;
879  bfd_byte *table_data;
880  property_table_entry *blocks;
881  int blk, block_count;
882  bfd_size_type num_records;
883  Elf_Internal_Rela *internal_relocs, *irel, *rel_end;
884  bfd_vma section_addr, off;
885  flagword predef_flags;
886  bfd_size_type table_entry_size, section_limit;
887
888  if (bfd_get_flavour (abfd) != bfd_target_elf_flavour
889      || !section
890      || !(section->flags & SEC_ALLOC)
891      || (section->flags & SEC_DEBUGGING))
892    {
893      *table_p = NULL;
894      return 0;
895    }
896
897  table_section = xtensa_get_property_section (section, sec_name);
898  if (table_section)
899    table_size = table_section->size;
900
901  if (table_size == 0)
902    {
903      *table_p = NULL;
904      return 0;
905    }
906
907  predef_flags = xtensa_get_property_predef_flags (table_section);
908  table_entry_size = 12;
909  if (predef_flags)
910    table_entry_size -= 4;
911
912  num_records = table_size / table_entry_size;
913
914  table_data = retrieve_contents (abfd, table_section, true);
915  if (table_data == NULL)
916    {
917      *table_p = NULL;
918      return 0;
919    }
920
921  blocks = (property_table_entry *)
922    bfd_malloc (num_records * sizeof (property_table_entry));
923  block_count = 0;
924
925  if (output_addr)
926    section_addr = section->output_section->vma + section->output_offset;
927  else
928    section_addr = section->vma;
929
930  internal_relocs = retrieve_internal_relocs (abfd, table_section, true);
931  if (internal_relocs && !table_section->reloc_done)
932    {
933      qsort (internal_relocs, table_section->reloc_count,
934	     sizeof (Elf_Internal_Rela), internal_reloc_compare);
935      irel = internal_relocs;
936    }
937  else
938    irel = NULL;
939
940  section_limit = bfd_get_section_limit (abfd, section);
941  rel_end = internal_relocs + table_section->reloc_count;
942
943  for (off = 0; off < table_size; off += table_entry_size)
944    {
945      bfd_vma address = bfd_get_32 (abfd, table_data + off);
946
947      /* Skip any relocations before the current offset.  This should help
948	 avoid confusion caused by unexpected relocations for the preceding
949	 table entry.  */
950      while (irel &&
951	     (irel->r_offset < off
952	      || (irel->r_offset == off
953		  && ELF32_R_TYPE (irel->r_info) == R_XTENSA_NONE)))
954	{
955	  irel += 1;
956	  if (irel >= rel_end)
957	    irel = 0;
958	}
959
960      if (irel && irel->r_offset == off)
961	{
962	  bfd_vma sym_off;
963	  unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
964	  BFD_ASSERT (ELF32_R_TYPE (irel->r_info) == R_XTENSA_32);
965
966	  if (get_elf_r_symndx_section (abfd, r_symndx) != section)
967	    continue;
968
969	  sym_off = get_elf_r_symndx_offset (abfd, r_symndx);
970	  BFD_ASSERT (sym_off == 0);
971	  address += (section_addr + sym_off + irel->r_addend);
972	}
973      else
974	{
975	  if (address < section_addr
976	      || address >= section_addr + section_limit)
977	    continue;
978	}
979
980      blocks[block_count].address = address;
981      blocks[block_count].size = bfd_get_32 (abfd, table_data + off + 4);
982      if (predef_flags)
983	blocks[block_count].flags = predef_flags;
984      else
985	blocks[block_count].flags = bfd_get_32 (abfd, table_data + off + 8);
986      block_count++;
987    }
988
989  release_contents (table_section, table_data);
990  release_internal_relocs (table_section, internal_relocs);
991
992  if (block_count > 0)
993    {
994      /* Now sort them into address order for easy reference.  */
995      qsort (blocks, block_count, sizeof (property_table_entry),
996	     property_table_compare);
997
998      /* Check that the table contents are valid.  Problems may occur,
999	 for example, if an unrelocated object file is stripped.  */
1000      for (blk = 1; blk < block_count; blk++)
1001	{
1002	  /* The only circumstance where two entries may legitimately
1003	     have the same address is when one of them is a zero-size
1004	     placeholder to mark a place where fill can be inserted.
1005	     The zero-size entry should come first.  */
1006	  if (blocks[blk - 1].address == blocks[blk].address &&
1007	      blocks[blk - 1].size != 0)
1008	    {
1009	      /* xgettext:c-format */
1010	      _bfd_error_handler (_("%pB(%pA): invalid property table"),
1011				  abfd, section);
1012	      bfd_set_error (bfd_error_bad_value);
1013	      free (blocks);
1014	      return -1;
1015	    }
1016	}
1017    }
1018
1019  *table_p = blocks;
1020  return block_count;
1021}
1022
1023
1024static property_table_entry *
1025elf_xtensa_find_property_entry (property_table_entry *property_table,
1026				int property_table_size,
1027				bfd_vma addr)
1028{
1029  property_table_entry entry;
1030  property_table_entry *rv;
1031
1032  if (property_table_size == 0)
1033    return NULL;
1034
1035  entry.address = addr;
1036  entry.size = 1;
1037  entry.flags = 0;
1038
1039  rv = bsearch (&entry, property_table, property_table_size,
1040		sizeof (property_table_entry), property_table_matches);
1041  return rv;
1042}
1043
1044
1045static bool
1046elf_xtensa_in_literal_pool (property_table_entry *lit_table,
1047			    int lit_table_size,
1048			    bfd_vma addr)
1049{
1050  if (elf_xtensa_find_property_entry (lit_table, lit_table_size, addr))
1051    return true;
1052
1053  return false;
1054}
1055
1056
1057/* Look through the relocs for a section during the first phase, and
1058   calculate needed space in the dynamic reloc sections.  */
1059
1060static bool
1061elf_xtensa_check_relocs (bfd *abfd,
1062			 struct bfd_link_info *info,
1063			 asection *sec,
1064			 const Elf_Internal_Rela *relocs)
1065{
1066  struct elf_xtensa_link_hash_table *htab;
1067  Elf_Internal_Shdr *symtab_hdr;
1068  struct elf_link_hash_entry **sym_hashes;
1069  const Elf_Internal_Rela *rel;
1070  const Elf_Internal_Rela *rel_end;
1071
1072  if (bfd_link_relocatable (info))
1073    return true;
1074
1075  BFD_ASSERT (is_xtensa_elf (abfd));
1076
1077  htab = elf_xtensa_hash_table (info);
1078  if (htab == NULL)
1079    return false;
1080
1081  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1082  sym_hashes = elf_sym_hashes (abfd);
1083
1084  rel_end = relocs + sec->reloc_count;
1085  for (rel = relocs; rel < rel_end; rel++)
1086    {
1087      unsigned int r_type;
1088      unsigned r_symndx;
1089      struct elf_link_hash_entry *h = NULL;
1090      struct elf_xtensa_link_hash_entry *eh;
1091      int tls_type, old_tls_type;
1092      bool is_got = false;
1093      bool is_plt = false;
1094      bool is_tlsfunc = false;
1095
1096      r_symndx = ELF32_R_SYM (rel->r_info);
1097      r_type = ELF32_R_TYPE (rel->r_info);
1098
1099      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1100	{
1101	  /* xgettext:c-format */
1102	  _bfd_error_handler (_("%pB: bad symbol index: %d"),
1103			      abfd, r_symndx);
1104	  return false;
1105	}
1106
1107      if (r_symndx >= symtab_hdr->sh_info)
1108	{
1109	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1110	  while (h->root.type == bfd_link_hash_indirect
1111		 || h->root.type == bfd_link_hash_warning)
1112	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1113	}
1114      eh = elf_xtensa_hash_entry (h);
1115
1116      switch (r_type)
1117	{
1118	case R_XTENSA_TLSDESC_FN:
1119	  if (bfd_link_pic (info))
1120	    {
1121	      tls_type = GOT_TLS_GD;
1122	      is_got = true;
1123	      is_tlsfunc = true;
1124	    }
1125	  else
1126	    tls_type = GOT_TLS_IE;
1127	  break;
1128
1129	case R_XTENSA_TLSDESC_ARG:
1130	  if (bfd_link_pic (info))
1131	    {
1132	      tls_type = GOT_TLS_GD;
1133	      is_got = true;
1134	    }
1135	  else
1136	    {
1137	      tls_type = GOT_TLS_IE;
1138	      if (h && elf_xtensa_hash_entry (h) != htab->tlsbase)
1139		is_got = true;
1140	    }
1141	  break;
1142
1143	case R_XTENSA_TLS_DTPOFF:
1144	  if (bfd_link_pic (info))
1145	    tls_type = GOT_TLS_GD;
1146	  else
1147	    tls_type = GOT_TLS_IE;
1148	  break;
1149
1150	case R_XTENSA_TLS_TPOFF:
1151	  tls_type = GOT_TLS_IE;
1152	  if (bfd_link_pic (info))
1153	    info->flags |= DF_STATIC_TLS;
1154	  if (bfd_link_pic (info) || h)
1155	    is_got = true;
1156	  break;
1157
1158	case R_XTENSA_32:
1159	  tls_type = GOT_NORMAL;
1160	  is_got = true;
1161	  break;
1162
1163	case R_XTENSA_PLT:
1164	  tls_type = GOT_NORMAL;
1165	  is_plt = true;
1166	  break;
1167
1168	case R_XTENSA_GNU_VTINHERIT:
1169	  /* This relocation describes the C++ object vtable hierarchy.
1170	     Reconstruct it for later use during GC.  */
1171	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1172	    return false;
1173	  continue;
1174
1175	case R_XTENSA_GNU_VTENTRY:
1176	  /* This relocation describes which C++ vtable entries are actually
1177	     used.  Record for later use during GC.  */
1178	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1179	    return false;
1180	  continue;
1181
1182	default:
1183	  /* Nothing to do for any other relocations.  */
1184	  continue;
1185	}
1186
1187      if (h)
1188	{
1189	  if (is_plt)
1190	    {
1191	      if (h->plt.refcount <= 0)
1192		{
1193		  h->needs_plt = 1;
1194		  h->plt.refcount = 1;
1195		}
1196	      else
1197		h->plt.refcount += 1;
1198
1199	      /* Keep track of the total PLT relocation count even if we
1200		 don't yet know whether the dynamic sections will be
1201		 created.  */
1202	      htab->plt_reloc_count += 1;
1203
1204	      if (elf_hash_table (info)->dynamic_sections_created)
1205		{
1206		  if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1207		    return false;
1208		}
1209	    }
1210	  else if (is_got)
1211	    {
1212	      if (h->got.refcount <= 0)
1213		h->got.refcount = 1;
1214	      else
1215		h->got.refcount += 1;
1216	    }
1217
1218	  if (is_tlsfunc)
1219	    eh->tlsfunc_refcount += 1;
1220
1221	  old_tls_type = eh->tls_type;
1222	}
1223      else
1224	{
1225	  /* Allocate storage the first time.  */
1226	  if (elf_local_got_refcounts (abfd) == NULL)
1227	    {
1228	      bfd_size_type size = symtab_hdr->sh_info;
1229	      void *mem;
1230
1231	      mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1232	      if (mem == NULL)
1233		return false;
1234	      elf_local_got_refcounts (abfd) = (bfd_signed_vma *) mem;
1235
1236	      mem = bfd_zalloc (abfd, size);
1237	      if (mem == NULL)
1238		return false;
1239	      elf_xtensa_local_got_tls_type (abfd) = (char *) mem;
1240
1241	      mem = bfd_zalloc (abfd, size * sizeof (bfd_signed_vma));
1242	      if (mem == NULL)
1243		return false;
1244	      elf_xtensa_local_tlsfunc_refcounts (abfd)
1245		= (bfd_signed_vma *) mem;
1246	    }
1247
1248	  /* This is a global offset table entry for a local symbol.  */
1249	  if (is_got || is_plt)
1250	    elf_local_got_refcounts (abfd) [r_symndx] += 1;
1251
1252	  if (is_tlsfunc)
1253	    elf_xtensa_local_tlsfunc_refcounts (abfd) [r_symndx] += 1;
1254
1255	  old_tls_type = elf_xtensa_local_got_tls_type (abfd) [r_symndx];
1256	}
1257
1258      if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1259	tls_type |= old_tls_type;
1260      /* If a TLS symbol is accessed using IE at least once,
1261	 there is no point to use a dynamic model for it.  */
1262      else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1263	       && ((old_tls_type & GOT_TLS_GD) == 0
1264		   || (tls_type & GOT_TLS_IE) == 0))
1265	{
1266	  if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_GD))
1267	    tls_type = old_tls_type;
1268	  else if ((old_tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_GD))
1269	    tls_type |= old_tls_type;
1270	  else
1271	    {
1272	      _bfd_error_handler
1273		/* xgettext:c-format */
1274		(_("%pB: `%s' accessed both as normal and thread local symbol"),
1275		 abfd,
1276		 h ? h->root.root.string : "<local>");
1277	      return false;
1278	    }
1279	}
1280
1281      if (old_tls_type != tls_type)
1282	{
1283	  if (eh)
1284	    eh->tls_type = tls_type;
1285	  else
1286	    elf_xtensa_local_got_tls_type (abfd) [r_symndx] = tls_type;
1287	}
1288    }
1289
1290  return true;
1291}
1292
1293
1294static void
1295elf_xtensa_make_sym_local (struct bfd_link_info *info,
1296			   struct elf_link_hash_entry *h)
1297{
1298  if (bfd_link_pic (info))
1299    {
1300      if (h->plt.refcount > 0)
1301	{
1302	  /* For shared objects, there's no need for PLT entries for local
1303	     symbols (use RELATIVE relocs instead of JMP_SLOT relocs).  */
1304	  if (h->got.refcount < 0)
1305	    h->got.refcount = 0;
1306	  h->got.refcount += h->plt.refcount;
1307	  h->plt.refcount = 0;
1308	}
1309    }
1310  else
1311    {
1312      /* Don't need any dynamic relocations at all.  */
1313      h->plt.refcount = 0;
1314      h->got.refcount = 0;
1315    }
1316}
1317
1318
1319static void
1320elf_xtensa_hide_symbol (struct bfd_link_info *info,
1321			struct elf_link_hash_entry *h,
1322			bool force_local)
1323{
1324  /* For a shared link, move the plt refcount to the got refcount to leave
1325     space for RELATIVE relocs.  */
1326  elf_xtensa_make_sym_local (info, h);
1327
1328  _bfd_elf_link_hash_hide_symbol (info, h, force_local);
1329}
1330
1331
1332/* Return the section that should be marked against GC for a given
1333   relocation.  */
1334
1335static asection *
1336elf_xtensa_gc_mark_hook (asection *sec,
1337			 struct bfd_link_info *info,
1338			 Elf_Internal_Rela *rel,
1339			 struct elf_link_hash_entry *h,
1340			 Elf_Internal_Sym *sym)
1341{
1342  /* Property sections are marked "KEEP" in the linker scripts, but they
1343     should not cause other sections to be marked.  (This approach relies
1344     on elf_xtensa_discard_info to remove property table entries that
1345     describe discarded sections.  Alternatively, it might be more
1346     efficient to avoid using "KEEP" in the linker scripts and instead use
1347     the gc_mark_extra_sections hook to mark only the property sections
1348     that describe marked sections.  That alternative does not work well
1349     with the current property table sections, which do not correspond
1350     one-to-one with the sections they describe, but that should be fixed
1351     someday.) */
1352  if (xtensa_is_property_section (sec))
1353    return NULL;
1354
1355  if (h != NULL)
1356    switch (ELF32_R_TYPE (rel->r_info))
1357      {
1358      case R_XTENSA_GNU_VTINHERIT:
1359      case R_XTENSA_GNU_VTENTRY:
1360	return NULL;
1361      }
1362
1363  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1364}
1365
1366
1367/* Create all the dynamic sections.  */
1368
1369static bool
1370elf_xtensa_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1371{
1372  struct elf_xtensa_link_hash_table *htab;
1373  flagword flags, noalloc_flags;
1374
1375  htab = elf_xtensa_hash_table (info);
1376  if (htab == NULL)
1377    return false;
1378
1379  /* First do all the standard stuff.  */
1380  if (! _bfd_elf_create_dynamic_sections (dynobj, info))
1381    return false;
1382
1383  /* Create any extra PLT sections in case check_relocs has already
1384     been called on all the non-dynamic input files.  */
1385  if (! add_extra_plt_sections (info, htab->plt_reloc_count))
1386    return false;
1387
1388  noalloc_flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
1389		   | SEC_LINKER_CREATED | SEC_READONLY);
1390  flags = noalloc_flags | SEC_ALLOC | SEC_LOAD;
1391
1392  /* Mark the ".got.plt" section READONLY.  */
1393  if (htab->elf.sgotplt == NULL
1394      || !bfd_set_section_flags (htab->elf.sgotplt, flags))
1395    return false;
1396
1397  /* Create ".got.loc" (literal tables for use by dynamic linker).  */
1398  htab->sgotloc = bfd_make_section_anyway_with_flags (dynobj, ".got.loc",
1399						      flags);
1400  if (htab->sgotloc == NULL
1401      || !bfd_set_section_alignment (htab->sgotloc, 2))
1402    return false;
1403
1404  /* Create ".xt.lit.plt" (literal table for ".got.plt*").  */
1405  htab->spltlittbl = bfd_make_section_anyway_with_flags (dynobj, ".xt.lit.plt",
1406							 noalloc_flags);
1407  if (htab->spltlittbl == NULL
1408      || !bfd_set_section_alignment (htab->spltlittbl, 2))
1409    return false;
1410
1411  return true;
1412}
1413
1414
1415static bool
1416add_extra_plt_sections (struct bfd_link_info *info, int count)
1417{
1418  bfd *dynobj = elf_hash_table (info)->dynobj;
1419  int chunk;
1420
1421  /* Iterate over all chunks except 0 which uses the standard ".plt" and
1422     ".got.plt" sections.  */
1423  for (chunk = count / PLT_ENTRIES_PER_CHUNK; chunk > 0; chunk--)
1424    {
1425      char *sname;
1426      flagword flags;
1427      asection *s;
1428
1429      /* Stop when we find a section has already been created.  */
1430      if (elf_xtensa_get_plt_section (info, chunk))
1431	break;
1432
1433      flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1434	       | SEC_LINKER_CREATED | SEC_READONLY);
1435
1436      sname = (char *) bfd_malloc (10);
1437      sprintf (sname, ".plt.%u", chunk);
1438      s = bfd_make_section_anyway_with_flags (dynobj, sname, flags | SEC_CODE);
1439      if (s == NULL
1440	  || !bfd_set_section_alignment (s, 2))
1441	return false;
1442
1443      sname = (char *) bfd_malloc (14);
1444      sprintf (sname, ".got.plt.%u", chunk);
1445      s = bfd_make_section_anyway_with_flags (dynobj, sname, flags);
1446      if (s == NULL
1447	  || !bfd_set_section_alignment (s, 2))
1448	return false;
1449    }
1450
1451  return true;
1452}
1453
1454
1455/* Adjust a symbol defined by a dynamic object and referenced by a
1456   regular object.  The current definition is in some section of the
1457   dynamic object, but we're not including those sections.  We have to
1458   change the definition to something the rest of the link can
1459   understand.  */
1460
1461static bool
1462elf_xtensa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1463				  struct elf_link_hash_entry *h)
1464{
1465  /* If this is a weak symbol, and there is a real definition, the
1466     processor independent code will have arranged for us to see the
1467     real definition first, and we can just use the same value.  */
1468  if (h->is_weakalias)
1469    {
1470      struct elf_link_hash_entry *def = weakdef (h);
1471      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1472      h->root.u.def.section = def->root.u.def.section;
1473      h->root.u.def.value = def->root.u.def.value;
1474      return true;
1475    }
1476
1477  /* This is a reference to a symbol defined by a dynamic object.  The
1478     reference must go through the GOT, so there's no need for COPY relocs,
1479     .dynbss, etc.  */
1480
1481  return true;
1482}
1483
1484
1485static bool
1486elf_xtensa_allocate_dynrelocs (struct elf_link_hash_entry *h, void *arg)
1487{
1488  struct bfd_link_info *info;
1489  struct elf_xtensa_link_hash_table *htab;
1490  struct elf_xtensa_link_hash_entry *eh = elf_xtensa_hash_entry (h);
1491
1492  if (h->root.type == bfd_link_hash_indirect)
1493    return true;
1494
1495  info = (struct bfd_link_info *) arg;
1496  htab = elf_xtensa_hash_table (info);
1497  if (htab == NULL)
1498    return false;
1499
1500  /* If we saw any use of an IE model for this symbol, we can then optimize
1501     away GOT entries for any TLSDESC_FN relocs.  */
1502  if ((eh->tls_type & GOT_TLS_IE) != 0)
1503    {
1504      BFD_ASSERT (h->got.refcount >= eh->tlsfunc_refcount);
1505      h->got.refcount -= eh->tlsfunc_refcount;
1506    }
1507
1508  if (! elf_xtensa_dynamic_symbol_p (h, info))
1509    elf_xtensa_make_sym_local (info, h);
1510
1511  if (! elf_xtensa_dynamic_symbol_p (h, info)
1512      && h->root.type == bfd_link_hash_undefweak)
1513    return true;
1514
1515  if (h->plt.refcount > 0)
1516    htab->elf.srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
1517
1518  if (h->got.refcount > 0)
1519    htab->elf.srelgot->size += (h->got.refcount * sizeof (Elf32_External_Rela));
1520
1521  return true;
1522}
1523
1524
1525static void
1526elf_xtensa_allocate_local_got_size (struct bfd_link_info *info)
1527{
1528  struct elf_xtensa_link_hash_table *htab;
1529  bfd *i;
1530
1531  htab = elf_xtensa_hash_table (info);
1532  if (htab == NULL)
1533    return;
1534
1535  for (i = info->input_bfds; i; i = i->link.next)
1536    {
1537      bfd_signed_vma *local_got_refcounts;
1538      bfd_size_type j, cnt;
1539      Elf_Internal_Shdr *symtab_hdr;
1540
1541      local_got_refcounts = elf_local_got_refcounts (i);
1542      if (!local_got_refcounts)
1543	continue;
1544
1545      symtab_hdr = &elf_tdata (i)->symtab_hdr;
1546      cnt = symtab_hdr->sh_info;
1547
1548      for (j = 0; j < cnt; ++j)
1549	{
1550	  /* If we saw any use of an IE model for this symbol, we can
1551	     then optimize away GOT entries for any TLSDESC_FN relocs.  */
1552	  if ((elf_xtensa_local_got_tls_type (i) [j] & GOT_TLS_IE) != 0)
1553	    {
1554	      bfd_signed_vma *tlsfunc_refcount
1555		= &elf_xtensa_local_tlsfunc_refcounts (i) [j];
1556	      BFD_ASSERT (local_got_refcounts[j] >= *tlsfunc_refcount);
1557	      local_got_refcounts[j] -= *tlsfunc_refcount;
1558	    }
1559
1560	  if (local_got_refcounts[j] > 0)
1561	    htab->elf.srelgot->size += (local_got_refcounts[j]
1562					* sizeof (Elf32_External_Rela));
1563	}
1564    }
1565}
1566
1567
1568/* Set the sizes of the dynamic sections.  */
1569
1570static bool
1571elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1572				  struct bfd_link_info *info)
1573{
1574  struct elf_xtensa_link_hash_table *htab;
1575  bfd *dynobj, *abfd;
1576  asection *s, *srelplt, *splt, *sgotplt, *srelgot, *spltlittbl, *sgotloc;
1577  bool relplt, relgot;
1578  int plt_entries, plt_chunks, chunk;
1579
1580  plt_entries = 0;
1581  plt_chunks = 0;
1582
1583  htab = elf_xtensa_hash_table (info);
1584  if (htab == NULL)
1585    return false;
1586
1587  dynobj = elf_hash_table (info)->dynobj;
1588  if (dynobj == NULL)
1589    abort ();
1590  srelgot = htab->elf.srelgot;
1591  srelplt = htab->elf.srelplt;
1592
1593  if (elf_hash_table (info)->dynamic_sections_created)
1594    {
1595      BFD_ASSERT (htab->elf.srelgot != NULL
1596		  && htab->elf.srelplt != NULL
1597		  && htab->elf.sgot != NULL
1598		  && htab->spltlittbl != NULL
1599		  && htab->sgotloc != NULL);
1600
1601      /* Set the contents of the .interp section to the interpreter.  */
1602      if (bfd_link_executable (info) && !info->nointerp)
1603	{
1604	  s = bfd_get_linker_section (dynobj, ".interp");
1605	  if (s == NULL)
1606	    abort ();
1607	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1608	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1609	}
1610
1611      /* Allocate room for one word in ".got".  */
1612      htab->elf.sgot->size = 4;
1613
1614      /* Allocate space in ".rela.got" for literals that reference global
1615	 symbols and space in ".rela.plt" for literals that have PLT
1616	 entries.  */
1617      elf_link_hash_traverse (elf_hash_table (info),
1618			      elf_xtensa_allocate_dynrelocs,
1619			      (void *) info);
1620
1621      /* If we are generating a shared object, we also need space in
1622	 ".rela.got" for R_XTENSA_RELATIVE relocs for literals that
1623	 reference local symbols.  */
1624      if (bfd_link_pic (info))
1625	elf_xtensa_allocate_local_got_size (info);
1626
1627      /* Allocate space in ".plt" to match the size of ".rela.plt".  For
1628	 each PLT entry, we need the PLT code plus a 4-byte literal.
1629	 For each chunk of ".plt", we also need two more 4-byte
1630	 literals, two corresponding entries in ".rela.got", and an
1631	 8-byte entry in ".xt.lit.plt".  */
1632      spltlittbl = htab->spltlittbl;
1633      plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
1634      plt_chunks =
1635	(plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
1636
1637      /* Iterate over all the PLT chunks, including any extra sections
1638	 created earlier because the initial count of PLT relocations
1639	 was an overestimate.  */
1640      for (chunk = 0;
1641	   (splt = elf_xtensa_get_plt_section (info, chunk)) != NULL;
1642	   chunk++)
1643	{
1644	  int chunk_entries;
1645
1646	  sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
1647	  BFD_ASSERT (sgotplt != NULL);
1648
1649	  if (chunk < plt_chunks - 1)
1650	    chunk_entries = PLT_ENTRIES_PER_CHUNK;
1651	  else if (chunk == plt_chunks - 1)
1652	    chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
1653	  else
1654	    chunk_entries = 0;
1655
1656	  if (chunk_entries != 0)
1657	    {
1658	      sgotplt->size = 4 * (chunk_entries + 2);
1659	      splt->size = PLT_ENTRY_SIZE * chunk_entries;
1660	      srelgot->size += 2 * sizeof (Elf32_External_Rela);
1661	      spltlittbl->size += 8;
1662	    }
1663	  else
1664	    {
1665	      sgotplt->size = 0;
1666	      splt->size = 0;
1667	    }
1668	}
1669
1670      /* Allocate space in ".got.loc" to match the total size of all the
1671	 literal tables.  */
1672      sgotloc = htab->sgotloc;
1673      sgotloc->size = spltlittbl->size;
1674      for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
1675	{
1676	  if (abfd->flags & DYNAMIC)
1677	    continue;
1678	  for (s = abfd->sections; s != NULL; s = s->next)
1679	    {
1680	      if (! discarded_section (s)
1681		  && xtensa_is_littable_section (s)
1682		  && s != spltlittbl)
1683		sgotloc->size += s->size;
1684	    }
1685	}
1686    }
1687
1688  /* Allocate memory for dynamic sections.  */
1689  relplt = false;
1690  relgot = false;
1691  for (s = dynobj->sections; s != NULL; s = s->next)
1692    {
1693      const char *name;
1694
1695      if ((s->flags & SEC_LINKER_CREATED) == 0)
1696	continue;
1697
1698      /* It's OK to base decisions on the section name, because none
1699	 of the dynobj section names depend upon the input files.  */
1700      name = bfd_section_name (s);
1701
1702      if (startswith (name, ".rela"))
1703	{
1704	  if (s->size != 0)
1705	    {
1706	      if (strcmp (name, ".rela.plt") == 0)
1707		relplt = true;
1708	      else if (strcmp (name, ".rela.got") == 0)
1709		relgot = true;
1710
1711	      /* We use the reloc_count field as a counter if we need
1712		 to copy relocs into the output file.  */
1713	      s->reloc_count = 0;
1714	    }
1715	}
1716      else if (! startswith (name, ".plt.")
1717	       && ! startswith (name, ".got.plt.")
1718	       && strcmp (name, ".got") != 0
1719	       && strcmp (name, ".plt") != 0
1720	       && strcmp (name, ".got.plt") != 0
1721	       && strcmp (name, ".xt.lit.plt") != 0
1722	       && strcmp (name, ".got.loc") != 0)
1723	{
1724	  /* It's not one of our sections, so don't allocate space.  */
1725	  continue;
1726	}
1727
1728      if (s->size == 0)
1729	{
1730	  /* If we don't need this section, strip it from the output
1731	     file.  We must create the ".plt*" and ".got.plt*"
1732	     sections in create_dynamic_sections and/or check_relocs
1733	     based on a conservative estimate of the PLT relocation
1734	     count, because the sections must be created before the
1735	     linker maps input sections to output sections.  The
1736	     linker does that before size_dynamic_sections, where we
1737	     compute the exact size of the PLT, so there may be more
1738	     of these sections than are actually needed.  */
1739	  s->flags |= SEC_EXCLUDE;
1740	}
1741      else if ((s->flags & SEC_HAS_CONTENTS) != 0)
1742	{
1743	  /* Allocate memory for the section contents.  */
1744	  s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1745	  if (s->contents == NULL)
1746	    return false;
1747	}
1748    }
1749
1750  if (elf_hash_table (info)->dynamic_sections_created)
1751    {
1752      /* Add the special XTENSA_RTLD relocations now.  The offsets won't be
1753	 known until finish_dynamic_sections, but we need to get the relocs
1754	 in place before they are sorted.  */
1755      for (chunk = 0; chunk < plt_chunks; chunk++)
1756	{
1757	  Elf_Internal_Rela irela;
1758	  bfd_byte *loc;
1759
1760	  irela.r_offset = 0;
1761	  irela.r_info = ELF32_R_INFO (0, R_XTENSA_RTLD);
1762	  irela.r_addend = 0;
1763
1764	  loc = (srelgot->contents
1765		 + srelgot->reloc_count * sizeof (Elf32_External_Rela));
1766	  bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
1767	  bfd_elf32_swap_reloca_out (output_bfd, &irela,
1768				     loc + sizeof (Elf32_External_Rela));
1769	  srelgot->reloc_count += 2;
1770	}
1771
1772      /* Add some entries to the .dynamic section.  We fill in the
1773	 values later, in elf_xtensa_finish_dynamic_sections, but we
1774	 must add the entries now so that we get the correct size for
1775	 the .dynamic section.  The DT_DEBUG entry is filled in by the
1776	 dynamic linker and used by the debugger.  */
1777#define add_dynamic_entry(TAG, VAL) \
1778  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1779
1780      if (!_bfd_elf_add_dynamic_tags (output_bfd, info,
1781				      relplt || relgot))
1782	return false;
1783
1784      if (!add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0)
1785	  || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0))
1786	return false;
1787    }
1788#undef add_dynamic_entry
1789
1790  return true;
1791}
1792
1793static bool
1794elf_xtensa_always_size_sections (bfd *output_bfd,
1795				 struct bfd_link_info *info)
1796{
1797  struct elf_xtensa_link_hash_table *htab;
1798  asection *tls_sec;
1799
1800  htab = elf_xtensa_hash_table (info);
1801  if (htab == NULL)
1802    return false;
1803
1804  tls_sec = htab->elf.tls_sec;
1805
1806  if (tls_sec && (htab->tlsbase->tls_type & GOT_TLS_ANY) != 0)
1807    {
1808      struct elf_link_hash_entry *tlsbase = &htab->tlsbase->elf;
1809      struct bfd_link_hash_entry *bh = &tlsbase->root;
1810      const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
1811
1812      tlsbase->type = STT_TLS;
1813      if (!(_bfd_generic_link_add_one_symbol
1814	    (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
1815	     tls_sec, 0, NULL, false,
1816	     bed->collect, &bh)))
1817	return false;
1818      tlsbase->def_regular = 1;
1819      tlsbase->other = STV_HIDDEN;
1820      (*bed->elf_backend_hide_symbol) (info, tlsbase, true);
1821    }
1822
1823  return true;
1824}
1825
1826
1827/* Return the base VMA address which should be subtracted from real addresses
1828   when resolving @dtpoff relocation.
1829   This is PT_TLS segment p_vaddr.  */
1830
1831static bfd_vma
1832dtpoff_base (struct bfd_link_info *info)
1833{
1834  /* If tls_sec is NULL, we should have signalled an error already.  */
1835  if (elf_hash_table (info)->tls_sec == NULL)
1836    return 0;
1837  return elf_hash_table (info)->tls_sec->vma;
1838}
1839
1840/* Return the relocation value for @tpoff relocation
1841   if STT_TLS virtual address is ADDRESS.  */
1842
1843static bfd_vma
1844tpoff (struct bfd_link_info *info, bfd_vma address)
1845{
1846  struct elf_link_hash_table *htab = elf_hash_table (info);
1847  bfd_vma base;
1848
1849  /* If tls_sec is NULL, we should have signalled an error already.  */
1850  if (htab->tls_sec == NULL)
1851    return 0;
1852  base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
1853  return address - htab->tls_sec->vma + base;
1854}
1855
1856/* Perform the specified relocation.  The instruction at (contents + address)
1857   is modified to set one operand to represent the value in "relocation".  The
1858   operand position is determined by the relocation type recorded in the
1859   howto.  */
1860
1861#define CALL_SEGMENT_BITS (30)
1862#define CALL_SEGMENT_SIZE (1 << CALL_SEGMENT_BITS)
1863
1864static bfd_reloc_status_type
1865elf_xtensa_do_reloc (reloc_howto_type *howto,
1866		     bfd *abfd,
1867		     asection *input_section,
1868		     bfd_vma relocation,
1869		     bfd_byte *contents,
1870		     bfd_vma address,
1871		     bool is_weak_undef,
1872		     char **error_message)
1873{
1874  xtensa_format fmt;
1875  xtensa_opcode opcode;
1876  xtensa_isa isa = xtensa_default_isa;
1877  static xtensa_insnbuf ibuff = NULL;
1878  static xtensa_insnbuf sbuff = NULL;
1879  bfd_vma self_address;
1880  bfd_size_type input_size;
1881  int opnd, slot;
1882  uint32 newval;
1883
1884  if (!ibuff)
1885    {
1886      ibuff = xtensa_insnbuf_alloc (isa);
1887      sbuff = xtensa_insnbuf_alloc (isa);
1888    }
1889
1890  input_size = bfd_get_section_limit (abfd, input_section);
1891
1892  /* Calculate the PC address for this instruction.  */
1893  self_address = (input_section->output_section->vma
1894		  + input_section->output_offset
1895		  + address);
1896
1897  switch (howto->type)
1898    {
1899    case R_XTENSA_NONE:
1900    case R_XTENSA_DIFF8:
1901    case R_XTENSA_DIFF16:
1902    case R_XTENSA_DIFF32:
1903    case R_XTENSA_PDIFF8:
1904    case R_XTENSA_PDIFF16:
1905    case R_XTENSA_PDIFF32:
1906    case R_XTENSA_NDIFF8:
1907    case R_XTENSA_NDIFF16:
1908    case R_XTENSA_NDIFF32:
1909    case R_XTENSA_TLS_FUNC:
1910    case R_XTENSA_TLS_ARG:
1911    case R_XTENSA_TLS_CALL:
1912      return bfd_reloc_ok;
1913
1914    case R_XTENSA_ASM_EXPAND:
1915      if (!is_weak_undef)
1916	{
1917	  /* Check for windowed CALL across a 1GB boundary.  */
1918	  opcode = get_expanded_call_opcode (contents + address,
1919					     input_size - address, 0);
1920	  if (is_windowed_call_opcode (opcode))
1921	    {
1922	      if ((self_address >> CALL_SEGMENT_BITS)
1923		  != (relocation >> CALL_SEGMENT_BITS))
1924		{
1925		  *error_message = "windowed longcall crosses 1GB boundary; "
1926		    "return may fail";
1927		  return bfd_reloc_dangerous;
1928		}
1929	    }
1930	}
1931      return bfd_reloc_ok;
1932
1933    case R_XTENSA_ASM_SIMPLIFY:
1934      {
1935	/* Convert the L32R/CALLX to CALL.  */
1936	bfd_reloc_status_type retval =
1937	  elf_xtensa_do_asm_simplify (contents, address, input_size,
1938				      error_message);
1939	if (retval != bfd_reloc_ok)
1940	  return bfd_reloc_dangerous;
1941
1942	/* The CALL needs to be relocated.  Continue below for that part.  */
1943	address += 3;
1944	self_address += 3;
1945	howto = &elf_howto_table[(unsigned) R_XTENSA_SLOT0_OP ];
1946      }
1947      break;
1948
1949    case R_XTENSA_32:
1950      {
1951	bfd_vma x;
1952	x = bfd_get_32 (abfd, contents + address);
1953	x = x + relocation;
1954	bfd_put_32 (abfd, x, contents + address);
1955      }
1956      return bfd_reloc_ok;
1957
1958    case R_XTENSA_32_PCREL:
1959      bfd_put_32 (abfd, relocation - self_address, contents + address);
1960      return bfd_reloc_ok;
1961
1962    case R_XTENSA_PLT:
1963    case R_XTENSA_TLSDESC_FN:
1964    case R_XTENSA_TLSDESC_ARG:
1965    case R_XTENSA_TLS_DTPOFF:
1966    case R_XTENSA_TLS_TPOFF:
1967      bfd_put_32 (abfd, relocation, contents + address);
1968      return bfd_reloc_ok;
1969    }
1970
1971  /* Only instruction slot-specific relocations handled below.... */
1972  slot = get_relocation_slot (howto->type);
1973  if (slot == XTENSA_UNDEFINED)
1974    {
1975      *error_message = "unexpected relocation";
1976      return bfd_reloc_dangerous;
1977    }
1978
1979  if (input_size <= address)
1980    return bfd_reloc_outofrange;
1981  /* Read the instruction into a buffer and decode the opcode.  */
1982  xtensa_insnbuf_from_chars (isa, ibuff, contents + address,
1983			     input_size - address);
1984  fmt = xtensa_format_decode (isa, ibuff);
1985  if (fmt == XTENSA_UNDEFINED)
1986    {
1987      *error_message = "cannot decode instruction format";
1988      return bfd_reloc_dangerous;
1989    }
1990
1991  xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
1992
1993  opcode = xtensa_opcode_decode (isa, fmt, slot, sbuff);
1994  if (opcode == XTENSA_UNDEFINED)
1995    {
1996      *error_message = "cannot decode instruction opcode";
1997      return bfd_reloc_dangerous;
1998    }
1999
2000  /* Check for opcode-specific "alternate" relocations.  */
2001  if (is_alt_relocation (howto->type))
2002    {
2003      if (opcode == get_l32r_opcode ())
2004	{
2005	  /* Handle the special-case of non-PC-relative L32R instructions.  */
2006	  bfd *output_bfd = input_section->output_section->owner;
2007	  asection *lit4_sec = bfd_get_section_by_name (output_bfd, ".lit4");
2008	  if (!lit4_sec)
2009	    {
2010	      *error_message = "relocation references missing .lit4 section";
2011	      return bfd_reloc_dangerous;
2012	    }
2013	  self_address = ((lit4_sec->vma & ~0xfff)
2014			  + 0x40000 - 3); /* -3 to compensate for do_reloc */
2015	  newval = relocation;
2016	  opnd = 1;
2017	}
2018      else if (opcode == get_const16_opcode ())
2019	{
2020	  /* ALT used for high 16 bits.
2021	     Ignore 32-bit overflow.  */
2022	  newval = (relocation >> 16) & 0xffff;
2023	  opnd = 1;
2024	}
2025      else
2026	{
2027	  /* No other "alternate" relocations currently defined.  */
2028	  *error_message = "unexpected relocation";
2029	  return bfd_reloc_dangerous;
2030	}
2031    }
2032  else /* Not an "alternate" relocation.... */
2033    {
2034      if (opcode == get_const16_opcode ())
2035	{
2036	  newval = relocation & 0xffff;
2037	  opnd = 1;
2038	}
2039      else
2040	{
2041	  /* ...normal PC-relative relocation.... */
2042
2043	  /* Determine which operand is being relocated.  */
2044	  opnd = get_relocation_opnd (opcode, howto->type);
2045	  if (opnd == XTENSA_UNDEFINED)
2046	    {
2047	      *error_message = "unexpected relocation";
2048	      return bfd_reloc_dangerous;
2049	    }
2050
2051	  if (!howto->pc_relative)
2052	    {
2053	      *error_message = "expected PC-relative relocation";
2054	      return bfd_reloc_dangerous;
2055	    }
2056
2057	  newval = relocation;
2058	}
2059    }
2060
2061  /* Apply the relocation.  */
2062  if (xtensa_operand_do_reloc (isa, opcode, opnd, &newval, self_address)
2063      || xtensa_operand_encode (isa, opcode, opnd, &newval)
2064      || xtensa_operand_set_field (isa, opcode, opnd, fmt, slot,
2065				   sbuff, newval))
2066    {
2067      const char *opname = xtensa_opcode_name (isa, opcode);
2068      const char *msg;
2069
2070      msg = "cannot encode";
2071      if (is_direct_call_opcode (opcode))
2072	{
2073	  if ((relocation & 0x3) != 0)
2074	    msg = "misaligned call target";
2075	  else
2076	    msg = "call target out of range";
2077	}
2078      else if (opcode == get_l32r_opcode ())
2079	{
2080	  if ((relocation & 0x3) != 0)
2081	    msg = "misaligned literal target";
2082	  else if (is_alt_relocation (howto->type))
2083	    msg = "literal target out of range (too many literals)";
2084	  else if (self_address > relocation)
2085	    msg = "literal target out of range (try using text-section-literals)";
2086	  else
2087	    msg = "literal placed after use";
2088	}
2089
2090      *error_message = vsprint_msg (opname, ": %s", strlen (msg) + 2, msg);
2091      return bfd_reloc_dangerous;
2092    }
2093
2094  /* Check for calls across 1GB boundaries.  */
2095  if (is_direct_call_opcode (opcode)
2096      && is_windowed_call_opcode (opcode))
2097    {
2098      if ((self_address >> CALL_SEGMENT_BITS)
2099	  != (relocation >> CALL_SEGMENT_BITS))
2100	{
2101	  *error_message =
2102	    "windowed call crosses 1GB boundary; return may fail";
2103	  return bfd_reloc_dangerous;
2104	}
2105    }
2106
2107  /* Write the modified instruction back out of the buffer.  */
2108  xtensa_format_set_slot (isa, fmt, slot, ibuff, sbuff);
2109  xtensa_insnbuf_to_chars (isa, ibuff, contents + address,
2110			   input_size - address);
2111  return bfd_reloc_ok;
2112}
2113
2114
2115static char *
2116vsprint_msg (const char *origmsg, const char *fmt, int arglen, ...)
2117{
2118  /* To reduce the size of the memory leak,
2119     we only use a single message buffer.  */
2120  static bfd_size_type alloc_size = 0;
2121  static char *message = NULL;
2122  bfd_size_type orig_len, len = 0;
2123  bool is_append;
2124  va_list ap;
2125
2126  va_start (ap, arglen);
2127
2128  is_append = (origmsg == message);
2129
2130  orig_len = strlen (origmsg);
2131  len = orig_len + strlen (fmt) + arglen + 20;
2132  if (len > alloc_size)
2133    {
2134      message = (char *) bfd_realloc_or_free (message, len);
2135      alloc_size = len;
2136    }
2137  if (message != NULL)
2138    {
2139      if (!is_append)
2140	memcpy (message, origmsg, orig_len);
2141      vsprintf (message + orig_len, fmt, ap);
2142    }
2143  va_end (ap);
2144  return message;
2145}
2146
2147
2148/* This function is registered as the "special_function" in the
2149   Xtensa howto for handling simplify operations.
2150   bfd_perform_relocation / bfd_install_relocation use it to
2151   perform (install) the specified relocation.  Since this replaces the code
2152   in bfd_perform_relocation, it is basically an Xtensa-specific,
2153   stripped-down version of bfd_perform_relocation.  */
2154
2155static bfd_reloc_status_type
2156bfd_elf_xtensa_reloc (bfd *abfd,
2157		      arelent *reloc_entry,
2158		      asymbol *symbol,
2159		      void *data,
2160		      asection *input_section,
2161		      bfd *output_bfd,
2162		      char **error_message)
2163{
2164  bfd_vma relocation;
2165  bfd_reloc_status_type flag;
2166  bfd_size_type octets = (reloc_entry->address
2167			  * OCTETS_PER_BYTE (abfd, input_section));
2168  bfd_vma output_base = 0;
2169  reloc_howto_type *howto = reloc_entry->howto;
2170  asection *reloc_target_output_section;
2171  bool is_weak_undef;
2172
2173  if (!xtensa_default_isa)
2174    xtensa_default_isa = xtensa_isa_init (0, 0);
2175
2176  /* ELF relocs are against symbols.  If we are producing relocatable
2177     output, and the reloc is against an external symbol, the resulting
2178     reloc will also be against the same symbol.  In such a case, we
2179     don't want to change anything about the way the reloc is handled,
2180     since it will all be done at final link time.  This test is similar
2181     to what bfd_elf_generic_reloc does except that it lets relocs with
2182     howto->partial_inplace go through even if the addend is non-zero.
2183     (The real problem is that partial_inplace is set for XTENSA_32
2184     relocs to begin with, but that's a long story and there's little we
2185     can do about it now....)  */
2186
2187  if (output_bfd && (symbol->flags & BSF_SECTION_SYM) == 0)
2188    {
2189      reloc_entry->address += input_section->output_offset;
2190      return bfd_reloc_ok;
2191    }
2192
2193  /* Is the address of the relocation really within the section?  */
2194  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2195    return bfd_reloc_outofrange;
2196
2197  /* Work out which section the relocation is targeted at and the
2198     initial relocation command value.  */
2199
2200  /* Get symbol value.  (Common symbols are special.)  */
2201  if (bfd_is_com_section (symbol->section))
2202    relocation = 0;
2203  else
2204    relocation = symbol->value;
2205
2206  reloc_target_output_section = symbol->section->output_section;
2207
2208  /* Convert input-section-relative symbol value to absolute.  */
2209  if ((output_bfd && !howto->partial_inplace)
2210      || reloc_target_output_section == NULL)
2211    output_base = 0;
2212  else
2213    output_base = reloc_target_output_section->vma;
2214
2215  relocation += output_base + symbol->section->output_offset;
2216
2217  /* Add in supplied addend.  */
2218  relocation += reloc_entry->addend;
2219
2220  /* Here the variable relocation holds the final address of the
2221     symbol we are relocating against, plus any addend.  */
2222  if (output_bfd)
2223    {
2224      if (!howto->partial_inplace)
2225	{
2226	  /* This is a partial relocation, and we want to apply the relocation
2227	     to the reloc entry rather than the raw data.  Everything except
2228	     relocations against section symbols has already been handled
2229	     above.  */
2230
2231	  BFD_ASSERT (symbol->flags & BSF_SECTION_SYM);
2232	  reloc_entry->addend = relocation;
2233	  reloc_entry->address += input_section->output_offset;
2234	  return bfd_reloc_ok;
2235	}
2236      else
2237	{
2238	  reloc_entry->address += input_section->output_offset;
2239	  reloc_entry->addend = 0;
2240	}
2241    }
2242
2243  is_weak_undef = (bfd_is_und_section (symbol->section)
2244		   && (symbol->flags & BSF_WEAK) != 0);
2245  flag = elf_xtensa_do_reloc (howto, abfd, input_section, relocation,
2246			      (bfd_byte *) data, (bfd_vma) octets,
2247			      is_weak_undef, error_message);
2248
2249  if (flag == bfd_reloc_dangerous)
2250    {
2251      /* Add the symbol name to the error message.  */
2252      if (! *error_message)
2253	*error_message = "";
2254      *error_message = vsprint_msg (*error_message, ": (%s + 0x%lx)",
2255				    strlen (symbol->name) + 17,
2256				    symbol->name,
2257				    (unsigned long) reloc_entry->addend);
2258    }
2259
2260  return flag;
2261}
2262
2263int xtensa_abi_choice (void)
2264{
2265  if (elf32xtensa_abi == XTHAL_ABI_UNDEFINED)
2266    return XSHAL_ABI;
2267  else
2268    return elf32xtensa_abi;
2269}
2270
2271/* Set up an entry in the procedure linkage table.  */
2272
2273static bfd_vma
2274elf_xtensa_create_plt_entry (struct bfd_link_info *info,
2275			     bfd *output_bfd,
2276			     unsigned reloc_index)
2277{
2278  asection *splt, *sgotplt;
2279  bfd_vma plt_base, got_base;
2280  bfd_vma code_offset, lit_offset, abi_offset;
2281  int chunk;
2282  int abi = xtensa_abi_choice ();
2283
2284  chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
2285  splt = elf_xtensa_get_plt_section (info, chunk);
2286  sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
2287  BFD_ASSERT (splt != NULL && sgotplt != NULL);
2288
2289  plt_base = splt->output_section->vma + splt->output_offset;
2290  got_base = sgotplt->output_section->vma + sgotplt->output_offset;
2291
2292  lit_offset = 8 + (reloc_index % PLT_ENTRIES_PER_CHUNK) * 4;
2293  code_offset = (reloc_index % PLT_ENTRIES_PER_CHUNK) * PLT_ENTRY_SIZE;
2294
2295  /* Fill in the literal entry.  This is the offset of the dynamic
2296     relocation entry.  */
2297  bfd_put_32 (output_bfd, reloc_index * sizeof (Elf32_External_Rela),
2298	      sgotplt->contents + lit_offset);
2299
2300  /* Fill in the entry in the procedure linkage table.  */
2301  memcpy (splt->contents + code_offset,
2302	  (bfd_big_endian (output_bfd)
2303	   ? elf_xtensa_be_plt_entry[abi != XTHAL_ABI_WINDOWED]
2304	   : elf_xtensa_le_plt_entry[abi != XTHAL_ABI_WINDOWED]),
2305	  PLT_ENTRY_SIZE);
2306  abi_offset = abi == XTHAL_ABI_WINDOWED ? 3 : 0;
2307  bfd_put_16 (output_bfd, l32r_offset (got_base + 0,
2308				       plt_base + code_offset + abi_offset),
2309	      splt->contents + code_offset + abi_offset + 1);
2310  bfd_put_16 (output_bfd, l32r_offset (got_base + 4,
2311				       plt_base + code_offset + abi_offset + 3),
2312	      splt->contents + code_offset + abi_offset + 4);
2313  bfd_put_16 (output_bfd, l32r_offset (got_base + lit_offset,
2314				       plt_base + code_offset + abi_offset + 6),
2315	      splt->contents + code_offset + abi_offset + 7);
2316
2317  return plt_base + code_offset;
2318}
2319
2320
2321static bool get_indirect_call_dest_reg (xtensa_opcode, unsigned *);
2322
2323static bool
2324replace_tls_insn (Elf_Internal_Rela *rel,
2325		  bfd *abfd,
2326		  asection *input_section,
2327		  bfd_byte *contents,
2328		  bool is_ld_model,
2329		  char **error_message)
2330{
2331  static xtensa_insnbuf ibuff = NULL;
2332  static xtensa_insnbuf sbuff = NULL;
2333  xtensa_isa isa = xtensa_default_isa;
2334  xtensa_format fmt;
2335  xtensa_opcode old_op, new_op;
2336  bfd_size_type input_size;
2337  int r_type;
2338  unsigned dest_reg, src_reg;
2339
2340  if (ibuff == NULL)
2341    {
2342      ibuff = xtensa_insnbuf_alloc (isa);
2343      sbuff = xtensa_insnbuf_alloc (isa);
2344    }
2345
2346  input_size = bfd_get_section_limit (abfd, input_section);
2347
2348  /* Read the instruction into a buffer and decode the opcode.  */
2349  xtensa_insnbuf_from_chars (isa, ibuff, contents + rel->r_offset,
2350			     input_size - rel->r_offset);
2351  fmt = xtensa_format_decode (isa, ibuff);
2352  if (fmt == XTENSA_UNDEFINED)
2353    {
2354      *error_message = "cannot decode instruction format";
2355      return false;
2356    }
2357
2358  BFD_ASSERT (xtensa_format_num_slots (isa, fmt) == 1);
2359  xtensa_format_get_slot (isa, fmt, 0, ibuff, sbuff);
2360
2361  old_op = xtensa_opcode_decode (isa, fmt, 0, sbuff);
2362  if (old_op == XTENSA_UNDEFINED)
2363    {
2364      *error_message = "cannot decode instruction opcode";
2365      return false;
2366    }
2367
2368  r_type = ELF32_R_TYPE (rel->r_info);
2369  switch (r_type)
2370    {
2371    case R_XTENSA_TLS_FUNC:
2372    case R_XTENSA_TLS_ARG:
2373      if (old_op != get_l32r_opcode ()
2374	  || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2375				       sbuff, &dest_reg) != 0)
2376	{
2377	  *error_message = "cannot extract L32R destination for TLS access";
2378	  return false;
2379	}
2380      break;
2381
2382    case R_XTENSA_TLS_CALL:
2383      if (! get_indirect_call_dest_reg (old_op, &dest_reg)
2384	  || xtensa_operand_get_field (isa, old_op, 0, fmt, 0,
2385				       sbuff, &src_reg) != 0)
2386	{
2387	  *error_message = "cannot extract CALLXn operands for TLS access";
2388	  return false;
2389	}
2390      break;
2391
2392    default:
2393      abort ();
2394    }
2395
2396  if (is_ld_model)
2397    {
2398      switch (r_type)
2399	{
2400	case R_XTENSA_TLS_FUNC:
2401	case R_XTENSA_TLS_ARG:
2402	  /* Change the instruction to a NOP (or "OR a1, a1, a1" for older
2403	     versions of Xtensa).  */
2404	  new_op = xtensa_opcode_lookup (isa, "nop");
2405	  if (new_op == XTENSA_UNDEFINED)
2406	    {
2407	      new_op = xtensa_opcode_lookup (isa, "or");
2408	      if (new_op == XTENSA_UNDEFINED
2409		  || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2410		  || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2411					       sbuff, 1) != 0
2412		  || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2413					       sbuff, 1) != 0
2414		  || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2415					       sbuff, 1) != 0)
2416		{
2417		  *error_message = "cannot encode OR for TLS access";
2418		  return false;
2419		}
2420	    }
2421	  else
2422	    {
2423	      if (xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0)
2424		{
2425		  *error_message = "cannot encode NOP for TLS access";
2426		  return false;
2427		}
2428	    }
2429	  break;
2430
2431	case R_XTENSA_TLS_CALL:
2432	  /* Read THREADPTR into the CALLX's return value register.  */
2433	  new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2434	  if (new_op == XTENSA_UNDEFINED
2435	      || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2436	      || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2437					   sbuff, dest_reg + 2) != 0)
2438	    {
2439	      *error_message = "cannot encode RUR.THREADPTR for TLS access";
2440	      return false;
2441	    }
2442	  break;
2443	}
2444    }
2445  else
2446    {
2447      switch (r_type)
2448	{
2449	case R_XTENSA_TLS_FUNC:
2450	  new_op = xtensa_opcode_lookup (isa, "rur.threadptr");
2451	  if (new_op == XTENSA_UNDEFINED
2452	      || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2453	      || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2454					   sbuff, dest_reg) != 0)
2455	    {
2456	      *error_message = "cannot encode RUR.THREADPTR for TLS access";
2457	      return false;
2458	    }
2459	  break;
2460
2461	case R_XTENSA_TLS_ARG:
2462	  /* Nothing to do.  Keep the original L32R instruction.  */
2463	  return true;
2464
2465	case R_XTENSA_TLS_CALL:
2466	  /* Add the CALLX's src register (holding the THREADPTR value)
2467	     to the first argument register (holding the offset) and put
2468	     the result in the CALLX's return value register.  */
2469	  new_op = xtensa_opcode_lookup (isa, "add");
2470	  if (new_op == XTENSA_UNDEFINED
2471	      || xtensa_opcode_encode (isa, fmt, 0, sbuff, new_op) != 0
2472	      || xtensa_operand_set_field (isa, new_op, 0, fmt, 0,
2473					   sbuff, dest_reg + 2) != 0
2474	      || xtensa_operand_set_field (isa, new_op, 1, fmt, 0,
2475					   sbuff, dest_reg + 2) != 0
2476	      || xtensa_operand_set_field (isa, new_op, 2, fmt, 0,
2477					   sbuff, src_reg) != 0)
2478	    {
2479	      *error_message = "cannot encode ADD for TLS access";
2480	      return false;
2481	    }
2482	  break;
2483	}
2484    }
2485
2486  xtensa_format_set_slot (isa, fmt, 0, ibuff, sbuff);
2487  xtensa_insnbuf_to_chars (isa, ibuff, contents + rel->r_offset,
2488			   input_size - rel->r_offset);
2489
2490  return true;
2491}
2492
2493
2494#define IS_XTENSA_TLS_RELOC(R_TYPE) \
2495  ((R_TYPE) == R_XTENSA_TLSDESC_FN \
2496   || (R_TYPE) == R_XTENSA_TLSDESC_ARG \
2497   || (R_TYPE) == R_XTENSA_TLS_DTPOFF \
2498   || (R_TYPE) == R_XTENSA_TLS_TPOFF \
2499   || (R_TYPE) == R_XTENSA_TLS_FUNC \
2500   || (R_TYPE) == R_XTENSA_TLS_ARG \
2501   || (R_TYPE) == R_XTENSA_TLS_CALL)
2502
2503/* Relocate an Xtensa ELF section.  This is invoked by the linker for
2504   both relocatable and final links.  */
2505
2506static int
2507elf_xtensa_relocate_section (bfd *output_bfd,
2508			     struct bfd_link_info *info,
2509			     bfd *input_bfd,
2510			     asection *input_section,
2511			     bfd_byte *contents,
2512			     Elf_Internal_Rela *relocs,
2513			     Elf_Internal_Sym *local_syms,
2514			     asection **local_sections)
2515{
2516  struct elf_xtensa_link_hash_table *htab;
2517  Elf_Internal_Shdr *symtab_hdr;
2518  Elf_Internal_Rela *rel;
2519  Elf_Internal_Rela *relend;
2520  struct elf_link_hash_entry **sym_hashes;
2521  property_table_entry *lit_table = 0;
2522  int ltblsize = 0;
2523  char *local_got_tls_types;
2524  char *error_message = NULL;
2525  bfd_size_type input_size;
2526  int tls_type;
2527
2528  if (!xtensa_default_isa)
2529    xtensa_default_isa = xtensa_isa_init (0, 0);
2530
2531  if (!is_xtensa_elf (input_bfd))
2532    {
2533      bfd_set_error (bfd_error_wrong_format);
2534      return false;
2535    }
2536
2537  htab = elf_xtensa_hash_table (info);
2538  if (htab == NULL)
2539    return false;
2540
2541  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2542  sym_hashes = elf_sym_hashes (input_bfd);
2543  local_got_tls_types = elf_xtensa_local_got_tls_type (input_bfd);
2544
2545  if (elf_hash_table (info)->dynamic_sections_created)
2546    {
2547      ltblsize = xtensa_read_table_entries (input_bfd, input_section,
2548					    &lit_table, XTENSA_LIT_SEC_NAME,
2549					    true);
2550      if (ltblsize < 0)
2551	return false;
2552    }
2553
2554  input_size = bfd_get_section_limit (input_bfd, input_section);
2555
2556  rel = relocs;
2557  relend = relocs + input_section->reloc_count;
2558  for (; rel < relend; rel++)
2559    {
2560      int r_type;
2561      reloc_howto_type *howto;
2562      unsigned long r_symndx;
2563      struct elf_link_hash_entry *h;
2564      Elf_Internal_Sym *sym;
2565      char sym_type;
2566      const char *name;
2567      asection *sec;
2568      bfd_vma relocation;
2569      bfd_reloc_status_type r;
2570      bool is_weak_undef;
2571      bool unresolved_reloc;
2572      bool warned;
2573      bool dynamic_symbol;
2574
2575      r_type = ELF32_R_TYPE (rel->r_info);
2576      if (r_type == (int) R_XTENSA_GNU_VTINHERIT
2577	  || r_type == (int) R_XTENSA_GNU_VTENTRY)
2578	continue;
2579
2580      if (r_type < 0 || r_type >= (int) R_XTENSA_max)
2581	{
2582	  bfd_set_error (bfd_error_bad_value);
2583	  return false;
2584	}
2585      howto = &elf_howto_table[r_type];
2586
2587      r_symndx = ELF32_R_SYM (rel->r_info);
2588
2589      h = NULL;
2590      sym = NULL;
2591      sec = NULL;
2592      is_weak_undef = false;
2593      unresolved_reloc = false;
2594      warned = false;
2595
2596      if (howto->partial_inplace && !bfd_link_relocatable (info))
2597	{
2598	  /* Because R_XTENSA_32 was made partial_inplace to fix some
2599	     problems with DWARF info in partial links, there may be
2600	     an addend stored in the contents.  Take it out of there
2601	     and move it back into the addend field of the reloc.  */
2602	  rel->r_addend += bfd_get_32 (input_bfd, contents + rel->r_offset);
2603	  bfd_put_32 (input_bfd, 0, contents + rel->r_offset);
2604	}
2605
2606      if (r_symndx < symtab_hdr->sh_info)
2607	{
2608	  sym = local_syms + r_symndx;
2609	  sym_type = ELF32_ST_TYPE (sym->st_info);
2610	  sec = local_sections[r_symndx];
2611	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2612	}
2613      else
2614	{
2615	  bool ignored;
2616
2617	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2618				   r_symndx, symtab_hdr, sym_hashes,
2619				   h, sec, relocation,
2620				   unresolved_reloc, warned, ignored);
2621
2622	  if (relocation == 0
2623	      && !unresolved_reloc
2624	      && h->root.type == bfd_link_hash_undefweak)
2625	    is_weak_undef = true;
2626
2627	  sym_type = h->type;
2628	}
2629
2630      if (sec != NULL && discarded_section (sec))
2631	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2632					 rel, 1, relend, howto, 0, contents);
2633
2634      if (bfd_link_relocatable (info))
2635	{
2636	  bfd_vma dest_addr;
2637	  asection * sym_sec = get_elf_r_symndx_section (input_bfd, r_symndx);
2638
2639	  /* This is a relocatable link.
2640	     1) If the reloc is against a section symbol, adjust
2641	     according to the output section.
2642	     2) If there is a new target for this relocation,
2643	     the new target will be in the same output section.
2644	     We adjust the relocation by the output section
2645	     difference.  */
2646
2647	  if (relaxing_section)
2648	    {
2649	      /* Check if this references a section in another input file.  */
2650	      if (!do_fix_for_relocatable_link (rel, input_bfd, input_section,
2651						contents))
2652		return false;
2653	    }
2654
2655	  dest_addr = sym_sec->output_section->vma + sym_sec->output_offset
2656	    + get_elf_r_symndx_offset (input_bfd, r_symndx) + rel->r_addend;
2657
2658	  if (r_type == R_XTENSA_ASM_SIMPLIFY)
2659	    {
2660	      error_message = NULL;
2661	      /* Convert ASM_SIMPLIFY into the simpler relocation
2662		 so that they never escape a relaxing link.  */
2663	      r = contract_asm_expansion (contents, input_size, rel,
2664					  &error_message);
2665	      if (r != bfd_reloc_ok)
2666		(*info->callbacks->reloc_dangerous)
2667		  (info, error_message,
2668		   input_bfd, input_section, rel->r_offset);
2669
2670	      r_type = ELF32_R_TYPE (rel->r_info);
2671	    }
2672
2673	  /* This is a relocatable link, so we don't have to change
2674	     anything unless the reloc is against a section symbol,
2675	     in which case we have to adjust according to where the
2676	     section symbol winds up in the output section.  */
2677	  if (r_symndx < symtab_hdr->sh_info)
2678	    {
2679	      sym = local_syms + r_symndx;
2680	      if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2681		{
2682		  sec = local_sections[r_symndx];
2683		  rel->r_addend += sec->output_offset + sym->st_value;
2684		}
2685	    }
2686
2687	  /* If there is an addend with a partial_inplace howto,
2688	     then move the addend to the contents.  This is a hack
2689	     to work around problems with DWARF in relocatable links
2690	     with some previous version of BFD.  Now we can't easily get
2691	     rid of the hack without breaking backward compatibility.... */
2692	  r = bfd_reloc_ok;
2693	  howto = &elf_howto_table[r_type];
2694	  if (howto->partial_inplace && rel->r_addend)
2695	    {
2696	      r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2697				       rel->r_addend, contents,
2698				       rel->r_offset, false,
2699				       &error_message);
2700	      rel->r_addend = 0;
2701	    }
2702	  else
2703	    {
2704	      /* Put the correct bits in the target instruction, even
2705		 though the relocation will still be present in the output
2706		 file.  This makes disassembly clearer, as well as
2707		 allowing loadable kernel modules to work without needing
2708		 relocations on anything other than calls and l32r's.  */
2709
2710	      /* If it is not in the same section, there is nothing we can do.  */
2711	      if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP &&
2712		  sym_sec->output_section == input_section->output_section)
2713		{
2714		  r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
2715					   dest_addr, contents,
2716					   rel->r_offset, false,
2717					   &error_message);
2718		}
2719	    }
2720	  if (r != bfd_reloc_ok)
2721	    (*info->callbacks->reloc_dangerous)
2722	      (info, error_message,
2723	       input_bfd, input_section, rel->r_offset);
2724
2725	  /* Done with work for relocatable link; continue with next reloc.  */
2726	  continue;
2727	}
2728
2729      /* This is a final link.  */
2730
2731      if (relaxing_section)
2732	{
2733	  /* Check if this references a section in another input file.  */
2734	  do_fix_for_final_link (rel, input_bfd, input_section, contents,
2735				 &relocation);
2736	}
2737
2738      /* Sanity check the address.  */
2739      if (rel->r_offset >= input_size
2740	  && ELF32_R_TYPE (rel->r_info) != R_XTENSA_NONE)
2741	{
2742	  _bfd_error_handler
2743	    /* xgettext:c-format */
2744	    (_("%pB(%pA+%#" PRIx64 "): "
2745	       "relocation offset out of range (size=%#" PRIx64 ")"),
2746	     input_bfd, input_section, (uint64_t) rel->r_offset,
2747	     (uint64_t) input_size);
2748	  bfd_set_error (bfd_error_bad_value);
2749	  return false;
2750	}
2751
2752      if (h != NULL)
2753	name = h->root.root.string;
2754      else
2755	{
2756	  name = (bfd_elf_string_from_elf_section
2757		  (input_bfd, symtab_hdr->sh_link, sym->st_name));
2758	  if (name == NULL || *name == '\0')
2759	    name = bfd_section_name (sec);
2760	}
2761
2762      if (r_symndx != STN_UNDEF
2763	  && r_type != R_XTENSA_NONE
2764	  && (h == NULL
2765	      || h->root.type == bfd_link_hash_defined
2766	      || h->root.type == bfd_link_hash_defweak)
2767	  && IS_XTENSA_TLS_RELOC (r_type) != (sym_type == STT_TLS))
2768	{
2769	  _bfd_error_handler
2770	    ((sym_type == STT_TLS
2771	      /* xgettext:c-format */
2772	      ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
2773	      /* xgettext:c-format */
2774	      : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
2775	     input_bfd,
2776	     input_section,
2777	     (uint64_t) rel->r_offset,
2778	     howto->name,
2779	     name);
2780	}
2781
2782      dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
2783
2784      tls_type = GOT_UNKNOWN;
2785      if (h)
2786	tls_type = elf_xtensa_hash_entry (h)->tls_type;
2787      else if (local_got_tls_types)
2788	tls_type = local_got_tls_types [r_symndx];
2789
2790      switch (r_type)
2791	{
2792	case R_XTENSA_32:
2793	case R_XTENSA_PLT:
2794	  if (elf_hash_table (info)->dynamic_sections_created
2795	      && (input_section->flags & SEC_ALLOC) != 0
2796	      && (dynamic_symbol || bfd_link_pic (info)))
2797	    {
2798	      Elf_Internal_Rela outrel;
2799	      bfd_byte *loc;
2800	      asection *srel;
2801
2802	      if (dynamic_symbol && r_type == R_XTENSA_PLT)
2803		srel = htab->elf.srelplt;
2804	      else
2805		srel = htab->elf.srelgot;
2806
2807	      BFD_ASSERT (srel != NULL);
2808
2809	      outrel.r_offset =
2810		_bfd_elf_section_offset (output_bfd, info,
2811					 input_section, rel->r_offset);
2812
2813	      if ((outrel.r_offset | 1) == (bfd_vma) -1)
2814		memset (&outrel, 0, sizeof outrel);
2815	      else
2816		{
2817		  outrel.r_offset += (input_section->output_section->vma
2818				      + input_section->output_offset);
2819
2820		  /* Complain if the relocation is in a read-only section
2821		     and not in a literal pool.  */
2822		  if ((input_section->flags & SEC_READONLY) != 0
2823		      && !elf_xtensa_in_literal_pool (lit_table, ltblsize,
2824						      outrel.r_offset))
2825		    {
2826		      error_message =
2827			_("dynamic relocation in read-only section");
2828		      (*info->callbacks->reloc_dangerous)
2829			(info, error_message,
2830			 input_bfd, input_section, rel->r_offset);
2831		    }
2832
2833		  if (dynamic_symbol)
2834		    {
2835		      outrel.r_addend = rel->r_addend;
2836		      rel->r_addend = 0;
2837
2838		      if (r_type == R_XTENSA_32)
2839			{
2840			  outrel.r_info =
2841			    ELF32_R_INFO (h->dynindx, R_XTENSA_GLOB_DAT);
2842			  relocation = 0;
2843			}
2844		      else /* r_type == R_XTENSA_PLT */
2845			{
2846			  outrel.r_info =
2847			    ELF32_R_INFO (h->dynindx, R_XTENSA_JMP_SLOT);
2848
2849			  /* Create the PLT entry and set the initial
2850			     contents of the literal entry to the address of
2851			     the PLT entry.  */
2852			  relocation =
2853			    elf_xtensa_create_plt_entry (info, output_bfd,
2854							 srel->reloc_count);
2855			}
2856		      unresolved_reloc = false;
2857		    }
2858		  else if (!is_weak_undef)
2859		    {
2860		      /* Generate a RELATIVE relocation.  */
2861		      outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
2862		      outrel.r_addend = 0;
2863		    }
2864		  else
2865		    {
2866		      continue;
2867		    }
2868		}
2869
2870	      loc = (srel->contents
2871		     + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2872	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2873	      BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2874			  <= srel->size);
2875	    }
2876	  else if (r_type == R_XTENSA_ASM_EXPAND && dynamic_symbol)
2877	    {
2878	      /* This should only happen for non-PIC code, which is not
2879		 supposed to be used on systems with dynamic linking.
2880		 Just ignore these relocations.  */
2881	      continue;
2882	    }
2883	  break;
2884
2885	case R_XTENSA_TLS_TPOFF:
2886	  /* Switch to LE model for local symbols in an executable.  */
2887	  if (! bfd_link_pic (info) && ! dynamic_symbol)
2888	    {
2889	      relocation = tpoff (info, relocation);
2890	      break;
2891	    }
2892	  /* fall through */
2893
2894	case R_XTENSA_TLSDESC_FN:
2895	case R_XTENSA_TLSDESC_ARG:
2896	  {
2897	    if (r_type == R_XTENSA_TLSDESC_FN)
2898	      {
2899		if (! bfd_link_pic (info) || (tls_type & GOT_TLS_IE) != 0)
2900		  r_type = R_XTENSA_NONE;
2901	      }
2902	    else if (r_type == R_XTENSA_TLSDESC_ARG)
2903	      {
2904		if (bfd_link_pic (info))
2905		  {
2906		    if ((tls_type & GOT_TLS_IE) != 0)
2907		      r_type = R_XTENSA_TLS_TPOFF;
2908		  }
2909		else
2910		  {
2911		    r_type = R_XTENSA_TLS_TPOFF;
2912		    if (! dynamic_symbol)
2913		      {
2914			relocation = tpoff (info, relocation);
2915			break;
2916		      }
2917		  }
2918	      }
2919
2920	    if (r_type == R_XTENSA_NONE)
2921	      /* Nothing to do here; skip to the next reloc.  */
2922	      continue;
2923
2924	    if (! elf_hash_table (info)->dynamic_sections_created)
2925	      {
2926		error_message =
2927		  _("TLS relocation invalid without dynamic sections");
2928		(*info->callbacks->reloc_dangerous)
2929		  (info, error_message,
2930		   input_bfd, input_section, rel->r_offset);
2931	      }
2932	    else
2933	      {
2934		Elf_Internal_Rela outrel;
2935		bfd_byte *loc;
2936		asection *srel = htab->elf.srelgot;
2937		int indx;
2938
2939		outrel.r_offset = (input_section->output_section->vma
2940				   + input_section->output_offset
2941				   + rel->r_offset);
2942
2943		/* Complain if the relocation is in a read-only section
2944		   and not in a literal pool.  */
2945		if ((input_section->flags & SEC_READONLY) != 0
2946		    && ! elf_xtensa_in_literal_pool (lit_table, ltblsize,
2947						     outrel.r_offset))
2948		  {
2949		    error_message =
2950		      _("dynamic relocation in read-only section");
2951		    (*info->callbacks->reloc_dangerous)
2952		      (info, error_message,
2953		       input_bfd, input_section, rel->r_offset);
2954		  }
2955
2956		indx = h && h->dynindx != -1 ? h->dynindx : 0;
2957		if (indx == 0)
2958		  outrel.r_addend = relocation - dtpoff_base (info);
2959		else
2960		  outrel.r_addend = 0;
2961		rel->r_addend = 0;
2962
2963		outrel.r_info = ELF32_R_INFO (indx, r_type);
2964		relocation = 0;
2965		unresolved_reloc = false;
2966
2967		BFD_ASSERT (srel);
2968		loc = (srel->contents
2969		       + srel->reloc_count++ * sizeof (Elf32_External_Rela));
2970		bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2971		BFD_ASSERT (sizeof (Elf32_External_Rela) * srel->reloc_count
2972			    <= srel->size);
2973	      }
2974	  }
2975	  break;
2976
2977	case R_XTENSA_TLS_DTPOFF:
2978	  if (! bfd_link_pic (info))
2979	    /* Switch from LD model to LE model.  */
2980	    relocation = tpoff (info, relocation);
2981	  else
2982	    relocation -= dtpoff_base (info);
2983	  break;
2984
2985	case R_XTENSA_TLS_FUNC:
2986	case R_XTENSA_TLS_ARG:
2987	case R_XTENSA_TLS_CALL:
2988	  /* Check if optimizing to IE or LE model.  */
2989	  if ((tls_type & GOT_TLS_IE) != 0)
2990	    {
2991	      bool is_ld_model =
2992		(h && elf_xtensa_hash_entry (h) == htab->tlsbase);
2993	      if (! replace_tls_insn (rel, input_bfd, input_section, contents,
2994				      is_ld_model, &error_message))
2995		(*info->callbacks->reloc_dangerous)
2996		  (info, error_message,
2997		   input_bfd, input_section, rel->r_offset);
2998
2999	      if (r_type != R_XTENSA_TLS_ARG || is_ld_model)
3000		{
3001		  /* Skip subsequent relocations on the same instruction.  */
3002		  while (rel + 1 < relend && rel[1].r_offset == rel->r_offset)
3003		    rel++;
3004		}
3005	    }
3006	  continue;
3007
3008	default:
3009	  if (elf_hash_table (info)->dynamic_sections_created
3010	      && dynamic_symbol && (is_operand_relocation (r_type)
3011				    || r_type == R_XTENSA_32_PCREL))
3012	    {
3013	      error_message =
3014		vsprint_msg ("invalid relocation for dynamic symbol", ": %s",
3015			     strlen (name) + 2, name);
3016	      (*info->callbacks->reloc_dangerous)
3017		(info, error_message, input_bfd, input_section, rel->r_offset);
3018	      continue;
3019	    }
3020	  break;
3021	}
3022
3023      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3024	 because such sections are not SEC_ALLOC and thus ld.so will
3025	 not process them.  */
3026      if (unresolved_reloc
3027	  && !((input_section->flags & SEC_DEBUGGING) != 0
3028	       && h->def_dynamic)
3029	  && _bfd_elf_section_offset (output_bfd, info, input_section,
3030				      rel->r_offset) != (bfd_vma) -1)
3031	{
3032	  _bfd_error_handler
3033	    /* xgettext:c-format */
3034	    (_("%pB(%pA+%#" PRIx64 "): "
3035	       "unresolvable %s relocation against symbol `%s'"),
3036	     input_bfd,
3037	     input_section,
3038	     (uint64_t) rel->r_offset,
3039	     howto->name,
3040	     name);
3041	  return false;
3042	}
3043
3044      /* TLS optimizations may have changed r_type; update "howto".  */
3045      howto = &elf_howto_table[r_type];
3046
3047      /* There's no point in calling bfd_perform_relocation here.
3048	 Just go directly to our "special function".  */
3049      r = elf_xtensa_do_reloc (howto, input_bfd, input_section,
3050			       relocation + rel->r_addend,
3051			       contents, rel->r_offset, is_weak_undef,
3052			       &error_message);
3053
3054      if (r != bfd_reloc_ok && !warned)
3055	{
3056	  BFD_ASSERT (r == bfd_reloc_dangerous || r == bfd_reloc_other);
3057	  BFD_ASSERT (error_message != NULL);
3058
3059	  if (rel->r_addend == 0)
3060	    error_message = vsprint_msg (error_message, ": %s",
3061					 strlen (name) + 2, name);
3062	  else
3063	    error_message = vsprint_msg (error_message, ": (%s+0x%x)",
3064					 strlen (name) + 22,
3065					 name, (int) rel->r_addend);
3066
3067	  (*info->callbacks->reloc_dangerous)
3068	    (info, error_message, input_bfd, input_section, rel->r_offset);
3069	}
3070    }
3071
3072  free (lit_table);
3073  input_section->reloc_done = true;
3074
3075  return true;
3076}
3077
3078
3079/* Finish up dynamic symbol handling.  There's not much to do here since
3080   the PLT and GOT entries are all set up by relocate_section.  */
3081
3082static bool
3083elf_xtensa_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
3084				  struct bfd_link_info *info ATTRIBUTE_UNUSED,
3085				  struct elf_link_hash_entry *h,
3086				  Elf_Internal_Sym *sym)
3087{
3088  if (h->needs_plt && !h->def_regular)
3089    {
3090      /* Mark the symbol as undefined, rather than as defined in
3091	 the .plt section.  Leave the value alone.  */
3092      sym->st_shndx = SHN_UNDEF;
3093      /* If the symbol is weak, we do need to clear the value.
3094	 Otherwise, the PLT entry would provide a definition for
3095	 the symbol even if the symbol wasn't defined anywhere,
3096	 and so the symbol would never be NULL.  */
3097      if (!h->ref_regular_nonweak)
3098	sym->st_value = 0;
3099    }
3100
3101  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3102  if (h == elf_hash_table (info)->hdynamic
3103      || h == elf_hash_table (info)->hgot)
3104    sym->st_shndx = SHN_ABS;
3105
3106  return true;
3107}
3108
3109
3110/* Combine adjacent literal table entries in the output.  Adjacent
3111   entries within each input section may have been removed during
3112   relaxation, but we repeat the process here, even though it's too late
3113   to shrink the output section, because it's important to minimize the
3114   number of literal table entries to reduce the start-up work for the
3115   runtime linker.  Returns the number of remaining table entries or -1
3116   on error.  */
3117
3118static int
3119elf_xtensa_combine_prop_entries (bfd *output_bfd,
3120				 asection *sxtlit,
3121				 asection *sgotloc)
3122{
3123  bfd_byte *contents;
3124  property_table_entry *table;
3125  bfd_size_type section_size, sgotloc_size;
3126  bfd_vma offset;
3127  int n, m, num;
3128
3129  section_size = sxtlit->size;
3130  if (section_size == 0)
3131    return 0;
3132
3133  BFD_ASSERT (section_size % 8 == 0);
3134  num = section_size / 8;
3135
3136  sgotloc_size = sgotloc->size;
3137  if (sgotloc_size != section_size)
3138    {
3139      _bfd_error_handler
3140	(_("internal inconsistency in size of .got.loc section"));
3141      return -1;
3142    }
3143
3144  table = bfd_malloc (num * sizeof (property_table_entry));
3145  if (table == 0)
3146    return -1;
3147
3148  /* The ".xt.lit.plt" section has the SEC_IN_MEMORY flag set and this
3149     propagates to the output section, where it doesn't really apply and
3150     where it breaks the following call to bfd_malloc_and_get_section.  */
3151  sxtlit->flags &= ~SEC_IN_MEMORY;
3152
3153  if (!bfd_malloc_and_get_section (output_bfd, sxtlit, &contents))
3154    {
3155      free (contents);
3156      free (table);
3157      return -1;
3158    }
3159
3160  /* There should never be any relocations left at this point, so this
3161     is quite a bit easier than what is done during relaxation.  */
3162
3163  /* Copy the raw contents into a property table array and sort it.  */
3164  offset = 0;
3165  for (n = 0; n < num; n++)
3166    {
3167      table[n].address = bfd_get_32 (output_bfd, &contents[offset]);
3168      table[n].size = bfd_get_32 (output_bfd, &contents[offset + 4]);
3169      offset += 8;
3170    }
3171  qsort (table, num, sizeof (property_table_entry), property_table_compare);
3172
3173  for (n = 0; n < num; n++)
3174    {
3175      bool remove_entry = false;
3176
3177      if (table[n].size == 0)
3178	remove_entry = true;
3179      else if (n > 0
3180	       && (table[n-1].address + table[n-1].size == table[n].address))
3181	{
3182	  table[n-1].size += table[n].size;
3183	  remove_entry = true;
3184	}
3185
3186      if (remove_entry)
3187	{
3188	  for (m = n; m < num - 1; m++)
3189	    {
3190	      table[m].address = table[m+1].address;
3191	      table[m].size = table[m+1].size;
3192	    }
3193
3194	  n--;
3195	  num--;
3196	}
3197    }
3198
3199  /* Copy the data back to the raw contents.  */
3200  offset = 0;
3201  for (n = 0; n < num; n++)
3202    {
3203      bfd_put_32 (output_bfd, table[n].address, &contents[offset]);
3204      bfd_put_32 (output_bfd, table[n].size, &contents[offset + 4]);
3205      offset += 8;
3206    }
3207
3208  /* Clear the removed bytes.  */
3209  if ((bfd_size_type) (num * 8) < section_size)
3210    memset (&contents[num * 8], 0, section_size - num * 8);
3211
3212  if (! bfd_set_section_contents (output_bfd, sxtlit, contents, 0,
3213				  section_size))
3214    return -1;
3215
3216  /* Copy the contents to ".got.loc".  */
3217  memcpy (sgotloc->contents, contents, section_size);
3218
3219  free (contents);
3220  free (table);
3221  return num;
3222}
3223
3224
3225/* Finish up the dynamic sections.  */
3226
3227static bool
3228elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
3229				    struct bfd_link_info *info)
3230{
3231  struct elf_xtensa_link_hash_table *htab;
3232  bfd *dynobj;
3233  asection *sdyn, *srelplt, *srelgot, *sgot, *sxtlit, *sgotloc;
3234  Elf32_External_Dyn *dyncon, *dynconend;
3235  int num_xtlit_entries = 0;
3236
3237  if (! elf_hash_table (info)->dynamic_sections_created)
3238    return true;
3239
3240  htab = elf_xtensa_hash_table (info);
3241  if (htab == NULL)
3242    return false;
3243
3244  dynobj = elf_hash_table (info)->dynobj;
3245  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3246  BFD_ASSERT (sdyn != NULL);
3247
3248  /* Set the first entry in the global offset table to the address of
3249     the dynamic section.  */
3250  sgot = htab->elf.sgot;
3251  if (sgot)
3252    {
3253      BFD_ASSERT (sgot->size == 4);
3254      if (sdyn == NULL)
3255	bfd_put_32 (output_bfd, 0, sgot->contents);
3256      else
3257	bfd_put_32 (output_bfd,
3258		    sdyn->output_section->vma + sdyn->output_offset,
3259		    sgot->contents);
3260    }
3261
3262  srelplt = htab->elf.srelplt;
3263  srelgot = htab->elf.srelgot;
3264  if (srelplt && srelplt->size != 0)
3265    {
3266      asection *sgotplt, *spltlittbl;
3267      int chunk, plt_chunks, plt_entries;
3268      Elf_Internal_Rela irela;
3269      bfd_byte *loc;
3270      unsigned rtld_reloc;
3271
3272      spltlittbl = htab->spltlittbl;
3273      BFD_ASSERT (srelgot != NULL && spltlittbl != NULL);
3274
3275      /* Find the first XTENSA_RTLD relocation.  Presumably the rest
3276	 of them follow immediately after....  */
3277      for (rtld_reloc = 0; rtld_reloc < srelgot->reloc_count; rtld_reloc++)
3278	{
3279	  loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3280	  bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3281	  if (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD)
3282	    break;
3283	}
3284      BFD_ASSERT (rtld_reloc < srelgot->reloc_count);
3285
3286      plt_entries = srelplt->size / sizeof (Elf32_External_Rela);
3287      plt_chunks =
3288	(plt_entries + PLT_ENTRIES_PER_CHUNK - 1) / PLT_ENTRIES_PER_CHUNK;
3289
3290      for (chunk = 0; chunk < plt_chunks; chunk++)
3291	{
3292	  int chunk_entries = 0;
3293
3294	  sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
3295	  BFD_ASSERT (sgotplt != NULL);
3296
3297	  /* Emit special RTLD relocations for the first two entries in
3298	     each chunk of the .got.plt section.  */
3299
3300	  loc = srelgot->contents + rtld_reloc * sizeof (Elf32_External_Rela);
3301	  bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3302	  BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3303	  irela.r_offset = (sgotplt->output_section->vma
3304			    + sgotplt->output_offset);
3305	  irela.r_addend = 1; /* tell rtld to set value to resolver function */
3306	  bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3307	  rtld_reloc += 1;
3308	  BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3309
3310	  /* Next literal immediately follows the first.  */
3311	  loc += sizeof (Elf32_External_Rela);
3312	  bfd_elf32_swap_reloca_in (output_bfd, loc, &irela);
3313	  BFD_ASSERT (ELF32_R_TYPE (irela.r_info) == R_XTENSA_RTLD);
3314	  irela.r_offset = (sgotplt->output_section->vma
3315			    + sgotplt->output_offset + 4);
3316	  /* Tell rtld to set value to object's link map.  */
3317	  irela.r_addend = 2;
3318	  bfd_elf32_swap_reloca_out (output_bfd, &irela, loc);
3319	  rtld_reloc += 1;
3320	  BFD_ASSERT (rtld_reloc <= srelgot->reloc_count);
3321
3322	  /* Fill in the literal table.  */
3323	  if (chunk < plt_chunks - 1)
3324	    chunk_entries = PLT_ENTRIES_PER_CHUNK;
3325	  else
3326	    chunk_entries = plt_entries - (chunk * PLT_ENTRIES_PER_CHUNK);
3327
3328	  BFD_ASSERT ((unsigned) (chunk + 1) * 8 <= spltlittbl->size);
3329	  bfd_put_32 (output_bfd,
3330		      sgotplt->output_section->vma + sgotplt->output_offset,
3331		      spltlittbl->contents + (chunk * 8) + 0);
3332	  bfd_put_32 (output_bfd,
3333		      8 + (chunk_entries * 4),
3334		      spltlittbl->contents + (chunk * 8) + 4);
3335	}
3336
3337     /* The .xt.lit.plt section has just been modified.  This must
3338	happen before the code below which combines adjacent literal
3339	table entries, and the .xt.lit.plt contents have to be forced to
3340	the output here.  */
3341      if (! bfd_set_section_contents (output_bfd,
3342				      spltlittbl->output_section,
3343				      spltlittbl->contents,
3344				      spltlittbl->output_offset,
3345				      spltlittbl->size))
3346	return false;
3347      /* Clear SEC_HAS_CONTENTS so the contents won't be output again.  */
3348      spltlittbl->flags &= ~SEC_HAS_CONTENTS;
3349    }
3350
3351  /* All the dynamic relocations have been emitted at this point.
3352     Make sure the relocation sections are the correct size.  */
3353  if ((srelgot && srelgot->size != (sizeof (Elf32_External_Rela)
3354				    * srelgot->reloc_count))
3355      || (srelplt && srelplt->size != (sizeof (Elf32_External_Rela)
3356				       * srelplt->reloc_count)))
3357    abort ();
3358
3359  /* Combine adjacent literal table entries.  */
3360  BFD_ASSERT (! bfd_link_relocatable (info));
3361  sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");
3362  sgotloc = htab->sgotloc;
3363  BFD_ASSERT (sgotloc);
3364  if (sxtlit)
3365    {
3366      num_xtlit_entries =
3367	elf_xtensa_combine_prop_entries (output_bfd, sxtlit, sgotloc);
3368      if (num_xtlit_entries < 0)
3369	return false;
3370    }
3371
3372  dyncon = (Elf32_External_Dyn *) sdyn->contents;
3373  dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3374  for (; dyncon < dynconend; dyncon++)
3375    {
3376      Elf_Internal_Dyn dyn;
3377
3378      bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3379
3380      switch (dyn.d_tag)
3381	{
3382	default:
3383	  break;
3384
3385	case DT_XTENSA_GOT_LOC_SZ:
3386	  dyn.d_un.d_val = num_xtlit_entries;
3387	  break;
3388
3389	case DT_XTENSA_GOT_LOC_OFF:
3390	  dyn.d_un.d_ptr = (htab->sgotloc->output_section->vma
3391			    + htab->sgotloc->output_offset);
3392	  break;
3393
3394	case DT_PLTGOT:
3395	  dyn.d_un.d_ptr = (htab->elf.sgot->output_section->vma
3396			    + htab->elf.sgot->output_offset);
3397	  break;
3398
3399	case DT_JMPREL:
3400	  dyn.d_un.d_ptr = (htab->elf.srelplt->output_section->vma
3401			    + htab->elf.srelplt->output_offset);
3402	  break;
3403
3404	case DT_PLTRELSZ:
3405	  dyn.d_un.d_val = htab->elf.srelplt->size;
3406	  break;
3407	}
3408
3409      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3410    }
3411
3412  return true;
3413}
3414
3415
3416/* Functions for dealing with the e_flags field.  */
3417
3418/* Merge backend specific data from an object file to the output
3419   object file when linking.  */
3420
3421static bool
3422elf_xtensa_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3423{
3424  bfd *obfd = info->output_bfd;
3425  unsigned out_mach, in_mach;
3426  flagword out_flag, in_flag;
3427
3428  /* Check if we have the same endianness.  */
3429  if (!_bfd_generic_verify_endian_match (ibfd, info))
3430    return false;
3431
3432  /* Don't even pretend to support mixed-format linking.  */
3433  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3434      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3435    return false;
3436
3437  out_flag = elf_elfheader (obfd)->e_flags;
3438  in_flag = elf_elfheader (ibfd)->e_flags;
3439
3440  out_mach = out_flag & EF_XTENSA_MACH;
3441  in_mach = in_flag & EF_XTENSA_MACH;
3442  if (out_mach != in_mach)
3443    {
3444      _bfd_error_handler
3445	/* xgettext:c-format */
3446	(_("%pB: incompatible machine type; output is 0x%x; input is 0x%x"),
3447	 ibfd, out_mach, in_mach);
3448      bfd_set_error (bfd_error_wrong_format);
3449      return false;
3450    }
3451
3452  if (! elf_flags_init (obfd))
3453    {
3454      elf_flags_init (obfd) = true;
3455      elf_elfheader (obfd)->e_flags = in_flag;
3456
3457      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
3458	  && bfd_get_arch_info (obfd)->the_default)
3459	return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
3460				  bfd_get_mach (ibfd));
3461
3462      return true;
3463    }
3464
3465  if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
3466    elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
3467
3468  if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
3469    elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
3470
3471  return true;
3472}
3473
3474
3475static bool
3476elf_xtensa_set_private_flags (bfd *abfd, flagword flags)
3477{
3478  BFD_ASSERT (!elf_flags_init (abfd)
3479	      || elf_elfheader (abfd)->e_flags == flags);
3480
3481  elf_elfheader (abfd)->e_flags |= flags;
3482  elf_flags_init (abfd) = true;
3483
3484  return true;
3485}
3486
3487
3488static bool
3489elf_xtensa_print_private_bfd_data (bfd *abfd, void *farg)
3490{
3491  FILE *f = (FILE *) farg;
3492  flagword e_flags = elf_elfheader (abfd)->e_flags;
3493
3494  fprintf (f, "\nXtensa header:\n");
3495  if ((e_flags & EF_XTENSA_MACH) == E_XTENSA_MACH)
3496    fprintf (f, "\nMachine     = Base\n");
3497  else
3498    fprintf (f, "\nMachine Id  = 0x%x\n", e_flags & EF_XTENSA_MACH);
3499
3500  fprintf (f, "Insn tables = %s\n",
3501	   (e_flags & EF_XTENSA_XT_INSN) ? "true" : "false");
3502
3503  fprintf (f, "Literal tables = %s\n",
3504	   (e_flags & EF_XTENSA_XT_LIT) ? "true" : "false");
3505
3506  return _bfd_elf_print_private_bfd_data (abfd, farg);
3507}
3508
3509
3510/* Set the right machine number for an Xtensa ELF file.  */
3511
3512static bool
3513elf_xtensa_object_p (bfd *abfd)
3514{
3515  int mach;
3516  unsigned long arch = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
3517
3518  switch (arch)
3519    {
3520    case E_XTENSA_MACH:
3521      mach = bfd_mach_xtensa;
3522      break;
3523    default:
3524      return false;
3525    }
3526
3527  (void) bfd_default_set_arch_mach (abfd, bfd_arch_xtensa, mach);
3528  return true;
3529}
3530
3531
3532/* The final processing done just before writing out an Xtensa ELF object
3533   file.  This gets the Xtensa architecture right based on the machine
3534   number.  */
3535
3536static bool
3537elf_xtensa_final_write_processing (bfd *abfd)
3538{
3539  int mach;
3540  unsigned long val = elf_elfheader (abfd)->e_flags & EF_XTENSA_MACH;
3541
3542  switch (mach = bfd_get_mach (abfd))
3543    {
3544    case bfd_mach_xtensa:
3545      val = E_XTENSA_MACH;
3546      break;
3547    default:
3548      break;
3549    }
3550
3551  elf_elfheader (abfd)->e_flags &= ~EF_XTENSA_MACH;
3552  elf_elfheader (abfd)->e_flags |= val;
3553  return _bfd_elf_final_write_processing (abfd);
3554}
3555
3556
3557static enum elf_reloc_type_class
3558elf_xtensa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3559			     const asection *rel_sec ATTRIBUTE_UNUSED,
3560			     const Elf_Internal_Rela *rela)
3561{
3562  switch ((int) ELF32_R_TYPE (rela->r_info))
3563    {
3564    case R_XTENSA_RELATIVE:
3565      return reloc_class_relative;
3566    case R_XTENSA_JMP_SLOT:
3567      return reloc_class_plt;
3568    default:
3569      return reloc_class_normal;
3570    }
3571}
3572
3573
3574static bool
3575elf_xtensa_discard_info_for_section (bfd *abfd,
3576				     struct elf_reloc_cookie *cookie,
3577				     struct bfd_link_info *info,
3578				     asection *sec)
3579{
3580  bfd_byte *contents;
3581  bfd_vma offset, actual_offset;
3582  bfd_size_type removed_bytes = 0;
3583  bfd_size_type entry_size;
3584
3585  if (sec->output_section
3586      && bfd_is_abs_section (sec->output_section))
3587    return false;
3588
3589  if (xtensa_is_proptable_section (sec))
3590    entry_size = 12;
3591  else
3592    entry_size = 8;
3593
3594  if (sec->size == 0 || sec->size % entry_size != 0)
3595    return false;
3596
3597  contents = retrieve_contents (abfd, sec, info->keep_memory);
3598  if (!contents)
3599    return false;
3600
3601  cookie->rels = retrieve_internal_relocs (abfd, sec, info->keep_memory);
3602  if (!cookie->rels)
3603    {
3604      release_contents (sec, contents);
3605      return false;
3606    }
3607
3608  /* Sort the relocations.  They should already be in order when
3609     relaxation is enabled, but it might not be.  */
3610  qsort (cookie->rels, sec->reloc_count, sizeof (Elf_Internal_Rela),
3611	 internal_reloc_compare);
3612
3613  cookie->rel = cookie->rels;
3614  cookie->relend = cookie->rels + sec->reloc_count;
3615
3616  for (offset = 0; offset < sec->size; offset += entry_size)
3617    {
3618      actual_offset = offset - removed_bytes;
3619
3620      /* The ...symbol_deleted_p function will skip over relocs but it
3621	 won't adjust their offsets, so do that here.  */
3622      while (cookie->rel < cookie->relend
3623	     && cookie->rel->r_offset < offset)
3624	{
3625	  cookie->rel->r_offset -= removed_bytes;
3626	  cookie->rel++;
3627	}
3628
3629      while (cookie->rel < cookie->relend
3630	     && cookie->rel->r_offset == offset)
3631	{
3632	  if (bfd_elf_reloc_symbol_deleted_p (offset, cookie))
3633	    {
3634	      /* Remove the table entry.  (If the reloc type is NONE, then
3635		 the entry has already been merged with another and deleted
3636		 during relaxation.)  */
3637	      if (ELF32_R_TYPE (cookie->rel->r_info) != R_XTENSA_NONE)
3638		{
3639		  /* Shift the contents up.  */
3640		  if (offset + entry_size < sec->size)
3641		    memmove (&contents[actual_offset],
3642			     &contents[actual_offset + entry_size],
3643			     sec->size - offset - entry_size);
3644		  removed_bytes += entry_size;
3645		}
3646
3647	      /* Remove this relocation.  */
3648	      cookie->rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
3649	    }
3650
3651	  /* Adjust the relocation offset for previous removals.  This
3652	     should not be done before calling ...symbol_deleted_p
3653	     because it might mess up the offset comparisons there.
3654	     Make sure the offset doesn't underflow in the case where
3655	     the first entry is removed.  */
3656	  if (cookie->rel->r_offset >= removed_bytes)
3657	    cookie->rel->r_offset -= removed_bytes;
3658	  else
3659	    cookie->rel->r_offset = 0;
3660
3661	  cookie->rel++;
3662	}
3663    }
3664
3665  if (removed_bytes != 0)
3666    {
3667      /* Adjust any remaining relocs (shouldn't be any).  */
3668      for (; cookie->rel < cookie->relend; cookie->rel++)
3669	{
3670	  if (cookie->rel->r_offset >= removed_bytes)
3671	    cookie->rel->r_offset -= removed_bytes;
3672	  else
3673	    cookie->rel->r_offset = 0;
3674	}
3675
3676      /* Clear the removed bytes.  */
3677      memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
3678
3679      pin_contents (sec, contents);
3680      pin_internal_relocs (sec, cookie->rels);
3681
3682      /* Shrink size.  */
3683      if (sec->rawsize == 0)
3684	sec->rawsize = sec->size;
3685      sec->size -= removed_bytes;
3686
3687      if (xtensa_is_littable_section (sec))
3688	{
3689	  asection *sgotloc = elf_xtensa_hash_table (info)->sgotloc;
3690	  if (sgotloc)
3691	    sgotloc->size -= removed_bytes;
3692	}
3693    }
3694  else
3695    {
3696      release_contents (sec, contents);
3697      release_internal_relocs (sec, cookie->rels);
3698    }
3699
3700  return (removed_bytes != 0);
3701}
3702
3703
3704static bool
3705elf_xtensa_discard_info (bfd *abfd,
3706			 struct elf_reloc_cookie *cookie,
3707			 struct bfd_link_info *info)
3708{
3709  asection *sec;
3710  bool changed = false;
3711
3712  for (sec = abfd->sections; sec != NULL; sec = sec->next)
3713    {
3714      if (xtensa_is_property_section (sec))
3715	{
3716	  if (elf_xtensa_discard_info_for_section (abfd, cookie, info, sec))
3717	    changed = true;
3718	}
3719    }
3720
3721  return changed;
3722}
3723
3724
3725static bool
3726elf_xtensa_ignore_discarded_relocs (asection *sec)
3727{
3728  return xtensa_is_property_section (sec);
3729}
3730
3731
3732static unsigned int
3733elf_xtensa_action_discarded (asection *sec)
3734{
3735  if (strcmp (".xt_except_table", sec->name) == 0)
3736    return 0;
3737
3738  if (strcmp (".xt_except_desc", sec->name) == 0)
3739    return 0;
3740
3741  return _bfd_elf_default_action_discarded (sec);
3742}
3743
3744
3745/* Support for core dump NOTE sections.  */
3746
3747static bool
3748elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3749{
3750  int offset;
3751  unsigned int size;
3752
3753  if (elf_tdata (abfd) == NULL
3754      || elf_tdata (abfd)->core == NULL)
3755    return false;
3756
3757  /* The size for Xtensa is variable, so don't try to recognize the format
3758     based on the size.  Just assume this is GNU/Linux.  */
3759  if (note == NULL || note->descsz < 28)
3760    return false;
3761
3762  /* pr_cursig */
3763  elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3764
3765  /* pr_pid */
3766  elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
3767
3768  /* pr_reg */
3769  offset = 72;
3770  size = note->descsz - offset - 4;
3771
3772  /* Make a ".reg/999" section.  */
3773  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3774					  size, note->descpos + offset);
3775}
3776
3777static bool
3778elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3779{
3780  switch (note->descsz)
3781    {
3782      default:
3783	return false;
3784
3785      case 128:		/* GNU/Linux elf_prpsinfo */
3786	elf_tdata (abfd)->core->program
3787	 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3788	elf_tdata (abfd)->core->command
3789	 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3790    }
3791
3792  /* Note that for some reason, a spurious space is tacked
3793     onto the end of the args in some (at least one anyway)
3794     implementations, so strip it off if it exists.  */
3795
3796  {
3797    char *command = elf_tdata (abfd)->core->command;
3798    int n = strlen (command);
3799
3800    if (0 < n && command[n - 1] == ' ')
3801      command[n - 1] = '\0';
3802  }
3803
3804  return true;
3805}
3806
3807
3808/* Generic Xtensa configurability stuff.  */
3809
3810static xtensa_opcode callx0_op = XTENSA_UNDEFINED;
3811static xtensa_opcode callx4_op = XTENSA_UNDEFINED;
3812static xtensa_opcode callx8_op = XTENSA_UNDEFINED;
3813static xtensa_opcode callx12_op = XTENSA_UNDEFINED;
3814static xtensa_opcode call0_op = XTENSA_UNDEFINED;
3815static xtensa_opcode call4_op = XTENSA_UNDEFINED;
3816static xtensa_opcode call8_op = XTENSA_UNDEFINED;
3817static xtensa_opcode call12_op = XTENSA_UNDEFINED;
3818
3819static void
3820init_call_opcodes (void)
3821{
3822  if (callx0_op == XTENSA_UNDEFINED)
3823    {
3824      callx0_op  = xtensa_opcode_lookup (xtensa_default_isa, "callx0");
3825      callx4_op  = xtensa_opcode_lookup (xtensa_default_isa, "callx4");
3826      callx8_op  = xtensa_opcode_lookup (xtensa_default_isa, "callx8");
3827      callx12_op = xtensa_opcode_lookup (xtensa_default_isa, "callx12");
3828      call0_op   = xtensa_opcode_lookup (xtensa_default_isa, "call0");
3829      call4_op   = xtensa_opcode_lookup (xtensa_default_isa, "call4");
3830      call8_op   = xtensa_opcode_lookup (xtensa_default_isa, "call8");
3831      call12_op  = xtensa_opcode_lookup (xtensa_default_isa, "call12");
3832    }
3833}
3834
3835
3836static bool
3837is_indirect_call_opcode (xtensa_opcode opcode)
3838{
3839  init_call_opcodes ();
3840  return (opcode == callx0_op
3841	  || opcode == callx4_op
3842	  || opcode == callx8_op
3843	  || opcode == callx12_op);
3844}
3845
3846
3847static bool
3848is_direct_call_opcode (xtensa_opcode opcode)
3849{
3850  init_call_opcodes ();
3851  return (opcode == call0_op
3852	  || opcode == call4_op
3853	  || opcode == call8_op
3854	  || opcode == call12_op);
3855}
3856
3857
3858static bool
3859is_windowed_call_opcode (xtensa_opcode opcode)
3860{
3861  init_call_opcodes ();
3862  return (opcode == call4_op
3863	  || opcode == call8_op
3864	  || opcode == call12_op
3865	  || opcode == callx4_op
3866	  || opcode == callx8_op
3867	  || opcode == callx12_op);
3868}
3869
3870
3871static bool
3872get_indirect_call_dest_reg (xtensa_opcode opcode, unsigned *pdst)
3873{
3874  unsigned dst = (unsigned) -1;
3875
3876  init_call_opcodes ();
3877  if (opcode == callx0_op)
3878    dst = 0;
3879  else if (opcode == callx4_op)
3880    dst = 4;
3881  else if (opcode == callx8_op)
3882    dst = 8;
3883  else if (opcode == callx12_op)
3884    dst = 12;
3885
3886  if (dst == (unsigned) -1)
3887    return false;
3888
3889  *pdst = dst;
3890  return true;
3891}
3892
3893
3894static xtensa_opcode
3895get_const16_opcode (void)
3896{
3897  static bool done_lookup = false;
3898  static xtensa_opcode const16_opcode = XTENSA_UNDEFINED;
3899  if (!done_lookup)
3900    {
3901      const16_opcode = xtensa_opcode_lookup (xtensa_default_isa, "const16");
3902      done_lookup = true;
3903    }
3904  return const16_opcode;
3905}
3906
3907
3908static xtensa_opcode
3909get_l32r_opcode (void)
3910{
3911  static xtensa_opcode l32r_opcode = XTENSA_UNDEFINED;
3912  static bool done_lookup = false;
3913
3914  if (!done_lookup)
3915    {
3916      l32r_opcode = xtensa_opcode_lookup (xtensa_default_isa, "l32r");
3917      done_lookup = true;
3918    }
3919  return l32r_opcode;
3920}
3921
3922
3923static bfd_vma
3924l32r_offset (bfd_vma addr, bfd_vma pc)
3925{
3926  bfd_vma offset;
3927
3928  offset = addr - ((pc+3) & -4);
3929  BFD_ASSERT ((offset & ((1 << 2) - 1)) == 0);
3930  offset = (signed int) offset >> 2;
3931  BFD_ASSERT ((signed int) offset >> 16 == -1);
3932  return offset;
3933}
3934
3935
3936static xtensa_opcode
3937get_rsr_lend_opcode (void)
3938{
3939  static xtensa_opcode rsr_lend_opcode = XTENSA_UNDEFINED;
3940  static bool done_lookup = false;
3941  if (!done_lookup)
3942    {
3943      rsr_lend_opcode = xtensa_opcode_lookup (xtensa_default_isa, "rsr.lend");
3944      done_lookup = true;
3945    }
3946  return rsr_lend_opcode;
3947}
3948
3949static xtensa_opcode
3950get_wsr_lbeg_opcode (void)
3951{
3952  static xtensa_opcode wsr_lbeg_opcode = XTENSA_UNDEFINED;
3953  static bool done_lookup = false;
3954  if (!done_lookup)
3955    {
3956      wsr_lbeg_opcode = xtensa_opcode_lookup (xtensa_default_isa, "wsr.lbeg");
3957      done_lookup = true;
3958    }
3959  return wsr_lbeg_opcode;
3960}
3961
3962
3963static int
3964get_relocation_opnd (xtensa_opcode opcode, int r_type)
3965{
3966  xtensa_isa isa = xtensa_default_isa;
3967  int last_immed, last_opnd, opi;
3968
3969  if (opcode == XTENSA_UNDEFINED)
3970    return XTENSA_UNDEFINED;
3971
3972  /* Find the last visible PC-relative immediate operand for the opcode.
3973     If there are no PC-relative immediates, then choose the last visible
3974     immediate; otherwise, fail and return XTENSA_UNDEFINED.  */
3975  last_immed = XTENSA_UNDEFINED;
3976  last_opnd = xtensa_opcode_num_operands (isa, opcode);
3977  for (opi = last_opnd - 1; opi >= 0; opi--)
3978    {
3979      if (xtensa_operand_is_visible (isa, opcode, opi) == 0)
3980	continue;
3981      if (xtensa_operand_is_PCrelative (isa, opcode, opi) == 1)
3982	{
3983	  last_immed = opi;
3984	  break;
3985	}
3986      if (last_immed == XTENSA_UNDEFINED
3987	  && xtensa_operand_is_register (isa, opcode, opi) == 0)
3988	last_immed = opi;
3989    }
3990  if (last_immed < 0)
3991    return XTENSA_UNDEFINED;
3992
3993  /* If the operand number was specified in an old-style relocation,
3994     check for consistency with the operand computed above.  */
3995  if (r_type >= R_XTENSA_OP0 && r_type <= R_XTENSA_OP2)
3996    {
3997      int reloc_opnd = r_type - R_XTENSA_OP0;
3998      if (reloc_opnd != last_immed)
3999	return XTENSA_UNDEFINED;
4000    }
4001
4002  return last_immed;
4003}
4004
4005
4006int
4007get_relocation_slot (int r_type)
4008{
4009  switch (r_type)
4010    {
4011    case R_XTENSA_OP0:
4012    case R_XTENSA_OP1:
4013    case R_XTENSA_OP2:
4014      return 0;
4015
4016    default:
4017      if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
4018	return r_type - R_XTENSA_SLOT0_OP;
4019      if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
4020	return r_type - R_XTENSA_SLOT0_ALT;
4021      break;
4022    }
4023
4024  return XTENSA_UNDEFINED;
4025}
4026
4027
4028/* Get the opcode for a relocation.  */
4029
4030static xtensa_opcode
4031get_relocation_opcode (bfd *abfd,
4032		       asection *sec,
4033		       bfd_byte *contents,
4034		       Elf_Internal_Rela *irel)
4035{
4036  static xtensa_insnbuf ibuff = NULL;
4037  static xtensa_insnbuf sbuff = NULL;
4038  xtensa_isa isa = xtensa_default_isa;
4039  xtensa_format fmt;
4040  int slot;
4041
4042  if (contents == NULL)
4043    return XTENSA_UNDEFINED;
4044
4045  if (bfd_get_section_limit (abfd, sec) <= irel->r_offset)
4046    return XTENSA_UNDEFINED;
4047
4048  if (ibuff == NULL)
4049    {
4050      ibuff = xtensa_insnbuf_alloc (isa);
4051      sbuff = xtensa_insnbuf_alloc (isa);
4052    }
4053
4054  /* Decode the instruction.  */
4055  xtensa_insnbuf_from_chars (isa, ibuff, &contents[irel->r_offset],
4056			     sec->size - irel->r_offset);
4057  fmt = xtensa_format_decode (isa, ibuff);
4058  slot = get_relocation_slot (ELF32_R_TYPE (irel->r_info));
4059  if (slot == XTENSA_UNDEFINED)
4060    return XTENSA_UNDEFINED;
4061  xtensa_format_get_slot (isa, fmt, slot, ibuff, sbuff);
4062  return xtensa_opcode_decode (isa, fmt, slot, sbuff);
4063}
4064
4065
4066bool
4067is_l32r_relocation (bfd *abfd,
4068		    asection *sec,
4069		    bfd_byte *contents,
4070		    Elf_Internal_Rela *irel)
4071{
4072  xtensa_opcode opcode;
4073  if (!is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
4074    return false;
4075  opcode = get_relocation_opcode (abfd, sec, contents, irel);
4076  return (opcode == get_l32r_opcode ());
4077}
4078
4079
4080static bfd_size_type
4081get_asm_simplify_size (bfd_byte *contents,
4082		       bfd_size_type content_len,
4083		       bfd_size_type offset)
4084{
4085  bfd_size_type insnlen, size = 0;
4086
4087  /* Decode the size of the next two instructions.  */
4088  insnlen = insn_decode_len (contents, content_len, offset);
4089  if (insnlen == 0)
4090    return 0;
4091
4092  size += insnlen;
4093
4094  insnlen = insn_decode_len (contents, content_len, offset + size);
4095  if (insnlen == 0)
4096    return 0;
4097
4098  size += insnlen;
4099  return size;
4100}
4101
4102
4103bool
4104is_alt_relocation (int r_type)
4105{
4106  return (r_type >= R_XTENSA_SLOT0_ALT
4107	  && r_type <= R_XTENSA_SLOT14_ALT);
4108}
4109
4110
4111bool
4112is_operand_relocation (int r_type)
4113{
4114  switch (r_type)
4115    {
4116    case R_XTENSA_OP0:
4117    case R_XTENSA_OP1:
4118    case R_XTENSA_OP2:
4119      return true;
4120
4121    default:
4122      if (r_type >= R_XTENSA_SLOT0_OP && r_type <= R_XTENSA_SLOT14_OP)
4123	return true;
4124      if (r_type >= R_XTENSA_SLOT0_ALT && r_type <= R_XTENSA_SLOT14_ALT)
4125	return true;
4126      break;
4127    }
4128
4129  return false;
4130}
4131
4132
4133#define MIN_INSN_LENGTH 2
4134
4135/* Return 0 if it fails to decode.  */
4136
4137bfd_size_type
4138insn_decode_len (bfd_byte *contents,
4139		 bfd_size_type content_len,
4140		 bfd_size_type offset)
4141{
4142  int insn_len;
4143  xtensa_isa isa = xtensa_default_isa;
4144  xtensa_format fmt;
4145  static xtensa_insnbuf ibuff = NULL;
4146
4147  if (offset + MIN_INSN_LENGTH > content_len)
4148    return 0;
4149
4150  if (ibuff == NULL)
4151    ibuff = xtensa_insnbuf_alloc (isa);
4152  xtensa_insnbuf_from_chars (isa, ibuff, &contents[offset],
4153			     content_len - offset);
4154  fmt = xtensa_format_decode (isa, ibuff);
4155  if (fmt == XTENSA_UNDEFINED)
4156    return 0;
4157  insn_len = xtensa_format_length (isa, fmt);
4158  if (insn_len ==  XTENSA_UNDEFINED)
4159    return 0;
4160  return insn_len;
4161}
4162
4163int
4164insn_num_slots (bfd_byte *contents,
4165		bfd_size_type content_len,
4166		bfd_size_type offset)
4167{
4168  xtensa_isa isa = xtensa_default_isa;
4169  xtensa_format fmt;
4170  static xtensa_insnbuf ibuff = NULL;
4171
4172  if (offset + MIN_INSN_LENGTH > content_len)
4173    return XTENSA_UNDEFINED;
4174
4175  if (ibuff == NULL)
4176    ibuff = xtensa_insnbuf_alloc (isa);
4177  xtensa_insnbuf_from_chars (isa, ibuff, &contents[offset],
4178			     content_len - offset);
4179  fmt = xtensa_format_decode (isa, ibuff);
4180  if (fmt == XTENSA_UNDEFINED)
4181    return XTENSA_UNDEFINED;
4182  return xtensa_format_num_slots (isa, fmt);
4183}
4184
4185
4186/* Decode the opcode for a single slot instruction.
4187   Return 0 if it fails to decode or the instruction is multi-slot.  */
4188
4189xtensa_opcode
4190insn_decode_opcode (bfd_byte *contents,
4191		    bfd_size_type content_len,
4192		    bfd_size_type offset,
4193		    int slot)
4194{
4195  xtensa_isa isa = xtensa_default_isa;
4196  xtensa_format fmt;
4197  static xtensa_insnbuf insnbuf = NULL;
4198  static xtensa_insnbuf slotbuf = NULL;
4199
4200  if (offset + MIN_INSN_LENGTH > content_len)
4201    return XTENSA_UNDEFINED;
4202
4203  if (insnbuf == NULL)
4204    {
4205      insnbuf = xtensa_insnbuf_alloc (isa);
4206      slotbuf = xtensa_insnbuf_alloc (isa);
4207    }
4208
4209  xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4210			     content_len - offset);
4211  fmt = xtensa_format_decode (isa, insnbuf);
4212  if (fmt == XTENSA_UNDEFINED)
4213    return XTENSA_UNDEFINED;
4214
4215  if (slot >= xtensa_format_num_slots (isa, fmt))
4216    return XTENSA_UNDEFINED;
4217
4218  xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
4219  return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
4220}
4221
4222
4223/* The offset is the offset in the contents.
4224   The address is the address of that offset.  */
4225
4226static bool
4227check_branch_target_aligned (bfd_byte *contents,
4228			     bfd_size_type content_length,
4229			     bfd_vma offset,
4230			     bfd_vma address)
4231{
4232  bfd_size_type insn_len = insn_decode_len (contents, content_length, offset);
4233  if (insn_len == 0)
4234    return false;
4235  return check_branch_target_aligned_address (address, insn_len);
4236}
4237
4238
4239static bool
4240check_loop_aligned (bfd_byte *contents,
4241		    bfd_size_type content_length,
4242		    bfd_vma offset,
4243		    bfd_vma address)
4244{
4245  bfd_size_type loop_len, insn_len;
4246  xtensa_opcode opcode;
4247
4248  opcode = insn_decode_opcode (contents, content_length, offset, 0);
4249  if (opcode == XTENSA_UNDEFINED
4250      || xtensa_opcode_is_loop (xtensa_default_isa, opcode) != 1)
4251    {
4252      BFD_ASSERT (false);
4253      return false;
4254    }
4255
4256  loop_len = insn_decode_len (contents, content_length, offset);
4257  insn_len = insn_decode_len (contents, content_length, offset + loop_len);
4258  if (loop_len == 0 || insn_len == 0)
4259    {
4260      BFD_ASSERT (false);
4261      return false;
4262    }
4263
4264  /* If this is relaxed loop, analyze first instruction of the actual loop
4265     body.  It must be at offset 27 from the loop instruction address.  */
4266  if (insn_len == 3
4267      && insn_num_slots (contents, content_length, offset + loop_len) == 1
4268      && insn_decode_opcode (contents, content_length,
4269			     offset + loop_len, 0) == get_rsr_lend_opcode()
4270      && insn_decode_len (contents, content_length, offset + loop_len + 3) == 3
4271      && insn_num_slots (contents, content_length, offset + loop_len + 3) == 1
4272      && insn_decode_opcode (contents, content_length,
4273			     offset + loop_len + 3, 0) == get_wsr_lbeg_opcode())
4274    {
4275      loop_len = 27;
4276      insn_len = insn_decode_len (contents, content_length, offset + loop_len);
4277    }
4278  return check_branch_target_aligned_address (address + loop_len, insn_len);
4279}
4280
4281
4282static bool
4283check_branch_target_aligned_address (bfd_vma addr, int len)
4284{
4285  if (len == 8)
4286    return (addr % 8 == 0);
4287  return ((addr >> 2) == ((addr + len - 1) >> 2));
4288}
4289
4290
4291/* Instruction widening and narrowing.  */
4292
4293/* When FLIX is available we need to access certain instructions only
4294   when they are 16-bit or 24-bit instructions.  This table caches
4295   information about such instructions by walking through all the
4296   opcodes and finding the smallest single-slot format into which each
4297   can be encoded.  */
4298
4299static xtensa_format *op_single_fmt_table = NULL;
4300
4301
4302static void
4303init_op_single_format_table (void)
4304{
4305  xtensa_isa isa = xtensa_default_isa;
4306  xtensa_insnbuf ibuf;
4307  xtensa_opcode opcode;
4308  xtensa_format fmt;
4309  int num_opcodes;
4310
4311  if (op_single_fmt_table)
4312    return;
4313
4314  ibuf = xtensa_insnbuf_alloc (isa);
4315  num_opcodes = xtensa_isa_num_opcodes (isa);
4316
4317  op_single_fmt_table = (xtensa_format *)
4318    bfd_malloc (sizeof (xtensa_format) * num_opcodes);
4319  for (opcode = 0; opcode < num_opcodes; opcode++)
4320    {
4321      op_single_fmt_table[opcode] = XTENSA_UNDEFINED;
4322      for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
4323	{
4324	  if (xtensa_format_num_slots (isa, fmt) == 1
4325	      && xtensa_opcode_encode (isa, fmt, 0, ibuf, opcode) == 0)
4326	    {
4327	      xtensa_opcode old_fmt = op_single_fmt_table[opcode];
4328	      int fmt_length = xtensa_format_length (isa, fmt);
4329	      if (old_fmt == XTENSA_UNDEFINED
4330		  || fmt_length < xtensa_format_length (isa, old_fmt))
4331		op_single_fmt_table[opcode] = fmt;
4332	    }
4333	}
4334    }
4335  xtensa_insnbuf_free (isa, ibuf);
4336}
4337
4338
4339static xtensa_format
4340get_single_format (xtensa_opcode opcode)
4341{
4342  init_op_single_format_table ();
4343  return op_single_fmt_table[opcode];
4344}
4345
4346
4347/* For the set of narrowable instructions we do NOT include the
4348   narrowings beqz -> beqz.n or bnez -> bnez.n because of complexities
4349   involved during linker relaxation that may require these to
4350   re-expand in some conditions.  Also, the narrowing "or" -> mov.n
4351   requires special case code to ensure it only works when op1 == op2.  */
4352
4353struct string_pair
4354{
4355  const char *wide;
4356  const char *narrow;
4357};
4358
4359const struct string_pair narrowable[] =
4360{
4361  { "add", "add.n" },
4362  { "addi", "addi.n" },
4363  { "addmi", "addi.n" },
4364  { "l32i", "l32i.n" },
4365  { "movi", "movi.n" },
4366  { "ret", "ret.n" },
4367  { "retw", "retw.n" },
4368  { "s32i", "s32i.n" },
4369  { "or", "mov.n" } /* special case only when op1 == op2 */
4370};
4371
4372const struct string_pair widenable[] =
4373{
4374  { "add", "add.n" },
4375  { "addi", "addi.n" },
4376  { "addmi", "addi.n" },
4377  { "beqz", "beqz.n" },
4378  { "bnez", "bnez.n" },
4379  { "l32i", "l32i.n" },
4380  { "movi", "movi.n" },
4381  { "ret", "ret.n" },
4382  { "retw", "retw.n" },
4383  { "s32i", "s32i.n" },
4384  { "or", "mov.n" } /* special case only when op1 == op2 */
4385};
4386
4387
4388/* Check if an instruction can be "narrowed", i.e., changed from a standard
4389   3-byte instruction to a 2-byte "density" instruction.  If it is valid,
4390   return the instruction buffer holding the narrow instruction.  Otherwise,
4391   return 0.  The set of valid narrowing are specified by a string table
4392   but require some special case operand checks in some cases.  */
4393
4394static xtensa_insnbuf
4395can_narrow_instruction (xtensa_insnbuf slotbuf,
4396			xtensa_format fmt,
4397			xtensa_opcode opcode)
4398{
4399  xtensa_isa isa = xtensa_default_isa;
4400  xtensa_format o_fmt;
4401  unsigned opi;
4402
4403  static xtensa_insnbuf o_insnbuf = NULL;
4404  static xtensa_insnbuf o_slotbuf = NULL;
4405
4406  if (o_insnbuf == NULL)
4407    {
4408      o_insnbuf = xtensa_insnbuf_alloc (isa);
4409      o_slotbuf = xtensa_insnbuf_alloc (isa);
4410    }
4411
4412  for (opi = 0; opi < (sizeof (narrowable)/sizeof (struct string_pair)); opi++)
4413    {
4414      bool is_or = (strcmp ("or", narrowable[opi].wide) == 0);
4415
4416      if (opcode == xtensa_opcode_lookup (isa, narrowable[opi].wide))
4417	{
4418	  uint32 value, newval;
4419	  int i, operand_count, o_operand_count;
4420	  xtensa_opcode o_opcode;
4421
4422	  /* Address does not matter in this case.  We might need to
4423	     fix it to handle branches/jumps.  */
4424	  bfd_vma self_address = 0;
4425
4426	  o_opcode = xtensa_opcode_lookup (isa, narrowable[opi].narrow);
4427	  if (o_opcode == XTENSA_UNDEFINED)
4428	    return 0;
4429	  o_fmt = get_single_format (o_opcode);
4430	  if (o_fmt == XTENSA_UNDEFINED)
4431	    return 0;
4432
4433	  if (xtensa_format_length (isa, fmt) != 3
4434	      || xtensa_format_length (isa, o_fmt) != 2)
4435	    return 0;
4436
4437	  xtensa_format_encode (isa, o_fmt, o_insnbuf);
4438	  operand_count = xtensa_opcode_num_operands (isa, opcode);
4439	  o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4440
4441	  if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4442	    return 0;
4443
4444	  if (!is_or)
4445	    {
4446	      if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4447		return 0;
4448	    }
4449	  else
4450	    {
4451	      uint32 rawval0, rawval1, rawval2;
4452
4453	      if (o_operand_count + 1 != operand_count
4454		  || xtensa_operand_get_field (isa, opcode, 0,
4455					       fmt, 0, slotbuf, &rawval0) != 0
4456		  || xtensa_operand_get_field (isa, opcode, 1,
4457					       fmt, 0, slotbuf, &rawval1) != 0
4458		  || xtensa_operand_get_field (isa, opcode, 2,
4459					       fmt, 0, slotbuf, &rawval2) != 0
4460		  || rawval1 != rawval2
4461		  || rawval0 == rawval1 /* it is a nop */)
4462		return 0;
4463	    }
4464
4465	  for (i = 0; i < o_operand_count; ++i)
4466	    {
4467	      if (xtensa_operand_get_field (isa, opcode, i, fmt, 0,
4468					    slotbuf, &value)
4469		  || xtensa_operand_decode (isa, opcode, i, &value))
4470		return 0;
4471
4472	      /* PC-relative branches need adjustment, but
4473		 the PC-rel operand will always have a relocation.  */
4474	      newval = value;
4475	      if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4476					   self_address)
4477		  || xtensa_operand_encode (isa, o_opcode, i, &newval)
4478		  || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4479					       o_slotbuf, newval))
4480		return 0;
4481	    }
4482
4483	  if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4484	    return 0;
4485
4486	  return o_insnbuf;
4487	}
4488    }
4489  return 0;
4490}
4491
4492
4493/* Attempt to narrow an instruction.  If the narrowing is valid, perform
4494   the action in-place directly into the contents and return TRUE.  Otherwise,
4495   the return value is FALSE and the contents are not modified.  */
4496
4497static bool
4498narrow_instruction (bfd_byte *contents,
4499		    bfd_size_type content_length,
4500		    bfd_size_type offset)
4501{
4502  xtensa_opcode opcode;
4503  bfd_size_type insn_len;
4504  xtensa_isa isa = xtensa_default_isa;
4505  xtensa_format fmt;
4506  xtensa_insnbuf o_insnbuf;
4507
4508  static xtensa_insnbuf insnbuf = NULL;
4509  static xtensa_insnbuf slotbuf = NULL;
4510
4511  if (insnbuf == NULL)
4512    {
4513      insnbuf = xtensa_insnbuf_alloc (isa);
4514      slotbuf = xtensa_insnbuf_alloc (isa);
4515    }
4516
4517  BFD_ASSERT (offset < content_length);
4518
4519  if (content_length < 2)
4520    return false;
4521
4522  /* We will hand-code a few of these for a little while.
4523     These have all been specified in the assembler aleady.  */
4524  xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4525			     content_length - offset);
4526  fmt = xtensa_format_decode (isa, insnbuf);
4527  if (xtensa_format_num_slots (isa, fmt) != 1)
4528    return false;
4529
4530  if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4531    return false;
4532
4533  opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4534  if (opcode == XTENSA_UNDEFINED)
4535    return false;
4536  insn_len = xtensa_format_length (isa, fmt);
4537  if (insn_len > content_length)
4538    return false;
4539
4540  o_insnbuf = can_narrow_instruction (slotbuf, fmt, opcode);
4541  if (o_insnbuf)
4542    {
4543      xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4544			       content_length - offset);
4545      return true;
4546    }
4547
4548  return false;
4549}
4550
4551
4552/* Check if an instruction can be "widened", i.e., changed from a 2-byte
4553   "density" instruction to a standard 3-byte instruction.  If it is valid,
4554   return the instruction buffer holding the wide instruction.  Otherwise,
4555   return 0.  The set of valid widenings are specified by a string table
4556   but require some special case operand checks in some cases.  */
4557
4558static xtensa_insnbuf
4559can_widen_instruction (xtensa_insnbuf slotbuf,
4560		       xtensa_format fmt,
4561		       xtensa_opcode opcode)
4562{
4563  xtensa_isa isa = xtensa_default_isa;
4564  xtensa_format o_fmt;
4565  unsigned opi;
4566
4567  static xtensa_insnbuf o_insnbuf = NULL;
4568  static xtensa_insnbuf o_slotbuf = NULL;
4569
4570  if (o_insnbuf == NULL)
4571    {
4572      o_insnbuf = xtensa_insnbuf_alloc (isa);
4573      o_slotbuf = xtensa_insnbuf_alloc (isa);
4574    }
4575
4576  for (opi = 0; opi < (sizeof (widenable)/sizeof (struct string_pair)); opi++)
4577    {
4578      bool is_or = (strcmp ("or", widenable[opi].wide) == 0);
4579      bool is_branch = (strcmp ("beqz", widenable[opi].wide) == 0
4580			|| strcmp ("bnez", widenable[opi].wide) == 0);
4581
4582      if (opcode == xtensa_opcode_lookup (isa, widenable[opi].narrow))
4583	{
4584	  uint32 value, newval;
4585	  int i, operand_count, o_operand_count, check_operand_count;
4586	  xtensa_opcode o_opcode;
4587
4588	  /* Address does not matter in this case.  We might need to fix it
4589	     to handle branches/jumps.  */
4590	  bfd_vma self_address = 0;
4591
4592	  o_opcode = xtensa_opcode_lookup (isa, widenable[opi].wide);
4593	  if (o_opcode == XTENSA_UNDEFINED)
4594	    return 0;
4595	  o_fmt = get_single_format (o_opcode);
4596	  if (o_fmt == XTENSA_UNDEFINED)
4597	    return 0;
4598
4599	  if (xtensa_format_length (isa, fmt) != 2
4600	      || xtensa_format_length (isa, o_fmt) != 3)
4601	    return 0;
4602
4603	  xtensa_format_encode (isa, o_fmt, o_insnbuf);
4604	  operand_count = xtensa_opcode_num_operands (isa, opcode);
4605	  o_operand_count = xtensa_opcode_num_operands (isa, o_opcode);
4606	  check_operand_count = o_operand_count;
4607
4608	  if (xtensa_opcode_encode (isa, o_fmt, 0, o_slotbuf, o_opcode) != 0)
4609	    return 0;
4610
4611	  if (!is_or)
4612	    {
4613	      if (xtensa_opcode_num_operands (isa, o_opcode) != operand_count)
4614		return 0;
4615	    }
4616	  else
4617	    {
4618	      uint32 rawval0, rawval1;
4619
4620	      if (o_operand_count != operand_count + 1
4621		  || xtensa_operand_get_field (isa, opcode, 0,
4622					       fmt, 0, slotbuf, &rawval0) != 0
4623		  || xtensa_operand_get_field (isa, opcode, 1,
4624					       fmt, 0, slotbuf, &rawval1) != 0
4625		  || rawval0 == rawval1 /* it is a nop */)
4626		return 0;
4627	    }
4628	  if (is_branch)
4629	    check_operand_count--;
4630
4631	  for (i = 0; i < check_operand_count; i++)
4632	    {
4633	      int new_i = i;
4634	      if (is_or && i == o_operand_count - 1)
4635		new_i = i - 1;
4636	      if (xtensa_operand_get_field (isa, opcode, new_i, fmt, 0,
4637					    slotbuf, &value)
4638		  || xtensa_operand_decode (isa, opcode, new_i, &value))
4639		return 0;
4640
4641	      /* PC-relative branches need adjustment, but
4642		 the PC-rel operand will always have a relocation.  */
4643	      newval = value;
4644	      if (xtensa_operand_do_reloc (isa, o_opcode, i, &newval,
4645					   self_address)
4646		  || xtensa_operand_encode (isa, o_opcode, i, &newval)
4647		  || xtensa_operand_set_field (isa, o_opcode, i, o_fmt, 0,
4648					       o_slotbuf, newval))
4649		return 0;
4650	    }
4651
4652	  if (xtensa_format_set_slot (isa, o_fmt, 0, o_insnbuf, o_slotbuf))
4653	    return 0;
4654
4655	  return o_insnbuf;
4656	}
4657    }
4658  return 0;
4659}
4660
4661
4662/* Attempt to widen an instruction.  If the widening is valid, perform
4663   the action in-place directly into the contents and return TRUE.  Otherwise,
4664   the return value is FALSE and the contents are not modified.  */
4665
4666static bool
4667widen_instruction (bfd_byte *contents,
4668		   bfd_size_type content_length,
4669		   bfd_size_type offset)
4670{
4671  xtensa_opcode opcode;
4672  bfd_size_type insn_len;
4673  xtensa_isa isa = xtensa_default_isa;
4674  xtensa_format fmt;
4675  xtensa_insnbuf o_insnbuf;
4676
4677  static xtensa_insnbuf insnbuf = NULL;
4678  static xtensa_insnbuf slotbuf = NULL;
4679
4680  if (insnbuf == NULL)
4681    {
4682      insnbuf = xtensa_insnbuf_alloc (isa);
4683      slotbuf = xtensa_insnbuf_alloc (isa);
4684    }
4685
4686  BFD_ASSERT (offset < content_length);
4687
4688  if (content_length < 2)
4689    return false;
4690
4691  /* We will hand-code a few of these for a little while.
4692     These have all been specified in the assembler aleady.  */
4693  xtensa_insnbuf_from_chars (isa, insnbuf, &contents[offset],
4694			     content_length - offset);
4695  fmt = xtensa_format_decode (isa, insnbuf);
4696  if (xtensa_format_num_slots (isa, fmt) != 1)
4697    return false;
4698
4699  if (xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf) != 0)
4700    return false;
4701
4702  opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4703  if (opcode == XTENSA_UNDEFINED)
4704    return false;
4705  insn_len = xtensa_format_length (isa, fmt);
4706  if (insn_len > content_length)
4707    return false;
4708
4709  o_insnbuf = can_widen_instruction (slotbuf, fmt, opcode);
4710  if (o_insnbuf)
4711    {
4712      xtensa_insnbuf_to_chars (isa, o_insnbuf, contents + offset,
4713			       content_length - offset);
4714      return true;
4715    }
4716  return false;
4717}
4718
4719
4720/* Code for transforming CALLs at link-time.  */
4721
4722static bfd_reloc_status_type
4723elf_xtensa_do_asm_simplify (bfd_byte *contents,
4724			    bfd_vma address,
4725			    bfd_vma content_length,
4726			    char **error_message)
4727{
4728  static xtensa_insnbuf insnbuf = NULL;
4729  static xtensa_insnbuf slotbuf = NULL;
4730  xtensa_format core_format = XTENSA_UNDEFINED;
4731  xtensa_opcode opcode;
4732  xtensa_opcode direct_call_opcode;
4733  xtensa_isa isa = xtensa_default_isa;
4734  bfd_byte *chbuf = contents + address;
4735  int opn;
4736
4737  if (insnbuf == NULL)
4738    {
4739      insnbuf = xtensa_insnbuf_alloc (isa);
4740      slotbuf = xtensa_insnbuf_alloc (isa);
4741    }
4742
4743  if (content_length < address)
4744    {
4745      *error_message = _("attempt to convert L32R/CALLX to CALL failed");
4746      return bfd_reloc_other;
4747    }
4748
4749  opcode = get_expanded_call_opcode (chbuf, content_length - address, 0);
4750  direct_call_opcode = swap_callx_for_call_opcode (opcode);
4751  if (direct_call_opcode == XTENSA_UNDEFINED)
4752    {
4753      *error_message = _("attempt to convert L32R/CALLX to CALL failed");
4754      return bfd_reloc_other;
4755    }
4756
4757  /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset.  */
4758  core_format = xtensa_format_lookup (isa, "x24");
4759  opcode = xtensa_opcode_lookup (isa, "or");
4760  xtensa_opcode_encode (isa, core_format, 0, slotbuf, opcode);
4761  for (opn = 0; opn < 3; opn++)
4762    {
4763      uint32 regno = 1;
4764      xtensa_operand_encode (isa, opcode, opn, &regno);
4765      xtensa_operand_set_field (isa, opcode, opn, core_format, 0,
4766				slotbuf, regno);
4767    }
4768  xtensa_format_encode (isa, core_format, insnbuf);
4769  xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4770  xtensa_insnbuf_to_chars (isa, insnbuf, chbuf, content_length - address);
4771
4772  /* Assemble a CALL ("callN 0") into the 3 byte offset.  */
4773  xtensa_opcode_encode (isa, core_format, 0, slotbuf, direct_call_opcode);
4774  xtensa_operand_set_field (isa, opcode, 0, core_format, 0, slotbuf, 0);
4775
4776  xtensa_format_encode (isa, core_format, insnbuf);
4777  xtensa_format_set_slot (isa, core_format, 0, insnbuf, slotbuf);
4778  xtensa_insnbuf_to_chars (isa, insnbuf, chbuf + 3,
4779			   content_length - address - 3);
4780
4781  return bfd_reloc_ok;
4782}
4783
4784
4785static bfd_reloc_status_type
4786contract_asm_expansion (bfd_byte *contents,
4787			bfd_vma content_length,
4788			Elf_Internal_Rela *irel,
4789			char **error_message)
4790{
4791  bfd_reloc_status_type retval =
4792    elf_xtensa_do_asm_simplify (contents, irel->r_offset, content_length,
4793				error_message);
4794
4795  if (retval != bfd_reloc_ok)
4796    return bfd_reloc_dangerous;
4797
4798  /* Update the irel->r_offset field so that the right immediate and
4799     the right instruction are modified during the relocation.  */
4800  irel->r_offset += 3;
4801  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_XTENSA_SLOT0_OP);
4802  return bfd_reloc_ok;
4803}
4804
4805
4806static xtensa_opcode
4807swap_callx_for_call_opcode (xtensa_opcode opcode)
4808{
4809  init_call_opcodes ();
4810
4811  if (opcode == callx0_op) return call0_op;
4812  if (opcode == callx4_op) return call4_op;
4813  if (opcode == callx8_op) return call8_op;
4814  if (opcode == callx12_op) return call12_op;
4815
4816  /* Return XTENSA_UNDEFINED if the opcode is not an indirect call.  */
4817  return XTENSA_UNDEFINED;
4818}
4819
4820
4821/* Check if "buf" is pointing to a "L32R aN; CALLX aN" or "CONST16 aN;
4822   CONST16 aN; CALLX aN" sequence, and if so, return the CALLX opcode.
4823   If not, return XTENSA_UNDEFINED.  */
4824
4825#define L32R_TARGET_REG_OPERAND 0
4826#define CONST16_TARGET_REG_OPERAND 0
4827#define CALLN_SOURCE_OPERAND 0
4828
4829static xtensa_opcode
4830get_expanded_call_opcode (bfd_byte *buf, int bufsize, bool *p_uses_l32r)
4831{
4832  static xtensa_insnbuf insnbuf = NULL;
4833  static xtensa_insnbuf slotbuf = NULL;
4834  xtensa_format fmt;
4835  xtensa_opcode opcode;
4836  xtensa_isa isa = xtensa_default_isa;
4837  uint32 regno, const16_regno, call_regno;
4838  int offset = 0;
4839
4840  if (insnbuf == NULL)
4841    {
4842      insnbuf = xtensa_insnbuf_alloc (isa);
4843      slotbuf = xtensa_insnbuf_alloc (isa);
4844    }
4845
4846  xtensa_insnbuf_from_chars (isa, insnbuf, buf, bufsize);
4847  fmt = xtensa_format_decode (isa, insnbuf);
4848  if (fmt == XTENSA_UNDEFINED
4849      || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4850    return XTENSA_UNDEFINED;
4851
4852  opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4853  if (opcode == XTENSA_UNDEFINED)
4854    return XTENSA_UNDEFINED;
4855
4856  if (opcode == get_l32r_opcode ())
4857    {
4858      if (p_uses_l32r)
4859	*p_uses_l32r = true;
4860      if (xtensa_operand_get_field (isa, opcode, L32R_TARGET_REG_OPERAND,
4861				    fmt, 0, slotbuf, &regno)
4862	  || xtensa_operand_decode (isa, opcode, L32R_TARGET_REG_OPERAND,
4863				    &regno))
4864	return XTENSA_UNDEFINED;
4865    }
4866  else if (opcode == get_const16_opcode ())
4867    {
4868      if (p_uses_l32r)
4869	*p_uses_l32r = false;
4870      if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4871				    fmt, 0, slotbuf, &regno)
4872	  || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4873				    &regno))
4874	return XTENSA_UNDEFINED;
4875
4876      /* Check that the next instruction is also CONST16.  */
4877      offset += xtensa_format_length (isa, fmt);
4878      xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4879      fmt = xtensa_format_decode (isa, insnbuf);
4880      if (fmt == XTENSA_UNDEFINED
4881	  || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4882	return XTENSA_UNDEFINED;
4883      opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4884      if (opcode != get_const16_opcode ())
4885	return XTENSA_UNDEFINED;
4886
4887      if (xtensa_operand_get_field (isa, opcode, CONST16_TARGET_REG_OPERAND,
4888				    fmt, 0, slotbuf, &const16_regno)
4889	  || xtensa_operand_decode (isa, opcode, CONST16_TARGET_REG_OPERAND,
4890				    &const16_regno)
4891	  || const16_regno != regno)
4892	return XTENSA_UNDEFINED;
4893    }
4894  else
4895    return XTENSA_UNDEFINED;
4896
4897  /* Next instruction should be an CALLXn with operand 0 == regno.  */
4898  offset += xtensa_format_length (isa, fmt);
4899  xtensa_insnbuf_from_chars (isa, insnbuf, buf + offset, bufsize - offset);
4900  fmt = xtensa_format_decode (isa, insnbuf);
4901  if (fmt == XTENSA_UNDEFINED
4902      || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
4903    return XTENSA_UNDEFINED;
4904  opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
4905  if (opcode == XTENSA_UNDEFINED
4906      || !is_indirect_call_opcode (opcode))
4907    return XTENSA_UNDEFINED;
4908
4909  if (xtensa_operand_get_field (isa, opcode, CALLN_SOURCE_OPERAND,
4910				fmt, 0, slotbuf, &call_regno)
4911      || xtensa_operand_decode (isa, opcode, CALLN_SOURCE_OPERAND,
4912				&call_regno))
4913    return XTENSA_UNDEFINED;
4914
4915  if (call_regno != regno)
4916    return XTENSA_UNDEFINED;
4917
4918  return opcode;
4919}
4920
4921
4922/* Data structures used during relaxation.  */
4923
4924/* r_reloc: relocation values.  */
4925
4926/* Through the relaxation process, we need to keep track of the values
4927   that will result from evaluating relocations.  The standard ELF
4928   relocation structure is not sufficient for this purpose because we're
4929   operating on multiple input files at once, so we need to know which
4930   input file a relocation refers to.  The r_reloc structure thus
4931   records both the input file (bfd) and ELF relocation.
4932
4933   For efficiency, an r_reloc also contains a "target_offset" field to
4934   cache the target-section-relative offset value that is represented by
4935   the relocation.
4936
4937   The r_reloc also contains a virtual offset that allows multiple
4938   inserted literals to be placed at the same "address" with
4939   different offsets.  */
4940
4941typedef struct r_reloc_struct r_reloc;
4942
4943struct r_reloc_struct
4944{
4945  bfd *abfd;
4946  Elf_Internal_Rela rela;
4947  bfd_vma target_offset;
4948  bfd_vma virtual_offset;
4949};
4950
4951
4952/* The r_reloc structure is included by value in literal_value, but not
4953   every literal_value has an associated relocation -- some are simple
4954   constants.  In such cases, we set all the fields in the r_reloc
4955   struct to zero.  The r_reloc_is_const function should be used to
4956   detect this case.  */
4957
4958static bool
4959r_reloc_is_const (const r_reloc *r_rel)
4960{
4961  return (r_rel->abfd == NULL);
4962}
4963
4964
4965static bfd_vma
4966r_reloc_get_target_offset (const r_reloc *r_rel)
4967{
4968  bfd_vma target_offset;
4969  unsigned long r_symndx;
4970
4971  BFD_ASSERT (!r_reloc_is_const (r_rel));
4972  r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4973  target_offset = get_elf_r_symndx_offset (r_rel->abfd, r_symndx);
4974  return (target_offset + r_rel->rela.r_addend);
4975}
4976
4977
4978static struct elf_link_hash_entry *
4979r_reloc_get_hash_entry (const r_reloc *r_rel)
4980{
4981  unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4982  return get_elf_r_symndx_hash_entry (r_rel->abfd, r_symndx);
4983}
4984
4985
4986static asection *
4987r_reloc_get_section (const r_reloc *r_rel)
4988{
4989  unsigned long r_symndx = ELF32_R_SYM (r_rel->rela.r_info);
4990  return get_elf_r_symndx_section (r_rel->abfd, r_symndx);
4991}
4992
4993
4994static bool
4995r_reloc_is_defined (const r_reloc *r_rel)
4996{
4997  asection *sec;
4998  if (r_rel == NULL)
4999    return false;
5000
5001  sec = r_reloc_get_section (r_rel);
5002  if (sec == bfd_abs_section_ptr
5003      || sec == bfd_com_section_ptr
5004      || sec == bfd_und_section_ptr)
5005    return false;
5006  return true;
5007}
5008
5009
5010static void
5011r_reloc_init (r_reloc *r_rel,
5012	      bfd *abfd,
5013	      Elf_Internal_Rela *irel,
5014	      bfd_byte *contents,
5015	      bfd_size_type content_length)
5016{
5017  int r_type;
5018  reloc_howto_type *howto;
5019
5020  if (irel)
5021    {
5022      r_rel->rela = *irel;
5023      r_rel->abfd = abfd;
5024      r_rel->target_offset = r_reloc_get_target_offset (r_rel);
5025      r_rel->virtual_offset = 0;
5026      r_type = ELF32_R_TYPE (r_rel->rela.r_info);
5027      howto = &elf_howto_table[r_type];
5028      if (howto->partial_inplace)
5029	{
5030	  bfd_vma inplace_val;
5031	  BFD_ASSERT (r_rel->rela.r_offset < content_length);
5032
5033	  inplace_val = bfd_get_32 (abfd, &contents[r_rel->rela.r_offset]);
5034	  r_rel->target_offset += inplace_val;
5035	}
5036    }
5037  else
5038    memset (r_rel, 0, sizeof (r_reloc));
5039}
5040
5041
5042#if DEBUG
5043
5044static void
5045print_r_reloc (FILE *fp, const r_reloc *r_rel)
5046{
5047  if (r_reloc_is_defined (r_rel))
5048    {
5049      asection *sec = r_reloc_get_section (r_rel);
5050      fprintf (fp, " %s(%s + ", sec->owner->filename, sec->name);
5051    }
5052  else if (r_reloc_get_hash_entry (r_rel))
5053    fprintf (fp, " %s + ", r_reloc_get_hash_entry (r_rel)->root.root.string);
5054  else
5055    fprintf (fp, " ?? + ");
5056
5057  fprintf_vma (fp, r_rel->target_offset);
5058  if (r_rel->virtual_offset)
5059    {
5060      fprintf (fp, " + ");
5061      fprintf_vma (fp, r_rel->virtual_offset);
5062    }
5063
5064  fprintf (fp, ")");
5065}
5066
5067#endif /* DEBUG */
5068
5069
5070/* source_reloc: relocations that reference literals.  */
5071
5072/* To determine whether literals can be coalesced, we need to first
5073   record all the relocations that reference the literals.  The
5074   source_reloc structure below is used for this purpose.  The
5075   source_reloc entries are kept in a per-literal-section array, sorted
5076   by offset within the literal section (i.e., target offset).
5077
5078   The source_sec and r_rel.rela.r_offset fields identify the source of
5079   the relocation.  The r_rel field records the relocation value, i.e.,
5080   the offset of the literal being referenced.  The opnd field is needed
5081   to determine the range of the immediate field to which the relocation
5082   applies, so we can determine whether another literal with the same
5083   value is within range.  The is_null field is true when the relocation
5084   is being removed (e.g., when an L32R is being removed due to a CALLX
5085   that is converted to a direct CALL).  */
5086
5087typedef struct source_reloc_struct source_reloc;
5088
5089struct source_reloc_struct
5090{
5091  asection *source_sec;
5092  r_reloc r_rel;
5093  xtensa_opcode opcode;
5094  int opnd;
5095  bool is_null;
5096  bool is_abs_literal;
5097};
5098
5099
5100static void
5101init_source_reloc (source_reloc *reloc,
5102		   asection *source_sec,
5103		   const r_reloc *r_rel,
5104		   xtensa_opcode opcode,
5105		   int opnd,
5106		   bool is_abs_literal)
5107{
5108  reloc->source_sec = source_sec;
5109  reloc->r_rel = *r_rel;
5110  reloc->opcode = opcode;
5111  reloc->opnd = opnd;
5112  reloc->is_null = false;
5113  reloc->is_abs_literal = is_abs_literal;
5114}
5115
5116
5117/* Find the source_reloc for a particular source offset and relocation
5118   type.  Note that the array is sorted by _target_ offset, so this is
5119   just a linear search.  */
5120
5121static source_reloc *
5122find_source_reloc (source_reloc *src_relocs,
5123		   int src_count,
5124		   asection *sec,
5125		   Elf_Internal_Rela *irel)
5126{
5127  int i;
5128
5129  for (i = 0; i < src_count; i++)
5130    {
5131      if (src_relocs[i].source_sec == sec
5132	  && src_relocs[i].r_rel.rela.r_offset == irel->r_offset
5133	  && (ELF32_R_TYPE (src_relocs[i].r_rel.rela.r_info)
5134	      == ELF32_R_TYPE (irel->r_info)))
5135	return &src_relocs[i];
5136    }
5137
5138  return NULL;
5139}
5140
5141
5142static int
5143source_reloc_compare (const void *ap, const void *bp)
5144{
5145  const source_reloc *a = (const source_reloc *) ap;
5146  const source_reloc *b = (const source_reloc *) bp;
5147
5148  if (a->r_rel.target_offset != b->r_rel.target_offset)
5149    return (a->r_rel.target_offset - b->r_rel.target_offset);
5150
5151  /* We don't need to sort on these criteria for correctness,
5152     but enforcing a more strict ordering prevents unstable qsort
5153     from behaving differently with different implementations.
5154     Without the code below we get correct but different results
5155     on Solaris 2.7 and 2.8.  We would like to always produce the
5156     same results no matter the host. */
5157
5158  if ((!a->is_null) - (!b->is_null))
5159    return ((!a->is_null) - (!b->is_null));
5160  return internal_reloc_compare (&a->r_rel.rela, &b->r_rel.rela);
5161}
5162
5163
5164/* Literal values and value hash tables.  */
5165
5166/* Literals with the same value can be coalesced.  The literal_value
5167   structure records the value of a literal: the "r_rel" field holds the
5168   information from the relocation on the literal (if there is one) and
5169   the "value" field holds the contents of the literal word itself.
5170
5171   The value_map structure records a literal value along with the
5172   location of a literal holding that value.  The value_map hash table
5173   is indexed by the literal value, so that we can quickly check if a
5174   particular literal value has been seen before and is thus a candidate
5175   for coalescing.  */
5176
5177typedef struct literal_value_struct literal_value;
5178typedef struct value_map_struct value_map;
5179typedef struct value_map_hash_table_struct value_map_hash_table;
5180
5181struct literal_value_struct
5182{
5183  r_reloc r_rel;
5184  unsigned long value;
5185  bool is_abs_literal;
5186};
5187
5188struct value_map_struct
5189{
5190  literal_value val;			/* The literal value.  */
5191  r_reloc loc;				/* Location of the literal.  */
5192  value_map *next;
5193};
5194
5195struct value_map_hash_table_struct
5196{
5197  unsigned bucket_count;
5198  value_map **buckets;
5199  unsigned count;
5200  bool has_last_loc;
5201  r_reloc last_loc;
5202};
5203
5204
5205static void
5206init_literal_value (literal_value *lit,
5207		    const r_reloc *r_rel,
5208		    unsigned long value,
5209		    bool is_abs_literal)
5210{
5211  lit->r_rel = *r_rel;
5212  lit->value = value;
5213  lit->is_abs_literal = is_abs_literal;
5214}
5215
5216
5217static bool
5218literal_value_equal (const literal_value *src1,
5219		     const literal_value *src2,
5220		     bool final_static_link)
5221{
5222  struct elf_link_hash_entry *h1, *h2;
5223
5224  if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
5225    return false;
5226
5227  if (r_reloc_is_const (&src1->r_rel))
5228    return (src1->value == src2->value);
5229
5230  if (ELF32_R_TYPE (src1->r_rel.rela.r_info)
5231      != ELF32_R_TYPE (src2->r_rel.rela.r_info))
5232    return false;
5233
5234  if (src1->r_rel.target_offset != src2->r_rel.target_offset)
5235    return false;
5236
5237  if (src1->r_rel.virtual_offset != src2->r_rel.virtual_offset)
5238    return false;
5239
5240  if (src1->value != src2->value)
5241    return false;
5242
5243  /* Now check for the same section (if defined) or the same elf_hash
5244     (if undefined or weak).  */
5245  h1 = r_reloc_get_hash_entry (&src1->r_rel);
5246  h2 = r_reloc_get_hash_entry (&src2->r_rel);
5247  if (r_reloc_is_defined (&src1->r_rel)
5248      && (final_static_link
5249	  || ((!h1 || h1->root.type != bfd_link_hash_defweak)
5250	      && (!h2 || h2->root.type != bfd_link_hash_defweak))))
5251    {
5252      if (r_reloc_get_section (&src1->r_rel)
5253	  != r_reloc_get_section (&src2->r_rel))
5254	return false;
5255    }
5256  else
5257    {
5258      /* Require that the hash entries (i.e., symbols) be identical.  */
5259      if (h1 != h2 || h1 == 0)
5260	return false;
5261    }
5262
5263  if (src1->is_abs_literal != src2->is_abs_literal)
5264    return false;
5265
5266  return true;
5267}
5268
5269
5270/* Must be power of 2.  */
5271#define INITIAL_HASH_RELOC_BUCKET_COUNT 1024
5272
5273static value_map_hash_table *
5274value_map_hash_table_init (void)
5275{
5276  value_map_hash_table *values;
5277
5278  values = (value_map_hash_table *)
5279    bfd_zmalloc (sizeof (value_map_hash_table));
5280  values->bucket_count = INITIAL_HASH_RELOC_BUCKET_COUNT;
5281  values->count = 0;
5282  values->buckets = (value_map **)
5283    bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
5284  if (values->buckets == NULL)
5285    {
5286      free (values);
5287      return NULL;
5288    }
5289  values->has_last_loc = false;
5290
5291  return values;
5292}
5293
5294
5295static void
5296value_map_hash_table_delete (value_map_hash_table *table)
5297{
5298  free (table->buckets);
5299  free (table);
5300}
5301
5302
5303static unsigned
5304hash_bfd_vma (bfd_vma val)
5305{
5306  return (val >> 2) + (val >> 10);
5307}
5308
5309
5310static unsigned
5311literal_value_hash (const literal_value *src)
5312{
5313  unsigned hash_val;
5314
5315  hash_val = hash_bfd_vma (src->value);
5316  if (!r_reloc_is_const (&src->r_rel))
5317    {
5318      void *sec_or_hash;
5319
5320      hash_val += hash_bfd_vma (src->is_abs_literal * 1000);
5321      hash_val += hash_bfd_vma (src->r_rel.target_offset);
5322      hash_val += hash_bfd_vma (src->r_rel.virtual_offset);
5323
5324      /* Now check for the same section and the same elf_hash.  */
5325      if (r_reloc_is_defined (&src->r_rel))
5326	sec_or_hash = r_reloc_get_section (&src->r_rel);
5327      else
5328	sec_or_hash = r_reloc_get_hash_entry (&src->r_rel);
5329      hash_val += hash_bfd_vma ((bfd_vma) (size_t) sec_or_hash);
5330    }
5331  return hash_val;
5332}
5333
5334
5335/* Check if the specified literal_value has been seen before.  */
5336
5337static value_map *
5338value_map_get_cached_value (value_map_hash_table *map,
5339			    const literal_value *val,
5340			    bool final_static_link)
5341{
5342  value_map *map_e;
5343  value_map *bucket;
5344  unsigned idx;
5345
5346  idx = literal_value_hash (val);
5347  idx = idx & (map->bucket_count - 1);
5348  bucket = map->buckets[idx];
5349  for (map_e = bucket; map_e; map_e = map_e->next)
5350    {
5351      if (literal_value_equal (&map_e->val, val, final_static_link))
5352	return map_e;
5353    }
5354  return NULL;
5355}
5356
5357
5358/* Record a new literal value.  It is illegal to call this if VALUE
5359   already has an entry here.  */
5360
5361static value_map *
5362add_value_map (value_map_hash_table *map,
5363	       const literal_value *val,
5364	       const r_reloc *loc,
5365	       bool final_static_link)
5366{
5367  value_map **bucket_p;
5368  unsigned idx;
5369
5370  value_map *val_e = (value_map *) bfd_zmalloc (sizeof (value_map));
5371  if (val_e == NULL)
5372    {
5373      bfd_set_error (bfd_error_no_memory);
5374      return NULL;
5375    }
5376
5377  BFD_ASSERT (!value_map_get_cached_value (map, val, final_static_link));
5378  val_e->val = *val;
5379  val_e->loc = *loc;
5380
5381  idx = literal_value_hash (val);
5382  idx = idx & (map->bucket_count - 1);
5383  bucket_p = &map->buckets[idx];
5384
5385  val_e->next = *bucket_p;
5386  *bucket_p = val_e;
5387  map->count++;
5388  /* FIXME: Consider resizing the hash table if we get too many entries.  */
5389
5390  return val_e;
5391}
5392
5393
5394/* Lists of text actions (ta_) for narrowing, widening, longcall
5395   conversion, space fill, code & literal removal, etc.  */
5396
5397/* The following text actions are generated:
5398
5399   "ta_remove_insn"	    remove an instruction or instructions
5400   "ta_remove_longcall"	    convert longcall to call
5401   "ta_convert_longcall"    convert longcall to nop/call
5402   "ta_narrow_insn"	    narrow a wide instruction
5403   "ta_widen"		    widen a narrow instruction
5404   "ta_fill"		    add fill or remove fill
5405      removed < 0 is a fill; branches to the fill address will be
5406	changed to address + fill size (e.g., address - removed)
5407      removed >= 0 branches to the fill address will stay unchanged
5408   "ta_remove_literal"	    remove a literal; this action is
5409			    indicated when a literal is removed
5410			    or replaced.
5411   "ta_add_literal"	    insert a new literal; this action is
5412			    indicated when a literal has been moved.
5413			    It may use a virtual_offset because
5414			    multiple literals can be placed at the
5415			    same location.
5416
5417   For each of these text actions, we also record the number of bytes
5418   removed by performing the text action.  In the case of a "ta_widen"
5419   or a "ta_fill" that adds space, the removed_bytes will be negative.  */
5420
5421typedef struct text_action_struct text_action;
5422typedef struct text_action_list_struct text_action_list;
5423typedef enum text_action_enum_t text_action_t;
5424
5425enum text_action_enum_t
5426{
5427  ta_none,
5428  ta_remove_insn,	 /* removed = -size */
5429  ta_remove_longcall,	 /* removed = -size */
5430  ta_convert_longcall,	 /* removed = 0 */
5431  ta_narrow_insn,	 /* removed = -1 */
5432  ta_widen_insn,	 /* removed = +1 */
5433  ta_fill,		 /* removed = +size */
5434  ta_remove_literal,
5435  ta_add_literal
5436};
5437
5438
5439/* Structure for a text action record.  */
5440struct text_action_struct
5441{
5442  text_action_t action;
5443  asection *sec;	/* Optional */
5444  bfd_vma offset;
5445  bfd_vma virtual_offset;  /* Zero except for adding literals.  */
5446  int removed_bytes;
5447  literal_value value;	/* Only valid when adding literals.  */
5448};
5449
5450struct removal_by_action_entry_struct
5451{
5452  bfd_vma offset;
5453  int removed;
5454  int eq_removed;
5455  int eq_removed_before_fill;
5456};
5457typedef struct removal_by_action_entry_struct removal_by_action_entry;
5458
5459struct removal_by_action_map_struct
5460{
5461  unsigned n_entries;
5462  removal_by_action_entry *entry;
5463};
5464typedef struct removal_by_action_map_struct removal_by_action_map;
5465
5466
5467/* List of all of the actions taken on a text section.  */
5468struct text_action_list_struct
5469{
5470  unsigned count;
5471  splay_tree tree;
5472  removal_by_action_map map;
5473};
5474
5475
5476static text_action *
5477find_fill_action (text_action_list *l, asection *sec, bfd_vma offset)
5478{
5479  text_action a;
5480
5481  /* It is not necessary to fill at the end of a section.  */
5482  if (sec->size == offset)
5483    return NULL;
5484
5485  a.offset = offset;
5486  a.action = ta_fill;
5487
5488  splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5489  if (node)
5490    return (text_action *)node->value;
5491  return NULL;
5492}
5493
5494
5495static int
5496compute_removed_action_diff (const text_action *ta,
5497			     asection *sec,
5498			     bfd_vma offset,
5499			     int removed,
5500			     int removable_space)
5501{
5502  int new_removed;
5503  int current_removed = 0;
5504
5505  if (ta)
5506    current_removed = ta->removed_bytes;
5507
5508  BFD_ASSERT (ta == NULL || ta->offset == offset);
5509  BFD_ASSERT (ta == NULL || ta->action == ta_fill);
5510
5511  /* It is not necessary to fill at the end of a section.  Clean this up.  */
5512  if (sec->size == offset)
5513    new_removed = removable_space - 0;
5514  else
5515    {
5516      int space;
5517      int added = -removed - current_removed;
5518      /* Ignore multiples of the section alignment.  */
5519      added = ((1 << sec->alignment_power) - 1) & added;
5520      new_removed = (-added);
5521
5522      /* Modify for removable.  */
5523      space = removable_space - new_removed;
5524      new_removed = (removable_space
5525		     - (((1 << sec->alignment_power) - 1) & space));
5526    }
5527  return (new_removed - current_removed);
5528}
5529
5530
5531static void
5532adjust_fill_action (text_action *ta, int fill_diff)
5533{
5534  ta->removed_bytes += fill_diff;
5535}
5536
5537
5538static int
5539text_action_compare (splay_tree_key a, splay_tree_key b)
5540{
5541  text_action *pa = (text_action *)a;
5542  text_action *pb = (text_action *)b;
5543  static const int action_priority[] =
5544    {
5545      [ta_fill] = 0,
5546      [ta_none] = 1,
5547      [ta_convert_longcall] = 2,
5548      [ta_narrow_insn] = 3,
5549      [ta_remove_insn] = 4,
5550      [ta_remove_longcall] = 5,
5551      [ta_remove_literal] = 6,
5552      [ta_widen_insn] = 7,
5553      [ta_add_literal] = 8,
5554    };
5555
5556  if (pa->offset == pb->offset)
5557    {
5558      if (pa->action == pb->action)
5559	  return 0;
5560      return action_priority[pa->action] - action_priority[pb->action];
5561    }
5562  else
5563    return pa->offset < pb->offset ? -1 : 1;
5564}
5565
5566static text_action *
5567action_first (text_action_list *action_list)
5568{
5569  splay_tree_node node = splay_tree_min (action_list->tree);
5570  return node ? (text_action *)node->value : NULL;
5571}
5572
5573static text_action *
5574action_next (text_action_list *action_list, text_action *action)
5575{
5576  splay_tree_node node = splay_tree_successor (action_list->tree,
5577					       (splay_tree_key)action);
5578  return node ? (text_action *)node->value : NULL;
5579}
5580
5581/* Add a modification action to the text.  For the case of adding or
5582   removing space, modify any current fill and assume that
5583   "unreachable_space" bytes can be freely contracted.  Note that a
5584   negative removed value is a fill.  */
5585
5586static void
5587text_action_add (text_action_list *l,
5588		 text_action_t action,
5589		 asection *sec,
5590		 bfd_vma offset,
5591		 int removed)
5592{
5593  text_action *ta;
5594  text_action a;
5595
5596  /* It is not necessary to fill at the end of a section.  */
5597  if (action == ta_fill && sec->size == offset)
5598    return;
5599
5600  /* It is not necessary to fill 0 bytes.  */
5601  if (action == ta_fill && removed == 0)
5602    return;
5603
5604  a.action = action;
5605  a.offset = offset;
5606
5607  if (action == ta_fill)
5608    {
5609      splay_tree_node node = splay_tree_lookup (l->tree, (splay_tree_key)&a);
5610
5611      if (node)
5612	{
5613	  ta = (text_action *)node->value;
5614	  ta->removed_bytes += removed;
5615	  return;
5616	}
5617    }
5618  else
5619    BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)&a) == NULL);
5620
5621  ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5622  ta->action = action;
5623  ta->sec = sec;
5624  ta->offset = offset;
5625  ta->removed_bytes = removed;
5626  splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5627  ++l->count;
5628}
5629
5630
5631static void
5632text_action_add_literal (text_action_list *l,
5633			 text_action_t action,
5634			 const r_reloc *loc,
5635			 const literal_value *value,
5636			 int removed)
5637{
5638  text_action *ta;
5639  asection *sec = r_reloc_get_section (loc);
5640  bfd_vma offset = loc->target_offset;
5641  bfd_vma virtual_offset = loc->virtual_offset;
5642
5643  BFD_ASSERT (action == ta_add_literal);
5644
5645  /* Create a new record and fill it up.  */
5646  ta = (text_action *) bfd_zmalloc (sizeof (text_action));
5647  ta->action = action;
5648  ta->sec = sec;
5649  ta->offset = offset;
5650  ta->virtual_offset = virtual_offset;
5651  ta->value = *value;
5652  ta->removed_bytes = removed;
5653
5654  BFD_ASSERT (splay_tree_lookup (l->tree, (splay_tree_key)ta) == NULL);
5655  splay_tree_insert (l->tree, (splay_tree_key)ta, (splay_tree_value)ta);
5656  ++l->count;
5657}
5658
5659
5660/* Find the total offset adjustment for the relaxations specified by
5661   text_actions, beginning from a particular starting action.  This is
5662   typically used from offset_with_removed_text to search an entire list of
5663   actions, but it may also be called directly when adjusting adjacent offsets
5664   so that each search may begin where the previous one left off.  */
5665
5666static int
5667removed_by_actions (text_action_list *action_list,
5668		    text_action **p_start_action,
5669		    bfd_vma offset,
5670		    bool before_fill)
5671{
5672  text_action *r;
5673  int removed = 0;
5674
5675  r = *p_start_action;
5676  if (r)
5677    {
5678      splay_tree_node node = splay_tree_lookup (action_list->tree,
5679						(splay_tree_key)r);
5680      BFD_ASSERT (node != NULL && r == (text_action *)node->value);
5681    }
5682
5683  while (r)
5684    {
5685      if (r->offset > offset)
5686	break;
5687
5688      if (r->offset == offset
5689	  && (before_fill || r->action != ta_fill || r->removed_bytes >= 0))
5690	break;
5691
5692      removed += r->removed_bytes;
5693
5694      r = action_next (action_list, r);
5695    }
5696
5697  *p_start_action = r;
5698  return removed;
5699}
5700
5701
5702static bfd_vma
5703offset_with_removed_text (text_action_list *action_list, bfd_vma offset)
5704{
5705  text_action *r = action_first (action_list);
5706
5707  return offset - removed_by_actions (action_list, &r, offset, false);
5708}
5709
5710
5711static unsigned
5712action_list_count (text_action_list *action_list)
5713{
5714  return action_list->count;
5715}
5716
5717typedef struct map_action_fn_context_struct map_action_fn_context;
5718struct map_action_fn_context_struct
5719{
5720  int removed;
5721  removal_by_action_map map;
5722  bool eq_complete;
5723};
5724
5725static int
5726map_action_fn (splay_tree_node node, void *p)
5727{
5728  map_action_fn_context *ctx = p;
5729  text_action *r = (text_action *)node->value;
5730  removal_by_action_entry *ientry = ctx->map.entry + ctx->map.n_entries;
5731
5732  if (ctx->map.n_entries && (ientry - 1)->offset == r->offset)
5733    {
5734      --ientry;
5735    }
5736  else
5737    {
5738      ++ctx->map.n_entries;
5739      ctx->eq_complete = false;
5740      ientry->offset = r->offset;
5741      ientry->eq_removed_before_fill = ctx->removed;
5742    }
5743
5744  if (!ctx->eq_complete)
5745    {
5746      if (r->action != ta_fill || r->removed_bytes >= 0)
5747	{
5748	  ientry->eq_removed = ctx->removed;
5749	  ctx->eq_complete = true;
5750	}
5751      else
5752	ientry->eq_removed = ctx->removed + r->removed_bytes;
5753    }
5754
5755  ctx->removed += r->removed_bytes;
5756  ientry->removed = ctx->removed;
5757  return 0;
5758}
5759
5760static void
5761map_removal_by_action (text_action_list *action_list)
5762{
5763  map_action_fn_context ctx;
5764
5765  ctx.removed = 0;
5766  ctx.map.n_entries = 0;
5767  ctx.map.entry = bfd_malloc (action_list_count (action_list) *
5768			      sizeof (removal_by_action_entry));
5769  ctx.eq_complete = false;
5770
5771  splay_tree_foreach (action_list->tree, map_action_fn, &ctx);
5772  action_list->map = ctx.map;
5773}
5774
5775static int
5776removed_by_actions_map (text_action_list *action_list, bfd_vma offset,
5777			bool before_fill)
5778{
5779  unsigned a, b;
5780
5781  if (!action_list->map.entry)
5782    map_removal_by_action (action_list);
5783
5784  if (!action_list->map.n_entries)
5785    return 0;
5786
5787  a = 0;
5788  b = action_list->map.n_entries;
5789
5790  while (b - a > 1)
5791    {
5792      unsigned c = (a + b) / 2;
5793
5794      if (action_list->map.entry[c].offset <= offset)
5795	a = c;
5796      else
5797	b = c;
5798    }
5799
5800  if (action_list->map.entry[a].offset < offset)
5801    {
5802      return action_list->map.entry[a].removed;
5803    }
5804  else if (action_list->map.entry[a].offset == offset)
5805    {
5806      return before_fill ?
5807	action_list->map.entry[a].eq_removed_before_fill :
5808	action_list->map.entry[a].eq_removed;
5809    }
5810  else
5811    {
5812      return 0;
5813    }
5814}
5815
5816static bfd_vma
5817offset_with_removed_text_map (text_action_list *action_list, bfd_vma offset)
5818{
5819  int removed = removed_by_actions_map (action_list, offset, false);
5820  return offset - removed;
5821}
5822
5823
5824/* The find_insn_action routine will only find non-fill actions.  */
5825
5826static text_action *
5827find_insn_action (text_action_list *action_list, bfd_vma offset)
5828{
5829  static const text_action_t action[] =
5830    {
5831      ta_convert_longcall,
5832      ta_remove_longcall,
5833      ta_widen_insn,
5834      ta_narrow_insn,
5835      ta_remove_insn,
5836    };
5837  text_action a;
5838  unsigned i;
5839
5840  a.offset = offset;
5841  for (i = 0; i < sizeof (action) / sizeof (*action); ++i)
5842    {
5843      splay_tree_node node;
5844
5845      a.action = action[i];
5846      node = splay_tree_lookup (action_list->tree, (splay_tree_key)&a);
5847      if (node)
5848	return (text_action *)node->value;
5849    }
5850  return NULL;
5851}
5852
5853
5854#if DEBUG
5855
5856static void
5857print_action (FILE *fp, text_action *r)
5858{
5859  const char *t = "unknown";
5860  switch (r->action)
5861    {
5862    case ta_remove_insn:
5863      t = "remove_insn"; break;
5864    case ta_remove_longcall:
5865      t = "remove_longcall"; break;
5866    case ta_convert_longcall:
5867      t = "convert_longcall"; break;
5868    case ta_narrow_insn:
5869      t = "narrow_insn"; break;
5870    case ta_widen_insn:
5871      t = "widen_insn"; break;
5872    case ta_fill:
5873      t = "fill"; break;
5874    case ta_none:
5875      t = "none"; break;
5876    case ta_remove_literal:
5877      t = "remove_literal"; break;
5878    case ta_add_literal:
5879      t = "add_literal"; break;
5880    }
5881
5882  fprintf (fp, "%s: %s[0x%lx] \"%s\" %d\n",
5883	   r->sec->owner->filename,
5884	   r->sec->name, (unsigned long) r->offset, t, r->removed_bytes);
5885}
5886
5887static int
5888print_action_list_fn (splay_tree_node node, void *p)
5889{
5890  text_action *r = (text_action *)node->value;
5891
5892  print_action (p, r);
5893  return 0;
5894}
5895
5896static void
5897print_action_list (FILE *fp, text_action_list *action_list)
5898{
5899  fprintf (fp, "Text Action\n");
5900  splay_tree_foreach (action_list->tree, print_action_list_fn, fp);
5901}
5902
5903#endif /* DEBUG */
5904
5905
5906/* Lists of literals being coalesced or removed.  */
5907
5908/* In the usual case, the literal identified by "from" is being
5909   coalesced with another literal identified by "to".  If the literal is
5910   unused and is being removed altogether, "to.abfd" will be NULL.
5911   The removed_literal entries are kept on a per-section list, sorted
5912   by the "from" offset field.  */
5913
5914typedef struct removed_literal_struct removed_literal;
5915typedef struct removed_literal_map_entry_struct removed_literal_map_entry;
5916typedef struct removed_literal_list_struct removed_literal_list;
5917
5918struct removed_literal_struct
5919{
5920  r_reloc from;
5921  r_reloc to;
5922  removed_literal *next;
5923};
5924
5925struct removed_literal_map_entry_struct
5926{
5927  bfd_vma addr;
5928  removed_literal *literal;
5929};
5930
5931struct removed_literal_list_struct
5932{
5933  removed_literal *head;
5934  removed_literal *tail;
5935
5936  unsigned n_map;
5937  removed_literal_map_entry *map;
5938};
5939
5940
5941/* Record that the literal at "from" is being removed.  If "to" is not
5942   NULL, the "from" literal is being coalesced with the "to" literal.  */
5943
5944static void
5945add_removed_literal (removed_literal_list *removed_list,
5946		     const r_reloc *from,
5947		     const r_reloc *to)
5948{
5949  removed_literal *r, *new_r, *next_r;
5950
5951  new_r = (removed_literal *) bfd_zmalloc (sizeof (removed_literal));
5952
5953  new_r->from = *from;
5954  if (to)
5955    new_r->to = *to;
5956  else
5957    new_r->to.abfd = NULL;
5958  new_r->next = NULL;
5959
5960  r = removed_list->head;
5961  if (r == NULL)
5962    {
5963      removed_list->head = new_r;
5964      removed_list->tail = new_r;
5965    }
5966  /* Special check for common case of append.  */
5967  else if (removed_list->tail->from.target_offset < from->target_offset)
5968    {
5969      removed_list->tail->next = new_r;
5970      removed_list->tail = new_r;
5971    }
5972  else
5973    {
5974      while (r->from.target_offset < from->target_offset && r->next)
5975	{
5976	  r = r->next;
5977	}
5978      next_r = r->next;
5979      r->next = new_r;
5980      new_r->next = next_r;
5981      if (next_r == NULL)
5982	removed_list->tail = new_r;
5983    }
5984}
5985
5986static void
5987map_removed_literal (removed_literal_list *removed_list)
5988{
5989  unsigned n_map = 0;
5990  unsigned i;
5991  removed_literal_map_entry *map = NULL;
5992  removed_literal *r = removed_list->head;
5993
5994  for (i = 0; r; ++i, r = r->next)
5995    {
5996      if (i == n_map)
5997	{
5998	  n_map = (n_map * 2) + 2;
5999	  map = bfd_realloc (map, n_map * sizeof (*map));
6000	}
6001      map[i].addr = r->from.target_offset;
6002      map[i].literal = r;
6003    }
6004  removed_list->map = map;
6005  removed_list->n_map = i;
6006}
6007
6008static int
6009removed_literal_compare (const void *a, const void *b)
6010{
6011  const bfd_vma *key = a;
6012  const removed_literal_map_entry *memb = b;
6013
6014  if (*key == memb->addr)
6015    return 0;
6016  else
6017    return *key < memb->addr ? -1 : 1;
6018}
6019
6020/* Check if the list of removed literals contains an entry for the
6021   given address.  Return the entry if found.  */
6022
6023static removed_literal *
6024find_removed_literal (removed_literal_list *removed_list, bfd_vma addr)
6025{
6026  removed_literal_map_entry *p;
6027  removed_literal *r = NULL;
6028
6029  if (removed_list->map == NULL)
6030    map_removed_literal (removed_list);
6031
6032  if (removed_list->map != NULL)
6033    {
6034      p = bsearch (&addr, removed_list->map, removed_list->n_map,
6035		   sizeof (*removed_list->map), removed_literal_compare);
6036      if (p)
6037	{
6038	  while (p != removed_list->map && (p - 1)->addr == addr)
6039	    --p;
6040	  r = p->literal;
6041	}
6042    }
6043  return r;
6044}
6045
6046
6047#if DEBUG
6048
6049static void
6050print_removed_literals (FILE *fp, removed_literal_list *removed_list)
6051{
6052  removed_literal *r;
6053  r = removed_list->head;
6054  if (r)
6055    fprintf (fp, "Removed Literals\n");
6056  for (; r != NULL; r = r->next)
6057    {
6058      print_r_reloc (fp, &r->from);
6059      fprintf (fp, " => ");
6060      if (r->to.abfd == NULL)
6061	fprintf (fp, "REMOVED");
6062      else
6063	print_r_reloc (fp, &r->to);
6064      fprintf (fp, "\n");
6065    }
6066}
6067
6068#endif /* DEBUG */
6069
6070
6071/* Per-section data for relaxation.  */
6072
6073typedef struct reloc_bfd_fix_struct reloc_bfd_fix;
6074
6075struct xtensa_relax_info_struct
6076{
6077  bool is_relaxable_literal_section;
6078  bool is_relaxable_asm_section;
6079  int visited;				/* Number of times visited.  */
6080
6081  source_reloc *src_relocs;		/* Array[src_count].  */
6082  int src_count;
6083  int src_next;				/* Next src_relocs entry to assign.  */
6084
6085  removed_literal_list removed_list;
6086  text_action_list action_list;
6087
6088  reloc_bfd_fix *fix_list;
6089  reloc_bfd_fix *fix_array;
6090  unsigned fix_array_count;
6091
6092  /* Support for expanding the reloc array that is stored
6093     in the section structure.  If the relocations have been
6094     reallocated, the newly allocated relocations will be referenced
6095     here along with the actual size allocated.  The relocation
6096     count will always be found in the section structure.  */
6097  Elf_Internal_Rela *allocated_relocs;
6098  unsigned relocs_count;
6099  unsigned allocated_relocs_count;
6100};
6101
6102struct elf_xtensa_section_data
6103{
6104  struct bfd_elf_section_data elf;
6105  xtensa_relax_info relax_info;
6106};
6107
6108
6109static bool
6110elf_xtensa_new_section_hook (bfd *abfd, asection *sec)
6111{
6112  if (!sec->used_by_bfd)
6113    {
6114      struct elf_xtensa_section_data *sdata;
6115      size_t amt = sizeof (*sdata);
6116
6117      sdata = bfd_zalloc (abfd, amt);
6118      if (sdata == NULL)
6119	return false;
6120      sec->used_by_bfd = sdata;
6121    }
6122
6123  return _bfd_elf_new_section_hook (abfd, sec);
6124}
6125
6126
6127static xtensa_relax_info *
6128get_xtensa_relax_info (asection *sec)
6129{
6130  struct elf_xtensa_section_data *section_data;
6131
6132  /* No info available if no section or if it is an output section.  */
6133  if (!sec || sec == sec->output_section)
6134    return NULL;
6135
6136  section_data = (struct elf_xtensa_section_data *) elf_section_data (sec);
6137  return &section_data->relax_info;
6138}
6139
6140
6141static void
6142init_xtensa_relax_info (asection *sec)
6143{
6144  xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6145
6146  relax_info->is_relaxable_literal_section = false;
6147  relax_info->is_relaxable_asm_section = false;
6148  relax_info->visited = 0;
6149
6150  relax_info->src_relocs = NULL;
6151  relax_info->src_count = 0;
6152  relax_info->src_next = 0;
6153
6154  relax_info->removed_list.head = NULL;
6155  relax_info->removed_list.tail = NULL;
6156
6157  relax_info->action_list.tree = splay_tree_new (text_action_compare,
6158						 NULL, NULL);
6159  relax_info->action_list.map.n_entries = 0;
6160  relax_info->action_list.map.entry = NULL;
6161
6162  relax_info->fix_list = NULL;
6163  relax_info->fix_array = NULL;
6164  relax_info->fix_array_count = 0;
6165
6166  relax_info->allocated_relocs = NULL;
6167  relax_info->relocs_count = 0;
6168  relax_info->allocated_relocs_count = 0;
6169}
6170
6171
6172/* Coalescing literals may require a relocation to refer to a section in
6173   a different input file, but the standard relocation information
6174   cannot express that.  Instead, the reloc_bfd_fix structures are used
6175   to "fix" the relocations that refer to sections in other input files.
6176   These structures are kept on per-section lists.  The "src_type" field
6177   records the relocation type in case there are multiple relocations on
6178   the same location.  FIXME: This is ugly; an alternative might be to
6179   add new symbols with the "owner" field to some other input file.  */
6180
6181struct reloc_bfd_fix_struct
6182{
6183  asection *src_sec;
6184  bfd_vma src_offset;
6185  unsigned src_type;			/* Relocation type.  */
6186
6187  asection *target_sec;
6188  bfd_vma target_offset;
6189  bool translated;
6190
6191  reloc_bfd_fix *next;
6192};
6193
6194
6195static reloc_bfd_fix *
6196reloc_bfd_fix_init (asection *src_sec,
6197		    bfd_vma src_offset,
6198		    unsigned src_type,
6199		    asection *target_sec,
6200		    bfd_vma target_offset,
6201		    bool translated)
6202{
6203  reloc_bfd_fix *fix;
6204
6205  fix = (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix));
6206  fix->src_sec = src_sec;
6207  fix->src_offset = src_offset;
6208  fix->src_type = src_type;
6209  fix->target_sec = target_sec;
6210  fix->target_offset = target_offset;
6211  fix->translated = translated;
6212
6213  return fix;
6214}
6215
6216
6217static void
6218add_fix (asection *src_sec, reloc_bfd_fix *fix)
6219{
6220  xtensa_relax_info *relax_info;
6221
6222  relax_info = get_xtensa_relax_info (src_sec);
6223  fix->next = relax_info->fix_list;
6224  relax_info->fix_list = fix;
6225}
6226
6227
6228static int
6229fix_compare (const void *ap, const void *bp)
6230{
6231  const reloc_bfd_fix *a = (const reloc_bfd_fix *) ap;
6232  const reloc_bfd_fix *b = (const reloc_bfd_fix *) bp;
6233
6234  if (a->src_offset != b->src_offset)
6235    return (a->src_offset - b->src_offset);
6236  return (a->src_type - b->src_type);
6237}
6238
6239
6240static void
6241cache_fix_array (asection *sec)
6242{
6243  unsigned i, count = 0;
6244  reloc_bfd_fix *r;
6245  xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6246
6247  if (relax_info == NULL)
6248    return;
6249  if (relax_info->fix_list == NULL)
6250    return;
6251
6252  for (r = relax_info->fix_list; r != NULL; r = r->next)
6253    count++;
6254
6255  relax_info->fix_array =
6256    (reloc_bfd_fix *) bfd_malloc (sizeof (reloc_bfd_fix) * count);
6257  relax_info->fix_array_count = count;
6258
6259  r = relax_info->fix_list;
6260  for (i = 0; i < count; i++, r = r->next)
6261    {
6262      relax_info->fix_array[count - 1 - i] = *r;
6263      relax_info->fix_array[count - 1 - i].next = NULL;
6264    }
6265
6266  qsort (relax_info->fix_array, relax_info->fix_array_count,
6267	 sizeof (reloc_bfd_fix), fix_compare);
6268}
6269
6270
6271static reloc_bfd_fix *
6272get_bfd_fix (asection *sec, bfd_vma offset, unsigned type)
6273{
6274  xtensa_relax_info *relax_info = get_xtensa_relax_info (sec);
6275  reloc_bfd_fix *rv;
6276  reloc_bfd_fix key;
6277
6278  if (relax_info == NULL)
6279    return NULL;
6280  if (relax_info->fix_list == NULL)
6281    return NULL;
6282
6283  if (relax_info->fix_array == NULL)
6284    cache_fix_array (sec);
6285
6286  key.src_offset = offset;
6287  key.src_type = type;
6288  rv = bsearch (&key, relax_info->fix_array,  relax_info->fix_array_count,
6289		sizeof (reloc_bfd_fix), fix_compare);
6290  return rv;
6291}
6292
6293
6294/* Section caching.  */
6295
6296typedef struct section_cache_struct section_cache_t;
6297
6298struct section_cache_struct
6299{
6300  asection *sec;
6301
6302  bfd_byte *contents;		/* Cache of the section contents.  */
6303  bfd_size_type content_length;
6304
6305  property_table_entry *ptbl;	/* Cache of the section property table.  */
6306  unsigned pte_count;
6307
6308  Elf_Internal_Rela *relocs;	/* Cache of the section relocations.  */
6309  unsigned reloc_count;
6310};
6311
6312
6313static void
6314init_section_cache (section_cache_t *sec_cache)
6315{
6316  memset (sec_cache, 0, sizeof (*sec_cache));
6317}
6318
6319
6320static void
6321free_section_cache (section_cache_t *sec_cache)
6322{
6323  if (sec_cache->sec)
6324    {
6325      release_contents (sec_cache->sec, sec_cache->contents);
6326      release_internal_relocs (sec_cache->sec, sec_cache->relocs);
6327      free (sec_cache->ptbl);
6328    }
6329}
6330
6331
6332static bool
6333section_cache_section (section_cache_t *sec_cache,
6334		       asection *sec,
6335		       struct bfd_link_info *link_info)
6336{
6337  bfd *abfd;
6338  property_table_entry *prop_table = NULL;
6339  int ptblsize = 0;
6340  bfd_byte *contents = NULL;
6341  Elf_Internal_Rela *internal_relocs = NULL;
6342  bfd_size_type sec_size;
6343
6344  if (sec == NULL)
6345    return false;
6346  if (sec == sec_cache->sec)
6347    return true;
6348
6349  abfd = sec->owner;
6350  sec_size = bfd_get_section_limit (abfd, sec);
6351
6352  /* Get the contents.  */
6353  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
6354  if (contents == NULL && sec_size != 0)
6355    goto err;
6356
6357  /* Get the relocations.  */
6358  internal_relocs = retrieve_internal_relocs (abfd, sec,
6359					      link_info->keep_memory);
6360
6361  /* Get the entry table.  */
6362  ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
6363					XTENSA_PROP_SEC_NAME, false);
6364  if (ptblsize < 0)
6365    goto err;
6366
6367  /* Fill in the new section cache.  */
6368  free_section_cache (sec_cache);
6369  init_section_cache (sec_cache);
6370
6371  sec_cache->sec = sec;
6372  sec_cache->contents = contents;
6373  sec_cache->content_length = sec_size;
6374  sec_cache->relocs = internal_relocs;
6375  sec_cache->reloc_count = sec->reloc_count;
6376  sec_cache->pte_count = ptblsize;
6377  sec_cache->ptbl = prop_table;
6378
6379  return true;
6380
6381 err:
6382  release_contents (sec, contents);
6383  release_internal_relocs (sec, internal_relocs);
6384  free (prop_table);
6385  return false;
6386}
6387
6388
6389/* Extended basic blocks.  */
6390
6391/* An ebb_struct represents an Extended Basic Block.  Within this
6392   range, we guarantee that all instructions are decodable, the
6393   property table entries are contiguous, and no property table
6394   specifies a segment that cannot have instructions moved.  This
6395   structure contains caches of the contents, property table and
6396   relocations for the specified section for easy use.  The range is
6397   specified by ranges of indices for the byte offset, property table
6398   offsets and relocation offsets.  These must be consistent.  */
6399
6400typedef struct ebb_struct ebb_t;
6401
6402struct ebb_struct
6403{
6404  asection *sec;
6405
6406  bfd_byte *contents;		/* Cache of the section contents.  */
6407  bfd_size_type content_length;
6408
6409  property_table_entry *ptbl;	/* Cache of the section property table.  */
6410  unsigned pte_count;
6411
6412  Elf_Internal_Rela *relocs;	/* Cache of the section relocations.  */
6413  unsigned reloc_count;
6414
6415  bfd_vma start_offset;		/* Offset in section.  */
6416  unsigned start_ptbl_idx;	/* Offset in the property table.  */
6417  unsigned start_reloc_idx;	/* Offset in the relocations.  */
6418
6419  bfd_vma end_offset;
6420  unsigned end_ptbl_idx;
6421  unsigned end_reloc_idx;
6422
6423  bool ends_section;	/* Is this the last ebb in a section?  */
6424
6425  /* The unreachable property table at the end of this set of blocks;
6426     NULL if the end is not an unreachable block.  */
6427  property_table_entry *ends_unreachable;
6428};
6429
6430
6431enum ebb_target_enum
6432{
6433  EBB_NO_ALIGN = 0,
6434  EBB_DESIRE_TGT_ALIGN,
6435  EBB_REQUIRE_TGT_ALIGN,
6436  EBB_REQUIRE_LOOP_ALIGN,
6437  EBB_REQUIRE_ALIGN
6438};
6439
6440
6441/* proposed_action_struct is similar to the text_action_struct except
6442   that is represents a potential transformation, not one that will
6443   occur.  We build a list of these for an extended basic block
6444   and use them to compute the actual actions desired.  We must be
6445   careful that the entire set of actual actions we perform do not
6446   break any relocations that would fit if the actions were not
6447   performed.  */
6448
6449typedef struct proposed_action_struct proposed_action;
6450
6451struct proposed_action_struct
6452{
6453  enum ebb_target_enum align_type; /* for the target alignment */
6454  bfd_vma alignment_pow;
6455  text_action_t action;
6456  bfd_vma offset;
6457  int removed_bytes;
6458  bool do_action; /* If false, then we will not perform the action.  */
6459};
6460
6461
6462/* The ebb_constraint_struct keeps a set of proposed actions for an
6463   extended basic block.   */
6464
6465typedef struct ebb_constraint_struct ebb_constraint;
6466
6467struct ebb_constraint_struct
6468{
6469  ebb_t ebb;
6470  bool start_movable;
6471
6472  /* Bytes of extra space at the beginning if movable.  */
6473  int start_extra_space;
6474
6475  enum ebb_target_enum start_align;
6476
6477  bool end_movable;
6478
6479  /* Bytes of extra space at the end if movable.  */
6480  int end_extra_space;
6481
6482  unsigned action_count;
6483  unsigned action_allocated;
6484
6485  /* Array of proposed actions.  */
6486  proposed_action *actions;
6487
6488  /* Action alignments -- one for each proposed action.  */
6489  enum ebb_target_enum *action_aligns;
6490};
6491
6492
6493static void
6494init_ebb_constraint (ebb_constraint *c)
6495{
6496  memset (c, 0, sizeof (ebb_constraint));
6497}
6498
6499
6500static void
6501free_ebb_constraint (ebb_constraint *c)
6502{
6503  free (c->actions);
6504}
6505
6506
6507static void
6508init_ebb (ebb_t *ebb,
6509	  asection *sec,
6510	  bfd_byte *contents,
6511	  bfd_size_type content_length,
6512	  property_table_entry *prop_table,
6513	  unsigned ptblsize,
6514	  Elf_Internal_Rela *internal_relocs,
6515	  unsigned reloc_count)
6516{
6517  memset (ebb, 0, sizeof (ebb_t));
6518  ebb->sec = sec;
6519  ebb->contents = contents;
6520  ebb->content_length = content_length;
6521  ebb->ptbl = prop_table;
6522  ebb->pte_count = ptblsize;
6523  ebb->relocs = internal_relocs;
6524  ebb->reloc_count = reloc_count;
6525  ebb->start_offset = 0;
6526  ebb->end_offset = ebb->content_length - 1;
6527  ebb->start_ptbl_idx = 0;
6528  ebb->end_ptbl_idx = ptblsize;
6529  ebb->start_reloc_idx = 0;
6530  ebb->end_reloc_idx = reloc_count;
6531}
6532
6533
6534/* Extend the ebb to all decodable contiguous sections.  The algorithm
6535   for building a basic block around an instruction is to push it
6536   forward until we hit the end of a section, an unreachable block or
6537   a block that cannot be transformed.  Then we push it backwards
6538   searching for similar conditions.  */
6539
6540static bool extend_ebb_bounds_forward (ebb_t *);
6541static bool extend_ebb_bounds_backward (ebb_t *);
6542static bfd_size_type insn_block_decodable_len
6543  (bfd_byte *, bfd_size_type, bfd_vma, bfd_size_type);
6544
6545static bool
6546extend_ebb_bounds (ebb_t *ebb)
6547{
6548  if (!extend_ebb_bounds_forward (ebb))
6549    return false;
6550  if (!extend_ebb_bounds_backward (ebb))
6551    return false;
6552  return true;
6553}
6554
6555
6556static bool
6557extend_ebb_bounds_forward (ebb_t *ebb)
6558{
6559  property_table_entry *the_entry, *new_entry;
6560
6561  the_entry = &ebb->ptbl[ebb->end_ptbl_idx];
6562
6563  /* Stop when (1) we cannot decode an instruction, (2) we are at
6564     the end of the property tables, (3) we hit a non-contiguous property
6565     table entry, (4) we hit a NO_TRANSFORM region.  */
6566
6567  while (1)
6568    {
6569      bfd_vma entry_end;
6570      bfd_size_type insn_block_len;
6571
6572      entry_end = the_entry->address - ebb->sec->vma + the_entry->size;
6573      insn_block_len =
6574	insn_block_decodable_len (ebb->contents, ebb->content_length,
6575				  ebb->end_offset,
6576				  entry_end - ebb->end_offset);
6577      if (insn_block_len != (entry_end - ebb->end_offset))
6578	{
6579	  _bfd_error_handler
6580	    /* xgettext:c-format */
6581	    (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
6582	       "possible configuration mismatch"),
6583	     ebb->sec->owner, ebb->sec,
6584	     (uint64_t) (ebb->end_offset + insn_block_len));
6585	  return false;
6586	}
6587      ebb->end_offset += insn_block_len;
6588
6589      if (ebb->end_offset == ebb->sec->size)
6590	ebb->ends_section = true;
6591
6592      /* Update the reloc counter.  */
6593      while (ebb->end_reloc_idx + 1 < ebb->reloc_count
6594	     && (ebb->relocs[ebb->end_reloc_idx + 1].r_offset
6595		 < ebb->end_offset))
6596	{
6597	  ebb->end_reloc_idx++;
6598	}
6599
6600      if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6601	return true;
6602
6603      new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6604      if (((new_entry->flags & XTENSA_PROP_INSN) == 0)
6605	  || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6606	  || ((the_entry->flags & XTENSA_PROP_ALIGN) != 0))
6607	break;
6608
6609      if (the_entry->address + the_entry->size != new_entry->address)
6610	break;
6611
6612      the_entry = new_entry;
6613      ebb->end_ptbl_idx++;
6614    }
6615
6616  /* Quick check for an unreachable or end of file just at the end.  */
6617  if (ebb->end_ptbl_idx + 1 == ebb->pte_count)
6618    {
6619      if (ebb->end_offset == ebb->content_length)
6620	ebb->ends_section = true;
6621    }
6622  else
6623    {
6624      new_entry = &ebb->ptbl[ebb->end_ptbl_idx + 1];
6625      if ((new_entry->flags & XTENSA_PROP_UNREACHABLE) != 0
6626	  && the_entry->address + the_entry->size == new_entry->address)
6627	ebb->ends_unreachable = new_entry;
6628    }
6629
6630  /* Any other ending requires exact alignment.  */
6631  return true;
6632}
6633
6634
6635static bool
6636extend_ebb_bounds_backward (ebb_t *ebb)
6637{
6638  property_table_entry *the_entry, *new_entry;
6639
6640  the_entry = &ebb->ptbl[ebb->start_ptbl_idx];
6641
6642  /* Stop when (1) we cannot decode the instructions in the current entry.
6643     (2) we are at the beginning of the property tables, (3) we hit a
6644     non-contiguous property table entry, (4) we hit a NO_TRANSFORM region.  */
6645
6646  while (1)
6647    {
6648      bfd_vma block_begin;
6649      bfd_size_type insn_block_len;
6650
6651      block_begin = the_entry->address - ebb->sec->vma;
6652      insn_block_len =
6653	insn_block_decodable_len (ebb->contents, ebb->content_length,
6654				  block_begin,
6655				  ebb->start_offset - block_begin);
6656      if (insn_block_len != ebb->start_offset - block_begin)
6657	{
6658	  _bfd_error_handler
6659	    /* xgettext:c-format */
6660	    (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
6661	       "possible configuration mismatch"),
6662	     ebb->sec->owner, ebb->sec,
6663	     (uint64_t) (ebb->end_offset + insn_block_len));
6664	  return false;
6665	}
6666      ebb->start_offset -= insn_block_len;
6667
6668      /* Update the reloc counter.  */
6669      while (ebb->start_reloc_idx > 0
6670	     && (ebb->relocs[ebb->start_reloc_idx - 1].r_offset
6671		 >= ebb->start_offset))
6672	{
6673	  ebb->start_reloc_idx--;
6674	}
6675
6676      if (ebb->start_ptbl_idx == 0)
6677	return true;
6678
6679      new_entry = &ebb->ptbl[ebb->start_ptbl_idx - 1];
6680      if ((new_entry->flags & XTENSA_PROP_INSN) == 0
6681	  || ((new_entry->flags & XTENSA_PROP_NO_TRANSFORM) != 0)
6682	  || ((new_entry->flags & XTENSA_PROP_ALIGN) != 0))
6683	return true;
6684      if (new_entry->address + new_entry->size != the_entry->address)
6685	return true;
6686
6687      the_entry = new_entry;
6688      ebb->start_ptbl_idx--;
6689    }
6690  return true;
6691}
6692
6693
6694static bfd_size_type
6695insn_block_decodable_len (bfd_byte *contents,
6696			  bfd_size_type content_len,
6697			  bfd_vma block_offset,
6698			  bfd_size_type block_len)
6699{
6700  bfd_vma offset = block_offset;
6701
6702  while (offset < block_offset + block_len)
6703    {
6704      bfd_size_type insn_len = 0;
6705
6706      insn_len = insn_decode_len (contents, content_len, offset);
6707      if (insn_len == 0)
6708	return (offset - block_offset);
6709      offset += insn_len;
6710    }
6711  return (offset - block_offset);
6712}
6713
6714
6715static void
6716ebb_propose_action (ebb_constraint *c,
6717		    enum ebb_target_enum align_type,
6718		    bfd_vma alignment_pow,
6719		    text_action_t action,
6720		    bfd_vma offset,
6721		    int removed_bytes,
6722		    bool do_action)
6723{
6724  proposed_action *act;
6725
6726  if (c->action_allocated <= c->action_count)
6727    {
6728      unsigned new_allocated, i;
6729      proposed_action *new_actions;
6730
6731      new_allocated = (c->action_count + 2) * 2;
6732      new_actions = (proposed_action *)
6733	bfd_zmalloc (sizeof (proposed_action) * new_allocated);
6734
6735      for (i = 0; i < c->action_count; i++)
6736	new_actions[i] = c->actions[i];
6737      free (c->actions);
6738      c->actions = new_actions;
6739      c->action_allocated = new_allocated;
6740    }
6741
6742  act = &c->actions[c->action_count];
6743  act->align_type = align_type;
6744  act->alignment_pow = alignment_pow;
6745  act->action = action;
6746  act->offset = offset;
6747  act->removed_bytes = removed_bytes;
6748  act->do_action = do_action;
6749
6750  c->action_count++;
6751}
6752
6753
6754/* Access to internal relocations, section contents and symbols.  */
6755
6756/* During relaxation, we need to modify relocations, section contents,
6757   and symbol definitions, and we need to keep the original values from
6758   being reloaded from the input files, i.e., we need to "pin" the
6759   modified values in memory.  We also want to continue to observe the
6760   setting of the "keep-memory" flag.  The following functions wrap the
6761   standard BFD functions to take care of this for us.  */
6762
6763static Elf_Internal_Rela *
6764retrieve_internal_relocs (bfd *abfd, asection *sec, bool keep_memory)
6765{
6766  Elf_Internal_Rela *internal_relocs;
6767
6768  if ((sec->flags & SEC_LINKER_CREATED) != 0)
6769    return NULL;
6770
6771  internal_relocs = elf_section_data (sec)->relocs;
6772  if (internal_relocs == NULL)
6773    internal_relocs = (_bfd_elf_link_read_relocs
6774		       (abfd, sec, NULL, NULL, keep_memory));
6775  return internal_relocs;
6776}
6777
6778
6779static void
6780pin_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6781{
6782  elf_section_data (sec)->relocs = internal_relocs;
6783}
6784
6785
6786static void
6787release_internal_relocs (asection *sec, Elf_Internal_Rela *internal_relocs)
6788{
6789  if (elf_section_data (sec)->relocs != internal_relocs)
6790    free (internal_relocs);
6791}
6792
6793
6794static bfd_byte *
6795retrieve_contents (bfd *abfd, asection *sec, bool keep_memory)
6796{
6797  bfd_byte *contents;
6798  bfd_size_type sec_size;
6799
6800  sec_size = bfd_get_section_limit (abfd, sec);
6801  contents = elf_section_data (sec)->this_hdr.contents;
6802
6803  if (contents == NULL && sec_size != 0)
6804    {
6805      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
6806	{
6807	  free (contents);
6808	  return NULL;
6809	}
6810      if (keep_memory)
6811	elf_section_data (sec)->this_hdr.contents = contents;
6812    }
6813  return contents;
6814}
6815
6816
6817static void
6818pin_contents (asection *sec, bfd_byte *contents)
6819{
6820  elf_section_data (sec)->this_hdr.contents = contents;
6821}
6822
6823
6824static void
6825release_contents (asection *sec, bfd_byte *contents)
6826{
6827  if (elf_section_data (sec)->this_hdr.contents != contents)
6828    free (contents);
6829}
6830
6831
6832static Elf_Internal_Sym *
6833retrieve_local_syms (bfd *input_bfd)
6834{
6835  Elf_Internal_Shdr *symtab_hdr;
6836  Elf_Internal_Sym *isymbuf;
6837  size_t locsymcount;
6838
6839  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
6840  locsymcount = symtab_hdr->sh_info;
6841
6842  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
6843  if (isymbuf == NULL && locsymcount != 0)
6844    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
6845				    NULL, NULL, NULL);
6846
6847  /* Save the symbols for this input file so they won't be read again.  */
6848  if (isymbuf && isymbuf != (Elf_Internal_Sym *) symtab_hdr->contents)
6849    symtab_hdr->contents = (unsigned char *) isymbuf;
6850
6851  return isymbuf;
6852}
6853
6854
6855/* Code for link-time relaxation.  */
6856
6857/* Initialization for relaxation: */
6858static bool analyze_relocations (struct bfd_link_info *);
6859static bool find_relaxable_sections
6860  (bfd *, asection *, struct bfd_link_info *, bool *);
6861static bool collect_source_relocs
6862  (bfd *, asection *, struct bfd_link_info *);
6863static bool is_resolvable_asm_expansion
6864  (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, struct bfd_link_info *,
6865   bool *);
6866static Elf_Internal_Rela *find_associated_l32r_irel
6867  (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Rela *);
6868static bool compute_text_actions
6869  (bfd *, asection *, struct bfd_link_info *);
6870static bool compute_ebb_proposed_actions (ebb_constraint *);
6871static bool compute_ebb_actions (ebb_constraint *);
6872typedef struct reloc_range_list_struct reloc_range_list;
6873static bool check_section_ebb_pcrels_fit
6874  (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *,
6875   reloc_range_list *, const ebb_constraint *,
6876   const xtensa_opcode *);
6877static bool check_section_ebb_reduces (const ebb_constraint *);
6878static void text_action_add_proposed
6879  (text_action_list *, const ebb_constraint *, asection *);
6880
6881/* First pass: */
6882static bool compute_removed_literals
6883  (bfd *, asection *, struct bfd_link_info *, value_map_hash_table *);
6884static Elf_Internal_Rela *get_irel_at_offset
6885  (asection *, Elf_Internal_Rela *, bfd_vma);
6886static bool is_removable_literal
6887  (const source_reloc *, int, const source_reloc *, int, asection *,
6888   property_table_entry *, int);
6889static bool remove_dead_literal
6890  (bfd *, asection *, struct bfd_link_info *, Elf_Internal_Rela *,
6891   Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
6892static bool identify_literal_placement
6893  (bfd *, asection *, bfd_byte *, struct bfd_link_info *,
6894   value_map_hash_table *, bool *, Elf_Internal_Rela *, int,
6895   source_reloc *, property_table_entry *, int, section_cache_t *,
6896   bool);
6897static bool relocations_reach (source_reloc *, int, const r_reloc *);
6898static bool coalesce_shared_literal
6899  (asection *, source_reloc *, property_table_entry *, int, value_map *);
6900static bool move_shared_literal
6901  (asection *, struct bfd_link_info *, source_reloc *, property_table_entry *,
6902   int, const r_reloc *, const literal_value *, section_cache_t *);
6903
6904/* Second pass: */
6905static bool relax_section (bfd *, asection *, struct bfd_link_info *);
6906static bool translate_section_fixes (asection *);
6907static bool translate_reloc_bfd_fix (reloc_bfd_fix *);
6908static asection *translate_reloc (const r_reloc *, r_reloc *, asection *);
6909static void shrink_dynamic_reloc_sections
6910  (struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *);
6911static bool move_literal
6912  (bfd *, struct bfd_link_info *, asection *, bfd_vma, bfd_byte *,
6913   xtensa_relax_info *, Elf_Internal_Rela **, const literal_value *);
6914static bool relax_property_section
6915  (bfd *, asection *, struct bfd_link_info *);
6916
6917/* Third pass: */
6918static bool relax_section_symbols (bfd *, asection *);
6919
6920
6921static bool
6922elf_xtensa_relax_section (bfd *abfd,
6923			  asection *sec,
6924			  struct bfd_link_info *link_info,
6925			  bool *again)
6926{
6927  static value_map_hash_table *values = NULL;
6928  static bool relocations_analyzed = false;
6929  xtensa_relax_info *relax_info;
6930
6931  if (!relocations_analyzed)
6932    {
6933      /* Do some overall initialization for relaxation.  */
6934      values = value_map_hash_table_init ();
6935      if (values == NULL)
6936	return false;
6937      relaxing_section = true;
6938      if (!analyze_relocations (link_info))
6939	return false;
6940      relocations_analyzed = true;
6941    }
6942  *again = false;
6943
6944  /* Don't mess with linker-created sections.  */
6945  if ((sec->flags & SEC_LINKER_CREATED) != 0)
6946    return true;
6947
6948  relax_info = get_xtensa_relax_info (sec);
6949  BFD_ASSERT (relax_info != NULL);
6950
6951  switch (relax_info->visited)
6952    {
6953    case 0:
6954      /* Note: It would be nice to fold this pass into
6955	 analyze_relocations, but it is important for this step that the
6956	 sections be examined in link order.  */
6957      if (!compute_removed_literals (abfd, sec, link_info, values))
6958	return false;
6959      *again = true;
6960      break;
6961
6962    case 1:
6963      if (values)
6964	value_map_hash_table_delete (values);
6965      values = NULL;
6966      if (!relax_section (abfd, sec, link_info))
6967	return false;
6968      *again = true;
6969      break;
6970
6971    case 2:
6972      if (!relax_section_symbols (abfd, sec))
6973	return false;
6974      break;
6975    }
6976
6977  relax_info->visited++;
6978  return true;
6979}
6980
6981
6982/* Initialization for relaxation.  */
6983
6984/* This function is called once at the start of relaxation.  It scans
6985   all the input sections and marks the ones that are relaxable (i.e.,
6986   literal sections with L32R relocations against them), and then
6987   collects source_reloc information for all the relocations against
6988   those relaxable sections.  During this process, it also detects
6989   longcalls, i.e., calls relaxed by the assembler into indirect
6990   calls, that can be optimized back into direct calls.  Within each
6991   extended basic block (ebb) containing an optimized longcall, it
6992   computes a set of "text actions" that can be performed to remove
6993   the L32R associated with the longcall while optionally preserving
6994   branch target alignments.  */
6995
6996static bool
6997analyze_relocations (struct bfd_link_info *link_info)
6998{
6999  bfd *abfd;
7000  asection *sec;
7001  bool is_relaxable = false;
7002
7003  /* Initialize the per-section relaxation info.  */
7004  for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
7005    for (sec = abfd->sections; sec != NULL; sec = sec->next)
7006      {
7007	init_xtensa_relax_info (sec);
7008      }
7009
7010  /* Mark relaxable sections (and count relocations against each one).  */
7011  for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
7012    for (sec = abfd->sections; sec != NULL; sec = sec->next)
7013      {
7014	if (!find_relaxable_sections (abfd, sec, link_info, &is_relaxable))
7015	  return false;
7016      }
7017
7018  /* Bail out if there are no relaxable sections.  */
7019  if (!is_relaxable)
7020    return true;
7021
7022  /* Allocate space for source_relocs.  */
7023  for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
7024    for (sec = abfd->sections; sec != NULL; sec = sec->next)
7025      {
7026	xtensa_relax_info *relax_info;
7027
7028	relax_info = get_xtensa_relax_info (sec);
7029	if (relax_info->is_relaxable_literal_section
7030	    || relax_info->is_relaxable_asm_section)
7031	  {
7032	    relax_info->src_relocs = (source_reloc *)
7033	      bfd_malloc (relax_info->src_count * sizeof (source_reloc));
7034	  }
7035	else
7036	  relax_info->src_count = 0;
7037      }
7038
7039  /* Collect info on relocations against each relaxable section.  */
7040  for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
7041    for (sec = abfd->sections; sec != NULL; sec = sec->next)
7042      {
7043	if (!collect_source_relocs (abfd, sec, link_info))
7044	  return false;
7045      }
7046
7047  /* Compute the text actions.  */
7048  for (abfd = link_info->input_bfds; abfd != NULL; abfd = abfd->link.next)
7049    for (sec = abfd->sections; sec != NULL; sec = sec->next)
7050      {
7051	if (!compute_text_actions (abfd, sec, link_info))
7052	  return false;
7053      }
7054
7055  return true;
7056}
7057
7058
7059/* Find all the sections that might be relaxed.  The motivation for
7060   this pass is that collect_source_relocs() needs to record _all_ the
7061   relocations that target each relaxable section.  That is expensive
7062   and unnecessary unless the target section is actually going to be
7063   relaxed.  This pass identifies all such sections by checking if
7064   they have L32Rs pointing to them.  In the process, the total number
7065   of relocations targeting each section is also counted so that we
7066   know how much space to allocate for source_relocs against each
7067   relaxable literal section.  */
7068
7069static bool
7070find_relaxable_sections (bfd *abfd,
7071			 asection *sec,
7072			 struct bfd_link_info *link_info,
7073			 bool *is_relaxable_p)
7074{
7075  Elf_Internal_Rela *internal_relocs;
7076  bfd_byte *contents;
7077  bool ok = true;
7078  unsigned i;
7079  xtensa_relax_info *source_relax_info;
7080  bool is_l32r_reloc;
7081
7082  internal_relocs = retrieve_internal_relocs (abfd, sec,
7083					      link_info->keep_memory);
7084  if (internal_relocs == NULL)
7085    return ok;
7086
7087  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7088  if (contents == NULL && sec->size != 0)
7089    {
7090      ok = false;
7091      goto error_return;
7092    }
7093
7094  source_relax_info = get_xtensa_relax_info (sec);
7095  for (i = 0; i < sec->reloc_count; i++)
7096    {
7097      Elf_Internal_Rela *irel = &internal_relocs[i];
7098      r_reloc r_rel;
7099      asection *target_sec;
7100      xtensa_relax_info *target_relax_info;
7101
7102      /* If this section has not already been marked as "relaxable", and
7103	 if it contains any ASM_EXPAND relocations (marking expanded
7104	 longcalls) that can be optimized into direct calls, then mark
7105	 the section as "relaxable".  */
7106      if (source_relax_info
7107	  && !source_relax_info->is_relaxable_asm_section
7108	  && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_EXPAND)
7109	{
7110	  bool is_reachable = false;
7111	  if (is_resolvable_asm_expansion (abfd, sec, contents, irel,
7112					   link_info, &is_reachable)
7113	      && is_reachable)
7114	    {
7115	      source_relax_info->is_relaxable_asm_section = true;
7116	      *is_relaxable_p = true;
7117	    }
7118	}
7119
7120      r_reloc_init (&r_rel, abfd, irel, contents,
7121		    bfd_get_section_limit (abfd, sec));
7122
7123      target_sec = r_reloc_get_section (&r_rel);
7124      target_relax_info = get_xtensa_relax_info (target_sec);
7125      if (!target_relax_info)
7126	continue;
7127
7128      /* Count PC-relative operand relocations against the target section.
7129	 Note: The conditions tested here must match the conditions under
7130	 which init_source_reloc is called in collect_source_relocs().  */
7131      is_l32r_reloc = false;
7132      if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
7133	{
7134	  xtensa_opcode opcode =
7135	    get_relocation_opcode (abfd, sec, contents, irel);
7136	  if (opcode != XTENSA_UNDEFINED)
7137	    {
7138	      is_l32r_reloc = (opcode == get_l32r_opcode ());
7139	      if (!is_alt_relocation (ELF32_R_TYPE (irel->r_info))
7140		  || is_l32r_reloc)
7141		target_relax_info->src_count++;
7142	    }
7143	}
7144
7145      if (is_l32r_reloc && r_reloc_is_defined (&r_rel))
7146	{
7147	  /* Mark the target section as relaxable.  */
7148	  target_relax_info->is_relaxable_literal_section = true;
7149	  *is_relaxable_p = true;
7150	}
7151    }
7152
7153 error_return:
7154  release_contents (sec, contents);
7155  release_internal_relocs (sec, internal_relocs);
7156  return ok;
7157}
7158
7159
7160/* Record _all_ the relocations that point to relaxable sections, and
7161   get rid of ASM_EXPAND relocs by either converting them to
7162   ASM_SIMPLIFY or by removing them.  */
7163
7164static bool
7165collect_source_relocs (bfd *abfd,
7166		       asection *sec,
7167		       struct bfd_link_info *link_info)
7168{
7169  Elf_Internal_Rela *internal_relocs;
7170  bfd_byte *contents;
7171  bool ok = true;
7172  unsigned i;
7173  bfd_size_type sec_size;
7174
7175  internal_relocs = retrieve_internal_relocs (abfd, sec,
7176					      link_info->keep_memory);
7177  if (internal_relocs == NULL)
7178    return ok;
7179
7180  sec_size = bfd_get_section_limit (abfd, sec);
7181  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7182  if (contents == NULL && sec_size != 0)
7183    {
7184      ok = false;
7185      goto error_return;
7186    }
7187
7188  /* Record relocations against relaxable literal sections.  */
7189  for (i = 0; i < sec->reloc_count; i++)
7190    {
7191      Elf_Internal_Rela *irel = &internal_relocs[i];
7192      r_reloc r_rel;
7193      asection *target_sec;
7194      xtensa_relax_info *target_relax_info;
7195
7196      r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7197
7198      target_sec = r_reloc_get_section (&r_rel);
7199      target_relax_info = get_xtensa_relax_info (target_sec);
7200
7201      if (target_relax_info
7202	  && (target_relax_info->is_relaxable_literal_section
7203	      || target_relax_info->is_relaxable_asm_section))
7204	{
7205	  xtensa_opcode opcode = XTENSA_UNDEFINED;
7206	  int opnd = -1;
7207	  bool is_abs_literal = false;
7208
7209	  if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7210	    {
7211	      /* None of the current alternate relocs are PC-relative,
7212		 and only PC-relative relocs matter here.  However, we
7213		 still need to record the opcode for literal
7214		 coalescing.  */
7215	      opcode = get_relocation_opcode (abfd, sec, contents, irel);
7216	      if (opcode == get_l32r_opcode ())
7217		{
7218		  is_abs_literal = true;
7219		  opnd = 1;
7220		}
7221	      else
7222		opcode = XTENSA_UNDEFINED;
7223	    }
7224	  else if (is_operand_relocation (ELF32_R_TYPE (irel->r_info)))
7225	    {
7226	      opcode = get_relocation_opcode (abfd, sec, contents, irel);
7227	      opnd = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7228	    }
7229
7230	  if (opcode != XTENSA_UNDEFINED)
7231	    {
7232	      int src_next = target_relax_info->src_next++;
7233	      source_reloc *s_reloc = &target_relax_info->src_relocs[src_next];
7234
7235	      init_source_reloc (s_reloc, sec, &r_rel, opcode, opnd,
7236				 is_abs_literal);
7237	    }
7238	}
7239    }
7240
7241  /* Now get rid of ASM_EXPAND relocations.  At this point, the
7242     src_relocs array for the target literal section may still be
7243     incomplete, but it must at least contain the entries for the L32R
7244     relocations associated with ASM_EXPANDs because they were just
7245     added in the preceding loop over the relocations.  */
7246
7247  for (i = 0; i < sec->reloc_count; i++)
7248    {
7249      Elf_Internal_Rela *irel = &internal_relocs[i];
7250      bool is_reachable;
7251
7252      if (!is_resolvable_asm_expansion (abfd, sec, contents, irel, link_info,
7253					&is_reachable))
7254	continue;
7255
7256      if (is_reachable)
7257	{
7258	  Elf_Internal_Rela *l32r_irel;
7259	  r_reloc r_rel;
7260	  asection *target_sec;
7261	  xtensa_relax_info *target_relax_info;
7262
7263	  /* Mark the source_reloc for the L32R so that it will be
7264	     removed in compute_removed_literals(), along with the
7265	     associated literal.  */
7266	  l32r_irel = find_associated_l32r_irel (abfd, sec, contents,
7267						 irel, internal_relocs);
7268	  if (l32r_irel == NULL)
7269	    continue;
7270
7271	  r_reloc_init (&r_rel, abfd, l32r_irel, contents, sec_size);
7272
7273	  target_sec = r_reloc_get_section (&r_rel);
7274	  target_relax_info = get_xtensa_relax_info (target_sec);
7275
7276	  if (target_relax_info
7277	      && (target_relax_info->is_relaxable_literal_section
7278		  || target_relax_info->is_relaxable_asm_section))
7279	    {
7280	      source_reloc *s_reloc;
7281
7282	      /* Search the source_relocs for the entry corresponding to
7283		 the l32r_irel.  Note: The src_relocs array is not yet
7284		 sorted, but it wouldn't matter anyway because we're
7285		 searching by source offset instead of target offset.  */
7286	      s_reloc = find_source_reloc (target_relax_info->src_relocs,
7287					   target_relax_info->src_next,
7288					   sec, l32r_irel);
7289	      BFD_ASSERT (s_reloc);
7290	      s_reloc->is_null = true;
7291	    }
7292
7293	  /* Convert this reloc to ASM_SIMPLIFY.  */
7294	  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
7295				       R_XTENSA_ASM_SIMPLIFY);
7296	  l32r_irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7297
7298	  pin_internal_relocs (sec, internal_relocs);
7299	}
7300      else
7301	{
7302	  /* It is resolvable but doesn't reach.  We resolve now
7303	     by eliminating the relocation -- the call will remain
7304	     expanded into L32R/CALLX.  */
7305	  irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
7306	  pin_internal_relocs (sec, internal_relocs);
7307	}
7308    }
7309
7310 error_return:
7311  release_contents (sec, contents);
7312  release_internal_relocs (sec, internal_relocs);
7313  return ok;
7314}
7315
7316
7317/* Return TRUE if the asm expansion can be resolved.  Generally it can
7318   be resolved on a final link or when a partial link locates it in the
7319   same section as the target.  Set "is_reachable" flag if the target of
7320   the call is within the range of a direct call, given the current VMA
7321   for this section and the target section.  */
7322
7323bool
7324is_resolvable_asm_expansion (bfd *abfd,
7325			     asection *sec,
7326			     bfd_byte *contents,
7327			     Elf_Internal_Rela *irel,
7328			     struct bfd_link_info *link_info,
7329			     bool *is_reachable_p)
7330{
7331  asection *target_sec;
7332  asection *s;
7333  bfd_vma first_vma;
7334  bfd_vma last_vma;
7335  unsigned int first_align;
7336  unsigned int adjust;
7337  bfd_vma target_offset;
7338  r_reloc r_rel;
7339  xtensa_opcode opcode, direct_call_opcode;
7340  bfd_vma self_address;
7341  bfd_vma dest_address;
7342  bool uses_l32r;
7343  bfd_size_type sec_size;
7344
7345  *is_reachable_p = false;
7346
7347  if (contents == NULL)
7348    return false;
7349
7350  if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
7351    return false;
7352
7353  sec_size = bfd_get_section_limit (abfd, sec);
7354  opcode = get_expanded_call_opcode (contents + irel->r_offset,
7355				     sec_size - irel->r_offset, &uses_l32r);
7356  /* Optimization of longcalls that use CONST16 is not yet implemented.  */
7357  if (!uses_l32r)
7358    return false;
7359
7360  direct_call_opcode = swap_callx_for_call_opcode (opcode);
7361  if (direct_call_opcode == XTENSA_UNDEFINED)
7362    return false;
7363
7364  /* Check and see that the target resolves.  */
7365  r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
7366  if (!r_reloc_is_defined (&r_rel))
7367    return false;
7368
7369  target_sec = r_reloc_get_section (&r_rel);
7370  target_offset = r_rel.target_offset;
7371
7372  /* If the target is in a shared library, then it doesn't reach.  This
7373     isn't supposed to come up because the compiler should never generate
7374     non-PIC calls on systems that use shared libraries, but the linker
7375     shouldn't crash regardless.  */
7376  if (!target_sec->output_section)
7377    return false;
7378
7379  /* For relocatable sections, we can only simplify when the output
7380     section of the target is the same as the output section of the
7381     source.  */
7382  if (bfd_link_relocatable (link_info)
7383      && (target_sec->output_section != sec->output_section
7384	  || is_reloc_sym_weak (abfd, irel)))
7385    return false;
7386
7387  if (target_sec->output_section != sec->output_section)
7388    {
7389      /* If the two sections are sufficiently far away that relaxation
7390	 might take the call out of range, we can't simplify.  For
7391	 example, a positive displacement call into another memory
7392	 could get moved to a lower address due to literal removal,
7393	 but the destination won't move, and so the displacment might
7394	 get larger.
7395
7396	 If the displacement is negative, assume the destination could
7397	 move as far back as the start of the output section.  The
7398	 self_address will be at least as far into the output section
7399	 as it is prior to relaxation.
7400
7401	 If the displacement is postive, assume the destination will be in
7402	 it's pre-relaxed location (because relaxation only makes sections
7403	 smaller).  The self_address could go all the way to the beginning
7404	 of the output section.  */
7405
7406      dest_address = target_sec->output_section->vma;
7407      self_address = sec->output_section->vma;
7408
7409      if (sec->output_section->vma > target_sec->output_section->vma)
7410	self_address += sec->output_offset + irel->r_offset + 3;
7411      else
7412	dest_address += bfd_get_section_limit (abfd, target_sec->output_section);
7413      /* Call targets should be four-byte aligned.  */
7414      dest_address = (dest_address + 3) & ~3;
7415    }
7416  else
7417    {
7418
7419      self_address = (sec->output_section->vma
7420		      + sec->output_offset + irel->r_offset + 3);
7421      dest_address = (target_sec->output_section->vma
7422		      + target_sec->output_offset + target_offset);
7423    }
7424
7425  /* Adjust addresses with alignments for the worst case to see if call insn
7426     can fit.  Don't relax l32r + callx to call if the target can be out of
7427     range due to alignment.
7428     Caller and target addresses are highest and lowest address.
7429     Search all sections between caller and target, looking for max alignment.
7430     The adjustment is max alignment bytes.  If the alignment at the lowest
7431     address is less than the adjustment, apply the adjustment to highest
7432     address.  */
7433
7434  /* Start from lowest address.
7435     Lowest address aligmnet is from input section.
7436     Initial alignment (adjust) is from input section.  */
7437  if (dest_address > self_address)
7438    {
7439      s = sec->output_section;
7440      last_vma = dest_address;
7441      first_align = sec->alignment_power;
7442      adjust = target_sec->alignment_power;
7443    }
7444  else
7445    {
7446      s = target_sec->output_section;
7447      last_vma = self_address;
7448      first_align = target_sec->alignment_power;
7449      adjust = sec->alignment_power;
7450    }
7451
7452  first_vma = s->vma;
7453
7454  /* Find the largest alignment in output section list.  */
7455  for (; s && s->vma >= first_vma && s->vma <= last_vma ; s = s->next)
7456    {
7457      if (s->alignment_power > adjust)
7458	adjust = s->alignment_power;
7459    }
7460
7461  if (adjust > first_align)
7462    {
7463      /* Alignment may enlarge the range, adjust highest address.  */
7464      adjust = 1 << adjust;
7465      if (dest_address > self_address)
7466	{
7467	  dest_address += adjust;
7468	}
7469      else
7470	{
7471	  self_address += adjust;
7472	}
7473    }
7474
7475  *is_reachable_p = pcrel_reloc_fits (direct_call_opcode, 0,
7476				      self_address, dest_address);
7477
7478  if ((self_address >> CALL_SEGMENT_BITS) !=
7479      (dest_address >> CALL_SEGMENT_BITS))
7480    return false;
7481
7482  return true;
7483}
7484
7485
7486static Elf_Internal_Rela *
7487find_associated_l32r_irel (bfd *abfd,
7488			   asection *sec,
7489			   bfd_byte *contents,
7490			   Elf_Internal_Rela *other_irel,
7491			   Elf_Internal_Rela *internal_relocs)
7492{
7493  unsigned i;
7494
7495  for (i = 0; i < sec->reloc_count; i++)
7496    {
7497      Elf_Internal_Rela *irel = &internal_relocs[i];
7498
7499      if (irel == other_irel)
7500	continue;
7501      if (irel->r_offset != other_irel->r_offset)
7502	continue;
7503      if (is_l32r_relocation (abfd, sec, contents, irel))
7504	return irel;
7505    }
7506
7507  return NULL;
7508}
7509
7510
7511static xtensa_opcode *
7512build_reloc_opcodes (bfd *abfd,
7513		     asection *sec,
7514		     bfd_byte *contents,
7515		     Elf_Internal_Rela *internal_relocs)
7516{
7517  unsigned i;
7518  xtensa_opcode *reloc_opcodes =
7519    (xtensa_opcode *) bfd_malloc (sizeof (xtensa_opcode) * sec->reloc_count);
7520  for (i = 0; i < sec->reloc_count; i++)
7521    {
7522      Elf_Internal_Rela *irel = &internal_relocs[i];
7523      reloc_opcodes[i] = get_relocation_opcode (abfd, sec, contents, irel);
7524    }
7525  return reloc_opcodes;
7526}
7527
7528struct reloc_range_struct
7529{
7530  bfd_vma addr;
7531  bool add; /* TRUE if start of a range, FALSE otherwise.  */
7532  /* Original irel index in the array of relocations for a section.  */
7533  unsigned irel_index;
7534};
7535typedef struct reloc_range_struct reloc_range;
7536
7537typedef struct reloc_range_list_entry_struct reloc_range_list_entry;
7538struct reloc_range_list_entry_struct
7539{
7540  reloc_range_list_entry *next;
7541  reloc_range_list_entry *prev;
7542  Elf_Internal_Rela *irel;
7543  xtensa_opcode opcode;
7544  int opnum;
7545};
7546
7547struct reloc_range_list_struct
7548{
7549  /* The rest of the structure is only meaningful when ok is TRUE.  */
7550  bool ok;
7551
7552  unsigned n_range; /* Number of range markers.  */
7553  reloc_range *range; /* Sorted range markers.  */
7554
7555  unsigned first; /* Index of a first range element in the list.  */
7556  unsigned last; /* One past index of a last range element in the list.  */
7557
7558  unsigned n_list; /* Number of list elements.  */
7559  reloc_range_list_entry *reloc; /*  */
7560  reloc_range_list_entry list_root;
7561};
7562
7563static int
7564reloc_range_compare (const void *a, const void *b)
7565{
7566  const reloc_range *ra = a;
7567  const reloc_range *rb = b;
7568
7569  if (ra->addr != rb->addr)
7570    return ra->addr < rb->addr ? -1 : 1;
7571  if (ra->add != rb->add)
7572    return ra->add ? -1 : 1;
7573  return 0;
7574}
7575
7576static void
7577build_reloc_ranges (bfd *abfd, asection *sec,
7578		    bfd_byte *contents,
7579		    Elf_Internal_Rela *internal_relocs,
7580		    xtensa_opcode *reloc_opcodes,
7581		    reloc_range_list *list)
7582{
7583  unsigned i;
7584  size_t n = 0;
7585  size_t max_n = 0;
7586  reloc_range *ranges = NULL;
7587  reloc_range_list_entry *reloc =
7588    bfd_malloc (sec->reloc_count * sizeof (*reloc));
7589
7590  memset (list, 0, sizeof (*list));
7591  list->ok = true;
7592
7593  for (i = 0; i < sec->reloc_count; i++)
7594    {
7595      Elf_Internal_Rela *irel = &internal_relocs[i];
7596      int r_type = ELF32_R_TYPE (irel->r_info);
7597      reloc_howto_type *howto = &elf_howto_table[r_type];
7598      r_reloc r_rel;
7599
7600      if (r_type == R_XTENSA_ASM_SIMPLIFY
7601	  || r_type == R_XTENSA_32_PCREL
7602	  || !howto->pc_relative)
7603	continue;
7604
7605      r_reloc_init (&r_rel, abfd, irel, contents,
7606		    bfd_get_section_limit (abfd, sec));
7607
7608      if (r_reloc_get_section (&r_rel) != sec)
7609	continue;
7610
7611      if (n + 2 > max_n)
7612	{
7613	  max_n = (max_n + 2) * 2;
7614	  ranges = bfd_realloc (ranges, max_n * sizeof (*ranges));
7615	}
7616
7617      ranges[n].addr = irel->r_offset;
7618      ranges[n + 1].addr = r_rel.target_offset;
7619
7620      ranges[n].add = ranges[n].addr < ranges[n + 1].addr;
7621      ranges[n + 1].add = !ranges[n].add;
7622
7623      ranges[n].irel_index = i;
7624      ranges[n + 1].irel_index = i;
7625
7626      n += 2;
7627
7628      reloc[i].irel = irel;
7629
7630      /* Every relocation won't possibly be checked in the optimized version of
7631	 check_section_ebb_pcrels_fit, so this needs to be done here.  */
7632      if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
7633	{
7634	  /* None of the current alternate relocs are PC-relative,
7635	     and only PC-relative relocs matter here.  */
7636	}
7637      else
7638	{
7639	  xtensa_opcode opcode;
7640	  int opnum;
7641
7642	  if (reloc_opcodes)
7643	    opcode = reloc_opcodes[i];
7644	  else
7645	    opcode = get_relocation_opcode (abfd, sec, contents, irel);
7646
7647	  if (opcode == XTENSA_UNDEFINED)
7648	    {
7649	      list->ok = false;
7650	      break;
7651	    }
7652
7653	  opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
7654	  if (opnum == XTENSA_UNDEFINED)
7655	    {
7656	      list->ok = false;
7657	      break;
7658	    }
7659
7660	  /* Record relocation opcode and opnum as we've calculated them
7661	     anyway and they won't change.  */
7662	  reloc[i].opcode = opcode;
7663	  reloc[i].opnum = opnum;
7664	}
7665    }
7666
7667  if (list->ok)
7668    {
7669      ranges = bfd_realloc (ranges, n * sizeof (*ranges));
7670      qsort (ranges, n, sizeof (*ranges), reloc_range_compare);
7671
7672      list->n_range = n;
7673      list->range = ranges;
7674      list->reloc = reloc;
7675      list->list_root.prev = &list->list_root;
7676      list->list_root.next = &list->list_root;
7677    }
7678  else
7679    {
7680      free (ranges);
7681      free (reloc);
7682    }
7683}
7684
7685static void reloc_range_list_append (reloc_range_list *list,
7686				     unsigned irel_index)
7687{
7688  reloc_range_list_entry *entry = list->reloc + irel_index;
7689
7690  entry->prev = list->list_root.prev;
7691  entry->next = &list->list_root;
7692  entry->prev->next = entry;
7693  entry->next->prev = entry;
7694  ++list->n_list;
7695}
7696
7697static void reloc_range_list_remove (reloc_range_list *list,
7698				     unsigned irel_index)
7699{
7700  reloc_range_list_entry *entry = list->reloc + irel_index;
7701
7702  entry->next->prev = entry->prev;
7703  entry->prev->next = entry->next;
7704  --list->n_list;
7705}
7706
7707/* Update relocation list object so that it lists all relocations that cross
7708   [first; last] range.  Range bounds should not decrease with successive
7709   invocations.  */
7710static void reloc_range_list_update_range (reloc_range_list *list,
7711					   bfd_vma first, bfd_vma last)
7712{
7713  /* This should not happen: EBBs are iterated from lower addresses to higher.
7714     But even if that happens there's no need to break: just flush current list
7715     and start from scratch.  */
7716  if ((list->last > 0 && list->range[list->last - 1].addr > last) ||
7717      (list->first > 0 && list->range[list->first - 1].addr >= first))
7718    {
7719      list->first = 0;
7720      list->last = 0;
7721      list->n_list = 0;
7722      list->list_root.next = &list->list_root;
7723      list->list_root.prev = &list->list_root;
7724      fprintf (stderr, "%s: move backwards requested\n", __func__);
7725    }
7726
7727  for (; list->last < list->n_range &&
7728       list->range[list->last].addr <= last; ++list->last)
7729    if (list->range[list->last].add)
7730      reloc_range_list_append (list, list->range[list->last].irel_index);
7731
7732  for (; list->first < list->n_range &&
7733       list->range[list->first].addr < first; ++list->first)
7734    if (!list->range[list->first].add)
7735      reloc_range_list_remove (list, list->range[list->first].irel_index);
7736}
7737
7738static void free_reloc_range_list (reloc_range_list *list)
7739{
7740  free (list->range);
7741  free (list->reloc);
7742}
7743
7744/* The compute_text_actions function will build a list of potential
7745   transformation actions for code in the extended basic block of each
7746   longcall that is optimized to a direct call.  From this list we
7747   generate a set of actions to actually perform that optimizes for
7748   space and, if not using size_opt, maintains branch target
7749   alignments.
7750
7751   These actions to be performed are placed on a per-section list.
7752   The actual changes are performed by relax_section() in the second
7753   pass.  */
7754
7755bool
7756compute_text_actions (bfd *abfd,
7757		      asection *sec,
7758		      struct bfd_link_info *link_info)
7759{
7760  xtensa_opcode *reloc_opcodes = NULL;
7761  xtensa_relax_info *relax_info;
7762  bfd_byte *contents;
7763  Elf_Internal_Rela *internal_relocs;
7764  bool ok = true;
7765  unsigned i;
7766  property_table_entry *prop_table = 0;
7767  int ptblsize = 0;
7768  bfd_size_type sec_size;
7769  reloc_range_list relevant_relocs;
7770
7771  relax_info = get_xtensa_relax_info (sec);
7772  BFD_ASSERT (relax_info);
7773  BFD_ASSERT (relax_info->src_next == relax_info->src_count);
7774
7775  /* Do nothing if the section contains no optimized longcalls.  */
7776  if (!relax_info->is_relaxable_asm_section)
7777    return ok;
7778
7779  internal_relocs = retrieve_internal_relocs (abfd, sec,
7780					      link_info->keep_memory);
7781
7782  if (internal_relocs)
7783    qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
7784	   internal_reloc_compare);
7785
7786  sec_size = bfd_get_section_limit (abfd, sec);
7787  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
7788  if (contents == NULL && sec_size != 0)
7789    {
7790      ok = false;
7791      goto error_return;
7792    }
7793
7794  ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
7795					XTENSA_PROP_SEC_NAME, false);
7796  if (ptblsize < 0)
7797    {
7798      ok = false;
7799      goto error_return;
7800    }
7801
7802  /* Precompute the opcode for each relocation.  */
7803  reloc_opcodes = build_reloc_opcodes (abfd, sec, contents, internal_relocs);
7804
7805  build_reloc_ranges (abfd, sec, contents, internal_relocs, reloc_opcodes,
7806		      &relevant_relocs);
7807
7808  for (i = 0; i < sec->reloc_count; i++)
7809    {
7810      Elf_Internal_Rela *irel = &internal_relocs[i];
7811      bfd_vma r_offset;
7812      property_table_entry *the_entry;
7813      int ptbl_idx;
7814      ebb_t *ebb;
7815      ebb_constraint ebb_table;
7816      bfd_size_type simplify_size;
7817
7818      if (irel && ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_SIMPLIFY)
7819	continue;
7820      r_offset = irel->r_offset;
7821
7822      simplify_size = get_asm_simplify_size (contents, sec_size, r_offset);
7823      if (simplify_size == 0)
7824	{
7825	  _bfd_error_handler
7826	    /* xgettext:c-format */
7827	    (_("%pB(%pA+%#" PRIx64 "): could not decode instruction for "
7828	       "XTENSA_ASM_SIMPLIFY relocation; "
7829	       "possible configuration mismatch"),
7830	     sec->owner, sec, (uint64_t) r_offset);
7831	  continue;
7832	}
7833
7834      /* If the instruction table is not around, then don't do this
7835	 relaxation.  */
7836      the_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
7837						  sec->vma + irel->r_offset);
7838      if (the_entry == NULL || XTENSA_NO_NOP_REMOVAL)
7839	{
7840	  text_action_add (&relax_info->action_list,
7841			   ta_convert_longcall, sec, r_offset,
7842			   0);
7843	  continue;
7844	}
7845
7846      /* If the next longcall happens to be at the same address as an
7847	 unreachable section of size 0, then skip forward.  */
7848      ptbl_idx = the_entry - prop_table;
7849      while ((the_entry->flags & XTENSA_PROP_UNREACHABLE)
7850	     && the_entry->size == 0
7851	     && ptbl_idx + 1 < ptblsize
7852	     && (prop_table[ptbl_idx + 1].address
7853		 == prop_table[ptbl_idx].address))
7854	{
7855	  ptbl_idx++;
7856	  the_entry++;
7857	}
7858
7859      if (the_entry->flags & XTENSA_PROP_NO_TRANSFORM)
7860	  /* NO_REORDER is OK */
7861	continue;
7862
7863      init_ebb_constraint (&ebb_table);
7864      ebb = &ebb_table.ebb;
7865      init_ebb (ebb, sec, contents, sec_size, prop_table, ptblsize,
7866		internal_relocs, sec->reloc_count);
7867      ebb->start_offset = r_offset + simplify_size;
7868      ebb->end_offset = r_offset + simplify_size;
7869      ebb->start_ptbl_idx = ptbl_idx;
7870      ebb->end_ptbl_idx = ptbl_idx;
7871      ebb->start_reloc_idx = i;
7872      ebb->end_reloc_idx = i;
7873
7874      if (!extend_ebb_bounds (ebb)
7875	  || !compute_ebb_proposed_actions (&ebb_table)
7876	  || !compute_ebb_actions (&ebb_table)
7877	  || !check_section_ebb_pcrels_fit (abfd, sec, contents,
7878					    internal_relocs,
7879					    &relevant_relocs,
7880					    &ebb_table, reloc_opcodes)
7881	  || !check_section_ebb_reduces (&ebb_table))
7882	{
7883	  /* If anything goes wrong or we get unlucky and something does
7884	     not fit, with our plan because of expansion between
7885	     critical branches, just convert to a NOP.  */
7886
7887	  text_action_add (&relax_info->action_list,
7888			   ta_convert_longcall, sec, r_offset, 0);
7889	  i = ebb_table.ebb.end_reloc_idx;
7890	  free_ebb_constraint (&ebb_table);
7891	  continue;
7892	}
7893
7894      text_action_add_proposed (&relax_info->action_list, &ebb_table, sec);
7895
7896      /* Update the index so we do not go looking at the relocations
7897	 we have already processed.  */
7898      i = ebb_table.ebb.end_reloc_idx;
7899      free_ebb_constraint (&ebb_table);
7900    }
7901
7902  free_reloc_range_list (&relevant_relocs);
7903
7904#if DEBUG
7905  if (action_list_count (&relax_info->action_list))
7906    print_action_list (stderr, &relax_info->action_list);
7907#endif
7908
7909 error_return:
7910  release_contents (sec, contents);
7911  release_internal_relocs (sec, internal_relocs);
7912  free (prop_table);
7913  free (reloc_opcodes);
7914
7915  return ok;
7916}
7917
7918
7919/* Do not widen an instruction if it is preceeded by a
7920   loop opcode.  It might cause misalignment.  */
7921
7922static bool
7923prev_instr_is_a_loop (bfd_byte *contents,
7924		      bfd_size_type content_length,
7925		      bfd_size_type offset)
7926{
7927  xtensa_opcode prev_opcode;
7928
7929  if (offset < 3)
7930    return false;
7931  prev_opcode = insn_decode_opcode (contents, content_length, offset-3, 0);
7932  return (xtensa_opcode_is_loop (xtensa_default_isa, prev_opcode) == 1);
7933}
7934
7935
7936/* Find all of the possible actions for an extended basic block.  */
7937
7938bool
7939compute_ebb_proposed_actions (ebb_constraint *ebb_table)
7940{
7941  const ebb_t *ebb = &ebb_table->ebb;
7942  unsigned rel_idx = ebb->start_reloc_idx;
7943  property_table_entry *entry, *start_entry, *end_entry;
7944  bfd_vma offset = 0;
7945  xtensa_isa isa = xtensa_default_isa;
7946  xtensa_format fmt;
7947  static xtensa_insnbuf insnbuf = NULL;
7948  static xtensa_insnbuf slotbuf = NULL;
7949
7950  if (insnbuf == NULL)
7951    {
7952      insnbuf = xtensa_insnbuf_alloc (isa);
7953      slotbuf = xtensa_insnbuf_alloc (isa);
7954    }
7955
7956  start_entry = &ebb->ptbl[ebb->start_ptbl_idx];
7957  end_entry = &ebb->ptbl[ebb->end_ptbl_idx];
7958
7959  for (entry = start_entry; entry <= end_entry; entry++)
7960    {
7961      bfd_vma start_offset, end_offset;
7962      bfd_size_type insn_len;
7963
7964      start_offset = entry->address - ebb->sec->vma;
7965      end_offset = entry->address + entry->size - ebb->sec->vma;
7966
7967      if (entry == start_entry)
7968	start_offset = ebb->start_offset;
7969      if (entry == end_entry)
7970	end_offset = ebb->end_offset;
7971      offset = start_offset;
7972
7973      if (offset == entry->address - ebb->sec->vma
7974	  && (entry->flags & XTENSA_PROP_INSN_BRANCH_TARGET) != 0)
7975	{
7976	  enum ebb_target_enum align_type = EBB_DESIRE_TGT_ALIGN;
7977	  BFD_ASSERT (offset != end_offset);
7978	  if (offset == end_offset)
7979	    return false;
7980
7981	  insn_len = insn_decode_len (ebb->contents, ebb->content_length,
7982				      offset);
7983	  if (insn_len == 0)
7984	    goto decode_error;
7985
7986	  if (check_branch_target_aligned_address (offset, insn_len))
7987	    align_type = EBB_REQUIRE_TGT_ALIGN;
7988
7989	  ebb_propose_action (ebb_table, align_type, 0,
7990			      ta_none, offset, 0, true);
7991	}
7992
7993      while (offset != end_offset)
7994	{
7995	  Elf_Internal_Rela *irel;
7996	  xtensa_opcode opcode;
7997
7998	  while (rel_idx < ebb->end_reloc_idx
7999		 && (ebb->relocs[rel_idx].r_offset < offset
8000		     || (ebb->relocs[rel_idx].r_offset == offset
8001			 && (ELF32_R_TYPE (ebb->relocs[rel_idx].r_info)
8002			     != R_XTENSA_ASM_SIMPLIFY))))
8003	    rel_idx++;
8004
8005	  /* Check for longcall.  */
8006	  irel = &ebb->relocs[rel_idx];
8007	  if (irel->r_offset == offset
8008	      && ELF32_R_TYPE (irel->r_info) == R_XTENSA_ASM_SIMPLIFY)
8009	    {
8010	      bfd_size_type simplify_size;
8011
8012	      simplify_size = get_asm_simplify_size (ebb->contents,
8013						     ebb->content_length,
8014						     irel->r_offset);
8015	      if (simplify_size == 0)
8016		goto decode_error;
8017
8018	      ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
8019				  ta_convert_longcall, offset, 0, true);
8020
8021	      offset += simplify_size;
8022	      continue;
8023	    }
8024
8025	  if (offset + MIN_INSN_LENGTH > ebb->content_length)
8026	    goto decode_error;
8027	  xtensa_insnbuf_from_chars (isa, insnbuf, &ebb->contents[offset],
8028				     ebb->content_length - offset);
8029	  fmt = xtensa_format_decode (isa, insnbuf);
8030	  if (fmt == XTENSA_UNDEFINED)
8031	    goto decode_error;
8032	  insn_len = xtensa_format_length (isa, fmt);
8033	  if (insn_len == (bfd_size_type) XTENSA_UNDEFINED)
8034	    goto decode_error;
8035
8036	  if (xtensa_format_num_slots (isa, fmt) != 1)
8037	    {
8038	      offset += insn_len;
8039	      continue;
8040	    }
8041
8042	  xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
8043	  opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
8044	  if (opcode == XTENSA_UNDEFINED)
8045	    goto decode_error;
8046
8047	  if ((entry->flags & XTENSA_PROP_INSN_NO_DENSITY) == 0
8048	      && (entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
8049	      && can_narrow_instruction (slotbuf, fmt, opcode) != 0)
8050	    {
8051	      /* Add an instruction narrow action.  */
8052	      ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
8053				  ta_narrow_insn, offset, 0, false);
8054	    }
8055	  else if ((entry->flags & XTENSA_PROP_NO_TRANSFORM) == 0
8056		   && can_widen_instruction (slotbuf, fmt, opcode) != 0
8057		   && ! prev_instr_is_a_loop (ebb->contents,
8058					      ebb->content_length, offset))
8059	    {
8060	      /* Add an instruction widen action.  */
8061	      ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
8062				  ta_widen_insn, offset, 0, false);
8063	    }
8064	  else if (xtensa_opcode_is_loop (xtensa_default_isa, opcode) == 1)
8065	    {
8066	      /* Check for branch targets.  */
8067	      ebb_propose_action (ebb_table, EBB_REQUIRE_LOOP_ALIGN, 0,
8068				  ta_none, offset, 0, true);
8069	    }
8070
8071	  offset += insn_len;
8072	}
8073    }
8074
8075  if (ebb->ends_unreachable)
8076    {
8077      ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
8078			  ta_fill, ebb->end_offset, 0, true);
8079    }
8080
8081  return true;
8082
8083 decode_error:
8084  _bfd_error_handler
8085    /* xgettext:c-format */
8086    (_("%pB(%pA+%#" PRIx64 "): could not decode instruction; "
8087       "possible configuration mismatch"),
8088     ebb->sec->owner, ebb->sec, (uint64_t) offset);
8089  return false;
8090}
8091
8092
8093/* After all of the information has collected about the
8094   transformations possible in an EBB, compute the appropriate actions
8095   here in compute_ebb_actions.  We still must check later to make
8096   sure that the actions do not break any relocations.  The algorithm
8097   used here is pretty greedy.  Basically, it removes as many no-ops
8098   as possible so that the end of the EBB has the same alignment
8099   characteristics as the original.  First, it uses narrowing, then
8100   fill space at the end of the EBB, and finally widenings.  If that
8101   does not work, it tries again with one fewer no-op removed.  The
8102   optimization will only be performed if all of the branch targets
8103   that were aligned before transformation are also aligned after the
8104   transformation.
8105
8106   When the size_opt flag is set, ignore the branch target alignments,
8107   narrow all wide instructions, and remove all no-ops unless the end
8108   of the EBB prevents it.  */
8109
8110bool
8111compute_ebb_actions (ebb_constraint *ebb_table)
8112{
8113  unsigned i = 0;
8114  unsigned j;
8115  int removed_bytes = 0;
8116  ebb_t *ebb = &ebb_table->ebb;
8117  unsigned seg_idx_start = 0;
8118  unsigned seg_idx_end = 0;
8119
8120  /* We perform this like the assembler relaxation algorithm: Start by
8121     assuming all instructions are narrow and all no-ops removed; then
8122     walk through....  */
8123
8124  /* For each segment of this that has a solid constraint, check to
8125     see if there are any combinations that will keep the constraint.
8126     If so, use it.  */
8127  for (seg_idx_end = 0; seg_idx_end < ebb_table->action_count; seg_idx_end++)
8128    {
8129      bool requires_text_end_align = false;
8130      unsigned longcall_count = 0;
8131      unsigned longcall_convert_count = 0;
8132      unsigned narrowable_count = 0;
8133      unsigned narrowable_convert_count = 0;
8134      unsigned widenable_count = 0;
8135      unsigned widenable_convert_count = 0;
8136
8137      proposed_action *action = NULL;
8138      int align = (1 << ebb_table->ebb.sec->alignment_power);
8139
8140      seg_idx_start = seg_idx_end;
8141
8142      for (i = seg_idx_start; i < ebb_table->action_count; i++)
8143	{
8144	  action = &ebb_table->actions[i];
8145	  if (action->action == ta_convert_longcall)
8146	    longcall_count++;
8147	  if (action->action == ta_narrow_insn)
8148	    narrowable_count++;
8149	  if (action->action == ta_widen_insn)
8150	    widenable_count++;
8151	  if (action->action == ta_fill)
8152	    break;
8153	  if (action->align_type == EBB_REQUIRE_LOOP_ALIGN)
8154	    break;
8155	  if (action->align_type == EBB_REQUIRE_TGT_ALIGN
8156	      && !elf32xtensa_size_opt)
8157	    break;
8158	}
8159      seg_idx_end = i;
8160
8161      if (seg_idx_end == ebb_table->action_count && !ebb->ends_unreachable)
8162	requires_text_end_align = true;
8163
8164      if (elf32xtensa_size_opt && !requires_text_end_align
8165	  && action->align_type != EBB_REQUIRE_LOOP_ALIGN
8166	  && action->align_type != EBB_REQUIRE_TGT_ALIGN)
8167	{
8168	  longcall_convert_count = longcall_count;
8169	  narrowable_convert_count = narrowable_count;
8170	  widenable_convert_count = 0;
8171	}
8172      else
8173	{
8174	  /* There is a constraint.  Convert the max number of longcalls.  */
8175	  narrowable_convert_count = 0;
8176	  longcall_convert_count = 0;
8177	  widenable_convert_count = 0;
8178
8179	  for (j = 0; j < longcall_count; j++)
8180	    {
8181	      int removed = (longcall_count - j) * 3 & (align - 1);
8182	      unsigned desire_narrow = (align - removed) & (align - 1);
8183	      unsigned desire_widen = removed;
8184	      if (desire_narrow <= narrowable_count)
8185		{
8186		  narrowable_convert_count = desire_narrow;
8187		  narrowable_convert_count +=
8188		    (align * ((narrowable_count - narrowable_convert_count)
8189			      / align));
8190		  longcall_convert_count = (longcall_count - j);
8191		  widenable_convert_count = 0;
8192		  break;
8193		}
8194	      if (desire_widen <= widenable_count && !elf32xtensa_size_opt)
8195		{
8196		  narrowable_convert_count = 0;
8197		  longcall_convert_count = longcall_count - j;
8198		  widenable_convert_count = desire_widen;
8199		  break;
8200		}
8201	    }
8202	}
8203
8204      /* Now the number of conversions are saved.  Do them.  */
8205      for (i = seg_idx_start; i < seg_idx_end; i++)
8206	{
8207	  action = &ebb_table->actions[i];
8208	  switch (action->action)
8209	    {
8210	    case ta_convert_longcall:
8211	      if (longcall_convert_count != 0)
8212		{
8213		  action->action = ta_remove_longcall;
8214		  action->do_action = true;
8215		  action->removed_bytes += 3;
8216		  longcall_convert_count--;
8217		}
8218	      break;
8219	    case ta_narrow_insn:
8220	      if (narrowable_convert_count != 0)
8221		{
8222		  action->do_action = true;
8223		  action->removed_bytes += 1;
8224		  narrowable_convert_count--;
8225		}
8226	      break;
8227	    case ta_widen_insn:
8228	      if (widenable_convert_count != 0)
8229		{
8230		  action->do_action = true;
8231		  action->removed_bytes -= 1;
8232		  widenable_convert_count--;
8233		}
8234	      break;
8235	    default:
8236	      break;
8237	    }
8238	}
8239    }
8240
8241  /* Now we move on to some local opts.  Try to remove each of the
8242     remaining longcalls.  */
8243
8244  if (ebb_table->ebb.ends_section || ebb_table->ebb.ends_unreachable)
8245    {
8246      removed_bytes = 0;
8247      for (i = 0; i < ebb_table->action_count; i++)
8248	{
8249	  int old_removed_bytes = removed_bytes;
8250	  proposed_action *action = &ebb_table->actions[i];
8251
8252	  if (action->do_action && action->action == ta_convert_longcall)
8253	    {
8254	      bool bad_alignment = false;
8255	      removed_bytes += 3;
8256	      for (j = i + 1; j < ebb_table->action_count; j++)
8257		{
8258		  proposed_action *new_action = &ebb_table->actions[j];
8259		  bfd_vma offset = new_action->offset;
8260		  if (new_action->align_type == EBB_REQUIRE_TGT_ALIGN)
8261		    {
8262		      if (!check_branch_target_aligned
8263			  (ebb_table->ebb.contents,
8264			   ebb_table->ebb.content_length,
8265			   offset, offset - removed_bytes))
8266			{
8267			  bad_alignment = true;
8268			  break;
8269			}
8270		    }
8271		  if (new_action->align_type == EBB_REQUIRE_LOOP_ALIGN)
8272		    {
8273		      if (!check_loop_aligned (ebb_table->ebb.contents,
8274					       ebb_table->ebb.content_length,
8275					       offset,
8276					       offset - removed_bytes))
8277			{
8278			  bad_alignment = true;
8279			  break;
8280			}
8281		    }
8282		  if (new_action->action == ta_narrow_insn
8283		      && !new_action->do_action
8284		      && ebb_table->ebb.sec->alignment_power == 2)
8285		    {
8286		      /* Narrow an instruction and we are done.  */
8287		      new_action->do_action = true;
8288		      new_action->removed_bytes += 1;
8289		      bad_alignment = false;
8290		      break;
8291		    }
8292		  if (new_action->action == ta_widen_insn
8293		      && new_action->do_action
8294		      && ebb_table->ebb.sec->alignment_power == 2)
8295		    {
8296		      /* Narrow an instruction and we are done.  */
8297		      new_action->do_action = false;
8298		      new_action->removed_bytes += 1;
8299		      bad_alignment = false;
8300		      break;
8301		    }
8302		  if (new_action->do_action)
8303		    removed_bytes += new_action->removed_bytes;
8304		}
8305	      if (!bad_alignment)
8306		{
8307		  action->removed_bytes += 3;
8308		  action->action = ta_remove_longcall;
8309		  action->do_action = true;
8310		}
8311	    }
8312	  removed_bytes = old_removed_bytes;
8313	  if (action->do_action)
8314	    removed_bytes += action->removed_bytes;
8315	}
8316    }
8317
8318  removed_bytes = 0;
8319  for (i = 0; i < ebb_table->action_count; ++i)
8320    {
8321      proposed_action *action = &ebb_table->actions[i];
8322      if (action->do_action)
8323	removed_bytes += action->removed_bytes;
8324    }
8325
8326  if ((removed_bytes % (1 << ebb_table->ebb.sec->alignment_power)) != 0
8327      && ebb->ends_unreachable)
8328    {
8329      proposed_action *action;
8330      int br;
8331      int extra_space;
8332
8333      BFD_ASSERT (ebb_table->action_count != 0);
8334      action = &ebb_table->actions[ebb_table->action_count - 1];
8335      BFD_ASSERT (action->action == ta_fill);
8336      BFD_ASSERT (ebb->ends_unreachable->flags & XTENSA_PROP_UNREACHABLE);
8337
8338      extra_space = xtensa_compute_fill_extra_space (ebb->ends_unreachable);
8339      br = action->removed_bytes + removed_bytes + extra_space;
8340      br = br & ((1 << ebb->sec->alignment_power ) - 1);
8341
8342      action->removed_bytes = extra_space - br;
8343    }
8344  return true;
8345}
8346
8347
8348/* The xlate_map is a sorted array of address mappings designed to
8349   answer the offset_with_removed_text() query with a binary search instead
8350   of a linear search through the section's action_list.  */
8351
8352typedef struct xlate_map_entry xlate_map_entry_t;
8353typedef struct xlate_map xlate_map_t;
8354
8355struct xlate_map_entry
8356{
8357  bfd_vma orig_address;
8358  bfd_vma new_address;
8359  unsigned size;
8360};
8361
8362struct xlate_map
8363{
8364  unsigned entry_count;
8365  xlate_map_entry_t *entry;
8366};
8367
8368
8369static int
8370xlate_compare (const void *a_v, const void *b_v)
8371{
8372  const xlate_map_entry_t *a = (const xlate_map_entry_t *) a_v;
8373  const xlate_map_entry_t *b = (const xlate_map_entry_t *) b_v;
8374  if (a->orig_address < b->orig_address)
8375    return -1;
8376  if (a->orig_address > (b->orig_address + b->size - 1))
8377    return 1;
8378  return 0;
8379}
8380
8381
8382static bfd_vma
8383xlate_offset_with_removed_text (const xlate_map_t *map,
8384				text_action_list *action_list,
8385				bfd_vma offset)
8386{
8387  void *r;
8388  xlate_map_entry_t *e;
8389  struct xlate_map_entry se;
8390
8391  if (map == NULL)
8392    return offset_with_removed_text (action_list, offset);
8393
8394  if (map->entry_count == 0)
8395    return offset;
8396
8397  se.orig_address = offset;
8398  r = bsearch (&se, map->entry, map->entry_count,
8399	       sizeof (xlate_map_entry_t), &xlate_compare);
8400  e = (xlate_map_entry_t *) r;
8401
8402  /* There could be a jump past the end of the section,
8403     allow it using the last xlate map entry to translate its address.  */
8404  if (e == NULL)
8405    {
8406      e = map->entry + map->entry_count - 1;
8407      if (xlate_compare (&se, e) <= 0)
8408	e = NULL;
8409    }
8410  BFD_ASSERT (e != NULL);
8411  if (e == NULL)
8412    return offset;
8413  return e->new_address - e->orig_address + offset;
8414}
8415
8416typedef struct xlate_map_context_struct xlate_map_context;
8417struct xlate_map_context_struct
8418{
8419  xlate_map_t *map;
8420  xlate_map_entry_t *current_entry;
8421  int removed;
8422};
8423
8424static int
8425xlate_map_fn (splay_tree_node node, void *p)
8426{
8427  text_action *r = (text_action *)node->value;
8428  xlate_map_context *ctx = p;
8429  unsigned orig_size = 0;
8430
8431  switch (r->action)
8432    {
8433    case ta_none:
8434    case ta_remove_insn:
8435    case ta_convert_longcall:
8436    case ta_remove_literal:
8437    case ta_add_literal:
8438      break;
8439    case ta_remove_longcall:
8440      orig_size = 6;
8441      break;
8442    case ta_narrow_insn:
8443      orig_size = 3;
8444      break;
8445    case ta_widen_insn:
8446      orig_size = 2;
8447      break;
8448    case ta_fill:
8449      break;
8450    }
8451  ctx->current_entry->size =
8452    r->offset + orig_size - ctx->current_entry->orig_address;
8453  if (ctx->current_entry->size != 0)
8454    {
8455      ctx->current_entry++;
8456      ctx->map->entry_count++;
8457    }
8458  ctx->current_entry->orig_address = r->offset + orig_size;
8459  ctx->removed += r->removed_bytes;
8460  ctx->current_entry->new_address = r->offset + orig_size - ctx->removed;
8461  ctx->current_entry->size = 0;
8462  return 0;
8463}
8464
8465/* Build a binary searchable offset translation map from a section's
8466   action list.  */
8467
8468static xlate_map_t *
8469build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
8470{
8471  text_action_list *action_list = &relax_info->action_list;
8472  unsigned num_actions = 0;
8473  xlate_map_context ctx;
8474
8475  ctx.map = (xlate_map_t *) bfd_malloc (sizeof (xlate_map_t));
8476
8477  if (ctx.map == NULL)
8478    return NULL;
8479
8480  num_actions = action_list_count (action_list);
8481  ctx.map->entry = (xlate_map_entry_t *)
8482    bfd_malloc (sizeof (xlate_map_entry_t) * (num_actions + 1));
8483  if (ctx.map->entry == NULL)
8484    {
8485      free (ctx.map);
8486      return NULL;
8487    }
8488  ctx.map->entry_count = 0;
8489
8490  ctx.removed = 0;
8491  ctx.current_entry = &ctx.map->entry[0];
8492
8493  ctx.current_entry->orig_address = 0;
8494  ctx.current_entry->new_address = 0;
8495  ctx.current_entry->size = 0;
8496
8497  splay_tree_foreach (action_list->tree, xlate_map_fn, &ctx);
8498
8499  ctx.current_entry->size = (bfd_get_section_limit (sec->owner, sec)
8500			     - ctx.current_entry->orig_address);
8501  if (ctx.current_entry->size != 0)
8502    ctx.map->entry_count++;
8503
8504  return ctx.map;
8505}
8506
8507
8508/* Free an offset translation map.  */
8509
8510static void
8511free_xlate_map (xlate_map_t *map)
8512{
8513  if (map)
8514    {
8515      free (map->entry);
8516      free (map);
8517    }
8518}
8519
8520
8521/* Use check_section_ebb_pcrels_fit to make sure that all of the
8522   relocations in a section will fit if a proposed set of actions
8523   are performed.  */
8524
8525static bool
8526check_section_ebb_pcrels_fit (bfd *abfd,
8527			      asection *sec,
8528			      bfd_byte *contents,
8529			      Elf_Internal_Rela *internal_relocs,
8530			      reloc_range_list *relevant_relocs,
8531			      const ebb_constraint *constraint,
8532			      const xtensa_opcode *reloc_opcodes)
8533{
8534  unsigned i, j;
8535  unsigned n = sec->reloc_count;
8536  Elf_Internal_Rela *irel;
8537  xlate_map_t *xmap = NULL;
8538  bool ok = true;
8539  xtensa_relax_info *relax_info;
8540  reloc_range_list_entry *entry = NULL;
8541
8542  relax_info = get_xtensa_relax_info (sec);
8543
8544  if (relax_info && sec->reloc_count > 100)
8545    {
8546      xmap = build_xlate_map (sec, relax_info);
8547      /* NULL indicates out of memory, but the slow version
8548	 can still be used.  */
8549    }
8550
8551  if (relevant_relocs && constraint->action_count)
8552    {
8553      if (!relevant_relocs->ok)
8554	{
8555	  ok = false;
8556	  n = 0;
8557	}
8558      else
8559	{
8560	  bfd_vma min_offset, max_offset;
8561	  min_offset = max_offset = constraint->actions[0].offset;
8562
8563	  for (i = 1; i < constraint->action_count; ++i)
8564	    {
8565	      proposed_action *action = &constraint->actions[i];
8566	      bfd_vma offset = action->offset;
8567
8568	      if (offset < min_offset)
8569		min_offset = offset;
8570	      if (offset > max_offset)
8571		max_offset = offset;
8572	    }
8573	  reloc_range_list_update_range (relevant_relocs, min_offset,
8574					 max_offset);
8575	  n = relevant_relocs->n_list;
8576	  entry = &relevant_relocs->list_root;
8577	}
8578    }
8579  else
8580    {
8581      relevant_relocs = NULL;
8582    }
8583
8584  for (i = 0; i < n; i++)
8585    {
8586      r_reloc r_rel;
8587      bfd_vma orig_self_offset, orig_target_offset;
8588      bfd_vma self_offset, target_offset;
8589      int r_type;
8590      reloc_howto_type *howto;
8591      int self_removed_bytes, target_removed_bytes;
8592
8593      if (relevant_relocs)
8594	{
8595	  entry = entry->next;
8596	  irel = entry->irel;
8597	}
8598      else
8599	{
8600	  irel = internal_relocs + i;
8601	}
8602      r_type = ELF32_R_TYPE (irel->r_info);
8603
8604      howto = &elf_howto_table[r_type];
8605      /* We maintain the required invariant: PC-relative relocations
8606	 that fit before linking must fit after linking.  Thus we only
8607	 need to deal with relocations to the same section that are
8608	 PC-relative.  */
8609      if (r_type == R_XTENSA_ASM_SIMPLIFY
8610	  || r_type == R_XTENSA_32_PCREL
8611	  || !howto->pc_relative)
8612	continue;
8613
8614      r_reloc_init (&r_rel, abfd, irel, contents,
8615		    bfd_get_section_limit (abfd, sec));
8616
8617      if (r_reloc_get_section (&r_rel) != sec)
8618	continue;
8619
8620      orig_self_offset = irel->r_offset;
8621      orig_target_offset = r_rel.target_offset;
8622
8623      self_offset = orig_self_offset;
8624      target_offset = orig_target_offset;
8625
8626      if (relax_info)
8627	{
8628	  self_offset =
8629	    xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8630					    orig_self_offset);
8631	  target_offset =
8632	    xlate_offset_with_removed_text (xmap, &relax_info->action_list,
8633					    orig_target_offset);
8634	}
8635
8636      self_removed_bytes = 0;
8637      target_removed_bytes = 0;
8638
8639      for (j = 0; j < constraint->action_count; ++j)
8640	{
8641	  proposed_action *action = &constraint->actions[j];
8642	  bfd_vma offset = action->offset;
8643	  int removed_bytes = action->removed_bytes;
8644	  if (offset < orig_self_offset
8645	      || (offset == orig_self_offset && action->action == ta_fill
8646		  && action->removed_bytes < 0))
8647	    self_removed_bytes += removed_bytes;
8648	  if (offset < orig_target_offset
8649	      || (offset == orig_target_offset && action->action == ta_fill
8650		  && action->removed_bytes < 0))
8651	    target_removed_bytes += removed_bytes;
8652	}
8653      self_offset -= self_removed_bytes;
8654      target_offset -= target_removed_bytes;
8655
8656      /* Try to encode it.  Get the operand and check.  */
8657      if (is_alt_relocation (ELF32_R_TYPE (irel->r_info)))
8658	{
8659	  /* None of the current alternate relocs are PC-relative,
8660	     and only PC-relative relocs matter here.  */
8661	}
8662      else
8663	{
8664	  xtensa_opcode opcode;
8665	  int opnum;
8666
8667	  if (relevant_relocs)
8668	    {
8669	      opcode = entry->opcode;
8670	      opnum = entry->opnum;
8671	    }
8672	  else
8673	    {
8674	      if (reloc_opcodes)
8675		opcode = reloc_opcodes[relevant_relocs ?
8676		  (unsigned)(entry - relevant_relocs->reloc) : i];
8677	      else
8678		opcode = get_relocation_opcode (abfd, sec, contents, irel);
8679	      if (opcode == XTENSA_UNDEFINED)
8680		{
8681		  ok = false;
8682		  break;
8683		}
8684
8685	      opnum = get_relocation_opnd (opcode, ELF32_R_TYPE (irel->r_info));
8686	      if (opnum == XTENSA_UNDEFINED)
8687		{
8688		  ok = false;
8689		  break;
8690		}
8691	    }
8692
8693	  if (!pcrel_reloc_fits (opcode, opnum, self_offset, target_offset))
8694	    {
8695	      ok = false;
8696	      break;
8697	    }
8698	}
8699    }
8700
8701  free_xlate_map (xmap);
8702
8703  return ok;
8704}
8705
8706
8707static bool
8708check_section_ebb_reduces (const ebb_constraint *constraint)
8709{
8710  int removed = 0;
8711  unsigned i;
8712
8713  for (i = 0; i < constraint->action_count; i++)
8714    {
8715      const proposed_action *action = &constraint->actions[i];
8716      if (action->do_action)
8717	removed += action->removed_bytes;
8718    }
8719  if (removed < 0)
8720    return false;
8721
8722  return true;
8723}
8724
8725
8726void
8727text_action_add_proposed (text_action_list *l,
8728			  const ebb_constraint *ebb_table,
8729			  asection *sec)
8730{
8731  unsigned i;
8732
8733  for (i = 0; i < ebb_table->action_count; i++)
8734    {
8735      proposed_action *action = &ebb_table->actions[i];
8736
8737      if (!action->do_action)
8738	continue;
8739      switch (action->action)
8740	{
8741	case ta_remove_insn:
8742	case ta_remove_longcall:
8743	case ta_convert_longcall:
8744	case ta_narrow_insn:
8745	case ta_widen_insn:
8746	case ta_fill:
8747	case ta_remove_literal:
8748	  text_action_add (l, action->action, sec, action->offset,
8749			   action->removed_bytes);
8750	  break;
8751	case ta_none:
8752	  break;
8753	default:
8754	  BFD_ASSERT (0);
8755	  break;
8756	}
8757    }
8758}
8759
8760
8761int
8762xtensa_compute_fill_extra_space (property_table_entry *entry)
8763{
8764  int fill_extra_space;
8765
8766  if (!entry)
8767    return 0;
8768
8769  if ((entry->flags & XTENSA_PROP_UNREACHABLE) == 0)
8770    return 0;
8771
8772  fill_extra_space = entry->size;
8773  if ((entry->flags & XTENSA_PROP_ALIGN) != 0)
8774    {
8775      /* Fill bytes for alignment:
8776	 (2**n)-1 - (addr + (2**n)-1) & (2**n -1) */
8777      int pow = GET_XTENSA_PROP_ALIGNMENT (entry->flags);
8778      int nsm = (1 << pow) - 1;
8779      bfd_vma addr = entry->address + entry->size;
8780      bfd_vma align_fill = nsm - ((addr + nsm) & nsm);
8781      fill_extra_space += align_fill;
8782    }
8783  return fill_extra_space;
8784}
8785
8786
8787/* First relaxation pass.  */
8788
8789/* If the section contains relaxable literals, check each literal to
8790   see if it has the same value as another literal that has already
8791   been seen, either in the current section or a previous one.  If so,
8792   add an entry to the per-section list of removed literals.  The
8793   actual changes are deferred until the next pass.  */
8794
8795static bool
8796compute_removed_literals (bfd *abfd,
8797			  asection *sec,
8798			  struct bfd_link_info *link_info,
8799			  value_map_hash_table *values)
8800{
8801  xtensa_relax_info *relax_info;
8802  bfd_byte *contents;
8803  Elf_Internal_Rela *internal_relocs;
8804  source_reloc *src_relocs, *rel;
8805  bool ok = true;
8806  property_table_entry *prop_table = NULL;
8807  int ptblsize;
8808  int i, prev_i;
8809  bool last_loc_is_prev = false;
8810  bfd_vma last_target_offset = 0;
8811  section_cache_t target_sec_cache;
8812  bfd_size_type sec_size;
8813
8814  init_section_cache (&target_sec_cache);
8815
8816  /* Do nothing if it is not a relaxable literal section.  */
8817  relax_info = get_xtensa_relax_info (sec);
8818  BFD_ASSERT (relax_info);
8819  if (!relax_info->is_relaxable_literal_section)
8820    return ok;
8821
8822  internal_relocs = retrieve_internal_relocs (abfd, sec,
8823					      link_info->keep_memory);
8824
8825  sec_size = bfd_get_section_limit (abfd, sec);
8826  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
8827  if (contents == NULL && sec_size != 0)
8828    {
8829      ok = false;
8830      goto error_return;
8831    }
8832
8833  /* Sort the source_relocs by target offset.  */
8834  src_relocs = relax_info->src_relocs;
8835  qsort (src_relocs, relax_info->src_count,
8836	 sizeof (source_reloc), source_reloc_compare);
8837  qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
8838	 internal_reloc_compare);
8839
8840  ptblsize = xtensa_read_table_entries (abfd, sec, &prop_table,
8841					XTENSA_PROP_SEC_NAME, false);
8842  if (ptblsize < 0)
8843    {
8844      ok = false;
8845      goto error_return;
8846    }
8847
8848  prev_i = -1;
8849  for (i = 0; i < relax_info->src_count; i++)
8850    {
8851      Elf_Internal_Rela *irel = NULL;
8852
8853      rel = &src_relocs[i];
8854      if (get_l32r_opcode () != rel->opcode)
8855	continue;
8856      irel = get_irel_at_offset (sec, internal_relocs,
8857				 rel->r_rel.target_offset);
8858
8859      /* If the relocation on this is not a simple R_XTENSA_32 or
8860	 R_XTENSA_PLT then do not consider it.  This may happen when
8861	 the difference of two symbols is used in a literal.  */
8862      if (irel && (ELF32_R_TYPE (irel->r_info) != R_XTENSA_32
8863		   && ELF32_R_TYPE (irel->r_info) != R_XTENSA_PLT))
8864	continue;
8865
8866      /* If the target_offset for this relocation is the same as the
8867	 previous relocation, then we've already considered whether the
8868	 literal can be coalesced.  Skip to the next one....  */
8869      if (i != 0 && prev_i != -1
8870	  && src_relocs[i-1].r_rel.target_offset == rel->r_rel.target_offset)
8871	continue;
8872      prev_i = i;
8873
8874      if (last_loc_is_prev &&
8875	  last_target_offset + 4 != rel->r_rel.target_offset)
8876	last_loc_is_prev = false;
8877
8878      /* Check if the relocation was from an L32R that is being removed
8879	 because a CALLX was converted to a direct CALL, and check if
8880	 there are no other relocations to the literal.  */
8881      if (is_removable_literal (rel, i, src_relocs, relax_info->src_count,
8882				sec, prop_table, ptblsize))
8883	{
8884	  if (!remove_dead_literal (abfd, sec, link_info, internal_relocs,
8885				    irel, rel, prop_table, ptblsize))
8886	    {
8887	      ok = false;
8888	      goto error_return;
8889	    }
8890	  last_target_offset = rel->r_rel.target_offset;
8891	  continue;
8892	}
8893
8894      if (!identify_literal_placement (abfd, sec, contents, link_info,
8895				       values,
8896				       &last_loc_is_prev, irel,
8897				       relax_info->src_count - i, rel,
8898				       prop_table, ptblsize,
8899				       &target_sec_cache, rel->is_abs_literal))
8900	{
8901	  ok = false;
8902	  goto error_return;
8903	}
8904      last_target_offset = rel->r_rel.target_offset;
8905    }
8906
8907#if DEBUG
8908  print_removed_literals (stderr, &relax_info->removed_list);
8909  print_action_list (stderr, &relax_info->action_list);
8910#endif /* DEBUG */
8911
8912 error_return:
8913  free (prop_table);
8914  free_section_cache (&target_sec_cache);
8915
8916  release_contents (sec, contents);
8917  release_internal_relocs (sec, internal_relocs);
8918  return ok;
8919}
8920
8921
8922static Elf_Internal_Rela *
8923get_irel_at_offset (asection *sec,
8924		    Elf_Internal_Rela *internal_relocs,
8925		    bfd_vma offset)
8926{
8927  unsigned i;
8928  Elf_Internal_Rela *irel;
8929  unsigned r_type;
8930  Elf_Internal_Rela key;
8931
8932  if (!internal_relocs)
8933    return NULL;
8934
8935  key.r_offset = offset;
8936  irel = bsearch (&key, internal_relocs, sec->reloc_count,
8937		  sizeof (Elf_Internal_Rela), internal_reloc_matches);
8938  if (!irel)
8939    return NULL;
8940
8941  /* bsearch does not guarantee which will be returned if there are
8942     multiple matches.  We need the first that is not an alignment.  */
8943  i = irel - internal_relocs;
8944  while (i > 0)
8945    {
8946      if (internal_relocs[i-1].r_offset != offset)
8947	break;
8948      i--;
8949    }
8950  for ( ; i < sec->reloc_count; i++)
8951    {
8952      irel = &internal_relocs[i];
8953      r_type = ELF32_R_TYPE (irel->r_info);
8954      if (irel->r_offset == offset && r_type != R_XTENSA_NONE)
8955	return irel;
8956    }
8957
8958  return NULL;
8959}
8960
8961
8962bool
8963is_removable_literal (const source_reloc *rel,
8964		      int i,
8965		      const source_reloc *src_relocs,
8966		      int src_count,
8967		      asection *sec,
8968		      property_table_entry *prop_table,
8969		      int ptblsize)
8970{
8971  const source_reloc *curr_rel;
8972  property_table_entry *entry;
8973
8974  if (!rel->is_null)
8975    return false;
8976
8977  entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
8978					  sec->vma + rel->r_rel.target_offset);
8979  if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
8980    return false;
8981
8982  for (++i; i < src_count; ++i)
8983    {
8984      curr_rel = &src_relocs[i];
8985      /* If all others have the same target offset....  */
8986      if (curr_rel->r_rel.target_offset != rel->r_rel.target_offset)
8987	return true;
8988
8989      if (!curr_rel->is_null
8990	  && !xtensa_is_property_section (curr_rel->source_sec)
8991	  && !(curr_rel->source_sec->flags & SEC_DEBUGGING))
8992	return false;
8993    }
8994  return true;
8995}
8996
8997
8998bool
8999remove_dead_literal (bfd *abfd,
9000		     asection *sec,
9001		     struct bfd_link_info *link_info,
9002		     Elf_Internal_Rela *internal_relocs,
9003		     Elf_Internal_Rela *irel,
9004		     source_reloc *rel,
9005		     property_table_entry *prop_table,
9006		     int ptblsize)
9007{
9008  property_table_entry *entry;
9009  xtensa_relax_info *relax_info;
9010
9011  relax_info = get_xtensa_relax_info (sec);
9012  if (!relax_info)
9013    return false;
9014
9015  entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9016					  sec->vma + rel->r_rel.target_offset);
9017
9018  /* Mark the unused literal so that it will be removed.  */
9019  add_removed_literal (&relax_info->removed_list, &rel->r_rel, NULL);
9020
9021  text_action_add (&relax_info->action_list,
9022		   ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9023
9024  /* If the section is 4-byte aligned, do not add fill.  */
9025  if (sec->alignment_power > 2)
9026    {
9027      int fill_extra_space;
9028      bfd_vma entry_sec_offset;
9029      text_action *fa;
9030      property_table_entry *the_add_entry;
9031      int removed_diff;
9032
9033      if (entry)
9034	entry_sec_offset = entry->address - sec->vma + entry->size;
9035      else
9036	entry_sec_offset = rel->r_rel.target_offset + 4;
9037
9038      /* If the literal range is at the end of the section,
9039	 do not add fill.  */
9040      the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9041						      entry_sec_offset);
9042      fill_extra_space = xtensa_compute_fill_extra_space (the_add_entry);
9043
9044      fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9045      removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9046						  -4, fill_extra_space);
9047      if (fa)
9048	adjust_fill_action (fa, removed_diff);
9049      else
9050	text_action_add (&relax_info->action_list,
9051			 ta_fill, sec, entry_sec_offset, removed_diff);
9052    }
9053
9054  /* Zero out the relocation on this literal location.  */
9055  if (irel)
9056    {
9057      if (elf_hash_table (link_info)->dynamic_sections_created)
9058	shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
9059
9060      irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
9061      pin_internal_relocs (sec, internal_relocs);
9062    }
9063
9064  /* Do not modify "last_loc_is_prev".  */
9065  return true;
9066}
9067
9068
9069bool
9070identify_literal_placement (bfd *abfd,
9071			    asection *sec,
9072			    bfd_byte *contents,
9073			    struct bfd_link_info *link_info,
9074			    value_map_hash_table *values,
9075			    bool *last_loc_is_prev_p,
9076			    Elf_Internal_Rela *irel,
9077			    int remaining_src_rels,
9078			    source_reloc *rel,
9079			    property_table_entry *prop_table,
9080			    int ptblsize,
9081			    section_cache_t *target_sec_cache,
9082			    bool is_abs_literal)
9083{
9084  literal_value val;
9085  value_map *val_map;
9086  xtensa_relax_info *relax_info;
9087  bool literal_placed = false;
9088  r_reloc r_rel;
9089  unsigned long value;
9090  bool final_static_link;
9091  bfd_size_type sec_size;
9092
9093  relax_info = get_xtensa_relax_info (sec);
9094  if (!relax_info)
9095    return false;
9096
9097  sec_size = bfd_get_section_limit (abfd, sec);
9098
9099  final_static_link =
9100    (!bfd_link_relocatable (link_info)
9101     && !elf_hash_table (link_info)->dynamic_sections_created);
9102
9103  /* The placement algorithm first checks to see if the literal is
9104     already in the value map.  If so and the value map is reachable
9105     from all uses, then the literal is moved to that location.  If
9106     not, then we identify the last location where a fresh literal was
9107     placed.  If the literal can be safely moved there, then we do so.
9108     If not, then we assume that the literal is not to move and leave
9109     the literal where it is, marking it as the last literal
9110     location.  */
9111
9112  /* Find the literal value.  */
9113  value = 0;
9114  r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
9115  if (!irel)
9116    {
9117      BFD_ASSERT (rel->r_rel.target_offset < sec_size);
9118      value = bfd_get_32 (abfd, contents + rel->r_rel.target_offset);
9119    }
9120  init_literal_value (&val, &r_rel, value, is_abs_literal);
9121
9122  /* Check if we've seen another literal with the same value that
9123     is in the same output section.  */
9124  val_map = value_map_get_cached_value (values, &val, final_static_link);
9125
9126  if (val_map
9127      && (r_reloc_get_section (&val_map->loc)->output_section
9128	  == sec->output_section)
9129      && relocations_reach (rel, remaining_src_rels, &val_map->loc)
9130      && coalesce_shared_literal (sec, rel, prop_table, ptblsize, val_map))
9131    {
9132      /* No change to last_loc_is_prev.  */
9133      literal_placed = true;
9134    }
9135
9136  /* For relocatable links, do not try to move literals.  To do it
9137     correctly might increase the number of relocations in an input
9138     section making the default relocatable linking fail.  */
9139  if (!bfd_link_relocatable (link_info) && !literal_placed
9140      && values->has_last_loc && !(*last_loc_is_prev_p))
9141    {
9142      asection *target_sec = r_reloc_get_section (&values->last_loc);
9143      if (target_sec && target_sec->output_section == sec->output_section)
9144	{
9145	  /* Increment the virtual offset.  */
9146	  r_reloc try_loc = values->last_loc;
9147	  try_loc.virtual_offset += 4;
9148
9149	  /* There is a last loc that was in the same output section.  */
9150	  if (relocations_reach (rel, remaining_src_rels, &try_loc)
9151	      && move_shared_literal (sec, link_info, rel,
9152				      prop_table, ptblsize,
9153				      &try_loc, &val, target_sec_cache))
9154	    {
9155	      values->last_loc.virtual_offset += 4;
9156	      literal_placed = true;
9157	      if (!val_map)
9158		val_map = add_value_map (values, &val, &try_loc,
9159					 final_static_link);
9160	      else
9161		val_map->loc = try_loc;
9162	    }
9163	}
9164    }
9165
9166  if (!literal_placed)
9167    {
9168      /* Nothing worked, leave the literal alone but update the last loc.  */
9169      values->has_last_loc = true;
9170      values->last_loc = rel->r_rel;
9171      if (!val_map)
9172	val_map = add_value_map (values, &val, &rel->r_rel, final_static_link);
9173      else
9174	val_map->loc = rel->r_rel;
9175      *last_loc_is_prev_p = true;
9176    }
9177
9178  return true;
9179}
9180
9181
9182/* Check if the original relocations (presumably on L32R instructions)
9183   identified by reloc[0..N] can be changed to reference the literal
9184   identified by r_rel.  If r_rel is out of range for any of the
9185   original relocations, then we don't want to coalesce the original
9186   literal with the one at r_rel.  We only check reloc[0..N], where the
9187   offsets are all the same as for reloc[0] (i.e., they're all
9188   referencing the same literal) and where N is also bounded by the
9189   number of remaining entries in the "reloc" array.  The "reloc" array
9190   is sorted by target offset so we know all the entries for the same
9191   literal will be contiguous.  */
9192
9193static bool
9194relocations_reach (source_reloc *reloc,
9195		   int remaining_relocs,
9196		   const r_reloc *r_rel)
9197{
9198  bfd_vma from_offset, source_address, dest_address;
9199  asection *sec;
9200  int i;
9201
9202  if (!r_reloc_is_defined (r_rel))
9203    return false;
9204
9205  sec = r_reloc_get_section (r_rel);
9206  from_offset = reloc[0].r_rel.target_offset;
9207
9208  for (i = 0; i < remaining_relocs; i++)
9209    {
9210      if (reloc[i].r_rel.target_offset != from_offset)
9211	break;
9212
9213      /* Ignore relocations that have been removed.  */
9214      if (reloc[i].is_null)
9215	continue;
9216
9217      /* The original and new output section for these must be the same
9218	 in order to coalesce.  */
9219      if (r_reloc_get_section (&reloc[i].r_rel)->output_section
9220	  != sec->output_section)
9221	return false;
9222
9223      /* Absolute literals in the same output section can always be
9224	 combined.  */
9225      if (reloc[i].is_abs_literal)
9226	continue;
9227
9228      /* A literal with no PC-relative relocations can be moved anywhere.  */
9229      if (reloc[i].opnd != -1)
9230	{
9231	  /* Otherwise, check to see that it fits.  */
9232	  source_address = (reloc[i].source_sec->output_section->vma
9233			    + reloc[i].source_sec->output_offset
9234			    + reloc[i].r_rel.rela.r_offset);
9235	  dest_address = (sec->output_section->vma
9236			  + sec->output_offset
9237			  + r_rel->target_offset);
9238
9239	  if (!pcrel_reloc_fits (reloc[i].opcode, reloc[i].opnd,
9240				 source_address, dest_address))
9241	    return false;
9242	}
9243    }
9244
9245  return true;
9246}
9247
9248
9249/* Move a literal to another literal location because it is
9250   the same as the other literal value.  */
9251
9252static bool
9253coalesce_shared_literal (asection *sec,
9254			 source_reloc *rel,
9255			 property_table_entry *prop_table,
9256			 int ptblsize,
9257			 value_map *val_map)
9258{
9259  property_table_entry *entry;
9260  text_action *fa;
9261  property_table_entry *the_add_entry;
9262  int removed_diff;
9263  xtensa_relax_info *relax_info;
9264
9265  relax_info = get_xtensa_relax_info (sec);
9266  if (!relax_info)
9267    return false;
9268
9269  entry = elf_xtensa_find_property_entry
9270    (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9271  if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
9272    return true;
9273
9274  /* Mark that the literal will be coalesced.  */
9275  add_removed_literal (&relax_info->removed_list, &rel->r_rel, &val_map->loc);
9276
9277  text_action_add (&relax_info->action_list,
9278		   ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9279
9280  /* If the section is 4-byte aligned, do not add fill.  */
9281  if (sec->alignment_power > 2)
9282    {
9283      int fill_extra_space;
9284      bfd_vma entry_sec_offset;
9285
9286      if (entry)
9287	entry_sec_offset = entry->address - sec->vma + entry->size;
9288      else
9289	entry_sec_offset = rel->r_rel.target_offset + 4;
9290
9291      /* If the literal range is at the end of the section,
9292	 do not add fill.  */
9293      fill_extra_space = 0;
9294      the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9295						      entry_sec_offset);
9296      if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9297	fill_extra_space = the_add_entry->size;
9298
9299      fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9300      removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9301						  -4, fill_extra_space);
9302      if (fa)
9303	adjust_fill_action (fa, removed_diff);
9304      else
9305	text_action_add (&relax_info->action_list,
9306			 ta_fill, sec, entry_sec_offset, removed_diff);
9307    }
9308
9309  return true;
9310}
9311
9312
9313/* Move a literal to another location.  This may actually increase the
9314   total amount of space used because of alignments so we need to do
9315   this carefully.  Also, it may make a branch go out of range.  */
9316
9317static bool
9318move_shared_literal (asection *sec,
9319		     struct bfd_link_info *link_info,
9320		     source_reloc *rel,
9321		     property_table_entry *prop_table,
9322		     int ptblsize,
9323		     const r_reloc *target_loc,
9324		     const literal_value *lit_value,
9325		     section_cache_t *target_sec_cache)
9326{
9327  property_table_entry *the_add_entry, *src_entry, *target_entry = NULL;
9328  text_action *fa, *target_fa;
9329  int removed_diff;
9330  xtensa_relax_info *relax_info, *target_relax_info;
9331  asection *target_sec;
9332  ebb_t *ebb;
9333  ebb_constraint ebb_table;
9334  bool relocs_fit;
9335
9336  /* If this routine always returns FALSE, the literals that cannot be
9337     coalesced will not be moved.  */
9338  if (elf32xtensa_no_literal_movement)
9339    return false;
9340
9341  relax_info = get_xtensa_relax_info (sec);
9342  if (!relax_info)
9343    return false;
9344
9345  target_sec = r_reloc_get_section (target_loc);
9346  target_relax_info = get_xtensa_relax_info (target_sec);
9347
9348  /* Literals to undefined sections may not be moved because they
9349     must report an error.  */
9350  if (bfd_is_und_section (target_sec))
9351    return false;
9352
9353  src_entry = elf_xtensa_find_property_entry
9354    (prop_table, ptblsize, sec->vma + rel->r_rel.target_offset);
9355
9356  if (!section_cache_section (target_sec_cache, target_sec, link_info))
9357    return false;
9358
9359  target_entry = elf_xtensa_find_property_entry
9360    (target_sec_cache->ptbl, target_sec_cache->pte_count,
9361     target_sec->vma + target_loc->target_offset);
9362
9363  if (!target_entry)
9364    return false;
9365
9366  /* Make sure that we have not broken any branches.  */
9367  relocs_fit = false;
9368
9369  init_ebb_constraint (&ebb_table);
9370  ebb = &ebb_table.ebb;
9371  init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
9372	    target_sec_cache->content_length,
9373	    target_sec_cache->ptbl, target_sec_cache->pte_count,
9374	    target_sec_cache->relocs, target_sec_cache->reloc_count);
9375
9376  /* Propose to add 4 bytes + worst-case alignment size increase to
9377     destination.  */
9378  ebb_propose_action (&ebb_table, EBB_NO_ALIGN, 0,
9379		      ta_fill, target_loc->target_offset,
9380		      -4 - (1 << target_sec->alignment_power), true);
9381
9382  /* Check all of the PC-relative relocations to make sure they still fit.  */
9383  relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
9384					     target_sec_cache->contents,
9385					     target_sec_cache->relocs, NULL,
9386					     &ebb_table, NULL);
9387
9388  if (!relocs_fit)
9389    return false;
9390
9391  text_action_add_literal (&target_relax_info->action_list,
9392			   ta_add_literal, target_loc, lit_value, -4);
9393
9394  if (target_sec->alignment_power > 2 && target_entry != src_entry)
9395    {
9396      /* May need to add or remove some fill to maintain alignment.  */
9397      int fill_extra_space;
9398      bfd_vma entry_sec_offset;
9399
9400      entry_sec_offset =
9401	target_entry->address - target_sec->vma + target_entry->size;
9402
9403      /* If the literal range is at the end of the section,
9404	 do not add fill.  */
9405      fill_extra_space = 0;
9406      the_add_entry =
9407	elf_xtensa_find_property_entry (target_sec_cache->ptbl,
9408					target_sec_cache->pte_count,
9409					entry_sec_offset);
9410      if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9411	fill_extra_space = the_add_entry->size;
9412
9413      target_fa = find_fill_action (&target_relax_info->action_list,
9414				    target_sec, entry_sec_offset);
9415      removed_diff = compute_removed_action_diff (target_fa, target_sec,
9416						  entry_sec_offset, 4,
9417						  fill_extra_space);
9418      if (target_fa)
9419	adjust_fill_action (target_fa, removed_diff);
9420      else
9421	text_action_add (&target_relax_info->action_list,
9422			 ta_fill, target_sec, entry_sec_offset, removed_diff);
9423    }
9424
9425  /* Mark that the literal will be moved to the new location.  */
9426  add_removed_literal (&relax_info->removed_list, &rel->r_rel, target_loc);
9427
9428  /* Remove the literal.  */
9429  text_action_add (&relax_info->action_list,
9430		   ta_remove_literal, sec, rel->r_rel.target_offset, 4);
9431
9432  /* If the section is 4-byte aligned, do not add fill.  */
9433  if (sec->alignment_power > 2 && target_entry != src_entry)
9434    {
9435      int fill_extra_space;
9436      bfd_vma entry_sec_offset;
9437
9438      if (src_entry)
9439	entry_sec_offset = src_entry->address - sec->vma + src_entry->size;
9440      else
9441	entry_sec_offset = rel->r_rel.target_offset+4;
9442
9443      /* If the literal range is at the end of the section,
9444	 do not add fill.  */
9445      fill_extra_space = 0;
9446      the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
9447						      entry_sec_offset);
9448      if (the_add_entry && (the_add_entry->flags & XTENSA_PROP_UNREACHABLE))
9449	fill_extra_space = the_add_entry->size;
9450
9451      fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset);
9452      removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset,
9453						  -4, fill_extra_space);
9454      if (fa)
9455	adjust_fill_action (fa, removed_diff);
9456      else
9457	text_action_add (&relax_info->action_list,
9458			 ta_fill, sec, entry_sec_offset, removed_diff);
9459    }
9460
9461  return true;
9462}
9463
9464
9465/* Second relaxation pass.  */
9466
9467static int
9468action_remove_bytes_fn (splay_tree_node node, void *p)
9469{
9470  bfd_size_type *final_size = p;
9471  text_action *action = (text_action *)node->value;
9472
9473  *final_size -= action->removed_bytes;
9474  return 0;
9475}
9476
9477/* Modify all of the relocations to point to the right spot, and if this
9478   is a relaxable section, delete the unwanted literals and fix the
9479   section size.  */
9480
9481bool
9482relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
9483{
9484  Elf_Internal_Rela *internal_relocs;
9485  xtensa_relax_info *relax_info;
9486  bfd_byte *contents;
9487  bool ok = true;
9488  unsigned i;
9489  bool rv = false;
9490  bool virtual_action;
9491  bfd_size_type sec_size;
9492
9493  sec_size = bfd_get_section_limit (abfd, sec);
9494  relax_info = get_xtensa_relax_info (sec);
9495  BFD_ASSERT (relax_info);
9496
9497  /* First translate any of the fixes that have been added already.  */
9498  translate_section_fixes (sec);
9499
9500  /* Handle property sections (e.g., literal tables) specially.  */
9501  if (xtensa_is_property_section (sec))
9502    {
9503      BFD_ASSERT (!relax_info->is_relaxable_literal_section);
9504      return relax_property_section (abfd, sec, link_info);
9505    }
9506
9507  internal_relocs = retrieve_internal_relocs (abfd, sec,
9508					      link_info->keep_memory);
9509  if (!internal_relocs && !action_list_count (&relax_info->action_list))
9510    return true;
9511
9512  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
9513  if (contents == NULL && sec_size != 0)
9514    {
9515      ok = false;
9516      goto error_return;
9517    }
9518
9519  if (internal_relocs)
9520    {
9521      for (i = 0; i < sec->reloc_count; i++)
9522	{
9523	  Elf_Internal_Rela *irel;
9524	  xtensa_relax_info *target_relax_info;
9525	  bfd_vma source_offset, old_source_offset;
9526	  r_reloc r_rel;
9527	  unsigned r_type;
9528	  asection *target_sec;
9529
9530	  /* Locally change the source address.
9531	     Translate the target to the new target address.
9532	     If it points to this section and has been removed,
9533	     NULLify it.
9534	     Write it back.  */
9535
9536	  irel = &internal_relocs[i];
9537	  source_offset = irel->r_offset;
9538	  old_source_offset = source_offset;
9539
9540	  r_type = ELF32_R_TYPE (irel->r_info);
9541	  r_reloc_init (&r_rel, abfd, irel, contents,
9542			bfd_get_section_limit (abfd, sec));
9543
9544	  /* If this section could have changed then we may need to
9545	     change the relocation's offset.  */
9546
9547	  if (relax_info->is_relaxable_literal_section
9548	      || relax_info->is_relaxable_asm_section)
9549	    {
9550	      pin_internal_relocs (sec, internal_relocs);
9551
9552	      if (r_type != R_XTENSA_NONE
9553		  && find_removed_literal (&relax_info->removed_list,
9554					   irel->r_offset))
9555		{
9556		  /* Remove this relocation.  */
9557		  if (elf_hash_table (link_info)->dynamic_sections_created)
9558		    shrink_dynamic_reloc_sections (link_info, abfd, sec, irel);
9559		  irel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
9560		  irel->r_offset = offset_with_removed_text_map
9561		    (&relax_info->action_list, irel->r_offset);
9562		  continue;
9563		}
9564
9565	      if (r_type == R_XTENSA_ASM_SIMPLIFY)
9566		{
9567		  text_action *action =
9568		    find_insn_action (&relax_info->action_list,
9569				      irel->r_offset);
9570		  if (action && (action->action == ta_convert_longcall
9571				 || action->action == ta_remove_longcall))
9572		    {
9573		      bfd_reloc_status_type retval;
9574		      char *error_message = NULL;
9575
9576		      retval = contract_asm_expansion (contents, sec_size,
9577						       irel, &error_message);
9578		      if (retval != bfd_reloc_ok)
9579			{
9580			  (*link_info->callbacks->reloc_dangerous)
9581			    (link_info, error_message, abfd, sec,
9582			     irel->r_offset);
9583			  goto error_return;
9584			}
9585		      /* Update the action so that the code that moves
9586			 the contents will do the right thing.  */
9587		      /* ta_remove_longcall and ta_remove_insn actions are
9588			 grouped together in the tree as well as
9589			 ta_convert_longcall and ta_none, so that changes below
9590			 can be done w/o removing and reinserting action into
9591			 the tree.  */
9592
9593		      if (action->action == ta_remove_longcall)
9594			action->action = ta_remove_insn;
9595		      else
9596			action->action = ta_none;
9597		      /* Refresh the info in the r_rel.  */
9598		      r_reloc_init (&r_rel, abfd, irel, contents, sec_size);
9599		      r_type = ELF32_R_TYPE (irel->r_info);
9600		    }
9601		}
9602
9603	      source_offset = offset_with_removed_text_map
9604		(&relax_info->action_list, irel->r_offset);
9605	      irel->r_offset = source_offset;
9606	    }
9607
9608	  /* If the target section could have changed then
9609	     we may need to change the relocation's target offset.  */
9610
9611	  target_sec = r_reloc_get_section (&r_rel);
9612
9613	  /* For a reference to a discarded section from a DWARF section,
9614	     i.e., where action_discarded is PRETEND, the symbol will
9615	     eventually be modified to refer to the kept section (at least if
9616	     the kept and discarded sections are the same size).  Anticipate
9617	     that here and adjust things accordingly.  */
9618	  if (! elf_xtensa_ignore_discarded_relocs (sec)
9619	      && elf_xtensa_action_discarded (sec) == PRETEND
9620	      && sec->sec_info_type != SEC_INFO_TYPE_STABS
9621	      && target_sec != NULL
9622	      && discarded_section (target_sec))
9623	    {
9624	      /* It would be natural to call _bfd_elf_check_kept_section
9625		 here, but it's not exported from elflink.c.  It's also a
9626		 fairly expensive check.  Adjusting the relocations to the
9627		 discarded section is fairly harmless; it will only adjust
9628		 some addends and difference values.  If it turns out that
9629		 _bfd_elf_check_kept_section fails later, it won't matter,
9630		 so just compare the section names to find the right group
9631		 member.  */
9632	      asection *kept = target_sec->kept_section;
9633	      if (kept != NULL)
9634		{
9635		  if ((kept->flags & SEC_GROUP) != 0)
9636		    {
9637		      asection *first = elf_next_in_group (kept);
9638		      asection *s = first;
9639
9640		      kept = NULL;
9641		      while (s != NULL)
9642			{
9643			  if (strcmp (s->name, target_sec->name) == 0)
9644			    {
9645			      kept = s;
9646			      break;
9647			    }
9648			  s = elf_next_in_group (s);
9649			  if (s == first)
9650			    break;
9651			}
9652		    }
9653		}
9654	      if (kept != NULL
9655		  && ((target_sec->rawsize != 0
9656		       ? target_sec->rawsize : target_sec->size)
9657		      == (kept->rawsize != 0 ? kept->rawsize : kept->size)))
9658		target_sec = kept;
9659	    }
9660
9661	  target_relax_info = get_xtensa_relax_info (target_sec);
9662	  if (target_relax_info
9663	      && (target_relax_info->is_relaxable_literal_section
9664		  || target_relax_info->is_relaxable_asm_section))
9665	    {
9666	      r_reloc new_reloc;
9667	      target_sec = translate_reloc (&r_rel, &new_reloc, target_sec);
9668
9669	      if (r_type == R_XTENSA_DIFF8
9670		  || r_type == R_XTENSA_DIFF16
9671		  || r_type == R_XTENSA_DIFF32
9672		  || r_type == R_XTENSA_PDIFF8
9673		  || r_type == R_XTENSA_PDIFF16
9674		  || r_type == R_XTENSA_PDIFF32
9675		  || r_type == R_XTENSA_NDIFF8
9676		  || r_type == R_XTENSA_NDIFF16
9677		  || r_type == R_XTENSA_NDIFF32)
9678		{
9679		  bfd_signed_vma diff_value = 0;
9680		  bfd_vma new_end_offset, diff_mask = 0;
9681
9682		  if (bfd_get_section_limit (abfd, sec) < old_source_offset)
9683		    {
9684		      (*link_info->callbacks->reloc_dangerous)
9685			(link_info, _("invalid relocation address"),
9686			 abfd, sec, old_source_offset);
9687		      goto error_return;
9688		    }
9689
9690		  switch (r_type)
9691		    {
9692		    case R_XTENSA_DIFF8:
9693		      diff_mask = 0x7f;
9694		      diff_value =
9695			bfd_get_signed_8 (abfd, &contents[old_source_offset]);
9696		      break;
9697		    case R_XTENSA_DIFF16:
9698		      diff_mask = 0x7fff;
9699		      diff_value =
9700			bfd_get_signed_16 (abfd, &contents[old_source_offset]);
9701		      break;
9702		    case R_XTENSA_DIFF32:
9703		      diff_mask = 0x7fffffff;
9704		      diff_value =
9705			bfd_get_signed_32 (abfd, &contents[old_source_offset]);
9706		      break;
9707		    case R_XTENSA_PDIFF8:
9708		    case R_XTENSA_NDIFF8:
9709		      diff_mask = 0xff;
9710		      diff_value =
9711			bfd_get_8 (abfd, &contents[old_source_offset]);
9712		      break;
9713		    case R_XTENSA_PDIFF16:
9714		    case R_XTENSA_NDIFF16:
9715		      diff_mask = 0xffff;
9716		      diff_value =
9717			bfd_get_16 (abfd, &contents[old_source_offset]);
9718		      break;
9719		    case R_XTENSA_PDIFF32:
9720		    case R_XTENSA_NDIFF32:
9721		      diff_mask = 0xffffffff;
9722		      diff_value =
9723			bfd_get_32 (abfd, &contents[old_source_offset]);
9724		      break;
9725		    }
9726
9727		  if (r_type >= R_XTENSA_NDIFF8
9728		      && r_type <= R_XTENSA_NDIFF32
9729		      && diff_value)
9730		    diff_value |= ~diff_mask;
9731
9732		  new_end_offset = offset_with_removed_text_map
9733		    (&target_relax_info->action_list,
9734		     r_rel.target_offset + diff_value);
9735		  diff_value = new_end_offset - new_reloc.target_offset;
9736
9737		  switch (r_type)
9738		    {
9739		    case R_XTENSA_DIFF8:
9740		      bfd_put_signed_8 (abfd, diff_value,
9741				 &contents[old_source_offset]);
9742		      break;
9743		    case R_XTENSA_DIFF16:
9744		      bfd_put_signed_16 (abfd, diff_value,
9745				  &contents[old_source_offset]);
9746		      break;
9747		    case R_XTENSA_DIFF32:
9748		      bfd_put_signed_32 (abfd, diff_value,
9749				  &contents[old_source_offset]);
9750		      break;
9751		    case R_XTENSA_PDIFF8:
9752		    case R_XTENSA_NDIFF8:
9753		      bfd_put_8 (abfd, diff_value,
9754				 &contents[old_source_offset]);
9755		      break;
9756		    case R_XTENSA_PDIFF16:
9757		    case R_XTENSA_NDIFF16:
9758		      bfd_put_16 (abfd, diff_value,
9759				  &contents[old_source_offset]);
9760		      break;
9761		    case R_XTENSA_PDIFF32:
9762		    case R_XTENSA_NDIFF32:
9763		      bfd_put_32 (abfd, diff_value,
9764				  &contents[old_source_offset]);
9765		      break;
9766		    }
9767
9768		  /* Check for overflow. Sign bits must be all zeroes or
9769		     all ones.  When sign bits are all ones diff_value
9770		     may not be zero.  */
9771		  if (((diff_value & ~diff_mask) != 0
9772		       && (diff_value & ~diff_mask) != ~diff_mask)
9773		      || (diff_value && (bfd_vma) diff_value == ~diff_mask))
9774		    {
9775		      (*link_info->callbacks->reloc_dangerous)
9776			(link_info, _("overflow after relaxation"),
9777			 abfd, sec, old_source_offset);
9778		      goto error_return;
9779		    }
9780
9781		  pin_contents (sec, contents);
9782		}
9783
9784	      /* If the relocation still references a section in the same
9785		 input file, modify the relocation directly instead of
9786		 adding a "fix" record.  */
9787	      if (target_sec->owner == abfd)
9788		{
9789		  unsigned r_symndx = ELF32_R_SYM (new_reloc.rela.r_info);
9790		  irel->r_info = ELF32_R_INFO (r_symndx, r_type);
9791		  irel->r_addend = new_reloc.rela.r_addend;
9792		  pin_internal_relocs (sec, internal_relocs);
9793		}
9794	      else
9795		{
9796		  bfd_vma addend_displacement;
9797		  reloc_bfd_fix *fix;
9798
9799		  addend_displacement =
9800		    new_reloc.target_offset + new_reloc.virtual_offset;
9801		  fix = reloc_bfd_fix_init (sec, source_offset, r_type,
9802					    target_sec,
9803					    addend_displacement, true);
9804		  add_fix (sec, fix);
9805		}
9806	    }
9807	}
9808    }
9809
9810  if ((relax_info->is_relaxable_literal_section
9811       || relax_info->is_relaxable_asm_section)
9812      && action_list_count (&relax_info->action_list))
9813    {
9814      /* Walk through the planned actions and build up a table
9815	 of move, copy and fill records.  Use the move, copy and
9816	 fill records to perform the actions once.  */
9817
9818      bfd_size_type final_size, copy_size, orig_insn_size;
9819      bfd_byte *scratch = NULL;
9820      bfd_byte *dup_contents = NULL;
9821      bfd_size_type orig_size = sec->size;
9822      bfd_vma orig_dot = 0;
9823      bfd_vma orig_dot_copied = 0; /* Byte copied already from
9824					    orig dot in physical memory.  */
9825      bfd_vma orig_dot_vo = 0; /* Virtual offset from orig_dot.  */
9826      bfd_vma dup_dot = 0;
9827
9828      text_action *action;
9829
9830      final_size = sec->size;
9831
9832      splay_tree_foreach (relax_info->action_list.tree,
9833			  action_remove_bytes_fn, &final_size);
9834      scratch = (bfd_byte *) bfd_zmalloc (final_size);
9835      dup_contents = (bfd_byte *) bfd_zmalloc (final_size);
9836
9837      /* The dot is the current fill location.  */
9838#if DEBUG
9839      print_action_list (stderr, &relax_info->action_list);
9840#endif
9841
9842      for (action = action_first (&relax_info->action_list); action;
9843	   action = action_next (&relax_info->action_list, action))
9844	{
9845	  virtual_action = false;
9846	  if (action->offset > orig_dot)
9847	    {
9848	      orig_dot += orig_dot_copied;
9849	      orig_dot_copied = 0;
9850	      orig_dot_vo = 0;
9851	      /* Out of the virtual world.  */
9852	    }
9853
9854	  if (action->offset > orig_dot)
9855	    {
9856	      copy_size = action->offset - orig_dot;
9857	      memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9858	      orig_dot += copy_size;
9859	      dup_dot += copy_size;
9860	      BFD_ASSERT (action->offset == orig_dot);
9861	    }
9862	  else if (action->offset < orig_dot)
9863	    {
9864	      if (action->action == ta_fill
9865		  && action->offset - action->removed_bytes == orig_dot)
9866		{
9867		  /* This is OK because the fill only effects the dup_dot.  */
9868		}
9869	      else if (action->action == ta_add_literal)
9870		{
9871		  /* TBD.  Might need to handle this.  */
9872		}
9873	    }
9874	  if (action->offset == orig_dot)
9875	    {
9876	      if (action->virtual_offset > orig_dot_vo)
9877		{
9878		  if (orig_dot_vo == 0)
9879		    {
9880		      /* Need to copy virtual_offset bytes.  Probably four.  */
9881		      copy_size = action->virtual_offset - orig_dot_vo;
9882		      memmove (&dup_contents[dup_dot],
9883			       &contents[orig_dot], copy_size);
9884		      orig_dot_copied = copy_size;
9885		      dup_dot += copy_size;
9886		    }
9887		  virtual_action = true;
9888		}
9889	      else
9890		BFD_ASSERT (action->virtual_offset <= orig_dot_vo);
9891	    }
9892	  switch (action->action)
9893	    {
9894	    case ta_remove_literal:
9895	    case ta_remove_insn:
9896	      BFD_ASSERT (action->removed_bytes >= 0);
9897	      orig_dot += action->removed_bytes;
9898	      break;
9899
9900	    case ta_narrow_insn:
9901	      orig_insn_size = 3;
9902	      copy_size = 2;
9903	      memmove (scratch, &contents[orig_dot], orig_insn_size);
9904	      BFD_ASSERT (action->removed_bytes == 1);
9905	      rv = narrow_instruction (scratch, final_size, 0);
9906	      BFD_ASSERT (rv);
9907	      memmove (&dup_contents[dup_dot], scratch, copy_size);
9908	      orig_dot += orig_insn_size;
9909	      dup_dot += copy_size;
9910	      break;
9911
9912	    case ta_fill:
9913	      if (action->removed_bytes >= 0)
9914		orig_dot += action->removed_bytes;
9915	      else
9916		{
9917		  /* Already zeroed in dup_contents.  Just bump the
9918		     counters.  */
9919		  dup_dot += (-action->removed_bytes);
9920		}
9921	      break;
9922
9923	    case ta_none:
9924	      BFD_ASSERT (action->removed_bytes == 0);
9925	      break;
9926
9927	    case ta_convert_longcall:
9928	    case ta_remove_longcall:
9929	      /* These will be removed or converted before we get here.  */
9930	      BFD_ASSERT (0);
9931	      break;
9932
9933	    case ta_widen_insn:
9934	      orig_insn_size = 2;
9935	      copy_size = 3;
9936	      memmove (scratch, &contents[orig_dot], orig_insn_size);
9937	      BFD_ASSERT (action->removed_bytes == -1);
9938	      rv = widen_instruction (scratch, final_size, 0);
9939	      BFD_ASSERT (rv);
9940	      memmove (&dup_contents[dup_dot], scratch, copy_size);
9941	      orig_dot += orig_insn_size;
9942	      dup_dot += copy_size;
9943	      break;
9944
9945	    case ta_add_literal:
9946	      orig_insn_size = 0;
9947	      copy_size = 4;
9948	      BFD_ASSERT (action->removed_bytes == -4);
9949	      /* TBD -- place the literal value here and insert
9950		 into the table.  */
9951	      memset (&dup_contents[dup_dot], 0, 4);
9952	      pin_internal_relocs (sec, internal_relocs);
9953	      pin_contents (sec, contents);
9954
9955	      if (!move_literal (abfd, link_info, sec, dup_dot, dup_contents,
9956				 relax_info, &internal_relocs, &action->value))
9957		goto error_return;
9958
9959	      if (virtual_action)
9960		orig_dot_vo += copy_size;
9961
9962	      orig_dot += orig_insn_size;
9963	      dup_dot += copy_size;
9964	      break;
9965
9966	    default:
9967	      /* Not implemented yet.  */
9968	      BFD_ASSERT (0);
9969	      break;
9970	    }
9971
9972	  BFD_ASSERT (dup_dot <= final_size);
9973	  BFD_ASSERT (orig_dot <= orig_size);
9974	}
9975
9976      orig_dot += orig_dot_copied;
9977      orig_dot_copied = 0;
9978
9979      if (orig_dot != orig_size)
9980	{
9981	  copy_size = orig_size - orig_dot;
9982	  BFD_ASSERT (orig_size > orig_dot);
9983	  BFD_ASSERT (dup_dot + copy_size == final_size);
9984	  memmove (&dup_contents[dup_dot], &contents[orig_dot], copy_size);
9985	  orig_dot += copy_size;
9986	  dup_dot += copy_size;
9987	}
9988      BFD_ASSERT (orig_size == orig_dot);
9989      BFD_ASSERT (final_size == dup_dot);
9990
9991      /* Move the dup_contents back.  */
9992      if (final_size > orig_size)
9993	{
9994	  /* Contents need to be reallocated.  Swap the dup_contents into
9995	     contents.  */
9996	  sec->contents = dup_contents;
9997	  free (contents);
9998	  contents = dup_contents;
9999	  pin_contents (sec, contents);
10000	}
10001      else
10002	{
10003	  BFD_ASSERT (final_size <= orig_size);
10004	  memset (contents, 0, orig_size);
10005	  memcpy (contents, dup_contents, final_size);
10006	  free (dup_contents);
10007	}
10008      free (scratch);
10009      pin_contents (sec, contents);
10010
10011      if (sec->rawsize == 0)
10012	sec->rawsize = sec->size;
10013      sec->size = final_size;
10014    }
10015
10016 error_return:
10017  release_internal_relocs (sec, internal_relocs);
10018  release_contents (sec, contents);
10019  return ok;
10020}
10021
10022
10023static bool
10024translate_section_fixes (asection *sec)
10025{
10026  xtensa_relax_info *relax_info;
10027  reloc_bfd_fix *r;
10028
10029  relax_info = get_xtensa_relax_info (sec);
10030  if (!relax_info)
10031    return true;
10032
10033  for (r = relax_info->fix_list; r != NULL; r = r->next)
10034    if (!translate_reloc_bfd_fix (r))
10035      return false;
10036
10037  return true;
10038}
10039
10040
10041/* Translate a fix given the mapping in the relax info for the target
10042   section.  If it has already been translated, no work is required.  */
10043
10044static bool
10045translate_reloc_bfd_fix (reloc_bfd_fix *fix)
10046{
10047  reloc_bfd_fix new_fix;
10048  asection *sec;
10049  xtensa_relax_info *relax_info;
10050  removed_literal *removed;
10051  bfd_vma new_offset, target_offset;
10052
10053  if (fix->translated)
10054    return true;
10055
10056  sec = fix->target_sec;
10057  target_offset = fix->target_offset;
10058
10059  relax_info = get_xtensa_relax_info (sec);
10060  if (!relax_info)
10061    {
10062      fix->translated = true;
10063      return true;
10064    }
10065
10066  new_fix = *fix;
10067
10068  /* The fix does not need to be translated if the section cannot change.  */
10069  if (!relax_info->is_relaxable_literal_section
10070      && !relax_info->is_relaxable_asm_section)
10071    {
10072      fix->translated = true;
10073      return true;
10074    }
10075
10076  /* If the literal has been moved and this relocation was on an
10077     opcode, then the relocation should move to the new literal
10078     location.  Otherwise, the relocation should move within the
10079     section.  */
10080
10081  removed = false;
10082  if (is_operand_relocation (fix->src_type))
10083    {
10084      /* Check if the original relocation is against a literal being
10085	 removed.  */
10086      removed = find_removed_literal (&relax_info->removed_list,
10087				      target_offset);
10088    }
10089
10090  if (removed)
10091    {
10092      asection *new_sec;
10093
10094      /* The fact that there is still a relocation to this literal indicates
10095	 that the literal is being coalesced, not simply removed.  */
10096      BFD_ASSERT (removed->to.abfd != NULL);
10097
10098      /* This was moved to some other address (possibly another section).  */
10099      new_sec = r_reloc_get_section (&removed->to);
10100      if (new_sec != sec)
10101	{
10102	  sec = new_sec;
10103	  relax_info = get_xtensa_relax_info (sec);
10104	  if (!relax_info ||
10105	      (!relax_info->is_relaxable_literal_section
10106	       && !relax_info->is_relaxable_asm_section))
10107	    {
10108	      target_offset = removed->to.target_offset;
10109	      new_fix.target_sec = new_sec;
10110	      new_fix.target_offset = target_offset;
10111	      new_fix.translated = true;
10112	      *fix = new_fix;
10113	      return true;
10114	    }
10115	}
10116      target_offset = removed->to.target_offset;
10117      new_fix.target_sec = new_sec;
10118    }
10119
10120  /* The target address may have been moved within its section.  */
10121  new_offset = offset_with_removed_text (&relax_info->action_list,
10122					 target_offset);
10123
10124  new_fix.target_offset = new_offset;
10125  new_fix.target_offset = new_offset;
10126  new_fix.translated = true;
10127  *fix = new_fix;
10128  return true;
10129}
10130
10131
10132/* Fix up a relocation to take account of removed literals.  */
10133
10134static asection *
10135translate_reloc (const r_reloc *orig_rel, r_reloc *new_rel, asection *sec)
10136{
10137  xtensa_relax_info *relax_info;
10138  removed_literal *removed;
10139  bfd_vma target_offset, base_offset;
10140
10141  *new_rel = *orig_rel;
10142
10143  if (!r_reloc_is_defined (orig_rel))
10144    return sec ;
10145
10146  relax_info = get_xtensa_relax_info (sec);
10147  BFD_ASSERT (relax_info && (relax_info->is_relaxable_literal_section
10148			     || relax_info->is_relaxable_asm_section));
10149
10150  target_offset = orig_rel->target_offset;
10151
10152  removed = false;
10153  if (is_operand_relocation (ELF32_R_TYPE (orig_rel->rela.r_info)))
10154    {
10155      /* Check if the original relocation is against a literal being
10156	 removed.  */
10157      removed = find_removed_literal (&relax_info->removed_list,
10158				      target_offset);
10159    }
10160  if (removed && removed->to.abfd)
10161    {
10162      asection *new_sec;
10163
10164      /* The fact that there is still a relocation to this literal indicates
10165	 that the literal is being coalesced, not simply removed.  */
10166      BFD_ASSERT (removed->to.abfd != NULL);
10167
10168      /* This was moved to some other address
10169	 (possibly in another section).  */
10170      *new_rel = removed->to;
10171      new_sec = r_reloc_get_section (new_rel);
10172      if (new_sec != sec)
10173	{
10174	  sec = new_sec;
10175	  relax_info = get_xtensa_relax_info (sec);
10176	  if (!relax_info
10177	      || (!relax_info->is_relaxable_literal_section
10178		  && !relax_info->is_relaxable_asm_section))
10179	    return sec;
10180	}
10181      target_offset = new_rel->target_offset;
10182    }
10183
10184  /* Find the base offset of the reloc symbol, excluding any addend from the
10185     reloc or from the section contents (for a partial_inplace reloc).  Then
10186     find the adjusted values of the offsets due to relaxation.  The base
10187     offset is needed to determine the change to the reloc's addend; the reloc
10188     addend should not be adjusted due to relaxations located before the base
10189     offset.  */
10190
10191  base_offset = r_reloc_get_target_offset (new_rel) - new_rel->rela.r_addend;
10192  if (base_offset <= target_offset)
10193    {
10194      int base_removed = removed_by_actions_map (&relax_info->action_list,
10195						 base_offset, false);
10196      int addend_removed = removed_by_actions_map (&relax_info->action_list,
10197						   target_offset, false) -
10198	base_removed;
10199
10200      new_rel->target_offset = target_offset - base_removed - addend_removed;
10201      new_rel->rela.r_addend -= addend_removed;
10202    }
10203  else
10204    {
10205      /* Handle a negative addend.  The base offset comes first.  */
10206      int tgt_removed = removed_by_actions_map (&relax_info->action_list,
10207						target_offset, false);
10208      int addend_removed = removed_by_actions_map (&relax_info->action_list,
10209						   base_offset, false) -
10210	tgt_removed;
10211
10212      new_rel->target_offset = target_offset - tgt_removed;
10213      new_rel->rela.r_addend += addend_removed;
10214    }
10215
10216  return sec;
10217}
10218
10219
10220/* For dynamic links, there may be a dynamic relocation for each
10221   literal.  The number of dynamic relocations must be computed in
10222   size_dynamic_sections, which occurs before relaxation.  When a
10223   literal is removed, this function checks if there is a corresponding
10224   dynamic relocation and shrinks the size of the appropriate dynamic
10225   relocation section accordingly.  At this point, the contents of the
10226   dynamic relocation sections have not yet been filled in, so there's
10227   nothing else that needs to be done.  */
10228
10229static void
10230shrink_dynamic_reloc_sections (struct bfd_link_info *info,
10231			       bfd *abfd,
10232			       asection *input_section,
10233			       Elf_Internal_Rela *rel)
10234{
10235  struct elf_xtensa_link_hash_table *htab;
10236  Elf_Internal_Shdr *symtab_hdr;
10237  struct elf_link_hash_entry **sym_hashes;
10238  unsigned long r_symndx;
10239  int r_type;
10240  struct elf_link_hash_entry *h;
10241  bool dynamic_symbol;
10242
10243  htab = elf_xtensa_hash_table (info);
10244  if (htab == NULL)
10245    return;
10246
10247  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10248  sym_hashes = elf_sym_hashes (abfd);
10249
10250  r_type = ELF32_R_TYPE (rel->r_info);
10251  r_symndx = ELF32_R_SYM (rel->r_info);
10252
10253  if (r_symndx < symtab_hdr->sh_info)
10254    h = NULL;
10255  else
10256    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
10257
10258  dynamic_symbol = elf_xtensa_dynamic_symbol_p (h, info);
10259
10260  if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
10261      && (input_section->flags & SEC_ALLOC) != 0
10262      && (dynamic_symbol
10263	  || (bfd_link_pic (info)
10264	      && (!h || h->root.type != bfd_link_hash_undefweak))))
10265    {
10266      asection *srel;
10267      bool is_plt = false;
10268
10269      if (dynamic_symbol && r_type == R_XTENSA_PLT)
10270	{
10271	  srel = htab->elf.srelplt;
10272	  is_plt = true;
10273	}
10274      else
10275	srel = htab->elf.srelgot;
10276
10277      /* Reduce size of the .rela.* section by one reloc.  */
10278      BFD_ASSERT (srel != NULL);
10279      BFD_ASSERT (srel->size >= sizeof (Elf32_External_Rela));
10280      srel->size -= sizeof (Elf32_External_Rela);
10281
10282      if (is_plt)
10283	{
10284	  asection *splt, *sgotplt, *srelgot;
10285	  int reloc_index, chunk;
10286
10287	  /* Find the PLT reloc index of the entry being removed.  This
10288	     is computed from the size of ".rela.plt".  It is needed to
10289	     figure out which PLT chunk to resize.  Usually "last index
10290	     = size - 1" since the index starts at zero, but in this
10291	     context, the size has just been decremented so there's no
10292	     need to subtract one.  */
10293	  reloc_index = srel->size / sizeof (Elf32_External_Rela);
10294
10295	  chunk = reloc_index / PLT_ENTRIES_PER_CHUNK;
10296	  splt = elf_xtensa_get_plt_section (info, chunk);
10297	  sgotplt = elf_xtensa_get_gotplt_section (info, chunk);
10298	  BFD_ASSERT (splt != NULL && sgotplt != NULL);
10299
10300	  /* Check if an entire PLT chunk has just been eliminated.  */
10301	  if (reloc_index % PLT_ENTRIES_PER_CHUNK == 0)
10302	    {
10303	      /* The two magic GOT entries for that chunk can go away.  */
10304	      srelgot = htab->elf.srelgot;
10305	      BFD_ASSERT (srelgot != NULL);
10306	      srelgot->reloc_count -= 2;
10307	      srelgot->size -= 2 * sizeof (Elf32_External_Rela);
10308	      sgotplt->size -= 8;
10309
10310	      /* There should be only one entry left (and it will be
10311		 removed below).  */
10312	      BFD_ASSERT (sgotplt->size == 4);
10313	      BFD_ASSERT (splt->size == PLT_ENTRY_SIZE);
10314	    }
10315
10316	  BFD_ASSERT (sgotplt->size >= 4);
10317	  BFD_ASSERT (splt->size >= PLT_ENTRY_SIZE);
10318
10319	  sgotplt->size -= 4;
10320	  splt->size -= PLT_ENTRY_SIZE;
10321	}
10322    }
10323}
10324
10325
10326/* Take an r_rel and move it to another section.  This usually
10327   requires extending the interal_relocation array and pinning it.  If
10328   the original r_rel is from the same BFD, we can complete this here.
10329   Otherwise, we add a fix record to let the final link fix the
10330   appropriate address.  Contents and internal relocations for the
10331   section must be pinned after calling this routine.  */
10332
10333static bool
10334move_literal (bfd *abfd,
10335	      struct bfd_link_info *link_info,
10336	      asection *sec,
10337	      bfd_vma offset,
10338	      bfd_byte *contents,
10339	      xtensa_relax_info *relax_info,
10340	      Elf_Internal_Rela **internal_relocs_p,
10341	      const literal_value *lit)
10342{
10343  Elf_Internal_Rela *new_relocs = NULL;
10344  size_t new_relocs_count = 0;
10345  Elf_Internal_Rela this_rela;
10346  const r_reloc *r_rel;
10347
10348  r_rel = &lit->r_rel;
10349  BFD_ASSERT (elf_section_data (sec)->relocs == *internal_relocs_p);
10350
10351  if (r_reloc_is_const (r_rel))
10352    bfd_put_32 (abfd, lit->value, contents + offset);
10353  else
10354    {
10355      int r_type;
10356      unsigned i;
10357      reloc_bfd_fix *fix;
10358      unsigned insert_at;
10359
10360      r_type = ELF32_R_TYPE (r_rel->rela.r_info);
10361
10362      /* This is the difficult case.  We have to create a fix up.  */
10363      this_rela.r_offset = offset;
10364      this_rela.r_info = ELF32_R_INFO (0, r_type);
10365      this_rela.r_addend =
10366	r_rel->target_offset - r_reloc_get_target_offset (r_rel);
10367      bfd_put_32 (abfd, lit->value, contents + offset);
10368
10369      /* Currently, we cannot move relocations during a relocatable link.  */
10370      BFD_ASSERT (!bfd_link_relocatable (link_info));
10371      fix = reloc_bfd_fix_init (sec, offset, r_type,
10372				r_reloc_get_section (r_rel),
10373				r_rel->target_offset + r_rel->virtual_offset,
10374				false);
10375      /* We also need to mark that relocations are needed here.  */
10376      sec->flags |= SEC_RELOC;
10377
10378      translate_reloc_bfd_fix (fix);
10379      /* This fix has not yet been translated.  */
10380      add_fix (sec, fix);
10381
10382      /* Add the relocation.  If we have already allocated our own
10383	 space for the relocations and we have room for more, then use
10384	 it.  Otherwise, allocate new space and move the literals.  */
10385      insert_at = sec->reloc_count;
10386      for (i = 0; i < sec->reloc_count; ++i)
10387	{
10388	  if (this_rela.r_offset < (*internal_relocs_p)[i].r_offset)
10389	    {
10390	      insert_at = i;
10391	      break;
10392	    }
10393	}
10394
10395      if (*internal_relocs_p != relax_info->allocated_relocs
10396	  || sec->reloc_count + 1 > relax_info->allocated_relocs_count)
10397	{
10398	  BFD_ASSERT (relax_info->allocated_relocs == NULL
10399		      || sec->reloc_count == relax_info->relocs_count);
10400
10401	  if (relax_info->allocated_relocs_count == 0)
10402	    new_relocs_count = (sec->reloc_count + 2) * 2;
10403	  else
10404	    new_relocs_count = (relax_info->allocated_relocs_count + 2) * 2;
10405
10406	  new_relocs = (Elf_Internal_Rela *)
10407	    bfd_zmalloc (sizeof (Elf_Internal_Rela) * (new_relocs_count));
10408	  if (!new_relocs)
10409	    return false;
10410
10411	  /* We could handle this more quickly by finding the split point.  */
10412	  if (insert_at != 0)
10413	    memcpy (new_relocs, *internal_relocs_p,
10414		    insert_at * sizeof (Elf_Internal_Rela));
10415
10416	  new_relocs[insert_at] = this_rela;
10417
10418	  if (insert_at != sec->reloc_count)
10419	    memcpy (new_relocs + insert_at + 1,
10420		    (*internal_relocs_p) + insert_at,
10421		    (sec->reloc_count - insert_at)
10422		    * sizeof (Elf_Internal_Rela));
10423
10424	  if (*internal_relocs_p != relax_info->allocated_relocs)
10425	    {
10426	      /* The first time we re-allocate, we can only free the
10427		 old relocs if they were allocated with bfd_malloc.
10428		 This is not true when keep_memory is in effect.  */
10429	      if (!link_info->keep_memory)
10430		free (*internal_relocs_p);
10431	    }
10432	  else
10433	    free (*internal_relocs_p);
10434	  relax_info->allocated_relocs = new_relocs;
10435	  relax_info->allocated_relocs_count = new_relocs_count;
10436	  elf_section_data (sec)->relocs = new_relocs;
10437	  sec->reloc_count++;
10438	  relax_info->relocs_count = sec->reloc_count;
10439	  *internal_relocs_p = new_relocs;
10440	}
10441      else
10442	{
10443	  if (insert_at != sec->reloc_count)
10444	    {
10445	      unsigned idx;
10446	      for (idx = sec->reloc_count; idx > insert_at; idx--)
10447		(*internal_relocs_p)[idx] = (*internal_relocs_p)[idx-1];
10448	    }
10449	  (*internal_relocs_p)[insert_at] = this_rela;
10450	  sec->reloc_count++;
10451	  if (relax_info->allocated_relocs)
10452	    relax_info->relocs_count = sec->reloc_count;
10453	}
10454    }
10455  return true;
10456}
10457
10458
10459/* This is similar to relax_section except that when a target is moved,
10460   we shift addresses up.  We also need to modify the size.  This
10461   algorithm does NOT allow for relocations into the middle of the
10462   property sections.  */
10463
10464static bool
10465relax_property_section (bfd *abfd,
10466			asection *sec,
10467			struct bfd_link_info *link_info)
10468{
10469  Elf_Internal_Rela *internal_relocs;
10470  bfd_byte *contents;
10471  unsigned i;
10472  bool ok = true;
10473  bool is_full_prop_section;
10474  size_t last_zfill_target_offset = 0;
10475  asection *last_zfill_target_sec = NULL;
10476  bfd_size_type sec_size;
10477  bfd_size_type entry_size;
10478
10479  sec_size = bfd_get_section_limit (abfd, sec);
10480  internal_relocs = retrieve_internal_relocs (abfd, sec,
10481					      link_info->keep_memory);
10482  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
10483  if (contents == NULL && sec_size != 0)
10484    {
10485      ok = false;
10486      goto error_return;
10487    }
10488
10489  is_full_prop_section = xtensa_is_proptable_section (sec);
10490  if (is_full_prop_section)
10491    entry_size = 12;
10492  else
10493    entry_size = 8;
10494
10495  if (internal_relocs)
10496    {
10497      for (i = 0; i < sec->reloc_count; i++)
10498	{
10499	  Elf_Internal_Rela *irel;
10500	  xtensa_relax_info *target_relax_info;
10501	  unsigned r_type;
10502	  asection *target_sec;
10503	  literal_value val;
10504	  bfd_byte *size_p, *flags_p;
10505
10506	  /* Locally change the source address.
10507	     Translate the target to the new target address.
10508	     If it points to this section and has been removed, MOVE IT.
10509	     Also, don't forget to modify the associated SIZE at
10510	     (offset + 4).  */
10511
10512	  irel = &internal_relocs[i];
10513	  r_type = ELF32_R_TYPE (irel->r_info);
10514	  if (r_type == R_XTENSA_NONE)
10515	    continue;
10516
10517	  /* Find the literal value.  */
10518	  r_reloc_init (&val.r_rel, abfd, irel, contents, sec_size);
10519	  size_p = &contents[irel->r_offset + 4];
10520	  flags_p = NULL;
10521	  if (is_full_prop_section)
10522	    flags_p = &contents[irel->r_offset + 8];
10523	  BFD_ASSERT (irel->r_offset + entry_size <= sec_size);
10524
10525	  target_sec = r_reloc_get_section (&val.r_rel);
10526	  target_relax_info = get_xtensa_relax_info (target_sec);
10527
10528	  if (target_relax_info
10529	      && (target_relax_info->is_relaxable_literal_section
10530		  || target_relax_info->is_relaxable_asm_section ))
10531	    {
10532	      /* Translate the relocation's destination.  */
10533	      bfd_vma old_offset = val.r_rel.target_offset;
10534	      bfd_vma new_offset;
10535	      long old_size, new_size;
10536	      int removed_by_old_offset =
10537		removed_by_actions_map (&target_relax_info->action_list,
10538					old_offset, false);
10539	      new_offset = old_offset - removed_by_old_offset;
10540
10541	      /* Assert that we are not out of bounds.  */
10542	      old_size = bfd_get_32 (abfd, size_p);
10543	      new_size = old_size;
10544
10545	      if (old_size == 0)
10546		{
10547		  /* Only the first zero-sized unreachable entry is
10548		     allowed to expand.  In this case the new offset
10549		     should be the offset before the fill and the new
10550		     size is the expansion size.  For other zero-sized
10551		     entries the resulting size should be zero with an
10552		     offset before or after the fill address depending
10553		     on whether the expanding unreachable entry
10554		     preceeds it.  */
10555		  if (last_zfill_target_sec == 0
10556		      || last_zfill_target_sec != target_sec
10557		      || last_zfill_target_offset != old_offset)
10558		    {
10559		      bfd_vma new_end_offset = new_offset;
10560
10561		      /* Recompute the new_offset, but this time don't
10562			 include any fill inserted by relaxation.  */
10563		      removed_by_old_offset =
10564			removed_by_actions_map (&target_relax_info->action_list,
10565						old_offset, true);
10566		      new_offset = old_offset - removed_by_old_offset;
10567
10568		      /* If it is not unreachable and we have not yet
10569			 seen an unreachable at this address, place it
10570			 before the fill address.  */
10571		      if (flags_p && (bfd_get_32 (abfd, flags_p)
10572				      & XTENSA_PROP_UNREACHABLE) != 0)
10573			{
10574			  new_size = new_end_offset - new_offset;
10575
10576			  last_zfill_target_sec = target_sec;
10577			  last_zfill_target_offset = old_offset;
10578			}
10579		    }
10580		}
10581	      else
10582		{
10583		  int removed_by_old_offset_size =
10584		    removed_by_actions_map (&target_relax_info->action_list,
10585					    old_offset + old_size, true);
10586		  new_size -= removed_by_old_offset_size - removed_by_old_offset;
10587		}
10588
10589	      if (new_size != old_size)
10590		{
10591		  bfd_put_32 (abfd, new_size, size_p);
10592		  pin_contents (sec, contents);
10593		}
10594
10595	      if (new_offset != old_offset)
10596		{
10597		  bfd_vma diff = new_offset - old_offset;
10598		  irel->r_addend += diff;
10599		  pin_internal_relocs (sec, internal_relocs);
10600		}
10601	    }
10602	}
10603    }
10604
10605  /* Combine adjacent property table entries.  This is also done in
10606     finish_dynamic_sections() but at that point it's too late to
10607     reclaim the space in the output section, so we do this twice.  */
10608
10609  if (internal_relocs && (!bfd_link_relocatable (link_info)
10610			  || xtensa_is_littable_section (sec)))
10611    {
10612      Elf_Internal_Rela *last_irel = NULL;
10613      Elf_Internal_Rela *irel, *next_rel, *rel_end;
10614      int removed_bytes = 0;
10615      bfd_vma offset;
10616      flagword predef_flags;
10617
10618      predef_flags = xtensa_get_property_predef_flags (sec);
10619
10620      /* Walk over memory and relocations at the same time.
10621	 This REQUIRES that the internal_relocs be sorted by offset.  */
10622      qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
10623	     internal_reloc_compare);
10624
10625      pin_internal_relocs (sec, internal_relocs);
10626      pin_contents (sec, contents);
10627
10628      next_rel = internal_relocs;
10629      rel_end = internal_relocs + sec->reloc_count;
10630
10631      BFD_ASSERT (sec->size % entry_size == 0);
10632
10633      for (offset = 0; offset < sec->size; offset += entry_size)
10634	{
10635	  Elf_Internal_Rela *offset_rel, *extra_rel;
10636	  bfd_vma bytes_to_remove, size, actual_offset;
10637	  bool remove_this_rel;
10638	  flagword flags;
10639
10640	  /* Find the first relocation for the entry at the current offset.
10641	     Adjust the offsets of any extra relocations for the previous
10642	     entry.  */
10643	  offset_rel = NULL;
10644	  if (next_rel)
10645	    {
10646	      for (irel = next_rel; irel < rel_end; irel++)
10647		{
10648		  if ((irel->r_offset == offset
10649		       && ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10650		      || irel->r_offset > offset)
10651		    {
10652		      offset_rel = irel;
10653		      break;
10654		    }
10655		  irel->r_offset -= removed_bytes;
10656		}
10657	    }
10658
10659	  /* Find the next relocation (if there are any left).  */
10660	  extra_rel = NULL;
10661	  if (offset_rel)
10662	    {
10663	      for (irel = offset_rel + 1; irel < rel_end; irel++)
10664		{
10665		  if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_NONE)
10666		    {
10667		      extra_rel = irel;
10668		      break;
10669		    }
10670		}
10671	    }
10672
10673	  /* Check if there are relocations on the current entry.  There
10674	     should usually be a relocation on the offset field.  If there
10675	     are relocations on the size or flags, then we can't optimize
10676	     this entry.  Also, find the next relocation to examine on the
10677	     next iteration.  */
10678	  if (offset_rel)
10679	    {
10680	      if (offset_rel->r_offset >= offset + entry_size)
10681		{
10682		  next_rel = offset_rel;
10683		  /* There are no relocations on the current entry, but we
10684		     might still be able to remove it if the size is zero.  */
10685		  offset_rel = NULL;
10686		}
10687	      else if (offset_rel->r_offset > offset
10688		       || (extra_rel
10689			   && extra_rel->r_offset < offset + entry_size))
10690		{
10691		  /* There is a relocation on the size or flags, so we can't
10692		     do anything with this entry.  Continue with the next.  */
10693		  next_rel = offset_rel;
10694		  continue;
10695		}
10696	      else
10697		{
10698		  BFD_ASSERT (offset_rel->r_offset == offset);
10699		  offset_rel->r_offset -= removed_bytes;
10700		  next_rel = offset_rel + 1;
10701		}
10702	    }
10703	  else
10704	    next_rel = NULL;
10705
10706	  remove_this_rel = false;
10707	  bytes_to_remove = 0;
10708	  actual_offset = offset - removed_bytes;
10709	  size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
10710
10711	  if (is_full_prop_section)
10712	    flags = bfd_get_32 (abfd, &contents[actual_offset + 8]);
10713	  else
10714	    flags = predef_flags;
10715
10716	  if (size == 0
10717	      && (flags & XTENSA_PROP_ALIGN) == 0
10718	      && (flags & XTENSA_PROP_UNREACHABLE) == 0)
10719	    {
10720	      /* Always remove entries with zero size and no alignment.  */
10721	      bytes_to_remove = entry_size;
10722	      if (offset_rel)
10723		remove_this_rel = true;
10724	    }
10725	  else if (offset_rel
10726		   && ELF32_R_TYPE (offset_rel->r_info) == R_XTENSA_32)
10727	    {
10728	      if (last_irel)
10729		{
10730		  flagword old_flags;
10731		  bfd_vma old_size =
10732		    bfd_get_32 (abfd, &contents[last_irel->r_offset + 4]);
10733		  bfd_vma old_address =
10734		    (last_irel->r_addend
10735		     + bfd_get_32 (abfd, &contents[last_irel->r_offset]));
10736		  bfd_vma new_address =
10737		    (offset_rel->r_addend
10738		     + bfd_get_32 (abfd, &contents[actual_offset]));
10739		  if (is_full_prop_section)
10740		    old_flags = bfd_get_32
10741		      (abfd, &contents[last_irel->r_offset + 8]);
10742		  else
10743		    old_flags = predef_flags;
10744
10745		  if ((ELF32_R_SYM (offset_rel->r_info)
10746		       == ELF32_R_SYM (last_irel->r_info))
10747		      && old_address + old_size == new_address
10748		      && old_flags == flags
10749		      && (old_flags & XTENSA_PROP_INSN_BRANCH_TARGET) == 0
10750		      && (old_flags & XTENSA_PROP_INSN_LOOP_TARGET) == 0)
10751		    {
10752		      /* Fix the old size.  */
10753		      bfd_put_32 (abfd, old_size + size,
10754				  &contents[last_irel->r_offset + 4]);
10755		      bytes_to_remove = entry_size;
10756		      remove_this_rel = true;
10757		    }
10758		  else
10759		    last_irel = offset_rel;
10760		}
10761	      else
10762		last_irel = offset_rel;
10763	    }
10764
10765	  if (remove_this_rel)
10766	    {
10767	      offset_rel->r_info = ELF32_R_INFO (0, R_XTENSA_NONE);
10768	      offset_rel->r_offset = 0;
10769	    }
10770
10771	  if (bytes_to_remove != 0)
10772	    {
10773	      removed_bytes += bytes_to_remove;
10774	      if (offset + bytes_to_remove < sec->size)
10775		memmove (&contents[actual_offset],
10776			 &contents[actual_offset + bytes_to_remove],
10777			 sec->size - offset - bytes_to_remove);
10778	    }
10779	}
10780
10781      if (removed_bytes)
10782	{
10783	  /* Fix up any extra relocations on the last entry.  */
10784	  for (irel = next_rel; irel < rel_end; irel++)
10785	    irel->r_offset -= removed_bytes;
10786
10787	  /* Clear the removed bytes.  */
10788	  memset (&contents[sec->size - removed_bytes], 0, removed_bytes);
10789
10790	  if (sec->rawsize == 0)
10791	    sec->rawsize = sec->size;
10792	  sec->size -= removed_bytes;
10793
10794	  if (xtensa_is_littable_section (sec))
10795	    {
10796	      asection *sgotloc = elf_xtensa_hash_table (link_info)->sgotloc;
10797	      if (sgotloc)
10798		sgotloc->size -= removed_bytes;
10799	    }
10800	}
10801    }
10802
10803 error_return:
10804  release_internal_relocs (sec, internal_relocs);
10805  release_contents (sec, contents);
10806  return ok;
10807}
10808
10809
10810/* Third relaxation pass.  */
10811
10812/* Change symbol values to account for removed literals.  */
10813
10814bool
10815relax_section_symbols (bfd *abfd, asection *sec)
10816{
10817  xtensa_relax_info *relax_info;
10818  unsigned int sec_shndx;
10819  Elf_Internal_Shdr *symtab_hdr;
10820  Elf_Internal_Sym *isymbuf;
10821  unsigned i, num_syms, num_locals;
10822
10823  relax_info = get_xtensa_relax_info (sec);
10824  BFD_ASSERT (relax_info);
10825
10826  if (!relax_info->is_relaxable_literal_section
10827      && !relax_info->is_relaxable_asm_section)
10828    return true;
10829
10830  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
10831
10832  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
10833  isymbuf = retrieve_local_syms (abfd);
10834
10835  num_syms = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
10836  num_locals = symtab_hdr->sh_info;
10837
10838  /* Adjust the local symbols defined in this section.  */
10839  for (i = 0; i < num_locals; i++)
10840    {
10841      Elf_Internal_Sym *isym = &isymbuf[i];
10842
10843      if (isym->st_shndx == sec_shndx)
10844	{
10845	  bfd_vma orig_addr = isym->st_value;
10846	  int removed = removed_by_actions_map (&relax_info->action_list,
10847						orig_addr, false);
10848
10849	  isym->st_value -= removed;
10850	  if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC)
10851	    isym->st_size -=
10852	      removed_by_actions_map (&relax_info->action_list,
10853				      orig_addr + isym->st_size, false) -
10854	      removed;
10855	}
10856    }
10857
10858  /* Now adjust the global symbols defined in this section.  */
10859  for (i = 0; i < (num_syms - num_locals); i++)
10860    {
10861      struct elf_link_hash_entry *sym_hash;
10862
10863      sym_hash = elf_sym_hashes (abfd)[i];
10864
10865      if (sym_hash->root.type == bfd_link_hash_warning)
10866	sym_hash = (struct elf_link_hash_entry *) sym_hash->root.u.i.link;
10867
10868      if ((sym_hash->root.type == bfd_link_hash_defined
10869	   || sym_hash->root.type == bfd_link_hash_defweak)
10870	  && sym_hash->root.u.def.section == sec)
10871	{
10872	  bfd_vma orig_addr = sym_hash->root.u.def.value;
10873	  int removed = removed_by_actions_map (&relax_info->action_list,
10874						orig_addr, false);
10875
10876	  sym_hash->root.u.def.value -= removed;
10877
10878	  if (sym_hash->type == STT_FUNC)
10879	    sym_hash->size -=
10880	      removed_by_actions_map (&relax_info->action_list,
10881				      orig_addr + sym_hash->size, false) -
10882	      removed;
10883	}
10884    }
10885
10886  return true;
10887}
10888
10889
10890/* "Fix" handling functions, called while performing relocations.  */
10891
10892static bool
10893do_fix_for_relocatable_link (Elf_Internal_Rela *rel,
10894			     bfd *input_bfd,
10895			     asection *input_section,
10896			     bfd_byte *contents)
10897{
10898  r_reloc r_rel;
10899  asection *sec, *old_sec;
10900  bfd_vma old_offset;
10901  int r_type = ELF32_R_TYPE (rel->r_info);
10902  reloc_bfd_fix *fix;
10903
10904  if (r_type == R_XTENSA_NONE)
10905    return true;
10906
10907  fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10908  if (!fix)
10909    return true;
10910
10911  r_reloc_init (&r_rel, input_bfd, rel, contents,
10912		bfd_get_section_limit (input_bfd, input_section));
10913  old_sec = r_reloc_get_section (&r_rel);
10914  old_offset = r_rel.target_offset;
10915
10916  if (!old_sec || !r_reloc_is_defined (&r_rel))
10917    {
10918      if (r_type != R_XTENSA_ASM_EXPAND)
10919	{
10920	  _bfd_error_handler
10921	    /* xgettext:c-format */
10922	    (_("%pB(%pA+%#" PRIx64 "): unexpected fix for %s relocation"),
10923	     input_bfd, input_section, (uint64_t) rel->r_offset,
10924	     elf_howto_table[r_type].name);
10925	  return false;
10926	}
10927      /* Leave it be.  Resolution will happen in a later stage.  */
10928    }
10929  else
10930    {
10931      sec = fix->target_sec;
10932      rel->r_addend += ((sec->output_offset + fix->target_offset)
10933			- (old_sec->output_offset + old_offset));
10934    }
10935  return true;
10936}
10937
10938
10939static void
10940do_fix_for_final_link (Elf_Internal_Rela *rel,
10941		       bfd *input_bfd,
10942		       asection *input_section,
10943		       bfd_byte *contents,
10944		       bfd_vma *relocationp)
10945{
10946  asection *sec;
10947  int r_type = ELF32_R_TYPE (rel->r_info);
10948  reloc_bfd_fix *fix;
10949  bfd_vma fixup_diff;
10950
10951  if (r_type == R_XTENSA_NONE)
10952    return;
10953
10954  fix = get_bfd_fix (input_section, rel->r_offset, r_type);
10955  if (!fix)
10956    return;
10957
10958  sec = fix->target_sec;
10959
10960  fixup_diff = rel->r_addend;
10961  if (elf_howto_table[fix->src_type].partial_inplace)
10962    {
10963      bfd_vma inplace_val;
10964      BFD_ASSERT (fix->src_offset
10965		  < bfd_get_section_limit (input_bfd, input_section));
10966      inplace_val = bfd_get_32 (input_bfd, &contents[fix->src_offset]);
10967      fixup_diff += inplace_val;
10968    }
10969
10970  *relocationp = (sec->output_section->vma
10971		  + sec->output_offset
10972		  + fix->target_offset - fixup_diff);
10973}
10974
10975
10976/* Miscellaneous utility functions....  */
10977
10978static asection *
10979elf_xtensa_get_plt_section (struct bfd_link_info *info, int chunk)
10980{
10981  bfd *dynobj;
10982  char plt_name[17];
10983
10984  if (chunk == 0)
10985    return elf_hash_table (info)->splt;
10986
10987  dynobj = elf_hash_table (info)->dynobj;
10988  sprintf (plt_name, ".plt.%u", chunk);
10989  return bfd_get_linker_section (dynobj, plt_name);
10990}
10991
10992
10993static asection *
10994elf_xtensa_get_gotplt_section (struct bfd_link_info *info, int chunk)
10995{
10996  bfd *dynobj;
10997  char got_name[21];
10998
10999  if (chunk == 0)
11000    return elf_hash_table (info)->sgotplt;
11001
11002  dynobj = elf_hash_table (info)->dynobj;
11003  sprintf (got_name, ".got.plt.%u", chunk);
11004  return bfd_get_linker_section (dynobj, got_name);
11005}
11006
11007
11008/* Get the input section for a given symbol index.
11009   If the symbol is:
11010   . a section symbol, return the section;
11011   . a common symbol, return the common section;
11012   . an undefined symbol, return the undefined section;
11013   . an indirect symbol, follow the links;
11014   . an absolute value, return the absolute section.  */
11015
11016static asection *
11017get_elf_r_symndx_section (bfd *abfd, unsigned long r_symndx)
11018{
11019  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
11020  asection *target_sec = NULL;
11021  if (r_symndx < symtab_hdr->sh_info)
11022    {
11023      Elf_Internal_Sym *isymbuf;
11024      unsigned int section_index;
11025
11026      isymbuf = retrieve_local_syms (abfd);
11027      section_index = isymbuf[r_symndx].st_shndx;
11028
11029      if (section_index == SHN_UNDEF)
11030	target_sec = bfd_und_section_ptr;
11031      else if (section_index == SHN_ABS)
11032	target_sec = bfd_abs_section_ptr;
11033      else if (section_index == SHN_COMMON)
11034	target_sec = bfd_com_section_ptr;
11035      else
11036	target_sec = bfd_section_from_elf_index (abfd, section_index);
11037    }
11038  else
11039    {
11040      unsigned long indx = r_symndx - symtab_hdr->sh_info;
11041      struct elf_link_hash_entry *h = elf_sym_hashes (abfd)[indx];
11042
11043      while (h->root.type == bfd_link_hash_indirect
11044	     || h->root.type == bfd_link_hash_warning)
11045	h = (struct elf_link_hash_entry *) h->root.u.i.link;
11046
11047      switch (h->root.type)
11048	{
11049	case bfd_link_hash_defined:
11050	case  bfd_link_hash_defweak:
11051	  target_sec = h->root.u.def.section;
11052	  break;
11053	case bfd_link_hash_common:
11054	  target_sec = bfd_com_section_ptr;
11055	  break;
11056	case bfd_link_hash_undefined:
11057	case bfd_link_hash_undefweak:
11058	  target_sec = bfd_und_section_ptr;
11059	  break;
11060	default: /* New indirect warning.  */
11061	  target_sec = bfd_und_section_ptr;
11062	  break;
11063	}
11064    }
11065  return target_sec;
11066}
11067
11068
11069static struct elf_link_hash_entry *
11070get_elf_r_symndx_hash_entry (bfd *abfd, unsigned long r_symndx)
11071{
11072  unsigned long indx;
11073  struct elf_link_hash_entry *h;
11074  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
11075
11076  if (r_symndx < symtab_hdr->sh_info)
11077    return NULL;
11078
11079  indx = r_symndx - symtab_hdr->sh_info;
11080  h = elf_sym_hashes (abfd)[indx];
11081  while (h->root.type == bfd_link_hash_indirect
11082	 || h->root.type == bfd_link_hash_warning)
11083    h = (struct elf_link_hash_entry *) h->root.u.i.link;
11084  return h;
11085}
11086
11087
11088/* Get the section-relative offset for a symbol number.  */
11089
11090static bfd_vma
11091get_elf_r_symndx_offset (bfd *abfd, unsigned long r_symndx)
11092{
11093  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
11094  bfd_vma offset = 0;
11095
11096  if (r_symndx < symtab_hdr->sh_info)
11097    {
11098      Elf_Internal_Sym *isymbuf;
11099      isymbuf = retrieve_local_syms (abfd);
11100      offset = isymbuf[r_symndx].st_value;
11101    }
11102  else
11103    {
11104      unsigned long indx = r_symndx - symtab_hdr->sh_info;
11105      struct elf_link_hash_entry *h =
11106	elf_sym_hashes (abfd)[indx];
11107
11108      while (h->root.type == bfd_link_hash_indirect
11109	     || h->root.type == bfd_link_hash_warning)
11110	h = (struct elf_link_hash_entry *) h->root.u.i.link;
11111      if (h->root.type == bfd_link_hash_defined
11112	  || h->root.type == bfd_link_hash_defweak)
11113	offset = h->root.u.def.value;
11114    }
11115  return offset;
11116}
11117
11118
11119static bool
11120is_reloc_sym_weak (bfd *abfd, Elf_Internal_Rela *rel)
11121{
11122  unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
11123  struct elf_link_hash_entry *h;
11124
11125  h = get_elf_r_symndx_hash_entry (abfd, r_symndx);
11126  if (h && h->root.type == bfd_link_hash_defweak)
11127    return true;
11128  return false;
11129}
11130
11131
11132static bool
11133pcrel_reloc_fits (xtensa_opcode opc,
11134		  int opnd,
11135		  bfd_vma self_address,
11136		  bfd_vma dest_address)
11137{
11138  xtensa_isa isa = xtensa_default_isa;
11139  uint32 valp = dest_address;
11140  if (xtensa_operand_do_reloc (isa, opc, opnd, &valp, self_address)
11141      || xtensa_operand_encode (isa, opc, opnd, &valp))
11142    return false;
11143  return true;
11144}
11145
11146
11147static bool
11148xtensa_is_property_section (asection *sec)
11149{
11150  if (xtensa_is_insntable_section (sec)
11151      || xtensa_is_littable_section (sec)
11152      || xtensa_is_proptable_section (sec))
11153    return true;
11154
11155  return false;
11156}
11157
11158
11159static bool
11160xtensa_is_insntable_section (asection *sec)
11161{
11162  if (startswith (sec->name, XTENSA_INSN_SEC_NAME)
11163      || startswith (sec->name, ".gnu.linkonce.x."))
11164    return true;
11165
11166  return false;
11167}
11168
11169
11170static bool
11171xtensa_is_littable_section (asection *sec)
11172{
11173  if (startswith (sec->name, XTENSA_LIT_SEC_NAME)
11174      || startswith (sec->name, ".gnu.linkonce.p."))
11175    return true;
11176
11177  return false;
11178}
11179
11180
11181static bool
11182xtensa_is_proptable_section (asection *sec)
11183{
11184  if (startswith (sec->name, XTENSA_PROP_SEC_NAME)
11185      || startswith (sec->name, ".gnu.linkonce.prop."))
11186    return true;
11187
11188  return false;
11189}
11190
11191
11192static int
11193internal_reloc_compare (const void *ap, const void *bp)
11194{
11195  const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
11196  const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
11197
11198  if (a->r_offset != b->r_offset)
11199    return (a->r_offset - b->r_offset);
11200
11201  /* We don't need to sort on these criteria for correctness,
11202     but enforcing a more strict ordering prevents unstable qsort
11203     from behaving differently with different implementations.
11204     Without the code below we get correct but different results
11205     on Solaris 2.7 and 2.8.  We would like to always produce the
11206     same results no matter the host.  */
11207
11208  if (a->r_info != b->r_info)
11209    return (a->r_info - b->r_info);
11210
11211  return (a->r_addend - b->r_addend);
11212}
11213
11214
11215static int
11216internal_reloc_matches (const void *ap, const void *bp)
11217{
11218  const Elf_Internal_Rela *a = (const Elf_Internal_Rela *) ap;
11219  const Elf_Internal_Rela *b = (const Elf_Internal_Rela *) bp;
11220
11221  /* Check if one entry overlaps with the other; this shouldn't happen
11222     except when searching for a match.  */
11223  return (a->r_offset - b->r_offset);
11224}
11225
11226
11227/* Predicate function used to look up a section in a particular group.  */
11228
11229static bool
11230match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
11231{
11232  const char *gname = inf;
11233  const char *group_name = elf_group_name (sec);
11234
11235  return (group_name == gname
11236	  || (group_name != NULL
11237	      && gname != NULL
11238	      && strcmp (group_name, gname) == 0));
11239}
11240
11241
11242static char *
11243xtensa_add_names (const char *base, const char *suffix)
11244{
11245  if (suffix)
11246    {
11247      size_t base_len = strlen (base);
11248      size_t suffix_len = strlen (suffix);
11249      char *str = bfd_malloc (base_len + suffix_len + 1);
11250
11251      memcpy (str, base, base_len);
11252      memcpy (str + base_len, suffix, suffix_len + 1);
11253      return str;
11254    }
11255  else
11256    {
11257      return strdup (base);
11258    }
11259}
11260
11261static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
11262
11263static char *
11264xtensa_property_section_name (asection *sec, const char *base_name,
11265			      bool separate_sections)
11266{
11267  const char *suffix, *group_name;
11268  char *prop_sec_name;
11269
11270  group_name = elf_group_name (sec);
11271  if (group_name)
11272    {
11273      suffix = strrchr (sec->name, '.');
11274      if (suffix == sec->name)
11275	suffix = 0;
11276      prop_sec_name = xtensa_add_names (base_name, suffix);
11277    }
11278  else if (startswith (sec->name, ".gnu.linkonce."))
11279    {
11280      char *linkonce_kind = 0;
11281
11282      if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
11283	linkonce_kind = "x.";
11284      else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
11285	linkonce_kind = "p.";
11286      else if (strcmp (base_name, XTENSA_PROP_SEC_NAME) == 0)
11287	linkonce_kind = "prop.";
11288      else
11289	abort ();
11290
11291      prop_sec_name = (char *) bfd_malloc (strlen (sec->name)
11292					   + strlen (linkonce_kind) + 1);
11293      memcpy (prop_sec_name, ".gnu.linkonce.", linkonce_len);
11294      strcpy (prop_sec_name + linkonce_len, linkonce_kind);
11295
11296      suffix = sec->name + linkonce_len;
11297      /* For backward compatibility, replace "t." instead of inserting
11298	 the new linkonce_kind (but not for "prop" sections).  */
11299      if (startswith (suffix, "t.") && linkonce_kind[1] == '.')
11300	suffix += 2;
11301      strcat (prop_sec_name + linkonce_len, suffix);
11302    }
11303  else
11304    {
11305      prop_sec_name = xtensa_add_names (base_name,
11306					separate_sections ? sec->name : NULL);
11307    }
11308
11309  return prop_sec_name;
11310}
11311
11312
11313static asection *
11314xtensa_get_separate_property_section (asection *sec, const char *base_name,
11315				      bool separate_section)
11316{
11317  char *prop_sec_name;
11318  asection *prop_sec;
11319
11320  prop_sec_name = xtensa_property_section_name (sec, base_name,
11321						separate_section);
11322  prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11323					 match_section_group,
11324					 (void *) elf_group_name (sec));
11325  free (prop_sec_name);
11326  return prop_sec;
11327}
11328
11329static asection *
11330xtensa_get_property_section (asection *sec, const char *base_name)
11331{
11332  asection *prop_sec;
11333
11334  /* Try individual property section first.  */
11335  prop_sec = xtensa_get_separate_property_section (sec, base_name, true);
11336
11337  /* Refer to a common property section if individual is not present.  */
11338  if (!prop_sec)
11339    prop_sec = xtensa_get_separate_property_section (sec, base_name, false);
11340
11341  return prop_sec;
11342}
11343
11344
11345asection *
11346xtensa_make_property_section (asection *sec, const char *base_name)
11347{
11348  char *prop_sec_name;
11349  asection *prop_sec;
11350
11351  /* Check if the section already exists.  */
11352  prop_sec_name = xtensa_property_section_name (sec, base_name,
11353						elf32xtensa_separate_props);
11354  prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name,
11355					 match_section_group,
11356					 (void *) elf_group_name (sec));
11357  /* If not, create it.  */
11358  if (! prop_sec)
11359    {
11360      flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY);
11361      flags |= (bfd_section_flags (sec)
11362		& (SEC_LINK_ONCE | SEC_LINK_DUPLICATES));
11363
11364      prop_sec = bfd_make_section_anyway_with_flags
11365	(sec->owner, strdup (prop_sec_name), flags);
11366      if (! prop_sec)
11367	return 0;
11368
11369      elf_group_name (prop_sec) = elf_group_name (sec);
11370    }
11371
11372  free (prop_sec_name);
11373  return prop_sec;
11374}
11375
11376
11377flagword
11378xtensa_get_property_predef_flags (asection *sec)
11379{
11380  if (xtensa_is_insntable_section (sec))
11381    return (XTENSA_PROP_INSN
11382	    | XTENSA_PROP_NO_TRANSFORM
11383	    | XTENSA_PROP_INSN_NO_REORDER);
11384
11385  if (xtensa_is_littable_section (sec))
11386    return (XTENSA_PROP_LITERAL
11387	    | XTENSA_PROP_NO_TRANSFORM
11388	    | XTENSA_PROP_INSN_NO_REORDER);
11389
11390  return 0;
11391}
11392
11393
11394/* Other functions called directly by the linker.  */
11395
11396bool
11397xtensa_callback_required_dependence (bfd *abfd,
11398				     asection *sec,
11399				     struct bfd_link_info *link_info,
11400				     deps_callback_t callback,
11401				     void *closure)
11402{
11403  Elf_Internal_Rela *internal_relocs;
11404  bfd_byte *contents;
11405  unsigned i;
11406  bool ok = true;
11407  bfd_size_type sec_size;
11408
11409  sec_size = bfd_get_section_limit (abfd, sec);
11410
11411  /* ".plt*" sections have no explicit relocations but they contain L32R
11412     instructions that reference the corresponding ".got.plt*" sections.  */
11413  if ((sec->flags & SEC_LINKER_CREATED) != 0
11414      && startswith (sec->name, ".plt"))
11415    {
11416      asection *sgotplt;
11417
11418      /* Find the corresponding ".got.plt*" section.  */
11419      if (sec->name[4] == '\0')
11420	sgotplt = elf_hash_table (link_info)->sgotplt;
11421      else
11422	{
11423	  char got_name[14];
11424	  int chunk = 0;
11425
11426	  BFD_ASSERT (sec->name[4] == '.');
11427	  chunk = strtol (&sec->name[5], NULL, 10);
11428
11429	  sprintf (got_name, ".got.plt.%u", chunk);
11430	  sgotplt = bfd_get_linker_section (sec->owner, got_name);
11431	}
11432      BFD_ASSERT (sgotplt);
11433
11434      /* Assume worst-case offsets: L32R at the very end of the ".plt"
11435	 section referencing a literal at the very beginning of
11436	 ".got.plt".  This is very close to the real dependence, anyway.  */
11437      (*callback) (sec, sec_size, sgotplt, 0, closure);
11438    }
11439
11440  /* Only ELF files are supported for Xtensa.  Check here to avoid a segfault
11441     when building uclibc, which runs "ld -b binary /dev/null".  */
11442  if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
11443    return ok;
11444
11445  internal_relocs = retrieve_internal_relocs (abfd, sec,
11446					      link_info->keep_memory);
11447  if (internal_relocs == NULL
11448      || sec->reloc_count == 0)
11449    return ok;
11450
11451  /* Cache the contents for the duration of this scan.  */
11452  contents = retrieve_contents (abfd, sec, link_info->keep_memory);
11453  if (contents == NULL && sec_size != 0)
11454    {
11455      ok = false;
11456      goto error_return;
11457    }
11458
11459  if (!xtensa_default_isa)
11460    xtensa_default_isa = xtensa_isa_init (0, 0);
11461
11462  for (i = 0; i < sec->reloc_count; i++)
11463    {
11464      Elf_Internal_Rela *irel = &internal_relocs[i];
11465      if (is_l32r_relocation (abfd, sec, contents, irel))
11466	{
11467	  r_reloc l32r_rel;
11468	  asection *target_sec;
11469	  bfd_vma target_offset;
11470
11471	  r_reloc_init (&l32r_rel, abfd, irel, contents, sec_size);
11472	  target_sec = NULL;
11473	  target_offset = 0;
11474	  /* L32Rs must be local to the input file.  */
11475	  if (r_reloc_is_defined (&l32r_rel))
11476	    {
11477	      target_sec = r_reloc_get_section (&l32r_rel);
11478	      target_offset = l32r_rel.target_offset;
11479	    }
11480	  (*callback) (sec, irel->r_offset, target_sec, target_offset,
11481		       closure);
11482	}
11483    }
11484
11485 error_return:
11486  release_internal_relocs (sec, internal_relocs);
11487  release_contents (sec, contents);
11488  return ok;
11489}
11490
11491/* The default literal sections should always be marked as "code" (i.e.,
11492   SHF_EXECINSTR).  This is particularly important for the Linux kernel
11493   module loader so that the literals are not placed after the text.  */
11494static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
11495{
11496  { STRING_COMMA_LEN (".fini.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11497  { STRING_COMMA_LEN (".init.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11498  { STRING_COMMA_LEN (".literal"),	0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
11499  { STRING_COMMA_LEN (".xtensa.info"),	0, SHT_NOTE,	 0 },
11500  { NULL,			0,	0, 0,		 0 }
11501};
11502
11503#define ELF_TARGET_ID			XTENSA_ELF_DATA
11504#ifndef ELF_ARCH
11505#define TARGET_LITTLE_SYM		xtensa_elf32_le_vec
11506#define TARGET_LITTLE_NAME		"elf32-xtensa-le"
11507#define TARGET_BIG_SYM			xtensa_elf32_be_vec
11508#define TARGET_BIG_NAME			"elf32-xtensa-be"
11509#define ELF_ARCH			bfd_arch_xtensa
11510
11511#define ELF_MACHINE_CODE		EM_XTENSA
11512#define ELF_MACHINE_ALT1		EM_XTENSA_OLD
11513
11514#define ELF_MAXPAGESIZE			0x1000
11515#endif /* ELF_ARCH */
11516
11517#define elf_backend_can_gc_sections	1
11518#define elf_backend_can_refcount	1
11519#define elf_backend_plt_readonly	1
11520#define elf_backend_got_header_size	4
11521#define elf_backend_want_dynbss		0
11522#define elf_backend_want_got_plt	1
11523#define elf_backend_dtrel_excludes_plt	1
11524
11525#define elf_info_to_howto		     elf_xtensa_info_to_howto_rela
11526
11527#define bfd_elf32_mkobject		     elf_xtensa_mkobject
11528
11529#define bfd_elf32_bfd_merge_private_bfd_data elf_xtensa_merge_private_bfd_data
11530#define bfd_elf32_new_section_hook	     elf_xtensa_new_section_hook
11531#define bfd_elf32_bfd_print_private_bfd_data elf_xtensa_print_private_bfd_data
11532#define bfd_elf32_bfd_relax_section	     elf_xtensa_relax_section
11533#define bfd_elf32_bfd_reloc_type_lookup	     elf_xtensa_reloc_type_lookup
11534#define bfd_elf32_bfd_reloc_name_lookup \
11535  elf_xtensa_reloc_name_lookup
11536#define bfd_elf32_bfd_set_private_flags	     elf_xtensa_set_private_flags
11537#define bfd_elf32_bfd_link_hash_table_create elf_xtensa_link_hash_table_create
11538
11539#define elf_backend_adjust_dynamic_symbol    elf_xtensa_adjust_dynamic_symbol
11540#define elf_backend_check_relocs	     elf_xtensa_check_relocs
11541#define elf_backend_create_dynamic_sections  elf_xtensa_create_dynamic_sections
11542#define elf_backend_discard_info	     elf_xtensa_discard_info
11543#define elf_backend_ignore_discarded_relocs  elf_xtensa_ignore_discarded_relocs
11544#define elf_backend_final_write_processing   elf_xtensa_final_write_processing
11545#define elf_backend_finish_dynamic_sections  elf_xtensa_finish_dynamic_sections
11546#define elf_backend_finish_dynamic_symbol    elf_xtensa_finish_dynamic_symbol
11547#define elf_backend_gc_mark_hook	     elf_xtensa_gc_mark_hook
11548#define elf_backend_grok_prstatus	     elf_xtensa_grok_prstatus
11549#define elf_backend_grok_psinfo		     elf_xtensa_grok_psinfo
11550#define elf_backend_hide_symbol		     elf_xtensa_hide_symbol
11551#define elf_backend_object_p		     elf_xtensa_object_p
11552#define elf_backend_reloc_type_class	     elf_xtensa_reloc_type_class
11553#define elf_backend_relocate_section	     elf_xtensa_relocate_section
11554#define elf_backend_size_dynamic_sections    elf_xtensa_size_dynamic_sections
11555#define elf_backend_always_size_sections     elf_xtensa_always_size_sections
11556#define elf_backend_omit_section_dynsym      _bfd_elf_omit_section_dynsym_all
11557#define elf_backend_special_sections	     elf_xtensa_special_sections
11558#define elf_backend_action_discarded	     elf_xtensa_action_discarded
11559#define elf_backend_copy_indirect_symbol     elf_xtensa_copy_indirect_symbol
11560
11561#include "elf32-target.h"
11562