Coverage Report

Created: 2026-09-14 08:07

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