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