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