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