1 /* NDS32-specific support for 32-bit ELF.
2 Copyright (C) 2012-2020 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
28 #include "libiberty.h"
29 #include "elf/nds32.h"
30 #include "opcode/nds32.h"
31 #include "elf32-nds32.h"
32 #include "opcode/cgen.h"
33 #include "../opcodes/nds32-opc.h"
35 /* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
36 #define OCTETS_PER_BYTE(ABFD, SEC) 1
38 /* Relocation HOWTO functions. */
39 static bfd_reloc_status_type nds32_elf_ignore_reloc
40 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
41 static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
42 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
43 static bfd_reloc_status_type nds32_elf_hi20_reloc
44 (bfd
*, arelent
*, asymbol
*, void *,
45 asection
*, bfd
*, char **);
46 static bfd_reloc_status_type nds32_elf_lo12_reloc
47 (bfd
*, arelent
*, asymbol
*, void *,
48 asection
*, bfd
*, char **);
49 static bfd_reloc_status_type nds32_elf_generic_reloc
50 (bfd
*, arelent
*, asymbol
*, void *,
51 asection
*, bfd
*, char **);
52 static bfd_reloc_status_type nds32_elf_sda15_reloc
53 (bfd
*, arelent
*, asymbol
*, void *,
54 asection
*, bfd
*, char **);
56 /* Helper functions for HOWTO. */
57 static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
58 (bfd
*, reloc_howto_type
*, asection
*, bfd_byte
*, bfd_vma
,
59 asection
*, bfd_vma
, bfd_vma
);
61 /* Nds32 helper functions. */
62 static bfd_vma calculate_memory_address
63 (bfd
*, Elf_Internal_Rela
*, Elf_Internal_Sym
*, Elf_Internal_Shdr
*);
64 static int nds32_get_section_contents (bfd
*, asection
*,
65 bfd_byte
**, bfd_boolean
);
66 static int nds32_get_local_syms (bfd
*, asection
*ATTRIBUTE_UNUSED
,
68 static bfd_boolean nds32_relax_fp_as_gp
69 (struct bfd_link_info
*link_info
, bfd
*abfd
, asection
*sec
,
70 Elf_Internal_Rela
*internal_relocs
, Elf_Internal_Rela
*irelend
,
71 Elf_Internal_Sym
*isymbuf
);
72 static bfd_boolean nds32_fag_remove_unused_fpbase
73 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*internal_relocs
,
74 Elf_Internal_Rela
*irelend
);
78 MACH_V1
= bfd_mach_n1h
,
79 MACH_V2
= bfd_mach_n1h_v2
,
80 MACH_V3
= bfd_mach_n1h_v3
,
81 MACH_V3M
= bfd_mach_n1h_v3m
84 #define MIN(a, b) ((a) > (b) ? (b) : (a))
85 #define MAX(a, b) ((a) > (b) ? (a) : (b))
87 /* The name of the dynamic interpreter. This is put in the .interp
89 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
91 #define NDS32_GUARD_SEC_P(flags) ((flags) & SEC_ALLOC \
92 && (flags) & SEC_LOAD \
93 && (flags) & SEC_READONLY)
95 /* The nop opcode we use. */
96 #define NDS32_NOP32 0x40000009
97 #define NDS32_NOP16 0x9200
99 /* The size in bytes of an entry in the procedure linkage table. */
100 #define PLT_ENTRY_SIZE 24
101 #define PLT_HEADER_SIZE 24
103 /* The first entry in a procedure linkage table are reserved,
104 and the initial contents are unimportant (we zero them out).
105 Subsequent entries look like this. */
106 #define PLT0_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(.got+4) */
107 #define PLT0_ENTRY_WORD1 0x58f78000 /* ori r15, r25, LO12(.got+4) */
108 #define PLT0_ENTRY_WORD2 0x05178000 /* lwi r17, [r15+0] */
109 #define PLT0_ENTRY_WORD3 0x04f78001 /* lwi r15, [r15+4] */
110 #define PLT0_ENTRY_WORD4 0x4a003c00 /* jr r15 */
112 /* $ta is change to $r15 (from $r25). */
113 #define PLT0_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[1]@GOT) */
114 #define PLT0_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[1]@GOT) */
115 #define PLT0_PIC_ENTRY_WORD2 0x40f7f400 /* add r15, gp, r15 */
116 #define PLT0_PIC_ENTRY_WORD3 0x05178000 /* lwi r17, [r15+0] */
117 #define PLT0_PIC_ENTRY_WORD4 0x04f78001 /* lwi r15, [r15+4] */
118 #define PLT0_PIC_ENTRY_WORD5 0x4a003c00 /* jr r15 */
120 #define PLT_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(&got[n+3]) */
121 #define PLT_ENTRY_WORD1 0x04f78000 /* lwi r15, r15, LO12(&got[n+3]) */
122 #define PLT_ENTRY_WORD2 0x4a003c00 /* jr r15 */
123 #define PLT_ENTRY_WORD3 0x45000000 /* movi r16, sizeof(RELA) * n */
124 #define PLT_ENTRY_WORD4 0x48000000 /* j .plt0. */
126 #define PLT_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[n+3]@GOT) */
127 #define PLT_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[n+3]@GOT) */
128 #define PLT_PIC_ENTRY_WORD2 0x38febc02 /* lw r15, [gp+r15] */
129 #define PLT_PIC_ENTRY_WORD3 0x4a003c00 /* jr r15 */
130 #define PLT_PIC_ENTRY_WORD4 0x45000000 /* movi r16, sizeof(RELA) * n */
131 #define PLT_PIC_ENTRY_WORD5 0x48000000 /* j .plt0 */
133 /* These are macros used to get the relocation accurate value. */
134 #define ACCURATE_8BIT_S1 (0x100)
135 #define ACCURATE_U9BIT_S1 (0x400)
136 #define ACCURATE_12BIT_S1 (0x2000)
137 #define ACCURATE_14BIT_S1 (0x4000)
138 #define ACCURATE_19BIT (0x40000)
140 /* These are macros used to get the relocation conservative value. */
141 #define CONSERVATIVE_8BIT_S1 (0x100 - 4)
142 #define CONSERVATIVE_14BIT_S1 (0x4000 - 4)
143 #define CONSERVATIVE_16BIT_S1 (0x10000 - 4)
144 #define CONSERVATIVE_24BIT_S1 (0x1000000 - 4)
145 /* These must be more conservative because the address may be in
146 different segment. */
147 #define CONSERVATIVE_15BIT (0x4000 - 0x1000)
148 #define CONSERVATIVE_15BIT_S1 (0x8000 - 0x1000)
149 #define CONSERVATIVE_15BIT_S2 (0x10000 - 0x1000)
150 #define CONSERVATIVE_19BIT (0x40000 - 0x1000)
151 #define CONSERVATIVE_20BIT (0x80000 - 0x1000)
153 /* Size of small data/bss sections, used to calculate SDA_BASE. */
154 static long got_size
= 0;
155 static int is_SDA_BASE_set
= 0;
157 /* Convert ELF-VER in eflags to string for debugging purpose. */
158 static const char *const nds32_elfver_strtab
[] =
165 /* The nds32 linker needs to keep track of the number of relocs that it
166 decides to copy in check_relocs for each symbol. This is so that
167 it can discard PC relative relocs if it doesn't need them when
168 linking with -Bsymbolic. We store the information in a field
169 extending the regular ELF linker hash table. */
171 /* This structure keeps track of the number of PC relative relocs we
172 have copied for a given symbol. */
174 struct elf_nds32_pcrel_relocs_copied
177 struct elf_nds32_pcrel_relocs_copied
*next
;
178 /* A section in dynobj. */
180 /* Number of relocs copied in this section. */
184 enum elf_nds32_tls_type
187 GOT_NORMAL
= (1 << 0),
188 GOT_TLS_LE
= (1 << 1),
189 GOT_TLS_IE
= (1 << 2),
190 GOT_TLS_IEGP
= (1 << 3),
191 GOT_TLS_LD
= (1 << 4),
192 GOT_TLS_GD
= (1 << 5),
193 GOT_TLS_DESC
= (1 << 6),
196 /* Nds32 ELF linker hash entry. */
198 struct elf_nds32_link_hash_entry
200 struct elf_link_hash_entry root
;
202 /* For checking relocation type. */
203 enum elf_nds32_tls_type tls_type
;
208 /* Get the nds32 ELF linker hash table from a link_info structure. */
210 #define FP_BASE_NAME "_FP_BASE_"
211 static int check_start_export_sym
= 0;
213 /* The offset for executable tls relaxation. */
214 #define TP_OFFSET 0x0
223 } elf32_nds32_relax_group_t
;
225 struct elf_nds32_obj_tdata
227 struct elf_obj_tdata root
;
229 /* tls_type for each local got entry. */
230 char *local_got_tls_type
;
232 /* GOTPLT entries for TLS descriptors. */
233 bfd_vma
*local_tlsdesc_gotent
;
235 /* for R_NDS32_RELAX_GROUP handling. */
236 elf32_nds32_relax_group_t relax_group
;
238 unsigned int hdr_size
;
242 #define elf_nds32_tdata(bfd) \
243 ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
245 #define elf32_nds32_local_got_tls_type(bfd) \
246 (elf_nds32_tdata (bfd)->local_got_tls_type)
248 #define elf32_nds32_local_gp_offset(bfd) \
249 (elf_nds32_tdata (bfd)->offset_to_gp)
251 #define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
253 #define elf32_nds32_relax_group_ptr(bfd) \
254 &(elf_nds32_tdata (bfd)->relax_group)
257 nds32_elf_mkobject (bfd
*abfd
)
259 return bfd_elf_allocate_object (abfd
, sizeof (struct elf_nds32_obj_tdata
),
263 /* Relocations used for relocation. */
264 /* Define HOWTO2 (for relocation) and HOWTO3 (for relaxation) to
265 initialize array nds32_elf_howto_table in any order. The benefit
266 is that we can add any new relocations with any numbers and don't
267 need to fill the gap by lots of EMPTY_HOWTO. */
268 #define HOWTO2(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
269 [C] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC)
271 static reloc_howto_type nds32_elf_howto_table
[] =
273 /* This reloc does nothing. */
274 HOWTO2 (R_NDS32_NONE
, /* type */
276 2, /* size (0 = byte, 1 = short, 2 = long) */
278 FALSE
, /* pc_relative */
280 complain_overflow_bitfield
,/* complain_on_overflow */
281 bfd_elf_generic_reloc
, /* special_function */
282 "R_NDS32_NONE", /* name */
283 FALSE
, /* partial_inplace */
286 FALSE
), /* pcrel_offset */
288 /* A 16 bit absolute relocation. */
289 HOWTO2 (R_NDS32_16
, /* type */
291 1, /* size (0 = byte, 1 = short, 2 = long) */
293 FALSE
, /* pc_relative */
295 complain_overflow_bitfield
,/* complain_on_overflow */
296 nds32_elf_generic_reloc
,/* special_function */
297 "R_NDS32_16", /* name */
298 FALSE
, /* partial_inplace */
299 0xffff, /* src_mask */
300 0xffff, /* dst_mask */
301 FALSE
), /* pcrel_offset */
303 /* A 32 bit absolute relocation. */
304 HOWTO2 (R_NDS32_32
, /* type */
306 2, /* size (0 = byte, 1 = short, 2 = long) */
308 FALSE
, /* pc_relative */
310 complain_overflow_bitfield
,/* complain_on_overflow */
311 nds32_elf_generic_reloc
,/* special_function */
312 "R_NDS32_32", /* name */
313 FALSE
, /* partial_inplace */
314 0xffffffff, /* src_mask */
315 0xffffffff, /* dst_mask */
316 FALSE
), /* pcrel_offset */
318 /* A 20 bit address. */
319 HOWTO2 (R_NDS32_20
, /* type */
321 2, /* size (0 = byte, 1 = short, 2 = long) */
323 FALSE
, /* pc_relative */
325 complain_overflow_unsigned
,/* complain_on_overflow */
326 nds32_elf_generic_reloc
,/* special_function */
327 "R_NDS32_20", /* name */
328 FALSE
, /* partial_inplace */
329 0xfffff, /* src_mask */
330 0xfffff, /* dst_mask */
331 FALSE
), /* pcrel_offset */
333 /* An PC Relative 9-bit relocation, shifted by 2.
334 This reloc is complicated because relocations are relative to pc & -4.
335 i.e. branches in the right insn slot use the address of the left insn
337 /* It's not clear whether this should have partial_inplace set or not.
338 Branch relaxing in the assembler can store the addend in the insn,
339 and if bfd_install_relocation gets called the addend may get added
341 HOWTO2 (R_NDS32_9_PCREL
, /* type */
343 1, /* size (0 = byte, 1 = short, 2 = long) */
345 TRUE
, /* pc_relative */
347 complain_overflow_signed
,/* complain_on_overflow */
348 nds32_elf_9_pcrel_reloc
,/* special_function */
349 "R_NDS32_9_PCREL", /* name */
350 FALSE
, /* partial_inplace */
353 TRUE
), /* pcrel_offset */
355 /* A relative 15 bit relocation, right shifted by 1. */
356 HOWTO2 (R_NDS32_15_PCREL
, /* type */
358 2, /* size (0 = byte, 1 = short, 2 = long) */
360 TRUE
, /* pc_relative */
362 complain_overflow_signed
,/* complain_on_overflow */
363 bfd_elf_generic_reloc
, /* special_function */
364 "R_NDS32_15_PCREL", /* name */
365 FALSE
, /* partial_inplace */
366 0x3fff, /* src_mask */
367 0x3fff, /* dst_mask */
368 TRUE
), /* pcrel_offset */
370 /* A relative 17 bit relocation, right shifted by 1. */
371 HOWTO2 (R_NDS32_17_PCREL
, /* type */
373 2, /* size (0 = byte, 1 = short, 2 = long) */
375 TRUE
, /* pc_relative */
377 complain_overflow_signed
,/* complain_on_overflow */
378 bfd_elf_generic_reloc
, /* special_function */
379 "R_NDS32_17_PCREL", /* name */
380 FALSE
, /* partial_inplace */
381 0xffff, /* src_mask */
382 0xffff, /* dst_mask */
383 TRUE
), /* pcrel_offset */
385 /* A relative 25 bit relocation, right shifted by 1. */
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 HOWTO2 (R_NDS32_25_PCREL
, /* type */
392 2, /* size (0 = byte, 1 = short, 2 = long) */
394 TRUE
, /* pc_relative */
396 complain_overflow_signed
,/* complain_on_overflow */
397 bfd_elf_generic_reloc
, /* special_function */
398 "R_NDS32_25_PCREL", /* name */
399 FALSE
, /* partial_inplace */
400 0xffffff, /* src_mask */
401 0xffffff, /* dst_mask */
402 TRUE
), /* pcrel_offset */
404 /* High 20 bits of address when lower 12 is or'd in. */
405 HOWTO2 (R_NDS32_HI20
, /* type */
407 2, /* size (0 = byte, 1 = short, 2 = long) */
409 FALSE
, /* pc_relative */
411 complain_overflow_dont
,/* complain_on_overflow */
412 nds32_elf_hi20_reloc
, /* special_function */
413 "R_NDS32_HI20", /* name */
414 FALSE
, /* partial_inplace */
415 0x000fffff, /* src_mask */
416 0x000fffff, /* dst_mask */
417 FALSE
), /* pcrel_offset */
419 /* Lower 12 bits of address. */
420 HOWTO2 (R_NDS32_LO12S3
, /* type */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
424 FALSE
, /* pc_relative */
426 complain_overflow_dont
,/* complain_on_overflow */
427 nds32_elf_lo12_reloc
, /* special_function */
428 "R_NDS32_LO12S3", /* name */
429 FALSE
, /* partial_inplace */
430 0x000001ff, /* src_mask */
431 0x000001ff, /* dst_mask */
432 FALSE
), /* pcrel_offset */
434 /* Lower 12 bits of address. */
435 HOWTO2 (R_NDS32_LO12S2
, /* type */
437 2, /* size (0 = byte, 1 = short, 2 = long) */
439 FALSE
, /* pc_relative */
441 complain_overflow_dont
,/* complain_on_overflow */
442 nds32_elf_lo12_reloc
, /* special_function */
443 "R_NDS32_LO12S2", /* name */
444 FALSE
, /* partial_inplace */
445 0x000003ff, /* src_mask */
446 0x000003ff, /* dst_mask */
447 FALSE
), /* pcrel_offset */
449 /* Lower 12 bits of address. */
450 HOWTO2 (R_NDS32_LO12S1
, /* type */
452 2, /* size (0 = byte, 1 = short, 2 = long) */
454 FALSE
, /* pc_relative */
456 complain_overflow_dont
,/* complain_on_overflow */
457 nds32_elf_lo12_reloc
, /* special_function */
458 "R_NDS32_LO12S1", /* name */
459 FALSE
, /* partial_inplace */
460 0x000007ff, /* src_mask */
461 0x000007ff, /* dst_mask */
462 FALSE
), /* pcrel_offset */
464 /* Lower 12 bits of address. */
465 HOWTO2 (R_NDS32_LO12S0
, /* type */
467 2, /* size (0 = byte, 1 = short, 2 = long) */
469 FALSE
, /* pc_relative */
471 complain_overflow_dont
,/* complain_on_overflow */
472 nds32_elf_lo12_reloc
, /* special_function */
473 "R_NDS32_LO12S0", /* name */
474 FALSE
, /* partial_inplace */
475 0x00000fff, /* src_mask */
476 0x00000fff, /* dst_mask */
477 FALSE
), /* pcrel_offset */
479 /* Small data area 15 bits offset. */
480 HOWTO2 (R_NDS32_SDA15S3
, /* type */
482 2, /* size (0 = byte, 1 = short, 2 = long) */
484 FALSE
, /* pc_relative */
486 complain_overflow_signed
,/* complain_on_overflow */
487 nds32_elf_sda15_reloc
, /* special_function */
488 "R_NDS32_SDA15S3", /* name */
489 FALSE
, /* partial_inplace */
490 0x00007fff, /* src_mask */
491 0x00007fff, /* dst_mask */
492 FALSE
), /* pcrel_offset */
494 /* Small data area 15 bits offset. */
495 HOWTO2 (R_NDS32_SDA15S2
, /* type */
497 2, /* size (0 = byte, 1 = short, 2 = long) */
499 FALSE
, /* pc_relative */
501 complain_overflow_signed
,/* complain_on_overflow */
502 nds32_elf_sda15_reloc
, /* special_function */
503 "R_NDS32_SDA15S2", /* name */
504 FALSE
, /* partial_inplace */
505 0x00007fff, /* src_mask */
506 0x00007fff, /* dst_mask */
507 FALSE
), /* pcrel_offset */
509 /* Small data area 15 bits offset. */
510 HOWTO2 (R_NDS32_SDA15S1
, /* type */
512 2, /* size (0 = byte, 1 = short, 2 = long) */
514 FALSE
, /* pc_relative */
516 complain_overflow_signed
,/* complain_on_overflow */
517 nds32_elf_sda15_reloc
, /* special_function */
518 "R_NDS32_SDA15S1", /* name */
519 FALSE
, /* partial_inplace */
520 0x00007fff, /* src_mask */
521 0x00007fff, /* dst_mask */
522 FALSE
), /* pcrel_offset */
524 /* Small data area 15 bits offset. */
525 HOWTO2 (R_NDS32_SDA15S0
, /* type */
527 2, /* size (0 = byte, 1 = short, 2 = long) */
529 FALSE
, /* pc_relative */
531 complain_overflow_signed
,/* complain_on_overflow */
532 nds32_elf_sda15_reloc
, /* special_function */
533 "R_NDS32_SDA15S0", /* name */
534 FALSE
, /* partial_inplace */
535 0x00007fff, /* src_mask */
536 0x00007fff, /* dst_mask */
537 FALSE
), /* pcrel_offset */
539 /* GNU extension to record C++ vtable hierarchy */
540 HOWTO2 (R_NDS32_GNU_VTINHERIT
,/* type */
542 2, /* size (0 = byte, 1 = short, 2 = long) */
544 FALSE
, /* pc_relative */
546 complain_overflow_dont
,/* complain_on_overflow */
547 NULL
, /* special_function */
548 "R_NDS32_GNU_VTINHERIT",/* name */
549 FALSE
, /* partial_inplace */
552 FALSE
), /* pcrel_offset */
554 /* GNU extension to record C++ vtable member usage */
555 HOWTO2 (R_NDS32_GNU_VTENTRY
, /* type */
557 2, /* size (0 = byte, 1 = short, 2 = long) */
559 FALSE
, /* pc_relative */
561 complain_overflow_dont
,/* complain_on_overflow */
562 _bfd_elf_rel_vtable_reloc_fn
,/* special_function */
563 "R_NDS32_GNU_VTENTRY", /* name */
564 FALSE
, /* partial_inplace */
567 FALSE
), /* pcrel_offset */
569 /* A 16 bit absolute relocation. */
570 HOWTO2 (R_NDS32_16_RELA
, /* type */
572 1, /* size (0 = byte, 1 = short, 2 = long) */
574 FALSE
, /* pc_relative */
576 complain_overflow_bitfield
,/* complain_on_overflow */
577 bfd_elf_generic_reloc
, /* special_function */
578 "R_NDS32_16_RELA", /* name */
579 FALSE
, /* partial_inplace */
580 0xffff, /* src_mask */
581 0xffff, /* dst_mask */
582 FALSE
), /* pcrel_offset */
584 /* A 32 bit absolute relocation. */
585 HOWTO2 (R_NDS32_32_RELA
, /* type */
587 2, /* size (0 = byte, 1 = short, 2 = long) */
589 FALSE
, /* pc_relative */
591 complain_overflow_bitfield
,/* complain_on_overflow */
592 bfd_elf_generic_reloc
, /* special_function */
593 "R_NDS32_32_RELA", /* name */
594 FALSE
, /* partial_inplace */
595 0xffffffff, /* src_mask */
596 0xffffffff, /* dst_mask */
597 FALSE
), /* pcrel_offset */
599 /* A 20 bit address. */
600 HOWTO2 (R_NDS32_20_RELA
, /* type */
602 2, /* size (0 = byte, 1 = short, 2 = long) */
604 FALSE
, /* pc_relative */
606 complain_overflow_signed
,/* complain_on_overflow */
607 bfd_elf_generic_reloc
, /* special_function */
608 "R_NDS32_20_RELA", /* name */
609 FALSE
, /* partial_inplace */
610 0xfffff, /* src_mask */
611 0xfffff, /* dst_mask */
612 FALSE
), /* pcrel_offset */
614 HOWTO2 (R_NDS32_9_PCREL_RELA
, /* type */
616 1, /* size (0 = byte, 1 = short, 2 = long) */
618 TRUE
, /* pc_relative */
620 complain_overflow_signed
,/* complain_on_overflow */
621 bfd_elf_generic_reloc
, /* special_function */
622 "R_NDS32_9_PCREL_RELA",/* name */
623 FALSE
, /* partial_inplace */
626 TRUE
), /* pcrel_offset */
628 /* A relative 15 bit relocation, right shifted by 1. */
629 HOWTO2 (R_NDS32_15_PCREL_RELA
,/* type */
631 2, /* size (0 = byte, 1 = short, 2 = long) */
633 TRUE
, /* pc_relative */
635 complain_overflow_signed
,/* complain_on_overflow */
636 bfd_elf_generic_reloc
, /* special_function */
637 "R_NDS32_15_PCREL_RELA",/* name */
638 FALSE
, /* partial_inplace */
639 0x3fff, /* src_mask */
640 0x3fff, /* dst_mask */
641 TRUE
), /* pcrel_offset */
643 /* A relative 17 bit relocation, right shifted by 1. */
644 HOWTO2 (R_NDS32_17_PCREL_RELA
,/* type */
646 2, /* size (0 = byte, 1 = short, 2 = long) */
648 TRUE
, /* pc_relative */
650 complain_overflow_signed
,/* complain_on_overflow */
651 bfd_elf_generic_reloc
, /* special_function */
652 "R_NDS32_17_PCREL_RELA",/* name */
653 FALSE
, /* partial_inplace */
654 0xffff, /* src_mask */
655 0xffff, /* dst_mask */
656 TRUE
), /* pcrel_offset */
658 /* A relative 25 bit relocation, right shifted by 2. */
659 HOWTO2 (R_NDS32_25_PCREL_RELA
,/* type */
661 2, /* size (0 = byte, 1 = short, 2 = long) */
663 TRUE
, /* pc_relative */
665 complain_overflow_signed
,/* complain_on_overflow */
666 bfd_elf_generic_reloc
, /* special_function */
667 "R_NDS32_25_PCREL_RELA",/* name */
668 FALSE
, /* partial_inplace */
669 0xffffff, /* src_mask */
670 0xffffff, /* dst_mask */
671 TRUE
), /* pcrel_offset */
673 /* High 20 bits of address when lower 16 is or'd in. */
674 HOWTO2 (R_NDS32_HI20_RELA
, /* type */
676 2, /* size (0 = byte, 1 = short, 2 = long) */
678 FALSE
, /* pc_relative */
680 complain_overflow_dont
,/* complain_on_overflow */
681 bfd_elf_generic_reloc
, /* special_function */
682 "R_NDS32_HI20_RELA", /* name */
683 FALSE
, /* partial_inplace */
684 0x000fffff, /* src_mask */
685 0x000fffff, /* dst_mask */
686 FALSE
), /* pcrel_offset */
688 /* Lower 12 bits of address. */
689 HOWTO2 (R_NDS32_LO12S3_RELA
, /* type */
691 2, /* size (0 = byte, 1 = short, 2 = long) */
693 FALSE
, /* pc_relative */
695 complain_overflow_dont
,/* complain_on_overflow */
696 bfd_elf_generic_reloc
, /* special_function */
697 "R_NDS32_LO12S3_RELA", /* name */
698 FALSE
, /* partial_inplace */
699 0x000001ff, /* src_mask */
700 0x000001ff, /* dst_mask */
701 FALSE
), /* pcrel_offset */
703 /* Lower 12 bits of address. */
704 HOWTO2 (R_NDS32_LO12S2_RELA
, /* type */
706 2, /* size (0 = byte, 1 = short, 2 = long) */
708 FALSE
, /* pc_relative */
710 complain_overflow_dont
,/* complain_on_overflow */
711 bfd_elf_generic_reloc
, /* special_function */
712 "R_NDS32_LO12S2_RELA", /* name */
713 FALSE
, /* partial_inplace */
714 0x000003ff, /* src_mask */
715 0x000003ff, /* dst_mask */
716 FALSE
), /* pcrel_offset */
718 /* Lower 12 bits of address. */
719 HOWTO2 (R_NDS32_LO12S1_RELA
, /* type */
721 2, /* size (0 = byte, 1 = short, 2 = long) */
723 FALSE
, /* pc_relative */
725 complain_overflow_dont
,/* complain_on_overflow */
726 bfd_elf_generic_reloc
, /* special_function */
727 "R_NDS32_LO12S1_RELA", /* name */
728 FALSE
, /* partial_inplace */
729 0x000007ff, /* src_mask */
730 0x000007ff, /* dst_mask */
731 FALSE
), /* pcrel_offset */
733 /* Lower 12 bits of address. */
734 HOWTO2 (R_NDS32_LO12S0_RELA
, /* type */
736 2, /* size (0 = byte, 1 = short, 2 = long) */
738 FALSE
, /* pc_relative */
740 complain_overflow_dont
,/* complain_on_overflow */
741 bfd_elf_generic_reloc
, /* special_function */
742 "R_NDS32_LO12S0_RELA", /* name */
743 FALSE
, /* partial_inplace */
744 0x00000fff, /* src_mask */
745 0x00000fff, /* dst_mask */
746 FALSE
), /* pcrel_offset */
748 /* Small data area 15 bits offset. */
749 HOWTO2 (R_NDS32_SDA15S3_RELA
, /* type */
751 2, /* size (0 = byte, 1 = short, 2 = long) */
753 FALSE
, /* pc_relative */
755 complain_overflow_signed
,/* complain_on_overflow */
756 bfd_elf_generic_reloc
, /* special_function */
757 "R_NDS32_SDA15S3_RELA",/* name */
758 FALSE
, /* partial_inplace */
759 0x00007fff, /* src_mask */
760 0x00007fff, /* dst_mask */
761 FALSE
), /* pcrel_offset */
763 /* Small data area 15 bits offset. */
764 HOWTO2 (R_NDS32_SDA15S2_RELA
, /* type */
766 2, /* size (0 = byte, 1 = short, 2 = long) */
768 FALSE
, /* pc_relative */
770 complain_overflow_signed
,/* complain_on_overflow */
771 bfd_elf_generic_reloc
, /* special_function */
772 "R_NDS32_SDA15S2_RELA",/* name */
773 FALSE
, /* partial_inplace */
774 0x00007fff, /* src_mask */
775 0x00007fff, /* dst_mask */
776 FALSE
), /* pcrel_offset */
778 HOWTO2 (R_NDS32_SDA15S1_RELA
, /* type */
780 2, /* size (0 = byte, 1 = short, 2 = long) */
782 FALSE
, /* pc_relative */
784 complain_overflow_signed
,/* complain_on_overflow */
785 bfd_elf_generic_reloc
, /* special_function */
786 "R_NDS32_SDA15S1_RELA",/* name */
787 FALSE
, /* partial_inplace */
788 0x00007fff, /* src_mask */
789 0x00007fff, /* dst_mask */
790 FALSE
), /* pcrel_offset */
792 HOWTO2 (R_NDS32_SDA15S0_RELA
, /* type */
794 2, /* size (0 = byte, 1 = short, 2 = long) */
796 FALSE
, /* pc_relative */
798 complain_overflow_signed
,/* complain_on_overflow */
799 bfd_elf_generic_reloc
, /* special_function */
800 "R_NDS32_SDA15S0_RELA",/* name */
801 FALSE
, /* partial_inplace */
802 0x00007fff, /* src_mask */
803 0x00007fff, /* dst_mask */
804 FALSE
), /* pcrel_offset */
806 /* GNU extension to record C++ vtable hierarchy */
807 HOWTO2 (R_NDS32_RELA_GNU_VTINHERIT
,/* type */
809 2, /* size (0 = byte, 1 = short, 2 = long) */
811 FALSE
, /* pc_relative */
813 complain_overflow_dont
,/* complain_on_overflow */
814 NULL
, /* special_function */
815 "R_NDS32_RELA_GNU_VTINHERIT",/* name */
816 FALSE
, /* partial_inplace */
819 FALSE
), /* pcrel_offset */
821 /* GNU extension to record C++ vtable member usage */
822 HOWTO2 (R_NDS32_RELA_GNU_VTENTRY
,/* type */
824 2, /* size (0 = byte, 1 = short, 2 = long) */
826 FALSE
, /* pc_relative */
828 complain_overflow_dont
,/* complain_on_overflow */
829 _bfd_elf_rel_vtable_reloc_fn
,/* special_function */
830 "R_NDS32_RELA_GNU_VTENTRY",/* name */
831 FALSE
, /* partial_inplace */
834 FALSE
), /* pcrel_offset */
836 /* Like R_NDS32_20, but referring to the GOT table entry for
838 HOWTO2 (R_NDS32_GOT20
, /* type */
840 2, /* size (0 = byte, 1 = short, 2 = long) */
842 FALSE
, /* pc_relative */
844 complain_overflow_signed
,/* complain_on_overflow */
845 bfd_elf_generic_reloc
, /* special_function */
846 "R_NDS32_GOT20", /* name */
847 FALSE
, /* partial_inplace */
848 0xfffff, /* src_mask */
849 0xfffff, /* dst_mask */
850 FALSE
), /* pcrel_offset */
852 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
853 entry for the symbol. */
854 HOWTO2 (R_NDS32_25_PLTREL
, /* type */
856 2, /* size (0 = byte, 1 = short, 2 = long) */
858 TRUE
, /* pc_relative */
860 complain_overflow_signed
,/* complain_on_overflow */
861 bfd_elf_generic_reloc
, /* special_function */
862 "R_NDS32_25_PLTREL", /* name */
863 FALSE
, /* partial_inplace */
864 0xffffff, /* src_mask */
865 0xffffff, /* dst_mask */
866 TRUE
), /* pcrel_offset */
868 /* This is used only by the dynamic linker. The symbol should exist
869 both in the object being run and in some shared library. The
870 dynamic linker copies the data addressed by the symbol from the
871 shared library into the object, because the object being
872 run has to have the data at some particular address. */
873 HOWTO2 (R_NDS32_COPY
, /* type */
875 2, /* size (0 = byte, 1 = short, 2 = long) */
877 FALSE
, /* pc_relative */
879 complain_overflow_bitfield
,/* complain_on_overflow */
880 bfd_elf_generic_reloc
, /* special_function */
881 "R_NDS32_COPY", /* name */
882 FALSE
, /* partial_inplace */
883 0xffffffff, /* src_mask */
884 0xffffffff, /* dst_mask */
885 FALSE
), /* pcrel_offset */
887 /* Like R_NDS32_20, but used when setting global offset table
889 HOWTO2 (R_NDS32_GLOB_DAT
, /* type */
891 2, /* size (0 = byte, 1 = short, 2 = long) */
893 FALSE
, /* pc_relative */
895 complain_overflow_bitfield
,/* complain_on_overflow */
896 bfd_elf_generic_reloc
, /* special_function */
897 "R_NDS32_GLOB_DAT", /* name */
898 FALSE
, /* partial_inplace */
899 0xffffffff, /* src_mask */
900 0xffffffff, /* dst_mask */
901 FALSE
), /* pcrel_offset */
903 /* Marks a procedure linkage table entry for a symbol. */
904 HOWTO2 (R_NDS32_JMP_SLOT
, /* type */
906 2, /* size (0 = byte, 1 = short, 2 = long) */
908 FALSE
, /* pc_relative */
910 complain_overflow_bitfield
,/* complain_on_overflow */
911 bfd_elf_generic_reloc
, /* special_function */
912 "R_NDS32_JMP_SLOT", /* name */
913 FALSE
, /* partial_inplace */
914 0xffffffff, /* src_mask */
915 0xffffffff, /* dst_mask */
916 FALSE
), /* pcrel_offset */
918 /* Used only by the dynamic linker. When the object is run, this
919 longword is set to the load address of the object, plus the
921 HOWTO2 (R_NDS32_RELATIVE
, /* type */
923 2, /* size (0 = byte, 1 = short, 2 = long) */
925 FALSE
, /* pc_relative */
927 complain_overflow_bitfield
,/* complain_on_overflow */
928 bfd_elf_generic_reloc
, /* special_function */
929 "R_NDS32_RELATIVE", /* name */
930 FALSE
, /* partial_inplace */
931 0xffffffff, /* src_mask */
932 0xffffffff, /* dst_mask */
933 FALSE
), /* pcrel_offset */
935 HOWTO2 (R_NDS32_GOTOFF
, /* type */
937 2, /* size (0 = byte, 1 = short, 2 = long) */
939 FALSE
, /* pc_relative */
941 complain_overflow_signed
,/* complain_on_overflow */
942 bfd_elf_generic_reloc
, /* special_function */
943 "R_NDS32_GOTOFF", /* name */
944 FALSE
, /* partial_inplace */
945 0xfffff, /* src_mask */
946 0xfffff, /* dst_mask */
947 FALSE
), /* pcrel_offset */
949 /* An PC Relative 20-bit relocation used when setting PIC offset
951 HOWTO2 (R_NDS32_GOTPC20
, /* type */
953 2, /* size (0 = byte, 1 = short, 2 = long) */
955 TRUE
, /* pc_relative */
957 complain_overflow_signed
,/* complain_on_overflow */
958 bfd_elf_generic_reloc
, /* special_function */
959 "R_NDS32_GOTPC20", /* name */
960 FALSE
, /* partial_inplace */
961 0xfffff, /* src_mask */
962 0xfffff, /* dst_mask */
963 TRUE
), /* pcrel_offset */
965 /* Like R_NDS32_HI20, but referring to the GOT table entry for
967 HOWTO2 (R_NDS32_GOT_HI20
, /* type */
969 2, /* size (0 = byte, 1 = short, 2 = long) */
971 FALSE
, /* pc_relative */
973 complain_overflow_dont
,/* complain_on_overflow */
974 bfd_elf_generic_reloc
, /* special_function */
975 "R_NDS32_GOT_HI20", /* name */
976 FALSE
, /* partial_inplace */
977 0x000fffff, /* src_mask */
978 0x000fffff, /* dst_mask */
979 FALSE
), /* pcrel_offset */
980 HOWTO2 (R_NDS32_GOT_LO12
, /* type */
982 2, /* size (0 = byte, 1 = short, 2 = long) */
984 FALSE
, /* pc_relative */
986 complain_overflow_dont
,/* complain_on_overflow */
987 bfd_elf_generic_reloc
, /* special_function */
988 "R_NDS32_GOT_LO12", /* name */
989 FALSE
, /* partial_inplace */
990 0x00000fff, /* src_mask */
991 0x00000fff, /* dst_mask */
992 FALSE
), /* pcrel_offset */
994 /* An PC Relative relocation used when setting PIC offset table register.
995 Like R_NDS32_HI20, but referring to the GOT table entry for
997 HOWTO2 (R_NDS32_GOTPC_HI20
, /* type */
999 2, /* size (0 = byte, 1 = short, 2 = long) */
1001 FALSE
, /* pc_relative */
1003 complain_overflow_dont
,/* complain_on_overflow */
1004 bfd_elf_generic_reloc
, /* special_function */
1005 "R_NDS32_GOTPC_HI20", /* name */
1006 FALSE
, /* partial_inplace */
1007 0x000fffff, /* src_mask */
1008 0x000fffff, /* dst_mask */
1009 TRUE
), /* pcrel_offset */
1010 HOWTO2 (R_NDS32_GOTPC_LO12
, /* type */
1012 2, /* size (0 = byte, 1 = short, 2 = long) */
1014 FALSE
, /* pc_relative */
1016 complain_overflow_dont
,/* complain_on_overflow */
1017 bfd_elf_generic_reloc
, /* special_function */
1018 "R_NDS32_GOTPC_LO12", /* name */
1019 FALSE
, /* partial_inplace */
1020 0x00000fff, /* src_mask */
1021 0x00000fff, /* dst_mask */
1022 TRUE
), /* pcrel_offset */
1024 HOWTO2 (R_NDS32_GOTOFF_HI20
, /* type */
1025 12, /* rightshift */
1026 2, /* size (0 = byte, 1 = short, 2 = long) */
1028 FALSE
, /* pc_relative */
1030 complain_overflow_dont
,/* complain_on_overflow */
1031 bfd_elf_generic_reloc
, /* special_function */
1032 "R_NDS32_GOTOFF_HI20", /* name */
1033 FALSE
, /* partial_inplace */
1034 0x000fffff, /* src_mask */
1035 0x000fffff, /* dst_mask */
1036 FALSE
), /* pcrel_offset */
1037 HOWTO2 (R_NDS32_GOTOFF_LO12
, /* type */
1039 2, /* size (0 = byte, 1 = short, 2 = long) */
1041 FALSE
, /* pc_relative */
1043 complain_overflow_dont
,/* complain_on_overflow */
1044 bfd_elf_generic_reloc
, /* special_function */
1045 "R_NDS32_GOTOFF_LO12", /* name */
1046 FALSE
, /* partial_inplace */
1047 0x00000fff, /* src_mask */
1048 0x00000fff, /* dst_mask */
1049 FALSE
), /* pcrel_offset */
1051 /* Alignment hint for relaxable instruction. This is used with
1052 R_NDS32_LABEL as a pair. Relax this instruction from 4 bytes to 2
1053 in order to make next label aligned on word boundary. */
1054 HOWTO2 (R_NDS32_INSN16
, /* type */
1056 2, /* size (0 = byte, 1 = short, 2 = long) */
1058 FALSE
, /* pc_relative */
1060 complain_overflow_dont
,/* complain_on_overflow */
1061 nds32_elf_ignore_reloc
,/* special_function */
1062 "R_NDS32_INSN16", /* name */
1063 FALSE
, /* partial_inplace */
1064 0x00000fff, /* src_mask */
1065 0x00000fff, /* dst_mask */
1066 FALSE
), /* pcrel_offset */
1068 /* Alignment hint for label. */
1069 HOWTO2 (R_NDS32_LABEL
, /* type */
1071 2, /* size (0 = byte, 1 = short, 2 = long) */
1073 FALSE
, /* pc_relative */
1075 complain_overflow_dont
,/* complain_on_overflow */
1076 nds32_elf_ignore_reloc
,/* special_function */
1077 "R_NDS32_LABEL", /* name */
1078 FALSE
, /* partial_inplace */
1079 0xffffffff, /* src_mask */
1080 0xffffffff, /* dst_mask */
1081 FALSE
), /* pcrel_offset */
1083 /* Relax hint for unconditional call sequence */
1084 HOWTO2 (R_NDS32_LONGCALL1
, /* type */
1086 2, /* size (0 = byte, 1 = short, 2 = long) */
1088 FALSE
, /* pc_relative */
1090 complain_overflow_dont
,/* complain_on_overflow */
1091 nds32_elf_ignore_reloc
,/* special_function */
1092 "R_NDS32_LONGCALL1", /* name */
1093 FALSE
, /* partial_inplace */
1094 0xffffffff, /* src_mask */
1095 0xffffffff, /* dst_mask */
1096 FALSE
), /* pcrel_offset */
1098 /* Relax hint for conditional call sequence. */
1099 HOWTO2 (R_NDS32_LONGCALL2
, /* type */
1101 2, /* size (0 = byte, 1 = short, 2 = long) */
1103 FALSE
, /* pc_relative */
1105 complain_overflow_dont
,/* complain_on_overflow */
1106 nds32_elf_ignore_reloc
,/* special_function */
1107 "R_NDS32_LONGCALL2", /* name */
1108 FALSE
, /* partial_inplace */
1109 0xffffffff, /* src_mask */
1110 0xffffffff, /* dst_mask */
1111 FALSE
), /* pcrel_offset */
1113 /* Relax hint for conditional call sequence. */
1114 HOWTO2 (R_NDS32_LONGCALL3
, /* type */
1116 2, /* size (0 = byte, 1 = short, 2 = long) */
1118 FALSE
, /* pc_relative */
1120 complain_overflow_dont
,/* complain_on_overflow */
1121 nds32_elf_ignore_reloc
,/* special_function */
1122 "R_NDS32_LONGCALL3", /* name */
1123 FALSE
, /* partial_inplace */
1124 0xffffffff, /* src_mask */
1125 0xffffffff, /* dst_mask */
1126 FALSE
), /* pcrel_offset */
1128 /* Relax hint for unconditional branch sequence. */
1129 HOWTO2 (R_NDS32_LONGJUMP1
, /* type */
1131 2, /* size (0 = byte, 1 = short, 2 = long) */
1133 FALSE
, /* pc_relative */
1135 complain_overflow_dont
,/* complain_on_overflow */
1136 nds32_elf_ignore_reloc
,/* special_function */
1137 "R_NDS32_LONGJUMP1", /* name */
1138 FALSE
, /* partial_inplace */
1139 0xffffffff, /* src_mask */
1140 0xffffffff, /* dst_mask */
1141 FALSE
), /* pcrel_offset */
1143 /* Relax hint for conditional branch sequence. */
1144 HOWTO2 (R_NDS32_LONGJUMP2
, /* type */
1146 2, /* size (0 = byte, 1 = short, 2 = long) */
1148 FALSE
, /* pc_relative */
1150 complain_overflow_dont
,/* complain_on_overflow */
1151 nds32_elf_ignore_reloc
,/* special_function */
1152 "R_NDS32_LONGJUMP2", /* name */
1153 FALSE
, /* partial_inplace */
1154 0xffffffff, /* src_mask */
1155 0xffffffff, /* dst_mask */
1156 FALSE
), /* pcrel_offset */
1158 /* Relax hint for conditional branch sequence. */
1159 HOWTO2 (R_NDS32_LONGJUMP3
, /* type */
1161 2, /* size (0 = byte, 1 = short, 2 = long) */
1163 FALSE
, /* pc_relative */
1165 complain_overflow_dont
,/* complain_on_overflow */
1166 nds32_elf_ignore_reloc
,/* special_function */
1167 "R_NDS32_LONGJUMP3", /* name */
1168 FALSE
, /* partial_inplace */
1169 0xffffffff, /* src_mask */
1170 0xffffffff, /* dst_mask */
1171 FALSE
), /* pcrel_offset */
1173 /* Relax hint for load/store sequence. */
1174 HOWTO2 (R_NDS32_LOADSTORE
, /* type */
1176 2, /* size (0 = byte, 1 = short, 2 = long) */
1178 FALSE
, /* pc_relative */
1180 complain_overflow_dont
,/* complain_on_overflow */
1181 nds32_elf_ignore_reloc
,/* special_function */
1182 "R_NDS32_LOADSTORE", /* name */
1183 FALSE
, /* partial_inplace */
1184 0xffffffff, /* src_mask */
1185 0xffffffff, /* dst_mask */
1186 FALSE
), /* pcrel_offset */
1188 /* Relax hint for load/store sequence. */
1189 HOWTO2 (R_NDS32_9_FIXED_RELA
, /* type */
1191 1, /* size (0 = byte, 1 = short, 2 = long) */
1193 FALSE
, /* pc_relative */
1195 complain_overflow_dont
,/* complain_on_overflow */
1196 nds32_elf_ignore_reloc
,/* special_function */
1197 "R_NDS32_9_FIXED_RELA",/* name */
1198 FALSE
, /* partial_inplace */
1199 0x000000ff, /* src_mask */
1200 0x000000ff, /* dst_mask */
1201 FALSE
), /* pcrel_offset */
1203 /* Relax hint for load/store sequence. */
1204 HOWTO2 (R_NDS32_15_FIXED_RELA
,/* type */
1206 2, /* size (0 = byte, 1 = short, 2 = long) */
1208 FALSE
, /* pc_relative */
1210 complain_overflow_dont
,/* complain_on_overflow */
1211 nds32_elf_ignore_reloc
,/* special_function */
1212 "R_NDS32_15_FIXED_RELA",/* name */
1213 FALSE
, /* partial_inplace */
1214 0x00003fff, /* src_mask */
1215 0x00003fff, /* dst_mask */
1216 FALSE
), /* pcrel_offset */
1218 /* Relax hint for load/store sequence. */
1219 HOWTO2 (R_NDS32_17_FIXED_RELA
,/* type */
1221 2, /* size (0 = byte, 1 = short, 2 = long) */
1223 FALSE
, /* pc_relative */
1225 complain_overflow_dont
,/* complain_on_overflow */
1226 nds32_elf_ignore_reloc
,/* special_function */
1227 "R_NDS32_17_FIXED_RELA",/* name */
1228 FALSE
, /* partial_inplace */
1229 0x0000ffff, /* src_mask */
1230 0x0000ffff, /* dst_mask */
1231 FALSE
), /* pcrel_offset */
1233 /* Relax hint for load/store sequence. */
1234 HOWTO2 (R_NDS32_25_FIXED_RELA
,/* type */
1236 2, /* size (0 = byte, 1 = short, 2 = long) */
1238 FALSE
, /* pc_relative */
1240 complain_overflow_dont
,/* complain_on_overflow */
1241 nds32_elf_ignore_reloc
,/* special_function */
1242 "R_NDS32_25_FIXED_RELA",/* name */
1243 FALSE
, /* partial_inplace */
1244 0x00ffffff, /* src_mask */
1245 0x00ffffff, /* dst_mask */
1246 FALSE
), /* pcrel_offset */
1248 /* High 20 bits of PLT symbol offset relative to PC. */
1249 HOWTO2 (R_NDS32_PLTREL_HI20
, /* type */
1250 12, /* rightshift */
1251 2, /* size (0 = byte, 1 = short, 2 = long) */
1253 FALSE
, /* pc_relative */
1255 complain_overflow_dont
,/* complain_on_overflow */
1256 bfd_elf_generic_reloc
, /* special_function */
1257 "R_NDS32_PLTREL_HI20", /* name */
1258 FALSE
, /* partial_inplace */
1259 0x000fffff, /* src_mask */
1260 0x000fffff, /* dst_mask */
1261 FALSE
), /* pcrel_offset */
1263 /* Low 12 bits of PLT symbol offset relative to PC. */
1264 HOWTO2 (R_NDS32_PLTREL_LO12
, /* type */
1266 2, /* size (0 = byte, 1 = short, 2 = long) */
1268 FALSE
, /* pc_relative */
1270 complain_overflow_dont
,/* complain_on_overflow */
1271 bfd_elf_generic_reloc
, /* special_function */
1272 "R_NDS32_PLTREL_LO12", /* name */
1273 FALSE
, /* partial_inplace */
1274 0x00000fff, /* src_mask */
1275 0x00000fff, /* dst_mask */
1276 FALSE
), /* pcrel_offset */
1278 /* High 20 bits of PLT symbol offset relative to GOT (GP). */
1279 HOWTO2 (R_NDS32_PLT_GOTREL_HI20
, /* type */
1280 12, /* rightshift */
1281 2, /* size (0 = byte, 1 = short, 2 = long) */
1283 FALSE
, /* pc_relative */
1285 complain_overflow_dont
,/* complain_on_overflow */
1286 bfd_elf_generic_reloc
, /* special_function */
1287 "R_NDS32_PLT_GOTREL_HI20",/* name */
1288 FALSE
, /* partial_inplace */
1289 0x000fffff, /* src_mask */
1290 0x000fffff, /* dst_mask */
1291 FALSE
), /* pcrel_offset */
1293 /* Low 12 bits of PLT symbol offset relative to GOT (GP). */
1294 HOWTO2 (R_NDS32_PLT_GOTREL_LO12
,/* type */
1296 2, /* size (0 = byte, 1 = short, 2 = long) */
1298 FALSE
, /* pc_relative */
1300 complain_overflow_dont
,/* complain_on_overflow */
1301 bfd_elf_generic_reloc
, /* special_function */
1302 "R_NDS32_PLT_GOTREL_LO12",/* name */
1303 FALSE
, /* partial_inplace */
1304 0x00000fff, /* src_mask */
1305 0x00000fff, /* dst_mask */
1306 FALSE
), /* pcrel_offset */
1308 /* Small data area 12 bits offset. */
1309 HOWTO2 (R_NDS32_SDA12S2_DP_RELA
,/* type */
1311 2, /* size (0 = byte, 1 = short, 2 = long) */
1313 FALSE
, /* pc_relative */
1315 complain_overflow_signed
,/* complain_on_overflow */
1316 bfd_elf_generic_reloc
, /* special_function */
1317 "R_NDS32_SDA12S2_DP_RELA",/* name */
1318 FALSE
, /* partial_inplace */
1319 0x00000fff, /* src_mask */
1320 0x00000fff, /* dst_mask */
1321 FALSE
), /* pcrel_offset */
1323 /* Small data area 12 bits offset. */
1324 HOWTO2 (R_NDS32_SDA12S2_SP_RELA
,/* type */
1326 2, /* size (0 = byte, 1 = short, 2 = long) */
1328 FALSE
, /* pc_relative */
1330 complain_overflow_signed
,/* complain_on_overflow */
1331 bfd_elf_generic_reloc
, /* special_function */
1332 "R_NDS32_SDA12S2_SP_RELA",/* name */
1333 FALSE
, /* partial_inplace */
1334 0x00000fff, /* src_mask */
1335 0x00000fff, /* dst_mask */
1336 FALSE
), /* pcrel_offset */
1337 /* Lower 12 bits of address. */
1339 HOWTO2 (R_NDS32_LO12S2_DP_RELA
, /* type */
1341 2, /* size (0 = byte, 1 = short, 2 = long) */
1343 FALSE
, /* pc_relative */
1345 complain_overflow_dont
,/* complain_on_overflow */
1346 bfd_elf_generic_reloc
, /* special_function */
1347 "R_NDS32_LO12S2_DP_RELA",/* name */
1348 FALSE
, /* partial_inplace */
1349 0x000003ff, /* src_mask */
1350 0x000003ff, /* dst_mask */
1351 FALSE
), /* pcrel_offset */
1353 /* Lower 12 bits of address. */
1354 HOWTO2 (R_NDS32_LO12S2_SP_RELA
,/* type */
1356 2, /* size (0 = byte, 1 = short, 2 = long) */
1358 FALSE
, /* pc_relative */
1360 complain_overflow_dont
,/* complain_on_overflow */
1361 bfd_elf_generic_reloc
, /* special_function */
1362 "R_NDS32_LO12S2_SP_RELA",/* name */
1363 FALSE
, /* partial_inplace */
1364 0x000003ff, /* src_mask */
1365 0x000003ff, /* dst_mask */
1366 FALSE
), /* pcrel_offset */
1367 /* Lower 12 bits of address. Special identity for or case. */
1368 HOWTO2 (R_NDS32_LO12S0_ORI_RELA
,/* type */
1370 2, /* size (0 = byte, 1 = short, 2 = long) */
1372 FALSE
, /* pc_relative */
1374 complain_overflow_dont
,/* complain_on_overflow */
1375 bfd_elf_generic_reloc
, /* special_function */
1376 "R_NDS32_LO12S0_ORI_RELA",/* name */
1377 FALSE
, /* partial_inplace */
1378 0x00000fff, /* src_mask */
1379 0x00000fff, /* dst_mask */
1380 FALSE
), /* pcrel_offset */
1381 /* Small data area 19 bits offset. */
1382 HOWTO2 (R_NDS32_SDA16S3_RELA
, /* type */
1384 2, /* size (0 = byte, 1 = short, 2 = long) */
1386 FALSE
, /* pc_relative */
1388 complain_overflow_signed
,/* complain_on_overflow */
1389 bfd_elf_generic_reloc
, /* special_function */
1390 "R_NDS32_SDA16S3_RELA",/* name */
1391 FALSE
, /* partial_inplace */
1392 0x0000ffff, /* src_mask */
1393 0x0000ffff, /* dst_mask */
1394 FALSE
), /* pcrel_offset */
1396 /* Small data area 15 bits offset. */
1397 HOWTO2 (R_NDS32_SDA17S2_RELA
, /* type */
1399 2, /* size (0 = byte, 1 = short, 2 = long) */
1401 FALSE
, /* pc_relative */
1403 complain_overflow_signed
,/* complain_on_overflow */
1404 bfd_elf_generic_reloc
, /* special_function */
1405 "R_NDS32_SDA17S2_RELA",/* name */
1406 FALSE
, /* partial_inplace */
1407 0x0001ffff, /* src_mask */
1408 0x0001ffff, /* dst_mask */
1409 FALSE
), /* pcrel_offset */
1411 HOWTO2 (R_NDS32_SDA18S1_RELA
, /* type */
1413 2, /* size (0 = byte, 1 = short, 2 = long) */
1415 FALSE
, /* pc_relative */
1417 complain_overflow_signed
,/* complain_on_overflow */
1418 bfd_elf_generic_reloc
, /* special_function */
1419 "R_NDS32_SDA18S1_RELA",/* name */
1420 FALSE
, /* partial_inplace */
1421 0x0003ffff, /* src_mask */
1422 0x0003ffff, /* dst_mask */
1423 FALSE
), /* pcrel_offset */
1425 HOWTO2 (R_NDS32_SDA19S0_RELA
, /* type */
1427 2, /* size (0 = byte, 1 = short, 2 = long) */
1429 FALSE
, /* pc_relative */
1431 complain_overflow_signed
,/* complain_on_overflow */
1432 bfd_elf_generic_reloc
, /* special_function */
1433 "R_NDS32_SDA19S0_RELA",/* name */
1434 FALSE
, /* partial_inplace */
1435 0x0007ffff, /* src_mask */
1436 0x0007ffff, /* dst_mask */
1437 FALSE
), /* pcrel_offset */
1438 HOWTO2 (R_NDS32_DWARF2_OP1_RELA
,/* type */
1440 0, /* size (0 = byte, 1 = short, 2 = long) */
1442 FALSE
, /* pc_relative */
1444 complain_overflow_dont
,/* complain_on_overflow */
1445 nds32_elf_ignore_reloc
,/* special_function */
1446 "R_NDS32_DWARF2_OP1_RELA",/* name */
1447 FALSE
, /* partial_inplace */
1448 0xff, /* src_mask */
1449 0xff, /* dst_mask */
1450 FALSE
), /* pcrel_offset */
1451 HOWTO2 (R_NDS32_DWARF2_OP2_RELA
,/* type */
1453 1, /* size (0 = byte, 1 = short, 2 = long) */
1455 FALSE
, /* pc_relative */
1457 complain_overflow_dont
,/* complain_on_overflow */
1458 nds32_elf_ignore_reloc
,/* special_function */
1459 "R_NDS32_DWARF2_OP2_RELA",/* name */
1460 FALSE
, /* partial_inplace */
1461 0xffff, /* src_mask */
1462 0xffff, /* dst_mask */
1463 FALSE
), /* pcrel_offset */
1464 HOWTO2 (R_NDS32_DWARF2_LEB_RELA
,/* type */
1466 2, /* size (0 = byte, 1 = short, 2 = long) */
1468 FALSE
, /* pc_relative */
1470 complain_overflow_dont
,/* complain_on_overflow */
1471 nds32_elf_ignore_reloc
,/* special_function */
1472 "R_NDS32_DWARF2_LEB_RELA",/* name */
1473 FALSE
, /* partial_inplace */
1474 0xffffffff, /* src_mask */
1475 0xffffffff, /* dst_mask */
1476 FALSE
), /* pcrel_offset */
1477 HOWTO2 (R_NDS32_UPDATE_TA_RELA
,/* type */
1479 1, /* size (0 = byte, 1 = short, 2 = long) */
1481 FALSE
, /* pc_relative */
1483 complain_overflow_dont
,/* complain_on_overflow */
1484 nds32_elf_ignore_reloc
,/* special_function */
1485 "R_NDS32_UPDATE_TA_RELA",/* name */
1486 FALSE
, /* partial_inplace */
1487 0xffff, /* src_mask */
1488 0xffff, /* dst_mask */
1489 FALSE
), /* pcrel_offset */
1490 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
1491 entry for the symbol. */
1492 HOWTO2 (R_NDS32_9_PLTREL
, /* type */
1494 1, /* size (0 = byte, 1 = short, 2 = long) */
1496 TRUE
, /* pc_relative */
1498 complain_overflow_signed
,/* complain_on_overflow */
1499 bfd_elf_generic_reloc
, /* special_function */
1500 "R_NDS32_9_PLTREL", /* name */
1501 FALSE
, /* partial_inplace */
1502 0xff, /* src_mask */
1503 0xff, /* dst_mask */
1504 TRUE
), /* pcrel_offset */
1505 /* Low 20 bits of PLT symbol offset relative to GOT (GP). */
1506 HOWTO2 (R_NDS32_PLT_GOTREL_LO20
,/* type */
1508 2, /* size (0 = byte, 1 = short, 2 = long) */
1510 FALSE
, /* pc_relative */
1512 complain_overflow_dont
,/* complain_on_overflow */
1513 bfd_elf_generic_reloc
, /* special_function */
1514 "R_NDS32_PLT_GOTREL_LO20",/* name */
1515 FALSE
, /* partial_inplace */
1516 0x000fffff, /* src_mask */
1517 0x000fffff, /* dst_mask */
1518 FALSE
), /* pcrel_offset */
1519 /* low 15 bits of PLT symbol offset relative to GOT (GP) */
1520 HOWTO2 (R_NDS32_PLT_GOTREL_LO15
,/* type */
1522 2, /* size (0 = byte, 1 = short, 2 = long) */
1524 FALSE
, /* pc_relative */
1526 complain_overflow_dont
,/* complain_on_overflow */
1527 bfd_elf_generic_reloc
, /* special_function */
1528 "R_NDS32_PLT_GOTREL_LO15",/* name */
1529 FALSE
, /* partial_inplace */
1530 0x00007fff, /* src_mask */
1531 0x00007fff, /* dst_mask */
1532 FALSE
), /* pcrel_offset */
1533 /* Low 19 bits of PLT symbol offset relative to GOT (GP). */
1534 HOWTO2 (R_NDS32_PLT_GOTREL_LO19
,/* type */
1536 2, /* size (0 = byte, 1 = short, 2 = long) */
1538 FALSE
, /* pc_relative */
1540 complain_overflow_dont
,/* complain_on_overflow */
1541 bfd_elf_generic_reloc
, /* special_function */
1542 "R_NDS32_PLT_GOTREL_LO19",/* name */
1543 FALSE
, /* partial_inplace */
1544 0x0007ffff, /* src_mask */
1545 0x0007ffff, /* dst_mask */
1546 FALSE
), /* pcrel_offset */
1547 HOWTO2 (R_NDS32_GOT_LO15
, /* type */
1549 2, /* size (0 = byte, 1 = short, 2 = long) */
1551 FALSE
, /* pc_relative */
1553 complain_overflow_dont
,/* complain_on_overflow */
1554 bfd_elf_generic_reloc
, /* special_function */
1555 "R_NDS32_GOT_LO15", /* name */
1556 FALSE
, /* partial_inplace */
1557 0x00007fff, /* src_mask */
1558 0x00007fff, /* dst_mask */
1559 FALSE
), /* pcrel_offset */
1560 HOWTO2 (R_NDS32_GOT_LO19
, /* type */
1562 2, /* size (0 = byte, 1 = short, 2 = long) */
1564 FALSE
, /* pc_relative */
1566 complain_overflow_dont
,/* complain_on_overflow */
1567 bfd_elf_generic_reloc
, /* special_function */
1568 "R_NDS32_GOT_LO19", /* name */
1569 FALSE
, /* partial_inplace */
1570 0x0007ffff, /* src_mask */
1571 0x0007ffff, /* dst_mask */
1572 FALSE
), /* pcrel_offset */
1573 HOWTO2 (R_NDS32_GOTOFF_LO15
, /* type */
1575 2, /* size (0 = byte, 1 = short, 2 = long) */
1577 FALSE
, /* pc_relative */
1579 complain_overflow_dont
,/* complain_on_overflow */
1580 bfd_elf_generic_reloc
, /* special_function */
1581 "R_NDS32_GOTOFF_LO15", /* name */
1582 FALSE
, /* partial_inplace */
1583 0x00007fff, /* src_mask */
1584 0x00007fff, /* dst_mask */
1585 FALSE
), /* pcrel_offset */
1586 HOWTO2 (R_NDS32_GOTOFF_LO19
, /* type */
1588 2, /* size (0 = byte, 1 = short, 2 = long) */
1590 FALSE
, /* pc_relative */
1592 complain_overflow_dont
,/* complain_on_overflow */
1593 bfd_elf_generic_reloc
, /* special_function */
1594 "R_NDS32_GOTOFF_LO19", /* name */
1595 FALSE
, /* partial_inplace */
1596 0x0007ffff, /* src_mask */
1597 0x0007ffff, /* dst_mask */
1598 FALSE
), /* pcrel_offset */
1599 /* GOT 15 bits offset. */
1600 HOWTO2 (R_NDS32_GOT15S2_RELA
, /* type */
1602 2, /* size (0 = byte, 1 = short, 2 = long) */
1604 FALSE
, /* pc_relative */
1606 complain_overflow_signed
,/* complain_on_overflow */
1607 bfd_elf_generic_reloc
, /* special_function */
1608 "R_NDS32_GOT15S2_RELA",/* name */
1609 FALSE
, /* partial_inplace */
1610 0x00007fff, /* src_mask */
1611 0x00007fff, /* dst_mask */
1612 FALSE
), /* pcrel_offset */
1613 /* GOT 17 bits offset. */
1614 HOWTO2 (R_NDS32_GOT17S2_RELA
, /* type */
1616 2, /* size (0 = byte, 1 = short, 2 = long) */
1618 FALSE
, /* pc_relative */
1620 complain_overflow_signed
,/* complain_on_overflow */
1621 bfd_elf_generic_reloc
, /* special_function */
1622 "R_NDS32_GOT17S2_RELA",/* name */
1623 FALSE
, /* partial_inplace */
1624 0x0001ffff, /* src_mask */
1625 0x0001ffff, /* dst_mask */
1626 FALSE
), /* pcrel_offset */
1627 /* A 5 bit address. */
1628 HOWTO2 (R_NDS32_5_RELA
, /* type */
1630 1, /* size (0 = byte, 1 = short, 2 = long) */
1632 FALSE
, /* pc_relative */
1634 complain_overflow_signed
,/* complain_on_overflow */
1635 bfd_elf_generic_reloc
, /* special_function */
1636 "R_NDS32_5_RELA", /* name */
1637 FALSE
, /* partial_inplace */
1638 0x1f, /* src_mask */
1639 0x1f, /* dst_mask */
1640 FALSE
), /* pcrel_offset */
1641 HOWTO2 (R_NDS32_10_UPCREL_RELA
,/* type */
1643 1, /* size (0 = byte, 1 = short, 2 = long) */
1645 TRUE
, /* pc_relative */
1647 complain_overflow_unsigned
,/* complain_on_overflow */
1648 bfd_elf_generic_reloc
, /* special_function */
1649 "R_NDS32_10_UPCREL_RELA",/* name */
1650 FALSE
, /* partial_inplace */
1651 0x1ff, /* src_mask */
1652 0x1ff, /* dst_mask */
1653 TRUE
), /* pcrel_offset */
1654 HOWTO2 (R_NDS32_SDA_FP7U2_RELA
,/* type */
1656 1, /* size (0 = byte, 1 = short, 2 = long) */
1658 FALSE
, /* pc_relative */
1660 complain_overflow_unsigned
,/* complain_on_overflow */
1661 bfd_elf_generic_reloc
, /* special_function */
1662 "R_NDS32_SDA_FP7U2_RELA",/* name */
1663 FALSE
, /* partial_inplace */
1664 0x0000007f, /* src_mask */
1665 0x0000007f, /* dst_mask */
1666 FALSE
), /* pcrel_offset */
1667 HOWTO2 (R_NDS32_WORD_9_PCREL_RELA
,/* type */
1669 2, /* size (0 = byte, 1 = short, 2 = long) */
1671 TRUE
, /* pc_relative */
1673 complain_overflow_signed
,/* complain_on_overflow */
1674 bfd_elf_generic_reloc
, /* special_function */
1675 "R_NDS32_WORD_9_PCREL_RELA",/* name */
1676 FALSE
, /* partial_inplace */
1677 0xff, /* src_mask */
1678 0xff, /* dst_mask */
1679 TRUE
), /* pcrel_offset */
1680 HOWTO2 (R_NDS32_25_ABS_RELA
, /* type */
1682 2, /* size (0 = byte, 1 = short, 2 = long) */
1684 FALSE
, /* pc_relative */
1686 complain_overflow_dont
,/* complain_on_overflow */
1687 bfd_elf_generic_reloc
, /* special_function */
1688 "R_NDS32_25_ABS_RELA", /* name */
1689 FALSE
, /* partial_inplace */
1690 0xffffff, /* src_mask */
1691 0xffffff, /* dst_mask */
1692 FALSE
), /* pcrel_offset */
1694 /* A relative 17 bit relocation for ifc, right shifted by 1. */
1695 HOWTO2 (R_NDS32_17IFC_PCREL_RELA
,/* type */
1697 2, /* size (0 = byte, 1 = short, 2 = long) */
1699 TRUE
, /* pc_relative */
1701 complain_overflow_signed
,/* complain_on_overflow */
1702 bfd_elf_generic_reloc
, /* special_function */
1703 "R_NDS32_17IFC_PCREL_RELA",/* name */
1704 FALSE
, /* partial_inplace */
1705 0xffff, /* src_mask */
1706 0xffff, /* dst_mask */
1707 TRUE
), /* pcrel_offset */
1709 /* A relative unsigned 10 bit relocation for ifc, right shifted by 1. */
1710 HOWTO2 (R_NDS32_10IFCU_PCREL_RELA
,/* type */
1712 1, /* size (0 = byte, 1 = short, 2 = long) */
1714 TRUE
, /* pc_relative */
1716 complain_overflow_unsigned
,/* complain_on_overflow */
1717 bfd_elf_generic_reloc
, /* special_function */
1718 "R_NDS32_10IFCU_PCREL_RELA",/* name */
1719 FALSE
, /* partial_inplace */
1720 0x1ff, /* src_mask */
1721 0x1ff, /* dst_mask */
1722 TRUE
), /* pcrel_offset */
1724 /* Like R_NDS32_HI20, but referring to the TLS LE entry for the symbol. */
1725 HOWTO2 (R_NDS32_TLS_LE_HI20
, /* type */
1726 12, /* rightshift */
1727 2, /* size (0 = byte, 1 = short, 2 = long) */
1729 FALSE
, /* pc_relative */
1731 complain_overflow_dont
,/* complain_on_overflow */
1732 bfd_elf_generic_reloc
, /* special_function */
1733 "R_NDS32_TLS_LE_HI20", /* name */
1734 FALSE
, /* partial_inplace */
1735 0x000fffff, /* src_mask */
1736 0x000fffff, /* dst_mask */
1737 FALSE
), /* pcrel_offset */
1739 HOWTO2 (R_NDS32_TLS_LE_LO12
, /* type */
1741 2, /* size (0 = byte, 1 = short, 2 = long) */
1743 FALSE
, /* pc_relative */
1745 complain_overflow_dont
,/* complain_on_overflow */
1746 bfd_elf_generic_reloc
, /* special_function */
1747 "R_NDS32_TLS_LE_LO12", /* name */
1748 FALSE
, /* partial_inplace */
1749 0x00000fff, /* src_mask */
1750 0x00000fff, /* dst_mask */
1751 FALSE
), /* pcrel_offset */
1753 /* Like R_NDS32_HI20, but referring to the TLS IE entry for the symbol. */
1754 HOWTO2 (R_NDS32_TLS_IE_HI20
, /* type */
1755 12, /* rightshift */
1756 2, /* size (0 = byte, 1 = short, 2 = long) */
1758 FALSE
, /* pc_relative */
1760 complain_overflow_dont
,/* complain_on_overflow */
1761 bfd_elf_generic_reloc
, /* special_function */
1762 "R_NDS32_TLS_IE_HI20", /* name */
1763 FALSE
, /* partial_inplace */
1764 0x000fffff, /* src_mask */
1765 0x000fffff, /* dst_mask */
1766 FALSE
), /* pcrel_offset */
1768 HOWTO2 (R_NDS32_TLS_IE_LO12S2
,/* type */
1770 2, /* size (0 = byte, 1 = short, 2 = long) */
1772 FALSE
, /* pc_relative */
1774 complain_overflow_dont
,/* complain_on_overflow */
1775 bfd_elf_generic_reloc
, /* special_function */
1776 "R_NDS32_TLS_IE_LO12S2",/* name */
1777 FALSE
, /* partial_inplace */
1778 0x000003ff, /* src_mask */
1779 0x000003ff, /* dst_mask */
1780 FALSE
), /* pcrel_offset */
1782 /* TLS LE TP offset relocation */
1783 HOWTO2 (R_NDS32_TLS_TPOFF
, /* type */
1785 2, /* size (0 = byte, 1 = short, 2 = long) */
1787 FALSE
, /* pc_relative */
1789 complain_overflow_bitfield
,/* complain_on_overflow */
1790 bfd_elf_generic_reloc
, /* special_function */
1791 "R_NDS32_TLS_TPOFF", /* name */
1792 FALSE
, /* partial_inplace */
1793 0xffffffff, /* src_mask */
1794 0xffffffff, /* dst_mask */
1795 FALSE
), /* pcrel_offset */
1797 /* A 20 bit address. */
1798 HOWTO2 (R_NDS32_TLS_LE_20
, /* type */
1800 2, /* size (0 = byte, 1 = short, 2 = long) */
1802 FALSE
, /* pc_relative */
1804 complain_overflow_signed
,/* complain_on_overflow */
1805 bfd_elf_generic_reloc
, /* special_function */
1806 "R_NDS32_TLS_LE_20", /* name */
1807 FALSE
, /* partial_inplace */
1808 0xfffff, /* src_mask */
1809 0xfffff, /* dst_mask */
1810 FALSE
), /* pcrel_offset */
1812 HOWTO2 (R_NDS32_TLS_LE_15S0
, /* type */
1814 2, /* size (0 = byte, 1 = short, 2 = long) */
1816 FALSE
, /* pc_relative */
1818 complain_overflow_signed
,/* complain_on_overflow */
1819 bfd_elf_generic_reloc
, /* special_function */
1820 "R_NDS32_TLS_LE_15S0", /* name */
1821 FALSE
, /* partial_inplace */
1822 0x7fff, /* src_mask */
1823 0x7fff, /* dst_mask */
1824 FALSE
), /* pcrel_offset */
1825 HOWTO2 (R_NDS32_TLS_LE_15S1
, /* type */
1827 2, /* size (0 = byte, 1 = short, 2 = long) */
1829 FALSE
, /* pc_relative */
1831 complain_overflow_signed
,/* complain_on_overflow */
1832 bfd_elf_generic_reloc
, /* special_function */
1833 "R_NDS32_TLS_LE_15S1", /* name */
1834 FALSE
, /* partial_inplace */
1835 0x7fff, /* src_mask */
1836 0x7fff, /* dst_mask */
1837 FALSE
), /* pcrel_offset */
1838 HOWTO2 (R_NDS32_TLS_LE_15S2
, /* type */
1840 2, /* size (0 = byte, 1 = short, 2 = long) */
1842 FALSE
, /* pc_relative */
1844 complain_overflow_signed
,/* complain_on_overflow */
1845 bfd_elf_generic_reloc
, /* special_function */
1846 "R_NDS32_TLS_LE_15S2", /* name */
1847 FALSE
, /* partial_inplace */
1848 0x7fff, /* src_mask */
1849 0x7fff, /* dst_mask */
1850 FALSE
), /* pcrel_offset */
1852 /* Relax hint for unconditional call sequence */
1853 HOWTO2 (R_NDS32_LONGCALL4
, /* type */
1855 2, /* size (0 = byte, 1 = short, 2 = long) */
1857 FALSE
, /* pc_relative */
1859 complain_overflow_dont
,/* complain_on_overflow */
1860 nds32_elf_ignore_reloc
,/* special_function */
1861 "R_NDS32_LONGCALL4", /* name */
1862 FALSE
, /* partial_inplace */
1863 0xffffffff, /* src_mask */
1864 0xffffffff, /* dst_mask */
1865 FALSE
), /* pcrel_offset */
1867 /* Relax hint for conditional call sequence. */
1868 HOWTO2 (R_NDS32_LONGCALL5
, /* type */
1870 2, /* size (0 = byte, 1 = short, 2 = long) */
1872 FALSE
, /* pc_relative */
1874 complain_overflow_dont
,/* complain_on_overflow */
1875 nds32_elf_ignore_reloc
,/* special_function */
1876 "R_NDS32_LONGCALL5", /* name */
1877 FALSE
, /* partial_inplace */
1878 0xffffffff, /* src_mask */
1879 0xffffffff, /* dst_mask */
1880 FALSE
), /* pcrel_offset */
1882 /* Relax hint for conditional call sequence. */
1883 HOWTO2 (R_NDS32_LONGCALL6
, /* type */
1885 2, /* size (0 = byte, 1 = short, 2 = long) */
1887 FALSE
, /* pc_relative */
1889 complain_overflow_dont
,/* complain_on_overflow */
1890 nds32_elf_ignore_reloc
,/* special_function */
1891 "R_NDS32_LONGCALL6", /* name */
1892 FALSE
, /* partial_inplace */
1893 0xffffffff, /* src_mask */
1894 0xffffffff, /* dst_mask */
1895 FALSE
), /* pcrel_offset */
1897 /* Relax hint for unconditional branch sequence. */
1898 HOWTO2 (R_NDS32_LONGJUMP4
, /* type */
1900 2, /* size (0 = byte, 1 = short, 2 = long) */
1902 FALSE
, /* pc_relative */
1904 complain_overflow_dont
,/* complain_on_overflow */
1905 nds32_elf_ignore_reloc
,/* special_function */
1906 "R_NDS32_LONGJUMP4", /* name */
1907 FALSE
, /* partial_inplace */
1908 0xffffffff, /* src_mask */
1909 0xffffffff, /* dst_mask */
1910 FALSE
), /* pcrel_offset */
1912 /* Relax hint for conditional branch sequence. */
1913 HOWTO2 (R_NDS32_LONGJUMP5
, /* type */
1915 2, /* size (0 = byte, 1 = short, 2 = long) */
1917 FALSE
, /* pc_relative */
1919 complain_overflow_dont
,/* complain_on_overflow */
1920 nds32_elf_ignore_reloc
,/* special_function */
1921 "R_NDS32_LONGJUMP5", /* name */
1922 FALSE
, /* partial_inplace */
1923 0xffffffff, /* src_mask */
1924 0xffffffff, /* dst_mask */
1925 FALSE
), /* pcrel_offset */
1927 /* Relax hint for conditional branch sequence. */
1928 HOWTO2 (R_NDS32_LONGJUMP6
, /* type */
1930 2, /* size (0 = byte, 1 = short, 2 = long) */
1932 FALSE
, /* pc_relative */
1934 complain_overflow_dont
,/* complain_on_overflow */
1935 nds32_elf_ignore_reloc
,/* special_function */
1936 "R_NDS32_LONGJUMP6", /* name */
1937 FALSE
, /* partial_inplace */
1938 0xffffffff, /* src_mask */
1939 0xffffffff, /* dst_mask */
1940 FALSE
), /* pcrel_offset */
1942 /* Relax hint for conditional branch sequence. */
1943 HOWTO2 (R_NDS32_LONGJUMP7
, /* type */
1945 2, /* size (0 = byte, 1 = short, 2 = long) */
1947 FALSE
, /* pc_relative */
1949 complain_overflow_dont
,/* complain_on_overflow */
1950 nds32_elf_ignore_reloc
,/* special_function */
1951 "R_NDS32_LONGJUMP7", /* name */
1952 FALSE
, /* partial_inplace */
1953 0xffffffff, /* src_mask */
1954 0xffffffff, /* dst_mask */
1955 FALSE
), /* pcrel_offset */
1957 HOWTO2 (R_NDS32_TLS_IE_LO12
, /* type */
1959 2, /* size (0 = byte, 1 = short, 2 = long) */
1961 FALSE
, /* pc_relative */
1963 complain_overflow_dont
,/* complain_on_overflow */
1964 bfd_elf_generic_reloc
, /* special_function */
1965 "R_NDS32_TLS_IE_LO12", /* name */
1966 FALSE
, /* partial_inplace */
1967 0x00000fff, /* src_mask */
1968 0x00000fff, /* dst_mask */
1969 FALSE
), /* pcrel_offset */
1971 /* Like R_NDS32_HI20, but referring to the TLS IE (PIE)
1972 entry for the symbol. */
1973 HOWTO2 (R_NDS32_TLS_IEGP_HI20
,/* type */
1974 12, /* rightshift */
1975 2, /* size (0 = byte, 1 = short, 2 = long) */
1977 FALSE
, /* pc_relative */
1979 complain_overflow_dont
,/* complain_on_overflow */
1980 bfd_elf_generic_reloc
, /* special_function */
1981 "R_NDS32_TLS_IEGP_HI20",/* name */
1982 FALSE
, /* partial_inplace */
1983 0x000fffff, /* src_mask */
1984 0x000fffff, /* dst_mask */
1985 FALSE
), /* pcrel_offset */
1987 HOWTO2 (R_NDS32_TLS_IEGP_LO12
,/* type */
1989 2, /* size (0 = byte, 1 = short, 2 = long) */
1991 FALSE
, /* pc_relative */
1993 complain_overflow_dont
,/* complain_on_overflow */
1994 bfd_elf_generic_reloc
, /* special_function */
1995 "R_NDS32_TLS_IEGP_LO12",/* name */
1996 FALSE
, /* partial_inplace */
1997 0x00000fff, /* src_mask */
1998 0x00000fff, /* dst_mask */
1999 FALSE
), /* pcrel_offset */
2001 HOWTO2 (R_NDS32_TLS_IEGP_LO12S2
,/* type */
2003 2, /* size (0 = byte, 1 = short, 2 = long) */
2005 FALSE
, /* pc_relative */
2007 complain_overflow_dont
,/* complain_on_overflow */
2008 bfd_elf_generic_reloc
, /* special_function */
2009 "R_NDS32_TLS_IEGP_LO12S2",/* name */
2010 FALSE
, /* partial_inplace */
2011 0x000003ff, /* src_mask */
2012 0x000003ff, /* dst_mask */
2013 FALSE
), /* pcrel_offset */
2015 /* TLS description relocation */
2016 HOWTO2 (R_NDS32_TLS_DESC
, /* type */
2017 12, /* rightshift */
2018 2, /* size (0 = byte, 1 = short, 2 = long) */
2020 FALSE
, /* pc_relative */
2022 complain_overflow_dont
,/* complain_on_overflow */
2023 nds32_elf_hi20_reloc
, /* special_function */
2024 "R_NDS32_TLS_DESC_HI20",/* name */
2025 FALSE
, /* partial_inplace */
2026 0x000fffff, /* src_mask */
2027 0x000fffff, /* dst_mask */
2028 FALSE
), /* pcrel_offset */
2030 /* TLS GD/LD description offset high part. */
2031 HOWTO2 (R_NDS32_TLS_DESC_HI20
,/* type */
2032 12, /* rightshift */
2033 2, /* size (0 = byte, 1 = short, 2 = long) */
2035 FALSE
, /* pc_relative */
2037 complain_overflow_dont
,/* complain_on_overflow */
2038 nds32_elf_hi20_reloc
, /* special_function */
2039 "R_NDS32_TLS_DESC_HI20",/* name */
2040 FALSE
, /* partial_inplace */
2041 0x000fffff, /* src_mask */
2042 0x000fffff, /* dst_mask */
2043 FALSE
), /* pcrel_offset */
2045 /* TLS GD/LD description offset low part. */
2046 HOWTO2 (R_NDS32_TLS_DESC_LO12
,/* type */
2048 2, /* size (0 = byte, 1 = short, 2 = long) */
2050 FALSE
, /* pc_relative */
2052 complain_overflow_dont
,/* complain_on_overflow */
2053 nds32_elf_lo12_reloc
, /* special_function */
2054 "R_NDS32_TLS_DESC_LO12",/* name */
2055 FALSE
, /* partial_inplace */
2056 0x00000fff, /* src_mask */
2057 0x00000fff, /* dst_mask */
2058 FALSE
), /* pcrel_offset */
2060 /* TLS GD/LD description offset set (movi). */
2061 HOWTO2 (R_NDS32_TLS_DESC_20
, /* type */
2063 2, /* size (0 = byte, 1 = short, 2 = long) */
2065 FALSE
, /* pc_relative */
2067 complain_overflow_signed
,/* complain_on_overflow */
2068 bfd_elf_generic_reloc
, /* special_function */
2069 "R_NDS32_TLS_DESC_20", /* name */
2070 FALSE
, /* partial_inplace */
2071 0x000fffff, /* src_mask */
2072 0x000fffff, /* dst_mask */
2073 FALSE
), /* pcrel_offset */
2075 /* TLS GD/LD description offset set (lwi.gp). */
2076 HOWTO2 (R_NDS32_TLS_DESC_SDA17S2
,/* type */
2078 2, /* size (0 = byte, 1 = short, 2 = long) */
2080 FALSE
, /* pc_relative */
2082 complain_overflow_signed
,/* complain_on_overflow */
2083 bfd_elf_generic_reloc
, /* special_function */
2084 "R_NDS32_TLS_DESC_SDA17S2",/* name */
2085 FALSE
, /* partial_inplace */
2086 0x0001ffff, /* src_mask */
2087 0x0001ffff, /* dst_mask */
2088 FALSE
), /* pcrel_offset */
2091 /* Relocations used for relaxation. */
2092 #define HOWTO3(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
2093 [C-R_NDS32_RELAX_ENTRY] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC)
2095 static reloc_howto_type nds32_elf_relax_howto_table
[] = {
2096 HOWTO3 (R_NDS32_RELAX_ENTRY
, /* 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_RELAX_ENTRY", /* name */
2105 FALSE
, /* partial_inplace */
2106 0xffffffff, /* src_mask */
2107 0xffffffff, /* dst_mask */
2108 FALSE
), /* pcrel_offset */
2109 HOWTO3 (R_NDS32_GOT_SUFF
, /* 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_GOT_SUFF", /* name */
2118 FALSE
, /* partial_inplace */
2119 0xffffffff, /* src_mask */
2120 0xffffffff, /* dst_mask */
2121 FALSE
), /* pcrel_offset */
2122 HOWTO3 (R_NDS32_GOTOFF_SUFF
, /* type */
2124 2, /* size (0 = byte, 1 = short, 2 = long) */
2126 FALSE
, /* pc_relative */
2128 complain_overflow_bitfield
,/* complain_on_overflow */
2129 nds32_elf_ignore_reloc
,/* special_function */
2130 "R_NDS32_GOTOFF_SUFF", /* name */
2131 FALSE
, /* partial_inplace */
2132 0xffffffff, /* src_mask */
2133 0xffffffff, /* dst_mask */
2134 FALSE
), /* pcrel_offset */
2135 HOWTO3 (R_NDS32_PLT_GOT_SUFF
, /* 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_PLT_GOT_SUFF",/* name */
2144 FALSE
, /* partial_inplace */
2145 0xffffffff, /* src_mask */
2146 0xffffffff, /* dst_mask */
2147 FALSE
), /* pcrel_offset */
2148 HOWTO3 (R_NDS32_MULCALL_SUFF
, /* 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_MULCALL_SUFF",/* name */
2157 FALSE
, /* partial_inplace */
2158 0xffffffff, /* src_mask */
2159 0xffffffff, /* dst_mask */
2160 FALSE
), /* pcrel_offset */
2161 HOWTO3 (R_NDS32_PTR
, /* 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_PTR", /* name */
2170 FALSE
, /* partial_inplace */
2171 0xffffffff, /* src_mask */
2172 0xffffffff, /* dst_mask */
2173 FALSE
), /* pcrel_offset */
2174 HOWTO3 (R_NDS32_PTR_COUNT
, /* type */
2176 2, /* 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_PTR_COUNT", /* name */
2183 FALSE
, /* partial_inplace */
2184 0xffffffff, /* src_mask */
2185 0xffffffff, /* dst_mask */
2186 FALSE
), /* pcrel_offset */
2187 HOWTO3 (R_NDS32_PTR_RESOLVED
, /* type */
2189 2, /* 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_PTR_RESOLVED",/* name */
2196 FALSE
, /* partial_inplace */
2197 0xffffffff, /* src_mask */
2198 0xffffffff, /* dst_mask */
2199 FALSE
), /* pcrel_offset */
2200 HOWTO3 (R_NDS32_PLTBLOCK
, /* 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_PLTBLOCK", /* name */
2209 FALSE
, /* partial_inplace */
2210 0xffffffff, /* src_mask */
2211 0xffffffff, /* dst_mask */
2212 FALSE
), /* pcrel_offset */
2213 HOWTO3 (R_NDS32_RELAX_REGION_BEGIN
,/* type */
2215 2, /* 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_RELAX_REGION_BEGIN",/* name */
2222 FALSE
, /* partial_inplace */
2223 0xffffffff, /* src_mask */
2224 0xffffffff, /* dst_mask */
2225 FALSE
), /* pcrel_offset */
2226 HOWTO3 (R_NDS32_RELAX_REGION_END
,/* 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_RELAX_REGION_END",/* name */
2235 FALSE
, /* partial_inplace */
2236 0xffffffff, /* src_mask */
2237 0xffffffff, /* dst_mask */
2238 FALSE
), /* pcrel_offset */
2239 HOWTO3 (R_NDS32_MINUEND
, /* 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_MINUEND", /* name */
2248 FALSE
, /* partial_inplace */
2249 0xffffffff, /* src_mask */
2250 0xffffffff, /* dst_mask */
2251 FALSE
), /* pcrel_offset */
2252 HOWTO3 (R_NDS32_SUBTRAHEND
, /* 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_SUBTRAHEND", /* name */
2261 FALSE
, /* partial_inplace */
2262 0xffffffff, /* src_mask */
2263 0xffffffff, /* dst_mask */
2264 FALSE
), /* pcrel_offset */
2265 HOWTO3 (R_NDS32_DIFF8
, /* type */
2267 0, /* 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_DIFF8", /* name */
2274 FALSE
, /* partial_inplace */
2275 0x000000ff, /* src_mask */
2276 0x000000ff, /* dst_mask */
2277 FALSE
), /* pcrel_offset */
2278 HOWTO3 (R_NDS32_DIFF16
, /* type */
2280 1, /* 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_DIFF16", /* name */
2287 FALSE
, /* partial_inplace */
2288 0x0000ffff, /* src_mask */
2289 0x0000ffff, /* dst_mask */
2290 FALSE
), /* pcrel_offset */
2291 HOWTO3 (R_NDS32_DIFF32
, /* type */
2293 2, /* size (0 = byte, 1 = short, 2 = long) */
2295 FALSE
, /* pc_relative */
2297 complain_overflow_dont
,/* complain_on_overflow */
2298 nds32_elf_ignore_reloc
,/* special_function */
2299 "R_NDS32_DIFF32", /* name */
2300 FALSE
, /* partial_inplace */
2301 0xffffffff, /* src_mask */
2302 0xffffffff, /* dst_mask */
2303 FALSE
), /* pcrel_offset */
2304 HOWTO3 (R_NDS32_DIFF_ULEB128
, /* type */
2306 0, /* size (0 = byte, 1 = short, 2 = long) */
2308 FALSE
, /* pc_relative */
2310 complain_overflow_dont
,/* complain_on_overflow */
2311 nds32_elf_ignore_reloc
,/* special_function */
2312 "R_NDS32_DIFF_ULEB128",/* name */
2313 FALSE
, /* partial_inplace */
2314 0xffffffff, /* src_mask */
2315 0xffffffff, /* dst_mask */
2316 FALSE
), /* pcrel_offset */
2317 HOWTO3 (R_NDS32_DATA
, /* type */
2319 2, /* size (0 = byte, 1 = short, 2 = long) */
2321 FALSE
, /* pc_relative */
2323 complain_overflow_dont
,/* complain_on_overflow */
2324 nds32_elf_ignore_reloc
,/* special_function */
2325 "R_NDS32_DATA", /* name */
2326 FALSE
, /* partial_inplace */
2327 0xffffffff, /* src_mask */
2328 0xffffffff, /* dst_mask */
2329 FALSE
), /* pcrel_offset */
2330 HOWTO3 (R_NDS32_TRAN
, /* type */
2332 2, /* size (0 = byte, 1 = short, 2 = long) */
2334 FALSE
, /* pc_relative */
2336 complain_overflow_dont
,/* complain_on_overflow */
2337 nds32_elf_ignore_reloc
,/* special_function */
2338 "R_NDS32_TRAN", /* name */
2339 FALSE
, /* partial_inplace */
2340 0xffffffff, /* src_mask */
2341 0xffffffff, /* dst_mask */
2342 FALSE
), /* pcrel_offset */
2343 HOWTO3 (R_NDS32_TLS_LE_ADD
, /* type */
2345 2, /* size (0 = byte, 1 = short, 2 = long) */
2347 FALSE
, /* pc_relative */
2349 complain_overflow_dont
,/* complain_on_overflow */
2350 nds32_elf_ignore_reloc
,/* special_function */
2351 "R_NDS32_TLS_LE_ADD", /* name */
2352 FALSE
, /* partial_inplace */
2353 0xffffffff, /* src_mask */
2354 0xffffffff, /* dst_mask */
2355 FALSE
), /* pcrel_offset */
2356 HOWTO3 (R_NDS32_TLS_LE_LS
, /* type */
2358 2, /* size (0 = byte, 1 = short, 2 = long) */
2360 FALSE
, /* pc_relative */
2362 complain_overflow_dont
,/* complain_on_overflow */
2363 nds32_elf_ignore_reloc
,/* special_function */
2364 "R_NDS32_TLS_LE_LS", /* name */
2365 FALSE
, /* partial_inplace */
2366 0xffffffff, /* src_mask */
2367 0xffffffff, /* dst_mask */
2368 FALSE
), /* pcrel_offset */
2369 HOWTO3 (R_NDS32_EMPTY
, /* type */
2371 2, /* size (0 = byte, 1 = short, 2 = long) */
2373 FALSE
, /* pc_relative */
2375 complain_overflow_dont
,/* complain_on_overflow */
2376 nds32_elf_ignore_reloc
,/* special_function */
2377 "R_NDS32_EMPTY", /* name */
2378 FALSE
, /* partial_inplace */
2379 0xffffffff, /* src_mask */
2380 0xffffffff, /* dst_mask */
2381 FALSE
), /* pcrel_offset */
2382 /* TLS GD/LD description address base addition. */
2383 HOWTO3 (R_NDS32_TLS_DESC_ADD
, /* type */
2385 2, /* size (0 = byte, 1 = short, 2 = long) */
2387 FALSE
, /* pc_relative */
2389 complain_overflow_dont
,/* complain_on_overflow */
2390 nds32_elf_ignore_reloc
,/* special_function */
2391 "R_NDS32_TLS_DESC_ADD",/* name */
2392 FALSE
, /* partial_inplace */
2393 0xffffffff, /* src_mask */
2394 0xffffffff, /* dst_mask */
2395 FALSE
), /* pcrel_offset */
2396 /* TLS GD/LD description function load. */
2397 HOWTO3 (R_NDS32_TLS_DESC_FUNC
,/* type */
2399 2, /* size (0 = byte, 1 = short, 2 = long) */
2401 FALSE
, /* pc_relative */
2403 complain_overflow_dont
,/* complain_on_overflow */
2404 nds32_elf_ignore_reloc
,/* special_function */
2405 "R_NDS32_TLS_DESC_FUNC",/* name */
2406 FALSE
, /* partial_inplace */
2407 0xffffffff, /* src_mask */
2408 0xffffffff, /* dst_mask */
2409 FALSE
), /* pcrel_offset */
2410 /* TLS DESC resolve function call. */
2411 HOWTO3 (R_NDS32_TLS_DESC_CALL
,/* type */
2413 2, /* size (0 = byte, 1 = short, 2 = long) */
2415 FALSE
, /* pc_relative */
2417 complain_overflow_dont
,/* complain_on_overflow */
2418 nds32_elf_ignore_reloc
,/* special_function */
2419 "R_NDS32_TLS_DESC_CALL",/* name */
2420 FALSE
, /* partial_inplace */
2421 0xffffffff, /* src_mask */
2422 0xffffffff, /* dst_mask */
2423 FALSE
), /* pcrel_offset */
2424 /* TLS DESC variable access. */
2425 HOWTO3 (R_NDS32_TLS_DESC_MEM
, /* type */
2427 2, /* size (0 = byte, 1 = short, 2 = long) */
2429 FALSE
, /* pc_relative */
2431 complain_overflow_dont
,/* complain_on_overflow */
2432 nds32_elf_ignore_reloc
,/* special_function */
2433 "R_NDS32_TLS_DESC_MEM",/* name */
2434 FALSE
, /* partial_inplace */
2435 0xffffffff, /* src_mask */
2436 0xffffffff, /* dst_mask */
2437 FALSE
), /* pcrel_offset */
2438 /* TLS GD/LD description mark (@tlsdec). */
2439 HOWTO3 (R_NDS32_RELAX_REMOVE
, /* type */
2441 2, /* size (0 = byte, 1 = short, 2 = long) */
2443 FALSE
, /* pc_relative */
2445 complain_overflow_dont
,/* complain_on_overflow */
2446 nds32_elf_ignore_reloc
,/* special_function */
2447 "R_NDS32_REMOVE", /* name */
2448 FALSE
, /* partial_inplace */
2449 0xffffffff, /* src_mask */
2450 0xffffffff, /* dst_mask */
2451 FALSE
), /* pcrel_offset */
2452 /* TLS GD/LD description mark (@tlsdec). */
2453 HOWTO3 (R_NDS32_RELAX_GROUP
, /* type */
2455 2, /* size (0 = byte, 1 = short, 2 = long) */
2457 FALSE
, /* pc_relative */
2459 complain_overflow_dont
,/* complain_on_overflow */
2460 nds32_elf_ignore_reloc
,/* special_function */
2461 "R_NDS32_GROUP", /* name */
2462 FALSE
, /* partial_inplace */
2463 0xffffffff, /* src_mask */
2464 0xffffffff, /* dst_mask */
2465 FALSE
), /* pcrel_offset */
2466 HOWTO3 (R_NDS32_TLS_IEGP_LW
, /* type */
2468 2, /* size (0 = byte, 1 = short, 2 = long) */
2470 FALSE
, /* pc_relative */
2472 complain_overflow_dont
,/* complain_on_overflow */
2473 nds32_elf_ignore_reloc
,/* special_function */
2474 "R_NDS32_TLS_IEGP_LW", /* name */
2475 FALSE
, /* partial_inplace */
2476 0xffffffff, /* src_mask */
2477 0xffffffff, /* dst_mask */
2478 FALSE
), /* pcrel_offset */
2479 /* LA and FLSI relaxation. */
2480 HOWTO3 (R_NDS32_LSI
, /* type */
2482 2, /* size (0 = byte, 1 = short, 2 = long) */
2484 FALSE
, /* pc_relative */
2486 complain_overflow_dont
,/* complain_on_overflow */
2487 nds32_elf_ignore_reloc
,/* special_function */
2488 "R_NDS32_LSI", /* name */
2489 FALSE
, /* partial_inplace */
2490 0xffffffff, /* src_mask */
2491 0xffffffff, /* dst_mask */
2495 static unsigned long dl_tlsdesc_lazy_trampoline
[] =
2497 0x46200000, /* sethi $r2,#0x0 */
2498 0x58210000, /* ori $r2,$r2,#0x0 */
2499 0x40217400, /* add $r2,$r2,$gp */
2500 0x04210000, /* lwi $r2,[$r2+#0x0] */
2501 0x46300000, /* sethi $r3,#0x0 */
2502 0x58318000, /* ori $r3,$r3,#0x0 */
2503 0x4031f400, /* add $r3,$r3,$gp */
2504 0x4a000800, /* jr $r2 */
2508 nds32_put_trampoline (void *contents
, const unsigned long *template,
2513 for (ix
= 0; ix
!= count
; ix
++)
2515 unsigned long insn
= template[ix
];
2516 bfd_putb32 (insn
, (char *) contents
+ ix
* 4);
2520 /* nds32_insertion_sort sorts an array with nmemb elements of size size.
2521 This prototype is the same as qsort (). */
2524 nds32_insertion_sort (void *base
, size_t nmemb
, size_t size
,
2525 int (*compar
) (const void *lhs
, const void *rhs
))
2527 char *ptr
= (char *) base
;
2529 char tmp
[sizeof (Elf_Internal_Rela
)];
2531 BFD_ASSERT (size
<= sizeof (tmp
));
2533 /* If i is less than j, i is inserted before j.
2535 |---- j ----- i --------------|
2540 for (i
= 1; i
< (int) nmemb
; i
++)
2542 for (j
= (i
- 1); j
>= 0; j
--)
2543 if (compar (ptr
+ i
* size
, ptr
+ j
* size
) >= 0)
2549 continue; /* i is in order. */
2551 memcpy (tmp
, ptr
+ i
* size
, size
);
2552 memmove (ptr
+ (j
+ 1) * size
, ptr
+ j
* size
, (i
- j
) * size
);
2553 memcpy (ptr
+ j
* size
, tmp
, size
);
2557 /* Sort relocation by r_offset.
2559 We didn't use qsort () in stdlib, because quick-sort is not a stable sorting
2560 algorithm. Relocations at the same r_offset must keep their order.
2561 For example, RELAX_ENTRY must be the very first relocation entry.
2563 Currently, this function implements insertion-sort.
2565 FIXME: If we already sort them in assembler, why bother sort them
2569 compar_reloc (const void *lhs
, const void *rhs
)
2571 const Elf_Internal_Rela
*l
= (const Elf_Internal_Rela
*) lhs
;
2572 const Elf_Internal_Rela
*r
= (const Elf_Internal_Rela
*) rhs
;
2574 if (l
->r_offset
> r
->r_offset
)
2576 else if (l
->r_offset
== r
->r_offset
)
2582 /* Functions listed below are only used for old relocs.
2583 nds32_elf_9_pcrel_reloc
2584 nds32_elf_do_9_pcrel_reloc
2585 nds32_elf_hi20_reloc
2586 nds32_elf_relocate_hi20
2587 nds32_elf_lo12_reloc
2588 nds32_elf_sda15_reloc
2589 nds32_elf_generic_reloc. */
2591 /* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc. */
2593 static bfd_reloc_status_type
2594 nds32_elf_9_pcrel_reloc (bfd
* abfd
,
2595 arelent
* reloc_entry
,
2598 asection
* input_section
,
2600 char ** error_message ATTRIBUTE_UNUSED
)
2602 /* This part is from bfd_elf_generic_reloc. */
2603 if (output_bfd
!= (bfd
*) NULL
2604 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
2605 && (!reloc_entry
->howto
->partial_inplace
|| reloc_entry
->addend
== 0))
2607 reloc_entry
->address
+= input_section
->output_offset
;
2608 return bfd_reloc_ok
;
2611 if (output_bfd
!= NULL
)
2613 /* FIXME: See bfd_perform_relocation. Is this right? */
2614 return bfd_reloc_continue
;
2617 return nds32_elf_do_9_pcrel_reloc (abfd
, reloc_entry
->howto
,
2619 data
, reloc_entry
->address
,
2622 + symbol
->section
->output_section
->vma
2623 + symbol
->section
->output_offset
),
2624 reloc_entry
->addend
);
2627 /* Utility to actually perform an R_NDS32_9_PCREL reloc. */
2628 #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
2630 static bfd_reloc_status_type
2631 nds32_elf_do_9_pcrel_reloc (bfd
* abfd
,
2632 reloc_howto_type
* howto
,
2633 asection
* input_section
,
2636 asection
* symbol_section ATTRIBUTE_UNUSED
,
2637 bfd_vma symbol_value
,
2640 bfd_signed_vma relocation
;
2642 bfd_reloc_status_type status
;
2644 /* Sanity check the address (offset in section). */
2645 if (offset
> bfd_get_section_limit (abfd
, input_section
))
2646 return bfd_reloc_outofrange
;
2648 relocation
= symbol_value
+ addend
;
2649 /* Make it pc relative. */
2650 relocation
-= (input_section
->output_section
->vma
2651 + input_section
->output_offset
);
2652 /* These jumps mask off the lower two bits of the current address
2653 before doing pcrel calculations. */
2654 relocation
-= (offset
& -(bfd_vma
) 2);
2656 if (relocation
< -ACCURATE_8BIT_S1
|| relocation
>= ACCURATE_8BIT_S1
)
2657 status
= bfd_reloc_overflow
;
2659 status
= bfd_reloc_ok
;
2661 x
= bfd_getb16 (data
+ offset
);
2663 relocation
>>= howto
->rightshift
;
2664 relocation
<<= howto
->bitpos
;
2665 x
= (x
& ~howto
->dst_mask
)
2666 | (((x
& howto
->src_mask
) + relocation
) & howto
->dst_mask
);
2668 bfd_putb16 ((bfd_vma
) x
, data
+ offset
);
2673 /* Handle the R_NDS32_HI20_[SU]LO relocs.
2674 HI20_SLO is for the add3 and load/store with displacement instructions.
2675 HI20 is for the or3 instruction.
2676 For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to
2677 the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
2678 we must add one to the high 16 bytes (which will get subtracted off when
2679 the low 16 bits are added).
2680 These relocs have to be done in combination with an R_NDS32_LO12 reloc
2681 because there is a carry from the LO12 to the HI20. Here we just save
2682 the information we need; we do the actual relocation when we see the LO12.
2683 This code is copied from the elf32-mips.c. We also support an arbitrary
2684 number of HI20 relocs to be associated with a single LO12 reloc. The
2685 assembler sorts the relocs to ensure each HI20 immediately precedes its
2686 LO12. However if there are multiple copies, the assembler may not find
2687 the real LO12 so it picks the first one it finds. */
2691 struct nds32_hi20
*next
;
2696 static struct nds32_hi20
*nds32_hi20_list
;
2698 static bfd_reloc_status_type
2699 nds32_elf_hi20_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
2700 arelent
*reloc_entry
,
2703 asection
*input_section
,
2705 char **error_message ATTRIBUTE_UNUSED
)
2707 bfd_reloc_status_type ret
;
2709 struct nds32_hi20
*n
;
2711 /* This part is from bfd_elf_generic_reloc.
2712 If we're relocating, and this an external symbol, we don't want
2713 to change anything. */
2714 if (output_bfd
!= (bfd
*) NULL
2715 && (symbol
->flags
& BSF_SECTION_SYM
) == 0 && reloc_entry
->addend
== 0)
2717 reloc_entry
->address
+= input_section
->output_offset
;
2718 return bfd_reloc_ok
;
2721 /* Sanity check the address (offset in section). */
2722 if (reloc_entry
->address
> bfd_get_section_limit (abfd
, input_section
))
2723 return bfd_reloc_outofrange
;
2726 if (bfd_is_und_section (symbol
->section
) && output_bfd
== (bfd
*) NULL
)
2727 ret
= bfd_reloc_undefined
;
2729 if (bfd_is_com_section (symbol
->section
))
2732 relocation
= symbol
->value
;
2734 relocation
+= symbol
->section
->output_section
->vma
;
2735 relocation
+= symbol
->section
->output_offset
;
2736 relocation
+= reloc_entry
->addend
;
2738 /* Save the information, and let LO12 do the actual relocation. */
2739 n
= (struct nds32_hi20
*) bfd_malloc ((bfd_size_type
) sizeof *n
);
2741 return bfd_reloc_outofrange
;
2743 n
->addr
= (bfd_byte
*) data
+ reloc_entry
->address
;
2744 n
->addend
= relocation
;
2745 n
->next
= nds32_hi20_list
;
2746 nds32_hi20_list
= n
;
2748 if (output_bfd
!= (bfd
*) NULL
)
2749 reloc_entry
->address
+= input_section
->output_offset
;
2754 /* Handle an NDS32 ELF HI20 reloc. */
2757 nds32_elf_relocate_hi20 (bfd
*input_bfd ATTRIBUTE_UNUSED
,
2758 int type ATTRIBUTE_UNUSED
,
2759 Elf_Internal_Rela
*relhi
,
2760 Elf_Internal_Rela
*rello
,
2767 insn
= bfd_getb32 (contents
+ relhi
->r_offset
);
2769 addlo
= bfd_getb32 (contents
+ rello
->r_offset
);
2772 addend
+= ((insn
& 0xfffff) << 20) + addlo
;
2774 insn
= (insn
& 0xfff00000) | ((addend
>> 12) & 0xfffff);
2775 bfd_putb32 (insn
, contents
+ relhi
->r_offset
);
2778 /* Do an R_NDS32_LO12 relocation. This is a straightforward 12 bit
2779 inplace relocation; this function exists in order to do the
2780 R_NDS32_HI20_[SU]LO relocation described above. */
2782 static bfd_reloc_status_type
2783 nds32_elf_lo12_reloc (bfd
*input_bfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2784 void *data
, asection
*input_section
, bfd
*output_bfd
,
2785 char **error_message
)
2787 /* This part is from bfd_elf_generic_reloc.
2788 If we're relocating, and this an external symbol, we don't want
2789 to change anything. */
2790 if (output_bfd
!= NULL
&& (symbol
->flags
& BSF_SECTION_SYM
) == 0
2791 && reloc_entry
->addend
== 0)
2793 reloc_entry
->address
+= input_section
->output_offset
;
2794 return bfd_reloc_ok
;
2797 if (nds32_hi20_list
!= NULL
)
2799 struct nds32_hi20
*l
;
2801 l
= nds32_hi20_list
;
2806 unsigned long vallo
;
2807 struct nds32_hi20
*next
;
2809 /* Do the HI20 relocation. Note that we actually don't need
2810 to know anything about the LO12 itself, except where to
2811 find the low 12 bits of the addend needed by the LO12. */
2812 insn
= bfd_getb32 (l
->addr
);
2813 vallo
= bfd_getb32 ((bfd_byte
*) data
+ reloc_entry
->address
);
2815 switch (reloc_entry
->howto
->type
)
2817 case R_NDS32_LO12S3
:
2821 case R_NDS32_LO12S2
:
2825 case R_NDS32_LO12S1
:
2829 case R_NDS32_LO12S0
:
2834 val
= ((insn
& 0xfffff) << 12) + vallo
;
2837 insn
= (insn
& ~(bfd_vma
) 0xfffff) | ((val
>> 12) & 0xfffff);
2838 bfd_putb32 ((bfd_vma
) insn
, l
->addr
);
2845 nds32_hi20_list
= NULL
;
2848 /* Now do the LO12 reloc in the usual way.
2849 ??? It would be nice to call bfd_elf_generic_reloc here,
2850 but we have partial_inplace set. bfd_elf_generic_reloc will
2851 pass the handling back to bfd_install_relocation which will install
2852 a section relative addend which is wrong. */
2853 return nds32_elf_generic_reloc (input_bfd
, reloc_entry
, symbol
, data
,
2854 input_section
, output_bfd
, error_message
);
2857 /* Do generic partial_inplace relocation.
2858 This is a local replacement for bfd_elf_generic_reloc. */
2860 static bfd_reloc_status_type
2861 nds32_elf_generic_reloc (bfd
*input_bfd
, arelent
*reloc_entry
,
2862 asymbol
*symbol
, void *data
, asection
*input_section
,
2863 bfd
*output_bfd
, char **error_message ATTRIBUTE_UNUSED
)
2865 bfd_reloc_status_type ret
;
2867 bfd_byte
*inplace_address
;
2869 /* This part is from bfd_elf_generic_reloc.
2870 If we're relocating, and this an external symbol, we don't want
2871 to change anything. */
2872 if (output_bfd
!= NULL
&& (symbol
->flags
& BSF_SECTION_SYM
) == 0
2873 && reloc_entry
->addend
== 0)
2875 reloc_entry
->address
+= input_section
->output_offset
;
2876 return bfd_reloc_ok
;
2879 /* Now do the reloc in the usual way.
2880 ??? It would be nice to call bfd_elf_generic_reloc here,
2881 but we have partial_inplace set. bfd_elf_generic_reloc will
2882 pass the handling back to bfd_install_relocation which will install
2883 a section relative addend which is wrong. */
2885 /* Sanity check the address (offset in section). */
2886 if (reloc_entry
->address
> bfd_get_section_limit (input_bfd
, input_section
))
2887 return bfd_reloc_outofrange
;
2890 if (bfd_is_und_section (symbol
->section
) && output_bfd
== (bfd
*) NULL
)
2891 ret
= bfd_reloc_undefined
;
2893 if (bfd_is_com_section (symbol
->section
) || output_bfd
!= (bfd
*) NULL
)
2896 relocation
= symbol
->value
;
2898 /* Only do this for a final link. */
2899 if (output_bfd
== (bfd
*) NULL
)
2901 relocation
+= symbol
->section
->output_section
->vma
;
2902 relocation
+= symbol
->section
->output_offset
;
2905 relocation
+= reloc_entry
->addend
;
2906 switch (reloc_entry
->howto
->type
)
2908 case R_NDS32_LO12S3
:
2912 case R_NDS32_LO12S2
:
2916 case R_NDS32_LO12S1
:
2920 case R_NDS32_LO12S0
:
2926 inplace_address
= (bfd_byte
*) data
+ reloc_entry
->address
;
2929 x = ((x & ~reloc_entry->howto->dst_mask) | \
2930 (((x & reloc_entry->howto->src_mask) + relocation) & \
2931 reloc_entry->howto->dst_mask))
2933 switch (reloc_entry
->howto
->size
)
2937 short x
= bfd_getb16 (inplace_address
);
2940 bfd_putb16 ((bfd_vma
) x
, inplace_address
);
2945 unsigned long x
= bfd_getb32 (inplace_address
);
2948 bfd_putb32 ((bfd_vma
) x
, inplace_address
);
2955 if (output_bfd
!= (bfd
*) NULL
)
2956 reloc_entry
->address
+= input_section
->output_offset
;
2961 /* Handle the R_NDS32_SDA15 reloc.
2962 This reloc is used to compute the address of objects in the small data area
2963 and to perform loads and stores from that area.
2964 The lower 15 bits are sign extended and added to the register specified
2965 in the instruction, which is assumed to point to _SDA_BASE_.
2967 Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on
2968 the access size, this must be taken care of. */
2970 static bfd_reloc_status_type
2971 nds32_elf_sda15_reloc (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc_entry
,
2972 asymbol
*symbol
, void *data ATTRIBUTE_UNUSED
,
2973 asection
*input_section
, bfd
*output_bfd
,
2974 char **error_message ATTRIBUTE_UNUSED
)
2976 /* This part is from bfd_elf_generic_reloc. */
2977 if (output_bfd
!= (bfd
*) NULL
2978 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
2979 && (!reloc_entry
->howto
->partial_inplace
|| reloc_entry
->addend
== 0))
2981 reloc_entry
->address
+= input_section
->output_offset
;
2982 return bfd_reloc_ok
;
2985 if (output_bfd
!= NULL
)
2987 /* FIXME: See bfd_perform_relocation. Is this right? */
2988 return bfd_reloc_continue
;
2991 /* FIXME: not sure what to do here yet. But then again, the linker
2992 may never call us. */
2996 /* nds32_elf_ignore_reloc is the special function for
2997 relocation types which don't need to be relocated
2998 like relaxation relocation types.
2999 This function simply return bfd_reloc_ok when it is
3002 static bfd_reloc_status_type
3003 nds32_elf_ignore_reloc (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc_entry
,
3004 asymbol
*symbol ATTRIBUTE_UNUSED
,
3005 void *data ATTRIBUTE_UNUSED
, asection
*input_section
,
3006 bfd
*output_bfd
, char **error_message ATTRIBUTE_UNUSED
)
3008 if (output_bfd
!= NULL
)
3009 reloc_entry
->address
+= input_section
->output_offset
;
3011 return bfd_reloc_ok
;
3015 /* Map BFD reloc types to NDS32 ELF reloc types. */
3017 struct nds32_reloc_map_entry
3019 bfd_reloc_code_real_type bfd_reloc_val
;
3020 unsigned char elf_reloc_val
;
3023 static const struct nds32_reloc_map_entry nds32_reloc_map
[] =
3025 {BFD_RELOC_NONE
, R_NDS32_NONE
},
3026 {BFD_RELOC_16
, R_NDS32_16_RELA
},
3027 {BFD_RELOC_32
, R_NDS32_32_RELA
},
3028 {BFD_RELOC_VTABLE_INHERIT
, R_NDS32_RELA_GNU_VTINHERIT
},
3029 {BFD_RELOC_VTABLE_ENTRY
, R_NDS32_RELA_GNU_VTENTRY
},
3031 {BFD_RELOC_NDS32_20
, R_NDS32_20_RELA
},
3032 {BFD_RELOC_NDS32_9_PCREL
, R_NDS32_9_PCREL_RELA
},
3033 {BFD_RELOC_NDS32_WORD_9_PCREL
, R_NDS32_WORD_9_PCREL_RELA
},
3034 {BFD_RELOC_NDS32_15_PCREL
, R_NDS32_15_PCREL_RELA
},
3035 {BFD_RELOC_NDS32_17_PCREL
, R_NDS32_17_PCREL_RELA
},
3036 {BFD_RELOC_NDS32_25_PCREL
, R_NDS32_25_PCREL_RELA
},
3037 {BFD_RELOC_NDS32_HI20
, R_NDS32_HI20_RELA
},
3038 {BFD_RELOC_NDS32_LO12S3
, R_NDS32_LO12S3_RELA
},
3039 {BFD_RELOC_NDS32_LO12S2
, R_NDS32_LO12S2_RELA
},
3040 {BFD_RELOC_NDS32_LO12S1
, R_NDS32_LO12S1_RELA
},
3041 {BFD_RELOC_NDS32_LO12S0
, R_NDS32_LO12S0_RELA
},
3042 {BFD_RELOC_NDS32_LO12S0_ORI
, R_NDS32_LO12S0_ORI_RELA
},
3043 {BFD_RELOC_NDS32_SDA15S3
, R_NDS32_SDA15S3_RELA
},
3044 {BFD_RELOC_NDS32_SDA15S2
, R_NDS32_SDA15S2_RELA
},
3045 {BFD_RELOC_NDS32_SDA15S1
, R_NDS32_SDA15S1_RELA
},
3046 {BFD_RELOC_NDS32_SDA15S0
, R_NDS32_SDA15S0_RELA
},
3047 {BFD_RELOC_NDS32_SDA16S3
, R_NDS32_SDA16S3_RELA
},
3048 {BFD_RELOC_NDS32_SDA17S2
, R_NDS32_SDA17S2_RELA
},
3049 {BFD_RELOC_NDS32_SDA18S1
, R_NDS32_SDA18S1_RELA
},
3050 {BFD_RELOC_NDS32_SDA19S0
, R_NDS32_SDA19S0_RELA
},
3051 {BFD_RELOC_NDS32_GOT20
, R_NDS32_GOT20
},
3052 {BFD_RELOC_NDS32_9_PLTREL
, R_NDS32_9_PLTREL
},
3053 {BFD_RELOC_NDS32_25_PLTREL
, R_NDS32_25_PLTREL
},
3054 {BFD_RELOC_NDS32_COPY
, R_NDS32_COPY
},
3055 {BFD_RELOC_NDS32_GLOB_DAT
, R_NDS32_GLOB_DAT
},
3056 {BFD_RELOC_NDS32_JMP_SLOT
, R_NDS32_JMP_SLOT
},
3057 {BFD_RELOC_NDS32_RELATIVE
, R_NDS32_RELATIVE
},
3058 {BFD_RELOC_NDS32_GOTOFF
, R_NDS32_GOTOFF
},
3059 {BFD_RELOC_NDS32_GOTOFF_HI20
, R_NDS32_GOTOFF_HI20
},
3060 {BFD_RELOC_NDS32_GOTOFF_LO12
, R_NDS32_GOTOFF_LO12
},
3061 {BFD_RELOC_NDS32_GOTPC20
, R_NDS32_GOTPC20
},
3062 {BFD_RELOC_NDS32_GOT_HI20
, R_NDS32_GOT_HI20
},
3063 {BFD_RELOC_NDS32_GOT_LO12
, R_NDS32_GOT_LO12
},
3064 {BFD_RELOC_NDS32_GOTPC_HI20
, R_NDS32_GOTPC_HI20
},
3065 {BFD_RELOC_NDS32_GOTPC_LO12
, R_NDS32_GOTPC_LO12
},
3066 {BFD_RELOC_NDS32_INSN16
, R_NDS32_INSN16
},
3067 {BFD_RELOC_NDS32_LABEL
, R_NDS32_LABEL
},
3068 {BFD_RELOC_NDS32_LONGCALL1
, R_NDS32_LONGCALL1
},
3069 {BFD_RELOC_NDS32_LONGCALL2
, R_NDS32_LONGCALL2
},
3070 {BFD_RELOC_NDS32_LONGCALL3
, R_NDS32_LONGCALL3
},
3071 {BFD_RELOC_NDS32_LONGJUMP1
, R_NDS32_LONGJUMP1
},
3072 {BFD_RELOC_NDS32_LONGJUMP2
, R_NDS32_LONGJUMP2
},
3073 {BFD_RELOC_NDS32_LONGJUMP3
, R_NDS32_LONGJUMP3
},
3074 {BFD_RELOC_NDS32_LOADSTORE
, R_NDS32_LOADSTORE
},
3075 {BFD_RELOC_NDS32_9_FIXED
, R_NDS32_9_FIXED_RELA
},
3076 {BFD_RELOC_NDS32_15_FIXED
, R_NDS32_15_FIXED_RELA
},
3077 {BFD_RELOC_NDS32_17_FIXED
, R_NDS32_17_FIXED_RELA
},
3078 {BFD_RELOC_NDS32_25_FIXED
, R_NDS32_25_FIXED_RELA
},
3079 {BFD_RELOC_NDS32_LONGCALL4
, R_NDS32_LONGCALL4
},
3080 {BFD_RELOC_NDS32_LONGCALL5
, R_NDS32_LONGCALL5
},
3081 {BFD_RELOC_NDS32_LONGCALL6
, R_NDS32_LONGCALL6
},
3082 {BFD_RELOC_NDS32_LONGJUMP4
, R_NDS32_LONGJUMP4
},
3083 {BFD_RELOC_NDS32_LONGJUMP5
, R_NDS32_LONGJUMP5
},
3084 {BFD_RELOC_NDS32_LONGJUMP6
, R_NDS32_LONGJUMP6
},
3085 {BFD_RELOC_NDS32_LONGJUMP7
, R_NDS32_LONGJUMP7
},
3086 {BFD_RELOC_NDS32_PLTREL_HI20
, R_NDS32_PLTREL_HI20
},
3087 {BFD_RELOC_NDS32_PLTREL_LO12
, R_NDS32_PLTREL_LO12
},
3088 {BFD_RELOC_NDS32_PLT_GOTREL_HI20
, R_NDS32_PLT_GOTREL_HI20
},
3089 {BFD_RELOC_NDS32_PLT_GOTREL_LO12
, R_NDS32_PLT_GOTREL_LO12
},
3090 {BFD_RELOC_NDS32_SDA12S2_DP
, R_NDS32_SDA12S2_DP_RELA
},
3091 {BFD_RELOC_NDS32_SDA12S2_SP
, R_NDS32_SDA12S2_SP_RELA
},
3092 {BFD_RELOC_NDS32_LO12S2_DP
, R_NDS32_LO12S2_DP_RELA
},
3093 {BFD_RELOC_NDS32_LO12S2_SP
, R_NDS32_LO12S2_SP_RELA
},
3094 {BFD_RELOC_NDS32_DWARF2_OP1
, R_NDS32_DWARF2_OP1_RELA
},
3095 {BFD_RELOC_NDS32_DWARF2_OP2
, R_NDS32_DWARF2_OP2_RELA
},
3096 {BFD_RELOC_NDS32_DWARF2_LEB
, R_NDS32_DWARF2_LEB_RELA
},
3097 {BFD_RELOC_NDS32_UPDATE_TA
, R_NDS32_UPDATE_TA_RELA
},
3098 {BFD_RELOC_NDS32_PLT_GOTREL_LO20
, R_NDS32_PLT_GOTREL_LO20
},
3099 {BFD_RELOC_NDS32_PLT_GOTREL_LO15
, R_NDS32_PLT_GOTREL_LO15
},
3100 {BFD_RELOC_NDS32_PLT_GOTREL_LO19
, R_NDS32_PLT_GOTREL_LO19
},
3101 {BFD_RELOC_NDS32_GOT_LO15
, R_NDS32_GOT_LO15
},
3102 {BFD_RELOC_NDS32_GOT_LO19
, R_NDS32_GOT_LO19
},
3103 {BFD_RELOC_NDS32_GOTOFF_LO15
, R_NDS32_GOTOFF_LO15
},
3104 {BFD_RELOC_NDS32_GOTOFF_LO19
, R_NDS32_GOTOFF_LO19
},
3105 {BFD_RELOC_NDS32_GOT15S2
, R_NDS32_GOT15S2_RELA
},
3106 {BFD_RELOC_NDS32_GOT17S2
, R_NDS32_GOT17S2_RELA
},
3107 {BFD_RELOC_NDS32_5
, R_NDS32_5_RELA
},
3108 {BFD_RELOC_NDS32_10_UPCREL
, R_NDS32_10_UPCREL_RELA
},
3109 {BFD_RELOC_NDS32_SDA_FP7U2_RELA
, R_NDS32_SDA_FP7U2_RELA
},
3110 {BFD_RELOC_NDS32_RELAX_ENTRY
, R_NDS32_RELAX_ENTRY
},
3111 {BFD_RELOC_NDS32_GOT_SUFF
, R_NDS32_GOT_SUFF
},
3112 {BFD_RELOC_NDS32_GOTOFF_SUFF
, R_NDS32_GOTOFF_SUFF
},
3113 {BFD_RELOC_NDS32_PLT_GOT_SUFF
, R_NDS32_PLT_GOT_SUFF
},
3114 {BFD_RELOC_NDS32_MULCALL_SUFF
, R_NDS32_MULCALL_SUFF
},
3115 {BFD_RELOC_NDS32_PTR
, R_NDS32_PTR
},
3116 {BFD_RELOC_NDS32_PTR_COUNT
, R_NDS32_PTR_COUNT
},
3117 {BFD_RELOC_NDS32_PTR_RESOLVED
, R_NDS32_PTR_RESOLVED
},
3118 {BFD_RELOC_NDS32_PLTBLOCK
, R_NDS32_PLTBLOCK
},
3119 {BFD_RELOC_NDS32_RELAX_REGION_BEGIN
, R_NDS32_RELAX_REGION_BEGIN
},
3120 {BFD_RELOC_NDS32_RELAX_REGION_END
, R_NDS32_RELAX_REGION_END
},
3121 {BFD_RELOC_NDS32_MINUEND
, R_NDS32_MINUEND
},
3122 {BFD_RELOC_NDS32_SUBTRAHEND
, R_NDS32_SUBTRAHEND
},
3123 {BFD_RELOC_NDS32_DIFF8
, R_NDS32_DIFF8
},
3124 {BFD_RELOC_NDS32_DIFF16
, R_NDS32_DIFF16
},
3125 {BFD_RELOC_NDS32_DIFF32
, R_NDS32_DIFF32
},
3126 {BFD_RELOC_NDS32_DIFF_ULEB128
, R_NDS32_DIFF_ULEB128
},
3127 {BFD_RELOC_NDS32_EMPTY
, R_NDS32_EMPTY
},
3128 {BFD_RELOC_NDS32_25_ABS
, R_NDS32_25_ABS_RELA
},
3129 {BFD_RELOC_NDS32_DATA
, R_NDS32_DATA
},
3130 {BFD_RELOC_NDS32_TRAN
, R_NDS32_TRAN
},
3131 {BFD_RELOC_NDS32_17IFC_PCREL
, R_NDS32_17IFC_PCREL_RELA
},
3132 {BFD_RELOC_NDS32_10IFCU_PCREL
, R_NDS32_10IFCU_PCREL_RELA
},
3134 {BFD_RELOC_NDS32_TPOFF
, R_NDS32_TLS_TPOFF
},
3135 /* Missing: BFD_RELOC_NDS32_GOTTPOFF. */
3136 {BFD_RELOC_NDS32_TLS_LE_HI20
, R_NDS32_TLS_LE_HI20
},
3137 {BFD_RELOC_NDS32_TLS_LE_LO12
, R_NDS32_TLS_LE_LO12
},
3138 {BFD_RELOC_NDS32_TLS_LE_20
, R_NDS32_TLS_LE_20
},
3139 {BFD_RELOC_NDS32_TLS_LE_15S0
, R_NDS32_TLS_LE_15S0
},
3140 {BFD_RELOC_NDS32_TLS_LE_15S1
, R_NDS32_TLS_LE_15S1
},
3141 {BFD_RELOC_NDS32_TLS_LE_15S2
, R_NDS32_TLS_LE_15S2
},
3142 {BFD_RELOC_NDS32_TLS_LE_ADD
, R_NDS32_TLS_LE_ADD
},
3143 {BFD_RELOC_NDS32_TLS_LE_LS
, R_NDS32_TLS_LE_LS
},
3144 {BFD_RELOC_NDS32_TLS_IE_HI20
, R_NDS32_TLS_IE_HI20
},
3145 {BFD_RELOC_NDS32_TLS_IE_LO12
, R_NDS32_TLS_IE_LO12
},
3146 {BFD_RELOC_NDS32_TLS_IE_LO12S2
, R_NDS32_TLS_IE_LO12S2
},
3147 {BFD_RELOC_NDS32_TLS_IEGP_HI20
, R_NDS32_TLS_IEGP_HI20
},
3148 {BFD_RELOC_NDS32_TLS_IEGP_LO12
, R_NDS32_TLS_IEGP_LO12
},
3149 {BFD_RELOC_NDS32_TLS_IEGP_LO12S2
, R_NDS32_TLS_IEGP_LO12S2
},
3150 {BFD_RELOC_NDS32_TLS_IEGP_LW
, R_NDS32_TLS_IEGP_LW
},
3151 {BFD_RELOC_NDS32_TLS_DESC
, R_NDS32_TLS_DESC
},
3152 {BFD_RELOC_NDS32_TLS_DESC_HI20
, R_NDS32_TLS_DESC_HI20
},
3153 {BFD_RELOC_NDS32_TLS_DESC_LO12
, R_NDS32_TLS_DESC_LO12
},
3154 {BFD_RELOC_NDS32_TLS_DESC_20
, R_NDS32_TLS_DESC_20
},
3155 {BFD_RELOC_NDS32_TLS_DESC_SDA17S2
, R_NDS32_TLS_DESC_SDA17S2
},
3156 {BFD_RELOC_NDS32_TLS_DESC_ADD
, R_NDS32_TLS_DESC_ADD
},
3157 {BFD_RELOC_NDS32_TLS_DESC_FUNC
, R_NDS32_TLS_DESC_FUNC
},
3158 {BFD_RELOC_NDS32_TLS_DESC_CALL
, R_NDS32_TLS_DESC_CALL
},
3159 {BFD_RELOC_NDS32_TLS_DESC_MEM
, R_NDS32_TLS_DESC_MEM
},
3160 {BFD_RELOC_NDS32_REMOVE
, R_NDS32_RELAX_REMOVE
},
3161 {BFD_RELOC_NDS32_GROUP
, R_NDS32_RELAX_GROUP
},
3162 {BFD_RELOC_NDS32_LSI
, R_NDS32_LSI
},
3167 static reloc_howto_type
*
3168 bfd_elf32_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
3173 for (i
= 0; i
< ARRAY_SIZE (nds32_elf_howto_table
); i
++)
3174 if (nds32_elf_howto_table
[i
].name
!= NULL
3175 && strcasecmp (nds32_elf_howto_table
[i
].name
, r_name
) == 0)
3176 return &nds32_elf_howto_table
[i
];
3178 for (i
= 0; i
< ARRAY_SIZE (nds32_elf_relax_howto_table
); i
++)
3179 if (nds32_elf_relax_howto_table
[i
].name
!= NULL
3180 && strcasecmp (nds32_elf_relax_howto_table
[i
].name
, r_name
) == 0)
3181 return &nds32_elf_relax_howto_table
[i
];
3186 static reloc_howto_type
*
3187 bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code
)
3189 if (code
< R_NDS32_RELAX_ENTRY
)
3191 BFD_ASSERT (code
< ARRAY_SIZE (nds32_elf_howto_table
));
3192 return &nds32_elf_howto_table
[code
];
3196 if ((size_t) (code
- R_NDS32_RELAX_ENTRY
)
3197 >= ARRAY_SIZE (nds32_elf_relax_howto_table
))
3203 BFD_ASSERT ((size_t) (code
- R_NDS32_RELAX_ENTRY
)
3204 < ARRAY_SIZE (nds32_elf_relax_howto_table
));
3205 return &nds32_elf_relax_howto_table
[code
- R_NDS32_RELAX_ENTRY
];
3209 static reloc_howto_type
*
3210 bfd_elf32_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
3211 bfd_reloc_code_real_type code
)
3215 for (i
= 0; i
< ARRAY_SIZE (nds32_reloc_map
); i
++)
3217 if (nds32_reloc_map
[i
].bfd_reloc_val
== code
)
3218 return bfd_elf32_bfd_reloc_type_table_lookup
3219 (nds32_reloc_map
[i
].elf_reloc_val
);
3225 /* Set the howto pointer for an NDS32 ELF reloc. */
3228 nds32_info_to_howto_rel (bfd
*abfd
, arelent
*cache_ptr
,
3229 Elf_Internal_Rela
*dst
)
3231 enum elf_nds32_reloc_type r_type
;
3233 r_type
= ELF32_R_TYPE (dst
->r_info
);
3234 if (r_type
> R_NDS32_GNU_VTENTRY
)
3236 /* xgettext:c-format */
3237 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3239 bfd_set_error (bfd_error_bad_value
);
3243 BFD_ASSERT (ELF32_R_TYPE (dst
->r_info
) <= R_NDS32_GNU_VTENTRY
);
3244 cache_ptr
->howto
= bfd_elf32_bfd_reloc_type_table_lookup (r_type
);
3249 nds32_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
3250 Elf_Internal_Rela
*dst
)
3252 unsigned int r_type
= ELF32_R_TYPE (dst
->r_info
);
3254 if ((r_type
== R_NDS32_NONE
)
3255 || ((r_type
> R_NDS32_GNU_VTENTRY
)
3256 && (r_type
< R_NDS32_max
)))
3258 cache_ptr
->howto
= bfd_elf32_bfd_reloc_type_table_lookup (r_type
);
3262 /* xgettext:c-format */
3263 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd
, r_type
);
3264 bfd_set_error (bfd_error_bad_value
);
3268 /* Support for core dump NOTE sections.
3269 Reference to include/linux/elfcore.h in Linux. */
3272 nds32_elf_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
3277 switch (note
->descsz
)
3280 /* Linux/NDS32 32-bit, ABI1. */
3283 elf_tdata (abfd
)->core
->signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
3286 elf_tdata (abfd
)->core
->pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
3294 /* Linux/NDS32 32-bit. */
3297 elf_tdata (abfd
)->core
->signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
3300 elf_tdata (abfd
)->core
->pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
3311 /* Make a ".reg" section. */
3312 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
3313 size
, note
->descpos
+ offset
);
3317 nds32_elf_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
3319 switch (note
->descsz
)
3324 /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform. */
3325 elf_tdata (abfd
)->core
->program
=
3326 _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
3327 elf_tdata (abfd
)->core
->command
=
3328 _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
3335 /* Note that for some reason, a spurious space is tacked
3336 onto the end of the args in some (at least one anyway)
3337 implementations, so strip it off if it exists. */
3339 char *command
= elf_tdata (abfd
)->core
->command
;
3340 int n
= strlen (command
);
3342 if (0 < n
&& command
[n
- 1] == ' ')
3343 command
[n
- 1] = '\0';
3349 /* Hook called by the linker routine which adds symbols from an object
3350 file. We must handle the special NDS32 section numbers here.
3351 We also keep watching for whether we need to create the sdata special
3355 nds32_elf_add_symbol_hook (bfd
*abfd
,
3356 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3357 Elf_Internal_Sym
*sym
,
3358 const char **namep ATTRIBUTE_UNUSED
,
3359 flagword
*flagsp ATTRIBUTE_UNUSED
,
3360 asection
**secp
, bfd_vma
*valp
)
3362 switch (sym
->st_shndx
)
3365 /* Common symbols less than the GP size are automatically
3366 treated as SHN_MIPS_SCOMMON symbols. */
3367 if (sym
->st_size
> elf_gp_size (abfd
)
3368 || ELF_ST_TYPE (sym
->st_info
) == STT_TLS
)
3371 /* st_value is the alignment constraint.
3372 That might be its actual size if it is an array or structure. */
3373 switch (sym
->st_value
)
3376 *secp
= bfd_make_section_old_way (abfd
, ".scommon_b");
3379 *secp
= bfd_make_section_old_way (abfd
, ".scommon_h");
3382 *secp
= bfd_make_section_old_way (abfd
, ".scommon_w");
3385 *secp
= bfd_make_section_old_way (abfd
, ".scommon_d");
3391 (*secp
)->flags
|= SEC_IS_COMMON
| SEC_SMALL_DATA
;
3392 *valp
= sym
->st_size
;
3399 /* This function can figure out the best location for a base register to access
3400 data relative to this base register
3402 sda_d0: size of first DOUBLE WORD data section
3403 sda_w0: size of first WORD data section
3404 sda_h0: size of first HALF WORD data section
3405 sda_b : size of BYTE data section
3406 sda_hi: size of second HALF WORD data section
3407 sda_w1: size of second WORD data section
3408 sda_d1: size of second DOUBLE WORD data section
3410 offset (always positive) from the beginning of sda_d0 if OK
3411 a negative error value if fail
3413 these 7 sections have to be located back to back if exist
3414 a pass in 0 value for non-existing section */
3416 /* Due to the interpretation of simm15 field of load/store depending on
3417 data accessing size, the organization of base register relative data shall
3418 like the following figure
3419 -------------------------------------------
3420 | DOUBLE WORD sized data (range +/- 128K)
3421 -------------------------------------------
3422 | WORD sized data (range +/- 64K)
3423 -------------------------------------------
3424 | HALF WORD sized data (range +/- 32K)
3425 -------------------------------------------
3426 | BYTE sized data (range +/- 16K)
3427 -------------------------------------------
3428 | HALF WORD sized data (range +/- 32K)
3429 -------------------------------------------
3430 | WORD sized data (range +/- 64K)
3431 -------------------------------------------
3432 | DOUBLE WORD sized data (range +/- 128K)
3433 -------------------------------------------
3434 Its base register shall be set to access these data freely. */
3436 /* We have to figure out the SDA_BASE value, so that we can adjust the
3437 symbol value correctly. We look up the symbol _SDA_BASE_ in the output
3438 BFD. If we can't find it, we're stuck. We cache it in the ELF
3439 target data. We don't need to adjust the symbol value for an
3440 external symbol if we are producing relocatable output. */
3442 static asection
*sda_rela_sec
= NULL
;
3444 #define SDA_SECTION_NUM 10
3446 static bfd_reloc_status_type
3447 nds32_elf_final_sda_base (bfd
* output_bfd
,
3448 struct bfd_link_info
* info
,
3450 bfd_boolean add_symbol
)
3453 struct elf_nds32_link_hash_table
*table
;
3454 struct bfd_link_hash_entry
*h
, *h2
;
3455 long unsigned int total
= 0;
3456 asection
*first
= NULL
, *final
= NULL
, *temp
;
3457 bfd_vma sda_base
= 0;
3459 h
= bfd_link_hash_lookup (info
->hash
, "_SDA_BASE_", FALSE
, FALSE
, TRUE
);
3460 if (!h
|| (h
->type
!= bfd_link_hash_defined
3461 && h
->type
!= bfd_link_hash_defweak
))
3463 /* The first section must be 4-byte aligned to promise _SDA_BASE_ being
3464 4 byte-aligned. Therefore, it has to set the first section ".data"
3466 static const char sec_name
[SDA_SECTION_NUM
][10] =
3468 ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
3469 ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
3473 if (output_bfd
->sections
== NULL
)
3475 *psb
= elf_gp (output_bfd
);
3476 return bfd_reloc_ok
;
3479 /* Get the first and final section. */
3480 while (i
< ARRAY_SIZE (sec_name
))
3482 temp
= bfd_get_section_by_name (output_bfd
, sec_name
[i
]);
3483 if (temp
&& !first
&& (temp
->size
!= 0 || temp
->rawsize
!= 0))
3485 if (temp
&& (temp
->size
!= 0 || temp
->rawsize
!= 0))
3488 /* Summarize the sections in order to check if joining .bss. */
3489 if (temp
&& temp
->size
!= 0)
3490 total
+= temp
->size
;
3491 else if (temp
&& temp
->rawsize
!= 0)
3492 total
+= temp
->rawsize
;
3497 /* Check .bss size. */
3498 temp
= bfd_get_section_by_name (output_bfd
, ".bss");
3501 if (temp
->size
!= 0)
3502 total
+= temp
->size
;
3503 else if (temp
->rawsize
!= 0)
3504 total
+= temp
->rawsize
;
3506 if (total
< 0x80000)
3508 if (!first
&& (temp
->size
!= 0 || temp
->rawsize
!= 0))
3510 if ((temp
->size
!= 0 || temp
->rawsize
!= 0))
3517 /* The middle of data region. */
3518 sda_base
= final
->vma
/ 2 + final
->rawsize
/ 2 + first
->vma
/ 2;
3520 /* Find the section sda_base located. */
3522 while (i
< ARRAY_SIZE (sec_name
))
3524 final
= bfd_get_section_by_name (output_bfd
, sec_name
[i
]);
3525 if (final
&& (final
->size
!= 0 || final
->rawsize
!= 0)
3526 && sda_base
>= final
->vma
)
3537 /* If there is not any default data section in output bfd, try to find
3538 the first data section. If no data section be found, just simplily
3539 choose the first output section. */
3540 temp
= output_bfd
->sections
;
3543 if (temp
->flags
& SEC_ALLOC
3544 && (((temp
->flags
& SEC_DATA
)
3545 && ((temp
->flags
& SEC_READONLY
) == 0))
3546 || (temp
->flags
& SEC_LOAD
) == 0)
3547 && (temp
->size
!= 0 || temp
->rawsize
!= 0))
3556 /* There is no data or bss section. */
3557 if (!first
|| (first
->size
== 0 && first
->rawsize
== 0))
3559 first
= output_bfd
->sections
;
3560 while (first
&& first
->size
== 0 && first
->rawsize
== 0)
3561 first
= first
->next
;
3564 /* There is no concrete section. */
3567 *psb
= elf_gp (output_bfd
);
3568 return bfd_reloc_ok
;
3571 if (final
&& (final
->vma
+ final
->rawsize
- first
->vma
) <= 0x4000)
3572 sda_base
= final
->vma
/ 2 + final
->rawsize
/ 2 + first
->vma
/ 2;
3574 sda_base
= first
->vma
+ 0x2000;
3577 sda_base
-= first
->vma
;
3578 sda_base
= sda_base
& (~7);
3580 if (!_bfd_generic_link_add_one_symbol
3581 (info
, output_bfd
, "_SDA_BASE_", BSF_GLOBAL
| BSF_WEAK
, first
,
3582 (bfd_vma
) sda_base
, (const char *) NULL
, FALSE
,
3583 get_elf_backend_data (output_bfd
)->collect
, &h
))
3586 sda_rela_sec
= first
;
3589 /* Set _FP_BASE_ to _SDA_BASE_. */
3590 table
= nds32_elf_hash_table (info
);
3591 relax_fp_as_gp
= table
->relax_fp_as_gp
;
3592 h2
= bfd_link_hash_lookup (info
->hash
, FP_BASE_NAME
, FALSE
, FALSE
, FALSE
);
3593 /* _SDA_BASE_ is difined in linker script. */
3596 first
= h
->u
.def
.section
;
3597 sda_base
= h
->u
.def
.value
;
3600 if (relax_fp_as_gp
&& h2
3601 && (h2
->type
== bfd_link_hash_undefweak
3602 || h2
->type
== bfd_link_hash_undefined
))
3604 /* Define a weak FP_BASE_NAME here to prevent the undefined symbol.
3605 And set FP equal to SDA_BASE to do relaxation for
3606 la $fp, _FP_BASE_. */
3607 if (!_bfd_generic_link_add_one_symbol
3608 (info
, output_bfd
, FP_BASE_NAME
, BSF_GLOBAL
| BSF_WEAK
,
3609 first
, sda_base
, (const char *) NULL
,
3610 FALSE
, get_elf_backend_data (output_bfd
)->collect
, &h2
))
3619 elf_gp (output_bfd
) = (h
->u
.def
.value
3620 + h
->u
.def
.section
->output_section
->vma
3621 + h
->u
.def
.section
->output_offset
);
3625 _bfd_error_handler (_("error: can't find symbol: %s"), "_SDA_BASE_");
3626 return bfd_reloc_dangerous
;
3630 *psb
= h
->u
.def
.value
3631 + h
->u
.def
.section
->output_section
->vma
3632 + h
->u
.def
.section
->output_offset
;
3633 return bfd_reloc_ok
;
3637 /* Return size of a PLT entry. */
3638 #define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
3640 /* Create an entry in an nds32 ELF linker hash table. */
3642 static struct bfd_hash_entry
*
3643 nds32_elf_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3644 struct bfd_hash_table
*table
,
3647 struct elf_nds32_link_hash_entry
*ret
;
3649 ret
= (struct elf_nds32_link_hash_entry
*) entry
;
3651 /* Allocate the structure if it has not already been allocated by a
3654 ret
= (struct elf_nds32_link_hash_entry
*)
3655 bfd_hash_allocate (table
, sizeof (struct elf_nds32_link_hash_entry
));
3658 return (struct bfd_hash_entry
*) ret
;
3660 /* Call the allocation method of the superclass. */
3661 ret
= (struct elf_nds32_link_hash_entry
*)
3662 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
);
3666 struct elf_nds32_link_hash_entry
*eh
;
3668 eh
= (struct elf_nds32_link_hash_entry
*) ret
;
3669 eh
->tls_type
= GOT_UNKNOWN
;
3670 eh
->offset_to_gp
= 0;
3673 return (struct bfd_hash_entry
*) ret
;
3676 /* Create an nds32 ELF linker hash table. */
3678 static struct bfd_link_hash_table
*
3679 nds32_elf_link_hash_table_create (bfd
*abfd
)
3681 struct elf_nds32_link_hash_table
*ret
;
3683 size_t amt
= sizeof (struct elf_nds32_link_hash_table
);
3685 ret
= (struct elf_nds32_link_hash_table
*) bfd_zmalloc (amt
);
3690 if (!_bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
3691 nds32_elf_link_hash_newfunc
,
3692 sizeof (struct elf_nds32_link_hash_entry
),
3699 ret
->sym_ld_script
= NULL
;
3701 return &ret
->root
.root
;
3704 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3705 shortcuts to them in our hash table. */
3708 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
3710 struct elf_link_hash_table
*ehtab
;
3712 if (!_bfd_elf_create_got_section (dynobj
, info
))
3715 ehtab
= elf_hash_table (info
);
3716 ehtab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
3717 ehtab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
3718 if (!ehtab
->sgot
|| !ehtab
->sgotplt
)
3721 /* _bfd_elf_create_got_section will create it for us. */
3722 ehtab
->srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
3723 if (ehtab
->srelgot
== NULL
3724 || !bfd_set_section_flags (ehtab
->srelgot
,
3725 (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
3726 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
3728 || !bfd_set_section_alignment (ehtab
->srelgot
, 2))
3734 /* Create dynamic sections when linking against a dynamic object. */
3737 nds32_elf_create_dynamic_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3739 struct elf_link_hash_table
*ehtab
;
3740 struct elf_nds32_link_hash_table
*htab
;
3741 flagword flags
, pltflags
;
3742 register asection
*s
;
3743 const struct elf_backend_data
*bed
;
3744 int ptralign
= 2; /* 32-bit */
3745 const char *secname
;
3750 bed
= get_elf_backend_data (abfd
);
3751 ehtab
= elf_hash_table (info
);
3752 htab
= nds32_elf_hash_table (info
);
3754 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3755 .rel[a].bss sections. */
3757 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
3758 | SEC_LINKER_CREATED
);
3761 pltflags
|= SEC_CODE
;
3762 if (bed
->plt_not_loaded
)
3763 pltflags
&= ~(SEC_LOAD
| SEC_HAS_CONTENTS
);
3764 if (bed
->plt_readonly
)
3765 pltflags
|= SEC_READONLY
;
3767 s
= bfd_make_section (abfd
, ".plt");
3770 || !bfd_set_section_flags (s
, pltflags
)
3771 || !bfd_set_section_alignment (s
, bed
->plt_alignment
))
3774 if (bed
->want_plt_sym
)
3776 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3778 struct bfd_link_hash_entry
*bh
= NULL
;
3779 struct elf_link_hash_entry
*h
;
3781 if (!(_bfd_generic_link_add_one_symbol
3782 (info
, abfd
, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL
, s
,
3783 (bfd_vma
) 0, (const char *) NULL
, FALSE
,
3784 get_elf_backend_data (abfd
)->collect
, &bh
)))
3787 h
= (struct elf_link_hash_entry
*) bh
;
3789 h
->type
= STT_OBJECT
;
3791 if (bfd_link_pic (info
) && !bfd_elf_link_record_dynamic_symbol (info
, h
))
3795 s
= bfd_make_section (abfd
,
3796 bed
->default_use_rela_p
? ".rela.plt" : ".rel.plt");
3799 || !bfd_set_section_flags (s
, flags
| SEC_READONLY
)
3800 || !bfd_set_section_alignment (s
, ptralign
))
3803 if (ehtab
->sgot
== NULL
&& !create_got_section (abfd
, info
))
3806 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3808 secflags
= bfd_section_flags (sec
);
3809 if ((secflags
& (SEC_DATA
| SEC_LINKER_CREATED
))
3810 || ((secflags
& SEC_HAS_CONTENTS
) != SEC_HAS_CONTENTS
))
3812 secname
= bfd_section_name (sec
);
3813 relname
= (char *) bfd_malloc ((bfd_size_type
) strlen (secname
) + 6);
3814 strcpy (relname
, ".rela");
3815 strcat (relname
, secname
);
3816 if (bfd_get_section_by_name (abfd
, secname
))
3818 s
= bfd_make_section (abfd
, relname
);
3820 || !bfd_set_section_flags (s
, flags
| SEC_READONLY
)
3821 || !bfd_set_section_alignment (s
, ptralign
))
3825 if (bed
->want_dynbss
)
3827 /* The .dynbss section is a place to put symbols which are defined
3828 by dynamic objects, are referenced by regular objects, and are
3829 not functions. We must allocate space for them in the process
3830 image and use a R_*_COPY reloc to tell the dynamic linker to
3831 initialize them at run time. The linker script puts the .dynbss
3832 section into the .bss section of the final image. */
3833 s
= bfd_make_section (abfd
, ".dynbss");
3834 htab
->root
.sdynbss
= s
;
3836 || !bfd_set_section_flags (s
, SEC_ALLOC
| SEC_LINKER_CREATED
))
3838 /* The .rel[a].bss section holds copy relocs. This section is not
3839 normally needed. We need to create it here, though, so that the
3840 linker will map it to an output section. We can't just create it
3841 only if we need it, because we will not know whether we need it
3842 until we have seen all the input files, and the first time the
3843 main linker code calls BFD after examining all the input files
3844 (size_dynamic_sections) the input sections have already been
3845 mapped to the output sections. If the section turns out not to
3846 be needed, we can discard it later. We will never need this
3847 section when generating a shared object, since they do not use
3849 if (!bfd_link_pic (info
))
3851 s
= bfd_make_section (abfd
, (bed
->default_use_rela_p
3852 ? ".rela.bss" : ".rel.bss"));
3853 htab
->root
.srelbss
= s
;
3855 || !bfd_set_section_flags (s
, flags
| SEC_READONLY
)
3856 || !bfd_set_section_alignment (s
, ptralign
))
3864 /* Copy the extra info we tack onto an elf_link_hash_entry. */
3866 nds32_elf_copy_indirect_symbol (struct bfd_link_info
*info
,
3867 struct elf_link_hash_entry
*dir
,
3868 struct elf_link_hash_entry
*ind
)
3870 struct elf_nds32_link_hash_entry
*edir
, *eind
;
3872 edir
= (struct elf_nds32_link_hash_entry
*) dir
;
3873 eind
= (struct elf_nds32_link_hash_entry
*) ind
;
3875 if (ind
->root
.type
== bfd_link_hash_indirect
)
3877 if (dir
->got
.refcount
<= 0)
3879 edir
->tls_type
= eind
->tls_type
;
3880 eind
->tls_type
= GOT_UNKNOWN
;
3884 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
3887 /* Adjust a symbol defined by a dynamic object and referenced by a
3888 regular object. The current definition is in some section of the
3889 dynamic object, but we're not including those sections. We have to
3890 change the definition to something the rest of the link can
3894 nds32_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
3895 struct elf_link_hash_entry
*h
)
3897 struct elf_nds32_link_hash_table
*htab
;
3900 unsigned int power_of_two
;
3902 dynobj
= elf_hash_table (info
)->dynobj
;
3904 /* Make sure we know what is going on here. */
3905 BFD_ASSERT (dynobj
!= NULL
3908 || (h
->def_dynamic
&& h
->ref_regular
&& !h
->def_regular
)));
3911 /* If this is a function, put it in the procedure linkage table. We
3912 will fill in the contents of the procedure linkage table later,
3913 when we know the address of the .got section. */
3914 if (h
->type
== STT_FUNC
|| h
->needs_plt
)
3916 if (!bfd_link_pic (info
)
3919 && h
->root
.type
!= bfd_link_hash_undefweak
3920 && h
->root
.type
!= bfd_link_hash_undefined
)
3922 /* This case can occur if we saw a PLT reloc in an input
3923 file, but the symbol was never referred to by a dynamic
3924 object. In such a case, we don't actually need to build
3925 a procedure linkage table, and we can just do a PCREL
3927 h
->plt
.offset
= (bfd_vma
) - 1;
3934 h
->plt
.offset
= (bfd_vma
) - 1;
3936 /* If this is a weak symbol, and there is a real definition, the
3937 processor independent code will have arranged for us to see the
3938 real definition first, and we can just use the same value. */
3939 if (h
->is_weakalias
)
3941 struct elf_link_hash_entry
*def
= weakdef (h
);
3942 BFD_ASSERT (def
->root
.type
== bfd_link_hash_defined
);
3943 h
->root
.u
.def
.section
= def
->root
.u
.def
.section
;
3944 h
->root
.u
.def
.value
= def
->root
.u
.def
.value
;
3948 /* This is a reference to a symbol defined by a dynamic object which
3949 is not a function. */
3951 /* If we are creating a shared library, we must presume that the
3952 only references to the symbol are via the global offset table.
3953 For such cases we need not do anything here; the relocations will
3954 be handled correctly by relocate_section. */
3955 if (bfd_link_pic (info
))
3958 /* If there are no references to this symbol that do not use the
3959 GOT, we don't need to generate a copy reloc. */
3960 if (!h
->non_got_ref
)
3963 /* If -z nocopyreloc was given, we won't generate them either. */
3964 if (0 && info
->nocopyreloc
)
3970 /* If we don't find any dynamic relocs in read-only sections, then
3971 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
3972 if (!_bfd_elf_readonly_dynrelocs (h
))
3978 /* We must allocate the symbol in our .dynbss section, which will
3979 become part of the .bss section of the executable. There will be
3980 an entry for this symbol in the .dynsym section. The dynamic
3981 object will contain position independent code, so all references
3982 from the dynamic object to this symbol will go through the global
3983 offset table. The dynamic linker will use the .dynsym entry to
3984 determine the address it must put in the global offset table, so
3985 both the dynamic object and the regular object will refer to the
3986 same memory location for the variable. */
3988 htab
= nds32_elf_hash_table (info
);
3989 s
= htab
->root
.sdynbss
;
3990 BFD_ASSERT (s
!= NULL
);
3992 /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
3993 to copy the initial value out of the dynamic object and into the
3994 runtime process image. We need to remember the offset into the
3995 .rela.bss section we are going to use. */
3996 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
4000 srel
= htab
->root
.srelbss
;
4001 BFD_ASSERT (srel
!= NULL
);
4002 srel
->size
+= sizeof (Elf32_External_Rela
);
4006 /* We need to figure out the alignment required for this symbol. I
4007 have no idea how ELF linkers handle this. */
4008 power_of_two
= bfd_log2 (h
->size
);
4009 if (power_of_two
> 3)
4012 /* Apply the required alignment. */
4013 s
->size
= BFD_ALIGN (s
->size
, (bfd_size_type
) (1 << power_of_two
));
4014 if (power_of_two
> bfd_section_alignment (s
))
4016 if (!bfd_set_section_alignment (s
, power_of_two
))
4020 /* Define the symbol as being at this point in the section. */
4021 h
->root
.u
.def
.section
= s
;
4022 h
->root
.u
.def
.value
= s
->size
;
4024 /* Increment the section size to make room for the symbol. */
4030 /* Allocate space in .plt, .got and associated reloc sections for
4034 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
4036 struct bfd_link_info
*info
;
4037 struct elf_link_hash_table
*ehtab
;
4038 struct elf_nds32_link_hash_table
*htab
;
4039 struct elf_dyn_relocs
*p
;
4041 if (h
->root
.type
== bfd_link_hash_indirect
)
4044 /* When warning symbols are created, they **replace** the "real"
4045 entry in the hash table, thus we never get to see the real
4046 symbol in a hash traversal. So look at it now. */
4047 if (h
->root
.type
== bfd_link_hash_warning
)
4048 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4050 info
= (struct bfd_link_info
*) inf
;
4051 ehtab
= elf_hash_table (info
);
4052 htab
= nds32_elf_hash_table (info
);
4056 if ((htab
->root
.dynamic_sections_created
|| h
->type
== STT_GNU_IFUNC
)
4057 && h
->plt
.refcount
> 0
4058 && !(bfd_link_pie (info
) && h
->def_regular
))
4060 /* Make sure this symbol is output as a dynamic symbol.
4061 Undefined weak syms won't yet be marked as dynamic. */
4062 if (h
->dynindx
== -1 && !h
->forced_local
)
4064 if (!bfd_elf_link_record_dynamic_symbol (info
, h
))
4068 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info
), h
))
4070 asection
*s
= ehtab
->splt
;
4072 /* If this is the first .plt entry, make room for the special
4075 s
->size
+= PLT_ENTRY_SIZE
;
4077 h
->plt
.offset
= s
->size
;
4079 /* If this symbol is not defined in a regular file, and we are
4080 not generating a shared library, then set the symbol to this
4081 location in the .plt. This is required to make function
4082 pointers compare as equal between the normal executable and
4083 the shared library. */
4084 if (!bfd_link_pic (info
) && !h
->def_regular
)
4086 h
->root
.u
.def
.section
= s
;
4087 h
->root
.u
.def
.value
= h
->plt
.offset
;
4090 /* Make room for this entry. */
4091 s
->size
+= PLT_ENTRY_SIZE
;
4093 /* We also need to make an entry in the .got.plt section, which
4094 will be placed in the .got section by the linker script. */
4095 ehtab
->sgotplt
->size
+= 4;
4097 /* We also need to make an entry in the .rel.plt section. */
4098 ehtab
->srelplt
->size
+= sizeof (Elf32_External_Rela
);
4099 if (htab
->tls_desc_trampoline
)
4100 htab
->next_tls_desc_index
++;
4104 h
->plt
.offset
= (bfd_vma
) - 1;
4110 h
->plt
.offset
= (bfd_vma
) - 1;
4114 if (h
->got
.refcount
> 0)
4118 int tls_type
= elf32_nds32_hash_entry (h
)->tls_type
;
4120 /* Make sure this symbol is output as a dynamic symbol.
4121 Undefined weak syms won't yet be marked as dynamic. */
4122 if (h
->dynindx
== -1 && !h
->forced_local
)
4124 if (!bfd_elf_link_record_dynamic_symbol (info
, h
))
4128 sgot
= elf_hash_table (info
)->sgot
;
4129 h
->got
.offset
= sgot
->size
;
4131 if (tls_type
== GOT_UNKNOWN
)
4134 /* Non-TLS symbols, and TLS_IE need one GOT slot. */
4135 if (tls_type
& (GOT_NORMAL
| GOT_TLS_IE
| GOT_TLS_IEGP
))
4139 /* TLS_DESC, TLS_GD, and TLS_LD need 2 consecutive GOT slots. */
4140 if (tls_type
& GOT_TLS_DESC
)
4144 dyn
= htab
->root
.dynamic_sections_created
;
4146 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, bfd_link_pic (info
), h
))
4148 if (tls_type
== GOT_TLS_DESC
&& htab
->tls_desc_trampoline
)
4150 /* TLS_DESC with trampoline needs a relocation slot
4151 within .rela.plt. */
4152 htab
->num_tls_desc
++;
4153 ehtab
->srelplt
->size
+= sizeof (Elf32_External_Rela
);
4154 htab
->tls_trampoline
= -1;
4158 /* other relocations, including TLS_DESC without trampoline, need
4159 a relocation slot within .rela.got. */
4160 ehtab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4165 h
->got
.offset
= (bfd_vma
)-1;
4167 if (h
->dyn_relocs
== NULL
)
4170 /* In the shared -Bsymbolic case, discard space allocated for
4171 dynamic pc-relative relocs against symbols which turn out to be
4172 defined in regular objects. For the normal shared case, discard
4173 space for pc-relative relocs that have become local due to symbol
4174 visibility changes. */
4176 if (bfd_link_pic (info
))
4178 if (h
->def_regular
&& (h
->forced_local
|| info
->symbolic
))
4180 struct elf_dyn_relocs
**pp
;
4182 for (pp
= &h
->dyn_relocs
; (p
= *pp
) != NULL
;)
4184 p
->count
-= p
->pc_count
;
4195 /* For the non-shared case, discard space for relocs against
4196 symbols which turn out to need copy relocs or are not dynamic. */
4201 || (htab
->root
.dynamic_sections_created
4202 && (h
->root
.type
== bfd_link_hash_undefweak
4203 || h
->root
.type
== bfd_link_hash_undefined
))))
4205 /* Make sure this symbol is output as a dynamic symbol.
4206 Undefined weak syms won't yet be marked as dynamic. */
4207 if (h
->dynindx
== -1 && !h
->forced_local
)
4209 if (!bfd_elf_link_record_dynamic_symbol (info
, h
))
4213 /* If that succeeded, we know we'll be keeping all the
4215 if (h
->dynindx
!= -1)
4219 h
->dyn_relocs
= NULL
;
4224 /* Finally, allocate space. */
4225 for (p
= h
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4227 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
4228 sreloc
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
4234 /* Add relocation REL to the end of relocation section SRELOC. */
4237 elf32_nds32_add_dynreloc (bfd
*output_bfd
,
4238 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
4239 asection
*sreloc
, Elf_Internal_Rela
*rel
)
4245 loc
= sreloc
->contents
;
4246 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4247 if (sreloc
->reloc_count
* sizeof (Elf32_External_Rela
) > sreloc
->size
)
4250 bfd_elf32_swap_reloca_out (output_bfd
, rel
, loc
);
4253 /* Set the sizes of the dynamic sections. */
4256 nds32_elf_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
4257 struct bfd_link_info
*info
)
4259 struct elf_nds32_link_hash_table
*htab
;
4265 htab
= nds32_elf_hash_table (info
);
4269 dynobj
= elf_hash_table (info
)->dynobj
;
4270 BFD_ASSERT (dynobj
!= NULL
);
4272 if (elf_hash_table (info
)->dynamic_sections_created
)
4274 /* Set the contents of the .interp section to the interpreter. */
4275 if (bfd_link_executable (info
) && !info
->nointerp
)
4277 s
= bfd_get_section_by_name (dynobj
, ".interp");
4278 BFD_ASSERT (s
!= NULL
);
4279 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
4280 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
4284 /* Set up .got offsets for local syms, and space for local dynamic
4286 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
4288 bfd_signed_vma
*local_got
;
4289 bfd_signed_vma
*end_local_got
;
4290 bfd_size_type locsymcount
;
4291 Elf_Internal_Shdr
*symtab_hdr
;
4293 char *local_tls_type
;
4294 unsigned long symndx
;
4295 bfd_vma
*local_tlsdesc_gotent
;
4297 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
4300 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
4302 struct elf_dyn_relocs
*p
;
4304 for (p
= ((struct elf_dyn_relocs
*)
4305 elf_section_data (s
)->local_dynrel
);
4306 p
!= NULL
; p
= p
->next
)
4308 if (!bfd_is_abs_section (p
->sec
)
4309 && bfd_is_abs_section (p
->sec
->output_section
))
4311 /* Input section has been discarded, either because
4312 it is a copy of a linkonce section or due to
4313 linker script /DISCARD/, so we'll be discarding
4316 else if (p
->count
!= 0)
4318 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
4319 sreloc
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
4320 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
4321 info
->flags
|= DF_TEXTREL
;
4326 local_got
= elf_local_got_refcounts (ibfd
);
4330 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
4331 locsymcount
= symtab_hdr
->sh_info
;
4332 end_local_got
= local_got
+ locsymcount
;
4333 sgot
= elf_hash_table (info
)->sgot
;
4334 local_tls_type
= elf32_nds32_local_got_tls_type (ibfd
);
4335 local_tlsdesc_gotent
= elf32_nds32_local_tlsdesc_gotent (ibfd
);
4336 for (symndx
= 0; local_got
< end_local_got
;
4337 ++local_got
, ++local_tls_type
, ++local_tlsdesc_gotent
, ++symndx
)
4341 int num_of_got_entry_needed
= 0;
4342 *local_got
= sgot
->size
;
4343 *local_tlsdesc_gotent
= sgot
->size
;
4345 /* TLS_NORMAL, and TLS_IE need one slot in .got. */
4346 if (*local_tls_type
& (GOT_NORMAL
| GOT_TLS_IE
| GOT_TLS_IEGP
))
4347 num_of_got_entry_needed
= 1;
4348 /* TLS_GD, TLS_LD, and TLS_DESC need an 8-byte structure in the GOT. */
4349 else if (*local_tls_type
& GOT_TLS_DESC
)
4350 num_of_got_entry_needed
= 2;
4352 sgot
->size
+= (num_of_got_entry_needed
<< 2);
4354 /* non-relax-able TLS_DESCs need a slot in .rela.plt.
4355 others need a slot in .rela.got. */
4356 if (*local_tls_type
== GOT_TLS_DESC
)
4358 if (bfd_link_pic (info
))
4360 if (htab
->tls_desc_trampoline
)
4362 htab
->num_tls_desc
++;
4363 htab
->root
.srelplt
->size
+= sizeof (Elf32_External_Rela
);
4364 htab
->tls_trampoline
= -1;
4367 htab
->root
.srelgot
->size
+= sizeof (Elf32_External_Rela
);
4371 /* TLS_DESC -> TLS_LE */
4376 htab
->root
.srelgot
->size
+= sizeof (Elf32_External_Rela
);
4381 *local_got
= (bfd_vma
) -1;
4382 *local_tlsdesc_gotent
= (bfd_vma
) -1;
4387 /* Allocate global sym .plt and .got entries, and space for global
4388 sym dynamic relocs. */
4389 elf_link_hash_traverse (&htab
->root
, allocate_dynrelocs
, (void *) info
);
4391 /* For every jump slot reserved in the sgotplt, reloc_count is
4392 incremented. However, when we reserve space for TLS descriptors,
4393 it's not incremented, so in order to compute the space reserved
4394 for them, it suffices to multiply the reloc count by the jump
4396 if (htab
->tls_desc_trampoline
&& htab
->root
.srelplt
)
4397 htab
->sgotplt_jump_table_size
= elf32_nds32_compute_jump_table_size (htab
);
4399 if (htab
->tls_trampoline
)
4401 htab
->tls_trampoline
= htab
->root
.splt
->size
;
4403 /* If we're not using lazy TLS relocations, don't generate the
4404 PLT and GOT entries they require. */
4405 if ((info
->flags
& DF_BIND_NOW
))
4406 htab
->root
.tlsdesc_plt
= 0;
4409 htab
->root
.tlsdesc_got
= htab
->root
.sgot
->size
;
4410 htab
->root
.sgot
->size
+= 4;
4412 htab
->root
.tlsdesc_plt
= htab
->root
.splt
->size
;
4413 htab
->root
.splt
->size
+= 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline
);
4417 /* We now have determined the sizes of the various dynamic sections.
4418 Allocate memory for them. */
4419 /* The check_relocs and adjust_dynamic_symbol entry points have
4420 determined the sizes of the various dynamic sections. Allocate
4423 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
4425 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
4428 if (s
== htab
->root
.splt
)
4430 /* Strip this section if we don't need it; see the
4434 else if (s
== elf_hash_table (info
)->sgot
)
4436 got_size
+= s
->size
;
4438 else if (s
== elf_hash_table (info
)->sgotplt
)
4440 got_size
+= s
->size
;
4442 else if (strncmp (bfd_section_name (s
), ".rela", 5) == 0)
4444 if (s
->size
!= 0 && s
!= elf_hash_table (info
)->srelplt
)
4447 /* We use the reloc_count field as a counter if we need
4448 to copy relocs into the output file. */
4453 /* It's not one of our sections, so don't allocate space. */
4459 /* If we don't need this section, strip it from the
4460 output file. This is mostly to handle .rela.bss and
4461 .rela.plt. We must create both sections in
4462 create_dynamic_sections, because they must be created
4463 before the linker maps input sections to output
4464 sections. The linker does that before
4465 adjust_dynamic_symbol is called, and it is that
4466 function which decides whether anything needs to go
4467 into these sections. */
4468 s
->flags
|= SEC_EXCLUDE
;
4472 /* Allocate memory for the section contents. We use bfd_zalloc
4473 here in case unused entries are not reclaimed before the
4474 section's contents are written out. This should not happen,
4475 but this way if it does, we get a R_NDS32_NONE reloc instead
4477 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
4478 if (s
->contents
== NULL
)
4482 return _bfd_elf_add_dynamic_tags (output_bfd
, info
, relocs
);
4485 static bfd_reloc_status_type
4486 nds32_relocate_contents (reloc_howto_type
*howto
, bfd
*input_bfd
,
4487 bfd_vma relocation
, bfd_byte
*location
)
4491 bfd_reloc_status_type flag
;
4492 unsigned int rightshift
= howto
->rightshift
;
4493 unsigned int bitpos
= howto
->bitpos
;
4496 relocation
= -relocation
;
4498 /* Get the value we are going to relocate. */
4499 size
= bfd_get_reloc_size (howto
);
4506 return bfd_reloc_ok
;
4508 x
= bfd_getb16 (location
);
4511 x
= bfd_getb32 (location
);
4515 /* Check for overflow. FIXME: We may drop bits during the addition
4516 which we don't check for. We must either check at every single
4517 operation, which would be tedious, or we must do the computations
4518 in a type larger than bfd_vma, which would be inefficient. */
4519 flag
= bfd_reloc_ok
;
4520 if (howto
->complain_on_overflow
!= complain_overflow_dont
)
4522 bfd_vma addrmask
, fieldmask
, signmask
, ss
;
4525 /* Get the values to be added together. For signed and unsigned
4526 relocations, we assume that all values should be truncated to
4527 the size of an address. For bitfields, all the bits matter.
4528 See also bfd_check_overflow. */
4529 fieldmask
= N_ONES (howto
->bitsize
);
4530 signmask
= ~fieldmask
;
4531 addrmask
= N_ONES (bfd_arch_bits_per_address (input_bfd
)) | fieldmask
;
4532 a
= (relocation
& addrmask
) >> rightshift
;
4533 b
= (x
& howto
->src_mask
& addrmask
) >> bitpos
;
4535 switch (howto
->complain_on_overflow
)
4537 case complain_overflow_signed
:
4538 /* If any sign bits are set, all sign bits must be set.
4539 That is, A must be a valid negative address after
4541 signmask
= ~(fieldmask
>> 1);
4544 case complain_overflow_bitfield
:
4545 /* Much like the signed check, but for a field one bit
4546 wider. We allow a bitfield to represent numbers in the
4547 range -2**n to 2**n-1, where n is the number of bits in the
4548 field. Note that when bfd_vma is 32 bits, a 32-bit reloc
4549 can't overflow, which is exactly what we want. */
4551 if (ss
!= 0 && ss
!= ((addrmask
>> rightshift
) & signmask
))
4552 flag
= bfd_reloc_overflow
;
4554 /* We only need this next bit of code if the sign bit of B
4555 is below the sign bit of A. This would only happen if
4556 SRC_MASK had fewer bits than BITSIZE. Note that if
4557 SRC_MASK has more bits than BITSIZE, we can get into
4558 trouble; we would need to verify that B is in range, as
4559 we do for A above. */
4560 ss
= ((~howto
->src_mask
) >> 1) & howto
->src_mask
;
4563 /* Set all the bits above the sign bit. */
4566 /* Now we can do the addition. */
4569 /* See if the result has the correct sign. Bits above the
4570 sign bit are junk now; ignore them. If the sum is
4571 positive, make sure we did not have all negative inputs;
4572 if the sum is negative, make sure we did not have all
4573 positive inputs. The test below looks only at the sign
4574 bits, and it really just
4575 SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
4577 We mask with addrmask here to explicitly allow an address
4578 wrap-around. The Linux kernel relies on it, and it is
4579 the only way to write assembler code which can run when
4580 loaded at a location 0x80000000 away from the location at
4581 which it is linked. */
4582 if (((~(a
^ b
)) & (a
^ sum
)) & signmask
& addrmask
)
4583 flag
= bfd_reloc_overflow
;
4587 case complain_overflow_unsigned
:
4588 /* Checking for an unsigned overflow is relatively easy:
4589 trim the addresses and add, and trim the result as well.
4590 Overflow is normally indicated when the result does not
4591 fit in the field. However, we also need to consider the
4592 case when, e.g., fieldmask is 0x7fffffff or smaller, an
4593 input is 0x80000000, and bfd_vma is only 32 bits; then we
4594 will get sum == 0, but there is an overflow, since the
4595 inputs did not fit in the field. Instead of doing a
4596 separate test, we can check for this by or-ing in the
4597 operands when testing for the sum overflowing its final
4599 sum
= (a
+ b
) & addrmask
;
4600 if ((a
| b
| sum
) & signmask
)
4601 flag
= bfd_reloc_overflow
;
4609 /* Put RELOCATION in the right bits. */
4610 relocation
>>= (bfd_vma
) rightshift
;
4611 relocation
<<= (bfd_vma
) bitpos
;
4613 /* Add RELOCATION to the right bits of X. */
4615 Because the relaxation may generate duplicate relocation at one address,
4616 an addition to immediate in the instruction may cause the relocation added
4618 This bug should be fixed in assembler, but a check is also needed here. */
4619 if (howto
->partial_inplace
)
4620 x
= ((x
& ~howto
->dst_mask
)
4621 | (((x
& howto
->src_mask
) + relocation
) & howto
->dst_mask
));
4623 x
= ((x
& ~howto
->dst_mask
) | ((relocation
) & howto
->dst_mask
));
4626 /* Put the relocated value back in the object file. */
4636 bfd_putb16 (x
, location
);
4639 bfd_putb32 (x
, location
);
4646 static bfd_reloc_status_type
4647 nds32_elf_final_link_relocate (reloc_howto_type
*howto
, bfd
*input_bfd
,
4648 asection
*input_section
, bfd_byte
*contents
,
4649 bfd_vma address
, bfd_vma value
, bfd_vma addend
)
4653 /* Sanity check the address. */
4654 if (address
> bfd_get_section_limit (input_bfd
, input_section
))
4655 return bfd_reloc_outofrange
;
4657 /* This function assumes that we are dealing with a basic relocation
4658 against a symbol. We want to compute the value of the symbol to
4659 relocate to. This is just VALUE, the value of the symbol, plus
4660 ADDEND, any addend associated with the reloc. */
4661 relocation
= value
+ addend
;
4663 /* If the relocation is PC relative, we want to set RELOCATION to
4664 the distance between the symbol (currently in RELOCATION) and the
4665 location we are relocating. If pcrel_offset is FALSE we do not
4666 need to subtract out the offset of the location within the
4667 section (which is just ADDRESS). */
4668 if (howto
->pc_relative
)
4670 relocation
-= (input_section
->output_section
->vma
4671 + input_section
->output_offset
);
4672 if (howto
->pcrel_offset
)
4673 relocation
-= address
;
4676 return nds32_relocate_contents (howto
, input_bfd
, relocation
,
4677 contents
+ address
);
4681 nds32_elf_output_symbol_hook (struct bfd_link_info
*info
,
4683 Elf_Internal_Sym
*elfsym ATTRIBUTE_UNUSED
,
4684 asection
*input_sec
,
4685 struct elf_link_hash_entry
*h ATTRIBUTE_UNUSED
)
4688 FILE *sym_ld_script
= NULL
;
4689 struct elf_nds32_link_hash_table
*table
;
4691 table
= nds32_elf_hash_table (info
);
4692 sym_ld_script
= table
->sym_ld_script
;
4696 if (!h
|| !name
|| *name
== '\0')
4699 if (input_sec
->flags
& SEC_EXCLUDE
)
4702 if (!check_start_export_sym
)
4704 fprintf (sym_ld_script
, "SECTIONS\n{\n");
4705 check_start_export_sym
= 1;
4708 if (h
->root
.type
== bfd_link_hash_defined
4709 || h
->root
.type
== bfd_link_hash_defweak
)
4711 if (!h
->root
.u
.def
.section
->output_section
)
4714 if (bfd_is_const_section (input_sec
))
4715 source
= input_sec
->name
;
4717 source
= bfd_get_filename (input_sec
->owner
);
4719 fprintf (sym_ld_script
, "\t%s = 0x%08lx;\t /* %s */\n",
4720 h
->root
.root
.string
,
4721 (long) (h
->root
.u
.def
.value
4722 + h
->root
.u
.def
.section
->output_section
->vma
4723 + h
->root
.u
.def
.section
->output_offset
), source
);
4729 /* Relocate an NDS32/D ELF section.
4730 There is some attempt to make this function usable for many architectures,
4731 both for RELA and REL type relocs, if only to serve as a learning tool.
4733 The RELOCATE_SECTION function is called by the new ELF backend linker
4734 to handle the relocations for a section.
4736 The relocs are always passed as Rela structures; if the section
4737 actually uses Rel structures, the r_addend field will always be
4740 This function is responsible for adjust the section contents as
4741 necessary, and (if using Rela relocs and generating a
4742 relocatable output file) adjusting the reloc addend as
4745 This function does not have to worry about setting the reloc
4746 address or the reloc symbol index.
4748 LOCAL_SYMS is a pointer to the swapped in local symbols.
4750 LOCAL_SECTIONS is an array giving the section in the input file
4751 corresponding to the st_shndx field of each local symbol.
4753 The global hash table entry for the global symbols can be found
4754 via elf_sym_hashes (input_bfd).
4756 When generating relocatable output, this function must handle
4757 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
4758 going to be the section symbol corresponding to the output
4759 section, which means that the addend must be adjusted
4762 /* Return the base VMA address which should be subtracted from real addresses
4763 when resolving @dtpoff relocation.
4764 This is PT_TLS segment p_vaddr. */
4766 /* Return the relocation value for @tpoff relocation
4767 if STT_TLS virtual address is ADDRESS. */
4769 /* Return the relocation value for @gottpoff relocation
4770 if STT_TLS virtual address is ADDRESS. */
4773 gottpoff (struct bfd_link_info
*info
, bfd_vma address
)
4778 /* If tls_sec is NULL, we should have signalled an error already. */
4779 if (elf_hash_table (info
)->tls_sec
== NULL
)
4782 tp_base
= elf_hash_table (info
)->tls_sec
->vma
;
4783 tp_offset
= address
- tp_base
;
4789 patch_tls_desc_to_ie (bfd_byte
*contents
, Elf_Internal_Rela
*rel
, bfd
*ibfd
)
4791 /* TLS_GD/TLS_LD model #1
4792 46 00 00 00 sethi $r0,#0x0
4793 58 00 00 00 ori $r0,$r0,#0x0
4794 40 00 74 00 add $r0,$r0,$gp
4795 04 10 00 00 lwi $r1,[$r0+#0x0]
4796 4b e0 04 01 jral $lp,$r1 */
4798 /* TLS_GD/TLS_LD model #2
4799 46 00 00 00 sethi $r0,#0x0
4800 58 00 00 00 ori $r0,$r0,#0x0
4801 38 10 74 02 lw $r1,[$r0+($gp<<#0x0)]
4802 40 00 74 00 add $r0,$r0,$gp
4803 4b e0 04 01 jral $lp,$r1 */
4805 /* TLS_IE model (non-PIC)
4806 46 00 00 00 sethi $r0,#0x0
4807 04 00 00 00 lwi $r0,[$r0+#0x0]
4808 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */
4810 /* TLS_IE model (PIC)
4811 46 00 00 00 sethi $r0,#0x0
4812 58 00 00 00 ori $r0,$r0,#0x0
4813 38 00 74 02 lw $r0,[$r0+($gp<<#0x0)]
4814 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */
4816 /* TLS_GD_TO_IE model
4817 46 00 00 00 sethi $r0,#0x0
4818 58 00 00 00 ori $r0,$r0,#0x0
4819 40 00 74 00 add $r0,$rM,$gp
4820 04 00 00 01 lwi $r0,[$r0+#0x4]
4821 40 00 64 00 add $r0,$r0,$r25 */
4823 bfd_boolean rz
= FALSE
;
4833 0x40007400, /* add $r0,$rM,$gp */
4834 0x04000001, /* lwi $r0,[$r0+#0x4] */
4835 0x40006400, /* add $r0,$r0,$r25 */
4840 { 0x40000000, 0xfe0003ff },
4841 { 0x04000000, 0xfe000000 },
4842 { 0x4be00001, 0xffff83ff },
4847 { 0x38007402, 0xfe007fff },
4848 { 0x40007400, 0xfe007fff },
4849 { 0x4be00001, 0xffff83ff },
4852 unsigned char *p
= contents
+ rel
->r_offset
;
4855 uint32_t regidx
= 0;
4856 insn
= bfd_getb32 (p
);
4857 if (INSN_SETHI
== (0xfe0fffffu
& insn
))
4859 regidx
= 0x1f & (insn
>> 20);
4863 insn
= bfd_getb32 (p
);
4864 if (INSN_ORI
== (0xfe007fffu
& insn
))
4866 regidx
= 0x1f & (insn
>> 20);
4870 if (patch
[2] == bfd_getb32 (p
+ 8)) /* Character instruction. */
4872 /* already patched? */
4873 if ((patch
[0] == (0xfff07fffu
& bfd_getb32 (p
+ 0))) &&
4874 (patch
[1] == bfd_getb32 (p
+ 4)))
4877 else if (mode0
[0].opcode
== (mode0
[0].mask
& bfd_getb32 (p
+ 0)))
4879 if ((mode0
[1].opcode
== (mode0
[1].mask
& bfd_getb32 (p
+ 4))) &&
4880 (mode0
[2].opcode
== (mode0
[2].mask
& bfd_getb32 (p
+ 8))))
4882 bfd_putb32 (patch
[0] | (regidx
<< 15), p
+ 0);
4883 bfd_putb32 (patch
[1], p
+ 4);
4884 bfd_putb32 (patch
[2], p
+ 8);
4888 else if (mode1
[0].opcode
== (mode1
[0].mask
& bfd_getb32 (p
+ 0)))
4890 if ((mode1
[1].opcode
== (mode1
[1].mask
& bfd_getb32 (p
+ 4))) &&
4891 (mode1
[2].opcode
== (mode1
[2].mask
& bfd_getb32 (p
+ 8))))
4893 bfd_putb32 (patch
[0] | (regidx
<< 15), p
+ 0);
4894 bfd_putb32 (patch
[1], p
+ 4);
4895 bfd_putb32 (patch
[2], p
+ 8);
4902 printf ("%s: %s @ 0x%08x\n", __func__
, bfd_get_filename (ibfd
),
4903 (int) rel
->r_offset
);
4904 BFD_ASSERT(0); /* Unsupported pattern. */
4910 static enum elf_nds32_tls_type
4911 get_tls_type (enum elf_nds32_reloc_type r_type
, struct elf_link_hash_entry
*h
);
4914 ones32 (register unsigned int x
)
4916 /* 32-bit recursive reduction using SWAR...
4917 but first step is mapping 2-bit values
4918 into sum of 2 1-bit values in sneaky way. */
4919 x
-= ((x
>> 1) & 0x55555555);
4920 x
= (((x
>> 2) & 0x33333333) + (x
& 0x33333333));
4921 x
= (((x
>> 4) + x
) & 0x0f0f0f0f);
4924 return (x
& 0x0000003f);
4929 fls (register unsigned int x
)
4931 return ffs (x
& (-x
));
4933 #endif /* !HAVE_FLS */
4935 #define nds32_elf_local_tlsdesc_gotent(bfd) \
4936 (elf_nds32_tdata (bfd)->local_tlsdesc_gotent)
4939 nds32_elf_relocate_section (bfd
* output_bfd ATTRIBUTE_UNUSED
,
4940 struct bfd_link_info
* info
,
4942 asection
* input_section
,
4943 bfd_byte
* contents
,
4944 Elf_Internal_Rela
* relocs
,
4945 Elf_Internal_Sym
* local_syms
,
4946 asection
** local_sections
)
4948 Elf_Internal_Shdr
*symtab_hdr
;
4949 struct elf_link_hash_entry
**sym_hashes
;
4950 Elf_Internal_Rela
*rel
, *relend
;
4951 bfd_boolean ret
= TRUE
; /* Assume success. */
4953 bfd_reloc_status_type r
;
4954 const char *errmsg
= NULL
;
4956 struct elf_link_hash_table
*ehtab
;
4957 struct elf_nds32_link_hash_table
*htab
;
4959 bfd_vma
*local_got_offsets
;
4960 asection
*sgot
, *splt
, *sreloc
;
4961 bfd_vma high_address
;
4962 struct elf_nds32_link_hash_table
*table
;
4963 int eliminate_gc_relocs
;
4964 bfd_vma fpbase_addr
;
4966 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4967 sym_hashes
= elf_sym_hashes (input_bfd
);
4968 ehtab
= elf_hash_table (info
);
4969 htab
= nds32_elf_hash_table (info
);
4970 high_address
= bfd_get_section_limit (input_bfd
, input_section
);
4972 dynobj
= htab
->root
.dynobj
;
4973 local_got_offsets
= elf_local_got_offsets (input_bfd
);
4980 relend
= relocs
+ input_section
->reloc_count
;
4982 table
= nds32_elf_hash_table (info
);
4983 eliminate_gc_relocs
= table
->eliminate_gc_relocs
;
4985 /* By this time, we can adjust the value of _SDA_BASE_. */
4986 /* Explain _SDA_BASE_ */
4987 if ((!bfd_link_relocatable (info
)))
4989 is_SDA_BASE_set
= 1;
4990 r
= nds32_elf_final_sda_base (output_bfd
, info
, &gp
, TRUE
);
4991 if (r
!= bfd_reloc_ok
)
4995 /* Do TLS model conversion once at first. */
4996 nds32_elf_unify_tls_model (input_bfd
, input_section
, contents
, info
);
4998 /* Use gp as fp to prevent truncated fit. Because in relaxation time
4999 the fp value is set as gp, and it has be reverted for instruction
5001 fpbase_addr
= elf_gp (output_bfd
);
5003 /* Deal with (dynamic) relocations. */
5004 for (rel
= relocs
; rel
< relend
; rel
++)
5006 enum elf_nds32_reloc_type r_type
;
5007 reloc_howto_type
*howto
= NULL
;
5008 unsigned long r_symndx
;
5009 struct elf_link_hash_entry
*h
= NULL
;
5010 Elf_Internal_Sym
*sym
= NULL
;
5013 bfd_vma relocation_sym
= 0xdeadbeef;
5014 Elf_Internal_Rela
*lorel
;
5017 /* We can't modify r_addend here as elf_link_input_bfd has an assert to
5018 ensure it's zero (we use REL relocs, not RELA). Therefore this
5019 should be assigning zero to `addend', but for clarity we use
5022 bfd_vma addend
= rel
->r_addend
;
5023 bfd_vma offset
= rel
->r_offset
;
5025 r_type
= ELF32_R_TYPE (rel
->r_info
);
5026 if (r_type
>= R_NDS32_max
)
5028 /* xgettext:c-format */
5029 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
5031 bfd_set_error (bfd_error_bad_value
);
5036 if (r_type
== R_NDS32_GNU_VTENTRY
5037 || r_type
== R_NDS32_GNU_VTINHERIT
5038 || r_type
== R_NDS32_NONE
5039 || r_type
== R_NDS32_RELA_GNU_VTENTRY
5040 || r_type
== R_NDS32_RELA_GNU_VTINHERIT
5041 || (r_type
>= R_NDS32_INSN16
&& r_type
<= R_NDS32_25_FIXED_RELA
)
5042 || r_type
== R_NDS32_DATA
5043 || r_type
== R_NDS32_TRAN
)
5046 /* If we enter the fp-as-gp region. Resolve the address
5048 if (ELF32_R_TYPE (rel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
5049 && (rel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
5053 /* Distance to relocation of best fp-base is encoded in R_SYM. */
5054 dist
= rel
->r_addend
>> 16;
5055 fpbase_addr
= calculate_memory_address (input_bfd
, rel
+ dist
,
5056 local_syms
, symtab_hdr
);
5058 else if (ELF32_R_TYPE (rel
->r_info
) == R_NDS32_RELAX_REGION_END
5059 && (rel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
5061 fpbase_addr
= elf_gp (output_bfd
);
5064 /* Skip the relocations used for relaxation. */
5065 /* We have to update LONGCALL and LONGJUMP
5066 relocations when generating the relocatable files. */
5067 if (!bfd_link_relocatable (info
)
5068 && (r_type
>= R_NDS32_RELAX_ENTRY
5069 || (r_type
>= R_NDS32_LONGCALL4
5070 && r_type
<= R_NDS32_LONGJUMP7
)))
5073 howto
= bfd_elf32_bfd_reloc_type_table_lookup (r_type
);
5074 r_symndx
= ELF32_R_SYM (rel
->r_info
);
5076 /* This is a final link. */
5081 if (r_symndx
< symtab_hdr
->sh_info
)
5084 sym
= local_syms
+ r_symndx
;
5085 sec
= local_sections
[r_symndx
];
5087 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
5088 addend
= rel
->r_addend
;
5090 /* keep symbol location for static TLS_IE GOT entry */
5091 relocation_sym
= relocation
;
5092 if (bfd_link_relocatable (info
))
5094 /* This is a relocatable link. We don't have to change
5095 anything, unless the reloc is against a section symbol,
5096 in which case we have to adjust according to where the
5097 section symbol winds up in the output section. */
5098 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
5099 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
5106 /* External symbol. */
5107 if (bfd_link_relocatable (info
))
5109 bfd_boolean warned
, ignored
, unresolved_reloc
;
5110 int symndx
= r_symndx
- symtab_hdr
->sh_info
;
5112 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
5113 r_symndx
, symtab_hdr
, sym_hashes
, h
, sec
,
5114 relocation
, unresolved_reloc
, warned
,
5117 /* keep symbol location for static TLS_IE GOT entry */
5118 relocation_sym
= relocation
;
5120 /* la $fp, _FP_BASE_ is per-function (region).
5121 Handle it specially. */
5122 switch ((int) r_type
)
5124 case R_NDS32_HI20_RELA
:
5125 case R_NDS32_LO12S0_RELA
:
5126 if (strcmp (elf_sym_hashes (input_bfd
)[symndx
]->root
.root
.string
,
5129 if (!bfd_link_pie (info
))
5132 ("%pB: warning: _FP_BASE_ setting insns relaxation failed.",
5135 relocation
= fpbase_addr
;
5138 case R_NDS32_SDA19S0_RELA
:
5139 case R_NDS32_SDA15S0_RELA
:
5140 case R_NDS32_20_RELA
:
5141 if (strcmp (elf_sym_hashes (input_bfd
)[symndx
]->root
.root
.string
,
5144 relocation
= fpbase_addr
;
5150 /* Sanity check the address. */
5151 if (offset
> high_address
)
5153 r
= bfd_reloc_outofrange
;
5157 if (r_type
>= R_NDS32_RELAX_ENTRY
)
5160 switch ((int) r_type
)
5162 case R_NDS32_GOTOFF
:
5163 /* Relocation is relative to the start of the global offset
5164 table (for ld24 rx, #uimm24), e.g. access at label+addend
5166 ld24 rx. #label@GOTOFF + addend
5168 case R_NDS32_GOTOFF_HI20
:
5169 case R_NDS32_GOTOFF_LO12
:
5170 case R_NDS32_GOTOFF_LO15
:
5171 case R_NDS32_GOTOFF_LO19
:
5172 BFD_ASSERT (sgot
!= NULL
);
5174 relocation
-= elf_gp (output_bfd
);
5177 case R_NDS32_9_PLTREL
:
5178 case R_NDS32_25_PLTREL
:
5179 /* Relocation is to the entry for this symbol in the
5180 procedure linkage table. */
5182 /* The native assembler will generate a 25_PLTREL reloc
5183 for a local symbol if you assemble a call from one
5184 section to another when using -K pic. */
5188 if (h
->forced_local
)
5191 /* We didn't make a PLT entry for this symbol. This
5192 happens when statically linking PIC code, or when
5193 using -Bsymbolic. */
5194 if (h
->plt
.offset
== (bfd_vma
) - 1)
5197 relocation
= (splt
->output_section
->vma
5198 + splt
->output_offset
+ h
->plt
.offset
);
5201 case R_NDS32_PLT_GOTREL_HI20
:
5202 case R_NDS32_PLT_GOTREL_LO12
:
5203 case R_NDS32_PLT_GOTREL_LO15
:
5204 case R_NDS32_PLT_GOTREL_LO19
:
5205 case R_NDS32_PLT_GOTREL_LO20
:
5208 || h
->plt
.offset
== (bfd_vma
) -1
5209 || (bfd_link_pie (info
) && h
->def_regular
))
5211 /* Maybe we should find better checking to optimize
5212 PIE PLT relocations. */
5213 /* We didn't make a PLT entry for this symbol. This
5214 happens when statically linking PIC code, or when
5215 using -Bsymbolic. */
5217 h
->plt
.offset
= (bfd_vma
) -1; /* Cancel PLT trampoline. */
5218 relocation
-= elf_gp (output_bfd
);
5222 relocation
= (splt
->output_section
->vma
5223 + splt
->output_offset
+ h
->plt
.offset
);
5225 relocation
-= elf_gp (output_bfd
);
5228 case R_NDS32_PLTREL_HI20
:
5229 case R_NDS32_PLTREL_LO12
:
5231 /* Relocation is to the entry for this symbol in the
5232 procedure linkage table. */
5234 /* The native assembler will generate a 25_PLTREL reloc
5235 for a local symbol if you assemble a call from one
5236 section to another when using -K pic. */
5240 if (h
->forced_local
)
5243 if (h
->plt
.offset
== (bfd_vma
) - 1)
5244 /* We didn't make a PLT entry for this symbol. This
5245 happens when statically linking PIC code, or when
5246 using -Bsymbolic. */
5252 relocation
= (splt
->output_section
->vma
5253 + splt
->output_offset
5254 + h
->plt
.offset
+ 4)
5255 - (input_section
->output_section
->vma
5256 + input_section
->output_offset
5261 case R_NDS32_GOTPC20
:
5262 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
5263 ld24 rx,#_GLOBAL_OFFSET_TABLE_ */
5264 relocation
= elf_gp (output_bfd
);
5267 case R_NDS32_GOTPC_HI20
:
5268 case R_NDS32_GOTPC_LO12
:
5269 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
5271 seth rx,#high(_GLOBAL_OFFSET_TABLE_)
5272 or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
5275 seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
5276 add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4) */
5277 relocation
= elf_gp (output_bfd
);
5278 relocation
-= (input_section
->output_section
->vma
5279 + input_section
->output_offset
+ rel
->r_offset
);
5284 case R_NDS32_GOT_HI20
:
5285 case R_NDS32_GOT_LO12
:
5286 case R_NDS32_GOT_LO15
:
5287 case R_NDS32_GOT_LO19
:
5288 /* Relocation is to the entry for this symbol in the global
5290 BFD_ASSERT (sgot
!= NULL
);
5294 /* External symbol */
5297 off
= h
->got
.offset
;
5298 BFD_ASSERT (off
!= (bfd_vma
) - 1);
5299 dyn
= htab
->root
.dynamic_sections_created
;
5300 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
,
5301 bfd_link_pic (info
),
5303 || (bfd_link_pic (info
)
5306 || h
->forced_local
) && h
->def_regular
))
5308 /* This is actually a static link, or it is a
5309 -Bsymbolic link and the symbol is defined
5310 locally, or the symbol was forced to be local
5311 because of a version file. We must initialize
5312 this entry in the global offset table. Since the
5313 offset must always be a multiple of 4, we use the
5314 least significant bit to record whether we have
5315 initialized it already.
5317 When doing a dynamic link, we create a .rela.got
5318 relocation entry to initialize the value. This
5319 is done in the finish_dynamic_symbol routine. */
5320 if ((off
& 1) != 0) /* clear LSB */
5324 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
5328 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
5329 - elf_gp (output_bfd
);
5336 BFD_ASSERT (local_got_offsets
!= NULL
5337 && local_got_offsets
[r_symndx
] != (bfd_vma
) - 1);
5339 off
= local_got_offsets
[r_symndx
];
5341 /* The offset must always be a multiple of 4. We use
5342 the least significant bit to record whether we have
5343 already processed this entry. */
5344 if ((off
& 1) != 0) /* clear LSB */
5348 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
5350 if (bfd_link_pic (info
))
5353 Elf_Internal_Rela outrel
;
5355 /* We need to generate a R_NDS32_RELATIVE reloc
5356 for the dynamic linker. */
5357 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
5358 BFD_ASSERT (srelgot
!= NULL
);
5360 outrel
.r_offset
= (elf_gp (output_bfd
)
5361 + sgot
->output_offset
+ off
);
5362 outrel
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
5363 outrel
.r_addend
= relocation
;
5364 loc
= srelgot
->contents
;
5366 srelgot
->reloc_count
* sizeof (Elf32_External_Rela
);
5367 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5368 ++srelgot
->reloc_count
;
5370 local_got_offsets
[r_symndx
] |= 1;
5372 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
5373 - elf_gp (output_bfd
);
5378 case R_NDS32_16_RELA
:
5379 case R_NDS32_20_RELA
:
5380 case R_NDS32_5_RELA
:
5381 case R_NDS32_32_RELA
:
5382 case R_NDS32_9_PCREL_RELA
:
5383 case R_NDS32_WORD_9_PCREL_RELA
:
5384 case R_NDS32_10_UPCREL_RELA
:
5385 case R_NDS32_15_PCREL_RELA
:
5386 case R_NDS32_17_PCREL_RELA
:
5387 case R_NDS32_25_PCREL_RELA
:
5388 case R_NDS32_HI20_RELA
:
5389 case R_NDS32_LO12S3_RELA
:
5390 case R_NDS32_LO12S2_RELA
:
5391 case R_NDS32_LO12S2_DP_RELA
:
5392 case R_NDS32_LO12S2_SP_RELA
:
5393 case R_NDS32_LO12S1_RELA
:
5394 case R_NDS32_LO12S0_RELA
:
5395 case R_NDS32_LO12S0_ORI_RELA
:
5396 if (bfd_link_pic (info
) && r_symndx
!= 0
5397 && (input_section
->flags
& SEC_ALLOC
) != 0
5398 && (eliminate_gc_relocs
== 0
5399 || (sec
&& (sec
->flags
& SEC_EXCLUDE
) == 0))
5400 && ((r_type
!= R_NDS32_9_PCREL_RELA
5401 && r_type
!= R_NDS32_WORD_9_PCREL_RELA
5402 && r_type
!= R_NDS32_10_UPCREL_RELA
5403 && r_type
!= R_NDS32_15_PCREL_RELA
5404 && r_type
!= R_NDS32_17_PCREL_RELA
5405 && r_type
!= R_NDS32_25_PCREL_RELA
5406 && !(r_type
== R_NDS32_32_RELA
5407 && strcmp (input_section
->name
, ".eh_frame") == 0))
5408 || (h
!= NULL
&& h
->dynindx
!= -1
5409 && (!info
->symbolic
|| !h
->def_regular
))))
5411 Elf_Internal_Rela outrel
;
5412 bfd_boolean skip
, relocate
;
5415 /* When generating a shared object, these relocations
5416 are copied into the output file to be resolved at run
5423 name
= bfd_elf_string_from_elf_section
5424 (input_bfd
, elf_elfheader (input_bfd
)->e_shstrndx
,
5425 elf_section_data (input_section
)->rela
.hdr
->sh_name
);
5429 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
5430 && strcmp (bfd_section_name (input_section
),
5433 sreloc
= bfd_get_section_by_name (dynobj
, name
);
5434 BFD_ASSERT (sreloc
!= NULL
);
5440 outrel
.r_offset
= _bfd_elf_section_offset (output_bfd
,
5444 if (outrel
.r_offset
== (bfd_vma
) - 1)
5446 else if (outrel
.r_offset
== (bfd_vma
) - 2)
5447 skip
= TRUE
, relocate
= TRUE
;
5448 outrel
.r_offset
+= (input_section
->output_section
->vma
5449 + input_section
->output_offset
);
5452 memset (&outrel
, 0, sizeof outrel
);
5453 else if (r_type
== R_NDS32_17_PCREL_RELA
5454 || r_type
== R_NDS32_15_PCREL_RELA
5455 || r_type
== R_NDS32_25_PCREL_RELA
)
5457 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
5458 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
5459 outrel
.r_addend
= rel
->r_addend
;
5463 /* h->dynindx may be -1 if this symbol was marked to
5466 || ((info
->symbolic
|| h
->dynindx
== -1)
5468 || (bfd_link_pie (info
) && h
->def_regular
))
5471 outrel
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
5472 outrel
.r_addend
= relocation
+ rel
->r_addend
;
5476 h
->plt
.offset
= (bfd_vma
) -1; /* cancel PLT trampoline. */
5478 BFD_ASSERT (sgot
!= NULL
);
5479 /* If we did not allocate got entry for the symbol,
5480 we can not fill the nonexistent got entry. */
5481 if (h
->got
.offset
!= (bfd_vma
) -1
5482 && (h
->got
.offset
& 1) == 0)
5484 bfd_put_32 (output_bfd
, outrel
.r_addend
,
5485 sgot
->contents
+ h
->got
.offset
);
5491 if (h
->dynindx
== -1)
5494 (_("%pB: relocation %s against `%s' can not be used when "
5495 "making a shared object; recompile with -fPIC"),
5496 input_bfd
, nds32_elf_howto_table
[r_type
].name
, h
->root
.root
.string
);
5497 bfd_set_error (bfd_error_bad_value
);
5501 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
5502 outrel
.r_addend
= rel
->r_addend
;
5506 loc
= sreloc
->contents
;
5507 loc
+= sreloc
->reloc_count
* sizeof (Elf32_External_Rela
);
5508 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5509 ++sreloc
->reloc_count
;
5511 /* If this reloc is against an external symbol, we do
5512 not want to fiddle with the addend. Otherwise, we
5513 need to include the symbol value so that it becomes
5514 an addend for the dynamic reloc. */
5520 case R_NDS32_25_ABS_RELA
:
5521 if (bfd_link_pic (info
))
5524 (_("%pB: warning: %s unsupported in shared mode"),
5525 input_bfd
, "R_NDS32_25_ABS_RELA");
5530 case R_NDS32_9_PCREL
:
5531 r
= nds32_elf_do_9_pcrel_reloc (input_bfd
, howto
, input_section
,
5533 sec
, relocation
, addend
);
5537 /* We allow an arbitrary number of HI20 relocs before the
5538 LO12 reloc. This permits gcc to emit the HI and LO relocs
5540 for (lorel
= rel
+ 1;
5542 && ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_HI20
); lorel
++)
5545 && (ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S3
5546 || ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S2
5547 || ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S1
5548 || ELF32_R_TYPE (lorel
->r_info
) == R_NDS32_LO12S0
))
5550 nds32_elf_relocate_hi20 (input_bfd
, r_type
, rel
, lorel
,
5551 contents
, relocation
+ addend
);
5555 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
5556 contents
, offset
, relocation
,
5560 case R_NDS32_GOT17S2_RELA
:
5561 case R_NDS32_GOT15S2_RELA
:
5562 BFD_ASSERT (sgot
!= NULL
);
5568 off
= h
->got
.offset
;
5569 BFD_ASSERT (off
!= (bfd_vma
) - 1);
5571 dyn
= htab
->root
.dynamic_sections_created
;
5572 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
5573 (dyn
, bfd_link_pic (info
), h
)
5574 || (bfd_link_pic (info
)
5580 /* This is actually a static link, or it is a
5581 -Bsymbolic link and the symbol is defined
5582 locally, or the symbol was forced to be local
5583 because of a version file. We must initialize
5584 this entry in the global offset table. Since the
5585 offset must always be a multiple of 4, we use the
5586 least significant bit to record whether we have
5587 initialized it already.
5589 When doing a dynamic link, we create a .rela.got
5590 relocation entry to initialize the value. This
5591 is done in the finish_dynamic_symbol routine. */
5596 bfd_put_32 (output_bfd
, relocation
,
5597 sgot
->contents
+ off
);
5606 BFD_ASSERT (local_got_offsets
!= NULL
5607 && local_got_offsets
[r_symndx
] != (bfd_vma
) - 1);
5609 off
= local_got_offsets
[r_symndx
];
5611 /* The offset must always be a multiple of 4. We use
5612 the least significant bit to record whether we have
5613 already processed this entry. */
5618 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
5620 if (bfd_link_pic (info
))
5623 Elf_Internal_Rela outrel
;
5625 /* We need to generate a R_NDS32_RELATIVE reloc
5626 for the dynamic linker. */
5627 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
5628 BFD_ASSERT (srelgot
!= NULL
);
5630 outrel
.r_offset
= (elf_gp (output_bfd
)
5631 + sgot
->output_offset
+ off
);
5632 outrel
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
5633 outrel
.r_addend
= relocation
;
5634 loc
= srelgot
->contents
;
5636 srelgot
->reloc_count
* sizeof (Elf32_External_Rela
);
5637 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5638 ++srelgot
->reloc_count
;
5640 local_got_offsets
[r_symndx
] |= 1;
5643 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
5644 - elf_gp (output_bfd
);
5646 if (relocation
& align
)
5648 /* Incorrect alignment. */
5650 (_("%pB: warning: unaligned access to GOT entry"), input_bfd
);
5652 r
= bfd_reloc_dangerous
;
5657 case R_NDS32_SDA16S3_RELA
:
5658 case R_NDS32_SDA15S3_RELA
:
5659 case R_NDS32_SDA15S3
:
5663 case R_NDS32_SDA17S2_RELA
:
5664 case R_NDS32_SDA15S2_RELA
:
5665 case R_NDS32_SDA12S2_SP_RELA
:
5666 case R_NDS32_SDA12S2_DP_RELA
:
5667 case R_NDS32_SDA15S2
:
5668 case R_NDS32_SDA_FP7U2_RELA
:
5672 case R_NDS32_SDA18S1_RELA
:
5673 case R_NDS32_SDA15S1_RELA
:
5674 case R_NDS32_SDA15S1
:
5678 case R_NDS32_SDA19S0_RELA
:
5679 case R_NDS32_SDA15S0_RELA
:
5680 case R_NDS32_SDA15S0
:
5683 BFD_ASSERT (sec
!= NULL
);
5685 /* If the symbol is in the abs section, the out_bfd will be null.
5686 This happens when the relocation has a symbol@GOTOFF. */
5687 r
= nds32_elf_final_sda_base (output_bfd
, info
, &gp
, FALSE
);
5688 if (r
!= bfd_reloc_ok
)
5691 (_("%pB: warning: relocate SDA_BASE failed"), input_bfd
);
5696 /* At this point `relocation' contains the object's
5698 if (r_type
== R_NDS32_SDA_FP7U2_RELA
)
5700 relocation
-= fpbase_addr
;
5704 /* Now it contains the offset from _SDA_BASE_. */
5706 /* Make sure alignment is correct. */
5708 if (relocation
& align
)
5710 /* Incorrect alignment. */
5712 /* xgettext:c-format */
5713 (_("%pB(%pA): warning: unaligned small data access"
5715 input_bfd
, input_section
, r_type
);
5721 case R_NDS32_17IFC_PCREL_RELA
:
5722 case R_NDS32_10IFCU_PCREL_RELA
:
5726 case R_NDS32_TLS_LE_HI20
:
5727 case R_NDS32_TLS_LE_LO12
:
5728 case R_NDS32_TLS_LE_20
:
5729 case R_NDS32_TLS_LE_15S0
:
5730 case R_NDS32_TLS_LE_15S1
:
5731 case R_NDS32_TLS_LE_15S2
:
5732 /* We do not have garbage collection for got entries.
5733 Therefore, IE to LE may have one empty entry, and DESC to
5735 if (elf_hash_table (info
)->tls_sec
!= NULL
)
5736 relocation
-= (elf_hash_table (info
)->tls_sec
->vma
+ TP_OFFSET
);
5739 case R_NDS32_TLS_IE_HI20
:
5740 case R_NDS32_TLS_IE_LO12S2
:
5741 case R_NDS32_TLS_DESC_HI20
:
5742 case R_NDS32_TLS_DESC_LO12
:
5743 case R_NDS32_TLS_IE_LO12
:
5744 case R_NDS32_TLS_IEGP_HI20
:
5745 case R_NDS32_TLS_IEGP_LO12
:
5746 case R_NDS32_TLS_IEGP_LO12S2
:
5748 /* Relocation is to the entry for this symbol in the global
5750 enum elf_nds32_tls_type tls_type
, org_tls_type
, eff_tls_type
;
5752 Elf_Internal_Rela outrel
;
5756 eff_tls_type
= org_tls_type
= get_tls_type (r_type
, h
);
5758 BFD_ASSERT (sgot
!= NULL
);
5763 off
= h
->got
.offset
;
5764 BFD_ASSERT (off
!= (bfd_vma
) -1);
5765 dyn
= htab
->root
.dynamic_sections_created
;
5766 tls_type
= ((struct elf_nds32_link_hash_entry
*) h
)->tls_type
;
5767 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, bfd_link_pic (info
), h
)
5768 && (!bfd_link_pic (info
)
5769 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
5774 BFD_ASSERT (local_got_offsets
!= NULL
5775 && local_got_offsets
[r_symndx
] != (bfd_vma
) - 1);
5776 off
= local_got_offsets
[r_symndx
];
5777 tls_type
= elf32_nds32_local_got_tls_type (input_bfd
)[r_symndx
];
5780 relocation
= sgot
->output_section
->vma
+ sgot
->output_offset
+ off
;
5782 if (1 < ones32 (tls_type
))
5784 eff_tls_type
= 1 << (fls (tls_type
) - 1);
5785 /* TLS model shall be handled in nds32_elf_unify_tls_model (). */
5787 /* TLS model X -> LE is not implement yet!
5789 if (eff_tls_type
== GOT_TLS_LE
)
5791 eff_tls_type
= 1 << (fls (tls_type
^ eff_tls_type
) - 1);
5795 /* The offset must always be a multiple of 4. We use
5796 the least significant bit to record whether we have
5797 already processed this entry. */
5798 bfd_boolean need_relocs
= FALSE
;
5799 srelgot
= ehtab
->srelgot
;
5800 if ((bfd_link_pic (info
) || indx
!= 0)
5801 && (h
== NULL
|| ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
5802 || h
->root
.type
!= bfd_link_hash_undefweak
))
5805 BFD_ASSERT (srelgot
!= NULL
);
5813 if (eff_tls_type
& GOT_TLS_DESC
)
5815 relocation
-= elf_gp (output_bfd
);
5816 if ((R_NDS32_TLS_DESC_HI20
== r_type
) && (!need_relocs
))
5818 /* TLS model shall be converted. */
5822 else if (eff_tls_type
& GOT_TLS_IEGP
)
5824 relocation
-= elf_gp (output_bfd
);
5829 if ((eff_tls_type
& GOT_TLS_LE
) && (tls_type
^ eff_tls_type
))
5831 /* TLS model workaround shall be applied. */
5834 else if (eff_tls_type
& (GOT_TLS_IE
| GOT_TLS_IEGP
))
5836 if (eff_tls_type
& GOT_TLS_IEGP
)
5837 relocation
-= elf_gp(output_bfd
);
5842 outrel
.r_addend
= gottpoff (info
, relocation_sym
);
5844 outrel
.r_addend
= 0;
5845 outrel
.r_offset
= (sgot
->output_section
->vma
5846 + sgot
->output_offset
+ off
);
5847 outrel
.r_info
= ELF32_R_INFO (indx
, R_NDS32_TLS_TPOFF
);
5849 elf32_nds32_add_dynreloc (output_bfd
, info
, srelgot
,
5854 bfd_put_32 (output_bfd
, gottpoff (info
, relocation_sym
),
5855 sgot
->contents
+ off
);
5858 else if (eff_tls_type
& GOT_TLS_DESC
)
5860 relocation
-= elf_gp (output_bfd
);
5864 outrel
.r_addend
= gottpoff (info
, relocation_sym
);
5866 outrel
.r_addend
= 0;
5867 outrel
.r_offset
= (sgot
->output_section
->vma
5868 + sgot
->output_offset
+ off
);
5869 outrel
.r_info
= ELF32_R_INFO (indx
, R_NDS32_TLS_DESC
);
5871 if (htab
->tls_desc_trampoline
)
5874 srelplt
= ehtab
->srelplt
;
5875 loc
= srelplt
->contents
;
5876 loc
+= htab
->next_tls_desc_index
++ * sizeof (Elf32_External_Rela
);
5877 BFD_ASSERT (loc
+ sizeof (Elf32_External_Rela
)
5878 <= srelplt
->contents
+ srelplt
->size
);
5880 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5884 loc
= srelgot
->contents
;
5885 loc
+= srelgot
->reloc_count
* sizeof (Elf32_External_Rela
);
5886 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5887 ++srelgot
->reloc_count
;
5893 bfd_put_32 (output_bfd
, 0xdeadbeef,
5894 sgot
->contents
+ off
);
5895 bfd_put_32 (output_bfd
, gottpoff (info
, relocation_sym
),
5896 sgot
->contents
+ off
+ 4);
5897 patch_tls_desc_to_ie (contents
, rel
, input_bfd
);
5903 /* TLS model workaround shall be applied. */
5910 local_got_offsets
[r_symndx
] |= 1;
5914 /* DON'T fall through. */
5917 /* OLD_NDS32_RELOC. */
5919 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
5920 contents
, offset
, relocation
, addend
);
5924 switch ((int) r_type
)
5926 case R_NDS32_20_RELA
:
5927 case R_NDS32_5_RELA
:
5928 case R_NDS32_9_PCREL_RELA
:
5929 case R_NDS32_WORD_9_PCREL_RELA
:
5930 case R_NDS32_10_UPCREL_RELA
:
5931 case R_NDS32_15_PCREL_RELA
:
5932 case R_NDS32_17_PCREL_RELA
:
5933 case R_NDS32_25_PCREL_RELA
:
5934 case R_NDS32_25_ABS_RELA
:
5935 case R_NDS32_HI20_RELA
:
5936 case R_NDS32_LO12S3_RELA
:
5937 case R_NDS32_LO12S2_RELA
:
5938 case R_NDS32_LO12S2_DP_RELA
:
5939 case R_NDS32_LO12S2_SP_RELA
:
5940 case R_NDS32_LO12S1_RELA
:
5941 case R_NDS32_LO12S0_RELA
:
5942 case R_NDS32_LO12S0_ORI_RELA
:
5943 case R_NDS32_SDA16S3_RELA
:
5944 case R_NDS32_SDA17S2_RELA
:
5945 case R_NDS32_SDA18S1_RELA
:
5946 case R_NDS32_SDA19S0_RELA
:
5947 case R_NDS32_SDA15S3_RELA
:
5948 case R_NDS32_SDA15S2_RELA
:
5949 case R_NDS32_SDA12S2_DP_RELA
:
5950 case R_NDS32_SDA12S2_SP_RELA
:
5951 case R_NDS32_SDA15S1_RELA
:
5952 case R_NDS32_SDA15S0_RELA
:
5953 case R_NDS32_SDA_FP7U2_RELA
:
5954 case R_NDS32_9_PLTREL
:
5955 case R_NDS32_25_PLTREL
:
5957 case R_NDS32_GOT_HI20
:
5958 case R_NDS32_GOT_LO12
:
5959 case R_NDS32_GOT_LO15
:
5960 case R_NDS32_GOT_LO19
:
5961 case R_NDS32_GOT15S2_RELA
:
5962 case R_NDS32_GOT17S2_RELA
:
5963 case R_NDS32_GOTPC20
:
5964 case R_NDS32_GOTPC_HI20
:
5965 case R_NDS32_GOTPC_LO12
:
5966 case R_NDS32_GOTOFF
:
5967 case R_NDS32_GOTOFF_HI20
:
5968 case R_NDS32_GOTOFF_LO12
:
5969 case R_NDS32_GOTOFF_LO15
:
5970 case R_NDS32_GOTOFF_LO19
:
5971 case R_NDS32_PLTREL_HI20
:
5972 case R_NDS32_PLTREL_LO12
:
5973 case R_NDS32_PLT_GOTREL_HI20
:
5974 case R_NDS32_PLT_GOTREL_LO12
:
5975 case R_NDS32_PLT_GOTREL_LO15
:
5976 case R_NDS32_PLT_GOTREL_LO19
:
5977 case R_NDS32_PLT_GOTREL_LO20
:
5978 case R_NDS32_17IFC_PCREL_RELA
:
5979 case R_NDS32_10IFCU_PCREL_RELA
:
5980 case R_NDS32_TLS_LE_HI20
:
5981 case R_NDS32_TLS_LE_LO12
:
5982 case R_NDS32_TLS_IE_HI20
:
5983 case R_NDS32_TLS_IE_LO12S2
:
5984 case R_NDS32_TLS_LE_20
:
5985 case R_NDS32_TLS_LE_15S0
:
5986 case R_NDS32_TLS_LE_15S1
:
5987 case R_NDS32_TLS_LE_15S2
:
5988 case R_NDS32_TLS_DESC_HI20
:
5989 case R_NDS32_TLS_DESC_LO12
:
5990 case R_NDS32_TLS_IE_LO12
:
5991 case R_NDS32_TLS_IEGP_HI20
:
5992 case R_NDS32_TLS_IEGP_LO12
:
5993 case R_NDS32_TLS_IEGP_LO12S2
:
5994 /* Instruction related relocs must handle endian properly. */
5995 /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER. */
5996 r
= nds32_elf_final_link_relocate (howto
, input_bfd
,
5997 input_section
, contents
,
5998 rel
->r_offset
, relocation
,
6003 /* All other relocs can use default handler. */
6004 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
6005 contents
, rel
->r_offset
,
6006 relocation
, rel
->r_addend
);
6012 if (r
!= bfd_reloc_ok
)
6014 /* FIXME: This should be generic enough to go in a utility. */
6018 name
= h
->root
.root
.string
;
6021 name
= bfd_elf_string_from_elf_section
6022 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
6023 if (name
== NULL
|| *name
== '\0')
6024 name
= bfd_section_name (sec
);
6032 case bfd_reloc_overflow
:
6033 (*info
->callbacks
->reloc_overflow
)
6034 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
6035 (bfd_vma
) 0, input_bfd
, input_section
, offset
);
6038 case bfd_reloc_undefined
:
6039 (*info
->callbacks
->undefined_symbol
)
6040 (info
, name
, input_bfd
, input_section
, offset
, TRUE
);
6043 case bfd_reloc_outofrange
:
6044 errmsg
= _("internal error: out of range error");
6047 case bfd_reloc_notsupported
:
6048 errmsg
= _("internal error: unsupported relocation error");
6051 case bfd_reloc_dangerous
:
6052 errmsg
= _("internal error: dangerous error");
6056 errmsg
= _("internal error: unknown error");
6060 (*info
->callbacks
->warning
) (info
, errmsg
, name
, input_bfd
,
6061 input_section
, offset
);
6067 /* Resotre header size to avoid overflow load. */
6068 if (elf_nds32_tdata (input_bfd
)->hdr_size
!= 0)
6069 symtab_hdr
->sh_size
= elf_nds32_tdata (input_bfd
)->hdr_size
;
6074 /* Finish up dynamic symbol handling. We set the contents of various
6075 dynamic sections here. */
6078 nds32_elf_finish_dynamic_symbol (bfd
*output_bfd
, struct bfd_link_info
*info
,
6079 struct elf_link_hash_entry
*h
, Elf_Internal_Sym
*sym
)
6081 struct elf_link_hash_table
*ehtab
;
6082 struct elf_nds32_link_hash_entry
*hent
;
6085 ehtab
= elf_hash_table (info
);
6086 hent
= (struct elf_nds32_link_hash_entry
*) h
;
6088 if (h
->plt
.offset
!= (bfd_vma
) - 1)
6096 bfd_vma local_plt_offset
;
6097 Elf_Internal_Rela rela
;
6099 /* This symbol has an entry in the procedure linkage table. Set
6102 BFD_ASSERT (h
->dynindx
!= -1);
6105 sgot
= ehtab
->sgotplt
;
6106 srela
= ehtab
->srelplt
;
6107 BFD_ASSERT (splt
!= NULL
&& sgot
!= NULL
&& srela
!= NULL
);
6109 /* Get the index in the procedure linkage table which
6110 corresponds to this symbol. This is the index of this symbol
6111 in all the symbols for which we are making plt entries. The
6112 first entry in the procedure linkage table is reserved. */
6113 plt_index
= h
->plt
.offset
/ PLT_ENTRY_SIZE
- 1;
6115 /* Get the offset into the .got table of the entry that
6116 corresponds to this function. Each .got entry is 4 bytes.
6117 The first three are reserved. */
6118 got_offset
= (plt_index
+ 3) * 4;
6120 /* Fill in the entry in the procedure linkage table. */
6121 if (!bfd_link_pic (info
))
6125 insn
= PLT_ENTRY_WORD0
+ (((sgot
->output_section
->vma
6126 + sgot
->output_offset
+ got_offset
) >> 12)
6128 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
);
6130 insn
= PLT_ENTRY_WORD1
+ (((sgot
->output_section
->vma
6131 + sgot
->output_offset
+ got_offset
) & 0x0fff)
6133 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 4);
6135 insn
= PLT_ENTRY_WORD2
;
6136 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 8);
6138 insn
= PLT_ENTRY_WORD3
+ (plt_index
& 0x7ffff);
6139 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 12);
6141 insn
= PLT_ENTRY_WORD4
6142 + (((unsigned int) ((-(h
->plt
.offset
+ 16)) >> 1)) & 0xffffff);
6143 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 16);
6144 local_plt_offset
= 12;
6148 /* sda_base must be set at this time. */
6152 offset
= sgot
->output_section
->vma
+ sgot
->output_offset
+ got_offset
6153 - elf_gp (output_bfd
);
6154 insn
= PLT_PIC_ENTRY_WORD0
+ ((offset
>> 12) & 0xfffff);
6155 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
);
6157 insn
= PLT_PIC_ENTRY_WORD1
+ (offset
& 0xfff);
6158 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 4);
6160 insn
= PLT_PIC_ENTRY_WORD2
;
6161 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 8);
6163 insn
= PLT_PIC_ENTRY_WORD3
;
6164 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 12);
6166 insn
= PLT_PIC_ENTRY_WORD4
+ (plt_index
& 0x7fffff);
6167 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 16);
6169 insn
= PLT_PIC_ENTRY_WORD5
6170 + (((unsigned int) ((-(h
->plt
.offset
+ 20)) >> 1)) & 0xffffff);
6171 bfd_putb32 (insn
, splt
->contents
+ h
->plt
.offset
+ 20);
6173 local_plt_offset
= 16;
6176 /* Fill in the entry in the global offset table,
6177 so it will fall through to the next instruction for the first time. */
6178 bfd_put_32 (output_bfd
,
6179 (splt
->output_section
->vma
+ splt
->output_offset
6180 + h
->plt
.offset
+ local_plt_offset
),
6181 sgot
->contents
+ got_offset
);
6183 /* Fill in the entry in the .rela.plt section. */
6184 rela
.r_offset
= (sgot
->output_section
->vma
6185 + sgot
->output_offset
+ got_offset
);
6186 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_NDS32_JMP_SLOT
);
6188 loc
= srela
->contents
;
6189 loc
+= plt_index
* sizeof (Elf32_External_Rela
);
6190 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
6192 if (!h
->def_regular
)
6194 /* Mark the symbol as undefined, rather than as defined in
6195 the .plt section. Leave the value alone. */
6196 sym
->st_shndx
= SHN_UNDEF
;
6197 if (!h
->ref_regular_nonweak
)
6202 if (h
->got
.offset
!= (bfd_vma
) - 1
6203 && hent
->tls_type
== GOT_NORMAL
)
6207 Elf_Internal_Rela rela
;
6209 /* This symbol has an entry in the global offset table.
6213 srelagot
= ehtab
->srelgot
;
6214 BFD_ASSERT (sgot
!= NULL
&& srelagot
!= NULL
);
6216 rela
.r_offset
= (sgot
->output_section
->vma
6217 + sgot
->output_offset
+ (h
->got
.offset
& ~1));
6219 /* If this is a -Bsymbolic link, and the symbol is defined
6220 locally, we just want to emit a RELATIVE reloc. Likewise if
6221 the symbol was forced to be local because of a version file.
6222 The entry in the global offset table will already have been
6223 initialized in the relocate_section function. */
6224 if ((bfd_link_pic (info
)
6225 && (info
->symbolic
|| h
->dynindx
== -1 || h
->forced_local
)
6227 || (bfd_link_pie (info
) && h
->def_regular
))
6229 rela
.r_info
= ELF32_R_INFO (0, R_NDS32_RELATIVE
);
6230 rela
.r_addend
= (h
->root
.u
.def
.value
6231 + h
->root
.u
.def
.section
->output_section
->vma
6232 + h
->root
.u
.def
.section
->output_offset
);
6234 if ((h
->got
.offset
& 1) == 0)
6236 bfd_put_32 (output_bfd
, rela
.r_addend
,
6237 sgot
->contents
+ h
->got
.offset
);
6242 BFD_ASSERT ((h
->got
.offset
& 1) == 0);
6243 bfd_put_32 (output_bfd
, (bfd_vma
) 0,
6244 sgot
->contents
+ h
->got
.offset
);
6245 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_NDS32_GLOB_DAT
);
6249 loc
= srelagot
->contents
;
6250 loc
+= srelagot
->reloc_count
* sizeof (Elf32_External_Rela
);
6251 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
6252 ++srelagot
->reloc_count
;
6253 BFD_ASSERT (loc
< (srelagot
->contents
+ srelagot
->size
));
6259 Elf_Internal_Rela rela
;
6261 /* This symbols needs a copy reloc. Set it up. */
6263 BFD_ASSERT (h
->dynindx
!= -1
6264 && (h
->root
.type
== bfd_link_hash_defined
6265 || h
->root
.type
== bfd_link_hash_defweak
));
6267 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
, ".rela.bss");
6268 BFD_ASSERT (s
!= NULL
);
6270 rela
.r_offset
= (h
->root
.u
.def
.value
6271 + h
->root
.u
.def
.section
->output_section
->vma
6272 + h
->root
.u
.def
.section
->output_offset
);
6273 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_NDS32_COPY
);
6276 loc
+= s
->reloc_count
* sizeof (Elf32_External_Rela
);
6277 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
6281 /* Mark some specially defined symbols as absolute. */
6282 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
6283 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
6284 sym
->st_shndx
= SHN_ABS
;
6290 /* Finish up the dynamic sections. */
6293 nds32_elf_finish_dynamic_sections (bfd
*output_bfd
, struct bfd_link_info
*info
)
6298 struct elf_link_hash_table
*ehtab
;
6299 struct elf_nds32_link_hash_table
*htab
;
6301 ehtab
= elf_hash_table (info
);
6302 htab
= nds32_elf_hash_table (info
);
6306 dynobj
= elf_hash_table (info
)->dynobj
;
6308 sgotplt
= ehtab
->sgotplt
;
6309 /* A broken linker script might have discarded the dynamic sections.
6310 Catch this here so that we do not seg-fault later on. */
6311 if (sgotplt
!= NULL
&& bfd_is_abs_section (sgotplt
->output_section
))
6313 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
6315 if (elf_hash_table (info
)->dynamic_sections_created
)
6318 Elf32_External_Dyn
*dyncon
, *dynconend
;
6320 BFD_ASSERT (sgotplt
!= NULL
&& sdyn
!= NULL
);
6322 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
6323 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
6325 for (; dyncon
< dynconend
; dyncon
++)
6327 Elf_Internal_Dyn dyn
;
6330 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
6338 /* name = ".got"; */
6339 s
= ehtab
->sgot
->output_section
;
6342 s
= ehtab
->srelplt
->output_section
;
6344 BFD_ASSERT (s
!= NULL
);
6345 dyn
.d_un
.d_ptr
= s
->vma
;
6346 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
6350 s
= ehtab
->srelplt
->output_section
;
6351 BFD_ASSERT (s
!= NULL
);
6352 dyn
.d_un
.d_val
= s
->size
;
6353 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
6357 /* My reading of the SVR4 ABI indicates that the
6358 procedure linkage table relocs (DT_JMPREL) should be
6359 included in the overall relocs (DT_RELA). This is
6360 what Solaris does. However, UnixWare can not handle
6361 that case. Therefore, we override the DT_RELASZ entry
6362 here to make it not include the JMPREL relocs. Since
6363 the linker script arranges for .rela.plt to follow all
6364 other relocation sections, we don't have to worry
6365 about changing the DT_RELA entry. */
6366 if (ehtab
->srelplt
!= NULL
)
6368 s
= ehtab
->srelplt
->output_section
;
6369 dyn
.d_un
.d_val
-= s
->size
;
6371 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
6374 case DT_TLSDESC_PLT
:
6375 s
= htab
->root
.splt
;
6376 dyn
.d_un
.d_ptr
= (s
->output_section
->vma
+ s
->output_offset
6377 + htab
->root
.tlsdesc_plt
);
6378 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
6381 case DT_TLSDESC_GOT
:
6382 s
= htab
->root
.sgot
;
6383 dyn
.d_un
.d_ptr
= (s
->output_section
->vma
+ s
->output_offset
6384 + htab
->root
.tlsdesc_got
);
6385 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
6390 /* Fill in the first entry in the procedure linkage table. */
6392 if (splt
&& splt
->size
> 0)
6394 if (bfd_link_pic (info
))
6399 offset
= sgotplt
->output_section
->vma
+ sgotplt
->output_offset
+ 4
6400 - elf_gp (output_bfd
);
6401 insn
= PLT0_PIC_ENTRY_WORD0
| ((offset
>> 12) & 0xfffff);
6402 bfd_putb32 (insn
, splt
->contents
);
6404 /* here has a typo? */
6405 insn
= PLT0_PIC_ENTRY_WORD1
| (offset
& 0xfff);
6406 bfd_putb32 (insn
, splt
->contents
+ 4);
6408 insn
= PLT0_PIC_ENTRY_WORD2
;
6409 bfd_putb32 (insn
, splt
->contents
+ 8);
6411 insn
= PLT0_PIC_ENTRY_WORD3
;
6412 bfd_putb32 (insn
, splt
->contents
+ 12);
6414 insn
= PLT0_PIC_ENTRY_WORD4
;
6415 bfd_putb32 (insn
, splt
->contents
+ 16);
6417 insn
= PLT0_PIC_ENTRY_WORD5
;
6418 bfd_putb32 (insn
, splt
->contents
+ 20);
6425 /* addr = .got + 4 */
6426 addr
= sgotplt
->output_section
->vma
+ sgotplt
->output_offset
+ 4;
6427 insn
= PLT0_ENTRY_WORD0
| ((addr
>> 12) & 0xfffff);
6428 bfd_putb32 (insn
, splt
->contents
);
6430 insn
= PLT0_ENTRY_WORD1
| (addr
& 0x0fff);
6431 bfd_putb32 (insn
, splt
->contents
+ 4);
6433 insn
= PLT0_ENTRY_WORD2
;
6434 bfd_putb32 (insn
, splt
->contents
+ 8);
6436 insn
= PLT0_ENTRY_WORD3
;
6437 bfd_putb32 (insn
, splt
->contents
+ 12);
6439 insn
= PLT0_ENTRY_WORD4
;
6440 bfd_putb32 (insn
, splt
->contents
+ 16);
6443 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
=
6447 if (htab
->root
.tlsdesc_plt
)
6449 /* Calculate addresses. */
6450 asection
*sgot
= sgot
= ehtab
->sgot
;
6451 bfd_vma pltgot
= sgotplt
->output_section
->vma
6452 + sgotplt
->output_offset
;
6453 bfd_vma tlsdesc_got
= sgot
->output_section
->vma
+ sgot
->output_offset
6454 + htab
->root
.tlsdesc_got
;
6456 /* Get GP offset. */
6457 pltgot
-= elf_gp (output_bfd
) - 4; /* PLTGOT[1] */
6458 tlsdesc_got
-= elf_gp (output_bfd
);
6460 /* Do relocation. */
6461 dl_tlsdesc_lazy_trampoline
[0] += ((1 << 20) - 1) & (tlsdesc_got
>> 12);
6462 dl_tlsdesc_lazy_trampoline
[1] += 0xfff & tlsdesc_got
;
6463 dl_tlsdesc_lazy_trampoline
[4] += ((1 << 20) - 1) & (pltgot
>> 12);
6464 dl_tlsdesc_lazy_trampoline
[5] += 0xfff & pltgot
;
6467 nds32_put_trampoline (splt
->contents
+ htab
->root
.tlsdesc_plt
,
6468 dl_tlsdesc_lazy_trampoline
,
6469 ARRAY_SIZE (dl_tlsdesc_lazy_trampoline
));
6473 /* Fill in the first three entries in the global offset table. */
6474 if (sgotplt
&& sgotplt
->size
> 0)
6477 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgotplt
->contents
);
6479 bfd_put_32 (output_bfd
,
6480 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
6482 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgotplt
->contents
+ 4);
6483 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgotplt
->contents
+ 8);
6485 elf_section_data (sgotplt
->output_section
)->this_hdr
.sh_entsize
= 4;
6492 /* Set the right machine number. */
6495 nds32_elf_object_p (bfd
*abfd
)
6497 static unsigned int cur_arch
= 0;
6499 if (E_N1_ARCH
!= (elf_elfheader (abfd
)->e_flags
& EF_NDS_ARCH
))
6501 /* E_N1_ARCH is a wild card, so it is set only when no others exist. */
6502 cur_arch
= (elf_elfheader (abfd
)->e_flags
& EF_NDS_ARCH
);
6509 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1
);
6512 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h
);
6514 case E_NDS_ARCH_STAR_V2_0
:
6515 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h_v2
);
6517 case E_NDS_ARCH_STAR_V3_0
:
6518 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h_v3
);
6520 case E_NDS_ARCH_STAR_V3_M
:
6521 bfd_default_set_arch_mach (abfd
, bfd_arch_nds32
, bfd_mach_n1h_v3m
);
6528 /* Store the machine number in the flags field. */
6531 nds32_elf_final_write_processing (bfd
*abfd
)
6534 static unsigned int cur_mach
= 0;
6536 if (bfd_mach_n1
!= bfd_get_mach (abfd
))
6538 cur_mach
= bfd_get_mach (abfd
);
6544 /* Only happen when object is empty, since the case is abandon. */
6546 val
|= E_NDS_ABI_AABI
;
6547 val
|= E_NDS32_ELF_VER_1_4
;
6552 case bfd_mach_n1h_v2
:
6553 val
= E_NDS_ARCH_STAR_V2_0
;
6555 case bfd_mach_n1h_v3
:
6556 val
= E_NDS_ARCH_STAR_V3_0
;
6558 case bfd_mach_n1h_v3m
:
6559 val
= E_NDS_ARCH_STAR_V3_M
;
6566 elf_elfheader (abfd
)->e_flags
&= ~EF_NDS_ARCH
;
6567 elf_elfheader (abfd
)->e_flags
|= val
;
6568 return _bfd_elf_final_write_processing (abfd
);
6571 /* Function to keep NDS32 specific file flags. */
6574 nds32_elf_set_private_flags (bfd
*abfd
, flagword flags
)
6576 BFD_ASSERT (!elf_flags_init (abfd
)
6577 || elf_elfheader (abfd
)->e_flags
== flags
);
6579 elf_elfheader (abfd
)->e_flags
= flags
;
6580 elf_flags_init (abfd
) = TRUE
;
6585 convert_e_flags (unsigned int e_flags
, unsigned int arch
)
6587 if ((e_flags
& EF_NDS_ARCH
) == E_NDS_ARCH_STAR_V0_9
)
6589 /* From 0.9 to 1.0. */
6590 e_flags
= (e_flags
& (~EF_NDS_ARCH
)) | E_NDS_ARCH_STAR_V1_0
;
6592 /* Invert E_NDS32_HAS_NO_MAC_INST. */
6593 e_flags
^= E_NDS32_HAS_NO_MAC_INST
;
6594 if (arch
== E_NDS_ARCH_STAR_V1_0
)
6601 /* From 1.0 to 2.0. */
6602 e_flags
= (e_flags
& (~EF_NDS_ARCH
)) | E_NDS_ARCH_STAR_V2_0
;
6604 /* Clear E_NDS32_HAS_MFUSR_PC_INST. */
6605 e_flags
&= ~E_NDS32_HAS_MFUSR_PC_INST
;
6607 /* Invert E_NDS32_HAS_NO_MAC_INST. */
6608 e_flags
^= E_NDS32_HAS_NO_MAC_INST
;
6613 nds32_check_vec_size (bfd
*ibfd
)
6615 static unsigned int nds32_vec_size
= 0;
6617 asection
*sec_t
= NULL
;
6618 bfd_byte
*contents
= NULL
;
6620 sec_t
= bfd_get_section_by_name (ibfd
, ".nds32_e_flags");
6622 if (sec_t
&& sec_t
->size
>= 4)
6624 /* Get vec_size in file. */
6625 unsigned int flag_t
;
6627 nds32_get_section_contents (ibfd
, sec_t
, &contents
, TRUE
);
6628 flag_t
= bfd_get_32 (ibfd
, contents
);
6630 /* The value could only be 4 or 16. */
6632 if (!nds32_vec_size
)
6633 /* Set if not set yet. */
6634 nds32_vec_size
= (flag_t
& 0x3);
6635 else if (nds32_vec_size
!= (flag_t
& 0x3))
6638 /* xgettext:c-format */
6639 (_("%pB: ISR vector size mismatch"
6640 " with previous modules, previous %u-byte, current %u-byte"),
6642 nds32_vec_size
== 1 ? 4 : nds32_vec_size
== 2 ? 16 : 0xffffffff,
6643 (flag_t
& 0x3) == 1 ? 4 : (flag_t
& 0x3) == 2 ? 16 : 0xffffffff);
6647 /* Only keep the first vec_size section. */
6648 sec_t
->flags
|= SEC_EXCLUDE
;
6654 /* Merge backend specific data from an object file to the output
6655 object file when linking. */
6658 nds32_elf_merge_private_bfd_data (bfd
*ibfd
, struct bfd_link_info
*info
)
6660 bfd
*obfd
= info
->output_bfd
;
6663 flagword out_16regs
;
6665 flagword out_no_mac
;
6667 flagword out_version
;
6668 flagword in_version
;
6669 flagword out_fpu_config
;
6670 flagword in_fpu_config
;
6672 /* FIXME: What should be checked when linking shared libraries? */
6673 if ((ibfd
->flags
& DYNAMIC
) != 0)
6676 /* TODO: Revise to use object-attributes instead. */
6677 if (!nds32_check_vec_size (ibfd
))
6680 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6681 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6684 if (bfd_little_endian (ibfd
) != bfd_little_endian (obfd
))
6687 (_("%pB: warning: endian mismatch with previous modules"), ibfd
);
6689 bfd_set_error (bfd_error_bad_value
);
6693 /* -B option in objcopy cannot work as expected. e_flags = 0 shall be
6694 treat as generic one without checking and merging. */
6695 if (elf_elfheader (ibfd
)->e_flags
)
6697 in_version
= elf_elfheader (ibfd
)->e_flags
& EF_NDS32_ELF_VERSION
;
6698 if (in_version
== E_NDS32_ELF_VER_1_2
)
6701 (_("%pB: warning: older version of object file encountered, "
6702 "please recompile with current tool chain"), ibfd
);
6705 /* We may need to merge V1 and V2 arch object files to V2. */
6706 if ((elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
)
6707 != (elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
))
6709 /* Need to convert version. */
6710 if ((elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
)
6711 == E_NDS_ARCH_STAR_RESERVED
)
6713 elf_elfheader (obfd
)->e_flags
= elf_elfheader (ibfd
)->e_flags
;
6715 else if ((elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
)
6716 == E_NDS_ARCH_STAR_V3_M
6717 && (elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
)
6718 == E_NDS_ARCH_STAR_V3_0
)
6720 elf_elfheader (ibfd
)->e_flags
=
6721 (elf_elfheader (ibfd
)->e_flags
& (~EF_NDS_ARCH
))
6722 | E_NDS_ARCH_STAR_V3_0
;
6724 else if ((elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
)
6725 == E_NDS_ARCH_STAR_V0_9
6726 || (elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
)
6727 > (elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
))
6729 elf_elfheader (obfd
)->e_flags
=
6730 convert_e_flags (elf_elfheader (obfd
)->e_flags
,
6731 (elf_elfheader (ibfd
)->e_flags
& EF_NDS_ARCH
));
6735 elf_elfheader (ibfd
)->e_flags
=
6736 convert_e_flags (elf_elfheader (ibfd
)->e_flags
,
6737 (elf_elfheader (obfd
)->e_flags
& EF_NDS_ARCH
));
6741 /* Extract some flags. */
6742 in_flags
= elf_elfheader (ibfd
)->e_flags
6743 & (~(E_NDS32_HAS_REDUCED_REGS
| EF_NDS32_ELF_VERSION
6744 | E_NDS32_HAS_NO_MAC_INST
| E_NDS32_FPU_REG_CONF
));
6746 /* The following flags need special treatment. */
6747 in_16regs
= elf_elfheader (ibfd
)->e_flags
& E_NDS32_HAS_REDUCED_REGS
;
6748 in_no_mac
= elf_elfheader (ibfd
)->e_flags
& E_NDS32_HAS_NO_MAC_INST
;
6749 in_fpu_config
= elf_elfheader (ibfd
)->e_flags
& E_NDS32_FPU_REG_CONF
;
6751 /* Extract some flags. */
6752 out_flags
= elf_elfheader (obfd
)->e_flags
6753 & (~(E_NDS32_HAS_REDUCED_REGS
| EF_NDS32_ELF_VERSION
6754 | E_NDS32_HAS_NO_MAC_INST
| E_NDS32_FPU_REG_CONF
));
6756 /* The following flags need special treatment. */
6757 out_16regs
= elf_elfheader (obfd
)->e_flags
& E_NDS32_HAS_REDUCED_REGS
;
6758 out_no_mac
= elf_elfheader (obfd
)->e_flags
& E_NDS32_HAS_NO_MAC_INST
;
6759 out_fpu_config
= elf_elfheader (obfd
)->e_flags
& E_NDS32_FPU_REG_CONF
;
6760 out_version
= elf_elfheader (obfd
)->e_flags
& EF_NDS32_ELF_VERSION
;
6761 if (!elf_flags_init (obfd
))
6763 /* If the input is the default architecture then do not
6764 bother setting the flags for the output architecture,
6765 instead allow future merges to do this. If no future
6766 merges ever set these flags then they will retain their
6767 unitialised values, which surprise surprise, correspond
6768 to the default values. */
6769 if (bfd_get_arch_info (ibfd
)->the_default
)
6772 elf_flags_init (obfd
) = TRUE
;
6773 elf_elfheader (obfd
)->e_flags
= elf_elfheader (ibfd
)->e_flags
;
6775 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
6776 && bfd_get_arch_info (obfd
)->the_default
)
6778 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
),
6779 bfd_get_mach (ibfd
));
6785 /* Check flag compatibility. */
6786 if ((in_flags
& EF_NDS_ABI
) != (out_flags
& EF_NDS_ABI
))
6789 (_("%pB: error: ABI mismatch with previous modules"), ibfd
);
6790 bfd_set_error (bfd_error_bad_value
);
6794 if ((in_flags
& EF_NDS_ARCH
) != (out_flags
& EF_NDS_ARCH
))
6796 if (((in_flags
& EF_NDS_ARCH
) != E_N1_ARCH
))
6799 (_("%pB: error: instruction set mismatch with previous modules"),
6802 bfd_set_error (bfd_error_bad_value
);
6807 /* When linking with V1.2 and V1.3 objects together the output is V1.2.
6808 and perf ext1 and DIV are mergerd to perf ext1. */
6809 if (in_version
== E_NDS32_ELF_VER_1_2
|| out_version
== E_NDS32_ELF_VER_1_2
)
6811 elf_elfheader (obfd
)->e_flags
=
6812 (in_flags
& (~(E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6813 | (out_flags
& (~(E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6814 | (((in_flags
& (E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6815 ? E_NDS32_HAS_EXT_INST
: 0)
6816 | (((out_flags
& (E_NDS32_HAS_EXT_INST
| E_NDS32_HAS_DIV_INST
)))
6817 ? E_NDS32_HAS_EXT_INST
: 0)
6818 | (in_16regs
& out_16regs
) | (in_no_mac
& out_no_mac
)
6819 | ((in_version
> out_version
) ? out_version
: in_version
);
6823 if (in_version
!= out_version
)
6825 /* xgettext:c-format */
6826 (_("%pB: warning: incompatible elf-versions %s and %s"),
6827 ibfd
, nds32_elfver_strtab
[out_version
],
6828 nds32_elfver_strtab
[in_version
]);
6830 elf_elfheader (obfd
)->e_flags
= in_flags
| out_flags
6831 | (in_16regs
& out_16regs
) | (in_no_mac
& out_no_mac
)
6832 | (in_fpu_config
> out_fpu_config
? in_fpu_config
: out_fpu_config
)
6833 | (in_version
> out_version
? out_version
: in_version
);
6840 /* Display the flags field. */
6843 nds32_elf_print_private_bfd_data (bfd
*abfd
, void *ptr
)
6845 FILE *file
= (FILE *) ptr
;
6847 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
6849 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
6851 fprintf (file
, _("private flags = %lx"), elf_elfheader (abfd
)->e_flags
);
6853 switch (elf_elfheader (abfd
)->e_flags
& EF_NDS_ARCH
)
6857 fprintf (file
, _(": n1 instructions"));
6860 fprintf (file
, _(": n1h instructions"));
6870 nds32_elf_action_discarded (asection
*sec
)
6874 (".gcc_except_table", sec
->name
, sizeof (".gcc_except_table") - 1) == 0)
6877 return _bfd_elf_default_action_discarded (sec
);
6881 nds32_elf_gc_mark_hook (asection
*sec
, struct bfd_link_info
*info
,
6882 Elf_Internal_Rela
*rel
, struct elf_link_hash_entry
*h
,
6883 Elf_Internal_Sym
*sym
)
6886 switch (ELF32_R_TYPE (rel
->r_info
))
6888 case R_NDS32_GNU_VTINHERIT
:
6889 case R_NDS32_GNU_VTENTRY
:
6890 case R_NDS32_RELA_GNU_VTINHERIT
:
6891 case R_NDS32_RELA_GNU_VTENTRY
:
6895 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
6898 static enum elf_nds32_tls_type
6899 get_tls_type (enum elf_nds32_reloc_type r_type
,
6900 struct elf_link_hash_entry
*h ATTRIBUTE_UNUSED
)
6902 enum elf_nds32_tls_type tls_type
;
6906 case R_NDS32_TLS_LE_HI20
:
6907 case R_NDS32_TLS_LE_LO12
:
6908 tls_type
= GOT_TLS_LE
;
6910 case R_NDS32_TLS_IE_HI20
:
6911 case R_NDS32_TLS_IE_LO12S2
:
6912 case R_NDS32_TLS_IE_LO12
:
6913 tls_type
= GOT_TLS_IE
;
6915 case R_NDS32_TLS_IEGP_HI20
:
6916 case R_NDS32_TLS_IEGP_LO12
:
6917 case R_NDS32_TLS_IEGP_LO12S2
:
6918 tls_type
= GOT_TLS_IEGP
;
6920 case R_NDS32_TLS_DESC_HI20
:
6921 case R_NDS32_TLS_DESC_LO12
:
6922 case R_NDS32_TLS_DESC_ADD
:
6923 case R_NDS32_TLS_DESC_FUNC
:
6924 case R_NDS32_TLS_DESC_CALL
:
6925 tls_type
= GOT_TLS_DESC
;
6928 tls_type
= GOT_NORMAL
;
6935 /* Ensure that we have allocated bookkeeping structures for ABFD's local
6939 elf32_nds32_allocate_local_sym_info (bfd
*abfd
)
6941 if (elf_local_got_refcounts (abfd
) == NULL
)
6943 bfd_size_type num_syms
;
6947 num_syms
= elf_tdata (abfd
)->symtab_hdr
.sh_info
;
6948 /* This space is for got_refcounts, got_tls_type, tlsdesc_gotent, and
6949 gp_offset. The details can refer to struct elf_nds32_obj_tdata. */
6950 size
= num_syms
* (sizeof (bfd_signed_vma
) + sizeof (char)
6951 + sizeof (bfd_vma
) + sizeof (int)
6952 + sizeof (bfd_boolean
) + sizeof (bfd_vma
));
6953 data
= bfd_zalloc (abfd
, size
);
6957 elf_local_got_refcounts (abfd
) = (bfd_signed_vma
*) data
;
6958 data
+= num_syms
* sizeof (bfd_signed_vma
);
6960 elf32_nds32_local_got_tls_type (abfd
) = (char *) data
;
6961 data
+= num_syms
* sizeof (char);
6963 elf32_nds32_local_tlsdesc_gotent (abfd
) = (bfd_vma
*) data
;
6964 data
+= num_syms
* sizeof (bfd_vma
);
6966 elf32_nds32_local_gp_offset (abfd
) = (int *) data
;
6967 data
+= num_syms
* sizeof (int);
6973 /* Look through the relocs for a section during the first phase.
6974 Since we don't do .gots or .plts, we just need to consider the
6975 virtual table relocs for gc. */
6978 nds32_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
6979 asection
*sec
, const Elf_Internal_Rela
*relocs
)
6981 Elf_Internal_Shdr
*symtab_hdr
;
6982 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
6983 const Elf_Internal_Rela
*rel
;
6984 const Elf_Internal_Rela
*rel_end
;
6985 struct elf_link_hash_table
*ehtab
;
6986 struct elf_nds32_link_hash_table
*htab
;
6988 asection
*sreloc
= NULL
;
6990 /* No need for relocation if relocatable already. */
6991 if (bfd_link_relocatable (info
))
6993 elf32_nds32_check_relax_group (abfd
, sec
);
6997 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6998 sym_hashes
= elf_sym_hashes (abfd
);
7000 sym_hashes
+ symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
);
7001 if (!elf_bad_symtab (abfd
))
7002 sym_hashes_end
-= symtab_hdr
->sh_info
;
7004 ehtab
= elf_hash_table (info
);
7005 htab
= nds32_elf_hash_table (info
);
7006 dynobj
= htab
->root
.dynobj
;
7008 rel_end
= relocs
+ sec
->reloc_count
;
7009 for (rel
= relocs
; rel
< rel_end
; rel
++)
7011 enum elf_nds32_reloc_type r_type
;
7012 struct elf_link_hash_entry
*h
;
7013 unsigned long r_symndx
;
7014 enum elf_nds32_tls_type tls_type
, old_tls_type
;
7016 r_symndx
= ELF32_R_SYM (rel
->r_info
);
7017 r_type
= ELF32_R_TYPE (rel
->r_info
);
7018 if (r_symndx
< symtab_hdr
->sh_info
)
7022 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
7023 while (h
->root
.type
== bfd_link_hash_indirect
7024 || h
->root
.type
== bfd_link_hash_warning
)
7025 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
7028 /* Create .got section if necessary.
7029 Some relocs require a global offset table. We create
7030 got section here, since these relocation need a got section
7031 and if it is not created yet. */
7032 if (ehtab
->sgot
== NULL
)
7036 case R_NDS32_GOT_HI20
:
7037 case R_NDS32_GOT_LO12
:
7038 case R_NDS32_GOT_LO15
:
7039 case R_NDS32_GOT_LO19
:
7040 case R_NDS32_GOT17S2_RELA
:
7041 case R_NDS32_GOT15S2_RELA
:
7042 case R_NDS32_GOTOFF
:
7043 case R_NDS32_GOTOFF_HI20
:
7044 case R_NDS32_GOTOFF_LO12
:
7045 case R_NDS32_GOTOFF_LO15
:
7046 case R_NDS32_GOTOFF_LO19
:
7047 case R_NDS32_GOTPC20
:
7048 case R_NDS32_GOTPC_HI20
:
7049 case R_NDS32_GOTPC_LO12
:
7051 case R_NDS32_TLS_IE_HI20
:
7052 case R_NDS32_TLS_IE_LO12
:
7053 case R_NDS32_TLS_IE_LO12S2
:
7054 case R_NDS32_TLS_IEGP_HI20
:
7055 case R_NDS32_TLS_IEGP_LO12
:
7056 case R_NDS32_TLS_IEGP_LO12S2
:
7057 case R_NDS32_TLS_DESC_HI20
:
7058 case R_NDS32_TLS_DESC_LO12
:
7060 htab
->root
.dynobj
= dynobj
= abfd
;
7061 if (!create_got_section (dynobj
, info
))
7070 /* Check relocation type. */
7071 switch ((int) r_type
)
7073 case R_NDS32_GOT_HI20
:
7074 case R_NDS32_GOT_LO12
:
7075 case R_NDS32_GOT_LO15
:
7076 case R_NDS32_GOT_LO19
:
7078 case R_NDS32_TLS_LE_HI20
:
7079 case R_NDS32_TLS_LE_LO12
:
7080 case R_NDS32_TLS_IE_HI20
:
7081 case R_NDS32_TLS_IE_LO12
:
7082 case R_NDS32_TLS_IE_LO12S2
:
7083 case R_NDS32_TLS_IEGP_HI20
:
7084 case R_NDS32_TLS_IEGP_LO12
:
7085 case R_NDS32_TLS_IEGP_LO12S2
:
7086 case R_NDS32_TLS_DESC_HI20
:
7087 case R_NDS32_TLS_DESC_LO12
:
7088 tls_type
= get_tls_type (r_type
, h
);
7091 if (tls_type
!= GOT_TLS_LE
)
7092 h
->got
.refcount
+= 1;
7093 old_tls_type
= elf32_nds32_hash_entry (h
)->tls_type
;
7097 /* This is a global offset table entry for a local symbol. */
7098 if (!elf32_nds32_allocate_local_sym_info (abfd
))
7101 BFD_ASSERT (r_symndx
< symtab_hdr
->sh_info
);
7102 if (tls_type
!= GOT_TLS_LE
)
7103 elf_local_got_refcounts (abfd
)[r_symndx
] += 1;
7104 old_tls_type
= elf32_nds32_local_got_tls_type (abfd
)[r_symndx
];
7107 /* We would already have issued an error message if there
7108 is a TLS/non-TLS mismatch, based on the symbol
7109 type. So just combine any TLS types needed. */
7110 if (old_tls_type
!= GOT_UNKNOWN
&& old_tls_type
!= GOT_NORMAL
7111 && tls_type
!= GOT_NORMAL
)
7112 tls_type
|= old_tls_type
;
7114 /* DESC to IE/IEGP if link to executable. */
7115 if ((tls_type
& (GOT_TLS_DESC
| GOT_TLS_IEGP
))
7116 && (bfd_link_executable (info
)))
7117 tls_type
|= (bfd_link_pie (info
) ? GOT_TLS_IEGP
: GOT_TLS_IE
);
7119 if (old_tls_type
!= tls_type
)
7122 elf32_nds32_hash_entry (h
)->tls_type
= tls_type
;
7124 elf32_nds32_local_got_tls_type (abfd
)[r_symndx
] = tls_type
;
7127 case R_NDS32_9_PLTREL
:
7128 case R_NDS32_25_PLTREL
:
7129 case R_NDS32_PLTREL_HI20
:
7130 case R_NDS32_PLTREL_LO12
:
7131 case R_NDS32_PLT_GOTREL_HI20
:
7132 case R_NDS32_PLT_GOTREL_LO12
:
7133 case R_NDS32_PLT_GOTREL_LO15
:
7134 case R_NDS32_PLT_GOTREL_LO19
:
7135 case R_NDS32_PLT_GOTREL_LO20
:
7137 /* This symbol requires a procedure linkage table entry. We
7138 actually build the entry in adjust_dynamic_symbol,
7139 because this might be a case of linking PIC code without
7140 linking in any dynamic objects, in which case we don't
7141 need to generate a procedure linkage table after all. */
7143 /* If this is a local symbol, we resolve it directly without
7144 creating a procedure linkage table entry. */
7149 || (bfd_link_pie (info
) && h
->def_regular
))
7152 elf32_nds32_hash_entry (h
)->tls_type
= GOT_NORMAL
;
7154 h
->plt
.refcount
+= 1;
7157 case R_NDS32_16_RELA
:
7158 case R_NDS32_20_RELA
:
7159 case R_NDS32_5_RELA
:
7160 case R_NDS32_32_RELA
:
7161 case R_NDS32_HI20_RELA
:
7162 case R_NDS32_LO12S3_RELA
:
7163 case R_NDS32_LO12S2_RELA
:
7164 case R_NDS32_LO12S2_DP_RELA
:
7165 case R_NDS32_LO12S2_SP_RELA
:
7166 case R_NDS32_LO12S1_RELA
:
7167 case R_NDS32_LO12S0_RELA
:
7168 case R_NDS32_LO12S0_ORI_RELA
:
7169 case R_NDS32_SDA16S3_RELA
:
7170 case R_NDS32_SDA17S2_RELA
:
7171 case R_NDS32_SDA18S1_RELA
:
7172 case R_NDS32_SDA19S0_RELA
:
7173 case R_NDS32_SDA15S3_RELA
:
7174 case R_NDS32_SDA15S2_RELA
:
7175 case R_NDS32_SDA12S2_DP_RELA
:
7176 case R_NDS32_SDA12S2_SP_RELA
:
7177 case R_NDS32_SDA15S1_RELA
:
7178 case R_NDS32_SDA15S0_RELA
:
7179 case R_NDS32_SDA_FP7U2_RELA
:
7180 case R_NDS32_15_PCREL_RELA
:
7181 case R_NDS32_17_PCREL_RELA
:
7182 case R_NDS32_25_PCREL_RELA
:
7184 if (h
!= NULL
&& !bfd_link_pic (info
))
7187 h
->plt
.refcount
+= 1;
7190 /* If we are creating a shared library, and this is a reloc against
7191 a global symbol, or a non PC relative reloc against a local
7192 symbol, then we need to copy the reloc into the shared library.
7193 However, if we are linking with -Bsymbolic, we do not need to
7194 copy a reloc against a global symbol which is defined in an
7195 object we are including in the link (i.e., DEF_REGULAR is set).
7196 At this point we have not seen all the input files, so it is
7197 possible that DEF_REGULAR is not set now but will be set later
7198 (it is never cleared). We account for that possibility below by
7199 storing information in the dyn_relocs field of the hash table
7200 entry. A similar situation occurs when creating shared libraries
7201 and symbol visibility changes render the symbol local.
7203 If on the other hand, we are creating an executable, we may need
7204 to keep relocations for symbols satisfied by a dynamic library
7205 if we manage to avoid copy relocs for the symbol. */
7206 if ((bfd_link_pic (info
)
7207 && (sec
->flags
& SEC_ALLOC
) != 0
7208 && ((r_type
!= R_NDS32_25_PCREL_RELA
7209 && r_type
!= R_NDS32_15_PCREL_RELA
7210 && r_type
!= R_NDS32_17_PCREL_RELA
7211 && !(r_type
== R_NDS32_32_RELA
7212 && strcmp (sec
->name
, ".eh_frame") == 0))
7215 || h
->root
.type
== bfd_link_hash_defweak
7216 || !h
->def_regular
))))
7217 || (!bfd_link_pic (info
)
7218 && (sec
->flags
& SEC_ALLOC
) != 0
7220 && (h
->root
.type
== bfd_link_hash_defweak
7221 || !h
->def_regular
)))
7223 struct elf_dyn_relocs
*p
;
7224 struct elf_dyn_relocs
**head
;
7227 htab
->root
.dynobj
= dynobj
= abfd
;
7229 /* When creating a shared object, we must copy these
7230 relocs into the output file. We create a reloc
7231 section in dynobj and make room for the reloc. */
7236 name
= bfd_elf_string_from_elf_section
7237 (abfd
, elf_elfheader (abfd
)->e_shstrndx
,
7238 elf_section_data (sec
)->rela
.hdr
->sh_name
);
7242 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
7243 && strcmp (bfd_section_name (sec
),
7246 sreloc
= bfd_get_section_by_name (dynobj
, name
);
7251 sreloc
= bfd_make_section (dynobj
, name
);
7252 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
7253 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
7254 if ((sec
->flags
& SEC_ALLOC
) != 0)
7255 flags
|= SEC_ALLOC
| SEC_LOAD
;
7257 || !bfd_set_section_flags (sreloc
, flags
)
7258 || !bfd_set_section_alignment (sreloc
, 2))
7261 elf_section_type (sreloc
) = SHT_RELA
;
7263 elf_section_data (sec
)->sreloc
= sreloc
;
7266 /* If this is a global symbol, we count the number of
7267 relocations we need for this symbol. */
7269 head
= &h
->dyn_relocs
;
7275 Elf_Internal_Sym
*isym
;
7276 isym
= bfd_sym_from_r_symndx (&htab
->root
.sym_cache
,
7281 /* Track dynamic relocs needed for local syms too. */
7282 s
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
7286 vpp
= &elf_section_data (s
)->local_dynrel
;
7287 head
= (struct elf_dyn_relocs
**) vpp
;
7291 if (p
== NULL
|| p
->sec
!= sec
)
7293 size_t amt
= sizeof (*p
);
7294 p
= (struct elf_dyn_relocs
*) bfd_alloc (dynobj
, amt
);
7306 /* Since eh_frame is readonly, R_NDS32_32_RELA
7307 reloc for eh_frame will cause shared library has
7308 TEXTREL entry in the dynamic section. This lead glibc
7309 testsuites to failure (bug-13092) and cause kernel fail
7310 (bug-11819). I think the best solution is to replace
7311 absolute reloc with pc relative reloc in the eh_frame.
7312 To do that, we need to support the following issues:
7315 * gcc/config/nds32/nds32.h: Define
7316 ASM_PREFERRED_EH_DATA_FORMAT to encode DW_EH_PE_pcrel
7317 and DW_EH_PE_sdata4 into DWARF exception header when
7318 option have '-fpic'.
7320 === For binutils ===
7321 * bfd/: Define new reloc R_NDS32_32_PCREL_RELA.
7322 * gas/config/tc-nds32.h: Define DIFF_EXPR_OK. This
7323 may break our nds DIFF mechanism, therefore, we
7324 must disable all linker relaxations to ensure
7326 * gas/config/tc-nds32.c (nds32_apply_fix): Replace
7327 R_NDS32_32_RELA with R_NDS32_32_PCREL_RELA, and
7328 do the necessary modification.
7330 Unfortunately, it still have some problems for nds32
7331 to support pc relative reloc in the eh_frame. So I use
7332 another solution to fix this issue.
7334 However, I find that ld always emit TEXTREL marker for
7335 R_NDS32_NONE relocs in rel.dyn. These none relocs are
7336 correspond to R_NDS32_32_RELA for .eh_frame section.
7337 It means that we always reserve redundant entries of rel.dyn
7338 for these relocs which actually do nothing in dynamic linker.
7340 Therefore, we regard these relocs as pc relative relocs
7341 here and increase the pc_count. */
7342 if (ELF32_R_TYPE (rel
->r_info
) == R_NDS32_25_PCREL_RELA
7343 || ELF32_R_TYPE (rel
->r_info
) == R_NDS32_15_PCREL_RELA
7344 || ELF32_R_TYPE (rel
->r_info
) == R_NDS32_17_PCREL_RELA
7345 || (r_type
== R_NDS32_32_RELA
7346 && strcmp (sec
->name
, ".eh_frame") == 0))
7351 /* This relocation describes the C++ object vtable hierarchy.
7352 Reconstruct it for later use during GC. */
7353 case R_NDS32_RELA_GNU_VTINHERIT
:
7354 case R_NDS32_GNU_VTINHERIT
:
7355 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
7359 /* This relocation describes which C++ vtable entries are actually
7360 used. Record for later use during GC. */
7361 case R_NDS32_GNU_VTENTRY
:
7362 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_offset
))
7365 case R_NDS32_RELA_GNU_VTENTRY
:
7366 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
7375 /* Write VAL in uleb128 format to P, returning a pointer to the
7377 This code is copied from elf-attr.c. */
7380 write_uleb128 (bfd_byte
*p
, unsigned int val
)
7395 static bfd_signed_vma
7396 calculate_offset (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
7397 Elf_Internal_Sym
*isymbuf
, Elf_Internal_Shdr
*symtab_hdr
)
7399 bfd_signed_vma foff
;
7400 bfd_vma symval
, addend
;
7403 /* Get the value of the symbol referred to by the reloc. */
7404 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
7406 Elf_Internal_Sym
*isym
;
7408 /* A local symbol. */
7409 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
7411 if (isym
->st_shndx
== SHN_UNDEF
)
7412 sym_sec
= bfd_und_section_ptr
;
7413 else if (isym
->st_shndx
== SHN_ABS
)
7414 sym_sec
= bfd_abs_section_ptr
;
7415 else if (isym
->st_shndx
== SHN_COMMON
)
7416 sym_sec
= bfd_com_section_ptr
;
7418 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
7419 symval
= isym
->st_value
+ sym_sec
->output_section
->vma
7420 + sym_sec
->output_offset
;
7425 struct elf_link_hash_entry
*h
;
7427 /* An external symbol. */
7428 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
7429 h
= elf_sym_hashes (abfd
)[indx
];
7430 BFD_ASSERT (h
!= NULL
);
7432 if (h
->root
.type
!= bfd_link_hash_defined
7433 && h
->root
.type
!= bfd_link_hash_defweak
)
7434 /* This appears to be a reference to an undefined
7435 symbol. Just ignore it--it will be caught by the
7436 regular reloc processing. */
7439 if (h
->root
.u
.def
.section
->flags
& SEC_MERGE
)
7441 sym_sec
= h
->root
.u
.def
.section
;
7442 symval
= _bfd_merged_section_offset (abfd
, &sym_sec
,
7443 elf_section_data (sym_sec
)->sec_info
,
7444 h
->root
.u
.def
.value
);
7445 symval
= symval
+ sym_sec
->output_section
->vma
7446 + sym_sec
->output_offset
;
7449 symval
= (h
->root
.u
.def
.value
7450 + h
->root
.u
.def
.section
->output_section
->vma
7451 + h
->root
.u
.def
.section
->output_offset
);
7454 addend
= irel
->r_addend
;
7456 foff
= (symval
+ addend
7457 - (irel
->r_offset
+ sec
->output_section
->vma
+ sec
->output_offset
));
7462 /* Convert a 32-bit instruction to 16-bit one.
7463 INSN is the input 32-bit instruction, INSN16 is the output 16-bit
7464 instruction. If INSN_TYPE is not NULL, it the CGEN instruction
7465 type of INSN16. Return 1 if successful. */
7468 nds32_convert_32_to_16_alu1 (bfd
*abfd
, uint32_t insn
, uint16_t *pinsn16
,
7471 uint16_t insn16
= 0;
7473 unsigned long mach
= bfd_get_mach (abfd
);
7475 if (N32_SH5 (insn
) != 0)
7478 switch (N32_SUB5 (insn
))
7480 case N32_ALU1_ADD_SLLI
:
7481 case N32_ALU1_ADD_SRLI
:
7482 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IS_RB3 (insn
))
7484 insn16
= N16_TYPE333 (ADD333
, N32_RT5 (insn
), N32_RA5 (insn
),
7486 insn_type
= NDS32_INSN_ADD333
;
7488 else if (N32_IS_RT4 (insn
))
7490 if (N32_RT5 (insn
) == N32_RA5 (insn
))
7491 insn16
= N16_TYPE45 (ADD45
, N32_RT54 (insn
), N32_RB5 (insn
));
7492 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
7493 insn16
= N16_TYPE45 (ADD45
, N32_RT54 (insn
), N32_RA5 (insn
));
7494 insn_type
= NDS32_INSN_ADD45
;
7498 case N32_ALU1_SUB_SLLI
:
7499 case N32_ALU1_SUB_SRLI
:
7500 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IS_RB3 (insn
))
7502 insn16
= N16_TYPE333 (SUB333
, N32_RT5 (insn
), N32_RA5 (insn
),
7504 insn_type
= NDS32_INSN_SUB333
;
7506 else if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
))
7508 insn16
= N16_TYPE45 (SUB45
, N32_RT54 (insn
), N32_RB5 (insn
));
7509 insn_type
= NDS32_INSN_SUB45
;
7513 case N32_ALU1_AND_SLLI
:
7514 case N32_ALU1_AND_SRLI
:
7515 /* and $rt, $rt, $rb -> and33 for v3, v3m. */
7516 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7517 && N32_IS_RB3 (insn
))
7519 if (N32_RT5 (insn
) == N32_RA5 (insn
))
7520 insn16
= N16_MISC33 (AND33
, N32_RT5 (insn
), N32_RB5 (insn
));
7521 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
7522 insn16
= N16_MISC33 (AND33
, N32_RT5 (insn
), N32_RA5 (insn
));
7524 insn_type
= NDS32_INSN_AND33
;
7528 case N32_ALU1_XOR_SLLI
:
7529 case N32_ALU1_XOR_SRLI
:
7530 /* xor $rt, $rt, $rb -> xor33 for v3, v3m. */
7531 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7532 && N32_IS_RB3 (insn
))
7534 if (N32_RT5 (insn
) == N32_RA5 (insn
))
7535 insn16
= N16_MISC33 (XOR33
, N32_RT5 (insn
), N32_RB5 (insn
));
7536 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
7537 insn16
= N16_MISC33 (XOR33
, N32_RT5 (insn
), N32_RA5 (insn
));
7539 insn_type
= NDS32_INSN_XOR33
;
7543 case N32_ALU1_OR_SLLI
:
7544 case N32_ALU1_OR_SRLI
:
7545 /* or $rt, $rt, $rb -> or33 for v3, v3m. */
7546 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7547 && N32_IS_RB3 (insn
))
7549 if (N32_RT5 (insn
) == N32_RA5 (insn
))
7550 insn16
= N16_MISC33 (OR33
, N32_RT5 (insn
), N32_RB5 (insn
));
7551 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
7552 insn16
= N16_MISC33 (OR33
, N32_RT5 (insn
), N32_RA5 (insn
));
7554 insn_type
= NDS32_INSN_OR33
;
7558 /* nor $rt, $ra, $ra -> not33 for v3, v3m. */
7559 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RB3 (insn
)
7560 && N32_RA5 (insn
) == N32_RB5 (insn
))
7562 insn16
= N16_MISC33 (NOT33
, N32_RT5 (insn
), N32_RA5 (insn
));
7563 insn_type
= NDS32_INSN_NOT33
;
7567 if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
))
7569 insn16
= N16_TYPE45 (SRAI45
, N32_RT54 (insn
), N32_UB5 (insn
));
7570 insn_type
= NDS32_INSN_SRAI45
;
7575 if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
))
7577 insn16
= N16_TYPE45 (SRLI45
, N32_RT54 (insn
), N32_UB5 (insn
));
7578 insn_type
= NDS32_INSN_SRLI45
;
7583 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_UB5 (insn
) < 8)
7585 insn16
= N16_TYPE333 (SLLI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7587 insn_type
= NDS32_INSN_SLLI333
;
7592 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
7594 insn16
= N16_BFMI333 (ZEH33
, N32_RT5 (insn
), N32_RA5 (insn
));
7595 insn_type
= NDS32_INSN_ZEH33
;
7600 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
7602 insn16
= N16_BFMI333 (SEB33
, N32_RT5 (insn
), N32_RA5 (insn
));
7603 insn_type
= NDS32_INSN_SEB33
;
7608 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
7610 insn16
= N16_BFMI333 (SEH33
, N32_RT5 (insn
), N32_RA5 (insn
));
7611 insn_type
= NDS32_INSN_SEH33
;
7616 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
))
7619 insn16
= N16_TYPE45 (SLT45
, N32_RA54 (insn
), N32_RB5 (insn
));
7620 insn_type
= NDS32_INSN_SLT45
;
7625 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
))
7628 insn16
= N16_TYPE45 (SLTS45
, N32_RA54 (insn
), N32_RB5 (insn
));
7629 insn_type
= NDS32_INSN_SLTS45
;
7634 if ((insn16
& 0x8000) == 0)
7640 *pinsn_type
= insn_type
;
7645 nds32_convert_32_to_16_alu2 (bfd
*abfd
, uint32_t insn
, uint16_t *pinsn16
,
7648 uint16_t insn16
= 0;
7650 unsigned long mach
= bfd_get_mach (abfd
);
7652 /* TODO: bset, bclr, btgl, btst. */
7653 if (__GF (insn
, 6, 4) != 0)
7656 switch (N32_IMMU (insn
, 6))
7659 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7660 && N32_IS_RB3 (insn
))
7662 if (N32_RT5 (insn
) == N32_RA5 (insn
))
7663 insn16
= N16_MISC33 (MUL33
, N32_RT5 (insn
), N32_RB5 (insn
));
7664 else if (N32_RT5 (insn
) == N32_RB5 (insn
))
7665 insn16
= N16_MISC33 (MUL33
, N32_RT5 (insn
), N32_RA5 (insn
));
7667 insn_type
= NDS32_INSN_MUL33
;
7671 if ((insn16
& 0x8000) == 0)
7677 *pinsn_type
= insn_type
;
7682 nds32_convert_32_to_16 (bfd
*abfd
, uint32_t insn
, uint16_t *pinsn16
,
7686 uint16_t insn16
= 0;
7688 unsigned long mach
= bfd_get_mach (abfd
);
7690 /* Decode 32-bit instruction. */
7691 if (insn
& 0x80000000)
7693 /* Not 32-bit insn. */
7697 op6
= N32_OP6 (insn
);
7699 /* Convert it to 16-bit instruction. */
7703 if (IS_WITHIN_S (N32_IMM20S (insn
), 5))
7705 insn16
= N16_TYPE55 (MOVI55
, N32_RT5 (insn
), N32_IMM20S (insn
));
7706 insn_type
= NDS32_INSN_MOVI55
;
7708 else if (mach
>= MACH_V3
&& N32_IMM20S (insn
) >= 16
7709 && N32_IMM20S (insn
) < 48 && N32_IS_RT4 (insn
))
7711 insn16
= N16_TYPE45 (MOVPI45
, N32_RT54 (insn
),
7712 N32_IMM20S (insn
) - 16);
7713 insn_type
= NDS32_INSN_MOVPI45
;
7718 if (N32_IMM15S (insn
) == 0)
7720 /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
7721 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
7723 || N32_RT5 (insn
) != REG_SP
|| N32_RA5 (insn
) != REG_SP
)
7725 insn16
= N16_TYPE55 (MOV55
, N32_RT5 (insn
), N32_RA5 (insn
));
7726 insn_type
= NDS32_INSN_MOV55
;
7729 else if (N32_IMM15S (insn
) > 0)
7731 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IMM15S (insn
) < 8)
7733 insn16
= N16_TYPE333 (ADDI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7735 insn_type
= NDS32_INSN_ADDI333
;
7737 else if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
)
7738 && N32_IMM15S (insn
) < 32)
7740 insn16
= N16_TYPE45 (ADDI45
, N32_RT54 (insn
), N32_IMM15S (insn
));
7741 insn_type
= NDS32_INSN_ADDI45
;
7743 else if (mach
>= MACH_V2
&& N32_RT5 (insn
) == REG_SP
7744 && N32_RT5 (insn
) == N32_RA5 (insn
)
7745 && N32_IMM15S (insn
) < 512)
7747 insn16
= N16_TYPE10 (ADDI10S
, N32_IMM15S (insn
));
7748 insn_type
= NDS32_INSN_ADDI10_SP
;
7750 else if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
)
7751 && N32_RA5 (insn
) == REG_SP
&& N32_IMM15S (insn
) < 256
7752 && (N32_IMM15S (insn
) % 4 == 0))
7754 insn16
= N16_TYPE36 (ADDRI36_SP
, N32_RT5 (insn
),
7755 N32_IMM15S (insn
) >> 2);
7756 insn_type
= NDS32_INSN_ADDRI36_SP
;
7762 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
) && N32_IMM15S (insn
) > -8)
7764 insn16
= N16_TYPE333 (SUBI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7765 0 - N32_IMM15S (insn
));
7766 insn_type
= NDS32_INSN_SUBI333
;
7768 else if (N32_IS_RT4 (insn
) && N32_RT5 (insn
) == N32_RA5 (insn
)
7769 && N32_IMM15S (insn
) > -32)
7771 insn16
= N16_TYPE45 (SUBI45
, N32_RT54 (insn
),
7772 0 - N32_IMM15S (insn
));
7773 insn_type
= NDS32_INSN_SUBI45
;
7775 else if (mach
>= MACH_V2
&& N32_RT5 (insn
) == REG_SP
7776 && N32_RT5 (insn
) == N32_RA5 (insn
)
7777 && N32_IMM15S (insn
) >= -512)
7779 insn16
= N16_TYPE10 (ADDI10S
, N32_IMM15S (insn
));
7780 insn_type
= NDS32_INSN_ADDI10_SP
;
7786 if (N32_IMM15S (insn
) == 0)
7788 /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
7789 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
7791 || N32_RT5 (insn
) != REG_SP
|| N32_RA5 (insn
) != REG_SP
)
7793 insn16
= N16_TYPE55 (MOV55
, N32_RT5 (insn
), N32_RA5 (insn
));
7794 insn_type
= NDS32_INSN_MOV55
;
7800 if (mach
>= MACH_V3
&& N32_IS_RT3 (insn
)
7801 && N32_IS_RA3 (insn
) && N32_IMM15S (insn
) == 0)
7803 insn16
= N16_MISC33 (NEG33
, N32_RT5 (insn
), N32_RA5 (insn
));
7804 insn_type
= NDS32_INSN_NEG33
;
7809 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
))
7811 if (N32_IMM15U (insn
) == 1)
7813 insn16
= N16_BFMI333 (XLSB33
, N32_RT5 (insn
), N32_RA5 (insn
));
7814 insn_type
= NDS32_INSN_XLSB33
;
7816 else if (N32_IMM15U (insn
) == 0x7ff)
7818 insn16
= N16_BFMI333 (X11B33
, N32_RT5 (insn
), N32_RA5 (insn
));
7819 insn_type
= NDS32_INSN_X11B33
;
7821 else if (N32_IMM15U (insn
) == 0xff)
7823 insn16
= N16_BFMI333 (ZEB33
, N32_RT5 (insn
), N32_RA5 (insn
));
7824 insn_type
= NDS32_INSN_ZEB33
;
7826 else if (mach
>= MACH_V3
&& N32_RT5 (insn
) == N32_RA5 (insn
)
7827 && N32_IMM15U (insn
) < 256)
7829 int imm15u
= N32_IMM15U (insn
);
7831 if (__builtin_popcount (imm15u
) == 1)
7834 int imm3u
= __builtin_ctz (imm15u
);
7836 insn16
= N16_BFMI333 (BMSKI33
, N32_RT5 (insn
), imm3u
);
7837 insn_type
= NDS32_INSN_BMSKI33
;
7839 else if (imm15u
!= 0 && __builtin_popcount (imm15u
+ 1) == 1)
7842 int imm3u
= __builtin_ctz (imm15u
+ 1) - 1;
7844 insn16
= N16_BFMI333 (FEXTI33
, N32_RT5 (insn
), imm3u
);
7845 insn_type
= NDS32_INSN_FEXTI33
;
7852 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
)
7853 && IS_WITHIN_U (N32_IMM15S (insn
), 5))
7855 insn16
= N16_TYPE45 (SLTI45
, N32_RA54 (insn
), N32_IMM15S (insn
));
7856 insn_type
= NDS32_INSN_SLTI45
;
7861 if (N32_RT5 (insn
) == REG_R15
&& N32_IS_RA4 (insn
)
7862 && IS_WITHIN_U (N32_IMM15S (insn
), 5))
7864 insn16
= N16_TYPE45 (SLTSI45
, N32_RA54 (insn
), N32_IMM15S (insn
));
7865 insn_type
= NDS32_INSN_SLTSI45
;
7870 if (N32_IS_RT4 (insn
) && N32_IMM15S (insn
) == 0)
7872 insn16
= N16_TYPE45 (LWI450
, N32_RT54 (insn
), N32_RA5 (insn
));
7873 insn_type
= NDS32_INSN_LWI450
;
7875 else if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7876 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7878 insn16
= N16_TYPE333 (LWI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7880 insn_type
= NDS32_INSN_LWI333
;
7882 else if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_FP
7883 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7885 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 0, N32_IMM15S (insn
));
7886 insn_type
= NDS32_INSN_LWI37
;
7888 else if (mach
>= MACH_V2
&& N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_SP
7889 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7891 insn16
= N16_TYPE37 (XWI37SP
, N32_RT5 (insn
), 0, N32_IMM15S (insn
));
7892 insn_type
= NDS32_INSN_LWI37_SP
;
7894 else if (mach
>= MACH_V2
&& N32_IS_RT4 (insn
) && N32_RA5 (insn
) == REG_R8
7895 && -32 <= N32_IMM15S (insn
) && N32_IMM15S (insn
) < 0)
7897 insn16
= N16_TYPE45 (LWI45_FE
, N32_RT54 (insn
),
7898 N32_IMM15S (insn
) + 32);
7899 insn_type
= NDS32_INSN_LWI45_FE
;
7904 if (N32_IS_RT4 (insn
) && N32_IMM15S (insn
) == 0)
7906 insn16
= N16_TYPE45 (SWI450
, N32_RT54 (insn
), N32_RA5 (insn
));
7907 insn_type
= NDS32_INSN_SWI450
;
7909 else if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7910 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7912 insn16
= N16_TYPE333 (SWI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7914 insn_type
= NDS32_INSN_SWI333
;
7916 else if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_FP
7917 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7919 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 1, N32_IMM15S (insn
));
7920 insn_type
= NDS32_INSN_SWI37
;
7922 else if (mach
>= MACH_V2
&& N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_SP
7923 && IS_WITHIN_U (N32_IMM15S (insn
), 7))
7925 insn16
= N16_TYPE37 (XWI37SP
, N32_RT5 (insn
), 1, N32_IMM15S (insn
));
7926 insn_type
= NDS32_INSN_SWI37_SP
;
7930 case N32_OP6_LWI_BI
:
7931 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7932 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7934 insn16
= N16_TYPE333 (LWI333_BI
, N32_RT5 (insn
), N32_RA5 (insn
),
7936 insn_type
= NDS32_INSN_LWI333_BI
;
7940 case N32_OP6_SWI_BI
:
7941 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7942 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7944 insn16
= N16_TYPE333 (SWI333_BI
, N32_RT5 (insn
), N32_RA5 (insn
),
7946 insn_type
= NDS32_INSN_SWI333_BI
;
7951 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7952 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7954 insn16
= N16_TYPE333 (LHI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7956 insn_type
= NDS32_INSN_LHI333
;
7961 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7962 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7964 insn16
= N16_TYPE333 (SHI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7966 insn_type
= NDS32_INSN_SHI333
;
7971 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7972 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7974 insn16
= N16_TYPE333 (LBI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7976 insn_type
= NDS32_INSN_LBI333
;
7981 if (N32_IS_RT3 (insn
) && N32_IS_RA3 (insn
)
7982 && IS_WITHIN_U (N32_IMM15S (insn
), 3))
7984 insn16
= N16_TYPE333 (SBI333
, N32_RT5 (insn
), N32_RA5 (insn
),
7986 insn_type
= NDS32_INSN_SBI333
;
7991 return nds32_convert_32_to_16_alu1 (abfd
, insn
, pinsn16
, pinsn_type
);
7994 return nds32_convert_32_to_16_alu2 (abfd
, insn
, pinsn16
, pinsn_type
);
7997 if (!IS_WITHIN_S (N32_IMM14S (insn
), 8))
8000 if ((insn
& N32_BIT (14)) == 0)
8003 if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_R5
8004 && N32_RT5 (insn
) != REG_R5
)
8005 insn16
= N16_TYPE38 (BEQS38
, N32_RT5 (insn
), N32_IMM14S (insn
));
8006 else if (N32_IS_RA3 (insn
) && N32_RT5 (insn
) == REG_R5
8007 && N32_RA5 (insn
) != REG_R5
)
8008 insn16
= N16_TYPE38 (BEQS38
, N32_RA5 (insn
), N32_IMM14S (insn
));
8009 insn_type
= NDS32_INSN_BEQS38
;
8015 if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_R5
8016 && N32_RT5 (insn
) != REG_R5
)
8017 insn16
= N16_TYPE38 (BNES38
, N32_RT5 (insn
), N32_IMM14S (insn
));
8018 else if (N32_IS_RA3 (insn
) && N32_RT5 (insn
) == REG_R5
8019 && N32_RA5 (insn
) != REG_R5
)
8020 insn16
= N16_TYPE38 (BNES38
, N32_RA5 (insn
), N32_IMM14S (insn
));
8021 insn_type
= NDS32_INSN_BNES38
;
8027 switch (N32_BR2_SUB (insn
))
8030 if (N32_IS_RT3 (insn
) && IS_WITHIN_S (N32_IMM16S (insn
), 8))
8032 insn16
= N16_TYPE38 (BEQZ38
, N32_RT5 (insn
), N32_IMM16S (insn
));
8033 insn_type
= NDS32_INSN_BEQZ38
;
8035 else if (N32_RT5 (insn
) == REG_R15
8036 && IS_WITHIN_S (N32_IMM16S (insn
), 8))
8038 insn16
= N16_TYPE8 (BEQZS8
, N32_IMM16S (insn
));
8039 insn_type
= NDS32_INSN_BEQZS8
;
8044 if (N32_IS_RT3 (insn
) && IS_WITHIN_S (N32_IMM16S (insn
), 8))
8046 insn16
= N16_TYPE38 (BNEZ38
, N32_RT5 (insn
), N32_IMM16S (insn
));
8047 insn_type
= NDS32_INSN_BNEZ38
;
8049 else if (N32_RT5 (insn
) == REG_R15
8050 && IS_WITHIN_S (N32_IMM16S (insn
), 8))
8052 insn16
= N16_TYPE8 (BNEZS8
, N32_IMM16S (insn
));
8053 insn_type
= NDS32_INSN_BNEZS8
;
8058 if (__GF (insn
, 20, 5) == 0 && IS_WITHIN_U (N32_IMM16S (insn
), 9))
8060 insn16
= N16_TYPE9 (IFCALL9
, N32_IMM16S (insn
));
8061 insn_type
= NDS32_INSN_IFCALL9
;
8068 if ((insn
& N32_BIT (24)) == 0)
8071 if (IS_WITHIN_S (N32_IMM24S (insn
), 8))
8073 insn16
= N16_TYPE8 (J8
, N32_IMM24S (insn
));
8074 insn_type
= NDS32_INSN_J8
;
8080 if (__GF (insn
, 8, 2) != 0)
8083 switch (N32_IMMU (insn
, 5))
8086 if (N32_JREG_HINT (insn
) == 0)
8089 insn16
= N16_TYPE5 (JR5
, N32_RB5 (insn
));
8090 insn_type
= NDS32_INSN_JR5
;
8092 else if (N32_JREG_HINT (insn
) == 1)
8095 insn16
= N16_TYPE5 (RET5
, N32_RB5 (insn
));
8096 insn_type
= NDS32_INSN_RET5
;
8098 else if (N32_JREG_HINT (insn
) == 3)
8100 /* ifret = mov55 $sp, $sp */
8101 insn16
= N16_TYPE55 (MOV55
, REG_SP
, REG_SP
);
8102 insn_type
= NDS32_INSN_IFRET
;
8107 /* It's convertible when return rt5 is $lp and address
8108 translation is kept. */
8109 if (N32_RT5 (insn
) == REG_LP
&& N32_JREG_HINT (insn
) == 0)
8111 insn16
= N16_TYPE5 (JRAL5
, N32_RB5 (insn
));
8112 insn_type
= NDS32_INSN_JRAL5
;
8119 if (N32_SUB5 (insn
) == N32_MISC_BREAK
&& N32_SWID (insn
) < 32)
8121 /* For v3, swid above 31 are used for ex9.it. */
8122 insn16
= N16_TYPE5 (BREAK16
, N32_SWID (insn
));
8123 insn_type
= NDS32_INSN_BREAK16
;
8128 /* This instruction has no 16-bit variant. */
8133 /* Bit-15 of insn16 should be set for a valid instruction. */
8134 if ((insn16
& 0x8000) == 0)
8140 *pinsn_type
= insn_type
;
8145 special_convert_32_to_16 (unsigned long insn
, uint16_t *pinsn16
,
8146 Elf_Internal_Rela
*reloc
)
8148 uint16_t insn16
= 0;
8150 if ((reloc
->r_addend
& R_NDS32_INSN16_FP7U2_FLAG
) == 0
8151 || (ELF32_R_TYPE (reloc
->r_info
) != R_NDS32_INSN16
))
8154 if (!N32_IS_RT3 (insn
))
8157 switch (N32_OP6 (insn
))
8160 if (N32_RA5 (insn
) == REG_GP
&& IS_WITHIN_U (N32_IMM15S (insn
), 7))
8161 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 0, N32_IMM15S (insn
));
8164 if (N32_RA5 (insn
) == REG_GP
&& IS_WITHIN_U (N32_IMM15S (insn
), 7))
8165 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 1, N32_IMM15S (insn
));
8168 if (!IS_WITHIN_U (N32_IMM17S (insn
), 7))
8171 if (__GF (insn
, 17, 3) == 6)
8172 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 0, N32_IMM17S (insn
));
8173 else if (__GF (insn
, 17, 3) == 7)
8174 insn16
= N16_TYPE37 (XWI37
, N32_RT5 (insn
), 1, N32_IMM17S (insn
));
8178 if ((insn16
& 0x8000) == 0)
8185 /* Convert a 16-bit instruction to 32-bit one.
8186 INSN16 it the input and PINSN it the point to output.
8187 Return non-zero on successful. Otherwise 0 is returned. */
8190 nds32_convert_16_to_32 (bfd
*abfd
, uint16_t insn16
, uint32_t *pinsn
)
8192 uint32_t insn
= 0xffffffff;
8193 unsigned long mach
= bfd_get_mach (abfd
);
8195 /* NOTE: push25, pop25 and movd44 do not have 32-bit variants. */
8197 switch (__GF (insn16
, 9, 6))
8199 case 0x4: /* add45 */
8200 insn
= N32_ALU1 (ADD
, N16_RT4 (insn16
), N16_RT4 (insn16
),
8203 case 0x5: /* sub45 */
8204 insn
= N32_ALU1 (SUB
, N16_RT4 (insn16
), N16_RT4 (insn16
),
8207 case 0x6: /* addi45 */
8208 insn
= N32_TYPE2 (ADDI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
8209 N16_IMM5U (insn16
));
8211 case 0x7: /* subi45 */
8212 insn
= N32_TYPE2 (ADDI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
8213 -N16_IMM5U (insn16
));
8215 case 0x8: /* srai45 */
8216 insn
= N32_ALU1 (SRAI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
8217 N16_IMM5U (insn16
));
8219 case 0x9: /* srli45 */
8220 insn
= N32_ALU1 (SRLI
, N16_RT4 (insn16
), N16_RT4 (insn16
),
8221 N16_IMM5U (insn16
));
8223 case 0xa: /* slli333 */
8224 insn
= N32_ALU1 (SLLI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8225 N16_IMM3U (insn16
));
8227 case 0xc: /* add333 */
8228 insn
= N32_ALU1 (ADD
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8231 case 0xd: /* sub333 */
8232 insn
= N32_ALU1 (SUB
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8235 case 0xe: /* addi333 */
8236 insn
= N32_TYPE2 (ADDI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8237 N16_IMM3U (insn16
));
8239 case 0xf: /* subi333 */
8240 insn
= N32_TYPE2 (ADDI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8241 -N16_IMM3U (insn16
));
8243 case 0x10: /* lwi333 */
8244 insn
= N32_TYPE2 (LWI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8245 N16_IMM3U (insn16
));
8247 case 0x12: /* lhi333 */
8248 insn
= N32_TYPE2 (LHI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8249 N16_IMM3U (insn16
));
8251 case 0x13: /* lbi333 */
8252 insn
= N32_TYPE2 (LBI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8253 N16_IMM3U (insn16
));
8255 case 0x11: /* lwi333.bi */
8256 insn
= N32_TYPE2 (LWI_BI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8257 N16_IMM3U (insn16
));
8259 case 0x14: /* swi333 */
8260 insn
= N32_TYPE2 (SWI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8261 N16_IMM3U (insn16
));
8263 case 0x16: /* shi333 */
8264 insn
= N32_TYPE2 (SHI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8265 N16_IMM3U (insn16
));
8267 case 0x17: /* sbi333 */
8268 insn
= N32_TYPE2 (SBI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8269 N16_IMM3U (insn16
));
8271 case 0x15: /* swi333.bi */
8272 insn
= N32_TYPE2 (SWI_BI
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8273 N16_IMM3U (insn16
));
8275 case 0x18: /* addri36.sp */
8276 insn
= N32_TYPE2 (ADDI
, N16_RT3 (insn16
), REG_SP
,
8277 N16_IMM6U (insn16
) << 2);
8279 case 0x19: /* lwi45.fe */
8280 insn
= N32_TYPE2 (LWI
, N16_RT4 (insn16
), REG_R8
,
8281 (N16_IMM5U (insn16
) - 32));
8283 case 0x1a: /* lwi450 */
8284 insn
= N32_TYPE2 (LWI
, N16_RT4 (insn16
), N16_RA5 (insn16
), 0);
8286 case 0x1b: /* swi450 */
8287 insn
= N32_TYPE2 (SWI
, N16_RT4 (insn16
), N16_RA5 (insn16
), 0);
8290 /* These are r15 implied instructions. */
8291 case 0x30: /* slts45 */
8292 insn
= N32_ALU1 (SLTS
, REG_TA
, N16_RT4 (insn16
), N16_RA5 (insn16
));
8294 case 0x31: /* slt45 */
8295 insn
= N32_ALU1 (SLT
, REG_TA
, N16_RT4 (insn16
), N16_RA5 (insn16
));
8297 case 0x32: /* sltsi45 */
8298 insn
= N32_TYPE2 (SLTSI
, REG_TA
, N16_RT4 (insn16
), N16_IMM5U (insn16
));
8300 case 0x33: /* slti45 */
8301 insn
= N32_TYPE2 (SLTI
, REG_TA
, N16_RT4 (insn16
), N16_IMM5U (insn16
));
8303 case 0x34: /* beqzs8, bnezs8 */
8304 if (insn16
& N32_BIT (8))
8305 insn
= N32_BR2 (BNEZ
, REG_TA
, N16_IMM8S (insn16
));
8307 insn
= N32_BR2 (BEQZ
, REG_TA
, N16_IMM8S (insn16
));
8310 case 0x35: /* break16, ex9.it */
8311 /* Only consider range of v3 break16. */
8312 insn
= N32_TYPE0 (MISC
, (N16_IMM5U (insn16
) << 5) | N32_MISC_BREAK
);
8315 case 0x3c: /* ifcall9 */
8316 insn
= N32_BR2 (SOP0
, 0, N16_IMM9U (insn16
));
8318 case 0x3d: /* movpi45 */
8319 insn
= N32_TYPE1 (MOVI
, N16_RT4 (insn16
), N16_IMM5U (insn16
) + 16);
8322 case 0x3f: /* MISC33 */
8323 switch (insn16
& 0x7)
8326 insn
= N32_TYPE2 (SUBRI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
8329 insn
= N32_ALU1 (NOR
, N16_RT3 (insn16
), N16_RA3 (insn16
),
8333 insn
= N32_ALU2 (MUL
, N16_RT3 (insn16
), N16_RT3 (insn16
),
8337 insn
= N32_ALU1 (XOR
, N16_RT3 (insn16
), N16_RT3 (insn16
),
8341 insn
= N32_ALU1 (AND
, N16_RT3 (insn16
), N16_RT3 (insn16
),
8345 insn
= N32_ALU1 (OR
, N16_RT3 (insn16
), N16_RT3 (insn16
),
8352 switch (insn16
& 0x7)
8355 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0xff);
8358 insn
= N32_ALU1 (ZEH
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
8361 insn
= N32_ALU1 (SEB
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
8364 insn
= N32_ALU1 (SEH
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0);
8366 case 4: /* xlsb33 */
8367 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 1);
8369 case 5: /* x11b33 */
8370 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RA3 (insn16
), 0x7ff);
8372 case 6: /* bmski33 */
8373 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RT3 (insn16
),
8374 1 << __GF (insn16
, 3, 3));
8376 case 7: /* fexti33 */
8377 insn
= N32_TYPE2 (ANDI
, N16_RT3 (insn16
), N16_RT3 (insn16
),
8378 (1 << (__GF (insn16
, 3, 3) + 1)) - 1);
8384 switch (__GF (insn16
, 10, 5))
8386 case 0x0: /* mov55 or ifret16 */
8387 if (mach
>= MACH_V3
&& N16_RT5 (insn16
) == REG_SP
8388 && N16_RT5 (insn16
) == N16_RA5 (insn16
))
8389 insn
= N32_JREG (JR
, 0, 0, 0, 3);
8391 insn
= N32_TYPE2 (ADDI
, N16_RT5 (insn16
), N16_RA5 (insn16
), 0);
8393 case 0x1: /* movi55 */
8394 insn
= N32_TYPE1 (MOVI
, N16_RT5 (insn16
), N16_IMM5S (insn16
));
8396 case 0x1b: /* addi10s (V2) */
8397 insn
= N32_TYPE2 (ADDI
, REG_SP
, REG_SP
, N16_IMM10S (insn16
));
8401 switch (__GF (insn16
, 11, 4))
8403 case 0x7: /* lwi37.fp/swi37.fp */
8404 if (insn16
& N32_BIT (7)) /* swi37.fp */
8405 insn
= N32_TYPE2 (SWI
, N16_RT38 (insn16
), REG_FP
, N16_IMM7U (insn16
));
8407 insn
= N32_TYPE2 (LWI
, N16_RT38 (insn16
), REG_FP
, N16_IMM7U (insn16
));
8409 case 0x8: /* beqz38 */
8410 insn
= N32_BR2 (BEQZ
, N16_RT38 (insn16
), N16_IMM8S (insn16
));
8412 case 0x9: /* bnez38 */
8413 insn
= N32_BR2 (BNEZ
, N16_RT38 (insn16
), N16_IMM8S (insn16
));
8415 case 0xa: /* beqs38/j8, implied r5 */
8416 if (N16_RT38 (insn16
) == 5)
8417 insn
= N32_JI (J
, N16_IMM8S (insn16
));
8419 insn
= N32_BR1 (BEQ
, N16_RT38 (insn16
), REG_R5
, N16_IMM8S (insn16
));
8421 case 0xb: /* bnes38 and others. */
8422 if (N16_RT38 (insn16
) == 5)
8424 switch (__GF (insn16
, 5, 3))
8427 insn
= N32_JREG (JR
, 0, N16_RA5 (insn16
), 0, 0);
8430 insn
= N32_JREG (JR
, 0, N16_RA5 (insn16
), 0, 1);
8433 insn
= N32_JREG (JRAL
, REG_LP
, N16_RA5 (insn16
), 0, 0);
8435 case 2: /* ex9.it imm5 */
8436 /* ex9.it had no 32-bit variantl. */
8438 case 5: /* add5.pc */
8439 /* add5.pc had no 32-bit variantl. */
8444 insn
= N32_BR1 (BNE
, N16_RT38 (insn16
), REG_R5
, N16_IMM8S (insn16
));
8446 case 0xe: /* lwi37/swi37 */
8447 if (insn16
& (1 << 7)) /* swi37.sp */
8448 insn
= N32_TYPE2 (SWI
, N16_RT38 (insn16
), REG_SP
, N16_IMM7U (insn16
));
8450 insn
= N32_TYPE2 (LWI
, N16_RT38 (insn16
), REG_SP
, N16_IMM7U (insn16
));
8455 if (insn
& 0x80000000)
8465 is_sda_access_insn (unsigned long insn
)
8467 switch (N32_OP6 (insn
))
8488 static unsigned long
8489 turn_insn_to_sda_access (uint32_t insn
, bfd_signed_vma type
, uint32_t *pinsn
)
8495 case R_NDS32_GOT_LO12
:
8496 case R_NDS32_GOTOFF_LO12
:
8497 case R_NDS32_PLTREL_LO12
:
8498 case R_NDS32_PLT_GOTREL_LO12
:
8499 case R_NDS32_LO12S0_RELA
:
8500 switch (N32_OP6 (insn
))
8504 oinsn
= N32_TYPE1 (LBGP
, N32_RT5 (insn
), 0);
8508 oinsn
= N32_TYPE1 (LBGP
, N32_RT5 (insn
), N32_BIT (19));
8512 oinsn
= N32_TYPE1 (SBGP
, N32_RT5 (insn
), 0);
8516 oinsn
= N32_TYPE1 (SBGP
, N32_RT5 (insn
), N32_BIT (19));
8521 case R_NDS32_LO12S1_RELA
:
8522 switch (N32_OP6 (insn
))
8526 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), 0);
8530 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), N32_BIT (18));
8534 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), N32_BIT (19));
8539 case R_NDS32_LO12S2_RELA
:
8540 switch (N32_OP6 (insn
))
8544 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __MF (6, 17, 3));
8548 oinsn
= N32_TYPE1 (HWGP
, N32_RT5 (insn
), __MF (7, 17, 3));
8553 case R_NDS32_LO12S2_DP_RELA
:
8554 case R_NDS32_LO12S2_SP_RELA
:
8555 oinsn
= (insn
& 0x7ff07000) | (REG_GP
<< 15);
8565 /* Linker hasn't found the correct merge section for non-section symbol
8566 in relax time, this work is left to the function elf_link_input_bfd().
8567 So for non-section symbol, _bfd_merged_section_offset is also needed
8568 to find the correct symbol address. */
8571 nds32_elf_rela_local_sym (bfd
*abfd
, Elf_Internal_Sym
*sym
,
8572 asection
**psec
, Elf_Internal_Rela
*rel
)
8574 asection
*sec
= *psec
;
8577 relocation
= (sec
->output_section
->vma
8578 + sec
->output_offset
+ sym
->st_value
);
8579 if ((sec
->flags
& SEC_MERGE
) && sec
->sec_info_type
== SEC_INFO_TYPE_MERGE
)
8581 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
8583 _bfd_merged_section_offset (abfd
, psec
,
8584 elf_section_data (sec
)->sec_info
,
8585 sym
->st_value
+ rel
->r_addend
);
8588 _bfd_merged_section_offset (abfd
, psec
,
8589 elf_section_data (sec
)->sec_info
,
8590 sym
->st_value
) + rel
->r_addend
;
8594 /* If we have changed the section, and our original section is
8595 marked with SEC_EXCLUDE, it means that the original
8596 SEC_MERGE section has been completely subsumed in some
8597 other SEC_MERGE section. In this case, we need to leave
8598 some info around for --emit-relocs. */
8599 if ((sec
->flags
& SEC_EXCLUDE
) != 0)
8600 sec
->kept_section
= *psec
;
8603 rel
->r_addend
-= relocation
;
8604 rel
->r_addend
+= sec
->output_section
->vma
+ sec
->output_offset
;
8610 calculate_memory_address (bfd
*abfd
, Elf_Internal_Rela
*irel
,
8611 Elf_Internal_Sym
*isymbuf
,
8612 Elf_Internal_Shdr
*symtab_hdr
)
8614 bfd_signed_vma foff
;
8615 bfd_vma symval
, addend
;
8616 Elf_Internal_Rela irel_fn
;
8617 Elf_Internal_Sym
*isym
;
8620 /* Get the value of the symbol referred to by the reloc. */
8621 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
8623 /* A local symbol. */
8624 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
8626 if (isym
->st_shndx
== SHN_UNDEF
)
8627 sym_sec
= bfd_und_section_ptr
;
8628 else if (isym
->st_shndx
== SHN_ABS
)
8629 sym_sec
= bfd_abs_section_ptr
;
8630 else if (isym
->st_shndx
== SHN_COMMON
)
8631 sym_sec
= bfd_com_section_ptr
;
8633 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
8634 memcpy (&irel_fn
, irel
, sizeof (Elf_Internal_Rela
));
8635 symval
= nds32_elf_rela_local_sym (abfd
, isym
, &sym_sec
, &irel_fn
);
8636 addend
= irel_fn
.r_addend
;
8641 struct elf_link_hash_entry
*h
;
8643 /* An external symbol. */
8644 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
8645 h
= elf_sym_hashes (abfd
)[indx
];
8646 BFD_ASSERT (h
!= NULL
);
8648 while (h
->root
.type
== bfd_link_hash_indirect
8649 || h
->root
.type
== bfd_link_hash_warning
)
8650 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
8652 if (h
->root
.type
!= bfd_link_hash_defined
8653 && h
->root
.type
!= bfd_link_hash_defweak
)
8654 /* This appears to be a reference to an undefined
8655 symbol. Just ignore it--it will be caught by the
8656 regular reloc processing. */
8659 if (h
->root
.u
.def
.section
->flags
& SEC_MERGE
)
8661 sym_sec
= h
->root
.u
.def
.section
;
8662 symval
= _bfd_merged_section_offset (abfd
, &sym_sec
, elf_section_data
8663 (sym_sec
)->sec_info
, h
->root
.u
.def
.value
);
8664 symval
= symval
+ sym_sec
->output_section
->vma
8665 + sym_sec
->output_offset
;
8668 symval
= (h
->root
.u
.def
.value
8669 + h
->root
.u
.def
.section
->output_section
->vma
8670 + h
->root
.u
.def
.section
->output_offset
);
8671 addend
= irel
->r_addend
;
8674 foff
= symval
+ addend
;
8680 is_16bit_NOP (bfd
*abfd ATTRIBUTE_UNUSED
,
8681 asection
*sec
, Elf_Internal_Rela
*rel
)
8684 unsigned short insn16
;
8686 if (!(rel
->r_addend
& R_NDS32_INSN16_CONVERT_FLAG
))
8688 contents
= elf_section_data (sec
)->this_hdr
.contents
;
8689 insn16
= bfd_getb16 (contents
+ rel
->r_offset
);
8690 if (insn16
== NDS32_NOP16
)
8695 /* It checks whether the instruction could be converted to
8696 16-bit form and returns the converted one.
8698 `internal_relocs' is supposed to be sorted. */
8701 is_convert_32_to_16 (bfd
*abfd
, asection
*sec
,
8702 Elf_Internal_Rela
*reloc
,
8703 Elf_Internal_Rela
*internal_relocs
,
8704 Elf_Internal_Rela
*irelend
,
8707 #define NORMAL_32_TO_16 (1 << 0)
8708 #define SPECIAL_32_TO_16 (1 << 1)
8709 bfd_byte
*contents
= NULL
;
8713 Elf_Internal_Rela
*pc_rel
;
8714 Elf_Internal_Shdr
*symtab_hdr
;
8715 Elf_Internal_Sym
*isymbuf
= NULL
;
8719 if (reloc
->r_offset
+ 4 > sec
->size
)
8722 offset
= reloc
->r_offset
;
8724 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
))
8726 insn
= bfd_getb32 (contents
+ offset
);
8728 if (nds32_convert_32_to_16 (abfd
, insn
, insn16
, NULL
))
8729 convert_type
= NORMAL_32_TO_16
;
8730 else if (special_convert_32_to_16 (insn
, insn16
, reloc
))
8731 convert_type
= SPECIAL_32_TO_16
;
8735 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
8736 if (!nds32_get_local_syms (abfd
, sec
, &isymbuf
))
8739 /* Find the first relocation of the same relocation-type,
8740 so we iteratie them forward. */
8742 while ((pc_rel
- 1) >= internal_relocs
&& pc_rel
[-1].r_offset
== offset
)
8745 for (; pc_rel
< irelend
&& pc_rel
->r_offset
== offset
; pc_rel
++)
8747 if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_15_PCREL_RELA
8748 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17_PCREL_RELA
8749 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PCREL_RELA
8750 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PLTREL
)
8752 off
= calculate_offset (abfd
, sec
, pc_rel
, isymbuf
, symtab_hdr
);
8753 if (off
>= ACCURATE_8BIT_S1
|| off
< -ACCURATE_8BIT_S1
8758 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_20_RELA
)
8760 /* movi => movi55 */
8761 mem_addr
= calculate_memory_address (abfd
, pc_rel
, isymbuf
,
8763 /* mem_addr is unsigned, but the value should
8764 be between [-16, 15]. */
8765 if ((mem_addr
+ 0x10) >> 5)
8769 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_TLS_LE_20
)
8770 || (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_TLS_LE_LO12
))
8772 /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
8773 because it can be relaxed to addi for TLS_LE_ADD. */
8776 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA15S2_RELA
8777 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA17S2_RELA
)
8778 && (reloc
->r_addend
& R_NDS32_INSN16_FP7U2_FLAG
)
8779 && convert_type
== SPECIAL_32_TO_16
)
8782 We've selected a best fp-base for this access, so we can
8783 always resolve it anyway. Do nothing. */
8786 else if ((ELF32_R_TYPE (pc_rel
->r_info
) > R_NDS32_NONE
8787 && (ELF32_R_TYPE (pc_rel
->r_info
) < R_NDS32_RELA_GNU_VTINHERIT
))
8788 || ((ELF32_R_TYPE (pc_rel
->r_info
) > R_NDS32_RELA_GNU_VTENTRY
)
8789 && (ELF32_R_TYPE (pc_rel
->r_info
) < R_NDS32_INSN16
))
8790 || ((ELF32_R_TYPE (pc_rel
->r_info
) > R_NDS32_LOADSTORE
)
8791 && (ELF32_R_TYPE (pc_rel
->r_info
) < R_NDS32_DWARF2_OP1_RELA
)))
8793 /* Prevent unresolved addi instruction translate
8794 to addi45 or addi333. */
8797 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
))
8799 off
= calculate_offset (abfd
, sec
, pc_rel
, isymbuf
, symtab_hdr
);
8800 if (off
>= ACCURATE_U9BIT_S1
|| off
<= 0)
8810 nds32_elf_write_16 (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_byte
*contents
,
8811 Elf_Internal_Rela
*reloc
,
8812 Elf_Internal_Rela
*internal_relocs
,
8813 Elf_Internal_Rela
*irelend
,
8814 unsigned short insn16
)
8816 Elf_Internal_Rela
*pc_rel
;
8819 offset
= reloc
->r_offset
;
8820 bfd_putb16 (insn16
, contents
+ offset
);
8821 /* Find the first relocation of the same relocation-type,
8822 so we iteratie them forward. */
8824 while ((pc_rel
- 1) > internal_relocs
&& pc_rel
[-1].r_offset
== offset
)
8827 for (; pc_rel
< irelend
&& pc_rel
->r_offset
== offset
; pc_rel
++)
8829 if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_15_PCREL_RELA
8830 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17_PCREL_RELA
8831 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PCREL_RELA
)
8834 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_9_PCREL_RELA
);
8836 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_25_PLTREL
)
8838 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_9_PLTREL
);
8839 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_20_RELA
)
8841 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_5_RELA
);
8842 else if (ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA15S2_RELA
8843 || ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_SDA17S2_RELA
)
8845 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_SDA_FP7U2_RELA
);
8846 else if ((ELF32_R_TYPE (pc_rel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
))
8848 ELF32_R_INFO (ELF32_R_SYM (pc_rel
->r_info
), R_NDS32_10IFCU_PCREL_RELA
);
8852 /* Find a relocation of type specified by `reloc_type'
8853 of the same r_offset with reloc.
8854 If not found, return irelend.
8856 Assuming relocations are sorted by r_offset,
8857 we find the relocation from `reloc' backward untill relocs,
8858 or find it from `reloc' forward untill irelend. */
8860 static Elf_Internal_Rela
*
8861 find_relocs_at_address (Elf_Internal_Rela
*reloc
,
8862 Elf_Internal_Rela
*relocs
,
8863 Elf_Internal_Rela
*irelend
,
8864 enum elf_nds32_reloc_type reloc_type
)
8866 Elf_Internal_Rela
*rel_t
;
8868 /* Find backward. */
8870 rel_t
>= relocs
&& rel_t
->r_offset
== reloc
->r_offset
;
8872 if (ELF32_R_TYPE (rel_t
->r_info
) == reloc_type
)
8875 /* We didn't find it backward. Try find it forward. */
8877 rel_t
< irelend
&& rel_t
->r_offset
== reloc
->r_offset
;
8879 if (ELF32_R_TYPE (rel_t
->r_info
) == reloc_type
)
8885 /* Find a relocation of specified type and offset.
8886 `reloc' is just a refence point to find a relocation at specified offset.
8887 If not found, return irelend.
8889 Assuming relocations are sorted by r_offset,
8890 we find the relocation from `reloc' backward untill relocs,
8891 or find it from `reloc' forward untill irelend. */
8893 static Elf_Internal_Rela
*
8894 find_relocs_at_address_addr (Elf_Internal_Rela
*reloc
,
8895 Elf_Internal_Rela
*relocs
,
8896 Elf_Internal_Rela
*irelend
,
8897 enum elf_nds32_reloc_type reloc_type
,
8900 Elf_Internal_Rela
*rel_t
= NULL
;
8902 /* First, we try to find a relocation of offset `offset_p',
8903 and then we use find_relocs_at_address to find specific type. */
8905 if (reloc
->r_offset
> offset_p
)
8907 /* Find backward. */
8909 rel_t
>= relocs
&& rel_t
->r_offset
> offset_p
; rel_t
--)
8912 else if (reloc
->r_offset
< offset_p
)
8916 rel_t
< irelend
&& rel_t
->r_offset
< offset_p
; rel_t
++)
8923 if (rel_t
< relocs
|| rel_t
== irelend
|| rel_t
->r_offset
!= offset_p
)
8926 return find_relocs_at_address (rel_t
, relocs
, irelend
, reloc_type
);
8929 typedef struct nds32_elf_blank nds32_elf_blank_t
;
8930 struct nds32_elf_blank
8932 /* Where the blank begins. */
8934 /* The size of the blank. */
8936 /* The accumulative size before this blank. */
8938 nds32_elf_blank_t
*next
;
8939 nds32_elf_blank_t
*prev
;
8942 static nds32_elf_blank_t
*blank_free_list
= NULL
;
8944 static nds32_elf_blank_t
*
8945 create_nds32_elf_blank (bfd_vma offset_p
, bfd_vma size_p
)
8947 nds32_elf_blank_t
*blank_t
;
8949 if (blank_free_list
)
8951 blank_t
= blank_free_list
;
8952 blank_free_list
= blank_free_list
->next
;
8955 blank_t
= bfd_malloc (sizeof (nds32_elf_blank_t
));
8957 if (blank_t
== NULL
)
8960 blank_t
->offset
= offset_p
;
8961 blank_t
->size
= size_p
;
8962 blank_t
->total_size
= 0;
8963 blank_t
->next
= NULL
;
8964 blank_t
->prev
= NULL
;
8970 remove_nds32_elf_blank (nds32_elf_blank_t
*blank_p
)
8972 if (blank_free_list
)
8974 blank_free_list
->prev
= blank_p
;
8975 blank_p
->next
= blank_free_list
;
8978 blank_p
->next
= NULL
;
8980 blank_p
->prev
= NULL
;
8981 blank_free_list
= blank_p
;
8985 clean_nds32_elf_blank (void)
8987 nds32_elf_blank_t
*blank_t
;
8989 while (blank_free_list
)
8991 blank_t
= blank_free_list
;
8992 blank_free_list
= blank_free_list
->next
;
8997 static nds32_elf_blank_t
*
8998 search_nds32_elf_blank (nds32_elf_blank_t
*blank_p
, bfd_vma addr
)
9000 nds32_elf_blank_t
*blank_t
;
9006 while (blank_t
&& addr
< blank_t
->offset
)
9007 blank_t
= blank_t
->prev
;
9008 while (blank_t
&& blank_t
->next
&& addr
>= blank_t
->next
->offset
)
9009 blank_t
= blank_t
->next
;
9015 get_nds32_elf_blank_total (nds32_elf_blank_t
**blank_p
, bfd_vma addr
,
9018 nds32_elf_blank_t
*blank_t
;
9020 blank_t
= search_nds32_elf_blank (*blank_p
, addr
);
9027 if (addr
< blank_t
->offset
+ blank_t
->size
)
9028 return blank_t
->total_size
+ (addr
- blank_t
->offset
);
9030 return blank_t
->total_size
+ blank_t
->size
;
9034 insert_nds32_elf_blank (nds32_elf_blank_t
**blank_p
, bfd_vma addr
, bfd_vma len
)
9036 nds32_elf_blank_t
*blank_t
, *blank_t2
;
9040 *blank_p
= create_nds32_elf_blank (addr
, len
);
9041 return *blank_p
? TRUE
: FALSE
;
9044 blank_t
= search_nds32_elf_blank (*blank_p
, addr
);
9046 if (blank_t
== NULL
)
9048 blank_t
= create_nds32_elf_blank (addr
, len
);
9051 while ((*blank_p
)->prev
!= NULL
)
9052 *blank_p
= (*blank_p
)->prev
;
9053 blank_t
->next
= *blank_p
;
9054 (*blank_p
)->prev
= blank_t
;
9055 (*blank_p
) = blank_t
;
9059 if (addr
< blank_t
->offset
+ blank_t
->size
)
9061 /* Extend the origin blank. */
9062 if (addr
+ len
> blank_t
->offset
+ blank_t
->size
)
9063 blank_t
->size
= addr
+ len
- blank_t
->offset
;
9067 blank_t2
= create_nds32_elf_blank (addr
, len
);
9072 blank_t
->next
->prev
= blank_t2
;
9073 blank_t2
->next
= blank_t
->next
;
9075 blank_t2
->prev
= blank_t
;
9076 blank_t
->next
= blank_t2
;
9077 *blank_p
= blank_t2
;
9084 insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t
**blank_p
, bfd_vma addr
,
9087 nds32_elf_blank_t
*blank_t
;
9089 if (!insert_nds32_elf_blank (blank_p
, addr
, len
))
9096 blank_t
->total_size
= 0;
9097 blank_t
= blank_t
->next
;
9102 blank_t
->total_size
= blank_t
->prev
->total_size
+ blank_t
->prev
->size
;
9103 blank_t
= blank_t
->next
;
9110 calc_nds32_blank_total (nds32_elf_blank_t
*blank_p
)
9112 nds32_elf_blank_t
*blank_t
;
9113 bfd_vma total_size
= 0;
9119 while (blank_t
->prev
)
9120 blank_t
= blank_t
->prev
;
9123 blank_t
->total_size
= total_size
;
9124 total_size
+= blank_t
->size
;
9125 blank_t
= blank_t
->next
;
9130 nds32_elf_relax_delete_blanks (bfd
*abfd
, asection
*sec
,
9131 nds32_elf_blank_t
*blank_p
)
9133 Elf_Internal_Shdr
*symtab_hdr
; /* Symbol table header of this bfd. */
9134 Elf_Internal_Sym
*isym
= NULL
; /* Symbol table of this bfd. */
9135 Elf_Internal_Sym
*isymend
; /* Symbol entry iterator. */
9136 unsigned int sec_shndx
; /* The section the be relaxed. */
9137 bfd_byte
*contents
; /* Contents data of iterating section. */
9138 Elf_Internal_Rela
*internal_relocs
;
9139 Elf_Internal_Rela
*irel
;
9140 Elf_Internal_Rela
*irelend
;
9141 struct elf_link_hash_entry
**sym_hashes
;
9142 struct elf_link_hash_entry
**end_hashes
;
9143 unsigned int symcount
;
9145 nds32_elf_blank_t
*blank_t
;
9146 nds32_elf_blank_t
*blank_t2
;
9147 nds32_elf_blank_t
*blank_head
;
9149 blank_head
= blank_t
= blank_p
;
9150 while (blank_head
->prev
!= NULL
)
9151 blank_head
= blank_head
->prev
;
9152 while (blank_t
->next
!= NULL
)
9153 blank_t
= blank_t
->next
;
9155 if (blank_t
->offset
+ blank_t
->size
<= sec
->size
)
9157 blank_t
->next
= create_nds32_elf_blank (sec
->size
+ 4, 0);
9158 blank_t
->next
->prev
= blank_t
;
9160 if (blank_head
->offset
> 0)
9162 blank_head
->prev
= create_nds32_elf_blank (0, 0);
9163 blank_head
->prev
->next
= blank_head
;
9164 blank_head
= blank_head
->prev
;
9167 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
9169 /* The deletion must stop at the next ALIGN reloc for an alignment
9170 power larger than the number of bytes we are deleting. */
9172 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
9173 if (!nds32_get_local_syms (abfd
, sec
, &isym
))
9178 isym
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
9179 symtab_hdr
->sh_info
, 0, NULL
, NULL
, NULL
);
9180 symtab_hdr
->contents
= (bfd_byte
*) isym
;
9183 if (isym
== NULL
|| symtab_hdr
->sh_info
== 0)
9186 blank_t
= blank_head
;
9187 calc_nds32_blank_total (blank_head
);
9189 for (sect
= abfd
->sections
; sect
!= NULL
; sect
= sect
->next
)
9191 /* Adjust all the relocs. */
9193 /* Relocations MUST be kept in memory, because relaxation adjust them. */
9194 internal_relocs
= _bfd_elf_link_read_relocs (abfd
, sect
, NULL
, NULL
,
9195 TRUE
/* keep_memory */);
9196 irelend
= internal_relocs
+ sect
->reloc_count
;
9198 blank_t
= blank_head
;
9199 blank_t2
= blank_head
;
9201 if (!(sect
->flags
& SEC_RELOC
))
9204 nds32_get_section_contents (abfd
, sect
, &contents
, TRUE
);
9206 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
9210 if (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_DIFF8
9211 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_DIFF32
9212 && isym
[ELF32_R_SYM (irel
->r_info
)].st_shndx
== sec_shndx
)
9214 unsigned long val
= 0;
9216 long before
, between
;
9219 switch (ELF32_R_TYPE (irel
->r_info
))
9222 offset
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
);
9224 case R_NDS32_DIFF16
:
9225 offset
= bfd_get_16 (abfd
, contents
+ irel
->r_offset
);
9227 case R_NDS32_DIFF32
:
9228 val
= bfd_get_32 (abfd
, contents
+ irel
->r_offset
);
9229 /* Get the signed bit and mask for the high part. The
9230 gcc will alarm when right shift 32-bit since the
9231 type size of long may be 32-bit. */
9232 mask
= 0 - (val
>> 31);
9234 offset
= (val
| (mask
- 0xffffffff));
9243 0 |encoded in location|
9244 |------------|-------------------|---------
9246 -- before ---| *****************
9247 --------------------- between ---|
9249 We only care how much data are relax between DIFF,
9252 before
= get_nds32_elf_blank_total (&blank_t
, irel
->r_addend
, 0);
9253 between
= get_nds32_elf_blank_total (&blank_t
,
9254 irel
->r_addend
+ offset
, 0);
9255 if (between
== before
)
9256 goto done_adjust_diff
;
9258 switch (ELF32_R_TYPE (irel
->r_info
))
9261 bfd_put_8 (abfd
, offset
- (between
- before
),
9262 contents
+ irel
->r_offset
);
9264 case R_NDS32_DIFF16
:
9265 bfd_put_16 (abfd
, offset
- (between
- before
),
9266 contents
+ irel
->r_offset
);
9268 case R_NDS32_DIFF32
:
9269 bfd_put_32 (abfd
, offset
- (between
- before
),
9270 contents
+ irel
->r_offset
);
9274 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_DIFF_ULEB128
9275 && isym
[ELF32_R_SYM (irel
->r_info
)].st_shndx
== sec_shndx
)
9278 unsigned int len
= 0;
9279 unsigned long before
, between
;
9282 val
= _bfd_read_unsigned_leb128 (abfd
, contents
+ irel
->r_offset
,
9285 before
= get_nds32_elf_blank_total (&blank_t
, irel
->r_addend
, 0);
9286 between
= get_nds32_elf_blank_total (&blank_t
,
9287 irel
->r_addend
+ val
, 0);
9288 if (between
== before
)
9289 goto done_adjust_diff
;
9291 p
= contents
+ irel
->r_offset
;
9293 memset (p
, 0x80, len
);
9295 p
= write_uleb128 (p
, val
- (between
- before
)) - 1;
9303 raddr
= irel
->r_offset
;
9304 irel
->r_offset
-= get_nds32_elf_blank_total (&blank_t2
,
9307 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_NONE
)
9309 if (blank_t2
&& blank_t2
->next
9310 && (blank_t2
->offset
> raddr
9311 || blank_t2
->next
->offset
<= raddr
))
9313 (_("%pB: error: search_nds32_elf_blank reports wrong node"),
9316 /* Mark reloc in deleted portion as NONE.
9317 For some relocs like R_NDS32_LABEL that doesn't modify the
9318 content in the section. R_NDS32_LABEL doesn't belong to the
9319 instruction in the section, so we should preserve it. */
9320 if (raddr
>= blank_t2
->offset
9321 && raddr
< blank_t2
->offset
+ blank_t2
->size
9322 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_LABEL
9323 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_REGION_BEGIN
9324 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_REGION_END
9325 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_RELAX_ENTRY
9326 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_SUBTRAHEND
9327 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_MINUEND
)
9329 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
9335 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_NONE
9336 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
9337 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_ENTRY
)
9340 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
9341 && isym
[ELF32_R_SYM (irel
->r_info
)].st_shndx
== sec_shndx
9342 && ELF_ST_TYPE (isym
[ELF32_R_SYM (irel
->r_info
)].st_info
) == STT_SECTION
)
9344 if (irel
->r_addend
<= sec
->size
)
9346 get_nds32_elf_blank_total (&blank_t
, irel
->r_addend
, 1);
9351 /* Adjust the local symbols defined in this section. */
9352 blank_t
= blank_head
;
9353 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
9355 if (isym
->st_shndx
== sec_shndx
)
9357 if (isym
->st_value
<= sec
->size
)
9360 bfd_vma orig_addr
= isym
->st_value
;
9362 ahead
= get_nds32_elf_blank_total (&blank_t
, isym
->st_value
, 1);
9363 isym
->st_value
-= ahead
;
9365 /* Adjust function size. */
9366 if (ELF32_ST_TYPE (isym
->st_info
) == STT_FUNC
9367 && isym
->st_size
> 0)
9369 get_nds32_elf_blank_total
9370 (&blank_t
, orig_addr
+ isym
->st_size
, 0) - ahead
;
9375 /* Now adjust the global symbols defined in this section. */
9376 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
9377 - symtab_hdr
->sh_info
);
9378 sym_hashes
= elf_sym_hashes (abfd
);
9379 end_hashes
= sym_hashes
+ symcount
;
9380 blank_t
= blank_head
;
9381 for (; sym_hashes
< end_hashes
; sym_hashes
++)
9383 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
9385 if ((sym_hash
->root
.type
== bfd_link_hash_defined
9386 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
9387 && sym_hash
->root
.u
.def
.section
== sec
)
9389 if (sym_hash
->root
.u
.def
.value
<= sec
->size
)
9392 bfd_vma orig_addr
= sym_hash
->root
.u
.def
.value
;
9394 ahead
= get_nds32_elf_blank_total (&blank_t
, sym_hash
->root
.u
.def
.value
, 1);
9395 sym_hash
->root
.u
.def
.value
-= ahead
;
9397 /* Adjust function size. */
9398 if (sym_hash
->type
== STT_FUNC
)
9400 get_nds32_elf_blank_total
9401 (&blank_t
, orig_addr
+ sym_hash
->size
, 0) - ahead
;
9407 contents
= elf_section_data (sec
)->this_hdr
.contents
;
9408 blank_t
= blank_head
;
9409 while (blank_t
->next
)
9411 /* Actually delete the bytes. */
9413 /* If current blank is the last blank overlap with current section,
9414 go to finish process. */
9415 if (sec
->size
<= (blank_t
->next
->offset
))
9418 memmove (contents
+ blank_t
->offset
- blank_t
->total_size
,
9419 contents
+ blank_t
->offset
+ blank_t
->size
,
9420 blank_t
->next
->offset
- (blank_t
->offset
+ blank_t
->size
));
9422 blank_t
= blank_t
->next
;
9425 if (sec
->size
> (blank_t
->offset
+ blank_t
->size
))
9427 /* There are remaining code between blank and section boundary.
9428 Move the remaining code to appropriate location. */
9429 memmove (contents
+ blank_t
->offset
- blank_t
->total_size
,
9430 contents
+ blank_t
->offset
+ blank_t
->size
,
9431 sec
->size
- (blank_t
->offset
+ blank_t
->size
));
9432 sec
->size
-= blank_t
->total_size
+ blank_t
->size
;
9435 /* This blank is not entirely included in the section,
9436 reduce the section size by only part of the blank size. */
9437 sec
->size
-= blank_t
->total_size
+ (sec
->size
- blank_t
->offset
);
9441 blank_t
= blank_head
;
9442 blank_head
= blank_head
->next
;
9443 remove_nds32_elf_blank (blank_t
);
9449 /* Get the contents of a section. */
9452 nds32_get_section_contents (bfd
*abfd
, asection
*sec
,
9453 bfd_byte
**contents_p
, bfd_boolean cache
)
9455 /* Get the section contents. */
9456 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
9457 *contents_p
= elf_section_data (sec
)->this_hdr
.contents
;
9460 if (!bfd_malloc_and_get_section (abfd
, sec
, contents_p
))
9463 elf_section_data (sec
)->this_hdr
.contents
= *contents_p
;
9469 /* Get the contents of the internal symbol of abfd. */
9472 nds32_get_local_syms (bfd
*abfd
, asection
*sec ATTRIBUTE_UNUSED
,
9473 Elf_Internal_Sym
**isymbuf_p
)
9475 Elf_Internal_Shdr
*symtab_hdr
;
9476 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
9478 /* Read this BFD's local symbols if we haven't done so already. */
9479 if (*isymbuf_p
== NULL
&& symtab_hdr
->sh_info
!= 0)
9481 *isymbuf_p
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
9482 if (*isymbuf_p
== NULL
)
9484 *isymbuf_p
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
9485 symtab_hdr
->sh_info
, 0,
9487 if (*isymbuf_p
== NULL
)
9491 symtab_hdr
->contents
= (bfd_byte
*) (*isymbuf_p
);
9496 /* Range of small data. */
9497 static bfd_vma sdata_range
[2][2];
9498 static bfd_vma
const sdata_init_range
[2] =
9499 { ACCURATE_12BIT_S1
, ACCURATE_19BIT
};
9502 nds32_elf_insn_size (bfd
*abfd ATTRIBUTE_UNUSED
,
9503 bfd_byte
*contents
, bfd_vma addr
)
9505 unsigned long insn
= bfd_getb32 (contents
+ addr
);
9507 if (insn
& 0x80000000)
9513 /* Set the gp relax range. We have to measure the safe range
9514 to do gp relaxation. */
9517 relax_range_measurement (bfd
*abfd
)
9519 asection
*sec_f
, *sec_b
;
9520 /* For upper bound. */
9521 bfd_vma maxpgsz
= get_elf_backend_data (abfd
)->maxpagesize
;
9523 static int decide_relax_range
= 0;
9525 int range_number
= ARRAY_SIZE (sdata_init_range
);
9527 if (decide_relax_range
)
9529 decide_relax_range
= 1;
9531 if (sda_rela_sec
== NULL
)
9533 /* Since there is no data sections, we assume the range is page size. */
9534 for (i
= 0; i
< range_number
; i
++)
9536 sdata_range
[i
][0] = sdata_init_range
[i
] - 0x1000;
9537 sdata_range
[i
][1] = sdata_init_range
[i
] - 0x1000;
9542 /* Get the biggest alignment power after the gp located section. */
9543 sec_f
= sda_rela_sec
->output_section
;
9544 sec_b
= sec_f
->next
;
9546 while (sec_b
!= NULL
)
9548 if ((unsigned)(1 << sec_b
->alignment_power
) > align
)
9549 align
= (1 << sec_b
->alignment_power
);
9550 sec_b
= sec_b
->next
;
9553 /* I guess we can not determine the section before
9554 gp located section, so we assume the align is max page size. */
9555 for (i
= 0; i
< range_number
; i
++)
9557 sdata_range
[i
][1] = sdata_init_range
[i
] - align
;
9558 BFD_ASSERT (sdata_range
[i
][1] <= sdata_init_range
[i
]);
9559 sdata_range
[i
][0] = sdata_init_range
[i
] - maxpgsz
;
9560 BFD_ASSERT (sdata_range
[i
][0] <= sdata_init_range
[i
]);
9564 /* These are macros used to check flags encoded in r_addend.
9565 They are only used by nds32_elf_relax_section (). */
9566 #define GET_SEQ_LEN(addend) ((addend) & 0x000000ff)
9567 #define IS_1ST_CONVERT(addend) ((addend) & 0x80000000)
9568 #define IS_OPTIMIZE(addend) ((addend) & 0x40000000)
9569 #define IS_16BIT_ON(addend) ((addend) & 0x20000000)
9571 static const char * unrecognized_reloc_msg
=
9572 /* xgettext:c-format */
9573 N_("%pB: warning: %s points to unrecognized reloc at %#" PRIx64
);
9575 /* Relax LONGCALL1 relocation for nds32_elf_relax_section. */
9578 nds32_elf_relax_longcall1 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9579 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9580 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9581 Elf_Internal_Shdr
*symtab_hdr
)
9583 /* There are 3 variations for LONGCALL1
9584 case 4-4-2; 16-bit on, optimize off or optimize for space
9585 sethi ta, hi20(symbol) ; LONGCALL1/HI20
9586 ori ta, ta, lo12(symbol) ; LO12S0
9589 case 4-4-4; 16-bit off, optimize don't care
9590 sethi ta, hi20(symbol) ; LONGCALL1/HI20
9591 ori ta, ta, lo12(symbol) ; LO12S0
9594 case 4-4-4; 16-bit on, optimize for speed
9595 sethi ta, hi20(symbol) ; LONGCALL1/HI20
9596 ori ta, ta, lo12(symbol) ; LO12S0
9598 Check code for -mlong-calls output. */
9600 /* Get the reloc for the address from which the register is
9601 being loaded. This reloc will tell us which function is
9602 actually being called. */
9605 int seq_len
; /* Original length of instruction sequence. */
9607 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *irelend
;
9608 bfd_signed_vma foff
;
9611 irelend
= internal_relocs
+ sec
->reloc_count
;
9612 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9613 laddr
= irel
->r_offset
;
9614 *insn_len
= seq_len
;
9616 hi_irelfn
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9617 R_NDS32_HI20_RELA
, laddr
);
9618 lo_irelfn
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9619 R_NDS32_LO12S0_ORI_RELA
,
9622 if (hi_irelfn
== irelend
|| lo_irelfn
== irelend
)
9624 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGCALL1",
9625 (uint64_t) irel
->r_offset
);
9629 /* Get the value of the symbol referred to by the reloc. */
9630 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
);
9632 /* This condition only happened when symbol is undefined. */
9634 || foff
< -CONSERVATIVE_24BIT_S1
9635 || foff
>= CONSERVATIVE_24BIT_S1
)
9638 /* Relax to: jal symbol; 25_PCREL. */
9639 /* For simplicity of coding, we are going to modify the section
9640 contents, the section relocs, and the BFD symbol table. We
9641 must tell the rest of the code not to free up this
9642 information. It would be possible to instead create a table
9643 of changes which have to be made, as is done in coff-mips.c;
9644 that would be more work, but would require less memory when
9645 the linker is run. */
9647 /* Replace the long call with a jal. */
9648 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9649 R_NDS32_25_PCREL_RELA
);
9650 irel
->r_addend
= hi_irelfn
->r_addend
;
9652 /* We don't resolve this here but resolve it in relocate_section. */
9654 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9657 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
9659 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9664 insn16
= NDS32_NOP16
;
9665 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9667 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_INSN16
);
9668 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9674 #define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
9675 /* Relax LONGCALL2 relocation for nds32_elf_relax_section. */
9678 nds32_elf_relax_longcall2 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9679 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9680 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9681 Elf_Internal_Shdr
*symtab_hdr
)
9683 /* bltz rt, .L1 ; LONGCALL2
9684 jal symbol ; 25_PCREL
9687 /* Get the reloc for the address from which the register is
9688 being loaded. This reloc will tell us which function is
9689 actually being called. */
9693 Elf_Internal_Rela
*i1_irelfn
, *cond_irelfn
, *irelend
;
9694 bfd_signed_vma foff
;
9696 irelend
= internal_relocs
+ sec
->reloc_count
;
9697 laddr
= irel
->r_offset
;
9699 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9700 R_NDS32_25_PCREL_RELA
, laddr
+ 4);
9702 if (i1_irelfn
== irelend
)
9704 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGCALL2",
9705 (uint64_t) irel
->r_offset
);
9709 insn
= bfd_getb32 (contents
+ laddr
);
9711 /* Get the value of the symbol referred to by the reloc. */
9712 foff
= calculate_offset (abfd
, sec
, i1_irelfn
, isymbuf
, symtab_hdr
);
9715 || foff
< -CONSERVATIVE_16BIT_S1
9716 || foff
>= CONSERVATIVE_16BIT_S1
)
9719 /* Relax to bgezal rt, label ; 17_PCREL
9720 or bltzal rt, label ; 17_PCREL */
9722 /* Convert to complimentary conditional call. */
9723 insn
= CONVERT_CONDITION_CALL (insn
);
9725 /* For simplicity of coding, we are going to modify the section
9726 contents, the section relocs, and the BFD symbol table. We
9727 must tell the rest of the code not to free up this
9728 information. It would be possible to instead create a table
9729 of changes which have to be made, as is done in coff-mips.c;
9730 that would be more work, but would require less memory when
9731 the linker is run. */
9733 /* Clean unnessary relocations. */
9735 ELF32_R_INFO (ELF32_R_SYM (i1_irelfn
->r_info
), R_NDS32_NONE
);
9737 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9738 R_NDS32_17_PCREL_RELA
, laddr
);
9739 if (cond_irelfn
!= irelend
)
9740 cond_irelfn
->r_info
=
9741 ELF32_R_INFO (ELF32_R_SYM (cond_irelfn
->r_info
), R_NDS32_NONE
);
9743 /* Replace the long call with a bgezal. */
9744 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i1_irelfn
->r_info
),
9745 R_NDS32_17_PCREL_RELA
);
9746 irel
->r_addend
= i1_irelfn
->r_addend
;
9748 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9754 /* Relax LONGCALL3 relocation for nds32_elf_relax_section. */
9757 nds32_elf_relax_longcall3 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9758 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9759 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9760 Elf_Internal_Shdr
*symtab_hdr
)
9762 /* There are 3 variations for LONGCALL3
9763 case 4-4-4-2; 16-bit on, optimize off or optimize for space
9764 bltz rt, $1 ; LONGCALL3
9765 sethi ta, hi20(symbol) ; HI20
9766 ori ta, ta, lo12(symbol) ; LO12S0
9770 case 4-4-4-4; 16-bit off, optimize don't care
9771 bltz rt, $1 ; LONGCALL3
9772 sethi ta, hi20(symbol) ; HI20
9773 ori ta, ta, lo12(symbol) ; LO12S0
9777 case 4-4-4-4; 16-bit on, optimize for speed
9778 bltz rt, $1 ; LONGCALL3
9779 sethi ta, hi20(symbol) ; HI20
9780 ori ta, ta, lo12(symbol) ; LO12S0
9784 /* Get the reloc for the address from which the register is
9785 being loaded. This reloc will tell us which function is
9786 actually being called. */
9789 int seq_len
; /* Original length of instruction sequence. */
9791 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *cond_irelfn
, *irelend
;
9792 bfd_signed_vma foff
;
9795 irelend
= internal_relocs
+ sec
->reloc_count
;
9796 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9797 laddr
= irel
->r_offset
;
9798 *insn_len
= seq_len
;
9801 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9802 R_NDS32_HI20_RELA
, laddr
+ 4);
9804 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9805 R_NDS32_LO12S0_ORI_RELA
, laddr
+ 8);
9807 if (hi_irelfn
== irelend
|| lo_irelfn
== irelend
)
9809 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGCALL3",
9810 (uint64_t) irel
->r_offset
);
9814 /* Get the value of the symbol referred to by the reloc. */
9815 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
);
9818 || foff
< -CONSERVATIVE_24BIT_S1
9819 || foff
>= CONSERVATIVE_24BIT_S1
)
9822 insn
= bfd_getb32 (contents
+ laddr
);
9823 if (foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
9825 /* Relax to bgezal rt, label ; 17_PCREL
9826 or bltzal rt, label ; 17_PCREL */
9828 /* Convert to complimentary conditional call. */
9829 insn
= CONVERT_CONDITION_CALL (insn
);
9830 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9834 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
9836 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
9838 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9841 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9842 R_NDS32_17_PCREL_RELA
, laddr
);
9843 if (cond_irelfn
!= irelend
)
9845 cond_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9846 R_NDS32_17_PCREL_RELA
);
9847 cond_irelfn
->r_addend
= hi_irelfn
->r_addend
;
9852 insn16
= NDS32_NOP16
;
9853 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9854 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9856 hi_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9860 else if (foff
>= -CONSERVATIVE_24BIT_S1
&& foff
< CONSERVATIVE_24BIT_S1
)
9862 /* Relax to the following instruction sequence
9863 bltz rt, $1 ; LONGCALL2
9864 jal symbol ; 25_PCREL
9868 bfd_putb32 (insn
, contents
+ hi_irelfn
->r_offset
);
9870 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
9871 R_NDS32_25_PCREL_RELA
);
9873 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_LONGCALL2
);
9876 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9880 insn16
= NDS32_NOP16
;
9881 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9883 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_INSN16
);
9884 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9891 /* Relax LONGJUMP1 relocation for nds32_elf_relax_section. */
9894 nds32_elf_relax_longjump1 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
9895 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
9896 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
9897 Elf_Internal_Shdr
*symtab_hdr
)
9899 /* There are 3 variations for LONGJUMP1
9900 case 4-4-2; 16-bit bit on, optimize off or optimize for space
9901 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9902 ori ta, ta, lo12(symbol) ; LO12S0
9905 case 4-4-4; 16-bit off, optimize don't care
9906 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9907 ori ta, ta, lo12(symbol) ; LO12S0
9910 case 4-4-4; 16-bit on, optimize for speed
9911 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9912 ori ta, ta, lo12(symbol) ; LO12S0
9915 /* Get the reloc for the address from which the register is
9916 being loaded. This reloc will tell us which function is
9917 actually being called. */
9920 int seq_len
; /* Original length of instruction sequence. */
9921 int insn16_on
; /* 16-bit on/off. */
9923 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *irelend
;
9924 bfd_signed_vma foff
;
9926 unsigned long reloc
;
9928 irelend
= internal_relocs
+ sec
->reloc_count
;
9929 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
9930 laddr
= irel
->r_offset
;
9931 *insn_len
= seq_len
;
9932 insn16_on
= IS_16BIT_ON (irel
->r_addend
);
9935 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9936 R_NDS32_HI20_RELA
, laddr
);
9938 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
9939 R_NDS32_LO12S0_ORI_RELA
, laddr
+ 4);
9940 if (hi_irelfn
== irelend
|| lo_irelfn
== irelend
)
9942 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP1",
9943 (uint64_t) irel
->r_offset
);
9947 /* Get the value of the symbol referred to by the reloc. */
9948 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
);
9951 || foff
>= CONSERVATIVE_24BIT_S1
9952 || foff
< -CONSERVATIVE_24BIT_S1
)
9956 && foff
>= -ACCURATE_8BIT_S1
9957 && foff
< ACCURATE_8BIT_S1
9961 /* 16-bit on, but not optimized for speed. */
9962 reloc
= R_NDS32_9_PCREL_RELA
;
9964 bfd_putb16 (insn16
, contents
+ irel
->r_offset
);
9967 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
9972 reloc
= R_NDS32_25_PCREL_RELA
;
9974 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
9977 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_INSN16
);
9982 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), reloc
);
9984 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_NDS32_NONE
);
9986 if ((seq_len
& 0x2) && ((*insn_len
& 2) == 0))
9988 insn16
= NDS32_NOP16
;
9989 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
9991 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
),
9993 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
9999 /* Revert condition branch. This function does not check if the input
10000 instruction is condition branch or not. */
10003 nds32_elf_convert_branch (uint16_t insn16
, uint32_t insn
,
10004 uint16_t *re_insn16
, uint32_t *re_insn
)
10006 uint32_t comp_insn
= 0;
10007 uint16_t comp_insn16
= 0;
10011 if (N32_OP6 (insn
) == N32_OP6_BR1
)
10014 comp_insn
= (insn
^ 0x4000) & 0xffffc000;
10015 if (N32_IS_RT3 (insn
) && N32_RA5 (insn
) == REG_R5
)
10017 /* Insn can be contracted to 16-bit implied r5. */
10019 (comp_insn
& 0x4000) ? INSN_BNES38
: INSN_BEQS38
;
10020 comp_insn16
|= (N32_RT5 (insn
) & 0x7) << 8;
10023 else if (N32_OP6 (insn
) == N32_OP6_BR3
)
10025 /* bnec $ta, imm11, label. */
10026 comp_insn
= (insn
^ 0x80000) & 0xffffff00;
10030 comp_insn
= (insn
^ 0x10000) & 0xffffc000;
10031 if (N32_BR2_SUB (insn
) == N32_BR2_BEQZ
10032 || N32_BR2_SUB (insn
) == N32_BR2_BNEZ
)
10034 if (N32_IS_RT3 (insn
))
10036 /* Insn can be contracted to 16-bit. */
10038 (comp_insn
& 0x10000) ? INSN_BNEZ38
: INSN_BEQZ38
;
10039 comp_insn16
|= (N32_RT5 (insn
) & 0x7) << 8;
10041 else if (N32_RT5 (insn
) == REG_R15
)
10043 /* Insn can be contracted to 16-bit. */
10045 (comp_insn
& 0x10000) ? INSN_BNES38
: INSN_BEQS38
;
10052 switch ((insn16
& 0xf000) >> 12)
10055 /* beqz38 or bnez38 */
10056 comp_insn16
= (insn16
^ 0x0800) & 0xff00;
10057 comp_insn
= (comp_insn16
& 0x0800) ? INSN_BNEZ
: INSN_BEQZ
;
10058 comp_insn
|= ((comp_insn16
& 0x0700) >> 8) << 20;
10062 /* beqs38 or bnes38 */
10063 comp_insn16
= (insn16
^ 0x0800) & 0xff00;
10064 comp_insn
= (comp_insn16
& 0x0800) ? INSN_BNE
: INSN_BEQ
;
10065 comp_insn
|= (((comp_insn16
& 0x0700) >> 8) << 20)
10070 /* beqzS8 or bnezS8 */
10071 comp_insn16
= (insn16
^ 0x0100) & 0xff00;
10072 comp_insn
= (comp_insn16
& 0x0100) ? INSN_BNEZ
: INSN_BEQZ
;
10073 comp_insn
|= REG_R15
<< 20;
10080 if (comp_insn
&& re_insn
)
10081 *re_insn
= comp_insn
;
10082 if (comp_insn16
&& re_insn16
)
10083 *re_insn16
= comp_insn16
;
10086 /* Relax LONGJUMP2 relocation for nds32_elf_relax_section. */
10089 nds32_elf_relax_longjump2 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10090 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10091 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10092 Elf_Internal_Shdr
*symtab_hdr
)
10094 /* There are 3 variations for LONGJUMP2
10095 case 2-4; 1st insn convertible, 16-bit on,
10096 optimize off or optimize for space
10097 bnes38 rt, ra, $1 ; LONGJUMP2
10101 case 4-4; 1st insn not convertible
10102 bne rt, ra, $1 ; LONGJUMP2
10106 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
10107 bne rt, ra, $1 ; LONGJUMP2
10111 /* Get the reloc for the address from which the register is
10112 being loaded. This reloc will tell us which function is
10113 actually being called. */
10116 int seq_len
; /* Original length of instruction sequence. */
10117 Elf_Internal_Rela
*i2_irelfn
, *cond_irelfn
, *irelend
;
10120 bfd_signed_vma foff
;
10121 uint32_t insn
, re_insn
= 0;
10122 uint16_t insn16
, re_insn16
= 0;
10123 unsigned long reloc
, cond_reloc
;
10125 enum elf_nds32_reloc_type checked_types
[] =
10126 { R_NDS32_15_PCREL_RELA
, R_NDS32_9_PCREL_RELA
};
10128 irelend
= internal_relocs
+ sec
->reloc_count
;
10129 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
10130 laddr
= irel
->r_offset
;
10131 *insn_len
= seq_len
;
10132 first_size
= (seq_len
== 6) ? 2 : 4;
10135 find_relocs_at_address_addr (irel
, internal_relocs
,
10136 irelend
, R_NDS32_25_PCREL_RELA
,
10137 laddr
+ first_size
);
10139 for (i
= 0; i
< ARRAY_SIZE (checked_types
); i
++)
10142 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10143 checked_types
[i
], laddr
);
10144 if (cond_irelfn
!= irelend
)
10148 if (i2_irelfn
== irelend
|| cond_irelfn
== irelend
)
10150 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP2",
10151 (uint64_t) irel
->r_offset
);
10155 /* Get the value of the symbol referred to by the reloc. */
10156 foff
= calculate_offset (abfd
, sec
, i2_irelfn
, isymbuf
, symtab_hdr
);
10158 || foff
< -CONSERVATIVE_16BIT_S1
10159 || foff
>= CONSERVATIVE_16BIT_S1
)
10162 /* Get the all corresponding instructions. */
10163 if (first_size
== 4)
10165 insn
= bfd_getb32 (contents
+ laddr
);
10166 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
10170 insn16
= bfd_getb16 (contents
+ laddr
);
10171 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
10174 if (re_insn16
&& foff
>= -(ACCURATE_8BIT_S1
- first_size
)
10175 && foff
< ACCURATE_8BIT_S1
- first_size
)
10177 if (first_size
== 4)
10179 /* Don't convert it to 16-bit now, keep this as relaxable for
10180 ``label reloc; INSN16''. */
10182 /* Save comp_insn32 to buffer. */
10183 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
10185 reloc
= (N32_OP6 (re_insn
) == N32_OP6_BR1
) ?
10186 R_NDS32_15_PCREL_RELA
: R_NDS32_17_PCREL_RELA
;
10187 cond_reloc
= R_NDS32_INSN16
;
10191 bfd_putb16 (re_insn16
, contents
+ irel
->r_offset
);
10193 reloc
= R_NDS32_9_PCREL_RELA
;
10194 cond_reloc
= R_NDS32_NONE
;
10197 else if (N32_OP6 (re_insn
) == N32_OP6_BR1
10198 && (foff
>= -(ACCURATE_14BIT_S1
- first_size
)
10199 && foff
< ACCURATE_14BIT_S1
- first_size
))
10201 /* beqs label ; 15_PCREL */
10202 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
10204 reloc
= R_NDS32_15_PCREL_RELA
;
10205 cond_reloc
= R_NDS32_NONE
;
10207 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
10208 && foff
>= -CONSERVATIVE_16BIT_S1
10209 && foff
< CONSERVATIVE_16BIT_S1
)
10211 /* beqz label ; 17_PCREL */
10212 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
10214 reloc
= R_NDS32_17_PCREL_RELA
;
10215 cond_reloc
= R_NDS32_NONE
;
10220 /* Set all relocations. */
10221 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i2_irelfn
->r_info
), reloc
);
10222 irel
->r_addend
= i2_irelfn
->r_addend
;
10224 cond_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irelfn
->r_info
),
10226 cond_irelfn
->r_addend
= 0;
10228 if ((seq_len
^ *insn_len
) & 0x2)
10230 insn16
= NDS32_NOP16
;
10231 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ 4);
10232 i2_irelfn
->r_offset
= 4;
10233 i2_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i2_irelfn
->r_info
),
10235 i2_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
10239 i2_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (i2_irelfn
->r_info
),
10244 /* Relax LONGJUMP3 relocation for nds32_elf_relax_section. */
10247 nds32_elf_relax_longjump3 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10248 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10249 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10250 Elf_Internal_Shdr
*symtab_hdr
)
10252 /* There are 5 variations for LONGJUMP3
10253 case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
10254 optimize off or optimize for space
10255 bnes38 rt, ra, $1 ; LONGJUMP3
10256 sethi ta, hi20(symbol) ; HI20
10257 ori ta, ta, lo12(symbol) ; LO12S0
10261 case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
10262 bnes38 rt, ra, $1 ; LONGJUMP3
10263 sethi ta, hi20(symbol) ; HI20
10264 ori ta, ta, lo12(symbol) ; LO12S0
10268 case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
10269 optimize off or optimize for space
10270 bne rt, ra, $1 ; LONGJUMP3
10271 sethi ta, hi20(symbol) ; HI20
10272 ori ta, ta, lo12(symbol) ; LO12S0
10276 case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
10277 16-bit off if no INSN16
10278 bne rt, ra, $1 ; LONGJUMP3
10279 sethi ta, hi20(symbol) ; HI20
10280 ori ta, ta, lo12(symbol) ; LO12S0
10284 case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
10285 16-bit off if no INSN16
10286 bne rt, ra, $1 ; LONGJUMP3
10287 sethi ta, hi20(symbol) ; HI20
10288 ori ta, ta, lo12(symbol) ; LO12S0
10292 /* Get the reloc for the address from which the register is
10293 being loaded. This reloc will tell us which function is
10294 actually being called. */
10295 enum elf_nds32_reloc_type checked_types
[] =
10296 { R_NDS32_15_PCREL_RELA
, R_NDS32_9_PCREL_RELA
};
10298 int reloc_off
= 0, cond_removed
= 0, convertible
;
10300 int seq_len
; /* Original length of instruction sequence. */
10301 Elf_Internal_Rela
*hi_irelfn
, *lo_irelfn
, *cond_irelfn
, *irelend
;
10304 bfd_signed_vma foff
;
10305 uint32_t insn
, re_insn
= 0;
10306 uint16_t insn16
, re_insn16
= 0;
10307 unsigned long reloc
, cond_reloc
;
10309 irelend
= internal_relocs
+ sec
->reloc_count
;
10310 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
10311 laddr
= irel
->r_offset
;
10312 *insn_len
= seq_len
;
10314 convertible
= IS_1ST_CONVERT (irel
->r_addend
);
10321 /* Get all needed relocations. */
10323 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10324 R_NDS32_HI20_RELA
, laddr
+ first_size
);
10326 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10327 R_NDS32_LO12S0_ORI_RELA
,
10328 laddr
+ first_size
+ 4);
10330 for (i
= 0; i
< ARRAY_SIZE (checked_types
); i
++)
10333 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10334 checked_types
[i
], laddr
);
10335 if (cond_irelfn
!= irelend
)
10339 if (hi_irelfn
== irelend
10340 || lo_irelfn
== irelend
10341 || cond_irelfn
== irelend
)
10343 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP3",
10344 (uint64_t) irel
->r_offset
);
10348 /* Get the value of the symbol referred to by the reloc. */
10349 foff
= calculate_offset (abfd
, sec
, hi_irelfn
, isymbuf
, symtab_hdr
);
10352 || foff
< -CONSERVATIVE_24BIT_S1
10353 || foff
>= CONSERVATIVE_24BIT_S1
)
10356 /* Get the all corresponding instructions. */
10357 if (first_size
== 4)
10359 insn
= bfd_getb32 (contents
+ laddr
);
10360 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
10364 insn16
= bfd_getb16 (contents
+ laddr
);
10365 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
10368 /* For simplicity of coding, we are going to modify the section
10369 contents, the section relocs, and the BFD symbol table. We
10370 must tell the rest of the code not to free up this
10371 information. It would be possible to instead create a table
10372 of changes which have to be made, as is done in coff-mips.c;
10373 that would be more work, but would require less memory when
10374 the linker is run. */
10377 && foff
>= -ACCURATE_8BIT_S1
- first_size
10378 && foff
< ACCURATE_8BIT_S1
- first_size
)
10380 if (!(seq_len
& 0x2))
10382 /* Don't convert it to 16-bit now, keep this as relaxable
10383 for ``label reloc; INSN1a''6. */
10384 /* Save comp_insn32 to buffer. */
10385 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
10387 reloc
= (N32_OP6 (re_insn
) == N32_OP6_BR1
) ?
10388 R_NDS32_15_PCREL_RELA
: R_NDS32_17_PCREL_RELA
;
10389 cond_reloc
= R_NDS32_INSN16
;
10393 /* Not optimize for speed; convert sequence to 16-bit. */
10394 /* Save comp_insn16 to buffer. */
10395 bfd_putb16 (re_insn16
, contents
+ irel
->r_offset
);
10397 reloc
= R_NDS32_9_PCREL_RELA
;
10398 cond_reloc
= R_NDS32_NONE
;
10402 else if (N32_OP6 (re_insn
) == N32_OP6_BR1
10403 && (foff
>= -(ACCURATE_14BIT_S1
- first_size
)
10404 && foff
< ACCURATE_14BIT_S1
- first_size
))
10406 /* beqs label ; 15_PCREL */
10407 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
10409 reloc
= R_NDS32_15_PCREL_RELA
;
10410 cond_reloc
= R_NDS32_NONE
;
10413 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
10414 && foff
>= -CONSERVATIVE_16BIT_S1
10415 && foff
< CONSERVATIVE_16BIT_S1
)
10417 /* beqz label ; 17_PCREL */
10418 bfd_putb32 (re_insn
, contents
+ irel
->r_offset
);
10420 reloc
= R_NDS32_17_PCREL_RELA
;
10421 cond_reloc
= R_NDS32_NONE
;
10424 else if (foff
>= -CONSERVATIVE_24BIT_S1
- reloc_off
10425 && foff
< CONSERVATIVE_24BIT_S1
- reloc_off
)
10427 /* Relax to one of the following 3 variations
10429 case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
10431 bnes38 rt, $1 ; LONGJUMP2
10435 case 4-4; 1st insn not convertible, others don't care
10436 bne rt, ra, $1 ; LONGJUMP2
10440 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
10441 bne rt, ra, $1 ; LONGJUMP2
10445 /* Offset for first instruction. */
10447 /* Use j label as second instruction. */
10448 *insn_len
= 4 + first_size
;
10450 bfd_putb32 (insn
, contents
+ hi_irelfn
->r_offset
);
10451 reloc
= R_NDS32_LONGJUMP2
;
10452 cond_reloc
= R_NDS32_25_PLTREL
;
10457 if (cond_removed
== 1)
10459 /* Set all relocations. */
10460 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), reloc
);
10461 irel
->r_addend
= hi_irelfn
->r_addend
;
10463 cond_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irelfn
->r_info
),
10465 cond_irelfn
->r_addend
= 0;
10466 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
10471 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
10472 irel
->r_addend
= irel
->r_addend
;
10473 hi_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
),
10477 if ((seq_len
^ *insn_len
) & 0x2)
10479 insn16
= NDS32_NOP16
;
10480 bfd_putb16 (insn16
, contents
+ irel
->r_offset
+ *insn_len
);
10481 lo_irelfn
->r_offset
= *insn_len
;
10482 lo_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
),
10484 lo_irelfn
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
10488 lo_irelfn
->r_info
= ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
),
10493 /* Relax LONGCALL4 relocation for nds32_elf_relax_section. */
10496 nds32_elf_relax_longcall4 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10497 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10498 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10499 Elf_Internal_Shdr
*symtab_hdr
)
10501 /* The pattern for LONGCALL4. Support for function cse.
10502 sethi ta, hi20(symbol) ; LONGCALL4/HI20
10503 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10504 jral ta ; PTR_RES/EMPTY/INSN16 */
10508 Elf_Internal_Rela
*hi_irel
, *ptr_irel
, *insn_irel
, *em_irel
, *call_irel
;
10509 Elf_Internal_Rela
*irelend
;
10510 bfd_signed_vma foff
;
10512 irelend
= internal_relocs
+ sec
->reloc_count
;
10513 laddr
= irel
->r_offset
;
10515 /* Get the reloc for the address from which the register is
10516 being loaded. This reloc will tell us which function is
10517 actually being called. */
10518 hi_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10519 R_NDS32_HI20_RELA
, laddr
);
10521 if (hi_irel
== irelend
)
10523 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGCALL4",
10524 (uint64_t) irel
->r_offset
);
10528 /* Get the value of the symbol referred to by the reloc. */
10529 foff
= calculate_offset (abfd
, sec
, hi_irel
, isymbuf
, symtab_hdr
);
10531 /* This condition only happened when symbol is undefined. */
10533 || foff
< -CONSERVATIVE_24BIT_S1
10534 || foff
>= CONSERVATIVE_24BIT_S1
)
10537 /* Relax to: jal symbol; 25_PCREL. */
10538 /* For simplicity of coding, we are going to modify the section
10539 contents, the section relocs, and the BFD symbol table. We
10540 must tell the rest of the code not to free up this
10541 information. It would be possible to instead create a table
10542 of changes which have to be made, as is done in coff-mips.c;
10543 that would be more work, but would require less memory when
10544 the linker is run. */
10546 ptr_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10547 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10548 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10549 R_NDS32_EMPTY
, irel
->r_addend
);
10551 if (ptr_irel
== irelend
|| em_irel
== irelend
)
10553 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGCALL4",
10554 (uint64_t) irel
->r_offset
);
10557 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
10558 insn
= bfd_getb32 (contents
+ irel
->r_addend
);
10559 if (insn
& 0x80000000)
10562 /* Replace the long call with a jal. */
10563 em_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
),
10564 R_NDS32_25_PCREL_RELA
);
10565 ptr_irel
->r_addend
= 1;
10567 /* We don't resolve this here but resolve it in relocate_section. */
10569 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10572 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10574 /* If there is function cse, HI20 can not remove now. */
10575 call_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10576 R_NDS32_LONGCALL4
, laddr
);
10577 if (call_irel
== irelend
)
10581 ELF32_R_INFO (ELF32_R_SYM (hi_irel
->r_info
), R_NDS32_NONE
);
10584 insn_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10585 R_NDS32_INSN16
, irel
->r_addend
);
10586 if (insn_irel
!= irelend
)
10587 insn_irel
->r_info
=
10588 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10593 /* Relax LONGCALL5 relocation for nds32_elf_relax_section. */
10596 nds32_elf_relax_longcall5 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10597 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10598 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10599 Elf_Internal_Shdr
*symtab_hdr
)
10601 /* The pattern for LONGCALL5.
10602 bltz rt, .L1 ; LONGCALL5/17_PCREL
10603 jal symbol ; 25_PCREL
10608 Elf_Internal_Rela
*cond_irel
, *irelend
;
10609 bfd_signed_vma foff
;
10611 irelend
= internal_relocs
+ sec
->reloc_count
;
10612 laddr
= irel
->r_offset
;
10613 insn
= bfd_getb32 (contents
+ laddr
);
10615 /* Get the reloc for the address from which the register is
10616 being loaded. This reloc will tell us which function is
10617 actually being called. */
10619 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10620 R_NDS32_25_PCREL_RELA
, irel
->r_addend
);
10621 if (cond_irel
== irelend
)
10623 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGCALL5",
10624 (uint64_t) irel
->r_offset
);
10628 /* Get the value of the symbol referred to by the reloc. */
10629 foff
= calculate_offset (abfd
, sec
, cond_irel
, isymbuf
, symtab_hdr
);
10632 || foff
< -CONSERVATIVE_16BIT_S1
10633 || foff
>= CONSERVATIVE_16BIT_S1
)
10636 /* Relax to bgezal rt, label ; 17_PCREL
10637 or bltzal rt, label ; 17_PCREL. */
10639 /* Convert to complimentary conditional call. */
10640 insn
= CONVERT_CONDITION_CALL (insn
);
10642 /* For simplicity of coding, we are going to modify the section
10643 contents, the section relocs, and the BFD symbol table. We
10644 must tell the rest of the code not to free up this
10645 information. It would be possible to instead create a table
10646 of changes which have to be made, as is done in coff-mips.c;
10647 that would be more work, but would require less memory when
10648 the linker is run. */
10650 /* Modify relocation and contents. */
10651 cond_irel
->r_info
=
10652 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_17_PCREL_RELA
);
10654 /* Replace the long call with a bgezal. */
10655 bfd_putb32 (insn
, contents
+ cond_irel
->r_offset
);
10658 /* Clean unnessary relocations. */
10659 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10661 cond_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10662 R_NDS32_17_PCREL_RELA
, laddr
);
10663 cond_irel
->r_info
=
10664 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10669 /* Relax LONGCALL6 relocation for nds32_elf_relax_section. */
10672 nds32_elf_relax_longcall6 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10673 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10674 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10675 Elf_Internal_Shdr
*symtab_hdr
)
10677 /* The pattern for LONGCALL6.
10678 bltz rt, .L1 ; LONGCALL6/17_PCREL
10679 sethi ta, hi20(symbol) ; HI20/PTR
10680 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10681 jral ta ; PTR_RES/EMPTY/INSN16
10686 Elf_Internal_Rela
*em_irel
, *cond_irel
, *irelend
;
10687 bfd_signed_vma foff
;
10689 irelend
= internal_relocs
+ sec
->reloc_count
;
10690 laddr
= irel
->r_offset
;
10692 /* Get the reloc for the address from which the register is
10693 being loaded. This reloc will tell us which function is
10694 actually being called. */
10695 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10696 R_NDS32_EMPTY
, irel
->r_addend
);
10698 if (em_irel
== irelend
)
10700 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGCALL6",
10701 (uint64_t) irel
->r_offset
);
10705 /* Get the value of the symbol referred to by the reloc. */
10706 foff
= calculate_offset (abfd
, sec
, em_irel
, isymbuf
, symtab_hdr
);
10709 || foff
< -CONSERVATIVE_24BIT_S1
10710 || foff
>= CONSERVATIVE_24BIT_S1
)
10713 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
10714 insn
= bfd_getb32 (contents
+ irel
->r_addend
);
10715 if (insn
& 0x80000000)
10718 insn
= bfd_getb32 (contents
+ laddr
);
10719 if (foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
10721 /* Relax to bgezal rt, label ; 17_PCREL
10722 or bltzal rt, label ; 17_PCREL. */
10724 /* Convert to complimentary conditional call. */
10726 insn
= CONVERT_CONDITION_CALL (insn
);
10727 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10730 ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
), R_NDS32_17_PCREL_RELA
);
10732 /* Set resolved relocation. */
10734 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10735 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10736 if (cond_irel
== irelend
)
10738 _bfd_error_handler (unrecognized_reloc_msg
, abfd
,
10739 "R_NDS32_LONGCALL6", (uint64_t) irel
->r_offset
);
10742 cond_irel
->r_addend
= 1;
10744 /* Clear relocations. */
10747 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10750 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10751 R_NDS32_17_PCREL_RELA
, laddr
);
10752 if (cond_irel
!= irelend
)
10753 cond_irel
->r_info
=
10754 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10757 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10758 R_NDS32_INSN16
, irel
->r_addend
);
10759 if (cond_irel
!= irelend
)
10760 cond_irel
->r_info
=
10761 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10764 else if (foff
>= -CONSERVATIVE_24BIT_S1
&& foff
< CONSERVATIVE_24BIT_S1
)
10766 /* Relax to the following instruction sequence
10767 bltz rt, .L1 ; LONGCALL2/17_PCREL
10768 jal symbol ; 25_PCREL/PTR_RES
10771 /* Convert instruction. */
10773 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10775 /* Convert relocations. */
10776 em_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
),
10777 R_NDS32_25_PCREL_RELA
);
10779 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_LONGCALL5
);
10781 /* Set resolved relocation. */
10783 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10784 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10785 if (cond_irel
== irelend
)
10787 _bfd_error_handler (unrecognized_reloc_msg
, abfd
,
10788 "R_NDS32_LONGCALL6", (uint64_t) irel
->r_offset
);
10791 cond_irel
->r_addend
= 1;
10794 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10795 R_NDS32_INSN16
, irel
->r_addend
);
10796 if (cond_irel
!= irelend
)
10797 cond_irel
->r_info
=
10798 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
10803 /* Relax LONGJUMP4 relocation for nds32_elf_relax_section. */
10806 nds32_elf_relax_longjump4 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10807 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10808 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
10809 Elf_Internal_Shdr
*symtab_hdr
)
10811 /* The pattern for LONGJUMP4.
10812 sethi ta, hi20(symbol) ; LONGJUMP4/HI20
10813 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10814 jr ta ; PTR_RES/INSN16/EMPTY */
10817 int seq_len
; /* Original length of instruction sequence. */
10819 Elf_Internal_Rela
*hi_irel
, *ptr_irel
, *em_irel
, *call_irel
, *irelend
;
10820 bfd_signed_vma foff
;
10822 irelend
= internal_relocs
+ sec
->reloc_count
;
10823 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
10824 laddr
= irel
->r_offset
;
10825 *insn_len
= seq_len
;
10827 /* Get the reloc for the address from which the register is
10828 being loaded. This reloc will tell us which function is
10829 actually being called. */
10831 hi_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10832 R_NDS32_HI20_RELA
, laddr
);
10834 if (hi_irel
== irelend
)
10836 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP4",
10837 (uint64_t) irel
->r_offset
);
10841 /* Get the value of the symbol referred to by the reloc. */
10842 foff
= calculate_offset (abfd
, sec
, hi_irel
, isymbuf
, symtab_hdr
);
10845 || foff
>= CONSERVATIVE_24BIT_S1
10846 || foff
< -CONSERVATIVE_24BIT_S1
)
10849 /* Convert it to "j label", it may be converted to j8 in the final
10850 pass of relaxation. Therefore, we do not consider this currently. */
10851 ptr_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10852 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
10853 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10854 R_NDS32_EMPTY
, irel
->r_addend
);
10856 if (ptr_irel
== irelend
|| em_irel
== irelend
)
10858 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP4",
10859 (uint64_t) irel
->r_offset
);
10864 ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
), R_NDS32_25_PCREL_RELA
);
10865 ptr_irel
->r_addend
= 1;
10867 /* Write instruction. */
10869 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
10871 /* Clear relocations. */
10872 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10874 /* If there is function cse, HI20 can not remove now. */
10875 call_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10876 R_NDS32_LONGJUMP4
, laddr
);
10877 if (call_irel
== irelend
)
10881 ELF32_R_INFO (ELF32_R_SYM (hi_irel
->r_info
), R_NDS32_NONE
);
10887 /* Relax LONGJUMP5 relocation for nds32_elf_relax_section. */
10890 nds32_elf_relax_longjump5 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
10891 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
10892 int *seq_len
, bfd_byte
*contents
,
10893 Elf_Internal_Sym
*isymbuf
,
10894 Elf_Internal_Shdr
*symtab_hdr
)
10896 /* There are 2 variations for LONGJUMP5
10897 case 2-4; 1st insn convertible, 16-bit on.
10898 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
10899 j label ; 25_PCREL/INSN16
10902 case 4-4; 1st insn not convertible
10903 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
10904 j label ; 25_PCREL/INSN16
10908 Elf_Internal_Rela
*cond_irel
, *irelend
;
10910 bfd_signed_vma foff
;
10911 uint32_t insn
, re_insn
= 0;
10912 uint16_t insn16
, re_insn16
= 0;
10913 unsigned long reloc
;
10915 enum elf_nds32_reloc_type checked_types
[] =
10916 { R_NDS32_17_PCREL_RELA
, R_NDS32_15_PCREL_RELA
,
10917 R_NDS32_9_PCREL_RELA
, R_NDS32_INSN16
};
10919 irelend
= internal_relocs
+ sec
->reloc_count
;
10920 laddr
= irel
->r_offset
;
10922 /* Get the reloc for the address from which the register is
10923 being loaded. This reloc will tell us which function is
10924 actually being called. */
10927 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10928 R_NDS32_25_PCREL_RELA
, irel
->r_addend
);
10929 if (cond_irel
== irelend
)
10931 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP5",
10932 (uint64_t) irel
->r_offset
);
10936 /* Get the value of the symbol referred to by the reloc. */
10937 foff
= calculate_offset (abfd
, sec
, cond_irel
, isymbuf
, symtab_hdr
);
10940 || foff
< -CONSERVATIVE_16BIT_S1
10941 || foff
>= CONSERVATIVE_16BIT_S1
)
10944 /* Get the all corresponding instructions. */
10945 insn
= bfd_getb32 (contents
+ laddr
);
10946 /* Check instruction size. */
10947 if (insn
& 0x80000000)
10950 insn16
= insn
>> 16;
10951 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
10954 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
10956 if (N32_OP6 (re_insn
) == N32_OP6_BR1
10957 && (foff
>= -CONSERVATIVE_14BIT_S1
&& foff
< CONSERVATIVE_14BIT_S1
))
10959 /* beqs label ; 15_PCREL. */
10960 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
10961 reloc
= R_NDS32_15_PCREL_RELA
;
10963 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
10964 && foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
10966 /* beqz label ; 17_PCREL. */
10967 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
10968 reloc
= R_NDS32_17_PCREL_RELA
;
10970 else if ( N32_OP6 (re_insn
) == N32_OP6_BR3
10971 && foff
>= -CONSERVATIVE_8BIT_S1
&& foff
< CONSERVATIVE_8BIT_S1
)
10973 /* beqc label ; 9_PCREL. */
10974 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
10975 reloc
= R_NDS32_WORD_9_PCREL_RELA
;
10980 /* Set all relocations. */
10981 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), reloc
);
10983 /* Clean relocations. */
10984 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
10985 for (i
= 0; i
< ARRAY_SIZE (checked_types
); i
++)
10987 cond_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
10988 checked_types
[i
], laddr
);
10989 if (cond_irel
!= irelend
)
10992 && (ELF32_R_TYPE (cond_irel
->r_info
) == R_NDS32_INSN16
))
10994 /* If the branch instruction is 2 byte, it cannot remove
10995 directly. Only convert it to nop16 and remove it after
10996 checking alignment issue. */
10997 insn16
= NDS32_NOP16
;
10998 bfd_putb16 (insn16
, contents
+ laddr
);
10999 cond_irel
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
11002 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
11011 /* Relax LONGJUMP6 relocation for nds32_elf_relax_section. */
11014 nds32_elf_relax_longjump6 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
11015 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
11016 int *seq_len
, bfd_byte
*contents
,
11017 Elf_Internal_Sym
*isymbuf
,
11018 Elf_Internal_Shdr
*symtab_hdr
)
11020 /* There are 5 variations for LONGJUMP6
11021 case : 2-4-4-4; 1st insn convertible, 16-bit on.
11022 bnes38 rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
11023 sethi ta, hi20(symbol) ; HI20/PTR
11024 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
11025 jr ta ; PTR_RES/INSN16/EMPTY
11028 case : 4-4-4-4; 1st insn not convertible, 16-bit on.
11029 bne rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
11030 sethi ta, hi20(symbol) ; HI20/PTR
11031 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
11032 jr ta ; PTR_RES/INSN16/EMPTY
11035 enum elf_nds32_reloc_type checked_types
[] =
11036 { R_NDS32_17_PCREL_RELA
, R_NDS32_15_PCREL_RELA
,
11037 R_NDS32_9_PCREL_RELA
, R_NDS32_INSN16
};
11039 int reloc_off
= 0, cond_removed
= 0;
11041 Elf_Internal_Rela
*cond_irel
, *em_irel
, *irelend
, *insn_irel
;
11043 bfd_signed_vma foff
;
11044 uint32_t insn
, re_insn
= 0;
11045 uint16_t insn16
, re_insn16
= 0;
11046 unsigned long reloc
;
11048 irelend
= internal_relocs
+ sec
->reloc_count
;
11049 laddr
= irel
->r_offset
;
11051 /* Get the reloc for the address from which the register is
11052 being loaded. This reloc will tell us which function is
11053 actually being called. */
11054 em_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11055 R_NDS32_EMPTY
, irel
->r_addend
);
11057 if (em_irel
== irelend
)
11059 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP6",
11060 (uint64_t) irel
->r_offset
);
11064 /* Get the value of the symbol referred to by the reloc. */
11065 foff
= calculate_offset (abfd
, sec
, em_irel
, isymbuf
, symtab_hdr
);
11068 || foff
< -CONSERVATIVE_24BIT_S1
11069 || foff
>= CONSERVATIVE_24BIT_S1
)
11072 insn
= bfd_getb32 (contents
+ laddr
);
11073 /* Check instruction size. */
11074 if (insn
& 0x80000000)
11077 insn16
= insn
>> 16;
11078 nds32_elf_convert_branch (insn16
, 0, &re_insn16
, &re_insn
);
11081 nds32_elf_convert_branch (0, insn
, &re_insn16
, &re_insn
);
11083 /* For simplicity of coding, we are going to modify the section
11084 contents, the section relocs, and the BFD symbol table. We
11085 must tell the rest of the code not to free up this
11086 information. It would be possible to instead create a table
11087 of changes which have to be made, as is done in coff-mips.c;
11088 that would be more work, but would require less memory when
11089 the linker is run. */
11091 if (N32_OP6 (re_insn
) == N32_OP6_BR1
11092 && (foff
>= -CONSERVATIVE_14BIT_S1
&& foff
< CONSERVATIVE_14BIT_S1
))
11094 /* beqs label ; 15_PCREL. */
11095 bfd_putb32 (re_insn
, contents
+ em_irel
->r_offset
);
11096 reloc
= R_NDS32_15_PCREL_RELA
;
11099 else if (N32_OP6 (re_insn
) == N32_OP6_BR2
11100 && foff
>= -CONSERVATIVE_16BIT_S1
&& foff
< CONSERVATIVE_16BIT_S1
)
11102 /* beqz label ; 17_PCREL. */
11103 bfd_putb32 (re_insn
, contents
+ em_irel
->r_offset
);
11104 reloc
= R_NDS32_17_PCREL_RELA
;
11107 else if (foff
>= -CONSERVATIVE_24BIT_S1
- reloc_off
11108 && foff
< CONSERVATIVE_24BIT_S1
- reloc_off
)
11110 /* Relax to one of the following 2 variations
11112 case 2-4; 1st insn convertible, 16-bit on.
11113 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
11114 j label ; 25_PCREL/INSN16
11117 case 4-4; 1st insn not convertible
11118 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
11119 j label ; 25_PCREL/INSN16
11122 /* Use j label as second instruction. */
11124 reloc
= R_NDS32_25_PCREL_RELA
;
11125 bfd_putb32 (insn
, contents
+ em_irel
->r_offset
);
11130 /* Set all relocations. */
11131 em_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (em_irel
->r_info
), reloc
);
11134 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11135 R_NDS32_PTR_RESOLVED
, em_irel
->r_offset
);
11136 cond_irel
->r_addend
= 1;
11138 /* Use INSN16 of first branch instruction to distinguish if keeping
11139 INSN16 of final instruction or not. */
11140 insn_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11141 R_NDS32_INSN16
, irel
->r_offset
);
11142 if (insn_irel
== irelend
)
11144 /* Clean the final INSN16. */
11146 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11147 R_NDS32_INSN16
, em_irel
->r_offset
);
11148 insn_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
11152 if (cond_removed
== 1)
11156 /* Clear relocations. */
11157 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11159 for (i
= 0; i
< ARRAY_SIZE (checked_types
); i
++)
11162 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11163 checked_types
[i
], laddr
);
11164 if (cond_irel
!= irelend
)
11167 && (ELF32_R_TYPE (cond_irel
->r_info
) == R_NDS32_INSN16
))
11169 /* If the branch instruction is 2 byte, it cannot remove
11170 directly. Only convert it to nop16 and remove it after
11171 checking alignment issue. */
11172 insn16
= NDS32_NOP16
;
11173 bfd_putb16 (insn16
, contents
+ laddr
);
11174 cond_irel
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
11177 cond_irel
->r_info
=
11178 ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
), R_NDS32_NONE
);
11184 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
11185 R_NDS32_LONGJUMP5
);
11191 /* Relax LONGJUMP7 relocation for nds32_elf_relax_section. */
11194 nds32_elf_relax_longjump7 (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
11195 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
11196 int *seq_len
, bfd_byte
*contents
,
11197 Elf_Internal_Sym
*isymbuf
,
11198 Elf_Internal_Shdr
*symtab_hdr
)
11200 /* There are 2 variations for LONGJUMP5
11201 case 2-4; 1st insn convertible, 16-bit on.
11202 movi55 ta, imm11 ; LONGJUMP7/INSN16
11203 beq rt, ta, label ; 15_PCREL
11205 case 4-4; 1st insn not convertible
11206 movi55 ta, imm11 ; LONGJUMP7/INSN16
11207 beq rt, ta, label ; 15_PCREL */
11210 Elf_Internal_Rela
*cond_irel
, *irelend
, *insn_irel
;
11211 bfd_signed_vma foff
;
11212 uint32_t insn
, re_insn
= 0;
11216 irelend
= internal_relocs
+ sec
->reloc_count
;
11217 laddr
= irel
->r_offset
;
11219 /* Get the reloc for the address from which the register is
11220 being loaded. This reloc will tell us which function is
11221 actually being called. */
11224 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11225 R_NDS32_15_PCREL_RELA
, irel
->r_addend
);
11226 if (cond_irel
== irelend
)
11228 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LONGJUMP7",
11229 (uint64_t) irel
->r_offset
);
11233 /* Get the value of the symbol referred to by the reloc. */
11234 foff
= calculate_offset (abfd
, sec
, cond_irel
, isymbuf
, symtab_hdr
);
11237 || foff
< -CONSERVATIVE_8BIT_S1
11238 || foff
>= CONSERVATIVE_8BIT_S1
)
11241 /* Get the first instruction for its size. */
11242 insn
= bfd_getb32 (contents
+ laddr
);
11243 if (insn
& 0x80000000)
11246 /* Get the immediate from movi55. */
11247 imm11
= N16_IMM5S (insn
>> 16);
11251 /* Get the immediate from movi. */
11252 imm11
= N32_IMM20S (insn
);
11255 /* Get the branch instruction. */
11256 insn
= bfd_getb32 (contents
+ irel
->r_addend
);
11257 /* Convert instruction to BR3. */
11258 if ((insn
>> 14) & 0x1)
11259 re_insn
= N32_BR3 (BNEC
, N32_RT5 (insn
), imm11
, 0);
11261 re_insn
= N32_BR3 (BEQC
, N32_RT5 (insn
), imm11
, 0);
11263 bfd_putb32 (re_insn
, contents
+ cond_irel
->r_offset
);
11265 /* Set all relocations. */
11266 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
11267 R_NDS32_WORD_9_PCREL_RELA
);
11269 /* Clean relocations. */
11270 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11271 insn_irel
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11272 R_NDS32_INSN16
, irel
->r_offset
);
11273 if (insn_irel
!= irelend
)
11277 /* If the first insntruction is 16bit, convert it to nop16. */
11278 insn16
= NDS32_NOP16
;
11279 bfd_putb16 (insn16
, contents
+ laddr
);
11280 insn_irel
->r_addend
= R_NDS32_INSN16_CONVERT_FLAG
;
11283 cond_irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (cond_irel
->r_info
),
11291 /* We figure out and reassign the best gp value in nds32_elf_final_sda_base
11292 for each relax round. But the gp may changed dramatically and then cause
11293 the truncated to fit errors for the the converted gp instructions.
11294 Therefore, we must reserve the minimum but safe enough size to prevent it. */
11297 nds32_elf_relax_guard (bfd_vma
*access_addr
, bfd_vma local_sda
, asection
*sec
,
11298 Elf_Internal_Rela
*irel
, bfd_boolean
*again
,
11300 struct elf_nds32_link_hash_table
*table
,
11301 Elf_Internal_Sym
*isymbuf
, Elf_Internal_Shdr
*symtab_hdr
)
11305 static bfd_boolean sec_pass
= FALSE
;
11306 static asection
*first_sec
= NULL
, *sym_sec
;
11307 /* Record the number of instructions which may be removed. */
11308 static int count
= 0, record_count
;
11309 Elf_Internal_Sym
*isym
;
11310 struct elf_link_hash_entry
*h
= NULL
;
11312 unsigned long r_symndx
;
11313 bfd
*abfd
= sec
->owner
;
11314 static bfd_vma record_sda
= 0;
11315 int sda_offset
= 0;
11317 /* Force doing relaxation when hyper-relax is high. */
11318 if (table
->hyper_relax
== 2)
11321 /* Do not relax the load/store patterns for the first
11327 else if (first_sec
== sec
)
11329 record_count
= count
;
11340 /* Generally, _SDA_BASE_ is fixed or smaller. But the large
11341 DATA_SEGMENT_ALIGN size in the linker script may make it
11342 get even bigger. */
11343 if (record_sda
== 0)
11344 record_sda
= local_sda
;
11345 else if (local_sda
> record_sda
)
11346 sda_offset
= local_sda
- record_sda
;
11348 /* Assume the instruction will be removed in the best case. */
11351 /* We record the offset to gp for each symbol, and then check
11352 if it is changed dramatically after relaxing.
11353 (global symbol): elf32_nds32_hash_entry (h)->offset_to_gp
11354 (local symbol) : elf32_nds32_local_gp_offset (abfd)[r_symndx]. */
11355 r_symndx
= ELF32_R_SYM (irel
->r_info
);
11356 if (r_symndx
>= symtab_hdr
->sh_info
)
11358 /* Global symbols. */
11359 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
11360 h
= elf_sym_hashes (abfd
)[indx
];
11361 sym_sec
= h
->root
.u
.def
.section
;
11362 if (NDS32_GUARD_SEC_P (sym_sec
->flags
)
11363 || bfd_is_abs_section (sym_sec
))
11365 /* Forbid doing relaxation when hyper-relax is low. */
11366 if (table
->hyper_relax
== 0)
11369 offset_to_gp
= *access_addr
- local_sda
;
11370 if (elf32_nds32_hash_entry (h
)->offset_to_gp
== 0)
11371 elf32_nds32_hash_entry (h
)->offset_to_gp
= offset_to_gp
;
11372 else if (abs (elf32_nds32_hash_entry (h
)->offset_to_gp
)
11373 < abs (offset_to_gp
) - sda_offset
)
11375 /* This may cause the error, so we reserve the
11376 safe enough size for relaxing. */
11377 if (*access_addr
>= local_sda
)
11378 *access_addr
+= (record_count
* 4);
11380 *access_addr
-= (record_count
* 4);
11387 /* Local symbols. */
11388 if (!elf32_nds32_allocate_local_sym_info (abfd
))
11390 isym
= isymbuf
+ r_symndx
;
11392 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
11393 if (NDS32_GUARD_SEC_P (sym_sec
->flags
))
11395 /* Forbid doing relaxation when hyper-relax is low. */
11396 if (table
->hyper_relax
== 0)
11399 offset_to_gp
= *access_addr
- local_sda
;
11400 if (elf32_nds32_local_gp_offset (abfd
)[r_symndx
] == 0)
11401 elf32_nds32_local_gp_offset (abfd
)[r_symndx
] = offset_to_gp
;
11402 else if (abs (elf32_nds32_local_gp_offset (abfd
)[r_symndx
])
11403 < abs (offset_to_gp
) - sda_offset
)
11405 /* This may cause the error, so we reserve the
11406 safe enough size for relaxing. */
11407 if (*access_addr
>= local_sda
)
11408 *access_addr
+= (record_count
* 4);
11410 *access_addr
-= (record_count
* 4);
11419 #define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
11421 /* Relax LOADSTORE relocation for nds32_elf_relax_section. */
11424 nds32_elf_relax_loadstore (struct bfd_link_info
*link_info
, bfd
*abfd
,
11425 asection
*sec
, Elf_Internal_Rela
*irel
,
11426 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
11427 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11428 Elf_Internal_Shdr
*symtab_hdr
, int load_store_relax
,
11429 struct elf_nds32_link_hash_table
*table
)
11431 int eliminate_sethi
= 0, range_type
;
11433 bfd_vma local_sda
, laddr
;
11434 int seq_len
; /* Original length of instruction sequence. */
11436 Elf_Internal_Rela
*hi_irelfn
= NULL
, *irelend
;
11437 bfd_vma access_addr
= 0;
11438 bfd_vma range_l
= 0, range_h
= 0; /* Upper/lower bound. */
11439 struct elf_link_hash_entry
*h
= NULL
;
11441 enum elf_nds32_reloc_type checked_types
[] =
11442 { R_NDS32_HI20_RELA
, R_NDS32_GOT_HI20
,
11443 R_NDS32_GOTPC_HI20
, R_NDS32_GOTOFF_HI20
,
11444 R_NDS32_PLTREL_HI20
, R_NDS32_PLT_GOTREL_HI20
,
11445 R_NDS32_TLS_LE_HI20
11448 irelend
= internal_relocs
+ sec
->reloc_count
;
11449 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
11450 laddr
= irel
->r_offset
;
11451 *insn_len
= seq_len
;
11453 /* Get the high part relocation. */
11454 for (i
= 0; i
< ARRAY_SIZE (checked_types
); i
++)
11456 hi_irelfn
= find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11457 checked_types
[i
], laddr
);
11458 if (hi_irelfn
!= irelend
)
11462 if (hi_irelfn
== irelend
)
11464 /* Not R_NDS32_HI20_RELA. */
11466 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LOADSTORE",
11467 (uint64_t) irel
->r_offset
);
11471 range_type
= GET_LOADSTORE_RANGE (irel
->r_addend
);
11472 nds32_elf_final_sda_base (sec
->output_section
->owner
,
11473 link_info
, &local_sda
, FALSE
);
11475 switch (ELF32_R_TYPE (hi_irelfn
->r_info
))
11477 case R_NDS32_HI20_RELA
:
11478 insn
= bfd_getb32 (contents
+ laddr
);
11480 calculate_memory_address (abfd
, hi_irelfn
, isymbuf
, symtab_hdr
);
11482 if (ELF32_R_SYM (hi_irelfn
->r_info
) >= symtab_hdr
->sh_info
)
11484 indx
= ELF32_R_SYM (hi_irelfn
->r_info
) - symtab_hdr
->sh_info
;
11485 h
= elf_sym_hashes (abfd
)[indx
];
11489 if (range_type
== NDS32_LOADSTORE_IMM
11490 && access_addr
< CONSERVATIVE_20BIT
11491 && (!h
|| (h
&& strcmp (h
->root
.root
.string
, FP_BASE_NAME
) != 0)))
11493 eliminate_sethi
= 1;
11497 if (h
&& strcmp (h
->root
.root
.string
, FP_BASE_NAME
) == 0)
11499 eliminate_sethi
= 1;
11502 else if (!nds32_elf_relax_guard (&access_addr
, local_sda
, sec
, hi_irelfn
,
11503 NULL
, FALSE
, table
, isymbuf
, symtab_hdr
))
11506 if (!load_store_relax
)
11509 /* Case for set gp register. */
11510 if (N32_RT5 (insn
) == REG_GP
)
11513 if (range_type
== NDS32_LOADSTORE_FLOAT_S
11514 || range_type
== NDS32_LOADSTORE_FLOAT_D
)
11516 range_l
= sdata_range
[0][0];
11517 range_h
= sdata_range
[0][1];
11521 range_l
= sdata_range
[1][0];
11522 range_h
= sdata_range
[1][1];
11530 /* Delete sethi instruction. */
11531 if (eliminate_sethi
== 1
11532 || (local_sda
<= access_addr
&& (access_addr
- local_sda
) < range_h
)
11533 || (local_sda
> access_addr
&& (local_sda
- access_addr
) <= range_l
))
11535 hi_irelfn
->r_info
=
11536 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_NDS32_NONE
);
11538 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11546 /* Relax LO12 relocation for nds32_elf_relax_section. */
11549 nds32_elf_relax_lo12 (struct bfd_link_info
*link_info
, bfd
*abfd
,
11550 asection
*sec
, Elf_Internal_Rela
*irel
,
11551 Elf_Internal_Rela
*internal_relocs
, bfd_byte
*contents
,
11552 Elf_Internal_Sym
*isymbuf
, Elf_Internal_Shdr
*symtab_hdr
,
11553 struct elf_nds32_link_hash_table
*table
)
11556 bfd_vma local_sda
, laddr
;
11557 unsigned long reloc
;
11558 bfd_vma access_addr
;
11559 bfd_vma range_l
= 0, range_h
= 0; /* Upper/lower bound. */
11560 Elf_Internal_Rela
*irelfn
= NULL
, *irelend
;
11561 struct elf_link_hash_entry
*h
= NULL
;
11564 /* For SDA base relative relaxation. */
11565 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
11566 &local_sda
, FALSE
);
11568 irelend
= internal_relocs
+ sec
->reloc_count
;
11569 laddr
= irel
->r_offset
;
11570 insn
= bfd_getb32 (contents
+ laddr
);
11572 if (!is_sda_access_insn (insn
) && N32_OP6 (insn
) != N32_OP6_ORI
)
11575 access_addr
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
11577 if (ELF32_R_SYM (irel
->r_info
) >= symtab_hdr
->sh_info
)
11579 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
11580 h
= elf_sym_hashes (abfd
)[indx
];
11584 if (N32_OP6 (insn
) == N32_OP6_ORI
&& access_addr
< CONSERVATIVE_20BIT
11585 && (!h
|| (h
&& strcmp (h
->root
.root
.string
, FP_BASE_NAME
) != 0)))
11587 reloc
= R_NDS32_20_RELA
;
11588 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
11589 insn
= N32_TYPE1 (MOVI
, N32_RT5 (insn
), 0);
11590 bfd_putb32 (insn
, contents
+ laddr
);
11594 if (h
&& strcmp (h
->root
.root
.string
, FP_BASE_NAME
) == 0)
11596 /* Fall through. */
11598 else if (!nds32_elf_relax_guard (&access_addr
, local_sda
, sec
, irel
, NULL
,
11599 FALSE
, table
, isymbuf
, symtab_hdr
))
11602 range_l
= sdata_range
[1][0];
11603 range_h
= sdata_range
[1][1];
11604 switch (ELF32_R_TYPE (irel
->r_info
))
11606 case R_NDS32_LO12S0_RELA
:
11607 reloc
= R_NDS32_SDA19S0_RELA
;
11609 case R_NDS32_LO12S1_RELA
:
11610 reloc
= R_NDS32_SDA18S1_RELA
;
11612 case R_NDS32_LO12S2_RELA
:
11613 reloc
= R_NDS32_SDA17S2_RELA
;
11615 case R_NDS32_LO12S2_DP_RELA
:
11616 range_l
= sdata_range
[0][0];
11617 range_h
= sdata_range
[0][1];
11618 reloc
= R_NDS32_SDA12S2_DP_RELA
;
11620 case R_NDS32_LO12S2_SP_RELA
:
11621 range_l
= sdata_range
[0][0];
11622 range_h
= sdata_range
[0][1];
11623 reloc
= R_NDS32_SDA12S2_SP_RELA
;
11629 /* There are range_h and range_l because linker has to promise
11630 all sections move cross one page together. */
11631 if ((local_sda
<= access_addr
&& (access_addr
- local_sda
) < range_h
)
11632 || (local_sda
> access_addr
&& (local_sda
- access_addr
) <= range_l
)
11633 || (h
&& strcmp (h
->root
.root
.string
, FP_BASE_NAME
) == 0))
11635 if (N32_OP6 (insn
) == N32_OP6_ORI
&& N32_RT5 (insn
) == REG_GP
)
11637 /* Maybe we should add R_NDS32_INSN16 reloc type here
11638 or manually do some optimization. sethi can't be
11639 eliminated when updating $gp so the relative ori
11640 needs to be preserved. */
11643 if (!turn_insn_to_sda_access (insn
, ELF32_R_TYPE (irel
->r_info
),
11646 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
11647 bfd_putb32 (insn
, contents
+ laddr
);
11649 irelfn
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11651 /* SDA17 must keep INSN16 for converting fp_as_gp. */
11652 if (irelfn
!= irelend
&& reloc
!= R_NDS32_SDA17S2_RELA
)
11654 ELF32_R_INFO (ELF32_R_SYM (irelfn
->r_info
), R_NDS32_NONE
);
11661 /* Relax PTR relocation for nds32_elf_relax_section. */
11664 nds32_elf_relax_ptr (bfd
*abfd
, asection
*sec
, Elf_Internal_Rela
*irel
,
11665 Elf_Internal_Rela
*internal_relocs
, int *insn_len
,
11666 int *seq_len
, bfd_byte
*contents
)
11668 Elf_Internal_Rela
*ptr_irel
, *irelend
, *count_irel
, *re_irel
;
11670 irelend
= internal_relocs
+ sec
->reloc_count
;
11673 find_relocs_at_address_addr (irel
, internal_relocs
, irelend
,
11674 R_NDS32_PTR_RESOLVED
, irel
->r_addend
);
11676 if (re_irel
== irelend
)
11678 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_PTR",
11679 (uint64_t) irel
->r_offset
);
11683 if (re_irel
->r_addend
!= 1)
11686 /* Pointed target is relaxed and no longer needs this void *,
11687 change the type to NONE. */
11688 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11690 /* Find PTR_COUNT to decide remove it or not. If PTR_COUNT does
11691 not exist, it means only count 1 and remove it directly. */
11692 /* TODO: I hope we can obsolate R_NDS32_COUNT in the future. */
11693 count_irel
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11694 R_NDS32_PTR_COUNT
);
11695 ptr_irel
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11697 if (count_irel
!= irelend
)
11699 if (--count_irel
->r_addend
> 0)
11703 if (ptr_irel
!= irelend
)
11706 /* If the PTR_COUNT is already 0, remove current instruction. */
11707 *seq_len
= nds32_elf_insn_size (abfd
, contents
, irel
->r_offset
);
11712 /* Relax LWC relocation for nds32_elf_relax_section. */
11715 nds32_elf_relax_flsi (struct bfd_link_info
*link_info
, bfd
*abfd
,
11716 asection
*sec
, Elf_Internal_Rela
*irel
,
11717 Elf_Internal_Rela
*internal_relocs
,
11718 bfd_byte
*contents
, Elf_Internal_Sym
*isymbuf
,
11719 Elf_Internal_Shdr
*symtab_hdr
, bfd_boolean
*again
)
11722 sethi ra, hi20(symbol) ; HI20/LOADSTORE
11723 ori ra, ra, lo12(symbol) ; LO12S0/PTR/PTR/.../INSN16
11724 flsi fsa, [ra + offset1] ; LSI/PTR_RESOLVED/INSN16
11725 flsi fsb, [ra + offset2] ; LSI/PTR_RESOLVED/INSN16
11729 bfd_vma local_sda
, laddr
;
11730 unsigned long reloc
;
11731 bfd_vma access_addr
, flsi_offset
;
11732 bfd_vma range_l
= 0, range_h
= 0; /* Upper/lower bound. */
11733 Elf_Internal_Rela
*irelend
, *re_irel
;
11734 unsigned int opcode
;
11736 irelend
= internal_relocs
+ sec
->reloc_count
;
11737 laddr
= irel
->r_offset
;
11738 insn
= bfd_getb32 (contents
+ laddr
);
11740 if ((insn
& 0x80000000) || !is_sda_access_insn (insn
))
11743 /* Can not do relaxation for bi format. */
11744 if ((insn
& 0x1000))
11747 /* Only deal with flsi, fssi, fldi, fsdi, so far. */
11748 opcode
= N32_OP6 (insn
);
11749 if ((opcode
== N32_OP6_LWC
) || (opcode
== N32_OP6_SWC
))
11750 reloc
= R_NDS32_SDA12S2_SP_RELA
;
11751 else if ((opcode
== N32_OP6_LDC
) || (opcode
== N32_OP6_SDC
))
11752 reloc
= R_NDS32_SDA12S2_DP_RELA
;
11756 re_irel
= find_relocs_at_address (irel
, internal_relocs
, irelend
,
11757 R_NDS32_PTR_RESOLVED
);
11758 if (re_irel
== irelend
)
11760 _bfd_error_handler (unrecognized_reloc_msg
, abfd
, "R_NDS32_LSI",
11761 (uint64_t) irel
->r_offset
);
11765 /* For SDA base relative relaxation. */
11766 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
11767 &local_sda
, FALSE
);
11768 access_addr
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
11769 flsi_offset
= (insn
& 0xfff) << 2;
11770 access_addr
+= flsi_offset
;
11771 range_l
= sdata_range
[0][0];
11772 range_h
= sdata_range
[0][1];
11774 if ((local_sda
<= access_addr
&& (access_addr
- local_sda
) < range_h
)
11775 || (local_sda
> access_addr
&& (local_sda
- access_addr
) <= range_l
))
11777 /* Turn flsi instruction into sda access format. */
11778 insn
= (insn
& 0x7ff07000) | (REG_GP
<< 15);
11780 /* Add relocation type to flsi. */
11781 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), reloc
);
11782 irel
->r_addend
+= flsi_offset
;
11783 bfd_putb32 (insn
, contents
+ re_irel
->r_offset
);
11785 re_irel
->r_addend
|= 1;
11791 nds32_relax_adjust_label (bfd
*abfd
, asection
*sec
,
11792 Elf_Internal_Rela
*internal_relocs
,
11793 bfd_byte
*contents
,
11794 nds32_elf_blank_t
**relax_blank_list
,
11795 int optimize
, int opt_size
)
11797 /* This code block is used to adjust 4-byte alignment by relax a pair
11798 of instruction a time.
11800 It recognizes three types of relocations.
11801 1. R_NDS32_LABEL - a alignment.
11802 2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11803 3. is_16bit_NOP () - remove a 16-bit instruction. */
11805 /* TODO: It seems currently implementation only support 4-byte alignment.
11806 We should handle any-alignment. */
11808 Elf_Internal_Rela
*insn_rel
= NULL
, *label_rel
= NULL
, *irel
;
11809 Elf_Internal_Rela
*tmp_rel
, *tmp2_rel
= NULL
;
11810 Elf_Internal_Rela rel_temp
;
11811 Elf_Internal_Rela
*irelend
;
11815 /* Checking for branch relaxation relies on the relocations to
11816 be sorted on 'r_offset'. This is not guaranteed so we must sort. */
11817 nds32_insertion_sort (internal_relocs
, sec
->reloc_count
,
11818 sizeof (Elf_Internal_Rela
), compar_reloc
);
11820 irelend
= internal_relocs
+ sec
->reloc_count
;
11822 /* Force R_NDS32_LABEL before R_NDS32_INSN16. */
11823 /* FIXME: Can we generate the right order in assembler?
11824 So we don't have to swapping them here. */
11826 for (label_rel
= internal_relocs
, insn_rel
= internal_relocs
;
11827 label_rel
< irelend
; label_rel
++)
11829 if (ELF32_R_TYPE (label_rel
->r_info
) != R_NDS32_LABEL
)
11832 /* Find the first reloc has the same offset with label_rel. */
11833 while (insn_rel
< irelend
&& insn_rel
->r_offset
< label_rel
->r_offset
)
11836 for (;insn_rel
< irelend
&& insn_rel
->r_offset
== label_rel
->r_offset
;
11838 /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11840 if (ELF32_R_TYPE (insn_rel
->r_info
) == R_NDS32_INSN16
)
11843 if (insn_rel
< irelend
&& insn_rel
->r_offset
== label_rel
->r_offset
11844 && insn_rel
< label_rel
)
11846 /* Swap the two reloc if the R_NDS32_INSN16 is
11847 before R_NDS32_LABEL. */
11848 memcpy (&rel_temp
, insn_rel
, sizeof (Elf_Internal_Rela
));
11849 memcpy (insn_rel
, label_rel
, sizeof (Elf_Internal_Rela
));
11850 memcpy (label_rel
, &rel_temp
, sizeof (Elf_Internal_Rela
));
11856 /* If there were a sequence of R_NDS32_LABEL end up with .align 2
11857 or higher, remove other R_NDS32_LABEL with lower alignment.
11858 If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
11859 then the R_NDS32_LABEL sequence is broke. */
11860 for (tmp_rel
= internal_relocs
; tmp_rel
< irelend
; tmp_rel
++)
11862 if (ELF32_R_TYPE (tmp_rel
->r_info
) == R_NDS32_LABEL
)
11864 if (label_rel
== NULL
)
11866 if (tmp_rel
->r_addend
< 2)
11867 label_rel
= tmp_rel
;
11870 else if (tmp_rel
->r_addend
> 1)
11872 /* Remove all LABEL relocation from label_rel to tmp_rel
11873 including relocations with same offset as tmp_rel. */
11874 for (tmp2_rel
= label_rel
; tmp2_rel
< tmp_rel
; tmp2_rel
++)
11876 if (tmp2_rel
->r_offset
== tmp_rel
->r_offset
)
11879 if (ELF32_R_TYPE (tmp2_rel
->r_info
) == R_NDS32_LABEL
11880 && tmp2_rel
->r_addend
< 2)
11882 ELF32_R_INFO (ELF32_R_SYM (tmp2_rel
->r_info
),
11888 else if (ELF32_R_TYPE (tmp_rel
->r_info
) == R_NDS32_INSN16
&& label_rel
)
11890 /* A new INSN16 which can be converted, so clear label_rel. */
11891 if (is_convert_32_to_16 (abfd
, sec
, tmp_rel
, internal_relocs
,
11893 || is_16bit_NOP (abfd
, sec
, tmp_rel
))
11900 /* Optimized for speed and nothing has not been relaxed.
11901 It's time to align labels.
11902 We may convert a 16-bit instruction right before a label to
11903 32-bit, in order to align the label if necessary
11904 all reloc entries has been sorted by r_offset. */
11905 for (irel
= internal_relocs
;
11906 irel
< irelend
&& irel
->r_offset
< sec
->size
; irel
++)
11908 if (ELF32_R_TYPE (irel
->r_info
) != R_NDS32_INSN16
11909 && ELF32_R_TYPE (irel
->r_info
) != R_NDS32_LABEL
)
11912 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_INSN16
)
11914 /* A new INSN16 found, resize the old one. */
11915 if (is_convert_32_to_16
11916 (abfd
, sec
, irel
, internal_relocs
, irelend
, &insn16
)
11917 || is_16bit_NOP (abfd
, sec
, irel
))
11921 /* Previous INSN16 reloc exists, reduce its
11923 if (is_convert_32_to_16 (abfd
, sec
, insn_rel
, internal_relocs
,
11926 nds32_elf_write_16 (abfd
, contents
, insn_rel
,
11927 internal_relocs
, irelend
, insn16
);
11929 if (!insert_nds32_elf_blank_recalc_total
11930 (relax_blank_list
, insn_rel
->r_offset
+ 2, 2))
11933 else if (is_16bit_NOP (abfd
, sec
, insn_rel
))
11935 if (!insert_nds32_elf_blank_recalc_total
11936 (relax_blank_list
, insn_rel
->r_offset
, 2))
11940 ELF32_R_INFO (ELF32_R_SYM (insn_rel
->r_info
), R_NDS32_NONE
);
11942 /* Save the new one for later use. */
11946 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
11949 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
)
11951 /* Search for label. */
11952 int force_relax
= 0;
11954 /* Label on 16-bit instruction or optimization
11955 needless, just reset this reloc. */
11956 insn16
= bfd_getb16 (contents
+ irel
->r_offset
);
11957 if ((irel
->r_addend
& 0x1f) < 2 && (!optimize
|| (insn16
& 0x8000)))
11960 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_NDS32_NONE
);
11965 irel
->r_offset
- get_nds32_elf_blank_total (relax_blank_list
,
11966 irel
->r_offset
, 1);
11970 /* Check if there is case which can not be aligned. */
11971 if (irel
->r_addend
== 2 && address
& 0x2)
11976 /* Try to align this label. */
11978 if ((irel
->r_addend
& 0x1f) < 2)
11980 /* Check if there is a INSN16 at the same address.
11981 Label_rel always seats before insn_rel after
11984 /* Search for INSN16 at LABEL location. If INSN16 is at
11985 same location and this LABEL alignment is lower than 2,
11986 the INSN16 can be converted to 2-byte. */
11987 for (tmp_rel
= irel
;
11988 tmp_rel
< irelend
&& tmp_rel
->r_offset
== irel
->r_offset
;
11991 if (ELF32_R_TYPE (tmp_rel
->r_info
) == R_NDS32_INSN16
11992 && (is_convert_32_to_16
11993 (abfd
, sec
, tmp_rel
, internal_relocs
,
11995 || is_16bit_NOP (abfd
, sec
, tmp_rel
)))
12003 if (force_relax
|| irel
->r_addend
== 1 || address
& 0x2)
12005 /* Label not aligned. */
12006 /* Previous reloc exists, reduce its size to 16-bit. */
12007 if (is_convert_32_to_16 (abfd
, sec
, insn_rel
,
12008 internal_relocs
, irelend
, &insn16
))
12010 nds32_elf_write_16 (abfd
, contents
, insn_rel
,
12011 internal_relocs
, irelend
, insn16
);
12013 if (!insert_nds32_elf_blank_recalc_total
12014 (relax_blank_list
, insn_rel
->r_offset
+ 2, 2))
12017 else if (is_16bit_NOP (abfd
, sec
, insn_rel
))
12019 if (!insert_nds32_elf_blank_recalc_total
12020 (relax_blank_list
, insn_rel
->r_offset
, 2))
12025 /* INSN16 reloc is used. */
12031 sec
->size
- get_nds32_elf_blank_total (relax_blank_list
, sec
->size
, 0);
12032 if (insn_rel
&& (address
& 0x2 || opt_size
))
12034 if (is_convert_32_to_16 (abfd
, sec
, insn_rel
, internal_relocs
,
12037 nds32_elf_write_16 (abfd
, contents
, insn_rel
, internal_relocs
,
12039 if (!insert_nds32_elf_blank_recalc_total
12040 (relax_blank_list
, insn_rel
->r_offset
+ 2, 2))
12042 insn_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (insn_rel
->r_info
),
12045 else if (is_16bit_NOP (abfd
, sec
, insn_rel
))
12047 if (!insert_nds32_elf_blank_recalc_total
12048 (relax_blank_list
, insn_rel
->r_offset
, 2))
12050 insn_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (insn_rel
->r_info
),
12059 nds32_elf_relax_section (bfd
*abfd
, asection
*sec
,
12060 struct bfd_link_info
*link_info
, bfd_boolean
*again
)
12062 nds32_elf_blank_t
*relax_blank_list
= NULL
;
12063 Elf_Internal_Shdr
*symtab_hdr
;
12064 Elf_Internal_Rela
*internal_relocs
;
12065 Elf_Internal_Rela
*irel
;
12066 Elf_Internal_Rela
*irelend
;
12067 Elf_Internal_Sym
*isymbuf
= NULL
;
12068 bfd_byte
*contents
= NULL
;
12069 bfd_boolean result
= TRUE
;
12075 /* Target dependnet option. */
12076 struct elf_nds32_link_hash_table
*table
;
12077 int load_store_relax
;
12079 relax_blank_list
= NULL
;
12083 /* Nothing to do for
12084 * relocatable link or
12085 * non-relocatable section or
12086 * non-code section or
12088 * no reloc entry. */
12089 if (bfd_link_relocatable (link_info
)
12090 || (sec
->flags
& SEC_RELOC
) == 0
12091 || (sec
->flags
& SEC_EXCLUDE
) != 0
12092 || (sec
->flags
& SEC_CODE
) == 0
12094 || sec
->reloc_count
== 0)
12097 /* 09.12.11 Workaround. */
12098 /* We have to adjust align for R_NDS32_LABEL if needed.
12099 The adjust approach only can fix 2-byte align once. */
12100 if (sec
->alignment_power
> 2)
12103 /* Do TLS model conversion once at first. */
12104 nds32_elf_unify_tls_model (abfd
, sec
, contents
, link_info
);
12106 /* The optimization type to do. */
12108 table
= nds32_elf_hash_table (link_info
);
12110 /* Save the first section for abs symbol relaxation.
12111 This is used for checking gp relaxation in the
12112 nds32_elf_relax_loadstore and nds32_elf_relax_lo12. */
12113 nds32_elf_relax_guard (NULL
, 0, sec
, NULL
, again
, TRUE
,
12114 table
, NULL
, NULL
);
12116 /* The begining of general relaxation. */
12118 if (is_SDA_BASE_set
== 0)
12121 is_SDA_BASE_set
= 1;
12122 nds32_elf_final_sda_base (sec
->output_section
->owner
, link_info
,
12124 relax_range_measurement (abfd
);
12127 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
12128 /* Relocations MUST be kept in memory, because relaxation adjust them. */
12129 internal_relocs
= _bfd_elf_link_read_relocs (abfd
, sec
, NULL
, NULL
,
12130 TRUE
/* keep_memory */);
12131 if (internal_relocs
== NULL
)
12134 irelend
= internal_relocs
+ sec
->reloc_count
;
12135 irel
= find_relocs_at_address (internal_relocs
, internal_relocs
,
12136 irelend
, R_NDS32_RELAX_ENTRY
);
12138 if (irel
== irelend
)
12141 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_ENTRY
)
12143 if (irel
->r_addend
& R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG
)
12146 if (irel
->r_addend
& R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG
)
12149 if (irel
->r_addend
& R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG
)
12153 load_store_relax
= table
->load_store_relax
;
12155 /* Get symbol table and section content. */
12156 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
)
12157 || !nds32_get_local_syms (abfd
, sec
, &isymbuf
))
12160 /* Do relax loop only when finalize is not done.
12161 Take care of relaxable relocs except INSN16. */
12162 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
12164 int seq_len
; /* Original length of instruction sequence. */
12165 int insn_len
= 0; /* Final length of instruction sequence. */
12166 bfd_boolean removed
;
12169 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LABEL
12170 && (irel
->r_addend
& 0x1f) >= 2)
12173 /* Relocation Types
12174 R_NDS32_LONGCALL1 53
12175 R_NDS32_LONGCALL2 54
12176 R_NDS32_LONGCALL3 55
12177 R_NDS32_LONGJUMP1 56
12178 R_NDS32_LONGJUMP2 57
12179 R_NDS32_LONGJUMP3 58
12180 R_NDS32_LOADSTORE 59 */
12181 if (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_LONGCALL1
12182 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_LOADSTORE
)
12183 seq_len
= GET_SEQ_LEN (irel
->r_addend
);
12185 /* Relocation Types
12186 R_NDS32_LONGCALL4 107
12187 R_NDS32_LONGCALL5 108
12188 R_NDS32_LONGCALL6 109
12189 R_NDS32_LONGJUMP4 110
12190 R_NDS32_LONGJUMP5 111
12191 R_NDS32_LONGJUMP6 112
12192 R_NDS32_LONGJUMP7 113 */
12193 else if (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_LONGCALL4
12194 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_LONGJUMP7
)
12197 /* Relocation Types
12198 R_NDS32_LO12S0_RELA 30
12199 R_NDS32_LO12S1_RELA 29
12200 R_NDS32_LO12S2_RELA 28
12201 R_NDS32_LO12S2_SP_RELA 71
12202 R_NDS32_LO12S2_DP_RELA 70
12203 R_NDS32_GOT_LO12 46
12204 R_NDS32_GOTOFF_LO12 50
12205 R_NDS32_PLTREL_LO12 65
12206 R_NDS32_PLT_GOTREL_LO12 67
12207 R_NDS32_17IFC_PCREL_RELA 96
12208 R_NDS32_GOT_SUFF 193
12209 R_NDS32_GOTOFF_SUFF 194
12210 R_NDS32_PLT_GOT_SUFF 195
12211 R_NDS32_MULCALL_SUFF 196
12213 else if ((ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_LO12S0_RELA
12214 && ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_LO12S2_RELA
)
12215 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S2_SP_RELA
12216 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LO12S2_DP_RELA
12217 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOT_LO12
12218 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOTOFF_LO12
12219 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_GOTPC_LO12
12220 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_PLTREL_LO12
12221 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_PLT_GOTREL_LO12
12222 || (ELF32_R_TYPE (irel
->r_info
) >= R_NDS32_GOT_SUFF
12223 && ELF32_R_TYPE (irel
->r_info
) <= R_NDS32_PTR
)
12224 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
12225 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_TLS_LE_LO12
12226 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_TLS_LE_ADD
12227 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_TLS_LE_LS
12228 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_LSI
)
12233 insn_len
= seq_len
;
12236 switch (ELF32_R_TYPE (irel
->r_info
))
12238 case R_NDS32_LONGCALL1
:
12239 removed
= nds32_elf_relax_longcall1 (abfd
, sec
, irel
, internal_relocs
,
12240 &insn_len
, contents
, isymbuf
,
12243 case R_NDS32_LONGCALL2
:
12244 removed
= nds32_elf_relax_longcall2 (abfd
, sec
, irel
, internal_relocs
,
12245 &insn_len
, contents
, isymbuf
,
12248 case R_NDS32_LONGCALL3
:
12249 removed
= nds32_elf_relax_longcall3 (abfd
, sec
, irel
, internal_relocs
,
12250 &insn_len
, contents
, isymbuf
,
12253 case R_NDS32_LONGJUMP1
:
12254 removed
= nds32_elf_relax_longjump1 (abfd
, sec
, irel
, internal_relocs
,
12255 &insn_len
, contents
, isymbuf
,
12258 case R_NDS32_LONGJUMP2
:
12259 removed
= nds32_elf_relax_longjump2 (abfd
, sec
, irel
, internal_relocs
,
12260 &insn_len
, contents
, isymbuf
,
12263 case R_NDS32_LONGJUMP3
:
12264 removed
= nds32_elf_relax_longjump3 (abfd
, sec
, irel
, internal_relocs
,
12265 &insn_len
, contents
, isymbuf
,
12268 case R_NDS32_LONGCALL4
:
12269 removed
= nds32_elf_relax_longcall4 (abfd
, sec
, irel
, internal_relocs
,
12270 &insn_len
, contents
, isymbuf
,
12273 case R_NDS32_LONGCALL5
:
12274 removed
= nds32_elf_relax_longcall5 (abfd
, sec
, irel
, internal_relocs
,
12275 &insn_len
, contents
, isymbuf
,
12278 case R_NDS32_LONGCALL6
:
12279 removed
= nds32_elf_relax_longcall6 (abfd
, sec
, irel
, internal_relocs
,
12280 &insn_len
, contents
, isymbuf
,
12283 case R_NDS32_LONGJUMP4
:
12284 removed
= nds32_elf_relax_longjump4 (abfd
, sec
, irel
, internal_relocs
,
12285 &insn_len
, contents
, isymbuf
,
12288 case R_NDS32_LONGJUMP5
:
12289 removed
= nds32_elf_relax_longjump5 (abfd
, sec
, irel
, internal_relocs
,
12290 &insn_len
, &seq_len
, contents
,
12291 isymbuf
, symtab_hdr
);
12293 case R_NDS32_LONGJUMP6
:
12294 removed
= nds32_elf_relax_longjump6 (abfd
, sec
, irel
, internal_relocs
,
12295 &insn_len
, &seq_len
, contents
,
12296 isymbuf
, symtab_hdr
);
12298 case R_NDS32_LONGJUMP7
:
12299 removed
= nds32_elf_relax_longjump7 (abfd
, sec
, irel
, internal_relocs
,
12300 &insn_len
, &seq_len
, contents
,
12301 isymbuf
, symtab_hdr
);
12303 case R_NDS32_LOADSTORE
:
12304 removed
= nds32_elf_relax_loadstore (link_info
, abfd
, sec
, irel
,
12305 internal_relocs
, &insn_len
,
12306 contents
, isymbuf
, symtab_hdr
,
12307 load_store_relax
, table
);
12309 case R_NDS32_LO12S0_RELA
:
12310 case R_NDS32_LO12S1_RELA
:
12311 case R_NDS32_LO12S2_RELA
:
12312 case R_NDS32_LO12S2_DP_RELA
:
12313 case R_NDS32_LO12S2_SP_RELA
:
12314 /* Relax for low part. */
12315 nds32_elf_relax_lo12 (link_info
, abfd
, sec
, irel
, internal_relocs
,
12316 contents
, isymbuf
, symtab_hdr
, table
);
12318 /* It is impossible to delete blank, so just continue. */
12321 removed
= nds32_elf_relax_ptr (abfd
, sec
, irel
, internal_relocs
,
12322 &insn_len
, &seq_len
, contents
);
12325 nds32_elf_relax_flsi (link_info
, abfd
, sec
, irel
, internal_relocs
,
12326 contents
, isymbuf
, symtab_hdr
, again
);
12328 case R_NDS32_GOT_LO12
:
12329 case R_NDS32_GOTOFF_LO12
:
12330 case R_NDS32_PLTREL_LO12
:
12331 case R_NDS32_PLT_GOTREL_LO12
:
12332 case R_NDS32_GOTPC_LO12
:
12333 case R_NDS32_TLS_LE_LO12
:
12334 case R_NDS32_TLS_LE_ADD
:
12335 case R_NDS32_TLS_LE_LS
:
12336 case R_NDS32_PLT_GOT_SUFF
:
12337 case R_NDS32_GOT_SUFF
:
12338 case R_NDS32_GOTOFF_SUFF
:
12344 if (removed
&& seq_len
- insn_len
> 0)
12346 if (!insert_nds32_elf_blank
12347 (&relax_blank_list
, irel
->r_offset
+ insn_len
,
12348 seq_len
- insn_len
))
12354 calc_nds32_blank_total (relax_blank_list
);
12356 if (table
->relax_fp_as_gp
)
12358 if (!nds32_relax_fp_as_gp (link_info
, abfd
, sec
, internal_relocs
,
12364 if (!nds32_fag_remove_unused_fpbase (abfd
, sec
, internal_relocs
,
12372 if (!nds32_relax_adjust_label (abfd
, sec
, internal_relocs
, contents
,
12373 &relax_blank_list
, optimize
, opt_size
))
12377 /* It doesn't matter optimize_for_space_no_align anymore.
12378 If object file is assembled with flag '-Os',
12379 the we don't adjust jump-destination on 4-byte boundary. */
12381 if (relax_blank_list
)
12383 nds32_elf_relax_delete_blanks (abfd
, sec
, relax_blank_list
);
12384 relax_blank_list
= NULL
;
12389 /* Closing the section, so we don't relax it anymore. */
12390 bfd_vma sec_size_align
;
12391 Elf_Internal_Rela
*tmp_rel
;
12393 /* Pad to alignment boundary. Only handle current section alignment. */
12394 sec_size_align
= (sec
->size
+ (~((-1U) << sec
->alignment_power
)))
12395 & ((-1U) << sec
->alignment_power
);
12396 if ((sec_size_align
- sec
->size
) & 0x2)
12398 insn16
= NDS32_NOP16
;
12399 bfd_putb16 (insn16
, contents
+ sec
->size
);
12403 while (sec_size_align
!= sec
->size
)
12405 insn
= NDS32_NOP32
;
12406 bfd_putb32 (insn
, contents
+ sec
->size
);
12410 tmp_rel
= find_relocs_at_address (internal_relocs
, internal_relocs
,
12411 irelend
, R_NDS32_RELAX_ENTRY
);
12412 if (tmp_rel
!= irelend
)
12413 tmp_rel
->r_addend
|= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG
;
12415 clean_nds32_elf_blank ();
12419 if (elf_section_data (sec
)->relocs
!= internal_relocs
)
12420 free (internal_relocs
);
12422 if (elf_section_data (sec
)->this_hdr
.contents
!= contents
)
12425 if (symtab_hdr
->contents
!= (bfd_byte
*) isymbuf
)
12435 static struct bfd_elf_special_section
const nds32_elf_special_sections
[] =
12437 {".sdata", 6, -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
12438 {".sbss", 5, -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
},
12443 nds32_elf_section_flags (const Elf_Internal_Shdr
*hdr
)
12445 const char *name
= hdr
->bfd_section
->name
;
12447 if (strncmp (name
, ".sbss", 5) == 0
12448 || strncmp (name
, ".sdata", 6) == 0)
12449 hdr
->bfd_section
->flags
|= SEC_SMALL_DATA
;
12455 nds32_elf_output_arch_syms (bfd
*output_bfd ATTRIBUTE_UNUSED
,
12456 struct bfd_link_info
*info
,
12457 void *finfo ATTRIBUTE_UNUSED
,
12458 bfd_boolean (*func
) (void *, const char *,
12459 Elf_Internal_Sym
*,
12461 struct elf_link_hash_entry
*)
12464 FILE *sym_ld_script
= NULL
;
12465 struct elf_nds32_link_hash_table
*table
;
12467 table
= nds32_elf_hash_table (info
);
12468 sym_ld_script
= table
->sym_ld_script
;
12470 if (check_start_export_sym
)
12471 fprintf (sym_ld_script
, "}\n");
12476 static enum elf_reloc_type_class
12477 nds32_elf_reloc_type_class (const struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
12478 const asection
*rel_sec ATTRIBUTE_UNUSED
,
12479 const Elf_Internal_Rela
*rela
)
12481 switch ((int) ELF32_R_TYPE (rela
->r_info
))
12483 case R_NDS32_RELATIVE
:
12484 return reloc_class_relative
;
12485 case R_NDS32_JMP_SLOT
:
12486 return reloc_class_plt
;
12488 return reloc_class_copy
;
12490 return reloc_class_normal
;
12494 /* Put target dependent option into info hash table. */
12496 bfd_elf32_nds32_set_target_option (struct bfd_link_info
*link_info
,
12497 int relax_fp_as_gp
,
12498 int eliminate_gc_relocs
,
12499 FILE * sym_ld_script
,
12501 int tls_desc_trampoline
,
12502 int load_store_relax
)
12504 struct elf_nds32_link_hash_table
*table
;
12506 table
= nds32_elf_hash_table (link_info
);
12510 table
->relax_fp_as_gp
= relax_fp_as_gp
;
12511 table
->eliminate_gc_relocs
= eliminate_gc_relocs
;
12512 table
->sym_ld_script
= sym_ld_script
;
12513 table
->hyper_relax
= hyper_relax
;
12514 table
->tls_desc_trampoline
= tls_desc_trampoline
;
12515 table
->load_store_relax
= load_store_relax
;
12519 /* These functions and data-structures are used for fp-as-gp
12522 #define FAG_THRESHOLD 3 /* At least 3 gp-access. */
12523 /* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12524 the read-only section and read-write section. */
12525 #define FAG_WINDOW (508 - 32)
12527 /* An nds32_fag represent a gp-relative access.
12528 We find best fp-base by using a sliding window
12529 to find a base address which can cover most gp-access. */
12532 struct nds32_fag
*next
; /* NULL-teminated linked list. */
12533 bfd_vma addr
; /* The address of this fag. */
12534 Elf_Internal_Rela
**relas
; /* The relocations associated with this fag.
12535 It is used for applying FP7U2_FLAG. */
12536 int count
; /* How many times this address is referred.
12537 There should be exactly `count' relocations
12539 int relas_capcity
; /* The buffer size of relas.
12540 We use an array instead of linked-list,
12541 and realloc is used to adjust buffer size. */
12545 nds32_fag_init (struct nds32_fag
*head
)
12547 memset (head
, 0, sizeof (struct nds32_fag
));
12551 nds32_fag_verify (struct nds32_fag
*head
)
12553 struct nds32_fag
*iter
;
12554 struct nds32_fag
*prev
;
12560 if (prev
&& prev
->addr
>= iter
->addr
)
12561 puts ("Bug in fp-as-gp insertion.");
12567 /* Insert a fag in ascending order.
12568 If a fag of the same address already exists,
12569 they are chained by relas array. */
12572 nds32_fag_insert (struct nds32_fag
*head
, bfd_vma addr
,
12573 Elf_Internal_Rela
* rel
)
12575 struct nds32_fag
*iter
;
12576 struct nds32_fag
*new_fag
;
12577 const int INIT_RELAS_CAP
= 4;
12580 iter
->next
&& iter
->next
->addr
<= addr
;
12582 /* Find somewhere to insert. */ ;
12584 /* `iter' will be equal to `head' if the list is empty. */
12585 if (iter
!= head
&& iter
->addr
== addr
)
12587 /* The address exists in the list.
12588 Insert `rel' into relocation list, relas. */
12590 /* Check whether relas is big enough. */
12591 if (iter
->count
>= iter
->relas_capcity
)
12593 iter
->relas_capcity
*= 2;
12594 iter
->relas
= bfd_realloc
12595 (iter
->relas
, iter
->relas_capcity
* sizeof (void *));
12597 iter
->relas
[iter
->count
++] = rel
;
12601 /* This is a new address. Create a fag node for it. */
12602 new_fag
= bfd_malloc (sizeof (struct nds32_fag
));
12603 memset (new_fag
, 0, sizeof (*new_fag
));
12604 new_fag
->addr
= addr
;
12605 new_fag
->count
= 1;
12606 new_fag
->next
= iter
->next
;
12607 new_fag
->relas_capcity
= INIT_RELAS_CAP
;
12608 new_fag
->relas
= (Elf_Internal_Rela
**)
12609 bfd_malloc (new_fag
->relas_capcity
* sizeof (void *));
12610 new_fag
->relas
[0] = rel
;
12611 iter
->next
= new_fag
;
12613 nds32_fag_verify (head
);
12617 nds32_fag_free_list (struct nds32_fag
*head
)
12619 struct nds32_fag
*iter
;
12624 struct nds32_fag
*tmp
= iter
;
12632 /* Find the best fp-base address.
12633 The relocation associated with that address is returned,
12634 so we can track the symbol instead of a fixed address.
12636 When relaxation, the address of an datum may change,
12637 because a text section is shrinked, so the data section
12638 moves forward. If the aligments of text and data section
12639 are different, their distance may change too.
12640 Therefore, tracking a fixed address is not appriate. */
12643 nds32_fag_find_base (struct nds32_fag
*head
, struct nds32_fag
**bestpp
)
12645 struct nds32_fag
*base
; /* First fag in the window. */
12646 struct nds32_fag
*last
; /* First fag outside the window. */
12647 int accu
= 0; /* Usage accumulation. */
12648 struct nds32_fag
*best
; /* Best fag. */
12649 int baccu
= 0; /* Best accumulation. */
12651 /* Use first fag for initial, and find the last fag in the window.
12653 In each iteration, we could simply subtract previous fag
12654 and accumulate following fags which are inside the window,
12655 untill we each the end. */
12657 if (head
->next
== NULL
)
12663 /* Initialize base. */
12667 last
&& last
->addr
< base
->addr
+ FAG_WINDOW
;
12669 accu
+= last
->count
;
12673 /* Record the best base in each iteration. */
12676 accu
-= base
->count
;
12678 /* Account fags in window. */
12679 for (/* Nothing. */;
12680 last
&& last
->addr
< base
->addr
+ FAG_WINDOW
;
12682 accu
+= last
->count
;
12684 /* A better fp-base? */
12697 /* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12698 so we can convert it fo fp-relative access later.
12699 `best_fag' is the best fp-base. Only those inside the window
12700 of best_fag is applied the flag. */
12703 nds32_fag_mark_relax (struct bfd_link_info
*link_info
,
12704 asection
*sec
, struct nds32_fag
*best_fag
,
12705 Elf_Internal_Rela
*internal_relocs
,
12706 Elf_Internal_Rela
*irelend
)
12708 struct nds32_fag
*ifag
;
12709 bfd_vma best_fpbase
, gp
;
12712 output_bfd
= sec
->output_section
->owner
;
12713 nds32_elf_final_sda_base (output_bfd
, link_info
, &gp
, FALSE
);
12714 best_fpbase
= best_fag
->addr
;
12716 if (best_fpbase
> gp
+ sdata_range
[1][1]
12717 || best_fpbase
< gp
- sdata_range
[1][0])
12720 /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12721 so we know they can be converted to lwi37.fp. */
12722 for (ifag
= best_fag
;
12723 ifag
&& ifag
->addr
< best_fpbase
+ FAG_WINDOW
; ifag
= ifag
->next
)
12727 for (i
= 0; i
< ifag
->count
; i
++)
12729 Elf_Internal_Rela
*insn16_rel
;
12730 Elf_Internal_Rela
*fag_rel
;
12732 fag_rel
= ifag
->relas
[i
];
12734 /* Only if this is within the WINDOWS, FP7U2_FLAG
12737 insn16_rel
= find_relocs_at_address
12738 (fag_rel
, internal_relocs
, irelend
, R_NDS32_INSN16
);
12740 if (insn16_rel
!= irelend
)
12741 insn16_rel
->r_addend
= R_NDS32_INSN16_FP7U2_FLAG
;
12747 /* Reset INSN16 to clean fp as gp. */
12750 nds32_fag_unmark_relax (struct nds32_fag
*fag
,
12751 Elf_Internal_Rela
*internal_relocs
,
12752 Elf_Internal_Rela
*irelend
)
12754 struct nds32_fag
*ifag
;
12756 Elf_Internal_Rela
*insn16_rel
;
12757 Elf_Internal_Rela
*fag_rel
;
12759 for (ifag
= fag
; ifag
; ifag
= ifag
->next
)
12761 for (i
= 0; i
< ifag
->count
; i
++)
12763 fag_rel
= ifag
->relas
[i
];
12765 /* Restore the INSN16 relocation. */
12766 insn16_rel
= find_relocs_at_address
12767 (fag_rel
, internal_relocs
, irelend
, R_NDS32_INSN16
);
12769 if (insn16_rel
!= irelend
)
12770 insn16_rel
->r_addend
&= ~R_NDS32_INSN16_FP7U2_FLAG
;
12775 /* This is the main function of fp-as-gp optimization.
12776 It should be called by relax_section. */
12779 nds32_relax_fp_as_gp (struct bfd_link_info
*link_info
,
12780 bfd
*abfd
, asection
*sec
,
12781 Elf_Internal_Rela
*internal_relocs
,
12782 Elf_Internal_Rela
*irelend
,
12783 Elf_Internal_Sym
*isymbuf
)
12785 Elf_Internal_Rela
*begin_rel
= NULL
;
12786 Elf_Internal_Rela
*irel
;
12787 struct nds32_fag fag_head
;
12788 Elf_Internal_Shdr
*symtab_hdr
;
12789 bfd_byte
*contents
;
12790 bfd_boolean ifc_inside
= FALSE
;
12792 /* FIXME: Can we bfd_elf_link_read_relocs for the relocs? */
12794 /* Per-function fp-base selection.
12795 1. Create a list for all the gp-relative access.
12796 2. Base on those gp-relative address,
12797 find a fp-base which can cover most access.
12798 3. Use the fp-base for fp-as-gp relaxation.
12800 NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12802 1. delete the `la $fp, _FP_BASE_' instruction and
12803 2. not convert lwi.gp to lwi37.fp.
12805 To delete the _FP_BASE_ instruction, we simply apply
12806 R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12808 To suppress the conversion, we simply NOT to apply
12809 R_NDS32_INSN16_FP7U2_FLAG flag. */
12811 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
12813 if (!nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
)
12814 || !nds32_get_local_syms (abfd
, sec
, &isymbuf
))
12817 /* Check whether it is worth for fp-as-gp optimization,
12818 i.e., at least 3 gp-load.
12820 Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12821 apply this optimization. */
12823 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
12825 /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12826 One we enter the begin of the region, we track all the LW/ST
12827 instructions, so when we leave the region, we try to find
12828 the best fp-base address for those LW/ST instructions. */
12830 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
12831 && (irel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
12833 /* Begin of the region. */
12835 /* xgettext:c-format */
12836 _bfd_error_handler (_("%pB: nested OMIT_FP in %pA"), abfd
, sec
);
12839 nds32_fag_init (&fag_head
);
12840 ifc_inside
= FALSE
;
12842 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_END
12843 && (irel
->r_addend
& R_NDS32_RELAX_REGION_OMIT_FP_FLAG
))
12846 struct nds32_fag
*best_fag
, *tmp_fag
;
12849 /* End of the region.
12850 Check whether it is worth to do fp-as-gp. */
12852 if (begin_rel
== NULL
)
12854 /* xgettext:c-format */
12855 _bfd_error_handler (_("%pB: unmatched OMIT_FP in %pA"),
12860 accu
= nds32_fag_find_base (&fag_head
, &best_fag
);
12862 /* Clean FP7U2_FLAG because they may set ever. */
12863 tmp_fag
= fag_head
.next
;
12864 nds32_fag_unmark_relax (tmp_fag
, internal_relocs
, irelend
);
12866 /* Check if it is worth, and FP_BASE is near enough to SDA_BASE. */
12867 if (accu
< FAG_THRESHOLD
12868 || !nds32_fag_mark_relax (link_info
, sec
, best_fag
,
12869 internal_relocs
, irelend
))
12871 /* Not worth to do fp-as-gp. */
12872 begin_rel
->r_addend
|= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
;
12873 begin_rel
->r_addend
&= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG
;
12874 irel
->r_addend
|= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
;
12875 irel
->r_addend
&= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG
;
12876 nds32_fag_free_list (&fag_head
);
12881 /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
12882 so we use it to record the distance to the reloction of best
12884 dist
= best_fag
->relas
[0] - begin_rel
;
12885 BFD_ASSERT (dist
> 0 && dist
< 0xffffff);
12886 /* Use high 16 bits of addend to record the _FP_BASE_ matched
12887 relocation. And get the base value when relocating. */
12888 begin_rel
->r_addend
&= (0x1 << 16) - 1;
12889 begin_rel
->r_addend
|= dist
<< 16;
12891 nds32_fag_free_list (&fag_head
);
12895 if (begin_rel
== NULL
|| ifc_inside
)
12896 /* Skip if we are not in the region of fp-as-gp. */
12899 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA15S2_RELA
12900 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA17S2_RELA
)
12905 /* A gp-relative access is found. Insert it to the fag-list. */
12907 /* Rt is necessary an RT3, so it can be converted to lwi37.fp. */
12908 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
12909 if (!N32_IS_RT3 (insn
))
12912 addr
= calculate_memory_address (abfd
, irel
, isymbuf
, symtab_hdr
);
12913 nds32_fag_insert (&fag_head
, addr
, irel
);
12915 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA_FP7U2_RELA
)
12919 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_17IFC_PCREL_RELA
12920 || ELF32_R_TYPE (irel
->r_info
) == R_NDS32_10IFCU_PCREL_RELA
)
12922 /* Suppress fp as gp when encounter ifc. */
12930 /* Remove unused `la $fp, _FD_BASE_' instruction. */
12933 nds32_fag_remove_unused_fpbase (bfd
*abfd
, asection
*sec
,
12934 Elf_Internal_Rela
*internal_relocs
,
12935 Elf_Internal_Rela
*irelend
)
12937 Elf_Internal_Rela
*irel
;
12938 Elf_Internal_Shdr
*symtab_hdr
;
12939 bfd_byte
*contents
= NULL
;
12940 nds32_elf_blank_t
*relax_blank_list
= NULL
;
12941 bfd_boolean result
= TRUE
;
12942 bfd_boolean unused_region
= FALSE
;
12945 NOTE: Disable fp-as-gp if we encounter ifcall relocations:
12946 R_NDS32_17IFC_PCREL_RELA
12947 R_NDS32_10IFCU_PCREL_RELA. */
12949 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
12950 nds32_get_section_contents (abfd
, sec
, &contents
, TRUE
);
12952 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
12954 /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
12955 we marked to in previous pass.
12956 DO NOT scan relocations again, since we've alreadly decided it
12957 and set the flag. */
12958 const char *syname
;
12962 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_BEGIN
12963 && (irel
->r_addend
& R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
))
12964 unused_region
= TRUE
;
12965 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_RELAX_REGION_END
12966 && (irel
->r_addend
& R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG
))
12967 unused_region
= FALSE
;
12969 /* We're not in the region. */
12970 if (!unused_region
)
12973 /* _FP_BASE_ must be a GLOBAL symbol. */
12974 syndx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
12975 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
12978 /* The symbol name must be _FP_BASE_. */
12979 syname
= elf_sym_hashes (abfd
)[syndx
]->root
.root
.string
;
12980 if (strcmp (syname
, FP_BASE_NAME
) != 0)
12983 if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA19S0_RELA
)
12985 /* addi.gp $fp, -256 */
12986 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
12987 if (insn
!= INSN_ADDIGP_TO_FP
)
12990 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_SDA15S0_RELA
)
12992 /* addi $fp, $gp, -256 */
12993 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
12994 if (insn
!= INSN_ADDI_GP_TO_FP
)
12997 else if (ELF32_R_TYPE (irel
->r_info
) == R_NDS32_20_RELA
)
12999 /* movi $fp, FP_BASE */
13000 insn
= bfd_getb32 (contents
+ irel
->r_offset
);
13001 if (insn
!= INSN_MOVI_TO_FP
)
13007 /* We got here because a FP_BASE instruction is found. */
13008 if (!insert_nds32_elf_blank_recalc_total
13009 (&relax_blank_list
, irel
->r_offset
, 4))
13014 if (relax_blank_list
)
13016 nds32_elf_relax_delete_blanks (abfd
, sec
, relax_blank_list
);
13017 relax_blank_list
= NULL
;
13026 /* This is a version of bfd_generic_get_relocated_section_contents.
13027 We need this variety because relaxation will modify the dwarf
13028 infomation. When there is undefined symbol reference error mesage,
13029 linker need to dump line number where the symbol be used. However
13030 the address is be relaxed, it can not get the original dwarf contents.
13031 The variety only modify function call for reading in the section. */
13034 nds32_elf_get_relocated_section_contents (bfd
*abfd
,
13035 struct bfd_link_info
*link_info
,
13036 struct bfd_link_order
*link_order
,
13038 bfd_boolean relocatable
,
13041 bfd
*input_bfd
= link_order
->u
.indirect
.section
->owner
;
13042 asection
*input_section
= link_order
->u
.indirect
.section
;
13044 arelent
**reloc_vector
;
13047 reloc_size
= bfd_get_reloc_upper_bound (input_bfd
, input_section
);
13048 if (reloc_size
< 0)
13051 /* Read in the section. */
13052 if (!nds32_get_section_contents (input_bfd
, input_section
, &data
, FALSE
))
13055 if (reloc_size
== 0)
13058 reloc_vector
= (arelent
**) bfd_malloc (reloc_size
);
13059 if (reloc_vector
== NULL
)
13062 reloc_count
= bfd_canonicalize_reloc (input_bfd
, input_section
,
13063 reloc_vector
, symbols
);
13064 if (reloc_count
< 0)
13067 if (reloc_count
> 0)
13070 for (parent
= reloc_vector
; *parent
!= NULL
; parent
++)
13072 char *error_message
= NULL
;
13074 bfd_reloc_status_type r
;
13076 symbol
= *(*parent
)->sym_ptr_ptr
;
13077 if (symbol
->section
&& discarded_section (symbol
->section
))
13080 static reloc_howto_type none_howto
13081 = HOWTO (0, 0, 0, 0, FALSE
, 0, complain_overflow_dont
, NULL
,
13082 "unused", FALSE
, 0, 0, FALSE
);
13084 off
= (*parent
)->address
* OCTETS_PER_BYTE (input_bfd
,
13086 _bfd_clear_contents ((*parent
)->howto
, input_bfd
,
13087 input_section
, data
, off
);
13088 (*parent
)->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
13089 (*parent
)->addend
= 0;
13090 (*parent
)->howto
= &none_howto
;
13094 r
= bfd_perform_relocation (input_bfd
, *parent
, data
,
13096 relocatable
? abfd
: NULL
,
13101 asection
*os
= input_section
->output_section
;
13103 /* A partial link, so keep the relocs. */
13104 os
->orelocation
[os
->reloc_count
] = *parent
;
13108 if (r
!= bfd_reloc_ok
)
13112 case bfd_reloc_undefined
:
13113 (*link_info
->callbacks
->undefined_symbol
)
13114 (link_info
, bfd_asymbol_name (*(*parent
)->sym_ptr_ptr
),
13115 input_bfd
, input_section
, (*parent
)->address
, TRUE
);
13117 case bfd_reloc_dangerous
:
13118 BFD_ASSERT (error_message
!= NULL
);
13119 (*link_info
->callbacks
->reloc_dangerous
)
13120 (link_info
, error_message
,
13121 input_bfd
, input_section
, (*parent
)->address
);
13123 case bfd_reloc_overflow
:
13124 (*link_info
->callbacks
->reloc_overflow
)
13126 bfd_asymbol_name (*(*parent
)->sym_ptr_ptr
),
13127 (*parent
)->howto
->name
, (*parent
)->addend
,
13128 input_bfd
, input_section
, (*parent
)->address
);
13130 case bfd_reloc_outofrange
:
13132 This error can result when processing some partially
13133 complete binaries. Do not abort, but issue an error
13134 message instead. */
13135 link_info
->callbacks
->einfo
13136 /* xgettext:c-format */
13137 (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
13138 abfd
, input_section
, * parent
);
13149 free (reloc_vector
);
13153 free (reloc_vector
);
13157 /* Check target symbol. */
13160 nds32_elf_is_target_special_symbol (bfd
*abfd ATTRIBUTE_UNUSED
, asymbol
*sym
)
13162 if (!sym
|| !sym
->name
|| sym
->name
[0] != '$')
13167 /* nds32 find maybe function sym. Ignore target special symbol
13168 first, and then go the general function. */
13170 static bfd_size_type
13171 nds32_elf_maybe_function_sym (const asymbol
*sym
, asection
*sec
,
13174 if (nds32_elf_is_target_special_symbol (NULL
, (asymbol
*) sym
))
13177 return _bfd_elf_maybe_function_sym (sym
, sec
, code_off
);
13181 /* Do TLS model conversion. */
13183 typedef struct relax_group_list_t
13185 Elf_Internal_Rela
*relo
;
13186 struct relax_group_list_t
*next
;
13187 struct relax_group_list_t
*next_sibling
;
13189 } relax_group_list_t
;
13192 list_insert (relax_group_list_t
*pHead
, Elf_Internal_Rela
*pElem
);
13195 list_insert_sibling (relax_group_list_t
*pNode
, Elf_Internal_Rela
*pElem
);
13198 dump_chain (relax_group_list_t
*pHead
);
13201 list_insert (relax_group_list_t
*pHead
, Elf_Internal_Rela
*pElem
)
13203 relax_group_list_t
*pNext
= pHead
;
13206 while (pNext
->next
)
13208 if (pNext
->next
->id
> (int) pElem
->r_addend
)
13211 pNext
= pNext
->next
;
13215 relax_group_list_t
*pNew
= bfd_malloc (sizeof (relax_group_list_t
));
13219 relax_group_list_t
*tmp
= pNext
->next
;
13220 pNext
->next
= pNew
;
13222 pNew
->id
= pElem
->r_addend
;
13223 pNew
->relo
= pElem
;
13225 pNew
->next_sibling
= NULL
;
13231 list_insert_sibling (relax_group_list_t
*pNode
, Elf_Internal_Rela
*pElem
)
13233 relax_group_list_t
*pNext
= pNode
;
13236 while (pNext
->next_sibling
)
13238 pNext
= pNext
->next_sibling
;
13242 relax_group_list_t
*pNew
= bfd_malloc (sizeof (relax_group_list_t
));
13246 relax_group_list_t
*tmp
= pNext
->next_sibling
;
13247 pNext
->next_sibling
= pNew
;
13250 pNew
->relo
= pElem
;
13252 pNew
->next_sibling
= tmp
;
13258 dump_chain (relax_group_list_t
*pHead
)
13260 relax_group_list_t
*pNext
= pHead
->next
;
13263 printf("group %d @ 0x%08x", pNext
->id
, (unsigned)pNext
->relo
->r_offset
);
13264 relax_group_list_t
*pNextSib
= pNext
->next_sibling
;
13267 printf(", %d", (unsigned) ELF32_R_TYPE (pNextSib
->relo
->r_info
));
13268 pNextSib
= pNextSib
->next_sibling
;
13270 pNext
= pNext
->next
;
13275 /* Check R_NDS32_RELAX_GROUP of each section.
13276 There might be multiple sections in one object file. */
13279 elf32_nds32_check_relax_group (bfd
*abfd
, asection
*asec
)
13281 elf32_nds32_relax_group_t
*relax_group_ptr
=
13282 elf32_nds32_relax_group_ptr (abfd
);
13284 int min_id
= relax_group_ptr
->min_id
;
13285 int max_id
= relax_group_ptr
->max_id
;
13287 Elf_Internal_Rela
*rel
;
13288 Elf_Internal_Rela
*relend
;
13289 Elf_Internal_Rela
*relocs
;
13290 enum elf_nds32_reloc_type rtype
;
13294 /* Relocations MUST be kept in memory, because relaxation adjust them. */
13295 relocs
= _bfd_elf_link_read_relocs (abfd
, asec
, NULL
, NULL
,
13296 TRUE
/* keep_memory */);
13297 if (relocs
== NULL
)
13300 /* Check R_NDS32_RELAX_GROUP. */
13301 relend
= relocs
+ asec
->reloc_count
;
13302 for (rel
= relocs
; rel
< relend
; rel
++)
13305 rtype
= ELF32_R_TYPE (rel
->r_info
);
13306 if (rtype
!= R_NDS32_RELAX_GROUP
)
13309 id
= rel
->r_addend
;
13312 else if (id
> max_id
)
13318 if (elf_section_data (asec
)->relocs
!= relocs
)
13321 if ((min_id
!= relax_group_ptr
->min_id
)
13322 || (max_id
!= relax_group_ptr
->max_id
))
13324 relax_group_ptr
->count
= max_id
- min_id
+ 1;
13325 BFD_ASSERT(min_id
<= relax_group_ptr
->min_id
);
13326 relax_group_ptr
->min_id
= min_id
;
13327 BFD_ASSERT(max_id
>= relax_group_ptr
->max_id
);
13328 relax_group_ptr
->max_id
= max_id
;
13331 return relax_group_ptr
->count
;
13334 /* Reorder RELAX_GROUP ID when command line option '-r' is applied. */
13335 struct section_id_list_t
*relax_group_section_id_list
= NULL
;
13337 struct section_id_list_t
*
13338 elf32_nds32_lookup_section_id (int id
, struct section_id_list_t
**lst_ptr
)
13340 struct section_id_list_t
*result
= NULL
;
13341 struct section_id_list_t
*lst
= *lst_ptr
;
13345 result
= (struct section_id_list_t
*) calloc
13346 (1, sizeof (struct section_id_list_t
));
13347 BFD_ASSERT (result
); /* Feed me. */
13353 struct section_id_list_t
*cur
= lst
;
13354 struct section_id_list_t
*prv
= NULL
;
13355 struct section_id_list_t
*sec
= NULL
;
13368 cur
= NULL
; /* To insert after prv. */
13369 sec
= cur
; /* In case prv == NULL. */
13377 /* Insert after prv. */
13378 result
= (struct section_id_list_t
*) calloc
13379 (1, sizeof (struct section_id_list_t
));
13380 BFD_ASSERT (result
); /* Feed me. */
13384 result
->next
= prv
->next
;
13385 prv
->next
= result
;
13390 result
->next
= sec
;
13399 elf32_nds32_unify_relax_group (bfd
*abfd
, asection
*asec
)
13401 static int next_relax_group_bias
= 0;
13403 elf32_nds32_relax_group_t
*relax_group_ptr
=
13404 elf32_nds32_relax_group_ptr (abfd
);
13406 bfd_boolean result
= TRUE
;
13407 Elf_Internal_Rela
*rel
;
13408 Elf_Internal_Rela
*relend
;
13409 Elf_Internal_Rela
*relocs
= NULL
;
13410 enum elf_nds32_reloc_type rtype
;
13411 struct section_id_list_t
*node
= NULL
;
13416 if (0 == relax_group_ptr
->count
)
13419 /* Check if this section has been handled. */
13420 node
= elf32_nds32_lookup_section_id (asec
->id
, &relax_group_section_id_list
);
13422 break; /* Hit, the section id has handled. */
13424 /* Relocations MUST be kept in memory, because relaxation adjust them. */
13425 relocs
= _bfd_elf_link_read_relocs (abfd
, asec
, NULL
, NULL
,
13426 TRUE
/* keep_memory */);
13427 if (relocs
== NULL
)
13429 BFD_ASSERT (0); /* feed me */
13433 /* Allocate group id bias for this bfd! */
13434 if (0 == relax_group_ptr
->init
)
13436 relax_group_ptr
->bias
= next_relax_group_bias
;
13437 next_relax_group_bias
+= relax_group_ptr
->count
;
13438 relax_group_ptr
->init
= 1;
13441 /* Reorder relax group groups. */
13442 relend
= relocs
+ asec
->reloc_count
;
13443 for (rel
= relocs
; rel
< relend
; rel
++)
13445 rtype
= ELF32_R_TYPE(rel
->r_info
);
13446 if (rtype
!= R_NDS32_RELAX_GROUP
)
13450 rel
->r_addend
+= relax_group_ptr
->bias
;
13451 /* Debugging count. */
13457 if (elf_section_data (asec
)->relocs
!= relocs
)
13464 nds32_elf_unify_tls_model (bfd
*inbfd
, asection
*insec
, bfd_byte
*incontents
,
13465 struct bfd_link_info
*lnkinfo
)
13467 bfd_boolean result
= TRUE
;
13468 Elf_Internal_Rela
*irel
;
13469 Elf_Internal_Rela
*irelend
;
13470 Elf_Internal_Rela
*internal_relocs
;
13471 unsigned long r_symndx
;
13472 enum elf_nds32_reloc_type r_type
;
13474 Elf_Internal_Sym
*local_syms
= NULL
;
13475 bfd_byte
*contents
= NULL
;
13477 relax_group_list_t chain
= { .id
= -1, .next
= NULL
, .next_sibling
= NULL
};
13479 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (inbfd
)->symtab_hdr
;
13480 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
13481 sym_hashes
= elf_sym_hashes (inbfd
);
13483 sym_hashes
+ symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
);
13484 if (!elf_bad_symtab (inbfd
))
13485 sym_hashes_end
-= symtab_hdr
->sh_info
;
13487 /* Reorder RELAX_GROUP when command line option '-r' is applied. */
13488 if (bfd_link_relocatable (lnkinfo
))
13490 elf32_nds32_unify_relax_group (inbfd
, insec
);
13494 /* Relocations MUST be kept in memory, because relaxation adjust them. */
13495 internal_relocs
= _bfd_elf_link_read_relocs (inbfd
, insec
, NULL
, NULL
,
13496 TRUE
/* keep_memory */);
13497 if (internal_relocs
== NULL
)
13500 irelend
= internal_relocs
+ insec
->reloc_count
;
13501 irel
= find_relocs_at_address (internal_relocs
, internal_relocs
,
13502 irelend
, R_NDS32_RELAX_ENTRY
);
13503 if (irel
== irelend
)
13506 /* Chain/remove groups. */
13507 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
13509 r_symndx
= ELF32_R_SYM (irel
->r_info
);
13510 r_type
= ELF32_R_TYPE (irel
->r_info
);
13511 if (r_type
!= R_NDS32_RELAX_GROUP
)
13515 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_NONE
);
13516 /* Chain it now. */
13517 if (!list_insert (&chain
, irel
))
13521 /* Collect group relocations. */
13522 /* Presume relocations are sorted. */
13523 relax_group_list_t
*pNext
= chain
.next
;
13526 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
13528 if (irel
->r_offset
== pNext
->relo
->r_offset
)
13530 /* Ignore Non-TLS relocation types. */
13531 r_type
= ELF32_R_TYPE (irel
->r_info
);
13532 if ((R_NDS32_TLS_LE_HI20
> r_type
)
13533 || (R_NDS32_RELAX_ENTRY
== r_type
))
13536 if (!list_insert_sibling (pNext
, irel
))
13539 else if (irel
->r_offset
> pNext
->relo
->r_offset
)
13541 pNext
= pNext
->next
;
13545 bfd_vma current_offset
= pNext
->relo
->r_offset
;
13546 if (irel
->r_offset
> current_offset
)
13547 irel
= internal_relocs
; /* restart from head */
13549 --irel
; /* Check current irel again. */
13554 /* This shouldn't be reached. */
13558 pNext
= pNext
->next
;
13561 #ifdef DUBUG_VERBOSE
13562 dump_chain(&chain
);
13565 /* Get symbol table and section content. */
13567 contents
= incontents
;
13568 else if (!nds32_get_section_contents (inbfd
, insec
, &contents
, TRUE
)
13569 || !nds32_get_local_syms (inbfd
, insec
, &local_syms
))
13572 char *local_got_tls_type
= elf32_nds32_local_got_tls_type (inbfd
);
13574 /* Convert TLS model each group if necessary. */
13575 pNext
= chain
.next
;
13577 int cur_grp_id
= -1;
13580 enum elf_nds32_tls_type tls_type
, org_tls_type
, eff_tls_type
;
13582 tls_type
= org_tls_type
= eff_tls_type
= 0;
13586 relax_group_list_t
*pNextSig
= pNext
->next_sibling
;
13589 struct elf_link_hash_entry
*h
= NULL
;
13591 irel
= pNextSig
->relo
;
13592 r_symndx
= ELF32_R_SYM(irel
->r_info
);
13593 r_type
= ELF32_R_TYPE(irel
->r_info
);
13595 if (pNext
->id
!= cur_grp_id
)
13597 cur_grp_id
= pNext
->id
;
13598 org_tls_type
= get_tls_type (r_type
, NULL
);
13599 if (r_symndx
>= symtab_hdr
->sh_info
)
13601 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
13602 while (h
->root
.type
== bfd_link_hash_indirect
13603 || h
->root
.type
== bfd_link_hash_warning
)
13604 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
13605 tls_type
= ((struct elf_nds32_link_hash_entry
*) h
)->tls_type
;
13609 tls_type
= local_got_tls_type
13610 ? local_got_tls_type
[r_symndx
]
13614 eff_tls_type
= 1 << (fls (tls_type
) - 1);
13615 sethi_rt
= N32_RT5(bfd_getb32 (contents
+ irel
->r_offset
));
13618 if (eff_tls_type
!= org_tls_type
)
13620 switch (org_tls_type
)
13622 /* DESC to IEGP/IE/LE. */
13624 switch (eff_tls_type
)
13629 case R_NDS32_TLS_DESC_HI20
:
13630 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13631 R_NDS32_TLS_IE_HI20
);
13633 case R_NDS32_TLS_DESC_LO12
:
13634 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13635 R_NDS32_TLS_IE_LO12
);
13637 case R_NDS32_TLS_DESC_ADD
:
13639 uint32_t insn
= bfd_getb32 (contents
+ irel
->r_offset
);
13640 add_rt
= N32_RT5 (insn
);
13641 insn
= N32_TYPE2 (LWI
, add_rt
, sethi_rt
, 0);
13642 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
13644 irel
->r_info
= ELF32_R_INFO(r_symndx
, R_NDS32_NONE
);
13647 case R_NDS32_TLS_DESC_FUNC
:
13648 bfd_putb32 (INSN_NOP
, contents
+ irel
->r_offset
);
13649 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13650 R_NDS32_RELAX_REMOVE
);
13652 case R_NDS32_TLS_DESC_CALL
:
13654 uint32_t insn
= N32_ALU1(ADD
, REG_R0
, add_rt
,
13656 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
13658 irel
->r_info
= ELF32_R_INFO(r_symndx
, R_NDS32_NONE
);
13661 case R_NDS32_LOADSTORE
:
13663 case R_NDS32_PTR_RESOLVED
:
13665 case R_NDS32_LABEL
:
13675 case R_NDS32_TLS_DESC_HI20
:
13676 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13677 R_NDS32_TLS_IEGP_HI20
);
13679 case R_NDS32_TLS_DESC_LO12
:
13680 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13681 R_NDS32_TLS_IEGP_LO12
);
13683 case R_NDS32_TLS_DESC_ADD
:
13685 uint32_t insn
= bfd_getb32 (contents
+ irel
->r_offset
);
13686 add_rt
= N32_RT5 (insn
);
13687 insn
= N32_MEM(LW
, add_rt
, sethi_rt
, REG_GP
, 0);
13688 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
13690 irel
->r_info
= ELF32_R_INFO(r_symndx
, R_NDS32_NONE
);
13693 case R_NDS32_TLS_DESC_FUNC
:
13694 bfd_putb32 (INSN_NOP
, contents
+ irel
->r_offset
);
13695 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13696 R_NDS32_RELAX_REMOVE
);
13698 case R_NDS32_TLS_DESC_CALL
:
13700 uint32_t insn
= N32_ALU1(ADD
, REG_R0
, add_rt
,
13702 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
13704 irel
->r_info
= ELF32_R_INFO(r_symndx
, R_NDS32_NONE
);
13707 case R_NDS32_LOADSTORE
:
13709 case R_NDS32_PTR_RESOLVED
:
13711 case R_NDS32_LABEL
:
13721 case R_NDS32_TLS_DESC_HI20
:
13722 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_TLS_LE_HI20
);
13724 case R_NDS32_TLS_DESC_LO12
:
13725 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_TLS_LE_LO12
);
13727 case R_NDS32_TLS_DESC_ADD
:
13729 uint32_t insn
= bfd_getb32 (contents
+ irel
->r_offset
);
13731 add_rt
= N32_RT5 (insn
);
13732 insn
= N32_ALU1 (ADD
, REG_R0
, sethi_rt
, REG_TP
);
13733 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
13735 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_TLS_LE_ADD
);
13738 case R_NDS32_TLS_DESC_FUNC
:
13739 bfd_putb32 (INSN_NOP
, contents
+ irel
->r_offset
);
13740 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_RELAX_REMOVE
);
13742 case R_NDS32_TLS_DESC_CALL
:
13743 bfd_putb32 (INSN_NOP
, contents
+ irel
->r_offset
);
13744 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_RELAX_REMOVE
);
13746 case R_NDS32_LOADSTORE
:
13748 case R_NDS32_PTR_RESOLVED
:
13750 case R_NDS32_LABEL
:
13761 /* IEGP to IE/LE. */
13763 switch (eff_tls_type
)
13768 case R_NDS32_TLS_IEGP_HI20
:
13769 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13770 R_NDS32_TLS_IE_HI20
);
13772 case R_NDS32_TLS_IEGP_LO12
:
13773 irel
->r_info
= ELF32_R_INFO(r_symndx
,
13774 R_NDS32_TLS_IE_LO12
);
13776 case R_NDS32_PTR_RESOLVED
:
13778 uint32_t insn
= bfd_getb32 (contents
+ irel
->r_offset
);
13780 add_rt
= N32_RT5 (insn
);
13781 insn
= N32_TYPE2 (LWI
, add_rt
, sethi_rt
, 0);
13782 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
13785 case R_NDS32_TLS_IEGP_LW
:
13787 case R_NDS32_LOADSTORE
:
13790 case R_NDS32_LABEL
:
13800 case R_NDS32_TLS_IEGP_HI20
:
13801 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_TLS_LE_HI20
);
13803 case R_NDS32_TLS_IEGP_LO12
:
13804 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_TLS_LE_LO12
);
13806 case R_NDS32_TLS_IEGP_LW
:
13807 bfd_putb32 (INSN_NOP
, contents
+ irel
->r_offset
);
13808 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_RELAX_REMOVE
);
13810 case R_NDS32_LOADSTORE
:
13813 case R_NDS32_LABEL
:
13814 case R_NDS32_PTR_RESOLVED
:
13827 switch (eff_tls_type
)
13832 case R_NDS32_TLS_IE_HI20
:
13833 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_TLS_LE_HI20
);
13835 case R_NDS32_TLS_IE_LO12S2
:
13837 uint32_t insn
= bfd_getb32 (contents
+ irel
->r_offset
);
13839 add_rt
= N32_RT5 (insn
);
13840 insn
= N32_TYPE2 (ORI
, add_rt
, sethi_rt
, 0);
13841 bfd_putb32 (insn
, contents
+ irel
->r_offset
);
13843 irel
->r_info
= ELF32_R_INFO (r_symndx
, R_NDS32_TLS_LE_LO12
);
13846 case R_NDS32_LOADSTORE
:
13849 case R_NDS32_LABEL
:
13864 pNextSig
= pNextSig
->next_sibling
;
13868 pNext
= pNext
->next
;
13872 if (pNext
->id
!= cur_grp_id
)
13874 pNext
= pNext
->next
;
13883 if (elf_section_data (insec
)->relocs
!= internal_relocs
)
13884 free (internal_relocs
);
13886 if (elf_section_data (insec
)->this_hdr
.contents
!= contents
)
13889 if (symtab_hdr
->contents
!= (bfd_byte
*) local_syms
)
13894 pNext
= chain
.next
;
13895 relax_group_list_t
*pDel
;
13899 pNext
= pNext
->next
;
13911 /* End TLS model conversion. */
13913 #define ELF_ARCH bfd_arch_nds32
13914 #define ELF_MACHINE_CODE EM_NDS32
13915 #define ELF_MAXPAGESIZE 0x1000
13916 #define ELF_TARGET_ID NDS32_ELF_DATA
13918 #define TARGET_BIG_SYM nds32_elf32_be_vec
13919 #define TARGET_BIG_NAME "elf32-nds32be"
13920 #define TARGET_LITTLE_SYM nds32_elf32_le_vec
13921 #define TARGET_LITTLE_NAME "elf32-nds32le"
13923 #define elf_info_to_howto nds32_info_to_howto
13924 #define elf_info_to_howto_rel nds32_info_to_howto_rel
13926 #define bfd_elf32_bfd_link_hash_table_create nds32_elf_link_hash_table_create
13927 #define bfd_elf32_bfd_merge_private_bfd_data nds32_elf_merge_private_bfd_data
13928 #define bfd_elf32_bfd_print_private_bfd_data nds32_elf_print_private_bfd_data
13929 #define bfd_elf32_bfd_relax_section nds32_elf_relax_section
13930 #define bfd_elf32_bfd_set_private_flags nds32_elf_set_private_flags
13932 #define bfd_elf32_mkobject nds32_elf_mkobject
13933 #define elf_backend_action_discarded nds32_elf_action_discarded
13934 #define elf_backend_add_symbol_hook nds32_elf_add_symbol_hook
13935 #define elf_backend_check_relocs nds32_elf_check_relocs
13936 #define elf_backend_adjust_dynamic_symbol nds32_elf_adjust_dynamic_symbol
13937 #define elf_backend_create_dynamic_sections nds32_elf_create_dynamic_sections
13938 #define elf_backend_finish_dynamic_sections nds32_elf_finish_dynamic_sections
13939 #define elf_backend_finish_dynamic_symbol nds32_elf_finish_dynamic_symbol
13940 #define elf_backend_size_dynamic_sections nds32_elf_size_dynamic_sections
13941 #define elf_backend_relocate_section nds32_elf_relocate_section
13942 #define elf_backend_gc_mark_hook nds32_elf_gc_mark_hook
13943 #define elf_backend_grok_prstatus nds32_elf_grok_prstatus
13944 #define elf_backend_grok_psinfo nds32_elf_grok_psinfo
13945 #define elf_backend_reloc_type_class nds32_elf_reloc_type_class
13946 #define elf_backend_copy_indirect_symbol nds32_elf_copy_indirect_symbol
13947 #define elf_backend_link_output_symbol_hook nds32_elf_output_symbol_hook
13948 #define elf_backend_output_arch_syms nds32_elf_output_arch_syms
13949 #define elf_backend_object_p nds32_elf_object_p
13950 #define elf_backend_final_write_processing nds32_elf_final_write_processing
13951 #define elf_backend_special_sections nds32_elf_special_sections
13952 #define elf_backend_section_flags nds32_elf_section_flags
13953 #define bfd_elf32_bfd_get_relocated_section_contents \
13954 nds32_elf_get_relocated_section_contents
13955 #define bfd_elf32_bfd_is_target_special_symbol nds32_elf_is_target_special_symbol
13956 #define elf_backend_maybe_function_sym nds32_elf_maybe_function_sym
13958 #define elf_backend_can_gc_sections 1
13959 #define elf_backend_can_refcount 1
13960 #define elf_backend_want_got_plt 1
13961 #define elf_backend_plt_readonly 1
13962 #define elf_backend_want_plt_sym 0
13963 #define elf_backend_got_header_size 12
13964 #define elf_backend_may_use_rel_p 1
13965 #define elf_backend_default_use_rela_p 1
13966 #define elf_backend_may_use_rela_p 1
13967 #define elf_backend_dtrel_excludes_plt 0
13969 #include "elf32-target.h"
13971 #undef ELF_MAXPAGESIZE
13972 #define ELF_MAXPAGESIZE 0x2000
13974 #undef TARGET_BIG_SYM
13975 #define TARGET_BIG_SYM nds32_elf32_linux_be_vec
13976 #undef TARGET_BIG_NAME
13977 #define TARGET_BIG_NAME "elf32-nds32be-linux"
13978 #undef TARGET_LITTLE_SYM
13979 #define TARGET_LITTLE_SYM nds32_elf32_linux_le_vec
13980 #undef TARGET_LITTLE_NAME
13981 #define TARGET_LITTLE_NAME "elf32-nds32le-linux"
13983 #define elf32_bed elf32_nds32_lin_bed
13985 #include "elf32-target.h"