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