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