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