Coverage Report

Created: 2025-06-24 06:45

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