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