OSDN Git Service

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