]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf32-nds32.c
[PATCH] fix windmc typedef bug
[thirdparty/binutils-gdb.git] / bfd / elf32-nds32.c
CommitLineData
35c08157 1/* NDS32-specific support for 32-bit ELF.
b3adc24a 2 Copyright (C) 2012-2020 Free Software Foundation, Inc.
35c08157
KLC
3 Contributed by Andes Technology Corporation.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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
1c8f6a4d 20 02110-1301, USA. */
35c08157
KLC
21
22
23#include "sysdep.h"
24#include "bfd.h"
35c08157
KLC
25#include "bfdlink.h"
26#include "libbfd.h"
27#include "elf-bfd.h"
28#include "libiberty.h"
35c08157
KLC
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"
34
bb294208
AM
35/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
36#define OCTETS_PER_BYTE(ABFD, SEC) 1
37
35c08157
KLC
38/* Relocation HOWTO functions. */
39static bfd_reloc_status_type nds32_elf_ignore_reloc
40 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
41static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43static bfd_reloc_status_type nds32_elf_hi20_reloc
44 (bfd *, arelent *, asymbol *, void *,
45 asection *, bfd *, char **);
46static bfd_reloc_status_type nds32_elf_lo12_reloc
47 (bfd *, arelent *, asymbol *, void *,
48 asection *, bfd *, char **);
49static bfd_reloc_status_type nds32_elf_generic_reloc
50 (bfd *, arelent *, asymbol *, void *,
51 asection *, bfd *, char **);
52static bfd_reloc_status_type nds32_elf_sda15_reloc
53 (bfd *, arelent *, asymbol *, void *,
54 asection *, bfd *, char **);
55
56/* Helper functions for HOWTO. */
57static 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);
35c08157
KLC
60
61/* Nds32 helper functions. */
35c08157 62static bfd_vma calculate_memory_address
fbaf61ad 63 (bfd *, Elf_Internal_Rela *, Elf_Internal_Sym *, Elf_Internal_Shdr *);
0c4bd9d9
KLC
64static int nds32_get_section_contents (bfd *, asection *,
65 bfd_byte **, bfd_boolean);
35c08157
KLC
66static int nds32_get_local_syms (bfd *, asection *ATTRIBUTE_UNUSED,
67 Elf_Internal_Sym **);
35c08157
KLC
68static 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);
72static bfd_boolean nds32_fag_remove_unused_fpbase
73 (bfd *abfd, asection *sec, Elf_Internal_Rela *internal_relocs,
74 Elf_Internal_Rela *irelend);
75
76enum
77{
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
82};
83
84#define MIN(a, b) ((a) > (b) ? (b) : (a))
85#define MAX(a, b) ((a) > (b) ? (a) : (b))
86
87/* The name of the dynamic interpreter. This is put in the .interp
88 section. */
89#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
90
fbaf61ad
NC
91#define NDS32_GUARD_SEC_P(flags) ((flags) & SEC_ALLOC \
92 && (flags) & SEC_LOAD \
93 && (flags) & SEC_READONLY)
94
35c08157
KLC
95/* The nop opcode we use. */
96#define NDS32_NOP32 0x40000009
97#define NDS32_NOP16 0x9200
98
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
102
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. */
07d6d2b8
AM
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 */
35c08157
KLC
111
112/* $ta is change to $r15 (from $r25). */
113#define PLT0_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[1]@GOT) */
07d6d2b8
AM
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 */
119
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. */
35c08157
KLC
125
126#define PLT_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[n+3]@GOT) */
07d6d2b8
AM
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 */
35c08157 132
1c8f6a4d
KLC
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)
139
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)
152
35c08157
KLC
153/* Size of small data/bss sections, used to calculate SDA_BASE. */
154static long got_size = 0;
155static int is_SDA_BASE_set = 0;
35c08157 156
35c08157
KLC
157/* Convert ELF-VER in eflags to string for debugging purpose. */
158static const char *const nds32_elfver_strtab[] =
159{
160 "ELF-1.2",
161 "ELF-1.3",
162 "ELF-1.4",
163};
164
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. */
170
171/* This structure keeps track of the number of PC relative relocs we
172 have copied for a given symbol. */
173
174struct elf_nds32_pcrel_relocs_copied
175{
176 /* Next section. */
177 struct elf_nds32_pcrel_relocs_copied *next;
178 /* A section in dynobj. */
179 asection *section;
180 /* Number of relocs copied in this section. */
181 bfd_size_type count;
182};
183
fbaf61ad
NC
184enum elf_nds32_tls_type
185{
186 GOT_UNKNOWN = (0),
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),
194};
195
35c08157
KLC
196/* Nds32 ELF linker hash entry. */
197
198struct elf_nds32_link_hash_entry
199{
200 struct elf_link_hash_entry root;
201
1c8f6a4d 202 /* For checking relocation type. */
fbaf61ad
NC
203 enum elf_nds32_tls_type tls_type;
204
205 int offset_to_gp;
35c08157
KLC
206};
207
208/* Get the nds32 ELF linker hash table from a link_info structure. */
209
210#define FP_BASE_NAME "_FP_BASE_"
211static int check_start_export_sym = 0;
35c08157 212
1c8f6a4d
KLC
213/* The offset for executable tls relaxation. */
214#define TP_OFFSET 0x0
215
fbaf61ad
NC
216typedef struct
217{
218 int min_id;
219 int max_id;
220 int count;
221 int bias;
222 int init;
223} elf32_nds32_relax_group_t;
224
1c8f6a4d
KLC
225struct elf_nds32_obj_tdata
226{
227 struct elf_obj_tdata root;
228
229 /* tls_type for each local got entry. */
230 char *local_got_tls_type;
fbaf61ad
NC
231
232 /* GOTPLT entries for TLS descriptors. */
233 bfd_vma *local_tlsdesc_gotent;
234
235 /* for R_NDS32_RELAX_GROUP handling. */
236 elf32_nds32_relax_group_t relax_group;
237
238 unsigned int hdr_size;
239 int* offset_to_gp;
1c8f6a4d
KLC
240};
241
242#define elf_nds32_tdata(bfd) \
243 ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
244
245#define elf32_nds32_local_got_tls_type(bfd) \
246 (elf_nds32_tdata (bfd)->local_got_tls_type)
247
fbaf61ad
NC
248#define elf32_nds32_local_gp_offset(bfd) \
249 (elf_nds32_tdata (bfd)->offset_to_gp)
250
1c8f6a4d
KLC
251#define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
252
fbaf61ad
NC
253#define elf32_nds32_relax_group_ptr(bfd) \
254 &(elf_nds32_tdata (bfd)->relax_group)
255
1c8f6a4d
KLC
256static bfd_boolean
257nds32_elf_mkobject (bfd *abfd)
258{
259 return bfd_elf_allocate_object (abfd, sizeof (struct elf_nds32_obj_tdata),
260 NDS32_ELF_DATA);
261}
262
35c08157 263/* Relocations used for relocation. */
fbaf61ad
NC
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)
270
35c08157
KLC
271static reloc_howto_type nds32_elf_howto_table[] =
272{
273 /* This reloc does nothing. */
fbaf61ad
NC
274 HOWTO2 (R_NDS32_NONE, /* type */
275 0, /* rightshift */
276 2, /* size (0 = byte, 1 = short, 2 = long) */
277 32, /* bitsize */
278 FALSE, /* pc_relative */
279 0, /* bitpos */
280 complain_overflow_bitfield,/* complain_on_overflow */
281 bfd_elf_generic_reloc, /* special_function */
282 "R_NDS32_NONE", /* name */
283 FALSE, /* partial_inplace */
284 0, /* src_mask */
285 0, /* dst_mask */
286 FALSE), /* pcrel_offset */
35c08157
KLC
287
288 /* A 16 bit absolute relocation. */
fbaf61ad
NC
289 HOWTO2 (R_NDS32_16, /* type */
290 0, /* rightshift */
291 1, /* size (0 = byte, 1 = short, 2 = long) */
292 16, /* bitsize */
293 FALSE, /* pc_relative */
294 0, /* bitpos */
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 */
35c08157
KLC
302
303 /* A 32 bit absolute relocation. */
fbaf61ad
NC
304 HOWTO2 (R_NDS32_32, /* type */
305 0, /* rightshift */
306 2, /* size (0 = byte, 1 = short, 2 = long) */
307 32, /* bitsize */
308 FALSE, /* pc_relative */
309 0, /* bitpos */
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 */
35c08157
KLC
317
318 /* A 20 bit address. */
fbaf61ad
NC
319 HOWTO2 (R_NDS32_20, /* type */
320 0, /* rightshift */
321 2, /* size (0 = byte, 1 = short, 2 = long) */
322 20, /* bitsize */
323 FALSE, /* pc_relative */
324 0, /* bitpos */
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 */
35c08157
KLC
332
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
336 slot for pc. */
fbaf61ad 337 /* It's not clear whether this should have partial_inplace set or not.
35c08157
KLC
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
340 again. */
fbaf61ad
NC
341 HOWTO2 (R_NDS32_9_PCREL, /* type */
342 1, /* rightshift */
343 1, /* size (0 = byte, 1 = short, 2 = long) */
344 8, /* bitsize */
345 TRUE, /* pc_relative */
346 0, /* bitpos */
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 */
351 0xff, /* src_mask */
352 0xff, /* dst_mask */
353 TRUE), /* pcrel_offset */
35c08157
KLC
354
355 /* A relative 15 bit relocation, right shifted by 1. */
fbaf61ad
NC
356 HOWTO2 (R_NDS32_15_PCREL, /* type */
357 1, /* rightshift */
358 2, /* size (0 = byte, 1 = short, 2 = long) */
359 14, /* bitsize */
360 TRUE, /* pc_relative */
361 0, /* bitpos */
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 */
35c08157
KLC
369
370 /* A relative 17 bit relocation, right shifted by 1. */
fbaf61ad
NC
371 HOWTO2 (R_NDS32_17_PCREL, /* type */
372 1, /* rightshift */
373 2, /* size (0 = byte, 1 = short, 2 = long) */
374 16, /* bitsize */
375 TRUE, /* pc_relative */
376 0, /* bitpos */
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 */
35c08157
KLC
384
385 /* A relative 25 bit relocation, right shifted by 1. */
fbaf61ad 386 /* It's not clear whether this should have partial_inplace set or not.
35c08157
KLC
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
389 again. */
fbaf61ad
NC
390 HOWTO2 (R_NDS32_25_PCREL, /* type */
391 1, /* rightshift */
392 2, /* size (0 = byte, 1 = short, 2 = long) */
393 24, /* bitsize */
394 TRUE, /* pc_relative */
395 0, /* bitpos */
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 */
35c08157
KLC
403
404 /* High 20 bits of address when lower 12 is or'd in. */
fbaf61ad
NC
405 HOWTO2 (R_NDS32_HI20, /* type */
406 12, /* rightshift */
407 2, /* size (0 = byte, 1 = short, 2 = long) */
408 20, /* bitsize */
409 FALSE, /* pc_relative */
410 0, /* bitpos */
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 */
35c08157
KLC
418
419 /* Lower 12 bits of address. */
fbaf61ad
NC
420 HOWTO2 (R_NDS32_LO12S3, /* type */
421 3, /* rightshift */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
423 9, /* bitsize */
424 FALSE, /* pc_relative */
425 0, /* bitpos */
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 */
35c08157
KLC
433
434 /* Lower 12 bits of address. */
fbaf61ad
NC
435 HOWTO2 (R_NDS32_LO12S2, /* type */
436 2, /* rightshift */
437 2, /* size (0 = byte, 1 = short, 2 = long) */
438 10, /* bitsize */
439 FALSE, /* pc_relative */
440 0, /* bitpos */
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 */
35c08157
KLC
448
449 /* Lower 12 bits of address. */
fbaf61ad
NC
450 HOWTO2 (R_NDS32_LO12S1, /* type */
451 1, /* rightshift */
452 2, /* size (0 = byte, 1 = short, 2 = long) */
453 11, /* bitsize */
454 FALSE, /* pc_relative */
455 0, /* bitpos */
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 */
35c08157
KLC
463
464 /* Lower 12 bits of address. */
fbaf61ad
NC
465 HOWTO2 (R_NDS32_LO12S0, /* type */
466 0, /* rightshift */
467 2, /* size (0 = byte, 1 = short, 2 = long) */
468 12, /* bitsize */
469 FALSE, /* pc_relative */
470 0, /* bitpos */
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 */
35c08157
KLC
478
479 /* Small data area 15 bits offset. */
fbaf61ad
NC
480 HOWTO2 (R_NDS32_SDA15S3, /* type */
481 3, /* rightshift */
482 2, /* size (0 = byte, 1 = short, 2 = long) */
483 15, /* bitsize */
484 FALSE, /* pc_relative */
485 0, /* bitpos */
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 */
35c08157
KLC
493
494 /* Small data area 15 bits offset. */
fbaf61ad
NC
495 HOWTO2 (R_NDS32_SDA15S2, /* type */
496 2, /* rightshift */
497 2, /* size (0 = byte, 1 = short, 2 = long) */
498 15, /* bitsize */
499 FALSE, /* pc_relative */
500 0, /* bitpos */
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 */
35c08157
KLC
508
509 /* Small data area 15 bits offset. */
fbaf61ad
NC
510 HOWTO2 (R_NDS32_SDA15S1, /* type */
511 1, /* rightshift */
512 2, /* size (0 = byte, 1 = short, 2 = long) */
513 15, /* bitsize */
514 FALSE, /* pc_relative */
515 0, /* bitpos */
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 */
35c08157
KLC
523
524 /* Small data area 15 bits offset. */
fbaf61ad
NC
525 HOWTO2 (R_NDS32_SDA15S0, /* type */
526 0, /* rightshift */
527 2, /* size (0 = byte, 1 = short, 2 = long) */
528 15, /* bitsize */
529 FALSE, /* pc_relative */
530 0, /* bitpos */
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 */
538
539 /* GNU extension to record C++ vtable hierarchy */
540 HOWTO2 (R_NDS32_GNU_VTINHERIT,/* type */
541 0, /* rightshift */
542 2, /* size (0 = byte, 1 = short, 2 = long) */
543 0, /* bitsize */
544 FALSE, /* pc_relative */
545 0, /* bitpos */
546 complain_overflow_dont,/* complain_on_overflow */
547 NULL, /* special_function */
548 "R_NDS32_GNU_VTINHERIT",/* name */
549 FALSE, /* partial_inplace */
550 0, /* src_mask */
551 0, /* dst_mask */
552 FALSE), /* pcrel_offset */
553
554 /* GNU extension to record C++ vtable member usage */
555 HOWTO2 (R_NDS32_GNU_VTENTRY, /* type */
556 0, /* rightshift */
557 2, /* size (0 = byte, 1 = short, 2 = long) */
558 0, /* bitsize */
559 FALSE, /* pc_relative */
560 0, /* bitpos */
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 */
565 0, /* src_mask */
566 0, /* dst_mask */
567 FALSE), /* pcrel_offset */
35c08157
KLC
568
569 /* A 16 bit absolute relocation. */
fbaf61ad
NC
570 HOWTO2 (R_NDS32_16_RELA, /* type */
571 0, /* rightshift */
572 1, /* size (0 = byte, 1 = short, 2 = long) */
573 16, /* bitsize */
574 FALSE, /* pc_relative */
575 0, /* bitpos */
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 */
35c08157
KLC
583
584 /* A 32 bit absolute relocation. */
fbaf61ad
NC
585 HOWTO2 (R_NDS32_32_RELA, /* type */
586 0, /* rightshift */
587 2, /* size (0 = byte, 1 = short, 2 = long) */
588 32, /* bitsize */
589 FALSE, /* pc_relative */
590 0, /* bitpos */
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 */
35c08157
KLC
598
599 /* A 20 bit address. */
fbaf61ad
NC
600 HOWTO2 (R_NDS32_20_RELA, /* type */
601 0, /* rightshift */
602 2, /* size (0 = byte, 1 = short, 2 = long) */
603 20, /* bitsize */
604 FALSE, /* pc_relative */
605 0, /* bitpos */
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 */
613
614 HOWTO2 (R_NDS32_9_PCREL_RELA, /* type */
615 1, /* rightshift */
616 1, /* size (0 = byte, 1 = short, 2 = long) */
617 8, /* bitsize */
618 TRUE, /* pc_relative */
619 0, /* bitpos */
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 */
624 0xff, /* src_mask */
625 0xff, /* dst_mask */
626 TRUE), /* pcrel_offset */
35c08157
KLC
627
628 /* A relative 15 bit relocation, right shifted by 1. */
fbaf61ad
NC
629 HOWTO2 (R_NDS32_15_PCREL_RELA,/* type */
630 1, /* rightshift */
631 2, /* size (0 = byte, 1 = short, 2 = long) */
632 14, /* bitsize */
633 TRUE, /* pc_relative */
634 0, /* bitpos */
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 */
35c08157
KLC
642
643 /* A relative 17 bit relocation, right shifted by 1. */
fbaf61ad
NC
644 HOWTO2 (R_NDS32_17_PCREL_RELA,/* type */
645 1, /* rightshift */
646 2, /* size (0 = byte, 1 = short, 2 = long) */
647 16, /* bitsize */
648 TRUE, /* pc_relative */
649 0, /* bitpos */
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 */
35c08157
KLC
657
658 /* A relative 25 bit relocation, right shifted by 2. */
fbaf61ad
NC
659 HOWTO2 (R_NDS32_25_PCREL_RELA,/* type */
660 1, /* rightshift */
661 2, /* size (0 = byte, 1 = short, 2 = long) */
662 24, /* bitsize */
663 TRUE, /* pc_relative */
664 0, /* bitpos */
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 */
35c08157
KLC
672
673 /* High 20 bits of address when lower 16 is or'd in. */
fbaf61ad
NC
674 HOWTO2 (R_NDS32_HI20_RELA, /* type */
675 12, /* rightshift */
676 2, /* size (0 = byte, 1 = short, 2 = long) */
677 20, /* bitsize */
678 FALSE, /* pc_relative */
679 0, /* bitpos */
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 */
35c08157
KLC
687
688 /* Lower 12 bits of address. */
fbaf61ad
NC
689 HOWTO2 (R_NDS32_LO12S3_RELA, /* type */
690 3, /* rightshift */
691 2, /* size (0 = byte, 1 = short, 2 = long) */
692 9, /* bitsize */
693 FALSE, /* pc_relative */
694 0, /* bitpos */
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 */
35c08157
KLC
702
703 /* Lower 12 bits of address. */
fbaf61ad
NC
704 HOWTO2 (R_NDS32_LO12S2_RELA, /* type */
705 2, /* rightshift */
706 2, /* size (0 = byte, 1 = short, 2 = long) */
707 10, /* bitsize */
708 FALSE, /* pc_relative */
709 0, /* bitpos */
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 */
35c08157
KLC
717
718 /* Lower 12 bits of address. */
fbaf61ad
NC
719 HOWTO2 (R_NDS32_LO12S1_RELA, /* type */
720 1, /* rightshift */
721 2, /* size (0 = byte, 1 = short, 2 = long) */
722 11, /* bitsize */
723 FALSE, /* pc_relative */
724 0, /* bitpos */
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 */
35c08157
KLC
732
733 /* Lower 12 bits of address. */
fbaf61ad
NC
734 HOWTO2 (R_NDS32_LO12S0_RELA, /* type */
735 0, /* rightshift */
736 2, /* size (0 = byte, 1 = short, 2 = long) */
737 12, /* bitsize */
738 FALSE, /* pc_relative */
739 0, /* bitpos */
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 */
35c08157
KLC
747
748 /* Small data area 15 bits offset. */
fbaf61ad
NC
749 HOWTO2 (R_NDS32_SDA15S3_RELA, /* type */
750 3, /* rightshift */
751 2, /* size (0 = byte, 1 = short, 2 = long) */
752 15, /* bitsize */
753 FALSE, /* pc_relative */
754 0, /* bitpos */
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 */
35c08157
KLC
762
763 /* Small data area 15 bits offset. */
fbaf61ad
NC
764 HOWTO2 (R_NDS32_SDA15S2_RELA, /* type */
765 2, /* rightshift */
766 2, /* size (0 = byte, 1 = short, 2 = long) */
767 15, /* bitsize */
768 FALSE, /* pc_relative */
769 0, /* bitpos */
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 */
777
778 HOWTO2 (R_NDS32_SDA15S1_RELA, /* type */
779 1, /* rightshift */
780 2, /* size (0 = byte, 1 = short, 2 = long) */
781 15, /* bitsize */
782 FALSE, /* pc_relative */
783 0, /* bitpos */
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 */
791
792 HOWTO2 (R_NDS32_SDA15S0_RELA, /* type */
793 0, /* rightshift */
794 2, /* size (0 = byte, 1 = short, 2 = long) */
795 15, /* bitsize */
796 FALSE, /* pc_relative */
797 0, /* bitpos */
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 */
805
806 /* GNU extension to record C++ vtable hierarchy */
807 HOWTO2 (R_NDS32_RELA_GNU_VTINHERIT,/* type */
808 0, /* rightshift */
809 2, /* size (0 = byte, 1 = short, 2 = long) */
810 0, /* bitsize */
811 FALSE, /* pc_relative */
812 0, /* bitpos */
813 complain_overflow_dont,/* complain_on_overflow */
814 NULL, /* special_function */
815 "R_NDS32_RELA_GNU_VTINHERIT",/* name */
816 FALSE, /* partial_inplace */
817 0, /* src_mask */
818 0, /* dst_mask */
819 FALSE), /* pcrel_offset */
820
821 /* GNU extension to record C++ vtable member usage */
822 HOWTO2 (R_NDS32_RELA_GNU_VTENTRY,/* type */
823 0, /* rightshift */
824 2, /* size (0 = byte, 1 = short, 2 = long) */
825 0, /* bitsize */
826 FALSE, /* pc_relative */
827 0, /* bitpos */
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 */
832 0, /* src_mask */
833 0, /* dst_mask */
834 FALSE), /* pcrel_offset */
35c08157
KLC
835
836 /* Like R_NDS32_20, but referring to the GOT table entry for
837 the symbol. */
fbaf61ad
NC
838 HOWTO2 (R_NDS32_GOT20, /* type */
839 0, /* rightshift */
840 2, /* size (0 = byte, 1 = short, 2 = long) */
841 20, /* bitsize */
842 FALSE, /* pc_relative */
843 0, /* bitpos */
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 */
35c08157
KLC
851
852 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
853 entry for the symbol. */
fbaf61ad
NC
854 HOWTO2 (R_NDS32_25_PLTREL, /* type */
855 1, /* rightshift */
856 2, /* size (0 = byte, 1 = short, 2 = long) */
857 24, /* bitsize */
858 TRUE, /* pc_relative */
859 0, /* bitpos */
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 */
35c08157
KLC
867
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. */
fbaf61ad
NC
873 HOWTO2 (R_NDS32_COPY, /* type */
874 0, /* rightshift */
875 2, /* size (0 = byte, 1 = short, 2 = long) */
876 32, /* bitsize */
877 FALSE, /* pc_relative */
878 0, /* bitpos */
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 */
35c08157
KLC
886
887 /* Like R_NDS32_20, but used when setting global offset table
888 entries. */
fbaf61ad
NC
889 HOWTO2 (R_NDS32_GLOB_DAT, /* type */
890 0, /* rightshift */
891 2, /* size (0 = byte, 1 = short, 2 = long) */
892 32, /* bitsize */
893 FALSE, /* pc_relative */
894 0, /* bitpos */
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 */
35c08157
KLC
902
903 /* Marks a procedure linkage table entry for a symbol. */
fbaf61ad
NC
904 HOWTO2 (R_NDS32_JMP_SLOT, /* type */
905 0, /* rightshift */
906 2, /* size (0 = byte, 1 = short, 2 = long) */
907 32, /* bitsize */
908 FALSE, /* pc_relative */
909 0, /* bitpos */
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 */
35c08157
KLC
917
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
920 addend. */
fbaf61ad
NC
921 HOWTO2 (R_NDS32_RELATIVE, /* type */
922 0, /* rightshift */
923 2, /* size (0 = byte, 1 = short, 2 = long) */
924 32, /* bitsize */
925 FALSE, /* pc_relative */
926 0, /* bitpos */
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 */
934
935 HOWTO2 (R_NDS32_GOTOFF, /* type */
936 0, /* rightshift */
937 2, /* size (0 = byte, 1 = short, 2 = long) */
938 20, /* bitsize */
939 FALSE, /* pc_relative */
940 0, /* bitpos */
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 */
35c08157
KLC
948
949 /* An PC Relative 20-bit relocation used when setting PIC offset
950 table register. */
fbaf61ad
NC
951 HOWTO2 (R_NDS32_GOTPC20, /* type */
952 0, /* rightshift */
953 2, /* size (0 = byte, 1 = short, 2 = long) */
954 20, /* bitsize */
955 TRUE, /* pc_relative */
956 0, /* bitpos */
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 */
35c08157
KLC
964
965 /* Like R_NDS32_HI20, but referring to the GOT table entry for
966 the symbol. */
fbaf61ad
NC
967 HOWTO2 (R_NDS32_GOT_HI20, /* type */
968 12, /* rightshift */
969 2, /* size (0 = byte, 1 = short, 2 = long) */
970 20, /* bitsize */
971 FALSE, /* pc_relative */
972 0, /* bitpos */
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 */
981 0, /* rightshift */
982 2, /* size (0 = byte, 1 = short, 2 = long) */
983 12, /* bitsize */
984 FALSE, /* pc_relative */
985 0, /* bitpos */
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 */
35c08157
KLC
993
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
996 the symbol. */
fbaf61ad
NC
997 HOWTO2 (R_NDS32_GOTPC_HI20, /* type */
998 12, /* rightshift */
999 2, /* size (0 = byte, 1 = short, 2 = long) */
1000 20, /* bitsize */
1001 FALSE, /* pc_relative */
1002 0, /* bitpos */
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 */
1011 0, /* rightshift */
1012 2, /* size (0 = byte, 1 = short, 2 = long) */
1013 12, /* bitsize */
1014 FALSE, /* pc_relative */
1015 0, /* bitpos */
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 */
1023
1024 HOWTO2 (R_NDS32_GOTOFF_HI20, /* type */
1025 12, /* rightshift */
1026 2, /* size (0 = byte, 1 = short, 2 = long) */
1027 20, /* bitsize */
1028 FALSE, /* pc_relative */
1029 0, /* bitpos */
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 */
1038 0, /* rightshift */
1039 2, /* size (0 = byte, 1 = short, 2 = long) */
1040 12, /* bitsize */
1041 FALSE, /* pc_relative */
1042 0, /* bitpos */
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 */
35c08157
KLC
1050
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. */
fbaf61ad
NC
1054 HOWTO2 (R_NDS32_INSN16, /* type */
1055 0, /* rightshift */
1056 2, /* size (0 = byte, 1 = short, 2 = long) */
1057 32, /* bitsize */
1058 FALSE, /* pc_relative */
1059 0, /* bitpos */
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 */
35c08157
KLC
1067
1068 /* Alignment hint for label. */
fbaf61ad
NC
1069 HOWTO2 (R_NDS32_LABEL, /* type */
1070 0, /* rightshift */
1071 2, /* size (0 = byte, 1 = short, 2 = long) */
1072 32, /* bitsize */
1073 FALSE, /* pc_relative */
1074 0, /* bitpos */
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 */
35c08157
KLC
1082
1083 /* Relax hint for unconditional call sequence */
fbaf61ad
NC
1084 HOWTO2 (R_NDS32_LONGCALL1, /* type */
1085 0, /* rightshift */
1086 2, /* size (0 = byte, 1 = short, 2 = long) */
1087 32, /* bitsize */
1088 FALSE, /* pc_relative */
1089 0, /* bitpos */
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 */
35c08157
KLC
1097
1098 /* Relax hint for conditional call sequence. */
fbaf61ad
NC
1099 HOWTO2 (R_NDS32_LONGCALL2, /* type */
1100 0, /* rightshift */
1101 2, /* size (0 = byte, 1 = short, 2 = long) */
1102 32, /* bitsize */
1103 FALSE, /* pc_relative */
1104 0, /* bitpos */
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 */
35c08157
KLC
1112
1113 /* Relax hint for conditional call sequence. */
fbaf61ad
NC
1114 HOWTO2 (R_NDS32_LONGCALL3, /* type */
1115 0, /* rightshift */
1116 2, /* size (0 = byte, 1 = short, 2 = long) */
1117 32, /* bitsize */
1118 FALSE, /* pc_relative */
1119 0, /* bitpos */
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 */
35c08157
KLC
1127
1128 /* Relax hint for unconditional branch sequence. */
fbaf61ad
NC
1129 HOWTO2 (R_NDS32_LONGJUMP1, /* type */
1130 0, /* rightshift */
1131 2, /* size (0 = byte, 1 = short, 2 = long) */
1132 32, /* bitsize */
1133 FALSE, /* pc_relative */
1134 0, /* bitpos */
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 */
35c08157
KLC
1142
1143 /* Relax hint for conditional branch sequence. */
fbaf61ad
NC
1144 HOWTO2 (R_NDS32_LONGJUMP2, /* type */
1145 0, /* rightshift */
1146 2, /* size (0 = byte, 1 = short, 2 = long) */
1147 32, /* bitsize */
1148 FALSE, /* pc_relative */
1149 0, /* bitpos */
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 */
35c08157
KLC
1157
1158 /* Relax hint for conditional branch sequence. */
fbaf61ad
NC
1159 HOWTO2 (R_NDS32_LONGJUMP3, /* type */
1160 0, /* rightshift */
1161 2, /* size (0 = byte, 1 = short, 2 = long) */
1162 32, /* bitsize */
1163 FALSE, /* pc_relative */
1164 0, /* bitpos */
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 */
35c08157
KLC
1172
1173 /* Relax hint for load/store sequence. */
fbaf61ad
NC
1174 HOWTO2 (R_NDS32_LOADSTORE, /* type */
1175 0, /* rightshift */
1176 2, /* size (0 = byte, 1 = short, 2 = long) */
1177 32, /* bitsize */
1178 FALSE, /* pc_relative */
1179 0, /* bitpos */
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 */
35c08157
KLC
1187
1188 /* Relax hint for load/store sequence. */
fbaf61ad
NC
1189 HOWTO2 (R_NDS32_9_FIXED_RELA, /* type */
1190 0, /* rightshift */
1191 1, /* size (0 = byte, 1 = short, 2 = long) */
1192 16, /* bitsize */
1193 FALSE, /* pc_relative */
1194 0, /* bitpos */
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 */
35c08157
KLC
1202
1203 /* Relax hint for load/store sequence. */
fbaf61ad
NC
1204 HOWTO2 (R_NDS32_15_FIXED_RELA,/* type */
1205 0, /* rightshift */
1206 2, /* size (0 = byte, 1 = short, 2 = long) */
1207 32, /* bitsize */
1208 FALSE, /* pc_relative */
1209 0, /* bitpos */
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 */
35c08157
KLC
1217
1218 /* Relax hint for load/store sequence. */
fbaf61ad
NC
1219 HOWTO2 (R_NDS32_17_FIXED_RELA,/* type */
1220 0, /* rightshift */
1221 2, /* size (0 = byte, 1 = short, 2 = long) */
1222 32, /* bitsize */
1223 FALSE, /* pc_relative */
1224 0, /* bitpos */
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 */
35c08157
KLC
1232
1233 /* Relax hint for load/store sequence. */
fbaf61ad
NC
1234 HOWTO2 (R_NDS32_25_FIXED_RELA,/* type */
1235 0, /* rightshift */
1236 2, /* size (0 = byte, 1 = short, 2 = long) */
1237 32, /* bitsize */
1238 FALSE, /* pc_relative */
1239 0, /* bitpos */
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 */
35c08157
KLC
1247
1248 /* High 20 bits of PLT symbol offset relative to PC. */
fbaf61ad
NC
1249 HOWTO2 (R_NDS32_PLTREL_HI20, /* type */
1250 12, /* rightshift */
1251 2, /* size (0 = byte, 1 = short, 2 = long) */
1252 20, /* bitsize */
1253 FALSE, /* pc_relative */
1254 0, /* bitpos */
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 */
35c08157
KLC
1262
1263 /* Low 12 bits of PLT symbol offset relative to PC. */
fbaf61ad
NC
1264 HOWTO2 (R_NDS32_PLTREL_LO12, /* type */
1265 0, /* rightshift */
1266 2, /* size (0 = byte, 1 = short, 2 = long) */
1267 12, /* bitsize */
1268 FALSE, /* pc_relative */
1269 0, /* bitpos */
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 */
35c08157
KLC
1277
1278 /* High 20 bits of PLT symbol offset relative to GOT (GP). */
fbaf61ad
NC
1279 HOWTO2 (R_NDS32_PLT_GOTREL_HI20, /* type */
1280 12, /* rightshift */
1281 2, /* size (0 = byte, 1 = short, 2 = long) */
1282 20, /* bitsize */
1283 FALSE, /* pc_relative */
1284 0, /* bitpos */
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 */
35c08157
KLC
1292
1293 /* Low 12 bits of PLT symbol offset relative to GOT (GP). */
fbaf61ad
NC
1294 HOWTO2 (R_NDS32_PLT_GOTREL_LO12,/* type */
1295 0, /* rightshift */
1296 2, /* size (0 = byte, 1 = short, 2 = long) */
1297 12, /* bitsize */
1298 FALSE, /* pc_relative */
1299 0, /* bitpos */
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 */
35c08157
KLC
1307
1308 /* Small data area 12 bits offset. */
fbaf61ad
NC
1309 HOWTO2 (R_NDS32_SDA12S2_DP_RELA,/* type */
1310 2, /* rightshift */
1311 2, /* size (0 = byte, 1 = short, 2 = long) */
1312 12, /* bitsize */
1313 FALSE, /* pc_relative */
1314 0, /* bitpos */
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 */
35c08157
KLC
1322
1323 /* Small data area 12 bits offset. */
fbaf61ad
NC
1324 HOWTO2 (R_NDS32_SDA12S2_SP_RELA,/* type */
1325 2, /* rightshift */
1326 2, /* size (0 = byte, 1 = short, 2 = long) */
1327 12, /* bitsize */
1328 FALSE, /* pc_relative */
1329 0, /* bitpos */
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 */
35c08157
KLC
1337 /* Lower 12 bits of address. */
1338
fbaf61ad
NC
1339 HOWTO2 (R_NDS32_LO12S2_DP_RELA, /* type */
1340 2, /* rightshift */
1341 2, /* size (0 = byte, 1 = short, 2 = long) */
1342 10, /* bitsize */
1343 FALSE, /* pc_relative */
1344 0, /* bitpos */
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 */
35c08157
KLC
1352
1353 /* Lower 12 bits of address. */
fbaf61ad
NC
1354 HOWTO2 (R_NDS32_LO12S2_SP_RELA,/* type */
1355 2, /* rightshift */
1356 2, /* size (0 = byte, 1 = short, 2 = long) */
1357 10, /* bitsize */
1358 FALSE, /* pc_relative */
1359 0, /* bitpos */
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 */
35c08157 1367 /* Lower 12 bits of address. Special identity for or case. */
fbaf61ad
NC
1368 HOWTO2 (R_NDS32_LO12S0_ORI_RELA,/* type */
1369 0, /* rightshift */
1370 2, /* size (0 = byte, 1 = short, 2 = long) */
1371 12, /* bitsize */
1372 FALSE, /* pc_relative */
1373 0, /* bitpos */
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 */
35c08157 1381 /* Small data area 19 bits offset. */
fbaf61ad
NC
1382 HOWTO2 (R_NDS32_SDA16S3_RELA, /* type */
1383 3, /* rightshift */
1384 2, /* size (0 = byte, 1 = short, 2 = long) */
1385 16, /* bitsize */
1386 FALSE, /* pc_relative */
1387 0, /* bitpos */
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 */
35c08157
KLC
1395
1396 /* Small data area 15 bits offset. */
fbaf61ad
NC
1397 HOWTO2 (R_NDS32_SDA17S2_RELA, /* type */
1398 2, /* rightshift */
1399 2, /* size (0 = byte, 1 = short, 2 = long) */
1400 17, /* bitsize */
1401 FALSE, /* pc_relative */
1402 0, /* bitpos */
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 */
1410
1411 HOWTO2 (R_NDS32_SDA18S1_RELA, /* type */
1412 1, /* rightshift */
1413 2, /* size (0 = byte, 1 = short, 2 = long) */
1414 18, /* bitsize */
1415 FALSE, /* pc_relative */
1416 0, /* bitpos */
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 */
1424
1425 HOWTO2 (R_NDS32_SDA19S0_RELA, /* type */
1426 0, /* rightshift */
1427 2, /* size (0 = byte, 1 = short, 2 = long) */
1428 19, /* bitsize */
1429 FALSE, /* pc_relative */
1430 0, /* bitpos */
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 */
1439 0, /* rightshift */
1440 0, /* size (0 = byte, 1 = short, 2 = long) */
1441 8, /* bitsize */
1442 FALSE, /* pc_relative */
1443 0, /* bitpos */
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 */
1452 0, /* rightshift */
1453 1, /* size (0 = byte, 1 = short, 2 = long) */
1454 16, /* bitsize */
1455 FALSE, /* pc_relative */
1456 0, /* bitpos */
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 */
1465 0, /* rightshift */
1466 2, /* size (0 = byte, 1 = short, 2 = long) */
1467 32, /* bitsize */
1468 FALSE, /* pc_relative */
1469 0, /* bitpos */
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 */
1478 0, /* rightshift */
1479 1, /* size (0 = byte, 1 = short, 2 = long) */
1480 16, /* bitsize */
1481 FALSE, /* pc_relative */
1482 0, /* bitpos */
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 */
35c08157
KLC
1490 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
1491 entry for the symbol. */
fbaf61ad
NC
1492 HOWTO2 (R_NDS32_9_PLTREL, /* type */
1493 1, /* rightshift */
1494 1, /* size (0 = byte, 1 = short, 2 = long) */
1495 8, /* bitsize */
1496 TRUE, /* pc_relative */
1497 0, /* bitpos */
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 */
35c08157 1505 /* Low 20 bits of PLT symbol offset relative to GOT (GP). */
fbaf61ad
NC
1506 HOWTO2 (R_NDS32_PLT_GOTREL_LO20,/* type */
1507 0, /* rightshift */
1508 2, /* size (0 = byte, 1 = short, 2 = long) */
1509 20, /* bitsize */
1510 FALSE, /* pc_relative */
1511 0, /* bitpos */
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 */
1521 0, /* rightshift */
1522 2, /* size (0 = byte, 1 = short, 2 = long) */
1523 15, /* bitsize */
1524 FALSE, /* pc_relative */
1525 0, /* bitpos */
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 */
35c08157 1533 /* Low 19 bits of PLT symbol offset relative to GOT (GP). */
fbaf61ad
NC
1534 HOWTO2 (R_NDS32_PLT_GOTREL_LO19,/* type */
1535 0, /* rightshift */
1536 2, /* size (0 = byte, 1 = short, 2 = long) */
1537 19, /* bitsize */
1538 FALSE, /* pc_relative */
1539 0, /* bitpos */
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 */
1548 0, /* rightshift */
1549 2, /* size (0 = byte, 1 = short, 2 = long) */
1550 15, /* bitsize */
1551 FALSE, /* pc_relative */
1552 0, /* bitpos */
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 */
1561 0, /* rightshift */
1562 2, /* size (0 = byte, 1 = short, 2 = long) */
1563 19, /* bitsize */
1564 FALSE, /* pc_relative */
1565 0, /* bitpos */
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 */
1574 0, /* rightshift */
1575 2, /* size (0 = byte, 1 = short, 2 = long) */
1576 15, /* bitsize */
1577 FALSE, /* pc_relative */
1578 0, /* bitpos */
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 */
1587 0, /* rightshift */
1588 2, /* size (0 = byte, 1 = short, 2 = long) */
1589 19, /* bitsize */
1590 FALSE, /* pc_relative */
1591 0, /* bitpos */
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 */
35c08157 1599 /* GOT 15 bits offset. */
fbaf61ad
NC
1600 HOWTO2 (R_NDS32_GOT15S2_RELA, /* type */
1601 2, /* rightshift */
1602 2, /* size (0 = byte, 1 = short, 2 = long) */
1603 15, /* bitsize */
1604 FALSE, /* pc_relative */
1605 0, /* bitpos */
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 */
35c08157 1613 /* GOT 17 bits offset. */
fbaf61ad
NC
1614 HOWTO2 (R_NDS32_GOT17S2_RELA, /* type */
1615 2, /* rightshift */
1616 2, /* size (0 = byte, 1 = short, 2 = long) */
1617 17, /* bitsize */
1618 FALSE, /* pc_relative */
1619 0, /* bitpos */
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 */
35c08157 1627 /* A 5 bit address. */
fbaf61ad
NC
1628 HOWTO2 (R_NDS32_5_RELA, /* type */
1629 0, /* rightshift */
1630 1, /* size (0 = byte, 1 = short, 2 = long) */
1631 5, /* bitsize */
1632 FALSE, /* pc_relative */
1633 0, /* bitpos */
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 */
1642 1, /* rightshift */
1643 1, /* size (0 = byte, 1 = short, 2 = long) */
1644 9, /* bitsize */
1645 TRUE, /* pc_relative */
1646 0, /* bitpos */
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 */
1655 2, /* rightshift */
1656 1, /* size (0 = byte, 1 = short, 2 = long) */
1657 7, /* bitsize */
1658 FALSE, /* pc_relative */
1659 0, /* bitpos */
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 */
1668 1, /* rightshift */
1669 2, /* size (0 = byte, 1 = short, 2 = long) */
1670 8, /* bitsize */
1671 TRUE, /* pc_relative */
1672 0, /* bitpos */
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 */
1681 1, /* rightshift */
1682 2, /* size (0 = byte, 1 = short, 2 = long) */
1683 24, /* bitsize */
1684 FALSE, /* pc_relative */
1685 0, /* bitpos */
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 */
35c08157
KLC
1693
1694 /* A relative 17 bit relocation for ifc, right shifted by 1. */
fbaf61ad
NC
1695 HOWTO2 (R_NDS32_17IFC_PCREL_RELA,/* type */
1696 1, /* rightshift */
1697 2, /* size (0 = byte, 1 = short, 2 = long) */
1698 16, /* bitsize */
1699 TRUE, /* pc_relative */
1700 0, /* bitpos */
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 */
35c08157
KLC
1708
1709 /* A relative unsigned 10 bit relocation for ifc, right shifted by 1. */
fbaf61ad
NC
1710 HOWTO2 (R_NDS32_10IFCU_PCREL_RELA,/* type */
1711 1, /* rightshift */
1712 1, /* size (0 = byte, 1 = short, 2 = long) */
1713 9, /* bitsize */
1714 TRUE, /* pc_relative */
1715 0, /* bitpos */
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 */
1723
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) */
1728 20, /* bitsize */
1729 FALSE, /* pc_relative */
1730 0, /* bitpos */
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 */
1738
1739 HOWTO2 (R_NDS32_TLS_LE_LO12, /* type */
1740 0, /* rightshift */
1741 2, /* size (0 = byte, 1 = short, 2 = long) */
1742 12, /* bitsize */
1743 FALSE, /* pc_relative */
1744 0, /* bitpos */
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 */
1752
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) */
1757 20, /* bitsize */
1758 FALSE, /* pc_relative */
1759 0, /* bitpos */
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 */
1767
1768 HOWTO2 (R_NDS32_TLS_IE_LO12S2,/* type */
1769 2, /* rightshift */
1770 2, /* size (0 = byte, 1 = short, 2 = long) */
1771 10, /* bitsize */
1772 FALSE, /* pc_relative */
1773 0, /* bitpos */
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 */
1781
1782 /* TLS LE TP offset relocation */
1783 HOWTO2 (R_NDS32_TLS_TPOFF, /* type */
1784 0, /* rightshift */
1785 2, /* size (0 = byte, 1 = short, 2 = long) */
1786 32, /* bitsize */
1787 FALSE, /* pc_relative */
1788 0, /* bitpos */
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 */
1796
1c8f6a4d 1797 /* A 20 bit address. */
fbaf61ad
NC
1798 HOWTO2 (R_NDS32_TLS_LE_20, /* type */
1799 0, /* rightshift */
1800 2, /* size (0 = byte, 1 = short, 2 = long) */
1801 20, /* bitsize */
1802 FALSE, /* pc_relative */
1803 0, /* bitpos */
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 */
1811
1812 HOWTO2 (R_NDS32_TLS_LE_15S0, /* type */
1813 0, /* rightshift */
1814 2, /* size (0 = byte, 1 = short, 2 = long) */
1815 15, /* bitsize */
1816 FALSE, /* pc_relative */
1817 0, /* bitpos */
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 */
1826 1, /* rightshift */
1827 2, /* size (0 = byte, 1 = short, 2 = long) */
1828 15, /* bitsize */
1829 FALSE, /* pc_relative */
1830 0, /* bitpos */
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 */
1839 2, /* rightshift */
1840 2, /* size (0 = byte, 1 = short, 2 = long) */
1841 15, /* bitsize */
1842 FALSE, /* pc_relative */
1843 0, /* bitpos */
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 */
1c8f6a4d
KLC
1851
1852 /* Relax hint for unconditional call sequence */
fbaf61ad
NC
1853 HOWTO2 (R_NDS32_LONGCALL4, /* type */
1854 0, /* rightshift */
1855 2, /* size (0 = byte, 1 = short, 2 = long) */
1856 32, /* bitsize */
1857 FALSE, /* pc_relative */
1858 0, /* bitpos */
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 */
1c8f6a4d
KLC
1866
1867 /* Relax hint for conditional call sequence. */
fbaf61ad
NC
1868 HOWTO2 (R_NDS32_LONGCALL5, /* type */
1869 0, /* rightshift */
1870 2, /* size (0 = byte, 1 = short, 2 = long) */
1871 32, /* bitsize */
1872 FALSE, /* pc_relative */
1873 0, /* bitpos */
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 */
1c8f6a4d
KLC
1881
1882 /* Relax hint for conditional call sequence. */
fbaf61ad
NC
1883 HOWTO2 (R_NDS32_LONGCALL6, /* type */
1884 0, /* rightshift */
1885 2, /* size (0 = byte, 1 = short, 2 = long) */
1886 32, /* bitsize */
1887 FALSE, /* pc_relative */
1888 0, /* bitpos */
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 */
1c8f6a4d
KLC
1896
1897 /* Relax hint for unconditional branch sequence. */
fbaf61ad
NC
1898 HOWTO2 (R_NDS32_LONGJUMP4, /* type */
1899 0, /* rightshift */
1900 2, /* size (0 = byte, 1 = short, 2 = long) */
1901 32, /* bitsize */
1902 FALSE, /* pc_relative */
1903 0, /* bitpos */
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 */
1c8f6a4d
KLC
1911
1912 /* Relax hint for conditional branch sequence. */
fbaf61ad
NC
1913 HOWTO2 (R_NDS32_LONGJUMP5, /* type */
1914 0, /* rightshift */
1915 2, /* size (0 = byte, 1 = short, 2 = long) */
1916 32, /* bitsize */
1917 FALSE, /* pc_relative */
1918 0, /* bitpos */
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 */
1c8f6a4d
KLC
1926
1927 /* Relax hint for conditional branch sequence. */
fbaf61ad
NC
1928 HOWTO2 (R_NDS32_LONGJUMP6, /* type */
1929 0, /* rightshift */
1930 2, /* size (0 = byte, 1 = short, 2 = long) */
1931 32, /* bitsize */
1932 FALSE, /* pc_relative */
1933 0, /* bitpos */
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 */
1c8f6a4d
KLC
1941
1942 /* Relax hint for conditional branch sequence. */
fbaf61ad
NC
1943 HOWTO2 (R_NDS32_LONGJUMP7, /* type */
1944 0, /* rightshift */
1945 2, /* size (0 = byte, 1 = short, 2 = long) */
1946 32, /* bitsize */
1947 FALSE, /* pc_relative */
1948 0, /* bitpos */
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 */
1956
1957 HOWTO2 (R_NDS32_TLS_IE_LO12, /* type */
1958 0, /* rightshift */
1959 2, /* size (0 = byte, 1 = short, 2 = long) */
1960 12, /* bitsize */
1961 FALSE, /* pc_relative */
1962 0, /* bitpos */
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 */
1970
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) */
1976 20, /* bitsize */
1977 FALSE, /* pc_relative */
1978 0, /* bitpos */
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 */
1986
1987 HOWTO2 (R_NDS32_TLS_IEGP_LO12,/* type */
1988 0, /* rightshift */
1989 2, /* size (0 = byte, 1 = short, 2 = long) */
1990 12, /* bitsize */
1991 FALSE, /* pc_relative */
1992 0, /* bitpos */
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 */
2000
2001 HOWTO2 (R_NDS32_TLS_IEGP_LO12S2,/* type */
2002 2, /* rightshift */
2003 2, /* size (0 = byte, 1 = short, 2 = long) */
2004 10, /* bitsize */
2005 FALSE, /* pc_relative */
2006 0, /* bitpos */
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 */
2014
2015 /* TLS description relocation */
2016 HOWTO2 (R_NDS32_TLS_DESC, /* type */
2017 12, /* rightshift */
2018 2, /* size (0 = byte, 1 = short, 2 = long) */
2019 20, /* bitsize */
2020 FALSE, /* pc_relative */
2021 0, /* bitpos */
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 */
2029
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) */
2034 20, /* bitsize */
2035 FALSE, /* pc_relative */
2036 0, /* bitpos */
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 */
2044
2045 /* TLS GD/LD description offset low part. */
2046 HOWTO2 (R_NDS32_TLS_DESC_LO12,/* type */
2047 0, /* rightshift */
2048 2, /* size (0 = byte, 1 = short, 2 = long) */
2049 12, /* bitsize */
2050 FALSE, /* pc_relative */
2051 0, /* bitpos */
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 */
2059
2060 /* TLS GD/LD description offset set (movi). */
2061 HOWTO2 (R_NDS32_TLS_DESC_20, /* type */
2062 0, /* rightshift */
2063 2, /* size (0 = byte, 1 = short, 2 = long) */
2064 20, /* bitsize */
2065 FALSE, /* pc_relative */
2066 0, /* bitpos */
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 */
2074
2075 /* TLS GD/LD description offset set (lwi.gp). */
2076 HOWTO2 (R_NDS32_TLS_DESC_SDA17S2,/* type */
2077 2, /* rightshift */
2078 2, /* size (0 = byte, 1 = short, 2 = long) */
2079 17, /* bitsize */
2080 FALSE, /* pc_relative */
2081 0, /* bitpos */
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 */
35c08157
KLC
2089};
2090
2091/* Relocations used for relaxation. */
fbaf61ad
NC
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)
2094
2095static reloc_howto_type nds32_elf_relax_howto_table[] = {
2096 HOWTO3 (R_NDS32_RELAX_ENTRY, /* type */
2097 0, /* rightshift */
2098 2, /* size (0 = byte, 1 = short, 2 = long) */
2099 32, /* bitsize */
2100 FALSE, /* pc_relative */
2101 0, /* bitpos */
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 */
2110 0, /* rightshift */
2111 2, /* size (0 = byte, 1 = short, 2 = long) */
2112 32, /* bitsize */
2113 FALSE, /* pc_relative */
2114 0, /* bitpos */
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 */
2123 0, /* rightshift */
2124 2, /* size (0 = byte, 1 = short, 2 = long) */
2125 32, /* bitsize */
2126 FALSE, /* pc_relative */
2127 0, /* bitpos */
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 */
2136 0, /* rightshift */
2137 2, /* size (0 = byte, 1 = short, 2 = long) */
2138 32, /* bitsize */
2139 FALSE, /* pc_relative */
2140 0, /* bitpos */
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 */
2149 0, /* rightshift */
2150 2, /* size (0 = byte, 1 = short, 2 = long) */
2151 32, /* bitsize */
2152 FALSE, /* pc_relative */
2153 0, /* bitpos */
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 */
2162 0, /* rightshift */
2163 2, /* size (0 = byte, 1 = short, 2 = long) */
2164 32, /* bitsize */
2165 FALSE, /* pc_relative */
2166 0, /* bitpos */
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 */
2175 0, /* rightshift */
2176 2, /* size (0 = byte, 1 = short, 2 = long) */
2177 32, /* bitsize */
2178 FALSE, /* pc_relative */
2179 0, /* bitpos */
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 */
2188 0, /* rightshift */
2189 2, /* size (0 = byte, 1 = short, 2 = long) */
2190 32, /* bitsize */
2191 FALSE, /* pc_relative */
2192 0, /* bitpos */
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 */
2201 0, /* rightshift */
2202 2, /* size (0 = byte, 1 = short, 2 = long) */
2203 32, /* bitsize */
2204 FALSE, /* pc_relative */
2205 0, /* bitpos */
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 */
2214 0, /* rightshift */
2215 2, /* size (0 = byte, 1 = short, 2 = long) */
2216 32, /* bitsize */
2217 FALSE, /* pc_relative */
2218 0, /* bitpos */
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 */
2227 0, /* rightshift */
2228 2, /* size (0 = byte, 1 = short, 2 = long) */
2229 32, /* bitsize */
2230 FALSE, /* pc_relative */
2231 0, /* bitpos */
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 */
2240 0, /* rightshift */
2241 2, /* size (0 = byte, 1 = short, 2 = long) */
2242 32, /* bitsize */
2243 FALSE, /* pc_relative */
2244 0, /* bitpos */
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 */
2253 0, /* rightshift */
2254 2, /* size (0 = byte, 1 = short, 2 = long) */
2255 32, /* bitsize */
2256 FALSE, /* pc_relative */
2257 0, /* bitpos */
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 */
2266 0, /* rightshift */
2267 0, /* size (0 = byte, 1 = short, 2 = long) */
2268 8, /* bitsize */
2269 FALSE, /* pc_relative */
2270 0, /* bitpos */
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 */
2279 0, /* rightshift */
2280 1, /* size (0 = byte, 1 = short, 2 = long) */
2281 16, /* bitsize */
2282 FALSE, /* pc_relative */
2283 0, /* bitpos */
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 */
2292 0, /* rightshift */
2293 2, /* size (0 = byte, 1 = short, 2 = long) */
2294 32, /* bitsize */
2295 FALSE, /* pc_relative */
2296 0, /* bitpos */
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 */
2305 0, /* rightshift */
2306 0, /* size (0 = byte, 1 = short, 2 = long) */
2307 0, /* bitsize */
2308 FALSE, /* pc_relative */
2309 0, /* bitpos */
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 */
2318 0, /* rightshift */
2319 2, /* size (0 = byte, 1 = short, 2 = long) */
2320 32, /* bitsize */
2321 FALSE, /* pc_relative */
2322 0, /* bitpos */
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 */
2331 0, /* rightshift */
2332 2, /* size (0 = byte, 1 = short, 2 = long) */
2333 32, /* bitsize */
2334 FALSE, /* pc_relative */
2335 0, /* bitpos */
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 */
2344 0, /* rightshift */
2345 2, /* size (0 = byte, 1 = short, 2 = long) */
2346 32, /* bitsize */
2347 FALSE, /* pc_relative */
2348 0, /* bitpos */
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 */
2357 0, /* rightshift */
2358 2, /* size (0 = byte, 1 = short, 2 = long) */
2359 32, /* bitsize */
2360 FALSE, /* pc_relative */
2361 0, /* bitpos */
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 */
2370 0, /* rightshift */
2371 2, /* size (0 = byte, 1 = short, 2 = long) */
2372 32, /* bitsize */
2373 FALSE, /* pc_relative */
2374 0, /* bitpos */
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 */
2384 0, /* rightshift */
2385 2, /* size (0 = byte, 1 = short, 2 = long) */
2386 32, /* bitsize */
2387 FALSE, /* pc_relative */
2388 0, /* bitpos */
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 */
2398 0, /* rightshift */
2399 2, /* size (0 = byte, 1 = short, 2 = long) */
2400 32, /* bitsize */
2401 FALSE, /* pc_relative */
2402 0, /* bitpos */
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 */
2412 0, /* rightshift */
2413 2, /* size (0 = byte, 1 = short, 2 = long) */
2414 32, /* bitsize */
2415 FALSE, /* pc_relative */
2416 0, /* bitpos */
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 */
2426 0, /* rightshift */
2427 2, /* size (0 = byte, 1 = short, 2 = long) */
2428 32, /* bitsize */
2429 FALSE, /* pc_relative */
2430 0, /* bitpos */
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 */
2440 0, /* rightshift */
2441 2, /* size (0 = byte, 1 = short, 2 = long) */
2442 32, /* bitsize */
2443 FALSE, /* pc_relative */
2444 0, /* bitpos */
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 */
2454 0, /* rightshift */
2455 2, /* size (0 = byte, 1 = short, 2 = long) */
2456 32, /* bitsize */
2457 FALSE, /* pc_relative */
2458 0, /* bitpos */
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 */
2467 0, /* rightshift */
2468 2, /* size (0 = byte, 1 = short, 2 = long) */
2469 32, /* bitsize */
2470 FALSE, /* pc_relative */
2471 0, /* bitpos */
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 */
2481 0, /* rightshift */
2482 2, /* size (0 = byte, 1 = short, 2 = long) */
2483 32, /* bitsize */
2484 FALSE, /* pc_relative */
2485 0, /* bitpos */
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 */
2492 FALSE),
35c08157
KLC
2493};
2494
fbaf61ad
NC
2495static unsigned long dl_tlsdesc_lazy_trampoline[] =
2496{
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 */
2505};
2506
2507static void
2508nds32_put_trampoline (void *contents, const unsigned long *template,
2509 unsigned count)
2510{
2511 unsigned ix;
2512
2513 for (ix = 0; ix != count; ix++)
2514 {
2515 unsigned long insn = template[ix];
2516 bfd_putb32 (insn, (char *) contents + ix * 4);
2517 }
2518}
2519
35c08157
KLC
2520/* nds32_insertion_sort sorts an array with nmemb elements of size size.
2521 This prototype is the same as qsort (). */
2522
2523void
2524nds32_insertion_sort (void *base, size_t nmemb, size_t size,
2525 int (*compar) (const void *lhs, const void *rhs))
2526{
2527 char *ptr = (char *) base;
1c8f6a4d 2528 int i, j;
9a733151
AM
2529 char tmp[sizeof (Elf_Internal_Rela)];
2530
2531 BFD_ASSERT (size <= sizeof (tmp));
35c08157
KLC
2532
2533 /* If i is less than j, i is inserted before j.
2534
2535 |---- j ----- i --------------|
2536 \ / \ /
2537 sorted unsorted
2538 */
2539
1c8f6a4d 2540 for (i = 1; i < (int) nmemb; i++)
35c08157 2541 {
1c8f6a4d
KLC
2542 for (j = (i - 1); j >= 0; j--)
2543 if (compar (ptr + i * size, ptr + j * size) >= 0)
35c08157
KLC
2544 break;
2545
1c8f6a4d
KLC
2546 j++;
2547
35c08157 2548 if (i == j)
1c8f6a4d 2549 continue; /* i is in order. */
35c08157
KLC
2550
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);
2554 }
2555}
2556
2557/* Sort relocation by r_offset.
2558
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.
2562
2563 Currently, this function implements insertion-sort.
2564
2565 FIXME: If we already sort them in assembler, why bother sort them
2566 here again? */
2567
2568static int
2569compar_reloc (const void *lhs, const void *rhs)
2570{
2571 const Elf_Internal_Rela *l = (const Elf_Internal_Rela *) lhs;
2572 const Elf_Internal_Rela *r = (const Elf_Internal_Rela *) rhs;
2573
2574 if (l->r_offset > r->r_offset)
2575 return 1;
2576 else if (l->r_offset == r->r_offset)
2577 return 0;
2578 else
2579 return -1;
2580}
2581
2582/* Functions listed below are only used for old relocs.
fbaf61ad
NC
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. */
35c08157
KLC
2590
2591/* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc. */
2592
2593static bfd_reloc_status_type
fbaf61ad
NC
2594nds32_elf_9_pcrel_reloc (bfd * abfd,
2595 arelent * reloc_entry,
2596 asymbol * symbol,
2597 void * data,
2598 asection * input_section,
2599 bfd * output_bfd,
2600 char ** error_message ATTRIBUTE_UNUSED)
35c08157
KLC
2601{
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))
2606 {
2607 reloc_entry->address += input_section->output_offset;
2608 return bfd_reloc_ok;
2609 }
2610
2611 if (output_bfd != NULL)
2612 {
2613 /* FIXME: See bfd_perform_relocation. Is this right? */
2614 return bfd_reloc_continue;
2615 }
2616
2617 return nds32_elf_do_9_pcrel_reloc (abfd, reloc_entry->howto,
2618 input_section,
2619 data, reloc_entry->address,
2620 symbol->section,
2621 (symbol->value
2622 + symbol->section->output_section->vma
2623 + symbol->section->output_offset),
2624 reloc_entry->addend);
2625}
2626
2627/* Utility to actually perform an R_NDS32_9_PCREL reloc. */
2628#define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
2629
2630static bfd_reloc_status_type
fbaf61ad
NC
2631nds32_elf_do_9_pcrel_reloc (bfd * abfd,
2632 reloc_howto_type * howto,
2633 asection * input_section,
2634 bfd_byte * data,
2635 bfd_vma offset,
2636 asection * symbol_section ATTRIBUTE_UNUSED,
2637 bfd_vma symbol_value,
2638 bfd_vma addend)
35c08157
KLC
2639{
2640 bfd_signed_vma relocation;
2641 unsigned short x;
2642 bfd_reloc_status_type status;
2643
2644 /* Sanity check the address (offset in section). */
2645 if (offset > bfd_get_section_limit (abfd, input_section))
2646 return bfd_reloc_outofrange;
2647
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);
2655
1c8f6a4d 2656 if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1)
35c08157
KLC
2657 status = bfd_reloc_overflow;
2658 else
2659 status = bfd_reloc_ok;
2660
2661 x = bfd_getb16 (data + offset);
2662
2663 relocation >>= howto->rightshift;
2664 relocation <<= howto->bitpos;
2665 x = (x & ~howto->dst_mask)
2666 | (((x & howto->src_mask) + relocation) & howto->dst_mask);
2667
2668 bfd_putb16 ((bfd_vma) x, data + offset);
2669
2670 return status;
2671}
2672
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. */
2688
2689struct nds32_hi20
2690{
2691 struct nds32_hi20 *next;
2692 bfd_byte *addr;
2693 bfd_vma addend;
2694};
2695
2696static struct nds32_hi20 *nds32_hi20_list;
2697
2698static bfd_reloc_status_type
fbaf61ad
NC
2699nds32_elf_hi20_reloc (bfd *abfd ATTRIBUTE_UNUSED,
2700 arelent *reloc_entry,
2701 asymbol *symbol,
2702 void *data,
2703 asection *input_section,
2704 bfd *output_bfd,
2705 char **error_message ATTRIBUTE_UNUSED)
35c08157
KLC
2706{
2707 bfd_reloc_status_type ret;
2708 bfd_vma relocation;
2709 struct nds32_hi20 *n;
2710
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)
2716 {
2717 reloc_entry->address += input_section->output_offset;
2718 return bfd_reloc_ok;
2719 }
2720
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;
2724
2725 ret = bfd_reloc_ok;
2726 if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2727 ret = bfd_reloc_undefined;
2728
2729 if (bfd_is_com_section (symbol->section))
2730 relocation = 0;
2731 else
2732 relocation = symbol->value;
2733
2734 relocation += symbol->section->output_section->vma;
2735 relocation += symbol->section->output_offset;
2736 relocation += reloc_entry->addend;
2737
2738 /* Save the information, and let LO12 do the actual relocation. */
2739 n = (struct nds32_hi20 *) bfd_malloc ((bfd_size_type) sizeof *n);
2740 if (n == NULL)
2741 return bfd_reloc_outofrange;
2742
2743 n->addr = (bfd_byte *) data + reloc_entry->address;
2744 n->addend = relocation;
2745 n->next = nds32_hi20_list;
2746 nds32_hi20_list = n;
2747
2748 if (output_bfd != (bfd *) NULL)
2749 reloc_entry->address += input_section->output_offset;
2750
2751 return ret;
2752}
2753
2754/* Handle an NDS32 ELF HI20 reloc. */
2755
2756static void
2757nds32_elf_relocate_hi20 (bfd *input_bfd ATTRIBUTE_UNUSED,
fbaf61ad
NC
2758 int type ATTRIBUTE_UNUSED,
2759 Elf_Internal_Rela *relhi,
2760 Elf_Internal_Rela *rello,
2761 bfd_byte *contents,
35c08157
KLC
2762 bfd_vma addend)
2763{
2764 unsigned long insn;
2765 bfd_vma addlo;
2766
2767 insn = bfd_getb32 (contents + relhi->r_offset);
2768
2769 addlo = bfd_getb32 (contents + rello->r_offset);
2770 addlo &= 0xfff;
2771
2772 addend += ((insn & 0xfffff) << 20) + addlo;
2773
2774 insn = (insn & 0xfff00000) | ((addend >> 12) & 0xfffff);
2775 bfd_putb32 (insn, contents + relhi->r_offset);
2776}
2777
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. */
2781
2782static bfd_reloc_status_type
2783nds32_elf_lo12_reloc (bfd *input_bfd, arelent *reloc_entry, asymbol *symbol,
2784 void *data, asection *input_section, bfd *output_bfd,
2785 char **error_message)
2786{
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)
2792 {
2793 reloc_entry->address += input_section->output_offset;
2794 return bfd_reloc_ok;
2795 }
2796
2797 if (nds32_hi20_list != NULL)
2798 {
2799 struct nds32_hi20 *l;
2800
2801 l = nds32_hi20_list;
2802 while (l != NULL)
2803 {
2804 unsigned long insn;
2805 unsigned long val;
2806 unsigned long vallo;
2807 struct nds32_hi20 *next;
2808
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);
2814 vallo &= 0xfff;
2815 switch (reloc_entry->howto->type)
2816 {
2817 case R_NDS32_LO12S3:
2818 vallo <<= 3;
2819 break;
2820
2821 case R_NDS32_LO12S2:
2822 vallo <<= 2;
2823 break;
2824
2825 case R_NDS32_LO12S1:
2826 vallo <<= 1;
2827 break;
2828
2829 case R_NDS32_LO12S0:
2830 vallo <<= 0;
2831 break;
2832 }
2833
2834 val = ((insn & 0xfffff) << 12) + vallo;
2835 val += l->addend;
2836
2837 insn = (insn & ~(bfd_vma) 0xfffff) | ((val >> 12) & 0xfffff);
2838 bfd_putb32 ((bfd_vma) insn, l->addr);
2839
2840 next = l->next;
2841 free (l);
2842 l = next;
2843 }
2844
2845 nds32_hi20_list = NULL;
2846 }
2847
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);
2855}
2856
2857/* Do generic partial_inplace relocation.
2858 This is a local replacement for bfd_elf_generic_reloc. */
2859
2860static bfd_reloc_status_type
2861nds32_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)
2864{
2865 bfd_reloc_status_type ret;
2866 bfd_vma relocation;
2867 bfd_byte *inplace_address;
2868
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)
2874 {
2875 reloc_entry->address += input_section->output_offset;
2876 return bfd_reloc_ok;
2877 }
2878
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. */
2884
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;
2888
2889 ret = bfd_reloc_ok;
2890 if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2891 ret = bfd_reloc_undefined;
2892
2893 if (bfd_is_com_section (symbol->section) || output_bfd != (bfd *) NULL)
2894 relocation = 0;
2895 else
2896 relocation = symbol->value;
2897
2898 /* Only do this for a final link. */
2899 if (output_bfd == (bfd *) NULL)
2900 {
2901 relocation += symbol->section->output_section->vma;
2902 relocation += symbol->section->output_offset;
2903 }
2904
2905 relocation += reloc_entry->addend;
2906 switch (reloc_entry->howto->type)
2907 {
2908 case R_NDS32_LO12S3:
2909 relocation >>= 3;
2910 break;
2911
2912 case R_NDS32_LO12S2:
2913 relocation >>= 2;
2914 break;
2915
2916 case R_NDS32_LO12S1:
2917 relocation >>= 1;
2918 break;
2919
2920 case R_NDS32_LO12S0:
2921 default:
2922 relocation >>= 0;
2923 break;
2924 }
2925
2926 inplace_address = (bfd_byte *) data + reloc_entry->address;
2927
2928#define DOIT(x) \
2929 x = ((x & ~reloc_entry->howto->dst_mask) | \
2930 (((x & reloc_entry->howto->src_mask) + relocation) & \
2931 reloc_entry->howto->dst_mask))
2932
2933 switch (reloc_entry->howto->size)
2934 {
2935 case 1:
2936 {
2937 short x = bfd_getb16 (inplace_address);
2938
2939 DOIT (x);
2940 bfd_putb16 ((bfd_vma) x, inplace_address);
2941 }
2942 break;
2943 case 2:
2944 {
2945 unsigned long x = bfd_getb32 (inplace_address);
2946
2947 DOIT (x);
2948 bfd_putb32 ((bfd_vma) x, inplace_address);
2949 }
2950 break;
2951 default:
2952 BFD_ASSERT (0);
2953 }
2954
2955 if (output_bfd != (bfd *) NULL)
2956 reloc_entry->address += input_section->output_offset;
2957
2958 return ret;
2959}
2960
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_.
2966
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. */
2969
2970static bfd_reloc_status_type
2971nds32_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)
2975{
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))
2980 {
2981 reloc_entry->address += input_section->output_offset;
2982 return bfd_reloc_ok;
2983 }
2984
2985 if (output_bfd != NULL)
2986 {
2987 /* FIXME: See bfd_perform_relocation. Is this right? */
2988 return bfd_reloc_continue;
2989 }
2990
2991 /* FIXME: not sure what to do here yet. But then again, the linker
2992 may never call us. */
2993 abort ();
2994}
2995
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
3000 invoked. */
3001
3002static bfd_reloc_status_type
3003nds32_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)
3007{
3008 if (output_bfd != NULL)
3009 reloc_entry->address += input_section->output_offset;
3010
3011 return bfd_reloc_ok;
3012}
3013\f
3014
3015/* Map BFD reloc types to NDS32 ELF reloc types. */
3016
3017struct nds32_reloc_map_entry
3018{
3019 bfd_reloc_code_real_type bfd_reloc_val;
3020 unsigned char elf_reloc_val;
3021};
3022
3023static const struct nds32_reloc_map_entry nds32_reloc_map[] =
3024{
3025 {BFD_RELOC_NONE, R_NDS32_NONE},
3026 {BFD_RELOC_16, R_NDS32_16_RELA},
3027 {BFD_RELOC_32, R_NDS32_32_RELA},
fbaf61ad
NC
3028 {BFD_RELOC_VTABLE_INHERIT, R_NDS32_RELA_GNU_VTINHERIT},
3029 {BFD_RELOC_VTABLE_ENTRY, R_NDS32_RELA_GNU_VTENTRY},
3030
35c08157 3031 {BFD_RELOC_NDS32_20, R_NDS32_20_RELA},
35c08157
KLC
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},
35c08157
KLC
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},
fbaf61ad
NC
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},
35c08157
KLC
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},
fbaf61ad
NC
3059 {BFD_RELOC_NDS32_GOTOFF_HI20, R_NDS32_GOTOFF_HI20},
3060 {BFD_RELOC_NDS32_GOTOFF_LO12, R_NDS32_GOTOFF_LO12},
35c08157
KLC
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},
35c08157
KLC
3064 {BFD_RELOC_NDS32_GOTPC_HI20, R_NDS32_GOTPC_HI20},
3065 {BFD_RELOC_NDS32_GOTPC_LO12, R_NDS32_GOTPC_LO12},
35c08157
KLC
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},
fbaf61ad
NC
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},
35c08157
KLC
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},
35c08157
KLC
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},
35c08157
KLC
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},
fbaf61ad
NC
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},
35c08157
KLC
3105 {BFD_RELOC_NDS32_GOT15S2, R_NDS32_GOT15S2_RELA},
3106 {BFD_RELOC_NDS32_GOT17S2, R_NDS32_GOT17S2_RELA},
fbaf61ad
NC
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},
35c08157
KLC
3115 {BFD_RELOC_NDS32_PTR, R_NDS32_PTR},
3116 {BFD_RELOC_NDS32_PTR_COUNT, R_NDS32_PTR_COUNT},
35c08157 3117 {BFD_RELOC_NDS32_PTR_RESOLVED, R_NDS32_PTR_RESOLVED},
35c08157
KLC
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},
35c08157
KLC
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},
fbaf61ad 3127 {BFD_RELOC_NDS32_EMPTY, R_NDS32_EMPTY},
35c08157
KLC
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},
fbaf61ad
NC
3133 /* Not sure. */
3134 {BFD_RELOC_NDS32_TPOFF, R_NDS32_TLS_TPOFF},
3135 /* Missing: BFD_RELOC_NDS32_GOTTPOFF. */
1c8f6a4d
KLC
3136 {BFD_RELOC_NDS32_TLS_LE_HI20, R_NDS32_TLS_LE_HI20},
3137 {BFD_RELOC_NDS32_TLS_LE_LO12, R_NDS32_TLS_LE_LO12},
1c8f6a4d
KLC
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},
fbaf61ad
NC
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},
35c08157
KLC
3163};
3164
3165/* Patch tag. */
3166
3167static reloc_howto_type *
3168bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3169 const char *r_name)
3170{
3171 unsigned int i;
3172
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];
3177
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];
3182
3183 return NULL;
3184}
3185
3186static reloc_howto_type *
3187bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code)
3188{
3189 if (code < R_NDS32_RELAX_ENTRY)
3190 {
3191 BFD_ASSERT (code < ARRAY_SIZE (nds32_elf_howto_table));
3192 return &nds32_elf_howto_table[code];
3193 }
3194 else
3195 {
fbaf61ad
NC
3196 if ((size_t) (code - R_NDS32_RELAX_ENTRY)
3197 >= ARRAY_SIZE (nds32_elf_relax_howto_table))
3198 {
3199 int i = code;
3200 i += 1;
3201 }
3202
35c08157
KLC
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];
3206 }
3207}
3208
3209static reloc_howto_type *
3210bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3211 bfd_reloc_code_real_type code)
3212{
3213 unsigned int i;
3214
3215 for (i = 0; i < ARRAY_SIZE (nds32_reloc_map); i++)
3216 {
3217 if (nds32_reloc_map[i].bfd_reloc_val == code)
3218 return bfd_elf32_bfd_reloc_type_table_lookup
fbaf61ad 3219 (nds32_reloc_map[i].elf_reloc_val);
35c08157
KLC
3220 }
3221
3222 return NULL;
3223}
3224
3225/* Set the howto pointer for an NDS32 ELF reloc. */
3226
f3185997
NC
3227static bfd_boolean
3228nds32_info_to_howto_rel (bfd *abfd, arelent *cache_ptr,
35c08157
KLC
3229 Elf_Internal_Rela *dst)
3230{
3231 enum elf_nds32_reloc_type r_type;
3232
3233 r_type = ELF32_R_TYPE (dst->r_info);
5860e3f8
NC
3234 if (r_type > R_NDS32_GNU_VTENTRY)
3235 {
695344c0 3236 /* xgettext:c-format */
0aa13fee
AM
3237 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3238 abfd, r_type);
f3185997
NC
3239 bfd_set_error (bfd_error_bad_value);
3240 return FALSE;
5860e3f8 3241 }
fbaf61ad
NC
3242
3243 BFD_ASSERT (ELF32_R_TYPE (dst->r_info) <= R_NDS32_GNU_VTENTRY);
35c08157 3244 cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
f3185997 3245 return TRUE;
35c08157
KLC
3246}
3247
f3185997 3248static bfd_boolean
35c08157
KLC
3249nds32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
3250 Elf_Internal_Rela *dst)
3251{
f3185997
NC
3252 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
3253
3254 if ((r_type == R_NDS32_NONE)
3255 || ((r_type > R_NDS32_GNU_VTENTRY)
3256 && (r_type < R_NDS32_max)))
3257 {
3258 cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
3259 return TRUE;
3260 }
3261
3262 /* xgettext:c-format */
3263 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r_type);
3264 bfd_set_error (bfd_error_bad_value);
fbaf61ad 3265 return FALSE;
35c08157
KLC
3266}
3267
3268/* Support for core dump NOTE sections.
3269 Reference to include/linux/elfcore.h in Linux. */
3270
3271static bfd_boolean
3272nds32_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3273{
3274 int offset;
3275 size_t size;
3276
3277 switch (note->descsz)
3278 {
3279 case 0x114:
fbaf61ad 3280 /* Linux/NDS32 32-bit, ABI1. */
35c08157
KLC
3281
3282 /* pr_cursig */
3283 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3284
3285 /* pr_pid */
3286 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3287
3288 /* pr_reg */
3289 offset = 72;
3290 size = 200;
3291 break;
3292
3293 case 0xfc:
fbaf61ad 3294 /* Linux/NDS32 32-bit. */
35c08157
KLC
3295
3296 /* pr_cursig */
3297 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3298
3299 /* pr_pid */
3300 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3301
3302 /* pr_reg */
3303 offset = 72;
3304 size = 176;
3305 break;
3306
3307 default:
3308 return FALSE;
3309 }
3310
3311 /* Make a ".reg" section. */
3312 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3313 size, note->descpos + offset);
3314}
3315
3316static bfd_boolean
3317nds32_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3318{
3319 switch (note->descsz)
3320 {
3321 case 124:
fbaf61ad 3322 /* Linux/NDS32. */
35c08157
KLC
3323
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);
2b804145 3329 break;
35c08157
KLC
3330
3331 default:
3332 return FALSE;
3333 }
3334
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. */
3338 {
3339 char *command = elf_tdata (abfd)->core->command;
3340 int n = strlen (command);
3341
3342 if (0 < n && command[n - 1] == ' ')
3343 command[n - 1] = '\0';
3344 }
3345
3346 return TRUE;
3347}
3348
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
3352 linker sections. */
3353
3354static bfd_boolean
3355nds32_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)
3361{
3362 switch (sym->st_shndx)
3363 {
3364 case SHN_COMMON:
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)
3369 break;
3370
3371 /* st_value is the alignemnt constraint.
3372 That might be its actual size if it is an array or structure. */
3373 switch (sym->st_value)
3374 {
3375 case 1:
3376 *secp = bfd_make_section_old_way (abfd, ".scommon_b");
3377 break;
3378 case 2:
3379 *secp = bfd_make_section_old_way (abfd, ".scommon_h");
3380 break;
3381 case 4:
3382 *secp = bfd_make_section_old_way (abfd, ".scommon_w");
3383 break;
3384 case 8:
3385 *secp = bfd_make_section_old_way (abfd, ".scommon_d");
3386 break;
3387 default:
3388 return TRUE;
3389 }
3390
3391 (*secp)->flags |= SEC_IS_COMMON;
3392 *valp = sym->st_size;
3393 break;
3394 }
3395
3396 return TRUE;
3397}
3398
35c08157
KLC
3399/* This function can figure out the best location for a base register to access
3400 data relative to this base register
3401 INPUT:
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
3409 OUTPUT:
3410 offset (always positive) from the beginning of sda_d0 if OK
3411 a negative error value if fail
3412 NOTE:
3413 these 7 sections have to be located back to back if exist
3414 a pass in 0 value for non-existing section */
3415
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. */
3435
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. */
3441
3442static asection *sda_rela_sec = NULL;
3443
1c8f6a4d 3444#define SDA_SECTION_NUM 10
35c08157
KLC
3445
3446static bfd_reloc_status_type
fbaf61ad
NC
3447nds32_elf_final_sda_base (bfd * output_bfd,
3448 struct bfd_link_info * info,
3449 bfd_vma * psb,
3450 bfd_boolean add_symbol)
35c08157
KLC
3451{
3452 int relax_fp_as_gp;
3453 struct elf_nds32_link_hash_table *table;
3454 struct bfd_link_hash_entry *h, *h2;
1c8f6a4d 3455 long unsigned int total = 0;
fbaf61ad
NC
3456 asection *first = NULL, *final = NULL, *temp;
3457 bfd_vma sda_base = 0;
35c08157
KLC
3458
3459 h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE);
fbaf61ad
NC
3460 if (!h || (h->type != bfd_link_hash_defined
3461 && h->type != bfd_link_hash_defweak))
35c08157 3462 {
35c08157
KLC
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"
3465 4 byte-aligned. */
3466 static const char sec_name[SDA_SECTION_NUM][10] =
3467 {
3468 ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
1c8f6a4d 3469 ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
35c08157
KLC
3470 };
3471 size_t i = 0;
3472
3473 if (output_bfd->sections == NULL)
3474 {
3475 *psb = elf_gp (output_bfd);
3476 return bfd_reloc_ok;
3477 }
3478
3479 /* Get the first and final section. */
fbaf61ad 3480 while (i < ARRAY_SIZE (sec_name))
35c08157
KLC
3481 {
3482 temp = bfd_get_section_by_name (output_bfd, sec_name[i]);
3483 if (temp && !first && (temp->size != 0 || temp->rawsize != 0))
3484 first = temp;
3485 if (temp && (temp->size != 0 || temp->rawsize != 0))
3486 final = temp;
1c8f6a4d
KLC
3487
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;
3493
35c08157
KLC
3494 i++;
3495 }
3496
1c8f6a4d
KLC
3497 /* Check .bss size. */
3498 temp = bfd_get_section_by_name (output_bfd, ".bss");
3499 if (temp)
3500 {
3501 if (temp->size != 0)
3502 total += temp->size;
3503 else if (temp->rawsize != 0)
3504 total += temp->rawsize;
3505
3506 if (total < 0x80000)
3507 {
3508 if (!first && (temp->size != 0 || temp->rawsize != 0))
3509 first = temp;
3510 if ((temp->size != 0 || temp->rawsize != 0))
3511 final = temp;
3512 }
3513 }
3514
35c08157
KLC
3515 if (first && final)
3516 {
3517 /* The middle of data region. */
1c8f6a4d 3518 sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
35c08157
KLC
3519
3520 /* Find the section sda_base located. */
3521 i = 0;
fbaf61ad 3522 while (i < ARRAY_SIZE (sec_name))
35c08157
KLC
3523 {
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)
3527 {
3528 first = final;
3529 i++;
3530 }
3531 else
3532 break;
3533 }
3534 }
3535 else
3536 {
fbaf61ad
NC
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;
3541 while (temp)
3542 {
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))
3548 {
3549 if (!first)
3550 first = temp;
3551 final = temp;
3552 }
3553 temp = temp->next;
3554 }
3555
3556 /* There is no data or bss section. */
3557 if (!first || (first->size == 0 && first->rawsize == 0))
3558 {
3559 first = output_bfd->sections;
3560 while (first && first->size == 0 && first->rawsize == 0)
3561 first = first->next;
3562 }
3563
3564 /* There is no concrete section. */
35c08157
KLC
3565 if (!first)
3566 {
3567 *psb = elf_gp (output_bfd);
3568 return bfd_reloc_ok;
3569 }
fbaf61ad
NC
3570
3571 if (final && (final->vma + final->rawsize - first->vma) <= 0x4000)
3572 sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
3573 else
3574 sda_base = first->vma + 0x2000;
35c08157
KLC
3575 }
3576
3577 sda_base -= first->vma;
3578 sda_base = sda_base & (~7);
3579
3580 if (!_bfd_generic_link_add_one_symbol
fbaf61ad
NC
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))
35c08157
KLC
3584 return FALSE;
3585
3586 sda_rela_sec = first;
fbaf61ad 3587 }
35c08157 3588
fbaf61ad
NC
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. */
3594 if (!first)
3595 {
3596 first = h->u.def.section;
3597 sda_base = h->u.def.value;
3598 }
3599
3600 if (relax_fp_as_gp && h2
3601 && (h2->type == bfd_link_hash_undefweak
3602 || h2->type == bfd_link_hash_undefined))
3603 {
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))
3611 return FALSE;
35c08157
KLC
3612 }
3613
535b785f 3614 if (add_symbol)
35c08157
KLC
3615 {
3616 if (h)
3617 {
3618 /* Now set gp. */
3619 elf_gp (output_bfd) = (h->u.def.value
3620 + h->u.def.section->output_section->vma
3621 + h->u.def.section->output_offset);
3622 }
3623 else
3624 {
38f14ab8 3625 _bfd_error_handler (_("error: can't find symbol: %s"), "_SDA_BASE_");
35c08157
KLC
3626 return bfd_reloc_dangerous;
3627 }
3628 }
3629
fbaf61ad
NC
3630 *psb = h->u.def.value
3631 + h->u.def.section->output_section->vma
3632 + h->u.def.section->output_offset;
35c08157
KLC
3633 return bfd_reloc_ok;
3634}
3635\f
3636
3637/* Return size of a PLT entry. */
3638#define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
3639
35c08157
KLC
3640/* Create an entry in an nds32 ELF linker hash table. */
3641
3642static struct bfd_hash_entry *
3643nds32_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
3644 struct bfd_hash_table *table,
3645 const char *string)
3646{
3647 struct elf_nds32_link_hash_entry *ret;
3648
3649 ret = (struct elf_nds32_link_hash_entry *) entry;
3650
3651 /* Allocate the structure if it has not already been allocated by a
3652 subclass. */
3653 if (ret == NULL)
3654 ret = (struct elf_nds32_link_hash_entry *)
3655 bfd_hash_allocate (table, sizeof (struct elf_nds32_link_hash_entry));
3656
3657 if (ret == NULL)
3658 return (struct bfd_hash_entry *) ret;
3659
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);
3663
3664 if (ret != NULL)
3665 {
3666 struct elf_nds32_link_hash_entry *eh;
3667
3668 eh = (struct elf_nds32_link_hash_entry *) ret;
1c8f6a4d 3669 eh->tls_type = GOT_UNKNOWN;
fbaf61ad 3670 eh->offset_to_gp = 0;
35c08157
KLC
3671 }
3672
3673 return (struct bfd_hash_entry *) ret;
3674}
3675
3676/* Create an nds32 ELF linker hash table. */
3677
3678static struct bfd_link_hash_table *
3679nds32_elf_link_hash_table_create (bfd *abfd)
3680{
3681 struct elf_nds32_link_hash_table *ret;
3682
986f0783 3683 size_t amt = sizeof (struct elf_nds32_link_hash_table);
35c08157
KLC
3684
3685 ret = (struct elf_nds32_link_hash_table *) bfd_zmalloc (amt);
3686 if (ret == NULL)
3687 return NULL;
3688
fbaf61ad 3689 /* Patch tag. */
35c08157
KLC
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),
3693 NDS32_ELF_DATA))
3694 {
3695 free (ret);
3696 return NULL;
3697 }
3698
fbaf61ad
NC
3699 ret->sdynbss = NULL;
3700 ret->srelbss = NULL;
3701 ret->sym_ld_script = NULL;
3702
35c08157
KLC
3703 return &ret->root.root;
3704}
3705
fbaf61ad
NC
3706/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3707 shortcuts to them in our hash table. */
3708
3709static bfd_boolean
3710create_got_section (bfd *dynobj, struct bfd_link_info *info)
3711{
3712 struct elf_link_hash_table *ehtab;
3713
3714 if (!_bfd_elf_create_got_section (dynobj, info))
3715 return FALSE;
3716
3717 ehtab = elf_hash_table (info);
3718 ehtab->sgot = bfd_get_section_by_name (dynobj, ".got");
3719 ehtab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
3720 if (!ehtab->sgot || !ehtab->sgotplt)
3721 abort ();
3722
3723 /* _bfd_elf_create_got_section will create it for us. */
3724 ehtab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3725 if (ehtab->srelgot == NULL
fd361982 3726 || !bfd_set_section_flags (ehtab->srelgot,
fbaf61ad
NC
3727 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3728 | SEC_IN_MEMORY | SEC_LINKER_CREATED
3729 | SEC_READONLY))
fd361982 3730 || !bfd_set_section_alignment (ehtab->srelgot, 2))
fbaf61ad
NC
3731 return FALSE;
3732
3733 return TRUE;
3734}
3735
35c08157
KLC
3736/* Create dynamic sections when linking against a dynamic object. */
3737
3738static bfd_boolean
3739nds32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3740{
fbaf61ad 3741 struct elf_link_hash_table *ehtab;
35c08157
KLC
3742 struct elf_nds32_link_hash_table *htab;
3743 flagword flags, pltflags;
3744 register asection *s;
3745 const struct elf_backend_data *bed;
3746 int ptralign = 2; /* 32-bit */
fbaf61ad
NC
3747 const char *secname;
3748 char *relname;
3749 flagword secflags;
3750 asection *sec;
35c08157
KLC
3751
3752 bed = get_elf_backend_data (abfd);
fbaf61ad 3753 ehtab = elf_hash_table (info);
35c08157
KLC
3754 htab = nds32_elf_hash_table (info);
3755
3756 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3757 .rel[a].bss sections. */
3758
3759 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3760 | SEC_LINKER_CREATED);
3761
3762 pltflags = flags;
3763 pltflags |= SEC_CODE;
3764 if (bed->plt_not_loaded)
3765 pltflags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
3766 if (bed->plt_readonly)
3767 pltflags |= SEC_READONLY;
3768
3769 s = bfd_make_section (abfd, ".plt");
fbaf61ad 3770 ehtab->splt = s;
35c08157 3771 if (s == NULL
fd361982
AM
3772 || !bfd_set_section_flags (s, pltflags)
3773 || !bfd_set_section_alignment (s, bed->plt_alignment))
35c08157
KLC
3774 return FALSE;
3775
3776 if (bed->want_plt_sym)
3777 {
3778 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3779 .plt section. */
3780 struct bfd_link_hash_entry *bh = NULL;
3781 struct elf_link_hash_entry *h;
3782
3783 if (!(_bfd_generic_link_add_one_symbol
3784 (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3785 (bfd_vma) 0, (const char *) NULL, FALSE,
3786 get_elf_backend_data (abfd)->collect, &bh)))
3787 return FALSE;
3788
3789 h = (struct elf_link_hash_entry *) bh;
3790 h->def_regular = 1;
3791 h->type = STT_OBJECT;
3792
0e1862bb 3793 if (bfd_link_pic (info) && !bfd_elf_link_record_dynamic_symbol (info, h))
35c08157
KLC
3794 return FALSE;
3795 }
3796
3797 s = bfd_make_section (abfd,
3798 bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
fbaf61ad 3799 ehtab->srelplt = s;
35c08157 3800 if (s == NULL
fd361982
AM
3801 || !bfd_set_section_flags (s, flags | SEC_READONLY)
3802 || !bfd_set_section_alignment (s, ptralign))
35c08157
KLC
3803 return FALSE;
3804
fbaf61ad 3805 if (ehtab->sgot == NULL && !create_got_section (abfd, info))
35c08157
KLC
3806 return FALSE;
3807
fbaf61ad
NC
3808 for (sec = abfd->sections; sec; sec = sec->next)
3809 {
fd361982 3810 secflags = bfd_section_flags (sec);
fbaf61ad
NC
3811 if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3812 || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3813 continue;
fd361982 3814 secname = bfd_section_name (sec);
fbaf61ad
NC
3815 relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
3816 strcpy (relname, ".rela");
3817 strcat (relname, secname);
3818 if (bfd_get_section_by_name (abfd, secname))
3819 continue;
3820 s = bfd_make_section (abfd, relname);
3821 if (s == NULL
fd361982
AM
3822 || !bfd_set_section_flags (s, flags | SEC_READONLY)
3823 || !bfd_set_section_alignment (s, ptralign))
fbaf61ad
NC
3824 return FALSE;
3825 }
35c08157
KLC
3826
3827 if (bed->want_dynbss)
3828 {
3829 /* The .dynbss section is a place to put symbols which are defined
3830 by dynamic objects, are referenced by regular objects, and are
3831 not functions. We must allocate space for them in the process
3832 image and use a R_*_COPY reloc to tell the dynamic linker to
3833 initialize them at run time. The linker script puts the .dynbss
3834 section into the .bss section of the final image. */
3835 s = bfd_make_section (abfd, ".dynbss");
3836 htab->sdynbss = s;
3837 if (s == NULL
fd361982 3838 || !bfd_set_section_flags (s, SEC_ALLOC | SEC_LINKER_CREATED))
35c08157
KLC
3839 return FALSE;
3840 /* The .rel[a].bss section holds copy relocs. This section is not
3841 normally needed. We need to create it here, though, so that the
3842 linker will map it to an output section. We can't just create it
3843 only if we need it, because we will not know whether we need it
3844 until we have seen all the input files, and the first time the
3845 main linker code calls BFD after examining all the input files
3846 (size_dynamic_sections) the input sections have already been
3847 mapped to the output sections. If the section turns out not to
3848 be needed, we can discard it later. We will never need this
3849 section when generating a shared object, since they do not use
3850 copy relocs. */
0e1862bb 3851 if (!bfd_link_pic (info))
35c08157
KLC
3852 {
3853 s = bfd_make_section (abfd, (bed->default_use_rela_p
3854 ? ".rela.bss" : ".rel.bss"));
3855 htab->srelbss = s;
3856 if (s == NULL
fd361982
AM
3857 || !bfd_set_section_flags (s, flags | SEC_READONLY)
3858 || !bfd_set_section_alignment (s, ptralign))
35c08157
KLC
3859 return FALSE;
3860 }
3861 }
3862
3863 return TRUE;
3864}
3865
3866/* Copy the extra info we tack onto an elf_link_hash_entry. */
3867static void
3868nds32_elf_copy_indirect_symbol (struct bfd_link_info *info,
3869 struct elf_link_hash_entry *dir,
3870 struct elf_link_hash_entry *ind)
3871{
3872 struct elf_nds32_link_hash_entry *edir, *eind;
3873
3874 edir = (struct elf_nds32_link_hash_entry *) dir;
3875 eind = (struct elf_nds32_link_hash_entry *) ind;
3876
fbaf61ad
NC
3877 if (ind->root.type == bfd_link_hash_indirect)
3878 {
3879 if (dir->got.refcount <= 0)
3880 {
3881 edir->tls_type = eind->tls_type;
3882 eind->tls_type = GOT_UNKNOWN;
3883 }
3884 }
3885
35c08157
KLC
3886 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3887}
3888\f
35c08157
KLC
3889/* Adjust a symbol defined by a dynamic object and referenced by a
3890 regular object. The current definition is in some section of the
3891 dynamic object, but we're not including those sections. We have to
3892 change the definition to something the rest of the link can
3893 understand. */
3894
3895static bfd_boolean
3896nds32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3897 struct elf_link_hash_entry *h)
3898{
3899 struct elf_nds32_link_hash_table *htab;
35c08157
KLC
3900 bfd *dynobj;
3901 asection *s;
3902 unsigned int power_of_two;
3903
3904 dynobj = elf_hash_table (info)->dynobj;
3905
3906 /* Make sure we know what is going on here. */
3907 BFD_ASSERT (dynobj != NULL
3908 && (h->needs_plt
60d67dc8 3909 || h->is_weakalias
35c08157
KLC
3910 || (h->def_dynamic && h->ref_regular && !h->def_regular)));
3911
3912
3913 /* If this is a function, put it in the procedure linkage table. We
3914 will fill in the contents of the procedure linkage table later,
3915 when we know the address of the .got section. */
3916 if (h->type == STT_FUNC || h->needs_plt)
3917 {
0e1862bb 3918 if (!bfd_link_pic (info)
35c08157
KLC
3919 && !h->def_dynamic
3920 && !h->ref_dynamic
3921 && h->root.type != bfd_link_hash_undefweak
3922 && h->root.type != bfd_link_hash_undefined)
3923 {
3924 /* This case can occur if we saw a PLT reloc in an input
3925 file, but the symbol was never referred to by a dynamic
3926 object. In such a case, we don't actually need to build
3927 a procedure linkage table, and we can just do a PCREL
3928 reloc instead. */
3929 h->plt.offset = (bfd_vma) - 1;
3930 h->needs_plt = 0;
3931 }
3932
3933 return TRUE;
3934 }
3935 else
3936 h->plt.offset = (bfd_vma) - 1;
3937
3938 /* If this is a weak symbol, and there is a real definition, the
3939 processor independent code will have arranged for us to see the
3940 real definition first, and we can just use the same value. */
60d67dc8 3941 if (h->is_weakalias)
35c08157 3942 {
60d67dc8
AM
3943 struct elf_link_hash_entry *def = weakdef (h);
3944 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
3945 h->root.u.def.section = def->root.u.def.section;
3946 h->root.u.def.value = def->root.u.def.value;
35c08157
KLC
3947 return TRUE;
3948 }
3949
3950 /* This is a reference to a symbol defined by a dynamic object which
3951 is not a function. */
3952
3953 /* If we are creating a shared library, we must presume that the
3954 only references to the symbol are via the global offset table.
3955 For such cases we need not do anything here; the relocations will
3956 be handled correctly by relocate_section. */
0e1862bb 3957 if (bfd_link_pic (info))
35c08157
KLC
3958 return TRUE;
3959
3960 /* If there are no references to this symbol that do not use the
3961 GOT, we don't need to generate a copy reloc. */
3962 if (!h->non_got_ref)
3963 return TRUE;
3964
3965 /* If -z nocopyreloc was given, we won't generate them either. */
3bf083ed 3966 if (0 && info->nocopyreloc)
35c08157
KLC
3967 {
3968 h->non_got_ref = 0;
3969 return TRUE;
3970 }
3971
3bf083ed
AM
3972 /* If we don't find any dynamic relocs in read-only sections, then
3973 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
5dbc8b37 3974 if (!_bfd_elf_readonly_dynrelocs (h))
35c08157
KLC
3975 {
3976 h->non_got_ref = 0;
3977 return TRUE;
3978 }
3979
3980 /* We must allocate the symbol in our .dynbss section, which will
3981 become part of the .bss section of the executable. There will be
3982 an entry for this symbol in the .dynsym section. The dynamic
3983 object will contain position independent code, so all references
3984 from the dynamic object to this symbol will go through the global
3985 offset table. The dynamic linker will use the .dynsym entry to
3986 determine the address it must put in the global offset table, so
3987 both the dynamic object and the regular object will refer to the
3988 same memory location for the variable. */
3989
3990 htab = nds32_elf_hash_table (info);
3991 s = htab->sdynbss;
3992 BFD_ASSERT (s != NULL);
3993
3994 /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
3995 to copy the initial value out of the dynamic object and into the
3996 runtime process image. We need to remember the offset into the
3997 .rela.bss section we are going to use. */
3998 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3999 {
4000 asection *srel;
4001
4002 srel = htab->srelbss;
4003 BFD_ASSERT (srel != NULL);
4004 srel->size += sizeof (Elf32_External_Rela);
4005 h->needs_copy = 1;
4006 }
4007
4008 /* We need to figure out the alignment required for this symbol. I
4009 have no idea how ELF linkers handle this. */
4010 power_of_two = bfd_log2 (h->size);
4011 if (power_of_two > 3)
4012 power_of_two = 3;
4013
4014 /* Apply the required alignment. */
4015 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
fd361982 4016 if (power_of_two > bfd_section_alignment (s))
35c08157 4017 {
fd361982 4018 if (!bfd_set_section_alignment (s, power_of_two))
35c08157
KLC
4019 return FALSE;
4020 }
4021
4022 /* Define the symbol as being at this point in the section. */
4023 h->root.u.def.section = s;
4024 h->root.u.def.value = s->size;
4025
4026 /* Increment the section size to make room for the symbol. */
4027 s->size += h->size;
4028
4029 return TRUE;
4030}
4031
4032/* Allocate space in .plt, .got and associated reloc sections for
4033 dynamic relocs. */
4034
4035static bfd_boolean
4036allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
4037{
4038 struct bfd_link_info *info;
fbaf61ad 4039 struct elf_link_hash_table *ehtab;
35c08157 4040 struct elf_nds32_link_hash_table *htab;
3bf083ed 4041 struct elf_dyn_relocs *p;
35c08157
KLC
4042
4043 if (h->root.type == bfd_link_hash_indirect)
4044 return TRUE;
4045
fbaf61ad
NC
4046 /* When warning symbols are created, they **replace** the "real"
4047 entry in the hash table, thus we never get to see the real
4048 symbol in a hash traversal. So look at it now. */
35c08157 4049 if (h->root.type == bfd_link_hash_warning)
35c08157
KLC
4050 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4051
4052 info = (struct bfd_link_info *) inf;
fbaf61ad 4053 ehtab = elf_hash_table (info);
35c08157 4054 htab = nds32_elf_hash_table (info);
fbaf61ad
NC
4055 if (htab == NULL)
4056 return FALSE;
35c08157 4057
fbaf61ad
NC
4058 if ((htab->root.dynamic_sections_created || h->type == STT_GNU_IFUNC)
4059 && h->plt.refcount > 0
4060 && !(bfd_link_pie (info) && h->def_regular))
35c08157
KLC
4061 {
4062 /* Make sure this symbol is output as a dynamic symbol.
4063 Undefined weak syms won't yet be marked as dynamic. */
4064 if (h->dynindx == -1 && !h->forced_local)
4065 {
4066 if (!bfd_elf_link_record_dynamic_symbol (info, h))
4067 return FALSE;
4068 }
4069
0e1862bb 4070 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
35c08157 4071 {
fbaf61ad 4072 asection *s = ehtab->splt;
35c08157
KLC
4073
4074 /* If this is the first .plt entry, make room for the special
4075 first entry. */
4076 if (s->size == 0)
4077 s->size += PLT_ENTRY_SIZE;
4078
4079 h->plt.offset = s->size;
4080
4081 /* If this symbol is not defined in a regular file, and we are
4082 not generating a shared library, then set the symbol to this
4083 location in the .plt. This is required to make function
4084 pointers compare as equal between the normal executable and
4085 the shared library. */
0e1862bb 4086 if (!bfd_link_pic (info) && !h->def_regular)
35c08157
KLC
4087 {
4088 h->root.u.def.section = s;
4089 h->root.u.def.value = h->plt.offset;
4090 }
4091
4092 /* Make room for this entry. */
4093 s->size += PLT_ENTRY_SIZE;
4094
4095 /* We also need to make an entry in the .got.plt section, which
4096 will be placed in the .got section by the linker script. */
fbaf61ad 4097 ehtab->sgotplt->size += 4;
35c08157
KLC
4098
4099 /* We also need to make an entry in the .rel.plt section. */
fbaf61ad
NC
4100 ehtab->srelplt->size += sizeof (Elf32_External_Rela);
4101 if (htab->tls_desc_trampoline)
4102 htab->next_tls_desc_index++;
35c08157
KLC
4103 }
4104 else
4105 {
4106 h->plt.offset = (bfd_vma) - 1;
4107 h->needs_plt = 0;
4108 }
4109 }
4110 else
4111 {
4112 h->plt.offset = (bfd_vma) - 1;
4113 h->needs_plt = 0;
4114 }
4115
4116 if (h->got.refcount > 0)
4117 {
fbaf61ad 4118 asection *sgot;
35c08157 4119 bfd_boolean dyn;
1c8f6a4d 4120 int tls_type = elf32_nds32_hash_entry (h)->tls_type;
35c08157
KLC
4121
4122 /* Make sure this symbol is output as a dynamic symbol.
4123 Undefined weak syms won't yet be marked as dynamic. */
4124 if (h->dynindx == -1 && !h->forced_local)
4125 {
4126 if (!bfd_elf_link_record_dynamic_symbol (info, h))
4127 return FALSE;
4128 }
4129
fbaf61ad
NC
4130 sgot = elf_hash_table (info)->sgot;
4131 h->got.offset = sgot->size;
1c8f6a4d
KLC
4132
4133 if (tls_type == GOT_UNKNOWN)
4134 abort ();
fbaf61ad
NC
4135
4136 /* Non-TLS symbols, and TLS_IE need one GOT slot. */
4137 if (tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP))
4138 sgot->size += 4;
4139 else
4140 {
4141 /* TLS_DESC, TLS_GD, and TLS_LD need 2 consecutive GOT slots. */
4142 if (tls_type & GOT_TLS_DESC)
4143 sgot->size += 8;
4144 }
1c8f6a4d 4145
35c08157 4146 dyn = htab->root.dynamic_sections_created;
fbaf61ad 4147
0e1862bb 4148 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
fbaf61ad
NC
4149 {
4150 if (tls_type == GOT_TLS_DESC && htab->tls_desc_trampoline)
4151 {
4152 /* TLS_DESC with trampoline needs a relocation slot
4153 within .rela.plt. */
4154 htab->num_tls_desc++;
4155 ehtab->srelplt->size += sizeof (Elf32_External_Rela);
4156 htab->tls_trampoline = -1;
4157 }
4158 else
4159 {
4160 /* other relocations, including TLS_DESC without trampoline, need
4161 a relocation slot within .rela.got. */
4162 ehtab->srelgot->size += sizeof (Elf32_External_Rela);
4163 }
4164 }
35c08157
KLC
4165 }
4166 else
fbaf61ad 4167 h->got.offset = (bfd_vma)-1;
35c08157 4168
190eb1dd 4169 if (h->dyn_relocs == NULL)
35c08157
KLC
4170 return TRUE;
4171
4172 /* In the shared -Bsymbolic case, discard space allocated for
4173 dynamic pc-relative relocs against symbols which turn out to be
4174 defined in regular objects. For the normal shared case, discard
4175 space for pc-relative relocs that have become local due to symbol
4176 visibility changes. */
4177
0e1862bb 4178 if (bfd_link_pic (info))
35c08157
KLC
4179 {
4180 if (h->def_regular && (h->forced_local || info->symbolic))
4181 {
3bf083ed 4182 struct elf_dyn_relocs **pp;
35c08157 4183
190eb1dd 4184 for (pp = &h->dyn_relocs; (p = *pp) != NULL;)
35c08157
KLC
4185 {
4186 p->count -= p->pc_count;
4187 p->pc_count = 0;
4188 if (p->count == 0)
4189 *pp = p->next;
4190 else
4191 pp = &p->next;
4192 }
4193 }
4194 }
4195 else
4196 {
4197 /* For the non-shared case, discard space for relocs against
4198 symbols which turn out to need copy relocs or are not dynamic. */
4199
4200 if (!h->non_got_ref
4201 && ((h->def_dynamic
4202 && !h->def_regular)
4203 || (htab->root.dynamic_sections_created
4204 && (h->root.type == bfd_link_hash_undefweak
4205 || h->root.type == bfd_link_hash_undefined))))
4206 {
4207 /* Make sure this symbol is output as a dynamic symbol.
4208 Undefined weak syms won't yet be marked as dynamic. */
4209 if (h->dynindx == -1 && !h->forced_local)
4210 {
4211 if (!bfd_elf_link_record_dynamic_symbol (info, h))
4212 return FALSE;
4213 }
4214
4215 /* If that succeeded, we know we'll be keeping all the
4216 relocs. */
4217 if (h->dynindx != -1)
4218 goto keep;
4219 }
4220
190eb1dd 4221 h->dyn_relocs = NULL;
35c08157 4222
dc1e8a47 4223 keep:;
35c08157
KLC
4224 }
4225
4226 /* Finally, allocate space. */
190eb1dd 4227 for (p = h->dyn_relocs; p != NULL; p = p->next)
35c08157
KLC
4228 {
4229 asection *sreloc = elf_section_data (p->sec)->sreloc;
4230 sreloc->size += p->count * sizeof (Elf32_External_Rela);
4231 }
4232
4233 return TRUE;
4234}
4235
fbaf61ad
NC
4236/* Add relocation REL to the end of relocation section SRELOC. */
4237
4238static void
4239elf32_nds32_add_dynreloc (bfd *output_bfd,
4240 struct bfd_link_info *info ATTRIBUTE_UNUSED,
4241 asection *sreloc, Elf_Internal_Rela *rel)
4242{
4243 bfd_byte *loc;
4244 if (sreloc == NULL)
4245 abort ();
4246
4247 loc = sreloc->contents;
4248 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4249 if (sreloc->reloc_count * sizeof (Elf32_External_Rela) > sreloc->size)
4250 abort ();
4251
4252 bfd_elf32_swap_reloca_out (output_bfd, rel, loc);
4253}
4254
35c08157
KLC
4255/* Set the sizes of the dynamic sections. */
4256
4257static bfd_boolean
4258nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4259 struct bfd_link_info *info)
4260{
4261 struct elf_nds32_link_hash_table *htab;
4262 bfd *dynobj;
4263 asection *s;
4264 bfd_boolean relocs;
fbaf61ad 4265 bfd_boolean plt;
35c08157
KLC
4266 bfd *ibfd;
4267
4268 htab = nds32_elf_hash_table (info);
fbaf61ad
NC
4269 if (htab == NULL)
4270 return FALSE;
4271
4272 dynobj = elf_hash_table (info)->dynobj;
35c08157
KLC
4273 BFD_ASSERT (dynobj != NULL);
4274
fbaf61ad 4275 if (elf_hash_table (info)->dynamic_sections_created)
35c08157
KLC
4276 {
4277 /* Set the contents of the .interp section to the interpreter. */
f5233a16 4278 if (bfd_link_executable (info) && !info->nointerp)
35c08157
KLC
4279 {
4280 s = bfd_get_section_by_name (dynobj, ".interp");
4281 BFD_ASSERT (s != NULL);
4282 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4283 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4284 }
4285 }
4286
4287 /* Set up .got offsets for local syms, and space for local dynamic
4288 relocs. */
c72f2fb2 4289 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
35c08157
KLC
4290 {
4291 bfd_signed_vma *local_got;
4292 bfd_signed_vma *end_local_got;
4293 bfd_size_type locsymcount;
4294 Elf_Internal_Shdr *symtab_hdr;
fbaf61ad
NC
4295 asection *sgot;
4296 char *local_tls_type;
4297 unsigned long symndx;
4298 bfd_vma *local_tlsdesc_gotent;
35c08157
KLC
4299
4300 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4301 continue;
4302
4303 for (s = ibfd->sections; s != NULL; s = s->next)
4304 {
3bf083ed 4305 struct elf_dyn_relocs *p;
35c08157 4306
3bf083ed 4307 for (p = ((struct elf_dyn_relocs *)
35c08157
KLC
4308 elf_section_data (s)->local_dynrel);
4309 p != NULL; p = p->next)
4310 {
4311 if (!bfd_is_abs_section (p->sec)
4312 && bfd_is_abs_section (p->sec->output_section))
4313 {
4314 /* Input section has been discarded, either because
4315 it is a copy of a linkonce section or due to
4316 linker script /DISCARD/, so we'll be discarding
4317 the relocs too. */
4318 }
4319 else if (p->count != 0)
4320 {
fbaf61ad
NC
4321 asection *sreloc = elf_section_data (p->sec)->sreloc;
4322 sreloc->size += p->count * sizeof (Elf32_External_Rela);
35c08157
KLC
4323 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4324 info->flags |= DF_TEXTREL;
4325 }
4326 }
4327 }
4328
4329 local_got = elf_local_got_refcounts (ibfd);
4330 if (!local_got)
4331 continue;
4332
4333 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4334 locsymcount = symtab_hdr->sh_info;
4335 end_local_got = local_got + locsymcount;
fbaf61ad
NC
4336 sgot = elf_hash_table (info)->sgot;
4337 local_tls_type = elf32_nds32_local_got_tls_type (ibfd);
4338 local_tlsdesc_gotent = elf32_nds32_local_tlsdesc_gotent (ibfd);
4339 for (symndx = 0; local_got < end_local_got;
4340 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent, ++symndx)
35c08157
KLC
4341 {
4342 if (*local_got > 0)
4343 {
fbaf61ad
NC
4344 int num_of_got_entry_needed = 0;
4345 *local_got = sgot->size;
4346 *local_tlsdesc_gotent = sgot->size;
4347
4348 /* TLS_NORMAL, and TLS_IE need one slot in .got. */
4349 if (*local_tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP))
4350 num_of_got_entry_needed = 1;
4351 /* TLS_GD, TLS_LD, and TLS_DESC need an 8-byte structure in the GOT. */
4352 else if (*local_tls_type & GOT_TLS_DESC)
4353 num_of_got_entry_needed = 2;
4354
4355 sgot->size += (num_of_got_entry_needed << 2);
4356
4357 /* non-relax-able TLS_DESCs need a slot in .rela.plt.
4358 others need a slot in .rela.got. */
4359 if (*local_tls_type == GOT_TLS_DESC)
4360 {
4361 if (bfd_link_pic (info))
4362 {
4363 if (htab->tls_desc_trampoline)
4364 {
4365 htab->num_tls_desc++;
4366 htab->root.srelplt->size += sizeof (Elf32_External_Rela);
4367 htab->tls_trampoline = -1;
4368 }
4369 else
4370 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4371 }
4372 else
4373 {
4374 /* TLS_DESC -> TLS_LE */
4375 }
4376 }
4377 else
4378 {
4379 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4380 }
35c08157
KLC
4381 }
4382 else
fbaf61ad
NC
4383 {
4384 *local_got = (bfd_vma) -1;
4385 *local_tlsdesc_gotent = (bfd_vma) -1;
4386 }
35c08157
KLC
4387 }
4388 }
4389
4390 /* Allocate global sym .plt and .got entries, and space for global
4391 sym dynamic relocs. */
4392 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (void *) info);
4393
fbaf61ad
NC
4394 /* For every jump slot reserved in the sgotplt, reloc_count is
4395 incremented. However, when we reserve space for TLS descriptors,
4396 it's not incremented, so in order to compute the space reserved
4397 for them, it suffices to multiply the reloc count by the jump
4398 slot size. */
4399 if (htab->tls_desc_trampoline && htab->root.srelplt)
4400 htab->sgotplt_jump_table_size = elf32_nds32_compute_jump_table_size (htab);
4401
4402 if (htab->tls_trampoline)
4403 {
4404 htab->tls_trampoline = htab->root.splt->size;
4405
4406 /* If we're not using lazy TLS relocations, don't generate the
4407 PLT and GOT entries they require. */
4408 if (!(info->flags & DF_BIND_NOW))
4409 {
4410 htab->dt_tlsdesc_got = htab->root.sgot->size;
4411 htab->root.sgot->size += 4;
4412
4413 htab->dt_tlsdesc_plt = htab->root.splt->size;
4414 htab->root.splt->size += 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline);
4415 }
4416 }
4417
35c08157
KLC
4418 /* We now have determined the sizes of the various dynamic sections.
4419 Allocate memory for them. */
fbaf61ad
NC
4420 /* The check_relocs and adjust_dynamic_symbol entry points have
4421 determined the sizes of the various dynamic sections. Allocate
4422 memory for them. */
4423 plt = FALSE;
35c08157
KLC
4424 relocs = FALSE;
4425 for (s = dynobj->sections; s != NULL; s = s->next)
4426 {
4427 if ((s->flags & SEC_LINKER_CREATED) == 0)
4428 continue;
4429
ce558b89 4430 if (s == htab->root.splt)
35c08157
KLC
4431 {
4432 /* Strip this section if we don't need it; see the
4433 comment below. */
fbaf61ad 4434 plt = s->size != 0;
35c08157 4435 }
fbaf61ad 4436 else if (s == elf_hash_table (info)->sgot)
35c08157
KLC
4437 {
4438 got_size += s->size;
4439 }
fbaf61ad 4440 else if (s == elf_hash_table (info)->sgotplt)
35c08157
KLC
4441 {
4442 got_size += s->size;
4443 }
fd361982 4444 else if (strncmp (bfd_section_name (s), ".rela", 5) == 0)
35c08157 4445 {
fbaf61ad 4446 if (s->size != 0 && s != elf_hash_table (info)->srelplt)
35c08157
KLC
4447 relocs = TRUE;
4448
4449 /* We use the reloc_count field as a counter if we need
4450 to copy relocs into the output file. */
4451 s->reloc_count = 0;
4452 }
4453 else
4454 {
4455 /* It's not one of our sections, so don't allocate space. */
4456 continue;
4457 }
4458
4459 if (s->size == 0)
4460 {
4461 /* If we don't need this section, strip it from the
4462 output file. This is mostly to handle .rela.bss and
4463 .rela.plt. We must create both sections in
4464 create_dynamic_sections, because they must be created
4465 before the linker maps input sections to output
4466 sections. The linker does that before
4467 adjust_dynamic_symbol is called, and it is that
4468 function which decides whether anything needs to go
4469 into these sections. */
4470 s->flags |= SEC_EXCLUDE;
4471 continue;
4472 }
4473
4474 /* Allocate memory for the section contents. We use bfd_zalloc
4475 here in case unused entries are not reclaimed before the
4476 section's contents are written out. This should not happen,
4477 but this way if it does, we get a R_NDS32_NONE reloc instead
4478 of garbage. */
4479 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4480 if (s->contents == NULL)
4481 return FALSE;
4482 }
4483
4484
4485 if (htab->root.dynamic_sections_created)
4486 {
4487 /* Add some entries to the .dynamic section. We fill in the
4488 values later, in nds32_elf_finish_dynamic_sections, but we
4489 must add the entries now so that we get the correct size for
4490 the .dynamic section. The DT_DEBUG entry is filled in by the
4491 dynamic linker and used by the debugger. */
4492#define add_dynamic_entry(TAG, VAL) \
4493 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4494
fbaf61ad 4495 if (bfd_link_executable (info))
35c08157
KLC
4496 {
4497 if (!add_dynamic_entry (DT_DEBUG, 0))
4498 return FALSE;
4499 }
4500
fbaf61ad 4501 if (elf_hash_table (info)->splt->size != 0)
35c08157
KLC
4502 {
4503 if (!add_dynamic_entry (DT_PLTGOT, 0)
4504 || !add_dynamic_entry (DT_PLTRELSZ, 0)
4505 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4506 || !add_dynamic_entry (DT_JMPREL, 0))
4507 return FALSE;
4508 }
4509
fbaf61ad
NC
4510 if (htab->tls_desc_trampoline && plt)
4511 {
4512 if (htab->dt_tlsdesc_plt
4513 && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
4514 || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
4515 return FALSE;
4516 }
4517
35c08157
KLC
4518 if (relocs)
4519 {
4520 if (!add_dynamic_entry (DT_RELA, 0)
4521 || !add_dynamic_entry (DT_RELASZ, 0)
4522 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4523 return FALSE;
4524
4525 /* If any dynamic relocs apply to a read-only section,
4526 then we need a DT_TEXTREL entry. */
4527 if ((info->flags & DF_TEXTREL) == 0)
d49e5065
L
4528 elf_link_hash_traverse (&htab->root,
4529 _bfd_elf_maybe_set_textrel,
35c08157
KLC
4530 (void *) info);
4531
4532 if ((info->flags & DF_TEXTREL) != 0)
4533 {
4534 if (!add_dynamic_entry (DT_TEXTREL, 0))
4535 return FALSE;
4536 }
4537 }
4538 }
4539#undef add_dynamic_entry
4540
4541 return TRUE;
4542}
4543
4544static bfd_reloc_status_type
4545nds32_relocate_contents (reloc_howto_type *howto, bfd *input_bfd,
4546 bfd_vma relocation, bfd_byte *location)
4547{
4548 int size;
4549 bfd_vma x = 0;
4550 bfd_reloc_status_type flag;
4551 unsigned int rightshift = howto->rightshift;
4552 unsigned int bitpos = howto->bitpos;
4553
4554 /* If the size is negative, negate RELOCATION. This isn't very
4555 general. */
4556 if (howto->size < 0)
4557 relocation = -relocation;
4558
4559 /* Get the value we are going to relocate. */
4560 size = bfd_get_reloc_size (howto);
4561 switch (size)
4562 {
4563 default:
35c08157
KLC
4564 abort ();
4565 break;
6346d5ca
AM
4566 case 0:
4567 return bfd_reloc_ok;
35c08157
KLC
4568 case 2:
4569 x = bfd_getb16 (location);
4570 break;
4571 case 4:
4572 x = bfd_getb32 (location);
4573 break;
4574 }
4575
4576 /* Check for overflow. FIXME: We may drop bits during the addition
4577 which we don't check for. We must either check at every single
4578 operation, which would be tedious, or we must do the computations
4579 in a type larger than bfd_vma, which would be inefficient. */
4580 flag = bfd_reloc_ok;
4581 if (howto->complain_on_overflow != complain_overflow_dont)
4582 {
4583 bfd_vma addrmask, fieldmask, signmask, ss;
4584 bfd_vma a, b, sum;
4585
4586 /* Get the values to be added together. For signed and unsigned
4587 relocations, we assume that all values should be truncated to
4588 the size of an address. For bitfields, all the bits matter.
4589 See also bfd_check_overflow. */
4590 fieldmask = N_ONES (howto->bitsize);
4591 signmask = ~fieldmask;
4592 addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
4593 a = (relocation & addrmask) >> rightshift;
4594 b = (x & howto->src_mask & addrmask) >> bitpos;
4595
4596 switch (howto->complain_on_overflow)
4597 {
4598 case complain_overflow_signed:
4599 /* If any sign bits are set, all sign bits must be set.
4600 That is, A must be a valid negative address after
4601 shifting. */
4602 signmask = ~(fieldmask >> 1);
4603 /* Fall through. */
4604
4605 case complain_overflow_bitfield:
4606 /* Much like the signed check, but for a field one bit
4607 wider. We allow a bitfield to represent numbers in the
4608 range -2**n to 2**n-1, where n is the number of bits in the
4609 field. Note that when bfd_vma is 32 bits, a 32-bit reloc
4610 can't overflow, which is exactly what we want. */
4611 ss = a & signmask;
4612 if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
4613 flag = bfd_reloc_overflow;
4614
4615 /* We only need this next bit of code if the sign bit of B
4616 is below the sign bit of A. This would only happen if
4617 SRC_MASK had fewer bits than BITSIZE. Note that if
4618 SRC_MASK has more bits than BITSIZE, we can get into
4619 trouble; we would need to verify that B is in range, as
4620 we do for A above. */
4621 ss = ((~howto->src_mask) >> 1) & howto->src_mask;
4622 ss >>= bitpos;
4623
4624 /* Set all the bits above the sign bit. */
4625 b = (b ^ ss) - ss;
4626
4627 /* Now we can do the addition. */
4628 sum = a + b;
4629
4630 /* See if the result has the correct sign. Bits above the
4631 sign bit are junk now; ignore them. If the sum is
4632 positive, make sure we did not have all negative inputs;
4633 if the sum is negative, make sure we did not have all
4634 positive inputs. The test below looks only at the sign
4635 bits, and it really just
4636 SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
4637
4638 We mask with addrmask here to explicitly allow an address
4639 wrap-around. The Linux kernel relies on it, and it is
4640 the only way to write assembler code which can run when
4641 loaded at a location 0x80000000 away from the location at
4642 which it is linked. */
4643 if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
4644 flag = bfd_reloc_overflow;
4645
4646 break;
4647
4648 case complain_overflow_unsigned:
4649 /* Checking for an unsigned overflow is relatively easy:
4650 trim the addresses and add, and trim the result as well.
4651 Overflow is normally indicated when the result does not
4652 fit in the field. However, we also need to consider the
4653 case when, e.g., fieldmask is 0x7fffffff or smaller, an
4654 input is 0x80000000, and bfd_vma is only 32 bits; then we
4655 will get sum == 0, but there is an overflow, since the
4656 inputs did not fit in the field. Instead of doing a
4657 separate test, we can check for this by or-ing in the
4658 operands when testing for the sum overflowing its final
4659 field. */
4660 sum = (a + b) & addrmask;
4661 if ((a | b | sum) & signmask)
4662 flag = bfd_reloc_overflow;
4663 break;
4664
4665 default:
4666 abort ();
4667 }
4668 }
4669
4670 /* Put RELOCATION in the right bits. */
4671 relocation >>= (bfd_vma) rightshift;
4672 relocation <<= (bfd_vma) bitpos;
4673
4674 /* Add RELOCATION to the right bits of X. */
4675 /* FIXME : 090616
4676 Because the relaxation may generate duplicate relocation at one address,
4677 an addition to immediate in the instruction may cause the relocation added
4678 several times.
4679 This bug should be fixed in assembler, but a check is also needed here. */
4680 if (howto->partial_inplace)
4681 x = ((x & ~howto->dst_mask)
4682 | (((x & howto->src_mask) + relocation) & howto->dst_mask));
4683 else
4684 x = ((x & ~howto->dst_mask) | ((relocation) & howto->dst_mask));
4685
4686
4687 /* Put the relocated value back in the object file. */
4688 switch (size)
4689 {
4690 default:
4691 case 0:
4692 case 1:
4693 case 8:
4694 abort ();
4695 break;
4696 case 2:
4697 bfd_putb16 (x, location);
4698 break;
4699 case 4:
4700 bfd_putb32 (x, location);
4701 break;
4702 }
4703
4704 return flag;
4705}
4706
4707static bfd_reloc_status_type
4708nds32_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
4709 asection *input_section, bfd_byte *contents,
4710 bfd_vma address, bfd_vma value, bfd_vma addend)
4711{
4712 bfd_vma relocation;
4713
4714 /* Sanity check the address. */
4715 if (address > bfd_get_section_limit (input_bfd, input_section))
4716 return bfd_reloc_outofrange;
4717
4718 /* This function assumes that we are dealing with a basic relocation
4719 against a symbol. We want to compute the value of the symbol to
4720 relocate to. This is just VALUE, the value of the symbol, plus
4721 ADDEND, any addend associated with the reloc. */
4722 relocation = value + addend;
4723
4724 /* If the relocation is PC relative, we want to set RELOCATION to
4725 the distance between the symbol (currently in RELOCATION) and the
c2bf1eec 4726 location we are relocating. If pcrel_offset is FALSE we do not
35c08157
KLC
4727 need to subtract out the offset of the location within the
4728 section (which is just ADDRESS). */
4729 if (howto->pc_relative)
4730 {
4731 relocation -= (input_section->output_section->vma
4732 + input_section->output_offset);
4733 if (howto->pcrel_offset)
4734 relocation -= address;
4735 }
4736
4737 return nds32_relocate_contents (howto, input_bfd, relocation,
4738 contents + address);
4739}
4740
4741static bfd_boolean
4742nds32_elf_output_symbol_hook (struct bfd_link_info *info,
4743 const char *name,
4744 Elf_Internal_Sym *elfsym ATTRIBUTE_UNUSED,
4745 asection *input_sec,
4746 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
4747{
4748 const char *source;
4749 FILE *sym_ld_script = NULL;
4750 struct elf_nds32_link_hash_table *table;
4751
4752 table = nds32_elf_hash_table (info);
4753 sym_ld_script = table->sym_ld_script;
4754 if (!sym_ld_script)
4755 return TRUE;
4756
4757 if (!h || !name || *name == '\0')
4758 return TRUE;
4759
4760 if (input_sec->flags & SEC_EXCLUDE)
4761 return TRUE;
4762
4763 if (!check_start_export_sym)
4764 {
4765 fprintf (sym_ld_script, "SECTIONS\n{\n");
4766 check_start_export_sym = 1;
4767 }
4768
4769 if (h->root.type == bfd_link_hash_defined
4770 || h->root.type == bfd_link_hash_defweak)
4771 {
4772 if (!h->root.u.def.section->output_section)
4773 return TRUE;
4774
4775 if (bfd_is_const_section (input_sec))
4776 source = input_sec->name;
4777 else
765cf5f6 4778 source = bfd_get_filename (input_sec->owner);
35c08157
KLC
4779
4780 fprintf (sym_ld_script, "\t%s = 0x%08lx;\t /* %s */\n",
4781 h->root.root.string,
4782 (long) (h->root.u.def.value
4783 + h->root.u.def.section->output_section->vma
4784 + h->root.u.def.section->output_offset), source);
4785 }
4786
4787 return TRUE;
4788}
4789
4790/* Relocate an NDS32/D ELF section.
4791 There is some attempt to make this function usable for many architectures,
4792 both for RELA and REL type relocs, if only to serve as a learning tool.
4793
4794 The RELOCATE_SECTION function is called by the new ELF backend linker
4795 to handle the relocations for a section.
4796
4797 The relocs are always passed as Rela structures; if the section
4798 actually uses Rel structures, the r_addend field will always be
4799 zero.
4800
4801 This function is responsible for adjust the section contents as
4802 necessary, and (if using Rela relocs and generating a
4803 relocatable output file) adjusting the reloc addend as
4804 necessary.
4805
4806 This function does not have to worry about setting the reloc
4807 address or the reloc symbol index.
4808
4809 LOCAL_SYMS is a pointer to the swapped in local symbols.
4810
4811 LOCAL_SECTIONS is an array giving the section in the input file
4812 corresponding to the st_shndx field of each local symbol.
4813
4814 The global hash table entry for the global symbols can be found
4815 via elf_sym_hashes (input_bfd).
4816
4817 When generating relocatable output, this function must handle
4818 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
4819 going to be the section symbol corresponding to the output
4820 section, which means that the addend must be adjusted
4821 accordingly. */
4822
fbaf61ad
NC
4823/* Return the base VMA address which should be subtracted from real addresses
4824 when resolving @dtpoff relocation.
4825 This is PT_TLS segment p_vaddr. */
4826
4827/* Return the relocation value for @tpoff relocation
4828 if STT_TLS virtual address is ADDRESS. */
4829
4830/* Return the relocation value for @gottpoff relocation
4831 if STT_TLS virtual address is ADDRESS. */
4832
1c8f6a4d 4833static bfd_vma
fbaf61ad 4834gottpoff (struct bfd_link_info *info, bfd_vma address)
1c8f6a4d 4835{
fbaf61ad
NC
4836 bfd_vma tp_base;
4837 bfd_vma tp_offset;
4838
1c8f6a4d
KLC
4839 /* If tls_sec is NULL, we should have signalled an error already. */
4840 if (elf_hash_table (info)->tls_sec == NULL)
4841 return 0;
fbaf61ad
NC
4842
4843 tp_base = elf_hash_table (info)->tls_sec->vma;
4844 tp_offset = address - tp_base;
4845
4846 return tp_offset;
1c8f6a4d
KLC
4847}
4848
35c08157 4849static bfd_boolean
fbaf61ad
NC
4850patch_tls_desc_to_ie (bfd_byte *contents, Elf_Internal_Rela *rel, bfd *ibfd)
4851{
4852 /* TLS_GD/TLS_LD model #1
4853 46 00 00 00 sethi $r0,#0x0
4854 58 00 00 00 ori $r0,$r0,#0x0
4855 40 00 74 00 add $r0,$r0,$gp
4856 04 10 00 00 lwi $r1,[$r0+#0x0]
4857 4b e0 04 01 jral $lp,$r1 */
4858
4859 /* TLS_GD/TLS_LD model #2
4860 46 00 00 00 sethi $r0,#0x0
4861 58 00 00 00 ori $r0,$r0,#0x0
4862 38 10 74 02 lw $r1,[$r0+($gp<<#0x0)]
4863 40 00 74 00 add $r0,$r0,$gp
4864 4b e0 04 01 jral $lp,$r1 */
4865
4866 /* TLS_IE model (non-PIC)
4867 46 00 00 00 sethi $r0,#0x0
4868 04 00 00 00 lwi $r0,[$r0+#0x0]
4869 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */
4870
4871 /* TLS_IE model (PIC)
4872 46 00 00 00 sethi $r0,#0x0
4873 58 00 00 00 ori $r0,$r0,#0x0
4874 38 00 74 02 lw $r0,[$r0+($gp<<#0x0)]
4875 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */
4876
4877 /* TLS_GD_TO_IE model
4878 46 00 00 00 sethi $r0,#0x0
4879 58 00 00 00 ori $r0,$r0,#0x0
4880 40 00 74 00 add $r0,$rM,$gp
4881 04 00 00 01 lwi $r0,[$r0+#0x4]
4882 40 00 64 00 add $r0,$r0,$r25 */
4883
4884 bfd_boolean rz = FALSE;
4885
4886 typedef struct
4887 {
4888 uint32_t opcode;
4889 uint32_t mask;
4890 } pat_t;
4891
4892 uint32_t patch[3] =
4893 {
4894 0x40007400, /* add $r0,$rM,$gp */
4895 0x04000001, /* lwi $r0,[$r0+#0x4] */
4896 0x40006400, /* add $r0,$r0,$r25 */
4897 };
4898
4899 pat_t mode0[3] =
4900 {
4901 { 0x40000000, 0xfe0003ff },
4902 { 0x04000000, 0xfe000000 },
4903 { 0x4be00001, 0xffff83ff },
4904 };
4905
4906 pat_t mode1[3] =
4907 {
4908 { 0x38007402, 0xfe007fff },
4909 { 0x40007400, 0xfe007fff },
4910 { 0x4be00001, 0xffff83ff },
4911 };
4912
4913 unsigned char *p = contents + rel->r_offset;
4914
4915 uint32_t insn;
4916 uint32_t regidx = 0;
4917 insn = bfd_getb32 (p);
4918 if (INSN_SETHI == (0xfe0fffffu & insn))
4919 {
4920 regidx = 0x1f & (insn >> 20);
4921 p += 4;
4922 }
4923
4924 insn = bfd_getb32 (p);
4925 if (INSN_ORI == (0xfe007fffu & insn))
4926 {
4927 regidx = 0x1f & (insn >> 20);
4928 p += 4;
4929 }
4930
4931 if (patch[2] == bfd_getb32 (p + 8)) /* Character instruction. */
4932 {
4933 /* already patched? */
4934 if ((patch[0] == (0xfff07fffu & bfd_getb32 (p + 0))) &&
4935 (patch[1] == bfd_getb32 (p + 4)))
4936 rz = TRUE;
4937 }
4938 else if (mode0[0].opcode == (mode0[0].mask & bfd_getb32 (p + 0)))
4939 {
4940 if ((mode0[1].opcode == (mode0[1].mask & bfd_getb32 (p + 4))) &&
4941 (mode0[2].opcode == (mode0[2].mask & bfd_getb32 (p + 8))))
4942 {
4943 bfd_putb32 (patch[0] | (regidx << 15), p + 0);
4944 bfd_putb32 (patch[1], p + 4);
4945 bfd_putb32 (patch[2], p + 8);
4946 rz = TRUE;
4947 }
4948 }
4949 else if (mode1[0].opcode == (mode1[0].mask & bfd_getb32 (p + 0)))
4950 {
4951 if ((mode1[1].opcode == (mode1[1].mask & bfd_getb32 (p + 4))) &&
4952 (mode1[2].opcode == (mode1[2].mask & bfd_getb32 (p + 8))))
4953 {
4954 bfd_putb32 (patch[0] | (regidx << 15), p + 0);
4955 bfd_putb32 (patch[1], p + 4);
4956 bfd_putb32 (patch[2], p + 8);
4957 rz = TRUE;
4958 }
4959 }
4960
4961 if (!rz)
4962 {
765cf5f6 4963 printf ("%s: %s @ 0x%08x\n", __func__, bfd_get_filename (ibfd),
fbaf61ad
NC
4964 (int) rel->r_offset);
4965 BFD_ASSERT(0); /* Unsupported pattern. */
4966 }
4967
4968 return rz;
4969}
4970
4971static enum elf_nds32_tls_type
4972get_tls_type (enum elf_nds32_reloc_type r_type, struct elf_link_hash_entry *h);
4973
4974static unsigned int
4975ones32 (register unsigned int x)
4976{
4977 /* 32-bit recursive reduction using SWAR...
4978 but first step is mapping 2-bit values
4979 into sum of 2 1-bit values in sneaky way. */
4980 x -= ((x >> 1) & 0x55555555);
4981 x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
4982 x = (((x >> 4) + x) & 0x0f0f0f0f);
4983 x += (x >> 8);
4984 x += (x >> 16);
4985 return (x & 0x0000003f);
4986}
4987
a767a1c4 4988#if !HAVE_FLS
fbaf61ad
NC
4989static unsigned int
4990fls (register unsigned int x)
4991{
4992 return ffs (x & (-x));
4993}
a767a1c4 4994#endif /* !HAVE_FLS */
fbaf61ad
NC
4995
4996#define nds32_elf_local_tlsdesc_gotent(bfd) \
4997 (elf_nds32_tdata (bfd)->local_tlsdesc_gotent)
4998
4999static bfd_boolean
5000nds32_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
5001 struct bfd_link_info * info,
5002 bfd * input_bfd,
5003 asection * input_section,
5004 bfd_byte * contents,
5005 Elf_Internal_Rela * relocs,
5006 Elf_Internal_Sym * local_syms,
5007 asection ** local_sections)
5008{
5009 Elf_Internal_Shdr *symtab_hdr;
5010 struct elf_link_hash_entry **sym_hashes;
5011 Elf_Internal_Rela *rel, *relend;
5012 bfd_boolean ret = TRUE; /* Assume success. */
5013 int align = 0;
5014 bfd_reloc_status_type r;
5015 const char *errmsg = NULL;
5016 bfd_vma gp;
5017 struct elf_link_hash_table *ehtab;
5018 struct elf_nds32_link_hash_table *htab;
5019 bfd *dynobj;
5020 bfd_vma *local_got_offsets;
5021 asection *sgot, *splt, *sreloc;
5022 bfd_vma high_address;
5023 struct elf_nds32_link_hash_table *table;
5024 int eliminate_gc_relocs;
35c08157
KLC
5025 bfd_vma fpbase_addr;
5026
5027 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5028 sym_hashes = elf_sym_hashes (input_bfd);
fbaf61ad 5029 ehtab = elf_hash_table (info);
35c08157
KLC
5030 htab = nds32_elf_hash_table (info);
5031 high_address = bfd_get_section_limit (input_bfd, input_section);
5032
5033 dynobj = htab->root.dynobj;
5034 local_got_offsets = elf_local_got_offsets (input_bfd);
5035
fbaf61ad
NC
5036 sgot = ehtab->sgot;
5037 splt = ehtab->splt;
35c08157
KLC
5038 sreloc = NULL;
5039
5040 rel = relocs;
5041 relend = relocs + input_section->reloc_count;
5042
5043 table = nds32_elf_hash_table (info);
5044 eliminate_gc_relocs = table->eliminate_gc_relocs;
fbaf61ad 5045
35c08157 5046 /* By this time, we can adjust the value of _SDA_BASE_. */
fbaf61ad 5047 /* Explain _SDA_BASE_ */
0e1862bb 5048 if ((!bfd_link_relocatable (info)))
35c08157
KLC
5049 {
5050 is_SDA_BASE_set = 1;
5051 r = nds32_elf_final_sda_base (output_bfd, info, &gp, TRUE);
5052 if (r != bfd_reloc_ok)
5053 return FALSE;
5054 }
5055
fbaf61ad
NC
5056 /* Do TLS model conversion once at first. */
5057 nds32_elf_unify_tls_model (input_bfd, input_section, contents, info);
5058
35c08157
KLC
5059 /* Use gp as fp to prevent truncated fit. Because in relaxation time
5060 the fp value is set as gp, and it has be reverted for instruction
5061 setting fp. */
5062 fpbase_addr = elf_gp (output_bfd);
5063
fbaf61ad 5064 /* Deal with (dynamic) relocations. */
35c08157
KLC
5065 for (rel = relocs; rel < relend; rel++)
5066 {
5067 enum elf_nds32_reloc_type r_type;
5068 reloc_howto_type *howto = NULL;
5069 unsigned long r_symndx;
5070 struct elf_link_hash_entry *h = NULL;
5071 Elf_Internal_Sym *sym = NULL;
5072 asection *sec;
5073 bfd_vma relocation;
fbaf61ad
NC
5074 bfd_vma relocation_sym = 0xdeadbeef;
5075 Elf_Internal_Rela *lorel;
5076 bfd_vma off;
35c08157
KLC
5077
5078 /* We can't modify r_addend here as elf_link_input_bfd has an assert to
5079 ensure it's zero (we use REL relocs, not RELA). Therefore this
5080 should be assigning zero to `addend', but for clarity we use
5081 `r_addend'. */
5082
5083 bfd_vma addend = rel->r_addend;
5084 bfd_vma offset = rel->r_offset;
5085
5086 r_type = ELF32_R_TYPE (rel->r_info);
5087 if (r_type >= R_NDS32_max)
5088 {
695344c0 5089 /* xgettext:c-format */
0aa13fee 5090 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
4eca0228 5091 input_bfd, r_type);
35c08157
KLC
5092 bfd_set_error (bfd_error_bad_value);
5093 ret = FALSE;
5094 continue;
5095 }
5096
5097 if (r_type == R_NDS32_GNU_VTENTRY
5098 || r_type == R_NDS32_GNU_VTINHERIT
5099 || r_type == R_NDS32_NONE
5100 || r_type == R_NDS32_RELA_GNU_VTENTRY
5101 || r_type == R_NDS32_RELA_GNU_VTINHERIT
5102 || (r_type >= R_NDS32_INSN16 && r_type <= R_NDS32_25_FIXED_RELA)
5103 || r_type == R_NDS32_DATA
fbaf61ad 5104 || r_type == R_NDS32_TRAN)
35c08157
KLC
5105 continue;
5106
0c4bd9d9
KLC
5107 /* If we enter the fp-as-gp region. Resolve the address
5108 of best fp-base. */
35c08157
KLC
5109 if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_BEGIN
5110 && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
5111 {
5112 int dist;
5113
5114 /* Distance to relocation of best fp-base is encoded in R_SYM. */
5115 dist = rel->r_addend >> 16;
5116 fpbase_addr = calculate_memory_address (input_bfd, rel + dist,
5117 local_syms, symtab_hdr);
5118 }
5119 else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_END
5120 && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
5121 {
5122 fpbase_addr = elf_gp (output_bfd);
5123 }
5124
fbaf61ad
NC
5125 /* Skip the relocations used for relaxation. */
5126 /* We have to update LONGCALL and LONGJUMP
5127 relocations when generating the relocatable files. */
5128 if (!bfd_link_relocatable (info)
5129 && (r_type >= R_NDS32_RELAX_ENTRY
5130 || (r_type >= R_NDS32_LONGCALL4
5131 && r_type <= R_NDS32_LONGJUMP7)))
35c08157
KLC
5132 continue;
5133
5134 howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
5135 r_symndx = ELF32_R_SYM (rel->r_info);
5136
5137 /* This is a final link. */
5138 sym = NULL;
5139 sec = NULL;
5140 h = NULL;
5141
5142 if (r_symndx < symtab_hdr->sh_info)
5143 {
5144 /* Local symbol. */
5145 sym = local_syms + r_symndx;
5146 sec = local_sections[r_symndx];
5147
5148 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5149 addend = rel->r_addend;
fbaf61ad
NC
5150
5151 /* keep symbol location for static TLS_IE GOT entry */
5152 relocation_sym = relocation;
5153 if (bfd_link_relocatable (info))
5154 {
5155 /* This is a relocatable link. We don't have to change
5156 anything, unless the reloc is against a section symbol,
5157 in which case we have to adjust according to where the
5158 section symbol winds up in the output section. */
5159 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5160 rel->r_addend += sec->output_offset + sym->st_value;
5161
5162 continue;
5163 }
35c08157
KLC
5164 }
5165 else
5166 {
5167 /* External symbol. */
fbaf61ad
NC
5168 if (bfd_link_relocatable (info))
5169 continue;
35c08157
KLC
5170 bfd_boolean warned, ignored, unresolved_reloc;
5171 int symndx = r_symndx - symtab_hdr->sh_info;
5172
5173 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
5174 r_symndx, symtab_hdr, sym_hashes, h, sec,
5175 relocation, unresolved_reloc, warned,
5176 ignored);
5177
fbaf61ad
NC
5178 /* keep symbol location for static TLS_IE GOT entry */
5179 relocation_sym = relocation;
5180
35c08157
KLC
5181 /* la $fp, _FP_BASE_ is per-function (region).
5182 Handle it specially. */
5183 switch ((int) r_type)
5184 {
fbaf61ad
NC
5185 case R_NDS32_HI20_RELA:
5186 case R_NDS32_LO12S0_RELA:
5187 if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
5188 FP_BASE_NAME) == 0)
5189 {
5190 if (!bfd_link_pie (info))
5191 {
5192 _bfd_error_handler
5193 ("%pB: warning: _FP_BASE_ setting insns relaxation failed.",
5194 input_bfd);
5195 }
5196 relocation = fpbase_addr;
5197 }
5198 break;
35c08157
KLC
5199 case R_NDS32_SDA19S0_RELA:
5200 case R_NDS32_SDA15S0_RELA:
5201 case R_NDS32_20_RELA:
5202 if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
5203 FP_BASE_NAME) == 0)
5204 {
5205 relocation = fpbase_addr;
5206 break;
5207 }
5208 }
35c08157
KLC
5209 }
5210
5211 /* Sanity check the address. */
5212 if (offset > high_address)
5213 {
5214 r = bfd_reloc_outofrange;
5215 goto check_reloc;
5216 }
5217
fbaf61ad 5218 if (r_type >= R_NDS32_RELAX_ENTRY)
35c08157
KLC
5219 continue;
5220
5221 switch ((int) r_type)
5222 {
5223 case R_NDS32_GOTOFF:
5224 /* Relocation is relative to the start of the global offset
5225 table (for ld24 rx, #uimm24), e.g. access at label+addend
5226
5227 ld24 rx. #label@GOTOFF + addend
5228 sub rx, r12. */
5229 case R_NDS32_GOTOFF_HI20:
5230 case R_NDS32_GOTOFF_LO12:
5231 case R_NDS32_GOTOFF_LO15:
5232 case R_NDS32_GOTOFF_LO19:
5233 BFD_ASSERT (sgot != NULL);
5234
5235 relocation -= elf_gp (output_bfd);
5236 break;
5237
5238 case R_NDS32_9_PLTREL:
5239 case R_NDS32_25_PLTREL:
5240 /* Relocation is to the entry for this symbol in the
5241 procedure linkage table. */
5242
5243 /* The native assembler will generate a 25_PLTREL reloc
5244 for a local symbol if you assemble a call from one
5245 section to another when using -K pic. */
5246 if (h == NULL)
5247 break;
5248
5249 if (h->forced_local)
5250 break;
5251
5252 /* We didn't make a PLT entry for this symbol. This
5253 happens when statically linking PIC code, or when
5254 using -Bsymbolic. */
5255 if (h->plt.offset == (bfd_vma) - 1)
5256 break;
5257
5258 relocation = (splt->output_section->vma
5259 + splt->output_offset + h->plt.offset);
5260 break;
5261
5262 case R_NDS32_PLT_GOTREL_HI20:
5263 case R_NDS32_PLT_GOTREL_LO12:
5264 case R_NDS32_PLT_GOTREL_LO15:
5265 case R_NDS32_PLT_GOTREL_LO19:
5266 case R_NDS32_PLT_GOTREL_LO20:
fbaf61ad
NC
5267 if (h == NULL
5268 || h->forced_local
5269 || h->plt.offset == (bfd_vma) -1
5270 || (bfd_link_pie (info) && h->def_regular))
35c08157 5271 {
fbaf61ad
NC
5272 /* Maybe we should find better checking to optimize
5273 PIE PLT relocations. */
35c08157
KLC
5274 /* We didn't make a PLT entry for this symbol. This
5275 happens when statically linking PIC code, or when
5276 using -Bsymbolic. */
fbaf61ad
NC
5277 if (h)
5278 h->plt.offset = (bfd_vma) -1; /* Cancel PLT trampoline. */
35c08157
KLC
5279 relocation -= elf_gp (output_bfd);
5280 break;
5281 }
5282
5283 relocation = (splt->output_section->vma
5284 + splt->output_offset + h->plt.offset);
5285
5286 relocation -= elf_gp (output_bfd);
5287 break;
5288
5289 case R_NDS32_PLTREL_HI20:
5290 case R_NDS32_PLTREL_LO12:
5291
5292 /* Relocation is to the entry for this symbol in the
5293 procedure linkage table. */
5294
5295 /* The native assembler will generate a 25_PLTREL reloc
5296 for a local symbol if you assemble a call from one
5297 section to another when using -K pic. */
5298 if (h == NULL)
5299 break;
5300
5301 if (h->forced_local)
5302 break;
5303
5304 if (h->plt.offset == (bfd_vma) - 1)
5305 /* We didn't make a PLT entry for this symbol. This
5306 happens when statically linking PIC code, or when
5307 using -Bsymbolic. */
5308 break;
5309
5310 if (splt == NULL)
5311 break;
5312
5313 relocation = (splt->output_section->vma
5314 + splt->output_offset
5315 + h->plt.offset + 4)
5316 - (input_section->output_section->vma
5317 + input_section->output_offset
5318 + rel->r_offset);
5319
5320 break;
5321
5322 case R_NDS32_GOTPC20:
5323 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
5324 ld24 rx,#_GLOBAL_OFFSET_TABLE_ */
5325 relocation = elf_gp (output_bfd);
5326 break;
5327
5328 case R_NDS32_GOTPC_HI20:
5329 case R_NDS32_GOTPC_LO12:
fbaf61ad
NC
5330 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
5331 bl .+4
5332 seth rx,#high(_GLOBAL_OFFSET_TABLE_)
5333 or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
5334 or
5335 bl .+4
5336 seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
5337 add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4) */
5338 relocation = elf_gp (output_bfd);
5339 relocation -= (input_section->output_section->vma
5340 + input_section->output_offset + rel->r_offset);
5341 break;
35c08157
KLC
5342
5343 case R_NDS32_GOT20:
5344 /* Fall through. */
5345 case R_NDS32_GOT_HI20:
5346 case R_NDS32_GOT_LO12:
5347 case R_NDS32_GOT_LO15:
5348 case R_NDS32_GOT_LO19:
5349 /* Relocation is to the entry for this symbol in the global
5350 offset table. */
5351 BFD_ASSERT (sgot != NULL);
5352
5353 if (h != NULL)
5354 {
fbaf61ad 5355 /* External symbol */
35c08157 5356 bfd_boolean dyn;
35c08157
KLC
5357
5358 off = h->got.offset;
5359 BFD_ASSERT (off != (bfd_vma) - 1);
5360 dyn = htab->root.dynamic_sections_created;
0e1862bb
L
5361 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
5362 bfd_link_pic (info),
5363 h)
5364 || (bfd_link_pic (info)
35c08157
KLC
5365 && (info->symbolic
5366 || h->dynindx == -1
5367 || h->forced_local) && h->def_regular))
5368 {
5369 /* This is actually a static link, or it is a
5370 -Bsymbolic link and the symbol is defined
5371 locally, or the symbol was forced to be local
5372 because of a version file. We must initialize
5373 this entry in the global offset table. Since the
5374 offset must always be a multiple of 4, we use the
5375 least significant bit to record whether we have
5376 initialized it already.
5377
5378 When doing a dynamic link, we create a .rela.got
5379 relocation entry to initialize the value. This
5380 is done in the finish_dynamic_symbol routine. */
fbaf61ad 5381 if ((off & 1) != 0) /* clear LSB */
35c08157
KLC
5382 off &= ~1;
5383 else
5384 {
5385 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5386 h->got.offset |= 1;
5387 }
5388 }
5389 relocation = sgot->output_section->vma + sgot->output_offset + off
5390 - elf_gp (output_bfd);
5391 }
5392 else
5393 {
fbaf61ad 5394 /* Local symbol */
35c08157
KLC
5395 bfd_byte *loc;
5396
5397 BFD_ASSERT (local_got_offsets != NULL
5398 && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5399
5400 off = local_got_offsets[r_symndx];
5401
5402 /* The offset must always be a multiple of 4. We use
5403 the least significant bit to record whether we have
5404 already processed this entry. */
fbaf61ad 5405 if ((off & 1) != 0) /* clear LSB */
35c08157
KLC
5406 off &= ~1;
5407 else
5408 {
5409 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5410
0e1862bb 5411 if (bfd_link_pic (info))
35c08157
KLC
5412 {
5413 asection *srelgot;
5414 Elf_Internal_Rela outrel;
5415
5416 /* We need to generate a R_NDS32_RELATIVE reloc
5417 for the dynamic linker. */
fbaf61ad 5418 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
35c08157
KLC
5419 BFD_ASSERT (srelgot != NULL);
5420
5421 outrel.r_offset = (elf_gp (output_bfd)
5422 + sgot->output_offset + off);
5423 outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5424 outrel.r_addend = relocation;
5425 loc = srelgot->contents;
5426 loc +=
5427 srelgot->reloc_count * sizeof (Elf32_External_Rela);
5428 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5429 ++srelgot->reloc_count;
5430 }
5431 local_got_offsets[r_symndx] |= 1;
5432 }
5433 relocation = sgot->output_section->vma + sgot->output_offset + off
5434 - elf_gp (output_bfd);
5435 }
5436
5437 break;
5438
5439 case R_NDS32_16_RELA:
5440 case R_NDS32_20_RELA:
5441 case R_NDS32_5_RELA:
5442 case R_NDS32_32_RELA:
5443 case R_NDS32_9_PCREL_RELA:
5444 case R_NDS32_WORD_9_PCREL_RELA:
5445 case R_NDS32_10_UPCREL_RELA:
5446 case R_NDS32_15_PCREL_RELA:
5447 case R_NDS32_17_PCREL_RELA:
5448 case R_NDS32_25_PCREL_RELA:
5449 case R_NDS32_HI20_RELA:
5450 case R_NDS32_LO12S3_RELA:
5451 case R_NDS32_LO12S2_RELA:
5452 case R_NDS32_LO12S2_DP_RELA:
5453 case R_NDS32_LO12S2_SP_RELA:
5454 case R_NDS32_LO12S1_RELA:
5455 case R_NDS32_LO12S0_RELA:
5456 case R_NDS32_LO12S0_ORI_RELA:
0e1862bb 5457 if (bfd_link_pic (info) && r_symndx != 0
35c08157
KLC
5458 && (input_section->flags & SEC_ALLOC) != 0
5459 && (eliminate_gc_relocs == 0
5460 || (sec && (sec->flags & SEC_EXCLUDE) == 0))
5461 && ((r_type != R_NDS32_9_PCREL_RELA
5462 && r_type != R_NDS32_WORD_9_PCREL_RELA
5463 && r_type != R_NDS32_10_UPCREL_RELA
5464 && r_type != R_NDS32_15_PCREL_RELA
5465 && r_type != R_NDS32_17_PCREL_RELA
5466 && r_type != R_NDS32_25_PCREL_RELA
5467 && !(r_type == R_NDS32_32_RELA
5468 && strcmp (input_section->name, ".eh_frame") == 0))
5469 || (h != NULL && h->dynindx != -1
5470 && (!info->symbolic || !h->def_regular))))
5471 {
5472 Elf_Internal_Rela outrel;
5473 bfd_boolean skip, relocate;
5474 bfd_byte *loc;
5475
5476 /* When generating a shared object, these relocations
5477 are copied into the output file to be resolved at run
5478 time. */
5479
5480 if (sreloc == NULL)
5481 {
5482 const char *name;
5483
5484 name = bfd_elf_string_from_elf_section
5485 (input_bfd, elf_elfheader (input_bfd)->e_shstrndx,
5486 elf_section_data (input_section)->rela.hdr->sh_name);
5487 if (name == NULL)
5488 return FALSE;
5489
5490 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
fd361982 5491 && strcmp (bfd_section_name (input_section),
35c08157
KLC
5492 name + 5) == 0);
5493
5494 sreloc = bfd_get_section_by_name (dynobj, name);
5495 BFD_ASSERT (sreloc != NULL);
5496 }
5497
5498 skip = FALSE;
5499 relocate = FALSE;
5500
5501 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
5502 info,
5503 input_section,
5504 rel->r_offset);
5505 if (outrel.r_offset == (bfd_vma) - 1)
5506 skip = TRUE;
5507 else if (outrel.r_offset == (bfd_vma) - 2)
5508 skip = TRUE, relocate = TRUE;
5509 outrel.r_offset += (input_section->output_section->vma
5510 + input_section->output_offset);
5511
5512 if (skip)
5513 memset (&outrel, 0, sizeof outrel);
5514 else if (r_type == R_NDS32_17_PCREL_RELA
5515 || r_type == R_NDS32_15_PCREL_RELA
5516 || r_type == R_NDS32_25_PCREL_RELA)
5517 {
5518 BFD_ASSERT (h != NULL && h->dynindx != -1);
5519 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5520 outrel.r_addend = rel->r_addend;
5521 }
5522 else
5523 {
5524 /* h->dynindx may be -1 if this symbol was marked to
5525 become local. */
5526 if (h == NULL
5527 || ((info->symbolic || h->dynindx == -1)
fbaf61ad
NC
5528 && h->def_regular)
5529 || (bfd_link_pie (info) && h->def_regular))
35c08157
KLC
5530 {
5531 relocate = TRUE;
5532 outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5533 outrel.r_addend = relocation + rel->r_addend;
fbaf61ad
NC
5534
5535 if (h)
5536 {
5537 h->plt.offset = (bfd_vma) -1; /* cancel PLT trampoline. */
5538
5539 BFD_ASSERT (sgot != NULL);
5540 /* If we did not allocate got entry for the symbol,
5541 we can not fill the nonexistent got entry. */
5542 if (h->got.offset != (bfd_vma) -1
5543 && (h->got.offset & 1) == 0)
5544 {
5545 bfd_put_32 (output_bfd, outrel.r_addend,
5546 sgot->contents + h->got.offset);
5547 }
5548 }
35c08157
KLC
5549 }
5550 else
5551 {
fbaf61ad
NC
5552 if (h->dynindx == -1)
5553 {
5554 _bfd_error_handler
acef8081 5555 (_("%pB: relocation %s against `%s' can not be used when "
fbaf61ad
NC
5556 "making a shared object; recompile with -fPIC"),
5557 input_bfd, nds32_elf_howto_table[r_type].name, h->root.root.string);
5558 bfd_set_error (bfd_error_bad_value);
5559 return FALSE;
5560 }
5561
35c08157
KLC
5562 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5563 outrel.r_addend = rel->r_addend;
5564 }
5565 }
5566
5567 loc = sreloc->contents;
5568 loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
5569 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5570 ++sreloc->reloc_count;
5571
5572 /* If this reloc is against an external symbol, we do
5573 not want to fiddle with the addend. Otherwise, we
5574 need to include the symbol value so that it becomes
5575 an addend for the dynamic reloc. */
5576 if (!relocate)
5577 continue;
5578 }
5579 break;
5580
5581 case R_NDS32_25_ABS_RELA:
0e1862bb 5582 if (bfd_link_pic (info))
35c08157 5583 {
4eca0228 5584 _bfd_error_handler
38f14ab8
AM
5585 (_("%pB: warning: %s unsupported in shared mode"),
5586 input_bfd, "R_NDS32_25_ABS_RELA");
35c08157
KLC
5587 return FALSE;
5588 }
5589 break;
5590
5591 case R_NDS32_9_PCREL:
5592 r = nds32_elf_do_9_pcrel_reloc (input_bfd, howto, input_section,
5593 contents, offset,
5594 sec, relocation, addend);
5595 goto check_reloc;
5596
5597 case R_NDS32_HI20:
fbaf61ad
NC
5598 /* We allow an arbitrary number of HI20 relocs before the
5599 LO12 reloc. This permits gcc to emit the HI and LO relocs
5600 itself. */
5601 for (lorel = rel + 1;
5602 (lorel < relend
5603 && ELF32_R_TYPE (lorel->r_info) == R_NDS32_HI20); lorel++)
5604 continue;
5605 if (lorel < relend
5606 && (ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S3
5607 || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S2
5608 || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S1
5609 || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S0))
35c08157 5610 {
fbaf61ad
NC
5611 nds32_elf_relocate_hi20 (input_bfd, r_type, rel, lorel,
5612 contents, relocation + addend);
5613 r = bfd_reloc_ok;
35c08157 5614 }
fbaf61ad
NC
5615 else
5616 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5617 contents, offset, relocation,
5618 addend);
35c08157
KLC
5619 goto check_reloc;
5620
5621 case R_NDS32_GOT17S2_RELA:
5622 case R_NDS32_GOT15S2_RELA:
fbaf61ad
NC
5623 BFD_ASSERT (sgot != NULL);
5624
5625 if (h != NULL)
35c08157 5626 {
fbaf61ad 5627 bfd_boolean dyn;
35c08157 5628
fbaf61ad
NC
5629 off = h->got.offset;
5630 BFD_ASSERT (off != (bfd_vma) - 1);
35c08157 5631
fbaf61ad
NC
5632 dyn = htab->root.dynamic_sections_created;
5633 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
5634 (dyn, bfd_link_pic (info), h)
5635 || (bfd_link_pic (info)
5636 && (info->symbolic
5637 || h->dynindx == -1
5638 || h->forced_local)
5639 && h->def_regular))
35c08157 5640 {
fbaf61ad
NC
5641 /* This is actually a static link, or it is a
5642 -Bsymbolic link and the symbol is defined
5643 locally, or the symbol was forced to be local
5644 because of a version file. We must initialize
5645 this entry in the global offset table. Since the
5646 offset must always be a multiple of 4, we use the
5647 least significant bit to record whether we have
5648 initialized it already.
5649
5650 When doing a dynamic link, we create a .rela.got
5651 relocation entry to initialize the value. This
5652 is done in the finish_dynamic_symbol routine. */
5653 if ((off & 1) != 0)
5654 off &= ~1;
5655 else
35c08157 5656 {
fbaf61ad
NC
5657 bfd_put_32 (output_bfd, relocation,
5658 sgot->contents + off);
5659 h->got.offset |= 1;
35c08157
KLC
5660 }
5661 }
fbaf61ad
NC
5662 }
5663 else
5664 {
5665 bfd_byte *loc;
35c08157 5666
fbaf61ad
NC
5667 BFD_ASSERT (local_got_offsets != NULL
5668 && local_got_offsets[r_symndx] != (bfd_vma) - 1);
35c08157 5669
fbaf61ad 5670 off = local_got_offsets[r_symndx];
35c08157 5671
fbaf61ad
NC
5672 /* The offset must always be a multiple of 4. We use
5673 the least significant bit to record whether we have
5674 already processed this entry. */
5675 if ((off & 1) != 0)
5676 off &= ~1;
5677 else
5678 {
5679 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5680
5681 if (bfd_link_pic (info))
35c08157 5682 {
fbaf61ad
NC
5683 asection *srelgot;
5684 Elf_Internal_Rela outrel;
35c08157 5685
fbaf61ad
NC
5686 /* We need to generate a R_NDS32_RELATIVE reloc
5687 for the dynamic linker. */
5688 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
5689 BFD_ASSERT (srelgot != NULL);
5690
5691 outrel.r_offset = (elf_gp (output_bfd)
5692 + sgot->output_offset + off);
5693 outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5694 outrel.r_addend = relocation;
5695 loc = srelgot->contents;
5696 loc +=
5697 srelgot->reloc_count * sizeof (Elf32_External_Rela);
5698 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5699 ++srelgot->reloc_count;
35c08157 5700 }
fbaf61ad 5701 local_got_offsets[r_symndx] |= 1;
35c08157 5702 }
35c08157 5703 }
fbaf61ad
NC
5704 relocation = sgot->output_section->vma + sgot->output_offset + off
5705 - elf_gp (output_bfd);
5706
35c08157
KLC
5707 if (relocation & align)
5708 {
5709 /* Incorrect alignment. */
4eca0228 5710 _bfd_error_handler
38f14ab8 5711 (_("%pB: warning: unaligned access to GOT entry"), input_bfd);
35c08157
KLC
5712 ret = FALSE;
5713 r = bfd_reloc_dangerous;
5714 goto check_reloc;
5715 }
5716 break;
5717
5718 case R_NDS32_SDA16S3_RELA:
5719 case R_NDS32_SDA15S3_RELA:
5720 case R_NDS32_SDA15S3:
5721 align = 0x7;
5722 goto handle_sda;
5723
5724 case R_NDS32_SDA17S2_RELA:
5725 case R_NDS32_SDA15S2_RELA:
5726 case R_NDS32_SDA12S2_SP_RELA:
5727 case R_NDS32_SDA12S2_DP_RELA:
5728 case R_NDS32_SDA15S2:
5729 case R_NDS32_SDA_FP7U2_RELA:
5730 align = 0x3;
5731 goto handle_sda;
5732
5733 case R_NDS32_SDA18S1_RELA:
5734 case R_NDS32_SDA15S1_RELA:
5735 case R_NDS32_SDA15S1:
5736 align = 0x1;
5737 goto handle_sda;
5738
5739 case R_NDS32_SDA19S0_RELA:
5740 case R_NDS32_SDA15S0_RELA:
5741 case R_NDS32_SDA15S0:
fbaf61ad 5742 align = 0x0;
dc1e8a47 5743 handle_sda:
fbaf61ad 5744 BFD_ASSERT (sec != NULL);
35c08157 5745
fbaf61ad
NC
5746 /* If the symbol is in the abs section, the out_bfd will be null.
5747 This happens when the relocation has a symbol@GOTOFF. */
5748 r = nds32_elf_final_sda_base (output_bfd, info, &gp, FALSE);
5749 if (r != bfd_reloc_ok)
5750 {
5751 _bfd_error_handler
5752 (_("%pB: warning: relocate SDA_BASE failed"), input_bfd);
5753 ret = FALSE;
5754 goto check_reloc;
5755 }
35c08157 5756
fbaf61ad
NC
5757 /* At this point `relocation' contains the object's
5758 address. */
5759 if (r_type == R_NDS32_SDA_FP7U2_RELA)
5760 {
5761 relocation -= fpbase_addr;
5762 }
5763 else
5764 relocation -= gp;
5765 /* Now it contains the offset from _SDA_BASE_. */
35c08157 5766
fbaf61ad 5767 /* Make sure alignment is correct. */
35c08157 5768
fbaf61ad
NC
5769 if (relocation & align)
5770 {
5771 /* Incorrect alignment. */
5772 _bfd_error_handler
5773 /* xgettext:c-format */
5774 (_("%pB(%pA): warning: unaligned small data access"
5775 " of type %d"),
5776 input_bfd, input_section, r_type);
5777 ret = FALSE;
5778 goto check_reloc;
35c08157 5779 }
35c08157 5780 break;
fbaf61ad 5781
35c08157
KLC
5782 case R_NDS32_17IFC_PCREL_RELA:
5783 case R_NDS32_10IFCU_PCREL_RELA:
fbaf61ad 5784 /* Do nothing. */
35c08157
KLC
5785 break;
5786
1c8f6a4d
KLC
5787 case R_NDS32_TLS_LE_HI20:
5788 case R_NDS32_TLS_LE_LO12:
5789 case R_NDS32_TLS_LE_20:
5790 case R_NDS32_TLS_LE_15S0:
5791 case R_NDS32_TLS_LE_15S1:
5792 case R_NDS32_TLS_LE_15S2:
fbaf61ad
NC
5793 /* We do not have garbage collection for got entries.
5794 Therefore, IE to LE may have one empty entry, and DESC to
5795 LE may have two. */
1c8f6a4d
KLC
5796 if (elf_hash_table (info)->tls_sec != NULL)
5797 relocation -= (elf_hash_table (info)->tls_sec->vma + TP_OFFSET);
5798 break;
fbaf61ad 5799
1c8f6a4d
KLC
5800 case R_NDS32_TLS_IE_HI20:
5801 case R_NDS32_TLS_IE_LO12S2:
fbaf61ad
NC
5802 case R_NDS32_TLS_DESC_HI20:
5803 case R_NDS32_TLS_DESC_LO12:
5804 case R_NDS32_TLS_IE_LO12:
5805 case R_NDS32_TLS_IEGP_HI20:
5806 case R_NDS32_TLS_IEGP_LO12:
5807 case R_NDS32_TLS_IEGP_LO12S2:
1c8f6a4d
KLC
5808 {
5809 /* Relocation is to the entry for this symbol in the global
5810 offset table. */
fbaf61ad 5811 enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type;
1c8f6a4d
KLC
5812 asection *srelgot;
5813 Elf_Internal_Rela outrel;
1c8f6a4d
KLC
5814 bfd_byte *loc;
5815 int indx = 0;
5816
fbaf61ad
NC
5817 eff_tls_type = org_tls_type = get_tls_type (r_type, h);
5818
1c8f6a4d
KLC
5819 BFD_ASSERT (sgot != NULL);
5820 if (h != NULL)
5821 {
5822 bfd_boolean dyn;
5823
5824 off = h->got.offset;
fbaf61ad 5825 BFD_ASSERT (off != (bfd_vma) -1);
1c8f6a4d
KLC
5826 dyn = htab->root.dynamic_sections_created;
5827 tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
0e1862bb
L
5828 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5829 && (!bfd_link_pic (info)
1c8f6a4d
KLC
5830 || !SYMBOL_REFERENCES_LOCAL (info, h)))
5831 indx = h->dynindx;
5832 }
5833 else
5834 {
1c8f6a4d
KLC
5835 BFD_ASSERT (local_got_offsets != NULL
5836 && local_got_offsets[r_symndx] != (bfd_vma) - 1);
1c8f6a4d 5837 off = local_got_offsets[r_symndx];
1c8f6a4d
KLC
5838 tls_type = elf32_nds32_local_got_tls_type (input_bfd)[r_symndx];
5839 }
fbaf61ad 5840
1c8f6a4d
KLC
5841 relocation = sgot->output_section->vma + sgot->output_offset + off;
5842
fbaf61ad
NC
5843 if (1 < ones32 (tls_type))
5844 {
5845 eff_tls_type = 1 << (fls (tls_type) - 1);
5846 /* TLS model shall be handled in nds32_elf_unify_tls_model (). */
5847
5848 /* TLS model X -> LE is not implement yet!
5849 workaround here! */
5850 if (eff_tls_type == GOT_TLS_LE)
5851 {
5852 eff_tls_type = 1 << (fls (tls_type ^ eff_tls_type) - 1);
5853 }
5854 }
1c8f6a4d
KLC
5855
5856 /* The offset must always be a multiple of 4. We use
5857 the least significant bit to record whether we have
5858 already processed this entry. */
fbaf61ad
NC
5859 bfd_boolean need_relocs = FALSE;
5860 srelgot = ehtab->srelgot;
5861 if ((bfd_link_pic (info) || indx != 0)
5862 && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5863 || h->root.type != bfd_link_hash_undefweak))
5864 {
5865 need_relocs = TRUE;
5866 BFD_ASSERT (srelgot != NULL);
5867 }
5868
5869 if (off & 1)
5870 {
5871 off &= ~1;
5872 relocation &= ~1;
5873
5874 if (eff_tls_type & GOT_TLS_DESC)
5875 {
5876 relocation -= elf_gp (output_bfd);
5877 if ((R_NDS32_TLS_DESC_HI20 == r_type) && (!need_relocs))
5878 {
5879 /* TLS model shall be converted. */
5880 BFD_ASSERT(0);
5881 }
5882 }
5883 else if (eff_tls_type & GOT_TLS_IEGP)
5884 {
5885 relocation -= elf_gp (output_bfd);
5886 }
5887 }
1c8f6a4d
KLC
5888 else
5889 {
fbaf61ad 5890 if ((eff_tls_type & GOT_TLS_LE) && (tls_type ^ eff_tls_type))
1c8f6a4d 5891 {
fbaf61ad
NC
5892 /* TLS model workaround shall be applied. */
5893 BFD_ASSERT(0);
1c8f6a4d 5894 }
fbaf61ad 5895 else if (eff_tls_type & (GOT_TLS_IE | GOT_TLS_IEGP))
1c8f6a4d 5896 {
fbaf61ad
NC
5897 if (eff_tls_type & GOT_TLS_IEGP)
5898 relocation -= elf_gp(output_bfd);
5899
1c8f6a4d
KLC
5900 if (need_relocs)
5901 {
fbaf61ad
NC
5902 if (indx == 0)
5903 outrel.r_addend = gottpoff (info, relocation_sym);
1c8f6a4d
KLC
5904 else
5905 outrel.r_addend = 0;
5906 outrel.r_offset = (sgot->output_section->vma
fbaf61ad
NC
5907 + sgot->output_offset + off);
5908 outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_TPOFF);
5909
5910 elf32_nds32_add_dynreloc (output_bfd, info, srelgot,
5911 &outrel);
1c8f6a4d
KLC
5912 }
5913 else
fbaf61ad
NC
5914 {
5915 bfd_put_32 (output_bfd, gottpoff (info, relocation_sym),
5916 sgot->contents + off);
5917 }
1c8f6a4d 5918 }
fbaf61ad
NC
5919 else if (eff_tls_type & GOT_TLS_DESC)
5920 {
5921 relocation -= elf_gp (output_bfd);
5922 if (need_relocs)
5923 {
5924 if (indx == 0)
5925 outrel.r_addend = gottpoff (info, relocation_sym);
5926 else
5927 outrel.r_addend = 0;
5928 outrel.r_offset = (sgot->output_section->vma
5929 + sgot->output_offset + off);
5930 outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_DESC);
5931
5932 if (htab->tls_desc_trampoline)
5933 {
5934 asection *srelplt;
5935 srelplt = ehtab->srelplt;
5936 loc = srelplt->contents;
5937 loc += htab->next_tls_desc_index++ * sizeof (Elf32_External_Rela);
5938 BFD_ASSERT (loc + sizeof (Elf32_External_Rela)
5939 <= srelplt->contents + srelplt->size);
5940
5941 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5942 }
5943 else
5944 {
5945 loc = srelgot->contents;
5946 loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
5947 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5948 ++srelgot->reloc_count;
5949 }
5950 }
5951 else
5952 {
5953 /* feed me! */
5954 bfd_put_32 (output_bfd, 0xdeadbeef,
5955 sgot->contents + off);
5956 bfd_put_32 (output_bfd, gottpoff (info, relocation_sym),
5957 sgot->contents + off + 4);
5958 patch_tls_desc_to_ie (contents, rel, input_bfd);
5959 BFD_ASSERT(0);
5960 }
5961 }
5962 else
5963 {
5964 /* TLS model workaround shall be applied. */
5965 BFD_ASSERT(0);
5966 }
5967
5968 if (h != NULL)
5969 h->got.offset |= 1;
5970 else
5971 local_got_offsets[r_symndx] |= 1;
5972 }
5973 }
5974 break;
5975 /* DON'T fall through. */
5976
5977 default:
5978 /* OLD_NDS32_RELOC. */
5979
5980 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5981 contents, offset, relocation, addend);
5982 goto check_reloc;
5983 }
5984
5985 switch ((int) r_type)
5986 {
35c08157
KLC
5987 case R_NDS32_20_RELA:
5988 case R_NDS32_5_RELA:
5989 case R_NDS32_9_PCREL_RELA:
5990 case R_NDS32_WORD_9_PCREL_RELA:
5991 case R_NDS32_10_UPCREL_RELA:
5992 case R_NDS32_15_PCREL_RELA:
5993 case R_NDS32_17_PCREL_RELA:
5994 case R_NDS32_25_PCREL_RELA:
5995 case R_NDS32_25_ABS_RELA:
5996 case R_NDS32_HI20_RELA:
5997 case R_NDS32_LO12S3_RELA:
5998 case R_NDS32_LO12S2_RELA:
5999 case R_NDS32_LO12S2_DP_RELA:
6000 case R_NDS32_LO12S2_SP_RELA:
6001 case R_NDS32_LO12S1_RELA:
6002 case R_NDS32_LO12S0_RELA:
6003 case R_NDS32_LO12S0_ORI_RELA:
6004 case R_NDS32_SDA16S3_RELA:
6005 case R_NDS32_SDA17S2_RELA:
6006 case R_NDS32_SDA18S1_RELA:
6007 case R_NDS32_SDA19S0_RELA:
6008 case R_NDS32_SDA15S3_RELA:
6009 case R_NDS32_SDA15S2_RELA:
6010 case R_NDS32_SDA12S2_DP_RELA:
6011 case R_NDS32_SDA12S2_SP_RELA:
6012 case R_NDS32_SDA15S1_RELA:
6013 case R_NDS32_SDA15S0_RELA:
6014 case R_NDS32_SDA_FP7U2_RELA:
6015 case R_NDS32_9_PLTREL:
6016 case R_NDS32_25_PLTREL:
6017 case R_NDS32_GOT20:
6018 case R_NDS32_GOT_HI20:
6019 case R_NDS32_GOT_LO12:
6020 case R_NDS32_GOT_LO15:
6021 case R_NDS32_GOT_LO19:
6022 case R_NDS32_GOT15S2_RELA:
6023 case R_NDS32_GOT17S2_RELA:
6024 case R_NDS32_GOTPC20:
6025 case R_NDS32_GOTPC_HI20:
6026 case R_NDS32_GOTPC_LO12:
6027 case R_NDS32_GOTOFF:
6028 case R_NDS32_GOTOFF_HI20:
6029 case R_NDS32_GOTOFF_LO12:
6030 case R_NDS32_GOTOFF_LO15:
6031 case R_NDS32_GOTOFF_LO19:
6032 case R_NDS32_PLTREL_HI20:
6033 case R_NDS32_PLTREL_LO12:
6034 case R_NDS32_PLT_GOTREL_HI20:
6035 case R_NDS32_PLT_GOTREL_LO12:
6036 case R_NDS32_PLT_GOTREL_LO15:
6037 case R_NDS32_PLT_GOTREL_LO19:
6038 case R_NDS32_PLT_GOTREL_LO20:
6039 case R_NDS32_17IFC_PCREL_RELA:
6040 case R_NDS32_10IFCU_PCREL_RELA:
1c8f6a4d
KLC
6041 case R_NDS32_TLS_LE_HI20:
6042 case R_NDS32_TLS_LE_LO12:
6043 case R_NDS32_TLS_IE_HI20:
6044 case R_NDS32_TLS_IE_LO12S2:
6045 case R_NDS32_TLS_LE_20:
6046 case R_NDS32_TLS_LE_15S0:
6047 case R_NDS32_TLS_LE_15S1:
6048 case R_NDS32_TLS_LE_15S2:
fbaf61ad
NC
6049 case R_NDS32_TLS_DESC_HI20:
6050 case R_NDS32_TLS_DESC_LO12:
6051 case R_NDS32_TLS_IE_LO12:
6052 case R_NDS32_TLS_IEGP_HI20:
6053 case R_NDS32_TLS_IEGP_LO12:
6054 case R_NDS32_TLS_IEGP_LO12S2:
35c08157 6055 /* Instruction related relocs must handle endian properly. */
1c8f6a4d 6056 /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER. */
35c08157
KLC
6057 r = nds32_elf_final_link_relocate (howto, input_bfd,
6058 input_section, contents,
6059 rel->r_offset, relocation,
6060 rel->r_addend);
6061 break;
6062
6063 default:
6064 /* All other relocs can use default handler. */
6065 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
6066 contents, rel->r_offset,
6067 relocation, rel->r_addend);
6068 break;
6069 }
6070
dc1e8a47 6071 check_reloc:
35c08157
KLC
6072
6073 if (r != bfd_reloc_ok)
6074 {
6075 /* FIXME: This should be generic enough to go in a utility. */
6076 const char *name;
6077
6078 if (h != NULL)
6079 name = h->root.root.string;
6080 else
6081 {
6082 name = bfd_elf_string_from_elf_section
6083 (input_bfd, symtab_hdr->sh_link, sym->st_name);
6084 if (name == NULL || *name == '\0')
fd361982 6085 name = bfd_section_name (sec);
35c08157
KLC
6086 }
6087
6088 if (errmsg != NULL)
6089 goto common_error;
6090
6091 switch (r)
6092 {
6093 case bfd_reloc_overflow:
1a72702b
AM
6094 (*info->callbacks->reloc_overflow)
6095 (info, (h ? &h->root : NULL), name, howto->name,
6096 (bfd_vma) 0, input_bfd, input_section, offset);
35c08157
KLC
6097 break;
6098
6099 case bfd_reloc_undefined:
1a72702b
AM
6100 (*info->callbacks->undefined_symbol)
6101 (info, name, input_bfd, input_section, offset, TRUE);
35c08157
KLC
6102 break;
6103
6104 case bfd_reloc_outofrange:
6105 errmsg = _("internal error: out of range error");
6106 goto common_error;
6107
6108 case bfd_reloc_notsupported:
6109 errmsg = _("internal error: unsupported relocation error");
6110 goto common_error;
6111
6112 case bfd_reloc_dangerous:
6113 errmsg = _("internal error: dangerous error");
6114 goto common_error;
6115
6116 default:
6117 errmsg = _("internal error: unknown error");
6118 /* Fall through. */
6119
dc1e8a47 6120 common_error:
1a72702b
AM
6121 (*info->callbacks->warning) (info, errmsg, name, input_bfd,
6122 input_section, offset);
35c08157
KLC
6123 break;
6124 }
6125 }
6126 }
6127
fbaf61ad
NC
6128 /* Resotre header size to avoid overflow load. */
6129 if (elf_nds32_tdata (input_bfd)->hdr_size != 0)
6130 symtab_hdr->sh_size = elf_nds32_tdata (input_bfd)->hdr_size;
6131
35c08157
KLC
6132 return ret;
6133}
6134
6135/* Finish up dynamic symbol handling. We set the contents of various
6136 dynamic sections here. */
6137
6138static bfd_boolean
6139nds32_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
6140 struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
6141{
fbaf61ad
NC
6142 struct elf_link_hash_table *ehtab;
6143 struct elf_nds32_link_hash_entry *hent;
35c08157
KLC
6144 bfd_byte *loc;
6145
fbaf61ad
NC
6146 ehtab = elf_hash_table (info);
6147 hent = (struct elf_nds32_link_hash_entry *) h;
35c08157
KLC
6148
6149 if (h->plt.offset != (bfd_vma) - 1)
6150 {
6151 asection *splt;
6152 asection *sgot;
6153 asection *srela;
6154
6155 bfd_vma plt_index;
6156 bfd_vma got_offset;
6157 bfd_vma local_plt_offset;
6158 Elf_Internal_Rela rela;
6159
6160 /* This symbol has an entry in the procedure linkage table. Set
6161 it up. */
6162
6163 BFD_ASSERT (h->dynindx != -1);
6164
fbaf61ad
NC
6165 splt = ehtab->splt;
6166 sgot = ehtab->sgotplt;
6167 srela = ehtab->srelplt;
35c08157
KLC
6168 BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
6169
6170 /* Get the index in the procedure linkage table which
6171 corresponds to this symbol. This is the index of this symbol
6172 in all the symbols for which we are making plt entries. The
6173 first entry in the procedure linkage table is reserved. */
6174 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
6175
6176 /* Get the offset into the .got table of the entry that
6177 corresponds to this function. Each .got entry is 4 bytes.
6178 The first three are reserved. */
6179 got_offset = (plt_index + 3) * 4;
6180
6181 /* Fill in the entry in the procedure linkage table. */
0e1862bb 6182 if (!bfd_link_pic (info))
35c08157
KLC
6183 {
6184 unsigned long insn;
6185
6186 insn = PLT_ENTRY_WORD0 + (((sgot->output_section->vma
6187 + sgot->output_offset + got_offset) >> 12)
6188 & 0xfffff);
6189 bfd_putb32 (insn, splt->contents + h->plt.offset);
6190
6191 insn = PLT_ENTRY_WORD1 + (((sgot->output_section->vma
6192 + sgot->output_offset + got_offset) & 0x0fff)
6193 >> 2);
6194 bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
6195
6196 insn = PLT_ENTRY_WORD2;
6197 bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
6198
6199 insn = PLT_ENTRY_WORD3 + (plt_index & 0x7ffff);
6200 bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
6201
6202 insn = PLT_ENTRY_WORD4
6203 + (((unsigned int) ((-(h->plt.offset + 16)) >> 1)) & 0xffffff);
6204 bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
6205 local_plt_offset = 12;
6206 }
6207 else
6208 {
6209 /* sda_base must be set at this time. */
6210 unsigned long insn;
6211 long offset;
6212
35c08157
KLC
6213 offset = sgot->output_section->vma + sgot->output_offset + got_offset
6214 - elf_gp (output_bfd);
6215 insn = PLT_PIC_ENTRY_WORD0 + ((offset >> 12) & 0xfffff);
6216 bfd_putb32 (insn, splt->contents + h->plt.offset);
6217
6218 insn = PLT_PIC_ENTRY_WORD1 + (offset & 0xfff);
6219 bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
6220
6221 insn = PLT_PIC_ENTRY_WORD2;
6222 bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
6223
6224 insn = PLT_PIC_ENTRY_WORD3;
6225 bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
6226
6227 insn = PLT_PIC_ENTRY_WORD4 + (plt_index & 0x7fffff);
6228 bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
6229
6230 insn = PLT_PIC_ENTRY_WORD5
6231 + (((unsigned int) ((-(h->plt.offset + 20)) >> 1)) & 0xffffff);
6232 bfd_putb32 (insn, splt->contents + h->plt.offset + 20);
6233
6234 local_plt_offset = 16;
6235 }
6236
6237 /* Fill in the entry in the global offset table,
6238 so it will fall through to the next instruction for the first time. */
6239 bfd_put_32 (output_bfd,
6240 (splt->output_section->vma + splt->output_offset
6241 + h->plt.offset + local_plt_offset),
6242 sgot->contents + got_offset);
6243
6244 /* Fill in the entry in the .rela.plt section. */
6245 rela.r_offset = (sgot->output_section->vma
6246 + sgot->output_offset + got_offset);
6247 rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_JMP_SLOT);
6248 rela.r_addend = 0;
6249 loc = srela->contents;
6250 loc += plt_index * sizeof (Elf32_External_Rela);
6251 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
6252
6253 if (!h->def_regular)
6254 {
6255 /* Mark the symbol as undefined, rather than as defined in
6256 the .plt section. Leave the value alone. */
6257 sym->st_shndx = SHN_UNDEF;
6258 if (!h->ref_regular_nonweak)
6259 sym->st_value = 0;
6260 }
6261 }
6262
fbaf61ad
NC
6263 if (h->got.offset != (bfd_vma) - 1
6264 && hent->tls_type == GOT_NORMAL)
35c08157
KLC
6265 {
6266 asection *sgot;
fbaf61ad 6267 asection *srelagot;
35c08157
KLC
6268 Elf_Internal_Rela rela;
6269
6270 /* This symbol has an entry in the global offset table.
6271 Set it up. */
6272
fbaf61ad
NC
6273 sgot = ehtab->sgot;
6274 srelagot = ehtab->srelgot;
6275 BFD_ASSERT (sgot != NULL && srelagot != NULL);
35c08157
KLC
6276
6277 rela.r_offset = (sgot->output_section->vma
6278 + sgot->output_offset + (h->got.offset & ~1));
6279
6280 /* If this is a -Bsymbolic link, and the symbol is defined
6281 locally, we just want to emit a RELATIVE reloc. Likewise if
6282 the symbol was forced to be local because of a version file.
6283 The entry in the global offset table will already have been
6284 initialized in the relocate_section function. */
fbaf61ad
NC
6285 if ((bfd_link_pic (info)
6286 && (info->symbolic || h->dynindx == -1 || h->forced_local)
6287 && h->def_regular)
6288 || (bfd_link_pie (info) && h->def_regular))
35c08157
KLC
6289 {
6290 rela.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
6291 rela.r_addend = (h->root.u.def.value
6292 + h->root.u.def.section->output_section->vma
6293 + h->root.u.def.section->output_offset);
fbaf61ad
NC
6294
6295 if ((h->got.offset & 1) == 0)
6296 {
6297 bfd_put_32 (output_bfd, rela.r_addend,
6298 sgot->contents + h->got.offset);
6299 }
35c08157
KLC
6300 }
6301 else
6302 {
6303 BFD_ASSERT ((h->got.offset & 1) == 0);
6304 bfd_put_32 (output_bfd, (bfd_vma) 0,
6305 sgot->contents + h->got.offset);
6306 rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_GLOB_DAT);
6307 rela.r_addend = 0;
6308 }
6309
fbaf61ad
NC
6310 loc = srelagot->contents;
6311 loc += srelagot->reloc_count * sizeof (Elf32_External_Rela);
35c08157 6312 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
fbaf61ad
NC
6313 ++srelagot->reloc_count;
6314 BFD_ASSERT (loc < (srelagot->contents + srelagot->size));
35c08157
KLC
6315 }
6316
6317 if (h->needs_copy)
6318 {
6319 asection *s;
6320 Elf_Internal_Rela rela;
6321
6322 /* This symbols needs a copy reloc. Set it up. */
6323
6324 BFD_ASSERT (h->dynindx != -1
6325 && (h->root.type == bfd_link_hash_defined
6326 || h->root.type == bfd_link_hash_defweak));
6327
6328 s = bfd_get_section_by_name (h->root.u.def.section->owner, ".rela.bss");
6329 BFD_ASSERT (s != NULL);
6330
6331 rela.r_offset = (h->root.u.def.value
6332 + h->root.u.def.section->output_section->vma
6333 + h->root.u.def.section->output_offset);
6334 rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_COPY);
6335 rela.r_addend = 0;
6336 loc = s->contents;
6337 loc += s->reloc_count * sizeof (Elf32_External_Rela);
6338 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
6339 ++s->reloc_count;
6340 }
6341
6342 /* Mark some specially defined symbols as absolute. */
6343 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
6344 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
6345 sym->st_shndx = SHN_ABS;
6346
6347 return TRUE;
6348}
6349
6350
6351/* Finish up the dynamic sections. */
6352
6353static bfd_boolean
6354nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
6355{
35c08157
KLC
6356 bfd *dynobj;
6357 asection *sdyn;
fbaf61ad
NC
6358 asection *sgotplt;
6359 struct elf_link_hash_table *ehtab;
6360 struct elf_nds32_link_hash_table *htab;
35c08157 6361
fbaf61ad 6362 ehtab = elf_hash_table (info);
35c08157 6363 htab = nds32_elf_hash_table (info);
fbaf61ad
NC
6364 if (htab == NULL)
6365 return FALSE;
6366
6367 dynobj = elf_hash_table (info)->dynobj;
35c08157 6368
fbaf61ad
NC
6369 sgotplt = ehtab->sgotplt;
6370 /* A broken linker script might have discarded the dynamic sections.
6371 Catch this here so that we do not seg-fault later on. */
6372 if (sgotplt != NULL && bfd_is_abs_section (sgotplt->output_section))
6373 return FALSE;
35c08157
KLC
6374 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
6375
fbaf61ad 6376 if (elf_hash_table (info)->dynamic_sections_created)
35c08157
KLC
6377 {
6378 asection *splt;
6379 Elf32_External_Dyn *dyncon, *dynconend;
6380
fbaf61ad 6381 BFD_ASSERT (sgotplt != NULL && sdyn != NULL);
35c08157
KLC
6382
6383 dyncon = (Elf32_External_Dyn *) sdyn->contents;
6384 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
6385
6386 for (; dyncon < dynconend; dyncon++)
6387 {
6388 Elf_Internal_Dyn dyn;
6389 asection *s;
6390
6391 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
6392
6393 switch (dyn.d_tag)
6394 {
6395 default:
6396 break;
6397
6398 case DT_PLTGOT:
fbaf61ad
NC
6399 /* name = ".got"; */
6400 s = ehtab->sgot->output_section;
35c08157
KLC
6401 goto get_vma;
6402 case DT_JMPREL:
fbaf61ad 6403 s = ehtab->srelplt->output_section;
dc1e8a47 6404 get_vma:
fbaf61ad
NC
6405 BFD_ASSERT (s != NULL);
6406 dyn.d_un.d_ptr = s->vma;
35c08157
KLC
6407 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6408 break;
6409
6410 case DT_PLTRELSZ:
fbaf61ad
NC
6411 s = ehtab->srelplt->output_section;
6412 BFD_ASSERT (s != NULL);
35c08157
KLC
6413 dyn.d_un.d_val = s->size;
6414 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6415 break;
fbaf61ad
NC
6416
6417 case DT_RELASZ:
6418 /* My reading of the SVR4 ABI indicates that the
6419 procedure linkage table relocs (DT_JMPREL) should be
6420 included in the overall relocs (DT_RELA). This is
6421 what Solaris does. However, UnixWare can not handle
6422 that case. Therefore, we override the DT_RELASZ entry
6423 here to make it not include the JMPREL relocs. Since
6424 the linker script arranges for .rela.plt to follow all
6425 other relocation sections, we don't have to worry
6426 about changing the DT_RELA entry. */
6427 if (ehtab->srelplt != NULL)
6428 {
6429 s = ehtab->srelplt->output_section;
6430 dyn.d_un.d_val -= s->size;
6431 }
6432 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6433 break;
6434
6435 case DT_TLSDESC_PLT:
6436 s = htab->root.splt;
6437 dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
6438 + htab->dt_tlsdesc_plt);
6439 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6440 break;
6441
6442 case DT_TLSDESC_GOT:
6443 s = htab->root.sgot;
6444 dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
6445 + htab->dt_tlsdesc_got);
6446 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6447 break;
35c08157
KLC
6448 }
6449 }
6450
6451 /* Fill in the first entry in the procedure linkage table. */
fbaf61ad 6452 splt = ehtab->splt;
35c08157
KLC
6453 if (splt && splt->size > 0)
6454 {
0e1862bb 6455 if (bfd_link_pic (info))
35c08157
KLC
6456 {
6457 unsigned long insn;
6458 long offset;
6459
fbaf61ad
NC
6460 offset = sgotplt->output_section->vma + sgotplt->output_offset + 4
6461 - elf_gp (output_bfd);
35c08157
KLC
6462 insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff);
6463 bfd_putb32 (insn, splt->contents);
6464
35c08157
KLC
6465 /* here has a typo? */
6466 insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff);
6467 bfd_putb32 (insn, splt->contents + 4);
6468
6469 insn = PLT0_PIC_ENTRY_WORD2;
6470 bfd_putb32 (insn, splt->contents + 8);
6471
6472 insn = PLT0_PIC_ENTRY_WORD3;
6473 bfd_putb32 (insn, splt->contents + 12);
6474
6475 insn = PLT0_PIC_ENTRY_WORD4;
6476 bfd_putb32 (insn, splt->contents + 16);
6477
6478 insn = PLT0_PIC_ENTRY_WORD5;
6479 bfd_putb32 (insn, splt->contents + 20);
6480 }
6481 else
6482 {
6483 unsigned long insn;
6484 unsigned long addr;
6485
6486 /* addr = .got + 4 */
fbaf61ad 6487 addr = sgotplt->output_section->vma + sgotplt->output_offset + 4;
35c08157
KLC
6488 insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff);
6489 bfd_putb32 (insn, splt->contents);
6490
6491 insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff);
6492 bfd_putb32 (insn, splt->contents + 4);
6493
6494 insn = PLT0_ENTRY_WORD2;
6495 bfd_putb32 (insn, splt->contents + 8);
6496
6497 insn = PLT0_ENTRY_WORD3;
6498 bfd_putb32 (insn, splt->contents + 12);
6499
6500 insn = PLT0_ENTRY_WORD4;
6501 bfd_putb32 (insn, splt->contents + 16);
6502 }
6503
6504 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
6505 PLT_ENTRY_SIZE;
6506 }
fbaf61ad
NC
6507
6508 if (htab->dt_tlsdesc_plt)
6509 {
6510 /* Calculate addresses. */
6511 asection *sgot = sgot = ehtab->sgot;
6512 bfd_vma pltgot = sgotplt->output_section->vma
6513 + sgotplt->output_offset;
6514 bfd_vma tlsdesc_got = sgot->output_section->vma + sgot->output_offset
6515 + htab->dt_tlsdesc_got;
6516
6517 /* Get GP offset. */
6518 pltgot -= elf_gp (output_bfd) - 4; /* PLTGOT[1] */
6519 tlsdesc_got -= elf_gp (output_bfd);
6520
6521 /* Do relocation. */
6522 dl_tlsdesc_lazy_trampoline[0] += ((1 << 20) - 1) & (tlsdesc_got >> 12);
6523 dl_tlsdesc_lazy_trampoline[1] += 0xfff & tlsdesc_got;
6524 dl_tlsdesc_lazy_trampoline[4] += ((1 << 20) - 1) & (pltgot >> 12);
6525 dl_tlsdesc_lazy_trampoline[5] += 0xfff & pltgot;
6526
6527 /* Insert .plt. */
6528 nds32_put_trampoline (splt->contents + htab->dt_tlsdesc_plt,
6529 dl_tlsdesc_lazy_trampoline,
6530 ARRAY_SIZE (dl_tlsdesc_lazy_trampoline));
6531 }
35c08157
KLC
6532 }
6533
6534 /* Fill in the first three entries in the global offset table. */
fbaf61ad 6535 if (sgotplt && sgotplt->size > 0)
35c08157
KLC
6536 {
6537 if (sdyn == NULL)
fbaf61ad 6538 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
35c08157
KLC
6539 else
6540 bfd_put_32 (output_bfd,
6541 sdyn->output_section->vma + sdyn->output_offset,
fbaf61ad
NC
6542 sgotplt->contents);
6543 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
6544 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
35c08157 6545
fbaf61ad 6546 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
35c08157
KLC
6547 }
6548
6549 return TRUE;
6550}
6551\f
6552
6553/* Set the right machine number. */
6554
6555static bfd_boolean
6556nds32_elf_object_p (bfd *abfd)
6557{
6558 static unsigned int cur_arch = 0;
6559
6560 if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH))
6561 {
6562 /* E_N1_ARCH is a wild card, so it is set only when no others exist. */
6563 cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH);
6564 }
6565
6566 switch (cur_arch)
6567 {
6568 default:
6569 case E_N1_ARCH:
6570 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1);
6571 break;
6572 case E_N1H_ARCH:
6573 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h);
6574 break;
6575 case E_NDS_ARCH_STAR_V2_0:
6576 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2);
6577 break;
6578 case E_NDS_ARCH_STAR_V3_0:
6579 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3);
6580 break;
6581 case E_NDS_ARCH_STAR_V3_M:
6582 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m);
6583 break;
6584 }
6585
6586 return TRUE;
6587}
6588
6589/* Store the machine number in the flags field. */
6590
cc364be6
AM
6591static bfd_boolean
6592nds32_elf_final_write_processing (bfd *abfd)
35c08157
KLC
6593{
6594 unsigned long val;
6595 static unsigned int cur_mach = 0;
6596
6597 if (bfd_mach_n1 != bfd_get_mach (abfd))
6598 {
6599 cur_mach = bfd_get_mach (abfd);
6600 }
6601
6602 switch (cur_mach)
6603 {
6604 case bfd_mach_n1:
6605 /* Only happen when object is empty, since the case is abandon. */
6606 val = E_N1_ARCH;
6607 val |= E_NDS_ABI_AABI;
6608 val |= E_NDS32_ELF_VER_1_4;
6609 break;
6610 case bfd_mach_n1h:
6611 val = E_N1H_ARCH;
6612 break;
6613 case bfd_mach_n1h_v2:
6614 val = E_NDS_ARCH_STAR_V2_0;
6615 break;
6616 case bfd_mach_n1h_v3:
6617 val = E_NDS_ARCH_STAR_V3_0;
6618 break;
6619 case bfd_mach_n1h_v3m:
6620 val = E_NDS_ARCH_STAR_V3_M;
6621 break;
6622 default:
6623 val = 0;
6624 break;
6625 }
6626
6627 elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH;
6628 elf_elfheader (abfd)->e_flags |= val;
cc364be6 6629 return _bfd_elf_final_write_processing (abfd);
35c08157
KLC
6630}
6631
6632/* Function to keep NDS32 specific file flags. */
6633
6634static bfd_boolean
6635nds32_elf_set_private_flags (bfd *abfd, flagword flags)
6636{
6637 BFD_ASSERT (!elf_flags_init (abfd)
6638 || elf_elfheader (abfd)->e_flags == flags);
6639
6640 elf_elfheader (abfd)->e_flags = flags;
6641 elf_flags_init (abfd) = TRUE;
6642 return TRUE;
6643}
6644
6645static unsigned int
6646convert_e_flags (unsigned int e_flags, unsigned int arch)
6647{
6648 if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9)
6649 {
6650 /* From 0.9 to 1.0. */
6651 e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0;
6652
6653 /* Invert E_NDS32_HAS_NO_MAC_INST. */
6654 e_flags ^= E_NDS32_HAS_NO_MAC_INST;
6655 if (arch == E_NDS_ARCH_STAR_V1_0)
6656 {
6657 /* Done. */
6658 return e_flags;
6659 }
6660 }
6661
6662 /* From 1.0 to 2.0. */
6663 e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0;
6664
6665 /* Clear E_NDS32_HAS_MFUSR_PC_INST. */
6666 e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST;
6667
6668 /* Invert E_NDS32_HAS_NO_MAC_INST. */
6669 e_flags ^= E_NDS32_HAS_NO_MAC_INST;
6670 return e_flags;
6671}
6672
6673static bfd_boolean
6674nds32_check_vec_size (bfd *ibfd)
6675{
6676 static unsigned int nds32_vec_size = 0;
6677
6678 asection *sec_t = NULL;
6679 bfd_byte *contents = NULL;
6680
6681 sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags");
6682
6683 if (sec_t && sec_t->size >= 4)
6684 {
6685 /* Get vec_size in file. */
6686 unsigned int flag_t;
6687
0c4bd9d9 6688 nds32_get_section_contents (ibfd, sec_t, &contents, TRUE);
35c08157
KLC
6689 flag_t = bfd_get_32 (ibfd, contents);
6690
6691 /* The value could only be 4 or 16. */
6692
6693 if (!nds32_vec_size)
6694 /* Set if not set yet. */
6695 nds32_vec_size = (flag_t & 0x3);
6696 else if (nds32_vec_size != (flag_t & 0x3))
6697 {
4eca0228 6698 _bfd_error_handler
695344c0 6699 /* xgettext:c-format */
871b3ab2 6700 (_("%pB: ISR vector size mismatch"
4eca0228
AM
6701 " with previous modules, previous %u-byte, current %u-byte"),
6702 ibfd,
6703 nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff,
6704 (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff);
35c08157
KLC
6705 return FALSE;
6706 }
6707 else
6708 /* Only keep the first vec_size section. */
6709 sec_t->flags |= SEC_EXCLUDE;
6710 }
6711
6712 return TRUE;
6713}
6714
6715/* Merge backend specific data from an object file to the output
6716 object file when linking. */
6717
6718static bfd_boolean
50e03d47 6719nds32_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
35c08157 6720{
50e03d47 6721 bfd *obfd = info->output_bfd;
35c08157
KLC
6722 flagword out_flags;
6723 flagword in_flags;
6724 flagword out_16regs;
6725 flagword in_no_mac;
6726 flagword out_no_mac;
6727 flagword in_16regs;
6728 flagword out_version;
6729 flagword in_version;
6730 flagword out_fpu_config;
6731 flagword in_fpu_config;
6732
6b728d32
AM
6733 /* FIXME: What should be checked when linking shared libraries? */
6734 if ((ibfd->flags & DYNAMIC) != 0)
6735 return TRUE;
6736
35c08157
KLC
6737 /* TODO: Revise to use object-attributes instead. */
6738 if (!nds32_check_vec_size (ibfd))
6739 return FALSE;
6740
6741 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6742 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6743 return TRUE;
6744
6745 if (bfd_little_endian (ibfd) != bfd_little_endian (obfd))
6746 {
4eca0228 6747 _bfd_error_handler
38f14ab8 6748 (_("%pB: warning: endian mismatch with previous modules"), ibfd);
35c08157
KLC
6749
6750 bfd_set_error (bfd_error_bad_value);
6751 return FALSE;
6752 }
6753
fbaf61ad
NC
6754 /* -B option in objcopy cannot work as expected. e_flags = 0 shall be
6755 treat as generic one without checking and merging. */
6756 if (elf_elfheader (ibfd)->e_flags)
35c08157 6757 {
fbaf61ad
NC
6758 in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION;
6759 if (in_version == E_NDS32_ELF_VER_1_2)
35c08157 6760 {
fbaf61ad
NC
6761 _bfd_error_handler
6762 (_("%pB: warning: older version of object file encountered, "
6763 "please recompile with current tool chain"), ibfd);
35c08157 6764 }
35c08157 6765
fbaf61ad
NC
6766 /* We may need to merge V1 and V2 arch object files to V2. */
6767 if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6768 != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
35c08157 6769 {
fbaf61ad
NC
6770 /* Need to convert version. */
6771 if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6772 == E_NDS_ARCH_STAR_RESERVED)
6773 {
6774 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6775 }
6776 else if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6777 == E_NDS_ARCH_STAR_V3_M
6778 && (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)
6779 == E_NDS_ARCH_STAR_V3_0)
6780 {
6781 elf_elfheader (ibfd)->e_flags =
6782 (elf_elfheader (ibfd)->e_flags & (~EF_NDS_ARCH))
6783 | E_NDS_ARCH_STAR_V3_0;
6784 }
6785 else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)
6786 == E_NDS_ARCH_STAR_V0_9
6787 || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6788 > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
6789 {
6790 elf_elfheader (obfd)->e_flags =
6791 convert_e_flags (elf_elfheader (obfd)->e_flags,
6792 (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH));
6793 }
6794 else
6795 {
6796 elf_elfheader (ibfd)->e_flags =
6797 convert_e_flags (elf_elfheader (ibfd)->e_flags,
6798 (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH));
6799 }
35c08157
KLC
6800 }
6801
fbaf61ad
NC
6802 /* Extract some flags. */
6803 in_flags = elf_elfheader (ibfd)->e_flags
6804 & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6805 | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6806
6807 /* The following flags need special treatment. */
6808 in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6809 in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6810 in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF;
6811
6812 /* Extract some flags. */
6813 out_flags = elf_elfheader (obfd)->e_flags
6814 & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6815 | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6816
6817 /* The following flags need special treatment. */
6818 out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6819 out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6820 out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF;
6821 out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION;
6822 if (!elf_flags_init (obfd))
6823 {
6824 /* If the input is the default architecture then do not
6825 bother setting the flags for the output architecture,
6826 instead allow future merges to do this. If no future
6827 merges ever set these flags then they will retain their
6828 unitialised values, which surprise surprise, correspond
6829 to the default values. */
6830 if (bfd_get_arch_info (ibfd)->the_default)
6831 return TRUE;
6832
6833 elf_flags_init (obfd) = TRUE;
6834 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
35c08157 6835
fbaf61ad
NC
6836 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6837 && bfd_get_arch_info (obfd)->the_default)
6838 {
6839 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
6840 bfd_get_mach (ibfd));
6841 }
35c08157 6842
fbaf61ad
NC
6843 return TRUE;
6844 }
35c08157 6845
fbaf61ad
NC
6846 /* Check flag compatibility. */
6847 if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI))
35c08157 6848 {
4eca0228 6849 _bfd_error_handler
fbaf61ad 6850 (_("%pB: error: ABI mismatch with previous modules"), ibfd);
35c08157
KLC
6851 bfd_set_error (bfd_error_bad_value);
6852 return FALSE;
6853 }
35c08157 6854
fbaf61ad
NC
6855 if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH))
6856 {
6857 if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH))
6858 {
6859 _bfd_error_handler
6860 (_("%pB: error: instruction set mismatch with previous modules"),
6861 ibfd);
6862
6863 bfd_set_error (bfd_error_bad_value);
6864 return FALSE;
6865 }
6866 }
6867
6868 /* When linking with V1.2 and V1.3 objects together the output is V1.2.
6869 and perf ext1 and DIV are mergerd to perf ext1. */
6870 if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2)
6871 {
6872 elf_elfheader (obfd)->e_flags =
6873 (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6874 | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6875 | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6876 ? E_NDS32_HAS_EXT_INST : 0)
6877 | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6878 ? E_NDS32_HAS_EXT_INST : 0)
6879 | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6880 | ((in_version > out_version) ? out_version : in_version);
6881 }
6882 else
6883 {
6884 if (in_version != out_version)
6885 _bfd_error_handler
6886 /* xgettext:c-format */
6887 (_("%pB: warning: incompatible elf-versions %s and %s"),
6888 ibfd, nds32_elfver_strtab[out_version],
6889 nds32_elfver_strtab[in_version]);
35c08157 6890
fbaf61ad
NC
6891 elf_elfheader (obfd)->e_flags = in_flags | out_flags
6892 | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6893 | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config)
6894 | (in_version > out_version ? out_version : in_version);
6895 }
35c08157
KLC
6896 }
6897
6898 return TRUE;
6899}
6900
6901/* Display the flags field. */
6902
6903static bfd_boolean
6904nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6905{
6906 FILE *file = (FILE *) ptr;
6907
6908 BFD_ASSERT (abfd != NULL && ptr != NULL);
6909
6910 _bfd_elf_print_private_bfd_data (abfd, ptr);
6911
6912 fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
6913
6914 switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)
6915 {
6916 default:
6917 case E_N1_ARCH:
6918 fprintf (file, _(": n1 instructions"));
6919 break;
6920 case E_N1H_ARCH:
6921 fprintf (file, _(": n1h instructions"));
6922 break;
6923 }
6924
6925 fputc ('\n', file);
6926
6927 return TRUE;
6928}
6929
6930static unsigned int
6931nds32_elf_action_discarded (asection *sec)
6932{
6933
6934 if (strncmp
6935 (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0)
6936 return 0;
6937
6938 return _bfd_elf_default_action_discarded (sec);
6939}
6940
6941static asection *
6942nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
6943 Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
6944 Elf_Internal_Sym *sym)
6945{
6946 if (h != NULL)
6947 switch (ELF32_R_TYPE (rel->r_info))
6948 {
6949 case R_NDS32_GNU_VTINHERIT:
6950 case R_NDS32_GNU_VTENTRY:
6951 case R_NDS32_RELA_GNU_VTINHERIT:
6952 case R_NDS32_RELA_GNU_VTENTRY:
6953 return NULL;
6954 }
6955
6956 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6957}
6958
fbaf61ad
NC
6959static enum elf_nds32_tls_type
6960get_tls_type (enum elf_nds32_reloc_type r_type,
6961 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
6962{
6963 enum elf_nds32_tls_type tls_type;
6964
6965 switch (r_type)
6966 {
6967 case R_NDS32_TLS_LE_HI20:
6968 case R_NDS32_TLS_LE_LO12:
6969 tls_type = GOT_TLS_LE;
6970 break;
6971 case R_NDS32_TLS_IE_HI20:
6972 case R_NDS32_TLS_IE_LO12S2:
6973 case R_NDS32_TLS_IE_LO12:
6974 tls_type = GOT_TLS_IE;
6975 break;
6976 case R_NDS32_TLS_IEGP_HI20:
6977 case R_NDS32_TLS_IEGP_LO12:
6978 case R_NDS32_TLS_IEGP_LO12S2:
6979 tls_type = GOT_TLS_IEGP;
6980 break;
6981 case R_NDS32_TLS_DESC_HI20:
6982 case R_NDS32_TLS_DESC_LO12:
6983 case R_NDS32_TLS_DESC_ADD:
6984 case R_NDS32_TLS_DESC_FUNC:
6985 case R_NDS32_TLS_DESC_CALL:
6986 tls_type = GOT_TLS_DESC;
6987 break;
6988 default:
6989 tls_type = GOT_NORMAL;
6990 break;
6991 }
6992
6993 return tls_type;
6994}
6995
6996/* Ensure that we have allocated bookkeeping structures for ABFD's local
6997 symbols. */
6998
6999static bfd_boolean
7000elf32_nds32_allocate_local_sym_info (bfd *abfd)
7001{
7002 if (elf_local_got_refcounts (abfd) == NULL)
7003 {
7004 bfd_size_type num_syms;
7005 bfd_size_type size;
7006 char *data;
7007
7008 num_syms = elf_tdata (abfd)->symtab_hdr.sh_info;
7009 /* This space is for got_refcounts, got_tls_type, tlsdesc_gotent, and
7010 gp_offset. The details can refer to struct elf_nds32_obj_tdata. */
7011 size = num_syms * (sizeof (bfd_signed_vma) + sizeof (char)
7012 + sizeof (bfd_vma) + sizeof (int)
7013 + sizeof (bfd_boolean) + sizeof (bfd_vma));
7014 data = bfd_zalloc (abfd, size);
7015 if (data == NULL)
7016 return FALSE;
7017
7018 elf_local_got_refcounts (abfd) = (bfd_signed_vma *) data;
7019 data += num_syms * sizeof (bfd_signed_vma);
7020
7021 elf32_nds32_local_got_tls_type (abfd) = (char *) data;
7022 data += num_syms * sizeof (char);
7023
7024 elf32_nds32_local_tlsdesc_gotent (abfd) = (bfd_vma *) data;
7025 data += num_syms * sizeof (bfd_vma);
7026
7027 elf32_nds32_local_gp_offset (abfd) = (int *) data;
7028 data += num_syms * sizeof (int);
7029 }
7030
7031 return TRUE;
7032}
7033
35c08157
KLC
7034/* Look through the relocs for a section during the first phase.
7035 Since we don't do .gots or .plts, we just need to consider the
7036 virtual table relocs for gc. */
7037
7038static bfd_boolean
7039nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
7040 asection *sec, const Elf_Internal_Rela *relocs)
7041{
7042 Elf_Internal_Shdr *symtab_hdr;
7043 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
7044 const Elf_Internal_Rela *rel;
7045 const Elf_Internal_Rela *rel_end;
fbaf61ad 7046 struct elf_link_hash_table *ehtab;
35c08157
KLC
7047 struct elf_nds32_link_hash_table *htab;
7048 bfd *dynobj;
7049 asection *sreloc = NULL;
7050
fbaf61ad 7051 /* No need for relocation if relocatable already. */
0e1862bb 7052 if (bfd_link_relocatable (info))
fbaf61ad
NC
7053 {
7054 elf32_nds32_check_relax_group (abfd, sec);
7055 return TRUE;
7056 }
35c08157 7057
65281396
AM
7058 /* Don't do anything special with non-loaded, non-alloced sections.
7059 In particular, any relocs in such sections should not affect GOT
7060 and PLT reference counting (ie. we don't allow them to create GOT
7061 or PLT entries), there's no possibility or desire to optimize TLS
7062 relocs, and there's not much point in propagating relocs to shared
7063 libs that the dynamic linker won't relocate. */
7064 if ((sec->flags & SEC_ALLOC) == 0)
7065 return TRUE;
7066
35c08157
KLC
7067 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7068 sym_hashes = elf_sym_hashes (abfd);
7069 sym_hashes_end =
7070 sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
7071 if (!elf_bad_symtab (abfd))
7072 sym_hashes_end -= symtab_hdr->sh_info;
7073
fbaf61ad 7074 ehtab = elf_hash_table (info);
35c08157
KLC
7075 htab = nds32_elf_hash_table (info);
7076 dynobj = htab->root.dynobj;
7077
7078 rel_end = relocs + sec->reloc_count;
7079 for (rel = relocs; rel < rel_end; rel++)
7080 {
7081 enum elf_nds32_reloc_type r_type;
7082 struct elf_link_hash_entry *h;
7083 unsigned long r_symndx;
fbaf61ad 7084 enum elf_nds32_tls_type tls_type, old_tls_type;
35c08157
KLC
7085
7086 r_symndx = ELF32_R_SYM (rel->r_info);
7087 r_type = ELF32_R_TYPE (rel->r_info);
7088 if (r_symndx < symtab_hdr->sh_info)
7089 h = NULL;
7090 else
7091 {
7092 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7093 while (h->root.type == bfd_link_hash_indirect
7094 || h->root.type == bfd_link_hash_warning)
7095 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7096 }
7097
fbaf61ad
NC
7098 /* Create .got section if necessary.
7099 Some relocs require a global offset table. We create
7100 got section here, since these relocation need a got section
7101 and if it is not created yet. */
7102 if (ehtab->sgot == NULL)
35c08157
KLC
7103 {
7104 switch (r_type)
7105 {
7106 case R_NDS32_GOT_HI20:
7107 case R_NDS32_GOT_LO12:
7108 case R_NDS32_GOT_LO15:
7109 case R_NDS32_GOT_LO19:
7110 case R_NDS32_GOT17S2_RELA:
7111 case R_NDS32_GOT15S2_RELA:
7112 case R_NDS32_GOTOFF:
7113 case R_NDS32_GOTOFF_HI20:
7114 case R_NDS32_GOTOFF_LO12:
7115 case R_NDS32_GOTOFF_LO15:
7116 case R_NDS32_GOTOFF_LO19:
7117 case R_NDS32_GOTPC20:
7118 case R_NDS32_GOTPC_HI20:
7119 case R_NDS32_GOTPC_LO12:
7120 case R_NDS32_GOT20:
1c8f6a4d 7121 case R_NDS32_TLS_IE_HI20:
fbaf61ad 7122 case R_NDS32_TLS_IE_LO12:
1c8f6a4d 7123 case R_NDS32_TLS_IE_LO12S2:
fbaf61ad
NC
7124 case R_NDS32_TLS_IEGP_HI20:
7125 case R_NDS32_TLS_IEGP_LO12:
7126 case R_NDS32_TLS_IEGP_LO12S2:
7127 case R_NDS32_TLS_DESC_HI20:
7128 case R_NDS32_TLS_DESC_LO12:
35c08157
KLC
7129 if (dynobj == NULL)
7130 htab->root.dynobj = dynobj = abfd;
fbaf61ad 7131 if (!create_got_section (dynobj, info))
35c08157
KLC
7132 return FALSE;
7133 break;
7134
7135 default:
7136 break;
7137 }
7138 }
7139
fbaf61ad 7140 /* Check relocation type. */
35c08157
KLC
7141 switch ((int) r_type)
7142 {
7143 case R_NDS32_GOT_HI20:
7144 case R_NDS32_GOT_LO12:
7145 case R_NDS32_GOT_LO15:
7146 case R_NDS32_GOT_LO19:
7147 case R_NDS32_GOT20:
fbaf61ad
NC
7148 case R_NDS32_TLS_LE_HI20:
7149 case R_NDS32_TLS_LE_LO12:
1c8f6a4d 7150 case R_NDS32_TLS_IE_HI20:
fbaf61ad 7151 case R_NDS32_TLS_IE_LO12:
1c8f6a4d 7152 case R_NDS32_TLS_IE_LO12S2:
fbaf61ad
NC
7153 case R_NDS32_TLS_IEGP_HI20:
7154 case R_NDS32_TLS_IEGP_LO12:
7155 case R_NDS32_TLS_IEGP_LO12S2:
7156 case R_NDS32_TLS_DESC_HI20:
7157 case R_NDS32_TLS_DESC_LO12:
7158 tls_type = get_tls_type (r_type, h);
7159 if (h)
1c8f6a4d 7160 {
fbaf61ad
NC
7161 if (tls_type != GOT_TLS_LE)
7162 h->got.refcount += 1;
1c8f6a4d 7163 old_tls_type = elf32_nds32_hash_entry (h)->tls_type;
1c8f6a4d 7164 }
35c08157
KLC
7165 else
7166 {
fbaf61ad
NC
7167 /* This is a global offset table entry for a local symbol. */
7168 if (!elf32_nds32_allocate_local_sym_info (abfd))
7169 return FALSE;
35c08157 7170
fbaf61ad
NC
7171 BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
7172 if (tls_type != GOT_TLS_LE)
7173 elf_local_got_refcounts (abfd)[r_symndx] += 1;
1c8f6a4d 7174 old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx];
35c08157 7175 }
35c08157 7176
fbaf61ad 7177 /* We would already have issued an error message if there
1c8f6a4d
KLC
7178 is a TLS/non-TLS mismatch, based on the symbol
7179 type. So just combine any TLS types needed. */
7180 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
7181 && tls_type != GOT_NORMAL)
7182 tls_type |= old_tls_type;
7183
fbaf61ad
NC
7184 /* DESC to IE/IEGP if link to executable. */
7185 if ((tls_type & (GOT_TLS_DESC | GOT_TLS_IEGP))
7186 && (bfd_link_executable (info)))
7187 tls_type |= (bfd_link_pie (info) ? GOT_TLS_IEGP : GOT_TLS_IE);
7188
1c8f6a4d
KLC
7189 if (old_tls_type != tls_type)
7190 {
7191 if (h != NULL)
7192 elf32_nds32_hash_entry (h)->tls_type = tls_type;
7193 else
7194 elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type;
7195 }
7196 break;
7197 case R_NDS32_9_PLTREL:
35c08157
KLC
7198 case R_NDS32_25_PLTREL:
7199 case R_NDS32_PLTREL_HI20:
7200 case R_NDS32_PLTREL_LO12:
7201 case R_NDS32_PLT_GOTREL_HI20:
7202 case R_NDS32_PLT_GOTREL_LO12:
7203 case R_NDS32_PLT_GOTREL_LO15:
7204 case R_NDS32_PLT_GOTREL_LO19:
7205 case R_NDS32_PLT_GOTREL_LO20:
7206
7207 /* This symbol requires a procedure linkage table entry. We
7208 actually build the entry in adjust_dynamic_symbol,
7209 because this might be a case of linking PIC code without
7210 linking in any dynamic objects, in which case we don't
7211 need to generate a procedure linkage table after all. */
7212
7213 /* If this is a local symbol, we resolve it directly without
7214 creating a procedure linkage table entry. */
7215 if (h == NULL)
7216 continue;
7217
fbaf61ad
NC
7218 if (h->forced_local
7219 || (bfd_link_pie (info) && h->def_regular))
35c08157
KLC
7220 break;
7221
1c8f6a4d 7222 elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL;
35c08157
KLC
7223 h->needs_plt = 1;
7224 h->plt.refcount += 1;
7225 break;
7226
7227 case R_NDS32_16_RELA:
7228 case R_NDS32_20_RELA:
7229 case R_NDS32_5_RELA:
7230 case R_NDS32_32_RELA:
7231 case R_NDS32_HI20_RELA:
7232 case R_NDS32_LO12S3_RELA:
7233 case R_NDS32_LO12S2_RELA:
7234 case R_NDS32_LO12S2_DP_RELA:
7235 case R_NDS32_LO12S2_SP_RELA:
7236 case R_NDS32_LO12S1_RELA:
7237 case R_NDS32_LO12S0_RELA:
7238 case R_NDS32_LO12S0_ORI_RELA:
7239 case R_NDS32_SDA16S3_RELA:
7240 case R_NDS32_SDA17S2_RELA:
7241 case R_NDS32_SDA18S1_RELA:
7242 case R_NDS32_SDA19S0_RELA:
7243 case R_NDS32_SDA15S3_RELA:
7244 case R_NDS32_SDA15S2_RELA:
7245 case R_NDS32_SDA12S2_DP_RELA:
7246 case R_NDS32_SDA12S2_SP_RELA:
7247 case R_NDS32_SDA15S1_RELA:
7248 case R_NDS32_SDA15S0_RELA:
7249 case R_NDS32_SDA_FP7U2_RELA:
7250 case R_NDS32_15_PCREL_RELA:
7251 case R_NDS32_17_PCREL_RELA:
7252 case R_NDS32_25_PCREL_RELA:
7253
0e1862bb 7254 if (h != NULL && !bfd_link_pic (info))
35c08157
KLC
7255 {
7256 h->non_got_ref = 1;
7257 h->plt.refcount += 1;
7258 }
7259
7260 /* If we are creating a shared library, and this is a reloc against
7261 a global symbol, or a non PC relative reloc against a local
7262 symbol, then we need to copy the reloc into the shared library.
7263 However, if we are linking with -Bsymbolic, we do not need to
7264 copy a reloc against a global symbol which is defined in an
7265 object we are including in the link (i.e., DEF_REGULAR is set).
7266 At this point we have not seen all the input files, so it is
7267 possible that DEF_REGULAR is not set now but will be set later
7268 (it is never cleared). We account for that possibility below by
7269 storing information in the dyn_relocs field of the hash table
7270 entry. A similar situation occurs when creating shared libraries
7271 and symbol visibility changes render the symbol local.
7272
7273 If on the other hand, we are creating an executable, we may need
7274 to keep relocations for symbols satisfied by a dynamic library
7275 if we manage to avoid copy relocs for the symbol. */
0e1862bb 7276 if ((bfd_link_pic (info)
35c08157
KLC
7277 && (sec->flags & SEC_ALLOC) != 0
7278 && ((r_type != R_NDS32_25_PCREL_RELA
7279 && r_type != R_NDS32_15_PCREL_RELA
7280 && r_type != R_NDS32_17_PCREL_RELA
7281 && !(r_type == R_NDS32_32_RELA
7282 && strcmp (sec->name, ".eh_frame") == 0))
7283 || (h != NULL
7284 && (!info->symbolic
7285 || h->root.type == bfd_link_hash_defweak
7286 || !h->def_regular))))
0e1862bb 7287 || (!bfd_link_pic (info)
35c08157
KLC
7288 && (sec->flags & SEC_ALLOC) != 0
7289 && h != NULL
7290 && (h->root.type == bfd_link_hash_defweak
7291 || !h->def_regular)))
7292 {
3bf083ed
AM
7293 struct elf_dyn_relocs *p;
7294 struct elf_dyn_relocs **head;
35c08157
KLC
7295
7296 if (dynobj == NULL)
7297 htab->root.dynobj = dynobj = abfd;
7298
7299 /* When creating a shared object, we must copy these
7300 relocs into the output file. We create a reloc
7301 section in dynobj and make room for the reloc. */
7302 if (sreloc == NULL)
7303 {
7304 const char *name;
7305
7306 name = bfd_elf_string_from_elf_section
7307 (abfd, elf_elfheader (abfd)->e_shstrndx,
7308 elf_section_data (sec)->rela.hdr->sh_name);
7309 if (name == NULL)
7310 return FALSE;
7311
7312 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
fd361982 7313 && strcmp (bfd_section_name (sec),
35c08157
KLC
7314 name + 5) == 0);
7315
7316 sreloc = bfd_get_section_by_name (dynobj, name);
7317 if (sreloc == NULL)
7318 {
7319 flagword flags;
7320
7321 sreloc = bfd_make_section (dynobj, name);
7322 flags = (SEC_HAS_CONTENTS | SEC_READONLY
7323 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
7324 if ((sec->flags & SEC_ALLOC) != 0)
7325 flags |= SEC_ALLOC | SEC_LOAD;
7326 if (sreloc == NULL
fd361982
AM
7327 || !bfd_set_section_flags (sreloc, flags)
7328 || !bfd_set_section_alignment (sreloc, 2))
35c08157
KLC
7329 return FALSE;
7330
7331 elf_section_type (sreloc) = SHT_RELA;
7332 }
7333 elf_section_data (sec)->sreloc = sreloc;
7334 }
7335
7336 /* If this is a global symbol, we count the number of
7337 relocations we need for this symbol. */
7338 if (h != NULL)
190eb1dd 7339 head = &h->dyn_relocs;
35c08157
KLC
7340 else
7341 {
7342 asection *s;
61034b0b 7343 void *vpp;
35c08157
KLC
7344
7345 Elf_Internal_Sym *isym;
7346 isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
7347 if (isym == NULL)
7348 return FALSE;
7349
7350 /* Track dynamic relocs needed for local syms too. */
7351 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
7352 if (s == NULL)
7353 return FALSE;
7354
61034b0b 7355 vpp = &elf_section_data (s)->local_dynrel;
3bf083ed 7356 head = (struct elf_dyn_relocs **) vpp;
35c08157
KLC
7357 }
7358
7359 p = *head;
7360 if (p == NULL || p->sec != sec)
7361 {
986f0783 7362 size_t amt = sizeof (*p);
3bf083ed 7363 p = (struct elf_dyn_relocs *) bfd_alloc (dynobj, amt);
35c08157
KLC
7364 if (p == NULL)
7365 return FALSE;
7366 p->next = *head;
7367 *head = p;
7368 p->sec = sec;
7369 p->count = 0;
7370 p->pc_count = 0;
7371 }
7372
7373 p->count += 1;
fbaf61ad
NC
7374
7375 /* Since eh_frame is readonly, R_NDS32_32_RELA
7376 reloc for eh_frame will cause shared library has
7377 TEXTREL entry in the dynamic section. This lead glibc
7378 testsuites to failure (bug-13092) and cause kernel fail
7379 (bug-11819). I think the best solution is to replace
7380 absolute reloc with pc relative reloc in the eh_frame.
7381 To do that, we need to support the following issues:
7382
7383 === For GCC ===
7384 * gcc/config/nds32/nds32.h: Define
7385 ASM_PREFERRED_EH_DATA_FORMAT to encode DW_EH_PE_pcrel
7386 and DW_EH_PE_sdata4 into DWARF exception header when
7387 option have '-fpic'.
7388
7389 === For binutils ===
7390 * bfd/: Define new reloc R_NDS32_32_PCREL_RELA.
7391 * gas/config/tc-nds32.h: Define DIFF_EXPR_OK. This
7392 may break our nds DIFF mechanism, therefore, we
7393 must disable all linker relaxations to ensure
7394 correctness.
7395 * gas/config/tc-nds32.c (nds32_apply_fix): Replace
7396 R_NDS32_32_RELA with R_NDS32_32_PCREL_RELA, and
7397 do the necessary modification.
7398
7399 Unfortunately, it still have some problems for nds32
7400 to support pc relative reloc in the eh_frame. So I use
7401 another solution to fix this issue.
7402
7403 However, I find that ld always emit TEXTREL marker for
7404 R_NDS32_NONE relocs in rel.dyn. These none relocs are
7405 correspond to R_NDS32_32_RELA for .eh_frame section.
7406 It means that we always reserve redundant entries of rel.dyn
7407 for these relocs which actually do nothing in dynamic linker.
7408
7409 Therefore, we regard these relocs as pc relative relocs
7410 here and increase the pc_count. */
35c08157
KLC
7411 if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA
7412 || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
fbaf61ad
NC
7413 || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA
7414 || (r_type == R_NDS32_32_RELA
7415 && strcmp (sec->name, ".eh_frame") == 0))
35c08157
KLC
7416 p->pc_count += 1;
7417 }
7418 break;
7419
7420 /* This relocation describes the C++ object vtable hierarchy.
7421 Reconstruct it for later use during GC. */
7422 case R_NDS32_RELA_GNU_VTINHERIT:
7423 case R_NDS32_GNU_VTINHERIT:
7424 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
7425 return FALSE;
7426 break;
7427
7428 /* This relocation describes which C++ vtable entries are actually
7429 used. Record for later use during GC. */
7430 case R_NDS32_GNU_VTENTRY:
7431 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
7432 return FALSE;
7433 break;
7434 case R_NDS32_RELA_GNU_VTENTRY:
7435 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
7436 return FALSE;
7437 break;
7438 }
7439 }
7440
7441 return TRUE;
7442}
7443
7444/* Write VAL in uleb128 format to P, returning a pointer to the
7445 following byte.
7446 This code is copied from elf-attr.c. */
7447
7448static bfd_byte *
7449write_uleb128 (bfd_byte *p, unsigned int val)
7450{
7451 bfd_byte c;
7452 do
7453 {
7454 c = val & 0x7f;
7455 val >>= 7;
7456 if (val)
7457 c |= 0x80;
7458 *(p++) = c;
7459 }
7460 while (val);
7461 return p;
7462}
7463
7464static bfd_signed_vma
7465calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
fbaf61ad 7466 Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
35c08157
KLC
7467{
7468 bfd_signed_vma foff;
7469 bfd_vma symval, addend;
7470 asection *sym_sec;
7471
7472 /* Get the value of the symbol referred to by the reloc. */
7473 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
7474 {
7475 Elf_Internal_Sym *isym;
7476
7477 /* A local symbol. */
7478 isym = isymbuf + ELF32_R_SYM (irel->r_info);
7479
7480 if (isym->st_shndx == SHN_UNDEF)
7481 sym_sec = bfd_und_section_ptr;
7482 else if (isym->st_shndx == SHN_ABS)
7483 sym_sec = bfd_abs_section_ptr;
7484 else if (isym->st_shndx == SHN_COMMON)
7485 sym_sec = bfd_com_section_ptr;
7486 else
7487 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7488 symval = isym->st_value + sym_sec->output_section->vma
7489 + sym_sec->output_offset;
7490 }
7491 else
7492 {
7493 unsigned long indx;
7494 struct elf_link_hash_entry *h;
35c08157
KLC
7495
7496 /* An external symbol. */
7497 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
7498 h = elf_sym_hashes (abfd)[indx];
7499 BFD_ASSERT (h != NULL);
7500
7501 if (h->root.type != bfd_link_hash_defined
7502 && h->root.type != bfd_link_hash_defweak)
7503 /* This appears to be a reference to an undefined
7504 symbol. Just ignore it--it will be caught by the
7505 regular reloc processing. */
7506 return 0;
35c08157
KLC
7507
7508 if (h->root.u.def.section->flags & SEC_MERGE)
7509 {
7510 sym_sec = h->root.u.def.section;
7511 symval = _bfd_merged_section_offset (abfd, &sym_sec,
7512 elf_section_data (sym_sec)->sec_info,
7513 h->root.u.def.value);
7514 symval = symval + sym_sec->output_section->vma
7515 + sym_sec->output_offset;
7516 }
7517 else
7518 symval = (h->root.u.def.value
7519 + h->root.u.def.section->output_section->vma
7520 + h->root.u.def.section->output_offset);
7521 }
7522
7523 addend = irel->r_addend;
7524
7525 foff = (symval + addend
7526 - (irel->r_offset + sec->output_section->vma + sec->output_offset));
7527 return foff;
7528}
35c08157 7529\f
fbaf61ad 7530
35c08157
KLC
7531/* Convert a 32-bit instruction to 16-bit one.
7532 INSN is the input 32-bit instruction, INSN16 is the output 16-bit
7533 instruction. If INSN_TYPE is not NULL, it the CGEN instruction
7534 type of INSN16. Return 1 if successful. */
7535
7536static int
7537nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7538 int *pinsn_type)
7539{
7540 uint16_t insn16 = 0;
6cae483a 7541 int insn_type = 0;
35c08157
KLC
7542 unsigned long mach = bfd_get_mach (abfd);
7543
7544 if (N32_SH5 (insn) != 0)
7545 return 0;
7546
7547 switch (N32_SUB5 (insn))
7548 {
7549 case N32_ALU1_ADD_SLLI:
7550 case N32_ALU1_ADD_SRLI:
7551 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
7552 {
7553 insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn),
7554 N32_RB5 (insn));
7555 insn_type = NDS32_INSN_ADD333;
7556 }
7557 else if (N32_IS_RT4 (insn))
7558 {
7559 if (N32_RT5 (insn) == N32_RA5 (insn))
7560 insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn));
7561 else if (N32_RT5 (insn) == N32_RB5 (insn))
7562 insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn));
7563 insn_type = NDS32_INSN_ADD45;
7564 }
7565 break;
7566
7567 case N32_ALU1_SUB_SLLI:
7568 case N32_ALU1_SUB_SRLI:
7569 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
7570 {
7571 insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn),
7572 N32_RB5 (insn));
7573 insn_type = NDS32_INSN_SUB333;
7574 }
7575 else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
7576 {
7577 insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn));
7578 insn_type = NDS32_INSN_SUB45;
7579 }
7580 break;
7581
7582 case N32_ALU1_AND_SLLI:
7583 case N32_ALU1_AND_SRLI:
7584 /* and $rt, $rt, $rb -> and33 for v3, v3m. */
7585 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7586 && N32_IS_RB3 (insn))
7587 {
7588 if (N32_RT5 (insn) == N32_RA5 (insn))
7589 insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn));
7590 else if (N32_RT5 (insn) == N32_RB5 (insn))
7591 insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn));
7592 if (insn16)
7593 insn_type = NDS32_INSN_AND33;
7594 }
7595 break;
7596
7597 case N32_ALU1_XOR_SLLI:
7598 case N32_ALU1_XOR_SRLI:
7599 /* xor $rt, $rt, $rb -> xor33 for v3, v3m. */
7600 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7601 && N32_IS_RB3 (insn))
7602 {
7603 if (N32_RT5 (insn) == N32_RA5 (insn))
7604 insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn));
7605 else if (N32_RT5 (insn) == N32_RB5 (insn))
7606 insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn));
7607 if (insn16)
7608 insn_type = NDS32_INSN_XOR33;
7609 }
7610 break;
7611
7612 case N32_ALU1_OR_SLLI:
7613 case N32_ALU1_OR_SRLI:
7614 /* or $rt, $rt, $rb -> or33 for v3, v3m. */
7615 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7616 && N32_IS_RB3 (insn))
7617 {
7618 if (N32_RT5 (insn) == N32_RA5 (insn))
7619 insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn));
7620 else if (N32_RT5 (insn) == N32_RB5 (insn))
7621 insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn));
7622 if (insn16)
7623 insn_type = NDS32_INSN_OR33;
7624 }
7625 break;
7626 case N32_ALU1_NOR:
7627 /* nor $rt, $ra, $ra -> not33 for v3, v3m. */
7628 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn)
7629 && N32_RA5 (insn) == N32_RB5 (insn))
7630 {
7631 insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn));
7632 insn_type = NDS32_INSN_NOT33;
7633 }
7634 break;
7635 case N32_ALU1_SRAI:
7636 if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
7637 {
7638 insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn));
7639 insn_type = NDS32_INSN_SRAI45;
7640 }
7641 break;
7642
7643 case N32_ALU1_SRLI:
7644 if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
7645 {
7646 insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn));
7647 insn_type = NDS32_INSN_SRLI45;
7648 }
7649 break;
7650
7651 case N32_ALU1_SLLI:
7652 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8)
7653 {
7654 insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn),
7655 N32_UB5 (insn));
7656 insn_type = NDS32_INSN_SLLI333;
7657 }
7658 break;
7659
7660 case N32_ALU1_ZEH:
7661 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7662 {
7663 insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn));
7664 insn_type = NDS32_INSN_ZEH33;
7665 }
7666 break;
7667
7668 case N32_ALU1_SEB:
7669 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7670 {
7671 insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn));
7672 insn_type = NDS32_INSN_SEB33;
7673 }
7674 break;
7675
7676 case N32_ALU1_SEH:
7677 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7678 {
7679 insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn));
7680 insn_type = NDS32_INSN_SEH33;
7681 }
7682 break;
7683
7684 case N32_ALU1_SLT:
7685 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
7686 {
7687 /* Implicit r15. */
7688 insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn));
7689 insn_type = NDS32_INSN_SLT45;
7690 }
7691 break;
7692
7693 case N32_ALU1_SLTS:
7694 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
7695 {
7696 /* Implicit r15. */
7697 insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn));
7698 insn_type = NDS32_INSN_SLTS45;
7699 }
7700 break;
7701 }
7702
7703 if ((insn16 & 0x8000) == 0)
7704 return 0;
7705
7706 if (pinsn16)
7707 *pinsn16 = insn16;
7708 if (pinsn_type)
7709 *pinsn_type = insn_type;
7710 return 1;
7711}
7712
7713static int
7714nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7715 int *pinsn_type)
7716{
7717 uint16_t insn16 = 0;
7718 int insn_type;
7719 unsigned long mach = bfd_get_mach (abfd);
7720
7721 /* TODO: bset, bclr, btgl, btst. */
7722 if (__GF (insn, 6, 4) != 0)
7723 return 0;
7724
7725 switch (N32_IMMU (insn, 6))
7726 {
7727 case N32_ALU2_MUL:
7728 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7729 && N32_IS_RB3 (insn))
7730 {
7731 if (N32_RT5 (insn) == N32_RA5 (insn))
7732 insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn));
7733 else if (N32_RT5 (insn) == N32_RB5 (insn))
7734 insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn));
7735 if (insn16)
7736 insn_type = NDS32_INSN_MUL33;
7737 }
7738 }
7739
7740 if ((insn16 & 0x8000) == 0)
7741 return 0;
7742
7743 if (pinsn16)
7744 *pinsn16 = insn16;
7745 if (pinsn_type)
7746 *pinsn_type = insn_type;
7747 return 1;
7748}
7749
7750int
7751nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7752 int *pinsn_type)
7753{
7754 int op6;
7755 uint16_t insn16 = 0;
1624c9ca 7756 int insn_type = 0;
35c08157
KLC
7757 unsigned long mach = bfd_get_mach (abfd);
7758
7759 /* Decode 32-bit instruction. */
7760 if (insn & 0x80000000)
7761 {
7762 /* Not 32-bit insn. */
7763 return 0;
7764 }
7765
7766 op6 = N32_OP6 (insn);
7767
7768 /* Convert it to 16-bit instruction. */
7769 switch (op6)
7770 {
7771 case N32_OP6_MOVI:
7772 if (IS_WITHIN_S (N32_IMM20S (insn), 5))
7773 {
7774 insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn));
7775 insn_type = NDS32_INSN_MOVI55;
7776 }
7777 else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16
7778 && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn))
7779 {
7780 insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn),
7781 N32_IMM20S (insn) - 16);
7782 insn_type = NDS32_INSN_MOVPI45;
7783 }
7784 break;
7785
7786 case N32_OP6_ADDI:
7787 if (N32_IMM15S (insn) == 0)
7788 {
7789 /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
7790 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
7791 if (mach <= MACH_V2
7792 || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7793 {
7794 insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7795 insn_type = NDS32_INSN_MOV55;
7796 }
7797 }
7798 else if (N32_IMM15S (insn) > 0)
7799 {
7800 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8)
7801 {
7802 insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn),
7803 N32_IMM15S (insn));
7804 insn_type = NDS32_INSN_ADDI333;
7805 }
7806 else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7807 && N32_IMM15S (insn) < 32)
7808 {
7809 insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn));
7810 insn_type = NDS32_INSN_ADDI45;
7811 }
7812 else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7813 && N32_RT5 (insn) == N32_RA5 (insn)
7814 && N32_IMM15S (insn) < 512)
7815 {
7816 insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7817 insn_type = NDS32_INSN_ADDI10_SP;
7818 }
7819 else if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7820 && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256
7821 && (N32_IMM15S (insn) % 4 == 0))
7822 {
7823 insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn),
7824 N32_IMM15S (insn) >> 2);
7825 insn_type = NDS32_INSN_ADDRI36_SP;
7826 }
7827 }
7828 else
7829 {
7830 /* Less than 0. */
7831 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8)
7832 {
7833 insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn),
7834 0 - N32_IMM15S (insn));
7835 insn_type = NDS32_INSN_SUBI333;
7836 }
7837 else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7838 && N32_IMM15S (insn) > -32)
7839 {
1c8f6a4d
KLC
7840 insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn),
7841 0 - N32_IMM15S (insn));
35c08157
KLC
7842 insn_type = NDS32_INSN_SUBI45;
7843 }
7844 else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7845 && N32_RT5 (insn) == N32_RA5 (insn)
7846 && N32_IMM15S (insn) >= -512)
7847 {
7848 insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7849 insn_type = NDS32_INSN_ADDI10_SP;
7850 }
7851 }
7852 break;
7853
7854 case N32_OP6_ORI:
7855 if (N32_IMM15S (insn) == 0)
7856 {
7857 /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
7858 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
7859 if (mach <= MACH_V2
7860 || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7861 {
7862 insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7863 insn_type = NDS32_INSN_MOV55;
7864 }
7865 }
7866 break;
7867
7868 case N32_OP6_SUBRI:
7869 if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7870 && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0)
7871 {
7872 insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn));
7873 insn_type = NDS32_INSN_NEG33;
7874 }
7875 break;
7876
7877 case N32_OP6_ANDI:
7878 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7879 {
7880 if (N32_IMM15U (insn) == 1)
7881 {
7882 insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn));
7883 insn_type = NDS32_INSN_XLSB33;
7884 }
7885 else if (N32_IMM15U (insn) == 0x7ff)
7886 {
7887 insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn));
7888 insn_type = NDS32_INSN_X11B33;
7889 }
7890 else if (N32_IMM15U (insn) == 0xff)
7891 {
7892 insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn));
7893 insn_type = NDS32_INSN_ZEB33;
7894 }
7895 else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn)
7896 && N32_IMM15U (insn) < 256)
7897 {
7898 int imm15u = N32_IMM15U (insn);
7899
7900 if (__builtin_popcount (imm15u) == 1)
7901 {
7902 /* BMSKI33 */
7903 int imm3u = __builtin_ctz (imm15u);
7904
7905 insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u);
7906 insn_type = NDS32_INSN_BMSKI33;
7907 }
7908 else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1)
7909 {
7910 /* FEXTI33 */
7911 int imm3u = __builtin_ctz (imm15u + 1) - 1;
7912
7913 insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u);
7914 insn_type = NDS32_INSN_FEXTI33;
7915 }
7916 }
7917 }
7918 break;
7919
7920 case N32_OP6_SLTI:
7921 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7922 && IS_WITHIN_U (N32_IMM15S (insn), 5))
7923 {
7924 insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn));
7925 insn_type = NDS32_INSN_SLTI45;
7926 }
7927 break;
7928
7929 case N32_OP6_SLTSI:
7930 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7931 && IS_WITHIN_U (N32_IMM15S (insn), 5))
7932 {
7933 insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn));
7934 insn_type = NDS32_INSN_SLTSI45;
7935 }
7936 break;
7937
7938 case N32_OP6_LWI:
7939 if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7940 {
7941 insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn));
7942 insn_type = NDS32_INSN_LWI450;
7943 }
7944 else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7945 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7946 {
7947 insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn),
7948 N32_IMM15S (insn));
7949 insn_type = NDS32_INSN_LWI333;
7950 }
7951 else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7952 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7953 {
7954 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7955 insn_type = NDS32_INSN_LWI37;
7956 }
7957 else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7958 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7959 {
7960 insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn));
7961 insn_type = NDS32_INSN_LWI37_SP;
7962 }
7963 else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8
7964 && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0)
7965 {
1c8f6a4d
KLC
7966 insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn),
7967 N32_IMM15S (insn) + 32);
35c08157
KLC
7968 insn_type = NDS32_INSN_LWI45_FE;
7969 }
7970 break;
7971
7972 case N32_OP6_SWI:
7973 if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7974 {
7975 insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn));
7976 insn_type = NDS32_INSN_SWI450;
7977 }
7978 else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7979 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7980 {
1c8f6a4d
KLC
7981 insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn),
7982 N32_IMM15S (insn));
35c08157
KLC
7983 insn_type = NDS32_INSN_SWI333;
7984 }
7985 else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7986 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7987 {
7988 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7989 insn_type = NDS32_INSN_SWI37;
7990 }
7991 else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7992 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7993 {
7994 insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn));
7995 insn_type = NDS32_INSN_SWI37_SP;
7996 }
7997 break;
7998
7999 case N32_OP6_LWI_BI:
8000 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8001 && IS_WITHIN_U (N32_IMM15S (insn), 3))
8002 {
8003 insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
8004 N32_IMM15S (insn));
8005 insn_type = NDS32_INSN_LWI333_BI;
8006 }
8007 break;
8008
8009 case N32_OP6_SWI_BI:
8010 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8011 && IS_WITHIN_U (N32_IMM15S (insn), 3))
8012 {
8013 insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
8014 N32_IMM15S (insn));
8015 insn_type = NDS32_INSN_SWI333_BI;
8016 }
8017 break;
8018
8019 case N32_OP6_LHI:
8020 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8021 && IS_WITHIN_U (N32_IMM15S (insn), 3))
8022 {
8023 insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn),
8024 N32_IMM15S (insn));
8025 insn_type = NDS32_INSN_LHI333;
8026 }
8027 break;
8028
8029 case N32_OP6_SHI:
8030 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8031 && IS_WITHIN_U (N32_IMM15S (insn), 3))
8032 {
8033 insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn),
8034 N32_IMM15S (insn));
8035 insn_type = NDS32_INSN_SHI333;
8036 }
8037 break;
8038
8039 case N32_OP6_LBI:
8040 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8041 && IS_WITHIN_U (N32_IMM15S (insn), 3))
8042 {
8043 insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn),
8044 N32_IMM15S (insn));
8045 insn_type = NDS32_INSN_LBI333;
8046 }
8047 break;
8048
8049 case N32_OP6_SBI:
8050 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8051 && IS_WITHIN_U (N32_IMM15S (insn), 3))
8052 {
8053 insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn),
8054 N32_IMM15S (insn));
8055 insn_type = NDS32_INSN_SBI333;
8056 }
8057 break;
8058
8059 case N32_OP6_ALU1:
8060 return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type);
8061
8062 case N32_OP6_ALU2:
8063 return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type);
8064
8065 case N32_OP6_BR1:
8066 if (!IS_WITHIN_S (N32_IMM14S (insn), 8))
8067 goto done;
8068
4ec521f2 8069 if ((insn & N32_BIT (14)) == 0)
35c08157
KLC
8070 {
8071 /* N32_BR1_BEQ */
8072 if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
8073 && N32_RT5 (insn) != REG_R5)
8074 insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn));
8075 else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
8076 && N32_RA5 (insn) != REG_R5)
8077 insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn));
8078 insn_type = NDS32_INSN_BEQS38;
8079 break;
8080 }
8081 else
8082 {
8083 /* N32_BR1_BNE */
8084 if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
8085 && N32_RT5 (insn) != REG_R5)
8086 insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn));
8087 else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
8088 && N32_RA5 (insn) != REG_R5)
8089 insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn));
8090 insn_type = NDS32_INSN_BNES38;
8091 break;
8092 }
8093 break;
8094
8095 case N32_OP6_BR2:
8096 switch (N32_BR2_SUB (insn))
8097 {
8098 case N32_BR2_BEQZ:
8099 if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
8100 {
8101 insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn));
8102 insn_type = NDS32_INSN_BEQZ38;
8103 }
1c8f6a4d
KLC
8104 else if (N32_RT5 (insn) == REG_R15
8105 && IS_WITHIN_S (N32_IMM16S (insn), 8))
35c08157
KLC
8106 {
8107 insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn));
8108 insn_type = NDS32_INSN_BEQZS8;
8109 }
8110 break;
8111
8112 case N32_BR2_BNEZ:
8113 if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
8114 {
8115 insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn));
8116 insn_type = NDS32_INSN_BNEZ38;
8117 }
1c8f6a4d
KLC
8118 else if (N32_RT5 (insn) == REG_R15
8119 && IS_WITHIN_S (N32_IMM16S (insn), 8))
35c08157
KLC
8120 {
8121 insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn));
8122 insn_type = NDS32_INSN_BNEZS8;
8123 }
8124 break;
8125
fbaf61ad
NC
8126 case N32_BR2_SOP0:
8127 if (__GF (insn, 20, 5) == 0 && IS_WITHIN_U (N32_IMM16S (insn), 9))
35c08157
KLC
8128 {
8129 insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn));
8130 insn_type = NDS32_INSN_IFCALL9;
8131 }
8132 break;
8133 }
8134 break;
8135
8136 case N32_OP6_JI:
4ec521f2 8137 if ((insn & N32_BIT (24)) == 0)
35c08157
KLC
8138 {
8139 /* N32_JI_J */
8140 if (IS_WITHIN_S (N32_IMM24S (insn), 8))
8141 {
8142 insn16 = N16_TYPE8 (J8, N32_IMM24S (insn));
8143 insn_type = NDS32_INSN_J8;
8144 }
8145 }
8146 break;
8147
8148 case N32_OP6_JREG:
8149 if (__GF (insn, 8, 2) != 0)
8150 goto done;
8151
8152 switch (N32_IMMU (insn, 5))
8153 {
8154 case N32_JREG_JR:
8155 if (N32_JREG_HINT (insn) == 0)
8156 {
8157 /* jr */
8158 insn16 = N16_TYPE5 (JR5, N32_RB5 (insn));
8159 insn_type = NDS32_INSN_JR5;
8160 }
8161 else if (N32_JREG_HINT (insn) == 1)
8162 {
8163 /* ret */
8164 insn16 = N16_TYPE5 (RET5, N32_RB5 (insn));
8165 insn_type = NDS32_INSN_RET5;
8166 }
8167 else if (N32_JREG_HINT (insn) == 3)
8168 {
8169 /* ifret = mov55 $sp, $sp */
8170 insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP);
8171 insn_type = NDS32_INSN_IFRET;
8172 }
8173 break;
8174
8175 case N32_JREG_JRAL:
8176 /* It's convertible when return rt5 is $lp and address
8177 translation is kept. */
8178 if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0)
8179 {
8180 insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn));
8181 insn_type = NDS32_INSN_JRAL5;
8182 }
8183 break;
8184 }
8185 break;
8186
8187 case N32_OP6_MISC:
8188 if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32)
8189 {
8190 /* For v3, swid above 31 are used for ex9.it. */
8191 insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn));
8192 insn_type = NDS32_INSN_BREAK16;
8193 }
8194 break;
8195
8196 default:
8197 /* This instruction has no 16-bit variant. */
8198 goto done;
8199 }
8200
dc1e8a47 8201 done:
35c08157
KLC
8202 /* Bit-15 of insn16 should be set for a valid instruction. */
8203 if ((insn16 & 0x8000) == 0)
8204 return 0;
8205
8206 if (pinsn16)
8207 *pinsn16 = insn16;
8208 if (pinsn_type)
8209 *pinsn_type = insn_type;
8210 return 1;
8211}
8212
8213static int
8214special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16,
8215 Elf_Internal_Rela *reloc)
8216{
8217 uint16_t insn16 = 0;
8218
8219 if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0
8220 || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16))
8221 return 0;
8222
8223 if (!N32_IS_RT3 (insn))
8224 return 0;
8225
8226 switch (N32_OP6 (insn))
8227 {
8228 case N32_OP6_LWI:
8229 if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
8230 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
8231 break;
8232 case N32_OP6_SWI:
8233 if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
8234 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
8235 break;
8236 case N32_OP6_HWGP:
8237 if (!IS_WITHIN_U (N32_IMM17S (insn), 7))
8238 break;
8239
8240 if (__GF (insn, 17, 3) == 6)
8241 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn));
8242 else if (__GF (insn, 17, 3) == 7)
8243 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn));
8244 break;
8245 }
8246
8247 if ((insn16 & 0x8000) == 0)
8248 return 0;
8249
8250 *pinsn16 = insn16;
8251 return 1;
8252}
8253
8254/* Convert a 16-bit instruction to 32-bit one.
8255 INSN16 it the input and PINSN it the point to output.
8256 Return non-zero on successful. Otherwise 0 is returned. */
8257
8258int
8259nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn)
8260{
8261 uint32_t insn = 0xffffffff;
8262 unsigned long mach = bfd_get_mach (abfd);
8263
8264 /* NOTE: push25, pop25 and movd44 do not have 32-bit variants. */
8265
8266 switch (__GF (insn16, 9, 6))
8267 {
8268 case 0x4: /* add45 */
1c8f6a4d
KLC
8269 insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16),
8270 N16_RA5 (insn16));
35c08157
KLC
8271 goto done;
8272 case 0x5: /* sub45 */
1c8f6a4d
KLC
8273 insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16),
8274 N16_RA5 (insn16));
35c08157
KLC
8275 goto done;
8276 case 0x6: /* addi45 */
1c8f6a4d
KLC
8277 insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
8278 N16_IMM5U (insn16));
35c08157
KLC
8279 goto done;
8280 case 0x7: /* subi45 */
1c8f6a4d
KLC
8281 insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
8282 -N16_IMM5U (insn16));
35c08157
KLC
8283 goto done;
8284 case 0x8: /* srai45 */
1c8f6a4d
KLC
8285 insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16),
8286 N16_IMM5U (insn16));
35c08157
KLC
8287 goto done;
8288 case 0x9: /* srli45 */
1c8f6a4d
KLC
8289 insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16),
8290 N16_IMM5U (insn16));
35c08157 8291 goto done;
35c08157 8292 case 0xa: /* slli333 */
1c8f6a4d
KLC
8293 insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16),
8294 N16_IMM3U (insn16));
35c08157
KLC
8295 goto done;
8296 case 0xc: /* add333 */
1c8f6a4d
KLC
8297 insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16),
8298 N16_RB3 (insn16));
35c08157
KLC
8299 goto done;
8300 case 0xd: /* sub333 */
1c8f6a4d
KLC
8301 insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16),
8302 N16_RB3 (insn16));
35c08157
KLC
8303 goto done;
8304 case 0xe: /* addi333 */
1c8f6a4d
KLC
8305 insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
8306 N16_IMM3U (insn16));
35c08157
KLC
8307 goto done;
8308 case 0xf: /* subi333 */
1c8f6a4d
KLC
8309 insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
8310 -N16_IMM3U (insn16));
35c08157 8311 goto done;
35c08157 8312 case 0x10: /* lwi333 */
1c8f6a4d
KLC
8313 insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16),
8314 N16_IMM3U (insn16));
35c08157
KLC
8315 goto done;
8316 case 0x12: /* lhi333 */
1c8f6a4d
KLC
8317 insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16),
8318 N16_IMM3U (insn16));
35c08157
KLC
8319 goto done;
8320 case 0x13: /* lbi333 */
1c8f6a4d
KLC
8321 insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16),
8322 N16_IMM3U (insn16));
35c08157
KLC
8323 goto done;
8324 case 0x11: /* lwi333.bi */
1c8f6a4d
KLC
8325 insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
8326 N16_IMM3U (insn16));
35c08157
KLC
8327 goto done;
8328 case 0x14: /* swi333 */
1c8f6a4d
KLC
8329 insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16),
8330 N16_IMM3U (insn16));
35c08157
KLC
8331 goto done;
8332 case 0x16: /* shi333 */
1c8f6a4d
KLC
8333 insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16),
8334 N16_IMM3U (insn16));
35c08157
KLC
8335 goto done;
8336 case 0x17: /* sbi333 */
1c8f6a4d
KLC
8337 insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16),
8338 N16_IMM3U (insn16));
35c08157
KLC
8339 goto done;
8340 case 0x15: /* swi333.bi */
1c8f6a4d
KLC
8341 insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
8342 N16_IMM3U (insn16));
35c08157 8343 goto done;
35c08157 8344 case 0x18: /* addri36.sp */
1c8f6a4d
KLC
8345 insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP,
8346 N16_IMM6U (insn16) << 2);
35c08157 8347 goto done;
35c08157 8348 case 0x19: /* lwi45.fe */
1c8f6a4d
KLC
8349 insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8,
8350 (N16_IMM5U (insn16) - 32));
35c08157
KLC
8351 goto done;
8352 case 0x1a: /* lwi450 */
8353 insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
8354 goto done;
8355 case 0x1b: /* swi450 */
8356 insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
8357 goto done;
8358
1c8f6a4d 8359 /* These are r15 implied instructions. */
35c08157
KLC
8360 case 0x30: /* slts45 */
8361 insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
8362 goto done;
8363 case 0x31: /* slt45 */
8364 insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
8365 goto done;
8366 case 0x32: /* sltsi45 */
8367 insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
8368 goto done;
8369 case 0x33: /* slti45 */
8370 insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
8371 goto done;
8372 case 0x34: /* beqzs8, bnezs8 */
4ec521f2 8373 if (insn16 & N32_BIT (8))
35c08157
KLC
8374 insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16));
8375 else
8376 insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16));
8377 goto done;
8378
8379 case 0x35: /* break16, ex9.it */
8380 /* Only consider range of v3 break16. */
8381 insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK);
8382 goto done;
8383
8384 case 0x3c: /* ifcall9 */
fbaf61ad 8385 insn = N32_BR2 (SOP0, 0, N16_IMM9U (insn16));
35c08157
KLC
8386 goto done;
8387 case 0x3d: /* movpi45 */
8388 insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16);
8389 goto done;
8390
8391 case 0x3f: /* MISC33 */
1c8f6a4d 8392 switch (insn16 & 0x7)
35c08157
KLC
8393 {
8394 case 2: /* neg33 */
8395 insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8396 break;
8397 case 3: /* not33 */
1c8f6a4d
KLC
8398 insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16),
8399 N16_RA3 (insn16));
35c08157
KLC
8400 break;
8401 case 4: /* mul33 */
1c8f6a4d
KLC
8402 insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16),
8403 N16_RA3 (insn16));
35c08157
KLC
8404 break;
8405 case 5: /* xor33 */
1c8f6a4d
KLC
8406 insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16),
8407 N16_RA3 (insn16));
35c08157
KLC
8408 break;
8409 case 6: /* and33 */
1c8f6a4d
KLC
8410 insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16),
8411 N16_RA3 (insn16));
35c08157
KLC
8412 break;
8413 case 7: /* or33 */
1c8f6a4d
KLC
8414 insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16),
8415 N16_RA3 (insn16));
35c08157
KLC
8416 break;
8417 }
8418 goto done;
8419
1c8f6a4d 8420 case 0xb:
35c08157
KLC
8421 switch (insn16 & 0x7)
8422 {
8423 case 0: /* zeb33 */
8424 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff);
8425 break;
8426 case 1: /* zeh33 */
8427 insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8428 break;
8429 case 2: /* seb33 */
8430 insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8431 break;
8432 case 3: /* seh33 */
8433 insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8434 break;
8435 case 4: /* xlsb33 */
8436 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1);
8437 break;
8438 case 5: /* x11b33 */
8439 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff);
8440 break;
8441 case 6: /* bmski33 */
8442 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
1c8f6a4d 8443 1 << __GF (insn16, 3, 3));
35c08157
KLC
8444 break;
8445 case 7: /* fexti33 */
8446 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
1c8f6a4d 8447 (1 << (__GF (insn16, 3, 3) + 1)) - 1);
35c08157
KLC
8448 break;
8449 }
8450 goto done;
8451 }
8452
8453 switch (__GF (insn16, 10, 5))
8454 {
8455 case 0x0: /* mov55 or ifret16 */
8456 if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP
8457 && N16_RT5 (insn16) == N16_RA5 (insn16))
1c8f6a4d 8458 insn = N32_JREG (JR, 0, 0, 0, 3);
35c08157 8459 else
1c8f6a4d 8460 insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0);
35c08157
KLC
8461 goto done;
8462 case 0x1: /* movi55 */
8463 insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16));
8464 goto done;
8465 case 0x1b: /* addi10s (V2) */
8466 insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16));
8467 goto done;
8468 }
8469
8470 switch (__GF (insn16, 11, 4))
8471 {
8472 case 0x7: /* lwi37.fp/swi37.fp */
4ec521f2 8473 if (insn16 & N32_BIT (7)) /* swi37.fp */
35c08157
KLC
8474 insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
8475 else /* lwi37.fp */
8476 insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
8477 goto done;
8478 case 0x8: /* beqz38 */
8479 insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16));
8480 goto done;
8481 case 0x9: /* bnez38 */
8482 insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16));
8483 goto done;
8484 case 0xa: /* beqs38/j8, implied r5 */
8485 if (N16_RT38 (insn16) == 5)
8486 insn = N32_JI (J, N16_IMM8S (insn16));
8487 else
8488 insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
8489 goto done;
fbaf61ad 8490 case 0xb: /* bnes38 and others. */
35c08157
KLC
8491 if (N16_RT38 (insn16) == 5)
8492 {
8493 switch (__GF (insn16, 5, 3))
8494 {
8495 case 0: /* jr5 */
8496 insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0);
8497 break;
8498 case 4: /* ret5 */
8499 insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1);
8500 break;
8501 case 1: /* jral5 */
8502 insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0);
8503 break;
8504 case 2: /* ex9.it imm5 */
8505 /* ex9.it had no 32-bit variantl. */
8506 break;
8507 case 5: /* add5.pc */
8508 /* add5.pc had no 32-bit variantl. */
8509 break;
8510 }
8511 }
8512 else /* bnes38 */
8513 insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
8514 goto done;
8515 case 0xe: /* lwi37/swi37 */
8516 if (insn16 & (1 << 7)) /* swi37.sp */
8517 insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
8518 else /* lwi37.sp */
8519 insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
8520 goto done;
8521 }
8522
dc1e8a47 8523 done:
35c08157
KLC
8524 if (insn & 0x80000000)
8525 return 0;
8526
8527 if (pinsn)
8528 *pinsn = insn;
8529 return 1;
8530}
8531\f
fbaf61ad 8532
35c08157
KLC
8533static bfd_boolean
8534is_sda_access_insn (unsigned long insn)
8535{
8536 switch (N32_OP6 (insn))
8537 {
8538 case N32_OP6_LWI:
8539 case N32_OP6_LHI:
8540 case N32_OP6_LHSI:
8541 case N32_OP6_LBI:
8542 case N32_OP6_LBSI:
8543 case N32_OP6_SWI:
8544 case N32_OP6_SHI:
8545 case N32_OP6_SBI:
8546 case N32_OP6_LWC:
8547 case N32_OP6_LDC:
8548 case N32_OP6_SWC:
8549 case N32_OP6_SDC:
8550 return TRUE;
8551 default:
8552 ;
8553 }
8554 return FALSE;
8555}
8556
8557static unsigned long
8558turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn)
8559{
8560 uint32_t oinsn = 0;
8561
8562 switch (type)
8563 {
8564 case R_NDS32_GOT_LO12:
8565 case R_NDS32_GOTOFF_LO12:
8566 case R_NDS32_PLTREL_LO12:
8567 case R_NDS32_PLT_GOTREL_LO12:
8568 case R_NDS32_LO12S0_RELA:
8569 switch (N32_OP6 (insn))
8570 {
8571 case N32_OP6_LBI:
8572 /* lbi.gp */
8573 oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
8574 break;
8575 case N32_OP6_LBSI:
8576 /* lbsi.gp */
4ec521f2 8577 oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), N32_BIT (19));
35c08157
KLC
8578 break;
8579 case N32_OP6_SBI:
8580 /* sbi.gp */
8581 oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
8582 break;
8583 case N32_OP6_ORI:
8584 /* addi.gp */
4ec521f2 8585 oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), N32_BIT (19));
35c08157
KLC
8586 break;
8587 }
8588 break;
8589
8590 case R_NDS32_LO12S1_RELA:
8591 switch (N32_OP6 (insn))
8592 {
8593 case N32_OP6_LHI:
8594 /* lhi.gp */
8595 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
8596 break;
8597 case N32_OP6_LHSI:
8598 /* lhsi.gp */
4ec521f2 8599 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (18));
35c08157
KLC
8600 break;
8601 case N32_OP6_SHI:
8602 /* shi.gp */
4ec521f2 8603 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (19));
35c08157
KLC
8604 break;
8605 }
8606 break;
8607
8608 case R_NDS32_LO12S2_RELA:
8609 switch (N32_OP6 (insn))
8610 {
8611 case N32_OP6_LWI:
8612 /* lwi.gp */
8613 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
8614 break;
8615 case N32_OP6_SWI:
8616 /* swi.gp */
8617 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
8618 break;
8619 }
8620 break;
8621
8622 case R_NDS32_LO12S2_DP_RELA:
8623 case R_NDS32_LO12S2_SP_RELA:
8624 oinsn = (insn & 0x7ff07000) | (REG_GP << 15);
8625 break;
8626 }
8627
8628 if (oinsn)
8629 *pinsn = oinsn;
8630
8631 return oinsn != 0;
8632}
8633
8634/* Linker hasn't found the correct merge section for non-section symbol
8635 in relax time, this work is left to the function elf_link_input_bfd().
8636 So for non-section symbol, _bfd_merged_section_offset is also needed
8637 to find the correct symbol address. */
8638
8639static bfd_vma
8640nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym,
8641 asection **psec, Elf_Internal_Rela *rel)
8642{
8643 asection *sec = *psec;
8644 bfd_vma relocation;
8645
8646 relocation = (sec->output_section->vma
8647 + sec->output_offset + sym->st_value);
8648 if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
8649 {
8650 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
8651 rel->r_addend =
8652 _bfd_merged_section_offset (abfd, psec,
8653 elf_section_data (sec)->sec_info,
8654 sym->st_value + rel->r_addend);
8655 else
8656 rel->r_addend =
8657 _bfd_merged_section_offset (abfd, psec,
8658 elf_section_data (sec)->sec_info,
8659 sym->st_value) + rel->r_addend;
8660
8661 if (sec != *psec)
8662 {
8663 /* If we have changed the section, and our original section is
8664 marked with SEC_EXCLUDE, it means that the original
8665 SEC_MERGE section has been completely subsumed in some
8666 other SEC_MERGE section. In this case, we need to leave
8667 some info around for --emit-relocs. */
8668 if ((sec->flags & SEC_EXCLUDE) != 0)
8669 sec->kept_section = *psec;
8670 sec = *psec;
8671 }
8672 rel->r_addend -= relocation;
8673 rel->r_addend += sec->output_section->vma + sec->output_offset;
8674 }
8675 return relocation;
8676}
8677
8678static bfd_vma
8679calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel,
8680 Elf_Internal_Sym *isymbuf,
8681 Elf_Internal_Shdr *symtab_hdr)
8682{
8683 bfd_signed_vma foff;
8684 bfd_vma symval, addend;
8685 Elf_Internal_Rela irel_fn;
8686 Elf_Internal_Sym *isym;
8687 asection *sym_sec;
8688
8689 /* Get the value of the symbol referred to by the reloc. */
8690 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
8691 {
8692 /* A local symbol. */
8693 isym = isymbuf + ELF32_R_SYM (irel->r_info);
8694
8695 if (isym->st_shndx == SHN_UNDEF)
8696 sym_sec = bfd_und_section_ptr;
8697 else if (isym->st_shndx == SHN_ABS)
8698 sym_sec = bfd_abs_section_ptr;
8699 else if (isym->st_shndx == SHN_COMMON)
8700 sym_sec = bfd_com_section_ptr;
8701 else
8702 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
8703 memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela));
8704 symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn);
8705 addend = irel_fn.r_addend;
8706 }
8707 else
8708 {
8709 unsigned long indx;
8710 struct elf_link_hash_entry *h;
8711
8712 /* An external symbol. */
8713 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
8714 h = elf_sym_hashes (abfd)[indx];
8715 BFD_ASSERT (h != NULL);
8716
8717 while (h->root.type == bfd_link_hash_indirect
8718 || h->root.type == bfd_link_hash_warning)
8719 h = (struct elf_link_hash_entry *) h->root.u.i.link;
8720
8721 if (h->root.type != bfd_link_hash_defined
8722 && h->root.type != bfd_link_hash_defweak)
8723 /* This appears to be a reference to an undefined
8724 symbol. Just ignore it--it will be caught by the
8725 regular reloc processing. */
8726 return 0;
8727
8728 if (h->root.u.def.section->flags & SEC_MERGE)
8729 {
8730 sym_sec = h->root.u.def.section;
8731 symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
8732 (sym_sec)->sec_info, h->root.u.def.value);
8733 symval = symval + sym_sec->output_section->vma
8734 + sym_sec->output_offset;
8735 }
8736 else
8737 symval = (h->root.u.def.value
8738 + h->root.u.def.section->output_section->vma
8739 + h->root.u.def.section->output_offset);
8740 addend = irel->r_addend;
8741 }
8742
8743 foff = symval + addend;
8744
8745 return foff;
8746}
8747
35c08157
KLC
8748static int
8749is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED,
8750 asection *sec, Elf_Internal_Rela *rel)
8751{
8752 bfd_byte *contents;
8753 unsigned short insn16;
8754
8755 if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG))
8756 return FALSE;
8757 contents = elf_section_data (sec)->this_hdr.contents;
8758 insn16 = bfd_getb16 (contents + rel->r_offset);
8759 if (insn16 == NDS32_NOP16)
8760 return TRUE;
8761 return FALSE;
8762}
8763
8764/* It checks whether the instruction could be converted to
8765 16-bit form and returns the converted one.
8766
8767 `internal_relocs' is supposed to be sorted. */
8768
8769static int
8770is_convert_32_to_16 (bfd *abfd, asection *sec,
8771 Elf_Internal_Rela *reloc,
8772 Elf_Internal_Rela *internal_relocs,
8773 Elf_Internal_Rela *irelend,
8774 uint16_t *insn16)
8775{
8776#define NORMAL_32_TO_16 (1 << 0)
8777#define SPECIAL_32_TO_16 (1 << 1)
8778 bfd_byte *contents = NULL;
8779 bfd_signed_vma off;
8780 bfd_vma mem_addr;
8781 uint32_t insn = 0;
8782 Elf_Internal_Rela *pc_rel;
35c08157
KLC
8783 Elf_Internal_Shdr *symtab_hdr;
8784 Elf_Internal_Sym *isymbuf = NULL;
8785 int convert_type;
8786 bfd_vma offset;
8787
8788 if (reloc->r_offset + 4 > sec->size)
8789 return FALSE;
8790
8791 offset = reloc->r_offset;
8792
0c4bd9d9 8793 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
35c08157
KLC
8794 return FALSE;
8795 insn = bfd_getb32 (contents + offset);
8796
8797 if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL))
8798 convert_type = NORMAL_32_TO_16;
8799 else if (special_convert_32_to_16 (insn, insn16, reloc))
8800 convert_type = SPECIAL_32_TO_16;
8801 else
8802 return FALSE;
8803
8804 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8805 if (!nds32_get_local_syms (abfd, sec, &isymbuf))
8806 return FALSE;
8807
8808 /* Find the first relocation of the same relocation-type,
8809 so we iteratie them forward. */
8810 pc_rel = reloc;
1c8f6a4d 8811 while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset)
35c08157
KLC
8812 pc_rel--;
8813
8814 for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8815 {
8816 if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8817 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8818 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA
8819 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8820 {
fbaf61ad 8821 off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr);
1c8f6a4d
KLC
8822 if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1
8823 || off == 0)
35c08157
KLC
8824 return FALSE;
8825 break;
8826 }
8827 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8828 {
8829 /* movi => movi55 */
1c8f6a4d
KLC
8830 mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf,
8831 symtab_hdr);
8832 /* mem_addr is unsigned, but the value should
8833 be between [-16, 15]. */
35c08157
KLC
8834 if ((mem_addr + 0x10) >> 5)
8835 return FALSE;
8836 break;
8837 }
1c8f6a4d
KLC
8838 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20)
8839 || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12))
8840 {
8841 /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
8842 because it can be relaxed to addi for TLS_LE_ADD. */
8843 return FALSE;
8844 }
35c08157
KLC
8845 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8846 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8847 && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG)
8848 && convert_type == SPECIAL_32_TO_16)
8849 {
8850 /* fp-as-gp
8851 We've selected a best fp-base for this access, so we can
8852 always resolve it anyway. Do nothing. */
8853 break;
8854 }
8855 else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE
8856 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT))
8857 || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY)
8858 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16))
8859 || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE)
8860 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA)))
8861 {
1c8f6a4d
KLC
8862 /* Prevent unresolved addi instruction translate
8863 to addi45 or addi333. */
35c08157
KLC
8864 return FALSE;
8865 }
1c8f6a4d
KLC
8866 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8867 {
fbaf61ad 8868 off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr);
1c8f6a4d
KLC
8869 if (off >= ACCURATE_U9BIT_S1 || off <= 0)
8870 return FALSE;
8871 break;
8872 }
35c08157
KLC
8873 }
8874
8875 return TRUE;
8876}
8877
8878static void
8879nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents,
8880 Elf_Internal_Rela *reloc,
8881 Elf_Internal_Rela *internal_relocs,
8882 Elf_Internal_Rela *irelend,
8883 unsigned short insn16)
8884{
8885 Elf_Internal_Rela *pc_rel;
8886 bfd_vma offset;
8887
8888 offset = reloc->r_offset;
8889 bfd_putb16 (insn16, contents + offset);
8890 /* Find the first relocation of the same relocation-type,
8891 so we iteratie them forward. */
8892 pc_rel = reloc;
8893 while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset)
8894 pc_rel--;
8895
8896 for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8897 {
8898 if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8899 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8900 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA)
8901 {
8902 pc_rel->r_info =
8903 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA);
8904 }
8905 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8906 pc_rel->r_info =
8907 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL);
8908 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8909 pc_rel->r_info =
8910 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA);
8911 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8912 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8913 pc_rel->r_info =
8914 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA);
1c8f6a4d
KLC
8915 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8916 pc_rel->r_info =
8917 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA);
35c08157
KLC
8918 }
8919}
8920
8921/* Find a relocation of type specified by `reloc_type'
8922 of the same r_offset with reloc.
8923 If not found, return irelend.
8924
8925 Assuming relocations are sorted by r_offset,
8926 we find the relocation from `reloc' backward untill relocs,
8927 or find it from `reloc' forward untill irelend. */
8928
8929static Elf_Internal_Rela *
8930find_relocs_at_address (Elf_Internal_Rela *reloc,
8931 Elf_Internal_Rela *relocs,
8932 Elf_Internal_Rela *irelend,
8933 enum elf_nds32_reloc_type reloc_type)
8934{
8935 Elf_Internal_Rela *rel_t;
8936
8937 /* Find backward. */
8938 for (rel_t = reloc;
8939 rel_t >= relocs && rel_t->r_offset == reloc->r_offset;
8940 rel_t--)
8941 if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8942 return rel_t;
8943
1c8f6a4d 8944 /* We didn't find it backward. Try find it forward. */
35c08157
KLC
8945 for (rel_t = reloc;
8946 rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8947 rel_t++)
8948 if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8949 return rel_t;
8950
8951 return irelend;
8952}
8953
8954/* Find a relocation of specified type and offset.
8955 `reloc' is just a refence point to find a relocation at specified offset.
8956 If not found, return irelend.
8957
8958 Assuming relocations are sorted by r_offset,
8959 we find the relocation from `reloc' backward untill relocs,
8960 or find it from `reloc' forward untill irelend. */
8961
8962static Elf_Internal_Rela *
8963find_relocs_at_address_addr (Elf_Internal_Rela *reloc,
8964 Elf_Internal_Rela *relocs,
8965 Elf_Internal_Rela *irelend,
6cae483a 8966 enum elf_nds32_reloc_type reloc_type,
35c08157
KLC
8967 bfd_vma offset_p)
8968{
8969 Elf_Internal_Rela *rel_t = NULL;
8970
8971 /* First, we try to find a relocation of offset `offset_p',
8972 and then we use find_relocs_at_address to find specific type. */
8973
8974 if (reloc->r_offset > offset_p)
8975 {
8976 /* Find backward. */
8977 for (rel_t = reloc;
8978 rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--)
8979 /* Do nothing. */;
8980 }
8981 else if (reloc->r_offset < offset_p)
8982 {
8983 /* Find forward. */
8984 for (rel_t = reloc;
8985 rel_t < irelend && rel_t->r_offset < offset_p; rel_t++)
8986 /* Do nothing. */;
8987 }
8988 else
8989 rel_t = reloc;
8990
8991 /* Not found? */
8992 if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p)
8993 return irelend;
8994
8995 return find_relocs_at_address (rel_t, relocs, irelend, reloc_type);
8996}
8997
fbaf61ad
NC
8998typedef struct nds32_elf_blank nds32_elf_blank_t;
8999struct nds32_elf_blank
35c08157 9000{
fbaf61ad
NC
9001 /* Where the blank begins. */
9002 bfd_vma offset;
9003 /* The size of the blank. */
9004 bfd_vma size;
9005 /* The accumulative size before this blank. */
9006 bfd_vma total_size;
9007 nds32_elf_blank_t *next;
9008 nds32_elf_blank_t *prev;
9009};
35c08157
KLC
9010
9011static nds32_elf_blank_t *blank_free_list = NULL;
9012
9013static nds32_elf_blank_t *
9014create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p)
9015{
9016 nds32_elf_blank_t *blank_t;
9017
9018 if (blank_free_list)
9019 {
9020 blank_t = blank_free_list;
9021 blank_free_list = blank_free_list->next;
9022 }
9023 else
9024 blank_t = bfd_malloc (sizeof (nds32_elf_blank_t));
9025
9026 if (blank_t == NULL)
9027 return NULL;
9028
9029 blank_t->offset = offset_p;
9030 blank_t->size = size_p;
9031 blank_t->total_size = 0;
9032 blank_t->next = NULL;
9033 blank_t->prev = NULL;
9034
9035 return blank_t;
9036}
9037
9038static void
9039remove_nds32_elf_blank (nds32_elf_blank_t *blank_p)
9040{
9041 if (blank_free_list)
9042 {
9043 blank_free_list->prev = blank_p;
9044 blank_p->next = blank_free_list;
9045 }
9046 else
9047 blank_p->next = NULL;
9048
9049 blank_p->prev = NULL;
9050 blank_free_list = blank_p;
9051}
9052
9053static void
9054clean_nds32_elf_blank (void)
9055{
9056 nds32_elf_blank_t *blank_t;
9057
9058 while (blank_free_list)
9059 {
9060 blank_t = blank_free_list;
9061 blank_free_list = blank_free_list->next;
9062 free (blank_t);
9063 }
9064}
9065
9066static nds32_elf_blank_t *
9067search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr)
9068{
9069 nds32_elf_blank_t *blank_t;
9070
9071 if (!blank_p)
9072 return NULL;
9073 blank_t = blank_p;
9074
9075 while (blank_t && addr < blank_t->offset)
9076 blank_t = blank_t->prev;
9077 while (blank_t && blank_t->next && addr >= blank_t->next->offset)
9078 blank_t = blank_t->next;
9079
9080 return blank_t;
9081}
9082
9083static bfd_vma
9084get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
9085 int overwrite)
9086{
9087 nds32_elf_blank_t *blank_t;
9088
9089 blank_t = search_nds32_elf_blank (*blank_p, addr);
9090 if (!blank_t)
9091 return 0;
9092
9093 if (overwrite)
9094 *blank_p = blank_t;
9095
9096 if (addr < blank_t->offset + blank_t->size)
9097 return blank_t->total_size + (addr - blank_t->offset);
9098 else
9099 return blank_t->total_size + blank_t->size;
9100}
9101
9102static bfd_boolean
9103insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len)
9104{
9105 nds32_elf_blank_t *blank_t, *blank_t2;
9106
9107 if (!*blank_p)
9108 {
9109 *blank_p = create_nds32_elf_blank (addr, len);
9110 return *blank_p ? TRUE : FALSE;
9111 }
9112
9113 blank_t = search_nds32_elf_blank (*blank_p, addr);
9114
9115 if (blank_t == NULL)
9116 {
9117 blank_t = create_nds32_elf_blank (addr, len);
9118 if (!blank_t)
9119 return FALSE;
9120 while ((*blank_p)->prev != NULL)
9121 *blank_p = (*blank_p)->prev;
9122 blank_t->next = *blank_p;
9123 (*blank_p)->prev = blank_t;
9124 (*blank_p) = blank_t;
9125 return TRUE;
9126 }
9127
9128 if (addr < blank_t->offset + blank_t->size)
9129 {
fbaf61ad
NC
9130 /* Extend the origin blank. */
9131 if (addr + len > blank_t->offset + blank_t->size)
9132 blank_t->size = addr + len - blank_t->offset;
35c08157
KLC
9133 }
9134 else
9135 {
9136 blank_t2 = create_nds32_elf_blank (addr, len);
9137 if (!blank_t2)
9138 return FALSE;
9139 if (blank_t->next)
9140 {
9141 blank_t->next->prev = blank_t2;
9142 blank_t2->next = blank_t->next;
9143 }
9144 blank_t2->prev = blank_t;
9145 blank_t->next = blank_t2;
9146 *blank_p = blank_t2;
9147 }
9148
9149 return TRUE;
9150}
9151
9152static bfd_boolean
9153insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
9154 bfd_vma len)
9155{
9156 nds32_elf_blank_t *blank_t;
9157
9158 if (!insert_nds32_elf_blank (blank_p, addr, len))
9159 return FALSE;
9160
9161 blank_t = *blank_p;
9162
9163 if (!blank_t->prev)
9164 {
9165 blank_t->total_size = 0;
9166 blank_t = blank_t->next;
9167 }
9168
9169 while (blank_t)
9170 {
9171 blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size;
9172 blank_t = blank_t->next;
9173 }
9174
9175 return TRUE;
9176}
9177
9178static void
9179calc_nds32_blank_total (nds32_elf_blank_t *blank_p)
9180{
9181 nds32_elf_blank_t *blank_t;
9182 bfd_vma total_size = 0;
9183
9184 if (!blank_p)
9185 return;
9186
9187 blank_t = blank_p;
9188 while (blank_t->prev)
9189 blank_t = blank_t->prev;
9190 while (blank_t)
9191 {
9192 blank_t->total_size = total_size;
9193 total_size += blank_t->size;
9194 blank_t = blank_t->next;
9195 }
9196}
9197
9198static bfd_boolean
9199nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec,
9200 nds32_elf_blank_t *blank_p)
9201{
9202 Elf_Internal_Shdr *symtab_hdr; /* Symbol table header of this bfd. */
1c8f6a4d 9203 Elf_Internal_Sym *isym = NULL; /* Symbol table of this bfd. */
35c08157
KLC
9204 Elf_Internal_Sym *isymend; /* Symbol entry iterator. */
9205 unsigned int sec_shndx; /* The section the be relaxed. */
9206 bfd_byte *contents; /* Contents data of iterating section. */
9207 Elf_Internal_Rela *internal_relocs;
9208 Elf_Internal_Rela *irel;
9209 Elf_Internal_Rela *irelend;
9210 struct elf_link_hash_entry **sym_hashes;
9211 struct elf_link_hash_entry **end_hashes;
9212 unsigned int symcount;
9213 asection *sect;
9214 nds32_elf_blank_t *blank_t;
9215 nds32_elf_blank_t *blank_t2;
9216 nds32_elf_blank_t *blank_head;
9217
9218 blank_head = blank_t = blank_p;
9219 while (blank_head->prev != NULL)
9220 blank_head = blank_head->prev;
9221 while (blank_t->next != NULL)
9222 blank_t = blank_t->next;
9223
9224 if (blank_t->offset + blank_t->size <= sec->size)
9225 {
9226 blank_t->next = create_nds32_elf_blank (sec->size + 4, 0);
9227 blank_t->next->prev = blank_t;
9228 }
9229 if (blank_head->offset > 0)
9230 {
9231 blank_head->prev = create_nds32_elf_blank (0, 0);
9232 blank_head->prev->next = blank_head;
9233 blank_head = blank_head->prev;
9234 }
9235
9236 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
9237
9238 /* The deletion must stop at the next ALIGN reloc for an alignment
9239 power larger than the number of bytes we are deleting. */
9240
9241 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9242 if (!nds32_get_local_syms (abfd, sec, &isym))
9243 return FALSE;
9244
9245 if (isym == NULL)
9246 {
9247 isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
9248 symtab_hdr->sh_info, 0, NULL, NULL, NULL);
9249 symtab_hdr->contents = (bfd_byte *) isym;
9250 }
9251
9252 if (isym == NULL || symtab_hdr->sh_info == 0)
9253 return FALSE;
9254
9255 blank_t = blank_head;
9256 calc_nds32_blank_total (blank_head);
9257
9258 for (sect = abfd->sections; sect != NULL; sect = sect->next)
9259 {
9260 /* Adjust all the relocs. */
9261
9262 /* Relocations MUST be kept in memory, because relaxation adjust them. */
9263 internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
9264 TRUE /* keep_memory */);
9265 irelend = internal_relocs + sect->reloc_count;
9266
9267 blank_t = blank_head;
9268 blank_t2 = blank_head;
9269
9270 if (!(sect->flags & SEC_RELOC))
9271 continue;
9272
0c4bd9d9 9273 nds32_get_section_contents (abfd, sect, &contents, TRUE);
35c08157
KLC
9274
9275 for (irel = internal_relocs; irel < irelend; irel++)
9276 {
9277 bfd_vma raddr;
9278
9279 if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
9280 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
9281 && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
9282 {
9283 unsigned long val = 0;
1c8f6a4d
KLC
9284 unsigned long mask;
9285 long before, between;
6cae483a 9286 long offset = 0;
35c08157
KLC
9287
9288 switch (ELF32_R_TYPE (irel->r_info))
9289 {
9290 case R_NDS32_DIFF8:
1c8f6a4d 9291 offset = bfd_get_8 (abfd, contents + irel->r_offset);
35c08157
KLC
9292 break;
9293 case R_NDS32_DIFF16:
1c8f6a4d 9294 offset = bfd_get_16 (abfd, contents + irel->r_offset);
35c08157
KLC
9295 break;
9296 case R_NDS32_DIFF32:
9297 val = bfd_get_32 (abfd, contents + irel->r_offset);
1c8f6a4d
KLC
9298 /* Get the signed bit and mask for the high part. The
9299 gcc will alarm when right shift 32-bit since the
9300 type size of long may be 32-bit. */
9301 mask = 0 - (val >> 31);
9302 if (mask)
9303 offset = (val | (mask - 0xffffffff));
9304 else
9305 offset = val;
35c08157
KLC
9306 break;
9307 default:
9308 BFD_ASSERT (0);
9309 }
9310
9311 /* DIFF value
9312 0 |encoded in location|
9313 |------------|-------------------|---------
9314 sym+off(addend)
9315 -- before ---| *****************
9316 --------------------- between ---|
9317
1c8f6a4d
KLC
9318 We only care how much data are relax between DIFF,
9319 marked as ***. */
35c08157
KLC
9320
9321 before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
1c8f6a4d
KLC
9322 between = get_nds32_elf_blank_total (&blank_t,
9323 irel->r_addend + offset, 0);
35c08157
KLC
9324 if (between == before)
9325 goto done_adjust_diff;
9326
9327 switch (ELF32_R_TYPE (irel->r_info))
9328 {
9329 case R_NDS32_DIFF8:
1c8f6a4d
KLC
9330 bfd_put_8 (abfd, offset - (between - before),
9331 contents + irel->r_offset);
35c08157
KLC
9332 break;
9333 case R_NDS32_DIFF16:
1c8f6a4d
KLC
9334 bfd_put_16 (abfd, offset - (between - before),
9335 contents + irel->r_offset);
35c08157
KLC
9336 break;
9337 case R_NDS32_DIFF32:
1c8f6a4d
KLC
9338 bfd_put_32 (abfd, offset - (between - before),
9339 contents + irel->r_offset);
35c08157
KLC
9340 break;
9341 }
9342 }
9343 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
9344 && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
9345 {
9346 bfd_vma val = 0;
9347 unsigned int len = 0;
9348 unsigned long before, between;
9349 bfd_byte *endp, *p;
9350
4265548c
PA
9351 val = _bfd_read_unsigned_leb128 (abfd, contents + irel->r_offset,
9352 &len);
35c08157
KLC
9353
9354 before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
1c8f6a4d
KLC
9355 between = get_nds32_elf_blank_total (&blank_t,
9356 irel->r_addend + val, 0);
35c08157
KLC
9357 if (between == before)
9358 goto done_adjust_diff;
9359
9360 p = contents + irel->r_offset;
9361 endp = p + len -1;
9362 memset (p, 0x80, len);
9363 *(endp) = 0;
9364 p = write_uleb128 (p, val - (between - before)) - 1;
9365 if (p < endp)
9366 *p |= 0x80;
9367 }
dc1e8a47 9368 done_adjust_diff:
35c08157
KLC
9369
9370 if (sec == sect)
9371 {
9372 raddr = irel->r_offset;
1c8f6a4d
KLC
9373 irel->r_offset -= get_nds32_elf_blank_total (&blank_t2,
9374 irel->r_offset, 1);
35c08157
KLC
9375
9376 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
9377 continue;
9378 if (blank_t2 && blank_t2->next
1c8f6a4d
KLC
9379 && (blank_t2->offset > raddr
9380 || blank_t2->next->offset <= raddr))
4eca0228 9381 _bfd_error_handler
38f14ab8
AM
9382 (_("%pB: error: search_nds32_elf_blank reports wrong node"),
9383 abfd);
35c08157
KLC
9384
9385 /* Mark reloc in deleted portion as NONE.
9386 For some relocs like R_NDS32_LABEL that doesn't modify the
9387 content in the section. R_NDS32_LABEL doesn't belong to the
9388 instruction in the section, so we should preserve it. */
9389 if (raddr >= blank_t2->offset
9390 && raddr < blank_t2->offset + blank_t2->size
9391 && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
9392 && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN
9393 && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
9394 && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
9395 && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND
9396 && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND)
9397 {
9398 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
9399 R_NDS32_NONE);
9400 continue;
9401 }
9402 }
9403
9404 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
9405 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
9406 || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
9407 continue;
9408
9409 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
9410 && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
9411 && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
9412 {
9413 if (irel->r_addend <= sec->size)
9414 irel->r_addend -=
9415 get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1);
9416 }
9417 }
9418 }
9419
9420 /* Adjust the local symbols defined in this section. */
9421 blank_t = blank_head;
9422 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
9423 {
9424 if (isym->st_shndx == sec_shndx)
9425 {
9426 if (isym->st_value <= sec->size)
9427 {
9428 bfd_vma ahead;
9429 bfd_vma orig_addr = isym->st_value;
9430
9431 ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1);
9432 isym->st_value -= ahead;
9433
9434 /* Adjust function size. */
1c8f6a4d
KLC
9435 if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC
9436 && isym->st_size > 0)
9437 isym->st_size -=
9438 get_nds32_elf_blank_total
9439 (&blank_t, orig_addr + isym->st_size, 0) - ahead;
35c08157
KLC
9440 }
9441 }
9442 }
9443
9444 /* Now adjust the global symbols defined in this section. */
9445 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
9446 - symtab_hdr->sh_info);
9447 sym_hashes = elf_sym_hashes (abfd);
9448 end_hashes = sym_hashes + symcount;
9449 blank_t = blank_head;
9450 for (; sym_hashes < end_hashes; sym_hashes++)
9451 {
9452 struct elf_link_hash_entry *sym_hash = *sym_hashes;
9453
9454 if ((sym_hash->root.type == bfd_link_hash_defined
9455 || sym_hash->root.type == bfd_link_hash_defweak)
9456 && sym_hash->root.u.def.section == sec)
9457 {
9458 if (sym_hash->root.u.def.value <= sec->size)
9459 {
9460 bfd_vma ahead;
9461 bfd_vma orig_addr = sym_hash->root.u.def.value;
9462
9463 ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1);
9464 sym_hash->root.u.def.value -= ahead;
9465
9466 /* Adjust function size. */
9467 if (sym_hash->type == STT_FUNC)
1c8f6a4d
KLC
9468 sym_hash->size -=
9469 get_nds32_elf_blank_total
9470 (&blank_t, orig_addr + sym_hash->size, 0) - ahead;
35c08157
KLC
9471
9472 }
9473 }
9474 }
9475
9476 contents = elf_section_data (sec)->this_hdr.contents;
9477 blank_t = blank_head;
9478 while (blank_t->next)
9479 {
9480 /* Actually delete the bytes. */
9481
9482 /* If current blank is the last blank overlap with current section,
9483 go to finish process. */
9484 if (sec->size <= (blank_t->next->offset))
9485 break;
9486
9487 memmove (contents + blank_t->offset - blank_t->total_size,
9488 contents + blank_t->offset + blank_t->size,
9489 blank_t->next->offset - (blank_t->offset + blank_t->size));
9490
9491 blank_t = blank_t->next;
9492 }
9493
9494 if (sec->size > (blank_t->offset + blank_t->size))
9495 {
9496 /* There are remaining code between blank and section boundary.
9497 Move the remaining code to appropriate location. */
9498 memmove (contents + blank_t->offset - blank_t->total_size,
9499 contents + blank_t->offset + blank_t->size,
9500 sec->size - (blank_t->offset + blank_t->size));
9501 sec->size -= blank_t->total_size + blank_t->size;
9502 }
9503 else
9504 /* This blank is not entirely included in the section,
9505 reduce the section size by only part of the blank size. */
9506 sec->size -= blank_t->total_size + (sec->size - blank_t->offset);
9507
9508 while (blank_head)
9509 {
9510 blank_t = blank_head;
9511 blank_head = blank_head->next;
9512 remove_nds32_elf_blank (blank_t);
9513 }
9514
9515 return TRUE;
9516}
9517
9518/* Get the contents of a section. */
9519
9520static int
0c4bd9d9
KLC
9521nds32_get_section_contents (bfd *abfd, asection *sec,
9522 bfd_byte **contents_p, bfd_boolean cache)
35c08157
KLC
9523{
9524 /* Get the section contents. */
9525 if (elf_section_data (sec)->this_hdr.contents != NULL)
9526 *contents_p = elf_section_data (sec)->this_hdr.contents;
9527 else
9528 {
9529 if (!bfd_malloc_and_get_section (abfd, sec, contents_p))
9530 return FALSE;
0c4bd9d9
KLC
9531 if (cache)
9532 elf_section_data (sec)->this_hdr.contents = *contents_p;
35c08157
KLC
9533 }
9534
9535 return TRUE;
9536}
9537
9538/* Get the contents of the internal symbol of abfd. */
9539
9540static int
9541nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED,
9542 Elf_Internal_Sym **isymbuf_p)
9543{
9544 Elf_Internal_Shdr *symtab_hdr;
9545 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9546
9547 /* Read this BFD's local symbols if we haven't done so already. */
9548 if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0)
9549 {
9550 *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents;
9551 if (*isymbuf_p == NULL)
9552 {
9553 *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr,
9554 symtab_hdr->sh_info, 0,
9555 NULL, NULL, NULL);
9556 if (*isymbuf_p == NULL)
9557 return FALSE;
9558 }
9559 }
9560 symtab_hdr->contents = (bfd_byte *) (*isymbuf_p);
9561
9562 return TRUE;
9563}
9564
9565/* Range of small data. */
1c8f6a4d
KLC
9566static bfd_vma sdata_range[2][2];
9567static bfd_vma const sdata_init_range[2] =
9568{ ACCURATE_12BIT_S1, ACCURATE_19BIT };
35c08157
KLC
9569
9570static int
9571nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
9572 bfd_byte *contents, bfd_vma addr)
9573{
9574 unsigned long insn = bfd_getb32 (contents + addr);
9575
9576 if (insn & 0x80000000)
9577 return 2;
9578
9579 return 4;
9580}
9581
9582/* Set the gp relax range. We have to measure the safe range
9583 to do gp relaxation. */
9584
9585static void
9586relax_range_measurement (bfd *abfd)
9587{
9588 asection *sec_f, *sec_b;
9589 /* For upper bound. */
9590 bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
9591 bfd_vma align;
35c08157
KLC
9592 static int decide_relax_range = 0;
9593 int i;
fbaf61ad 9594 int range_number = ARRAY_SIZE (sdata_init_range);
35c08157
KLC
9595
9596 if (decide_relax_range)
9597 return;
9598 decide_relax_range = 1;
9599
9600 if (sda_rela_sec == NULL)
9601 {
9602 /* Since there is no data sections, we assume the range is page size. */
1c8f6a4d 9603 for (i = 0; i < range_number; i++)
35c08157
KLC
9604 {
9605 sdata_range[i][0] = sdata_init_range[i] - 0x1000;
9606 sdata_range[i][1] = sdata_init_range[i] - 0x1000;
9607 }
9608 return;
9609 }
9610
9611 /* Get the biggest alignment power after the gp located section. */
9612 sec_f = sda_rela_sec->output_section;
9613 sec_b = sec_f->next;
9614 align = 0;
9615 while (sec_b != NULL)
9616 {
9617 if ((unsigned)(1 << sec_b->alignment_power) > align)
9618 align = (1 << sec_b->alignment_power);
9619 sec_b = sec_b->next;
9620 }
9621
9622 /* I guess we can not determine the section before
9623 gp located section, so we assume the align is max page size. */
1c8f6a4d 9624 for (i = 0; i < range_number; i++)
35c08157 9625 {
1c8f6a4d 9626 sdata_range[i][1] = sdata_init_range[i] - align;
35c08157 9627 BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]);
1c8f6a4d 9628 sdata_range[i][0] = sdata_init_range[i] - maxpgsz;
35c08157
KLC
9629 BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]);
9630 }
9631}
9632
9633/* These are macros used to check flags encoded in r_addend.
9634 They are only used by nds32_elf_relax_section (). */
9635#define GET_SEQ_LEN(addend) ((addend) & 0x000000ff)
9636#define IS_1ST_CONVERT(addend) ((addend) & 0x80000000)
9637#define IS_OPTIMIZE(addend) ((addend) & 0x40000000)
9638#define IS_16BIT_ON(addend) ((addend) & 0x20000000)
9639
695344c0
NC
9640static const char * unrecognized_reloc_msg =
9641 /* xgettext:c-format */
2dcf00ce 9642 N_("%pB: warning: %s points to unrecognized reloc at %#" PRIx64);
695344c0 9643
1c8f6a4d
KLC
9644/* Relax LONGCALL1 relocation for nds32_elf_relax_section. */
9645
35c08157 9646static bfd_boolean
1c8f6a4d
KLC
9647nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9648 Elf_Internal_Rela *internal_relocs, int *insn_len,
9649 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9650 Elf_Internal_Shdr *symtab_hdr)
9651{
9652 /* There are 3 variations for LONGCALL1
9653 case 4-4-2; 16-bit on, optimize off or optimize for space
07d6d2b8 9654 sethi ta, hi20(symbol) ; LONGCALL1/HI20
1c8f6a4d 9655 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8 9656 jral5 ta ;
1c8f6a4d
KLC
9657
9658 case 4-4-4; 16-bit off, optimize don't care
07d6d2b8 9659 sethi ta, hi20(symbol) ; LONGCALL1/HI20
1c8f6a4d 9660 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8 9661 jral ta ;
1c8f6a4d
KLC
9662
9663 case 4-4-4; 16-bit on, optimize for speed
07d6d2b8 9664 sethi ta, hi20(symbol) ; LONGCALL1/HI20
1c8f6a4d 9665 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8 9666 jral ta ;
1c8f6a4d
KLC
9667 Check code for -mlong-calls output. */
9668
9669 /* Get the reloc for the address from which the register is
9670 being loaded. This reloc will tell us which function is
9671 actually being called. */
9672
9673 bfd_vma laddr;
9674 int seq_len; /* Original length of instruction sequence. */
35c08157 9675 uint32_t insn;
1c8f6a4d 9676 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
1c8f6a4d 9677 bfd_signed_vma foff;
35c08157 9678 uint16_t insn16;
35c08157 9679
1c8f6a4d
KLC
9680 irelend = internal_relocs + sec->reloc_count;
9681 seq_len = GET_SEQ_LEN (irel->r_addend);
9682 laddr = irel->r_offset;
9683 *insn_len = seq_len;
35c08157 9684
1c8f6a4d
KLC
9685 hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9686 R_NDS32_HI20_RELA, laddr);
9687 lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9688 R_NDS32_LO12S0_ORI_RELA,
9689 laddr + 4);
35c08157 9690
1c8f6a4d 9691 if (hi_irelfn == irelend || lo_irelfn == irelend)
35c08157 9692 {
695344c0 9693 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL1",
2dcf00ce 9694 (uint64_t) irel->r_offset);
1c8f6a4d 9695 return FALSE;
35c08157
KLC
9696 }
9697
1c8f6a4d 9698 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 9699 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
35c08157 9700
1c8f6a4d 9701 /* This condition only happened when symbol is undefined. */
fbaf61ad
NC
9702 if (foff == 0
9703 || foff < -CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
9704 || foff >= CONSERVATIVE_24BIT_S1)
9705 return FALSE;
35c08157 9706
fbaf61ad 9707 /* Relax to: jal symbol; 25_PCREL. */
1c8f6a4d
KLC
9708 /* For simplicity of coding, we are going to modify the section
9709 contents, the section relocs, and the BFD symbol table. We
9710 must tell the rest of the code not to free up this
9711 information. It would be possible to instead create a table
9712 of changes which have to be made, as is done in coff-mips.c;
9713 that would be more work, but would require less memory when
9714 the linker is run. */
9715
9716 /* Replace the long call with a jal. */
9717 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9718 R_NDS32_25_PCREL_RELA);
9719 irel->r_addend = hi_irelfn->r_addend;
9720
9721 /* We don't resolve this here but resolve it in relocate_section. */
9722 insn = INSN_JAL;
9723 bfd_putb32 (insn, contents + irel->r_offset);
9724
9725 hi_irelfn->r_info =
9726 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9727 lo_irelfn->r_info =
9728 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9729 *insn_len = 4;
9730
9731 if (seq_len & 0x2)
9732 {
9733 insn16 = NDS32_NOP16;
9734 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9735 lo_irelfn->r_info =
9736 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9737 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9738 *insn_len += 2;
9739 }
9740 return TRUE;
9741}
35c08157 9742
1c8f6a4d
KLC
9743#define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
9744/* Relax LONGCALL2 relocation for nds32_elf_relax_section. */
35c08157 9745
1c8f6a4d
KLC
9746static bfd_boolean
9747nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9748 Elf_Internal_Rela *internal_relocs, int *insn_len,
9749 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9750 Elf_Internal_Shdr *symtab_hdr)
9751{
9752 /* bltz rt, .L1 ; LONGCALL2
9753 jal symbol ; 25_PCREL
9754 .L1: */
35c08157 9755
1c8f6a4d
KLC
9756 /* Get the reloc for the address from which the register is
9757 being loaded. This reloc will tell us which function is
9758 actually being called. */
35c08157 9759
1c8f6a4d
KLC
9760 bfd_vma laddr;
9761 uint32_t insn;
9762 Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend;
1c8f6a4d 9763 bfd_signed_vma foff;
35c08157 9764
1c8f6a4d
KLC
9765 irelend = internal_relocs + sec->reloc_count;
9766 laddr = irel->r_offset;
9767 i1_irelfn =
9768 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9769 R_NDS32_25_PCREL_RELA, laddr + 4);
9770
9771 if (i1_irelfn == irelend)
35c08157 9772 {
695344c0 9773 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL2",
2dcf00ce 9774 (uint64_t) irel->r_offset);
1c8f6a4d 9775 return FALSE;
35c08157
KLC
9776 }
9777
1c8f6a4d 9778 insn = bfd_getb32 (contents + laddr);
35c08157 9779
1c8f6a4d 9780 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 9781 foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr);
35c08157 9782
fbaf61ad
NC
9783 if (foff == 0
9784 || foff < -CONSERVATIVE_16BIT_S1
1c8f6a4d
KLC
9785 || foff >= CONSERVATIVE_16BIT_S1)
9786 return FALSE;
35c08157 9787
1c8f6a4d
KLC
9788 /* Relax to bgezal rt, label ; 17_PCREL
9789 or bltzal rt, label ; 17_PCREL */
9790
9791 /* Convert to complimentary conditional call. */
9792 insn = CONVERT_CONDITION_CALL (insn);
9793
9794 /* For simplicity of coding, we are going to modify the section
9795 contents, the section relocs, and the BFD symbol table. We
9796 must tell the rest of the code not to free up this
9797 information. It would be possible to instead create a table
9798 of changes which have to be made, as is done in coff-mips.c;
9799 that would be more work, but would require less memory when
9800 the linker is run. */
9801
9802 /* Clean unnessary relocations. */
9803 i1_irelfn->r_info =
9804 ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE);
9805 cond_irelfn =
9806 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9807 R_NDS32_17_PCREL_RELA, laddr);
9808 if (cond_irelfn != irelend)
9809 cond_irelfn->r_info =
9810 ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE);
9811
9812 /* Replace the long call with a bgezal. */
9813 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info),
9814 R_NDS32_17_PCREL_RELA);
9815 irel->r_addend = i1_irelfn->r_addend;
9816
9817 bfd_putb32 (insn, contents + irel->r_offset);
9818
9819 *insn_len = 4;
9820 return TRUE;
9821}
35c08157 9822
1c8f6a4d
KLC
9823/* Relax LONGCALL3 relocation for nds32_elf_relax_section. */
9824
9825static bfd_boolean
9826nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9827 Elf_Internal_Rela *internal_relocs, int *insn_len,
9828 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9829 Elf_Internal_Shdr *symtab_hdr)
9830{
9831 /* There are 3 variations for LONGCALL3
9832 case 4-4-4-2; 16-bit on, optimize off or optimize for space
07d6d2b8
AM
9833 bltz rt, $1 ; LONGCALL3
9834 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 9835 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8 9836 jral5 ta ;
1c8f6a4d
KLC
9837 $1
9838
9839 case 4-4-4-4; 16-bit off, optimize don't care
07d6d2b8
AM
9840 bltz rt, $1 ; LONGCALL3
9841 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 9842 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8 9843 jral ta ;
1c8f6a4d
KLC
9844 $1
9845
9846 case 4-4-4-4; 16-bit on, optimize for speed
07d6d2b8
AM
9847 bltz rt, $1 ; LONGCALL3
9848 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 9849 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8 9850 jral ta ;
1c8f6a4d
KLC
9851 $1 */
9852
9853 /* Get the reloc for the address from which the register is
9854 being loaded. This reloc will tell us which function is
9855 actually being called. */
9856
9857 bfd_vma laddr;
9858 int seq_len; /* Original length of instruction sequence. */
9859 uint32_t insn;
9860 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
1c8f6a4d
KLC
9861 bfd_signed_vma foff;
9862 uint16_t insn16;
9863
9864 irelend = internal_relocs + sec->reloc_count;
9865 seq_len = GET_SEQ_LEN (irel->r_addend);
9866 laddr = irel->r_offset;
9867 *insn_len = seq_len;
9868
9869 hi_irelfn =
9870 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9871 R_NDS32_HI20_RELA, laddr + 4);
9872 lo_irelfn =
9873 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9874 R_NDS32_LO12S0_ORI_RELA, laddr + 8);
9875
9876 if (hi_irelfn == irelend || lo_irelfn == irelend)
9877 {
695344c0 9878 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL3",
2dcf00ce 9879 (uint64_t) irel->r_offset);
1c8f6a4d 9880 return FALSE;
35c08157
KLC
9881 }
9882
1c8f6a4d 9883 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 9884 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
35c08157 9885
fbaf61ad
NC
9886 if (foff == 0
9887 || foff < -CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
9888 || foff >= CONSERVATIVE_24BIT_S1)
9889 return FALSE;
35c08157 9890
1c8f6a4d
KLC
9891 insn = bfd_getb32 (contents + laddr);
9892 if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
35c08157 9893 {
1c8f6a4d
KLC
9894 /* Relax to bgezal rt, label ; 17_PCREL
9895 or bltzal rt, label ; 17_PCREL */
35c08157 9896
1c8f6a4d
KLC
9897 /* Convert to complimentary conditional call. */
9898 insn = CONVERT_CONDITION_CALL (insn);
9899 bfd_putb32 (insn, contents + irel->r_offset);
35c08157 9900
1c8f6a4d
KLC
9901 *insn_len = 4;
9902 irel->r_info =
9903 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9904 hi_irelfn->r_info =
9905 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9906 lo_irelfn->r_info =
9907 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9908
9909 cond_irelfn =
9910 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9911 R_NDS32_17_PCREL_RELA, laddr);
9912 if (cond_irelfn != irelend)
35c08157 9913 {
1c8f6a4d
KLC
9914 cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9915 R_NDS32_17_PCREL_RELA);
9916 cond_irelfn->r_addend = hi_irelfn->r_addend;
35c08157 9917 }
1c8f6a4d
KLC
9918
9919 if (seq_len & 0x2)
35c08157 9920 {
1c8f6a4d
KLC
9921 insn16 = NDS32_NOP16;
9922 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9923 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9924 R_NDS32_INSN16);
9925 hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9926 insn_len += 2;
35c08157 9927 }
1c8f6a4d
KLC
9928 }
9929 else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
9930 {
9931 /* Relax to the following instruction sequence
9932 bltz rt, $1 ; LONGCALL2
9933 jal symbol ; 25_PCREL
9934 $1 */
9935 *insn_len = 8;
9936 insn = INSN_JAL;
9937 bfd_putb32 (insn, contents + hi_irelfn->r_offset);
35c08157 9938
1c8f6a4d
KLC
9939 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9940 R_NDS32_25_PCREL_RELA);
9941 irel->r_info =
9942 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2);
9943
9944 lo_irelfn->r_info =
9945 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
35c08157 9946
1c8f6a4d 9947 if (seq_len & 0x2)
35c08157 9948 {
1c8f6a4d
KLC
9949 insn16 = NDS32_NOP16;
9950 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9951 lo_irelfn->r_info =
9952 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9953 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9954 insn_len += 2;
9955 }
9956 }
9957 return TRUE;
9958}
35c08157 9959
1c8f6a4d 9960/* Relax LONGJUMP1 relocation for nds32_elf_relax_section. */
35c08157 9961
1c8f6a4d
KLC
9962static bfd_boolean
9963nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9964 Elf_Internal_Rela *internal_relocs, int *insn_len,
9965 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9966 Elf_Internal_Shdr *symtab_hdr)
9967{
9968 /* There are 3 variations for LONGJUMP1
9969 case 4-4-2; 16-bit bit on, optimize off or optimize for space
07d6d2b8
AM
9970 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9971 ori ta, ta, lo12(symbol) ; LO12S0
9972 jr5 ta ;
1c8f6a4d
KLC
9973
9974 case 4-4-4; 16-bit off, optimize don't care
07d6d2b8
AM
9975 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9976 ori ta, ta, lo12(symbol) ; LO12S0
9977 jr ta ;
1c8f6a4d
KLC
9978
9979 case 4-4-4; 16-bit on, optimize for speed
07d6d2b8
AM
9980 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9981 ori ta, ta, lo12(symbol) ; LO12S0
9982 jr ta ; */
1c8f6a4d
KLC
9983
9984 /* Get the reloc for the address from which the register is
9985 being loaded. This reloc will tell us which function is
9986 actually being called. */
9987
9988 bfd_vma laddr;
9989 int seq_len; /* Original length of instruction sequence. */
9990 int insn16_on; /* 16-bit on/off. */
9991 uint32_t insn;
9992 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
1c8f6a4d
KLC
9993 bfd_signed_vma foff;
9994 uint16_t insn16;
9995 unsigned long reloc;
35c08157 9996
1c8f6a4d
KLC
9997 irelend = internal_relocs + sec->reloc_count;
9998 seq_len = GET_SEQ_LEN (irel->r_addend);
9999 laddr = irel->r_offset;
10000 *insn_len = seq_len;
10001 insn16_on = IS_16BIT_ON (irel->r_addend);
10002
10003 hi_irelfn =
10004 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10005 R_NDS32_HI20_RELA, laddr);
10006 lo_irelfn =
10007 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10008 R_NDS32_LO12S0_ORI_RELA, laddr + 4);
10009 if (hi_irelfn == irelend || lo_irelfn == irelend)
10010 {
695344c0 10011 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP1",
2dcf00ce 10012 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10013 return FALSE;
10014 }
35c08157 10015
1c8f6a4d 10016 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 10017 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
35c08157 10018
fbaf61ad
NC
10019 if (foff == 0
10020 || foff >= CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
10021 || foff < -CONSERVATIVE_24BIT_S1)
10022 return FALSE;
35c08157 10023
fbaf61ad
NC
10024 if (insn16_on
10025 && foff >= -ACCURATE_8BIT_S1
10026 && foff < ACCURATE_8BIT_S1
10027 && (seq_len & 0x2))
1c8f6a4d
KLC
10028 {
10029 /* j8 label */
10030 /* 16-bit on, but not optimized for speed. */
10031 reloc = R_NDS32_9_PCREL_RELA;
10032 insn16 = INSN_J8;
10033 bfd_putb16 (insn16, contents + irel->r_offset);
10034 *insn_len = 2;
10035 irel->r_info =
10036 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10037 }
10038 else
10039 {
10040 /* j label */
10041 reloc = R_NDS32_25_PCREL_RELA;
10042 insn = INSN_J;
10043 bfd_putb32 (insn, contents + irel->r_offset);
10044 *insn_len = 4;
10045 irel->r_info =
10046 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16);
10047 irel->r_addend = 0;
10048 }
35c08157 10049
1c8f6a4d
KLC
10050 hi_irelfn->r_info =
10051 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
10052 lo_irelfn->r_info =
10053 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
35c08157 10054
1c8f6a4d
KLC
10055 if ((seq_len & 0x2) && ((*insn_len & 2) == 0))
10056 {
10057 insn16 = NDS32_NOP16;
10058 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
10059 lo_irelfn->r_info =
10060 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
10061 R_NDS32_INSN16);
10062 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10063 *insn_len += 2;
10064 }
10065 return TRUE;
10066}
10067
10068/* Revert condition branch. This function does not check if the input
10069 instruction is condition branch or not. */
10070
10071static void
10072nds32_elf_convert_branch (uint16_t insn16, uint32_t insn,
10073 uint16_t *re_insn16, uint32_t *re_insn)
10074{
10075 uint32_t comp_insn = 0;
10076 uint16_t comp_insn16 = 0;
10077
10078 if (insn)
10079 {
10080 if (N32_OP6 (insn) == N32_OP6_BR1)
10081 {
10082 /* beqs label. */
10083 comp_insn = (insn ^ 0x4000) & 0xffffc000;
10084 if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5)
35c08157 10085 {
1c8f6a4d
KLC
10086 /* Insn can be contracted to 16-bit implied r5. */
10087 comp_insn16 =
10088 (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38;
10089 comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
35c08157 10090 }
1c8f6a4d
KLC
10091 }
10092 else if (N32_OP6 (insn) == N32_OP6_BR3)
10093 {
10094 /* bnec $ta, imm11, label. */
10095 comp_insn = (insn ^ 0x80000) & 0xffffff00;
10096 }
10097 else
10098 {
10099 comp_insn = (insn ^ 0x10000) & 0xffffc000;
10100 if (N32_BR2_SUB (insn) == N32_BR2_BEQZ
10101 || N32_BR2_SUB (insn) == N32_BR2_BNEZ)
35c08157 10102 {
1c8f6a4d 10103 if (N32_IS_RT3 (insn))
35c08157 10104 {
1c8f6a4d
KLC
10105 /* Insn can be contracted to 16-bit. */
10106 comp_insn16 =
10107 (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38;
10108 comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
10109 }
10110 else if (N32_RT5 (insn) == REG_R15)
10111 {
10112 /* Insn can be contracted to 16-bit. */
10113 comp_insn16 =
10114 (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38;
35c08157 10115 }
35c08157
KLC
10116 }
10117 }
1c8f6a4d
KLC
10118 }
10119 else
10120 {
10121 switch ((insn16 & 0xf000) >> 12)
35c08157 10122 {
1c8f6a4d
KLC
10123 case 0xc:
10124 /* beqz38 or bnez38 */
10125 comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
10126 comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ;
10127 comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20;
10128 break;
35c08157 10129
1c8f6a4d
KLC
10130 case 0xd:
10131 /* beqs38 or bnes38 */
10132 comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
10133 comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ;
10134 comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20)
10135 | (REG_R5 << 15);
10136 break;
35c08157 10137
1c8f6a4d
KLC
10138 case 0xe:
10139 /* beqzS8 or bnezS8 */
10140 comp_insn16 = (insn16 ^ 0x0100) & 0xff00;
10141 comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ;
10142 comp_insn |= REG_R15 << 20;
10143 break;
35c08157 10144
1c8f6a4d
KLC
10145 default:
10146 break;
10147 }
10148 }
10149 if (comp_insn && re_insn)
10150 *re_insn = comp_insn;
10151 if (comp_insn16 && re_insn16)
10152 *re_insn16 = comp_insn16;
10153}
35c08157 10154
1c8f6a4d 10155/* Relax LONGJUMP2 relocation for nds32_elf_relax_section. */
35c08157 10156
1c8f6a4d
KLC
10157static bfd_boolean
10158nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10159 Elf_Internal_Rela *internal_relocs, int *insn_len,
10160 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10161 Elf_Internal_Shdr *symtab_hdr)
10162{
10163 /* There are 3 variations for LONGJUMP2
10164 case 2-4; 1st insn convertible, 16-bit on,
10165 optimize off or optimize for space
10166 bnes38 rt, ra, $1 ; LONGJUMP2
10167 j label ; 25_PCREL
10168 $1:
10169
10170 case 4-4; 1st insn not convertible
10171 bne rt, ra, $1 ; LONGJUMP2
10172 j label ; 25_PCREL
10173 $1:
10174
10175 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
10176 bne rt, ra, $1 ; LONGJUMP2
10177 j label ; 25_PCREL
10178 $1: */
10179
10180 /* Get the reloc for the address from which the register is
10181 being loaded. This reloc will tell us which function is
10182 actually being called. */
10183
10184 bfd_vma laddr;
10185 int seq_len; /* Original length of instruction sequence. */
10186 Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend;
fbaf61ad 10187 int first_size;
1c8f6a4d
KLC
10188 unsigned int i;
10189 bfd_signed_vma foff;
10190 uint32_t insn, re_insn = 0;
10191 uint16_t insn16, re_insn16 = 0;
10192 unsigned long reloc, cond_reloc;
35c08157 10193
1c8f6a4d
KLC
10194 enum elf_nds32_reloc_type checked_types[] =
10195 { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
35c08157 10196
1c8f6a4d
KLC
10197 irelend = internal_relocs + sec->reloc_count;
10198 seq_len = GET_SEQ_LEN (irel->r_addend);
10199 laddr = irel->r_offset;
10200 *insn_len = seq_len;
10201 first_size = (seq_len == 6) ? 2 : 4;
10202
10203 i2_irelfn =
10204 find_relocs_at_address_addr (irel, internal_relocs,
10205 irelend, R_NDS32_25_PCREL_RELA,
10206 laddr + first_size);
10207
fbaf61ad 10208 for (i = 0; i < ARRAY_SIZE (checked_types); i++)
1c8f6a4d
KLC
10209 {
10210 cond_irelfn =
10211 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10212 checked_types[i], laddr);
10213 if (cond_irelfn != irelend)
10214 break;
10215 }
35c08157 10216
1c8f6a4d
KLC
10217 if (i2_irelfn == irelend || cond_irelfn == irelend)
10218 {
695344c0 10219 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP2",
2dcf00ce 10220 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10221 return FALSE;
10222 }
35c08157 10223
1c8f6a4d 10224 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad
NC
10225 foff = calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr);
10226 if (foff == 0
10227 || foff < -CONSERVATIVE_16BIT_S1
1c8f6a4d
KLC
10228 || foff >= CONSERVATIVE_16BIT_S1)
10229 return FALSE;
35c08157 10230
1c8f6a4d
KLC
10231 /* Get the all corresponding instructions. */
10232 if (first_size == 4)
10233 {
10234 insn = bfd_getb32 (contents + laddr);
10235 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10236 }
10237 else
10238 {
10239 insn16 = bfd_getb16 (contents + laddr);
10240 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10241 }
35c08157 10242
1c8f6a4d
KLC
10243 if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size)
10244 && foff < ACCURATE_8BIT_S1 - first_size)
10245 {
10246 if (first_size == 4)
10247 {
10248 /* Don't convert it to 16-bit now, keep this as relaxable for
10249 ``label reloc; INSN16''. */
35c08157 10250
1c8f6a4d
KLC
10251 /* Save comp_insn32 to buffer. */
10252 bfd_putb32 (re_insn, contents + irel->r_offset);
10253 *insn_len = 4;
10254 reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
10255 R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
10256 cond_reloc = R_NDS32_INSN16;
10257 }
10258 else
10259 {
10260 bfd_putb16 (re_insn16, contents + irel->r_offset);
10261 *insn_len = 2;
10262 reloc = R_NDS32_9_PCREL_RELA;
10263 cond_reloc = R_NDS32_NONE;
10264 }
10265 }
10266 else if (N32_OP6 (re_insn) == N32_OP6_BR1
10267 && (foff >= -(ACCURATE_14BIT_S1 - first_size)
10268 && foff < ACCURATE_14BIT_S1 - first_size))
10269 {
10270 /* beqs label ; 15_PCREL */
10271 bfd_putb32 (re_insn, contents + irel->r_offset);
10272 *insn_len = 4;
10273 reloc = R_NDS32_15_PCREL_RELA;
10274 cond_reloc = R_NDS32_NONE;
10275 }
10276 else if (N32_OP6 (re_insn) == N32_OP6_BR2
10277 && foff >= -CONSERVATIVE_16BIT_S1
10278 && foff < CONSERVATIVE_16BIT_S1)
10279 {
10280 /* beqz label ; 17_PCREL */
10281 bfd_putb32 (re_insn, contents + irel->r_offset);
10282 *insn_len = 4;
10283 reloc = R_NDS32_17_PCREL_RELA;
10284 cond_reloc = R_NDS32_NONE;
10285 }
10286 else
10287 return FALSE;
35c08157 10288
1c8f6a4d
KLC
10289 /* Set all relocations. */
10290 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc);
10291 irel->r_addend = i2_irelfn->r_addend;
35c08157 10292
1c8f6a4d
KLC
10293 cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
10294 cond_reloc);
10295 cond_irelfn->r_addend = 0;
35c08157 10296
1c8f6a4d
KLC
10297 if ((seq_len ^ *insn_len ) & 0x2)
10298 {
10299 insn16 = NDS32_NOP16;
10300 bfd_putb16 (insn16, contents + irel->r_offset + 4);
10301 i2_irelfn->r_offset = 4;
10302 i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
10303 R_NDS32_INSN16);
10304 i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10305 *insn_len += 2;
10306 }
10307 else
10308 i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
10309 R_NDS32_NONE);
10310 return TRUE;
10311}
35c08157 10312
1c8f6a4d 10313/* Relax LONGJUMP3 relocation for nds32_elf_relax_section. */
35c08157 10314
1c8f6a4d
KLC
10315static bfd_boolean
10316nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10317 Elf_Internal_Rela *internal_relocs, int *insn_len,
10318 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10319 Elf_Internal_Shdr *symtab_hdr)
10320{
10321 /* There are 5 variations for LONGJUMP3
10322 case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
10323 optimize off or optimize for space
07d6d2b8
AM
10324 bnes38 rt, ra, $1 ; LONGJUMP3
10325 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 10326 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8
AM
10327 jr5 ta ;
10328 $1: ;
1c8f6a4d
KLC
10329
10330 case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
07d6d2b8
AM
10331 bnes38 rt, ra, $1 ; LONGJUMP3
10332 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 10333 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8
AM
10334 jr5 ta ;
10335 $1: ; LABEL
1c8f6a4d
KLC
10336
10337 case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
10338 optimize off or optimize for space
07d6d2b8
AM
10339 bne rt, ra, $1 ; LONGJUMP3
10340 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 10341 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8
AM
10342 jr5 ta ;
10343 $1: ;
1c8f6a4d
KLC
10344
10345 case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
10346 16-bit off if no INSN16
07d6d2b8
AM
10347 bne rt, ra, $1 ; LONGJUMP3
10348 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 10349 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8
AM
10350 jr ta ;
10351 $1: ;
1c8f6a4d
KLC
10352
10353 case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
10354 16-bit off if no INSN16
07d6d2b8
AM
10355 bne rt, ra, $1 ; LONGJUMP3
10356 sethi ta, hi20(symbol) ; HI20
1c8f6a4d 10357 ori ta, ta, lo12(symbol) ; LO12S0
07d6d2b8
AM
10358 jr ta ;
10359 $1: ; LABEL */
1c8f6a4d
KLC
10360
10361 /* Get the reloc for the address from which the register is
10362 being loaded. This reloc will tell us which function is
10363 actually being called. */
10364 enum elf_nds32_reloc_type checked_types[] =
10365 { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
10366
10367 int reloc_off = 0, cond_removed = 0, convertible;
10368 bfd_vma laddr;
10369 int seq_len; /* Original length of instruction sequence. */
10370 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
fbaf61ad 10371 int first_size;
1c8f6a4d
KLC
10372 unsigned int i;
10373 bfd_signed_vma foff;
10374 uint32_t insn, re_insn = 0;
10375 uint16_t insn16, re_insn16 = 0;
10376 unsigned long reloc, cond_reloc;
35c08157 10377
1c8f6a4d
KLC
10378 irelend = internal_relocs + sec->reloc_count;
10379 seq_len = GET_SEQ_LEN (irel->r_addend);
10380 laddr = irel->r_offset;
10381 *insn_len = seq_len;
35c08157 10382
1c8f6a4d 10383 convertible = IS_1ST_CONVERT (irel->r_addend);
35c08157 10384
1c8f6a4d
KLC
10385 if (convertible)
10386 first_size = 2;
10387 else
10388 first_size = 4;
10389
10390 /* Get all needed relocations. */
10391 hi_irelfn =
10392 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10393 R_NDS32_HI20_RELA, laddr + first_size);
10394 lo_irelfn =
10395 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10396 R_NDS32_LO12S0_ORI_RELA,
10397 laddr + first_size + 4);
10398
fbaf61ad 10399 for (i = 0; i < ARRAY_SIZE (checked_types); i++)
1c8f6a4d
KLC
10400 {
10401 cond_irelfn =
10402 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10403 checked_types[i], laddr);
10404 if (cond_irelfn != irelend)
10405 break;
10406 }
35c08157 10407
fbaf61ad
NC
10408 if (hi_irelfn == irelend
10409 || lo_irelfn == irelend
10410 || cond_irelfn == irelend)
1c8f6a4d 10411 {
695344c0 10412 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP3",
2dcf00ce 10413 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10414 return FALSE;
10415 }
35c08157 10416
1c8f6a4d 10417 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 10418 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
35c08157 10419
fbaf61ad
NC
10420 if (foff == 0
10421 || foff < -CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
10422 || foff >= CONSERVATIVE_24BIT_S1)
10423 return FALSE;
35c08157 10424
1c8f6a4d
KLC
10425 /* Get the all corresponding instructions. */
10426 if (first_size == 4)
10427 {
10428 insn = bfd_getb32 (contents + laddr);
10429 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10430 }
10431 else
10432 {
10433 insn16 = bfd_getb16 (contents + laddr);
10434 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10435 }
35c08157 10436
1c8f6a4d
KLC
10437 /* For simplicity of coding, we are going to modify the section
10438 contents, the section relocs, and the BFD symbol table. We
10439 must tell the rest of the code not to free up this
10440 information. It would be possible to instead create a table
10441 of changes which have to be made, as is done in coff-mips.c;
10442 that would be more work, but would require less memory when
10443 the linker is run. */
35c08157 10444
fbaf61ad
NC
10445 if (re_insn16
10446 && foff >= -ACCURATE_8BIT_S1 - first_size
1c8f6a4d
KLC
10447 && foff < ACCURATE_8BIT_S1 - first_size)
10448 {
10449 if (!(seq_len & 0x2))
10450 {
10451 /* Don't convert it to 16-bit now, keep this as relaxable
10452 for ``label reloc; INSN1a''6. */
10453 /* Save comp_insn32 to buffer. */
10454 bfd_putb32 (re_insn, contents + irel->r_offset);
10455 *insn_len = 4;
10456 reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
10457 R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
10458 cond_reloc = R_NDS32_INSN16;
10459 }
10460 else
10461 {
10462 /* Not optimize for speed; convert sequence to 16-bit. */
10463 /* Save comp_insn16 to buffer. */
10464 bfd_putb16 (re_insn16, contents + irel->r_offset);
10465 *insn_len = 2;
10466 reloc = R_NDS32_9_PCREL_RELA;
10467 cond_reloc = R_NDS32_NONE;
10468 }
10469 cond_removed = 1;
10470 }
10471 else if (N32_OP6 (re_insn) == N32_OP6_BR1
10472 && (foff >= -(ACCURATE_14BIT_S1 - first_size)
10473 && foff < ACCURATE_14BIT_S1 - first_size))
10474 {
10475 /* beqs label ; 15_PCREL */
10476 bfd_putb32 (re_insn, contents + irel->r_offset);
10477 *insn_len = 4;
10478 reloc = R_NDS32_15_PCREL_RELA;
10479 cond_reloc = R_NDS32_NONE;
10480 cond_removed = 1;
10481 }
10482 else if (N32_OP6 (re_insn) == N32_OP6_BR2
10483 && foff >= -CONSERVATIVE_16BIT_S1
10484 && foff < CONSERVATIVE_16BIT_S1)
10485 {
10486 /* beqz label ; 17_PCREL */
10487 bfd_putb32 (re_insn, contents + irel->r_offset);
10488 *insn_len = 4;
10489 reloc = R_NDS32_17_PCREL_RELA;
10490 cond_reloc = R_NDS32_NONE;
10491 cond_removed = 1;
10492 }
10493 else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
10494 && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
10495 {
10496 /* Relax to one of the following 3 variations
10497
10498 case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
10499 for space
10500 bnes38 rt, $1 ; LONGJUMP2
10501 j label ; 25_PCREL
10502 $1
10503
10504 case 4-4; 1st insn not convertible, others don't care
10505 bne rt, ra, $1 ; LONGJUMP2
10506 j label ; 25_PCREL
10507 $1
10508
10509 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
10510 bne rt, ra, $1 ; LONGJUMP2
10511 j label ; 25_PCREL
10512 $1 */
10513
10514 /* Offset for first instruction. */
10515
10516 /* Use j label as second instruction. */
10517 *insn_len = 4 + first_size;
10518 insn = INSN_J;
10519 bfd_putb32 (insn, contents + hi_irelfn->r_offset);
10520 reloc = R_NDS32_LONGJUMP2;
10521 cond_reloc = R_NDS32_25_PLTREL;
10522 }
10523 else
10524 return FALSE;
35c08157 10525
1c8f6a4d
KLC
10526 if (cond_removed == 1)
10527 {
10528 /* Set all relocations. */
10529 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
10530 irel->r_addend = hi_irelfn->r_addend;
10531
10532 cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
10533 cond_reloc);
10534 cond_irelfn->r_addend = 0;
10535 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
10536 R_NDS32_NONE);
10537 }
10538 else
10539 {
10540 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
fbaf61ad 10541 irel->r_addend = irel->r_addend;
1c8f6a4d
KLC
10542 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
10543 cond_reloc);
10544 }
35c08157 10545
1c8f6a4d
KLC
10546 if ((seq_len ^ *insn_len ) & 0x2)
10547 {
10548 insn16 = NDS32_NOP16;
10549 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
10550 lo_irelfn->r_offset = *insn_len;
10551 lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
10552 R_NDS32_INSN16);
10553 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10554 *insn_len += 2;
10555 }
10556 else
10557 lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
10558 R_NDS32_NONE);
10559 return TRUE;
10560}
35c08157 10561
1c8f6a4d 10562/* Relax LONGCALL4 relocation for nds32_elf_relax_section. */
35c08157 10563
1c8f6a4d
KLC
10564static bfd_boolean
10565nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10566 Elf_Internal_Rela *internal_relocs, int *insn_len,
10567 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10568 Elf_Internal_Shdr *symtab_hdr)
10569{
10570 /* The pattern for LONGCALL4. Support for function cse.
10571 sethi ta, hi20(symbol) ; LONGCALL4/HI20
10572 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10573 jral ta ; PTR_RES/EMPTY/INSN16 */
35c08157 10574
1c8f6a4d
KLC
10575 bfd_vma laddr;
10576 uint32_t insn;
10577 Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel;
10578 Elf_Internal_Rela *irelend;
1c8f6a4d 10579 bfd_signed_vma foff;
35c08157 10580
1c8f6a4d
KLC
10581 irelend = internal_relocs + sec->reloc_count;
10582 laddr = irel->r_offset;
35c08157 10583
1c8f6a4d
KLC
10584 /* Get the reloc for the address from which the register is
10585 being loaded. This reloc will tell us which function is
10586 actually being called. */
10587 hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10588 R_NDS32_HI20_RELA, laddr);
35c08157 10589
1c8f6a4d
KLC
10590 if (hi_irel == irelend)
10591 {
695344c0 10592 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
2dcf00ce 10593 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10594 return FALSE;
10595 }
35c08157 10596
1c8f6a4d 10597 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 10598 foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr);
35c08157 10599
1c8f6a4d 10600 /* This condition only happened when symbol is undefined. */
fbaf61ad
NC
10601 if (foff == 0
10602 || foff < -CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
10603 || foff >= CONSERVATIVE_24BIT_S1)
10604 return FALSE;
35c08157 10605
fbaf61ad 10606 /* Relax to: jal symbol; 25_PCREL. */
1c8f6a4d
KLC
10607 /* For simplicity of coding, we are going to modify the section
10608 contents, the section relocs, and the BFD symbol table. We
10609 must tell the rest of the code not to free up this
10610 information. It would be possible to instead create a table
10611 of changes which have to be made, as is done in coff-mips.c;
10612 that would be more work, but would require less memory when
10613 the linker is run. */
35c08157 10614
1c8f6a4d
KLC
10615 ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10616 R_NDS32_PTR_RESOLVED, irel->r_addend);
10617 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10618 R_NDS32_EMPTY, irel->r_addend);
35c08157 10619
1c8f6a4d
KLC
10620 if (ptr_irel == irelend || em_irel == irelend)
10621 {
695344c0 10622 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
2dcf00ce 10623 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10624 return FALSE;
10625 }
10626 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
10627 insn = bfd_getb32 (contents + irel->r_addend);
10628 if (insn & 0x80000000)
10629 return FALSE;
35c08157 10630
1c8f6a4d
KLC
10631 /* Replace the long call with a jal. */
10632 em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10633 R_NDS32_25_PCREL_RELA);
10634 ptr_irel->r_addend = 1;
35c08157 10635
1c8f6a4d
KLC
10636 /* We don't resolve this here but resolve it in relocate_section. */
10637 insn = INSN_JAL;
10638 bfd_putb32 (insn, contents + em_irel->r_offset);
35c08157 10639
1c8f6a4d
KLC
10640 irel->r_info =
10641 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
35c08157 10642
1c8f6a4d
KLC
10643 /* If there is function cse, HI20 can not remove now. */
10644 call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10645 R_NDS32_LONGCALL4, laddr);
10646 if (call_irel == irelend)
10647 {
10648 *insn_len = 0;
10649 hi_irel->r_info =
10650 ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10651 }
35c08157 10652
1c8f6a4d
KLC
10653 insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10654 R_NDS32_INSN16, irel->r_addend);
10655 if (insn_irel != irelend)
10656 insn_irel->r_info =
10657 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
35c08157 10658
1c8f6a4d
KLC
10659 return TRUE;
10660}
35c08157 10661
1c8f6a4d 10662/* Relax LONGCALL5 relocation for nds32_elf_relax_section. */
35c08157 10663
1c8f6a4d
KLC
10664static bfd_boolean
10665nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10666 Elf_Internal_Rela *internal_relocs, int *insn_len,
10667 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10668 Elf_Internal_Shdr *symtab_hdr)
10669{
10670 /* The pattern for LONGCALL5.
10671 bltz rt, .L1 ; LONGCALL5/17_PCREL
10672 jal symbol ; 25_PCREL
10673 .L1: */
35c08157 10674
1c8f6a4d
KLC
10675 bfd_vma laddr;
10676 uint32_t insn;
10677 Elf_Internal_Rela *cond_irel, *irelend;
1c8f6a4d 10678 bfd_signed_vma foff;
35c08157 10679
1c8f6a4d
KLC
10680 irelend = internal_relocs + sec->reloc_count;
10681 laddr = irel->r_offset;
10682 insn = bfd_getb32 (contents + laddr);
35c08157 10683
1c8f6a4d
KLC
10684 /* Get the reloc for the address from which the register is
10685 being loaded. This reloc will tell us which function is
10686 actually being called. */
10687 cond_irel =
10688 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10689 R_NDS32_25_PCREL_RELA, irel->r_addend);
10690 if (cond_irel == irelend)
10691 {
695344c0 10692 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL5",
2dcf00ce 10693 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10694 return FALSE;
10695 }
35c08157 10696
1c8f6a4d 10697 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 10698 foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
35c08157 10699
fbaf61ad
NC
10700 if (foff == 0
10701 || foff < -CONSERVATIVE_16BIT_S1
1c8f6a4d
KLC
10702 || foff >= CONSERVATIVE_16BIT_S1)
10703 return FALSE;
35c08157 10704
1c8f6a4d 10705 /* Relax to bgezal rt, label ; 17_PCREL
fbaf61ad 10706 or bltzal rt, label ; 17_PCREL. */
35c08157 10707
1c8f6a4d
KLC
10708 /* Convert to complimentary conditional call. */
10709 insn = CONVERT_CONDITION_CALL (insn);
35c08157 10710
1c8f6a4d
KLC
10711 /* For simplicity of coding, we are going to modify the section
10712 contents, the section relocs, and the BFD symbol table. We
10713 must tell the rest of the code not to free up this
10714 information. It would be possible to instead create a table
10715 of changes which have to be made, as is done in coff-mips.c;
10716 that would be more work, but would require less memory when
10717 the linker is run. */
35c08157 10718
1c8f6a4d
KLC
10719 /* Modify relocation and contents. */
10720 cond_irel->r_info =
10721 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA);
35c08157 10722
1c8f6a4d
KLC
10723 /* Replace the long call with a bgezal. */
10724 bfd_putb32 (insn, contents + cond_irel->r_offset);
10725 *insn_len = 0;
35c08157 10726
1c8f6a4d
KLC
10727 /* Clean unnessary relocations. */
10728 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
35c08157 10729
1c8f6a4d
KLC
10730 cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10731 R_NDS32_17_PCREL_RELA, laddr);
10732 cond_irel->r_info =
10733 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
35c08157 10734
1c8f6a4d
KLC
10735 return TRUE;
10736}
35c08157 10737
1c8f6a4d 10738/* Relax LONGCALL6 relocation for nds32_elf_relax_section. */
35c08157 10739
1c8f6a4d
KLC
10740static bfd_boolean
10741nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10742 Elf_Internal_Rela *internal_relocs, int *insn_len,
10743 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10744 Elf_Internal_Shdr *symtab_hdr)
10745{
10746 /* The pattern for LONGCALL6.
10747 bltz rt, .L1 ; LONGCALL6/17_PCREL
10748 sethi ta, hi20(symbol) ; HI20/PTR
10749 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10750 jral ta ; PTR_RES/EMPTY/INSN16
10751 .L1 */
10752
10753 bfd_vma laddr;
10754 uint32_t insn;
10755 Elf_Internal_Rela *em_irel, *cond_irel, *irelend;
1c8f6a4d 10756 bfd_signed_vma foff;
35c08157 10757
1c8f6a4d
KLC
10758 irelend = internal_relocs + sec->reloc_count;
10759 laddr = irel->r_offset;
35c08157 10760
1c8f6a4d
KLC
10761 /* Get the reloc for the address from which the register is
10762 being loaded. This reloc will tell us which function is
10763 actually being called. */
10764 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10765 R_NDS32_EMPTY, irel->r_addend);
35c08157 10766
1c8f6a4d
KLC
10767 if (em_irel == irelend)
10768 {
695344c0 10769 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL6",
2dcf00ce 10770 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10771 return FALSE;
10772 }
35c08157 10773
1c8f6a4d 10774 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 10775 foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr);
35c08157 10776
fbaf61ad
NC
10777 if (foff == 0
10778 || foff < -CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
10779 || foff >= CONSERVATIVE_24BIT_S1)
10780 return FALSE;
35c08157 10781
1c8f6a4d
KLC
10782 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
10783 insn = bfd_getb32 (contents + irel->r_addend);
10784 if (insn & 0x80000000)
10785 return FALSE;
35c08157 10786
1c8f6a4d
KLC
10787 insn = bfd_getb32 (contents + laddr);
10788 if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10789 {
10790 /* Relax to bgezal rt, label ; 17_PCREL
fbaf61ad 10791 or bltzal rt, label ; 17_PCREL. */
35c08157 10792
1c8f6a4d
KLC
10793 /* Convert to complimentary conditional call. */
10794 *insn_len = 0;
10795 insn = CONVERT_CONDITION_CALL (insn);
10796 bfd_putb32 (insn, contents + em_irel->r_offset);
10797
10798 em_irel->r_info =
10799 ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA);
10800
10801 /* Set resolved relocation. */
10802 cond_irel =
10803 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10804 R_NDS32_PTR_RESOLVED, irel->r_addend);
10805 if (cond_irel == irelend)
35c08157 10806 {
695344c0 10807 _bfd_error_handler (unrecognized_reloc_msg, abfd,
2dcf00ce 10808 "R_NDS32_LONGCALL6", (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10809 return FALSE;
10810 }
10811 cond_irel->r_addend = 1;
35c08157 10812
1c8f6a4d 10813 /* Clear relocations. */
35c08157 10814
1c8f6a4d
KLC
10815 irel->r_info =
10816 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
35c08157 10817
1c8f6a4d
KLC
10818 cond_irel =
10819 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10820 R_NDS32_17_PCREL_RELA, laddr);
10821 if (cond_irel != irelend)
10822 cond_irel->r_info =
10823 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
35c08157 10824
1c8f6a4d
KLC
10825 cond_irel =
10826 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10827 R_NDS32_INSN16, irel->r_addend);
10828 if (cond_irel != irelend)
10829 cond_irel->r_info =
10830 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
35c08157 10831
1c8f6a4d
KLC
10832 }
10833 else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
10834 {
10835 /* Relax to the following instruction sequence
10836 bltz rt, .L1 ; LONGCALL2/17_PCREL
10837 jal symbol ; 25_PCREL/PTR_RES
10838 .L1 */
10839 *insn_len = 4;
10840 /* Convert instruction. */
10841 insn = INSN_JAL;
10842 bfd_putb32 (insn, contents + em_irel->r_offset);
35c08157 10843
1c8f6a4d
KLC
10844 /* Convert relocations. */
10845 em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10846 R_NDS32_25_PCREL_RELA);
10847 irel->r_info =
10848 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5);
35c08157 10849
1c8f6a4d
KLC
10850 /* Set resolved relocation. */
10851 cond_irel =
10852 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10853 R_NDS32_PTR_RESOLVED, irel->r_addend);
10854 if (cond_irel == irelend)
10855 {
695344c0 10856 _bfd_error_handler (unrecognized_reloc_msg, abfd,
2dcf00ce 10857 "R_NDS32_LONGCALL6", (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10858 return FALSE;
10859 }
10860 cond_irel->r_addend = 1;
35c08157 10861
1c8f6a4d
KLC
10862 cond_irel =
10863 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10864 R_NDS32_INSN16, irel->r_addend);
10865 if (cond_irel != irelend)
10866 cond_irel->r_info =
10867 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10868 }
10869 return TRUE;
10870}
35c08157 10871
1c8f6a4d 10872/* Relax LONGJUMP4 relocation for nds32_elf_relax_section. */
35c08157 10873
1c8f6a4d
KLC
10874static bfd_boolean
10875nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10876 Elf_Internal_Rela *internal_relocs, int *insn_len,
10877 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10878 Elf_Internal_Shdr *symtab_hdr)
10879{
10880 /* The pattern for LONGJUMP4.
10881 sethi ta, hi20(symbol) ; LONGJUMP4/HI20
10882 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10883 jr ta ; PTR_RES/INSN16/EMPTY */
10884
10885 bfd_vma laddr;
10886 int seq_len; /* Original length of instruction sequence. */
10887 uint32_t insn;
10888 Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend;
1c8f6a4d 10889 bfd_signed_vma foff;
35c08157 10890
1c8f6a4d
KLC
10891 irelend = internal_relocs + sec->reloc_count;
10892 seq_len = GET_SEQ_LEN (irel->r_addend);
10893 laddr = irel->r_offset;
10894 *insn_len = seq_len;
35c08157 10895
1c8f6a4d
KLC
10896 /* Get the reloc for the address from which the register is
10897 being loaded. This reloc will tell us which function is
10898 actually being called. */
35c08157 10899
1c8f6a4d
KLC
10900 hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10901 R_NDS32_HI20_RELA, laddr);
35c08157 10902
1c8f6a4d
KLC
10903 if (hi_irel == irelend)
10904 {
695344c0 10905 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
2dcf00ce 10906 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10907 return FALSE;
10908 }
35c08157 10909
1c8f6a4d 10910 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 10911 foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr);
35c08157 10912
fbaf61ad
NC
10913 if (foff == 0
10914 || foff >= CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
10915 || foff < -CONSERVATIVE_24BIT_S1)
10916 return FALSE;
35c08157 10917
1c8f6a4d
KLC
10918 /* Convert it to "j label", it may be converted to j8 in the final
10919 pass of relaxation. Therefore, we do not consider this currently. */
10920 ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10921 R_NDS32_PTR_RESOLVED, irel->r_addend);
10922 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10923 R_NDS32_EMPTY, irel->r_addend);
35c08157 10924
1c8f6a4d
KLC
10925 if (ptr_irel == irelend || em_irel == irelend)
10926 {
695344c0 10927 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
2dcf00ce 10928 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
10929 return FALSE;
10930 }
35c08157 10931
1c8f6a4d
KLC
10932 em_irel->r_info =
10933 ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA);
10934 ptr_irel->r_addend = 1;
35c08157 10935
1c8f6a4d
KLC
10936 /* Write instruction. */
10937 insn = INSN_J;
10938 bfd_putb32 (insn, contents + em_irel->r_offset);
35c08157 10939
1c8f6a4d
KLC
10940 /* Clear relocations. */
10941 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
35c08157 10942
1c8f6a4d
KLC
10943 /* If there is function cse, HI20 can not remove now. */
10944 call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10945 R_NDS32_LONGJUMP4, laddr);
10946 if (call_irel == irelend)
10947 {
10948 *insn_len = 0;
10949 hi_irel->r_info =
10950 ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10951 }
35c08157 10952
1c8f6a4d
KLC
10953 return TRUE;
10954}
35c08157 10955
1c8f6a4d 10956/* Relax LONGJUMP5 relocation for nds32_elf_relax_section. */
35c08157 10957
1c8f6a4d
KLC
10958static bfd_boolean
10959nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10960 Elf_Internal_Rela *internal_relocs, int *insn_len,
10961 int *seq_len, bfd_byte *contents,
10962 Elf_Internal_Sym *isymbuf,
10963 Elf_Internal_Shdr *symtab_hdr)
10964{
10965 /* There are 2 variations for LONGJUMP5
10966 case 2-4; 1st insn convertible, 16-bit on.
10967 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
10968 j label ; 25_PCREL/INSN16
10969 $1:
10970
10971 case 4-4; 1st insn not convertible
10972 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
10973 j label ; 25_PCREL/INSN16
10974 .L1: */
10975
10976 bfd_vma laddr;
10977 Elf_Internal_Rela *cond_irel, *irelend;
1c8f6a4d
KLC
10978 unsigned int i;
10979 bfd_signed_vma foff;
10980 uint32_t insn, re_insn = 0;
10981 uint16_t insn16, re_insn16 = 0;
10982 unsigned long reloc;
35c08157 10983
1c8f6a4d
KLC
10984 enum elf_nds32_reloc_type checked_types[] =
10985 { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10986 R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
35c08157 10987
1c8f6a4d
KLC
10988 irelend = internal_relocs + sec->reloc_count;
10989 laddr = irel->r_offset;
35c08157 10990
1c8f6a4d
KLC
10991 /* Get the reloc for the address from which the register is
10992 being loaded. This reloc will tell us which function is
10993 actually being called. */
35c08157 10994
1c8f6a4d
KLC
10995 cond_irel =
10996 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10997 R_NDS32_25_PCREL_RELA, irel->r_addend);
10998 if (cond_irel == irelend)
10999 {
695344c0 11000 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP5",
2dcf00ce 11001 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
11002 return FALSE;
11003 }
35c08157 11004
1c8f6a4d 11005 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 11006 foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
35c08157 11007
fbaf61ad
NC
11008 if (foff == 0
11009 || foff < -CONSERVATIVE_16BIT_S1
1c8f6a4d
KLC
11010 || foff >= CONSERVATIVE_16BIT_S1)
11011 return FALSE;
35c08157 11012
1c8f6a4d
KLC
11013 /* Get the all corresponding instructions. */
11014 insn = bfd_getb32 (contents + laddr);
11015 /* Check instruction size. */
11016 if (insn & 0x80000000)
11017 {
11018 *seq_len = 0;
11019 insn16 = insn >> 16;
11020 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
11021 }
11022 else
11023 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
35c08157 11024
1c8f6a4d
KLC
11025 if (N32_OP6 (re_insn) == N32_OP6_BR1
11026 && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
11027 {
11028 /* beqs label ; 15_PCREL. */
11029 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
11030 reloc = R_NDS32_15_PCREL_RELA;
11031 }
11032 else if (N32_OP6 (re_insn) == N32_OP6_BR2
11033 && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
11034 {
11035 /* beqz label ; 17_PCREL. */
11036 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
11037 reloc = R_NDS32_17_PCREL_RELA;
11038 }
11039 else if ( N32_OP6 (re_insn) == N32_OP6_BR3
11040 && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1)
11041 {
11042 /* beqc label ; 9_PCREL. */
11043 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
11044 reloc = R_NDS32_WORD_9_PCREL_RELA;
11045 }
11046 else
11047 return FALSE;
35c08157 11048
1c8f6a4d
KLC
11049 /* Set all relocations. */
11050 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc);
35c08157 11051
1c8f6a4d
KLC
11052 /* Clean relocations. */
11053 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
fbaf61ad 11054 for (i = 0; i < ARRAY_SIZE (checked_types); i++)
1c8f6a4d
KLC
11055 {
11056 cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11057 checked_types[i], laddr);
11058 if (cond_irel != irelend)
11059 {
11060 if (*seq_len == 0
11061 && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
35c08157 11062 {
1c8f6a4d
KLC
11063 /* If the branch instruction is 2 byte, it cannot remove
11064 directly. Only convert it to nop16 and remove it after
11065 checking alignment issue. */
11066 insn16 = NDS32_NOP16;
11067 bfd_putb16 (insn16, contents + laddr);
11068 cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
35c08157
KLC
11069 }
11070 else
1c8f6a4d
KLC
11071 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11072 R_NDS32_NONE);
35c08157 11073 }
1c8f6a4d
KLC
11074 }
11075 *insn_len = 0;
35c08157 11076
1c8f6a4d
KLC
11077 return TRUE;
11078}
35c08157 11079
1c8f6a4d 11080/* Relax LONGJUMP6 relocation for nds32_elf_relax_section. */
35c08157 11081
1c8f6a4d
KLC
11082static bfd_boolean
11083nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11084 Elf_Internal_Rela *internal_relocs, int *insn_len,
11085 int *seq_len, bfd_byte *contents,
11086 Elf_Internal_Sym *isymbuf,
11087 Elf_Internal_Shdr *symtab_hdr)
11088{
11089 /* There are 5 variations for LONGJUMP6
11090 case : 2-4-4-4; 1st insn convertible, 16-bit on.
11091 bnes38 rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
11092 sethi ta, hi20(symbol) ; HI20/PTR
11093 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
11094 jr ta ; PTR_RES/INSN16/EMPTY
11095 .L1:
11096
11097 case : 4-4-4-4; 1st insn not convertible, 16-bit on.
11098 bne rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
11099 sethi ta, hi20(symbol) ; HI20/PTR
11100 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
11101 jr ta ; PTR_RES/INSN16/EMPTY
11102 .L1: */
11103
11104 enum elf_nds32_reloc_type checked_types[] =
11105 { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
11106 R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
11107
11108 int reloc_off = 0, cond_removed = 0;
11109 bfd_vma laddr;
11110 Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel;
1c8f6a4d
KLC
11111 unsigned int i;
11112 bfd_signed_vma foff;
11113 uint32_t insn, re_insn = 0;
11114 uint16_t insn16, re_insn16 = 0;
11115 unsigned long reloc;
35c08157 11116
1c8f6a4d
KLC
11117 irelend = internal_relocs + sec->reloc_count;
11118 laddr = irel->r_offset;
35c08157 11119
1c8f6a4d
KLC
11120 /* Get the reloc for the address from which the register is
11121 being loaded. This reloc will tell us which function is
11122 actually being called. */
11123 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11124 R_NDS32_EMPTY, irel->r_addend);
35c08157 11125
1c8f6a4d
KLC
11126 if (em_irel == irelend)
11127 {
695344c0 11128 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP6",
2dcf00ce 11129 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
11130 return FALSE;
11131 }
35c08157 11132
1c8f6a4d 11133 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 11134 foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr);
35c08157 11135
fbaf61ad
NC
11136 if (foff == 0
11137 || foff < -CONSERVATIVE_24BIT_S1
1c8f6a4d
KLC
11138 || foff >= CONSERVATIVE_24BIT_S1)
11139 return FALSE;
35c08157 11140
1c8f6a4d
KLC
11141 insn = bfd_getb32 (contents + laddr);
11142 /* Check instruction size. */
11143 if (insn & 0x80000000)
11144 {
11145 *seq_len = 0;
11146 insn16 = insn >> 16;
11147 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
11148 }
11149 else
11150 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
35c08157 11151
1c8f6a4d
KLC
11152 /* For simplicity of coding, we are going to modify the section
11153 contents, the section relocs, and the BFD symbol table. We
11154 must tell the rest of the code not to free up this
11155 information. It would be possible to instead create a table
11156 of changes which have to be made, as is done in coff-mips.c;
11157 that would be more work, but would require less memory when
11158 the linker is run. */
35c08157 11159
1c8f6a4d
KLC
11160 if (N32_OP6 (re_insn) == N32_OP6_BR1
11161 && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
11162 {
fbaf61ad 11163 /* beqs label ; 15_PCREL. */
1c8f6a4d
KLC
11164 bfd_putb32 (re_insn, contents + em_irel->r_offset);
11165 reloc = R_NDS32_15_PCREL_RELA;
11166 cond_removed = 1;
11167 }
11168 else if (N32_OP6 (re_insn) == N32_OP6_BR2
11169 && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
11170 {
fbaf61ad 11171 /* beqz label ; 17_PCREL. */
1c8f6a4d
KLC
11172 bfd_putb32 (re_insn, contents + em_irel->r_offset);
11173 reloc = R_NDS32_17_PCREL_RELA;
11174 cond_removed = 1;
11175 }
11176 else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
11177 && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
11178 {
11179 /* Relax to one of the following 2 variations
35c08157 11180
1c8f6a4d
KLC
11181 case 2-4; 1st insn convertible, 16-bit on.
11182 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
11183 j label ; 25_PCREL/INSN16
11184 $1:
35c08157 11185
1c8f6a4d
KLC
11186 case 4-4; 1st insn not convertible
11187 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
11188 j label ; 25_PCREL/INSN16
11189 .L1: */
35c08157 11190
1c8f6a4d
KLC
11191 /* Use j label as second instruction. */
11192 insn = INSN_J;
11193 reloc = R_NDS32_25_PCREL_RELA;
11194 bfd_putb32 (insn, contents + em_irel->r_offset);
11195 }
11196 else
11197 return FALSE;
35c08157 11198
1c8f6a4d
KLC
11199 /* Set all relocations. */
11200 em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc);
35c08157 11201
1c8f6a4d
KLC
11202 cond_irel =
11203 find_relocs_at_address_addr (irel, internal_relocs, irelend,
11204 R_NDS32_PTR_RESOLVED, em_irel->r_offset);
11205 cond_irel->r_addend = 1;
35c08157 11206
1c8f6a4d
KLC
11207 /* Use INSN16 of first branch instruction to distinguish if keeping
11208 INSN16 of final instruction or not. */
11209 insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11210 R_NDS32_INSN16, irel->r_offset);
11211 if (insn_irel == irelend)
11212 {
11213 /* Clean the final INSN16. */
11214 insn_irel =
11215 find_relocs_at_address_addr (irel, internal_relocs, irelend,
11216 R_NDS32_INSN16, em_irel->r_offset);
11217 insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11218 R_NDS32_NONE);
11219 }
11220
11221 if (cond_removed == 1)
11222 {
11223 *insn_len = 0;
11224
11225 /* Clear relocations. */
11226 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
35c08157 11227
fbaf61ad 11228 for (i = 0; i < ARRAY_SIZE (checked_types); i++)
1c8f6a4d
KLC
11229 {
11230 cond_irel =
11231 find_relocs_at_address_addr (irel, internal_relocs, irelend,
11232 checked_types[i], laddr);
11233 if (cond_irel != irelend)
35c08157 11234 {
1c8f6a4d
KLC
11235 if (*seq_len == 0
11236 && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
11237 {
11238 /* If the branch instruction is 2 byte, it cannot remove
11239 directly. Only convert it to nop16 and remove it after
11240 checking alignment issue. */
11241 insn16 = NDS32_NOP16;
11242 bfd_putb16 (insn16, contents + laddr);
11243 cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
11244 }
11245 else
11246 cond_irel->r_info =
11247 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
35c08157 11248 }
35c08157 11249 }
1c8f6a4d
KLC
11250 }
11251 else
11252 {
11253 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11254 R_NDS32_LONGJUMP5);
11255 }
35c08157 11256
1c8f6a4d
KLC
11257 return TRUE;
11258}
35c08157 11259
1c8f6a4d 11260/* Relax LONGJUMP7 relocation for nds32_elf_relax_section. */
35c08157 11261
1c8f6a4d
KLC
11262static bfd_boolean
11263nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11264 Elf_Internal_Rela *internal_relocs, int *insn_len,
11265 int *seq_len, bfd_byte *contents,
11266 Elf_Internal_Sym *isymbuf,
11267 Elf_Internal_Shdr *symtab_hdr)
11268{
11269 /* There are 2 variations for LONGJUMP5
11270 case 2-4; 1st insn convertible, 16-bit on.
11271 movi55 ta, imm11 ; LONGJUMP7/INSN16
11272 beq rt, ta, label ; 15_PCREL
11273
11274 case 4-4; 1st insn not convertible
11275 movi55 ta, imm11 ; LONGJUMP7/INSN16
11276 beq rt, ta, label ; 15_PCREL */
11277
11278 bfd_vma laddr;
11279 Elf_Internal_Rela *cond_irel, *irelend, *insn_irel;
1c8f6a4d
KLC
11280 bfd_signed_vma foff;
11281 uint32_t insn, re_insn = 0;
11282 uint16_t insn16;
11283 uint32_t imm11;
35c08157 11284
1c8f6a4d
KLC
11285 irelend = internal_relocs + sec->reloc_count;
11286 laddr = irel->r_offset;
35c08157 11287
1c8f6a4d
KLC
11288 /* Get the reloc for the address from which the register is
11289 being loaded. This reloc will tell us which function is
11290 actually being called. */
35c08157 11291
1c8f6a4d
KLC
11292 cond_irel =
11293 find_relocs_at_address_addr (irel, internal_relocs, irelend,
11294 R_NDS32_15_PCREL_RELA, irel->r_addend);
11295 if (cond_irel == irelend)
11296 {
695344c0 11297 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP7",
2dcf00ce 11298 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
11299 return FALSE;
11300 }
35c08157 11301
1c8f6a4d 11302 /* Get the value of the symbol referred to by the reloc. */
fbaf61ad 11303 foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
35c08157 11304
fbaf61ad
NC
11305 if (foff == 0
11306 || foff < -CONSERVATIVE_8BIT_S1
1c8f6a4d
KLC
11307 || foff >= CONSERVATIVE_8BIT_S1)
11308 return FALSE;
35c08157 11309
1c8f6a4d
KLC
11310 /* Get the first instruction for its size. */
11311 insn = bfd_getb32 (contents + laddr);
11312 if (insn & 0x80000000)
11313 {
11314 *seq_len = 0;
11315 /* Get the immediate from movi55. */
11316 imm11 = N16_IMM5S (insn >> 16);
11317 }
11318 else
11319 {
11320 /* Get the immediate from movi. */
11321 imm11 = N32_IMM20S (insn);
35c08157
KLC
11322 }
11323
1c8f6a4d
KLC
11324 /* Get the branch instruction. */
11325 insn = bfd_getb32 (contents + irel->r_addend);
11326 /* Convert instruction to BR3. */
11327 if ((insn >> 14) & 0x1)
11328 re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0);
11329 else
11330 re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0);
35c08157 11331
1c8f6a4d 11332 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
35c08157 11333
1c8f6a4d
KLC
11334 /* Set all relocations. */
11335 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11336 R_NDS32_WORD_9_PCREL_RELA);
11337
11338 /* Clean relocations. */
11339 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11340 insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11341 R_NDS32_INSN16, irel->r_offset);
11342 if (insn_irel != irelend)
11343 {
11344 if (*seq_len == 0)
35c08157 11345 {
1c8f6a4d
KLC
11346 /* If the first insntruction is 16bit, convert it to nop16. */
11347 insn16 = NDS32_NOP16;
11348 bfd_putb16 (insn16, contents + laddr);
11349 insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
35c08157 11350 }
1c8f6a4d
KLC
11351 else
11352 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11353 R_NDS32_NONE);
35c08157 11354 }
1c8f6a4d 11355 *insn_len = 0;
35c08157 11356
1c8f6a4d
KLC
11357 return TRUE;
11358}
35c08157 11359
fbaf61ad
NC
11360/* We figure out and reassign the best gp value in nds32_elf_final_sda_base
11361 for each relax round. But the gp may changed dramatically and then cause
11362 the truncated to fit errors for the the converted gp instructions.
11363 Therefore, we must reserve the minimum but safe enough size to prevent it. */
11364
11365static bfd_boolean
11366nds32_elf_relax_guard (bfd_vma *access_addr, bfd_vma local_sda, asection *sec,
11367 Elf_Internal_Rela *irel, bfd_boolean *again,
11368 bfd_boolean init,
11369 struct elf_nds32_link_hash_table *table,
11370 Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
11371
11372{
11373 int offset_to_gp;
11374 static bfd_boolean sec_pass = FALSE;
11375 static asection *first_sec = NULL, *sym_sec;
11376 /* Record the number of instructions which may be removed. */
11377 static int count = 0, record_count;
11378 Elf_Internal_Sym *isym;
11379 struct elf_link_hash_entry *h = NULL;
11380 int indx;
11381 unsigned long r_symndx;
11382 bfd *abfd = sec->owner;
11383 static bfd_vma record_sda = 0;
11384 int sda_offset = 0;
11385
11386 /* Force doing relaxation when hyper-relax is high. */
11387 if (table->hyper_relax == 2)
11388 return TRUE;
11389
11390 /* Do not relax the load/store patterns for the first
11391 relax round. */
11392 if (init)
11393 {
11394 if (!first_sec)
11395 first_sec = sec;
11396 else if (first_sec == sec)
11397 {
11398 record_count = count;
11399 count = 0;
11400 sec_pass = TRUE;
11401 }
11402
11403 if (!sec_pass)
11404 *again = TRUE;
11405
11406 return TRUE;
11407 }
11408
11409 /* Generally, _SDA_BASE_ is fixed or smaller. But the large
11410 DATA_SEGMENT_ALIGN size in the linker script may make it
11411 get even bigger. */
11412 if (record_sda == 0)
11413 record_sda = local_sda;
11414 else if (local_sda > record_sda)
11415 sda_offset = local_sda - record_sda;
11416
11417 /* Assume the instruction will be removed in the best case. */
11418 count++;
11419
11420 /* We record the offset to gp for each symbol, and then check
11421 if it is changed dramatically after relaxing.
11422 (global symbol): elf32_nds32_hash_entry (h)->offset_to_gp
11423 (local symbol) : elf32_nds32_local_gp_offset (abfd)[r_symndx]. */
11424 r_symndx = ELF32_R_SYM (irel->r_info);
11425 if (r_symndx >= symtab_hdr->sh_info)
11426 {
11427 /* Global symbols. */
11428 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
11429 h = elf_sym_hashes (abfd)[indx];
11430 sym_sec = h->root.u.def.section;
11431 if (NDS32_GUARD_SEC_P (sym_sec->flags)
11432 || bfd_is_abs_section (sym_sec))
11433 {
11434 /* Forbid doing relaxation when hyper-relax is low. */
11435 if (table->hyper_relax == 0)
11436 return FALSE;
11437
11438 offset_to_gp = *access_addr - local_sda;
11439 if (elf32_nds32_hash_entry (h)->offset_to_gp == 0)
11440 elf32_nds32_hash_entry (h)->offset_to_gp = offset_to_gp;
11441 else if (abs (elf32_nds32_hash_entry (h)->offset_to_gp)
11442 < abs (offset_to_gp) - sda_offset)
11443 {
11444 /* This may cause the error, so we reserve the
11445 safe enough size for relaxing. */
11446 if (*access_addr >= local_sda)
11447 *access_addr += (record_count * 4);
11448 else
11449 *access_addr -= (record_count * 4);
11450 }
11451 return sec_pass;
11452 }
11453 }
11454 else
11455 {
11456 /* Local symbols. */
11457 if (!elf32_nds32_allocate_local_sym_info (abfd))
11458 return FALSE;
11459 isym = isymbuf + r_symndx;
11460
11461 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
11462 if (NDS32_GUARD_SEC_P (sym_sec->flags))
11463 {
11464 /* Forbid doing relaxation when hyper-relax is low. */
11465 if (table->hyper_relax == 0)
11466 return FALSE;
11467
11468 offset_to_gp = *access_addr - local_sda;
11469 if (elf32_nds32_local_gp_offset (abfd)[r_symndx] == 0)
11470 elf32_nds32_local_gp_offset (abfd)[r_symndx] = offset_to_gp;
11471 else if (abs (elf32_nds32_local_gp_offset (abfd)[r_symndx])
11472 < abs (offset_to_gp) - sda_offset)
11473 {
11474 /* This may cause the error, so we reserve the
11475 safe enough size for relaxing. */
11476 if (*access_addr >= local_sda)
11477 *access_addr += (record_count * 4);
11478 else
11479 *access_addr -= (record_count * 4);
11480 }
11481 return sec_pass;
11482 }
11483 }
11484
11485 return TRUE;
11486}
11487
1c8f6a4d 11488#define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
35c08157 11489
1c8f6a4d 11490/* Relax LOADSTORE relocation for nds32_elf_relax_section. */
35c08157 11491
1c8f6a4d
KLC
11492static bfd_boolean
11493nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
11494 asection *sec, Elf_Internal_Rela *irel,
11495 Elf_Internal_Rela *internal_relocs, int *insn_len,
11496 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
fbaf61ad
NC
11497 Elf_Internal_Shdr *symtab_hdr, int load_store_relax,
11498 struct elf_nds32_link_hash_table *table)
1c8f6a4d 11499{
6cae483a
AM
11500 int eliminate_sethi = 0, range_type;
11501 unsigned int i;
1c8f6a4d
KLC
11502 bfd_vma local_sda, laddr;
11503 int seq_len; /* Original length of instruction sequence. */
11504 uint32_t insn;
11505 Elf_Internal_Rela *hi_irelfn = NULL, *irelend;
11506 bfd_vma access_addr = 0;
11507 bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */
fbaf61ad
NC
11508 struct elf_link_hash_entry *h = NULL;
11509 int indx;
1c8f6a4d
KLC
11510 enum elf_nds32_reloc_type checked_types[] =
11511 { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20,
11512 R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20,
11513 R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20,
11514 R_NDS32_TLS_LE_HI20
11515 };
35c08157 11516
1c8f6a4d
KLC
11517 irelend = internal_relocs + sec->reloc_count;
11518 seq_len = GET_SEQ_LEN (irel->r_addend);
11519 laddr = irel->r_offset;
11520 *insn_len = seq_len;
35c08157 11521
1c8f6a4d 11522 /* Get the high part relocation. */
6cae483a 11523 for (i = 0; i < ARRAY_SIZE (checked_types); i++)
1c8f6a4d
KLC
11524 {
11525 hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11526 checked_types[i], laddr);
11527 if (hi_irelfn != irelend)
11528 break;
11529 }
35c08157 11530
1c8f6a4d
KLC
11531 if (hi_irelfn == irelend)
11532 {
fbaf61ad
NC
11533 /* Not R_NDS32_HI20_RELA. */
11534 if (i != 0)
11535 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LOADSTORE",
11536 (uint64_t) irel->r_offset);
11537 return FALSE;
1c8f6a4d 11538 }
35c08157 11539
1c8f6a4d
KLC
11540 range_type = GET_LOADSTORE_RANGE (irel->r_addend);
11541 nds32_elf_final_sda_base (sec->output_section->owner,
11542 link_info, &local_sda, FALSE);
35c08157 11543
1c8f6a4d
KLC
11544 switch (ELF32_R_TYPE (hi_irelfn->r_info))
11545 {
11546 case R_NDS32_HI20_RELA:
11547 insn = bfd_getb32 (contents + laddr);
11548 access_addr =
11549 calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
11550
fbaf61ad 11551 if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info)
1c8f6a4d 11552 {
fbaf61ad
NC
11553 indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
11554 h = elf_sym_hashes (abfd)[indx];
11555 }
35c08157 11556
fbaf61ad
NC
11557 /* Try movi. */
11558 if (range_type == NDS32_LOADSTORE_IMM
11559 && access_addr < CONSERVATIVE_20BIT
11560 && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
11561 {
11562 eliminate_sethi = 1;
11563 break;
11564 }
1c8f6a4d 11565
fbaf61ad
NC
11566 if (h && strcmp (h->root.root.string, FP_BASE_NAME) == 0)
11567 {
11568 eliminate_sethi = 1;
11569 break;
1c8f6a4d 11570 }
fbaf61ad
NC
11571 else if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, hi_irelfn,
11572 NULL, FALSE, table, isymbuf, symtab_hdr))
11573 return FALSE;
1c8f6a4d
KLC
11574
11575 if (!load_store_relax)
11576 return FALSE;
11577
11578 /* Case for set gp register. */
11579 if (N32_RT5 (insn) == REG_GP)
fbaf61ad 11580 return FALSE;
1c8f6a4d
KLC
11581
11582 if (range_type == NDS32_LOADSTORE_FLOAT_S
6cef73f9 11583 || range_type == NDS32_LOADSTORE_FLOAT_D)
1c8f6a4d
KLC
11584 {
11585 range_l = sdata_range[0][0];
11586 range_h = sdata_range[0][1];
11587 }
11588 else
11589 {
11590 range_l = sdata_range[1][0];
11591 range_h = sdata_range[1][1];
11592 }
11593 break;
11594
1c8f6a4d
KLC
11595 default:
11596 return FALSE;
11597 }
11598
11599 /* Delete sethi instruction. */
11600 if (eliminate_sethi == 1
11601 || (local_sda <= access_addr && (access_addr - local_sda) < range_h)
11602 || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
11603 {
11604 hi_irelfn->r_info =
11605 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
11606 irel->r_info =
11607 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11608 *insn_len = 0;
fbaf61ad 11609 return TRUE;
1c8f6a4d 11610 }
fbaf61ad
NC
11611
11612 return FALSE;
1c8f6a4d
KLC
11613}
11614
11615/* Relax LO12 relocation for nds32_elf_relax_section. */
11616
11617static void
11618nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
11619 asection *sec, Elf_Internal_Rela *irel,
11620 Elf_Internal_Rela *internal_relocs, bfd_byte *contents,
fbaf61ad
NC
11621 Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr,
11622 struct elf_nds32_link_hash_table *table)
1c8f6a4d
KLC
11623{
11624 uint32_t insn;
11625 bfd_vma local_sda, laddr;
11626 unsigned long reloc;
11627 bfd_vma access_addr;
11628 bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */
11629 Elf_Internal_Rela *irelfn = NULL, *irelend;
11630 struct elf_link_hash_entry *h = NULL;
11631 int indx;
11632
11633 /* For SDA base relative relaxation. */
11634 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11635 &local_sda, FALSE);
11636
11637 irelend = internal_relocs + sec->reloc_count;
11638 laddr = irel->r_offset;
11639 insn = bfd_getb32 (contents + laddr);
11640
11641 if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI)
11642 return;
11643
11644 access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11645
11646 if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
11647 {
11648 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
11649 h = elf_sym_hashes (abfd)[indx];
11650 }
11651
fbaf61ad 11652 /* Try movi. */
1c8f6a4d
KLC
11653 if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT
11654 && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
11655 {
11656 reloc = R_NDS32_20_RELA;
11657 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11658 insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11659 bfd_putb32 (insn, contents + laddr);
11660 }
1c8f6a4d
KLC
11661 else
11662 {
fbaf61ad
NC
11663 if (h && strcmp (h->root.root.string, FP_BASE_NAME) == 0)
11664 {
11665 /* Fall through. */
11666 }
11667 else if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, irel, NULL,
11668 FALSE, table, isymbuf, symtab_hdr))
11669 return;
11670
1c8f6a4d
KLC
11671 range_l = sdata_range[1][0];
11672 range_h = sdata_range[1][1];
11673 switch (ELF32_R_TYPE (irel->r_info))
11674 {
11675 case R_NDS32_LO12S0_RELA:
11676 reloc = R_NDS32_SDA19S0_RELA;
11677 break;
11678 case R_NDS32_LO12S1_RELA:
11679 reloc = R_NDS32_SDA18S1_RELA;
11680 break;
11681 case R_NDS32_LO12S2_RELA:
11682 reloc = R_NDS32_SDA17S2_RELA;
11683 break;
11684 case R_NDS32_LO12S2_DP_RELA:
11685 range_l = sdata_range[0][0];
11686 range_h = sdata_range[0][1];
11687 reloc = R_NDS32_SDA12S2_DP_RELA;
11688 break;
11689 case R_NDS32_LO12S2_SP_RELA:
11690 range_l = sdata_range[0][0];
11691 range_h = sdata_range[0][1];
11692 reloc = R_NDS32_SDA12S2_SP_RELA;
11693 break;
11694 default:
11695 return;
11696 }
11697
11698 /* There are range_h and range_l because linker has to promise
11699 all sections move cross one page together. */
11700 if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
fbaf61ad
NC
11701 || (local_sda > access_addr && (local_sda - access_addr) <= range_l)
11702 || (h && strcmp (h->root.root.string, FP_BASE_NAME) == 0))
1c8f6a4d
KLC
11703 {
11704 if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP)
35c08157 11705 {
1c8f6a4d
KLC
11706 /* Maybe we should add R_NDS32_INSN16 reloc type here
11707 or manually do some optimization. sethi can't be
11708 eliminated when updating $gp so the relative ori
11709 needs to be preserved. */
11710 return;
35c08157 11711 }
1c8f6a4d
KLC
11712 if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info),
11713 &insn))
11714 return;
11715 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11716 bfd_putb32 (insn, contents + laddr);
11717
11718 irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11719 R_NDS32_INSN16);
11720 /* SDA17 must keep INSN16 for converting fp_as_gp. */
11721 if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA)
11722 irelfn->r_info =
11723 ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE);
11724
35c08157 11725 }
1c8f6a4d
KLC
11726 }
11727 return;
11728}
35c08157 11729
1c8f6a4d 11730/* Relax PTR relocation for nds32_elf_relax_section. */
35c08157 11731
1c8f6a4d
KLC
11732static bfd_boolean
11733nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11734 Elf_Internal_Rela *internal_relocs, int *insn_len,
11735 int *seq_len, bfd_byte *contents)
11736{
11737 Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel;
35c08157 11738
1c8f6a4d 11739 irelend = internal_relocs + sec->reloc_count;
35c08157 11740
1c8f6a4d
KLC
11741 re_irel =
11742 find_relocs_at_address_addr (irel, internal_relocs, irelend,
11743 R_NDS32_PTR_RESOLVED, irel->r_addend);
35c08157 11744
1c8f6a4d
KLC
11745 if (re_irel == irelend)
11746 {
695344c0 11747 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_PTR",
2dcf00ce 11748 (uint64_t) irel->r_offset);
1c8f6a4d
KLC
11749 return FALSE;
11750 }
35c08157 11751
1c8f6a4d
KLC
11752 if (re_irel->r_addend != 1)
11753 return FALSE;
35c08157 11754
1c8f6a4d
KLC
11755 /* Pointed target is relaxed and no longer needs this void *,
11756 change the type to NONE. */
11757 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
35c08157 11758
1c8f6a4d
KLC
11759 /* Find PTR_COUNT to decide remove it or not. If PTR_COUNT does
11760 not exist, it means only count 1 and remove it directly. */
11761 /* TODO: I hope we can obsolate R_NDS32_COUNT in the future. */
11762 count_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11763 R_NDS32_PTR_COUNT);
11764 ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11765 R_NDS32_PTR);
11766 if (count_irel != irelend)
11767 {
11768 if (--count_irel->r_addend > 0)
11769 return FALSE;
11770 }
11771
11772 if (ptr_irel != irelend)
11773 return FALSE;
11774
11775 /* If the PTR_COUNT is already 0, remove current instruction. */
11776 *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset);
11777 *insn_len = 0;
11778 return TRUE;
11779}
11780
fbaf61ad 11781/* Relax LWC relocation for nds32_elf_relax_section. */
1c8f6a4d
KLC
11782
11783static void
fbaf61ad
NC
11784nds32_elf_relax_flsi (struct bfd_link_info *link_info, bfd *abfd,
11785 asection *sec, Elf_Internal_Rela *irel,
11786 Elf_Internal_Rela *internal_relocs,
11787 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11788 Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
1c8f6a4d 11789{
fbaf61ad
NC
11790 /* Pattern:
11791 sethi ra, hi20(symbol) ; HI20/LOADSTORE
11792 ori ra, ra, lo12(symbol) ; LO12S0/PTR/PTR/.../INSN16
11793 flsi fsa, [ra + offset1] ; LSI/PTR_RESOLVED/INSN16
11794 flsi fsb, [ra + offset2] ; LSI/PTR_RESOLVED/INSN16
11795 ... */
11796
1c8f6a4d 11797 uint32_t insn;
1c8f6a4d 11798 bfd_vma local_sda, laddr;
fbaf61ad
NC
11799 unsigned long reloc;
11800 bfd_vma access_addr, flsi_offset;
11801 bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */
11802 Elf_Internal_Rela *irelend, *re_irel;
11803 unsigned int opcode;
1c8f6a4d
KLC
11804
11805 irelend = internal_relocs + sec->reloc_count;
11806 laddr = irel->r_offset;
11807 insn = bfd_getb32 (contents + laddr);
11808
fbaf61ad 11809 if ((insn & 0x80000000) || !is_sda_access_insn (insn))
1c8f6a4d
KLC
11810 return;
11811
fbaf61ad
NC
11812 /* Can not do relaxation for bi format. */
11813 if ((insn & 0x1000))
1c8f6a4d
KLC
11814 return;
11815
fbaf61ad
NC
11816 /* Only deal with flsi, fssi, fldi, fsdi, so far. */
11817 opcode = N32_OP6 (insn);
11818 if ((opcode == N32_OP6_LWC) || (opcode == N32_OP6_SWC))
11819 reloc = R_NDS32_SDA12S2_SP_RELA;
11820 else if ((opcode == N32_OP6_LDC) || (opcode == N32_OP6_SDC))
11821 reloc = R_NDS32_SDA12S2_DP_RELA;
1c8f6a4d
KLC
11822 else
11823 return;
11824
fbaf61ad
NC
11825 re_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11826 R_NDS32_PTR_RESOLVED);
11827 if (re_irel == irelend)
1c8f6a4d 11828 {
fbaf61ad
NC
11829 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LSI",
11830 (uint64_t) irel->r_offset);
11831 return;
1c8f6a4d 11832 }
1c8f6a4d 11833
fbaf61ad 11834 /* For SDA base relative relaxation. */
1c8f6a4d
KLC
11835 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11836 &local_sda, FALSE);
fbaf61ad
NC
11837 access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11838 flsi_offset = (insn & 0xfff) << 2;
11839 access_addr += flsi_offset;
11840 range_l = sdata_range[0][0];
11841 range_h = sdata_range[0][1];
1c8f6a4d 11842
fbaf61ad
NC
11843 if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
11844 || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
1c8f6a4d 11845 {
fbaf61ad
NC
11846 /* Turn flsi instruction into sda access format. */
11847 insn = (insn & 0x7ff07000) | (REG_GP << 15);
1c8f6a4d 11848
fbaf61ad
NC
11849 /* Add relocation type to flsi. */
11850 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11851 irel->r_addend += flsi_offset;
11852 bfd_putb32 (insn, contents + re_irel->r_offset);
1c8f6a4d 11853
fbaf61ad 11854 re_irel->r_addend |= 1;
1c8f6a4d
KLC
11855 *again = TRUE;
11856 }
1c8f6a4d
KLC
11857}
11858
11859static bfd_boolean
11860nds32_relax_adjust_label (bfd *abfd, asection *sec,
11861 Elf_Internal_Rela *internal_relocs,
11862 bfd_byte *contents,
11863 nds32_elf_blank_t **relax_blank_list,
11864 int optimize, int opt_size)
11865{
11866 /* This code block is used to adjust 4-byte alignment by relax a pair
11867 of instruction a time.
11868
11869 It recognizes three types of relocations.
de194d85 11870 1. R_NDS32_LABEL - a alignment.
1c8f6a4d
KLC
11871 2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11872 3. is_16bit_NOP () - remove a 16-bit instruction. */
11873
de194d85
YC
11874 /* TODO: It seems currently implementation only support 4-byte alignment.
11875 We should handle any-alignment. */
1c8f6a4d
KLC
11876
11877 Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel;
11878 Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL;
11879 Elf_Internal_Rela rel_temp;
11880 Elf_Internal_Rela *irelend;
11881 bfd_vma address;
11882 uint16_t insn16;
11883
11884 /* Checking for branch relaxation relies on the relocations to
11885 be sorted on 'r_offset'. This is not guaranteed so we must sort. */
11886 nds32_insertion_sort (internal_relocs, sec->reloc_count,
11887 sizeof (Elf_Internal_Rela), compar_reloc);
11888
11889 irelend = internal_relocs + sec->reloc_count;
11890
11891 /* Force R_NDS32_LABEL before R_NDS32_INSN16. */
11892 /* FIXME: Can we generate the right order in assembler?
11893 So we don't have to swapping them here. */
11894
11895 for (label_rel = internal_relocs, insn_rel = internal_relocs;
11896 label_rel < irelend; label_rel++)
11897 {
11898 if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL)
11899 continue;
11900
11901 /* Find the first reloc has the same offset with label_rel. */
11902 while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset)
11903 insn_rel++;
11904
11905 for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset;
11906 insn_rel++)
11907 /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11908 address. */
11909 if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16)
11910 break;
11911
11912 if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset
11913 && insn_rel < label_rel)
11914 {
11915 /* Swap the two reloc if the R_NDS32_INSN16 is
11916 before R_NDS32_LABEL. */
11917 memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela));
11918 memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela));
11919 memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela));
11920 }
11921 }
11922
11923 label_rel = NULL;
11924 insn_rel = NULL;
11925 /* If there were a sequence of R_NDS32_LABEL end up with .align 2
11926 or higher, remove other R_NDS32_LABEL with lower alignment.
11927 If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
11928 then the R_NDS32_LABEL sequence is broke. */
11929 for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++)
11930 {
11931 if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL)
11932 {
11933 if (label_rel == NULL)
11934 {
11935 if (tmp_rel->r_addend < 2)
11936 label_rel = tmp_rel;
11937 continue;
11938 }
11939 else if (tmp_rel->r_addend > 1)
11940 {
11941 /* Remove all LABEL relocation from label_rel to tmp_rel
11942 including relocations with same offset as tmp_rel. */
fbaf61ad 11943 for (tmp2_rel = label_rel; tmp2_rel < tmp_rel; tmp2_rel++)
1c8f6a4d 11944 {
fbaf61ad
NC
11945 if (tmp2_rel->r_offset == tmp_rel->r_offset)
11946 break;
11947
1c8f6a4d
KLC
11948 if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL
11949 && tmp2_rel->r_addend < 2)
11950 tmp2_rel->r_info =
11951 ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info),
11952 R_NDS32_NONE);
11953 }
11954 label_rel = NULL;
11955 }
11956 }
11957 else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel)
11958 {
11959 /* A new INSN16 which can be converted, so clear label_rel. */
11960 if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs,
11961 irelend, &insn16)
11962 || is_16bit_NOP (abfd, sec, tmp_rel))
11963 label_rel = NULL;
11964 }
11965 }
11966
11967 label_rel = NULL;
11968 insn_rel = NULL;
11969 /* Optimized for speed and nothing has not been relaxed.
11970 It's time to align labels.
11971 We may convert a 16-bit instruction right before a label to
11972 32-bit, in order to align the label if necessary
11973 all reloc entries has been sorted by r_offset. */
fbaf61ad
NC
11974 for (irel = internal_relocs;
11975 irel < irelend && irel->r_offset < sec->size; irel++)
1c8f6a4d
KLC
11976 {
11977 if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16
11978 && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL)
11979 continue;
11980
11981 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16)
11982 {
11983 /* A new INSN16 found, resize the old one. */
11984 if (is_convert_32_to_16
11985 (abfd, sec, irel, internal_relocs, irelend, &insn16)
11986 || is_16bit_NOP (abfd, sec, irel))
11987 {
11988 if (insn_rel)
11989 {
11990 /* Previous INSN16 reloc exists, reduce its
11991 size to 16-bit. */
11992 if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11993 irelend, &insn16))
35c08157 11994 {
1c8f6a4d
KLC
11995 nds32_elf_write_16 (abfd, contents, insn_rel,
11996 internal_relocs, irelend, insn16);
11997
11998 if (!insert_nds32_elf_blank_recalc_total
11999 (relax_blank_list, insn_rel->r_offset + 2, 2))
12000 return FALSE;
12001 }
12002 else if (is_16bit_NOP (abfd, sec, insn_rel))
12003 {
12004 if (!insert_nds32_elf_blank_recalc_total
12005 (relax_blank_list, insn_rel->r_offset, 2))
12006 return FALSE;
12007 }
12008 insn_rel->r_info =
12009 ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE);
12010 }
12011 /* Save the new one for later use. */
12012 insn_rel = irel;
12013 }
12014 else
12015 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
12016 R_NDS32_NONE);
12017 }
12018 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL)
12019 {
12020 /* Search for label. */
12021 int force_relax = 0;
12022
12023 /* Label on 16-bit instruction or optimization
12024 needless, just reset this reloc. */
12025 insn16 = bfd_getb16 (contents + irel->r_offset);
12026 if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000)))
12027 {
12028 irel->r_info =
12029 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
12030 continue;
12031 }
12032
12033 address =
12034 irel->r_offset - get_nds32_elf_blank_total (relax_blank_list,
12035 irel->r_offset, 1);
12036
12037 if (!insn_rel)
12038 {
12039 /* Check if there is case which can not be aligned. */
12040 if (irel->r_addend == 2 && address & 0x2)
12041 return FALSE;
12042 continue;
12043 }
12044
12045 /* Try to align this label. */
12046
12047 if ((irel->r_addend & 0x1f) < 2)
12048 {
12049 /* Check if there is a INSN16 at the same address.
12050 Label_rel always seats before insn_rel after
12051 our sort. */
12052
12053 /* Search for INSN16 at LABEL location. If INSN16 is at
12054 same location and this LABEL alignment is lower than 2,
12055 the INSN16 can be converted to 2-byte. */
12056 for (tmp_rel = irel;
12057 tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset;
12058 tmp_rel++)
12059 {
12060 if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16
12061 && (is_convert_32_to_16
12062 (abfd, sec, tmp_rel, internal_relocs,
12063 irelend, &insn16)
12064 || is_16bit_NOP (abfd, sec, tmp_rel)))
12065 {
12066 force_relax = 1;
12067 break;
12068 }
12069 }
12070 }
12071
12072 if (force_relax || irel->r_addend == 1 || address & 0x2)
12073 {
12074 /* Label not aligned. */
12075 /* Previous reloc exists, reduce its size to 16-bit. */
12076 if (is_convert_32_to_16 (abfd, sec, insn_rel,
12077 internal_relocs, irelend, &insn16))
12078 {
12079 nds32_elf_write_16 (abfd, contents, insn_rel,
12080 internal_relocs, irelend, insn16);
12081
12082 if (!insert_nds32_elf_blank_recalc_total
12083 (relax_blank_list, insn_rel->r_offset + 2, 2))
12084 return FALSE;
12085 }
12086 else if (is_16bit_NOP (abfd, sec, insn_rel))
12087 {
12088 if (!insert_nds32_elf_blank_recalc_total
12089 (relax_blank_list, insn_rel->r_offset, 2))
12090 return FALSE;
12091 }
12092
12093 }
12094 /* INSN16 reloc is used. */
12095 insn_rel = NULL;
12096 }
12097 }
12098
12099 address =
12100 sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0);
12101 if (insn_rel && (address & 0x2 || opt_size))
12102 {
12103 if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
12104 irelend, &insn16))
12105 {
12106 nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs,
12107 irelend, insn16);
12108 if (!insert_nds32_elf_blank_recalc_total
12109 (relax_blank_list, insn_rel->r_offset + 2, 2))
12110 return FALSE;
12111 insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
12112 R_NDS32_NONE);
12113 }
12114 else if (is_16bit_NOP (abfd, sec, insn_rel))
12115 {
12116 if (!insert_nds32_elf_blank_recalc_total
12117 (relax_blank_list, insn_rel->r_offset, 2))
12118 return FALSE;
12119 insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
12120 R_NDS32_NONE);
12121 }
12122 }
12123 insn_rel = NULL;
12124 return TRUE;
12125}
12126
1c8f6a4d
KLC
12127static bfd_boolean
12128nds32_elf_relax_section (bfd *abfd, asection *sec,
12129 struct bfd_link_info *link_info, bfd_boolean *again)
12130{
12131 nds32_elf_blank_t *relax_blank_list = NULL;
12132 Elf_Internal_Shdr *symtab_hdr;
12133 Elf_Internal_Rela *internal_relocs;
12134 Elf_Internal_Rela *irel;
12135 Elf_Internal_Rela *irelend;
12136 Elf_Internal_Sym *isymbuf = NULL;
12137 bfd_byte *contents = NULL;
12138 bfd_boolean result = TRUE;
12139 int optimize = 0;
12140 int opt_size = 0;
12141 uint32_t insn;
12142 uint16_t insn16;
12143
12144 /* Target dependnet option. */
12145 struct elf_nds32_link_hash_table *table;
12146 int load_store_relax;
1c8f6a4d
KLC
12147
12148 relax_blank_list = NULL;
12149
12150 *again = FALSE;
12151
12152 /* Nothing to do for
12153 * relocatable link or
12154 * non-relocatable section or
12155 * non-code section or
12156 * empty content or
12157 * no reloc entry. */
0e1862bb 12158 if (bfd_link_relocatable (link_info)
1c8f6a4d 12159 || (sec->flags & SEC_RELOC) == 0
cd28e7aa 12160 || (sec->flags & SEC_EXCLUDE) != 0
1c8f6a4d 12161 || (sec->flags & SEC_CODE) == 0
fbaf61ad
NC
12162 || sec->size == 0
12163 || sec->reloc_count == 0)
1c8f6a4d
KLC
12164 return TRUE;
12165
12166 /* 09.12.11 Workaround. */
12167 /* We have to adjust align for R_NDS32_LABEL if needed.
12168 The adjust approach only can fix 2-byte align once. */
12169 if (sec->alignment_power > 2)
12170 return TRUE;
12171
fbaf61ad
NC
12172 /* Do TLS model conversion once at first. */
12173 nds32_elf_unify_tls_model (abfd, sec, contents, link_info);
12174
1c8f6a4d
KLC
12175 /* The optimization type to do. */
12176
12177 table = nds32_elf_hash_table (link_info);
1c8f6a4d 12178
fbaf61ad
NC
12179 /* Save the first section for abs symbol relaxation.
12180 This is used for checking gp relaxation in the
12181 nds32_elf_relax_loadstore and nds32_elf_relax_lo12. */
12182 nds32_elf_relax_guard (NULL, 0, sec, NULL, again, TRUE,
12183 table, NULL, NULL);
12184
1c8f6a4d
KLC
12185 /* The begining of general relaxation. */
12186
12187 if (is_SDA_BASE_set == 0)
12188 {
12189 bfd_vma gp;
12190 is_SDA_BASE_set = 1;
12191 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
12192 &gp, FALSE);
12193 relax_range_measurement (abfd);
12194 }
12195
1c8f6a4d
KLC
12196 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12197 /* Relocations MUST be kept in memory, because relaxation adjust them. */
12198 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
12199 TRUE /* keep_memory */);
12200 if (internal_relocs == NULL)
12201 goto error_return;
12202
12203 irelend = internal_relocs + sec->reloc_count;
12204 irel = find_relocs_at_address (internal_relocs, internal_relocs,
12205 irelend, R_NDS32_RELAX_ENTRY);
12206
12207 if (irel == irelend)
12208 return TRUE;
12209
12210 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
12211 {
12212 if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG)
f9671640 12213 return TRUE;
1c8f6a4d
KLC
12214
12215 if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG)
12216 optimize = 1;
12217
12218 if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG)
12219 opt_size = 1;
12220 }
12221
12222 load_store_relax = table->load_store_relax;
12223
12224 /* Get symbol table and section content. */
0c4bd9d9 12225 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
1c8f6a4d
KLC
12226 || !nds32_get_local_syms (abfd, sec, &isymbuf))
12227 goto error_return;
12228
12229 /* Do relax loop only when finalize is not done.
12230 Take care of relaxable relocs except INSN16. */
12231 for (irel = internal_relocs; irel < irelend; irel++)
12232 {
12233 int seq_len; /* Original length of instruction sequence. */
12234 int insn_len = 0; /* Final length of instruction sequence. */
12235 bfd_boolean removed;
12236
12237 insn = 0;
12238 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
12239 && (irel->r_addend & 0x1f) >= 2)
12240 optimize = 1;
12241
12242 /* Relocation Types
12243 R_NDS32_LONGCALL1 53
12244 R_NDS32_LONGCALL2 54
12245 R_NDS32_LONGCALL3 55
12246 R_NDS32_LONGJUMP1 56
12247 R_NDS32_LONGJUMP2 57
12248 R_NDS32_LONGJUMP3 58
12249 R_NDS32_LOADSTORE 59 */
12250 if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1
12251 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE)
12252 seq_len = GET_SEQ_LEN (irel->r_addend);
12253
12254 /* Relocation Types
12255 R_NDS32_LONGCALL4 107
12256 R_NDS32_LONGCALL5 108
12257 R_NDS32_LONGCALL6 109
12258 R_NDS32_LONGJUMP4 110
12259 R_NDS32_LONGJUMP5 111
12260 R_NDS32_LONGJUMP6 112
12261 R_NDS32_LONGJUMP7 113 */
12262 else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4
12263 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7)
12264 seq_len = 4;
12265
12266 /* Relocation Types
12267 R_NDS32_LO12S0_RELA 30
12268 R_NDS32_LO12S1_RELA 29
12269 R_NDS32_LO12S2_RELA 28
12270 R_NDS32_LO12S2_SP_RELA 71
12271 R_NDS32_LO12S2_DP_RELA 70
12272 R_NDS32_GOT_LO12 46
12273 R_NDS32_GOTOFF_LO12 50
12274 R_NDS32_PLTREL_LO12 65
12275 R_NDS32_PLT_GOTREL_LO12 67
12276 R_NDS32_17IFC_PCREL_RELA 96
12277 R_NDS32_GOT_SUFF 193
12278 R_NDS32_GOTOFF_SUFF 194
12279 R_NDS32_PLT_GOT_SUFF 195
12280 R_NDS32_MULCALL_SUFF 196
12281 R_NDS32_PTR 197 */
12282 else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA
12283 && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA)
12284 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA
12285 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA
12286 || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12
12287 || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12
12288 || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12
12289 || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12
12290 || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12
12291 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF
12292 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR)
12293 || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12294 || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12
12295 || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD
fbaf61ad
NC
12296 || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS
12297 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LSI)
1c8f6a4d
KLC
12298 seq_len = 0;
12299 else
12300 continue;
12301
12302 insn_len = seq_len;
12303 removed = FALSE;
12304
12305 switch (ELF32_R_TYPE (irel->r_info))
12306 {
12307 case R_NDS32_LONGCALL1:
12308 removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs,
12309 &insn_len, contents, isymbuf,
12310 symtab_hdr);
12311 break;
12312 case R_NDS32_LONGCALL2:
12313 removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs,
12314 &insn_len, contents, isymbuf,
12315 symtab_hdr);
12316 break;
12317 case R_NDS32_LONGCALL3:
12318 removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs,
12319 &insn_len, contents, isymbuf,
12320 symtab_hdr);
12321 break;
12322 case R_NDS32_LONGJUMP1:
12323 removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs,
12324 &insn_len, contents, isymbuf,
12325 symtab_hdr);
12326 break;
12327 case R_NDS32_LONGJUMP2:
12328 removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs,
12329 &insn_len, contents, isymbuf,
12330 symtab_hdr);
12331 break;
12332 case R_NDS32_LONGJUMP3:
12333 removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs,
12334 &insn_len, contents, isymbuf,
12335 symtab_hdr);
12336 break;
12337 case R_NDS32_LONGCALL4:
12338 removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs,
12339 &insn_len, contents, isymbuf,
12340 symtab_hdr);
12341 break;
12342 case R_NDS32_LONGCALL5:
12343 removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs,
12344 &insn_len, contents, isymbuf,
12345 symtab_hdr);
12346 break;
12347 case R_NDS32_LONGCALL6:
12348 removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs,
12349 &insn_len, contents, isymbuf,
12350 symtab_hdr);
12351 break;
12352 case R_NDS32_LONGJUMP4:
12353 removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs,
12354 &insn_len, contents, isymbuf,
12355 symtab_hdr);
12356 break;
12357 case R_NDS32_LONGJUMP5:
12358 removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs,
12359 &insn_len, &seq_len, contents,
12360 isymbuf, symtab_hdr);
12361 break;
12362 case R_NDS32_LONGJUMP6:
12363 removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs,
12364 &insn_len, &seq_len, contents,
12365 isymbuf, symtab_hdr);
12366 break;
12367 case R_NDS32_LONGJUMP7:
12368 removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs,
12369 &insn_len, &seq_len, contents,
12370 isymbuf, symtab_hdr);
12371 break;
12372 case R_NDS32_LOADSTORE:
12373 removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel,
12374 internal_relocs, &insn_len,
12375 contents, isymbuf, symtab_hdr,
fbaf61ad 12376 load_store_relax, table);
1c8f6a4d
KLC
12377 break;
12378 case R_NDS32_LO12S0_RELA:
12379 case R_NDS32_LO12S1_RELA:
fbaf61ad 12380 case R_NDS32_LO12S2_RELA:
1c8f6a4d
KLC
12381 case R_NDS32_LO12S2_DP_RELA:
12382 case R_NDS32_LO12S2_SP_RELA:
1c8f6a4d
KLC
12383 /* Relax for low part. */
12384 nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs,
fbaf61ad 12385 contents, isymbuf, symtab_hdr, table);
1c8f6a4d
KLC
12386
12387 /* It is impossible to delete blank, so just continue. */
12388 continue;
fbaf61ad
NC
12389 case R_NDS32_PTR:
12390 removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs,
12391 &insn_len, &seq_len, contents);
12392 break;
12393 case R_NDS32_LSI:
12394 nds32_elf_relax_flsi (link_info, abfd, sec, irel, internal_relocs,
12395 contents, isymbuf, symtab_hdr, again);
12396 continue;
1c8f6a4d
KLC
12397 case R_NDS32_GOT_LO12:
12398 case R_NDS32_GOTOFF_LO12:
12399 case R_NDS32_PLTREL_LO12:
12400 case R_NDS32_PLT_GOTREL_LO12:
12401 case R_NDS32_GOTPC_LO12:
1c8f6a4d 12402 case R_NDS32_TLS_LE_LO12:
1c8f6a4d 12403 case R_NDS32_TLS_LE_ADD:
1c8f6a4d 12404 case R_NDS32_TLS_LE_LS:
1c8f6a4d 12405 case R_NDS32_PLT_GOT_SUFF:
1c8f6a4d 12406 case R_NDS32_GOT_SUFF:
1c8f6a4d 12407 case R_NDS32_GOTOFF_SUFF:
1c8f6a4d
KLC
12408 continue;
12409 default:
12410 continue;
1c8f6a4d 12411 }
fbaf61ad 12412
1c8f6a4d
KLC
12413 if (removed && seq_len - insn_len > 0)
12414 {
12415 if (!insert_nds32_elf_blank
12416 (&relax_blank_list, irel->r_offset + insn_len,
12417 seq_len - insn_len))
12418 goto error_return;
12419 *again = TRUE;
35c08157 12420 }
1c8f6a4d
KLC
12421 }
12422
12423 calc_nds32_blank_total (relax_blank_list);
12424
12425 if (table->relax_fp_as_gp)
12426 {
12427 if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs,
12428 irelend, isymbuf))
12429 goto error_return;
35c08157 12430
535b785f 12431 if (!*again)
35c08157 12432 {
1c8f6a4d
KLC
12433 if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs,
12434 irelend))
12435 goto error_return;
35c08157
KLC
12436 }
12437 }
1c8f6a4d 12438
535b785f 12439 if (!*again)
1c8f6a4d
KLC
12440 {
12441 if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents,
12442 &relax_blank_list, optimize, opt_size))
12443 goto error_return;
12444 }
12445
12446 /* It doesn't matter optimize_for_space_no_align anymore.
35c08157
KLC
12447 If object file is assembled with flag '-Os',
12448 the we don't adjust jump-destination on 4-byte boundary. */
12449
12450 if (relax_blank_list)
12451 {
12452 nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12453 relax_blank_list = NULL;
12454 }
12455
535b785f 12456 if (!*again)
35c08157
KLC
12457 {
12458 /* Closing the section, so we don't relax it anymore. */
12459 bfd_vma sec_size_align;
12460 Elf_Internal_Rela *tmp_rel;
12461
12462 /* Pad to alignment boundary. Only handle current section alignment. */
609332f1
NC
12463 sec_size_align = (sec->size + (~((-1U) << sec->alignment_power)))
12464 & ((-1U) << sec->alignment_power);
35c08157
KLC
12465 if ((sec_size_align - sec->size) & 0x2)
12466 {
12467 insn16 = NDS32_NOP16;
12468 bfd_putb16 (insn16, contents + sec->size);
12469 sec->size += 2;
12470 }
12471
12472 while (sec_size_align != sec->size)
12473 {
12474 insn = NDS32_NOP32;
12475 bfd_putb32 (insn, contents + sec->size);
12476 sec->size += 4;
12477 }
12478
1c8f6a4d
KLC
12479 tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs,
12480 irelend, R_NDS32_RELAX_ENTRY);
35c08157
KLC
12481 if (tmp_rel != irelend)
12482 tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
12483
12484 clean_nds32_elf_blank ();
12485 }
12486
dc1e8a47 12487 finish:
c9594989 12488 if (elf_section_data (sec)->relocs != internal_relocs)
35c08157
KLC
12489 free (internal_relocs);
12490
c9594989 12491 if (elf_section_data (sec)->this_hdr.contents != contents)
35c08157
KLC
12492 free (contents);
12493
c9594989 12494 if (symtab_hdr->contents != (bfd_byte *) isymbuf)
35c08157
KLC
12495 free (isymbuf);
12496
12497 return result;
12498
dc1e8a47 12499 error_return:
35c08157
KLC
12500 result = FALSE;
12501 goto finish;
12502}
12503
12504static struct bfd_elf_special_section const nds32_elf_special_sections[] =
12505{
12506 {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE},
12507 {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
12508 {NULL, 0, 0, 0, 0}
12509};
12510
bf577467
AM
12511static bfd_boolean
12512nds32_elf_section_flags (const Elf_Internal_Shdr *hdr)
12513{
12514 const char *name = hdr->bfd_section->name;
12515
12516 if (strncmp (name, ".sbss", 5) == 0
12517 || strncmp (name, ".sdata", 6) == 0)
12518 hdr->bfd_section->flags |= SEC_SMALL_DATA;
12519
12520 return TRUE;
12521}
12522
35c08157
KLC
12523static bfd_boolean
12524nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
12525 struct bfd_link_info *info,
12526 void *finfo ATTRIBUTE_UNUSED,
12527 bfd_boolean (*func) (void *, const char *,
12528 Elf_Internal_Sym *,
12529 asection *,
12530 struct elf_link_hash_entry *)
12531 ATTRIBUTE_UNUSED)
12532{
12533 FILE *sym_ld_script = NULL;
12534 struct elf_nds32_link_hash_table *table;
12535
12536 table = nds32_elf_hash_table (info);
12537 sym_ld_script = table->sym_ld_script;
12538
12539 if (check_start_export_sym)
12540 fprintf (sym_ld_script, "}\n");
12541
12542 return TRUE;
12543}
12544
12545static enum elf_reloc_type_class
12546nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
12547 const asection *rel_sec ATTRIBUTE_UNUSED,
12548 const Elf_Internal_Rela *rela)
12549{
12550 switch ((int) ELF32_R_TYPE (rela->r_info))
12551 {
12552 case R_NDS32_RELATIVE:
12553 return reloc_class_relative;
12554 case R_NDS32_JMP_SLOT:
12555 return reloc_class_plt;
12556 case R_NDS32_COPY:
12557 return reloc_class_copy;
12558 default:
12559 return reloc_class_normal;
12560 }
12561}
12562
12563/* Put target dependent option into info hash table. */
12564void
12565bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info,
12566 int relax_fp_as_gp,
12567 int eliminate_gc_relocs,
fbaf61ad
NC
12568 FILE * sym_ld_script,
12569 int hyper_relax,
12570 int tls_desc_trampoline,
12571 int load_store_relax)
35c08157
KLC
12572{
12573 struct elf_nds32_link_hash_table *table;
12574
12575 table = nds32_elf_hash_table (link_info);
12576 if (table == NULL)
12577 return;
12578
12579 table->relax_fp_as_gp = relax_fp_as_gp;
12580 table->eliminate_gc_relocs = eliminate_gc_relocs;
12581 table->sym_ld_script = sym_ld_script;
fbaf61ad
NC
12582 table->hyper_relax = hyper_relax;
12583 table->tls_desc_trampoline = tls_desc_trampoline;
35c08157 12584 table ->load_store_relax = load_store_relax;
35c08157
KLC
12585}
12586\f
fbaf61ad 12587
35c08157
KLC
12588/* These functions and data-structures are used for fp-as-gp
12589 optimization. */
12590
12591#define FAG_THRESHOLD 3 /* At least 3 gp-access. */
1c8f6a4d
KLC
12592/* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12593 the read-only section and read-write section. */
12594#define FAG_WINDOW (508 - 32)
35c08157
KLC
12595
12596/* An nds32_fag represent a gp-relative access.
12597 We find best fp-base by using a sliding window
12598 to find a base address which can cover most gp-access. */
12599struct nds32_fag
12600{
12601 struct nds32_fag *next; /* NULL-teminated linked list. */
12602 bfd_vma addr; /* The address of this fag. */
12603 Elf_Internal_Rela **relas; /* The relocations associated with this fag.
12604 It is used for applying FP7U2_FLAG. */
12605 int count; /* How many times this address is referred.
12606 There should be exactly `count' relocations
12607 in relas. */
12608 int relas_capcity; /* The buffer size of relas.
12609 We use an array instead of linked-list,
12610 and realloc is used to adjust buffer size. */
12611};
12612
12613static void
12614nds32_fag_init (struct nds32_fag *head)
12615{
12616 memset (head, 0, sizeof (struct nds32_fag));
12617}
12618
12619static void
12620nds32_fag_verify (struct nds32_fag *head)
12621{
12622 struct nds32_fag *iter;
12623 struct nds32_fag *prev;
12624
12625 prev = NULL;
12626 iter = head->next;
12627 while (iter)
12628 {
12629 if (prev && prev->addr >= iter->addr)
12630 puts ("Bug in fp-as-gp insertion.");
12631 prev = iter;
12632 iter = iter->next;
12633 }
12634}
12635
12636/* Insert a fag in ascending order.
12637 If a fag of the same address already exists,
12638 they are chained by relas array. */
12639
12640static void
12641nds32_fag_insert (struct nds32_fag *head, bfd_vma addr,
12642 Elf_Internal_Rela * rel)
12643{
12644 struct nds32_fag *iter;
12645 struct nds32_fag *new_fag;
12646 const int INIT_RELAS_CAP = 4;
12647
12648 for (iter = head;
12649 iter->next && iter->next->addr <= addr;
12650 iter = iter->next)
12651 /* Find somewhere to insert. */ ;
12652
12653 /* `iter' will be equal to `head' if the list is empty. */
12654 if (iter != head && iter->addr == addr)
12655 {
12656 /* The address exists in the list.
12657 Insert `rel' into relocation list, relas. */
12658
12659 /* Check whether relas is big enough. */
12660 if (iter->count >= iter->relas_capcity)
12661 {
12662 iter->relas_capcity *= 2;
12663 iter->relas = bfd_realloc
12664 (iter->relas, iter->relas_capcity * sizeof (void *));
12665 }
12666 iter->relas[iter->count++] = rel;
12667 return;
12668 }
12669
12670 /* This is a new address. Create a fag node for it. */
12671 new_fag = bfd_malloc (sizeof (struct nds32_fag));
12672 memset (new_fag, 0, sizeof (*new_fag));
12673 new_fag->addr = addr;
12674 new_fag->count = 1;
12675 new_fag->next = iter->next;
12676 new_fag->relas_capcity = INIT_RELAS_CAP;
12677 new_fag->relas = (Elf_Internal_Rela **)
12678 bfd_malloc (new_fag->relas_capcity * sizeof (void *));
12679 new_fag->relas[0] = rel;
12680 iter->next = new_fag;
12681
12682 nds32_fag_verify (head);
12683}
12684
12685static void
12686nds32_fag_free_list (struct nds32_fag *head)
12687{
12688 struct nds32_fag *iter;
12689
12690 iter = head->next;
12691 while (iter)
12692 {
12693 struct nds32_fag *tmp = iter;
12694 iter = iter->next;
12695 free (tmp->relas);
12696 tmp->relas = NULL;
12697 free (tmp);
12698 }
12699}
12700
35c08157
KLC
12701/* Find the best fp-base address.
12702 The relocation associated with that address is returned,
12703 so we can track the symbol instead of a fixed address.
12704
12705 When relaxation, the address of an datum may change,
12706 because a text section is shrinked, so the data section
1c8f6a4d 12707 moves forward. If the aligments of text and data section
35c08157
KLC
12708 are different, their distance may change too.
12709 Therefore, tracking a fixed address is not appriate. */
12710
12711static int
12712nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp)
12713{
12714 struct nds32_fag *base; /* First fag in the window. */
12715 struct nds32_fag *last; /* First fag outside the window. */
12716 int accu = 0; /* Usage accumulation. */
12717 struct nds32_fag *best; /* Best fag. */
12718 int baccu = 0; /* Best accumulation. */
12719
12720 /* Use first fag for initial, and find the last fag in the window.
12721
12722 In each iteration, we could simply subtract previous fag
12723 and accumulate following fags which are inside the window,
12724 untill we each the end. */
12725
1c8f6a4d
KLC
12726 if (head->next == NULL)
12727 {
12728 *bestpp = NULL;
12729 return 0;
12730 }
35c08157
KLC
12731
12732 /* Initialize base. */
12733 base = head->next;
12734 best = base;
12735 for (last = base;
12736 last && last->addr < base->addr + FAG_WINDOW;
12737 last = last->next)
12738 accu += last->count;
12739
12740 baccu = accu;
12741
12742 /* Record the best base in each iteration. */
12743 while (base->next)
1c8f6a4d
KLC
12744 {
12745 accu -= base->count;
12746 base = base->next;
12747 /* Account fags in window. */
12748 for (/* Nothing. */;
12749 last && last->addr < base->addr + FAG_WINDOW;
12750 last = last->next)
12751 accu += last->count;
12752
12753 /* A better fp-base? */
12754 if (accu > baccu)
12755 {
12756 best = base;
12757 baccu = accu;
12758 }
12759 }
35c08157
KLC
12760
12761 if (bestpp)
12762 *bestpp = best;
12763 return baccu;
12764}
12765
12766/* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12767 so we can convert it fo fp-relative access later.
12768 `best_fag' is the best fp-base. Only those inside the window
12769 of best_fag is applied the flag. */
12770
12771static bfd_boolean
12772nds32_fag_mark_relax (struct bfd_link_info *link_info,
fbaf61ad 12773 asection *sec, struct nds32_fag *best_fag,
35c08157
KLC
12774 Elf_Internal_Rela *internal_relocs,
12775 Elf_Internal_Rela *irelend)
12776{
12777 struct nds32_fag *ifag;
12778 bfd_vma best_fpbase, gp;
12779 bfd *output_bfd;
12780
fbaf61ad 12781 output_bfd = sec->output_section->owner;
35c08157
KLC
12782 nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
12783 best_fpbase = best_fag->addr;
12784
1c8f6a4d
KLC
12785 if (best_fpbase > gp + sdata_range[1][1]
12786 || best_fpbase < gp - sdata_range[1][0])
35c08157
KLC
12787 return FALSE;
12788
12789 /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12790 so we know they can be converted to lwi37.fp. */
12791 for (ifag = best_fag;
12792 ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next)
12793 {
12794 int i;
12795
12796 for (i = 0; i < ifag->count; i++)
12797 {
12798 Elf_Internal_Rela *insn16_rel;
12799 Elf_Internal_Rela *fag_rel;
12800
12801 fag_rel = ifag->relas[i];
12802
12803 /* Only if this is within the WINDOWS, FP7U2_FLAG
12804 is applied. */
12805
12806 insn16_rel = find_relocs_at_address
12807 (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12808
12809 if (insn16_rel != irelend)
12810 insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG;
12811 }
12812 }
12813 return TRUE;
12814}
12815
1c8f6a4d
KLC
12816/* Reset INSN16 to clean fp as gp. */
12817
12818static void
12819nds32_fag_unmark_relax (struct nds32_fag *fag,
12820 Elf_Internal_Rela *internal_relocs,
12821 Elf_Internal_Rela *irelend)
12822{
12823 struct nds32_fag *ifag;
12824 int i;
12825 Elf_Internal_Rela *insn16_rel;
12826 Elf_Internal_Rela *fag_rel;
12827
12828 for (ifag = fag; ifag; ifag = ifag->next)
12829 {
12830 for (i = 0; i < ifag->count; i++)
12831 {
12832 fag_rel = ifag->relas[i];
12833
12834 /* Restore the INSN16 relocation. */
12835 insn16_rel = find_relocs_at_address
12836 (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12837
12838 if (insn16_rel != irelend)
12839 insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG;
12840 }
12841 }
12842}
12843
35c08157
KLC
12844/* This is the main function of fp-as-gp optimization.
12845 It should be called by relax_section. */
12846
12847static bfd_boolean
12848nds32_relax_fp_as_gp (struct bfd_link_info *link_info,
12849 bfd *abfd, asection *sec,
12850 Elf_Internal_Rela *internal_relocs,
12851 Elf_Internal_Rela *irelend,
12852 Elf_Internal_Sym *isymbuf)
12853{
12854 Elf_Internal_Rela *begin_rel = NULL;
12855 Elf_Internal_Rela *irel;
12856 struct nds32_fag fag_head;
12857 Elf_Internal_Shdr *symtab_hdr;
12858 bfd_byte *contents;
1c8f6a4d 12859 bfd_boolean ifc_inside = FALSE;
35c08157
KLC
12860
12861 /* FIXME: Can we bfd_elf_link_read_relocs for the relocs? */
12862
12863 /* Per-function fp-base selection.
12864 1. Create a list for all the gp-relative access.
12865 2. Base on those gp-relative address,
12866 find a fp-base which can cover most access.
12867 3. Use the fp-base for fp-as-gp relaxation.
12868
12869 NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12870 we should
12871 1. delete the `la $fp, _FP_BASE_' instruction and
12872 2. not convert lwi.gp to lwi37.fp.
12873
12874 To delete the _FP_BASE_ instruction, we simply apply
12875 R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12876
12877 To suppress the conversion, we simply NOT to apply
12878 R_NDS32_INSN16_FP7U2_FLAG flag. */
12879
12880 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12881
0c4bd9d9 12882 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
35c08157
KLC
12883 || !nds32_get_local_syms (abfd, sec, &isymbuf))
12884 return FALSE;
12885
12886 /* Check whether it is worth for fp-as-gp optimization,
12887 i.e., at least 3 gp-load.
12888
12889 Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12890 apply this optimization. */
12891
12892 for (irel = internal_relocs; irel < irelend; irel++)
12893 {
12894 /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12895 One we enter the begin of the region, we track all the LW/ST
12896 instructions, so when we leave the region, we try to find
12897 the best fp-base address for those LW/ST instructions. */
12898
12899 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12900 && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12901 {
12902 /* Begin of the region. */
12903 if (begin_rel)
695344c0 12904 /* xgettext:c-format */
38f14ab8 12905 _bfd_error_handler (_("%pB: nested OMIT_FP in %pA"), abfd, sec);
35c08157
KLC
12906
12907 begin_rel = irel;
12908 nds32_fag_init (&fag_head);
1c8f6a4d 12909 ifc_inside = FALSE;
35c08157
KLC
12910 }
12911 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12912 && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12913 {
12914 int accu;
1c8f6a4d 12915 struct nds32_fag *best_fag, *tmp_fag;
35c08157
KLC
12916 int dist;
12917
12918 /* End of the region.
12919 Check whether it is worth to do fp-as-gp. */
12920
12921 if (begin_rel == NULL)
12922 {
695344c0 12923 /* xgettext:c-format */
38f14ab8
AM
12924 _bfd_error_handler (_("%pB: unmatched OMIT_FP in %pA"),
12925 abfd, sec);
35c08157
KLC
12926 continue;
12927 }
12928
12929 accu = nds32_fag_find_base (&fag_head, &best_fag);
12930
1c8f6a4d
KLC
12931 /* Clean FP7U2_FLAG because they may set ever. */
12932 tmp_fag = fag_head.next;
12933 nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend);
12934
35c08157
KLC
12935 /* Check if it is worth, and FP_BASE is near enough to SDA_BASE. */
12936 if (accu < FAG_THRESHOLD
fbaf61ad 12937 || !nds32_fag_mark_relax (link_info, sec, best_fag,
35c08157
KLC
12938 internal_relocs, irelend))
12939 {
12940 /* Not worth to do fp-as-gp. */
12941 begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12942 begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12943 irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12944 irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12945 nds32_fag_free_list (&fag_head);
12946 begin_rel = NULL;
12947 continue;
12948 }
12949
12950 /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
12951 so we use it to record the distance to the reloction of best
12952 fp-base. */
12953 dist = best_fag->relas[0] - begin_rel;
12954 BFD_ASSERT (dist > 0 && dist < 0xffffff);
12955 /* Use high 16 bits of addend to record the _FP_BASE_ matched
12956 relocation. And get the base value when relocating. */
1c8f6a4d 12957 begin_rel->r_addend &= (0x1 << 16) - 1;
35c08157
KLC
12958 begin_rel->r_addend |= dist << 16;
12959
12960 nds32_fag_free_list (&fag_head);
12961 begin_rel = NULL;
12962 }
12963
1c8f6a4d 12964 if (begin_rel == NULL || ifc_inside)
35c08157
KLC
12965 /* Skip if we are not in the region of fp-as-gp. */
12966 continue;
12967
12968 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA
12969 || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA)
12970 {
12971 bfd_vma addr;
12972 uint32_t insn;
12973
12974 /* A gp-relative access is found. Insert it to the fag-list. */
12975
12976 /* Rt is necessary an RT3, so it can be converted to lwi37.fp. */
12977 insn = bfd_getb32 (contents + irel->r_offset);
12978 if (!N32_IS_RT3 (insn))
12979 continue;
12980
12981 addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
12982 nds32_fag_insert (&fag_head, addr, irel);
12983 }
12984 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA)
12985 {
12986 begin_rel = NULL;
12987 }
1c8f6a4d
KLC
12988 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12989 || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
12990 {
12991 /* Suppress fp as gp when encounter ifc. */
12992 ifc_inside = TRUE;
12993 }
35c08157
KLC
12994 }
12995
12996 return TRUE;
12997}
12998
12999/* Remove unused `la $fp, _FD_BASE_' instruction. */
13000
13001static bfd_boolean
13002nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec,
13003 Elf_Internal_Rela *internal_relocs,
13004 Elf_Internal_Rela *irelend)
13005{
13006 Elf_Internal_Rela *irel;
13007 Elf_Internal_Shdr *symtab_hdr;
13008 bfd_byte *contents = NULL;
13009 nds32_elf_blank_t *relax_blank_list = NULL;
13010 bfd_boolean result = TRUE;
13011 bfd_boolean unused_region = FALSE;
13012
13013 /*
fbaf61ad
NC
13014 NOTE: Disable fp-as-gp if we encounter ifcall relocations:
13015 R_NDS32_17IFC_PCREL_RELA
13016 R_NDS32_10IFCU_PCREL_RELA. */
35c08157
KLC
13017
13018 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
0c4bd9d9 13019 nds32_get_section_contents (abfd, sec, &contents, TRUE);
35c08157
KLC
13020
13021 for (irel = internal_relocs; irel < irelend; irel++)
13022 {
13023 /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
13024 we marked to in previous pass.
13025 DO NOT scan relocations again, since we've alreadly decided it
13026 and set the flag. */
13027 const char *syname;
13028 int syndx;
13029 uint32_t insn;
13030
13031 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
13032 && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
13033 unused_region = TRUE;
13034 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
13035 && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
13036 unused_region = FALSE;
13037
13038 /* We're not in the region. */
13039 if (!unused_region)
13040 continue;
13041
13042 /* _FP_BASE_ must be a GLOBAL symbol. */
13043 syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
13044 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
13045 continue;
13046
13047 /* The symbol name must be _FP_BASE_. */
13048 syname = elf_sym_hashes (abfd)[syndx]->root.root.string;
13049 if (strcmp (syname, FP_BASE_NAME) != 0)
13050 continue;
13051
13052 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA)
13053 {
13054 /* addi.gp $fp, -256 */
13055 insn = bfd_getb32 (contents + irel->r_offset);
13056 if (insn != INSN_ADDIGP_TO_FP)
13057 continue;
13058 }
13059 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA)
13060 {
13061 /* addi $fp, $gp, -256 */
13062 insn = bfd_getb32 (contents + irel->r_offset);
13063 if (insn != INSN_ADDI_GP_TO_FP)
13064 continue;
13065 }
13066 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
13067 {
13068 /* movi $fp, FP_BASE */
13069 insn = bfd_getb32 (contents + irel->r_offset);
13070 if (insn != INSN_MOVI_TO_FP)
13071 continue;
13072 }
13073 else
13074 continue;
13075
13076 /* We got here because a FP_BASE instruction is found. */
13077 if (!insert_nds32_elf_blank_recalc_total
13078 (&relax_blank_list, irel->r_offset, 4))
13079 goto error_return;
13080 }
13081
dc1e8a47 13082 finish:
35c08157
KLC
13083 if (relax_blank_list)
13084 {
13085 nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
13086 relax_blank_list = NULL;
13087 }
13088 return result;
13089
dc1e8a47 13090 error_return:
35c08157
KLC
13091 result = FALSE;
13092 goto finish;
13093}
1c8f6a4d
KLC
13094
13095/* This is a version of bfd_generic_get_relocated_section_contents.
13096 We need this variety because relaxation will modify the dwarf
13097 infomation. When there is undefined symbol reference error mesage,
13098 linker need to dump line number where the symbol be used. However
13099 the address is be relaxed, it can not get the original dwarf contents.
13100 The variety only modify function call for reading in the section. */
13101
13102static bfd_byte *
13103nds32_elf_get_relocated_section_contents (bfd *abfd,
13104 struct bfd_link_info *link_info,
13105 struct bfd_link_order *link_order,
13106 bfd_byte *data,
13107 bfd_boolean relocatable,
13108 asymbol **symbols)
13109{
13110 bfd *input_bfd = link_order->u.indirect.section->owner;
13111 asection *input_section = link_order->u.indirect.section;
13112 long reloc_size;
13113 arelent **reloc_vector;
13114 long reloc_count;
13115
13116 reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13117 if (reloc_size < 0)
13118 return NULL;
13119
13120 /* Read in the section. */
0c4bd9d9 13121 if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE))
1c8f6a4d
KLC
13122 return NULL;
13123
13124 if (reloc_size == 0)
13125 return data;
13126
13127 reloc_vector = (arelent **) bfd_malloc (reloc_size);
13128 if (reloc_vector == NULL)
13129 return NULL;
13130
13131 reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
13132 reloc_vector, symbols);
13133 if (reloc_count < 0)
13134 goto error_return;
13135
13136 if (reloc_count > 0)
13137 {
13138 arelent **parent;
13139 for (parent = reloc_vector; *parent != NULL; parent++)
13140 {
13141 char *error_message = NULL;
13142 asymbol *symbol;
13143 bfd_reloc_status_type r;
13144
13145 symbol = *(*parent)->sym_ptr_ptr;
13146 if (symbol->section && discarded_section (symbol->section))
13147 {
0930cb30 13148 bfd_vma off;
1c8f6a4d
KLC
13149 static reloc_howto_type none_howto
13150 = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
13151 "unused", FALSE, 0, 0, FALSE);
13152
bb294208
AM
13153 off = (*parent)->address * OCTETS_PER_BYTE (input_bfd,
13154 input_section);
0930cb30
AM
13155 _bfd_clear_contents ((*parent)->howto, input_bfd,
13156 input_section, data, off);
1c8f6a4d
KLC
13157 (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
13158 (*parent)->addend = 0;
13159 (*parent)->howto = &none_howto;
13160 r = bfd_reloc_ok;
13161 }
13162 else
13163 r = bfd_perform_relocation (input_bfd, *parent, data,
13164 input_section,
13165 relocatable ? abfd : NULL,
13166 &error_message);
13167
13168 if (relocatable)
13169 {
13170 asection *os = input_section->output_section;
13171
13172 /* A partial link, so keep the relocs. */
13173 os->orelocation[os->reloc_count] = *parent;
13174 os->reloc_count++;
13175 }
13176
13177 if (r != bfd_reloc_ok)
13178 {
13179 switch (r)
13180 {
13181 case bfd_reloc_undefined:
1a72702b
AM
13182 (*link_info->callbacks->undefined_symbol)
13183 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13184 input_bfd, input_section, (*parent)->address, TRUE);
1c8f6a4d
KLC
13185 break;
13186 case bfd_reloc_dangerous:
13187 BFD_ASSERT (error_message != NULL);
1a72702b
AM
13188 (*link_info->callbacks->reloc_dangerous)
13189 (link_info, error_message,
13190 input_bfd, input_section, (*parent)->address);
1c8f6a4d
KLC
13191 break;
13192 case bfd_reloc_overflow:
1a72702b
AM
13193 (*link_info->callbacks->reloc_overflow)
13194 (link_info, NULL,
13195 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13196 (*parent)->howto->name, (*parent)->addend,
13197 input_bfd, input_section, (*parent)->address);
1c8f6a4d
KLC
13198 break;
13199 case bfd_reloc_outofrange:
13200 /* PR ld/13730:
13201 This error can result when processing some partially
13202 complete binaries. Do not abort, but issue an error
13203 message instead. */
13204 link_info->callbacks->einfo
695344c0 13205 /* xgettext:c-format */
c1c8c1ef 13206 (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
1c8f6a4d
KLC
13207 abfd, input_section, * parent);
13208 goto error_return;
13209
13210 default:
13211 abort ();
13212 break;
13213 }
13214 }
13215 }
13216 }
13217
13218 free (reloc_vector);
13219 return data;
13220
dc1e8a47 13221 error_return:
1c8f6a4d
KLC
13222 free (reloc_vector);
13223 return NULL;
13224}
fbaf61ad
NC
13225
13226/* Check target symbol. */
13227
13228static bfd_boolean
13229nds32_elf_is_target_special_symbol (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
13230{
13231 if (!sym || !sym->name || sym->name[0] != '$')
13232 return FALSE;
13233 return TRUE;
13234}
13235
13236/* nds32 find maybe function sym. Ignore target special symbol
13237 first, and then go the general function. */
13238
13239static bfd_size_type
13240nds32_elf_maybe_function_sym (const asymbol *sym, asection *sec,
13241 bfd_vma *code_off)
13242{
13243 if (nds32_elf_is_target_special_symbol (NULL, (asymbol *) sym))
13244 return 0;
13245
13246 return _bfd_elf_maybe_function_sym (sym, sec, code_off);
13247}
35c08157 13248\f
35c08157 13249
fbaf61ad
NC
13250/* Do TLS model conversion. */
13251
13252typedef struct relax_group_list_t
13253{
13254 Elf_Internal_Rela *relo;
13255 struct relax_group_list_t *next;
13256 struct relax_group_list_t *next_sibling;
13257 int id;
13258} relax_group_list_t;
13259
13260int
13261list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem);
13262
13263int
13264list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem);
13265
13266void
13267dump_chain (relax_group_list_t *pHead);
13268
13269int
13270list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem)
13271{
13272 relax_group_list_t *pNext = pHead;
13273
13274 /* Find place. */
13275 while (pNext->next)
13276 {
13277 if (pNext->next->id > (int) pElem->r_addend)
13278 break;
13279
13280 pNext = pNext->next;
13281 }
13282
13283 /* Insert node. */
13284 relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t));
13285 if (!pNew)
13286 return FALSE;
13287
13288 relax_group_list_t *tmp = pNext->next;
13289 pNext->next = pNew;
13290
13291 pNew->id = pElem->r_addend;
13292 pNew->relo = pElem;
13293 pNew->next = tmp;
13294 pNew->next_sibling = NULL;
13295
13296 return TRUE;
13297}
13298
13299int
13300list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem)
13301{
13302 relax_group_list_t *pNext = pNode;
13303
13304 /* Find place. */
13305 while (pNext->next_sibling)
13306 {
13307 pNext = pNext->next_sibling;
13308 }
13309
13310 /* Insert node. */
13311 relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t));
13312 if (!pNew)
13313 return FALSE;
13314
13315 relax_group_list_t *tmp = pNext->next_sibling;
13316 pNext->next_sibling = pNew;
13317
13318 pNew->id = -1;
13319 pNew->relo = pElem;
13320 pNew->next = NULL;
13321 pNew->next_sibling = tmp;
13322
13323 return TRUE;
13324}
13325
13326void
13327dump_chain (relax_group_list_t *pHead)
13328{
13329 relax_group_list_t *pNext = pHead->next;
13330 while (pNext)
13331 {
13332 printf("group %d @ 0x%08x", pNext->id, (unsigned)pNext->relo->r_offset);
13333 relax_group_list_t *pNextSib = pNext->next_sibling;
13334 while (pNextSib)
13335 {
13336 printf(", %d", (unsigned) ELF32_R_TYPE (pNextSib->relo->r_info));
13337 pNextSib = pNextSib->next_sibling;
13338 }
13339 pNext = pNext->next;
13340 printf("\n");
13341 }
13342}
13343
13344/* Check R_NDS32_RELAX_GROUP of each section.
13345 There might be multiple sections in one object file. */
13346
13347int
13348elf32_nds32_check_relax_group (bfd *abfd, asection *asec)
13349{
13350 elf32_nds32_relax_group_t *relax_group_ptr =
13351 elf32_nds32_relax_group_ptr (abfd);
13352
13353 int min_id = relax_group_ptr->min_id;
13354 int max_id = relax_group_ptr->max_id;
13355
13356 Elf_Internal_Rela *rel;
13357 Elf_Internal_Rela *relend;
13358 Elf_Internal_Rela *relocs;
13359 enum elf_nds32_reloc_type rtype;
13360
13361 do
13362 {
13363 /* Relocations MUST be kept in memory, because relaxation adjust them. */
13364 relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL,
13365 TRUE /* keep_memory */);
13366 if (relocs == NULL)
13367 break;
13368
13369 /* Check R_NDS32_RELAX_GROUP. */
13370 relend = relocs + asec->reloc_count;
13371 for (rel = relocs; rel < relend; rel++)
13372 {
13373 int id;
13374 rtype = ELF32_R_TYPE (rel->r_info);
13375 if (rtype != R_NDS32_RELAX_GROUP)
13376 continue;
13377
13378 id = rel->r_addend;
13379 if (id < min_id)
13380 min_id = id;
13381 else if (id > max_id)
13382 max_id = id;
13383 }
13384 }
13385 while (FALSE);
13386
c9594989 13387 if (elf_section_data (asec)->relocs != relocs)
fbaf61ad
NC
13388 free (relocs);
13389
13390 if ((min_id != relax_group_ptr->min_id)
13391 || (max_id != relax_group_ptr->max_id))
13392 {
13393 relax_group_ptr->count = max_id - min_id + 1;
13394 BFD_ASSERT(min_id <= relax_group_ptr->min_id);
13395 relax_group_ptr->min_id = min_id;
13396 BFD_ASSERT(max_id >= relax_group_ptr->max_id);
13397 relax_group_ptr->max_id = max_id;
13398 }
13399
13400 return relax_group_ptr->count;
13401}
13402
13403/* Reorder RELAX_GROUP ID when command line option '-r' is applied. */
13404struct section_id_list_t *relax_group_section_id_list = NULL;
13405
13406struct section_id_list_t *
13407elf32_nds32_lookup_section_id (int id, struct section_id_list_t **lst_ptr)
13408{
13409 struct section_id_list_t *result = NULL;
13410 struct section_id_list_t *lst = *lst_ptr;
13411
13412 if (NULL == lst)
13413 {
13414 result = (struct section_id_list_t *) calloc
13415 (1, sizeof (struct section_id_list_t));
13416 BFD_ASSERT (result); /* Feed me. */
13417 result->id = id;
13418 *lst_ptr = result;
13419 }
13420 else
13421 {
13422 struct section_id_list_t *cur = lst;
13423 struct section_id_list_t *prv = NULL;
13424 struct section_id_list_t *sec = NULL;
13425
13426 while (cur)
13427 {
13428 if (cur->id < id)
13429 {
13430 prv = cur;
13431 cur = cur->next;
13432 continue;
13433 }
13434
13435 if (cur->id > id)
13436 {
13437 cur = NULL; /* To insert after prv. */
13438 sec = cur; /* In case prv == NULL. */
13439 }
13440
13441 break;
13442 }
13443
13444 if (NULL == cur)
13445 {
13446 /* Insert after prv. */
13447 result = (struct section_id_list_t *) calloc
13448 (1, sizeof (struct section_id_list_t));
13449 BFD_ASSERT (result); /* Feed me. */
13450 result->id = id;
13451 if (NULL != prv)
13452 {
13453 result->next = prv->next;
13454 prv->next = result;
13455 }
13456 else
13457 {
13458 *lst_ptr = result;
13459 result->next = sec;
13460 }
13461 }
13462 }
13463
13464 return result;
13465}
13466
13467int
13468elf32_nds32_unify_relax_group (bfd *abfd, asection *asec)
13469{
13470 static int next_relax_group_bias = 0;
13471
13472 elf32_nds32_relax_group_t *relax_group_ptr =
13473 elf32_nds32_relax_group_ptr (abfd);
13474
13475 bfd_boolean result = TRUE;
13476 Elf_Internal_Rela *rel;
13477 Elf_Internal_Rela *relend;
13478 Elf_Internal_Rela *relocs = NULL;
13479 enum elf_nds32_reloc_type rtype;
13480 struct section_id_list_t *node = NULL;
13481 int count = 0;
13482
13483 do
13484 {
13485 if (0 == relax_group_ptr->count)
13486 break;
13487
13488 /* Check if this section has been handled. */
13489 node = elf32_nds32_lookup_section_id (asec->id, &relax_group_section_id_list);
13490 if (NULL == node)
13491 break; /* Hit, the section id has handled. */
13492
13493 /* Relocations MUST be kept in memory, because relaxation adjust them. */
13494 relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL,
13495 TRUE /* keep_memory */);
13496 if (relocs == NULL)
13497 {
13498 BFD_ASSERT (0); /* feed me */
13499 break;
13500 }
13501
13502 /* Allocate group id bias for this bfd! */
13503 if (0 == relax_group_ptr->init)
13504 {
13505 relax_group_ptr->bias = next_relax_group_bias;
13506 next_relax_group_bias += relax_group_ptr->count;
13507 relax_group_ptr->init = 1;
13508 }
13509
13510 /* Reorder relax group groups. */
13511 relend = relocs + asec->reloc_count;
13512 for (rel = relocs; rel < relend; rel++)
13513 {
13514 rtype = ELF32_R_TYPE(rel->r_info);
13515 if (rtype != R_NDS32_RELAX_GROUP)
13516 continue;
13517
13518 /* Change it. */
13519 rel->r_addend += relax_group_ptr->bias;
13520 /* Debugging count. */
13521 count++;
13522 }
13523 }
13524 while (FALSE);
13525
c9594989 13526 if (elf_section_data (asec)->relocs != relocs)
fbaf61ad
NC
13527 free (relocs);
13528
13529 return result;
13530}
13531
13532int
13533nds32_elf_unify_tls_model (bfd *inbfd, asection *insec, bfd_byte *incontents,
13534 struct bfd_link_info *lnkinfo)
13535{
13536 bfd_boolean result = TRUE;
13537 Elf_Internal_Rela *irel;
13538 Elf_Internal_Rela *irelend;
13539 Elf_Internal_Rela *internal_relocs;
13540 unsigned long r_symndx;
13541 enum elf_nds32_reloc_type r_type;
13542
13543 Elf_Internal_Sym *local_syms = NULL;
13544 bfd_byte *contents = NULL;
13545
13546 relax_group_list_t chain = { .id = -1, .next = NULL, .next_sibling = NULL };
13547
13548 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (inbfd)->symtab_hdr;
13549 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
13550 sym_hashes = elf_sym_hashes (inbfd);
13551 sym_hashes_end =
13552 sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
13553 if (!elf_bad_symtab (inbfd))
13554 sym_hashes_end -= symtab_hdr->sh_info;
13555
13556 /* Reorder RELAX_GROUP when command line option '-r' is applied. */
13557 if (bfd_link_relocatable (lnkinfo))
13558 {
13559 elf32_nds32_unify_relax_group (inbfd, insec);
13560 return result;
13561 }
13562
13563 /* Relocations MUST be kept in memory, because relaxation adjust them. */
13564 internal_relocs = _bfd_elf_link_read_relocs (inbfd, insec, NULL, NULL,
13565 TRUE /* keep_memory */);
13566 if (internal_relocs == NULL)
13567 goto error_return;
13568
13569 irelend = internal_relocs + insec->reloc_count;
13570 irel = find_relocs_at_address (internal_relocs, internal_relocs,
13571 irelend, R_NDS32_RELAX_ENTRY);
13572 if (irel == irelend)
13573 goto finish;
13574
13575 /* Chain/remove groups. */
13576 for (irel = internal_relocs; irel < irelend; irel++)
13577 {
13578 r_symndx = ELF32_R_SYM (irel->r_info);
13579 r_type = ELF32_R_TYPE (irel->r_info);
13580 if (r_type != R_NDS32_RELAX_GROUP)
13581 continue;
13582
13583 /* Remove it. */
13584 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_NONE);
13585 /* Chain it now. */
13586 if (!list_insert (&chain, irel))
13587 goto error_return;
13588 }
13589
13590 /* Collect group relocations. */
13591 /* Presume relocations are sorted. */
13592 relax_group_list_t *pNext = chain.next;
13593 while (pNext)
13594 {
13595 for (irel = internal_relocs; irel < irelend; irel++)
13596 {
13597 if (irel->r_offset == pNext->relo->r_offset)
13598 {
13599 /* Ignore Non-TLS relocation types. */
13600 r_type = ELF32_R_TYPE (irel->r_info);
13601 if ((R_NDS32_TLS_LE_HI20 > r_type)
13602 || (R_NDS32_RELAX_ENTRY == r_type))
13603 continue;
13604
13605 if (!list_insert_sibling (pNext, irel))
13606 goto error_return;
13607 }
13608 else if (irel->r_offset > pNext->relo->r_offset)
13609 {
13610 pNext = pNext->next;
13611 if (!pNext)
13612 break;
13613
13614 bfd_vma current_offset = pNext->relo->r_offset;
13615 if (irel->r_offset > current_offset)
13616 irel = internal_relocs; /* restart from head */
13617 else
13618 --irel; /* Check current irel again. */
13619 continue;
13620 }
13621 else
13622 {
13623 /* This shouldn't be reached. */
13624 }
13625 }
13626 if (pNext)
13627 pNext = pNext->next;
13628 }
13629
13630#ifdef DUBUG_VERBOSE
13631 dump_chain(&chain);
13632#endif
13633
13634 /* Get symbol table and section content. */
13635 if (incontents)
13636 contents = incontents;
13637 else if (!nds32_get_section_contents (inbfd, insec, &contents, TRUE)
13638 || !nds32_get_local_syms (inbfd, insec, &local_syms))
13639 goto error_return;
13640
13641 char *local_got_tls_type = elf32_nds32_local_got_tls_type (inbfd);
13642
13643 /* Convert TLS model each group if necessary. */
13644 pNext = chain.next;
13645
13646 int cur_grp_id = -1;
13647 int sethi_rt = -1;
13648 int add_rt = -1;
13649 enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type;
13650
13651 tls_type = org_tls_type = eff_tls_type = 0;
13652
13653 while (pNext)
13654 {
13655 relax_group_list_t *pNextSig = pNext->next_sibling;
13656 while (pNextSig)
13657 {
13658 struct elf_link_hash_entry *h = NULL;
13659
13660 irel = pNextSig->relo;
13661 r_symndx = ELF32_R_SYM(irel->r_info);
13662 r_type = ELF32_R_TYPE(irel->r_info);
13663
13664 if (pNext->id != cur_grp_id)
13665 {
13666 cur_grp_id = pNext->id;
13667 org_tls_type = get_tls_type (r_type, NULL);
13668 if (r_symndx >= symtab_hdr->sh_info)
13669 {
13670 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
13671 while (h->root.type == bfd_link_hash_indirect
13672 || h->root.type == bfd_link_hash_warning)
13673 h = (struct elf_link_hash_entry *) h->root.u.i.link;
13674 tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
13675 }
13676 else
13677 {
13678 tls_type = local_got_tls_type
13679 ? local_got_tls_type[r_symndx]
13680 : GOT_NORMAL;
13681 }
13682
13683 eff_tls_type = 1 << (fls (tls_type) - 1);
13684 sethi_rt = N32_RT5(bfd_getb32 (contents + irel->r_offset));
13685 }
13686
13687 if (eff_tls_type != org_tls_type)
13688 {
13689 switch (org_tls_type)
13690 {
13691 /* DESC to IEGP/IE/LE. */
13692 case GOT_TLS_DESC:
13693 switch (eff_tls_type)
13694 {
13695 case GOT_TLS_IE:
13696 switch (r_type)
13697 {
13698 case R_NDS32_TLS_DESC_HI20:
13699 irel->r_info = ELF32_R_INFO(r_symndx,
13700 R_NDS32_TLS_IE_HI20);
13701 break;
13702 case R_NDS32_TLS_DESC_LO12:
13703 irel->r_info = ELF32_R_INFO(r_symndx,
13704 R_NDS32_TLS_IE_LO12);
13705 break;
13706 case R_NDS32_TLS_DESC_ADD:
13707 {
13708 uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13709 add_rt = N32_RT5 (insn);
13710 insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0);
13711 bfd_putb32 (insn, contents + irel->r_offset);
13712
13713 irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13714 }
13715 break;
13716 case R_NDS32_TLS_DESC_FUNC:
13717 bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13718 irel->r_info = ELF32_R_INFO(r_symndx,
13719 R_NDS32_RELAX_REMOVE);
13720 break;
13721 case R_NDS32_TLS_DESC_CALL:
13722 {
13723 uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt,
13724 REG_TP);
13725 bfd_putb32 (insn, contents + irel->r_offset);
13726
13727 irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13728 }
13729 break;
13730 case R_NDS32_LOADSTORE:
13731 case R_NDS32_PTR:
13732 case R_NDS32_PTR_RESOLVED:
13733 case R_NDS32_NONE:
13734 case R_NDS32_LABEL:
13735 break;
13736 default:
13737 BFD_ASSERT(0);
13738 break;
13739 }
13740 break;
13741 case GOT_TLS_IEGP:
13742 switch (r_type)
13743 {
13744 case R_NDS32_TLS_DESC_HI20:
13745 irel->r_info = ELF32_R_INFO(r_symndx,
13746 R_NDS32_TLS_IEGP_HI20);
13747 break;
13748 case R_NDS32_TLS_DESC_LO12:
13749 irel->r_info = ELF32_R_INFO(r_symndx,
13750 R_NDS32_TLS_IEGP_LO12);
13751 break;
13752 case R_NDS32_TLS_DESC_ADD:
13753 {
13754 uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13755 add_rt = N32_RT5 (insn);
13756 insn = N32_MEM(LW, add_rt, sethi_rt, REG_GP, 0);
13757 bfd_putb32 (insn, contents + irel->r_offset);
13758
13759 irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13760 }
13761 break;
13762 case R_NDS32_TLS_DESC_FUNC:
13763 bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13764 irel->r_info = ELF32_R_INFO(r_symndx,
13765 R_NDS32_RELAX_REMOVE);
13766 break;
13767 case R_NDS32_TLS_DESC_CALL:
13768 {
13769 uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt,
13770 REG_TP);
13771 bfd_putb32 (insn, contents + irel->r_offset);
13772
13773 irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13774 }
13775 break;
13776 case R_NDS32_LOADSTORE:
13777 case R_NDS32_PTR:
13778 case R_NDS32_PTR_RESOLVED:
13779 case R_NDS32_NONE:
13780 case R_NDS32_LABEL:
13781 break;
13782 default:
13783 BFD_ASSERT(0);
13784 break;
13785 }
13786 break;
13787 case GOT_TLS_LE:
13788 switch (r_type)
13789 {
13790 case R_NDS32_TLS_DESC_HI20:
13791 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_HI20);
13792 break;
13793 case R_NDS32_TLS_DESC_LO12:
13794 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_LO12);
13795 break;
13796 case R_NDS32_TLS_DESC_ADD:
13797 {
13798 uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13799
13800 add_rt = N32_RT5 (insn);
13801 insn = N32_ALU1 (ADD, REG_R0, sethi_rt, REG_TP);
13802 bfd_putb32 (insn, contents + irel->r_offset);
13803
13804 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_ADD);
13805 }
13806 break;
13807 case R_NDS32_TLS_DESC_FUNC:
13808 bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13809 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_RELAX_REMOVE);
13810 break;
13811 case R_NDS32_TLS_DESC_CALL:
13812 bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13813 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_RELAX_REMOVE);
13814 break;
13815 case R_NDS32_LOADSTORE:
13816 case R_NDS32_PTR:
13817 case R_NDS32_PTR_RESOLVED:
13818 case R_NDS32_NONE:
13819 case R_NDS32_LABEL:
13820 break;
13821 default:
13822 BFD_ASSERT(0);
13823 break;
13824 }
13825 break;
13826 default:
13827 break;
13828 }
13829 break;
13830 /* IEGP to IE/LE. */
13831 case GOT_TLS_IEGP:
13832 switch (eff_tls_type)
13833 {
13834 case GOT_TLS_IE:
13835 switch (r_type)
13836 {
13837 case R_NDS32_TLS_IEGP_HI20:
13838 irel->r_info = ELF32_R_INFO(r_symndx,
13839 R_NDS32_TLS_IE_HI20);
13840 break;
13841 case R_NDS32_TLS_IEGP_LO12:
13842 irel->r_info = ELF32_R_INFO(r_symndx,
13843 R_NDS32_TLS_IE_LO12);
13844 break;
13845 case R_NDS32_PTR_RESOLVED:
13846 {
13847 uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13848
13849 add_rt = N32_RT5 (insn);
13850 insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0);
13851 bfd_putb32 (insn, contents + irel->r_offset);
13852 }
13853 break;
13854 case R_NDS32_TLS_IEGP_LW:
13855 break;
13856 case R_NDS32_LOADSTORE:
13857 case R_NDS32_PTR:
13858 case R_NDS32_NONE:
13859 case R_NDS32_LABEL:
13860 break;
13861 default:
13862 BFD_ASSERT(0);
13863 break;
13864 }
13865 break;
13866 case GOT_TLS_LE:
13867 switch (r_type)
13868 {
13869 case R_NDS32_TLS_IEGP_HI20:
13870 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_HI20);
13871 break;
13872 case R_NDS32_TLS_IEGP_LO12:
13873 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_LO12);
13874 break;
13875 case R_NDS32_TLS_IEGP_LW:
13876 bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13877 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_RELAX_REMOVE);
13878 break;
13879 case R_NDS32_LOADSTORE:
13880 case R_NDS32_PTR:
13881 case R_NDS32_NONE:
13882 case R_NDS32_LABEL:
13883 case R_NDS32_PTR_RESOLVED:
13884 break;
13885 default:
13886 BFD_ASSERT(0);
13887 break;
13888 }
13889 break;
13890 default:
13891 break;
13892 }
13893 break;
13894 /* IE to LE. */
13895 case GOT_TLS_IE:
13896 switch (eff_tls_type)
13897 {
13898 case GOT_TLS_LE:
13899 switch (r_type)
13900 {
13901 case R_NDS32_TLS_IE_HI20:
13902 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_HI20);
13903 break;
13904 case R_NDS32_TLS_IE_LO12S2:
13905 {
13906 uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13907
13908 add_rt = N32_RT5 (insn);
13909 insn = N32_TYPE2 (ORI, add_rt, sethi_rt, 0);
13910 bfd_putb32 (insn, contents + irel->r_offset);
13911
13912 irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_LO12);
13913 }
13914 break;
13915 case R_NDS32_LOADSTORE:
13916 case R_NDS32_PTR:
13917 case R_NDS32_NONE:
13918 case R_NDS32_LABEL:
13919 break;
13920 default:
13921 BFD_ASSERT(0);
13922 break;
13923 }
13924 break;
13925 default:
13926 break;
13927 }
13928 break;
13929 default:
13930 break;
13931 }
13932 }
13933 pNextSig = pNextSig->next_sibling;
13934 }
13935
13936#if 1
13937 pNext = pNext->next;
13938#else
13939 while (pNext)
13940 {
13941 if (pNext->id != cur_grp_id)
13942 break;
13943 pNext = pNext->next;
13944 }
13945#endif
13946 }
13947
dc1e8a47 13948 finish:
fbaf61ad
NC
13949 if (incontents)
13950 contents = NULL;
13951
c9594989 13952 if (elf_section_data (insec)->relocs != internal_relocs)
fbaf61ad
NC
13953 free (internal_relocs);
13954
c9594989 13955 if (elf_section_data (insec)->this_hdr.contents != contents)
fbaf61ad
NC
13956 free (contents);
13957
c9594989 13958 if (symtab_hdr->contents != (bfd_byte *) local_syms)
fbaf61ad
NC
13959 free (local_syms);
13960
13961 if (chain.next)
13962 {
13963 pNext = chain.next;
13964 relax_group_list_t *pDel;
13965 while (pNext)
13966 {
13967 pDel = pNext;
13968 pNext = pNext->next;
13969 free (pDel);
13970 }
13971 }
13972
13973 return result;
13974
dc1e8a47 13975 error_return:
fbaf61ad
NC
13976 result = FALSE;
13977 goto finish;
13978}
13979
13980/* End TLS model conversion. */
13981
35c08157
KLC
13982#define ELF_ARCH bfd_arch_nds32
13983#define ELF_MACHINE_CODE EM_NDS32
13984#define ELF_MAXPAGESIZE 0x1000
07d6d2b8 13985#define ELF_TARGET_ID NDS32_ELF_DATA
35c08157 13986
6d00b590 13987#define TARGET_BIG_SYM nds32_elf32_be_vec
35c08157 13988#define TARGET_BIG_NAME "elf32-nds32be"
6d00b590 13989#define TARGET_LITTLE_SYM nds32_elf32_le_vec
35c08157
KLC
13990#define TARGET_LITTLE_NAME "elf32-nds32le"
13991
13992#define elf_info_to_howto nds32_info_to_howto
13993#define elf_info_to_howto_rel nds32_info_to_howto_rel
13994
13995#define bfd_elf32_bfd_link_hash_table_create nds32_elf_link_hash_table_create
13996#define bfd_elf32_bfd_merge_private_bfd_data nds32_elf_merge_private_bfd_data
13997#define bfd_elf32_bfd_print_private_bfd_data nds32_elf_print_private_bfd_data
13998#define bfd_elf32_bfd_relax_section nds32_elf_relax_section
13999#define bfd_elf32_bfd_set_private_flags nds32_elf_set_private_flags
14000
07d6d2b8 14001#define bfd_elf32_mkobject nds32_elf_mkobject
35c08157
KLC
14002#define elf_backend_action_discarded nds32_elf_action_discarded
14003#define elf_backend_add_symbol_hook nds32_elf_add_symbol_hook
14004#define elf_backend_check_relocs nds32_elf_check_relocs
14005#define elf_backend_adjust_dynamic_symbol nds32_elf_adjust_dynamic_symbol
14006#define elf_backend_create_dynamic_sections nds32_elf_create_dynamic_sections
14007#define elf_backend_finish_dynamic_sections nds32_elf_finish_dynamic_sections
14008#define elf_backend_finish_dynamic_symbol nds32_elf_finish_dynamic_symbol
14009#define elf_backend_size_dynamic_sections nds32_elf_size_dynamic_sections
14010#define elf_backend_relocate_section nds32_elf_relocate_section
14011#define elf_backend_gc_mark_hook nds32_elf_gc_mark_hook
35c08157
KLC
14012#define elf_backend_grok_prstatus nds32_elf_grok_prstatus
14013#define elf_backend_grok_psinfo nds32_elf_grok_psinfo
14014#define elf_backend_reloc_type_class nds32_elf_reloc_type_class
14015#define elf_backend_copy_indirect_symbol nds32_elf_copy_indirect_symbol
14016#define elf_backend_link_output_symbol_hook nds32_elf_output_symbol_hook
14017#define elf_backend_output_arch_syms nds32_elf_output_arch_syms
14018#define elf_backend_object_p nds32_elf_object_p
14019#define elf_backend_final_write_processing nds32_elf_final_write_processing
14020#define elf_backend_special_sections nds32_elf_special_sections
bf577467 14021#define elf_backend_section_flags nds32_elf_section_flags
1c8f6a4d 14022#define bfd_elf32_bfd_get_relocated_section_contents \
07d6d2b8 14023 nds32_elf_get_relocated_section_contents
fbaf61ad
NC
14024#define bfd_elf32_bfd_is_target_special_symbol nds32_elf_is_target_special_symbol
14025#define elf_backend_maybe_function_sym nds32_elf_maybe_function_sym
35c08157
KLC
14026
14027#define elf_backend_can_gc_sections 1
14028#define elf_backend_can_refcount 1
14029#define elf_backend_want_got_plt 1
14030#define elf_backend_plt_readonly 1
14031#define elf_backend_want_plt_sym 0
14032#define elf_backend_got_header_size 12
14033#define elf_backend_may_use_rel_p 1
14034#define elf_backend_default_use_rela_p 1
14035#define elf_backend_may_use_rela_p 1
fbaf61ad 14036#define elf_backend_dtrel_excludes_plt 0
35c08157
KLC
14037
14038#include "elf32-target.h"
14039
14040#undef ELF_MAXPAGESIZE
14041#define ELF_MAXPAGESIZE 0x2000
14042
fbaf61ad 14043#undef TARGET_BIG_SYM
6d00b590 14044#define TARGET_BIG_SYM nds32_elf32_linux_be_vec
fbaf61ad 14045#undef TARGET_BIG_NAME
35c08157 14046#define TARGET_BIG_NAME "elf32-nds32be-linux"
fbaf61ad 14047#undef TARGET_LITTLE_SYM
6d00b590 14048#define TARGET_LITTLE_SYM nds32_elf32_linux_le_vec
fbaf61ad 14049#undef TARGET_LITTLE_NAME
35c08157 14050#define TARGET_LITTLE_NAME "elf32-nds32le-linux"
fbaf61ad 14051#undef elf32_bed
35c08157
KLC
14052#define elf32_bed elf32_nds32_lin_bed
14053
14054#include "elf32-target.h"