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