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