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