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