Coverage Report

Created: 2023-08-28 06:25

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