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