Coverage Report

Created: 2026-07-25 10:20

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