1 /* NDS32-specific support for 32-bit ELF.
2 Copyright (C) 2012-2016 Free Software Foundation, Inc.
3 Contributed by Andes Technology Corporation.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 #include "bfd_stdint.h"
29 #include "libiberty.h"
30 #include "bfd_stdint.h"
31 #include "elf/nds32.h"
32 #include "opcode/nds32.h"
33 #include "elf32-nds32.h"
34 #include "opcode/cgen.h"
35 #include "../opcodes/nds32-opc.h"
37 /* Relocation HOWTO functions. */
38 static bfd_reloc_status_type nds32_elf_ignore_reloc
39 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
40 static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
41 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
42 static bfd_reloc_status_type nds32_elf_hi20_reloc
43 (bfd
*, arelent
*, asymbol
*, void *,
44 asection
*, bfd
*, char **);
45 static bfd_reloc_status_type nds32_elf_lo12_reloc
46 (bfd
*, arelent
*, asymbol
*, void *,
47 asection
*, bfd
*, char **);
48 static bfd_reloc_status_type nds32_elf_generic_reloc
49 (bfd
*, arelent
*, asymbol
*, void *,
50 asection
*, bfd
*, char **);
51 static bfd_reloc_status_type nds32_elf_sda15_reloc
52 (bfd
*, arelent
*, asymbol
*, void *,
53 asection
*, bfd
*, char **);
55 /* Helper functions for HOWTO. */
56 static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
57 (bfd
*, reloc_howto_type
*, asection
*, bfd_byte
*, bfd_vma
,
58 asection
*, bfd_vma
, bfd_vma
);
59 static void nds32_elf_relocate_hi20
60 (bfd
*, int, Elf_Internal_Rela
*, Elf_Internal_Rela
*, bfd_byte
*, bfd_vma
);
61 static reloc_howto_type
*bfd_elf32_bfd_reloc_type_table_lookup
62 (enum elf_nds32_reloc_type
);
63 static reloc_howto_type
*bfd_elf32_bfd_reloc_type_lookup
64 (bfd
*, bfd_reloc_code_real_type
);
67 static void nds32_info_to_howto_rel
68 (bfd
*, arelent
*, Elf_Internal_Rela
*dst
);
69 static void nds32_info_to_howto
70 (bfd
*, arelent
*, Elf_Internal_Rela
*dst
);
71 static bfd_boolean nds32_elf_add_symbol_hook
72 (bfd
*, struct bfd_link_info
*, Elf_Internal_Sym
*, const char **,
73 flagword
*, asection
**, bfd_vma
*);
74 static bfd_boolean nds32_elf_relocate_section
75 (bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
76 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**);
77 static bfd_boolean
nds32_elf_object_p (bfd
*);
78 static void nds32_elf_final_write_processing (bfd
*, bfd_boolean
);
79 static bfd_boolean
nds32_elf_set_private_flags (bfd
*, flagword
);
80 static bfd_boolean
nds32_elf_merge_private_bfd_data (bfd
*, bfd
*);
81 static bfd_boolean
nds32_elf_print_private_bfd_data (bfd
*, void *);
82 static bfd_boolean nds32_elf_gc_sweep_hook
83 (bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*);
84 static bfd_boolean nds32_elf_check_relocs
85 (bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*);
86 static asection
*nds32_elf_gc_mark_hook
87 (asection
*, struct bfd_link_info
*, Elf_Internal_Rela
*,
88 struct elf_link_hash_entry
*, Elf_Internal_Sym
*);
89 static bfd_boolean nds32_elf_adjust_dynamic_symbol
90 (struct bfd_link_info
*, struct elf_link_hash_entry
*);
91 static bfd_boolean nds32_elf_size_dynamic_sections
92 (bfd
*, struct bfd_link_info
*);
93 static bfd_boolean nds32_elf_create_dynamic_sections
94 (bfd
*, struct bfd_link_info
*);
95 static bfd_boolean nds32_elf_finish_dynamic_sections
96 (bfd
*, struct bfd_link_info
*info
);
97 static bfd_boolean nds32_elf_finish_dynamic_symbol
98 (bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
100 static bfd_boolean
nds32_elf_mkobject (bfd
*);
102 /* Nds32 helper functions. */
103 static bfd_reloc_status_type nds32_elf_final_sda_base
104 (bfd
*, struct bfd_link_info
*, bfd_vma
*, bfd_boolean
);
105 static bfd_boolean
allocate_dynrelocs (struct elf_link_hash_entry
*, void *);
106 static bfd_boolean
readonly_dynrelocs (struct elf_link_hash_entry
*, void *);
107 static Elf_Internal_Rela
*find_relocs_at_address
108 (Elf_Internal_Rela
*, Elf_Internal_Rela
*,
109 Elf_Internal_Rela
*, enum elf_nds32_reloc_type
);
110 static bfd_vma calculate_memory_address
111 (bfd
*, Elf_Internal_Rela
*, Elf_Internal_Sym
*, Elf_Internal_Shdr
*);
112 static int nds32_get_section_contents (bfd
*, asection
*,
113 bfd_byte
**, bfd_boolean
);
114 static bfd_boolean nds32_elf_ex9_build_hash_table
115 (bfd
*, asection
*, struct bfd_link_info
*);
116 static bfd_boolean
nds32_elf_ex9_itb_base (struct bfd_link_info
*);
117 static void nds32_elf_ex9_import_table (struct bfd_link_info
*);
118 static void nds32_elf_ex9_finish (struct bfd_link_info
*);
119 static void nds32_elf_ex9_reloc_jmp (struct bfd_link_info
*);
120 static void nds32_elf_get_insn_with_reg
121 (Elf_Internal_Rela
*, uint32_t, uint32_t *);
122 static int nds32_get_local_syms (bfd
*, asection
*ATTRIBUTE_UNUSED
,
123 Elf_Internal_Sym
**);
124 static bfd_boolean nds32_elf_ex9_replace_instruction
125 (struct bfd_link_info
*, bfd
*, asection
*);
126 static bfd_boolean
nds32_elf_ifc_calc (struct bfd_link_info
*, bfd
*,
128 static bfd_boolean
nds32_elf_ifc_finish (struct bfd_link_info
*);
129 static bfd_boolean
nds32_elf_ifc_replace (struct bfd_link_info
*);
130 static bfd_boolean
nds32_elf_ifc_reloc (void);
131 static bfd_boolean nds32_relax_fp_as_gp
132 (struct bfd_link_info
*link_info
, bfd
*abfd
, asection
*sec
,
133 Elf_Internal_Rela
*internal_relocs
, Elf_Internal_Rela
*irelend
,
134 Elf_Internal_Sym
*isymbuf
);
135 static bfd_boolean nds32_fag_remove_unused_fpbase
136 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*internal_relocs
,
137 Elf_Internal_Rela
*irelend
);
139 nds32_elf_get_relocated_section_contents (bfd
*abfd
,
140 struct bfd_link_info
*link_info
,
141 struct bfd_link_order
*link_order
,
143 bfd_boolean relocatable
,
148 MACH_V1
= bfd_mach_n1h
,
149 MACH_V2
= bfd_mach_n1h_v2
,
150 MACH_V3
= bfd_mach_n1h_v3
,
151 MACH_V3M
= bfd_mach_n1h_v3m
154 #define MIN(a, b) ((a) > (b) ? (b) : (a))
155 #define MAX(a, b) ((a) > (b) ? (a) : (b))
157 /* The name of the dynamic interpreter. This is put in the .interp
159 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
161 /* The nop opcode we use. */
162 #define NDS32_NOP32 0x40000009
163 #define NDS32_NOP16 0x9200
165 /* The size in bytes of an entry in the procedure linkage table. */
166 #define PLT_ENTRY_SIZE 24
167 #define PLT_HEADER_SIZE 24
169 /* The first entry in a procedure linkage table are reserved,
170 and the initial contents are unimportant (we zero them out).
171 Subsequent entries look like this. */
172 #define PLT0_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(.got+4) */
173 #define PLT0_ENTRY_WORD1 0x58f78000 /* ori r15, r25, LO12(.got+4) */
174 #define PLT0_ENTRY_WORD2 0x05178000 /* lwi r17, [r15+0] */
175 #define PLT0_ENTRY_WORD3 0x04f78001 /* lwi r15, [r15+4] */
176 #define PLT0_ENTRY_WORD4 0x4a003c00 /* jr r15 */
178 /* $ta is change to $r15 (from $r25). */
179 #define PLT0_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[1]@GOT) */
180 #define PLT0_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[1]@GOT) */
181 #define PLT0_PIC_ENTRY_WORD2 0x40f7f400 /* add r15, gp, r15 */
182 #define PLT0_PIC_ENTRY_WORD3 0x05178000 /* lwi r17, [r15+0] */
183 #define PLT0_PIC_ENTRY_WORD4 0x04f78001 /* lwi r15, [r15+4] */
184 #define PLT0_PIC_ENTRY_WORD5 0x4a003c00 /* jr r15 */
186 #define PLT_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(&got[n+3]) */
187 #define PLT_ENTRY_WORD1 0x04f78000 /* lwi r15, r15, LO12(&got[n+3]) */
188 #define PLT_ENTRY_WORD2 0x4a003c00 /* jr r15 */
189 #define PLT_ENTRY_WORD3 0x45000000 /* movi r16, sizeof(RELA) * n */
190 #define PLT_ENTRY_WORD4 0x48000000 /* j .plt0. */
192 #define PLT_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[n+3]@GOT) */
193 #define PLT_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[n+3]@GOT) */
194 #define PLT_PIC_ENTRY_WORD2 0x38febc02 /* lw r15, [gp+r15] */
195 #define PLT_PIC_ENTRY_WORD3 0x4a003c00 /* jr r15 */
196 #define PLT_PIC_ENTRY_WORD4 0x45000000 /* movi r16, sizeof(RELA) * n */
197 #define PLT_PIC_ENTRY_WORD5 0x48000000 /* j .plt0 */
199 /* These are macros used to get the relocation accurate value. */
200 #define ACCURATE_8BIT_S1 (0x100)
201 #define ACCURATE_U9BIT_S1 (0x400)
202 #define ACCURATE_12BIT_S1 (0x2000)
203 #define ACCURATE_14BIT_S1 (0x4000)
204 #define ACCURATE_19BIT (0x40000)
206 /* These are macros used to get the relocation conservative value. */
207 #define CONSERVATIVE_8BIT_S1 (0x100 - 4)
208 #define CONSERVATIVE_14BIT_S1 (0x4000 - 4)
209 #define CONSERVATIVE_16BIT_S1 (0x10000 - 4)
210 #define CONSERVATIVE_24BIT_S1 (0x1000000 - 4)
211 /* These must be more conservative because the address may be in
212 different segment. */
213 #define CONSERVATIVE_15BIT (0x4000 - 0x1000)
214 #define CONSERVATIVE_15BIT_S1 (0x8000 - 0x1000)
215 #define CONSERVATIVE_15BIT_S2 (0x10000 - 0x1000)
216 #define CONSERVATIVE_19BIT (0x40000 - 0x1000)
217 #define CONSERVATIVE_20BIT (0x80000 - 0x1000)
219 /* Size of small data/bss sections, used to calculate SDA_BASE. */
220 static long got_size
= 0;
221 static int is_SDA_BASE_set
= 0;
222 static int is_ITB_BASE_set
= 0;
224 /* Convert ELF-VER in eflags to string for debugging purpose. */
225 static const char *const nds32_elfver_strtab
[] =
232 /* The nds32 linker needs to keep track of the number of relocs that it
233 decides to copy in check_relocs for each symbol. This is so that
234 it can discard PC relative relocs if it doesn't need them when
235 linking with -Bsymbolic. We store the information in a field
236 extending the regular ELF linker hash table. */
238 /* This structure keeps track of the number of PC relative relocs we
239 have copied for a given symbol. */
241 struct elf_nds32_pcrel_relocs_copied
244 struct elf_nds32_pcrel_relocs_copied
*next
;
245 /* A section in dynobj. */
247 /* Number of relocs copied in this section. */
251 /* The sh linker needs to keep track of the number of relocs that it
252 decides to copy as dynamic relocs in check_relocs for each symbol.
253 This is so that it can later discard them if they are found to be
254 unnecessary. We store the information in a field extending the
255 regular ELF linker hash table. */
257 struct elf_nds32_dyn_relocs
259 struct elf_nds32_dyn_relocs
*next
;
261 /* The input section of the reloc. */
264 /* Total number of relocs copied for the input section. */
267 /* Number of pc-relative relocs copied for the input section. */
268 bfd_size_type pc_count
;
271 /* Nds32 ELF linker hash entry. */
273 struct elf_nds32_link_hash_entry
275 struct elf_link_hash_entry root
;
277 /* Track dynamic relocs copied for this symbol. */
278 struct elf_nds32_dyn_relocs
*dyn_relocs
;
280 /* For checking relocation type. */
281 #define GOT_UNKNOWN 0
284 unsigned int tls_type
;
287 /* Get the nds32 ELF linker hash table from a link_info structure. */
289 #define FP_BASE_NAME "_FP_BASE_"
290 static int check_start_export_sym
= 0;
291 static size_t ex9_relax_size
= 0; /* Save ex9 predicted reducing size. */
293 /* The offset for executable tls relaxation. */
294 #define TP_OFFSET 0x0
296 struct elf_nds32_obj_tdata
298 struct elf_obj_tdata root
;
300 /* tls_type for each local got entry. */
301 char *local_got_tls_type
;
304 #define elf_nds32_tdata(bfd) \
305 ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
307 #define elf32_nds32_local_got_tls_type(bfd) \
308 (elf_nds32_tdata (bfd)->local_got_tls_type)
310 #define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
313 nds32_elf_mkobject (bfd
*abfd
)
315 return bfd_elf_allocate_object (abfd
, sizeof (struct elf_nds32_obj_tdata
),
319 /* Relocations used for relocation. */
320 static reloc_howto_type nds32_elf_howto_table
[] =
322 /* This reloc does nothing. */
323 HOWTO (R_NDS32_NONE
, /* type */
325 3, /* size (0 = byte, 1 = short, 2 = long) */
327 FALSE
, /* pc_relative */
329 complain_overflow_dont
, /* complain_on_overflow */
330 bfd_elf_generic_reloc
, /* special_function */
331 "R_NDS32_NONE", /* name */
332 FALSE
, /* partial_inplace */
335 FALSE
), /* pcrel_offset */
337 /* A 16 bit absolute relocation. */
338 HOWTO (R_NDS32_16
, /* type */
340 1, /* size (0 = byte, 1 = short, 2 = long) */
342 FALSE
, /* pc_relative */
344 complain_overflow_bitfield
, /* complain_on_overflow */
345 nds32_elf_generic_reloc
, /* special_function */
346 "R_NDS32_16", /* name */
347 FALSE
, /* partial_inplace */
348 0xffff, /* src_mask */
349 0xffff, /* dst_mask */
350 FALSE
), /* pcrel_offset */
352 /* A 32 bit absolute relocation. */
353 HOWTO (R_NDS32_32
, /* type */
355 2, /* size (0 = byte, 1 = short, 2 = long) */
357 FALSE
, /* pc_relative */
359 complain_overflow_bitfield
, /* complain_on_overflow */
360 nds32_elf_generic_reloc
, /* special_function */
361 "R_NDS32_32", /* name */
362 FALSE
, /* partial_inplace */
363 0xffffffff, /* src_mask */
364 0xffffffff, /* dst_mask */
365 FALSE
), /* pcrel_offset */
367 /* A 20 bit address. */
368 HOWTO (R_NDS32_20
, /* type */
370 2, /* size (0 = byte, 1 = short, 2 = long) */
372 FALSE
, /* pc_relative */
374 complain_overflow_unsigned
, /* complain_on_overflow */
375 nds32_elf_generic_reloc
, /* special_function */
376 "R_NDS32_20", /* name */
377 FALSE
, /* partial_inplace */
378 0xfffff, /* src_mask */
379 0xfffff, /* dst_mask */
380 FALSE
), /* pcrel_offset */
382 /* An PC Relative 9-bit relocation, shifted by 2.
383 This reloc is complicated because relocations are relative to pc & -4.
384 i.e. branches in the right insn slot use the address of the left insn
386 /* ??? It's not clear whether this should have partial_inplace set or not.
387 Branch relaxing in the assembler can store the addend in the insn,
388 and if bfd_install_relocation gets called the addend may get added
390 HOWTO (R_NDS32_9_PCREL
, /* type */
392 1, /* size (0 = byte, 1 = short, 2 = long) */
394 TRUE
, /* pc_relative */
396 complain_overflow_signed
, /* complain_on_overflow */
397 nds32_elf_9_pcrel_reloc
, /* special_function */
398 "R_NDS32_9_PCREL", /* name */
399 FALSE
, /* partial_inplace */
402 TRUE
), /* pcrel_offset */
404 /* A relative 15 bit relocation, right shifted by 1. */
405 HOWTO (R_NDS32_15_PCREL
, /* type */
407 2, /* size (0 = byte, 1 = short, 2 = long) */
409 TRUE
, /* pc_relative */
411 complain_overflow_signed
, /* complain_on_overflow */
412 bfd_elf_generic_reloc
, /* special_function */
413 "R_NDS32_15_PCREL", /* name */
414 FALSE
, /* partial_inplace */
415 0x3fff, /* src_mask */
416 0x3fff, /* dst_mask */
417 TRUE
), /* pcrel_offset */
419 /* A relative 17 bit relocation, right shifted by 1. */
420 HOWTO (R_NDS32_17_PCREL
, /* type */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
424 TRUE
, /* pc_relative */
426 complain_overflow_signed
, /* complain_on_overflow */
427 bfd_elf_generic_reloc
, /* special_function */
428 "R_NDS32_17_PCREL", /* name */
429 FALSE
, /* partial_inplace */
430 0xffff, /* src_mask */
431 0xffff, /* dst_mask */
432 TRUE
), /* pcrel_offset */
434 /* A relative 25 bit relocation, right shifted by 1. */
435 /* ??? It's not clear whether this should have partial_inplace set or not.
436 Branch relaxing in the assembler can store the addend in the insn,
437 and if bfd_install_relocation gets called the addend may get added
439 HOWTO (R_NDS32_25_PCREL
, /* type */
441 2, /* size (0 = byte, 1 = short, 2 = long) */
443 TRUE
, /* pc_relative */
445 complain_overflow_signed
, /* complain_on_overflow */
446 bfd_elf_generic_reloc
, /* special_function */
447 "R_NDS32_25_PCREL", /* name */
448 FALSE
, /* partial_inplace */
449 0xffffff, /* src_mask */
450 0xffffff, /* dst_mask */
451 TRUE
), /* pcrel_offset */
453 /* High 20 bits of address when lower 12 is or'd in. */
454 HOWTO (R_NDS32_HI20
, /* type */
456 2, /* size (0 = byte, 1 = short, 2 = long) */
458 FALSE
, /* pc_relative */
460 complain_overflow_dont
,/* complain_on_overflow */
461 nds32_elf_hi20_reloc
, /* special_function */
462 "R_NDS32_HI20", /* name */
463 FALSE
, /* partial_inplace */
464 0x000fffff, /* src_mask */
465 0x000fffff, /* dst_mask */
466 FALSE
), /* pcrel_offset */
468 /* Lower 12 bits of address. */
469 HOWTO (R_NDS32_LO12S3
, /* type */
471 2, /* size (0 = byte, 1 = short, 2 = long) */
473 FALSE
, /* pc_relative */
475 complain_overflow_dont
,/* complain_on_overflow */
476 nds32_elf_lo12_reloc
, /* special_function */
477 "R_NDS32_LO12S3", /* name */
478 FALSE
, /* partial_inplace */
479 0x000001ff, /* src_mask */
480 0x000001ff, /* dst_mask */
481 FALSE
), /* pcrel_offset */
483 /* Lower 12 bits of address. */
484 HOWTO (R_NDS32_LO12S2
, /* type */
486 2, /* size (0 = byte, 1 = short, 2 = long) */
488 FALSE
, /* pc_relative */
490 complain_overflow_dont
,/* complain_on_overflow */
491 nds32_elf_lo12_reloc
, /* special_function */
492 "R_NDS32_LO12S2", /* name */
493 FALSE
, /* partial_inplace */
494 0x000003ff, /* src_mask */
495 0x000003ff, /* dst_mask */
496 FALSE
), /* pcrel_offset */
498 /* Lower 12 bits of address. */
499 HOWTO (R_NDS32_LO12S1
, /* type */
501 2, /* size (0 = byte, 1 = short, 2 = long) */
503 FALSE
, /* pc_relative */
505 complain_overflow_dont
,/* complain_on_overflow */
506 nds32_elf_lo12_reloc
, /* special_function */
507 "R_NDS32_LO12S1", /* name */
508 FALSE
, /* partial_inplace */
509 0x000007ff, /* src_mask */
510 0x000007ff, /* dst_mask */
511 FALSE
), /* pcrel_offset */
513 /* Lower 12 bits of address. */
514 HOWTO (R_NDS32_LO12S0
, /* type */
516 2, /* size (0 = byte, 1 = short, 2 = long) */
518 FALSE
, /* pc_relative */
520 complain_overflow_dont
,/* complain_on_overflow */
521 nds32_elf_lo12_reloc
, /* special_function */
522 "R_NDS32_LO12S0", /* name */
523 FALSE
, /* partial_inplace */
524 0x00000fff, /* src_mask */
525 0x00000fff, /* dst_mask */
526 FALSE
), /* pcrel_offset */
528 /* Small data area 15 bits offset. */
529 HOWTO (R_NDS32_SDA15S3
, /* type */
531 2, /* size (0 = byte, 1 = short, 2 = long) */
533 FALSE
, /* pc_relative */
535 complain_overflow_signed
, /* complain_on_overflow */
536 nds32_elf_sda15_reloc
, /* special_function */
537 "R_NDS32_SDA15S3", /* name */
538 FALSE
, /* partial_inplace */
539 0x00007fff, /* src_mask */
540 0x00007fff, /* dst_mask */
541 FALSE
), /* pcrel_offset */
543 /* Small data area 15 bits offset. */
544 HOWTO (R_NDS32_SDA15S2
, /* type */
546 2, /* size (0 = byte, 1 = short, 2 = long) */
548 FALSE
, /* pc_relative */
550 complain_overflow_signed
, /* complain_on_overflow */
551 nds32_elf_sda15_reloc
, /* special_function */
552 "R_NDS32_SDA15S2", /* name */
553 FALSE
, /* partial_inplace */
554 0x00007fff, /* src_mask */
555 0x00007fff, /* dst_mask */
556 FALSE
), /* pcrel_offset */
558 /* Small data area 15 bits offset. */
559 HOWTO (R_NDS32_SDA15S1
, /* type */
561 2, /* size (0 = byte, 1 = short, 2 = long) */
563 FALSE
, /* pc_relative */
565 complain_overflow_signed
, /* complain_on_overflow */
566 nds32_elf_sda15_reloc
, /* special_function */
567 "R_NDS32_SDA15S1", /* name */
568 FALSE
, /* partial_inplace */
569 0x00007fff, /* src_mask */
570 0x00007fff, /* dst_mask */
571 FALSE
), /* pcrel_offset */
573 /* Small data area 15 bits offset. */
574 HOWTO (R_NDS32_SDA15S0
, /* type */
576 2, /* size (0 = byte, 1 = short, 2 = long) */
578 FALSE
, /* pc_relative */
580 complain_overflow_signed
, /* complain_on_overflow */
581 nds32_elf_sda15_reloc
, /* special_function */
582 "R_NDS32_SDA15S0", /* name */
583 FALSE
, /* partial_inplace */
584 0x00007fff, /* src_mask */
585 0x00007fff, /* dst_mask */
586 FALSE
), /* pcrel_offset */
588 /* GNU extension to record C++ vtable hierarchy */
589 HOWTO (R_NDS32_GNU_VTINHERIT
, /* type */
591 2, /* size (0 = byte, 1 = short, 2 = long) */
593 FALSE
, /* pc_relative */
595 complain_overflow_dont
,/* complain_on_overflow */
596 NULL
, /* special_function */
597 "R_NDS32_GNU_VTINHERIT", /* name */
598 FALSE
, /* partial_inplace */
601 FALSE
), /* pcrel_offset */
603 /* GNU extension to record C++ vtable member usage */
604 HOWTO (R_NDS32_GNU_VTENTRY
, /* type */
606 2, /* size (0 = byte, 1 = short, 2 = long) */
608 FALSE
, /* pc_relative */
610 complain_overflow_dont
,/* complain_on_overflow */
611 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
612 "R_NDS32_GNU_VTENTRY", /* name */
613 FALSE
, /* partial_inplace */
616 FALSE
), /* pcrel_offset */
618 /* A 16 bit absolute relocation. */
619 HOWTO (R_NDS32_16_RELA
, /* type */
621 1, /* size (0 = byte, 1 = short, 2 = long) */
623 FALSE
, /* pc_relative */
625 complain_overflow_bitfield
, /* complain_on_overflow */
626 bfd_elf_generic_reloc
, /* special_function */
627 "R_NDS32_16_RELA", /* name */
628 FALSE
, /* partial_inplace */
629 0xffff, /* src_mask */
630 0xffff, /* dst_mask */
631 FALSE
), /* pcrel_offset */
633 /* A 32 bit absolute relocation. */
634 HOWTO (R_NDS32_32_RELA
, /* type */
636 2, /* size (0 = byte, 1 = short, 2 = long) */
638 FALSE
, /* pc_relative */
640 complain_overflow_bitfield
, /* complain_on_overflow */
641 bfd_elf_generic_reloc
, /* special_function */
642 "R_NDS32_32_RELA", /* name */
643 FALSE
, /* partial_inplace */
644 0xffffffff, /* src_mask */
645 0xffffffff, /* dst_mask */
646 FALSE
), /* pcrel_offset */
648 /* A 20 bit address. */
649 HOWTO (R_NDS32_20_RELA
, /* type */
651 2, /* size (0 = byte, 1 = short, 2 = long) */
653 FALSE
, /* pc_relative */
655 complain_overflow_signed
, /* complain_on_overflow */
656 bfd_elf_generic_reloc
, /* special_function */
657 "R_NDS32_20_RELA", /* name */
658 FALSE
, /* partial_inplace */
659 0xfffff, /* src_mask */
660 0xfffff, /* dst_mask */
661 FALSE
), /* pcrel_offset */
663 HOWTO (R_NDS32_9_PCREL_RELA
, /* type */
665 1, /* size (0 = byte, 1 = short, 2 = long) */
667 TRUE
, /* pc_relative */
669 complain_overflow_signed
, /* complain_on_overflow */
670 bfd_elf_generic_reloc
, /* special_function */
671 "R_NDS32_9_PCREL_RELA",/* name */
672 FALSE
, /* partial_inplace */
675 TRUE
), /* pcrel_offset */
677 /* A relative 15 bit relocation, right shifted by 1. */
678 HOWTO (R_NDS32_15_PCREL_RELA
, /* type */
680 2, /* size (0 = byte, 1 = short, 2 = long) */
682 TRUE
, /* pc_relative */
684 complain_overflow_signed
, /* complain_on_overflow */
685 bfd_elf_generic_reloc
, /* special_function */
686 "R_NDS32_15_PCREL_RELA", /* name */
687 FALSE
, /* partial_inplace */
688 0x3fff, /* src_mask */
689 0x3fff, /* dst_mask */
690 TRUE
), /* pcrel_offset */
692 /* A relative 17 bit relocation, right shifted by 1. */
693 HOWTO (R_NDS32_17_PCREL_RELA
, /* type */
695 2, /* size (0 = byte, 1 = short, 2 = long) */
697 TRUE
, /* pc_relative */
699 complain_overflow_signed
, /* complain_on_overflow */
700 bfd_elf_generic_reloc
, /* special_function */
701 "R_NDS32_17_PCREL_RELA", /* name */
702 FALSE
, /* partial_inplace */
703 0xffff, /* src_mask */
704 0xffff, /* dst_mask */
705 TRUE
), /* pcrel_offset */
707 /* A relative 25 bit relocation, right shifted by 2. */
708 HOWTO (R_NDS32_25_PCREL_RELA
, /* type */
710 2, /* size (0 = byte, 1 = short, 2 = long) */
712 TRUE
, /* pc_relative */
714 complain_overflow_signed
, /* complain_on_overflow */
715 bfd_elf_generic_reloc
, /* special_function */
716 "R_NDS32_25_PCREL_RELA", /* name */
717 FALSE
, /* partial_inplace */
718 0xffffff, /* src_mask */
719 0xffffff, /* dst_mask */
720 TRUE
), /* pcrel_offset */
722 /* High 20 bits of address when lower 16 is or'd in. */
723 HOWTO (R_NDS32_HI20_RELA
, /* type */
725 2, /* size (0 = byte, 1 = short, 2 = long) */
727 FALSE
, /* pc_relative */
729 complain_overflow_dont
,/* complain_on_overflow */
730 bfd_elf_generic_reloc
, /* special_function */
731 "R_NDS32_HI20_RELA", /* name */
732 FALSE
, /* partial_inplace */
733 0x000fffff, /* src_mask */
734 0x000fffff, /* dst_mask */
735 FALSE
), /* pcrel_offset */
737 /* Lower 12 bits of address. */
738 HOWTO (R_NDS32_LO12S3_RELA
, /* type */
740 2, /* size (0 = byte, 1 = short, 2 = long) */
742 FALSE
, /* pc_relative */
744 complain_overflow_dont
,/* complain_on_overflow */
745 bfd_elf_generic_reloc
, /* special_function */
746 "R_NDS32_LO12S3_RELA", /* name */
747 FALSE
, /* partial_inplace */
748 0x000001ff, /* src_mask */
749 0x000001ff, /* dst_mask */
750 FALSE
), /* pcrel_offset */
752 /* Lower 12 bits of address. */
753 HOWTO (R_NDS32_LO12S2_RELA
, /* type */
755 2, /* size (0 = byte, 1 = short, 2 = long) */
757 FALSE
, /* pc_relative */
759 complain_overflow_dont
,/* complain_on_overflow */
760 bfd_elf_generic_reloc
, /* special_function */
761 "R_NDS32_LO12S2_RELA", /* name */
762 FALSE
, /* partial_inplace */
763 0x000003ff, /* src_mask */
764 0x000003ff, /* dst_mask */
765 FALSE
), /* pcrel_offset */
767 /* Lower 12 bits of address. */
768 HOWTO (R_NDS32_LO12S1_RELA
, /* type */
770 2, /* size (0 = byte, 1 = short, 2 = long) */
772 FALSE
, /* pc_relative */
774 complain_overflow_dont
,/* complain_on_overflow */
775 bfd_elf_generic_reloc
, /* special_function */
776 "R_NDS32_LO12S1_RELA", /* name */
777 FALSE
, /* partial_inplace */
778 0x000007ff, /* src_mask */
779 0x000007ff, /* dst_mask */
780 FALSE
), /* pcrel_offset */
782 /* Lower 12 bits of address. */
783 HOWTO (R_NDS32_LO12S0_RELA
, /* type */
785 2, /* size (0 = byte, 1 = short, 2 = long) */
787 FALSE
, /* pc_relative */
789 complain_overflow_dont
,/* complain_on_overflow */
790 bfd_elf_generic_reloc
, /* special_function */
791 "R_NDS32_LO12S0_RELA", /* name */
792 FALSE
, /* partial_inplace */
793 0x00000fff, /* src_mask */
794 0x00000fff, /* dst_mask */
795 FALSE
), /* pcrel_offset */
797 /* Small data area 15 bits offset. */
798 HOWTO (R_NDS32_SDA15S3_RELA
, /* type */
800 2, /* size (0 = byte, 1 = short, 2 = long) */
802 FALSE
, /* pc_relative */
804 complain_overflow_signed
, /* complain_on_overflow */
805 bfd_elf_generic_reloc
, /* special_function */
806 "R_NDS32_SDA15S3_RELA",/* name */
807 FALSE
, /* partial_inplace */
808 0x00007fff, /* src_mask */
809 0x00007fff, /* dst_mask */
810 FALSE
), /* pcrel_offset */
812 /* Small data area 15 bits offset. */
813 HOWTO (R_NDS32_SDA15S2_RELA
, /* type */
815 2, /* size (0 = byte, 1 = short, 2 = long) */
817 FALSE
, /* pc_relative */
819 complain_overflow_signed
, /* complain_on_overflow */
820 bfd_elf_generic_reloc
, /* special_function */
821 "R_NDS32_SDA15S2_RELA",/* name */
822 FALSE
, /* partial_inplace */
823 0x00007fff, /* src_mask */
824 0x00007fff, /* dst_mask */
825 FALSE
), /* pcrel_offset */
827 HOWTO (R_NDS32_SDA15S1_RELA
, /* type */
829 2, /* size (0 = byte, 1 = short, 2 = long) */
831 FALSE
, /* pc_relative */
833 complain_overflow_signed
, /* complain_on_overflow */
834 bfd_elf_generic_reloc
, /* special_function */
835 "R_NDS32_SDA15S1_RELA",/* name */
836 FALSE
, /* partial_inplace */
837 0x00007fff, /* src_mask */
838 0x00007fff, /* dst_mask */
839 FALSE
), /* pcrel_offset */
841 HOWTO (R_NDS32_SDA15S0_RELA
, /* type */
843 2, /* size (0 = byte, 1 = short, 2 = long) */
845 FALSE
, /* pc_relative */
847 complain_overflow_signed
, /* complain_on_overflow */
848 bfd_elf_generic_reloc
, /* special_function */
849 "R_NDS32_SDA15S0_RELA",/* name */
850 FALSE
, /* partial_inplace */
851 0x00007fff, /* src_mask */
852 0x00007fff, /* dst_mask */
853 FALSE
), /* pcrel_offset */
855 /* GNU extension to record C++ vtable hierarchy */
856 HOWTO (R_NDS32_RELA_GNU_VTINHERIT
, /* type */
858 2, /* size (0 = byte, 1 = short, 2 = long) */
860 FALSE
, /* pc_relative */
862 complain_overflow_dont
,/* complain_on_overflow */
863 NULL
, /* special_function */
864 "R_NDS32_RELA_GNU_VTINHERIT", /* name */
865 FALSE
, /* partial_inplace */
868 FALSE
), /* pcrel_offset */
870 /* GNU extension to record C++ vtable member usage */
871 HOWTO (R_NDS32_RELA_GNU_VTENTRY
, /* type */
873 2, /* size (0 = byte, 1 = short, 2 = long) */
875 FALSE
, /* pc_relative */
877 complain_overflow_dont
,/* complain_on_overflow */
878 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
879 "R_NDS32_RELA_GNU_VTENTRY", /* name */
880 FALSE
, /* partial_inplace */
883 FALSE
), /* pcrel_offset */
885 /* Like R_NDS32_20, but referring to the GOT table entry for
887 HOWTO (R_NDS32_GOT20
, /* type */
889 2, /* size (0 = byte, 1 = short, 2 = long) */
891 FALSE
, /* pc_relative */
893 complain_overflow_signed
, /* complain_on_overflow */
894 bfd_elf_generic_reloc
, /* special_function */
895 "R_NDS32_GOT20", /* name */
896 FALSE
, /* partial_inplace */
897 0xfffff, /* src_mask */
898 0xfffff, /* dst_mask */
899 FALSE
), /* pcrel_offset */
901 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
902 entry for the symbol. */
903 HOWTO (R_NDS32_25_PLTREL
, /* type */
905 2, /* size (0 = byte, 1 = short, 2 = long) */
907 TRUE
, /* pc_relative */
909 complain_overflow_signed
, /* complain_on_overflow */
910 bfd_elf_generic_reloc
, /* special_function */
911 "R_NDS32_25_PLTREL", /* name */
912 FALSE
, /* partial_inplace */
913 0xffffff, /* src_mask */
914 0xffffff, /* dst_mask */
915 TRUE
), /* pcrel_offset */
917 /* This is used only by the dynamic linker. The symbol should exist
918 both in the object being run and in some shared library. The
919 dynamic linker copies the data addressed by the symbol from the
920 shared library into the object, because the object being
921 run has to have the data at some particular address. */
922 HOWTO (R_NDS32_COPY
, /* type */
924 2, /* size (0 = byte, 1 = short, 2 = long) */
926 FALSE
, /* pc_relative */
928 complain_overflow_bitfield
, /* complain_on_overflow */
929 bfd_elf_generic_reloc
, /* special_function */
930 "R_NDS32_COPY", /* name */
931 FALSE
, /* partial_inplace */
932 0xffffffff, /* src_mask */
933 0xffffffff, /* dst_mask */
934 FALSE
), /* pcrel_offset */
936 /* Like R_NDS32_20, but used when setting global offset table
938 HOWTO (R_NDS32_GLOB_DAT
, /* type */
940 2, /* size (0 = byte, 1 = short, 2 = long) */
942 FALSE
, /* pc_relative */
944 complain_overflow_bitfield
, /* complain_on_overflow */
945 bfd_elf_generic_reloc
, /* special_function */
946 "R_NDS32_GLOB_DAT", /* name */
947 FALSE
, /* partial_inplace */
948 0xffffffff, /* src_mask */
949 0xffffffff, /* dst_mask */
950 FALSE
), /* pcrel_offset */
952 /* Marks a procedure linkage table entry for a symbol. */
953 HOWTO (R_NDS32_JMP_SLOT
, /* type */
955 2, /* size (0 = byte, 1 = short, 2 = long) */
957 FALSE
, /* pc_relative */
959 complain_overflow_bitfield
, /* complain_on_overflow */
960 bfd_elf_generic_reloc
, /* special_function */
961 "R_NDS32_JMP_SLOT", /* name */
962 FALSE
, /* partial_inplace */
963 0xffffffff, /* src_mask */
964 0xffffffff, /* dst_mask */
965 FALSE
), /* pcrel_offset */
967 /* Used only by the dynamic linker. When the object is run, this
968 longword is set to the load address of the object, plus the
970 HOWTO (R_NDS32_RELATIVE
, /* type */
972 2, /* size (0 = byte, 1 = short, 2 = long) */
974 FALSE
, /* pc_relative */
976 complain_overflow_bitfield
, /* complain_on_overflow */
977 bfd_elf_generic_reloc
, /* special_function */
978 "R_NDS32_RELATIVE", /* name */
979 FALSE
, /* partial_inplace */
980 0xffffffff, /* src_mask */
981 0xffffffff, /* dst_mask */
982 FALSE
), /* pcrel_offset */
984 HOWTO (R_NDS32_GOTOFF
, /* type */
986 2, /* size (0 = byte, 1 = short, 2 = long) */
988 FALSE
, /* pc_relative */
990 complain_overflow_signed
, /* complain_on_overflow */
991 bfd_elf_generic_reloc
, /* special_function */
992 "R_NDS32_GOTOFF", /* name */
993 FALSE
, /* partial_inplace */
994 0xfffff, /* src_mask */
995 0xfffff, /* dst_mask */
996 FALSE
), /* pcrel_offset */
998 /* An PC Relative 20-bit relocation used when setting PIC offset
1000 HOWTO (R_NDS32_GOTPC20
, /* type */
1002 2, /* size (0 = byte, 1 = short, 2 = long) */
1004 TRUE
, /* pc_relative */
1006 complain_overflow_signed
, /* complain_on_overflow */
1007 bfd_elf_generic_reloc
, /* special_function */
1008 "R_NDS32_GOTPC20", /* name */
1009 FALSE
, /* partial_inplace */
1010 0xfffff, /* src_mask */
1011 0xfffff, /* dst_mask */
1012 TRUE
), /* pcrel_offset */
1014 /* Like R_NDS32_HI20, but referring to the GOT table entry for
1016 HOWTO (R_NDS32_GOT_HI20
, /* type */
1017 12, /* rightshift */
1018 2, /* size (0 = byte, 1 = short, 2 = long) */
1020 FALSE
, /* pc_relative */
1022 complain_overflow_dont
,/* complain_on_overflow */
1023 bfd_elf_generic_reloc
, /* special_function */
1024 "R_NDS32_GOT_HI20", /* name */
1025 FALSE
, /* partial_inplace */
1026 0x000fffff, /* src_mask */
1027 0x000fffff, /* dst_mask */
1028 FALSE
), /* pcrel_offset */
1029 HOWTO (R_NDS32_GOT_LO12
, /* type */
1031 2, /* size (0 = byte, 1 = short, 2 = long) */
1033 FALSE
, /* pc_relative */
1035 complain_overflow_dont
,/* complain_on_overflow */
1036 bfd_elf_generic_reloc
, /* special_function */
1037 "R_NDS32_GOT_LO12", /* name */
1038 FALSE
, /* partial_inplace */
1039 0x00000fff, /* src_mask */
1040 0x00000fff, /* dst_mask */
1041 FALSE
), /* pcrel_offset */
1043 /* An PC Relative relocation used when setting PIC offset table register.
1044 Like R_NDS32_HI20, but referring to the GOT table entry for
1046 HOWTO (R_NDS32_GOTPC_HI20
, /* type */
1047 12, /* rightshift */
1048 2, /* size (0 = byte, 1 = short, 2 = long) */
1050 FALSE
, /* pc_relative */
1052 complain_overflow_dont
,/* complain_on_overflow */
1053 bfd_elf_generic_reloc
, /* special_function */
1054 "R_NDS32_GOTPC_HI20", /* name */
1055 FALSE
, /* partial_inplace */
1056 0x000fffff, /* src_mask */
1057 0x000fffff, /* dst_mask */
1058 TRUE
), /* pcrel_offset */
1059 HOWTO (R_NDS32_GOTPC_LO12
, /* type */
1061 2, /* size (0 = byte, 1 = short, 2 = long) */
1063 FALSE
, /* pc_relative */
1065 complain_overflow_dont
, /* complain_on_overflow */
1066 bfd_elf_generic_reloc
, /* special_function */
1067 "R_NDS32_GOTPC_LO12", /* name */
1068 FALSE
, /* partial_inplace */
1069 0x00000fff, /* src_mask */
1070 0x00000fff, /* dst_mask */
1071 TRUE
), /* pcrel_offset */
1073 HOWTO (R_NDS32_GOTOFF_HI20
, /* type */
1074 12, /* rightshift */
1075 2, /* size (0 = byte, 1 = short, 2 = long) */
1077 FALSE
, /* pc_relative */
1079 complain_overflow_dont
,/* complain_on_overflow */
1080 bfd_elf_generic_reloc
, /* special_function */
1081 "R_NDS32_GOTOFF_HI20", /* name */
1082 FALSE
, /* partial_inplace */
1083 0x000fffff, /* src_mask */
1084 0x000fffff, /* dst_mask */
1085 FALSE
), /* pcrel_offset */
1086 HOWTO (R_NDS32_GOTOFF_LO12
, /* type */
1088 2, /* size (0 = byte, 1 = short, 2 = long) */
1090 FALSE
, /* pc_relative */
1092 complain_overflow_dont
,/* complain_on_overflow */
1093 bfd_elf_generic_reloc
, /* special_function */
1094 "R_NDS32_GOTOFF_LO12", /* name */
1095 FALSE
, /* partial_inplace */
1096 0x00000fff, /* src_mask */
1097 0x00000fff, /* dst_mask */
1098 FALSE
), /* pcrel_offset */
1100 /* Alignment hint for relaxable instruction. This is used with
1101 R_NDS32_LABEL as a pair. Relax this instruction from 4 bytes to 2
1102 in order to make next label aligned on word boundary. */
1103 HOWTO (R_NDS32_INSN16
, /* type */
1105 2, /* size (0 = byte, 1 = short, 2 = long) */
1107 FALSE
, /* pc_relative */
1109 complain_overflow_dont
,/* complain_on_overflow */
1110 nds32_elf_ignore_reloc
,/* special_function */
1111 "R_NDS32_INSN16", /* name */
1112 FALSE
, /* partial_inplace */
1113 0x00000fff, /* src_mask */
1114 0x00000fff, /* dst_mask */
1115 FALSE
), /* pcrel_offset */
1117 /* Alignment hint for label. */
1118 HOWTO (R_NDS32_LABEL
, /* type */
1120 2, /* size (0 = byte, 1 = short, 2 = long) */
1122 FALSE
, /* pc_relative */
1124 complain_overflow_dont
,/* complain_on_overflow */
1125 nds32_elf_ignore_reloc
,/* special_function */
1126 "R_NDS32_LABEL", /* name */
1127 FALSE
, /* partial_inplace */
1128 0xffffffff, /* src_mask */
1129 0xffffffff, /* dst_mask */
1130 FALSE
), /* pcrel_offset */
1132 /* Relax hint for unconditional call sequence */
1133 HOWTO (R_NDS32_LONGCALL1
, /* type */
1135 2, /* size (0 = byte, 1 = short, 2 = long) */
1137 FALSE
, /* pc_relative */
1139 complain_overflow_dont
,/* complain_on_overflow */
1140 nds32_elf_ignore_reloc
,/* special_function */
1141 "R_NDS32_LONGCALL1", /* name */
1142 FALSE
, /* partial_inplace */
1143 0xffffffff, /* src_mask */
1144 0xffffffff, /* dst_mask */
1145 FALSE
), /* pcrel_offset */
1147 /* Relax hint for conditional call sequence. */
1148 HOWTO (R_NDS32_LONGCALL2
, /* type */
1150 2, /* size (0 = byte, 1 = short, 2 = long) */
1152 FALSE
, /* pc_relative */
1154 complain_overflow_dont
,/* complain_on_overflow */
1155 nds32_elf_ignore_reloc
,/* special_function */
1156 "R_NDS32_LONGCALL2", /* name */
1157 FALSE
, /* partial_inplace */
1158 0xffffffff, /* src_mask */
1159 0xffffffff, /* dst_mask */
1160 FALSE
), /* pcrel_offset */
1162 /* Relax hint for conditional call sequence. */
1163 HOWTO (R_NDS32_LONGCALL3
, /* type */
1165 2, /* size (0 = byte, 1 = short, 2 = long) */
1167 FALSE
, /* pc_relative */
1169 complain_overflow_dont
,/* complain_on_overflow */
1170 nds32_elf_ignore_reloc
,/* special_function */
1171 "R_NDS32_LONGCALL3", /* name */
1172 FALSE
, /* partial_inplace */
1173 0xffffffff, /* src_mask */
1174 0xffffffff, /* dst_mask */
1175 FALSE
), /* pcrel_offset */
1177 /* Relax hint for unconditional branch sequence. */
1178 HOWTO (R_NDS32_LONGJUMP1
, /* type */
1180 2, /* size (0 = byte, 1 = short, 2 = long) */
1182 FALSE
, /* pc_relative */
1184 complain_overflow_dont
,/* complain_on_overflow */
1185 nds32_elf_ignore_reloc
,/* special_function */
1186 "R_NDS32_LONGJUMP1", /* name */
1187 FALSE
, /* partial_inplace */
1188 0xffffffff, /* src_mask */
1189 0xffffffff, /* dst_mask */
1190 FALSE
), /* pcrel_offset */
1192 /* Relax hint for conditional branch sequence. */
1193 HOWTO (R_NDS32_LONGJUMP2
, /* type */
1195 2, /* size (0 = byte, 1 = short, 2 = long) */
1197 FALSE
, /* pc_relative */
1199 complain_overflow_dont
,/* complain_on_overflow */
1200 nds32_elf_ignore_reloc
,/* special_function */
1201 "R_NDS32_LONGJUMP2", /* name */
1202 FALSE
, /* partial_inplace */
1203 0xffffffff, /* src_mask */
1204 0xffffffff, /* dst_mask */
1205 FALSE
), /* pcrel_offset */
1207 /* Relax hint for conditional branch sequence. */
1208 HOWTO (R_NDS32_LONGJUMP3
, /* type */
1210 2, /* size (0 = byte, 1 = short, 2 = long) */
1212 FALSE
, /* pc_relative */
1214 complain_overflow_dont
,/* complain_on_overflow */
1215 nds32_elf_ignore_reloc
,/* special_function */
1216 "R_NDS32_LONGJUMP3", /* name */
1217 FALSE
, /* partial_inplace */
1218 0xffffffff, /* src_mask */
1219 0xffffffff, /* dst_mask */
1220 FALSE
), /* pcrel_offset */
1222 /* Relax hint for load/store sequence. */
1223 HOWTO (R_NDS32_LOADSTORE
, /* type */
1225 2, /* size (0 = byte, 1 = short, 2 = long) */
1227 FALSE
, /* pc_relative */
1229 complain_overflow_dont
,/* complain_on_overflow */
1230 nds32_elf_ignore_reloc
,/* special_function */
1231 "R_NDS32_LOADSTORE", /* name */
1232 FALSE
, /* partial_inplace */
1233 0xffffffff, /* src_mask */
1234 0xffffffff, /* dst_mask */
1235 FALSE
), /* pcrel_offset */
1237 /* Relax hint for load/store sequence. */
1238 HOWTO (R_NDS32_9_FIXED_RELA
, /* type */
1240 1, /* size (0 = byte, 1 = short, 2 = long) */
1242 FALSE
, /* pc_relative */
1244 complain_overflow_dont
,/* complain_on_overflow */
1245 nds32_elf_ignore_reloc
,/* special_function */
1246 "R_NDS32_9_FIXED_RELA",/* name */
1247 FALSE
, /* partial_inplace */
1248 0x000000ff, /* src_mask */
1249 0x000000ff, /* dst_mask */
1250 FALSE
), /* pcrel_offset */
1252 /* Relax hint for load/store sequence. */
1253 HOWTO (R_NDS32_15_FIXED_RELA
, /* type */
1255 2, /* size (0 = byte, 1 = short, 2 = long) */
1257 FALSE
, /* pc_relative */
1259 complain_overflow_dont
,/* complain_on_overflow */
1260 nds32_elf_ignore_reloc
,/* special_function */
1261 "R_NDS32_15_FIXED_RELA", /* name */
1262 FALSE
, /* partial_inplace */
1263 0x00003fff, /* src_mask */
1264 0x00003fff, /* dst_mask */
1265 FALSE
), /* pcrel_offset */
1267 /* Relax hint for load/store sequence. */
1268 HOWTO (R_NDS32_17_FIXED_RELA
, /* type */
1270 2, /* size (0 = byte, 1 = short, 2 = long) */
1272 FALSE
, /* pc_relative */
1274 complain_overflow_dont
,/* complain_on_overflow */
1275 nds32_elf_ignore_reloc
,/* special_function */
1276 "R_NDS32_17_FIXED_RELA", /* name */
1277 FALSE
, /* partial_inplace */
1278 0x0000ffff, /* src_mask */
1279 0x0000ffff, /* dst_mask */
1280 FALSE
), /* pcrel_offset */
1282 /* Relax hint for load/store sequence. */
1283 HOWTO (R_NDS32_25_FIXED_RELA
, /* type */
1285 2, /* size (0 = byte, 1 = short, 2 = long) */
1287 FALSE
, /* pc_relative */
1289 complain_overflow_dont
,/* complain_on_overflow */
1290 nds32_elf_ignore_reloc
,/* special_function */
1291 "R_NDS32_25_FIXED_RELA", /* name */
1292 FALSE
, /* partial_inplace */
1293 0x00ffffff, /* src_mask */
1294 0x00ffffff, /* dst_mask */
1295 FALSE
), /* pcrel_offset */
1297 /* High 20 bits of PLT symbol offset relative to PC. */
1298 HOWTO (R_NDS32_PLTREL_HI20
, /* type */
1299 12, /* rightshift */
1300 2, /* size (0 = byte, 1 = short, 2 = long) */
1302 FALSE
, /* pc_relative */
1304 complain_overflow_dont
,/* complain_on_overflow */
1305 bfd_elf_generic_reloc
, /* special_function */
1306 "R_NDS32_PLTREL_HI20", /* name */
1307 FALSE
, /* partial_inplace */
1308 0x000fffff, /* src_mask */
1309 0x000fffff, /* dst_mask */
1310 FALSE
), /* pcrel_offset */
1312 /* Low 12 bits of PLT symbol offset relative to PC. */
1313 HOWTO (R_NDS32_PLTREL_LO12
, /* type */
1315 2, /* size (0 = byte, 1 = short, 2 = long) */
1317 FALSE
, /* pc_relative */
1319 complain_overflow_dont
,/* complain_on_overflow */
1320 bfd_elf_generic_reloc
, /* special_function */
1321 "R_NDS32_PLTREL_LO12", /* name */
1322 FALSE
, /* partial_inplace */
1323 0x00000fff, /* src_mask */
1324 0x00000fff, /* dst_mask */
1325 FALSE
), /* pcrel_offset */
1327 /* High 20 bits of PLT symbol offset relative to GOT (GP). */
1328 HOWTO (R_NDS32_PLT_GOTREL_HI20
, /* type */
1329 12, /* rightshift */
1330 2, /* size (0 = byte, 1 = short, 2 = long) */
1332 FALSE
, /* pc_relative */
1334 complain_overflow_dont
,/* complain_on_overflow */
1335 bfd_elf_generic_reloc
, /* special_function */
1336 "R_NDS32_PLT_GOTREL_HI20", /* name */
1337 FALSE
, /* partial_inplace */
1338 0x000fffff, /* src_mask */
1339 0x000fffff, /* dst_mask */
1340 FALSE
), /* pcrel_offset */
1342 /* Low 12 bits of PLT symbol offset relative to GOT (GP). */
1343 HOWTO (R_NDS32_PLT_GOTREL_LO12
, /* type */
1345 2, /* size (0 = byte, 1 = short, 2 = long) */
1347 FALSE
, /* pc_relative */
1349 complain_overflow_dont
,/* complain_on_overflow */
1350 bfd_elf_generic_reloc
, /* special_function */
1351 "R_NDS32_PLT_GOTREL_LO12", /* name */
1352 FALSE
, /* partial_inplace */
1353 0x00000fff, /* src_mask */
1354 0x00000fff, /* dst_mask */
1355 FALSE
), /* pcrel_offset */
1357 /* Small data area 12 bits offset. */
1358 HOWTO (R_NDS32_SDA12S2_DP_RELA
, /* type */
1360 2, /* size (0 = byte, 1 = short, 2 = long) */
1362 FALSE
, /* pc_relative */
1364 complain_overflow_signed
, /* complain_on_overflow */
1365 bfd_elf_generic_reloc
, /* special_function */
1366 "R_NDS32_SDA12S2_DP_RELA", /* name */
1367 FALSE
, /* partial_inplace */
1368 0x00000fff, /* src_mask */
1369 0x00000fff, /* dst_mask */
1370 FALSE
), /* pcrel_offset */
1372 /* Small data area 12 bits offset. */
1373 HOWTO (R_NDS32_SDA12S2_SP_RELA
, /* type */
1375 2, /* size (0 = byte, 1 = short, 2 = long) */
1377 FALSE
, /* pc_relative */
1379 complain_overflow_signed
, /* complain_on_overflow */
1380 bfd_elf_generic_reloc
, /* special_function */
1381 "R_NDS32_SDA12S2_SP_RELA", /* name */
1382 FALSE
, /* partial_inplace */
1383 0x00000fff, /* src_mask */
1384 0x00000fff, /* dst_mask */
1385 FALSE
), /* pcrel_offset */
1386 /* Lower 12 bits of address. */
1388 HOWTO (R_NDS32_LO12S2_DP_RELA
, /* type */
1390 2, /* size (0 = byte, 1 = short, 2 = long) */
1392 FALSE
, /* pc_relative */
1394 complain_overflow_dont
,/* complain_on_overflow */
1395 bfd_elf_generic_reloc
, /* special_function */
1396 "R_NDS32_LO12S2_DP_RELA", /* name */
1397 FALSE
, /* partial_inplace */
1398 0x000003ff, /* src_mask */
1399 0x000003ff, /* dst_mask */
1400 FALSE
), /* pcrel_offset */
1402 /* Lower 12 bits of address. */
1403 HOWTO (R_NDS32_LO12S2_SP_RELA
,/* type */
1405 2, /* size (0 = byte, 1 = short, 2 = long) */
1407 FALSE
, /* pc_relative */
1409 complain_overflow_dont
,/* complain_on_overflow */
1410 bfd_elf_generic_reloc
, /* special_function */
1411 "R_NDS32_LO12S2_SP_RELA", /* name */
1412 FALSE
, /* partial_inplace */
1413 0x000003ff, /* src_mask */
1414 0x000003ff, /* dst_mask */
1415 FALSE
), /* pcrel_offset */
1416 /* Lower 12 bits of address. Special identity for or case. */
1417 HOWTO (R_NDS32_LO12S0_ORI_RELA
, /* type */
1419 2, /* size (0 = byte, 1 = short, 2 = long) */
1421 FALSE
, /* pc_relative */
1423 complain_overflow_dont
,/* complain_on_overflow */
1424 bfd_elf_generic_reloc
, /* special_function */
1425 "R_NDS32_LO12S0_ORI_RELA", /* name */
1426 FALSE
, /* partial_inplace */
1427 0x00000fff, /* src_mask */
1428 0x00000fff, /* dst_mask */
1429 FALSE
), /* pcrel_offset */
1430 /* Small data area 19 bits offset. */
1431 HOWTO (R_NDS32_SDA16S3_RELA
, /* type */
1433 2, /* size (0 = byte, 1 = short, 2 = long) */
1435 FALSE
, /* pc_relative */
1437 complain_overflow_signed
, /* complain_on_overflow */
1438 bfd_elf_generic_reloc
, /* special_function */
1439 "R_NDS32_SDA16S3_RELA",/* name */
1440 FALSE
, /* partial_inplace */
1441 0x0000ffff, /* src_mask */
1442 0x0000ffff, /* dst_mask */
1443 FALSE
), /* pcrel_offset */
1445 /* Small data area 15 bits offset. */
1446 HOWTO (R_NDS32_SDA17S2_RELA
, /* type */
1448 2, /* size (0 = byte, 1 = short, 2 = long) */
1450 FALSE
, /* pc_relative */
1452 complain_overflow_signed
, /* complain_on_overflow */
1453 bfd_elf_generic_reloc
, /* special_function */
1454 "R_NDS32_SDA17S2_RELA",/* name */
1455 FALSE
, /* partial_inplace */
1456 0x0001ffff, /* src_mask */
1457 0x0001ffff, /* dst_mask */
1458 FALSE
), /* pcrel_offset */
1460 HOWTO (R_NDS32_SDA18S1_RELA
, /* type */
1462 2, /* size (0 = byte, 1 = short, 2 = long) */
1464 FALSE
, /* pc_relative */
1466 complain_overflow_signed
, /* complain_on_overflow */
1467 bfd_elf_generic_reloc
, /* special_function */
1468 "R_NDS32_SDA18S1_RELA",/* name */
1469 FALSE
, /* partial_inplace */
1470 0x0003ffff, /* src_mask */
1471 0x0003ffff, /* dst_mask */
1472 FALSE
), /* pcrel_offset */
1474 HOWTO (R_NDS32_SDA19S0_RELA
, /* type */
1476 2, /* size (0 = byte, 1 = short, 2 = long) */
1478 FALSE
, /* pc_relative */
1480 complain_overflow_signed
, /* complain_on_overflow */
1481 bfd_elf_generic_reloc
, /* special_function */
1482 "R_NDS32_SDA19S0_RELA",/* name */
1483 FALSE
, /* partial_inplace */
1484 0x0007ffff, /* src_mask */
1485 0x0007ffff, /* dst_mask */
1486 FALSE
), /* pcrel_offset */
1487 HOWTO (R_NDS32_DWARF2_OP1_RELA
, /* type */
1489 0, /* size (0 = byte, 1 = short, 2 = long) */
1491 FALSE
, /* pc_relative */
1493 complain_overflow_dont
,/* complain_on_overflow */
1494 nds32_elf_ignore_reloc
,/* special_function */
1495 "R_NDS32_DWARF2_OP1_RELA", /* name */
1496 FALSE
, /* partial_inplace */
1497 0xff, /* src_mask */
1498 0xff, /* dst_mask */
1499 FALSE
), /* pcrel_offset */
1500 HOWTO (R_NDS32_DWARF2_OP2_RELA
, /* type */
1502 1, /* size (0 = byte, 1 = short, 2 = long) */
1504 FALSE
, /* pc_relative */
1506 complain_overflow_dont
,/* complain_on_overflow */
1507 nds32_elf_ignore_reloc
,/* special_function */
1508 "R_NDS32_DWARF2_OP2_RELA", /* name */
1509 FALSE
, /* partial_inplace */
1510 0xffff, /* src_mask */
1511 0xffff, /* dst_mask */
1512 FALSE
), /* pcrel_offset */
1513 HOWTO (R_NDS32_DWARF2_LEB_RELA
, /* type */
1515 2, /* size (0 = byte, 1 = short, 2 = long) */
1517 FALSE
, /* pc_relative */
1519 complain_overflow_dont
,/* complain_on_overflow */
1520 nds32_elf_ignore_reloc
,/* special_function */
1521 "R_NDS32_DWARF2_LEB_RELA", /* name */
1522 FALSE
, /* partial_inplace */
1523 0xffffffff, /* src_mask */
1524 0xffffffff, /* dst_mask */
1525 FALSE
), /* pcrel_offset */
1526 HOWTO (R_NDS32_UPDATE_TA_RELA
,/* type */
1528 1, /* size (0 = byte, 1 = short, 2 = long) */
1530 FALSE
, /* pc_relative */
1532 complain_overflow_dont
,/* complain_on_overflow */
1533 nds32_elf_ignore_reloc
,/* special_function */
1534 "R_NDS32_UPDATE_TA_RELA", /* name */
1535 FALSE
, /* partial_inplace */
1536 0xffff, /* src_mask */
1537 0xffff, /* dst_mask */
1538 FALSE
), /* pcrel_offset */
1539 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
1540 entry for the symbol. */
1541 HOWTO (R_NDS32_9_PLTREL
, /* type */
1543 1, /* size (0 = byte, 1 = short, 2 = long) */
1545 TRUE
, /* pc_relative */
1547 complain_overflow_signed
, /* complain_on_overflow */
1548 bfd_elf_generic_reloc
, /* special_function */
1549 "R_NDS32_9_PLTREL", /* name */
1550 FALSE
, /* partial_inplace */
1551 0xff, /* src_mask */
1552 0xff, /* dst_mask */
1553 TRUE
), /* pcrel_offset */
1554 /* Low 20 bits of PLT symbol offset relative to GOT (GP). */
1555 HOWTO (R_NDS32_PLT_GOTREL_LO20
, /* type */
1557 2, /* size (0 = byte, 1 = short, 2 = long) */
1559 FALSE
, /* pc_relative */
1561 complain_overflow_dont
,/* complain_on_overflow */
1562 bfd_elf_generic_reloc
, /* special_function */
1563 "R_NDS32_PLT_GOTREL_LO20", /* name */
1564 FALSE
, /* partial_inplace */
1565 0x000fffff, /* src_mask */
1566 0x000fffff, /* dst_mask */
1567 FALSE
), /* pcrel_offset */
1568 /* low 15 bits of PLT symbol offset relative to GOT (GP) */
1569 HOWTO (R_NDS32_PLT_GOTREL_LO15
, /* type */
1571 2, /* size (0 = byte, 1 = short, 2 = long) */
1573 FALSE
, /* pc_relative */
1575 complain_overflow_dont
,/* complain_on_overflow */
1576 bfd_elf_generic_reloc
, /* special_function */
1577 "R_NDS32_PLT_GOTREL_LO15", /* name */
1578 FALSE
, /* partial_inplace */
1579 0x00007fff, /* src_mask */
1580 0x00007fff, /* dst_mask */
1581 FALSE
), /* pcrel_offset */
1582 /* Low 19 bits of PLT symbol offset relative to GOT (GP). */
1583 HOWTO (R_NDS32_PLT_GOTREL_LO19
, /* type */
1585 2, /* size (0 = byte, 1 = short, 2 = long) */
1587 FALSE
, /* pc_relative */
1589 complain_overflow_dont
,/* complain_on_overflow */
1590 bfd_elf_generic_reloc
, /* special_function */
1591 "R_NDS32_PLT_GOTREL_LO19", /* name */
1592 FALSE
, /* partial_inplace */
1593 0x0007ffff, /* src_mask */
1594 0x0007ffff, /* dst_mask */
1595 FALSE
), /* pcrel_offset */
1596 HOWTO (R_NDS32_GOT_LO15
, /* type */
1598 2, /* size (0 = byte, 1 = short, 2 = long) */
1600 FALSE
, /* pc_relative */
1602 complain_overflow_dont
,/* complain_on_overflow */
1603 bfd_elf_generic_reloc
, /* special_function */
1604 "R_NDS32_GOT_LO15", /* name */
1605 FALSE
, /* partial_inplace */
1606 0x00007fff, /* src_mask */
1607 0x00007fff, /* dst_mask */
1608 FALSE
), /* pcrel_offset */
1609 HOWTO (R_NDS32_GOT_LO19
, /* type */
1611 2, /* size (0 = byte, 1 = short, 2 = long) */
1613 FALSE
, /* pc_relative */
1615 complain_overflow_dont
,/* complain_on_overflow */
1616 bfd_elf_generic_reloc
, /* special_function */
1617 "R_NDS32_GOT_LO19", /* name */
1618 FALSE
, /* partial_inplace */
1619 0x0007ffff, /* src_mask */
1620 0x0007ffff, /* dst_mask */
1621 FALSE
), /* pcrel_offset */
1622 HOWTO (R_NDS32_GOTOFF_LO15
, /* type */
1624 2, /* size (0 = byte, 1 = short, 2 = long) */
1626 FALSE
, /* pc_relative */
1628 complain_overflow_dont
,/* complain_on_overflow */
1629 bfd_elf_generic_reloc
, /* special_function */
1630 "R_NDS32_GOTOFF_LO15", /* name */
1631 FALSE
, /* partial_inplace */
1632 0x00007fff, /* src_mask */
1633 0x00007fff, /* dst_mask */
1634 FALSE
), /* pcrel_offset */
1635 HOWTO (R_NDS32_GOTOFF_LO19
, /* type */
1637 2, /* size (0 = byte, 1 = short, 2 = long) */
1639 FALSE
, /* pc_relative */
1641 complain_overflow_dont
,/* complain_on_overflow */
1642 bfd_elf_generic_reloc
, /* special_function */
1643 "R_NDS32_GOTOFF_LO19", /* name */
1644 FALSE
, /* partial_inplace */
1645 0x0007ffff, /* src_mask */
1646 0x0007ffff, /* dst_mask */
1647 FALSE
), /* pcrel_offset */
1648 /* GOT 15 bits offset. */
1649 HOWTO (R_NDS32_GOT15S2_RELA
, /* type */
1651 2, /* size (0 = byte, 1 = short, 2 = long) */
1653 FALSE
, /* pc_relative */
1655 complain_overflow_signed
, /* complain_on_overflow */
1656 bfd_elf_generic_reloc
, /* special_function */
1657 "R_NDS32_GOT15S2_RELA",/* name */
1658 FALSE
, /* partial_inplace */
1659 0x00007fff, /* src_mask */
1660 0x00007fff, /* dst_mask */
1661 FALSE
), /* pcrel_offset */
1662 /* GOT 17 bits offset. */
1663 HOWTO (R_NDS32_GOT17S2_RELA
, /* type */
1665 2, /* size (0 = byte, 1 = short, 2 = long) */
1667 FALSE
, /* pc_relative */
1669 complain_overflow_signed
, /* complain_on_overflow */
1670 bfd_elf_generic_reloc
, /* special_function */
1671 "R_NDS32_GOT17S2_RELA",/* name */
1672 FALSE
, /* partial_inplace */
1673 0x0001ffff, /* src_mask */
1674 0x0001ffff, /* dst_mask */
1675 FALSE
), /* pcrel_offset */
1676 /* A 5 bit address. */
1677 HOWTO (R_NDS32_5_RELA
, /* type */
1679 1, /* size (0 = byte, 1 = short, 2 = long) */
1681 FALSE
, /* pc_relative */
1683 complain_overflow_signed
, /* complain_on_overflow */
1684 bfd_elf_generic_reloc
, /* special_function */
1685 "R_NDS32_5_RELA", /* name */
1686 FALSE
, /* partial_inplace */
1687 0x1f, /* src_mask */
1688 0x1f, /* dst_mask */
1689 FALSE
), /* pcrel_offset */
1690 HOWTO (R_NDS32_10_UPCREL_RELA
,/* type */
1692 1, /* size (0 = byte, 1 = short, 2 = long) */
1694 TRUE
, /* pc_relative */
1696 complain_overflow_unsigned
, /* complain_on_overflow */
1697 bfd_elf_generic_reloc
, /* special_function */
1698 "R_NDS32_10_UPCREL_RELA", /* name */
1699 FALSE
, /* partial_inplace */
1700 0x1ff, /* src_mask */
1701 0x1ff, /* dst_mask */
1702 TRUE
), /* pcrel_offset */
1703 HOWTO (R_NDS32_SDA_FP7U2_RELA
,/* type */
1705 1, /* size (0 = byte, 1 = short, 2 = long) */
1707 FALSE
, /* pc_relative */
1709 complain_overflow_unsigned
, /* complain_on_overflow */
1710 bfd_elf_generic_reloc
, /* special_function */
1711 "R_NDS32_SDA_FP7U2_RELA", /* name */
1712 FALSE
, /* partial_inplace */
1713 0x0000007f, /* src_mask */
1714 0x0000007f, /* dst_mask */
1715 FALSE
), /* pcrel_offset */
1716 HOWTO (R_NDS32_WORD_9_PCREL_RELA
, /* type */
1718 2, /* size (0 = byte, 1 = short, 2 = long) */
1720 TRUE
, /* pc_relative */
1722 complain_overflow_signed
, /* complain_on_overflow */
1723 bfd_elf_generic_reloc
, /* special_function */
1724 "R_NDS32_WORD_9_PCREL_RELA", /* name */
1725 FALSE
, /* partial_inplace */
1726 0xff, /* src_mask */
1727 0xff, /* dst_mask */
1728 TRUE
), /* pcrel_offset */
1729 HOWTO (R_NDS32_25_ABS_RELA
, /* type */
1731 2, /* size (0 = byte, 1 = short, 2 = long) */
1733 FALSE
, /* pc_relative */
1735 complain_overflow_dont
,/* complain_on_overflow */
1736 bfd_elf_generic_reloc
, /* special_function */
1737 "R_NDS32_25_ABS_RELA", /* name */
1738 FALSE
, /* partial_inplace */
1739 0xffffff, /* src_mask */
1740 0xffffff, /* dst_mask */
1741 FALSE
), /* pcrel_offset */
1743 /* A relative 17 bit relocation for ifc, right shifted by 1. */
1744 HOWTO (R_NDS32_17IFC_PCREL_RELA
, /* type */
1746 2, /* size (0 = byte, 1 = short, 2 = long) */
1748 TRUE
, /* pc_relative */
1750 complain_overflow_signed
, /* complain_on_overflow */
1751 bfd_elf_generic_reloc
, /* special_function */
1752 "R_NDS32_17IFC_PCREL_RELA", /* name */
1753 FALSE
, /* partial_inplace */
1754 0xffff, /* src_mask */
1755 0xffff, /* dst_mask */
1756 TRUE
), /* pcrel_offset */
1758 /* A relative unsigned 10 bit relocation for ifc, right shifted by 1. */
1759 HOWTO (R_NDS32_10IFCU_PCREL_RELA
, /* type */
1761 1, /* size (0 = byte, 1 = short, 2 = long) */
1763 TRUE
, /* pc_relative */
1765 complain_overflow_unsigned
, /* complain_on_overflow */
1766 bfd_elf_generic_reloc
, /* special_function */
1767 "R_NDS32_10IFCU_PCREL_RELA", /* name */
1768 FALSE
, /* partial_inplace */
1769 0x1ff, /* src_mask */
1770 0x1ff, /* dst_mask */
1771 TRUE
), /* pcrel_offset */
1773 /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol. */
1774 HOWTO (R_NDS32_TLS_LE_HI20
, /* type */
1775 12, /* rightshift */
1776 2, /* size (0 = byte, 1 = short, 2 = long) */
1778 FALSE
, /* pc_relative */
1780 complain_overflow_dont
, /* complain_on_overflow */
1781 bfd_elf_generic_reloc
, /* special_function */
1782 "R_NDS32_TLS_LE_HI20", /* name */
1783 FALSE
, /* partial_inplace */
1784 0x000fffff, /* src_mask */
1785 0x000fffff, /* dst_mask */
1786 FALSE
), /* pcrel_offset */
1787 HOWTO (R_NDS32_TLS_LE_LO12
, /* type */
1789 2, /* size (0 = byte, 1 = short, 2 = long) */
1791 FALSE
, /* pc_relative */
1793 complain_overflow_dont
, /* complain_on_overflow */
1794 bfd_elf_generic_reloc
, /* special_function */
1795 "R_NDS32_TLS_LE_LO12", /* name */
1796 FALSE
, /* partial_inplace */
1797 0x00000fff, /* src_mask */
1798 0x00000fff, /* dst_mask */
1799 FALSE
), /* pcrel_offset */
1801 /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol. */
1802 HOWTO (R_NDS32_TLS_IE_HI20
, /* type */
1803 12, /* rightshift */
1804 2, /* size (0 = byte, 1 = short, 2 = long) */
1806 FALSE
, /* pc_relative */
1808 complain_overflow_dont
, /* complain_on_overflow */
1809 bfd_elf_generic_reloc
, /* special_function */
1810 "R_NDS32_TLS_IE_HI20", /* name */
1811 FALSE
, /* partial_inplace */
1812 0x000fffff, /* src_mask */
1813 0x000fffff, /* dst_mask */
1814 FALSE
), /* pcrel_offset */
1815 HOWTO (R_NDS32_TLS_IE_LO12S2
, /* type */
1817 2, /* size (0 = byte, 1 = short, 2 = long) */
1819 FALSE
, /* pc_relative */
1821 complain_overflow_dont
, /* complain_on_overflow */
1822 bfd_elf_generic_reloc
, /* special_function */
1823 "R_NDS32_TLS_IE_LO12S2", /* name */
1824 FALSE
, /* partial_inplace */
1825 0x000003ff, /* src_mask */
1826 0x000003ff, /* dst_mask */
1827 FALSE
), /* pcrel_offset */
1828 /* Mark a TLS IE entry in GOT. */
1829 HOWTO (R_NDS32_TLS_TPOFF
, /* type */
1831 2, /* size (0 = byte, 1 = short, 2 = long) */
1833 FALSE
, /* pc_relative */
1835 complain_overflow_bitfield
, /* complain_on_overflow */
1836 bfd_elf_generic_reloc
, /* special_function */
1837 "R_NDS32_TLS_TPOFF", /* name */
1838 FALSE
, /* partial_inplace */
1839 0xffffffff, /* src_mask */
1840 0xffffffff, /* dst_mask */
1841 FALSE
), /* pcrel_offset */
1842 /* A 20 bit address. */
1843 HOWTO (R_NDS32_TLS_LE_20
, /* type */
1845 2, /* size (0 = byte, 1 = short, 2 = long) */
1847 FALSE
, /* pc_relative */
1849 complain_overflow_signed
, /* complain_on_overflow */
1850 bfd_elf_generic_reloc
, /* special_function */
1851 "R_NDS32_TLS_LE_20", /* name */
1852 FALSE
, /* partial_inplace */
1853 0xfffff, /* src_mask */
1854 0xfffff, /* dst_mask */
1855 FALSE
), /* pcrel_offset */
1856 HOWTO (R_NDS32_TLS_LE_15S0
, /* type */
1858 2, /* size (0 = byte, 1 = short, 2 = long) */
1860 FALSE
, /* pc_relative */
1862 complain_overflow_signed
, /* complain_on_overflow */
1863 bfd_elf_generic_reloc
, /* special_function */
1864 "R_NDS32_TLS_LE_15S0", /* name */
1865 FALSE
, /* partial_inplace */
1866 0x7fff, /* src_mask */
1867 0x7fff, /* dst_mask */
1868 FALSE
), /* pcrel_offset */
1869 HOWTO (R_NDS32_TLS_LE_15S1
, /* type */
1871 2, /* size (0 = byte, 1 = short, 2 = long) */
1873 FALSE
, /* pc_relative */
1875 complain_overflow_signed
, /* complain_on_overflow */
1876 bfd_elf_generic_reloc
, /* special_function */
1877 "R_NDS32_TLS_LE_15S1", /* name */
1878 FALSE
, /* partial_inplace */
1879 0x7fff, /* src_mask */
1880 0x7fff, /* dst_mask */
1881 FALSE
), /* pcrel_offset */
1882 HOWTO (R_NDS32_TLS_LE_15S2
, /* type */
1884 2, /* size (0 = byte, 1 = short, 2 = long) */
1886 FALSE
, /* pc_relative */
1888 complain_overflow_signed
, /* complain_on_overflow */
1889 bfd_elf_generic_reloc
, /* special_function */
1890 "R_NDS32_TLS_LE_15S2", /* name */
1891 FALSE
, /* partial_inplace */
1892 0x7fff, /* src_mask */
1893 0x7fff, /* dst_mask */
1894 FALSE
), /* pcrel_offset */
1896 /* Relax hint for unconditional call sequence */
1897 HOWTO (R_NDS32_LONGCALL4
, /* type */
1899 2, /* size (0 = byte, 1 = short, 2 = long) */
1901 FALSE
, /* pc_relative */
1903 complain_overflow_dont
, /* complain_on_overflow */
1904 nds32_elf_ignore_reloc
, /* special_function */
1905 "R_NDS32_LONGCALL4", /* name */
1906 FALSE
, /* partial_inplace */
1907 0xffffffff, /* src_mask */
1908 0xffffffff, /* dst_mask */
1909 FALSE
), /* pcrel_offset */
1911 /* Relax hint for conditional call sequence. */
1912 HOWTO (R_NDS32_LONGCALL5
, /* type */
1914 2, /* size (0 = byte, 1 = short, 2 = long) */
1916 FALSE
, /* pc_relative */
1918 complain_overflow_dont
, /* complain_on_overflow */
1919 nds32_elf_ignore_reloc
, /* special_function */
1920 "R_NDS32_LONGCALL5", /* name */
1921 FALSE
, /* partial_inplace */
1922 0xffffffff, /* src_mask */
1923 0xffffffff, /* dst_mask */
1924 FALSE
), /* pcrel_offset */
1926 /* Relax hint for conditional call sequence. */
1927 HOWTO (R_NDS32_LONGCALL6
, /* type */
1929 2, /* size (0 = byte, 1 = short, 2 = long) */
1931 FALSE
, /* pc_relative */
1933 complain_overflow_dont
, /* complain_on_overflow */
1934 nds32_elf_ignore_reloc
, /* special_function */
1935 "R_NDS32_LONGCALL6", /* name */
1936 FALSE
, /* partial_inplace */
1937 0xffffffff, /* src_mask */
1938 0xffffffff, /* dst_mask */
1939 FALSE
), /* pcrel_offset */
1941 /* Relax hint for unconditional branch sequence. */
1942 HOWTO (R_NDS32_LONGJUMP4
, /* type */
1944 2, /* size (0 = byte, 1 = short, 2 = long) */
1946 FALSE
, /* pc_relative */
1948 complain_overflow_dont
, /* complain_on_overflow */
1949 nds32_elf_ignore_reloc
, /* special_function */
1950 "R_NDS32_LONGJUMP4", /* name */
1951 FALSE
, /* partial_inplace */
1952 0xffffffff, /* src_mask */
1953 0xffffffff, /* dst_mask */
1954 FALSE
), /* pcrel_offset */
1956 /* Relax hint for conditional branch sequence. */
1957 HOWTO (R_NDS32_LONGJUMP5
, /* type */
1959 2, /* size (0 = byte, 1 = short, 2 = long) */
1961 FALSE
, /* pc_relative */
1963 complain_overflow_dont
, /* complain_on_overflow */
1964 nds32_elf_ignore_reloc
, /* special_function */
1965 "R_NDS32_LONGJUMP5", /* name */
1966 FALSE
, /* partial_inplace */
1967 0xffffffff, /* src_mask */
1968 0xffffffff, /* dst_mask */
1969 FALSE
), /* pcrel_offset */
1971 /* Relax hint for conditional branch sequence. */
1972 HOWTO (R_NDS32_LONGJUMP6
, /* type */
1974 2, /* size (0 = byte, 1 = short, 2 = long) */
1976 FALSE
, /* pc_relative */
1978 complain_overflow_dont
, /* complain_on_overflow */
1979 nds32_elf_ignore_reloc
, /* special_function */
1980 "R_NDS32_LONGJUMP6", /* name */
1981 FALSE
, /* partial_inplace */
1982 0xffffffff, /* src_mask */
1983 0xffffffff, /* dst_mask */
1984 FALSE
), /* pcrel_offset */
1986 /* Relax hint for conditional branch sequence. */
1987 HOWTO (R_NDS32_LONGJUMP7
, /* type */
1989 2, /* size (0 = byte, 1 = short, 2 = long) */
1991 FALSE
, /* pc_relative */
1993 complain_overflow_dont
, /* complain_on_overflow */
1994 nds32_elf_ignore_reloc
, /* special_function */
1995 "R_NDS32_LONGJUMP7", /* name */
1996 FALSE
, /* partial_inplace */
1997 0xffffffff, /* src_mask */
1998 0xffffffff, /* dst_mask */
1999 FALSE
), /* pcrel_offset */
2002 /* Relocations used for relaxation. */
2003 static reloc_howto_type nds32_elf_relax_howto_table
[] =
2005 HOWTO (R_NDS32_RELAX_ENTRY
, /* type */
2007 2, /* size (0 = byte, 1 = short, 2 = long) */
2009 FALSE
, /* pc_relative */
2011 complain_overflow_dont
,/* complain_on_overflow */
2012 nds32_elf_ignore_reloc
,/* special_function */
2013 "R_NDS32_RELAX_ENTRY", /* name */
2014 FALSE
, /* partial_inplace */
2015 0xffffffff, /* src_mask */
2016 0xffffffff, /* dst_mask */
2017 FALSE
), /* pcrel_offset */
2018 HOWTO (R_NDS32_GOT_SUFF
, /* type */
2020 2, /* size (0 = byte, 1 = short, 2 = long) */
2022 FALSE
, /* pc_relative */
2024 complain_overflow_dont
,/* complain_on_overflow */
2025 nds32_elf_ignore_reloc
,/* special_function */
2026 "R_NDS32_GOT_SUFF", /* name */
2027 FALSE
, /* partial_inplace */
2028 0xffffffff, /* src_mask */
2029 0xffffffff, /* dst_mask */
2030 FALSE
), /* pcrel_offset */
2031 HOWTO (R_NDS32_GOTOFF_SUFF
, /* type */
2033 2, /* size (0 = byte, 1 = short, 2 = long) */
2035 FALSE
, /* pc_relative */
2037 complain_overflow_bitfield
, /* complain_on_overflow */
2038 nds32_elf_ignore_reloc
,/* special_function */
2039 "R_NDS32_GOTOFF_SUFF", /* name */
2040 FALSE
, /* partial_inplace */
2041 0xffffffff, /* src_mask */
2042 0xffffffff, /* dst_mask */
2043 FALSE
), /* pcrel_offset */
2044 HOWTO (R_NDS32_PLT_GOT_SUFF
, /* type */
2046 2, /* size (0 = byte, 1 = short, 2 = long) */
2048 FALSE
, /* pc_relative */
2050 complain_overflow_dont
,/* complain_on_overflow */
2051 nds32_elf_ignore_reloc
,/* special_function */
2052 "R_NDS32_PLT_GOT_SUFF",/* name */
2053 FALSE
, /* partial_inplace */
2054 0xffffffff, /* src_mask */
2055 0xffffffff, /* dst_mask */
2056 FALSE
), /* pcrel_offset */
2057 HOWTO (R_NDS32_MULCALL_SUFF
, /* type */
2059 2, /* size (0 = byte, 1 = short, 2 = long) */
2061 FALSE
, /* pc_relative */
2063 complain_overflow_dont
,/* complain_on_overflow */
2064 nds32_elf_ignore_reloc
,/* special_function */
2065 "R_NDS32_MULCALL_SUFF",/* name */
2066 FALSE
, /* partial_inplace */
2067 0xffffffff, /* src_mask */
2068 0xffffffff, /* dst_mask */
2069 FALSE
), /* pcrel_offset */
2070 HOWTO (R_NDS32_PTR
, /* type */
2072 2, /* size (0 = byte, 1 = short, 2 = long) */
2074 FALSE
, /* pc_relative */
2076 complain_overflow_dont
,/* complain_on_overflow */
2077 nds32_elf_ignore_reloc
,/* special_function */
2078 "R_NDS32_PTR", /* name */
2079 FALSE
, /* partial_inplace */
2080 0xffffffff, /* src_mask */
2081 0xffffffff, /* dst_mask */
2082 FALSE
), /* pcrel_offset */
2083 HOWTO (R_NDS32_PTR_COUNT
, /* type */
2085 2, /* size (0 = byte, 1 = short, 2 = long) */
2087 FALSE
, /* pc_relative */
2089 complain_overflow_dont
,/* complain_on_overflow */
2090 nds32_elf_ignore_reloc
,/* special_function */
2091 "R_NDS32_PTR_COUNT", /* name */
2092 FALSE
, /* partial_inplace */
2093 0xffffffff, /* src_mask */
2094 0xffffffff, /* dst_mask */
2095 FALSE
), /* pcrel_offset */
2096 HOWTO (R_NDS32_PTR_RESOLVED
, /* type */
2098 2, /* size (0 = byte, 1 = short, 2 = long) */
2100 FALSE
, /* pc_relative */
2102 complain_overflow_dont
,/* complain_on_overflow */
2103 nds32_elf_ignore_reloc
,/* special_function */
2104 "R_NDS32_PTR_RESOLVED",/* name */
2105 FALSE
, /* partial_inplace */
2106 0xffffffff, /* src_mask */
2107 0xffffffff, /* dst_mask */
2108 FALSE
), /* pcrel_offset */
2109 HOWTO (R_NDS32_PLTBLOCK
, /* type */
2111 2, /* size (0 = byte, 1 = short, 2 = long) */
2113 FALSE
, /* pc_relative */
2115 complain_overflow_dont
,/* complain_on_overflow */
2116 nds32_elf_ignore_reloc
,/* special_function */
2117 "R_NDS32_PLTBLOCK", /* name */
2118 FALSE
, /* partial_inplace */
2119 0xffffffff, /* src_mask */
2120 0xffffffff, /* dst_mask */
2121 FALSE
), /* pcrel_offset */
2122 HOWTO (R_NDS32_RELAX_REGION_BEGIN
, /* type */
2124 2, /* size (0 = byte, 1 = short, 2 = long) */
2126 FALSE
, /* pc_relative */
2128 complain_overflow_dont
,/* complain_on_overflow */
2129 nds32_elf_ignore_reloc
,/* special_function */
2130 "R_NDS32_RELAX_REGION_BEGIN", /* name */
2131 FALSE
, /* partial_inplace */
2132 0xffffffff, /* src_mask */
2133 0xffffffff, /* dst_mask */
2134 FALSE
), /* pcrel_offset */
2135 HOWTO (R_NDS32_RELAX_REGION_END
, /* type */
2137 2, /* size (0 = byte, 1 = short, 2 = long) */
2139 FALSE
, /* pc_relative */
2141 complain_overflow_dont
,/* complain_on_overflow */
2142 nds32_elf_ignore_reloc
,/* special_function */
2143 "R_NDS32_RELAX_REGION_END", /* name */
2144 FALSE
, /* partial_inplace */
2145 0xffffffff, /* src_mask */
2146 0xffffffff, /* dst_mask */
2147 FALSE
), /* pcrel_offset */
2148 HOWTO (R_NDS32_MINUEND
, /* type */
2150 2, /* size (0 = byte, 1 = short, 2 = long) */
2152 FALSE
, /* pc_relative */
2154 complain_overflow_dont
,/* complain_on_overflow */
2155 nds32_elf_ignore_reloc
,/* special_function */
2156 "R_NDS32_MINUEND", /* name */
2157 FALSE
, /* partial_inplace */
2158 0xffffffff, /* src_mask */
2159 0xffffffff, /* dst_mask */
2160 FALSE
), /* pcrel_offset */
2161 HOWTO (R_NDS32_SUBTRAHEND
, /* type */
2163 2, /* size (0 = byte, 1 = short, 2 = long) */
2165 FALSE
, /* pc_relative */
2167 complain_overflow_dont
,/* complain_on_overflow */
2168 nds32_elf_ignore_reloc
,/* special_function */
2169 "R_NDS32_SUBTRAHEND", /* name */
2170 FALSE
, /* partial_inplace */
2171 0xffffffff, /* src_mask */
2172 0xffffffff, /* dst_mask */
2173 FALSE
), /* pcrel_offset */
2174 HOWTO (R_NDS32_DIFF8
, /* type */
2176 0, /* size (0 = byte, 1 = short, 2 = long) */
2178 FALSE
, /* pc_relative */
2180 complain_overflow_dont
,/* complain_on_overflow */
2181 nds32_elf_ignore_reloc
,/* special_function */
2182 "R_NDS32_DIFF8", /* name */
2183 FALSE
, /* partial_inplace */
2184 0x000000ff, /* src_mask */
2185 0x000000ff, /* dst_mask */
2186 FALSE
), /* pcrel_offset */
2187 HOWTO (R_NDS32_DIFF16
, /* type */
2189 1, /* size (0 = byte, 1 = short, 2 = long) */
2191 FALSE
, /* pc_relative */
2193 complain_overflow_dont
,/* complain_on_overflow */
2194 nds32_elf_ignore_reloc
,/* special_function */
2195 "R_NDS32_DIFF16", /* name */
2196 FALSE
, /* partial_inplace */
2197 0x0000ffff, /* src_mask */
2198 0x0000ffff, /* dst_mask */
2199 FALSE
), /* pcrel_offset */
2200 HOWTO (R_NDS32_DIFF32
, /* type */
2202 2, /* size (0 = byte, 1 = short, 2 = long) */
2204 FALSE
, /* pc_relative */
2206 complain_overflow_dont
,/* complain_on_overflow */
2207 nds32_elf_ignore_reloc
,/* special_function */
2208 "R_NDS32_DIFF32", /* name */
2209 FALSE
, /* partial_inplace */
2210 0xffffffff, /* src_mask */
2211 0xffffffff, /* dst_mask */
2212 FALSE
), /* pcrel_offset */
2213 HOWTO (R_NDS32_DIFF_ULEB128
, /* type */
2215 0, /* size (0 = byte, 1 = short, 2 = long) */
2217 FALSE
, /* pc_relative */
2219 complain_overflow_dont
,/* complain_on_overflow */
2220 nds32_elf_ignore_reloc
,/* special_function */
2221 "R_NDS32_DIFF_ULEB128",/* name */
2222 FALSE
, /* partial_inplace */
2223 0xffffffff, /* src_mask */
2224 0xffffffff, /* dst_mask */
2225 FALSE
), /* pcrel_offset */
2226 HOWTO (R_NDS32_DATA
, /* type */
2228 2, /* size (0 = byte, 1 = short, 2 = long) */
2230 FALSE
, /* pc_relative */
2232 complain_overflow_dont
,/* complain_on_overflow */
2233 nds32_elf_ignore_reloc
,/* special_function */
2234 "R_NDS32_DATA", /* name */
2235 FALSE
, /* partial_inplace */
2236 0xffffffff, /* src_mask */
2237 0xffffffff, /* dst_mask */
2238 FALSE
), /* pcrel_offset */
2239 HOWTO (R_NDS32_TRAN
, /* type */
2241 2, /* size (0 = byte, 1 = short, 2 = long) */
2243 FALSE
, /* pc_relative */
2245 complain_overflow_dont
,/* complain_on_overflow */
2246 nds32_elf_ignore_reloc
,/* special_function */
2247 "R_NDS32_TRAN", /* name */
2248 FALSE
, /* partial_inplace */
2249 0xffffffff, /* src_mask */
2250 0xffffffff, /* dst_mask */
2251 FALSE
), /* pcrel_offset */
2252 HOWTO (R_NDS32_TLS_LE_ADD
, /* type */
2254 2, /* size (0 = byte, 1 = short, 2 = long) */
2256 FALSE
, /* pc_relative */
2258 complain_overflow_dont
, /* complain_on_overflow */
2259 nds32_elf_ignore_reloc
, /* special_function */
2260 "R_NDS32_TLS_LE_ADD", /* name */
2261 FALSE
, /* partial_inplace */
2262 0xffffffff, /* src_mask */
2263 0xffffffff, /* dst_mask */
2264 FALSE
), /* pcrel_offset */
2265 HOWTO (R_NDS32_TLS_LE_LS
, /* type */
2267 2, /* size (0 = byte, 1 = short, 2 = long) */
2269 FALSE
, /* pc_relative */
2271 complain_overflow_dont
, /* complain_on_overflow */
2272 nds32_elf_ignore_reloc
, /* special_function */
2273 "R_NDS32_TLS_LE_LS", /* name */
2274 FALSE
, /* partial_inplace */
2275 0xffffffff, /* src_mask */
2276 0xffffffff, /* dst_mask */
2277 FALSE
), /* pcrel_offset */
2278 HOWTO (R_NDS32_EMPTY
, /* type */
2280 2, /* size (0 = byte, 1 = short, 2 = long) */
2282 FALSE
, /* pc_relative */
2284 complain_overflow_dont
, /* complain_on_overflow */
2285 nds32_elf_ignore_reloc
, /* special_function */
2286 "R_NDS32_EMPTY", /* name */
2287 FALSE
, /* partial_inplace */
2288 0xffffffff, /* src_mask */
2289 0xffffffff, /* dst_mask */
2290 FALSE
), /* pcrel_offset */
2294 /* nds32_insertion_sort sorts an array with nmemb elements of size size.
2295 This prototype is the same as qsort (). */
2298 nds32_insertion_sort (void *base
, size_t nmemb
, size_t size
,
2299 int (*compar
) (const void *lhs
, const void *rhs
))
2301 char *ptr
= (char *) base
;
2303 char *tmp
= xmalloc (size
);
2305 /* If i is less than j, i is inserted before j.
2307 |---- j ----- i --------------|
2312 for (i
= 1; i
< (int) nmemb
; i
++)
2314 for (j
= (i
- 1); j
>= 0; j
--)
2315 if (compar (ptr
+ i
* size
, ptr
+ j
* size
) >= 0)
2321 continue; /* i is in order. */
2323 memcpy (tmp
, ptr
+ i
* size
, size
);
2324 memmove (ptr
+ (j
+ 1) * size
, ptr
+ j
* size
, (i
- j
) * size
);
2325 memcpy (ptr
+ j
* size
, tmp
, size
);
2330 /* Sort relocation by r_offset.
2332 We didn't use qsort () in stdlib, because quick-sort is not a stable sorting
2333 algorithm. Relocations at the same r_offset must keep their order.
2334 For example, RELAX_ENTRY must be the very first relocation entry.
2336 Currently, this function implements insertion-sort.
2338 FIXME: If we already sort them in assembler, why bother sort them
2342 compar_reloc (const void *lhs
, const void *rhs
)
2344 const Elf_Internal_Rela
*l
= (const Elf_Internal_Rela
*) lhs
;
2345 const Elf_Internal_Rela
*r
= (const Elf_Internal_Rela
*) rhs
;
2347 if (l
->r_offset
> r
->r_offset
)
2349 else if (l
->r_offset
== r
->r_offset
)
2355 /* Functions listed below are only used for old relocs.
2356 * nds32_elf_9_pcrel_reloc
2357 * nds32_elf_do_9_pcrel_reloc
2358 * nds32_elf_hi20_reloc
2359 * nds32_elf_relocate_hi20
2360 * nds32_elf_lo12_reloc
2361 * nds32_elf_sda15_reloc
2362 * nds32_elf_generic_reloc
2365 /* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc. */
2367 static bfd_reloc_status_type
2368 nds32_elf_9_pcrel_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2369 void *data
, asection
*input_section
, bfd
*output_bfd
,
2370 char **error_message ATTRIBUTE_UNUSED
)
2372 /* This part is from bfd_elf_generic_reloc. */
2373 if (output_bfd
!= (bfd
*) NULL
2374 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
2375 && (!reloc_entry
->howto
->partial_inplace
|| reloc_entry
->addend
== 0))
2377 reloc_entry
->address
+= input_section
->output_offset
;
2378 return bfd_reloc_ok
;
2381 if (output_bfd
!= NULL
)
2383 /* FIXME: See bfd_perform_relocation. Is this right? */
2384 return bfd_reloc_continue
;
2387 return nds32_elf_do_9_pcrel_reloc (abfd
, reloc_entry
->howto
,
2389 data
, reloc_entry
->address
,
2392 + symbol
->section
->output_section
->vma
2393 + symbol
->section
->output_offset
),
2394 reloc_entry
->addend
);
2397 /* Utility to actually perform an R_NDS32_9_PCREL reloc. */
2398 #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
2400 static bfd_reloc_status_type
2401 nds32_elf_do_9_pcrel_reloc (bfd
*abfd
, reloc_howto_type
*howto
,
2402 asection
*input_section
, bfd_byte
*data
,
2404 asection
*symbol_section ATTRIBUTE_UNUSED
,
2405 bfd_vma symbol_value
, bfd_vma addend
)
2407 bfd_signed_vma relocation
;
2409 bfd_reloc_status_type status
;
2411 /* Sanity check the address (offset in section). */
2412 if (offset
> bfd_get_section_limit (abfd
, input_section
))
2413 return bfd_reloc_outofrange
;
2415 relocation
= symbol_value
+ addend
;
2416 /* Make it pc relative. */
2417 relocation
-= (input_section
->output_section
->vma
2418 + input_section
->output_offset
);
2419 /* These jumps mask off the lower two bits of the current address
2420 before doing pcrel calculations. */
2421 relocation
-= (offset
& -(bfd_vma
) 2);
2423 if (relocation
< -ACCURATE_8BIT_S1
|| relocation
>= ACCURATE_8BIT_S1
)
2424 status
= bfd_reloc_overflow
;
2426 status
= bfd_reloc_ok
;
2428 x
= bfd_getb16 (data
+ offset
);
2430 relocation
>>= howto
->rightshift
;
2431 relocation
<<= howto
->bitpos
;
2432 x
= (x
& ~howto
->dst_mask
)
2433 | (((x
& howto
->src_mask
) + relocation
) & howto
->dst_mask
);
2435 bfd_putb16 ((bfd_vma
) x
, data
+ offset
);
2440 /* Handle the R_NDS32_HI20_[SU]LO relocs.
2441 HI20_SLO is for the add3 and load/store with displacement instructions.
2442 HI20 is for the or3 instruction.
2443 For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to
2444 the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
2445 we must add one to the high 16 bytes (which will get subtracted off when
2446 the low 16 bits are added).
2447 These relocs have to be done in combination with an R_NDS32_LO12 reloc
2448 because there is a carry from the LO12 to the HI20. Here we just save
2449 the information we need; we do the actual relocation when we see the LO12.
2450 This code is copied from the elf32-mips.c. We also support an arbitrary
2451 number of HI20 relocs to be associated with a single LO12 reloc. The
2452 assembler sorts the relocs to ensure each HI20 immediately precedes its
2453 LO12. However if there are multiple copies, the assembler may not find
2454 the real LO12 so it picks the first one it finds. */
2458 struct nds32_hi20
*next
;
2463 static struct nds32_hi20
*nds32_hi20_list
;
2465 static bfd_reloc_status_type
2466 nds32_elf_hi20_reloc (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc_entry
,
2467 asymbol
*symbol
, void *data
, asection
*input_section
,
2468 bfd
*output_bfd
, char **error_message ATTRIBUTE_UNUSED
)
2470 bfd_reloc_status_type ret
;
2472 struct nds32_hi20
*n
;
2474 /* This part is from bfd_elf_generic_reloc.
2475 If we're relocating, and this an external symbol, we don't want
2476 to change anything. */
2477 if (output_bfd
!= (bfd
*) NULL
2478 && (symbol
->flags
& BSF_SECTION_SYM
) == 0 && reloc_entry
->addend
== 0)
2480 reloc_entry
->address
+= input_section
->output_offset
;
2481 return bfd_reloc_ok
;
2484 /* Sanity check the address (offset in section). */
2485 if (reloc_entry
->address
> bfd_get_section_limit (abfd
, input_section
))
2486 return bfd_reloc_outofrange
;
2489 if (bfd_is_und_section (symbol
->section
) && output_bfd
== (bfd
*) NULL
)
2490 ret
= bfd_reloc_undefined
;
2492 if (bfd_is_com_section (symbol
->section
))
2495 relocation
= symbol
->value
;
2497 relocation
+= symbol
->section
->output_section
->vma
;
2498 relocation
+= symbol
->section
->output_offset
;
2499 relocation
+= reloc_entry
->addend
;
2501 /* Save the information, and let LO12 do the actual relocation. */
2502 n
= (struct nds32_hi20
*) bfd_malloc ((bfd_size_type
) sizeof *n
);
2504 return bfd_reloc_outofrange
;
2506 n
->addr
= (bfd_byte
*) data
+ reloc_entry
->address
;
2507 n
->addend
= relocation
;
2508 n
->next
= nds32_hi20_list
;
2509 nds32_hi20_list
= n
;
2511 if (output_bfd
!= (bfd
*) NULL
)
2512 reloc_entry
->address
+= input_section
->output_offset
;
2517 /* Handle an NDS32 ELF HI20 reloc. */
2520 nds32_elf_relocate_hi20 (bfd
*input_bfd ATTRIBUTE_UNUSED
,
2521 int type ATTRIBUTE_UNUSED
, Elf_Internal_Rela
*relhi
,
2522 Elf_Internal_Rela
*rello
, bfd_byte
*contents
,
2528 insn
= bfd_getb32 (contents
+ relhi
->r_offset
);
2530 addlo
= bfd_getb32 (contents
+ rello
->r_offset
);
2533 addend
+= ((insn
& 0xfffff) << 20) + addlo
;
2535 insn
= (insn
& 0xfff00000) | ((addend
>> 12) & 0xfffff);
2536 bfd_putb32 (insn
, contents
+ relhi
->r_offset
);
2539 /* Do an R_NDS32_LO12 relocation. This is a straightforward 12 bit
2540 inplace relocation; this function exists in order to do the
2541 R_NDS32_HI20_[SU]LO relocation described above. */
2543 static bfd_reloc_status_type
2544 nds32_elf_lo12_reloc (bfd
*input_bfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2545 void *data
, asection
*input_section
, bfd
*output_bfd
,
2546 char **error_message
)
2548 /* This part is from bfd_elf_generic_reloc.
2549 If we're relocating, and this an external symbol, we don't want
2550 to change anything. */
2551 if (output_bfd
!= NULL
&& (symbol
->flags
& BSF_SECTION_SYM
) == 0
2552 && reloc_entry
->addend
== 0)
2554 reloc_entry
->address
+= input_section
->output_offset
;
2555 return bfd_reloc_ok
;
2558 if (nds32_hi20_list
!= NULL
)
2560 struct nds32_hi20
*l
;
2562 l
= nds32_hi20_list
;
2567 unsigned long vallo
;
2568 struct nds32_hi20
*next
;
2570 /* Do the HI20 relocation. Note that we actually don't need
2571 to know anything about the LO12 itself, except where to
2572 find the low 12 bits of the addend needed by the LO12. */
2573 insn
= bfd_getb32 (l
->addr
);
2574 vallo
= bfd_getb32 ((bfd_byte
*) data
+ reloc_entry
->address
);
2576 switch (reloc_entry
->howto
->type
)
2578 case R_NDS32_LO12S3
:
2582 case R_NDS32_LO12S2
:
2586 case R_NDS32_LO12S1
:
2590 case R_NDS32_LO12S0
:
2595 val
= ((insn
& 0xfffff) << 12) + vallo
;
2598 insn
= (insn
& ~(bfd_vma
) 0xfffff) | ((val
>> 12) & 0xfffff);
2599 bfd_putb32 ((bfd_vma
) insn
, l
->addr
);
2606 nds32_hi20_list
= NULL
;
2609 /* Now do the LO12 reloc in the usual way.
2610 ??? It would be nice to call bfd_elf_generic_reloc here,
2611 but we have partial_inplace set. bfd_elf_generic_reloc will
2612 pass the handling back to bfd_install_relocation which will install
2613 a section relative addend which is wrong. */
2614 return nds32_elf_generic_reloc (input_bfd
, reloc_entry
, symbol
, data
,
2615 input_section
, output_bfd
, error_message
);
2618 /* Do generic partial_inplace relocation.
2619 This is a local replacement for bfd_elf_generic_reloc. */
2621 static bfd_reloc_status_type
2622 nds32_elf_generic_reloc (bfd
*input_bfd
, arelent
*reloc_entry
,
2623 asymbol
*symbol
, void *data
, asection
*input_section
,
2624 bfd
*output_bfd
, char **error_message ATTRIBUTE_UNUSED
)
2626 bfd_reloc_status_type ret
;
2628 bfd_byte
*inplace_address
;
2630 /* This part is from bfd_elf_generic_reloc.
2631 If we're relocating, and this an external symbol, we don't want
2632 to change anything. */
2633 if (output_bfd
!= NULL
&& (symbol
->flags
& BSF_SECTION_SYM
) == 0
2634 && reloc_entry
->addend
== 0)
2636 reloc_entry
->address
+= input_section
->output_offset
;
2637 return bfd_reloc_ok
;
2640 /* Now do the reloc in the usual way.
2641 ??? It would be nice to call bfd_elf_generic_reloc here,
2642 but we have partial_inplace set. bfd_elf_generic_reloc will
2643 pass the handling back to bfd_install_relocation which will install
2644 a section relative addend which is wrong. */
2646 /* Sanity check the address (offset in section). */
2647 if (reloc_entry
->address
> bfd_get_section_limit (input_bfd
, input_section
))
2648 return bfd_reloc_outofrange
;
2651 if (bfd_is_und_section (symbol
->section
) && output_bfd
== (bfd
*) NULL
)
2652 ret
= bfd_reloc_undefined
;
2654 if (bfd_is_com_section (symbol
->section
) || output_bfd
!= (bfd
*) NULL
)
2657 relocation
= symbol
->value
;
2659 /* Only do this for a final link. */
2660 if (output_bfd
== (bfd
*) NULL
)
2662 relocation
+= symbol
->section
->output_section
->vma
;
2663 relocation
+= symbol
->section
->output_offset
;
2666 relocation
+= reloc_entry
->addend
;
2667 switch (reloc_entry
->howto
->type
)
2669 case R_NDS32_LO12S3
:
2673 case R_NDS32_LO12S2
:
2677 case R_NDS32_LO12S1
:
2681 case R_NDS32_LO12S0
:
2687 inplace_address
= (bfd_byte
*) data
+ reloc_entry
->address
;
2690 x = ((x & ~reloc_entry->howto->dst_mask) | \
2691 (((x & reloc_entry->howto->src_mask) + relocation) & \
2692 reloc_entry->howto->dst_mask))
2694 switch (reloc_entry
->howto
->size
)
2698 short x
= bfd_getb16 (inplace_address
);
2701 bfd_putb16 ((bfd_vma
) x
, inplace_address
);
2706 unsigned long x
= bfd_getb32 (inplace_address
);
2709 bfd_putb32 ((bfd_vma
) x
, inplace_address
);
2716 if (output_bfd
!= (bfd
*) NULL
)
2717 reloc_entry
->address
+= input_section
->output_offset
;
2722 /* Handle the R_NDS32_SDA15 reloc.
2723 This reloc is used to compute the address of objects in the small data area
2724 and to perform loads and stores from that area.
2725 The lower 15 bits are sign extended and added to the register specified
2726 in the instruction, which is assumed to point to _SDA_BASE_.
2728 Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on
2729 the access size, this must be taken care of. */
2731 static bfd_reloc_status_type
2732 nds32_elf_sda15_reloc (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc_entry
,
2733 asymbol
*symbol
, void *data ATTRIBUTE_UNUSED
,
2734 asection
*input_section
, bfd
*output_bfd
,
2735 char **error_message ATTRIBUTE_UNUSED
)
2737 /* This part is from bfd_elf_generic_reloc. */
2738 if (output_bfd
!= (bfd
*) NULL
2739 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
2740 && (!reloc_entry
->howto
->partial_inplace
|| reloc_entry
->addend
== 0))
2742 reloc_entry
->address
+= input_section
->output_offset
;
2743 return bfd_reloc_ok
;
2746 if (output_bfd
!= NULL
)
2748 /* FIXME: See bfd_perform_relocation. Is this right? */
2749 return bfd_reloc_continue
;
2752 /* FIXME: not sure what to do here yet. But then again, the linker
2753 may never call us. */
2757 /* nds32_elf_ignore_reloc is the special function for
2758 relocation types which don't need to be relocated
2759 like relaxation relocation types.
2760 This function simply return bfd_reloc_ok when it is
2763 static bfd_reloc_status_type
2764 nds32_elf_ignore_reloc (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc_entry
,
2765 asymbol
*symbol ATTRIBUTE_UNUSED
,
2766 void *data ATTRIBUTE_UNUSED
, asection
*input_section
,
2767 bfd
*output_bfd
, char **error_message ATTRIBUTE_UNUSED
)
2769 if (output_bfd
!= NULL
)
2770 reloc_entry
->address
+= input_section
->output_offset
;
2772 return bfd_reloc_ok
;
2776 /* Map BFD reloc types to NDS32 ELF reloc types. */
2778 struct nds32_reloc_map_entry
2780 bfd_reloc_code_real_type bfd_reloc_val
;
2781 unsigned char elf_reloc_val
;
2784 static const struct nds32_reloc_map_entry nds32_reloc_map
[] =
2786 {BFD_RELOC_NONE
, R_NDS32_NONE
},
2787 {BFD_RELOC_16
, R_NDS32_16_RELA
},
2788 {BFD_RELOC_32
, R_NDS32_32_RELA
},
2789 {BFD_RELOC_NDS32_20
, R_NDS32_20_RELA
},
2790 {BFD_RELOC_NDS32_5
, R_NDS32_5_RELA
},
2791 {BFD_RELOC_NDS32_9_PCREL
, R_NDS32_9_PCREL_RELA
},
2792 {BFD_RELOC_NDS32_WORD_9_PCREL
, R_NDS32_WORD_9_PCREL_RELA
},
2793 {BFD_RELOC_NDS32_15_PCREL
, R_NDS32_15_PCREL_RELA
},
2794 {BFD_RELOC_NDS32_17_PCREL
, R_NDS32_17_PCREL_RELA
},
2795 {BFD_RELOC_NDS32_25_PCREL
, R_NDS32_25_PCREL_RELA
},
2796 {BFD_RELOC_NDS32_10_UPCREL
, R_NDS32_10_UPCREL_RELA
},
2797 {BFD_RELOC_NDS32_HI20
, R_NDS32_HI20_RELA
},
2798 {BFD_RELOC_NDS32_LO12S3
, R_NDS32_LO12S3_RELA
},
2799 {BFD_RELOC_NDS32_LO12S2
, R_NDS32_LO12S2_RELA
},
2800 {BFD_RELOC_NDS32_LO12S1
, R_NDS32_LO12S1_RELA
},
2801 {BFD_RELOC_NDS32_LO12S0
, R_NDS32_LO12S0_RELA
},
2802 {BFD_RELOC_NDS32_LO12S0_ORI
, R_NDS32_LO12S0_ORI_RELA
},
2803 {BFD_RELOC_NDS32_SDA15S3
, R_NDS32_SDA15S3_RELA
},
2804 {BFD_RELOC_NDS32_SDA15S2
, R_NDS32_SDA15S2_RELA
},
2805 {BFD_RELOC_NDS32_SDA15S1
, R_NDS32_SDA15S1_RELA
},
2806 {BFD_RELOC_NDS32_SDA15S0
, R_NDS32_SDA15S0_RELA
},
2807 {BFD_RELOC_VTABLE_INHERIT
, R_NDS32_RELA_GNU_VTINHERIT
},
2808 {BFD_RELOC_VTABLE_ENTRY
, R_NDS32_RELA_GNU_VTENTRY
},
2810 {BFD_RELOC_NDS32_GOT20
, R_NDS32_GOT20
},
2811 {BFD_RELOC_NDS32_9_PLTREL
, R_NDS32_9_PLTREL
},
2812 {BFD_RELOC_NDS32_25_PLTREL
, R_NDS32_25_PLTREL
},
2813 {BFD_RELOC_NDS32_COPY
, R_NDS32_COPY
},
2814 {BFD_RELOC_NDS32_GLOB_DAT
, R_NDS32_GLOB_DAT
},
2815 {BFD_RELOC_NDS32_JMP_SLOT
, R_NDS32_JMP_SLOT
},
2816 {BFD_RELOC_NDS32_RELATIVE
, R_NDS32_RELATIVE
},
2817 {BFD_RELOC_NDS32_GOTOFF
, R_NDS32_GOTOFF
},
2818 {BFD_RELOC_NDS32_GOTPC20
, R_NDS32_GOTPC20
},
2819 {BFD_RELOC_NDS32_GOT_HI20
, R_NDS32_GOT_HI20
},
2820 {BFD_RELOC_NDS32_GOT_LO12
, R_NDS32_GOT_LO12
},
2821 {BFD_RELOC_NDS32_GOT_LO15
, R_NDS32_GOT_LO15
},
2822 {BFD_RELOC_NDS32_GOT_LO19
, R_NDS32_GOT_LO19
},
2823 {BFD_RELOC_NDS32_GOTPC_HI20
, R_NDS32_GOTPC_HI20
},
2824 {BFD_RELOC_NDS32_GOTPC_LO12
, R_NDS32_GOTPC_LO12
},
2825 {BFD_RELOC_NDS32_GOTOFF_HI20
, R_NDS32_GOTOFF_HI20
},
2826 {BFD_RELOC_NDS32_GOTOFF_LO12
, R_NDS32_GOTOFF_LO12
},
2827 {BFD_RELOC_NDS32_GOTOFF_LO15
, R_NDS32_GOTOFF_LO15
},
2828 {BFD_RELOC_NDS32_GOTOFF_LO19
, R_NDS32_GOTOFF_LO19
},
2829 {BFD_RELOC_NDS32_INSN16
, R_NDS32_INSN16
},
2830 {BFD_RELOC_NDS32_LABEL
, R_NDS32_LABEL
},
2831 {BFD_RELOC_NDS32_LONGCALL1
, R_NDS32_LONGCALL1
},
2832 {BFD_RELOC_NDS32_LONGCALL2
, R_NDS32_LONGCALL2
},
2833 {BFD_RELOC_NDS32_LONGCALL3
, R_NDS32_LONGCALL3
},
2834 {BFD_RELOC_NDS32_LONGCALL4
, R_NDS32_LONGCALL4
},
2835 {BFD_RELOC_NDS32_LONGCALL5
, R_NDS32_LONGCALL5
},
2836 {BFD_RELOC_NDS32_LONGCALL6
, R_NDS32_LONGCALL6
},
2837 {BFD_RELOC_NDS32_LONGJUMP1
, R_NDS32_LONGJUMP1
},
2838 {BFD_RELOC_NDS32_LONGJUMP2
, R_NDS32_LONGJUMP2
},
2839 {BFD_RELOC_NDS32_LONGJUMP3
, R_NDS32_LONGJUMP3
},
2840 {BFD_RELOC_NDS32_LONGJUMP4
, R_NDS32_LONGJUMP4
},
2841 {BFD_RELOC_NDS32_LONGJUMP5
, R_NDS32_LONGJUMP5
},
2842 {BFD_RELOC_NDS32_LONGJUMP6
, R_NDS32_LONGJUMP6
},
2843 {BFD_RELOC_NDS32_LONGJUMP7
, R_NDS32_LONGJUMP7
},
2844 {BFD_RELOC_NDS32_LOADSTORE
, R_NDS32_LOADSTORE
},
2845 {BFD_RELOC_NDS32_9_FIXED
, R_NDS32_9_FIXED_RELA
},
2846 {BFD_RELOC_NDS32_15_FIXED
, R_NDS32_15_FIXED_RELA
},
2847 {BFD_RELOC_NDS32_17_FIXED
, R_NDS32_17_FIXED_RELA
},
2848 {BFD_RELOC_NDS32_25_FIXED
, R_NDS32_25_FIXED_RELA
},
2849 {BFD_RELOC_NDS32_PLTREL_HI20
, R_NDS32_PLTREL_HI20
},
2850 {BFD_RELOC_NDS32_PLTREL_LO12
, R_NDS32_PLTREL_LO12
},
2851 {BFD_RELOC_NDS32_PLT_GOTREL_HI20
, R_NDS32_PLT_GOTREL_HI20
},
2852 {BFD_RELOC_NDS32_PLT_GOTREL_LO12
, R_NDS32_PLT_GOTREL_LO12
},
2853 {BFD_RELOC_NDS32_PLT_GOTREL_LO15
, R_NDS32_PLT_GOTREL_LO15
},
2854 {BFD_RELOC_NDS32_PLT_GOTREL_LO19
, R_NDS32_PLT_GOTREL_LO19
},
2855 {BFD_RELOC_NDS32_PLT_GOTREL_LO20
, R_NDS32_PLT_GOTREL_LO20
},
2856 {BFD_RELOC_NDS32_SDA12S2_DP
, R_NDS32_SDA12S2_DP_RELA
},
2857 {BFD_RELOC_NDS32_SDA12S2_SP
, R_NDS32_SDA12S2_SP_RELA
},
2858 {BFD_RELOC_NDS32_LO12S2_DP
, R_NDS32_LO12S2_DP_RELA
},
2859 {BFD_RELOC_NDS32_LO12S2_SP
, R_NDS32_LO12S2_SP_RELA
},
2860 {BFD_RELOC_NDS32_SDA16S3
, R_NDS32_SDA16S3_RELA
},
2861 {BFD_RELOC_NDS32_SDA17S2
, R_NDS32_SDA17S2_RELA
},
2862 {BFD_RELOC_NDS32_SDA18S1
, R_NDS32_SDA18S1_RELA
},
2863 {BFD_RELOC_NDS32_SDA19S0
, R_NDS32_SDA19S0_RELA
},
2864 {BFD_RELOC_NDS32_SDA_FP7U2_RELA
, R_NDS32_SDA_FP7U2_RELA
},
2865 {BFD_RELOC_NDS32_DWARF2_OP1
, R_NDS32_DWARF2_OP1_RELA
},
2866 {BFD_RELOC_NDS32_DWARF2_OP2
, R_NDS32_DWARF2_OP2_RELA
},
2867 {BFD_RELOC_NDS32_DWARF2_LEB
, R_NDS32_DWARF2_LEB_RELA
},
2868 {BFD_RELOC_NDS32_UPDATE_TA
, R_NDS32_UPDATE_TA_RELA
},
2869 {BFD_RELOC_NDS32_GOT_SUFF
, R_NDS32_GOT_SUFF
},
2870 {BFD_RELOC_NDS32_GOTOFF_SUFF
, R_NDS32_GOTOFF_SUFF
},
2871 {BFD_RELOC_NDS32_GOT15S2
, R_NDS32_GOT15S2_RELA
},
2872 {BFD_RELOC_NDS32_GOT17S2
, R_NDS32_GOT17S2_RELA
},
2873 {BFD_RELOC_NDS32_PTR
, R_NDS32_PTR
},
2874 {BFD_RELOC_NDS32_PTR_COUNT
, R_NDS32_PTR_COUNT
},
2875 {BFD_RELOC_NDS32_PLT_GOT_SUFF
, R_NDS32_PLT_GOT_SUFF
},
2876 {BFD_RELOC_NDS32_PTR_RESOLVED
, R_NDS32_PTR_RESOLVED
},
2877 {BFD_RELOC_NDS32_RELAX_ENTRY
, R_NDS32_RELAX_ENTRY
},
2878 {BFD_RELOC_NDS32_MULCALL_SUFF
, R_NDS32_MULCALL_SUFF
},
2879 {BFD_RELOC_NDS32_PLTBLOCK
, R_NDS32_PLTBLOCK
},
2880 {BFD_RELOC_NDS32_RELAX_REGION_BEGIN
, R_NDS32_RELAX_REGION_BEGIN
},
2881 {BFD_RELOC_NDS32_RELAX_REGION_END
, R_NDS32_RELAX_REGION_END
},
2882 {BFD_RELOC_NDS32_MINUEND
, R_NDS32_MINUEND
},
2883 {BFD_RELOC_NDS32_SUBTRAHEND
, R_NDS32_SUBTRAHEND
},
2884 {BFD_RELOC_NDS32_EMPTY
, R_NDS32_EMPTY
},
2886 {BFD_RELOC_NDS32_DIFF8
, R_NDS32_DIFF8
},
2887 {BFD_RELOC_NDS32_DIFF16
, R_NDS32_DIFF16
},
2888 {BFD_RELOC_NDS32_DIFF32
, R_NDS32_DIFF32
},
2889 {BFD_RELOC_NDS32_DIFF_ULEB128
, R_NDS32_DIFF_ULEB128
},
2890 {BFD_RELOC_NDS32_25_ABS
, R_NDS32_25_ABS_RELA
},
2891 {BFD_RELOC_NDS32_DATA
, R_NDS32_DATA
},
2892 {BFD_RELOC_NDS32_TRAN
, R_NDS32_TRAN
},
2893 {BFD_RELOC_NDS32_17IFC_PCREL
, R_NDS32_17IFC_PCREL_RELA
},
2894 {BFD_RELOC_NDS32_10IFCU_PCREL
, R_NDS32_10IFCU_PCREL_RELA
},
2895 {BFD_RELOC_NDS32_TLS_LE_HI20
, R_NDS32_TLS_LE_HI20
},
2896 {BFD_RELOC_NDS32_TLS_LE_LO12
, R_NDS32_TLS_LE_LO12
},
2897 {BFD_RELOC_NDS32_TLS_LE_ADD
, R_NDS32_TLS_LE_ADD
},
2898 {BFD_RELOC_NDS32_TLS_LE_LS
, R_NDS32_TLS_LE_LS
},
2899 {BFD_RELOC_NDS32_TLS_IE_HI20
, R_NDS32_TLS_IE_HI20
},
2900 {BFD_RELOC_NDS32_TLS_IE_LO12S2
, R_NDS32_TLS_IE_LO12S2
},
2901 {BFD_RELOC_NDS32_TLS_TPOFF
, R_NDS32_TLS_TPOFF
},
2902 {BFD_RELOC_NDS32_TLS_LE_20
, R_NDS32_TLS_LE_20
},
2903 {BFD_RELOC_NDS32_TLS_LE_15S0
, R_NDS32_TLS_LE_15S0
},
2904 {BFD_RELOC_NDS32_TLS_LE_15S1
, R_NDS32_TLS_LE_15S1
},
2905 {BFD_RELOC_NDS32_TLS_LE_15S2
, R_NDS32_TLS_LE_15S2
},
2910 static reloc_howto_type
*
2911 bfd_elf32_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
2916 for (i
= 0; i
< ARRAY_SIZE (nds32_elf_howto_table
); i
++)
2917 if (nds32_elf_howto_table
[i
].name
!= NULL
2918 && strcasecmp (nds32_elf_howto_table
[i
].name
, r_name
) == 0)
2919 return &nds32_elf_howto_table
[i
];
2921 for (i
= 0; i
< ARRAY_SIZE (nds32_elf_relax_howto_table
); i
++)
2922 if (nds32_elf_relax_howto_table
[i
].name
!= NULL
2923 && strcasecmp (nds32_elf_relax_howto_table
[i
].name
, r_name
) == 0)
2924 return &nds32_elf_relax_howto_table
[i
];
2929 static reloc_howto_type
*
2930 bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code
)
2932 if (code
< R_NDS32_RELAX_ENTRY
)
2934 BFD_ASSERT (code
< ARRAY_SIZE (nds32_elf_howto_table
));
2935 return &nds32_elf_howto_table
[code
];
2939 BFD_ASSERT ((size_t) (code
- R_NDS32_RELAX_ENTRY
)
2940 < ARRAY_SIZE (nds32_elf_relax_howto_table
));
2941 return &nds32_elf_relax_howto_table
[code
- R_NDS32_RELAX_ENTRY
];
2945 static reloc_howto_type
*
2946 bfd_elf32_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
2947 bfd_reloc_code_real_type code
)
2951 for (i
= 0; i
< ARRAY_SIZE (nds32_reloc_map
); i
++)
2953 if (nds32_reloc_map
[i
].bfd_reloc_val
== code
)
2954 return bfd_elf32_bfd_reloc_type_table_lookup
2955 (nds32_reloc_map
[i
].elf_reloc_val
);
2961 /* Set the howto pointer for an NDS32 ELF reloc. */
2964 nds32_info_to_howto_rel (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
2965 Elf_Internal_Rela
*dst
)
2967 enum elf_nds32_reloc_type r_type
;
2969 r_type
= ELF32_R_TYPE (dst
->r_info
);
2970 if (r_type
> R_NDS32_GNU_VTENTRY
)
2972 _bfd_error_handler (_("%B: invalid NDS32 reloc number: %d"), abfd
, r_type
);
2975 cache_ptr
->howto
= bfd_elf32_bfd_reloc_type_table_lookup (r_type
);
2979 nds32_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
2980 Elf_Internal_Rela
*dst
)
2982 BFD_ASSERT ((ELF32_R_TYPE (dst
->r_info
) == R_NDS32_NONE
)
2983 || ((ELF32_R_TYPE (dst
->r_info
) > R_NDS32_GNU_VTENTRY
)
2984 && (ELF32_R_TYPE (dst
->r_info
) < R_NDS32_max
)));
2985 cache_ptr
->howto
= bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (dst
->r_info
));
2988 /* Support for core dump NOTE sections.
2989 Reference to include/linux/elfcore.h in Linux. */
2992 nds32_elf_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
2997 switch (note
->descsz
)
3000 /* Linux/NDS32 32-bit, ABI1 */
3003 elf_tdata (abfd
)->core
->signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
3006 elf_tdata (abfd
)->core
->pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
3014 /* Linux/NDS32 32-bit */
3017 elf_tdata (abfd
)->core
->signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
3020 elf_tdata (abfd
)->core
->pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
3031 /* Make a ".reg" section. */
3032 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
3033 size
, note
->descpos
+ offset
);
3037 nds32_elf_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
3039 switch (note
->descsz
)
3044 /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform. */
3045 elf_tdata (abfd
)->core
->program
=
3046 _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
3047 elf_tdata (abfd
)->core
->command
=
3048 _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
3055 /* Note that for some reason, a spurious space is tacked
3056 onto the end of the args in some (at least one anyway)
3057 implementations, so strip it off if it exists. */
3059 char *command
= elf_tdata (abfd
)->core
->command
;
3060 int n
= strlen (command
);
3062 if (0 < n
&& command
[n
- 1] == ' ')
3063 command
[n
- 1] = '\0';
3069 /* Hook called by the linker routine which adds symbols from an object
3070 file. We must handle the special NDS32 section numbers here.
3071 We also keep watching for whether we need to create the sdata special
3075 nds32_elf_add_symbol_hook (bfd
*abfd
,
3076 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3077 Elf_Internal_Sym
*sym
,
3078 const char **namep ATTRIBUTE_UNUSED
,
3079 flagword
*flagsp ATTRIBUTE_UNUSED
,
3080 asection
**secp
, bfd_vma
*valp
)
3082 switch (sym
->st_shndx
)
3085 /* Common symbols less than the GP size are automatically
3086 treated as SHN_MIPS_SCOMMON symbols. */
3087 if (sym
->st_size
> elf_gp_size (abfd
)
3088 || ELF_ST_TYPE (sym
->st_info
) == STT_TLS
)
3091 /* st_value is the alignemnt constraint.
3092 That might be its actual size if it is an array or structure. */
3093 switch (sym
->st_value
)
3096 *secp
= bfd_make_section_old_way (abfd
, ".scommon_b");
3099 *secp
= bfd_make_section_old_way (abfd
, ".scommon_h");
3102 *secp
= bfd_make_section_old_way (abfd
, ".scommon_w");
3105 *secp
= bfd_make_section_old_way (abfd
, ".scommon_d");
3111 (*secp
)->flags
|= SEC_IS_COMMON
;
3112 *valp
= sym
->st_size
;
3120 /* This function can figure out the best location for a base register to access
3121 data relative to this base register
3123 sda_d0: size of first DOUBLE WORD data section
3124 sda_w0: size of first WORD data section
3125 sda_h0: size of first HALF WORD data section
3126 sda_b : size of BYTE data section
3127 sda_hi: size of second HALF WORD data section
3128 sda_w1: size of second WORD data section
3129 sda_d1: size of second DOUBLE WORD data section
3131 offset (always positive) from the beginning of sda_d0 if OK
3132 a negative error value if fail
3134 these 7 sections have to be located back to back if exist
3135 a pass in 0 value for non-existing section */
3137 /* Due to the interpretation of simm15 field of load/store depending on
3138 data accessing size, the organization of base register relative data shall
3139 like the following figure
3140 -------------------------------------------
3141 | DOUBLE WORD sized data (range +/- 128K)
3142 -------------------------------------------
3143 | WORD sized data (range +/- 64K)
3144 -------------------------------------------
3145 | HALF WORD sized data (range +/- 32K)
3146 -------------------------------------------
3147 | BYTE sized data (range +/- 16K)
3148 -------------------------------------------
3149 | HALF WORD sized data (range +/- 32K)
3150 -------------------------------------------
3151 | WORD sized data (range +/- 64K)
3152 -------------------------------------------
3153 | DOUBLE WORD sized data (range +/- 128K)
3154 -------------------------------------------
3155 Its base register shall be set to access these data freely. */
3157 /* We have to figure out the SDA_BASE value, so that we can adjust the
3158 symbol value correctly. We look up the symbol _SDA_BASE_ in the output
3159 BFD. If we can't find it, we're stuck. We cache it in the ELF
3160 target data. We don't need to adjust the symbol value for an
3161 external symbol if we are producing relocatable output. */
3163 static asection
*sda_rela_sec
= NULL
;
3165 #define SDA_SECTION_NUM 10
3167 static bfd_reloc_status_type
3168 nds32_elf_final_sda_base (bfd
*output_bfd
, struct bfd_link_info
*info
,
3169 bfd_vma
*psb
, bfd_boolean add_symbol
)
3172 struct elf_nds32_link_hash_table
*table
;
3173 struct bfd_link_hash_entry
*h
, *h2
;
3174 long unsigned int total
= 0;
3176 h
= bfd_link_hash_lookup (info
->hash
, "_SDA_BASE_", FALSE
, FALSE
, TRUE
);
3177 if (!h
|| (h
->type
!= bfd_link_hash_defined
&& h
->type
!= bfd_link_hash_defweak
))
3179 asection
*first
= NULL
, *final
= NULL
, *temp
;
3181 /* The first section must be 4-byte aligned to promise _SDA_BASE_ being
3182 4 byte-aligned. Therefore, it has to set the first section ".data"
3184 static const char sec_name
[SDA_SECTION_NUM
][10] =
3186 ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
3187 ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
3191 if (output_bfd
->sections
== NULL
)
3193 *psb
= elf_gp (output_bfd
);
3194 return bfd_reloc_ok
;
3197 /* Get the first and final section. */
3198 while (i
< sizeof (sec_name
) / sizeof (sec_name
[0]))
3200 temp
= bfd_get_section_by_name (output_bfd
, sec_name
[i
]);
3201 if (temp
&& !first
&& (temp
->size
!= 0 || temp
->rawsize
!= 0))
3203 if (temp
&& (temp
->size
!= 0 || temp
->rawsize
!= 0))
3206 /* Summarize the sections in order to check if joining .bss. */
3207 if (temp
&& temp
->size
!= 0)
3208 total
+= temp
->size
;
3209 else if (temp
&& temp
->rawsize
!= 0)
3210 total
+= temp
->rawsize
;
3215 /* Check .bss size. */
3216 temp
= bfd_get_section_by_name (output_bfd
, ".bss");
3219 if (temp
->size
!= 0)
3220 total
+= temp
->size
;
3221 else if (temp
->rawsize
!= 0)
3222 total
+= temp
->rawsize
;
3224 if (total
< 0x80000)
3226 if (!first
&& (temp
->size
!= 0 || temp
->rawsize
!= 0))
3228 if ((temp
->size
!= 0 || temp
->rawsize
!= 0))
3235 /* The middle of data region. */
3236 sda_base
= final
->vma
/ 2 + final
->rawsize
/ 2 + first
->vma
/ 2;
3238 /* Find the section sda_base located. */
3240 while (i
< sizeof (sec_name
) / sizeof (sec_name
[0]))
3242 final
= bfd_get_section_by_name (output_bfd
, sec_name
[i
]);
3243 if (final
&& (final
->size
!= 0 || final
->rawsize
!= 0)
3244 && sda_base
>= final
->vma
)
3255 /* There is not any data section in output bfd, and set _SDA_BASE_ in
3256 first output section. */
3257 first
= output_bfd
->sections
;
3258 while (first
&& first
->size
== 0 && first
->rawsize
== 0)
3259 first
= first
->next
;
3262 *psb
= elf_gp (output_bfd
);
3263 return bfd_reloc_ok
;
3265 sda_base
= first
->vma
+ first
->rawsize
;
3268 sda_base
-= first
->vma
;
3269 sda_base
= sda_base
& (~7);
3271 if (!_bfd_generic_link_add_one_symbol
3272 (info
, output_bfd
, "_SDA_BASE_", BSF_GLOBAL
| BSF_WEAK
, first
,
3273 (bfd_vma
) sda_base
, (const char *) NULL
, FALSE
,
3274 get_elf_backend_data (output_bfd
)->collect
, &h
))
3277 sda_rela_sec
= first
;
3279 table
= nds32_elf_hash_table (info
);
3280 relax_fp_as_gp
= table
->relax_fp_as_gp
;
3283 h2
= bfd_link_hash_lookup (info
->hash
, FP_BASE_NAME
,
3284 FALSE
, FALSE
, FALSE
);
3285 /* Define a weak FP_BASE_NAME here to prevent the undefined symbol.
3286 And set FP equal to SDA_BASE to do relaxation for
3287 la $fp, _FP_BASE_. */
3288 if (!_bfd_generic_link_add_one_symbol
3289 (info
, output_bfd
, FP_BASE_NAME
, BSF_GLOBAL
| BSF_WEAK
,
3290 first
, (bfd_vma
) sda_base
, (const char *) NULL
,
3291 FALSE
, get_elf_backend_data (output_bfd
)->collect
, &h2
))
3296 if (add_symbol
== TRUE
)
3301 elf_gp (output_bfd
) = (h
->u
.def
.value
3302 + h
->u
.def
.section
->output_section
->vma
3303 + h
->u
.def
.section
->output_offset
);
3307 _bfd_error_handler (_("error: Can't find symbol: _SDA_BASE_."));
3308 return bfd_reloc_dangerous
;
3312 *psb
= h
->u
.def
.value
+ h
->u
.def
.section
->output_section
->vma
3313 + h
->u
.def
.section
->output_offset
;
3314 return bfd_reloc_ok
;
3318 /* Return size of a PLT entry. */
3319 #define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
3322 /* Create an entry in an nds32 ELF linker hash table. */
3324 static struct bfd_hash_entry
*
3325 nds32_elf_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3326 struct bfd_hash_table
*table
,
3329 struct elf_nds32_link_hash_entry
*ret
;
3331 ret
= (struct elf_nds32_link_hash_entry
*) entry
;
3333 /* Allocate the structure if it has not already been allocated by a
3336 ret
= (struct elf_nds32_link_hash_entry
*)
3337 bfd_hash_allocate (table
, sizeof (struct elf_nds32_link_hash_entry
));
3340 return (struct bfd_hash_entry
*) ret
;
3342 /* Call the allocation method of the superclass. */
3343 ret
= (struct elf_nds32_link_hash_entry
*)
3344 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
3348 struct elf_nds32_link_hash_entry
*eh
;
3350 eh
= (struct elf_nds32_link_hash_entry
*) ret
;
3351 eh
->dyn_relocs
= NULL
;
3352 eh
->tls_type
= GOT_UNKNOWN
;
3355 return (struct bfd_hash_entry
*) ret
;
3358 /* Create an nds32 ELF linker hash table. */
3360 static struct bfd_link_hash_table
*
3361 nds32_elf_link_hash_table_create (bfd
*abfd
)
3363 struct elf_nds32_link_hash_table
*ret
;
3365 bfd_size_type amt
= sizeof (struct elf_nds32_link_hash_table
);
3367 ret
= (struct elf_nds32_link_hash_table
*) bfd_zmalloc (amt
);
3372 if (!_bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
3373 nds32_elf_link_hash_newfunc
,
3374 sizeof (struct elf_nds32_link_hash_entry
),
3382 ret
->sgotplt
= NULL
;
3383 ret
->srelgot
= NULL
;
3385 ret
->srelplt
= NULL
;
3386 ret
->sdynbss
= NULL
;
3387 ret
->srelbss
= NULL
;
3388 ret
->sym_ld_script
= NULL
;
3389 ret
->ex9_export_file
= NULL
;
3390 ret
->ex9_import_file
= NULL
;
3392 return &ret
->root
.root
;
3395 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3396 shortcuts to them in our hash table. */
3399 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
3401 struct elf_nds32_link_hash_table
*htab
;
3403 if (!_bfd_elf_create_got_section (dynobj
, info
))
3406 htab
= nds32_elf_hash_table (info
);
3407 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
3408 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
3409 if (!htab
->sgot
|| !htab
->sgotplt
)
3412 /* _bfd_elf_create_got_section will create it for us. */
3413 htab
->srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
3414 if (htab
->srelgot
== NULL
3415 || !bfd_set_section_flags (dynobj
, htab
->srelgot
,
3416 (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
3417 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
3419 || !bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
3425 /* Create dynamic sections when linking against a dynamic object. */
3428 nds32_elf_create_dynamic_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3430 struct elf_nds32_link_hash_table
*htab
;
3431 flagword flags
, pltflags
;
3432 register asection
*s
;
3433 const struct elf_backend_data
*bed
;
3434 int ptralign
= 2; /* 32-bit */
3436 bed
= get_elf_backend_data (abfd
);
3438 htab
= nds32_elf_hash_table (info
);
3440 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3441 .rel[a].bss sections. */
3443 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
3444 | SEC_LINKER_CREATED
);
3447 pltflags
|= SEC_CODE
;
3448 if (bed
->plt_not_loaded
)
3449 pltflags
&= ~(SEC_LOAD
| SEC_HAS_CONTENTS
);
3450 if (bed
->plt_readonly
)
3451 pltflags
|= SEC_READONLY
;
3453 s
= bfd_make_section (abfd
, ".plt");
3456 || !bfd_set_section_flags (abfd
, s
, pltflags
)
3457 || !bfd_set_section_alignment (abfd
, s
, bed
->plt_alignment
))
3460 if (bed
->want_plt_sym
)
3462 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3464 struct bfd_link_hash_entry
*bh
= NULL
;
3465 struct elf_link_hash_entry
*h
;
3467 if (!(_bfd_generic_link_add_one_symbol
3468 (info
, abfd
, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL
, s
,
3469 (bfd_vma
) 0, (const char *) NULL
, FALSE
,
3470 get_elf_backend_data (abfd
)->collect
, &bh
)))
3473 h
= (struct elf_link_hash_entry
*) bh
;
3475 h
->type
= STT_OBJECT
;
3477 if (bfd_link_pic (info
) && !bfd_elf_link_record_dynamic_symbol (info
, h
))
3481 s
= bfd_make_section (abfd
,
3482 bed
->default_use_rela_p
? ".rela.plt" : ".rel.plt");
3485 || !bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3486 || !bfd_set_section_alignment (abfd
, s
, ptralign
))
3489 if (htab
->sgot
== NULL
&& !create_got_section (abfd
, info
))
3493 const char *secname
;
3498 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3500 secflags
= bfd_get_section_flags (abfd
, sec
);
3501 if ((secflags
& (SEC_DATA
| SEC_LINKER_CREATED
))
3502 || ((secflags
& SEC_HAS_CONTENTS
) != SEC_HAS_CONTENTS
))
3504 secname
= bfd_get_section_name (abfd
, sec
);
3505 relname
= (char *) bfd_malloc ((bfd_size_type
) strlen (secname
) + 6);
3506 strcpy (relname
, ".rela");
3507 strcat (relname
, secname
);
3508 if (bfd_get_section_by_name (abfd
, secname
))
3510 s
= bfd_make_section (abfd
, relname
);
3512 || !bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3513 || !bfd_set_section_alignment (abfd
, s
, ptralign
))
3518 if (bed
->want_dynbss
)
3520 /* The .dynbss section is a place to put symbols which are defined
3521 by dynamic objects, are referenced by regular objects, and are
3522 not functions. We must allocate space for them in the process
3523 image and use a R_*_COPY reloc to tell the dynamic linker to
3524 initialize them at run time. The linker script puts the .dynbss
3525 section into the .bss section of the final image. */
3526 s
= bfd_make_section (abfd
, ".dynbss");
3529 || !bfd_set_section_flags (abfd
, s
, SEC_ALLOC
| SEC_LINKER_CREATED
))
3531 /* The .rel[a].bss section holds copy relocs. This section is not
3532 normally needed. We need to create it here, though, so that the
3533 linker will map it to an output section. We can't just create it
3534 only if we need it, because we will not know whether we need it
3535 until we have seen all the input files, and the first time the
3536 main linker code calls BFD after examining all the input files
3537 (size_dynamic_sections) the input sections have already been
3538 mapped to the output sections. If the section turns out not to
3539 be needed, we can discard it later. We will never need this
3540 section when generating a shared object, since they do not use
3542 if (!bfd_link_pic (info
))
3544 s
= bfd_make_section (abfd
, (bed
->default_use_rela_p
3545 ? ".rela.bss" : ".rel.bss"));
3548 || !bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3549 || !bfd_set_section_alignment (abfd
, s
, ptralign
))
3557 /* Copy the extra info we tack onto an elf_link_hash_entry. */
3559 nds32_elf_copy_indirect_symbol (struct bfd_link_info
*info
,
3560 struct elf_link_hash_entry
*dir
,
3561 struct elf_link_hash_entry
*ind
)
3563 struct elf_nds32_link_hash_entry
*edir
, *eind
;
3565 edir
= (struct elf_nds32_link_hash_entry
*) dir
;
3566 eind
= (struct elf_nds32_link_hash_entry
*) ind
;
3568 if (eind
->dyn_relocs
!= NULL
)
3570 if (edir
->dyn_relocs
!= NULL
)
3572 struct elf_nds32_dyn_relocs
**pp
;
3573 struct elf_nds32_dyn_relocs
*p
;
3575 if (ind
->root
.type
== bfd_link_hash_indirect
)
3578 /* Add reloc counts against the weak sym to the strong sym
3579 list. Merge any entries against the same section. */
3580 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
;)
3582 struct elf_nds32_dyn_relocs
*q
;
3584 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
3585 if (q
->sec
== p
->sec
)
3587 q
->pc_count
+= p
->pc_count
;
3588 q
->count
+= p
->count
;
3595 *pp
= edir
->dyn_relocs
;
3598 edir
->dyn_relocs
= eind
->dyn_relocs
;
3599 eind
->dyn_relocs
= NULL
;
3602 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
3606 /* Adjust a symbol defined by a dynamic object and referenced by a
3607 regular object. The current definition is in some section of the
3608 dynamic object, but we're not including those sections. We have to
3609 change the definition to something the rest of the link can
3613 nds32_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
3614 struct elf_link_hash_entry
*h
)
3616 struct elf_nds32_link_hash_table
*htab
;
3617 struct elf_nds32_link_hash_entry
*eh
;
3618 struct elf_nds32_dyn_relocs
*p
;
3621 unsigned int power_of_two
;
3623 dynobj
= elf_hash_table (info
)->dynobj
;
3625 /* Make sure we know what is going on here. */
3626 BFD_ASSERT (dynobj
!= NULL
3628 || h
->u
.weakdef
!= NULL
3629 || (h
->def_dynamic
&& h
->ref_regular
&& !h
->def_regular
)));
3632 /* If this is a function, put it in the procedure linkage table. We
3633 will fill in the contents of the procedure linkage table later,
3634 when we know the address of the .got section. */
3635 if (h
->type
== STT_FUNC
|| h
->needs_plt
)
3637 if (!bfd_link_pic (info
)
3640 && h
->root
.type
!= bfd_link_hash_undefweak
3641 && h
->root
.type
!= bfd_link_hash_undefined
)
3643 /* This case can occur if we saw a PLT reloc in an input
3644 file, but the symbol was never referred to by a dynamic
3645 object. In such a case, we don't actually need to build
3646 a procedure linkage table, and we can just do a PCREL
3648 h
->plt
.offset
= (bfd_vma
) - 1;
3655 h
->plt
.offset
= (bfd_vma
) - 1;
3657 /* If this is a weak symbol, and there is a real definition, the
3658 processor independent code will have arranged for us to see the
3659 real definition first, and we can just use the same value. */
3660 if (h
->u
.weakdef
!= NULL
)
3662 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
3663 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
3664 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
3665 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
3669 /* This is a reference to a symbol defined by a dynamic object which
3670 is not a function. */
3672 /* If we are creating a shared library, we must presume that the
3673 only references to the symbol are via the global offset table.
3674 For such cases we need not do anything here; the relocations will
3675 be handled correctly by relocate_section. */
3676 if (bfd_link_pic (info
))
3679 /* If there are no references to this symbol that do not use the
3680 GOT, we don't need to generate a copy reloc. */
3681 if (!h
->non_got_ref
)
3684 /* If -z nocopyreloc was given, we won't generate them either. */
3685 if (info
->nocopyreloc
)
3691 eh
= (struct elf_nds32_link_hash_entry
*) h
;
3692 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
3694 s
= p
->sec
->output_section
;
3695 if (s
!= NULL
&& (s
->flags
& (SEC_READONLY
| SEC_HAS_CONTENTS
)) != 0)
3699 /* If we didn't find any dynamic relocs in sections which needs the
3700 copy reloc, then we'll be keeping the dynamic relocs and avoiding
3708 /* We must allocate the symbol in our .dynbss section, which will
3709 become part of the .bss section of the executable. There will be
3710 an entry for this symbol in the .dynsym section. The dynamic
3711 object will contain position independent code, so all references
3712 from the dynamic object to this symbol will go through the global
3713 offset table. The dynamic linker will use the .dynsym entry to
3714 determine the address it must put in the global offset table, so
3715 both the dynamic object and the regular object will refer to the
3716 same memory location for the variable. */
3718 htab
= nds32_elf_hash_table (info
);
3720 BFD_ASSERT (s
!= NULL
);
3722 /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
3723 to copy the initial value out of the dynamic object and into the
3724 runtime process image. We need to remember the offset into the
3725 .rela.bss section we are going to use. */
3726 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
3730 srel
= htab
->srelbss
;
3731 BFD_ASSERT (srel
!= NULL
);
3732 srel
->size
+= sizeof (Elf32_External_Rela
);
3736 /* We need to figure out the alignment required for this symbol. I
3737 have no idea how ELF linkers handle this. */
3738 power_of_two
= bfd_log2 (h
->size
);
3739 if (power_of_two
> 3)
3742 /* Apply the required alignment. */
3743 s
->size
= BFD_ALIGN (s
->size
, (bfd_size_type
) (1 << power_of_two
));
3744 if (power_of_two
> bfd_get_section_alignment (dynobj
, s
))
3746 if (!bfd_set_section_alignment (dynobj
, s
, power_of_two
))
3750 /* Define the symbol as being at this point in the section. */
3751 h
->root
.u
.def
.section
= s
;
3752 h
->root
.u
.def
.value
= s
->size
;
3754 /* Increment the section size to make room for the symbol. */
3760 /* Allocate space in .plt, .got and associated reloc sections for
3764 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
3766 struct bfd_link_info
*info
;
3767 struct elf_nds32_link_hash_table
*htab
;
3768 struct elf_nds32_link_hash_entry
*eh
;
3769 struct elf_nds32_dyn_relocs
*p
;
3771 if (h
->root
.type
== bfd_link_hash_indirect
)
3774 if (h
->root
.type
== bfd_link_hash_warning
)
3775 /* When warning symbols are created, they **replace** the "real"
3776 entry in the hash table, thus we never get to see the real
3777 symbol in a hash traversal. So look at it now. */
3778 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
3780 info
= (struct bfd_link_info
*) inf
;
3781 htab
= nds32_elf_hash_table (info
);
3783 eh
= (struct elf_nds32_link_hash_entry
*) h
;
3785 if (htab
->root
.dynamic_sections_created
&& h
->plt
.refcount
> 0)
3787 /* Make sure this symbol is output as a dynamic symbol.
3788 Undefined weak syms won't yet be marked as dynamic. */
3789 if (h
->dynindx
== -1 && !h
->forced_local
)
3791 if (!bfd_elf_link_record_dynamic_symbol (info
, h
))
3795 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info
), h
))
3797 asection
*s
= htab
->splt
;
3799 /* If this is the first .plt entry, make room for the special
3802 s
->size
+= PLT_ENTRY_SIZE
;
3804 h
->plt
.offset
= s
->size
;
3806 /* If this symbol is not defined in a regular file, and we are
3807 not generating a shared library, then set the symbol to this
3808 location in the .plt. This is required to make function
3809 pointers compare as equal between the normal executable and
3810 the shared library. */
3811 if (!bfd_link_pic (info
) && !h
->def_regular
)
3813 h
->root
.u
.def
.section
= s
;
3814 h
->root
.u
.def
.value
= h
->plt
.offset
;
3817 /* Make room for this entry. */
3818 s
->size
+= PLT_ENTRY_SIZE
;
3820 /* We also need to make an entry in the .got.plt section, which
3821 will be placed in the .got section by the linker script. */
3822 htab
->sgotplt
->size
+= 4;
3824 /* We also need to make an entry in the .rel.plt section. */
3825 htab
->srelplt
->size
+= sizeof (Elf32_External_Rela
);
3829 h
->plt
.offset
= (bfd_vma
) - 1;
3835 h
->plt
.offset
= (bfd_vma
) - 1;
3839 if (h
->got
.refcount
> 0)
3843 int tls_type
= elf32_nds32_hash_entry (h
)->tls_type
;
3845 /* Make sure this symbol is output as a dynamic symbol.
3846 Undefined weak syms won't yet be marked as dynamic. */
3847 if (h
->dynindx
== -1 && !h
->forced_local
)
3849 if (!bfd_elf_link_record_dynamic_symbol (info
, h
))
3854 h
->got
.offset
= s
->size
;
3856 if (tls_type
== GOT_UNKNOWN
)
3858 else if (tls_type
== GOT_NORMAL
3859 || tls_type
== GOT_TLS_IE
)
3860 /* Need a GOT slot. */
3863 dyn
= htab
->root
.dynamic_sections_created
;
3864 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, bfd_link_pic (info
), h
))
3865 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
3868 h
->got
.offset
= (bfd_vma
) - 1;
3870 if (eh
->dyn_relocs
== NULL
)
3873 /* In the shared -Bsymbolic case, discard space allocated for
3874 dynamic pc-relative relocs against symbols which turn out to be
3875 defined in regular objects. For the normal shared case, discard
3876 space for pc-relative relocs that have become local due to symbol
3877 visibility changes. */
3879 if (bfd_link_pic (info
))
3881 if (h
->def_regular
&& (h
->forced_local
|| info
->symbolic
))
3883 struct elf_nds32_dyn_relocs
**pp
;
3885 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
;)
3887 p
->count
-= p
->pc_count
;
3898 /* For the non-shared case, discard space for relocs against
3899 symbols which turn out to need copy relocs or are not dynamic. */
3904 || (htab
->root
.dynamic_sections_created
3905 && (h
->root
.type
== bfd_link_hash_undefweak
3906 || h
->root
.type
== bfd_link_hash_undefined
))))
3908 /* Make sure this symbol is output as a dynamic symbol.
3909 Undefined weak syms won't yet be marked as dynamic. */
3910 if (h
->dynindx
== -1 && !h
->forced_local
)
3912 if (!bfd_elf_link_record_dynamic_symbol (info
, h
))
3916 /* If that succeeded, we know we'll be keeping all the
3918 if (h
->dynindx
!= -1)
3922 eh
->dyn_relocs
= NULL
;
3927 /* Finally, allocate space. */
3928 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
3930 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
3931 sreloc
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
3937 /* Find any dynamic relocs that apply to read-only sections. */
3940 readonly_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
3942 struct elf_nds32_link_hash_entry
*eh
;
3943 struct elf_nds32_dyn_relocs
*p
;
3945 if (h
->root
.type
== bfd_link_hash_warning
)
3946 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
3948 eh
= (struct elf_nds32_link_hash_entry
*) h
;
3949 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
3951 asection
*s
= p
->sec
->output_section
;
3953 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
3955 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
3957 info
->flags
|= DF_TEXTREL
;
3959 /* Not an error, just cut short the traversal. */
3966 /* Set the sizes of the dynamic sections. */
3969 nds32_elf_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
3970 struct bfd_link_info
*info
)
3972 struct elf_nds32_link_hash_table
*htab
;
3978 htab
= nds32_elf_hash_table (info
);
3979 dynobj
= htab
->root
.dynobj
;
3980 BFD_ASSERT (dynobj
!= NULL
);
3982 if (htab
->root
.dynamic_sections_created
)
3984 /* Set the contents of the .interp section to the interpreter. */
3985 if (!bfd_link_pic (info
) && !info
->nointerp
)
3987 s
= bfd_get_section_by_name (dynobj
, ".interp");
3988 BFD_ASSERT (s
!= NULL
);
3989 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
3990 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
3994 /* Set up .got offsets for local syms, and space for local dynamic
3996 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
3998 bfd_signed_vma
*local_got
;
3999 bfd_signed_vma
*end_local_got
;
4000 bfd_size_type locsymcount
;
4001 Elf_Internal_Shdr
*symtab_hdr
;
4004 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
4007 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
4009 struct elf_nds32_dyn_relocs
*p
;
4011 for (p
= ((struct elf_nds32_dyn_relocs
*)
4012 elf_section_data (s
)->local_dynrel
);
4013 p
!= NULL
; p
= p
->next
)
4015 if (!bfd_is_abs_section (p
->sec
)
4016 && bfd_is_abs_section (p
->sec
->output_section
))
4018 /* Input section has been discarded, either because
4019 it is a copy of a linkonce section or due to
4020 linker script /DISCARD/, so we'll be discarding
4023 else if (p
->count
!= 0)
4025 srel
= elf_section_data (p
->sec
)->sreloc
;
4026 srel
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
4027 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
4028 info
->flags
|= DF_TEXTREL
;
4033 local_got
= elf_local_got_refcounts (ibfd
);
4037 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
4038 locsymcount
= symtab_hdr
->sh_info
;
4039 end_local_got
= local_got
+ locsymcount
;
4041 srel
= htab
->srelgot
;
4042 for (; local_got
< end_local_got
; ++local_got
)
4046 *local_got
= s
->size
;
4048 if (bfd_link_pic (info
))
4049 srel
->size
+= sizeof (Elf32_External_Rela
);
4052 *local_got
= (bfd_vma
) - 1;
4056 /* Allocate global sym .plt and .got entries, and space for global
4057 sym dynamic relocs. */
4058 elf_link_hash_traverse (&htab
->root
, allocate_dynrelocs
, (void *) info
);
4060 /* We now have determined the sizes of the various dynamic sections.
4061 Allocate memory for them. */
4063 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
4065 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
4068 if (s
== htab
->splt
)
4070 /* Strip this section if we don't need it; see the
4073 else if (s
== htab
->sgot
)
4075 got_size
+= s
->size
;
4077 else if (s
== htab
->sgotplt
)
4079 got_size
+= s
->size
;
4081 else if (strncmp (bfd_get_section_name (dynobj
, s
), ".rela", 5) == 0)
4083 if (s
->size
!= 0 && s
!= htab
->srelplt
)
4086 /* We use the reloc_count field as a counter if we need
4087 to copy relocs into the output file. */
4092 /* It's not one of our sections, so don't allocate space. */
4098 /* If we don't need this section, strip it from the
4099 output file. This is mostly to handle .rela.bss and
4100 .rela.plt. We must create both sections in
4101 create_dynamic_sections, because they must be created
4102 before the linker maps input sections to output
4103 sections. The linker does that before
4104 adjust_dynamic_symbol is called, and it is that
4105 function which decides whether anything needs to go
4106 into these sections. */
4107 s
->flags
|= SEC_EXCLUDE
;
4111 /* Allocate memory for the section contents. We use bfd_zalloc
4112 here in case unused entries are not reclaimed before the
4113 section's contents are written out. This should not happen,
4114 but this way if it does, we get a R_NDS32_NONE reloc instead
4116 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
4117 if (s
->contents
== NULL
)
4122 if (htab
->root
.dynamic_sections_created
)
4124 /* Add some entries to the .dynamic section. We fill in the
4125 values later, in nds32_elf_finish_dynamic_sections, but we
4126 must add the entries now so that we get the correct size for
4127 the .dynamic section. The DT_DEBUG entry is filled in by the
4128 dynamic linker and used by the debugger. */
4129 #define add_dynamic_entry(TAG, VAL) \
4130 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4132 if (!bfd_link_pic (info
))
4134 if (!add_dynamic_entry (DT_DEBUG
, 0))
4138 if (htab
->splt
->size
!= 0)
4140 if (!add_dynamic_entry (DT_PLTGOT
, 0)
4141 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
4142 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
4143 || !add_dynamic_entry (DT_JMPREL
, 0))
4149 if (!add_dynamic_entry (DT_RELA
, 0)
4150 || !add_dynamic_entry (DT_RELASZ
, 0)
4151 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf32_External_Rela
)))
4154 /* If any dynamic relocs apply to a read-only section,
4155 then we need a DT_TEXTREL entry. */
4156 if ((info
->flags
& DF_TEXTREL
) == 0)
4157 elf_link_hash_traverse (&htab
->root
, readonly_dynrelocs
,
4160 if ((info
->flags
& DF_TEXTREL
) != 0)
4162 if (!add_dynamic_entry (DT_TEXTREL
, 0))
4167 #undef add_dynamic_entry
4172 static bfd_reloc_status_type
4173 nds32_relocate_contents (reloc_howto_type
*howto
, bfd
*input_bfd
,
4174 bfd_vma relocation
, bfd_byte
*location
)
4178 bfd_reloc_status_type flag
;
4179 unsigned int rightshift
= howto
->rightshift
;
4180 unsigned int bitpos
= howto
->bitpos
;
4182 /* If the size is negative, negate RELOCATION. This isn't very
4184 if (howto
->size
< 0)
4185 relocation
= -relocation
;
4187 /* Get the value we are going to relocate. */
4188 size
= bfd_get_reloc_size (howto
);
4195 return bfd_reloc_ok
;
4197 x
= bfd_getb16 (location
);
4200 x
= bfd_getb32 (location
);
4204 /* Check for overflow. FIXME: We may drop bits during the addition
4205 which we don't check for. We must either check at every single
4206 operation, which would be tedious, or we must do the computations
4207 in a type larger than bfd_vma, which would be inefficient. */
4208 flag
= bfd_reloc_ok
;
4209 if (howto
->complain_on_overflow
!= complain_overflow_dont
)
4211 bfd_vma addrmask
, fieldmask
, signmask
, ss
;
4214 /* Get the values to be added together. For signed and unsigned
4215 relocations, we assume that all values should be truncated to
4216 the size of an address. For bitfields, all the bits matter.
4217 See also bfd_check_overflow. */
4218 fieldmask
= N_ONES (howto
->bitsize
);
4219 signmask
= ~fieldmask
;
4220 addrmask
= N_ONES (bfd_arch_bits_per_address (input_bfd
)) | fieldmask
;
4221 a
= (relocation
& addrmask
) >> rightshift
;
4222 b
= (x
& howto
->src_mask
& addrmask
) >> bitpos
;
4224 switch (howto
->complain_on_overflow
)
4226 case complain_overflow_signed
:
4227 /* If any sign bits are set, all sign bits must be set.
4228 That is, A must be a valid negative address after
4230 signmask
= ~(fieldmask
>> 1);
4233 case complain_overflow_bitfield
:
4234 /* Much like the signed check, but for a field one bit
4235 wider. We allow a bitfield to represent numbers in the
4236 range -2**n to 2**n-1, where n is the number of bits in the
4237 field. Note that when bfd_vma is 32 bits, a 32-bit reloc
4238 can't overflow, which is exactly what we want. */
4240 if (ss
!= 0 && ss
!= ((addrmask
>> rightshift
) & signmask
))
4241 flag
= bfd_reloc_overflow
;
4243 /* We only need this next bit of code if the sign bit of B
4244 is below the sign bit of A. This would only happen if
4245 SRC_MASK had fewer bits than BITSIZE. Note that if
4246 SRC_MASK has more bits than BITSIZE, we can get into
4247 trouble; we would need to verify that B is in range, as
4248 we do for A above. */
4249 ss
= ((~howto
->src_mask
) >> 1) & howto
->src_mask
;
4252 /* Set all the bits above the sign bit. */
4255 /* Now we can do the addition. */
4258 /* See if the result has the correct sign. Bits above the
4259 sign bit are junk now; ignore them. If the sum is
4260 positive, make sure we did not have all negative inputs;
4261 if the sum is negative, make sure we did not have all
4262 positive inputs. The test below looks only at the sign
4263 bits, and it really just
4264 SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
4266 We mask with addrmask here to explicitly allow an address
4267 wrap-around. The Linux kernel relies on it, and it is
4268 the only way to write assembler code which can run when
4269 loaded at a location 0x80000000 away from the location at
4270 which it is linked. */
4271 if (((~(a
^ b
)) & (a
^ sum
)) & signmask
& addrmask
)
4272 flag
= bfd_reloc_overflow
;
4276 case complain_overflow_unsigned
:
4277 /* Checking for an unsigned overflow is relatively easy:
4278 trim the addresses and add, and trim the result as well.
4279 Overflow is normally indicated when the result does not
4280 fit in the field. However, we also need to consider the
4281 case when, e.g., fieldmask is 0x7fffffff or smaller, an
4282 input is 0x80000000, and bfd_vma is only 32 bits; then we
4283 will get sum == 0, but there is an overflow, since the
4284 inputs did not fit in the field. Instead of doing a
4285 separate test, we can check for this by or-ing in the
4286 operands when testing for the sum overflowing its final
4288 sum
= (a
+ b
) & addrmask
;
4289 if ((a
| b
| sum
) & signmask
)
4290 flag
= bfd_reloc_overflow
;
4298 /* Put RELOCATION in the right bits. */
4299 relocation
>>= (bfd_vma
) rightshift
;
4300 relocation
<<= (bfd_vma
) bitpos
;
4302 /* Add RELOCATION to the right bits of X. */
4304 Because the relaxation may generate duplicate relocation at one address,
4305 an addition to immediate in the instruction may cause the relocation added
4307 This bug should be fixed in assembler, but a check is also needed here. */
4308 if (howto
->partial_inplace
)
4309 x
= ((x
& ~howto
->dst_mask
)
4310 | (((x
& howto
->src_mask
) + relocation
) & howto
->dst_mask
));
4312 x
= ((x
& ~howto
->dst_mask
) | ((relocation
) & howto
->dst_mask
));
4315 /* Put the relocated value back in the object file. */
4325 bfd_putb16 (x
, location
);
4328 bfd_putb32 (x
, location
);
4335 static bfd_reloc_status_type
4336 nds32_elf_final_link_relocate (reloc_howto_type
*howto
, bfd
*input_bfd
,
4337 asection
*input_section
, bfd_byte
*contents
,
4338 bfd_vma address
, bfd_vma value
, bfd_vma addend
)
4342 /* Sanity check the address. */
4343 if (address
> bfd_get_section_limit (input_bfd
, input_section
))
4344 return bfd_reloc_outofrange
;
4346 /* This function assumes that we are dealing with a basic relocation
4347 against a symbol. We want to compute the value of the symbol to
4348 relocate to. This is just VALUE, the value of the symbol, plus
4349 ADDEND, any addend associated with the reloc. */
4350 relocation
= value
+ addend
;
4352 /* If the relocation is PC relative, we want to set RELOCATION to
4353 the distance between the symbol (currently in RELOCATION) and the
4354 location we are relocating. Some targets (e.g., i386-aout)
4355 arrange for the contents of the section to be the negative of the
4356 offset of the location within the section; for such targets
4357 pcrel_offset is FALSE. Other targets (e.g., m88kbcs or ELF)
4358 simply leave the contents of the section as zero; for such
4359 targets pcrel_offset is TRUE. If pcrel_offset is FALSE we do not
4360 need to subtract out the offset of the location within the
4361 section (which is just ADDRESS). */
4362 if (howto
->pc_relative
)
4364 relocation
-= (input_section
->output_section
->vma
4365 + input_section
->output_offset
);
4366 if (howto
->pcrel_offset
)
4367 relocation
-= address
;
4370 return nds32_relocate_contents (howto
, input_bfd
, relocation
,
4371 contents
+ address
);
4375 nds32_elf_output_symbol_hook (struct bfd_link_info
*info
,
4377 Elf_Internal_Sym
*elfsym ATTRIBUTE_UNUSED
,
4378 asection
*input_sec
,
4379 struct elf_link_hash_entry
*h ATTRIBUTE_UNUSED
)
4382 FILE *sym_ld_script
= NULL
;
4383 struct elf_nds32_link_hash_table
*table
;
4385 table
= nds32_elf_hash_table (info
);
4386 sym_ld_script
= table
->sym_ld_script
;
4390 if (!h
|| !name
|| *name
== '\0')
4393 if (input_sec
->flags
& SEC_EXCLUDE
)
4396 if (!check_start_export_sym
)
4398 fprintf (sym_ld_script
, "SECTIONS\n{\n");
4399 check_start_export_sym
= 1;
4402 if (h
->root
.type
== bfd_link_hash_defined
4403 || h
->root
.type
== bfd_link_hash_defweak
)
4405 if (!h
->root
.u
.def
.section
->output_section
)
4408 if (bfd_is_const_section (input_sec
))
4409 source
= input_sec
->name
;
4411 source
= input_sec
->owner
->filename
;
4413 fprintf (sym_ld_script
, "\t%s = 0x%08lx;\t /* %s */\n",
4414 h
->root
.root
.string
,
4415 (long) (h
->root
.u
.def
.value
4416 + h
->root
.u
.def
.section
->output_section
->vma
4417 + h
->root
.u
.def
.section
->output_offset
), source
);
4423 /* Relocate an NDS32/D ELF section.
4424 There is some attempt to make this function usable for many architectures,
4425 both for RELA and REL type relocs, if only to serve as a learning tool.
4427 The RELOCATE_SECTION function is called by the new ELF backend linker
4428 to handle the relocations for a section.
4430 The relocs are always passed as Rela structures; if the section
4431 actually uses Rel structures, the r_addend field will always be
4434 This function is responsible for adjust the section contents as
4435 necessary, and (if using Rela relocs and generating a
4436 relocatable output file) adjusting the reloc addend as
4439 This function does not have to worry about setting the reloc
4440 address or the reloc symbol index.
4442 LOCAL_SYMS is a pointer to the swapped in local symbols.
4444 LOCAL_SECTIONS is an array giving the section in the input file
4445 corresponding to the st_shndx field of each local symbol.
4447 The global hash table entry for the global symbols can be found
4448 via elf_sym_hashes (input_bfd).
4450 When generating relocatable output, this function must handle
4451 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
4452 going to be the section symbol corresponding to the output
4453 section, which means that the addend must be adjusted
4457 dtpoff_base (struct bfd_link_info
*info
)
4459 /* If tls_sec is NULL, we should have signalled an error already. */
4460 if (elf_hash_table (info
)->tls_sec
== NULL
)
4462 return elf_hash_table (info
)->tls_sec
->vma
;
4466 nds32_elf_relocate_section (bfd
* output_bfd ATTRIBUTE_UNUSED
,
4467 struct bfd_link_info
* info
,
4469 asection
* input_section
,
4470 bfd_byte
* contents
,
4471 Elf_Internal_Rela
* relocs
,
4472 Elf_Internal_Sym
* local_syms
,
4473 asection
** local_sections
)
4475 Elf_Internal_Shdr
*symtab_hdr
;
4476 struct elf_link_hash_entry
**sym_hashes
;
4477 Elf_Internal_Rela
*rel
, *relend
;
4478 bfd_boolean ret
= TRUE
; /* Assume success. */
4480 bfd_reloc_status_type r
;
4481 const char *errmsg
= NULL
;
4483 struct elf_nds32_link_hash_table
*htab
;
4485 bfd_vma
*local_got_offsets
;
4486 asection
*sgot
, *splt
, *sreloc
;
4487 bfd_vma high_address
;
4488 struct elf_nds32_link_hash_table
*table
;
4489 int eliminate_gc_relocs
;
4490 bfd_vma fpbase_addr
;
4492 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4493 sym_hashes
= elf_sym_hashes (input_bfd
);
4494 htab
= nds32_elf_hash_table (info
);
4495 high_address
= bfd_get_section_limit (input_bfd
, input_section
);
4497 dynobj
= htab
->root
.dynobj
;
4498 local_got_offsets
= elf_local_got_offsets (input_bfd
);
4505 relend
= relocs
+ input_section
->reloc_count
;
4507 table
= nds32_elf_hash_table (info
);
4508 eliminate_gc_relocs
= table
->eliminate_gc_relocs
;
4509 /* By this time, we can adjust the value of _SDA_BASE_. */
4510 if ((!bfd_link_relocatable (info
)))
4512 is_SDA_BASE_set
= 1;
4513 r
= nds32_elf_final_sda_base (output_bfd
, info
, &gp
, TRUE
);
4514 if (r
!= bfd_reloc_ok
)
4518 if (is_ITB_BASE_set
== 0)
4520 /* Set the _ITB_BASE_. */
4521 if (!nds32_elf_ex9_itb_base (info
))
4523 _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"),
4525 bfd_set_error (bfd_error_bad_value
);
4529 if (table
->target_optimize
& NDS32_RELAX_JUMP_IFC_ON
)
4530 if (!nds32_elf_ifc_reloc ())
4531 _bfd_error_handler (_("error: IFC relocation error."));
4533 /* Relocation for .ex9.itable. */
4534 if (table
->target_optimize
& NDS32_RELAX_EX9_ON
4535 || (table
->ex9_import_file
&& table
->update_ex9_table
))
4536 nds32_elf_ex9_reloc_jmp (info
);
4538 /* Use gp as fp to prevent truncated fit. Because in relaxation time
4539 the fp value is set as gp, and it has be reverted for instruction
4541 fpbase_addr
= elf_gp (output_bfd
);
4543 for (rel
= relocs
; rel
< relend
; rel
++)
4545 enum elf_nds32_reloc_type r_type
;
4546 reloc_howto_type
*howto
= NULL
;
4547 unsigned long r_symndx
;
4548 struct elf_link_hash_entry
*h
= NULL
;
4549 Elf_Internal_Sym
*sym
= NULL
;
4553 /* We can't modify r_addend here as elf_link_input_bfd has an assert to
4554 ensure it's zero (we use REL relocs, not RELA). Therefore this
4555 should be assigning zero to `addend', but for clarity we use
4558 bfd_vma addend
= rel
->r_addend
;
4559 bfd_vma offset
= rel
->r_offset
;
4561 r_type
= ELF32_R_TYPE (rel
->r_info
);
4562 if (r_type
>= R_NDS32_max
)
4564 _bfd_error_handler (_("%B: error: unknown relocation type %d."),
4566 bfd_set_error (bfd_error_bad_value
);
4571 if (r_type
== R_NDS32_GNU_VTENTRY
4572 || r_type
== R_NDS32_GNU_VTINHERIT
4573 || r_type
== R_NDS32_NONE
4574 || r_type
== R_NDS32_RELA_GNU_VTENTRY
4575 || r_type
== R_NDS32_RELA_GNU_VTINHERIT
4576 || (r_type
>= R_NDS32_INSN16
&& r_type
<= R_NDS32_25_FIXED_RELA
)
4577 || r_type
== R_NDS32_DATA
4578 || r_type
== R_NDS32_TRAN
4579 || (r_type
>= R_NDS32_LONGCALL4
&& r_type
<= R_NDS32_LONGJUMP7
))
4582 /* If we enter the fp-as-gp region. Resolve the address
4584 if (ELF32_R_TYPE (rel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
4585 && (rel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
4589 /* Distance to relocation of best fp-base is encoded in R_SYM. */
4590 dist
= rel
->r_addend
>> 16;
4591 fpbase_addr
= calculate_memory_address (input_bfd
, rel
+ dist
,
4592 local_syms
, symtab_hdr
);
4594 else if (ELF32_R_TYPE (rel
->r_info
) == R_NDS32_RELAX_REGION_END
4595 && (rel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
4597 fpbase_addr
= elf_gp (output_bfd
);
4600 if (((r_type
>= R_NDS32_DWARF2_OP1_RELA
4601 && r_type
<= R_NDS32_DWARF2_LEB_RELA
)
4602 || r_type
>= R_NDS32_RELAX_ENTRY
) && !bfd_link_relocatable (info
))
4605 howto
= bfd_elf32_bfd_reloc_type_table_lookup (r_type
);
4606 r_symndx
= ELF32_R_SYM (rel
->r_info
);
4608 /* This is a final link. */
4613 if (r_symndx
< symtab_hdr
->sh_info
)
4616 sym
= local_syms
+ r_symndx
;
4617 sec
= local_sections
[r_symndx
];
4619 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
4620 addend
= rel
->r_addend
;
4624 /* External symbol. */
4625 bfd_boolean warned
, ignored
, unresolved_reloc
;
4626 int symndx
= r_symndx
- symtab_hdr
->sh_info
;
4628 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
4629 r_symndx
, symtab_hdr
, sym_hashes
, h
, sec
,
4630 relocation
, unresolved_reloc
, warned
,
4633 /* la $fp, _FP_BASE_ is per-function (region).
4634 Handle it specially. */
4635 switch ((int) r_type
)
4637 case R_NDS32_SDA19S0_RELA
:
4638 case R_NDS32_SDA15S0_RELA
:
4639 case R_NDS32_20_RELA
:
4640 if (strcmp (elf_sym_hashes (input_bfd
)[symndx
]->root
.root
.string
,
4643 relocation
= fpbase_addr
;
4650 if (bfd_link_relocatable (info
))
4652 /* This is a relocatable link. We don't have to change
4653 anything, unless the reloc is against a section symbol,
4654 in which case we have to adjust according to where the
4655 section symbol winds up in the output section. */
4656 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4657 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
4662 /* Sanity check the address. */
4663 if (offset
> high_address
)
4665 r
= bfd_reloc_outofrange
;
4669 if ((r_type
>= R_NDS32_DWARF2_OP1_RELA
4670 && r_type
<= R_NDS32_DWARF2_LEB_RELA
)
4671 || r_type
>= R_NDS32_RELAX_ENTRY
)
4674 switch ((int) r_type
)
4676 case R_NDS32_GOTOFF
:
4677 /* Relocation is relative to the start of the global offset
4678 table (for ld24 rx, #uimm24), e.g. access at label+addend
4680 ld24 rx. #label@GOTOFF + addend
4682 case R_NDS32_GOTOFF_HI20
:
4683 case R_NDS32_GOTOFF_LO12
:
4684 case R_NDS32_GOTOFF_LO15
:
4685 case R_NDS32_GOTOFF_LO19
:
4686 BFD_ASSERT (sgot
!= NULL
);
4688 relocation
-= elf_gp (output_bfd
);
4691 case R_NDS32_9_PLTREL
:
4692 case R_NDS32_25_PLTREL
:
4693 /* Relocation is to the entry for this symbol in the
4694 procedure linkage table. */
4696 /* The native assembler will generate a 25_PLTREL reloc
4697 for a local symbol if you assemble a call from one
4698 section to another when using -K pic. */
4702 if (h
->forced_local
)
4705 /* We didn't make a PLT entry for this symbol. This
4706 happens when statically linking PIC code, or when
4707 using -Bsymbolic. */
4708 if (h
->plt
.offset
== (bfd_vma
) - 1)
4711 relocation
= (splt
->output_section
->vma
4712 + splt
->output_offset
+ h
->plt
.offset
);
4715 case R_NDS32_PLT_GOTREL_HI20
:
4716 case R_NDS32_PLT_GOTREL_LO12
:
4717 case R_NDS32_PLT_GOTREL_LO15
:
4718 case R_NDS32_PLT_GOTREL_LO19
:
4719 case R_NDS32_PLT_GOTREL_LO20
:
4720 if (h
== NULL
|| h
->forced_local
|| h
->plt
.offset
== (bfd_vma
) - 1)
4722 /* We didn't make a PLT entry for this symbol. This
4723 happens when statically linking PIC code, or when
4724 using -Bsymbolic. */
4725 relocation
-= elf_gp (output_bfd
);
4729 relocation
= (splt
->output_section
->vma
4730 + splt
->output_offset
+ h
->plt
.offset
);
4732 relocation
-= elf_gp (output_bfd
);
4735 case R_NDS32_PLTREL_HI20
:
4736 case R_NDS32_PLTREL_LO12
:
4738 /* Relocation is to the entry for this symbol in the
4739 procedure linkage table. */
4741 /* The native assembler will generate a 25_PLTREL reloc
4742 for a local symbol if you assemble a call from one
4743 section to another when using -K pic. */
4747 if (h
->forced_local
)
4750 if (h
->plt
.offset
== (bfd_vma
) - 1)
4751 /* We didn't make a PLT entry for this symbol. This
4752 happens when statically linking PIC code, or when
4753 using -Bsymbolic. */
4759 relocation
= (splt
->output_section
->vma
4760 + splt
->output_offset
4761 + h
->plt
.offset
+ 4)
4762 - (input_section
->output_section
->vma
4763 + input_section
->output_offset
4768 case R_NDS32_GOTPC20
:
4769 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4770 ld24 rx,#_GLOBAL_OFFSET_TABLE_ */
4771 relocation
= elf_gp (output_bfd
);
4774 case R_NDS32_GOTPC_HI20
:
4775 case R_NDS32_GOTPC_LO12
:
4777 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4779 seth rx,#high(_GLOBAL_OFFSET_TABLE_)
4780 or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4783 seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
4784 add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4786 relocation
= elf_gp (output_bfd
);
4787 relocation
-= (input_section
->output_section
->vma
4788 + input_section
->output_offset
+ rel
->r_offset
);
4794 case R_NDS32_GOT_HI20
:
4795 case R_NDS32_GOT_LO12
:
4796 case R_NDS32_GOT_LO15
:
4797 case R_NDS32_GOT_LO19
:
4798 /* Relocation is to the entry for this symbol in the global
4800 BFD_ASSERT (sgot
!= NULL
);
4807 off
= h
->got
.offset
;
4808 BFD_ASSERT (off
!= (bfd_vma
) - 1);
4809 dyn
= htab
->root
.dynamic_sections_created
;
4810 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
,
4811 bfd_link_pic (info
),
4813 || (bfd_link_pic (info
)
4816 || h
->forced_local
) && h
->def_regular
))
4818 /* This is actually a static link, or it is a
4819 -Bsymbolic link and the symbol is defined
4820 locally, or the symbol was forced to be local
4821 because of a version file. We must initialize
4822 this entry in the global offset table. Since the
4823 offset must always be a multiple of 4, we use the
4824 least significant bit to record whether we have
4825 initialized it already.
4827 When doing a dynamic link, we create a .rela.got
4828 relocation entry to initialize the value. This
4829 is done in the finish_dynamic_symbol routine. */
4834 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
4838 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
4839 - elf_gp (output_bfd
);
4846 BFD_ASSERT (local_got_offsets
!= NULL
4847 && local_got_offsets
[r_symndx
] != (bfd_vma
) - 1);
4849 off
= local_got_offsets
[r_symndx
];
4851 /* The offset must always be a multiple of 4. We use
4852 the least significant bit to record whether we have
4853 already processed this entry. */
4858 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
4860 if (bfd_link_pic (info
))
4863 Elf_Internal_Rela outrel
;
4865 /* We need to generate a R_NDS32_RELATIVE reloc
4866 for the dynamic linker. */
4867 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
4868 BFD_ASSERT (srelgot
!= NULL
);
4870 outrel
.r_offset
= (elf_gp (output_bfd
)
4871 + sgot
->output_offset
+ off
);
4872 outrel
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
4873 outrel
.r_addend
= relocation
;
4874 loc
= srelgot
->contents
;
4876 srelgot
->reloc_count
* sizeof (Elf32_External_Rela
);
4877 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4878 ++srelgot
->reloc_count
;
4880 local_got_offsets
[r_symndx
] |= 1;
4882 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
4883 - elf_gp (output_bfd
);
4888 case R_NDS32_16_RELA
:
4889 case R_NDS32_20_RELA
:
4890 case R_NDS32_5_RELA
:
4891 case R_NDS32_32_RELA
:
4892 case R_NDS32_9_PCREL_RELA
:
4893 case R_NDS32_WORD_9_PCREL_RELA
:
4894 case R_NDS32_10_UPCREL_RELA
:
4895 case R_NDS32_15_PCREL_RELA
:
4896 case R_NDS32_17_PCREL_RELA
:
4897 case R_NDS32_25_PCREL_RELA
:
4898 case R_NDS32_HI20_RELA
:
4899 case R_NDS32_LO12S3_RELA
:
4900 case R_NDS32_LO12S2_RELA
:
4901 case R_NDS32_LO12S2_DP_RELA
:
4902 case R_NDS32_LO12S2_SP_RELA
:
4903 case R_NDS32_LO12S1_RELA
:
4904 case R_NDS32_LO12S0_RELA
:
4905 case R_NDS32_LO12S0_ORI_RELA
:
4906 if (bfd_link_pic (info
) && r_symndx
!= 0
4907 && (input_section
->flags
& SEC_ALLOC
) != 0
4908 && (eliminate_gc_relocs
== 0
4909 || (sec
&& (sec
->flags
& SEC_EXCLUDE
) == 0))
4910 && ((r_type
!= R_NDS32_9_PCREL_RELA
4911 && r_type
!= R_NDS32_WORD_9_PCREL_RELA
4912 && r_type
!= R_NDS32_10_UPCREL_RELA
4913 && r_type
!= R_NDS32_15_PCREL_RELA
4914 && r_type
!= R_NDS32_17_PCREL_RELA
4915 && r_type
!= R_NDS32_25_PCREL_RELA
4916 && !(r_type
== R_NDS32_32_RELA
4917 && strcmp (input_section
->name
, ".eh_frame") == 0))
4918 || (h
!= NULL
&& h
->dynindx
!= -1
4919 && (!info
->symbolic
|| !h
->def_regular
))))
4921 Elf_Internal_Rela outrel
;
4922 bfd_boolean skip
, relocate
;
4925 /* When generating a shared object, these relocations
4926 are copied into the output file to be resolved at run
4933 name
= bfd_elf_string_from_elf_section
4934 (input_bfd
, elf_elfheader (input_bfd
)->e_shstrndx
,
4935 elf_section_data (input_section
)->rela
.hdr
->sh_name
);
4939 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
4940 && strcmp (bfd_get_section_name (input_bfd
,
4944 sreloc
= bfd_get_section_by_name (dynobj
, name
);
4945 BFD_ASSERT (sreloc
!= NULL
);
4951 outrel
.r_offset
= _bfd_elf_section_offset (output_bfd
,
4955 if (outrel
.r_offset
== (bfd_vma
) - 1)
4957 else if (outrel
.r_offset
== (bfd_vma
) - 2)
4958 skip
= TRUE
, relocate
= TRUE
;
4959 outrel
.r_offset
+= (input_section
->output_section
->vma
4960 + input_section
->output_offset
);
4963 memset (&outrel
, 0, sizeof outrel
);
4964 else if (r_type
== R_NDS32_17_PCREL_RELA
4965 || r_type
== R_NDS32_15_PCREL_RELA
4966 || r_type
== R_NDS32_25_PCREL_RELA
)
4968 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
4969 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
4970 outrel
.r_addend
= rel
->r_addend
;
4974 /* h->dynindx may be -1 if this symbol was marked to
4977 || ((info
->symbolic
|| h
->dynindx
== -1)
4981 outrel
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
4982 outrel
.r_addend
= relocation
+ rel
->r_addend
;
4986 BFD_ASSERT (h
->dynindx
!= -1);
4987 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
4988 outrel
.r_addend
= rel
->r_addend
;
4992 loc
= sreloc
->contents
;
4993 loc
+= sreloc
->reloc_count
* sizeof (Elf32_External_Rela
);
4994 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4995 ++sreloc
->reloc_count
;
4997 /* If this reloc is against an external symbol, we do
4998 not want to fiddle with the addend. Otherwise, we
4999 need to include the symbol value so that it becomes
5000 an addend for the dynamic reloc. */
5006 case R_NDS32_25_ABS_RELA
:
5007 if (bfd_link_pic (info
))
5010 (_("%s: warning: cannot deal R_NDS32_25_ABS_RELA in shared "
5011 "mode."), bfd_get_filename (input_bfd
));
5016 case R_NDS32_9_PCREL
:
5017 r
= nds32_elf_do_9_pcrel_reloc (input_bfd
, howto
, input_section
,
5019 sec
, relocation
, addend
);
5024 Elf_Internal_Rela
*lorel
;
5026 /* We allow an arbitrary number of HI20 relocs before the
5027 LO12 reloc. This permits gcc to emit the HI and LO relocs
5029 for (lorel
= rel
+ 1;
5031 && ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_HI20
); lorel
++)
5034 && (ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S3
5035 || ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S2
5036 || ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S1
5037 || ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S0
))
5039 nds32_elf_relocate_hi20 (input_bfd
, r_type
, rel
, lorel
,
5040 contents
, relocation
+ addend
);
5044 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
5045 contents
, offset
, relocation
,
5051 case R_NDS32_GOT17S2_RELA
:
5052 case R_NDS32_GOT15S2_RELA
:
5056 BFD_ASSERT (sgot
!= NULL
);
5062 off
= h
->got
.offset
;
5063 BFD_ASSERT (off
!= (bfd_vma
) - 1);
5065 dyn
= htab
->root
.dynamic_sections_created
;
5066 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
5067 (dyn
, bfd_link_pic (info
), h
)
5068 || (bfd_link_pic (info
)
5074 /* This is actually a static link, or it is a
5075 -Bsymbolic link and the symbol is defined
5076 locally, or the symbol was forced to be local
5077 because of a version file. We must initialize
5078 this entry in the global offset table. Since the
5079 offset must always be a multiple of 4, we use the
5080 least significant bit to record whether we have
5081 initialized it already.
5083 When doing a dynamic link, we create a .rela.got
5084 relocation entry to initialize the value. This
5085 is done in the finish_dynamic_symbol routine. */
5090 bfd_put_32 (output_bfd
, relocation
,
5091 sgot
->contents
+ off
);
5100 BFD_ASSERT (local_got_offsets
!= NULL
5101 && local_got_offsets
[r_symndx
] != (bfd_vma
) - 1);
5103 off
= local_got_offsets
[r_symndx
];
5105 /* The offset must always be a multiple of 4. We use
5106 the least significant bit to record whether we have
5107 already processed this entry. */
5112 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
5114 if (bfd_link_pic (info
))
5117 Elf_Internal_Rela outrel
;
5119 /* We need to generate a R_NDS32_RELATIVE reloc
5120 for the dynamic linker. */
5121 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
5122 BFD_ASSERT (srelgot
!= NULL
);
5124 outrel
.r_offset
= (elf_gp (output_bfd
)
5125 + sgot
->output_offset
+ off
);
5126 outrel
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
5127 outrel
.r_addend
= relocation
;
5128 loc
= srelgot
->contents
;
5130 srelgot
->reloc_count
* sizeof (Elf32_External_Rela
);
5131 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5132 ++srelgot
->reloc_count
;
5134 local_got_offsets
[r_symndx
] |= 1;
5137 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
5138 - elf_gp (output_bfd
);
5140 if (relocation
& align
)
5142 /* Incorrect alignment. */
5144 (_("%B: warning: unaligned access to GOT entry."), input_bfd
);
5146 r
= bfd_reloc_dangerous
;
5151 case R_NDS32_SDA16S3_RELA
:
5152 case R_NDS32_SDA15S3_RELA
:
5153 case R_NDS32_SDA15S3
:
5157 case R_NDS32_SDA17S2_RELA
:
5158 case R_NDS32_SDA15S2_RELA
:
5159 case R_NDS32_SDA12S2_SP_RELA
:
5160 case R_NDS32_SDA12S2_DP_RELA
:
5161 case R_NDS32_SDA15S2
:
5162 case R_NDS32_SDA_FP7U2_RELA
:
5166 case R_NDS32_SDA18S1_RELA
:
5167 case R_NDS32_SDA15S1_RELA
:
5168 case R_NDS32_SDA15S1
:
5172 case R_NDS32_SDA19S0_RELA
:
5173 case R_NDS32_SDA15S0_RELA
:
5174 case R_NDS32_SDA15S0
:
5178 BFD_ASSERT (sec
!= NULL
);
5180 /* If the symbol is in the abs section, the out_bfd will be null.
5181 This happens when the relocation has a symbol@GOTOFF. */
5182 r
= nds32_elf_final_sda_base (output_bfd
, info
, &gp
, FALSE
);
5183 if (r
!= bfd_reloc_ok
)
5186 (_("%B: warning: relocate SDA_BASE failed."), input_bfd
);
5191 /* At this point `relocation' contains the object's
5193 if (r_type
== R_NDS32_SDA_FP7U2_RELA
)
5195 relocation
-= fpbase_addr
;
5199 /* Now it contains the offset from _SDA_BASE_. */
5201 /* Make sure alignment is correct. */
5203 if (relocation
& align
)
5205 /* Incorrect alignment. */
5207 (_("%B(%A): warning: unaligned small data access of type %d."),
5208 input_bfd
, input_section
, r_type
);
5215 case R_NDS32_17IFC_PCREL_RELA
:
5216 case R_NDS32_10IFCU_PCREL_RELA
:
5220 case R_NDS32_TLS_LE_HI20
:
5221 case R_NDS32_TLS_LE_LO12
:
5222 case R_NDS32_TLS_LE_20
:
5223 case R_NDS32_TLS_LE_15S0
:
5224 case R_NDS32_TLS_LE_15S1
:
5225 case R_NDS32_TLS_LE_15S2
:
5226 if (elf_hash_table (info
)->tls_sec
!= NULL
)
5227 relocation
-= (elf_hash_table (info
)->tls_sec
->vma
+ TP_OFFSET
);
5229 case R_NDS32_TLS_IE_HI20
:
5230 case R_NDS32_TLS_IE_LO12S2
:
5232 /* Relocation is to the entry for this symbol in the global
5234 unsigned int tls_type
;
5236 Elf_Internal_Rela outrel
;
5241 BFD_ASSERT (sgot
!= NULL
);
5246 off
= h
->got
.offset
;
5247 BFD_ASSERT (off
!= (bfd_vma
) - 1);
5248 dyn
= htab
->root
.dynamic_sections_created
;
5249 tls_type
= ((struct elf_nds32_link_hash_entry
*) h
)->tls_type
;
5250 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, bfd_link_pic (info
), h
)
5251 && (!bfd_link_pic (info
)
5252 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
5257 /* Never happen currently. */
5258 BFD_ASSERT (local_got_offsets
!= NULL
5259 && local_got_offsets
[r_symndx
] != (bfd_vma
) - 1);
5261 off
= local_got_offsets
[r_symndx
];
5263 tls_type
= elf32_nds32_local_got_tls_type (input_bfd
)[r_symndx
];
5265 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
;
5267 if (r_type
== R_NDS32_TLS_IE_LO12S2
)
5270 /* The offset must always be a multiple of 4. We use
5271 the least significant bit to record whether we have
5272 already processed this entry. */
5277 bfd_boolean need_relocs
= FALSE
;
5278 srelgot
= htab
->srelgot
;
5279 if ((bfd_link_pic (info
) || indx
!= 0)
5281 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
5282 || h
->root
.type
!= bfd_link_hash_undefweak
))
5285 BFD_ASSERT (srelgot
!= NULL
);
5287 if (tls_type
& GOT_TLS_IE
)
5291 if (h
->dynindx
== 0)
5292 outrel
.r_addend
= relocation
- dtpoff_base (info
);
5294 outrel
.r_addend
= 0;
5295 outrel
.r_offset
= (sgot
->output_section
->vma
5296 + sgot
->output_offset
5299 ELF32_R_INFO (h
->dynindx
, R_NDS32_TLS_TPOFF
);
5301 loc
= srelgot
->contents
;
5303 srelgot
->reloc_count
* sizeof (Elf32_External_Rela
);
5304 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5305 ++srelgot
->reloc_count
;
5308 bfd_put_32 (output_bfd
, h
->root
.u
.def
.value
- TP_OFFSET
,
5309 sgot
->contents
+ off
);
5315 /* DON'T fall through. */
5318 /* OLD_NDS32_RELOC. */
5320 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
5321 contents
, offset
, relocation
, addend
);
5325 switch ((int) r_type
)
5327 case R_NDS32_20_RELA
:
5328 case R_NDS32_5_RELA
:
5329 case R_NDS32_9_PCREL_RELA
:
5330 case R_NDS32_WORD_9_PCREL_RELA
:
5331 case R_NDS32_10_UPCREL_RELA
:
5332 case R_NDS32_15_PCREL_RELA
:
5333 case R_NDS32_17_PCREL_RELA
:
5334 case R_NDS32_25_PCREL_RELA
:
5335 case R_NDS32_25_ABS_RELA
:
5336 case R_NDS32_HI20_RELA
:
5337 case R_NDS32_LO12S3_RELA
:
5338 case R_NDS32_LO12S2_RELA
:
5339 case R_NDS32_LO12S2_DP_RELA
:
5340 case R_NDS32_LO12S2_SP_RELA
:
5341 case R_NDS32_LO12S1_RELA
:
5342 case R_NDS32_LO12S0_RELA
:
5343 case R_NDS32_LO12S0_ORI_RELA
:
5344 case R_NDS32_SDA16S3_RELA
:
5345 case R_NDS32_SDA17S2_RELA
:
5346 case R_NDS32_SDA18S1_RELA
:
5347 case R_NDS32_SDA19S0_RELA
:
5348 case R_NDS32_SDA15S3_RELA
:
5349 case R_NDS32_SDA15S2_RELA
:
5350 case R_NDS32_SDA12S2_DP_RELA
:
5351 case R_NDS32_SDA12S2_SP_RELA
:
5352 case R_NDS32_SDA15S1_RELA
:
5353 case R_NDS32_SDA15S0_RELA
:
5354 case R_NDS32_SDA_FP7U2_RELA
:
5355 case R_NDS32_9_PLTREL
:
5356 case R_NDS32_25_PLTREL
:
5358 case R_NDS32_GOT_HI20
:
5359 case R_NDS32_GOT_LO12
:
5360 case R_NDS32_GOT_LO15
:
5361 case R_NDS32_GOT_LO19
:
5362 case R_NDS32_GOT15S2_RELA
:
5363 case R_NDS32_GOT17S2_RELA
:
5364 case R_NDS32_GOTPC20
:
5365 case R_NDS32_GOTPC_HI20
:
5366 case R_NDS32_GOTPC_LO12
:
5367 case R_NDS32_GOTOFF
:
5368 case R_NDS32_GOTOFF_HI20
:
5369 case R_NDS32_GOTOFF_LO12
:
5370 case R_NDS32_GOTOFF_LO15
:
5371 case R_NDS32_GOTOFF_LO19
:
5372 case R_NDS32_PLTREL_HI20
:
5373 case R_NDS32_PLTREL_LO12
:
5374 case R_NDS32_PLT_GOTREL_HI20
:
5375 case R_NDS32_PLT_GOTREL_LO12
:
5376 case R_NDS32_PLT_GOTREL_LO15
:
5377 case R_NDS32_PLT_GOTREL_LO19
:
5378 case R_NDS32_PLT_GOTREL_LO20
:
5379 case R_NDS32_17IFC_PCREL_RELA
:
5380 case R_NDS32_10IFCU_PCREL_RELA
:
5381 case R_NDS32_TLS_LE_HI20
:
5382 case R_NDS32_TLS_LE_LO12
:
5383 case R_NDS32_TLS_IE_HI20
:
5384 case R_NDS32_TLS_IE_LO12S2
:
5385 case R_NDS32_TLS_LE_20
:
5386 case R_NDS32_TLS_LE_15S0
:
5387 case R_NDS32_TLS_LE_15S1
:
5388 case R_NDS32_TLS_LE_15S2
:
5389 /* Instruction related relocs must handle endian properly. */
5390 /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER. */
5391 r
= nds32_elf_final_link_relocate (howto
, input_bfd
,
5392 input_section
, contents
,
5393 rel
->r_offset
, relocation
,
5398 /* All other relocs can use default handler. */
5399 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
5400 contents
, rel
->r_offset
,
5401 relocation
, rel
->r_addend
);
5407 if (r
!= bfd_reloc_ok
)
5409 /* FIXME: This should be generic enough to go in a utility. */
5413 name
= h
->root
.root
.string
;
5416 name
= bfd_elf_string_from_elf_section
5417 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
5418 if (name
== NULL
|| *name
== '\0')
5419 name
= bfd_section_name (input_bfd
, sec
);
5427 case bfd_reloc_overflow
:
5428 (*info
->callbacks
->reloc_overflow
)
5429 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
5430 (bfd_vma
) 0, input_bfd
, input_section
, offset
);
5433 case bfd_reloc_undefined
:
5434 (*info
->callbacks
->undefined_symbol
)
5435 (info
, name
, input_bfd
, input_section
, offset
, TRUE
);
5438 case bfd_reloc_outofrange
:
5439 errmsg
= _("internal error: out of range error");
5442 case bfd_reloc_notsupported
:
5443 errmsg
= _("internal error: unsupported relocation error");
5446 case bfd_reloc_dangerous
:
5447 errmsg
= _("internal error: dangerous error");
5451 errmsg
= _("internal error: unknown error");
5455 (*info
->callbacks
->warning
) (info
, errmsg
, name
, input_bfd
,
5456 input_section
, offset
);
5465 /* Finish up dynamic symbol handling. We set the contents of various
5466 dynamic sections here. */
5469 nds32_elf_finish_dynamic_symbol (bfd
*output_bfd
, struct bfd_link_info
*info
,
5470 struct elf_link_hash_entry
*h
, Elf_Internal_Sym
*sym
)
5472 struct elf_nds32_link_hash_table
*htab
;
5475 htab
= nds32_elf_hash_table (info
);
5477 if (h
->plt
.offset
!= (bfd_vma
) - 1)
5485 bfd_vma local_plt_offset
;
5486 Elf_Internal_Rela rela
;
5488 /* This symbol has an entry in the procedure linkage table. Set
5491 BFD_ASSERT (h
->dynindx
!= -1);
5494 sgot
= htab
->sgotplt
;
5495 srela
= htab
->srelplt
;
5496 BFD_ASSERT (splt
!= NULL
&& sgot
!= NULL
&& srela
!= NULL
);
5498 /* Get the index in the procedure linkage table which
5499 corresponds to this symbol. This is the index of this symbol
5500 in all the symbols for which we are making plt entries. The
5501 first entry in the procedure linkage table is reserved. */
5502 plt_index
= h
->plt
.offset
/ PLT_ENTRY_SIZE
- 1;
5504 /* Get the offset into the .got table of the entry that
5505 corresponds to this function. Each .got entry is 4 bytes.
5506 The first three are reserved. */
5507 got_offset
= (plt_index
+ 3) * 4;
5509 /* Fill in the entry in the procedure linkage table. */
5510 if (!bfd_link_pic (info
))
5514 insn
= PLT_ENTRY_WORD0
+ (((sgot
->output_section
->vma
5515 + sgot
->output_offset
+ got_offset
) >> 12)
5517 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
);
5519 insn
= PLT_ENTRY_WORD1
+ (((sgot
->output_section
->vma
5520 + sgot
->output_offset
+ got_offset
) & 0x0fff)
5522 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 4);
5524 insn
= PLT_ENTRY_WORD2
;
5525 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 8);
5527 insn
= PLT_ENTRY_WORD3
+ (plt_index
& 0x7ffff);
5528 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 12);
5530 insn
= PLT_ENTRY_WORD4
5531 + (((unsigned int) ((-(h
->plt
.offset
+ 16)) >> 1)) & 0xffffff);
5532 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 16);
5533 local_plt_offset
= 12;
5537 /* sda_base must be set at this time. */
5541 /* FIXME, sda_base is 65536, it will damage opcode. */
5542 /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5543 offset
= sgot
->output_section
->vma
+ sgot
->output_offset
+ got_offset
5544 - elf_gp (output_bfd
);
5545 insn
= PLT_PIC_ENTRY_WORD0
+ ((offset
>> 12) & 0xfffff);
5546 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
);
5548 insn
= PLT_PIC_ENTRY_WORD1
+ (offset
& 0xfff);
5549 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 4);
5551 insn
= PLT_PIC_ENTRY_WORD2
;
5552 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 8);
5554 insn
= PLT_PIC_ENTRY_WORD3
;
5555 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 12);
5557 insn
= PLT_PIC_ENTRY_WORD4
+ (plt_index
& 0x7fffff);
5558 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 16);
5560 insn
= PLT_PIC_ENTRY_WORD5
5561 + (((unsigned int) ((-(h
->plt
.offset
+ 20)) >> 1)) & 0xffffff);
5562 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 20);
5564 local_plt_offset
= 16;
5567 /* Fill in the entry in the global offset table,
5568 so it will fall through to the next instruction for the first time. */
5569 bfd_put_32 (output_bfd
,
5570 (splt
->output_section
->vma
+ splt
->output_offset
5571 + h
->plt
.offset
+ local_plt_offset
),
5572 sgot
->contents
+ got_offset
);
5574 /* Fill in the entry in the .rela.plt section. */
5575 rela
.r_offset
= (sgot
->output_section
->vma
5576 + sgot
->output_offset
+ got_offset
);
5577 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_NDS32_JMP_SLOT
);
5579 loc
= srela
->contents
;
5580 loc
+= plt_index
* sizeof (Elf32_External_Rela
);
5581 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
5583 if (!h
->def_regular
)
5585 /* Mark the symbol as undefined, rather than as defined in
5586 the .plt section. Leave the value alone. */
5587 sym
->st_shndx
= SHN_UNDEF
;
5588 if (!h
->ref_regular_nonweak
)
5593 if (h
->got
.offset
!= (bfd_vma
) - 1)
5597 Elf_Internal_Rela rela
;
5599 /* This symbol has an entry in the global offset table.
5603 srela
= htab
->srelgot
;
5604 BFD_ASSERT (sgot
!= NULL
&& srela
!= NULL
);
5606 rela
.r_offset
= (sgot
->output_section
->vma
5607 + sgot
->output_offset
+ (h
->got
.offset
& ~1));
5609 /* If this is a -Bsymbolic link, and the symbol is defined
5610 locally, we just want to emit a RELATIVE reloc. Likewise if
5611 the symbol was forced to be local because of a version file.
5612 The entry in the global offset table will already have been
5613 initialized in the relocate_section function. */
5614 if (bfd_link_pic (info
)
5616 || h
->dynindx
== -1 || h
->forced_local
) && h
->def_regular
)
5618 rela
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
5619 rela
.r_addend
= (h
->root
.u
.def
.value
5620 + h
->root
.u
.def
.section
->output_section
->vma
5621 + h
->root
.u
.def
.section
->output_offset
);
5625 BFD_ASSERT ((h
->got
.offset
& 1) == 0);
5626 bfd_put_32 (output_bfd
, (bfd_vma
) 0,
5627 sgot
->contents
+ h
->got
.offset
);
5628 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_NDS32_GLOB_DAT
);
5632 loc
= srela
->contents
;
5633 loc
+= srela
->reloc_count
* sizeof (Elf32_External_Rela
);
5634 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
5635 ++srela
->reloc_count
;
5641 Elf_Internal_Rela rela
;
5643 /* This symbols needs a copy reloc. Set it up. */
5645 BFD_ASSERT (h
->dynindx
!= -1
5646 && (h
->root
.type
== bfd_link_hash_defined
5647 || h
->root
.type
== bfd_link_hash_defweak
));
5649 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
, ".rela.bss");
5650 BFD_ASSERT (s
!= NULL
);
5652 rela
.r_offset
= (h
->root
.u
.def
.value
5653 + h
->root
.u
.def
.section
->output_section
->vma
5654 + h
->root
.u
.def
.section
->output_offset
);
5655 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_NDS32_COPY
);
5658 loc
+= s
->reloc_count
* sizeof (Elf32_External_Rela
);
5659 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
5663 /* Mark some specially defined symbols as absolute. */
5664 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
5665 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
5666 sym
->st_shndx
= SHN_ABS
;
5672 /* Finish up the dynamic sections. */
5675 nds32_elf_finish_dynamic_sections (bfd
*output_bfd
, struct bfd_link_info
*info
)
5677 struct elf_nds32_link_hash_table
*htab
;
5682 htab
= nds32_elf_hash_table (info
);
5683 dynobj
= htab
->root
.dynobj
;
5685 sgot
= htab
->sgotplt
;
5686 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
5688 if (htab
->root
.dynamic_sections_created
)
5691 Elf32_External_Dyn
*dyncon
, *dynconend
;
5693 BFD_ASSERT (sgot
!= NULL
&& sdyn
!= NULL
);
5695 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
5696 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
5698 for (; dyncon
< dynconend
; dyncon
++)
5700 Elf_Internal_Dyn dyn
;
5703 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
5716 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
5717 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
5722 dyn
.d_un
.d_val
= s
->size
;
5723 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
5727 /* My reading of the SVR4 ABI indicates that the
5728 procedure linkage table relocs (DT_JMPREL) should be
5729 included in the overall relocs (DT_RELA). This is
5730 what Solaris does. However, UnixWare can not handle
5731 that case. Therefore, we override the DT_RELASZ entry
5732 here to make it not include the JMPREL relocs. Since
5733 the linker script arranges for .rela.plt to follow all
5734 other relocation sections, we don't have to worry
5735 about changing the DT_RELA entry. */
5736 if (htab
->srelplt
!= NULL
)
5739 dyn
.d_un
.d_val
-= s
->size
;
5741 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
5746 /* Fill in the first entry in the procedure linkage table. */
5748 if (splt
&& splt
->size
> 0)
5750 if (bfd_link_pic (info
))
5755 /* FIXME, sda_base is 65536, it will damage opcode. */
5756 /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5757 offset
= sgot
->output_section
->vma
+ sgot
->output_offset
+ 4
5758 - elf_gp (output_bfd
);
5759 insn
= PLT0_PIC_ENTRY_WORD0
| ((offset
>> 12) & 0xfffff);
5760 bfd_putb32 (insn
, splt
->contents
);
5762 /* insn = PLT0_PIC_ENTRY_WORD0 | (((8 - sda_base) >> 2) & 0x7fff) ; */
5763 /* here has a typo? */
5764 insn
= PLT0_PIC_ENTRY_WORD1
| (offset
& 0xfff);
5765 bfd_putb32 (insn
, splt
->contents
+ 4);
5767 insn
= PLT0_PIC_ENTRY_WORD2
;
5768 bfd_putb32 (insn
, splt
->contents
+ 8);
5770 insn
= PLT0_PIC_ENTRY_WORD3
;
5771 bfd_putb32 (insn
, splt
->contents
+ 12);
5773 insn
= PLT0_PIC_ENTRY_WORD4
;
5774 bfd_putb32 (insn
, splt
->contents
+ 16);
5776 insn
= PLT0_PIC_ENTRY_WORD5
;
5777 bfd_putb32 (insn
, splt
->contents
+ 20);
5784 /* addr = .got + 4 */
5785 addr
= sgot
->output_section
->vma
+ sgot
->output_offset
+ 4;
5786 insn
= PLT0_ENTRY_WORD0
| ((addr
>> 12) & 0xfffff);
5787 bfd_putb32 (insn
, splt
->contents
);
5789 insn
= PLT0_ENTRY_WORD1
| (addr
& 0x0fff);
5790 bfd_putb32 (insn
, splt
->contents
+ 4);
5792 insn
= PLT0_ENTRY_WORD2
;
5793 bfd_putb32 (insn
, splt
->contents
+ 8);
5795 insn
= PLT0_ENTRY_WORD3
;
5796 bfd_putb32 (insn
, splt
->contents
+ 12);
5798 insn
= PLT0_ENTRY_WORD4
;
5799 bfd_putb32 (insn
, splt
->contents
+ 16);
5802 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
=
5807 /* Fill in the first three entries in the global offset table. */
5808 if (sgot
&& sgot
->size
> 0)
5811 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
5813 bfd_put_32 (output_bfd
,
5814 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
5816 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
5817 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
5819 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
5826 /* Set the right machine number. */
5829 nds32_elf_object_p (bfd
*abfd
)
5831 static unsigned int cur_arch
= 0;
5833 if (E_N1_ARCH
!= (elf_elfheader (abfd
)->e_flags
& EF_NDS_ARCH
))
5835 /* E_N1_ARCH is a wild card, so it is set only when no others exist. */
5836 cur_arch
= (elf_elfheader (abfd
)->e_flags
& EF_NDS_ARCH
);
5843 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1
);
5846 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h
);
5848 case E_NDS_ARCH_STAR_V2_0
:
5849 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h_v2
);
5851 case E_NDS_ARCH_STAR_V3_0
:
5852 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h_v3
);
5854 case E_NDS_ARCH_STAR_V3_M
:
5855 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h_v3m
);
5862 /* Store the machine number in the flags field. */
5865 nds32_elf_final_write_processing (bfd
*abfd
,
5866 bfd_boolean linker ATTRIBUTE_UNUSED
)
5869 static unsigned int cur_mach
= 0;
5871 if (bfd_mach_n1
!= bfd_get_mach (abfd
))
5873 cur_mach
= bfd_get_mach (abfd
);
5879 /* Only happen when object is empty, since the case is abandon. */
5881 val
|= E_NDS_ABI_AABI
;
5882 val
|= E_NDS32_ELF_VER_1_4
;
5887 case bfd_mach_n1h_v2
:
5888 val
= E_NDS_ARCH_STAR_V2_0
;
5890 case bfd_mach_n1h_v3
:
5891 val
= E_NDS_ARCH_STAR_V3_0
;
5893 case bfd_mach_n1h_v3m
:
5894 val
= E_NDS_ARCH_STAR_V3_M
;
5901 elf_elfheader (abfd
)->e_flags
&= ~EF_NDS_ARCH
;
5902 elf_elfheader (abfd
)->e_flags
|= val
;
5905 /* Function to keep NDS32 specific file flags. */
5908 nds32_elf_set_private_flags (bfd
*abfd
, flagword flags
)
5910 BFD_ASSERT (!elf_flags_init (abfd
)
5911 || elf_elfheader (abfd
)->e_flags
== flags
);
5913 elf_elfheader (abfd
)->e_flags
= flags
;
5914 elf_flags_init (abfd
) = TRUE
;
5919 convert_e_flags (unsigned int e_flags
, unsigned int arch
)
5921 if ((e_flags
& EF_NDS_ARCH
) == E_NDS_ARCH_STAR_V0_9
)
5923 /* From 0.9 to 1.0. */
5924 e_flags
= (e_flags
& (~EF_NDS_ARCH
)) | E_NDS_ARCH_STAR_V1_0
;
5926 /* Invert E_NDS32_HAS_NO_MAC_INST. */
5927 e_flags
^= E_NDS32_HAS_NO_MAC_INST
;
5928 if (arch
== E_NDS_ARCH_STAR_V1_0
)
5935 /* From 1.0 to 2.0. */
5936 e_flags
= (e_flags
& (~EF_NDS_ARCH
)) | E_NDS_ARCH_STAR_V2_0
;
5938 /* Clear E_NDS32_HAS_MFUSR_PC_INST. */
5939 e_flags
&= ~E_NDS32_HAS_MFUSR_PC_INST
;
5941 /* Invert E_NDS32_HAS_NO_MAC_INST. */
5942 e_flags
^= E_NDS32_HAS_NO_MAC_INST
;
5947 nds32_check_vec_size (bfd
*ibfd
)
5949 static unsigned int nds32_vec_size
= 0;
5951 asection
*sec_t
= NULL
;
5952 bfd_byte
*contents
= NULL
;
5954 sec_t
= bfd_get_section_by_name (ibfd
, ".nds32_e_flags");
5956 if (sec_t
&& sec_t
->size
>= 4)
5958 /* Get vec_size in file. */
5959 unsigned int flag_t
;
5961 nds32_get_section_contents (ibfd
, sec_t
, &contents
, TRUE
);
5962 flag_t
= bfd_get_32 (ibfd
, contents
);
5964 /* The value could only be 4 or 16. */
5966 if (!nds32_vec_size
)
5967 /* Set if not set yet. */
5968 nds32_vec_size
= (flag_t
& 0x3);
5969 else if (nds32_vec_size
!= (flag_t
& 0x3))
5972 (_("%B: ISR vector size mismatch"
5973 " with previous modules, previous %u-byte, current %u-byte"),
5975 nds32_vec_size
== 1 ? 4 : nds32_vec_size
== 2 ? 16 : 0xffffffff,
5976 (flag_t
& 0x3) == 1 ? 4 : (flag_t
& 0x3) == 2 ? 16 : 0xffffffff);
5980 /* Only keep the first vec_size section. */
5981 sec_t
->flags
|= SEC_EXCLUDE
;
5987 /* Merge backend specific data from an object file to the output
5988 object file when linking. */
5991 nds32_elf_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
5995 flagword out_16regs
;
5997 flagword out_no_mac
;
5999 flagword out_version
;
6000 flagword in_version
;
6001 flagword out_fpu_config
;
6002 flagword in_fpu_config
;
6004 /* TODO: Revise to use object-attributes instead. */
6005 if (!nds32_check_vec_size (ibfd
))
6008 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6009 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6012 if (bfd_little_endian (ibfd
) != bfd_little_endian (obfd
))
6015 (_("%B: warning: Endian mismatch with previous modules."), ibfd
);
6017 bfd_set_error (bfd_error_bad_value
);
6021 in_version
= elf_elfheader (ibfd
)->e_flags
& EF_NDS32_ELF_VERSION
;
6022 if (in_version
== E_NDS32_ELF_VER_1_2
)
6025 (_("%B: warning: Older version of object file encountered, "
6026 "Please recompile with current tool chain."), ibfd
);
6029 /* We may need to merge V1 and V2 arch object files to V2. */
6030 if ((elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
)
6031 != (elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
))
6033 /* Need to convert version. */
6034 if ((elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
)
6035 == E_NDS_ARCH_STAR_RESERVED
)
6037 elf_elfheader (obfd
)->e_flags
= elf_elfheader (ibfd
)->e_flags
;
6039 else if ((elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
) == E_NDS_ARCH_STAR_V0_9
6040 || (elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
)
6041 > (elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
))
6043 elf_elfheader (obfd
)->e_flags
=
6044 convert_e_flags (elf_elfheader (obfd
)->e_flags
,
6045 (elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
));
6049 elf_elfheader (ibfd
)->e_flags
=
6050 convert_e_flags (elf_elfheader (ibfd
)->e_flags
,
6051 (elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
));
6055 /* Extract some flags. */
6056 in_flags
= elf_elfheader (ibfd
)->e_flags
6057 & (~(E_NDS32_HAS_REDUCED_REGS
| EF_NDS32_ELF_VERSION
6058 | E_NDS32_HAS_NO_MAC_INST
| E_NDS32_FPU_REG_CONF
));
6060 /* The following flags need special treatment. */
6061 in_16regs
= elf_elfheader (ibfd
)->e_flags
& E_NDS32_HAS_REDUCED_REGS
;
6062 in_no_mac
= elf_elfheader (ibfd
)->e_flags
& E_NDS32_HAS_NO_MAC_INST
;
6063 in_fpu_config
= elf_elfheader (ibfd
)->e_flags
& E_NDS32_FPU_REG_CONF
;
6065 /* Extract some flags. */
6066 out_flags
= elf_elfheader (obfd
)->e_flags
6067 & (~(E_NDS32_HAS_REDUCED_REGS
| EF_NDS32_ELF_VERSION
6068 | E_NDS32_HAS_NO_MAC_INST
| E_NDS32_FPU_REG_CONF
));
6070 /* The following flags need special treatment. */
6071 out_16regs
= elf_elfheader (obfd
)->e_flags
& E_NDS32_HAS_REDUCED_REGS
;
6072 out_no_mac
= elf_elfheader (obfd
)->e_flags
& E_NDS32_HAS_NO_MAC_INST
;
6073 out_fpu_config
= elf_elfheader (obfd
)->e_flags
& E_NDS32_FPU_REG_CONF
;
6074 out_version
= elf_elfheader (obfd
)->e_flags
& EF_NDS32_ELF_VERSION
;
6075 if (!elf_flags_init (obfd
))
6077 /* If the input is the default architecture then do not
6078 bother setting the flags for the output architecture,
6079 instead allow future merges to do this. If no future
6080 merges ever set these flags then they will retain their
6081 unitialised values, which surprise surprise, correspond
6082 to the default values. */
6083 if (bfd_get_arch_info (ibfd
)->the_default
)
6086 elf_flags_init (obfd
) = TRUE
;
6087 elf_elfheader (obfd
)->e_flags
= elf_elfheader (ibfd
)->e_flags
;
6089 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
6090 && bfd_get_arch_info (obfd
)->the_default
)
6092 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
),
6093 bfd_get_mach (ibfd
));
6099 /* Check flag compatibility. */
6100 if ((in_flags
& EF_NDS_ABI
) != (out_flags
& EF_NDS_ABI
))
6103 (_("%B: error: ABI mismatch with previous modules."), ibfd
);
6105 bfd_set_error (bfd_error_bad_value
);
6109 if ((in_flags
& EF_NDS_ARCH
) != (out_flags
& EF_NDS_ARCH
))
6111 if (((in_flags
& EF_NDS_ARCH
) != E_N1_ARCH
))
6114 (_("%B: error: Instruction set mismatch with previous modules."), ibfd
);
6116 bfd_set_error (bfd_error_bad_value
);
6121 /* When linking with V1.2 and V1.3 objects together the output is V1.2.
6122 and perf ext1 and DIV are mergerd to perf ext1. */
6123 if (in_version
== E_NDS32_ELF_VER_1_2
|| out_version
== E_NDS32_ELF_VER_1_2
)
6125 elf_elfheader (obfd
)->e_flags
=
6126 (in_flags
& (~(E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6127 | (out_flags
& (~(E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6128 | (((in_flags
& (E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6129 ? E_NDS32_HAS_EXT_INST
: 0)
6130 | (((out_flags
& (E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6131 ? E_NDS32_HAS_EXT_INST
: 0)
6132 | (in_16regs
& out_16regs
) | (in_no_mac
& out_no_mac
)
6133 | ((in_version
> out_version
) ? out_version
: in_version
);
6137 if (in_version
!= out_version
)
6139 (_("%B: warning: Incompatible elf-versions %s and %s."),
6140 ibfd
, nds32_elfver_strtab
[out_version
],
6141 nds32_elfver_strtab
[in_version
]);
6143 elf_elfheader (obfd
)->e_flags
= in_flags
| out_flags
6144 | (in_16regs
& out_16regs
) | (in_no_mac
& out_no_mac
)
6145 | (in_fpu_config
> out_fpu_config
? in_fpu_config
: out_fpu_config
)
6146 | (in_version
> out_version
? out_version
: in_version
);
6152 /* Display the flags field. */
6155 nds32_elf_print_private_bfd_data (bfd
*abfd
, void *ptr
)
6157 FILE *file
= (FILE *) ptr
;
6159 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
6161 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
6163 fprintf (file
, _("private flags = %lx"), elf_elfheader (abfd
)->e_flags
);
6165 switch (elf_elfheader (abfd
)->e_flags
& EF_NDS_ARCH
)
6169 fprintf (file
, _(": n1 instructions"));
6172 fprintf (file
, _(": n1h instructions"));
6182 nds32_elf_action_discarded (asection
*sec
)
6186 (".gcc_except_table", sec
->name
, sizeof (".gcc_except_table") - 1) == 0)
6189 return _bfd_elf_default_action_discarded (sec
);
6193 nds32_elf_gc_mark_hook (asection
*sec
, struct bfd_link_info
*info
,
6194 Elf_Internal_Rela
*rel
, struct elf_link_hash_entry
*h
,
6195 Elf_Internal_Sym
*sym
)
6198 switch (ELF32_R_TYPE (rel
->r_info
))
6200 case R_NDS32_GNU_VTINHERIT
:
6201 case R_NDS32_GNU_VTENTRY
:
6202 case R_NDS32_RELA_GNU_VTINHERIT
:
6203 case R_NDS32_RELA_GNU_VTENTRY
:
6207 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
6211 nds32_elf_gc_sweep_hook (bfd
*abfd
, struct bfd_link_info
*info
, asection
*sec
,
6212 const Elf_Internal_Rela
*relocs
)
6214 /* Update the got entry reference counts for the section being removed. */
6215 Elf_Internal_Shdr
*symtab_hdr
;
6216 struct elf_link_hash_entry
**sym_hashes
;
6217 bfd_signed_vma
*local_got_refcounts
;
6218 const Elf_Internal_Rela
*rel
, *relend
;
6220 elf_section_data (sec
)->local_dynrel
= NULL
;
6222 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6223 sym_hashes
= elf_sym_hashes (abfd
);
6224 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6226 relend
= relocs
+ sec
->reloc_count
;
6227 for (rel
= relocs
; rel
< relend
; rel
++)
6229 unsigned long r_symndx
;
6230 struct elf_link_hash_entry
*h
= NULL
;
6232 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6233 if (r_symndx
>= symtab_hdr
->sh_info
)
6235 /* External symbol. */
6236 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6237 while (h
->root
.type
== bfd_link_hash_indirect
6238 || h
->root
.type
== bfd_link_hash_warning
)
6239 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6242 switch (ELF32_R_TYPE (rel
->r_info
))
6244 case R_NDS32_GOT_HI20
:
6245 case R_NDS32_GOT_LO12
:
6246 case R_NDS32_GOT_LO15
:
6247 case R_NDS32_GOT_LO19
:
6248 case R_NDS32_GOT17S2_RELA
:
6249 case R_NDS32_GOT15S2_RELA
:
6250 case R_NDS32_GOTOFF
:
6251 case R_NDS32_GOTOFF_HI20
:
6252 case R_NDS32_GOTOFF_LO12
:
6253 case R_NDS32_GOTOFF_LO15
:
6254 case R_NDS32_GOTOFF_LO19
:
6256 case R_NDS32_GOTPC_HI20
:
6257 case R_NDS32_GOTPC_LO12
:
6258 case R_NDS32_GOTPC20
:
6261 if (h
->got
.refcount
> 0)
6266 if (local_got_refcounts
&& local_got_refcounts
[r_symndx
] > 0)
6267 local_got_refcounts
[r_symndx
]--;
6271 case R_NDS32_16_RELA
:
6272 case R_NDS32_20_RELA
:
6273 case R_NDS32_5_RELA
:
6274 case R_NDS32_32_RELA
:
6275 case R_NDS32_HI20_RELA
:
6276 case R_NDS32_LO12S3_RELA
:
6277 case R_NDS32_LO12S2_RELA
:
6278 case R_NDS32_LO12S2_DP_RELA
:
6279 case R_NDS32_LO12S2_SP_RELA
:
6280 case R_NDS32_LO12S1_RELA
:
6281 case R_NDS32_LO12S0_RELA
:
6282 case R_NDS32_LO12S0_ORI_RELA
:
6283 case R_NDS32_SDA16S3_RELA
:
6284 case R_NDS32_SDA17S2_RELA
:
6285 case R_NDS32_SDA18S1_RELA
:
6286 case R_NDS32_SDA19S0_RELA
:
6287 case R_NDS32_SDA15S3_RELA
:
6288 case R_NDS32_SDA15S2_RELA
:
6289 case R_NDS32_SDA12S2_DP_RELA
:
6290 case R_NDS32_SDA12S2_SP_RELA
:
6291 case R_NDS32_SDA15S1_RELA
:
6292 case R_NDS32_SDA15S0_RELA
:
6293 case R_NDS32_SDA_FP7U2_RELA
:
6294 case R_NDS32_15_PCREL_RELA
:
6295 case R_NDS32_17_PCREL_RELA
:
6296 case R_NDS32_25_PCREL_RELA
:
6299 struct elf_nds32_link_hash_entry
*eh
;
6300 struct elf_nds32_dyn_relocs
**pp
;
6301 struct elf_nds32_dyn_relocs
*p
;
6303 if (!bfd_link_pic (info
) && h
->plt
.refcount
> 0)
6304 h
->plt
.refcount
-= 1;
6306 eh
= (struct elf_nds32_link_hash_entry
*) h
;
6308 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
6311 if (ELF32_R_TYPE (rel
->r_info
) == R_NDS32_15_PCREL_RELA
6312 || ELF32_R_TYPE (rel
->r_info
) == R_NDS32_17_PCREL_RELA
6313 || ELF32_R_TYPE (rel
->r_info
) == R_NDS32_25_PCREL_RELA
)
6323 case R_NDS32_9_PLTREL
:
6324 case R_NDS32_25_PLTREL
:
6327 if (h
->plt
.refcount
> 0)
6340 /* Look through the relocs for a section during the first phase.
6341 Since we don't do .gots or .plts, we just need to consider the
6342 virtual table relocs for gc. */
6345 nds32_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
6346 asection
*sec
, const Elf_Internal_Rela
*relocs
)
6348 Elf_Internal_Shdr
*symtab_hdr
;
6349 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
6350 const Elf_Internal_Rela
*rel
;
6351 const Elf_Internal_Rela
*rel_end
;
6352 struct elf_nds32_link_hash_table
*htab
;
6354 asection
*sreloc
= NULL
;
6356 if (bfd_link_relocatable (info
))
6359 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6360 sym_hashes
= elf_sym_hashes (abfd
);
6362 sym_hashes
+ symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
);
6363 if (!elf_bad_symtab (abfd
))
6364 sym_hashes_end
-= symtab_hdr
->sh_info
;
6366 htab
= nds32_elf_hash_table (info
);
6367 dynobj
= htab
->root
.dynobj
;
6369 rel_end
= relocs
+ sec
->reloc_count
;
6370 for (rel
= relocs
; rel
< rel_end
; rel
++)
6372 enum elf_nds32_reloc_type r_type
;
6373 struct elf_link_hash_entry
*h
;
6374 unsigned long r_symndx
;
6375 int tls_type
, old_tls_type
;
6377 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6378 r_type
= ELF32_R_TYPE (rel
->r_info
);
6379 if (r_symndx
< symtab_hdr
->sh_info
)
6383 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6384 while (h
->root
.type
== bfd_link_hash_indirect
6385 || h
->root
.type
== bfd_link_hash_warning
)
6386 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6389 /* Some relocs require a global offset table. We create
6390 got section here, since these relocation need got section
6391 and it is not created yet. */
6392 if (htab
->sgot
== NULL
)
6396 case R_NDS32_GOT_HI20
:
6397 case R_NDS32_GOT_LO12
:
6398 case R_NDS32_GOT_LO15
:
6399 case R_NDS32_GOT_LO19
:
6400 case R_NDS32_GOT17S2_RELA
:
6401 case R_NDS32_GOT15S2_RELA
:
6402 case R_NDS32_GOTOFF
:
6403 case R_NDS32_GOTOFF_HI20
:
6404 case R_NDS32_GOTOFF_LO12
:
6405 case R_NDS32_GOTOFF_LO15
:
6406 case R_NDS32_GOTOFF_LO19
:
6407 case R_NDS32_GOTPC20
:
6408 case R_NDS32_GOTPC_HI20
:
6409 case R_NDS32_GOTPC_LO12
:
6411 case R_NDS32_TLS_IE_HI20
:
6412 case R_NDS32_TLS_IE_LO12S2
:
6414 htab
->root
.dynobj
= dynobj
= abfd
;
6415 if (!create_got_section (dynobj
, info
))
6424 switch ((int) r_type
)
6426 case R_NDS32_GOT_HI20
:
6427 case R_NDS32_GOT_LO12
:
6428 case R_NDS32_GOT_LO15
:
6429 case R_NDS32_GOT_LO19
:
6431 case R_NDS32_TLS_IE_HI20
:
6432 case R_NDS32_TLS_IE_LO12S2
:
6435 case R_NDS32_TLS_IE_HI20
:
6436 case R_NDS32_TLS_IE_LO12S2
:
6437 tls_type
= GOT_TLS_IE
;
6440 tls_type
= GOT_NORMAL
;
6445 old_tls_type
= elf32_nds32_hash_entry (h
)->tls_type
;
6446 h
->got
.refcount
+= 1;
6450 bfd_signed_vma
*local_got_refcounts
;
6452 /* This is a global offset table entry for a local
6454 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6455 if (local_got_refcounts
== NULL
)
6459 size
= symtab_hdr
->sh_info
;
6460 size
*= sizeof (bfd_signed_vma
);
6461 local_got_refcounts
= (bfd_signed_vma
*) bfd_zalloc (abfd
, size
);
6462 if (local_got_refcounts
== NULL
)
6464 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
6466 local_got_refcounts
[r_symndx
] += 1;
6467 old_tls_type
= elf32_nds32_local_got_tls_type (abfd
)[r_symndx
];
6470 /* We will already have issued an error message if there
6471 is a TLS/non-TLS mismatch, based on the symbol
6472 type. So just combine any TLS types needed. */
6473 if (old_tls_type
!= GOT_UNKNOWN
&& old_tls_type
!= GOT_NORMAL
6474 && tls_type
!= GOT_NORMAL
)
6475 tls_type
|= old_tls_type
;
6477 if (old_tls_type
!= tls_type
)
6480 elf32_nds32_hash_entry (h
)->tls_type
= tls_type
;
6482 elf32_nds32_local_got_tls_type (abfd
)[r_symndx
] = tls_type
;
6485 case R_NDS32_9_PLTREL
:
6486 case R_NDS32_25_PLTREL
:
6487 case R_NDS32_PLTREL_HI20
:
6488 case R_NDS32_PLTREL_LO12
:
6489 case R_NDS32_PLT_GOTREL_HI20
:
6490 case R_NDS32_PLT_GOTREL_LO12
:
6491 case R_NDS32_PLT_GOTREL_LO15
:
6492 case R_NDS32_PLT_GOTREL_LO19
:
6493 case R_NDS32_PLT_GOTREL_LO20
:
6495 /* This symbol requires a procedure linkage table entry. We
6496 actually build the entry in adjust_dynamic_symbol,
6497 because this might be a case of linking PIC code without
6498 linking in any dynamic objects, in which case we don't
6499 need to generate a procedure linkage table after all. */
6501 /* If this is a local symbol, we resolve it directly without
6502 creating a procedure linkage table entry. */
6506 if (h
->forced_local
)
6509 elf32_nds32_hash_entry (h
)->tls_type
= GOT_NORMAL
;
6511 h
->plt
.refcount
+= 1;
6514 case R_NDS32_16_RELA
:
6515 case R_NDS32_20_RELA
:
6516 case R_NDS32_5_RELA
:
6517 case R_NDS32_32_RELA
:
6518 case R_NDS32_HI20_RELA
:
6519 case R_NDS32_LO12S3_RELA
:
6520 case R_NDS32_LO12S2_RELA
:
6521 case R_NDS32_LO12S2_DP_RELA
:
6522 case R_NDS32_LO12S2_SP_RELA
:
6523 case R_NDS32_LO12S1_RELA
:
6524 case R_NDS32_LO12S0_RELA
:
6525 case R_NDS32_LO12S0_ORI_RELA
:
6526 case R_NDS32_SDA16S3_RELA
:
6527 case R_NDS32_SDA17S2_RELA
:
6528 case R_NDS32_SDA18S1_RELA
:
6529 case R_NDS32_SDA19S0_RELA
:
6530 case R_NDS32_SDA15S3_RELA
:
6531 case R_NDS32_SDA15S2_RELA
:
6532 case R_NDS32_SDA12S2_DP_RELA
:
6533 case R_NDS32_SDA12S2_SP_RELA
:
6534 case R_NDS32_SDA15S1_RELA
:
6535 case R_NDS32_SDA15S0_RELA
:
6536 case R_NDS32_SDA_FP7U2_RELA
:
6537 case R_NDS32_15_PCREL_RELA
:
6538 case R_NDS32_17_PCREL_RELA
:
6539 case R_NDS32_25_PCREL_RELA
:
6541 if (h
!= NULL
&& !bfd_link_pic (info
))
6544 h
->plt
.refcount
+= 1;
6547 /* If we are creating a shared library, and this is a reloc against
6548 a global symbol, or a non PC relative reloc against a local
6549 symbol, then we need to copy the reloc into the shared library.
6550 However, if we are linking with -Bsymbolic, we do not need to
6551 copy a reloc against a global symbol which is defined in an
6552 object we are including in the link (i.e., DEF_REGULAR is set).
6553 At this point we have not seen all the input files, so it is
6554 possible that DEF_REGULAR is not set now but will be set later
6555 (it is never cleared). We account for that possibility below by
6556 storing information in the dyn_relocs field of the hash table
6557 entry. A similar situation occurs when creating shared libraries
6558 and symbol visibility changes render the symbol local.
6560 If on the other hand, we are creating an executable, we may need
6561 to keep relocations for symbols satisfied by a dynamic library
6562 if we manage to avoid copy relocs for the symbol. */
6563 if ((bfd_link_pic (info
)
6564 && (sec
->flags
& SEC_ALLOC
) != 0
6565 && ((r_type
!= R_NDS32_25_PCREL_RELA
6566 && r_type
!= R_NDS32_15_PCREL_RELA
6567 && r_type
!= R_NDS32_17_PCREL_RELA
6568 && !(r_type
== R_NDS32_32_RELA
6569 && strcmp (sec
->name
, ".eh_frame") == 0))
6572 || h
->root
.type
== bfd_link_hash_defweak
6573 || !h
->def_regular
))))
6574 || (!bfd_link_pic (info
)
6575 && (sec
->flags
& SEC_ALLOC
) != 0
6577 && (h
->root
.type
== bfd_link_hash_defweak
6578 || !h
->def_regular
)))
6580 struct elf_nds32_dyn_relocs
*p
;
6581 struct elf_nds32_dyn_relocs
**head
;
6584 htab
->root
.dynobj
= dynobj
= abfd
;
6586 /* When creating a shared object, we must copy these
6587 relocs into the output file. We create a reloc
6588 section in dynobj and make room for the reloc. */
6593 name
= bfd_elf_string_from_elf_section
6594 (abfd
, elf_elfheader (abfd
)->e_shstrndx
,
6595 elf_section_data (sec
)->rela
.hdr
->sh_name
);
6599 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
6600 && strcmp (bfd_get_section_name (abfd
, sec
),
6603 sreloc
= bfd_get_section_by_name (dynobj
, name
);
6608 sreloc
= bfd_make_section (dynobj
, name
);
6609 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
6610 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
6611 if ((sec
->flags
& SEC_ALLOC
) != 0)
6612 flags
|= SEC_ALLOC
| SEC_LOAD
;
6614 || !bfd_set_section_flags (dynobj
, sreloc
, flags
)
6615 || !bfd_set_section_alignment (dynobj
, sreloc
, 2))
6618 elf_section_type (sreloc
) = SHT_RELA
;
6620 elf_section_data (sec
)->sreloc
= sreloc
;
6623 /* If this is a global symbol, we count the number of
6624 relocations we need for this symbol. */
6626 head
= &((struct elf_nds32_link_hash_entry
*) h
)->dyn_relocs
;
6631 Elf_Internal_Sym
*isym
;
6632 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
, abfd
, r_symndx
);
6636 /* Track dynamic relocs needed for local syms too. */
6637 s
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
6641 head
= ((struct elf_nds32_dyn_relocs
**)
6642 &elf_section_data (s
)->local_dynrel
);
6646 if (p
== NULL
|| p
->sec
!= sec
)
6648 bfd_size_type amt
= sizeof (*p
);
6649 p
= (struct elf_nds32_dyn_relocs
*) bfd_alloc (dynobj
, amt
);
6660 if (ELF32_R_TYPE (rel
->r_info
) == R_NDS32_25_PCREL_RELA
6661 || ELF32_R_TYPE (rel
->r_info
) == R_NDS32_15_PCREL_RELA
6662 || ELF32_R_TYPE (rel
->r_info
) == R_NDS32_17_PCREL_RELA
)
6667 /* This relocation describes the C++ object vtable hierarchy.
6668 Reconstruct it for later use during GC. */
6669 case R_NDS32_RELA_GNU_VTINHERIT
:
6670 case R_NDS32_GNU_VTINHERIT
:
6671 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
6675 /* This relocation describes which C++ vtable entries are actually
6676 used. Record for later use during GC. */
6677 case R_NDS32_GNU_VTENTRY
:
6678 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_offset
))
6681 case R_NDS32_RELA_GNU_VTENTRY
:
6682 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
6691 /* Write VAL in uleb128 format to P, returning a pointer to the
6693 This code is copied from elf-attr.c. */
6696 write_uleb128 (bfd_byte
*p
, unsigned int val
)
6711 static bfd_signed_vma
6712 calculate_offset (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
6713 Elf_Internal_Sym
*isymbuf
, Elf_Internal_Shdr
*symtab_hdr
,
6714 int *pic_ext_target
)
6716 bfd_signed_vma foff
;
6717 bfd_vma symval
, addend
;
6720 /* Get the value of the symbol referred to by the reloc. */
6721 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
6723 Elf_Internal_Sym
*isym
;
6725 /* A local symbol. */
6726 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
6728 if (isym
->st_shndx
== SHN_UNDEF
)
6729 sym_sec
= bfd_und_section_ptr
;
6730 else if (isym
->st_shndx
== SHN_ABS
)
6731 sym_sec
= bfd_abs_section_ptr
;
6732 else if (isym
->st_shndx
== SHN_COMMON
)
6733 sym_sec
= bfd_com_section_ptr
;
6735 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
6736 symval
= isym
->st_value
+ sym_sec
->output_section
->vma
6737 + sym_sec
->output_offset
;
6742 struct elf_link_hash_entry
*h
;
6745 /* An external symbol. */
6746 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
6747 h
= elf_sym_hashes (abfd
)[indx
];
6748 BFD_ASSERT (h
!= NULL
);
6750 if (h
->root
.type
!= bfd_link_hash_defined
6751 && h
->root
.type
!= bfd_link_hash_defweak
)
6752 /* This appears to be a reference to an undefined
6753 symbol. Just ignore it--it will be caught by the
6754 regular reloc processing. */
6756 owner
= h
->root
.u
.def
.section
->owner
;
6757 if (owner
&& (elf_elfheader (owner
)->e_flags
& E_NDS32_HAS_PIC
))
6758 *pic_ext_target
= 1;
6760 if (h
->root
.u
.def
.section
->flags
& SEC_MERGE
)
6762 sym_sec
= h
->root
.u
.def
.section
;
6763 symval
= _bfd_merged_section_offset (abfd
, &sym_sec
,
6764 elf_section_data (sym_sec
)->sec_info
,
6765 h
->root
.u
.def
.value
);
6766 symval
= symval
+ sym_sec
->output_section
->vma
6767 + sym_sec
->output_offset
;
6770 symval
= (h
->root
.u
.def
.value
6771 + h
->root
.u
.def
.section
->output_section
->vma
6772 + h
->root
.u
.def
.section
->output_offset
);
6775 addend
= irel
->r_addend
;
6777 foff
= (symval
+ addend
6778 - (irel
->r_offset
+ sec
->output_section
->vma
+ sec
->output_offset
));
6783 calculate_plt_memory_address (bfd
*abfd
, struct bfd_link_info
*link_info
,
6784 Elf_Internal_Sym
*isymbuf
,
6785 Elf_Internal_Rela
*irel
,
6786 Elf_Internal_Shdr
*symtab_hdr
)
6790 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
6792 Elf_Internal_Sym
*isym
;
6794 /* A local symbol. */
6795 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
6797 if (isym
->st_shndx
== SHN_UNDEF
)
6798 sym_sec
= bfd_und_section_ptr
;
6799 else if (isym
->st_shndx
== SHN_ABS
)
6800 sym_sec
= bfd_abs_section_ptr
;
6801 else if (isym
->st_shndx
== SHN_COMMON
)
6802 sym_sec
= bfd_com_section_ptr
;
6804 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
6805 symval
= isym
->st_value
+ sym_sec
->output_section
->vma
6806 + sym_sec
->output_offset
;
6811 struct elf_link_hash_entry
*h
;
6812 struct elf_nds32_link_hash_table
*htab
;
6815 /* An external symbol. */
6816 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
6817 h
= elf_sym_hashes (abfd
)[indx
];
6818 BFD_ASSERT (h
!= NULL
);
6819 htab
= nds32_elf_hash_table (link_info
);
6822 while (h
->root
.type
== bfd_link_hash_indirect
6823 || h
->root
.type
== bfd_link_hash_warning
)
6824 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6826 if (h
->plt
.offset
== (bfd_vma
) - 1)
6828 if (h
->root
.type
!= bfd_link_hash_defined
6829 && h
->root
.type
!= bfd_link_hash_defweak
)
6830 /* This appears to be a reference to an undefined
6831 * symbol. Just ignore it--it will be caught by the
6832 * regular reloc processing. */
6834 symval
= (h
->root
.u
.def
.value
6835 + h
->root
.u
.def
.section
->output_section
->vma
6836 + h
->root
.u
.def
.section
->output_offset
);
6839 symval
= splt
->output_section
->vma
+ h
->plt
.offset
;
6845 static bfd_signed_vma
6846 calculate_plt_offset (bfd
*abfd
, asection
*sec
, struct bfd_link_info
*link_info
,
6847 Elf_Internal_Sym
*isymbuf
, Elf_Internal_Rela
*irel
,
6848 Elf_Internal_Shdr
*symtab_hdr
)
6851 if ((foff
= calculate_plt_memory_address (abfd
, link_info
, isymbuf
, irel
,
6855 return foff
- (irel
->r_offset
6856 + sec
->output_section
->vma
+ sec
->output_offset
);
6859 /* Convert a 32-bit instruction to 16-bit one.
6860 INSN is the input 32-bit instruction, INSN16 is the output 16-bit
6861 instruction. If INSN_TYPE is not NULL, it the CGEN instruction
6862 type of INSN16. Return 1 if successful. */
6865 nds32_convert_32_to_16_alu1 (bfd
*abfd
, uint32_t insn
, uint16_t *pinsn16
,
6868 uint16_t insn16
= 0;
6870 unsigned long mach
= bfd_get_mach (abfd
);
6872 if (N32_SH5 (insn
) != 0)
6875 switch (N32_SUB5 (insn
))
6877 case N32_ALU1_ADD_SLLI
:
6878 case N32_ALU1_ADD_SRLI
:
6879 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IS_RB3 (insn
))
6881 insn16
= N16_TYPE333 (ADD333
, N32_RT5 (insn
), N32_RA5 (insn
),
6883 insn_type
= NDS32_INSN_ADD333
;
6885 else if (N32_IS_RT4 (insn
))
6887 if (N32_RT5 (insn
) == N32_RA5 (insn
))
6888 insn16
= N16_TYPE45 (ADD45
, N32_RT54 (insn
), N32_RB5 (insn
));
6889 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
6890 insn16
= N16_TYPE45 (ADD45
, N32_RT54 (insn
), N32_RA5 (insn
));
6891 insn_type
= NDS32_INSN_ADD45
;
6895 case N32_ALU1_SUB_SLLI
:
6896 case N32_ALU1_SUB_SRLI
:
6897 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IS_RB3 (insn
))
6899 insn16
= N16_TYPE333 (SUB333
, N32_RT5 (insn
), N32_RA5 (insn
),
6901 insn_type
= NDS32_INSN_SUB333
;
6903 else if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
))
6905 insn16
= N16_TYPE45 (SUB45
, N32_RT54 (insn
), N32_RB5 (insn
));
6906 insn_type
= NDS32_INSN_SUB45
;
6910 case N32_ALU1_AND_SLLI
:
6911 case N32_ALU1_AND_SRLI
:
6912 /* and $rt, $rt, $rb -> and33 for v3, v3m. */
6913 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
6914 && N32_IS_RB3 (insn
))
6916 if (N32_RT5 (insn
) == N32_RA5 (insn
))
6917 insn16
= N16_MISC33 (AND33
, N32_RT5 (insn
), N32_RB5 (insn
));
6918 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
6919 insn16
= N16_MISC33 (AND33
, N32_RT5 (insn
), N32_RA5 (insn
));
6921 insn_type
= NDS32_INSN_AND33
;
6925 case N32_ALU1_XOR_SLLI
:
6926 case N32_ALU1_XOR_SRLI
:
6927 /* xor $rt, $rt, $rb -> xor33 for v3, v3m. */
6928 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
6929 && N32_IS_RB3 (insn
))
6931 if (N32_RT5 (insn
) == N32_RA5 (insn
))
6932 insn16
= N16_MISC33 (XOR33
, N32_RT5 (insn
), N32_RB5 (insn
));
6933 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
6934 insn16
= N16_MISC33 (XOR33
, N32_RT5 (insn
), N32_RA5 (insn
));
6936 insn_type
= NDS32_INSN_XOR33
;
6940 case N32_ALU1_OR_SLLI
:
6941 case N32_ALU1_OR_SRLI
:
6942 /* or $rt, $rt, $rb -> or33 for v3, v3m. */
6943 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
6944 && N32_IS_RB3 (insn
))
6946 if (N32_RT5 (insn
) == N32_RA5 (insn
))
6947 insn16
= N16_MISC33 (OR33
, N32_RT5 (insn
), N32_RB5 (insn
));
6948 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
6949 insn16
= N16_MISC33 (OR33
, N32_RT5 (insn
), N32_RA5 (insn
));
6951 insn_type
= NDS32_INSN_OR33
;
6955 /* nor $rt, $ra, $ra -> not33 for v3, v3m. */
6956 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RB3 (insn
)
6957 && N32_RA5 (insn
) == N32_RB5 (insn
))
6959 insn16
= N16_MISC33 (NOT33
, N32_RT5 (insn
), N32_RA5 (insn
));
6960 insn_type
= NDS32_INSN_NOT33
;
6964 if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
))
6966 insn16
= N16_TYPE45 (SRAI45
, N32_RT54 (insn
), N32_UB5 (insn
));
6967 insn_type
= NDS32_INSN_SRAI45
;
6972 if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
))
6974 insn16
= N16_TYPE45 (SRLI45
, N32_RT54 (insn
), N32_UB5 (insn
));
6975 insn_type
= NDS32_INSN_SRLI45
;
6980 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_UB5 (insn
) < 8)
6982 insn16
= N16_TYPE333 (SLLI333
, N32_RT5 (insn
), N32_RA5 (insn
),
6984 insn_type
= NDS32_INSN_SLLI333
;
6989 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
6991 insn16
= N16_BFMI333 (ZEH33
, N32_RT5 (insn
), N32_RA5 (insn
));
6992 insn_type
= NDS32_INSN_ZEH33
;
6997 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
6999 insn16
= N16_BFMI333 (SEB33
, N32_RT5 (insn
), N32_RA5 (insn
));
7000 insn_type
= NDS32_INSN_SEB33
;
7005 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
7007 insn16
= N16_BFMI333 (SEH33
, N32_RT5 (insn
), N32_RA5 (insn
));
7008 insn_type
= NDS32_INSN_SEH33
;
7013 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
))
7016 insn16
= N16_TYPE45 (SLT45
, N32_RA54 (insn
), N32_RB5 (insn
));
7017 insn_type
= NDS32_INSN_SLT45
;
7022 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
))
7025 insn16
= N16_TYPE45 (SLTS45
, N32_RA54 (insn
), N32_RB5 (insn
));
7026 insn_type
= NDS32_INSN_SLTS45
;
7031 if ((insn16
& 0x8000) == 0)
7037 *pinsn_type
= insn_type
;
7042 nds32_convert_32_to_16_alu2 (bfd
*abfd
, uint32_t insn
, uint16_t *pinsn16
,
7045 uint16_t insn16
= 0;
7047 unsigned long mach
= bfd_get_mach (abfd
);
7049 /* TODO: bset, bclr, btgl, btst. */
7050 if (__GF (insn
, 6, 4) != 0)
7053 switch (N32_IMMU (insn
, 6))
7056 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7057 && N32_IS_RB3 (insn
))
7059 if (N32_RT5 (insn
) == N32_RA5 (insn
))
7060 insn16
= N16_MISC33 (MUL33
, N32_RT5 (insn
), N32_RB5 (insn
));
7061 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
7062 insn16
= N16_MISC33 (MUL33
, N32_RT5 (insn
), N32_RA5 (insn
));
7064 insn_type
= NDS32_INSN_MUL33
;
7068 if ((insn16
& 0x8000) == 0)
7074 *pinsn_type
= insn_type
;
7079 nds32_convert_32_to_16 (bfd
*abfd
, uint32_t insn
, uint16_t *pinsn16
,
7083 uint16_t insn16
= 0;
7085 unsigned long mach
= bfd_get_mach (abfd
);
7087 /* Decode 32-bit instruction. */
7088 if (insn
& 0x80000000)
7090 /* Not 32-bit insn. */
7094 op6
= N32_OP6 (insn
);
7096 /* Convert it to 16-bit instruction. */
7100 if (IS_WITHIN_S (N32_IMM20S (insn
), 5))
7102 insn16
= N16_TYPE55 (MOVI55
, N32_RT5 (insn
), N32_IMM20S (insn
));
7103 insn_type
= NDS32_INSN_MOVI55
;
7105 else if (mach
>= MACH_V3
&& N32_IMM20S (insn
) >= 16
7106 && N32_IMM20S (insn
) < 48 && N32_IS_RT4 (insn
))
7108 insn16
= N16_TYPE45 (MOVPI45
, N32_RT54 (insn
),
7109 N32_IMM20S (insn
) - 16);
7110 insn_type
= NDS32_INSN_MOVPI45
;
7115 if (N32_IMM15S (insn
) == 0)
7117 /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
7118 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
7120 || N32_RT5 (insn
) != REG_SP
|| N32_RA5 (insn
) != REG_SP
)
7122 insn16
= N16_TYPE55 (MOV55
, N32_RT5 (insn
), N32_RA5 (insn
));
7123 insn_type
= NDS32_INSN_MOV55
;
7126 else if (N32_IMM15S (insn
) > 0)
7128 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IMM15S (insn
) < 8)
7130 insn16
= N16_TYPE333 (ADDI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7132 insn_type
= NDS32_INSN_ADDI333
;
7134 else if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
)
7135 && N32_IMM15S (insn
) < 32)
7137 insn16
= N16_TYPE45 (ADDI45
, N32_RT54 (insn
), N32_IMM15S (insn
));
7138 insn_type
= NDS32_INSN_ADDI45
;
7140 else if (mach
>= MACH_V2
&& N32_RT5 (insn
) == REG_SP
7141 && N32_RT5 (insn
) == N32_RA5 (insn
)
7142 && N32_IMM15S (insn
) < 512)
7144 insn16
= N16_TYPE10 (ADDI10S
, N32_IMM15S (insn
));
7145 insn_type
= NDS32_INSN_ADDI10_SP
;
7147 else if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
)
7148 && N32_RA5 (insn
) == REG_SP
&& N32_IMM15S (insn
) < 256
7149 && (N32_IMM15S (insn
) % 4 == 0))
7151 insn16
= N16_TYPE36 (ADDRI36_SP
, N32_RT5 (insn
),
7152 N32_IMM15S (insn
) >> 2);
7153 insn_type
= NDS32_INSN_ADDRI36_SP
;
7159 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IMM15S (insn
) > -8)
7161 insn16
= N16_TYPE333 (SUBI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7162 0 - N32_IMM15S (insn
));
7163 insn_type
= NDS32_INSN_SUBI333
;
7165 else if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
)
7166 && N32_IMM15S (insn
) > -32)
7168 insn16
= N16_TYPE45 (SUBI45
, N32_RT54 (insn
),
7169 0 - N32_IMM15S (insn
));
7170 insn_type
= NDS32_INSN_SUBI45
;
7172 else if (mach
>= MACH_V2
&& N32_RT5 (insn
) == REG_SP
7173 && N32_RT5 (insn
) == N32_RA5 (insn
)
7174 && N32_IMM15S (insn
) >= -512)
7176 insn16
= N16_TYPE10 (ADDI10S
, N32_IMM15S (insn
));
7177 insn_type
= NDS32_INSN_ADDI10_SP
;
7183 if (N32_IMM15S (insn
) == 0)
7185 /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
7186 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
7188 || N32_RT5 (insn
) != REG_SP
|| N32_RA5 (insn
) != REG_SP
)
7190 insn16
= N16_TYPE55 (MOV55
, N32_RT5 (insn
), N32_RA5 (insn
));
7191 insn_type
= NDS32_INSN_MOV55
;
7197 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
)
7198 && N32_IS_RA3 (insn
) && N32_IMM15S (insn
) == 0)
7200 insn16
= N16_MISC33 (NEG33
, N32_RT5 (insn
), N32_RA5 (insn
));
7201 insn_type
= NDS32_INSN_NEG33
;
7206 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
7208 if (N32_IMM15U (insn
) == 1)
7210 insn16
= N16_BFMI333 (XLSB33
, N32_RT5 (insn
), N32_RA5 (insn
));
7211 insn_type
= NDS32_INSN_XLSB33
;
7213 else if (N32_IMM15U (insn
) == 0x7ff)
7215 insn16
= N16_BFMI333 (X11B33
, N32_RT5 (insn
), N32_RA5 (insn
));
7216 insn_type
= NDS32_INSN_X11B33
;
7218 else if (N32_IMM15U (insn
) == 0xff)
7220 insn16
= N16_BFMI333 (ZEB33
, N32_RT5 (insn
), N32_RA5 (insn
));
7221 insn_type
= NDS32_INSN_ZEB33
;
7223 else if (mach
>= MACH_V3
&& N32_RT5 (insn
) == N32_RA5 (insn
)
7224 && N32_IMM15U (insn
) < 256)
7226 int imm15u
= N32_IMM15U (insn
);
7228 if (__builtin_popcount (imm15u
) == 1)
7231 int imm3u
= __builtin_ctz (imm15u
);
7233 insn16
= N16_BFMI333 (BMSKI33
, N32_RT5 (insn
), imm3u
);
7234 insn_type
= NDS32_INSN_BMSKI33
;
7236 else if (imm15u
!= 0 && __builtin_popcount (imm15u
+ 1) == 1)
7239 int imm3u
= __builtin_ctz (imm15u
+ 1) - 1;
7241 insn16
= N16_BFMI333 (FEXTI33
, N32_RT5 (insn
), imm3u
);
7242 insn_type
= NDS32_INSN_FEXTI33
;
7249 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
)
7250 && IS_WITHIN_U (N32_IMM15S (insn
), 5))
7252 insn16
= N16_TYPE45 (SLTI45
, N32_RA54 (insn
), N32_IMM15S (insn
));
7253 insn_type
= NDS32_INSN_SLTI45
;
7258 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
)
7259 && IS_WITHIN_U (N32_IMM15S (insn
), 5))
7261 insn16
= N16_TYPE45 (SLTSI45
, N32_RA54 (insn
), N32_IMM15S (insn
));
7262 insn_type
= NDS32_INSN_SLTSI45
;
7267 if (N32_IS_RT4 (insn
) && N32_IMM15S (insn
) == 0)
7269 insn16
= N16_TYPE45 (LWI450
, N32_RT54 (insn
), N32_RA5 (insn
));
7270 insn_type
= NDS32_INSN_LWI450
;
7272 else if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7273 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7275 insn16
= N16_TYPE333 (LWI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7277 insn_type
= NDS32_INSN_LWI333
;
7279 else if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_FP
7280 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7282 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 0, N32_IMM15S (insn
));
7283 insn_type
= NDS32_INSN_LWI37
;
7285 else if (mach
>= MACH_V2
&& N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_SP
7286 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7288 insn16
= N16_TYPE37 (XWI37SP
, N32_RT5 (insn
), 0, N32_IMM15S (insn
));
7289 insn_type
= NDS32_INSN_LWI37_SP
;
7291 else if (mach
>= MACH_V2
&& N32_IS_RT4 (insn
) && N32_RA5 (insn
) == REG_R8
7292 && -32 <= N32_IMM15S (insn
) && N32_IMM15S (insn
) < 0)
7294 insn16
= N16_TYPE45 (LWI45_FE
, N32_RT54 (insn
),
7295 N32_IMM15S (insn
) + 32);
7296 insn_type
= NDS32_INSN_LWI45_FE
;
7301 if (N32_IS_RT4 (insn
) && N32_IMM15S (insn
) == 0)
7303 insn16
= N16_TYPE45 (SWI450
, N32_RT54 (insn
), N32_RA5 (insn
));
7304 insn_type
= NDS32_INSN_SWI450
;
7306 else if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7307 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7309 insn16
= N16_TYPE333 (SWI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7311 insn_type
= NDS32_INSN_SWI333
;
7313 else if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_FP
7314 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7316 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 1, N32_IMM15S (insn
));
7317 insn_type
= NDS32_INSN_SWI37
;
7319 else if (mach
>= MACH_V2
&& N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_SP
7320 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7322 insn16
= N16_TYPE37 (XWI37SP
, N32_RT5 (insn
), 1, N32_IMM15S (insn
));
7323 insn_type
= NDS32_INSN_SWI37_SP
;
7327 case N32_OP6_LWI_BI
:
7328 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7329 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7331 insn16
= N16_TYPE333 (LWI333_BI
, N32_RT5 (insn
), N32_RA5 (insn
),
7333 insn_type
= NDS32_INSN_LWI333_BI
;
7337 case N32_OP6_SWI_BI
:
7338 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7339 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7341 insn16
= N16_TYPE333 (SWI333_BI
, N32_RT5 (insn
), N32_RA5 (insn
),
7343 insn_type
= NDS32_INSN_SWI333_BI
;
7348 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7349 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7351 insn16
= N16_TYPE333 (LHI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7353 insn_type
= NDS32_INSN_LHI333
;
7358 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7359 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7361 insn16
= N16_TYPE333 (SHI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7363 insn_type
= NDS32_INSN_SHI333
;
7368 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7369 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7371 insn16
= N16_TYPE333 (LBI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7373 insn_type
= NDS32_INSN_LBI333
;
7378 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7379 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7381 insn16
= N16_TYPE333 (SBI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7383 insn_type
= NDS32_INSN_SBI333
;
7388 return nds32_convert_32_to_16_alu1 (abfd
, insn
, pinsn16
, pinsn_type
);
7391 return nds32_convert_32_to_16_alu2 (abfd
, insn
, pinsn16
, pinsn_type
);
7394 if (!IS_WITHIN_S (N32_IMM14S (insn
), 8))
7397 if ((insn
& __BIT (14)) == 0)
7400 if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_R5
7401 && N32_RT5 (insn
) != REG_R5
)
7402 insn16
= N16_TYPE38 (BEQS38
, N32_RT5 (insn
), N32_IMM14S (insn
));
7403 else if (N32_IS_RA3 (insn
) && N32_RT5 (insn
) == REG_R5
7404 && N32_RA5 (insn
) != REG_R5
)
7405 insn16
= N16_TYPE38 (BEQS38
, N32_RA5 (insn
), N32_IMM14S (insn
));
7406 insn_type
= NDS32_INSN_BEQS38
;
7412 if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_R5
7413 && N32_RT5 (insn
) != REG_R5
)
7414 insn16
= N16_TYPE38 (BNES38
, N32_RT5 (insn
), N32_IMM14S (insn
));
7415 else if (N32_IS_RA3 (insn
) && N32_RT5 (insn
) == REG_R5
7416 && N32_RA5 (insn
) != REG_R5
)
7417 insn16
= N16_TYPE38 (BNES38
, N32_RA5 (insn
), N32_IMM14S (insn
));
7418 insn_type
= NDS32_INSN_BNES38
;
7424 switch (N32_BR2_SUB (insn
))
7427 if (N32_IS_RT3 (insn
) && IS_WITHIN_S (N32_IMM16S (insn
), 8))
7429 insn16
= N16_TYPE38 (BEQZ38
, N32_RT5 (insn
), N32_IMM16S (insn
));
7430 insn_type
= NDS32_INSN_BEQZ38
;
7432 else if (N32_RT5 (insn
) == REG_R15
7433 && IS_WITHIN_S (N32_IMM16S (insn
), 8))
7435 insn16
= N16_TYPE8 (BEQZS8
, N32_IMM16S (insn
));
7436 insn_type
= NDS32_INSN_BEQZS8
;
7441 if (N32_IS_RT3 (insn
) && IS_WITHIN_S (N32_IMM16S (insn
), 8))
7443 insn16
= N16_TYPE38 (BNEZ38
, N32_RT5 (insn
), N32_IMM16S (insn
));
7444 insn_type
= NDS32_INSN_BNEZ38
;
7446 else if (N32_RT5 (insn
) == REG_R15
7447 && IS_WITHIN_S (N32_IMM16S (insn
), 8))
7449 insn16
= N16_TYPE8 (BNEZS8
, N32_IMM16S (insn
));
7450 insn_type
= NDS32_INSN_BNEZS8
;
7454 case N32_BR2_IFCALL
:
7455 if (IS_WITHIN_U (N32_IMM16S (insn
), 9))
7457 insn16
= N16_TYPE9 (IFCALL9
, N32_IMM16S (insn
));
7458 insn_type
= NDS32_INSN_IFCALL9
;
7465 if ((insn
& __BIT (24)) == 0)
7468 if (IS_WITHIN_S (N32_IMM24S (insn
), 8))
7470 insn16
= N16_TYPE8 (J8
, N32_IMM24S (insn
));
7471 insn_type
= NDS32_INSN_J8
;
7477 if (__GF (insn
, 8, 2) != 0)
7480 switch (N32_IMMU (insn
, 5))
7483 if (N32_JREG_HINT (insn
) == 0)
7486 insn16
= N16_TYPE5 (JR5
, N32_RB5 (insn
));
7487 insn_type
= NDS32_INSN_JR5
;
7489 else if (N32_JREG_HINT (insn
) == 1)
7492 insn16
= N16_TYPE5 (RET5
, N32_RB5 (insn
));
7493 insn_type
= NDS32_INSN_RET5
;
7495 else if (N32_JREG_HINT (insn
) == 3)
7497 /* ifret = mov55 $sp, $sp */
7498 insn16
= N16_TYPE55 (MOV55
, REG_SP
, REG_SP
);
7499 insn_type
= NDS32_INSN_IFRET
;
7504 /* It's convertible when return rt5 is $lp and address
7505 translation is kept. */
7506 if (N32_RT5 (insn
) == REG_LP
&& N32_JREG_HINT (insn
) == 0)
7508 insn16
= N16_TYPE5 (JRAL5
, N32_RB5 (insn
));
7509 insn_type
= NDS32_INSN_JRAL5
;
7516 if (N32_SUB5 (insn
) == N32_MISC_BREAK
&& N32_SWID (insn
) < 32)
7518 /* For v3, swid above 31 are used for ex9.it. */
7519 insn16
= N16_TYPE5 (BREAK16
, N32_SWID (insn
));
7520 insn_type
= NDS32_INSN_BREAK16
;
7525 /* This instruction has no 16-bit variant. */
7530 /* Bit-15 of insn16 should be set for a valid instruction. */
7531 if ((insn16
& 0x8000) == 0)
7537 *pinsn_type
= insn_type
;
7542 special_convert_32_to_16 (unsigned long insn
, uint16_t *pinsn16
,
7543 Elf_Internal_Rela
*reloc
)
7545 uint16_t insn16
= 0;
7547 if ((reloc
->r_addend
& R_NDS32_INSN16_FP7U2_FLAG
) == 0
7548 || (ELF32_R_TYPE (reloc
->r_info
) != R_NDS32_INSN16
))
7551 if (!N32_IS_RT3 (insn
))
7554 switch (N32_OP6 (insn
))
7557 if (N32_RA5 (insn
) == REG_GP
&& IS_WITHIN_U (N32_IMM15S (insn
), 7))
7558 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 0, N32_IMM15S (insn
));
7561 if (N32_RA5 (insn
) == REG_GP
&& IS_WITHIN_U (N32_IMM15S (insn
), 7))
7562 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 1, N32_IMM15S (insn
));
7565 if (!IS_WITHIN_U (N32_IMM17S (insn
), 7))
7568 if (__GF (insn
, 17, 3) == 6)
7569 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 0, N32_IMM17S (insn
));
7570 else if (__GF (insn
, 17, 3) == 7)
7571 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 1, N32_IMM17S (insn
));
7575 if ((insn16
& 0x8000) == 0)
7582 /* Convert a 16-bit instruction to 32-bit one.
7583 INSN16 it the input and PINSN it the point to output.
7584 Return non-zero on successful. Otherwise 0 is returned. */
7587 nds32_convert_16_to_32 (bfd
*abfd
, uint16_t insn16
, uint32_t *pinsn
)
7589 uint32_t insn
= 0xffffffff;
7590 unsigned long mach
= bfd_get_mach (abfd
);
7592 /* NOTE: push25, pop25 and movd44 do not have 32-bit variants. */
7594 switch (__GF (insn16
, 9, 6))
7596 case 0x4: /* add45 */
7597 insn
= N32_ALU1 (ADD
, N16_RT4 (insn16
), N16_RT4 (insn16
),
7600 case 0x5: /* sub45 */
7601 insn
= N32_ALU1 (SUB
, N16_RT4 (insn16
), N16_RT4 (insn16
),
7604 case 0x6: /* addi45 */
7605 insn
= N32_TYPE2 (ADDI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
7606 N16_IMM5U (insn16
));
7608 case 0x7: /* subi45 */
7609 insn
= N32_TYPE2 (ADDI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
7610 -N16_IMM5U (insn16
));
7612 case 0x8: /* srai45 */
7613 insn
= N32_ALU1 (SRAI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
7614 N16_IMM5U (insn16
));
7616 case 0x9: /* srli45 */
7617 insn
= N32_ALU1 (SRLI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
7618 N16_IMM5U (insn16
));
7620 case 0xa: /* slli333 */
7621 insn
= N32_ALU1 (SLLI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7622 N16_IMM3U (insn16
));
7624 case 0xc: /* add333 */
7625 insn
= N32_ALU1 (ADD
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7628 case 0xd: /* sub333 */
7629 insn
= N32_ALU1 (SUB
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7632 case 0xe: /* addi333 */
7633 insn
= N32_TYPE2 (ADDI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7634 N16_IMM3U (insn16
));
7636 case 0xf: /* subi333 */
7637 insn
= N32_TYPE2 (ADDI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7638 -N16_IMM3U (insn16
));
7640 case 0x10: /* lwi333 */
7641 insn
= N32_TYPE2 (LWI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7642 N16_IMM3U (insn16
));
7644 case 0x12: /* lhi333 */
7645 insn
= N32_TYPE2 (LHI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7646 N16_IMM3U (insn16
));
7648 case 0x13: /* lbi333 */
7649 insn
= N32_TYPE2 (LBI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7650 N16_IMM3U (insn16
));
7652 case 0x11: /* lwi333.bi */
7653 insn
= N32_TYPE2 (LWI_BI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7654 N16_IMM3U (insn16
));
7656 case 0x14: /* swi333 */
7657 insn
= N32_TYPE2 (SWI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7658 N16_IMM3U (insn16
));
7660 case 0x16: /* shi333 */
7661 insn
= N32_TYPE2 (SHI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7662 N16_IMM3U (insn16
));
7664 case 0x17: /* sbi333 */
7665 insn
= N32_TYPE2 (SBI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7666 N16_IMM3U (insn16
));
7668 case 0x15: /* swi333.bi */
7669 insn
= N32_TYPE2 (SWI_BI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7670 N16_IMM3U (insn16
));
7672 case 0x18: /* addri36.sp */
7673 insn
= N32_TYPE2 (ADDI
, N16_RT3 (insn16
), REG_SP
,
7674 N16_IMM6U (insn16
) << 2);
7676 case 0x19: /* lwi45.fe */
7677 insn
= N32_TYPE2 (LWI
, N16_RT4 (insn16
), REG_R8
,
7678 (N16_IMM5U (insn16
) - 32));
7680 case 0x1a: /* lwi450 */
7681 insn
= N32_TYPE2 (LWI
, N16_RT4 (insn16
), N16_RA5 (insn16
), 0);
7683 case 0x1b: /* swi450 */
7684 insn
= N32_TYPE2 (SWI
, N16_RT4 (insn16
), N16_RA5 (insn16
), 0);
7687 /* These are r15 implied instructions. */
7688 case 0x30: /* slts45 */
7689 insn
= N32_ALU1 (SLTS
, REG_TA
, N16_RT4 (insn16
), N16_RA5 (insn16
));
7691 case 0x31: /* slt45 */
7692 insn
= N32_ALU1 (SLT
, REG_TA
, N16_RT4 (insn16
), N16_RA5 (insn16
));
7694 case 0x32: /* sltsi45 */
7695 insn
= N32_TYPE2 (SLTSI
, REG_TA
, N16_RT4 (insn16
), N16_IMM5U (insn16
));
7697 case 0x33: /* slti45 */
7698 insn
= N32_TYPE2 (SLTI
, REG_TA
, N16_RT4 (insn16
), N16_IMM5U (insn16
));
7700 case 0x34: /* beqzs8, bnezs8 */
7701 if (insn16
& __BIT (8))
7702 insn
= N32_BR2 (BNEZ
, REG_TA
, N16_IMM8S (insn16
));
7704 insn
= N32_BR2 (BEQZ
, REG_TA
, N16_IMM8S (insn16
));
7707 case 0x35: /* break16, ex9.it */
7708 /* Only consider range of v3 break16. */
7709 insn
= N32_TYPE0 (MISC
, (N16_IMM5U (insn16
) << 5) | N32_MISC_BREAK
);
7712 case 0x3c: /* ifcall9 */
7713 insn
= N32_BR2 (IFCALL
, 0, N16_IMM9U (insn16
));
7715 case 0x3d: /* movpi45 */
7716 insn
= N32_TYPE1 (MOVI
, N16_RT4 (insn16
), N16_IMM5U (insn16
) + 16);
7719 case 0x3f: /* MISC33 */
7720 switch (insn16
& 0x7)
7723 insn
= N32_TYPE2 (SUBRI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
7726 insn
= N32_ALU1 (NOR
, N16_RT3 (insn16
), N16_RA3 (insn16
),
7730 insn
= N32_ALU2 (MUL
, N16_RT3 (insn16
), N16_RT3 (insn16
),
7734 insn
= N32_ALU1 (XOR
, N16_RT3 (insn16
), N16_RT3 (insn16
),
7738 insn
= N32_ALU1 (AND
, N16_RT3 (insn16
), N16_RT3 (insn16
),
7742 insn
= N32_ALU1 (OR
, N16_RT3 (insn16
), N16_RT3 (insn16
),
7749 switch (insn16
& 0x7)
7752 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0xff);
7755 insn
= N32_ALU1 (ZEH
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
7758 insn
= N32_ALU1 (SEB
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
7761 insn
= N32_ALU1 (SEH
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
7763 case 4: /* xlsb33 */
7764 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 1);
7766 case 5: /* x11b33 */
7767 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0x7ff);
7769 case 6: /* bmski33 */
7770 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RT3 (insn16
),
7771 1 << __GF (insn16
, 3, 3));
7773 case 7: /* fexti33 */
7774 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RT3 (insn16
),
7775 (1 << (__GF (insn16
, 3, 3) + 1)) - 1);
7781 switch (__GF (insn16
, 10, 5))
7783 case 0x0: /* mov55 or ifret16 */
7784 if (mach
>= MACH_V3
&& N16_RT5 (insn16
) == REG_SP
7785 && N16_RT5 (insn16
) == N16_RA5 (insn16
))
7786 insn
= N32_JREG (JR
, 0, 0, 0, 3);
7788 insn
= N32_TYPE2 (ADDI
, N16_RT5 (insn16
), N16_RA5 (insn16
), 0);
7790 case 0x1: /* movi55 */
7791 insn
= N32_TYPE1 (MOVI
, N16_RT5 (insn16
), N16_IMM5S (insn16
));
7793 case 0x1b: /* addi10s (V2) */
7794 insn
= N32_TYPE2 (ADDI
, REG_SP
, REG_SP
, N16_IMM10S (insn16
));
7798 switch (__GF (insn16
, 11, 4))
7800 case 0x7: /* lwi37.fp/swi37.fp */
7801 if (insn16
& __BIT (7)) /* swi37.fp */
7802 insn
= N32_TYPE2 (SWI
, N16_RT38 (insn16
), REG_FP
, N16_IMM7U (insn16
));
7804 insn
= N32_TYPE2 (LWI
, N16_RT38 (insn16
), REG_FP
, N16_IMM7U (insn16
));
7806 case 0x8: /* beqz38 */
7807 insn
= N32_BR2 (BEQZ
, N16_RT38 (insn16
), N16_IMM8S (insn16
));
7809 case 0x9: /* bnez38 */
7810 insn
= N32_BR2 (BNEZ
, N16_RT38 (insn16
), N16_IMM8S (insn16
));
7812 case 0xa: /* beqs38/j8, implied r5 */
7813 if (N16_RT38 (insn16
) == 5)
7814 insn
= N32_JI (J
, N16_IMM8S (insn16
));
7816 insn
= N32_BR1 (BEQ
, N16_RT38 (insn16
), REG_R5
, N16_IMM8S (insn16
));
7818 case 0xb: /* bnes38 and others */
7819 if (N16_RT38 (insn16
) == 5)
7821 switch (__GF (insn16
, 5, 3))
7824 insn
= N32_JREG (JR
, 0, N16_RA5 (insn16
), 0, 0);
7827 insn
= N32_JREG (JR
, 0, N16_RA5 (insn16
), 0, 1);
7830 insn
= N32_JREG (JRAL
, REG_LP
, N16_RA5 (insn16
), 0, 0);
7832 case 2: /* ex9.it imm5 */
7833 /* ex9.it had no 32-bit variantl. */
7835 case 5: /* add5.pc */
7836 /* add5.pc had no 32-bit variantl. */
7841 insn
= N32_BR1 (BNE
, N16_RT38 (insn16
), REG_R5
, N16_IMM8S (insn16
));
7843 case 0xe: /* lwi37/swi37 */
7844 if (insn16
& (1 << 7)) /* swi37.sp */
7845 insn
= N32_TYPE2 (SWI
, N16_RT38 (insn16
), REG_SP
, N16_IMM7U (insn16
));
7847 insn
= N32_TYPE2 (LWI
, N16_RT38 (insn16
), REG_SP
, N16_IMM7U (insn16
));
7852 if (insn
& 0x80000000)
7861 is_sda_access_insn (unsigned long insn
)
7863 switch (N32_OP6 (insn
))
7884 static unsigned long
7885 turn_insn_to_sda_access (uint32_t insn
, bfd_signed_vma type
, uint32_t *pinsn
)
7891 case R_NDS32_GOT_LO12
:
7892 case R_NDS32_GOTOFF_LO12
:
7893 case R_NDS32_PLTREL_LO12
:
7894 case R_NDS32_PLT_GOTREL_LO12
:
7895 case R_NDS32_LO12S0_RELA
:
7896 switch (N32_OP6 (insn
))
7900 oinsn
= N32_TYPE1 (LBGP
, N32_RT5 (insn
), 0);
7904 oinsn
= N32_TYPE1 (LBGP
, N32_RT5 (insn
), __BIT (19));
7908 oinsn
= N32_TYPE1 (SBGP
, N32_RT5 (insn
), 0);
7912 oinsn
= N32_TYPE1 (SBGP
, N32_RT5 (insn
), __BIT (19));
7917 case R_NDS32_LO12S1_RELA
:
7918 switch (N32_OP6 (insn
))
7922 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), 0);
7926 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __BIT (18));
7930 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __BIT (19));
7935 case R_NDS32_LO12S2_RELA
:
7936 switch (N32_OP6 (insn
))
7940 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __MF (6, 17, 3));
7944 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __MF (7, 17, 3));
7949 case R_NDS32_LO12S2_DP_RELA
:
7950 case R_NDS32_LO12S2_SP_RELA
:
7951 oinsn
= (insn
& 0x7ff07000) | (REG_GP
<< 15);
7961 /* Linker hasn't found the correct merge section for non-section symbol
7962 in relax time, this work is left to the function elf_link_input_bfd().
7963 So for non-section symbol, _bfd_merged_section_offset is also needed
7964 to find the correct symbol address. */
7967 nds32_elf_rela_local_sym (bfd
*abfd
, Elf_Internal_Sym
*sym
,
7968 asection
**psec
, Elf_Internal_Rela
*rel
)
7970 asection
*sec
= *psec
;
7973 relocation
= (sec
->output_section
->vma
7974 + sec
->output_offset
+ sym
->st_value
);
7975 if ((sec
->flags
& SEC_MERGE
) && sec
->sec_info_type
== SEC_INFO_TYPE_MERGE
)
7977 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
7979 _bfd_merged_section_offset (abfd
, psec
,
7980 elf_section_data (sec
)->sec_info
,
7981 sym
->st_value
+ rel
->r_addend
);
7984 _bfd_merged_section_offset (abfd
, psec
,
7985 elf_section_data (sec
)->sec_info
,
7986 sym
->st_value
) + rel
->r_addend
;
7990 /* If we have changed the section, and our original section is
7991 marked with SEC_EXCLUDE, it means that the original
7992 SEC_MERGE section has been completely subsumed in some
7993 other SEC_MERGE section. In this case, we need to leave
7994 some info around for --emit-relocs. */
7995 if ((sec
->flags
& SEC_EXCLUDE
) != 0)
7996 sec
->kept_section
= *psec
;
7999 rel
->r_addend
-= relocation
;
8000 rel
->r_addend
+= sec
->output_section
->vma
+ sec
->output_offset
;
8006 calculate_memory_address (bfd
*abfd
, Elf_Internal_Rela
*irel
,
8007 Elf_Internal_Sym
*isymbuf
,
8008 Elf_Internal_Shdr
*symtab_hdr
)
8010 bfd_signed_vma foff
;
8011 bfd_vma symval
, addend
;
8012 Elf_Internal_Rela irel_fn
;
8013 Elf_Internal_Sym
*isym
;
8016 /* Get the value of the symbol referred to by the reloc. */
8017 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
8019 /* A local symbol. */
8020 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
8022 if (isym
->st_shndx
== SHN_UNDEF
)
8023 sym_sec
= bfd_und_section_ptr
;
8024 else if (isym
->st_shndx
== SHN_ABS
)
8025 sym_sec
= bfd_abs_section_ptr
;
8026 else if (isym
->st_shndx
== SHN_COMMON
)
8027 sym_sec
= bfd_com_section_ptr
;
8029 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
8030 memcpy (&irel_fn
, irel
, sizeof (Elf_Internal_Rela
));
8031 symval
= nds32_elf_rela_local_sym (abfd
, isym
, &sym_sec
, &irel_fn
);
8032 addend
= irel_fn
.r_addend
;
8037 struct elf_link_hash_entry
*h
;
8039 /* An external symbol. */
8040 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
8041 h
= elf_sym_hashes (abfd
)[indx
];
8042 BFD_ASSERT (h
!= NULL
);
8044 while (h
->root
.type
== bfd_link_hash_indirect
8045 || h
->root
.type
== bfd_link_hash_warning
)
8046 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
8048 if (h
->root
.type
!= bfd_link_hash_defined
8049 && h
->root
.type
!= bfd_link_hash_defweak
)
8050 /* This appears to be a reference to an undefined
8051 symbol. Just ignore it--it will be caught by the
8052 regular reloc processing. */
8055 if (h
->root
.u
.def
.section
->flags
& SEC_MERGE
)
8057 sym_sec
= h
->root
.u
.def
.section
;
8058 symval
= _bfd_merged_section_offset (abfd
, &sym_sec
, elf_section_data
8059 (sym_sec
)->sec_info
, h
->root
.u
.def
.value
);
8060 symval
= symval
+ sym_sec
->output_section
->vma
8061 + sym_sec
->output_offset
;
8064 symval
= (h
->root
.u
.def
.value
8065 + h
->root
.u
.def
.section
->output_section
->vma
8066 + h
->root
.u
.def
.section
->output_offset
);
8067 addend
= irel
->r_addend
;
8070 foff
= symval
+ addend
;
8076 calculate_got_memory_address (bfd
*abfd
, struct bfd_link_info
*link_info
,
8077 Elf_Internal_Rela
*irel
,
8078 Elf_Internal_Shdr
*symtab_hdr
)
8081 bfd_vma
*local_got_offsets
;
8082 /* Get the value of the symbol referred to by the reloc. */
8083 struct elf_link_hash_entry
*h
;
8084 struct elf_nds32_link_hash_table
*htab
= nds32_elf_hash_table (link_info
);
8086 /* An external symbol. */
8087 symndx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
8088 h
= elf_sym_hashes (abfd
)[symndx
];
8089 while (h
->root
.type
== bfd_link_hash_indirect
8090 || h
->root
.type
== bfd_link_hash_warning
)
8091 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
8095 BFD_ASSERT (h
!= NULL
);
8096 return htab
->sgot
->output_section
->vma
+ htab
->sgot
->output_offset
8101 local_got_offsets
= elf_local_got_offsets (abfd
);
8102 BFD_ASSERT (local_got_offsets
!= NULL
);
8103 return htab
->sgot
->output_section
->vma
+ htab
->sgot
->output_offset
8104 + local_got_offsets
[ELF32_R_SYM (irel
->r_info
)];
8107 /* The _GLOBAL_OFFSET_TABLE_ may be undefweak(or should be?). */
8108 /* The check of h->root.type is passed. */
8112 is_16bit_NOP (bfd
*abfd ATTRIBUTE_UNUSED
,
8113 asection
*sec
, Elf_Internal_Rela
*rel
)
8116 unsigned short insn16
;
8118 if (!(rel
->r_addend
& R_NDS32_INSN16_CONVERT_FLAG
))
8120 contents
= elf_section_data (sec
)->this_hdr
.contents
;
8121 insn16
= bfd_getb16 (contents
+ rel
->r_offset
);
8122 if (insn16
== NDS32_NOP16
)
8127 /* It checks whether the instruction could be converted to
8128 16-bit form and returns the converted one.
8130 `internal_relocs' is supposed to be sorted. */
8133 is_convert_32_to_16 (bfd
*abfd
, asection
*sec
,
8134 Elf_Internal_Rela
*reloc
,
8135 Elf_Internal_Rela
*internal_relocs
,
8136 Elf_Internal_Rela
*irelend
,
8139 #define NORMAL_32_TO_16 (1 << 0)
8140 #define SPECIAL_32_TO_16 (1 << 1)
8141 bfd_byte
*contents
= NULL
;
8145 Elf_Internal_Rela
*pc_rel
;
8146 int pic_ext_target
= 0;
8147 Elf_Internal_Shdr
*symtab_hdr
;
8148 Elf_Internal_Sym
*isymbuf
= NULL
;
8152 if (reloc
->r_offset
+ 4 > sec
->size
)
8155 offset
= reloc
->r_offset
;
8157 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
))
8159 insn
= bfd_getb32 (contents
+ offset
);
8161 if (nds32_convert_32_to_16 (abfd
, insn
, insn16
, NULL
))
8162 convert_type
= NORMAL_32_TO_16
;
8163 else if (special_convert_32_to_16 (insn
, insn16
, reloc
))
8164 convert_type
= SPECIAL_32_TO_16
;
8168 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
8169 if (!nds32_get_local_syms (abfd
, sec
, &isymbuf
))
8172 /* Find the first relocation of the same relocation-type,
8173 so we iteratie them forward. */
8175 while ((pc_rel
- 1) >= internal_relocs
&& pc_rel
[-1].r_offset
== offset
)
8178 for (; pc_rel
< irelend
&& pc_rel
->r_offset
== offset
; pc_rel
++)
8180 if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_15_PCREL_RELA
8181 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17_PCREL_RELA
8182 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PCREL_RELA
8183 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PLTREL
)
8185 off
= calculate_offset (abfd
, sec
, pc_rel
, isymbuf
, symtab_hdr
,
8187 if (off
>= ACCURATE_8BIT_S1
|| off
< -ACCURATE_8BIT_S1
8192 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_20_RELA
)
8194 /* movi => movi55 */
8195 mem_addr
= calculate_memory_address (abfd
, pc_rel
, isymbuf
,
8197 /* mem_addr is unsigned, but the value should
8198 be between [-16, 15]. */
8199 if ((mem_addr
+ 0x10) >> 5)
8203 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_TLS_LE_20
)
8204 || (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_TLS_LE_LO12
))
8206 /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
8207 because it can be relaxed to addi for TLS_LE_ADD. */
8210 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA15S2_RELA
8211 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA17S2_RELA
)
8212 && (reloc
->r_addend
& R_NDS32_INSN16_FP7U2_FLAG
)
8213 && convert_type
== SPECIAL_32_TO_16
)
8216 We've selected a best fp-base for this access, so we can
8217 always resolve it anyway. Do nothing. */
8220 else if ((ELF32_R_TYPE (pc_rel
->r_info
) > R_NDS32_NONE
8221 && (ELF32_R_TYPE (pc_rel
->r_info
) < R_NDS32_RELA_GNU_VTINHERIT
))
8222 || ((ELF32_R_TYPE (pc_rel
->r_info
) > R_NDS32_RELA_GNU_VTENTRY
)
8223 && (ELF32_R_TYPE (pc_rel
->r_info
) < R_NDS32_INSN16
))
8224 || ((ELF32_R_TYPE (pc_rel
->r_info
) > R_NDS32_LOADSTORE
)
8225 && (ELF32_R_TYPE (pc_rel
->r_info
) < R_NDS32_DWARF2_OP1_RELA
)))
8227 /* Prevent unresolved addi instruction translate
8228 to addi45 or addi333. */
8231 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
))
8233 off
= calculate_offset (abfd
, sec
, pc_rel
, isymbuf
, symtab_hdr
,
8235 if (off
>= ACCURATE_U9BIT_S1
|| off
<= 0)
8245 nds32_elf_write_16 (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_byte
*contents
,
8246 Elf_Internal_Rela
*reloc
,
8247 Elf_Internal_Rela
*internal_relocs
,
8248 Elf_Internal_Rela
*irelend
,
8249 unsigned short insn16
)
8251 Elf_Internal_Rela
*pc_rel
;
8254 offset
= reloc
->r_offset
;
8255 bfd_putb16 (insn16
, contents
+ offset
);
8256 /* Find the first relocation of the same relocation-type,
8257 so we iteratie them forward. */
8259 while ((pc_rel
- 1) > internal_relocs
&& pc_rel
[-1].r_offset
== offset
)
8262 for (; pc_rel
< irelend
&& pc_rel
->r_offset
== offset
; pc_rel
++)
8264 if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_15_PCREL_RELA
8265 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17_PCREL_RELA
8266 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PCREL_RELA
)
8269 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_9_PCREL_RELA
);
8271 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PLTREL
)
8273 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_9_PLTREL
);
8274 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_20_RELA
)
8276 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_5_RELA
);
8277 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA15S2_RELA
8278 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA17S2_RELA
)
8280 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_SDA_FP7U2_RELA
);
8281 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
))
8283 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_10IFCU_PCREL_RELA
);
8287 /* Find a relocation of type specified by `reloc_type'
8288 of the same r_offset with reloc.
8289 If not found, return irelend.
8291 Assuming relocations are sorted by r_offset,
8292 we find the relocation from `reloc' backward untill relocs,
8293 or find it from `reloc' forward untill irelend. */
8295 static Elf_Internal_Rela
*
8296 find_relocs_at_address (Elf_Internal_Rela
*reloc
,
8297 Elf_Internal_Rela
*relocs
,
8298 Elf_Internal_Rela
*irelend
,
8299 enum elf_nds32_reloc_type reloc_type
)
8301 Elf_Internal_Rela
*rel_t
;
8303 /* Find backward. */
8305 rel_t
>= relocs
&& rel_t
->r_offset
== reloc
->r_offset
;
8307 if (ELF32_R_TYPE (rel_t
->r_info
) == reloc_type
)
8310 /* We didn't find it backward. Try find it forward. */
8312 rel_t
< irelend
&& rel_t
->r_offset
== reloc
->r_offset
;
8314 if (ELF32_R_TYPE (rel_t
->r_info
) == reloc_type
)
8320 /* Find a relocation of specified type and offset.
8321 `reloc' is just a refence point to find a relocation at specified offset.
8322 If not found, return irelend.
8324 Assuming relocations are sorted by r_offset,
8325 we find the relocation from `reloc' backward untill relocs,
8326 or find it from `reloc' forward untill irelend. */
8328 static Elf_Internal_Rela
*
8329 find_relocs_at_address_addr (Elf_Internal_Rela
*reloc
,
8330 Elf_Internal_Rela
*relocs
,
8331 Elf_Internal_Rela
*irelend
,
8332 enum elf_nds32_reloc_type reloc_type
,
8335 Elf_Internal_Rela
*rel_t
= NULL
;
8337 /* First, we try to find a relocation of offset `offset_p',
8338 and then we use find_relocs_at_address to find specific type. */
8340 if (reloc
->r_offset
> offset_p
)
8342 /* Find backward. */
8344 rel_t
>= relocs
&& rel_t
->r_offset
> offset_p
; rel_t
--)
8347 else if (reloc
->r_offset
< offset_p
)
8351 rel_t
< irelend
&& rel_t
->r_offset
< offset_p
; rel_t
++)
8358 if (rel_t
< relocs
|| rel_t
== irelend
|| rel_t
->r_offset
!= offset_p
)
8361 return find_relocs_at_address (rel_t
, relocs
, irelend
, reloc_type
);
8365 nds32_elf_check_dup_relocs (Elf_Internal_Rela
*reloc
,
8366 Elf_Internal_Rela
*internal_relocs
,
8367 Elf_Internal_Rela
*irelend
,
8368 unsigned char reloc_type
)
8370 Elf_Internal_Rela
*rel_t
;
8373 rel_t
>= internal_relocs
&& rel_t
->r_offset
== reloc
->r_offset
;
8375 if (ELF32_R_TYPE (rel_t
->r_info
) == reloc_type
)
8377 if (ELF32_R_SYM (rel_t
->r_info
) == ELF32_R_SYM (reloc
->r_info
)
8378 && rel_t
->r_addend
== reloc
->r_addend
)
8383 for (rel_t
= reloc
; rel_t
< irelend
&& rel_t
->r_offset
== reloc
->r_offset
;
8385 if (ELF32_R_TYPE (rel_t
->r_info
) == reloc_type
)
8387 if (ELF32_R_SYM (rel_t
->r_info
) == ELF32_R_SYM (reloc
->r_info
)
8388 && rel_t
->r_addend
== reloc
->r_addend
)
8396 typedef struct nds32_elf_blank nds32_elf_blank_t
;
8397 struct nds32_elf_blank
8399 /* Where the blank begins. */
8401 /* The size of the blank. */
8403 /* The accumulative size before this blank. */
8405 nds32_elf_blank_t
*next
;
8406 nds32_elf_blank_t
*prev
;
8409 static nds32_elf_blank_t
*blank_free_list
= NULL
;
8411 static nds32_elf_blank_t
*
8412 create_nds32_elf_blank (bfd_vma offset_p
, bfd_vma size_p
)
8414 nds32_elf_blank_t
*blank_t
;
8416 if (blank_free_list
)
8418 blank_t
= blank_free_list
;
8419 blank_free_list
= blank_free_list
->next
;
8422 blank_t
= bfd_malloc (sizeof (nds32_elf_blank_t
));
8424 if (blank_t
== NULL
)
8427 blank_t
->offset
= offset_p
;
8428 blank_t
->size
= size_p
;
8429 blank_t
->total_size
= 0;
8430 blank_t
->next
= NULL
;
8431 blank_t
->prev
= NULL
;
8437 remove_nds32_elf_blank (nds32_elf_blank_t
*blank_p
)
8439 if (blank_free_list
)
8441 blank_free_list
->prev
= blank_p
;
8442 blank_p
->next
= blank_free_list
;
8445 blank_p
->next
= NULL
;
8447 blank_p
->prev
= NULL
;
8448 blank_free_list
= blank_p
;
8452 clean_nds32_elf_blank (void)
8454 nds32_elf_blank_t
*blank_t
;
8456 while (blank_free_list
)
8458 blank_t
= blank_free_list
;
8459 blank_free_list
= blank_free_list
->next
;
8464 static nds32_elf_blank_t
*
8465 search_nds32_elf_blank (nds32_elf_blank_t
*blank_p
, bfd_vma addr
)
8467 nds32_elf_blank_t
*blank_t
;
8473 while (blank_t
&& addr
< blank_t
->offset
)
8474 blank_t
= blank_t
->prev
;
8475 while (blank_t
&& blank_t
->next
&& addr
>= blank_t
->next
->offset
)
8476 blank_t
= blank_t
->next
;
8482 get_nds32_elf_blank_total (nds32_elf_blank_t
**blank_p
, bfd_vma addr
,
8485 nds32_elf_blank_t
*blank_t
;
8487 blank_t
= search_nds32_elf_blank (*blank_p
, addr
);
8494 if (addr
< blank_t
->offset
+ blank_t
->size
)
8495 return blank_t
->total_size
+ (addr
- blank_t
->offset
);
8497 return blank_t
->total_size
+ blank_t
->size
;
8501 insert_nds32_elf_blank (nds32_elf_blank_t
**blank_p
, bfd_vma addr
, bfd_vma len
)
8503 nds32_elf_blank_t
*blank_t
, *blank_t2
;
8507 *blank_p
= create_nds32_elf_blank (addr
, len
);
8508 return *blank_p
? TRUE
: FALSE
;
8511 blank_t
= search_nds32_elf_blank (*blank_p
, addr
);
8513 if (blank_t
== NULL
)
8515 blank_t
= create_nds32_elf_blank (addr
, len
);
8518 while ((*blank_p
)->prev
!= NULL
)
8519 *blank_p
= (*blank_p
)->prev
;
8520 blank_t
->next
= *blank_p
;
8521 (*blank_p
)->prev
= blank_t
;
8522 (*blank_p
) = blank_t
;
8526 if (addr
< blank_t
->offset
+ blank_t
->size
)
8528 if (addr
> blank_t
->offset
+ blank_t
->size
)
8529 blank_t
->size
= addr
- blank_t
->offset
;
8533 blank_t2
= create_nds32_elf_blank (addr
, len
);
8538 blank_t
->next
->prev
= blank_t2
;
8539 blank_t2
->next
= blank_t
->next
;
8541 blank_t2
->prev
= blank_t
;
8542 blank_t
->next
= blank_t2
;
8543 *blank_p
= blank_t2
;
8550 insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t
**blank_p
, bfd_vma addr
,
8553 nds32_elf_blank_t
*blank_t
;
8555 if (!insert_nds32_elf_blank (blank_p
, addr
, len
))
8562 blank_t
->total_size
= 0;
8563 blank_t
= blank_t
->next
;
8568 blank_t
->total_size
= blank_t
->prev
->total_size
+ blank_t
->prev
->size
;
8569 blank_t
= blank_t
->next
;
8576 calc_nds32_blank_total (nds32_elf_blank_t
*blank_p
)
8578 nds32_elf_blank_t
*blank_t
;
8579 bfd_vma total_size
= 0;
8585 while (blank_t
->prev
)
8586 blank_t
= blank_t
->prev
;
8589 blank_t
->total_size
= total_size
;
8590 total_size
+= blank_t
->size
;
8591 blank_t
= blank_t
->next
;
8596 nds32_elf_relax_delete_blanks (bfd
*abfd
, asection
*sec
,
8597 nds32_elf_blank_t
*blank_p
)
8599 Elf_Internal_Shdr
*symtab_hdr
; /* Symbol table header of this bfd. */
8600 Elf_Internal_Sym
*isym
= NULL
; /* Symbol table of this bfd. */
8601 Elf_Internal_Sym
*isymend
; /* Symbol entry iterator. */
8602 unsigned int sec_shndx
; /* The section the be relaxed. */
8603 bfd_byte
*contents
; /* Contents data of iterating section. */
8604 Elf_Internal_Rela
*internal_relocs
;
8605 Elf_Internal_Rela
*irel
;
8606 Elf_Internal_Rela
*irelend
;
8607 struct elf_link_hash_entry
**sym_hashes
;
8608 struct elf_link_hash_entry
**end_hashes
;
8609 unsigned int symcount
;
8611 nds32_elf_blank_t
*blank_t
;
8612 nds32_elf_blank_t
*blank_t2
;
8613 nds32_elf_blank_t
*blank_head
;
8615 blank_head
= blank_t
= blank_p
;
8616 while (blank_head
->prev
!= NULL
)
8617 blank_head
= blank_head
->prev
;
8618 while (blank_t
->next
!= NULL
)
8619 blank_t
= blank_t
->next
;
8621 if (blank_t
->offset
+ blank_t
->size
<= sec
->size
)
8623 blank_t
->next
= create_nds32_elf_blank (sec
->size
+ 4, 0);
8624 blank_t
->next
->prev
= blank_t
;
8626 if (blank_head
->offset
> 0)
8628 blank_head
->prev
= create_nds32_elf_blank (0, 0);
8629 blank_head
->prev
->next
= blank_head
;
8630 blank_head
= blank_head
->prev
;
8633 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
8635 /* The deletion must stop at the next ALIGN reloc for an alignment
8636 power larger than the number of bytes we are deleting. */
8638 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
8639 if (!nds32_get_local_syms (abfd
, sec
, &isym
))
8644 isym
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
8645 symtab_hdr
->sh_info
, 0, NULL
, NULL
, NULL
);
8646 symtab_hdr
->contents
= (bfd_byte
*) isym
;
8649 if (isym
== NULL
|| symtab_hdr
->sh_info
== 0)
8652 blank_t
= blank_head
;
8653 calc_nds32_blank_total (blank_head
);
8655 for (sect
= abfd
->sections
; sect
!= NULL
; sect
= sect
->next
)
8657 /* Adjust all the relocs. */
8659 /* Relocations MUST be kept in memory, because relaxation adjust them. */
8660 internal_relocs
= _bfd_elf_link_read_relocs (abfd
, sect
, NULL
, NULL
,
8661 TRUE
/* keep_memory */);
8662 irelend
= internal_relocs
+ sect
->reloc_count
;
8664 blank_t
= blank_head
;
8665 blank_t2
= blank_head
;
8667 if (!(sect
->flags
& SEC_RELOC
))
8670 nds32_get_section_contents (abfd
, sect
, &contents
, TRUE
);
8672 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
8676 if (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_DIFF8
8677 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_DIFF32
8678 && isym
[ELF32_R_SYM (irel
->r_info
)].st_shndx
== sec_shndx
)
8680 unsigned long val
= 0;
8682 long before
, between
;
8685 switch (ELF32_R_TYPE (irel
->r_info
))
8688 offset
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
);
8690 case R_NDS32_DIFF16
:
8691 offset
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
);
8693 case R_NDS32_DIFF32
:
8694 val
= bfd_get_32 (abfd
, contents
+ irel
->r_offset
);
8695 /* Get the signed bit and mask for the high part. The
8696 gcc will alarm when right shift 32-bit since the
8697 type size of long may be 32-bit. */
8698 mask
= 0 - (val
>> 31);
8700 offset
= (val
| (mask
- 0xffffffff));
8709 0 |encoded in location|
8710 |------------|-------------------|---------
8712 -- before ---| *****************
8713 --------------------- between ---|
8715 We only care how much data are relax between DIFF,
8718 before
= get_nds32_elf_blank_total (&blank_t
, irel
->r_addend
, 0);
8719 between
= get_nds32_elf_blank_total (&blank_t
,
8720 irel
->r_addend
+ offset
, 0);
8721 if (between
== before
)
8722 goto done_adjust_diff
;
8724 switch (ELF32_R_TYPE (irel
->r_info
))
8727 bfd_put_8 (abfd
, offset
- (between
- before
),
8728 contents
+ irel
->r_offset
);
8730 case R_NDS32_DIFF16
:
8731 bfd_put_16 (abfd
, offset
- (between
- before
),
8732 contents
+ irel
->r_offset
);
8734 case R_NDS32_DIFF32
:
8735 bfd_put_32 (abfd
, offset
- (between
- before
),
8736 contents
+ irel
->r_offset
);
8740 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_DIFF_ULEB128
8741 && isym
[ELF32_R_SYM (irel
->r_info
)].st_shndx
== sec_shndx
)
8744 unsigned int len
= 0;
8745 unsigned long before
, between
;
8748 val
= read_unsigned_leb128 (abfd
, contents
+ irel
->r_offset
,
8751 before
= get_nds32_elf_blank_total (&blank_t
, irel
->r_addend
, 0);
8752 between
= get_nds32_elf_blank_total (&blank_t
,
8753 irel
->r_addend
+ val
, 0);
8754 if (between
== before
)
8755 goto done_adjust_diff
;
8757 p
= contents
+ irel
->r_offset
;
8759 memset (p
, 0x80, len
);
8761 p
= write_uleb128 (p
, val
- (between
- before
)) - 1;
8769 raddr
= irel
->r_offset
;
8770 irel
->r_offset
-= get_nds32_elf_blank_total (&blank_t2
,
8773 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_NONE
)
8775 if (blank_t2
&& blank_t2
->next
8776 && (blank_t2
->offset
> raddr
8777 || blank_t2
->next
->offset
<= raddr
))
8779 (_("%B: %s\n"), abfd
,
8780 "Error: search_nds32_elf_blank reports wrong node");
8782 /* Mark reloc in deleted portion as NONE.
8783 For some relocs like R_NDS32_LABEL that doesn't modify the
8784 content in the section. R_NDS32_LABEL doesn't belong to the
8785 instruction in the section, so we should preserve it. */
8786 if (raddr
>= blank_t2
->offset
8787 && raddr
< blank_t2
->offset
+ blank_t2
->size
8788 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_LABEL
8789 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_REGION_BEGIN
8790 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_REGION_END
8791 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_ENTRY
8792 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_SUBTRAHEND
8793 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_MINUEND
)
8795 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
8801 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_NONE
8802 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
8803 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_ENTRY
)
8806 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
8807 && isym
[ELF32_R_SYM (irel
->r_info
)].st_shndx
== sec_shndx
8808 && ELF_ST_TYPE (isym
[ELF32_R_SYM (irel
->r_info
)].st_info
) == STT_SECTION
)
8810 if (irel
->r_addend
<= sec
->size
)
8812 get_nds32_elf_blank_total (&blank_t
, irel
->r_addend
, 1);
8817 /* Adjust the local symbols defined in this section. */
8818 blank_t
= blank_head
;
8819 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
8821 if (isym
->st_shndx
== sec_shndx
)
8823 if (isym
->st_value
<= sec
->size
)
8826 bfd_vma orig_addr
= isym
->st_value
;
8828 ahead
= get_nds32_elf_blank_total (&blank_t
, isym
->st_value
, 1);
8829 isym
->st_value
-= ahead
;
8831 /* Adjust function size. */
8832 if (ELF32_ST_TYPE (isym
->st_info
) == STT_FUNC
8833 && isym
->st_size
> 0)
8835 get_nds32_elf_blank_total
8836 (&blank_t
, orig_addr
+ isym
->st_size
, 0) - ahead
;
8841 /* Now adjust the global symbols defined in this section. */
8842 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
8843 - symtab_hdr
->sh_info
);
8844 sym_hashes
= elf_sym_hashes (abfd
);
8845 end_hashes
= sym_hashes
+ symcount
;
8846 blank_t
= blank_head
;
8847 for (; sym_hashes
< end_hashes
; sym_hashes
++)
8849 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
8851 if ((sym_hash
->root
.type
== bfd_link_hash_defined
8852 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
8853 && sym_hash
->root
.u
.def
.section
== sec
)
8855 if (sym_hash
->root
.u
.def
.value
<= sec
->size
)
8858 bfd_vma orig_addr
= sym_hash
->root
.u
.def
.value
;
8860 ahead
= get_nds32_elf_blank_total (&blank_t
, sym_hash
->root
.u
.def
.value
, 1);
8861 sym_hash
->root
.u
.def
.value
-= ahead
;
8863 /* Adjust function size. */
8864 if (sym_hash
->type
== STT_FUNC
)
8866 get_nds32_elf_blank_total
8867 (&blank_t
, orig_addr
+ sym_hash
->size
, 0) - ahead
;
8873 contents
= elf_section_data (sec
)->this_hdr
.contents
;
8874 blank_t
= blank_head
;
8875 while (blank_t
->next
)
8877 /* Actually delete the bytes. */
8879 /* If current blank is the last blank overlap with current section,
8880 go to finish process. */
8881 if (sec
->size
<= (blank_t
->next
->offset
))
8884 memmove (contents
+ blank_t
->offset
- blank_t
->total_size
,
8885 contents
+ blank_t
->offset
+ blank_t
->size
,
8886 blank_t
->next
->offset
- (blank_t
->offset
+ blank_t
->size
));
8888 blank_t
= blank_t
->next
;
8891 if (sec
->size
> (blank_t
->offset
+ blank_t
->size
))
8893 /* There are remaining code between blank and section boundary.
8894 Move the remaining code to appropriate location. */
8895 memmove (contents
+ blank_t
->offset
- blank_t
->total_size
,
8896 contents
+ blank_t
->offset
+ blank_t
->size
,
8897 sec
->size
- (blank_t
->offset
+ blank_t
->size
));
8898 sec
->size
-= blank_t
->total_size
+ blank_t
->size
;
8901 /* This blank is not entirely included in the section,
8902 reduce the section size by only part of the blank size. */
8903 sec
->size
-= blank_t
->total_size
+ (sec
->size
- blank_t
->offset
);
8907 blank_t
= blank_head
;
8908 blank_head
= blank_head
->next
;
8909 remove_nds32_elf_blank (blank_t
);
8915 /* Get the contents of a section. */
8918 nds32_get_section_contents (bfd
*abfd
, asection
*sec
,
8919 bfd_byte
**contents_p
, bfd_boolean cache
)
8921 /* Get the section contents. */
8922 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
8923 *contents_p
= elf_section_data (sec
)->this_hdr
.contents
;
8926 if (!bfd_malloc_and_get_section (abfd
, sec
, contents_p
))
8929 elf_section_data (sec
)->this_hdr
.contents
= *contents_p
;
8935 /* Get the contents of the internal symbol of abfd. */
8938 nds32_get_local_syms (bfd
*abfd
, asection
*sec ATTRIBUTE_UNUSED
,
8939 Elf_Internal_Sym
**isymbuf_p
)
8941 Elf_Internal_Shdr
*symtab_hdr
;
8942 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
8944 /* Read this BFD's local symbols if we haven't done so already. */
8945 if (*isymbuf_p
== NULL
&& symtab_hdr
->sh_info
!= 0)
8947 *isymbuf_p
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
8948 if (*isymbuf_p
== NULL
)
8950 *isymbuf_p
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
8951 symtab_hdr
->sh_info
, 0,
8953 if (*isymbuf_p
== NULL
)
8957 symtab_hdr
->contents
= (bfd_byte
*) (*isymbuf_p
);
8962 /* Range of small data. */
8963 static bfd_vma sdata_range
[2][2];
8964 static bfd_vma
const sdata_init_range
[2] =
8965 { ACCURATE_12BIT_S1
, ACCURATE_19BIT
};
8968 nds32_elf_insn_size (bfd
*abfd ATTRIBUTE_UNUSED
,
8969 bfd_byte
*contents
, bfd_vma addr
)
8971 unsigned long insn
= bfd_getb32 (contents
+ addr
);
8973 if (insn
& 0x80000000)
8979 /* Set the gp relax range. We have to measure the safe range
8980 to do gp relaxation. */
8983 relax_range_measurement (bfd
*abfd
)
8985 asection
*sec_f
, *sec_b
;
8986 /* For upper bound. */
8987 bfd_vma maxpgsz
= get_elf_backend_data (abfd
)->maxpagesize
;
8989 static int decide_relax_range
= 0;
8991 int range_number
= sizeof (sdata_init_range
) / sizeof (sdata_init_range
[0]);
8993 if (decide_relax_range
)
8995 decide_relax_range
= 1;
8997 if (sda_rela_sec
== NULL
)
8999 /* Since there is no data sections, we assume the range is page size. */
9000 for (i
= 0; i
< range_number
; i
++)
9002 sdata_range
[i
][0] = sdata_init_range
[i
] - 0x1000;
9003 sdata_range
[i
][1] = sdata_init_range
[i
] - 0x1000;
9008 /* Get the biggest alignment power after the gp located section. */
9009 sec_f
= sda_rela_sec
->output_section
;
9010 sec_b
= sec_f
->next
;
9012 while (sec_b
!= NULL
)
9014 if ((unsigned)(1 << sec_b
->alignment_power
) > align
)
9015 align
= (1 << sec_b
->alignment_power
);
9016 sec_b
= sec_b
->next
;
9019 /* I guess we can not determine the section before
9020 gp located section, so we assume the align is max page size. */
9021 for (i
= 0; i
< range_number
; i
++)
9023 sdata_range
[i
][1] = sdata_init_range
[i
] - align
;
9024 BFD_ASSERT (sdata_range
[i
][1] <= sdata_init_range
[i
]);
9025 sdata_range
[i
][0] = sdata_init_range
[i
] - maxpgsz
;
9026 BFD_ASSERT (sdata_range
[i
][0] <= sdata_init_range
[i
]);
9030 /* These are macros used to check flags encoded in r_addend.
9031 They are only used by nds32_elf_relax_section (). */
9032 #define GET_SEQ_LEN(addend) ((addend) & 0x000000ff)
9033 #define IS_1ST_CONVERT(addend) ((addend) & 0x80000000)
9034 #define IS_OPTIMIZE(addend) ((addend) & 0x40000000)
9035 #define IS_16BIT_ON(addend) ((addend) & 0x20000000)
9037 /* Relax LONGCALL1 relocation for nds32_elf_relax_section. */
9040 nds32_elf_relax_longcall1 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9041 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9042 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9043 Elf_Internal_Shdr
*symtab_hdr
)
9045 /* There are 3 variations for LONGCALL1
9046 case 4-4-2; 16-bit on, optimize off or optimize for space
9047 sethi ta, hi20(symbol) ; LONGCALL1/HI20
9048 ori ta, ta, lo12(symbol) ; LO12S0
9051 case 4-4-4; 16-bit off, optimize don't care
9052 sethi ta, hi20(symbol) ; LONGCALL1/HI20
9053 ori ta, ta, lo12(symbol) ; LO12S0
9056 case 4-4-4; 16-bit on, optimize for speed
9057 sethi ta, hi20(symbol) ; LONGCALL1/HI20
9058 ori ta, ta, lo12(symbol) ; LO12S0
9060 Check code for -mlong-calls output. */
9062 /* Get the reloc for the address from which the register is
9063 being loaded. This reloc will tell us which function is
9064 actually being called. */
9067 int seq_len
; /* Original length of instruction sequence. */
9069 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *irelend
;
9070 int pic_ext_target
= 0;
9071 bfd_signed_vma foff
;
9074 irelend
= internal_relocs
+ sec
->reloc_count
;
9075 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9076 laddr
= irel
->r_offset
;
9077 *insn_len
= seq_len
;
9079 hi_irelfn
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9080 R_NDS32_HI20_RELA
, laddr
);
9081 lo_irelfn
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9082 R_NDS32_LO12S0_ORI_RELA
,
9085 if (hi_irelfn
== irelend
|| lo_irelfn
== irelend
)
9088 ("%B: warning: R_NDS32_LONGCALL1 points to unrecognized"
9089 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
9093 /* Get the value of the symbol referred to by the reloc. */
9094 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
,
9097 /* This condition only happened when symbol is undefined. */
9098 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_24BIT_S1
9099 || foff
>= CONSERVATIVE_24BIT_S1
)
9102 /* Relax to: jal symbol; 25_PCREL */
9103 /* For simplicity of coding, we are going to modify the section
9104 contents, the section relocs, and the BFD symbol table. We
9105 must tell the rest of the code not to free up this
9106 information. It would be possible to instead create a table
9107 of changes which have to be made, as is done in coff-mips.c;
9108 that would be more work, but would require less memory when
9109 the linker is run. */
9111 /* Replace the long call with a jal. */
9112 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9113 R_NDS32_25_PCREL_RELA
);
9114 irel
->r_addend
= hi_irelfn
->r_addend
;
9116 /* We don't resolve this here but resolve it in relocate_section. */
9118 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9121 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
9123 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9128 insn16
= NDS32_NOP16
;
9129 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9131 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_INSN16
);
9132 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9138 #define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
9139 /* Relax LONGCALL2 relocation for nds32_elf_relax_section. */
9142 nds32_elf_relax_longcall2 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9143 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9144 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9145 Elf_Internal_Shdr
*symtab_hdr
)
9147 /* bltz rt, .L1 ; LONGCALL2
9148 jal symbol ; 25_PCREL
9151 /* Get the reloc for the address from which the register is
9152 being loaded. This reloc will tell us which function is
9153 actually being called. */
9157 Elf_Internal_Rela
*i1_irelfn
, *cond_irelfn
, *irelend
;
9158 int pic_ext_target
= 0;
9159 bfd_signed_vma foff
;
9161 irelend
= internal_relocs
+ sec
->reloc_count
;
9162 laddr
= irel
->r_offset
;
9164 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9165 R_NDS32_25_PCREL_RELA
, laddr
+ 4);
9167 if (i1_irelfn
== irelend
)
9170 ("%B: warning: R_NDS32_LONGCALL2 points to unrecognized"
9171 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
9175 insn
= bfd_getb32 (contents
+ laddr
);
9177 /* Get the value of the symbol referred to by the reloc. */
9178 foff
= calculate_offset (abfd
, sec
, i1_irelfn
, isymbuf
, symtab_hdr
,
9181 if (foff
== 0 || foff
< -CONSERVATIVE_16BIT_S1
9182 || foff
>= CONSERVATIVE_16BIT_S1
)
9185 /* Relax to bgezal rt, label ; 17_PCREL
9186 or bltzal rt, label ; 17_PCREL */
9188 /* Convert to complimentary conditional call. */
9189 insn
= CONVERT_CONDITION_CALL (insn
);
9191 /* For simplicity of coding, we are going to modify the section
9192 contents, the section relocs, and the BFD symbol table. We
9193 must tell the rest of the code not to free up this
9194 information. It would be possible to instead create a table
9195 of changes which have to be made, as is done in coff-mips.c;
9196 that would be more work, but would require less memory when
9197 the linker is run. */
9199 /* Clean unnessary relocations. */
9201 ELF32_R_INFO (ELF32_R_SYM (i1_irelfn
->r_info
), R_NDS32_NONE
);
9203 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9204 R_NDS32_17_PCREL_RELA
, laddr
);
9205 if (cond_irelfn
!= irelend
)
9206 cond_irelfn
->r_info
=
9207 ELF32_R_INFO (ELF32_R_SYM (cond_irelfn
->r_info
), R_NDS32_NONE
);
9209 /* Replace the long call with a bgezal. */
9210 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i1_irelfn
->r_info
),
9211 R_NDS32_17_PCREL_RELA
);
9212 irel
->r_addend
= i1_irelfn
->r_addend
;
9214 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9220 /* Relax LONGCALL3 relocation for nds32_elf_relax_section. */
9223 nds32_elf_relax_longcall3 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9224 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9225 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9226 Elf_Internal_Shdr
*symtab_hdr
)
9228 /* There are 3 variations for LONGCALL3
9229 case 4-4-4-2; 16-bit on, optimize off or optimize for space
9230 bltz rt, $1 ; LONGCALL3
9231 sethi ta, hi20(symbol) ; HI20
9232 ori ta, ta, lo12(symbol) ; LO12S0
9236 case 4-4-4-4; 16-bit off, optimize don't care
9237 bltz rt, $1 ; LONGCALL3
9238 sethi ta, hi20(symbol) ; HI20
9239 ori ta, ta, lo12(symbol) ; LO12S0
9243 case 4-4-4-4; 16-bit on, optimize for speed
9244 bltz rt, $1 ; LONGCALL3
9245 sethi ta, hi20(symbol) ; HI20
9246 ori ta, ta, lo12(symbol) ; LO12S0
9250 /* Get the reloc for the address from which the register is
9251 being loaded. This reloc will tell us which function is
9252 actually being called. */
9255 int seq_len
; /* Original length of instruction sequence. */
9257 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *cond_irelfn
, *irelend
;
9258 int pic_ext_target
= 0;
9259 bfd_signed_vma foff
;
9262 irelend
= internal_relocs
+ sec
->reloc_count
;
9263 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9264 laddr
= irel
->r_offset
;
9265 *insn_len
= seq_len
;
9268 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9269 R_NDS32_HI20_RELA
, laddr
+ 4);
9271 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9272 R_NDS32_LO12S0_ORI_RELA
, laddr
+ 8);
9274 if (hi_irelfn
== irelend
|| lo_irelfn
== irelend
)
9277 ("%B: warning: R_NDS32_LONGCALL3 points to unrecognized"
9278 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
9282 /* Get the value of the symbol referred to by the reloc. */
9283 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
,
9286 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_24BIT_S1
9287 || foff
>= CONSERVATIVE_24BIT_S1
)
9290 insn
= bfd_getb32 (contents
+ laddr
);
9291 if (foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
9293 /* Relax to bgezal rt, label ; 17_PCREL
9294 or bltzal rt, label ; 17_PCREL */
9296 /* Convert to complimentary conditional call. */
9297 insn
= CONVERT_CONDITION_CALL (insn
);
9298 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9302 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
9304 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
9306 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9309 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9310 R_NDS32_17_PCREL_RELA
, laddr
);
9311 if (cond_irelfn
!= irelend
)
9313 cond_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9314 R_NDS32_17_PCREL_RELA
);
9315 cond_irelfn
->r_addend
= hi_irelfn
->r_addend
;
9320 insn16
= NDS32_NOP16
;
9321 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9322 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9324 hi_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9328 else if (foff
>= -CONSERVATIVE_24BIT_S1
&& foff
< CONSERVATIVE_24BIT_S1
)
9330 /* Relax to the following instruction sequence
9331 bltz rt, $1 ; LONGCALL2
9332 jal symbol ; 25_PCREL
9336 bfd_putb32 (insn
, contents
+ hi_irelfn
->r_offset
);
9338 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9339 R_NDS32_25_PCREL_RELA
);
9341 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_LONGCALL2
);
9344 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9348 insn16
= NDS32_NOP16
;
9349 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9351 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_INSN16
);
9352 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9359 /* Relax LONGJUMP1 relocation for nds32_elf_relax_section. */
9362 nds32_elf_relax_longjump1 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9363 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9364 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9365 Elf_Internal_Shdr
*symtab_hdr
)
9367 /* There are 3 variations for LONGJUMP1
9368 case 4-4-2; 16-bit bit on, optimize off or optimize for space
9369 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9370 ori ta, ta, lo12(symbol) ; LO12S0
9373 case 4-4-4; 16-bit off, optimize don't care
9374 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9375 ori ta, ta, lo12(symbol) ; LO12S0
9378 case 4-4-4; 16-bit on, optimize for speed
9379 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9380 ori ta, ta, lo12(symbol) ; LO12S0
9383 /* Get the reloc for the address from which the register is
9384 being loaded. This reloc will tell us which function is
9385 actually being called. */
9388 int seq_len
; /* Original length of instruction sequence. */
9389 int insn16_on
; /* 16-bit on/off. */
9391 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *irelend
;
9392 int pic_ext_target
= 0;
9393 bfd_signed_vma foff
;
9395 unsigned long reloc
;
9397 irelend
= internal_relocs
+ sec
->reloc_count
;
9398 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9399 laddr
= irel
->r_offset
;
9400 *insn_len
= seq_len
;
9401 insn16_on
= IS_16BIT_ON (irel
->r_addend
);
9404 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9405 R_NDS32_HI20_RELA
, laddr
);
9407 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9408 R_NDS32_LO12S0_ORI_RELA
, laddr
+ 4);
9409 if (hi_irelfn
== irelend
|| lo_irelfn
== irelend
)
9412 ("%B: warning: R_NDS32_LONGJUMP1 points to unrecognized"
9413 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
9417 /* Get the value of the symbol referred to by the reloc. */
9418 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
,
9421 if (pic_ext_target
|| foff
== 0 || foff
>= CONSERVATIVE_24BIT_S1
9422 || foff
< -CONSERVATIVE_24BIT_S1
)
9425 if (insn16_on
&& foff
>= -ACCURATE_8BIT_S1
9426 && foff
< ACCURATE_8BIT_S1
&& (seq_len
& 0x2))
9429 /* 16-bit on, but not optimized for speed. */
9430 reloc
= R_NDS32_9_PCREL_RELA
;
9432 bfd_putb16 (insn16
, contents
+ irel
->r_offset
);
9435 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
9440 reloc
= R_NDS32_25_PCREL_RELA
;
9442 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9445 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_INSN16
);
9450 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), reloc
);
9452 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9454 if ((seq_len
& 0x2) && ((*insn_len
& 2) == 0))
9456 insn16
= NDS32_NOP16
;
9457 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9459 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
),
9461 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9467 /* Revert condition branch. This function does not check if the input
9468 instruction is condition branch or not. */
9471 nds32_elf_convert_branch (uint16_t insn16
, uint32_t insn
,
9472 uint16_t *re_insn16
, uint32_t *re_insn
)
9474 uint32_t comp_insn
= 0;
9475 uint16_t comp_insn16
= 0;
9479 if (N32_OP6 (insn
) == N32_OP6_BR1
)
9482 comp_insn
= (insn
^ 0x4000) & 0xffffc000;
9483 if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_R5
)
9485 /* Insn can be contracted to 16-bit implied r5. */
9487 (comp_insn
& 0x4000) ? INSN_BNES38
: INSN_BEQS38
;
9488 comp_insn16
|= (N32_RT5 (insn
) & 0x7) << 8;
9491 else if (N32_OP6 (insn
) == N32_OP6_BR3
)
9493 /* bnec $ta, imm11, label. */
9494 comp_insn
= (insn
^ 0x80000) & 0xffffff00;
9498 comp_insn
= (insn
^ 0x10000) & 0xffffc000;
9499 if (N32_BR2_SUB (insn
) == N32_BR2_BEQZ
9500 || N32_BR2_SUB (insn
) == N32_BR2_BNEZ
)
9502 if (N32_IS_RT3 (insn
))
9504 /* Insn can be contracted to 16-bit. */
9506 (comp_insn
& 0x10000) ? INSN_BNEZ38
: INSN_BEQZ38
;
9507 comp_insn16
|= (N32_RT5 (insn
) & 0x7) << 8;
9509 else if (N32_RT5 (insn
) == REG_R15
)
9511 /* Insn can be contracted to 16-bit. */
9513 (comp_insn
& 0x10000) ? INSN_BNES38
: INSN_BEQS38
;
9520 switch ((insn16
& 0xf000) >> 12)
9523 /* beqz38 or bnez38 */
9524 comp_insn16
= (insn16
^ 0x0800) & 0xff00;
9525 comp_insn
= (comp_insn16
& 0x0800) ? INSN_BNEZ
: INSN_BEQZ
;
9526 comp_insn
|= ((comp_insn16
& 0x0700) >> 8) << 20;
9530 /* beqs38 or bnes38 */
9531 comp_insn16
= (insn16
^ 0x0800) & 0xff00;
9532 comp_insn
= (comp_insn16
& 0x0800) ? INSN_BNE
: INSN_BEQ
;
9533 comp_insn
|= (((comp_insn16
& 0x0700) >> 8) << 20)
9538 /* beqzS8 or bnezS8 */
9539 comp_insn16
= (insn16
^ 0x0100) & 0xff00;
9540 comp_insn
= (comp_insn16
& 0x0100) ? INSN_BNEZ
: INSN_BEQZ
;
9541 comp_insn
|= REG_R15
<< 20;
9548 if (comp_insn
&& re_insn
)
9549 *re_insn
= comp_insn
;
9550 if (comp_insn16
&& re_insn16
)
9551 *re_insn16
= comp_insn16
;
9554 /* Relax LONGJUMP2 relocation for nds32_elf_relax_section. */
9557 nds32_elf_relax_longjump2 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9558 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9559 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9560 Elf_Internal_Shdr
*symtab_hdr
)
9562 /* There are 3 variations for LONGJUMP2
9563 case 2-4; 1st insn convertible, 16-bit on,
9564 optimize off or optimize for space
9565 bnes38 rt, ra, $1 ; LONGJUMP2
9569 case 4-4; 1st insn not convertible
9570 bne rt, ra, $1 ; LONGJUMP2
9574 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9575 bne rt, ra, $1 ; LONGJUMP2
9579 /* Get the reloc for the address from which the register is
9580 being loaded. This reloc will tell us which function is
9581 actually being called. */
9584 int seq_len
; /* Original length of instruction sequence. */
9585 Elf_Internal_Rela
*i2_irelfn
, *cond_irelfn
, *irelend
;
9586 int pic_ext_target
= 0, first_size
;
9588 bfd_signed_vma foff
;
9589 uint32_t insn
, re_insn
= 0;
9590 uint16_t insn16
, re_insn16
= 0;
9591 unsigned long reloc
, cond_reloc
;
9593 enum elf_nds32_reloc_type checked_types
[] =
9594 { R_NDS32_15_PCREL_RELA
, R_NDS32_9_PCREL_RELA
};
9596 irelend
= internal_relocs
+ sec
->reloc_count
;
9597 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9598 laddr
= irel
->r_offset
;
9599 *insn_len
= seq_len
;
9600 first_size
= (seq_len
== 6) ? 2 : 4;
9603 find_relocs_at_address_addr (irel
, internal_relocs
,
9604 irelend
, R_NDS32_25_PCREL_RELA
,
9605 laddr
+ first_size
);
9607 for (i
= 0; i
< sizeof (checked_types
) / sizeof(checked_types
[0]); i
++)
9610 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9611 checked_types
[i
], laddr
);
9612 if (cond_irelfn
!= irelend
)
9616 if (i2_irelfn
== irelend
|| cond_irelfn
== irelend
)
9619 ("%B: warning: R_NDS32_LONGJUMP2 points to unrecognized"
9620 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
9624 /* Get the value of the symbol referred to by the reloc. */
9626 calculate_offset (abfd
, sec
, i2_irelfn
, isymbuf
, symtab_hdr
,
9628 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_16BIT_S1
9629 || foff
>= CONSERVATIVE_16BIT_S1
)
9632 /* Get the all corresponding instructions. */
9633 if (first_size
== 4)
9635 insn
= bfd_getb32 (contents
+ laddr
);
9636 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
9640 insn16
= bfd_getb16 (contents
+ laddr
);
9641 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
9644 if (re_insn16
&& foff
>= -(ACCURATE_8BIT_S1
- first_size
)
9645 && foff
< ACCURATE_8BIT_S1
- first_size
)
9647 if (first_size
== 4)
9649 /* Don't convert it to 16-bit now, keep this as relaxable for
9650 ``label reloc; INSN16''. */
9652 /* Save comp_insn32 to buffer. */
9653 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
9655 reloc
= (N32_OP6 (re_insn
) == N32_OP6_BR1
) ?
9656 R_NDS32_15_PCREL_RELA
: R_NDS32_17_PCREL_RELA
;
9657 cond_reloc
= R_NDS32_INSN16
;
9661 bfd_putb16 (re_insn16
, contents
+ irel
->r_offset
);
9663 reloc
= R_NDS32_9_PCREL_RELA
;
9664 cond_reloc
= R_NDS32_NONE
;
9667 else if (N32_OP6 (re_insn
) == N32_OP6_BR1
9668 && (foff
>= -(ACCURATE_14BIT_S1
- first_size
)
9669 && foff
< ACCURATE_14BIT_S1
- first_size
))
9671 /* beqs label ; 15_PCREL */
9672 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
9674 reloc
= R_NDS32_15_PCREL_RELA
;
9675 cond_reloc
= R_NDS32_NONE
;
9677 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
9678 && foff
>= -CONSERVATIVE_16BIT_S1
9679 && foff
< CONSERVATIVE_16BIT_S1
)
9681 /* beqz label ; 17_PCREL */
9682 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
9684 reloc
= R_NDS32_17_PCREL_RELA
;
9685 cond_reloc
= R_NDS32_NONE
;
9690 /* Set all relocations. */
9691 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i2_irelfn
->r_info
), reloc
);
9692 irel
->r_addend
= i2_irelfn
->r_addend
;
9694 cond_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irelfn
->r_info
),
9696 cond_irelfn
->r_addend
= 0;
9698 if ((seq_len
^ *insn_len
) & 0x2)
9700 insn16
= NDS32_NOP16
;
9701 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ 4);
9702 i2_irelfn
->r_offset
= 4;
9703 i2_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i2_irelfn
->r_info
),
9705 i2_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9709 i2_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i2_irelfn
->r_info
),
9714 /* Relax LONGJUMP3 relocation for nds32_elf_relax_section. */
9717 nds32_elf_relax_longjump3 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9718 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9719 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9720 Elf_Internal_Shdr
*symtab_hdr
)
9722 /* There are 5 variations for LONGJUMP3
9723 case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
9724 optimize off or optimize for space
9725 bnes38 rt, ra, $1 ; LONGJUMP3
9726 sethi ta, hi20(symbol) ; HI20
9727 ori ta, ta, lo12(symbol) ; LO12S0
9731 case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
9732 bnes38 rt, ra, $1 ; LONGJUMP3
9733 sethi ta, hi20(symbol) ; HI20
9734 ori ta, ta, lo12(symbol) ; LO12S0
9738 case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
9739 optimize off or optimize for space
9740 bne rt, ra, $1 ; LONGJUMP3
9741 sethi ta, hi20(symbol) ; HI20
9742 ori ta, ta, lo12(symbol) ; LO12S0
9746 case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
9747 16-bit off if no INSN16
9748 bne rt, ra, $1 ; LONGJUMP3
9749 sethi ta, hi20(symbol) ; HI20
9750 ori ta, ta, lo12(symbol) ; LO12S0
9754 case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
9755 16-bit off if no INSN16
9756 bne rt, ra, $1 ; LONGJUMP3
9757 sethi ta, hi20(symbol) ; HI20
9758 ori ta, ta, lo12(symbol) ; LO12S0
9762 /* Get the reloc for the address from which the register is
9763 being loaded. This reloc will tell us which function is
9764 actually being called. */
9765 enum elf_nds32_reloc_type checked_types
[] =
9766 { R_NDS32_15_PCREL_RELA
, R_NDS32_9_PCREL_RELA
};
9768 int reloc_off
= 0, cond_removed
= 0, convertible
;
9770 int seq_len
; /* Original length of instruction sequence. */
9771 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *cond_irelfn
, *irelend
;
9772 int pic_ext_target
= 0, first_size
;
9774 bfd_signed_vma foff
;
9775 uint32_t insn
, re_insn
= 0;
9776 uint16_t insn16
, re_insn16
= 0;
9777 unsigned long reloc
, cond_reloc
;
9779 irelend
= internal_relocs
+ sec
->reloc_count
;
9780 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9781 laddr
= irel
->r_offset
;
9782 *insn_len
= seq_len
;
9784 convertible
= IS_1ST_CONVERT (irel
->r_addend
);
9791 /* Get all needed relocations. */
9793 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9794 R_NDS32_HI20_RELA
, laddr
+ first_size
);
9796 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9797 R_NDS32_LO12S0_ORI_RELA
,
9798 laddr
+ first_size
+ 4);
9800 for (i
= 0; i
< sizeof (checked_types
) / sizeof (checked_types
[0]); i
++)
9803 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9804 checked_types
[i
], laddr
);
9805 if (cond_irelfn
!= irelend
)
9809 if (hi_irelfn
== irelend
|| lo_irelfn
== irelend
|| cond_irelfn
== irelend
)
9812 ("%B: warning: R_NDS32_LONGJUMP3 points to unrecognized"
9813 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
9817 /* Get the value of the symbol referred to by the reloc. */
9818 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
,
9821 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_24BIT_S1
9822 || foff
>= CONSERVATIVE_24BIT_S1
)
9825 /* Get the all corresponding instructions. */
9826 if (first_size
== 4)
9828 insn
= bfd_getb32 (contents
+ laddr
);
9829 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
9833 insn16
= bfd_getb16 (contents
+ laddr
);
9834 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
9837 /* For simplicity of coding, we are going to modify the section
9838 contents, the section relocs, and the BFD symbol table. We
9839 must tell the rest of the code not to free up this
9840 information. It would be possible to instead create a table
9841 of changes which have to be made, as is done in coff-mips.c;
9842 that would be more work, but would require less memory when
9843 the linker is run. */
9845 if (re_insn16
&& foff
>= -ACCURATE_8BIT_S1
- first_size
9846 && foff
< ACCURATE_8BIT_S1
- first_size
)
9848 if (!(seq_len
& 0x2))
9850 /* Don't convert it to 16-bit now, keep this as relaxable
9851 for ``label reloc; INSN1a''6. */
9852 /* Save comp_insn32 to buffer. */
9853 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
9855 reloc
= (N32_OP6 (re_insn
) == N32_OP6_BR1
) ?
9856 R_NDS32_15_PCREL_RELA
: R_NDS32_17_PCREL_RELA
;
9857 cond_reloc
= R_NDS32_INSN16
;
9861 /* Not optimize for speed; convert sequence to 16-bit. */
9862 /* Save comp_insn16 to buffer. */
9863 bfd_putb16 (re_insn16
, contents
+ irel
->r_offset
);
9865 reloc
= R_NDS32_9_PCREL_RELA
;
9866 cond_reloc
= R_NDS32_NONE
;
9870 else if (N32_OP6 (re_insn
) == N32_OP6_BR1
9871 && (foff
>= -(ACCURATE_14BIT_S1
- first_size
)
9872 && foff
< ACCURATE_14BIT_S1
- first_size
))
9874 /* beqs label ; 15_PCREL */
9875 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
9877 reloc
= R_NDS32_15_PCREL_RELA
;
9878 cond_reloc
= R_NDS32_NONE
;
9881 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
9882 && foff
>= -CONSERVATIVE_16BIT_S1
9883 && foff
< CONSERVATIVE_16BIT_S1
)
9885 /* beqz label ; 17_PCREL */
9886 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
9888 reloc
= R_NDS32_17_PCREL_RELA
;
9889 cond_reloc
= R_NDS32_NONE
;
9892 else if (foff
>= -CONSERVATIVE_24BIT_S1
- reloc_off
9893 && foff
< CONSERVATIVE_24BIT_S1
- reloc_off
)
9895 /* Relax to one of the following 3 variations
9897 case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
9899 bnes38 rt, $1 ; LONGJUMP2
9903 case 4-4; 1st insn not convertible, others don't care
9904 bne rt, ra, $1 ; LONGJUMP2
9908 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9909 bne rt, ra, $1 ; LONGJUMP2
9913 /* Offset for first instruction. */
9915 /* Use j label as second instruction. */
9916 *insn_len
= 4 + first_size
;
9918 bfd_putb32 (insn
, contents
+ hi_irelfn
->r_offset
);
9919 reloc
= R_NDS32_LONGJUMP2
;
9920 cond_reloc
= R_NDS32_25_PLTREL
;
9925 if (cond_removed
== 1)
9927 /* Set all relocations. */
9928 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), reloc
);
9929 irel
->r_addend
= hi_irelfn
->r_addend
;
9931 cond_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irelfn
->r_info
),
9933 cond_irelfn
->r_addend
= 0;
9934 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9939 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
9940 irel
->r_addend
= irel
->r_addend
;
9941 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9945 if ((seq_len
^ *insn_len
) & 0x2)
9947 insn16
= NDS32_NOP16
;
9948 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9949 lo_irelfn
->r_offset
= *insn_len
;
9950 lo_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
),
9952 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9956 lo_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
),
9961 /* Relax LONGCALL4 relocation for nds32_elf_relax_section. */
9964 nds32_elf_relax_longcall4 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9965 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9966 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9967 Elf_Internal_Shdr
*symtab_hdr
)
9969 /* The pattern for LONGCALL4. Support for function cse.
9970 sethi ta, hi20(symbol) ; LONGCALL4/HI20
9971 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
9972 jral ta ; PTR_RES/EMPTY/INSN16 */
9976 Elf_Internal_Rela
*hi_irel
, *ptr_irel
, *insn_irel
, *em_irel
, *call_irel
;
9977 Elf_Internal_Rela
*irelend
;
9978 int pic_ext_target
= 0;
9979 bfd_signed_vma foff
;
9981 irelend
= internal_relocs
+ sec
->reloc_count
;
9982 laddr
= irel
->r_offset
;
9984 /* Get the reloc for the address from which the register is
9985 being loaded. This reloc will tell us which function is
9986 actually being called. */
9987 hi_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9988 R_NDS32_HI20_RELA
, laddr
);
9990 if (hi_irel
== irelend
)
9993 ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized"
9994 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
9998 /* Get the value of the symbol referred to by the reloc. */
9999 foff
= calculate_offset (abfd
, sec
, hi_irel
, isymbuf
, symtab_hdr
,
10002 /* This condition only happened when symbol is undefined. */
10003 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_24BIT_S1
10004 || foff
>= CONSERVATIVE_24BIT_S1
)
10007 /* Relax to: jal symbol; 25_PCREL */
10008 /* For simplicity of coding, we are going to modify the section
10009 contents, the section relocs, and the BFD symbol table. We
10010 must tell the rest of the code not to free up this
10011 information. It would be possible to instead create a table
10012 of changes which have to be made, as is done in coff-mips.c;
10013 that would be more work, but would require less memory when
10014 the linker is run. */
10016 ptr_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10017 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10018 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10019 R_NDS32_EMPTY
, irel
->r_addend
);
10021 if (ptr_irel
== irelend
|| em_irel
== irelend
)
10024 ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized"
10025 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10028 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
10029 insn
= bfd_getb32 (contents
+ irel
->r_addend
);
10030 if (insn
& 0x80000000)
10033 /* Replace the long call with a jal. */
10034 em_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
),
10035 R_NDS32_25_PCREL_RELA
);
10036 ptr_irel
->r_addend
= 1;
10038 /* We don't resolve this here but resolve it in relocate_section. */
10040 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10043 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10045 /* If there is function cse, HI20 can not remove now. */
10046 call_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10047 R_NDS32_LONGCALL4
, laddr
);
10048 if (call_irel
== irelend
)
10052 ELF32_R_INFO (ELF32_R_SYM (hi_irel
->r_info
), R_NDS32_NONE
);
10055 insn_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10056 R_NDS32_INSN16
, irel
->r_addend
);
10057 if (insn_irel
!= irelend
)
10058 insn_irel
->r_info
=
10059 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10064 /* Relax LONGCALL5 relocation for nds32_elf_relax_section. */
10067 nds32_elf_relax_longcall5 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10068 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10069 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10070 Elf_Internal_Shdr
*symtab_hdr
)
10072 /* The pattern for LONGCALL5.
10073 bltz rt, .L1 ; LONGCALL5/17_PCREL
10074 jal symbol ; 25_PCREL
10079 Elf_Internal_Rela
*cond_irel
, *irelend
;
10080 int pic_ext_target
= 0;
10081 bfd_signed_vma foff
;
10083 irelend
= internal_relocs
+ sec
->reloc_count
;
10084 laddr
= irel
->r_offset
;
10085 insn
= bfd_getb32 (contents
+ laddr
);
10087 /* Get the reloc for the address from which the register is
10088 being loaded. This reloc will tell us which function is
10089 actually being called. */
10091 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10092 R_NDS32_25_PCREL_RELA
, irel
->r_addend
);
10093 if (cond_irel
== irelend
)
10096 ("%B: warning: R_NDS32_LONGCALL5 points to unrecognized"
10097 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10101 /* Get the value of the symbol referred to by the reloc. */
10102 foff
= calculate_offset (abfd
, sec
, cond_irel
, isymbuf
, symtab_hdr
,
10105 if (foff
== 0 || foff
< -CONSERVATIVE_16BIT_S1
10106 || foff
>= CONSERVATIVE_16BIT_S1
)
10109 /* Relax to bgezal rt, label ; 17_PCREL
10110 or bltzal rt, label ; 17_PCREL */
10112 /* Convert to complimentary conditional call. */
10113 insn
= CONVERT_CONDITION_CALL (insn
);
10115 /* For simplicity of coding, we are going to modify the section
10116 contents, the section relocs, and the BFD symbol table. We
10117 must tell the rest of the code not to free up this
10118 information. It would be possible to instead create a table
10119 of changes which have to be made, as is done in coff-mips.c;
10120 that would be more work, but would require less memory when
10121 the linker is run. */
10123 /* Modify relocation and contents. */
10124 cond_irel
->r_info
=
10125 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_17_PCREL_RELA
);
10127 /* Replace the long call with a bgezal. */
10128 bfd_putb32 (insn
, contents
+ cond_irel
->r_offset
);
10131 /* Clean unnessary relocations. */
10132 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10134 cond_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10135 R_NDS32_17_PCREL_RELA
, laddr
);
10136 cond_irel
->r_info
=
10137 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10142 /* Relax LONGCALL6 relocation for nds32_elf_relax_section. */
10145 nds32_elf_relax_longcall6 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10146 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10147 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10148 Elf_Internal_Shdr
*symtab_hdr
)
10150 /* The pattern for LONGCALL6.
10151 bltz rt, .L1 ; LONGCALL6/17_PCREL
10152 sethi ta, hi20(symbol) ; HI20/PTR
10153 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10154 jral ta ; PTR_RES/EMPTY/INSN16
10159 Elf_Internal_Rela
*em_irel
, *cond_irel
, *irelend
;
10160 int pic_ext_target
= 0;
10161 bfd_signed_vma foff
;
10163 irelend
= internal_relocs
+ sec
->reloc_count
;
10164 laddr
= irel
->r_offset
;
10166 /* Get the reloc for the address from which the register is
10167 being loaded. This reloc will tell us which function is
10168 actually being called. */
10169 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10170 R_NDS32_EMPTY
, irel
->r_addend
);
10172 if (em_irel
== irelend
)
10175 ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
10176 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10180 /* Get the value of the symbol referred to by the reloc. */
10181 foff
= calculate_offset (abfd
, sec
, em_irel
, isymbuf
, symtab_hdr
,
10184 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_24BIT_S1
10185 || foff
>= CONSERVATIVE_24BIT_S1
)
10188 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
10189 insn
= bfd_getb32 (contents
+ irel
->r_addend
);
10190 if (insn
& 0x80000000)
10193 insn
= bfd_getb32 (contents
+ laddr
);
10194 if (foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
10196 /* Relax to bgezal rt, label ; 17_PCREL
10197 or bltzal rt, label ; 17_PCREL */
10199 /* Convert to complimentary conditional call. */
10201 insn
= CONVERT_CONDITION_CALL (insn
);
10202 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10205 ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
), R_NDS32_17_PCREL_RELA
);
10207 /* Set resolved relocation. */
10209 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10210 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10211 if (cond_irel
== irelend
)
10214 ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
10215 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10218 cond_irel
->r_addend
= 1;
10220 /* Clear relocations. */
10223 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10226 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10227 R_NDS32_17_PCREL_RELA
, laddr
);
10228 if (cond_irel
!= irelend
)
10229 cond_irel
->r_info
=
10230 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10233 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10234 R_NDS32_INSN16
, irel
->r_addend
);
10235 if (cond_irel
!= irelend
)
10236 cond_irel
->r_info
=
10237 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10240 else if (foff
>= -CONSERVATIVE_24BIT_S1
&& foff
< CONSERVATIVE_24BIT_S1
)
10242 /* Relax to the following instruction sequence
10243 bltz rt, .L1 ; LONGCALL2/17_PCREL
10244 jal symbol ; 25_PCREL/PTR_RES
10247 /* Convert instruction. */
10249 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10251 /* Convert relocations. */
10252 em_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
),
10253 R_NDS32_25_PCREL_RELA
);
10255 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_LONGCALL5
);
10257 /* Set resolved relocation. */
10259 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10260 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10261 if (cond_irel
== irelend
)
10264 ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
10265 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10268 cond_irel
->r_addend
= 1;
10271 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10272 R_NDS32_INSN16
, irel
->r_addend
);
10273 if (cond_irel
!= irelend
)
10274 cond_irel
->r_info
=
10275 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10280 /* Relax LONGJUMP4 relocation for nds32_elf_relax_section. */
10283 nds32_elf_relax_longjump4 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10284 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10285 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10286 Elf_Internal_Shdr
*symtab_hdr
)
10288 /* The pattern for LONGJUMP4.
10289 sethi ta, hi20(symbol) ; LONGJUMP4/HI20
10290 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10291 jr ta ; PTR_RES/INSN16/EMPTY */
10294 int seq_len
; /* Original length of instruction sequence. */
10296 Elf_Internal_Rela
*hi_irel
, *ptr_irel
, *em_irel
, *call_irel
, *irelend
;
10297 int pic_ext_target
= 0;
10298 bfd_signed_vma foff
;
10300 irelend
= internal_relocs
+ sec
->reloc_count
;
10301 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
10302 laddr
= irel
->r_offset
;
10303 *insn_len
= seq_len
;
10305 /* Get the reloc for the address from which the register is
10306 being loaded. This reloc will tell us which function is
10307 actually being called. */
10309 hi_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10310 R_NDS32_HI20_RELA
, laddr
);
10312 if (hi_irel
== irelend
)
10315 ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized"
10316 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10320 /* Get the value of the symbol referred to by the reloc. */
10321 foff
= calculate_offset (abfd
, sec
, hi_irel
, isymbuf
, symtab_hdr
,
10324 if (pic_ext_target
|| foff
== 0 || foff
>= CONSERVATIVE_24BIT_S1
10325 || foff
< -CONSERVATIVE_24BIT_S1
)
10328 /* Convert it to "j label", it may be converted to j8 in the final
10329 pass of relaxation. Therefore, we do not consider this currently. */
10330 ptr_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10331 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10332 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10333 R_NDS32_EMPTY
, irel
->r_addend
);
10335 if (ptr_irel
== irelend
|| em_irel
== irelend
)
10338 ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized"
10339 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10344 ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
), R_NDS32_25_PCREL_RELA
);
10345 ptr_irel
->r_addend
= 1;
10347 /* Write instruction. */
10349 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10351 /* Clear relocations. */
10352 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10354 /* If there is function cse, HI20 can not remove now. */
10355 call_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10356 R_NDS32_LONGJUMP4
, laddr
);
10357 if (call_irel
== irelend
)
10361 ELF32_R_INFO (ELF32_R_SYM (hi_irel
->r_info
), R_NDS32_NONE
);
10367 /* Relax LONGJUMP5 relocation for nds32_elf_relax_section. */
10370 nds32_elf_relax_longjump5 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10371 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10372 int *seq_len
, bfd_byte
*contents
,
10373 Elf_Internal_Sym
*isymbuf
,
10374 Elf_Internal_Shdr
*symtab_hdr
)
10376 /* There are 2 variations for LONGJUMP5
10377 case 2-4; 1st insn convertible, 16-bit on.
10378 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
10379 j label ; 25_PCREL/INSN16
10382 case 4-4; 1st insn not convertible
10383 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
10384 j label ; 25_PCREL/INSN16
10388 Elf_Internal_Rela
*cond_irel
, *irelend
;
10389 int pic_ext_target
= 0;
10391 bfd_signed_vma foff
;
10392 uint32_t insn
, re_insn
= 0;
10393 uint16_t insn16
, re_insn16
= 0;
10394 unsigned long reloc
;
10396 enum elf_nds32_reloc_type checked_types
[] =
10397 { R_NDS32_17_PCREL_RELA
, R_NDS32_15_PCREL_RELA
,
10398 R_NDS32_9_PCREL_RELA
, R_NDS32_INSN16
};
10400 irelend
= internal_relocs
+ sec
->reloc_count
;
10401 laddr
= irel
->r_offset
;
10403 /* Get the reloc for the address from which the register is
10404 being loaded. This reloc will tell us which function is
10405 actually being called. */
10408 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10409 R_NDS32_25_PCREL_RELA
, irel
->r_addend
);
10410 if (cond_irel
== irelend
)
10413 ("%B: warning: R_NDS32_LONGJUMP5 points to unrecognized"
10414 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10418 /* Get the value of the symbol referred to by the reloc. */
10419 foff
= calculate_offset (abfd
, sec
, cond_irel
, isymbuf
, symtab_hdr
,
10422 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_16BIT_S1
10423 || foff
>= CONSERVATIVE_16BIT_S1
)
10426 /* Get the all corresponding instructions. */
10427 insn
= bfd_getb32 (contents
+ laddr
);
10428 /* Check instruction size. */
10429 if (insn
& 0x80000000)
10432 insn16
= insn
>> 16;
10433 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
10436 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
10438 if (N32_OP6 (re_insn
) == N32_OP6_BR1
10439 && (foff
>= -CONSERVATIVE_14BIT_S1
&& foff
< CONSERVATIVE_14BIT_S1
))
10441 /* beqs label ; 15_PCREL. */
10442 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
10443 reloc
= R_NDS32_15_PCREL_RELA
;
10445 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
10446 && foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
10448 /* beqz label ; 17_PCREL. */
10449 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
10450 reloc
= R_NDS32_17_PCREL_RELA
;
10452 else if ( N32_OP6 (re_insn
) == N32_OP6_BR3
10453 && foff
>= -CONSERVATIVE_8BIT_S1
&& foff
< CONSERVATIVE_8BIT_S1
)
10455 /* beqc label ; 9_PCREL. */
10456 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
10457 reloc
= R_NDS32_WORD_9_PCREL_RELA
;
10462 /* Set all relocations. */
10463 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), reloc
);
10465 /* Clean relocations. */
10466 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10467 for (i
= 0; i
< sizeof (checked_types
) / sizeof (checked_types
[0]); i
++)
10469 cond_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10470 checked_types
[i
], laddr
);
10471 if (cond_irel
!= irelend
)
10474 && (ELF32_R_TYPE (cond_irel
->r_info
) == R_NDS32_INSN16
))
10476 /* If the branch instruction is 2 byte, it cannot remove
10477 directly. Only convert it to nop16 and remove it after
10478 checking alignment issue. */
10479 insn16
= NDS32_NOP16
;
10480 bfd_putb16 (insn16
, contents
+ laddr
);
10481 cond_irel
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
10484 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
10493 /* Relax LONGJUMP6 relocation for nds32_elf_relax_section. */
10496 nds32_elf_relax_longjump6 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10497 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10498 int *seq_len
, bfd_byte
*contents
,
10499 Elf_Internal_Sym
*isymbuf
,
10500 Elf_Internal_Shdr
*symtab_hdr
)
10502 /* There are 5 variations for LONGJUMP6
10503 case : 2-4-4-4; 1st insn convertible, 16-bit on.
10504 bnes38 rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
10505 sethi ta, hi20(symbol) ; HI20/PTR
10506 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10507 jr ta ; PTR_RES/INSN16/EMPTY
10510 case : 4-4-4-4; 1st insn not convertible, 16-bit on.
10511 bne rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
10512 sethi ta, hi20(symbol) ; HI20/PTR
10513 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10514 jr ta ; PTR_RES/INSN16/EMPTY
10517 enum elf_nds32_reloc_type checked_types
[] =
10518 { R_NDS32_17_PCREL_RELA
, R_NDS32_15_PCREL_RELA
,
10519 R_NDS32_9_PCREL_RELA
, R_NDS32_INSN16
};
10521 int reloc_off
= 0, cond_removed
= 0;
10523 Elf_Internal_Rela
*cond_irel
, *em_irel
, *irelend
, *insn_irel
;
10524 int pic_ext_target
= 0;
10526 bfd_signed_vma foff
;
10527 uint32_t insn
, re_insn
= 0;
10528 uint16_t insn16
, re_insn16
= 0;
10529 unsigned long reloc
;
10531 irelend
= internal_relocs
+ sec
->reloc_count
;
10532 laddr
= irel
->r_offset
;
10534 /* Get the reloc for the address from which the register is
10535 being loaded. This reloc will tell us which function is
10536 actually being called. */
10537 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10538 R_NDS32_EMPTY
, irel
->r_addend
);
10540 if (em_irel
== irelend
)
10543 ("%B: warning: R_NDS32_LONGJUMP6 points to unrecognized"
10544 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10548 /* Get the value of the symbol referred to by the reloc. */
10549 foff
= calculate_offset (abfd
, sec
, em_irel
, isymbuf
, symtab_hdr
,
10552 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_24BIT_S1
10553 || foff
>= CONSERVATIVE_24BIT_S1
)
10556 insn
= bfd_getb32 (contents
+ laddr
);
10557 /* Check instruction size. */
10558 if (insn
& 0x80000000)
10561 insn16
= insn
>> 16;
10562 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
10565 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
10567 /* For simplicity of coding, we are going to modify the section
10568 contents, the section relocs, and the BFD symbol table. We
10569 must tell the rest of the code not to free up this
10570 information. It would be possible to instead create a table
10571 of changes which have to be made, as is done in coff-mips.c;
10572 that would be more work, but would require less memory when
10573 the linker is run. */
10575 if (N32_OP6 (re_insn
) == N32_OP6_BR1
10576 && (foff
>= -CONSERVATIVE_14BIT_S1
&& foff
< CONSERVATIVE_14BIT_S1
))
10578 /* beqs label ; 15_PCREL */
10579 bfd_putb32 (re_insn
, contents
+ em_irel
->r_offset
);
10580 reloc
= R_NDS32_15_PCREL_RELA
;
10583 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
10584 && foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
10586 /* beqz label ; 17_PCREL */
10587 bfd_putb32 (re_insn
, contents
+ em_irel
->r_offset
);
10588 reloc
= R_NDS32_17_PCREL_RELA
;
10591 else if (foff
>= -CONSERVATIVE_24BIT_S1
- reloc_off
10592 && foff
< CONSERVATIVE_24BIT_S1
- reloc_off
)
10594 /* Relax to one of the following 2 variations
10596 case 2-4; 1st insn convertible, 16-bit on.
10597 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
10598 j label ; 25_PCREL/INSN16
10601 case 4-4; 1st insn not convertible
10602 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
10603 j label ; 25_PCREL/INSN16
10606 /* Use j label as second instruction. */
10608 reloc
= R_NDS32_25_PCREL_RELA
;
10609 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10614 /* Set all relocations. */
10615 em_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
), reloc
);
10618 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10619 R_NDS32_PTR_RESOLVED
, em_irel
->r_offset
);
10620 cond_irel
->r_addend
= 1;
10622 /* Use INSN16 of first branch instruction to distinguish if keeping
10623 INSN16 of final instruction or not. */
10624 insn_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10625 R_NDS32_INSN16
, irel
->r_offset
);
10626 if (insn_irel
== irelend
)
10628 /* Clean the final INSN16. */
10630 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10631 R_NDS32_INSN16
, em_irel
->r_offset
);
10632 insn_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
10636 if (cond_removed
== 1)
10640 /* Clear relocations. */
10641 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10643 for (i
= 0; i
< sizeof (checked_types
) / sizeof (checked_types
[0]); i
++)
10646 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10647 checked_types
[i
], laddr
);
10648 if (cond_irel
!= irelend
)
10651 && (ELF32_R_TYPE (cond_irel
->r_info
) == R_NDS32_INSN16
))
10653 /* If the branch instruction is 2 byte, it cannot remove
10654 directly. Only convert it to nop16 and remove it after
10655 checking alignment issue. */
10656 insn16
= NDS32_NOP16
;
10657 bfd_putb16 (insn16
, contents
+ laddr
);
10658 cond_irel
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
10661 cond_irel
->r_info
=
10662 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10668 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
10669 R_NDS32_LONGJUMP5
);
10675 /* Relax LONGJUMP7 relocation for nds32_elf_relax_section. */
10678 nds32_elf_relax_longjump7 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10679 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10680 int *seq_len
, bfd_byte
*contents
,
10681 Elf_Internal_Sym
*isymbuf
,
10682 Elf_Internal_Shdr
*symtab_hdr
)
10684 /* There are 2 variations for LONGJUMP5
10685 case 2-4; 1st insn convertible, 16-bit on.
10686 movi55 ta, imm11 ; LONGJUMP7/INSN16
10687 beq rt, ta, label ; 15_PCREL
10689 case 4-4; 1st insn not convertible
10690 movi55 ta, imm11 ; LONGJUMP7/INSN16
10691 beq rt, ta, label ; 15_PCREL */
10694 Elf_Internal_Rela
*cond_irel
, *irelend
, *insn_irel
;
10695 int pic_ext_target
= 0;
10696 bfd_signed_vma foff
;
10697 uint32_t insn
, re_insn
= 0;
10701 irelend
= internal_relocs
+ sec
->reloc_count
;
10702 laddr
= irel
->r_offset
;
10704 /* Get the reloc for the address from which the register is
10705 being loaded. This reloc will tell us which function is
10706 actually being called. */
10709 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10710 R_NDS32_15_PCREL_RELA
, irel
->r_addend
);
10711 if (cond_irel
== irelend
)
10714 ("%B: warning: R_NDS32_LONGJUMP7 points to unrecognized"
10715 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10719 /* Get the value of the symbol referred to by the reloc. */
10720 foff
= calculate_offset (abfd
, sec
, cond_irel
, isymbuf
, symtab_hdr
,
10723 if (pic_ext_target
|| foff
== 0 || foff
< -CONSERVATIVE_8BIT_S1
10724 || foff
>= CONSERVATIVE_8BIT_S1
)
10727 /* Get the first instruction for its size. */
10728 insn
= bfd_getb32 (contents
+ laddr
);
10729 if (insn
& 0x80000000)
10732 /* Get the immediate from movi55. */
10733 imm11
= N16_IMM5S (insn
>> 16);
10737 /* Get the immediate from movi. */
10738 imm11
= N32_IMM20S (insn
);
10741 /* Get the branch instruction. */
10742 insn
= bfd_getb32 (contents
+ irel
->r_addend
);
10743 /* Convert instruction to BR3. */
10744 if ((insn
>> 14) & 0x1)
10745 re_insn
= N32_BR3 (BNEC
, N32_RT5 (insn
), imm11
, 0);
10747 re_insn
= N32_BR3 (BEQC
, N32_RT5 (insn
), imm11
, 0);
10749 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
10751 /* Set all relocations. */
10752 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
10753 R_NDS32_WORD_9_PCREL_RELA
);
10755 /* Clean relocations. */
10756 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10757 insn_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10758 R_NDS32_INSN16
, irel
->r_offset
);
10759 if (insn_irel
!= irelend
)
10763 /* If the first insntruction is 16bit, convert it to nop16. */
10764 insn16
= NDS32_NOP16
;
10765 bfd_putb16 (insn16
, contents
+ laddr
);
10766 insn_irel
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
10769 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
10777 #define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
10779 /* Relax LOADSTORE relocation for nds32_elf_relax_section. */
10782 nds32_elf_relax_loadstore (struct bfd_link_info
*link_info
, bfd
*abfd
,
10783 asection
*sec
, Elf_Internal_Rela
*irel
,
10784 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10785 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10786 Elf_Internal_Shdr
*symtab_hdr
, int load_store_relax
)
10788 int eliminate_sethi
= 0, range_type
;
10790 bfd_vma local_sda
, laddr
;
10791 int seq_len
; /* Original length of instruction sequence. */
10793 Elf_Internal_Rela
*hi_irelfn
= NULL
, *irelend
;
10794 bfd_vma access_addr
= 0;
10795 bfd_vma range_l
= 0, range_h
= 0; /* Upper/lower bound. */
10796 enum elf_nds32_reloc_type checked_types
[] =
10797 { R_NDS32_HI20_RELA
, R_NDS32_GOT_HI20
,
10798 R_NDS32_GOTPC_HI20
, R_NDS32_GOTOFF_HI20
,
10799 R_NDS32_PLTREL_HI20
, R_NDS32_PLT_GOTREL_HI20
,
10800 R_NDS32_TLS_LE_HI20
10803 irelend
= internal_relocs
+ sec
->reloc_count
;
10804 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
10805 laddr
= irel
->r_offset
;
10806 *insn_len
= seq_len
;
10808 /* Get the high part relocation. */
10809 for (i
= 0; i
< ARRAY_SIZE (checked_types
); i
++)
10811 hi_irelfn
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10812 checked_types
[i
], laddr
);
10813 if (hi_irelfn
!= irelend
)
10817 if (hi_irelfn
== irelend
)
10820 ("%B: warning: R_NDS32_LOADSTORE points to unrecognized"
10821 "reloc at 0x%lx.", abfd
, (long) irel
->r_offset
);
10825 range_type
= GET_LOADSTORE_RANGE (irel
->r_addend
);
10826 nds32_elf_final_sda_base (sec
->output_section
->owner
,
10827 link_info
, &local_sda
, FALSE
);
10829 switch (ELF32_R_TYPE (hi_irelfn
->r_info
))
10831 case R_NDS32_HI20_RELA
:
10832 insn
= bfd_getb32 (contents
+ laddr
);
10834 calculate_memory_address (abfd
, hi_irelfn
, isymbuf
, symtab_hdr
);
10836 if (range_type
== NDS32_LOADSTORE_IMM
)
10838 struct elf_link_hash_entry
*h
= NULL
;
10841 if (ELF32_R_SYM (hi_irelfn
->r_info
) >= symtab_hdr
->sh_info
)
10843 indx
= ELF32_R_SYM (hi_irelfn
->r_info
) - symtab_hdr
->sh_info
;
10844 h
= elf_sym_hashes (abfd
)[indx
];
10847 if ((access_addr
< CONSERVATIVE_20BIT
)
10848 && (!h
|| (h
&& strcmp (h
->root
.root
.string
, FP_BASE_NAME
) != 0)))
10850 eliminate_sethi
= 1;
10854 /* This is avoid to relax symbol address which is fixed
10855 relocations. Ex: _stack. */
10856 if (h
&& bfd_is_abs_section (h
->root
.u
.def
.section
))
10860 if (!load_store_relax
)
10863 /* Case for set gp register. */
10864 if (N32_RT5 (insn
) == REG_GP
)
10867 if (range_type
== NDS32_LOADSTORE_FLOAT_S
10868 || range_type
== NDS32_LOADSTORE_FLOAT_S
)
10870 range_l
= sdata_range
[0][0];
10871 range_h
= sdata_range
[0][1];
10875 range_l
= sdata_range
[1][0];
10876 range_h
= sdata_range
[1][1];
10880 case R_NDS32_GOT_HI20
:
10882 calculate_got_memory_address (abfd
, link_info
, hi_irelfn
, symtab_hdr
);
10884 /* If this symbol is not in .got, the return value will be -1.
10885 Since the gp value is set to SDA_BASE but not GLOBAL_OFFSET_TABLE,
10886 a negative offset is allowed. */
10887 if ((bfd_signed_vma
) (access_addr
- local_sda
) < CONSERVATIVE_20BIT
10888 && (bfd_signed_vma
) (access_addr
- local_sda
) >= -CONSERVATIVE_20BIT
)
10889 eliminate_sethi
= 1;
10892 case R_NDS32_PLT_GOTREL_HI20
:
10893 access_addr
= calculate_plt_memory_address (abfd
, link_info
, isymbuf
,
10894 hi_irelfn
, symtab_hdr
);
10896 if ((bfd_signed_vma
) (access_addr
- local_sda
) < CONSERVATIVE_20BIT
10897 && (bfd_signed_vma
) (access_addr
- local_sda
) >= -CONSERVATIVE_20BIT
)
10898 eliminate_sethi
= 1;
10901 case R_NDS32_GOTOFF_HI20
:
10903 calculate_memory_address (abfd
, hi_irelfn
, isymbuf
, symtab_hdr
);
10905 if ((bfd_signed_vma
) (access_addr
- local_sda
) < CONSERVATIVE_20BIT
10906 && (bfd_signed_vma
) (access_addr
- local_sda
) >= -CONSERVATIVE_20BIT
)
10907 eliminate_sethi
= 1;
10910 case R_NDS32_GOTPC_HI20
:
10911 /* The access_addr must consider r_addend of hi_irel. */
10912 access_addr
= sec
->output_section
->vma
+ sec
->output_offset
10913 + irel
->r_offset
+ hi_irelfn
->r_addend
;
10915 if ((bfd_signed_vma
) (local_sda
- access_addr
) < CONSERVATIVE_20BIT
10916 && (bfd_signed_vma
) (local_sda
- access_addr
) >= -CONSERVATIVE_20BIT
)
10917 eliminate_sethi
= 1;
10920 case R_NDS32_TLS_LE_HI20
:
10922 calculate_memory_address (abfd
, hi_irelfn
, isymbuf
, symtab_hdr
);
10923 BFD_ASSERT (elf_hash_table (link_info
)->tls_sec
!= NULL
);
10924 access_addr
-= (elf_hash_table (link_info
)->tls_sec
->vma
+ TP_OFFSET
);
10925 if ((range_type
== NDS32_LOADSTORE_IMM
)
10926 && (bfd_signed_vma
) (access_addr
) < CONSERVATIVE_20BIT
10927 && (bfd_signed_vma
) (access_addr
) >= -CONSERVATIVE_20BIT
)
10928 eliminate_sethi
= 1;
10935 /* Delete sethi instruction. */
10936 if (eliminate_sethi
== 1
10937 || (local_sda
<= access_addr
&& (access_addr
- local_sda
) < range_h
)
10938 || (local_sda
> access_addr
&& (local_sda
- access_addr
) <= range_l
))
10940 hi_irelfn
->r_info
=
10941 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
10943 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10949 /* Relax LO12 relocation for nds32_elf_relax_section. */
10952 nds32_elf_relax_lo12 (struct bfd_link_info
*link_info
, bfd
*abfd
,
10953 asection
*sec
, Elf_Internal_Rela
*irel
,
10954 Elf_Internal_Rela
*internal_relocs
, bfd_byte
*contents
,
10955 Elf_Internal_Sym
*isymbuf
, Elf_Internal_Shdr
*symtab_hdr
)
10958 bfd_vma local_sda
, laddr
;
10959 unsigned long reloc
;
10960 bfd_vma access_addr
;
10961 bfd_vma range_l
= 0, range_h
= 0; /* Upper/lower bound. */
10962 Elf_Internal_Rela
*irelfn
= NULL
, *irelend
;
10963 struct elf_link_hash_entry
*h
= NULL
;
10966 /* For SDA base relative relaxation. */
10967 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
10968 &local_sda
, FALSE
);
10970 irelend
= internal_relocs
+ sec
->reloc_count
;
10971 laddr
= irel
->r_offset
;
10972 insn
= bfd_getb32 (contents
+ laddr
);
10974 if (!is_sda_access_insn (insn
) && N32_OP6 (insn
) != N32_OP6_ORI
)
10977 access_addr
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
10979 if (ELF32_R_SYM (irel
->r_info
) >= symtab_hdr
->sh_info
)
10981 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
10982 h
= elf_sym_hashes (abfd
)[indx
];
10985 if (N32_OP6 (insn
) == N32_OP6_ORI
&& access_addr
< CONSERVATIVE_20BIT
10986 && (!h
|| (h
&& strcmp (h
->root
.root
.string
, FP_BASE_NAME
) != 0)))
10988 reloc
= R_NDS32_20_RELA
;
10989 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
10990 insn
= N32_TYPE1 (MOVI
, N32_RT5 (insn
), 0);
10991 bfd_putb32 (insn
, contents
+ laddr
);
10993 /* This is avoid to relax symbol address which is fixed
10994 relocations. Ex: _stack. */
10995 else if (N32_OP6 (insn
) == N32_OP6_ORI
10996 && h
&& bfd_is_abs_section (h
->root
.u
.def
.section
))
11000 range_l
= sdata_range
[1][0];
11001 range_h
= sdata_range
[1][1];
11002 switch (ELF32_R_TYPE (irel
->r_info
))
11004 case R_NDS32_LO12S0_RELA
:
11005 reloc
= R_NDS32_SDA19S0_RELA
;
11007 case R_NDS32_LO12S1_RELA
:
11008 reloc
= R_NDS32_SDA18S1_RELA
;
11010 case R_NDS32_LO12S2_RELA
:
11011 reloc
= R_NDS32_SDA17S2_RELA
;
11013 case R_NDS32_LO12S2_DP_RELA
:
11014 range_l
= sdata_range
[0][0];
11015 range_h
= sdata_range
[0][1];
11016 reloc
= R_NDS32_SDA12S2_DP_RELA
;
11018 case R_NDS32_LO12S2_SP_RELA
:
11019 range_l
= sdata_range
[0][0];
11020 range_h
= sdata_range
[0][1];
11021 reloc
= R_NDS32_SDA12S2_SP_RELA
;
11027 /* There are range_h and range_l because linker has to promise
11028 all sections move cross one page together. */
11029 if ((local_sda
<= access_addr
&& (access_addr
- local_sda
) < range_h
)
11030 || (local_sda
> access_addr
&& (local_sda
- access_addr
) <= range_l
))
11032 if (N32_OP6 (insn
) == N32_OP6_ORI
&& N32_RT5 (insn
) == REG_GP
)
11034 /* Maybe we should add R_NDS32_INSN16 reloc type here
11035 or manually do some optimization. sethi can't be
11036 eliminated when updating $gp so the relative ori
11037 needs to be preserved. */
11040 if (!turn_insn_to_sda_access (insn
, ELF32_R_TYPE (irel
->r_info
),
11043 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
11044 bfd_putb32 (insn
, contents
+ laddr
);
11046 irelfn
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11048 /* SDA17 must keep INSN16 for converting fp_as_gp. */
11049 if (irelfn
!= irelend
&& reloc
!= R_NDS32_SDA17S2_RELA
)
11051 ELF32_R_INFO (ELF32_R_SYM (irelfn
->r_info
), R_NDS32_NONE
);
11058 /* Relax low part of PIC instruction pattern. */
11061 nds32_elf_relax_piclo12 (struct bfd_link_info
*link_info
, bfd
*abfd
,
11062 asection
*sec
, Elf_Internal_Rela
*irel
,
11063 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11064 Elf_Internal_Shdr
*symtab_hdr
)
11067 bfd_vma local_sda
, laddr
;
11068 bfd_signed_vma foff
;
11069 unsigned long reloc
;
11071 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
11072 &local_sda
, FALSE
);
11073 laddr
= irel
->r_offset
;
11074 insn
= bfd_getb32 (contents
+ laddr
);
11076 if (N32_OP6 (insn
) != N32_OP6_ORI
)
11079 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOT_LO12
)
11081 foff
= calculate_got_memory_address (abfd
, link_info
, irel
,
11082 symtab_hdr
) - local_sda
;
11083 reloc
= R_NDS32_GOT20
;
11085 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_PLT_GOTREL_LO12
)
11087 foff
= calculate_plt_memory_address (abfd
, link_info
, isymbuf
, irel
,
11088 symtab_hdr
) - local_sda
;
11089 reloc
= R_NDS32_PLT_GOTREL_LO20
;
11091 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOTOFF_LO12
)
11093 foff
= calculate_memory_address (abfd
, irel
, isymbuf
,
11094 symtab_hdr
) - local_sda
;
11095 reloc
= R_NDS32_GOTOFF
;
11097 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOTPC_LO12
)
11099 foff
= local_sda
- sec
->output_section
->vma
+ sec
->output_offset
11100 + irel
->r_offset
+ irel
->r_addend
;
11101 reloc
= R_NDS32_GOTPC20
;
11106 if ((foff
< CONSERVATIVE_20BIT
) && (foff
>= -CONSERVATIVE_20BIT
))
11108 /* Turn into MOVI. */
11109 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
11110 insn
= N32_TYPE1 (MOVI
, N32_RT5 (insn
), 0);
11111 bfd_putb32 (insn
, contents
+ laddr
);
11115 /* Relax low part of LE TLS instruction pattern. */
11118 nds32_elf_relax_letlslo12 (struct bfd_link_info
*link_info
, bfd
*abfd
,
11119 Elf_Internal_Rela
*irel
,
11120 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11121 Elf_Internal_Shdr
*symtab_hdr
)
11125 bfd_signed_vma foff
;
11126 unsigned long reloc
;
11128 laddr
= irel
->r_offset
;
11129 foff
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
11130 BFD_ASSERT (elf_hash_table (link_info
)->tls_sec
!= NULL
);
11131 foff
-= (elf_hash_table (link_info
)->tls_sec
->vma
+ TP_OFFSET
);
11132 insn
= bfd_getb32 (contents
+ laddr
);
11134 if ( (bfd_signed_vma
) (foff
) < CONSERVATIVE_20BIT
11135 && (bfd_signed_vma
) (foff
) >= -CONSERVATIVE_20BIT
)
11137 /* Pattern sethi-ori transform to movi. */
11138 reloc
= R_NDS32_TLS_LE_20
;
11139 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
11140 insn
= N32_TYPE1 (MOVI
, N32_RT5 (insn
), 0);
11141 bfd_putb32 (insn
, contents
+ laddr
);
11145 /* Relax LE TLS calculate address instruction pattern. */
11148 nds32_elf_relax_letlsadd (struct bfd_link_info
*link_info
, bfd
*abfd
,
11149 asection
*sec
, Elf_Internal_Rela
*irel
,
11150 Elf_Internal_Rela
*internal_relocs
,
11151 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11152 Elf_Internal_Shdr
*symtab_hdr
, bfd_boolean
*again
)
11154 /* Local TLS non-pic
11155 sethi ta, hi20(symbol@tpoff) ; TLS_LE_HI20
11156 ori ta, ta, lo12(symbol@tpoff) ; TLS_LE_LO12
11157 add ra, ta, tp ; TLS_LE_ADD */
11161 bfd_signed_vma foff
;
11162 Elf_Internal_Rela
*i1_irelfn
, *irelend
;
11164 irelend
= internal_relocs
+ sec
->reloc_count
;
11165 laddr
= irel
->r_offset
;
11166 insn
= bfd_getb32 (contents
+ laddr
);
11167 i1_irelfn
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11168 R_NDS32_PTR_RESOLVED
);
11169 foff
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
11170 BFD_ASSERT (elf_hash_table (link_info
)->tls_sec
!= NULL
);
11171 foff
-= (elf_hash_table (link_info
)->tls_sec
->vma
+ TP_OFFSET
);
11173 /* The range is +/-16k. */
11174 if ((bfd_signed_vma
) (foff
) < CONSERVATIVE_15BIT
11175 && (bfd_signed_vma
) (foff
) >= -CONSERVATIVE_15BIT
)
11177 /* Transform add to addi. */
11178 insn
= N32_TYPE2 (ADDI
, N32_RT5 (insn
), N32_RB5 (insn
), 0);
11180 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_TLS_LE_15S0
);
11182 bfd_putb32 (insn
, contents
+ laddr
);
11183 if (i1_irelfn
!= irelend
)
11185 i1_irelfn
->r_addend
|= 1;
11191 /* Relax LE TLS load store instruction pattern. */
11194 nds32_elf_relax_letlsls (struct bfd_link_info
*link_info
, bfd
*abfd
,
11195 asection
*sec
, Elf_Internal_Rela
*irel
,
11196 Elf_Internal_Rela
*internal_relocs
,
11197 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11198 Elf_Internal_Shdr
*symtab_hdr
, bfd_boolean
*again
)
11203 bfd_signed_vma foff
;
11204 Elf_Internal_Rela
*i1_irelfn
, *irelend
;
11207 irelend
= internal_relocs
+ sec
->reloc_count
;
11208 laddr
= irel
->r_offset
;
11209 insn
= bfd_getb32 (contents
+ laddr
);
11210 i1_irelfn
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11211 R_NDS32_PTR_RESOLVED
);
11212 foff
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
11213 BFD_ASSERT (elf_hash_table (link_info
)->tls_sec
!= NULL
);
11214 foff
-= (elf_hash_table (link_info
)->tls_sec
->vma
+ TP_OFFSET
);
11216 switch ((N32_OP6 (insn
) << 8) | (insn
& 0xff))
11218 case (N32_OP6_MEM
<< 8) | N32_MEM_LB
:
11219 case (N32_OP6_MEM
<< 8) | N32_MEM_SB
:
11220 case (N32_OP6_MEM
<< 8) | N32_MEM_LBS
:
11221 /* The range is +/-16k. */
11222 if ((bfd_signed_vma
) (foff
) < CONSERVATIVE_15BIT
11223 && (bfd_signed_vma
) (foff
) >= -CONSERVATIVE_15BIT
)
11226 ((insn
& 0xff) << 25) | (insn
& 0x1f00000) | ((insn
& 0x7c00) << 5);
11228 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_TLS_LE_15S0
);
11232 case (N32_OP6_MEM
<< 8) | N32_MEM_LH
:
11233 case (N32_OP6_MEM
<< 8) | N32_MEM_SH
:
11234 case (N32_OP6_MEM
<< 8) | N32_MEM_LHS
:
11235 /* The range is +/-32k. */
11236 if ((bfd_signed_vma
) (foff
) < CONSERVATIVE_15BIT_S1
11237 && (bfd_signed_vma
) (foff
) >= -CONSERVATIVE_15BIT_S1
)
11240 ((insn
& 0xff) << 25) | (insn
& 0x1f00000) | ((insn
& 0x7c00) << 5);
11242 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_TLS_LE_15S1
);
11246 case (N32_OP6_MEM
<< 8) | N32_MEM_LW
:
11247 case (N32_OP6_MEM
<< 8) | N32_MEM_SW
:
11248 /* The range is +/-64k. */
11249 if ((bfd_signed_vma
) (foff
) < CONSERVATIVE_15BIT_S2
11250 && (bfd_signed_vma
) (foff
) >= -CONSERVATIVE_15BIT_S2
)
11253 ((insn
& 0xff) << 25) | (insn
& 0x1f00000) | ((insn
& 0x7c00) << 5);
11255 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_TLS_LE_15S2
);
11265 bfd_putb32 (insn
, contents
+ laddr
);
11266 if (i1_irelfn
!= irelend
)
11268 i1_irelfn
->r_addend
|= 1;
11274 /* Relax PTR relocation for nds32_elf_relax_section. */
11277 nds32_elf_relax_ptr (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
11278 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
11279 int *seq_len
, bfd_byte
*contents
)
11281 Elf_Internal_Rela
*ptr_irel
, *irelend
, *count_irel
, *re_irel
;
11283 irelend
= internal_relocs
+ sec
->reloc_count
;
11286 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11287 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
11289 if (re_irel
== irelend
)
11292 ("%B: warning: R_NDS32_PTR points to unrecognized reloc at 0x%lx.",
11293 abfd
, (long) irel
->r_offset
);
11297 if (re_irel
->r_addend
!= 1)
11300 /* Pointed target is relaxed and no longer needs this void *,
11301 change the type to NONE. */
11302 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11304 /* Find PTR_COUNT to decide remove it or not. If PTR_COUNT does
11305 not exist, it means only count 1 and remove it directly. */
11306 /* TODO: I hope we can obsolate R_NDS32_COUNT in the future. */
11307 count_irel
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11308 R_NDS32_PTR_COUNT
);
11309 ptr_irel
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11311 if (count_irel
!= irelend
)
11313 if (--count_irel
->r_addend
> 0)
11317 if (ptr_irel
!= irelend
)
11320 /* If the PTR_COUNT is already 0, remove current instruction. */
11321 *seq_len
= nds32_elf_insn_size (abfd
, contents
, irel
->r_offset
);
11326 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */
11329 nds32_elf_relax_pltgot_suff (struct bfd_link_info
*link_info
, bfd
*abfd
,
11330 asection
*sec
, Elf_Internal_Rela
*irel
,
11331 Elf_Internal_Rela
*internal_relocs
,
11332 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11333 Elf_Internal_Shdr
*symtab_hdr
, bfd_boolean
*again
)
11336 bfd_signed_vma foff
;
11337 Elf_Internal_Rela
*i1_irelfn
, *irelend
;
11338 bfd_vma local_sda
, laddr
;
11340 irelend
= internal_relocs
+ sec
->reloc_count
;
11341 laddr
= irel
->r_offset
;
11342 insn
= bfd_getb32 (contents
+ laddr
);
11344 /* FIXME: It's a little trouble to turn JRAL5 to JAL since
11345 we need additional space. It might be help if we could
11346 borrow some space from instructions to be eliminated
11347 such as sethi, ori, add. */
11348 if (insn
& 0x80000000)
11351 if (nds32_elf_check_dup_relocs
11352 (irel
, internal_relocs
, irelend
, R_NDS32_PLT_GOT_SUFF
))
11356 find_relocs_at_address (irel
, internal_relocs
, irelend
,
11357 R_NDS32_PTR_RESOLVED
);
11360 The boundary should be reduced since the .plt section hasn't
11361 been created and the address of specific entry is still unknown
11362 Maybe the range between the function call and the begin of the
11363 .text section can be used to decide if the .plt is in the range
11364 of function call. */
11366 if (N32_OP6 (insn
) == N32_OP6_ALU1
11367 && N32_SUB5 (insn
) == N32_ALU1_ADD
)
11369 /* Get the value of the symbol referred to by the reloc. */
11370 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
11371 &local_sda
, FALSE
);
11372 foff
= (bfd_signed_vma
) (calculate_plt_memory_address
11373 (abfd
, link_info
, isymbuf
, irel
,
11374 symtab_hdr
) - local_sda
);
11375 /* This condition only happened when symbol is undefined. */
11379 if (foff
< -CONSERVATIVE_19BIT
|| foff
>= CONSERVATIVE_19BIT
)
11381 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
11382 R_NDS32_PLT_GOTREL_LO19
);
11384 insn
= N32_TYPE1 (SBGP
, N32_RT5 (insn
), __BIT (19));
11386 else if (N32_OP6 (insn
) == N32_OP6_JREG
11387 && N32_SUB5 (insn
) == N32_JREG_JRAL
)
11389 /* Get the value of the symbol referred to by the reloc. */
11391 calculate_plt_offset (abfd
, sec
, link_info
, isymbuf
, irel
, symtab_hdr
);
11392 /* This condition only happened when symbol is undefined. */
11395 if (foff
< -CONSERVATIVE_24BIT_S1
|| foff
>= CONSERVATIVE_24BIT_S1
)
11397 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_25_PLTREL
);
11403 bfd_putb32 (insn
, contents
+ laddr
);
11404 if (i1_irelfn
!= irelend
)
11406 i1_irelfn
->r_addend
|= 1;
11411 /* Relax GOT_SUFF relocation for nds32_elf_relax_section. */
11414 nds32_elf_relax_got_suff (struct bfd_link_info
*link_info
, bfd
*abfd
,
11415 asection
*sec
, Elf_Internal_Rela
*irel
,
11416 Elf_Internal_Rela
*internal_relocs
,
11417 bfd_byte
*contents
, Elf_Internal_Shdr
*symtab_hdr
,
11418 bfd_boolean
*again
)
11421 bfd_signed_vma foff
;
11422 Elf_Internal_Rela
*i1_irelfn
, *irelend
;
11423 bfd_vma local_sda
, laddr
;
11425 irelend
= internal_relocs
+ sec
->reloc_count
;
11426 laddr
= irel
->r_offset
;
11427 insn
= bfd_getb32 (contents
+ laddr
);
11428 if (insn
& 0x80000000)
11431 if (nds32_elf_check_dup_relocs
11432 (irel
, internal_relocs
, irelend
, R_NDS32_GOT_SUFF
))
11435 i1_irelfn
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11436 R_NDS32_PTR_RESOLVED
);
11438 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
11439 &local_sda
, FALSE
);
11440 foff
= calculate_got_memory_address (abfd
, link_info
, irel
,
11441 symtab_hdr
) - local_sda
;
11443 if (foff
< CONSERVATIVE_19BIT
&& foff
>= -CONSERVATIVE_19BIT
)
11445 /* Turn LW to LWI.GP. Change relocation type to R_NDS32_GOT_REL. */
11446 insn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __MF (6, 17, 3));
11448 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_GOT17S2_RELA
);
11449 bfd_putb32 (insn
, contents
+ laddr
);
11450 if (i1_irelfn
!= irelend
)
11452 i1_irelfn
->r_addend
|= 1;
11458 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */
11461 nds32_elf_relax_gotoff_suff (struct bfd_link_info
*link_info
, bfd
*abfd
,
11462 asection
*sec
, Elf_Internal_Rela
*irel
,
11463 Elf_Internal_Rela
*internal_relocs
,
11464 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11465 Elf_Internal_Shdr
*symtab_hdr
, bfd_boolean
*again
)
11467 int opc_insn_gotoff
;
11469 bfd_signed_vma foff
;
11470 Elf_Internal_Rela
*i1_irelfn
, *i2_irelfn
, *irelend
;
11471 bfd_vma local_sda
, laddr
;
11473 irelend
= internal_relocs
+ sec
->reloc_count
;
11474 laddr
= irel
->r_offset
;
11475 insn
= bfd_getb32 (contents
+ laddr
);
11477 if (insn
& 0x80000000)
11480 if (nds32_elf_check_dup_relocs
11481 (irel
, internal_relocs
, irelend
, R_NDS32_GOTOFF_SUFF
))
11484 i1_irelfn
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11485 R_NDS32_PTR_RESOLVED
);
11486 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
11487 &local_sda
, FALSE
);
11488 foff
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
11489 foff
= foff
- local_sda
;
11491 if (foff
>= CONSERVATIVE_19BIT
|| foff
< -CONSERVATIVE_19BIT
)
11494 /* Concatenate opcode and sub-opcode for switch case.
11495 It may be MEM or ALU1. */
11496 opc_insn_gotoff
= (N32_OP6 (insn
) << 8) | (insn
& 0xff);
11497 switch (opc_insn_gotoff
)
11499 case (N32_OP6_MEM
<< 8) | N32_MEM_LW
:
11500 /* 4-byte aligned. */
11501 insn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __MF (6, 17, 3));
11503 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA17S2_RELA
);
11505 case (N32_OP6_MEM
<< 8) | N32_MEM_SW
:
11506 insn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __MF (7, 17, 3));
11508 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA17S2_RELA
);
11510 case (N32_OP6_MEM
<< 8) | N32_MEM_LH
:
11511 /* 2-byte aligned. */
11512 insn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), 0);
11514 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA18S1_RELA
);
11516 case (N32_OP6_MEM
<< 8) | N32_MEM_LHS
:
11517 insn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __BIT (18));
11519 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA18S1_RELA
);
11521 case (N32_OP6_MEM
<< 8) | N32_MEM_SH
:
11522 insn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __BIT (19));
11524 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA18S1_RELA
);
11526 case (N32_OP6_MEM
<< 8) | N32_MEM_LB
:
11527 /* 1-byte aligned. */
11528 insn
= N32_TYPE1 (LBGP
, N32_RT5 (insn
), 0);
11530 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA19S0_RELA
);
11532 case (N32_OP6_MEM
<< 8) | N32_MEM_LBS
:
11533 insn
= N32_TYPE1 (LBGP
, N32_RT5 (insn
), __BIT (19));
11535 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA19S0_RELA
);
11537 case (N32_OP6_MEM
<< 8) | N32_MEM_SB
:
11538 insn
= N32_TYPE1 (SBGP
, N32_RT5 (insn
), 0);
11540 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA19S0_RELA
);
11542 case (N32_OP6_ALU1
<< 8) | N32_ALU1_ADD
:
11543 insn
= N32_TYPE1 (SBGP
, N32_RT5 (insn
), __BIT (19));
11545 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_SDA19S0_RELA
);
11551 bfd_putb32 (insn
, contents
+ laddr
);
11552 if (i1_irelfn
!= irelend
)
11554 i1_irelfn
->r_addend
|= 1;
11557 if ((i2_irelfn
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11558 R_NDS32_INSN16
)) != irelend
)
11559 i2_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11564 nds32_relax_adjust_label (bfd
*abfd
, asection
*sec
,
11565 Elf_Internal_Rela
*internal_relocs
,
11566 bfd_byte
*contents
,
11567 nds32_elf_blank_t
**relax_blank_list
,
11568 int optimize
, int opt_size
)
11570 /* This code block is used to adjust 4-byte alignment by relax a pair
11571 of instruction a time.
11573 It recognizes three types of relocations.
11574 1. R_NDS32_LABEL - a aligment.
11575 2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11576 3. is_16bit_NOP () - remove a 16-bit instruction. */
11578 /* TODO: It seems currently implementation only support 4-byte aligment.
11579 We should handle any-aligment. */
11581 Elf_Internal_Rela
*insn_rel
= NULL
, *label_rel
= NULL
, *irel
;
11582 Elf_Internal_Rela
*tmp_rel
, *tmp2_rel
= NULL
;
11583 Elf_Internal_Rela rel_temp
;
11584 Elf_Internal_Rela
*irelend
;
11588 /* Checking for branch relaxation relies on the relocations to
11589 be sorted on 'r_offset'. This is not guaranteed so we must sort. */
11590 nds32_insertion_sort (internal_relocs
, sec
->reloc_count
,
11591 sizeof (Elf_Internal_Rela
), compar_reloc
);
11593 irelend
= internal_relocs
+ sec
->reloc_count
;
11595 /* Force R_NDS32_LABEL before R_NDS32_INSN16. */
11596 /* FIXME: Can we generate the right order in assembler?
11597 So we don't have to swapping them here. */
11599 for (label_rel
= internal_relocs
, insn_rel
= internal_relocs
;
11600 label_rel
< irelend
; label_rel
++)
11602 if (ELF32_R_TYPE (label_rel
->r_info
) != R_NDS32_LABEL
)
11605 /* Find the first reloc has the same offset with label_rel. */
11606 while (insn_rel
< irelend
&& insn_rel
->r_offset
< label_rel
->r_offset
)
11609 for (;insn_rel
< irelend
&& insn_rel
->r_offset
== label_rel
->r_offset
;
11611 /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11613 if (ELF32_R_TYPE (insn_rel
->r_info
) == R_NDS32_INSN16
)
11616 if (insn_rel
< irelend
&& insn_rel
->r_offset
== label_rel
->r_offset
11617 && insn_rel
< label_rel
)
11619 /* Swap the two reloc if the R_NDS32_INSN16 is
11620 before R_NDS32_LABEL. */
11621 memcpy (&rel_temp
, insn_rel
, sizeof (Elf_Internal_Rela
));
11622 memcpy (insn_rel
, label_rel
, sizeof (Elf_Internal_Rela
));
11623 memcpy (label_rel
, &rel_temp
, sizeof (Elf_Internal_Rela
));
11629 /* If there were a sequence of R_NDS32_LABEL end up with .align 2
11630 or higher, remove other R_NDS32_LABEL with lower alignment.
11631 If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
11632 then the R_NDS32_LABEL sequence is broke. */
11633 for (tmp_rel
= internal_relocs
; tmp_rel
< irelend
; tmp_rel
++)
11635 if (ELF32_R_TYPE (tmp_rel
->r_info
) == R_NDS32_LABEL
)
11637 if (label_rel
== NULL
)
11639 if (tmp_rel
->r_addend
< 2)
11640 label_rel
= tmp_rel
;
11643 else if (tmp_rel
->r_addend
> 1)
11645 /* Remove all LABEL relocation from label_rel to tmp_rel
11646 including relocations with same offset as tmp_rel. */
11647 for (tmp2_rel
= label_rel
; tmp2_rel
< tmp_rel
11648 || tmp2_rel
->r_offset
== tmp_rel
->r_offset
; tmp2_rel
++)
11650 if (ELF32_R_TYPE (tmp2_rel
->r_info
) == R_NDS32_LABEL
11651 && tmp2_rel
->r_addend
< 2)
11653 ELF32_R_INFO (ELF32_R_SYM (tmp2_rel
->r_info
),
11659 else if (ELF32_R_TYPE (tmp_rel
->r_info
) == R_NDS32_INSN16
&& label_rel
)
11661 /* A new INSN16 which can be converted, so clear label_rel. */
11662 if (is_convert_32_to_16 (abfd
, sec
, tmp_rel
, internal_relocs
,
11664 || is_16bit_NOP (abfd
, sec
, tmp_rel
))
11671 /* Optimized for speed and nothing has not been relaxed.
11672 It's time to align labels.
11673 We may convert a 16-bit instruction right before a label to
11674 32-bit, in order to align the label if necessary
11675 all reloc entries has been sorted by r_offset. */
11676 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
11678 if (ELF32_R_TYPE (irel
->r_info
) != R_NDS32_INSN16
11679 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_LABEL
)
11682 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_INSN16
)
11684 /* A new INSN16 found, resize the old one. */
11685 if (is_convert_32_to_16
11686 (abfd
, sec
, irel
, internal_relocs
, irelend
, &insn16
)
11687 || is_16bit_NOP (abfd
, sec
, irel
))
11691 /* Previous INSN16 reloc exists, reduce its
11693 if (is_convert_32_to_16 (abfd
, sec
, insn_rel
, internal_relocs
,
11696 nds32_elf_write_16 (abfd
, contents
, insn_rel
,
11697 internal_relocs
, irelend
, insn16
);
11699 if (!insert_nds32_elf_blank_recalc_total
11700 (relax_blank_list
, insn_rel
->r_offset
+ 2, 2))
11703 else if (is_16bit_NOP (abfd
, sec
, insn_rel
))
11705 if (!insert_nds32_elf_blank_recalc_total
11706 (relax_blank_list
, insn_rel
->r_offset
, 2))
11710 ELF32_R_INFO (ELF32_R_SYM (insn_rel
->r_info
), R_NDS32_NONE
);
11712 /* Save the new one for later use. */
11716 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
11719 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
)
11721 /* Search for label. */
11722 int force_relax
= 0;
11724 /* Label on 16-bit instruction or optimization
11725 needless, just reset this reloc. */
11726 insn16
= bfd_getb16 (contents
+ irel
->r_offset
);
11727 if ((irel
->r_addend
& 0x1f) < 2 && (!optimize
|| (insn16
& 0x8000)))
11730 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11735 irel
->r_offset
- get_nds32_elf_blank_total (relax_blank_list
,
11736 irel
->r_offset
, 1);
11740 /* Check if there is case which can not be aligned. */
11741 if (irel
->r_addend
== 2 && address
& 0x2)
11746 /* Try to align this label. */
11748 if ((irel
->r_addend
& 0x1f) < 2)
11750 /* Check if there is a INSN16 at the same address.
11751 Label_rel always seats before insn_rel after
11754 /* Search for INSN16 at LABEL location. If INSN16 is at
11755 same location and this LABEL alignment is lower than 2,
11756 the INSN16 can be converted to 2-byte. */
11757 for (tmp_rel
= irel
;
11758 tmp_rel
< irelend
&& tmp_rel
->r_offset
== irel
->r_offset
;
11761 if (ELF32_R_TYPE (tmp_rel
->r_info
) == R_NDS32_INSN16
11762 && (is_convert_32_to_16
11763 (abfd
, sec
, tmp_rel
, internal_relocs
,
11765 || is_16bit_NOP (abfd
, sec
, tmp_rel
)))
11773 if (force_relax
|| irel
->r_addend
== 1 || address
& 0x2)
11775 /* Label not aligned. */
11776 /* Previous reloc exists, reduce its size to 16-bit. */
11777 if (is_convert_32_to_16 (abfd
, sec
, insn_rel
,
11778 internal_relocs
, irelend
, &insn16
))
11780 nds32_elf_write_16 (abfd
, contents
, insn_rel
,
11781 internal_relocs
, irelend
, insn16
);
11783 if (!insert_nds32_elf_blank_recalc_total
11784 (relax_blank_list
, insn_rel
->r_offset
+ 2, 2))
11787 else if (is_16bit_NOP (abfd
, sec
, insn_rel
))
11789 if (!insert_nds32_elf_blank_recalc_total
11790 (relax_blank_list
, insn_rel
->r_offset
, 2))
11795 /* INSN16 reloc is used. */
11801 sec
->size
- get_nds32_elf_blank_total (relax_blank_list
, sec
->size
, 0);
11802 if (insn_rel
&& (address
& 0x2 || opt_size
))
11804 if (is_convert_32_to_16 (abfd
, sec
, insn_rel
, internal_relocs
,
11807 nds32_elf_write_16 (abfd
, contents
, insn_rel
, internal_relocs
,
11809 if (!insert_nds32_elf_blank_recalc_total
11810 (relax_blank_list
, insn_rel
->r_offset
+ 2, 2))
11812 insn_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (insn_rel
->r_info
),
11815 else if (is_16bit_NOP (abfd
, sec
, insn_rel
))
11817 if (!insert_nds32_elf_blank_recalc_total
11818 (relax_blank_list
, insn_rel
->r_offset
, 2))
11820 insn_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (insn_rel
->r_info
),
11828 /* Pick relaxation round. */
11831 nds32_elf_pick_relax (bfd_boolean init
, asection
*sec
, bfd_boolean
*again
,
11832 struct elf_nds32_link_hash_table
*table
,
11833 struct bfd_link_info
*link_info
)
11835 static asection
*final_sec
, *first_sec
= NULL
;
11836 static bfd_boolean normal_again
= FALSE
;
11837 static bfd_boolean set
= FALSE
;
11838 static bfd_boolean first
= TRUE
;
11839 int round_table
[] = {
11840 NDS32_RELAX_NORMAL_ROUND
,
11841 NDS32_RELAX_JUMP_IFC_ROUND
,
11842 NDS32_RELAX_EX9_BUILD_ROUND
,
11843 NDS32_RELAX_EX9_REPLACE_ROUND
,
11845 static int pass
= 0;
11846 static int relax_round
;
11848 /* The new round. */
11849 if (init
&& first_sec
== sec
)
11852 normal_again
= FALSE
;
11857 /* Run an empty run to get the final section. */
11858 relax_round
= NDS32_RELAX_EMPTY_ROUND
;
11860 /* It has to enter relax again because we can
11861 not make sure what the final turn is. */
11870 /* Not reenter yet. */
11872 return relax_round
;
11875 relax_round
= round_table
[pass
];
11877 if (!init
&& relax_round
== NDS32_RELAX_NORMAL_ROUND
&& *again
)
11878 normal_again
= TRUE
;
11880 if (!init
&& final_sec
== sec
)
11882 switch (relax_round
)
11884 case NDS32_RELAX_NORMAL_ROUND
:
11887 /* Normal relaxation done. */
11888 if (table
->target_optimize
& NDS32_RELAX_JUMP_IFC_ON
)
11893 else if (table
->target_optimize
& NDS32_RELAX_EX9_ON
)
11895 pass
+= 2; /* NDS32_RELAX_EX9_BUILD_ROUND */
11898 else if (table
->ex9_import_file
)
11900 /* Import ex9 table. */
11901 if (table
->update_ex9_table
)
11902 pass
+= 2; /* NDS32_RELAX_EX9_BUILD_ROUND */
11904 pass
+= 3; /* NDS32_RELAX_EX9_REPLACE_ROUND */
11905 nds32_elf_ex9_import_table (link_info
);
11910 case NDS32_RELAX_JUMP_IFC_ROUND
:
11911 if (!nds32_elf_ifc_finish (link_info
))
11912 _bfd_error_handler (_("error: Jump IFC Fail."));
11913 if (table
->target_optimize
& NDS32_RELAX_EX9_ON
)
11919 case NDS32_RELAX_EX9_BUILD_ROUND
:
11920 nds32_elf_ex9_finish (link_info
);
11924 case NDS32_RELAX_EX9_REPLACE_ROUND
:
11925 if (table
->target_optimize
& NDS32_RELAX_JUMP_IFC_ON
)
11927 /* Do jump IFC optimization again. */
11928 if (!nds32_elf_ifc_finish (link_info
))
11929 _bfd_error_handler (_("error: Jump IFC Fail."));
11937 return relax_round
;
11941 nds32_elf_relax_section (bfd
*abfd
, asection
*sec
,
11942 struct bfd_link_info
*link_info
, bfd_boolean
*again
)
11944 nds32_elf_blank_t
*relax_blank_list
= NULL
;
11945 Elf_Internal_Shdr
*symtab_hdr
;
11946 Elf_Internal_Rela
*internal_relocs
;
11947 Elf_Internal_Rela
*irel
;
11948 Elf_Internal_Rela
*irelend
;
11949 Elf_Internal_Sym
*isymbuf
= NULL
;
11950 bfd_byte
*contents
= NULL
;
11951 bfd_boolean result
= TRUE
;
11957 /* Target dependnet option. */
11958 struct elf_nds32_link_hash_table
*table
;
11959 int load_store_relax
;
11962 relax_blank_list
= NULL
;
11966 /* Nothing to do for
11967 * relocatable link or
11968 * non-relocatable section or
11969 * non-code section or
11971 * no reloc entry. */
11972 if (bfd_link_relocatable (link_info
)
11973 || (sec
->flags
& SEC_RELOC
) == 0
11974 || (sec
->flags
& SEC_EXCLUDE
) == 1
11975 || (sec
->flags
& SEC_CODE
) == 0
11979 /* 09.12.11 Workaround. */
11980 /* We have to adjust align for R_NDS32_LABEL if needed.
11981 The adjust approach only can fix 2-byte align once. */
11982 if (sec
->alignment_power
> 2)
11985 /* The optimization type to do. */
11987 table
= nds32_elf_hash_table (link_info
);
11988 relax_round
= nds32_elf_pick_relax (TRUE
, sec
, again
, table
, link_info
);
11989 switch (relax_round
)
11991 case NDS32_RELAX_JUMP_IFC_ROUND
:
11992 /* Here is the entrance of ifc jump relaxation. */
11993 if (!nds32_elf_ifc_calc (link_info
, abfd
, sec
))
11995 nds32_elf_pick_relax (FALSE
, sec
, again
, table
, link_info
);
11998 case NDS32_RELAX_EX9_BUILD_ROUND
:
11999 /* Here is the entrance of ex9 relaxation. There are two pass of
12000 ex9 relaxation. The one is to traverse all instructions and build
12001 the hash table. The other one is to compare instructions and replace
12003 if (!nds32_elf_ex9_build_hash_table (abfd
, sec
, link_info
))
12005 nds32_elf_pick_relax (FALSE
, sec
, again
, table
, link_info
);
12008 case NDS32_RELAX_EX9_REPLACE_ROUND
:
12009 if (!nds32_elf_ex9_replace_instruction (link_info
, abfd
, sec
))
12013 case NDS32_RELAX_EMPTY_ROUND
:
12014 nds32_elf_pick_relax (FALSE
, sec
, again
, table
, link_info
);
12017 case NDS32_RELAX_NORMAL_ROUND
:
12019 if (sec
->reloc_count
== 0)
12024 /* The begining of general relaxation. */
12026 if (is_SDA_BASE_set
== 0)
12029 is_SDA_BASE_set
= 1;
12030 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
12032 relax_range_measurement (abfd
);
12035 if (is_ITB_BASE_set
== 0)
12037 /* Set the _ITB_BASE_. */
12038 if (!nds32_elf_ex9_itb_base (link_info
))
12040 _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"), abfd
);
12041 bfd_set_error (bfd_error_bad_value
);
12045 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
12046 /* Relocations MUST be kept in memory, because relaxation adjust them. */
12047 internal_relocs
= _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
,
12048 TRUE
/* keep_memory */);
12049 if (internal_relocs
== NULL
)
12052 irelend
= internal_relocs
+ sec
->reloc_count
;
12053 irel
= find_relocs_at_address (internal_relocs
, internal_relocs
,
12054 irelend
, R_NDS32_RELAX_ENTRY
);
12056 if (irel
== irelend
)
12059 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_ENTRY
)
12061 if (irel
->r_addend
& R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG
)
12063 nds32_elf_pick_relax (FALSE
, sec
, again
, table
, link_info
);
12067 if (irel
->r_addend
& R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG
)
12070 if (irel
->r_addend
& R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG
)
12074 load_store_relax
= table
->load_store_relax
;
12076 /* Get symbol table and section content. */
12077 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
)
12078 || !nds32_get_local_syms (abfd
, sec
, &isymbuf
))
12081 /* Do relax loop only when finalize is not done.
12082 Take care of relaxable relocs except INSN16. */
12083 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
12085 int seq_len
; /* Original length of instruction sequence. */
12086 int insn_len
= 0; /* Final length of instruction sequence. */
12087 bfd_boolean removed
;
12090 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
12091 && (irel
->r_addend
& 0x1f) >= 2)
12094 /* Relocation Types
12095 R_NDS32_LONGCALL1 53
12096 R_NDS32_LONGCALL2 54
12097 R_NDS32_LONGCALL3 55
12098 R_NDS32_LONGJUMP1 56
12099 R_NDS32_LONGJUMP2 57
12100 R_NDS32_LONGJUMP3 58
12101 R_NDS32_LOADSTORE 59 */
12102 if (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_LONGCALL1
12103 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_LOADSTORE
)
12104 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
12106 /* Relocation Types
12107 R_NDS32_LONGCALL4 107
12108 R_NDS32_LONGCALL5 108
12109 R_NDS32_LONGCALL6 109
12110 R_NDS32_LONGJUMP4 110
12111 R_NDS32_LONGJUMP5 111
12112 R_NDS32_LONGJUMP6 112
12113 R_NDS32_LONGJUMP7 113 */
12114 else if (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_LONGCALL4
12115 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_LONGJUMP7
)
12118 /* Relocation Types
12119 R_NDS32_LO12S0_RELA 30
12120 R_NDS32_LO12S1_RELA 29
12121 R_NDS32_LO12S2_RELA 28
12122 R_NDS32_LO12S2_SP_RELA 71
12123 R_NDS32_LO12S2_DP_RELA 70
12124 R_NDS32_GOT_LO12 46
12125 R_NDS32_GOTOFF_LO12 50
12126 R_NDS32_PLTREL_LO12 65
12127 R_NDS32_PLT_GOTREL_LO12 67
12128 R_NDS32_17IFC_PCREL_RELA 96
12129 R_NDS32_GOT_SUFF 193
12130 R_NDS32_GOTOFF_SUFF 194
12131 R_NDS32_PLT_GOT_SUFF 195
12132 R_NDS32_MULCALL_SUFF 196
12134 else if ((ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_LO12S0_RELA
12135 && ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_LO12S2_RELA
)
12136 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S2_SP_RELA
12137 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S2_DP_RELA
12138 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOT_LO12
12139 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOTOFF_LO12
12140 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOTPC_LO12
12141 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_PLTREL_LO12
12142 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_PLT_GOTREL_LO12
12143 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_GOT_SUFF
12144 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_PTR
)
12145 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
12146 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_TLS_LE_LO12
12147 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_TLS_LE_ADD
12148 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_TLS_LE_LS
)
12153 insn_len
= seq_len
;
12156 switch (ELF32_R_TYPE (irel
->r_info
))
12158 case R_NDS32_LONGCALL1
:
12159 removed
= nds32_elf_relax_longcall1 (abfd
, sec
, irel
, internal_relocs
,
12160 &insn_len
, contents
, isymbuf
,
12163 case R_NDS32_LONGCALL2
:
12164 removed
= nds32_elf_relax_longcall2 (abfd
, sec
, irel
, internal_relocs
,
12165 &insn_len
, contents
, isymbuf
,
12168 case R_NDS32_LONGCALL3
:
12169 removed
= nds32_elf_relax_longcall3 (abfd
, sec
, irel
, internal_relocs
,
12170 &insn_len
, contents
, isymbuf
,
12173 case R_NDS32_LONGJUMP1
:
12174 removed
= nds32_elf_relax_longjump1 (abfd
, sec
, irel
, internal_relocs
,
12175 &insn_len
, contents
, isymbuf
,
12178 case R_NDS32_LONGJUMP2
:
12179 removed
= nds32_elf_relax_longjump2 (abfd
, sec
, irel
, internal_relocs
,
12180 &insn_len
, contents
, isymbuf
,
12183 case R_NDS32_LONGJUMP3
:
12184 removed
= nds32_elf_relax_longjump3 (abfd
, sec
, irel
, internal_relocs
,
12185 &insn_len
, contents
, isymbuf
,
12188 case R_NDS32_LONGCALL4
:
12189 removed
= nds32_elf_relax_longcall4 (abfd
, sec
, irel
, internal_relocs
,
12190 &insn_len
, contents
, isymbuf
,
12193 case R_NDS32_LONGCALL5
:
12194 removed
= nds32_elf_relax_longcall5 (abfd
, sec
, irel
, internal_relocs
,
12195 &insn_len
, contents
, isymbuf
,
12198 case R_NDS32_LONGCALL6
:
12199 removed
= nds32_elf_relax_longcall6 (abfd
, sec
, irel
, internal_relocs
,
12200 &insn_len
, contents
, isymbuf
,
12203 case R_NDS32_LONGJUMP4
:
12204 removed
= nds32_elf_relax_longjump4 (abfd
, sec
, irel
, internal_relocs
,
12205 &insn_len
, contents
, isymbuf
,
12208 case R_NDS32_LONGJUMP5
:
12209 removed
= nds32_elf_relax_longjump5 (abfd
, sec
, irel
, internal_relocs
,
12210 &insn_len
, &seq_len
, contents
,
12211 isymbuf
, symtab_hdr
);
12213 case R_NDS32_LONGJUMP6
:
12214 removed
= nds32_elf_relax_longjump6 (abfd
, sec
, irel
, internal_relocs
,
12215 &insn_len
, &seq_len
, contents
,
12216 isymbuf
, symtab_hdr
);
12218 case R_NDS32_LONGJUMP7
:
12219 removed
= nds32_elf_relax_longjump7 (abfd
, sec
, irel
, internal_relocs
,
12220 &insn_len
, &seq_len
, contents
,
12221 isymbuf
, symtab_hdr
);
12223 case R_NDS32_LOADSTORE
:
12224 removed
= nds32_elf_relax_loadstore (link_info
, abfd
, sec
, irel
,
12225 internal_relocs
, &insn_len
,
12226 contents
, isymbuf
, symtab_hdr
,
12229 case R_NDS32_LO12S0_RELA
:
12230 case R_NDS32_LO12S1_RELA
:
12231 case R_NDS32_LO12S2_DP_RELA
:
12232 case R_NDS32_LO12S2_SP_RELA
:
12233 case R_NDS32_LO12S2_RELA
:
12234 /* Relax for low part. */
12235 nds32_elf_relax_lo12 (link_info
, abfd
, sec
, irel
, internal_relocs
,
12236 contents
, isymbuf
, symtab_hdr
);
12238 /* It is impossible to delete blank, so just continue. */
12240 case R_NDS32_GOT_LO12
:
12241 case R_NDS32_GOTOFF_LO12
:
12242 case R_NDS32_PLTREL_LO12
:
12243 case R_NDS32_PLT_GOTREL_LO12
:
12244 case R_NDS32_GOTPC_LO12
:
12245 /* Relax for PIC gp-relative low part. */
12246 nds32_elf_relax_piclo12 (link_info
, abfd
, sec
, irel
, contents
,
12247 isymbuf
, symtab_hdr
);
12249 /* It is impossible to delete blank, so just continue. */
12251 case R_NDS32_TLS_LE_LO12
:
12252 /* Relax for LE TLS low part. */
12253 nds32_elf_relax_letlslo12 (link_info
, abfd
, irel
, contents
,
12254 isymbuf
, symtab_hdr
);
12256 /* It is impossible to delete blank, so just continue. */
12258 case R_NDS32_TLS_LE_ADD
:
12259 nds32_elf_relax_letlsadd (link_info
, abfd
, sec
, irel
, internal_relocs
,
12260 contents
, isymbuf
, symtab_hdr
, again
);
12261 /* It is impossible to delete blank, so just continue. */
12263 case R_NDS32_TLS_LE_LS
:
12264 nds32_elf_relax_letlsls (link_info
, abfd
, sec
, irel
, internal_relocs
,
12265 contents
, isymbuf
, symtab_hdr
, again
);
12268 removed
= nds32_elf_relax_ptr (abfd
, sec
, irel
, internal_relocs
,
12269 &insn_len
, &seq_len
, contents
);
12271 case R_NDS32_PLT_GOT_SUFF
:
12272 nds32_elf_relax_pltgot_suff (link_info
, abfd
, sec
, irel
,
12273 internal_relocs
, contents
,
12274 isymbuf
, symtab_hdr
, again
);
12275 /* It is impossible to delete blank, so just continue. */
12277 case R_NDS32_GOT_SUFF
:
12278 nds32_elf_relax_got_suff (link_info
, abfd
, sec
, irel
,
12279 internal_relocs
, contents
,
12280 symtab_hdr
, again
);
12281 /* It is impossible to delete blank, so just continue. */
12283 case R_NDS32_GOTOFF_SUFF
:
12284 nds32_elf_relax_gotoff_suff (link_info
, abfd
, sec
, irel
,
12285 internal_relocs
, contents
,
12286 isymbuf
, symtab_hdr
, again
);
12287 /* It is impossible to delete blank, so just continue. */
12293 if (removed
&& seq_len
- insn_len
> 0)
12295 if (!insert_nds32_elf_blank
12296 (&relax_blank_list
, irel
->r_offset
+ insn_len
,
12297 seq_len
- insn_len
))
12303 calc_nds32_blank_total (relax_blank_list
);
12305 if (table
->relax_fp_as_gp
)
12307 if (!nds32_relax_fp_as_gp (link_info
, abfd
, sec
, internal_relocs
,
12311 if (*again
== FALSE
)
12313 if (!nds32_fag_remove_unused_fpbase (abfd
, sec
, internal_relocs
,
12319 nds32_elf_pick_relax (FALSE
, sec
, again
, table
, link_info
);
12321 if (*again
== FALSE
)
12323 if (!nds32_relax_adjust_label (abfd
, sec
, internal_relocs
, contents
,
12324 &relax_blank_list
, optimize
, opt_size
))
12328 /* It doesn't matter optimize_for_space_no_align anymore.
12329 If object file is assembled with flag '-Os',
12330 the we don't adjust jump-destination on 4-byte boundary. */
12332 if (relax_blank_list
)
12334 nds32_elf_relax_delete_blanks (abfd
, sec
, relax_blank_list
);
12335 relax_blank_list
= NULL
;
12338 if (*again
== FALSE
)
12340 /* Closing the section, so we don't relax it anymore. */
12341 bfd_vma sec_size_align
;
12342 Elf_Internal_Rela
*tmp_rel
;
12344 /* Pad to alignment boundary. Only handle current section alignment. */
12345 sec_size_align
= (sec
->size
+ (~((-1U) << sec
->alignment_power
)))
12346 & ((-1U) << sec
->alignment_power
);
12347 if ((sec_size_align
- sec
->size
) & 0x2)
12349 insn16
= NDS32_NOP16
;
12350 bfd_putb16 (insn16
, contents
+ sec
->size
);
12354 while (sec_size_align
!= sec
->size
)
12356 insn
= NDS32_NOP32
;
12357 bfd_putb32 (insn
, contents
+ sec
->size
);
12361 tmp_rel
= find_relocs_at_address (internal_relocs
, internal_relocs
,
12362 irelend
, R_NDS32_RELAX_ENTRY
);
12363 if (tmp_rel
!= irelend
)
12364 tmp_rel
->r_addend
|= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG
;
12366 clean_nds32_elf_blank ();
12370 if (internal_relocs
!= NULL
12371 && elf_section_data (sec
)->relocs
!= internal_relocs
)
12372 free (internal_relocs
);
12374 if (contents
!= NULL
12375 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
12378 if (isymbuf
!= NULL
&& symtab_hdr
->contents
!= (bfd_byte
*) isymbuf
)
12388 static struct bfd_elf_special_section
const nds32_elf_special_sections
[] =
12390 {".sdata", 6, -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
12391 {".sbss", 5, -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
},
12396 nds32_elf_output_arch_syms (bfd
*output_bfd ATTRIBUTE_UNUSED
,
12397 struct bfd_link_info
*info
,
12398 void *finfo ATTRIBUTE_UNUSED
,
12399 bfd_boolean (*func
) (void *, const char *,
12400 Elf_Internal_Sym
*,
12402 struct elf_link_hash_entry
*)
12405 FILE *sym_ld_script
= NULL
;
12406 struct elf_nds32_link_hash_table
*table
;
12408 table
= nds32_elf_hash_table (info
);
12409 sym_ld_script
= table
->sym_ld_script
;
12411 if (check_start_export_sym
)
12412 fprintf (sym_ld_script
, "}\n");
12417 static enum elf_reloc_type_class
12418 nds32_elf_reloc_type_class (const struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
12419 const asection
*rel_sec ATTRIBUTE_UNUSED
,
12420 const Elf_Internal_Rela
*rela
)
12422 switch ((int) ELF32_R_TYPE (rela
->r_info
))
12424 case R_NDS32_RELATIVE
:
12425 return reloc_class_relative
;
12426 case R_NDS32_JMP_SLOT
:
12427 return reloc_class_plt
;
12429 return reloc_class_copy
;
12431 return reloc_class_normal
;
12435 /* Put target dependent option into info hash table. */
12437 bfd_elf32_nds32_set_target_option (struct bfd_link_info
*link_info
,
12438 int relax_fp_as_gp
,
12439 int eliminate_gc_relocs
,
12440 FILE * sym_ld_script
, int load_store_relax
,
12441 int target_optimize
, int relax_status
,
12442 int relax_round
, FILE * ex9_export_file
,
12443 FILE * ex9_import_file
,
12444 int update_ex9_table
, int ex9_limit
,
12445 bfd_boolean ex9_loop_aware
,
12446 bfd_boolean ifc_loop_aware
)
12448 struct elf_nds32_link_hash_table
*table
;
12450 table
= nds32_elf_hash_table (link_info
);
12454 table
->relax_fp_as_gp
= relax_fp_as_gp
;
12455 table
->eliminate_gc_relocs
= eliminate_gc_relocs
;
12456 table
->sym_ld_script
= sym_ld_script
;
12457 table
->load_store_relax
= load_store_relax
;
12458 table
->target_optimize
= target_optimize
;
12459 table
->relax_status
= relax_status
;
12460 table
->relax_round
= relax_round
;
12461 table
->ex9_export_file
= ex9_export_file
;
12462 table
->ex9_import_file
= ex9_import_file
;
12463 table
->update_ex9_table
= update_ex9_table
;
12464 table
->ex9_limit
= ex9_limit
;
12465 table
->ex9_loop_aware
= ex9_loop_aware
;
12466 table
->ifc_loop_aware
= ifc_loop_aware
;
12469 /* These functions and data-structures are used for fp-as-gp
12472 #define FAG_THRESHOLD 3 /* At least 3 gp-access. */
12473 /* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12474 the read-only section and read-write section. */
12475 #define FAG_WINDOW (508 - 32)
12477 /* An nds32_fag represent a gp-relative access.
12478 We find best fp-base by using a sliding window
12479 to find a base address which can cover most gp-access. */
12482 struct nds32_fag
*next
; /* NULL-teminated linked list. */
12483 bfd_vma addr
; /* The address of this fag. */
12484 Elf_Internal_Rela
**relas
; /* The relocations associated with this fag.
12485 It is used for applying FP7U2_FLAG. */
12486 int count
; /* How many times this address is referred.
12487 There should be exactly `count' relocations
12489 int relas_capcity
; /* The buffer size of relas.
12490 We use an array instead of linked-list,
12491 and realloc is used to adjust buffer size. */
12495 nds32_fag_init (struct nds32_fag
*head
)
12497 memset (head
, 0, sizeof (struct nds32_fag
));
12501 nds32_fag_verify (struct nds32_fag
*head
)
12503 struct nds32_fag
*iter
;
12504 struct nds32_fag
*prev
;
12510 if (prev
&& prev
->addr
>= iter
->addr
)
12511 puts ("Bug in fp-as-gp insertion.");
12517 /* Insert a fag in ascending order.
12518 If a fag of the same address already exists,
12519 they are chained by relas array. */
12522 nds32_fag_insert (struct nds32_fag
*head
, bfd_vma addr
,
12523 Elf_Internal_Rela
* rel
)
12525 struct nds32_fag
*iter
;
12526 struct nds32_fag
*new_fag
;
12527 const int INIT_RELAS_CAP
= 4;
12530 iter
->next
&& iter
->next
->addr
<= addr
;
12532 /* Find somewhere to insert. */ ;
12534 /* `iter' will be equal to `head' if the list is empty. */
12535 if (iter
!= head
&& iter
->addr
== addr
)
12537 /* The address exists in the list.
12538 Insert `rel' into relocation list, relas. */
12540 /* Check whether relas is big enough. */
12541 if (iter
->count
>= iter
->relas_capcity
)
12543 iter
->relas_capcity
*= 2;
12544 iter
->relas
= bfd_realloc
12545 (iter
->relas
, iter
->relas_capcity
* sizeof (void *));
12547 iter
->relas
[iter
->count
++] = rel
;
12551 /* This is a new address. Create a fag node for it. */
12552 new_fag
= bfd_malloc (sizeof (struct nds32_fag
));
12553 memset (new_fag
, 0, sizeof (*new_fag
));
12554 new_fag
->addr
= addr
;
12555 new_fag
->count
= 1;
12556 new_fag
->next
= iter
->next
;
12557 new_fag
->relas_capcity
= INIT_RELAS_CAP
;
12558 new_fag
->relas
= (Elf_Internal_Rela
**)
12559 bfd_malloc (new_fag
->relas_capcity
* sizeof (void *));
12560 new_fag
->relas
[0] = rel
;
12561 iter
->next
= new_fag
;
12563 nds32_fag_verify (head
);
12567 nds32_fag_free_list (struct nds32_fag
*head
)
12569 struct nds32_fag
*iter
;
12574 struct nds32_fag
*tmp
= iter
;
12582 /* Find the best fp-base address.
12583 The relocation associated with that address is returned,
12584 so we can track the symbol instead of a fixed address.
12586 When relaxation, the address of an datum may change,
12587 because a text section is shrinked, so the data section
12588 moves forward. If the aligments of text and data section
12589 are different, their distance may change too.
12590 Therefore, tracking a fixed address is not appriate. */
12593 nds32_fag_find_base (struct nds32_fag
*head
, struct nds32_fag
**bestpp
)
12595 struct nds32_fag
*base
; /* First fag in the window. */
12596 struct nds32_fag
*last
; /* First fag outside the window. */
12597 int accu
= 0; /* Usage accumulation. */
12598 struct nds32_fag
*best
; /* Best fag. */
12599 int baccu
= 0; /* Best accumulation. */
12601 /* Use first fag for initial, and find the last fag in the window.
12603 In each iteration, we could simply subtract previous fag
12604 and accumulate following fags which are inside the window,
12605 untill we each the end. */
12607 if (head
->next
== NULL
)
12613 /* Initialize base. */
12617 last
&& last
->addr
< base
->addr
+ FAG_WINDOW
;
12619 accu
+= last
->count
;
12623 /* Record the best base in each iteration. */
12626 accu
-= base
->count
;
12628 /* Account fags in window. */
12629 for (/* Nothing. */;
12630 last
&& last
->addr
< base
->addr
+ FAG_WINDOW
;
12632 accu
+= last
->count
;
12634 /* A better fp-base? */
12647 /* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12648 so we can convert it fo fp-relative access later.
12649 `best_fag' is the best fp-base. Only those inside the window
12650 of best_fag is applied the flag. */
12653 nds32_fag_mark_relax (struct bfd_link_info
*link_info
,
12654 bfd
*abfd
, struct nds32_fag
*best_fag
,
12655 Elf_Internal_Rela
*internal_relocs
,
12656 Elf_Internal_Rela
*irelend
)
12658 struct nds32_fag
*ifag
;
12659 bfd_vma best_fpbase
, gp
;
12662 output_bfd
= abfd
->sections
->output_section
->owner
;
12663 nds32_elf_final_sda_base (output_bfd
, link_info
, &gp
, FALSE
);
12664 best_fpbase
= best_fag
->addr
;
12666 if (best_fpbase
> gp
+ sdata_range
[1][1]
12667 || best_fpbase
< gp
- sdata_range
[1][0])
12670 /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12671 so we know they can be converted to lwi37.fp. */
12672 for (ifag
= best_fag
;
12673 ifag
&& ifag
->addr
< best_fpbase
+ FAG_WINDOW
; ifag
= ifag
->next
)
12677 for (i
= 0; i
< ifag
->count
; i
++)
12679 Elf_Internal_Rela
*insn16_rel
;
12680 Elf_Internal_Rela
*fag_rel
;
12682 fag_rel
= ifag
->relas
[i
];
12684 /* Only if this is within the WINDOWS, FP7U2_FLAG
12687 insn16_rel
= find_relocs_at_address
12688 (fag_rel
, internal_relocs
, irelend
, R_NDS32_INSN16
);
12690 if (insn16_rel
!= irelend
)
12691 insn16_rel
->r_addend
= R_NDS32_INSN16_FP7U2_FLAG
;
12697 /* Reset INSN16 to clean fp as gp. */
12700 nds32_fag_unmark_relax (struct nds32_fag
*fag
,
12701 Elf_Internal_Rela
*internal_relocs
,
12702 Elf_Internal_Rela
*irelend
)
12704 struct nds32_fag
*ifag
;
12706 Elf_Internal_Rela
*insn16_rel
;
12707 Elf_Internal_Rela
*fag_rel
;
12709 for (ifag
= fag
; ifag
; ifag
= ifag
->next
)
12711 for (i
= 0; i
< ifag
->count
; i
++)
12713 fag_rel
= ifag
->relas
[i
];
12715 /* Restore the INSN16 relocation. */
12716 insn16_rel
= find_relocs_at_address
12717 (fag_rel
, internal_relocs
, irelend
, R_NDS32_INSN16
);
12719 if (insn16_rel
!= irelend
)
12720 insn16_rel
->r_addend
&= ~R_NDS32_INSN16_FP7U2_FLAG
;
12725 /* This is the main function of fp-as-gp optimization.
12726 It should be called by relax_section. */
12729 nds32_relax_fp_as_gp (struct bfd_link_info
*link_info
,
12730 bfd
*abfd
, asection
*sec
,
12731 Elf_Internal_Rela
*internal_relocs
,
12732 Elf_Internal_Rela
*irelend
,
12733 Elf_Internal_Sym
*isymbuf
)
12735 Elf_Internal_Rela
*begin_rel
= NULL
;
12736 Elf_Internal_Rela
*irel
;
12737 struct nds32_fag fag_head
;
12738 Elf_Internal_Shdr
*symtab_hdr
;
12739 bfd_byte
*contents
;
12740 bfd_boolean ifc_inside
= FALSE
;
12742 /* FIXME: Can we bfd_elf_link_read_relocs for the relocs? */
12744 /* Per-function fp-base selection.
12745 1. Create a list for all the gp-relative access.
12746 2. Base on those gp-relative address,
12747 find a fp-base which can cover most access.
12748 3. Use the fp-base for fp-as-gp relaxation.
12750 NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12752 1. delete the `la $fp, _FP_BASE_' instruction and
12753 2. not convert lwi.gp to lwi37.fp.
12755 To delete the _FP_BASE_ instruction, we simply apply
12756 R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12758 To suppress the conversion, we simply NOT to apply
12759 R_NDS32_INSN16_FP7U2_FLAG flag. */
12761 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
12763 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
)
12764 || !nds32_get_local_syms (abfd
, sec
, &isymbuf
))
12767 /* Check whether it is worth for fp-as-gp optimization,
12768 i.e., at least 3 gp-load.
12770 Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12771 apply this optimization. */
12773 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
12775 /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12776 One we enter the begin of the region, we track all the LW/ST
12777 instructions, so when we leave the region, we try to find
12778 the best fp-base address for those LW/ST instructions. */
12780 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
12781 && (irel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
12783 /* Begin of the region. */
12785 _bfd_error_handler (_("%B: Nested OMIT_FP in %A."), abfd
, sec
);
12788 nds32_fag_init (&fag_head
);
12789 ifc_inside
= FALSE
;
12791 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_END
12792 && (irel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
12795 struct nds32_fag
*best_fag
, *tmp_fag
;
12798 /* End of the region.
12799 Check whether it is worth to do fp-as-gp. */
12801 if (begin_rel
== NULL
)
12803 _bfd_error_handler (_("%B: Unmatched OMIT_FP in %A."), abfd
, sec
);
12807 accu
= nds32_fag_find_base (&fag_head
, &best_fag
);
12809 /* Clean FP7U2_FLAG because they may set ever. */
12810 tmp_fag
= fag_head
.next
;
12811 nds32_fag_unmark_relax (tmp_fag
, internal_relocs
, irelend
);
12813 /* Check if it is worth, and FP_BASE is near enough to SDA_BASE. */
12814 if (accu
< FAG_THRESHOLD
12815 || !nds32_fag_mark_relax (link_info
, abfd
, best_fag
,
12816 internal_relocs
, irelend
))
12818 /* Not worth to do fp-as-gp. */
12819 begin_rel
->r_addend
|= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
;
12820 begin_rel
->r_addend
&= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG
;
12821 irel
->r_addend
|= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
;
12822 irel
->r_addend
&= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG
;
12823 nds32_fag_free_list (&fag_head
);
12828 /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
12829 so we use it to record the distance to the reloction of best
12831 dist
= best_fag
->relas
[0] - begin_rel
;
12832 BFD_ASSERT (dist
> 0 && dist
< 0xffffff);
12833 /* Use high 16 bits of addend to record the _FP_BASE_ matched
12834 relocation. And get the base value when relocating. */
12835 begin_rel
->r_addend
&= (0x1 << 16) - 1;
12836 begin_rel
->r_addend
|= dist
<< 16;
12838 nds32_fag_free_list (&fag_head
);
12842 if (begin_rel
== NULL
|| ifc_inside
)
12843 /* Skip if we are not in the region of fp-as-gp. */
12846 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA15S2_RELA
12847 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA17S2_RELA
)
12852 /* A gp-relative access is found. Insert it to the fag-list. */
12854 /* Rt is necessary an RT3, so it can be converted to lwi37.fp. */
12855 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
12856 if (!N32_IS_RT3 (insn
))
12859 addr
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
12860 nds32_fag_insert (&fag_head
, addr
, irel
);
12862 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA_FP7U2_RELA
)
12866 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
12867 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_10IFCU_PCREL_RELA
)
12869 /* Suppress fp as gp when encounter ifc. */
12877 /* Remove unused `la $fp, _FD_BASE_' instruction. */
12880 nds32_fag_remove_unused_fpbase (bfd
*abfd
, asection
*sec
,
12881 Elf_Internal_Rela
*internal_relocs
,
12882 Elf_Internal_Rela
*irelend
)
12884 Elf_Internal_Rela
*irel
;
12885 Elf_Internal_Shdr
*symtab_hdr
;
12886 bfd_byte
*contents
= NULL
;
12887 nds32_elf_blank_t
*relax_blank_list
= NULL
;
12888 bfd_boolean result
= TRUE
;
12889 bfd_boolean unused_region
= FALSE
;
12892 NOTE: Disable fp-as-gp if we encounter ifcall relocations.
12893 * R_NDS32_17IFC_PCREL_RELA
12894 * R_NDS32_10IFCU_PCREL_RELA
12899 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
12900 nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
);
12902 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
12904 /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
12905 we marked to in previous pass.
12906 DO NOT scan relocations again, since we've alreadly decided it
12907 and set the flag. */
12908 const char *syname
;
12912 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
12913 && (irel
->r_addend
& R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
))
12914 unused_region
= TRUE
;
12915 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_END
12916 && (irel
->r_addend
& R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
))
12917 unused_region
= FALSE
;
12919 /* We're not in the region. */
12920 if (!unused_region
)
12923 /* _FP_BASE_ must be a GLOBAL symbol. */
12924 syndx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
12925 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
12928 /* The symbol name must be _FP_BASE_. */
12929 syname
= elf_sym_hashes (abfd
)[syndx
]->root
.root
.string
;
12930 if (strcmp (syname
, FP_BASE_NAME
) != 0)
12933 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA19S0_RELA
)
12935 /* addi.gp $fp, -256 */
12936 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
12937 if (insn
!= INSN_ADDIGP_TO_FP
)
12940 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA15S0_RELA
)
12942 /* addi $fp, $gp, -256 */
12943 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
12944 if (insn
!= INSN_ADDI_GP_TO_FP
)
12947 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_20_RELA
)
12949 /* movi $fp, FP_BASE */
12950 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
12951 if (insn
!= INSN_MOVI_TO_FP
)
12957 /* We got here because a FP_BASE instruction is found. */
12958 if (!insert_nds32_elf_blank_recalc_total
12959 (&relax_blank_list
, irel
->r_offset
, 4))
12964 if (relax_blank_list
)
12966 nds32_elf_relax_delete_blanks (abfd
, sec
, relax_blank_list
);
12967 relax_blank_list
= NULL
;
12976 /* This is a version of bfd_generic_get_relocated_section_contents.
12977 We need this variety because relaxation will modify the dwarf
12978 infomation. When there is undefined symbol reference error mesage,
12979 linker need to dump line number where the symbol be used. However
12980 the address is be relaxed, it can not get the original dwarf contents.
12981 The variety only modify function call for reading in the section. */
12984 nds32_elf_get_relocated_section_contents (bfd
*abfd
,
12985 struct bfd_link_info
*link_info
,
12986 struct bfd_link_order
*link_order
,
12988 bfd_boolean relocatable
,
12991 bfd
*input_bfd
= link_order
->u
.indirect
.section
->owner
;
12992 asection
*input_section
= link_order
->u
.indirect
.section
;
12994 arelent
**reloc_vector
;
12997 reloc_size
= bfd_get_reloc_upper_bound (input_bfd
, input_section
);
12998 if (reloc_size
< 0)
13001 /* Read in the section. */
13002 if (!nds32_get_section_contents (input_bfd
, input_section
, &data
, FALSE
))
13005 if (reloc_size
== 0)
13008 reloc_vector
= (arelent
**) bfd_malloc (reloc_size
);
13009 if (reloc_vector
== NULL
)
13012 reloc_count
= bfd_canonicalize_reloc (input_bfd
, input_section
,
13013 reloc_vector
, symbols
);
13014 if (reloc_count
< 0)
13017 if (reloc_count
> 0)
13020 for (parent
= reloc_vector
; *parent
!= NULL
; parent
++)
13022 char *error_message
= NULL
;
13024 bfd_reloc_status_type r
;
13026 symbol
= *(*parent
)->sym_ptr_ptr
;
13027 if (symbol
->section
&& discarded_section (symbol
->section
))
13030 static reloc_howto_type none_howto
13031 = HOWTO (0, 0, 0, 0, FALSE
, 0, complain_overflow_dont
, NULL
,
13032 "unused", FALSE
, 0, 0, FALSE
);
13034 p
= data
+ (*parent
)->address
* bfd_octets_per_byte (input_bfd
);
13035 _bfd_clear_contents ((*parent
)->howto
, input_bfd
, input_section
,
13037 (*parent
)->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
13038 (*parent
)->addend
= 0;
13039 (*parent
)->howto
= &none_howto
;
13043 r
= bfd_perform_relocation (input_bfd
, *parent
, data
,
13045 relocatable
? abfd
: NULL
,
13050 asection
*os
= input_section
->output_section
;
13052 /* A partial link, so keep the relocs. */
13053 os
->orelocation
[os
->reloc_count
] = *parent
;
13057 if (r
!= bfd_reloc_ok
)
13061 case bfd_reloc_undefined
:
13062 (*link_info
->callbacks
->undefined_symbol
)
13063 (link_info
, bfd_asymbol_name (*(*parent
)->sym_ptr_ptr
),
13064 input_bfd
, input_section
, (*parent
)->address
, TRUE
);
13066 case bfd_reloc_dangerous
:
13067 BFD_ASSERT (error_message
!= NULL
);
13068 (*link_info
->callbacks
->reloc_dangerous
)
13069 (link_info
, error_message
,
13070 input_bfd
, input_section
, (*parent
)->address
);
13072 case bfd_reloc_overflow
:
13073 (*link_info
->callbacks
->reloc_overflow
)
13075 bfd_asymbol_name (*(*parent
)->sym_ptr_ptr
),
13076 (*parent
)->howto
->name
, (*parent
)->addend
,
13077 input_bfd
, input_section
, (*parent
)->address
);
13079 case bfd_reloc_outofrange
:
13081 This error can result when processing some partially
13082 complete binaries. Do not abort, but issue an error
13083 message instead. */
13084 link_info
->callbacks
->einfo
13085 (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"),
13086 abfd
, input_section
, * parent
);
13097 free (reloc_vector
);
13101 free (reloc_vector
);
13105 /* Link-time IFC relaxation.
13106 In this optimization, we chains jump instructions
13107 of the same destination with ifcall. */
13110 /* List to save jal and j relocation. */
13111 struct elf_nds32_ifc_symbol_entry
13114 struct elf_link_hash_entry
*h
;
13115 struct elf_nds32_ifc_irel_list
*irel_head
;
13116 unsigned long insn
;
13118 int enable
; /* Apply ifc. */
13119 int ex9_enable
; /* Apply ifc after ex9. */
13120 struct elf_nds32_ifc_symbol_entry
*next
;
13123 struct elf_nds32_ifc_irel_list
13125 Elf_Internal_Rela
*irel
;
13128 /* If this is set, then it is the last instruction for
13129 ifc-chain, so it must be keep for the actual branching. */
13131 struct elf_nds32_ifc_irel_list
*next
;
13134 static struct elf_nds32_ifc_symbol_entry
*ifc_symbol_head
= NULL
;
13136 /* Insert symbol of jal and j for ifc. */
13139 nds32_elf_ifc_insert_symbol (asection
*sec
,
13140 struct elf_link_hash_entry
*h
,
13141 Elf_Internal_Rela
*irel
,
13142 unsigned long insn
)
13144 struct elf_nds32_ifc_symbol_entry
*ptr
= ifc_symbol_head
;
13146 /* Check there is target of existing entry the same as the new one. */
13147 while (ptr
!= NULL
)
13149 if (((h
== NULL
&& ptr
->sec
== sec
13150 && ELF32_R_SYM (ptr
->irel_head
->irel
->r_info
) == ELF32_R_SYM (irel
->r_info
)
13151 && ptr
->irel_head
->irel
->r_addend
== irel
->r_addend
)
13154 && ptr
->insn
== insn
)
13156 /* The same target exist, so insert into list. */
13157 struct elf_nds32_ifc_irel_list
*irel_list
= ptr
->irel_head
;
13159 while (irel_list
->next
!= NULL
)
13160 irel_list
= irel_list
->next
;
13161 irel_list
->next
= bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list
));
13162 irel_list
= irel_list
->next
;
13163 irel_list
->irel
= irel
;
13164 irel_list
->keep
= 1;
13167 irel_list
->sec
= NULL
;
13169 irel_list
->sec
= sec
;
13170 irel_list
->next
= NULL
;
13173 if (ptr
->next
== NULL
)
13178 /* There is no same target entry, so build a new one. */
13179 if (ifc_symbol_head
== NULL
)
13181 ifc_symbol_head
= bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry
));
13182 ptr
= ifc_symbol_head
;
13186 ptr
->next
= bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry
));
13191 ptr
->irel_head
= bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list
));
13192 ptr
->irel_head
->irel
= irel
;
13194 ptr
->irel_head
->keep
= 1;
13198 /* Local symbols. */
13200 ptr
->irel_head
->sec
= NULL
;
13204 /* Global symbol. */
13206 ptr
->irel_head
->sec
= sec
;
13209 ptr
->irel_head
->next
= NULL
;
13212 ptr
->ex9_enable
= 0;
13216 /* Gather all jal and j instructions. */
13219 nds32_elf_ifc_calc (struct bfd_link_info
*info
,
13220 bfd
*abfd
, asection
*sec
)
13222 Elf_Internal_Rela
*internal_relocs
;
13223 Elf_Internal_Rela
*irelend
;
13224 Elf_Internal_Rela
*irel
;
13225 Elf_Internal_Shdr
*symtab_hdr
;
13226 bfd_byte
*contents
= NULL
;
13227 uint32_t insn
, insn_with_reg
;
13228 unsigned long r_symndx
;
13229 struct elf_link_hash_entry
*h
;
13230 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (abfd
);
13231 struct elf_nds32_link_hash_table
*table
;
13232 bfd_boolean ifc_loop_aware
;
13234 internal_relocs
= _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
,
13235 TRUE
/* keep_memory */);
13236 irelend
= internal_relocs
+ sec
->reloc_count
;
13237 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
13239 /* Check if the object enable ifc. */
13240 irel
= find_relocs_at_address (internal_relocs
, internal_relocs
, irelend
,
13241 R_NDS32_RELAX_ENTRY
);
13245 || ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_ENTRY
13246 || (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_ENTRY
13247 && !(irel
->r_addend
& R_NDS32_RELAX_ENTRY_IFC_FLAG
)))
13250 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
))
13253 table
= nds32_elf_hash_table (info
);
13254 ifc_loop_aware
= table
->ifc_loop_aware
;
13255 while (irel
!= NULL
&& irel
< irelend
)
13257 /* Traverse all relocation and gather all of them to build the list. */
13259 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
)
13261 if (ifc_loop_aware
== 1
13262 && (irel
->r_addend
& R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG
) != 0)
13264 /* Check the region if loop or not. If it is true and
13265 ifc-loop-aware is true, ignore the region till region end. */
13266 while (irel
!= NULL
13268 && (ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_REGION_END
13269 || (irel
->r_addend
& R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG
) != 0))
13274 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_25_PCREL_RELA
)
13276 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
13277 nds32_elf_get_insn_with_reg (irel
, insn
, &insn_with_reg
);
13278 r_symndx
= ELF32_R_SYM (irel
->r_info
);
13279 if (r_symndx
< symtab_hdr
->sh_info
)
13281 /* Local symbol. */
13282 nds32_elf_ifc_insert_symbol (sec
, NULL
, irel
, insn_with_reg
);
13286 /* External symbol. */
13287 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
13288 nds32_elf_ifc_insert_symbol (sec
, h
, irel
, insn_with_reg
);
13296 /* Determine whether j and jal should be substituted. */
13299 nds32_elf_ifc_filter (struct bfd_link_info
*info
)
13301 struct elf_nds32_ifc_symbol_entry
*ptr
= ifc_symbol_head
;
13302 struct elf_nds32_ifc_irel_list
*irel_ptr
= NULL
;
13303 struct elf_nds32_ifc_irel_list
*irel_keeper
= NULL
;
13304 struct elf_nds32_link_hash_table
*table
;
13305 int target_optimize
;
13308 table
= nds32_elf_hash_table (info
);
13309 target_optimize
= table
->target_optimize
;
13312 irel_ptr
= ptr
->irel_head
;
13313 if (ptr
->h
== NULL
)
13315 /* Local symbol. */
13316 irel_keeper
= irel_ptr
;
13317 while (irel_ptr
&& irel_ptr
->next
)
13319 /* Check there is jump target can be used. */
13320 if ((irel_ptr
->next
->irel
->r_offset
13321 - irel_keeper
->irel
->r_offset
) > 1022)
13322 irel_keeper
= irel_ptr
->next
;
13326 irel_ptr
->keep
= 0;
13328 irel_ptr
= irel_ptr
->next
;
13333 /* Global symbol. */
13334 /* We have to get the absolute address and decide
13335 whether to keep it or not. */
13338 address
= (irel_ptr
->irel
->r_offset
13339 + irel_ptr
->sec
->output_section
->vma
13340 + irel_ptr
->sec
->output_offset
);
13341 irel_ptr
->addr
= address
;
13342 irel_ptr
= irel_ptr
->next
;
13345 irel_ptr
= ptr
->irel_head
;
13348 /* Sort by address. */
13349 struct elf_nds32_ifc_irel_list
*irel_dest
= irel_ptr
;
13350 struct elf_nds32_ifc_irel_list
*irel_temp
= irel_ptr
;
13351 struct elf_nds32_ifc_irel_list
*irel_ptr_prev
= NULL
;
13352 struct elf_nds32_ifc_irel_list
*irel_dest_prev
= NULL
;
13354 /* Get the smallest one. */
13355 while (irel_temp
->next
)
13357 if (irel_temp
->next
->addr
< irel_dest
->addr
)
13359 irel_dest_prev
= irel_temp
;
13360 irel_dest
= irel_temp
->next
;
13362 irel_temp
= irel_temp
->next
;
13365 if (irel_dest
!= irel_ptr
)
13368 irel_ptr_prev
->next
= irel_dest
;
13369 if (irel_dest_prev
)
13370 irel_dest_prev
->next
= irel_ptr
;
13371 irel_temp
= irel_ptr
->next
;
13372 irel_ptr
->next
= irel_dest
->next
;
13373 irel_dest
->next
= irel_temp
;
13375 irel_ptr_prev
= irel_ptr
;
13376 irel_ptr
= irel_ptr
->next
;
13379 irel_ptr
= ptr
->irel_head
;
13380 irel_keeper
= irel_ptr
;
13381 while (irel_ptr
&& irel_ptr
->next
)
13383 if ((irel_ptr
->next
->addr
- irel_keeper
->addr
) > 1022)
13384 irel_keeper
= irel_ptr
->next
;
13388 irel_ptr
->keep
= 0;
13390 irel_ptr
= irel_ptr
->next
;
13394 /* Ex9 enable. Reserve it for ex9. */
13395 if ((target_optimize
& NDS32_RELAX_EX9_ON
)
13396 && ptr
->irel_head
!= irel_keeper
)
13402 /* Determine whether j and jal should be substituted after ex9 done. */
13405 nds32_elf_ifc_filter_after_ex9 (void)
13407 struct elf_nds32_ifc_symbol_entry
*ptr
= ifc_symbol_head
;
13408 struct elf_nds32_ifc_irel_list
*irel_ptr
= NULL
;
13412 if (ptr
->enable
== 0)
13414 /* Check whether ifc is applied or not. */
13415 irel_ptr
= ptr
->irel_head
;
13416 ptr
->ex9_enable
= 1;
13419 if (ELF32_R_TYPE (irel_ptr
->irel
->r_info
) == R_NDS32_TRAN
)
13422 ptr
->ex9_enable
= 0;
13425 irel_ptr
= irel_ptr
->next
;
13432 /* Wrapper to do ifc relaxation. */
13435 nds32_elf_ifc_finish (struct bfd_link_info
*info
)
13438 struct elf_nds32_link_hash_table
*table
;
13440 table
= nds32_elf_hash_table (info
);
13441 relax_status
= table
->relax_status
;
13443 if (!(relax_status
& NDS32_RELAX_JUMP_IFC_DONE
))
13444 nds32_elf_ifc_filter (info
);
13446 nds32_elf_ifc_filter_after_ex9 ();
13448 if (!nds32_elf_ifc_replace (info
))
13452 table
->relax_status
|= NDS32_RELAX_JUMP_IFC_DONE
;
13456 /* Traverse the result of ifc filter and replace it with ifcall9. */
13459 nds32_elf_ifc_replace (struct bfd_link_info
*info
)
13461 struct elf_nds32_ifc_symbol_entry
*ptr
= ifc_symbol_head
;
13462 struct elf_nds32_ifc_irel_list
*irel_ptr
= NULL
;
13463 nds32_elf_blank_t
*relax_blank_list
= NULL
;
13464 bfd_byte
*contents
= NULL
;
13465 Elf_Internal_Rela
*internal_relocs
;
13466 Elf_Internal_Rela
*irel
;
13467 Elf_Internal_Rela
*irelend
;
13468 unsigned short insn16
= INSN_IFCALL9
;
13469 struct elf_nds32_link_hash_table
*table
;
13472 table
= nds32_elf_hash_table (info
);
13473 relax_status
= table
->relax_status
;
13477 /* Traverse the ifc gather list, and replace the
13478 filter entries by ifcall9. */
13479 if ((!(relax_status
& NDS32_RELAX_JUMP_IFC_DONE
) && ptr
->enable
== 1)
13480 || ((relax_status
& NDS32_RELAX_JUMP_IFC_DONE
)
13481 && ptr
->ex9_enable
== 1))
13483 irel_ptr
= ptr
->irel_head
;
13484 if (ptr
->h
== NULL
)
13486 /* Local symbol. */
13487 internal_relocs
= _bfd_elf_link_read_relocs
13488 (ptr
->sec
->owner
, ptr
->sec
, NULL
, NULL
, TRUE
/* keep_memory */);
13489 irelend
= internal_relocs
+ ptr
->sec
->reloc_count
;
13491 if (!nds32_get_section_contents (ptr
->sec
->owner
, ptr
->sec
,
13497 if (irel_ptr
->keep
== 0 && irel_ptr
->next
)
13499 /* The one can be replaced. We have to check whether
13500 there is any alignment point in the region. */
13501 irel
= irel_ptr
->irel
;
13502 while (((irel_ptr
->next
->keep
== 0
13503 && irel
< irel_ptr
->next
->irel
)
13504 || (irel_ptr
->next
->keep
== 1 && irel
< irelend
))
13505 && !(ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
13506 && (irel
->r_addend
& 0x1f) == 2))
13508 if (irel
>= irelend
13509 || !(ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
13510 && (irel
->r_addend
& 0x1f) == 2
13511 && ((irel
->r_offset
- get_nds32_elf_blank_total
13512 (&relax_blank_list
, irel
->r_offset
, 1))
13515 /* Replace by ifcall9. */
13516 bfd_putb16 (insn16
, contents
+ irel_ptr
->irel
->r_offset
);
13517 if (!insert_nds32_elf_blank_recalc_total
13518 (&relax_blank_list
, irel_ptr
->irel
->r_offset
+ 2, 2))
13520 irel_ptr
->irel
->r_info
=
13521 ELF32_R_INFO (ELF32_R_SYM (irel_ptr
->irel
->r_info
),
13522 R_NDS32_10IFCU_PCREL_RELA
);
13525 irel_ptr
= irel_ptr
->next
;
13528 /* Delete the redundant code. */
13529 if (relax_blank_list
)
13531 nds32_elf_relax_delete_blanks (ptr
->sec
->owner
, ptr
->sec
,
13533 relax_blank_list
= NULL
;
13538 /* Global symbol. */
13541 if (irel_ptr
->keep
== 0 && irel_ptr
->next
)
13543 /* The one can be replaced, and we have to check
13544 whether there is any alignment point in the region. */
13545 internal_relocs
= _bfd_elf_link_read_relocs
13546 (irel_ptr
->sec
->owner
, irel_ptr
->sec
, NULL
, NULL
,
13547 TRUE
/* keep_memory */);
13548 irelend
= internal_relocs
+ irel_ptr
->sec
->reloc_count
;
13549 if (!nds32_get_section_contents (irel_ptr
->sec
->owner
,
13550 irel_ptr
->sec
, &contents
,
13554 irel
= irel_ptr
->irel
;
13555 while (((irel_ptr
->sec
== irel_ptr
->next
->sec
13556 && irel_ptr
->next
->keep
== 0
13557 && irel
< irel_ptr
->next
->irel
)
13558 || ((irel_ptr
->sec
!= irel_ptr
->next
->sec
13559 || irel_ptr
->next
->keep
== 1)
13560 && irel
< irelend
))
13561 && !(ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
13562 && (irel
->r_addend
& 0x1f) == 2))
13564 if (irel
>= irelend
13565 || !(ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
13566 && (irel
->r_addend
& 0x1f) == 2
13567 && ((irel
->r_offset
13568 - get_nds32_elf_blank_total (&relax_blank_list
,
13569 irel
->r_offset
, 1)) & 0x02) == 0))
13571 /* Replace by ifcall9. */
13572 bfd_putb16 (insn16
, contents
+ irel_ptr
->irel
->r_offset
);
13573 if (!insert_nds32_elf_blank_recalc_total
13574 (&relax_blank_list
, irel_ptr
->irel
->r_offset
+ 2, 2))
13577 /* Delete the redundant code, and clear the relocation. */
13578 nds32_elf_relax_delete_blanks (irel_ptr
->sec
->owner
,
13581 irel_ptr
->irel
->r_info
=
13582 ELF32_R_INFO (ELF32_R_SYM (irel_ptr
->irel
->r_info
),
13583 R_NDS32_10IFCU_PCREL_RELA
);
13584 relax_blank_list
= NULL
;
13588 irel_ptr
= irel_ptr
->next
;
13598 /* Relocate ifcall. */
13601 nds32_elf_ifc_reloc (void)
13603 struct elf_nds32_ifc_symbol_entry
*ptr
= ifc_symbol_head
;
13604 struct elf_nds32_ifc_irel_list
*irel_ptr
= NULL
;
13605 struct elf_nds32_ifc_irel_list
*irel_keeper
= NULL
;
13606 bfd_vma relocation
, address
;
13607 unsigned short insn16
;
13608 bfd_byte
*contents
= NULL
;
13609 static bfd_boolean done
= FALSE
;
13618 /* Check the entry is enable ifcall. */
13619 if (ptr
->enable
== 1 || ptr
->ex9_enable
== 1)
13621 /* Get the reserve jump. */
13622 irel_ptr
= ptr
->irel_head
;
13625 if (irel_ptr
->keep
== 1)
13627 irel_keeper
= irel_ptr
;
13630 irel_ptr
= irel_ptr
->next
;
13633 irel_ptr
= ptr
->irel_head
;
13634 if (ptr
->h
== NULL
)
13636 /* Local symbol. */
13637 if (!nds32_get_section_contents (ptr
->sec
->owner
, ptr
->sec
,
13643 if (irel_ptr
->keep
== 0
13644 && ELF32_R_TYPE (irel_ptr
->irel
->r_info
) == R_NDS32_10IFCU_PCREL_RELA
)
13646 relocation
= irel_keeper
->irel
->r_offset
;
13647 relocation
= relocation
- irel_ptr
->irel
->r_offset
;
13648 while (irel_keeper
&& relocation
> 1022)
13650 irel_keeper
= irel_keeper
->next
;
13651 if (irel_keeper
&& irel_keeper
->keep
== 1)
13653 relocation
= irel_keeper
->irel
->r_offset
;
13654 relocation
= relocation
- irel_ptr
->irel
->r_offset
;
13657 if (relocation
> 1022)
13659 /* Double check. */
13660 irel_keeper
= ptr
->irel_head
;
13661 while (irel_keeper
)
13663 if (irel_keeper
->keep
== 1)
13665 relocation
= irel_keeper
->irel
->r_offset
;
13666 relocation
= relocation
- irel_ptr
->irel
->r_offset
;
13668 if (relocation
<= 1022)
13670 irel_keeper
= irel_keeper
->next
;
13675 irel_ptr
->irel
->r_info
=
13676 ELF32_R_INFO (ELF32_R_SYM (irel_ptr
->irel
->r_info
),
13678 insn16
= INSN_IFCALL9
| (relocation
>> 1);
13679 bfd_putb16 (insn16
, contents
+ irel_ptr
->irel
->r_offset
);
13681 irel_ptr
= irel_ptr
->next
;
13686 /* Global symbol. */
13689 if (irel_ptr
->keep
== 0
13690 && ELF32_R_TYPE (irel_ptr
->irel
->r_info
) == R_NDS32_10IFCU_PCREL_RELA
)
13692 /* Get the distance between ifcall and jump. */
13693 relocation
= (irel_keeper
->irel
->r_offset
13694 + irel_keeper
->sec
->output_section
->vma
13695 + irel_keeper
->sec
->output_offset
);
13696 address
= (irel_ptr
->irel
->r_offset
13697 + irel_ptr
->sec
->output_section
->vma
13698 + irel_ptr
->sec
->output_offset
);
13699 relocation
= relocation
- address
;
13701 /* The distance is over ragne, find callee again. */
13702 while (irel_keeper
&& relocation
> 1022)
13704 irel_keeper
= irel_keeper
->next
;
13705 if (irel_keeper
&& irel_keeper
->keep
==1)
13707 relocation
= (irel_keeper
->irel
->r_offset
13708 + irel_keeper
->sec
->output_section
->vma
13709 + irel_keeper
->sec
->output_offset
);
13710 relocation
= relocation
- address
;
13714 if (relocation
> 1022)
13716 /* Double check. */
13717 irel_keeper
= ptr
->irel_head
;
13718 while (irel_keeper
)
13720 if (irel_keeper
->keep
== 1)
13723 relocation
= (irel_keeper
->irel
->r_offset
13724 + irel_keeper
->sec
->output_section
->vma
13725 + irel_keeper
->sec
->output_offset
);
13726 relocation
= relocation
- address
;
13728 if (relocation
<= 1022)
13730 irel_keeper
= irel_keeper
->next
;
13735 if (!nds32_get_section_contents
13736 (irel_ptr
->sec
->owner
, irel_ptr
->sec
, &contents
, TRUE
))
13738 insn16
= INSN_IFCALL9
| (relocation
>> 1);
13739 bfd_putb16 (insn16
, contents
+ irel_ptr
->irel
->r_offset
);
13740 irel_ptr
->irel
->r_info
=
13741 ELF32_R_INFO (ELF32_R_SYM (irel_ptr
->irel
->r_info
),
13744 irel_ptr
=irel_ptr
->next
;
13754 /* End of IFC relaxation. */
13756 /* EX9 Instruction Table Relaxation. */
13758 /* Global hash list. */
13759 struct elf_link_hash_entry_list
13761 struct elf_link_hash_entry
*h
;
13762 struct elf_link_hash_entry_list
*next
;
13765 /* Save different destination but same insn. */
13766 struct elf_link_hash_entry_mul_list
13768 /* Global symbol times. */
13770 /* Save relocation for each global symbol but useful?? */
13771 Elf_Internal_Rela
*irel
;
13772 /* For sethi, two sethi may have the same high-part but different low-parts. */
13773 Elf_Internal_Rela rel_backup
;
13774 struct elf_link_hash_entry_list
*h_list
;
13775 struct elf_link_hash_entry_mul_list
*next
;
13778 /* Instruction hash table. */
13779 struct elf_nds32_code_hash_entry
13781 struct bfd_hash_entry root
;
13783 /* For insn that can use relocation or constant ex: sethi. */
13786 struct elf_link_hash_entry_mul_list
*m_list
;
13787 /* Using r_addend. */
13788 Elf_Internal_Rela
*irel
;
13789 /* Using r_info. */
13790 Elf_Internal_Rela rel_backup
;
13793 /* Instruction count list. */
13794 struct elf_nds32_insn_times_entry
13796 const char *string
;
13800 struct elf_link_hash_entry_mul_list
*m_list
;
13801 Elf_Internal_Rela
*irel
;
13802 Elf_Internal_Rela rel_backup
;
13803 struct elf_nds32_insn_times_entry
*next
;
13806 /* J and JAL symbol list. */
13807 struct elf_nds32_symbol_entry
13810 unsigned long insn
;
13811 struct elf_nds32_symbol_entry
*next
;
13814 /* Relocation list. */
13815 struct elf_nds32_irel_entry
13817 Elf_Internal_Rela
*irel
;
13818 struct elf_nds32_irel_entry
*next
;
13821 /* ex9.it insn need to be fixed. */
13822 struct elf_nds32_ex9_refix
13824 Elf_Internal_Rela
*irel
;
13826 struct elf_link_hash_entry
*h
;
13828 struct elf_nds32_ex9_refix
*next
;
13831 static struct bfd_hash_table ex9_code_table
;
13832 static struct elf_nds32_insn_times_entry
*ex9_insn_head
= NULL
;
13833 static struct elf_nds32_ex9_refix
*ex9_refix_head
= NULL
;
13835 /* EX9 hash function. */
13837 static struct bfd_hash_entry
*
13838 nds32_elf_code_hash_newfunc (struct bfd_hash_entry
*entry
,
13839 struct bfd_hash_table
*table
,
13840 const char *string
)
13842 struct elf_nds32_code_hash_entry
*ret
;
13844 /* Allocate the structure if it has not already been allocated by a
13848 entry
= (struct bfd_hash_entry
*)
13849 bfd_hash_allocate (table
, sizeof (*ret
));
13854 /* Call the allocation method of the superclass. */
13855 entry
= bfd_hash_newfunc (entry
, table
, string
);
13859 ret
= (struct elf_nds32_code_hash_entry
*) entry
;
13861 ret
->const_insn
= 0;
13862 ret
->m_list
= NULL
;
13868 /* Insert ex9 entry
13869 this insert must be stable sorted by times. */
13872 nds32_elf_ex9_insert_entry (struct elf_nds32_insn_times_entry
*ptr
)
13874 struct elf_nds32_insn_times_entry
*temp
;
13875 struct elf_nds32_insn_times_entry
*temp2
;
13877 if (ex9_insn_head
== NULL
)
13879 ex9_insn_head
= ptr
;
13884 temp
= ex9_insn_head
;
13885 temp2
= ex9_insn_head
;
13886 while (temp
->next
&&
13887 (temp
->next
->times
>= ptr
->times
13888 || temp
->times
== -1))
13890 if (temp
->times
== -1)
13894 if (ptr
->times
> temp
->times
&& temp
->times
!= -1)
13897 if (temp2
->times
== -1)
13900 ex9_insn_head
= ptr
;
13902 else if (temp
->next
== NULL
)
13909 ptr
->next
= temp
->next
;
13915 /* Examine each insn times in hash table.
13916 Handle multi-link hash entry.
13918 TODO: This function doesn't assign so much info since it is fake. */
13921 nds32_elf_examine_insn_times (struct elf_nds32_code_hash_entry
*h
)
13923 struct elf_nds32_insn_times_entry
*ptr
;
13926 if (h
->m_list
== NULL
)
13928 /* Local symbol insn or insn without relocation. */
13932 ptr
= (struct elf_nds32_insn_times_entry
*)
13933 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
13934 ptr
->times
= h
->times
;
13935 ptr
->string
= h
->root
.string
;
13936 ptr
->m_list
= NULL
;
13938 ptr
->irel
= h
->irel
;
13939 ptr
->rel_backup
= h
->rel_backup
;
13940 nds32_elf_ex9_insert_entry (ptr
);
13944 /* Global symbol insn. */
13945 /* Only sethi insn has multiple m_list. */
13946 struct elf_link_hash_entry_mul_list
*m_list
= h
->m_list
;
13951 times
+= m_list
->times
;
13952 m_list
= m_list
->next
;
13956 m_list
= h
->m_list
;
13957 ptr
= (struct elf_nds32_insn_times_entry
*)
13958 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
13959 ptr
->times
= times
; /* Use the total times. */
13960 ptr
->string
= h
->root
.string
;
13961 ptr
->m_list
= m_list
;
13963 ptr
->irel
= m_list
->irel
;
13964 ptr
->rel_backup
= m_list
->rel_backup
;
13965 nds32_elf_ex9_insert_entry (ptr
);
13967 if (h
->const_insn
== 1)
13969 /* sethi with constant value. */
13973 ptr
= (struct elf_nds32_insn_times_entry
*)
13974 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
13975 ptr
->times
= h
->times
;
13976 ptr
->string
= h
->root
.string
;
13977 ptr
->m_list
= NULL
;
13980 ptr
->rel_backup
= h
->rel_backup
;
13981 nds32_elf_ex9_insert_entry (ptr
);
13987 /* Count each insn times in hash table.
13988 Handle multi-link hash entry. */
13991 nds32_elf_count_insn_times (struct elf_nds32_code_hash_entry
*h
)
13993 int reservation
, times
;
13994 unsigned long relocation
, min_relocation
;
13995 struct elf_nds32_insn_times_entry
*ptr
;
13997 if (h
->m_list
== NULL
)
13999 /* Local symbol insn or insn without relocation. */
14002 ptr
= (struct elf_nds32_insn_times_entry
*)
14003 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
14004 ptr
->times
= h
->times
;
14005 ptr
->string
= h
->root
.string
;
14006 ptr
->m_list
= NULL
;
14008 ptr
->irel
= h
->irel
;
14009 ptr
->rel_backup
= h
->rel_backup
;
14010 nds32_elf_ex9_insert_entry (ptr
);
14014 /* Global symbol insn. */
14015 /* Only sethi insn has multiple m_list. */
14016 struct elf_link_hash_entry_mul_list
*m_list
= h
->m_list
;
14018 if (ELF32_R_TYPE (m_list
->rel_backup
.r_info
) == R_NDS32_HI20_RELA
14019 && m_list
->next
!= NULL
)
14021 /* Sethi insn has different symbol or addend but has same hi20. */
14025 min_relocation
= 0xffffffff;
14028 /* Get the minimum sethi address
14029 and calculate how many entry the sethi-list have to use. */
14030 if ((m_list
->h_list
->h
->root
.type
== bfd_link_hash_defined
14031 || m_list
->h_list
->h
->root
.type
== bfd_link_hash_defweak
)
14032 && (m_list
->h_list
->h
->root
.u
.def
.section
!= NULL
14033 && m_list
->h_list
->h
->root
.u
.def
.section
->output_section
!= NULL
))
14035 relocation
= (m_list
->h_list
->h
->root
.u
.def
.value
+
14036 m_list
->h_list
->h
->root
.u
.def
.section
->output_section
->vma
+
14037 m_list
->h_list
->h
->root
.u
.def
.section
->output_offset
);
14038 relocation
+= m_list
->irel
->r_addend
;
14042 if (relocation
< min_relocation
)
14043 min_relocation
= relocation
;
14044 times
+= m_list
->times
;
14045 m_list
= m_list
->next
;
14047 if (min_relocation
< ex9_relax_size
)
14048 reservation
= (min_relocation
>> 12) + 1;
14050 reservation
= (min_relocation
>> 12)
14051 - ((min_relocation
- ex9_relax_size
) >> 12) + 1;
14052 if (reservation
< (times
/ 3))
14054 /* Efficient enough to use ex9. */
14057 for (i
= reservation
; i
> 0; i
--)
14059 /* Allocate number of reservation ex9 entry. */
14060 ptr
= (struct elf_nds32_insn_times_entry
*)
14061 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
14062 ptr
->times
= h
->m_list
->times
/ reservation
;
14063 ptr
->string
= h
->root
.string
;
14064 ptr
->m_list
= h
->m_list
;
14066 ptr
->irel
= h
->m_list
->irel
;
14067 ptr
->rel_backup
= h
->m_list
->rel_backup
;
14068 nds32_elf_ex9_insert_entry (ptr
);
14074 /* Normal global symbol that means no different address symbol
14075 using same ex9 entry. */
14076 if (m_list
->times
>= 3)
14078 ptr
= (struct elf_nds32_insn_times_entry
*)
14079 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
14080 ptr
->times
= m_list
->times
;
14081 ptr
->string
= h
->root
.string
;
14082 ptr
->m_list
= h
->m_list
;
14084 ptr
->irel
= h
->m_list
->irel
;
14085 ptr
->rel_backup
= h
->m_list
->rel_backup
;
14086 nds32_elf_ex9_insert_entry (ptr
);
14090 if (h
->const_insn
== 1)
14092 /* sethi with constant value. */
14096 ptr
= (struct elf_nds32_insn_times_entry
*)
14097 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
14098 ptr
->times
= h
->times
;
14099 ptr
->string
= h
->root
.string
;
14100 ptr
->m_list
= NULL
;
14103 ptr
->rel_backup
= h
->rel_backup
;
14104 nds32_elf_ex9_insert_entry (ptr
);
14111 /* Hash table traverse function. */
14114 nds32_elf_code_hash_traverse (int (*func
) (struct elf_nds32_code_hash_entry
*))
14118 ex9_code_table
.frozen
= 1;
14119 for (i
= 0; i
< ex9_code_table
.size
; i
++)
14121 struct bfd_hash_entry
*p
;
14123 for (p
= ex9_code_table
.table
[i
]; p
!= NULL
; p
= p
->next
)
14124 if (!func ((struct elf_nds32_code_hash_entry
*) p
))
14128 ex9_code_table
.frozen
= 0;
14132 /* Give order number to insn list. */
14135 nds32_elf_order_insn_times (struct bfd_link_info
*info
)
14137 struct elf_nds32_insn_times_entry
*ex9_insn
;
14138 struct elf_nds32_insn_times_entry
*temp
= NULL
;
14139 struct elf_nds32_link_hash_table
*table
;
14143 if (ex9_insn_head
== NULL
)
14146 /* The max number of entries is 512. */
14147 ex9_insn
= ex9_insn_head
;
14148 table
= nds32_elf_hash_table (info
);
14149 ex9_limit
= table
->ex9_limit
;
14151 ex9_insn
= ex9_insn_head
;
14153 while (ex9_insn
!= NULL
&& number
< ex9_limit
)
14155 ex9_insn
->order
= number
;
14158 ex9_insn
= ex9_insn
->next
;
14161 if (ex9_insn
&& temp
)
14164 while (ex9_insn
!= NULL
)
14166 /* Free useless entry. */
14168 ex9_insn
= ex9_insn
->next
;
14173 /* Build .ex9.itable section. */
14176 nds32_elf_ex9_build_itable (struct bfd_link_info
*link_info
)
14178 asection
*table_sec
;
14179 struct elf_nds32_insn_times_entry
*ptr
;
14182 bfd_byte
*contents
= NULL
;
14184 for (it_abfd
= link_info
->input_bfds
; it_abfd
!= NULL
;
14185 it_abfd
= it_abfd
->link
.next
)
14187 /* Find the section .ex9.itable, and put all entries into it. */
14188 table_sec
= bfd_get_section_by_name (it_abfd
, ".ex9.itable");
14189 if (table_sec
!= NULL
)
14191 if (!nds32_get_section_contents (it_abfd
, table_sec
, &contents
, TRUE
))
14194 for (ptr
= ex9_insn_head
; ptr
!=NULL
; ptr
= ptr
->next
)
14197 table_sec
->size
= number
* 4;
14202 elf_elfheader (link_info
->output_bfd
)->e_flags
|= E_NDS32_HAS_EX9_INST
;
14204 for (ptr
= ex9_insn_head
; ptr
!=NULL
; ptr
= ptr
->next
)
14208 val
= strtol (ptr
->string
, NULL
, 16);
14209 bfd_putb32 ((bfd_vma
) val
, (char *) contents
+ (number
* 4));
14217 /* Get insn with regs according to relocation type. */
14220 nds32_elf_get_insn_with_reg (Elf_Internal_Rela
*irel
,
14221 uint32_t insn
, uint32_t *insn_with_reg
)
14223 reloc_howto_type
*howto
= NULL
;
14226 || (ELF32_R_TYPE (irel
->r_info
) >= (int) ARRAY_SIZE (nds32_elf_howto_table
)
14227 && (ELF32_R_TYPE (irel
->r_info
) - R_NDS32_RELAX_ENTRY
)
14228 >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table
)))
14230 *insn_with_reg
= insn
;
14234 howto
= bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel
->r_info
));
14235 *insn_with_reg
= insn
& (0xffffffff ^ howto
->dst_mask
);
14238 /* Mask number of address bits according to relocation. */
14240 static unsigned long
14241 nds32_elf_irel_mask (Elf_Internal_Rela
*irel
)
14243 reloc_howto_type
*howto
= NULL
;
14246 || (ELF32_R_TYPE (irel
->r_info
) >= (int) ARRAY_SIZE (nds32_elf_howto_table
)
14247 && (ELF32_R_TYPE (irel
->r_info
) - R_NDS32_RELAX_ENTRY
)
14248 >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table
)))
14251 howto
= bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel
->r_info
));
14252 return howto
->dst_mask
;
14256 nds32_elf_insert_irel_entry (struct elf_nds32_irel_entry
**irel_list
,
14257 struct elf_nds32_irel_entry
*irel_ptr
)
14259 if (*irel_list
== NULL
)
14261 *irel_list
= irel_ptr
;
14262 irel_ptr
->next
= NULL
;
14266 irel_ptr
->next
= *irel_list
;
14267 *irel_list
= irel_ptr
;
14272 nds32_elf_ex9_insert_fix (asection
* sec
, Elf_Internal_Rela
* irel
,
14273 struct elf_link_hash_entry
*h
, int order
)
14275 struct elf_nds32_ex9_refix
*ptr
;
14277 ptr
= bfd_malloc (sizeof (struct elf_nds32_ex9_refix
));
14281 ptr
->order
= order
;
14284 if (ex9_refix_head
== NULL
)
14285 ex9_refix_head
= ptr
;
14288 struct elf_nds32_ex9_refix
*temp
= ex9_refix_head
;
14290 while (temp
->next
!= NULL
)
14299 CLEAN_PRE
= 1 << 1,
14303 /* Check relocation type if supporting for ex9. */
14306 nds32_elf_ex9_relocation_check (struct bfd_link_info
*info
,
14307 Elf_Internal_Rela
**irel
,
14308 Elf_Internal_Rela
*irelend
,
14309 nds32_elf_blank_t
*relax_blank_list
,
14310 asection
*sec
,bfd_vma
*off
,
14311 bfd_byte
*contents
)
14313 /* Suppress ex9 if `.no_relax ex9' or inner loop. */
14314 bfd_boolean nested_ex9
, nested_loop
;
14315 bfd_boolean ex9_loop_aware
;
14316 /* We use the highest 1 byte of result to record
14317 how many bytes location counter has to move. */
14319 Elf_Internal_Rela
*irel_save
= NULL
;
14320 struct elf_nds32_link_hash_table
*table
;
14322 table
= nds32_elf_hash_table (info
);
14323 ex9_loop_aware
= table
->ex9_loop_aware
;
14325 while ((*irel
) != NULL
&& (*irel
) < irelend
&& *off
== (*irel
)->r_offset
)
14327 switch (ELF32_R_TYPE ((*irel
)->r_info
))
14329 case R_NDS32_RELAX_REGION_BEGIN
:
14330 /* Ignore code block. */
14331 nested_ex9
= FALSE
;
14332 nested_loop
= FALSE
;
14333 if (((*irel
)->r_addend
& R_NDS32_RELAX_REGION_NO_EX9_FLAG
)
14335 && ((*irel
)->r_addend
& R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG
)))
14337 /* Check the region if loop or not. If it is true and
14338 ex9-loop-aware is true, ignore the region till region end. */
14339 /* To save the status for in .no_relax ex9 region and
14340 loop region to conform the block can do ex9 relaxation. */
14341 nested_ex9
= ((*irel
)->r_addend
& R_NDS32_RELAX_REGION_NO_EX9_FLAG
);
14342 nested_loop
= (ex9_loop_aware
14343 && ((*irel
)->r_addend
& R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG
));
14344 while ((*irel
) && (*irel
) < irelend
&& (nested_ex9
|| nested_loop
))
14347 if (ELF32_R_TYPE ((*irel
)->r_info
) == R_NDS32_RELAX_REGION_BEGIN
)
14349 /* There may be nested region. */
14350 if (((*irel
)->r_addend
& R_NDS32_RELAX_REGION_NO_EX9_FLAG
) != 0)
14352 else if (ex9_loop_aware
14353 && ((*irel
)->r_addend
& R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG
))
14354 nested_loop
= TRUE
;
14356 else if (ELF32_R_TYPE ((*irel
)->r_info
) == R_NDS32_RELAX_REGION_END
)
14358 /* The end of region. */
14359 if (((*irel
)->r_addend
& R_NDS32_RELAX_REGION_NO_EX9_FLAG
) != 0)
14360 nested_ex9
= FALSE
;
14361 else if (ex9_loop_aware
14362 && ((*irel
)->r_addend
& R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG
))
14363 nested_loop
= FALSE
;
14365 else if (ELF32_R_TYPE ((*irel
)->r_info
) == R_NDS32_LABEL
14366 && ((*irel
)->r_addend
& 0x1f) == 2)
14368 /* Alignment exist in the region. */
14369 result
|= CLEAN_PRE
;
14370 if (((*irel
)->r_offset
-
14371 get_nds32_elf_blank_total (&relax_blank_list
,
14372 (*irel
)->r_offset
, 0)) & 0x02)
14373 result
|= PUSH_PRE
;
14376 if ((*irel
) >= irelend
)
14379 *off
= (*irel
)->r_offset
;
14381 /* The final instruction in the region, regard this one as data to ignore it. */
14382 result
|= DATA_EXIST
;
14387 case R_NDS32_LABEL
:
14388 if (((*irel
)->r_addend
& 0x1f) == 2)
14390 /* Check this point is align and decide to do ex9 or not. */
14391 result
|= CLEAN_PRE
;
14392 if (((*irel
)->r_offset
-
14393 get_nds32_elf_blank_total (&relax_blank_list
,
14394 (*irel
)->r_offset
, 0)) & 0x02)
14395 result
|= PUSH_PRE
;
14398 case R_NDS32_32_RELA
:
14400 result
|= (4 << 24);
14401 result
|= DATA_EXIST
;
14403 case R_NDS32_16_RELA
:
14405 result
|= (2 << 24);
14406 result
|= DATA_EXIST
;
14410 /* The least code alignment is 2. If the data is only one byte,
14411 we have to shift one more byte. */
14412 if ((*irel
)->r_addend
== 1)
14413 result
|= ((*irel
)->r_addend
<< 25) ;
14415 result
|= ((*irel
)->r_addend
<< 24) ;
14417 result
|= DATA_EXIST
;
14420 case R_NDS32_25_PCREL_RELA
:
14421 case R_NDS32_SDA16S3_RELA
:
14422 case R_NDS32_SDA15S3_RELA
:
14423 case R_NDS32_SDA15S3
:
14424 case R_NDS32_SDA17S2_RELA
:
14425 case R_NDS32_SDA15S2_RELA
:
14426 case R_NDS32_SDA12S2_SP_RELA
:
14427 case R_NDS32_SDA12S2_DP_RELA
:
14428 case R_NDS32_SDA15S2
:
14429 case R_NDS32_SDA18S1_RELA
:
14430 case R_NDS32_SDA15S1_RELA
:
14431 case R_NDS32_SDA15S1
:
14432 case R_NDS32_SDA19S0_RELA
:
14433 case R_NDS32_SDA15S0_RELA
:
14434 case R_NDS32_SDA15S0
:
14435 case R_NDS32_HI20_RELA
:
14436 case R_NDS32_LO12S0_ORI_RELA
:
14437 case R_NDS32_LO12S0_RELA
:
14438 case R_NDS32_LO12S1_RELA
:
14439 case R_NDS32_LO12S2_RELA
:
14440 /* These relocation is supported ex9 relaxation currently. */
14441 /* We have to save the relocation for using later, since we have
14442 to check there is any alignment in the same address. */
14446 /* Not support relocations. */
14447 if (ELF32_R_TYPE ((*irel
)->r_info
) < ARRAY_SIZE (nds32_elf_howto_table
)
14448 && ELF32_R_TYPE ((*irel
)->r_info
) != R_NDS32_NONE
14449 && ELF32_R_TYPE ((*irel
)->r_info
) != R_NDS32_INSN16
)
14451 /* Note: To optimize aggressively, it maybe can ignore R_NDS32_INSN16 here.
14452 But we have to consider if there is any side-effect. */
14453 if (!(result
& DATA_EXIST
))
14455 /* We have to confirm there is no data relocation in the
14456 same address. In general case, this won't happen. */
14457 /* We have to do ex9 conservative, for those relocation not
14458 considerd we ignore instruction. */
14459 result
|= DATA_EXIST
;
14460 if (*(contents
+ *off
) & 0x80)
14461 result
|= (2 << 24);
14463 result
|= (4 << 24);
14468 if ((*irel
) < irelend
14469 && ((*irel
) + 1) < irelend
14470 && (*irel
)->r_offset
== ((*irel
) + 1)->r_offset
)
14471 /* There are relocations pointing to the same address, we have to
14472 check all of them. */
14484 /* Replace with ex9 instruction. */
14487 nds32_elf_ex9_push_insn (uint16_t insn16
, bfd_byte
*contents
, bfd_vma pre_off
,
14488 nds32_elf_blank_t
**relax_blank_list
,
14489 struct elf_nds32_irel_entry
*pre_irel_ptr
,
14490 struct elf_nds32_irel_entry
**irel_list
)
14494 /* Implement the ex9 relaxation. */
14495 bfd_putb16 (insn16
, contents
+ pre_off
);
14496 if (!insert_nds32_elf_blank_recalc_total (relax_blank_list
,
14499 if (pre_irel_ptr
!= NULL
)
14500 nds32_elf_insert_irel_entry (irel_list
, pre_irel_ptr
);
14505 /* Replace input file instruction which is in ex9 itable. */
14508 nds32_elf_ex9_replace_instruction (struct bfd_link_info
*info
, bfd
*abfd
, asection
*sec
)
14510 struct elf_nds32_insn_times_entry
*ex9_insn
= ex9_insn_head
;
14511 bfd_byte
*contents
= NULL
;
14513 uint16_t insn16
, insn_ex9
;
14514 /* `pre_*' are used to track previous instruction that can use ex9.it. */
14515 bfd_vma pre_off
= -1;
14516 uint16_t pre_insn16
= 0;
14517 struct elf_nds32_irel_entry
*pre_irel_ptr
= NULL
;
14518 Elf_Internal_Rela
*internal_relocs
;
14519 Elf_Internal_Rela
*irel
;
14520 Elf_Internal_Rela
*irelend
;
14521 Elf_Internal_Shdr
*symtab_hdr
;
14522 Elf_Internal_Sym
*isym
= NULL
;
14523 nds32_elf_blank_t
*relax_blank_list
= NULL
;
14525 uint32_t insn_with_reg
= 0;
14527 uint32_t it_insn_with_reg
;
14528 unsigned long r_symndx
;
14530 struct elf_nds32_irel_entry
*irel_list
= NULL
;
14531 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (abfd
);
14532 int data_flag
, do_replace
, save_irel
;
14533 struct elf_link_hash_entry_list
*h_list
;
14536 /* Load section instructions, relocations, and symbol table. */
14537 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
)
14538 || !nds32_get_local_syms (abfd
, sec
, &isym
))
14541 _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
, TRUE
/* keep_memory */);
14542 irelend
= internal_relocs
+ sec
->reloc_count
;
14543 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
14547 /* Check if the object enable ex9. */
14548 irel
= find_relocs_at_address (internal_relocs
, internal_relocs
,
14549 irelend
, R_NDS32_RELAX_ENTRY
);
14551 /* Check this section trigger ex9 relaxation. */
14554 || ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_ENTRY
14555 || (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_ENTRY
14556 && !(irel
->r_addend
& R_NDS32_RELAX_ENTRY_EX9_FLAG
)))
14559 irel
= internal_relocs
;
14561 /* Check alignment and fetch proper relocation. */
14562 while (off
< sec
->size
)
14564 struct elf_link_hash_entry
*h
= NULL
;
14565 struct elf_nds32_irel_entry
*irel_ptr
= NULL
;
14567 /* Syn the instruction and the relocation. */
14568 while (irel
!= NULL
&& irel
< irelend
&& irel
->r_offset
< off
)
14571 data_flag
= nds32_elf_ex9_relocation_check (info
, &irel
, irelend
,
14572 relax_blank_list
, sec
,
14574 if (data_flag
& PUSH_PRE
)
14575 if (!nds32_elf_ex9_push_insn (pre_insn16
, contents
, pre_off
,
14576 &relax_blank_list
, pre_irel_ptr
,
14580 if (data_flag
& CLEAN_PRE
)
14584 pre_irel_ptr
= NULL
;
14586 if (data_flag
& DATA_EXIST
)
14588 /* We save the move offset in the highest byte. */
14589 off
+= (data_flag
>> 24);
14593 if (*(contents
+ off
) & 0x80)
14595 /* 2-byte instruction. */
14600 /* Load the instruction and its opcode with register for comparing. */
14601 ex9_insn
= ex9_insn_head
;
14602 insn
= bfd_getb32 (contents
+ off
);
14606 it_insn
= strtol (ex9_insn
->string
, NULL
, 16);
14607 it_insn_with_reg
= 0;
14611 if (irel
!= NULL
&& irel
< irelend
&& irel
->r_offset
== off
)
14613 /* Insn with relocation. */
14614 nds32_elf_get_insn_with_reg (irel
, insn
, &insn_with_reg
);
14616 if (ex9_insn
->irel
!= NULL
)
14617 nds32_elf_get_insn_with_reg (ex9_insn
->irel
, it_insn
,
14618 &it_insn_with_reg
);
14620 if (ex9_insn
->irel
!= NULL
14621 && (ELF32_R_TYPE (irel
->r_info
) ==
14622 ELF32_R_TYPE (ex9_insn
->irel
->r_info
))
14623 && (insn_with_reg
== it_insn_with_reg
))
14625 /* Insn relocation and format is the same as table entry. */
14627 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_25_PCREL_RELA
14628 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S0_ORI_RELA
14629 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S0_RELA
14630 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S1_RELA
14631 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S2_RELA
14632 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA15S3
14633 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA15S0
)
14634 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA15S3_RELA
14635 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA15S0_RELA
)
14636 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA12S2_DP_RELA
14637 && ELF32_R_TYPE (irel
->r_info
) <=
14638 R_NDS32_SDA12S2_SP_RELA
)
14639 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA16S3_RELA
14640 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA19S0_RELA
))
14642 r_symndx
= ELF32_R_SYM (irel
->r_info
);
14643 if (r_symndx
< symtab_hdr
->sh_info
)
14645 /* Local symbol. */
14646 int shndx
= isym
[r_symndx
].st_shndx
;
14648 isec
= elf_elfsections (abfd
)[shndx
]->bfd_section
;
14649 if (ex9_insn
->sec
== isec
14650 && ex9_insn
->irel
->r_addend
== irel
->r_addend
14651 && ex9_insn
->irel
->r_info
== irel
->r_info
)
14659 /* External symbol. */
14660 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
14661 if (ex9_insn
->m_list
)
14663 h_list
= ex9_insn
->m_list
->h_list
;
14667 && (ex9_insn
->m_list
->irel
->r_addend
==
14674 h_list
= h_list
->next
;
14679 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_HI20_RELA
)
14681 r_symndx
= ELF32_R_SYM (irel
->r_info
);
14682 if (r_symndx
< symtab_hdr
->sh_info
)
14684 /* Local symbols. Compare its base symbol and offset. */
14685 int shndx
= isym
[r_symndx
].st_shndx
;
14687 isec
= elf_elfsections (abfd
)[shndx
]->bfd_section
;
14688 if (ex9_insn
->sec
== isec
14689 && ex9_insn
->irel
->r_addend
== irel
->r_addend
14690 && ex9_insn
->irel
->r_info
== irel
->r_info
)
14698 /* External symbol. */
14699 struct elf_link_hash_entry_mul_list
*m_list
;
14701 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
14702 m_list
= ex9_insn
->m_list
;
14706 h_list
= m_list
->h_list
;
14711 && (m_list
->irel
->r_addend
14712 == irel
->r_addend
))
14717 && ex9_insn
->m_list
14718 && ex9_insn
->m_list
== ex9_insn
->next
->m_list
)
14720 /* sethi multiple entry must be fixed */
14721 nds32_elf_ex9_insert_fix (sec
, irel
,
14722 h
, ex9_insn
->order
);
14726 h_list
= h_list
->next
;
14728 m_list
= m_list
->next
;
14734 /* Import table: Check the symbol hash table and the
14735 jump target. Only R_NDS32_25_PCREL_RELA now. */
14736 else if (ex9_insn
->times
== -1
14737 && ELF32_R_TYPE (irel
->r_info
) == R_NDS32_25_PCREL_RELA
)
14739 nds32_elf_get_insn_with_reg (irel
, it_insn
, &it_insn_with_reg
);
14740 if (insn_with_reg
== it_insn_with_reg
)
14743 bfd_vma relocation
;
14745 r_symndx
= ELF32_R_SYM (irel
->r_info
);
14746 if (r_symndx
>= symtab_hdr
->sh_info
)
14748 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
14749 if ((h
->root
.type
== bfd_link_hash_defined
14750 || h
->root
.type
== bfd_link_hash_defweak
)
14751 && h
->root
.u
.def
.section
!= NULL
14752 && h
->root
.u
.def
.section
->output_section
!= NULL
14753 && h
->root
.u
.def
.section
->gc_mark
== 1
14754 && bfd_is_abs_section (h
->root
.u
.def
.section
)
14755 && h
->root
.u
.def
.value
> sec
->size
)
14757 relocation
= h
->root
.u
.def
.value
+
14758 h
->root
.u
.def
.section
->output_section
->vma
+
14759 h
->root
.u
.def
.section
->output_offset
;
14760 relocation
+= irel
->r_addend
;
14761 insn
= insn_with_reg
14762 | ((relocation
>> 1) & 0xffffff);
14763 snprintf (code
, sizeof (code
), "%08x", insn
);
14764 if (strcmp (code
, ex9_insn
->string
) == 0)
14773 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
14774 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_END
14775 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_NONE
)
14777 /* These relocations do not have to relocate contens, so it can
14778 be regard as instruction without relocation. */
14779 if (insn
== it_insn
&& ex9_insn
->irel
== NULL
)
14785 /* Instruction without relocation, we only
14786 have to compare their byte code. */
14787 if (insn
== it_insn
&& ex9_insn
->irel
== NULL
)
14791 /* Insntruction match so replacing the code here. */
14792 if (do_replace
== 1)
14794 /* There are two formats of ex9 instruction. */
14795 if (ex9_insn
->order
< 32)
14796 insn_ex9
= INSN_EX9_IT_2
;
14798 insn_ex9
= INSN_EX9_IT_1
;
14799 insn16
= insn_ex9
| ex9_insn
->order
;
14801 /* Insert ex9 instruction. */
14802 nds32_elf_ex9_push_insn (pre_insn16
, contents
, pre_off
,
14803 &relax_blank_list
, pre_irel_ptr
,
14806 pre_insn16
= insn16
;
14810 /* For instuction with relocation do relax. */
14811 irel_ptr
= (struct elf_nds32_irel_entry
*)
14812 bfd_malloc (sizeof (struct elf_nds32_irel_entry
));
14813 irel_ptr
->irel
= irel
;
14814 irel_ptr
->next
= NULL
;
14815 pre_irel_ptr
= irel_ptr
;
14818 pre_irel_ptr
= NULL
;
14821 ex9_insn
= ex9_insn
->next
;
14826 /* Insert ex9 instruction. */
14827 nds32_elf_ex9_push_insn (pre_insn16
, contents
, pre_off
,
14828 &relax_blank_list
, pre_irel_ptr
,
14831 /* Delete the redundant code. */
14832 if (relax_blank_list
)
14834 nds32_elf_relax_delete_blanks (abfd
, sec
, relax_blank_list
);
14835 relax_blank_list
= NULL
;
14838 /* Clear the relocation that is replaced by ex9. */
14841 struct elf_nds32_irel_entry
*irel_ptr
;
14843 irel_ptr
= irel_list
;
14844 irel_list
= irel_ptr
->next
;
14845 irel_ptr
->irel
->r_info
=
14846 ELF32_R_INFO (ELF32_R_SYM (irel_ptr
->irel
->r_info
), R_NDS32_TRAN
);
14852 /* Initialize ex9 hash table. */
14855 nds32_elf_ex9_init (void)
14857 if (!bfd_hash_table_init_n (&ex9_code_table
, nds32_elf_code_hash_newfunc
,
14858 sizeof (struct elf_nds32_code_hash_entry
),
14861 _bfd_error_handler (_("Linker: cannot init ex9 hash table error \n"));
14867 /* Predict how many bytes will be relaxed with ex9 and ifc. */
14870 nds32_elf_ex9_total_relax (struct bfd_link_info
*info
)
14872 struct elf_nds32_insn_times_entry
*ex9_insn
;
14873 struct elf_nds32_insn_times_entry
*temp
;
14874 int target_optimize
;
14875 struct elf_nds32_link_hash_table
*table
;
14877 if (ex9_insn_head
== NULL
)
14880 table
= nds32_elf_hash_table (info
);
14881 target_optimize
= table
->target_optimize
;
14882 ex9_insn
= ex9_insn_head
;
14885 ex9_relax_size
= ex9_insn
->times
* 2 + ex9_relax_size
;
14887 ex9_insn
= ex9_insn
->next
;
14890 ex9_insn_head
= NULL
;
14892 if ((target_optimize
& NDS32_RELAX_JUMP_IFC_ON
))
14894 /* Examine ifc reduce size. */
14895 struct elf_nds32_ifc_symbol_entry
*ifc_ent
= ifc_symbol_head
;
14896 struct elf_nds32_ifc_irel_list
*irel_ptr
= NULL
;
14901 if (ifc_ent
->enable
== 0)
14904 irel_ptr
= ifc_ent
->irel_head
;
14908 irel_ptr
= irel_ptr
->next
;
14912 ifc_ent
= ifc_ent
->next
;
14914 ex9_relax_size
+= size
;
14918 /* Finish ex9 table. */
14921 nds32_elf_ex9_finish (struct bfd_link_info
*link_info
)
14923 nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times
);
14924 nds32_elf_order_insn_times (link_info
);
14925 nds32_elf_ex9_total_relax (link_info
);
14926 /* Traverse the hash table and count its times. */
14927 nds32_elf_code_hash_traverse (nds32_elf_count_insn_times
);
14928 nds32_elf_order_insn_times (link_info
);
14929 nds32_elf_ex9_build_itable (link_info
);
14932 /* Relocate the entries in ex9 table. */
14935 nds32_elf_ex9_reloc_insn (struct elf_nds32_insn_times_entry
*ptr
,
14936 struct bfd_link_info
*link_info
)
14938 Elf_Internal_Sym
*isym
= NULL
;
14939 bfd_vma relocation
= -1;
14940 struct elf_link_hash_entry
*h
;
14942 if (ptr
->m_list
!= NULL
)
14944 /* Global symbol. */
14945 h
= ptr
->m_list
->h_list
->h
;
14946 if ((h
->root
.type
== bfd_link_hash_defined
14947 || h
->root
.type
== bfd_link_hash_defweak
)
14948 && h
->root
.u
.def
.section
!= NULL
14949 && h
->root
.u
.def
.section
->output_section
!= NULL
)
14952 relocation
= h
->root
.u
.def
.value
+
14953 h
->root
.u
.def
.section
->output_section
->vma
+
14954 h
->root
.u
.def
.section
->output_offset
;
14955 relocation
+= ptr
->m_list
->irel
->r_addend
;
14960 else if (ptr
->sec
!=NULL
)
14962 /* Local symbol. */
14963 Elf_Internal_Sym sym
;
14964 asection
*sec
= NULL
;
14966 asection
*isec_ptr
= &isec
;
14967 Elf_Internal_Rela irel_backup
= *(ptr
->irel
);
14968 asection
*sec_backup
= ptr
->sec
;
14969 bfd
*abfd
= ptr
->sec
->owner
;
14971 if (!nds32_get_local_syms (abfd
, sec
, &isym
))
14973 isym
= isym
+ ELF32_R_SYM (ptr
->irel
->r_info
);
14975 sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
14980 /* The purpose is same as elf_link_input_bfd. */
14981 if (isec_ptr
!= NULL
14982 && isec_ptr
->sec_info_type
== SEC_INFO_TYPE_MERGE
14983 && ELF_ST_TYPE (isym
->st_info
) != STT_SECTION
)
14986 _bfd_merged_section_offset (ptr
->sec
->output_section
->owner
, &isec_ptr
,
14987 elf_section_data (isec_ptr
)->sec_info
,
14990 relocation
= _bfd_elf_rela_local_sym (link_info
->output_bfd
, &sym
,
14991 &ptr
->sec
, ptr
->irel
);
14992 if (ptr
->irel
!= NULL
)
14993 relocation
+= ptr
->irel
->r_addend
;
14995 /* Restore origin value since there may be some insntructions that
14996 could not be replaced with ex9.it. */
14997 *(ptr
->irel
) = irel_backup
;
14998 ptr
->sec
= sec_backup
;
15004 /* Import ex9 table and build list. */
15007 nds32_elf_ex9_import_table (struct bfd_link_info
*info
)
15010 bfd_byte
*contents
;
15011 unsigned long insn
;
15012 FILE *ex9_import_file
;
15013 int update_ex9_table
;
15014 struct elf_nds32_link_hash_table
*table
;
15016 table
= nds32_elf_hash_table (info
);
15017 ex9_import_file
= table
->ex9_import_file
;
15018 rewind (table
->ex9_import_file
);
15020 contents
= bfd_malloc (sizeof (bfd_byte
) * 4);
15022 /* Read instructions from the input file and build the list. */
15023 while (!feof (ex9_import_file
))
15026 struct elf_nds32_insn_times_entry
*ptr
;
15029 nread
= fread (contents
, sizeof (bfd_byte
) * 4, 1, ex9_import_file
);
15030 /* Ignore the final byte 0x0a. */
15033 insn
= bfd_getb32 (contents
);
15034 code
= bfd_malloc (sizeof (char) * 9);
15035 snprintf (code
, 9, "%08lx", insn
);
15036 ptr
= bfd_malloc (sizeof (struct elf_nds32_insn_times_entry
));
15037 ptr
->string
= code
;
15041 ptr
->m_list
= NULL
;
15042 ptr
->rel_backup
.r_offset
= 0;
15043 ptr
->rel_backup
.r_info
= 0;
15044 ptr
->rel_backup
.r_addend
= 0;
15047 nds32_elf_ex9_insert_entry (ptr
);
15051 update_ex9_table
= table
->update_ex9_table
;
15052 if (update_ex9_table
== 1)
15054 /* It has to consider of sethi need to use multiple page
15055 but it not be done yet. */
15056 nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times
);
15057 nds32_elf_order_insn_times (info
);
15061 /* Export ex9 table. */
15064 nds32_elf_ex9_export (struct bfd_link_info
*info
,
15065 bfd_byte
*contents
, int size
)
15067 FILE *ex9_export_file
;
15068 struct elf_nds32_link_hash_table
*table
;
15070 table
= nds32_elf_hash_table (info
);
15071 ex9_export_file
= table
->ex9_export_file
;
15072 fwrite (contents
, sizeof (bfd_byte
), size
, ex9_export_file
);
15073 fclose (ex9_export_file
);
15076 /* Adjust relocations of J and JAL in ex9.itable.
15077 Export ex9 table. */
15080 nds32_elf_ex9_reloc_jmp (struct bfd_link_info
*link_info
)
15082 asection
*table_sec
= NULL
;
15083 struct elf_nds32_insn_times_entry
*ex9_insn
= ex9_insn_head
;
15084 struct elf_nds32_insn_times_entry
*temp_ptr
, *temp_ptr2
;
15086 uint32_t insn
, insn_with_reg
, source_insn
;
15087 bfd_byte
*contents
= NULL
, *source_contents
= NULL
;
15090 int shift
, update_ex9_table
, offset
= 0;
15091 reloc_howto_type
*howto
= NULL
;
15092 Elf_Internal_Rela rel_backup
;
15093 unsigned short insn_ex9
;
15094 struct elf_nds32_link_hash_table
*table
;
15095 FILE *ex9_export_file
;
15096 static bfd_boolean done
= FALSE
;
15103 table
= nds32_elf_hash_table (link_info
);
15105 table
->relax_status
|= NDS32_RELAX_EX9_DONE
;
15108 update_ex9_table
= table
->update_ex9_table
;
15109 /* Generated ex9.itable exactly. */
15110 if (update_ex9_table
== 0)
15112 for (it_abfd
= link_info
->input_bfds
; it_abfd
!= NULL
;
15113 it_abfd
= it_abfd
->link
.next
)
15115 table_sec
= bfd_get_section_by_name (it_abfd
, ".ex9.itable");
15116 if (table_sec
!= NULL
)
15120 if (table_sec
!= NULL
)
15124 output_bfd
= table_sec
->output_section
->owner
;
15125 nds32_elf_final_sda_base (output_bfd
, link_info
, &gp
, FALSE
);
15126 if (table_sec
->size
== 0)
15129 if (!nds32_get_section_contents (it_abfd
, table_sec
, &contents
, TRUE
))
15138 output_bfd
= link_info
->input_bfds
->sections
->output_section
->owner
;
15139 nds32_elf_final_sda_base (output_bfd
, link_info
, &gp
, FALSE
);
15140 contents
= bfd_malloc (sizeof (bfd_byte
) * 2048);
15143 /* Relocate instruction. */
15146 bfd_vma relocation
, min_relocation
= 0xffffffff;
15148 insn
= strtol (ex9_insn
->string
, NULL
, 16);
15150 if (ex9_insn
->m_list
!= NULL
|| ex9_insn
->sec
!= NULL
)
15152 if (ex9_insn
->m_list
)
15153 rel_backup
= ex9_insn
->m_list
->rel_backup
;
15155 rel_backup
= ex9_insn
->rel_backup
;
15157 nds32_elf_get_insn_with_reg (&rel_backup
, insn
, &insn_with_reg
);
15159 bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE
15160 (rel_backup
.r_info
));
15161 shift
= howto
->rightshift
;
15162 if (ELF32_R_TYPE (rel_backup
.r_info
) == R_NDS32_25_PCREL_RELA
15163 || ELF32_R_TYPE (rel_backup
.r_info
) == R_NDS32_LO12S0_ORI_RELA
15164 || ELF32_R_TYPE (rel_backup
.r_info
) == R_NDS32_LO12S0_RELA
15165 || ELF32_R_TYPE (rel_backup
.r_info
) == R_NDS32_LO12S1_RELA
15166 || ELF32_R_TYPE (rel_backup
.r_info
) == R_NDS32_LO12S2_RELA
)
15168 relocation
= nds32_elf_ex9_reloc_insn (ex9_insn
, link_info
);
15170 insn_with_reg
| ((relocation
>> shift
) &
15171 nds32_elf_irel_mask (&rel_backup
));
15172 bfd_putb32 (insn
, contents
+ (ex9_insn
->order
) * 4);
15174 else if ((ELF32_R_TYPE (rel_backup
.r_info
) >= R_NDS32_SDA15S3
15175 && ELF32_R_TYPE (rel_backup
.r_info
) <= R_NDS32_SDA15S0
)
15176 || (ELF32_R_TYPE (rel_backup
.r_info
) >= R_NDS32_SDA15S3_RELA
15177 && ELF32_R_TYPE (rel_backup
.r_info
) <= R_NDS32_SDA15S0_RELA
)
15178 || (ELF32_R_TYPE (rel_backup
.r_info
) >= R_NDS32_SDA12S2_DP_RELA
15179 && ELF32_R_TYPE (rel_backup
.r_info
) <= R_NDS32_SDA12S2_SP_RELA
)
15180 || (ELF32_R_TYPE (rel_backup
.r_info
) >= R_NDS32_SDA16S3_RELA
15181 && ELF32_R_TYPE (rel_backup
.r_info
) <= R_NDS32_SDA19S0_RELA
))
15183 relocation
= nds32_elf_ex9_reloc_insn (ex9_insn
, link_info
);
15185 insn_with_reg
| (((relocation
- gp
) >> shift
) &
15186 nds32_elf_irel_mask (&rel_backup
));
15187 bfd_putb32 (insn
, contents
+ (ex9_insn
->order
) * 4);
15189 else if (ELF32_R_TYPE (rel_backup
.r_info
) == R_NDS32_HI20_RELA
)
15191 /* Sethi may be multiple entry for one insn. */
15192 if (ex9_insn
->next
&& ex9_insn
->m_list
15193 && ex9_insn
->m_list
== ex9_insn
->next
->m_list
)
15195 struct elf_link_hash_entry_mul_list
*m_list
;
15196 struct elf_nds32_ex9_refix
*fix_ptr
;
15197 struct elf_link_hash_entry
*h
;
15199 temp_ptr
= ex9_insn
;
15200 temp_ptr2
= ex9_insn
;
15201 m_list
= ex9_insn
->m_list
;
15204 h
= m_list
->h_list
->h
;
15205 relocation
= h
->root
.u
.def
.value
+
15206 h
->root
.u
.def
.section
->output_section
->vma
+
15207 h
->root
.u
.def
.section
->output_offset
;
15208 relocation
+= m_list
->irel
->r_addend
;
15210 if (relocation
< min_relocation
)
15211 min_relocation
= relocation
;
15212 m_list
= m_list
->next
;
15214 relocation
= min_relocation
;
15216 /* Put insntruction into ex9 table. */
15217 insn
= insn_with_reg
15218 | ((relocation
>> shift
) & nds32_elf_irel_mask (&rel_backup
));
15219 bfd_putb32 (insn
, contents
+ (ex9_insn
->order
) * 4);
15220 relocation
= relocation
+ 0x1000; /* hi20 */
15222 while (ex9_insn
->next
&& ex9_insn
->m_list
15223 && ex9_insn
->m_list
== ex9_insn
->next
->m_list
)
15225 /* Multiple sethi. */
15226 ex9_insn
= ex9_insn
->next
;
15229 insn_with_reg
| ((relocation
>> shift
) &
15230 nds32_elf_irel_mask (&rel_backup
));
15231 bfd_putb32 (insn
, contents
+ (ex9_insn
->order
) * 4);
15232 relocation
= relocation
+ 0x1000; /* hi20 */
15235 fix_ptr
= ex9_refix_head
;
15238 /* Fix ex9 insn. */
15239 /* temp_ptr2 points to the head of multiple sethi. */
15240 temp_ptr
= temp_ptr2
;
15241 while (fix_ptr
->order
!= temp_ptr
->order
&& fix_ptr
->next
)
15243 fix_ptr
= fix_ptr
->next
;
15245 if (fix_ptr
->order
!= temp_ptr
->order
)
15248 /* Set source insn. */
15250 fix_ptr
->h
->root
.u
.def
.value
+
15251 fix_ptr
->h
->root
.u
.def
.section
->output_section
->vma
+
15252 fix_ptr
->h
->root
.u
.def
.section
->output_offset
;
15253 relocation
+= fix_ptr
->irel
->r_addend
;
15254 /* sethi imm is imm20s. */
15255 source_insn
= insn_with_reg
| ((relocation
>> shift
) & 0xfffff);
15259 /* Match entry and source code. */
15260 insn
= bfd_getb32 (contents
+ (temp_ptr
->order
) * 4 + offset
);
15261 if (insn
== source_insn
)
15263 /* Fix the ex9 insn. */
15264 if (temp_ptr
->order
!= fix_ptr
->order
)
15266 if (!nds32_get_section_contents
15267 (fix_ptr
->sec
->owner
, fix_ptr
->sec
,
15268 &source_contents
, TRUE
))
15270 (_("Linker: error cannot fixed ex9 relocation \n"));
15271 if (temp_ptr
->order
< 32)
15272 insn_ex9
= INSN_EX9_IT_2
;
15274 insn_ex9
= INSN_EX9_IT_1
;
15275 insn_ex9
= insn_ex9
| temp_ptr
->order
;
15276 bfd_putb16 (insn_ex9
, source_contents
+ fix_ptr
->irel
->r_offset
);
15282 if (!temp_ptr
->next
|| temp_ptr
->m_list
!= temp_ptr
->next
->m_list
)
15284 (_("Linker: error cannot fixed ex9 relocation \n"));
15286 temp_ptr
= temp_ptr
->next
;
15289 fix_ptr
= fix_ptr
->next
;
15294 relocation
= nds32_elf_ex9_reloc_insn (ex9_insn
, link_info
);
15295 insn
= insn_with_reg
15296 | ((relocation
>> shift
) & nds32_elf_irel_mask (&rel_backup
));
15297 bfd_putb32 (insn
, contents
+ (ex9_insn
->order
) * 4);
15303 /* Insn without relocation does not have to be fixed
15304 if need to update export table. */
15305 if (update_ex9_table
== 1)
15306 bfd_putb32 (insn
, contents
+ (ex9_insn
->order
) * 4);
15308 ex9_insn
= ex9_insn
->next
;
15312 ex9_export_file
= table
->ex9_export_file
;
15313 if (ex9_export_file
!= NULL
)
15314 nds32_elf_ex9_export (link_info
, contents
, table_sec
->size
);
15315 else if (update_ex9_table
== 1)
15317 table
->ex9_export_file
= table
->ex9_import_file
;
15318 rewind (table
->ex9_export_file
);
15319 nds32_elf_ex9_export (link_info
, contents
, size
);
15323 /* Generate ex9 hash table. */
15326 nds32_elf_ex9_build_hash_table (bfd
*abfd
, asection
*sec
,
15327 struct bfd_link_info
*link_info
)
15329 Elf_Internal_Rela
*internal_relocs
;
15330 Elf_Internal_Rela
*irelend
;
15331 Elf_Internal_Rela
*irel
;
15332 Elf_Internal_Rela
*jrel
;
15333 Elf_Internal_Rela rel_backup
;
15334 Elf_Internal_Shdr
*symtab_hdr
;
15335 Elf_Internal_Sym
*isym
= NULL
;
15337 struct elf_link_hash_entry
**sym_hashes
;
15338 bfd_byte
*contents
= NULL
;
15340 unsigned long r_symndx
;
15341 uint32_t insn
, insn_with_reg
;
15342 struct elf_link_hash_entry
*h
;
15343 int data_flag
, shift
, align
;
15344 bfd_vma relocation
;
15345 /* Suppress ex9 if `.no_relax ex9' or inner loop. */
15346 reloc_howto_type
*howto
= NULL
;
15348 sym_hashes
= elf_sym_hashes (abfd
);
15349 /* Load section instructions, relocations, and symbol table. */
15350 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
))
15353 internal_relocs
= _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
,
15354 TRUE
/* keep_memory */);
15355 irelend
= internal_relocs
+ sec
->reloc_count
;
15356 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
15357 if (!nds32_get_local_syms (abfd
, sec
, &isym
))
15360 /* Check the object if enable ex9. */
15361 irel
= find_relocs_at_address (internal_relocs
, internal_relocs
, irelend
,
15362 R_NDS32_RELAX_ENTRY
);
15364 /* Check this section trigger ex9 relaxation. */
15367 || ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_ENTRY
15368 || (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_ENTRY
15369 && !(irel
->r_addend
& R_NDS32_RELAX_ENTRY_EX9_FLAG
)))
15372 irel
= internal_relocs
;
15374 /* Push each insn into hash table. */
15375 while (off
< sec
->size
)
15378 struct elf_nds32_code_hash_entry
*entry
;
15380 while (irel
!= NULL
&& irel
< irelend
&& irel
->r_offset
< off
)
15383 data_flag
= nds32_elf_ex9_relocation_check (link_info
, &irel
, irelend
,
15384 NULL
, sec
, &off
, contents
);
15385 if (data_flag
& DATA_EXIST
)
15387 /* We save the move offset in the highest byte. */
15388 off
+= (data_flag
>> 24);
15392 if (*(contents
+ off
) & 0x80)
15401 rel_backup
.r_info
= 0;
15402 rel_backup
.r_offset
= 0;
15403 rel_backup
.r_addend
= 0;
15404 /* Load the instruction and its opcode with register for comparing. */
15405 insn
= bfd_getb32 (contents
+ off
);
15407 if (irel
!= NULL
&& irel
< irelend
&& irel
->r_offset
== off
)
15409 nds32_elf_get_insn_with_reg (irel
, insn
, &insn_with_reg
);
15410 howto
= bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel
->r_info
));
15411 shift
= howto
->rightshift
;
15412 align
= (1 << shift
) - 1;
15413 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_25_PCREL_RELA
15414 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_HI20_RELA
15415 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S0_ORI_RELA
15416 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S0_RELA
15417 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S1_RELA
15418 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S2_RELA
15419 ||(ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA15S3
15420 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA15S0
)
15421 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA15S3_RELA
15422 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA15S0_RELA
)
15423 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA12S2_DP_RELA
15424 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA12S2_SP_RELA
)
15425 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA16S3_RELA
15426 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA19S0_RELA
))
15428 r_symndx
= ELF32_R_SYM (irel
->r_info
);
15430 rel_backup
= *irel
;
15431 if (r_symndx
< symtab_hdr
->sh_info
)
15433 /* Local symbol. */
15434 int shndx
= isym
[r_symndx
].st_shndx
;
15436 bfd_vma st_value
= (isym
+ r_symndx
)->st_value
;
15437 isec
= elf_elfsections (abfd
)[shndx
]->bfd_section
;
15438 relocation
= (isec
->output_section
->vma
+ isec
->output_offset
15439 + st_value
+ irel
->r_addend
);
15443 /* External symbol. */
15444 bfd_boolean warned ATTRIBUTE_UNUSED
;
15445 bfd_boolean ignored ATTRIBUTE_UNUSED
;
15446 bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED
;
15449 /* Maybe there is a better way to get h and relocation */
15450 RELOC_FOR_GLOBAL_SYMBOL (link_info
, abfd
, sec
, irel
,
15451 r_symndx
, symtab_hdr
, sym_hashes
,
15452 h
, sym_sec
, relocation
,
15453 unresolved_reloc
, warned
, ignored
);
15454 relocation
+= irel
->r_addend
;
15455 if ((h
->root
.type
!= bfd_link_hash_defined
15456 && h
->root
.type
!= bfd_link_hash_defweak
)
15457 || strcmp (h
->root
.root
.string
, "_FP_BASE_") == 0)
15464 /* Check for gp relative instruction alignment. */
15465 if ((ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA15S3
15466 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA15S0
)
15467 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA15S3_RELA
15468 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA15S0_RELA
)
15469 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA12S2_DP_RELA
15470 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA12S2_SP_RELA
)
15471 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_SDA16S3_RELA
15472 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_SDA19S0_RELA
))
15475 bfd
*output_bfd
= sec
->output_section
->owner
;
15476 bfd_reloc_status_type r
;
15478 /* If the symbol is in the abs section, the out_bfd will be null.
15479 This happens when the relocation has a symbol@GOTOFF. */
15480 r
= nds32_elf_final_sda_base (output_bfd
, link_info
, &gp
, FALSE
);
15481 if (r
!= bfd_reloc_ok
)
15489 /* Make sure alignment is correct. */
15490 if (relocation
& align
)
15492 /* Incorrect alignment. */
15494 (_("%s: warning: unaligned small data access. "
15495 "For entry: {%d, %d, %d}, addr = 0x%x, align = 0x%x."),
15496 bfd_get_filename (abfd
), irel
->r_offset
,
15497 irel
->r_info
, irel
->r_addend
, relocation
, align
);
15503 insn
= insn_with_reg
15504 | ((relocation
>> shift
) & nds32_elf_irel_mask (irel
));
15506 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
15507 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_END
15508 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_NONE
)
15510 /* These relocations do not have to relocate contens, so it can
15511 be regard as instruction without relocation. */
15520 snprintf (code
, sizeof (code
), "%08x", insn
);
15522 entry
= (struct elf_nds32_code_hash_entry
*)
15523 bfd_hash_lookup (&ex9_code_table
, code
, TRUE
, TRUE
);
15527 (_("%P%F: failed creating ex9.it %s hash table: %E\n"), code
);
15532 if (h
->root
.type
== bfd_link_hash_undefined
)
15534 /* Global symbol. */
15535 /* In order to do sethi with different symbol but same value. */
15536 if (entry
->m_list
== NULL
)
15538 struct elf_link_hash_entry_mul_list
*m_list_new
;
15539 struct elf_link_hash_entry_list
*h_list_new
;
15541 m_list_new
= (struct elf_link_hash_entry_mul_list
*)
15542 bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list
));
15543 h_list_new
= (struct elf_link_hash_entry_list
*)
15544 bfd_malloc (sizeof (struct elf_link_hash_entry_list
));
15545 entry
->m_list
= m_list_new
;
15546 m_list_new
->h_list
= h_list_new
;
15547 m_list_new
->rel_backup
= rel_backup
;
15548 m_list_new
->times
= 1;
15549 m_list_new
->irel
= jrel
;
15550 m_list_new
->next
= NULL
;
15552 h_list_new
->next
= NULL
;
15556 struct elf_link_hash_entry_mul_list
*m_list
= entry
->m_list
;
15557 struct elf_link_hash_entry_list
*h_list
;
15561 /* Build the different symbols that point to the same address. */
15562 h_list
= m_list
->h_list
;
15563 if (h_list
->h
->root
.u
.def
.value
== h
->root
.u
.def
.value
15564 && h_list
->h
->root
.u
.def
.section
->output_section
->vma
15565 == h
->root
.u
.def
.section
->output_section
->vma
15566 && h_list
->h
->root
.u
.def
.section
->output_offset
15567 == h
->root
.u
.def
.section
->output_offset
15568 && m_list
->rel_backup
.r_addend
== rel_backup
.r_addend
)
15571 m_list
->irel
= jrel
;
15572 while (h_list
->h
!= h
&& h_list
->next
)
15573 h_list
= h_list
->next
;
15574 if (h_list
->h
!= h
)
15576 struct elf_link_hash_entry_list
*h_list_new
;
15578 h_list_new
= (struct elf_link_hash_entry_list
*)
15579 bfd_malloc (sizeof (struct elf_link_hash_entry_list
));
15580 h_list
->next
= h_list_new
;
15582 h_list_new
->next
= NULL
;
15586 /* The sethi case may have different address but the
15587 hi20 is the same. */
15588 else if (ELF32_R_TYPE (jrel
->r_info
) == R_NDS32_HI20_RELA
15589 && m_list
->next
== NULL
)
15591 struct elf_link_hash_entry_mul_list
*m_list_new
;
15592 struct elf_link_hash_entry_list
*h_list_new
;
15594 m_list_new
= (struct elf_link_hash_entry_mul_list
*)
15595 bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list
));
15596 h_list_new
= (struct elf_link_hash_entry_list
*)
15597 bfd_malloc (sizeof (struct elf_link_hash_entry_list
));
15598 m_list
->next
= m_list_new
;
15599 m_list_new
->h_list
= h_list_new
;
15600 m_list_new
->rel_backup
= rel_backup
;
15601 m_list_new
->times
= 1;
15602 m_list_new
->irel
= jrel
;
15603 m_list_new
->next
= NULL
;
15605 h_list_new
->next
= NULL
;
15608 m_list
= m_list
->next
;
15619 /* Local symbol and insn without relocation*/
15621 entry
->rel_backup
= rel_backup
;
15624 /* Use in sethi insn with constant and global symbol in same format. */
15626 entry
->const_insn
= 1;
15628 entry
->irel
= jrel
;
15636 /* Set the _ITB_BASE, and point it to ex9 table. */
15639 nds32_elf_ex9_itb_base (struct bfd_link_info
*link_info
)
15643 bfd
*output_bfd
= NULL
;
15644 struct bfd_link_hash_entry
*bh
= NULL
;
15646 if (is_ITB_BASE_set
== 1)
15649 is_ITB_BASE_set
= 1;
15651 bh
= bfd_link_hash_lookup (link_info
->hash
, "_ITB_BASE_", FALSE
, FALSE
, TRUE
);
15653 if (bh
&& (bh
->type
== bfd_link_hash_defined
15654 || bh
->type
== bfd_link_hash_defweak
))
15657 for (abfd
= link_info
->input_bfds
; abfd
!= NULL
;
15658 abfd
= abfd
->link
.next
)
15660 sec
= bfd_get_section_by_name (abfd
, ".ex9.itable");
15663 output_bfd
= sec
->output_section
->owner
;
15667 if (output_bfd
== NULL
)
15669 output_bfd
= link_info
->output_bfd
;
15670 if (output_bfd
->sections
== NULL
)
15673 sec
= bfd_abs_section_ptr
;
15675 bh
= bfd_link_hash_lookup (link_info
->hash
, "_ITB_BASE_",
15676 FALSE
, FALSE
, TRUE
);
15677 return (_bfd_generic_link_add_one_symbol
15678 (link_info
, output_bfd
, "_ITB_BASE_",
15679 BSF_GLOBAL
| BSF_WEAK
, sec
, 0,
15680 (const char *) NULL
, FALSE
, get_elf_backend_data
15681 (output_bfd
)->collect
, &bh
));
15685 #define ELF_ARCH bfd_arch_nds32
15686 #define ELF_MACHINE_CODE EM_NDS32
15687 #define ELF_MAXPAGESIZE 0x1000
15688 #define ELF_TARGET_ID NDS32_ELF_DATA
15690 #define TARGET_BIG_SYM nds32_elf32_be_vec
15691 #define TARGET_BIG_NAME "elf32-nds32be"
15692 #define TARGET_LITTLE_SYM nds32_elf32_le_vec
15693 #define TARGET_LITTLE_NAME "elf32-nds32le"
15695 #define elf_info_to_howto nds32_info_to_howto
15696 #define elf_info_to_howto_rel nds32_info_to_howto_rel
15698 #define bfd_elf32_bfd_link_hash_table_create nds32_elf_link_hash_table_create
15699 #define bfd_elf32_bfd_merge_private_bfd_data nds32_elf_merge_private_bfd_data
15700 #define bfd_elf32_bfd_print_private_bfd_data nds32_elf_print_private_bfd_data
15701 #define bfd_elf32_bfd_relax_section nds32_elf_relax_section
15702 #define bfd_elf32_bfd_set_private_flags nds32_elf_set_private_flags
15704 #define bfd_elf32_mkobject nds32_elf_mkobject
15705 #define elf_backend_action_discarded nds32_elf_action_discarded
15706 #define elf_backend_add_symbol_hook nds32_elf_add_symbol_hook
15707 #define elf_backend_check_relocs nds32_elf_check_relocs
15708 #define elf_backend_adjust_dynamic_symbol nds32_elf_adjust_dynamic_symbol
15709 #define elf_backend_create_dynamic_sections nds32_elf_create_dynamic_sections
15710 #define elf_backend_finish_dynamic_sections nds32_elf_finish_dynamic_sections
15711 #define elf_backend_finish_dynamic_symbol nds32_elf_finish_dynamic_symbol
15712 #define elf_backend_size_dynamic_sections nds32_elf_size_dynamic_sections
15713 #define elf_backend_relocate_section nds32_elf_relocate_section
15714 #define elf_backend_gc_mark_hook nds32_elf_gc_mark_hook
15715 #define elf_backend_gc_sweep_hook nds32_elf_gc_sweep_hook
15716 #define elf_backend_grok_prstatus nds32_elf_grok_prstatus
15717 #define elf_backend_grok_psinfo nds32_elf_grok_psinfo
15718 #define elf_backend_reloc_type_class nds32_elf_reloc_type_class
15719 #define elf_backend_copy_indirect_symbol nds32_elf_copy_indirect_symbol
15720 #define elf_backend_link_output_symbol_hook nds32_elf_output_symbol_hook
15721 #define elf_backend_output_arch_syms nds32_elf_output_arch_syms
15722 #define elf_backend_object_p nds32_elf_object_p
15723 #define elf_backend_final_write_processing nds32_elf_final_write_processing
15724 #define elf_backend_special_sections nds32_elf_special_sections
15725 #define bfd_elf32_bfd_get_relocated_section_contents \
15726 nds32_elf_get_relocated_section_contents
15728 #define elf_backend_can_gc_sections 1
15729 #define elf_backend_can_refcount 1
15730 #define elf_backend_want_got_plt 1
15731 #define elf_backend_plt_readonly 1
15732 #define elf_backend_want_plt_sym 0
15733 #define elf_backend_got_header_size 12
15734 #define elf_backend_may_use_rel_p 1
15735 #define elf_backend_default_use_rela_p 1
15736 #define elf_backend_may_use_rela_p 1
15738 #include "elf32-target.h"
15740 #undef ELF_MAXPAGESIZE
15741 #define ELF_MAXPAGESIZE 0x2000
15743 #undef TARGET_BIG_SYM
15744 #define TARGET_BIG_SYM nds32_elf32_linux_be_vec
15745 #undef TARGET_BIG_NAME
15746 #define TARGET_BIG_NAME "elf32-nds32be-linux"
15747 #undef TARGET_LITTLE_SYM
15748 #define TARGET_LITTLE_SYM nds32_elf32_linux_le_vec
15749 #undef TARGET_LITTLE_NAME
15750 #define TARGET_LITTLE_NAME "elf32-nds32le-linux"
15752 #define elf32_bed elf32_nds32_lin_bed
15754 #include "elf32-target.h"