dyn_relocs tidy
[deliverable/binutils-gdb.git] / bfd / elf32-nds32.c
1 /* NDS32-specific support for 32-bit ELF.
2 Copyright (C) 2012-2017 Free Software Foundation, Inc.
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
20 02110-1301, USA. */
21
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfd_stdint.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "libiberty.h"
30 #include "bfd_stdint.h"
31 #include "elf/nds32.h"
32 #include "opcode/nds32.h"
33 #include "elf32-nds32.h"
34 #include "opcode/cgen.h"
35 #include "../opcodes/nds32-opc.h"
36
37 /* Relocation HOWTO functions. */
38 static bfd_reloc_status_type nds32_elf_ignore_reloc
39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type nds32_elf_hi20_reloc
43 (bfd *, arelent *, asymbol *, void *,
44 asection *, bfd *, char **);
45 static bfd_reloc_status_type nds32_elf_lo12_reloc
46 (bfd *, arelent *, asymbol *, void *,
47 asection *, bfd *, char **);
48 static bfd_reloc_status_type nds32_elf_generic_reloc
49 (bfd *, arelent *, asymbol *, void *,
50 asection *, bfd *, char **);
51 static bfd_reloc_status_type nds32_elf_sda15_reloc
52 (bfd *, arelent *, asymbol *, void *,
53 asection *, bfd *, char **);
54
55 /* Helper functions for HOWTO. */
56 static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
57 (bfd *, reloc_howto_type *, asection *, bfd_byte *, bfd_vma,
58 asection *, bfd_vma, bfd_vma);
59
60 /* Nds32 helper functions. */
61 static bfd_vma calculate_memory_address
62 (bfd *, Elf_Internal_Rela *, Elf_Internal_Sym *, Elf_Internal_Shdr *);
63 static int nds32_get_section_contents (bfd *, asection *,
64 bfd_byte **, bfd_boolean);
65 static bfd_boolean nds32_elf_ex9_build_hash_table
66 (bfd *, asection *, struct bfd_link_info *);
67 static bfd_boolean nds32_elf_ex9_itb_base (struct bfd_link_info *);
68 static void nds32_elf_ex9_import_table (struct bfd_link_info *);
69 static void nds32_elf_ex9_finish (struct bfd_link_info *);
70 static void nds32_elf_ex9_reloc_jmp (struct bfd_link_info *);
71 static void nds32_elf_get_insn_with_reg
72 (Elf_Internal_Rela *, uint32_t, uint32_t *);
73 static int nds32_get_local_syms (bfd *, asection *ATTRIBUTE_UNUSED,
74 Elf_Internal_Sym **);
75 static bfd_boolean nds32_elf_ex9_replace_instruction
76 (struct bfd_link_info *, bfd *, asection *);
77 static bfd_boolean nds32_elf_ifc_calc (struct bfd_link_info *, bfd *,
78 asection *);
79 static bfd_boolean nds32_elf_ifc_finish (struct bfd_link_info *);
80 static bfd_boolean nds32_elf_ifc_replace (struct bfd_link_info *);
81 static bfd_boolean nds32_elf_ifc_reloc (void);
82 static bfd_boolean nds32_relax_fp_as_gp
83 (struct bfd_link_info *link_info, bfd *abfd, asection *sec,
84 Elf_Internal_Rela *internal_relocs, Elf_Internal_Rela *irelend,
85 Elf_Internal_Sym *isymbuf);
86 static bfd_boolean nds32_fag_remove_unused_fpbase
87 (bfd *abfd, asection *sec, Elf_Internal_Rela *internal_relocs,
88 Elf_Internal_Rela *irelend);
89
90 enum
91 {
92 MACH_V1 = bfd_mach_n1h,
93 MACH_V2 = bfd_mach_n1h_v2,
94 MACH_V3 = bfd_mach_n1h_v3,
95 MACH_V3M = bfd_mach_n1h_v3m
96 };
97
98 #define MIN(a, b) ((a) > (b) ? (b) : (a))
99 #define MAX(a, b) ((a) > (b) ? (a) : (b))
100
101 /* The name of the dynamic interpreter. This is put in the .interp
102 section. */
103 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
104
105 /* The nop opcode we use. */
106 #define NDS32_NOP32 0x40000009
107 #define NDS32_NOP16 0x9200
108
109 /* The size in bytes of an entry in the procedure linkage table. */
110 #define PLT_ENTRY_SIZE 24
111 #define PLT_HEADER_SIZE 24
112
113 /* The first entry in a procedure linkage table are reserved,
114 and the initial contents are unimportant (we zero them out).
115 Subsequent entries look like this. */
116 #define PLT0_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(.got+4) */
117 #define PLT0_ENTRY_WORD1 0x58f78000 /* ori r15, r25, LO12(.got+4) */
118 #define PLT0_ENTRY_WORD2 0x05178000 /* lwi r17, [r15+0] */
119 #define PLT0_ENTRY_WORD3 0x04f78001 /* lwi r15, [r15+4] */
120 #define PLT0_ENTRY_WORD4 0x4a003c00 /* jr r15 */
121
122 /* $ta is change to $r15 (from $r25). */
123 #define PLT0_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[1]@GOT) */
124 #define PLT0_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[1]@GOT) */
125 #define PLT0_PIC_ENTRY_WORD2 0x40f7f400 /* add r15, gp, r15 */
126 #define PLT0_PIC_ENTRY_WORD3 0x05178000 /* lwi r17, [r15+0] */
127 #define PLT0_PIC_ENTRY_WORD4 0x04f78001 /* lwi r15, [r15+4] */
128 #define PLT0_PIC_ENTRY_WORD5 0x4a003c00 /* jr r15 */
129
130 #define PLT_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(&got[n+3]) */
131 #define PLT_ENTRY_WORD1 0x04f78000 /* lwi r15, r15, LO12(&got[n+3]) */
132 #define PLT_ENTRY_WORD2 0x4a003c00 /* jr r15 */
133 #define PLT_ENTRY_WORD3 0x45000000 /* movi r16, sizeof(RELA) * n */
134 #define PLT_ENTRY_WORD4 0x48000000 /* j .plt0. */
135
136 #define PLT_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[n+3]@GOT) */
137 #define PLT_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[n+3]@GOT) */
138 #define PLT_PIC_ENTRY_WORD2 0x38febc02 /* lw r15, [gp+r15] */
139 #define PLT_PIC_ENTRY_WORD3 0x4a003c00 /* jr r15 */
140 #define PLT_PIC_ENTRY_WORD4 0x45000000 /* movi r16, sizeof(RELA) * n */
141 #define PLT_PIC_ENTRY_WORD5 0x48000000 /* j .plt0 */
142
143 /* These are macros used to get the relocation accurate value. */
144 #define ACCURATE_8BIT_S1 (0x100)
145 #define ACCURATE_U9BIT_S1 (0x400)
146 #define ACCURATE_12BIT_S1 (0x2000)
147 #define ACCURATE_14BIT_S1 (0x4000)
148 #define ACCURATE_19BIT (0x40000)
149
150 /* These are macros used to get the relocation conservative value. */
151 #define CONSERVATIVE_8BIT_S1 (0x100 - 4)
152 #define CONSERVATIVE_14BIT_S1 (0x4000 - 4)
153 #define CONSERVATIVE_16BIT_S1 (0x10000 - 4)
154 #define CONSERVATIVE_24BIT_S1 (0x1000000 - 4)
155 /* These must be more conservative because the address may be in
156 different segment. */
157 #define CONSERVATIVE_15BIT (0x4000 - 0x1000)
158 #define CONSERVATIVE_15BIT_S1 (0x8000 - 0x1000)
159 #define CONSERVATIVE_15BIT_S2 (0x10000 - 0x1000)
160 #define CONSERVATIVE_19BIT (0x40000 - 0x1000)
161 #define CONSERVATIVE_20BIT (0x80000 - 0x1000)
162
163 /* Size of small data/bss sections, used to calculate SDA_BASE. */
164 static long got_size = 0;
165 static int is_SDA_BASE_set = 0;
166 static int is_ITB_BASE_set = 0;
167
168 /* Convert ELF-VER in eflags to string for debugging purpose. */
169 static const char *const nds32_elfver_strtab[] =
170 {
171 "ELF-1.2",
172 "ELF-1.3",
173 "ELF-1.4",
174 };
175
176 /* The nds32 linker needs to keep track of the number of relocs that it
177 decides to copy in check_relocs for each symbol. This is so that
178 it can discard PC relative relocs if it doesn't need them when
179 linking with -Bsymbolic. We store the information in a field
180 extending the regular ELF linker hash table. */
181
182 /* This structure keeps track of the number of PC relative relocs we
183 have copied for a given symbol. */
184
185 struct elf_nds32_pcrel_relocs_copied
186 {
187 /* Next section. */
188 struct elf_nds32_pcrel_relocs_copied *next;
189 /* A section in dynobj. */
190 asection *section;
191 /* Number of relocs copied in this section. */
192 bfd_size_type count;
193 };
194
195 /* Nds32 ELF linker hash entry. */
196
197 struct elf_nds32_link_hash_entry
198 {
199 struct elf_link_hash_entry root;
200
201 /* Track dynamic relocs copied for this symbol. */
202 struct elf_dyn_relocs *dyn_relocs;
203
204 /* For checking relocation type. */
205 #define GOT_UNKNOWN 0
206 #define GOT_NORMAL 1
207 #define GOT_TLS_IE 2
208 unsigned int tls_type;
209 };
210
211 /* Get the nds32 ELF linker hash table from a link_info structure. */
212
213 #define FP_BASE_NAME "_FP_BASE_"
214 static int check_start_export_sym = 0;
215 static size_t ex9_relax_size = 0; /* Save ex9 predicted reducing size. */
216
217 /* The offset for executable tls relaxation. */
218 #define TP_OFFSET 0x0
219
220 struct elf_nds32_obj_tdata
221 {
222 struct elf_obj_tdata root;
223
224 /* tls_type for each local got entry. */
225 char *local_got_tls_type;
226 };
227
228 #define elf_nds32_tdata(bfd) \
229 ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
230
231 #define elf32_nds32_local_got_tls_type(bfd) \
232 (elf_nds32_tdata (bfd)->local_got_tls_type)
233
234 #define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
235
236 static bfd_boolean
237 nds32_elf_mkobject (bfd *abfd)
238 {
239 return bfd_elf_allocate_object (abfd, sizeof (struct elf_nds32_obj_tdata),
240 NDS32_ELF_DATA);
241 }
242
243 /* Relocations used for relocation. */
244 static reloc_howto_type nds32_elf_howto_table[] =
245 {
246 /* This reloc does nothing. */
247 HOWTO (R_NDS32_NONE, /* type */
248 0, /* rightshift */
249 3, /* size (0 = byte, 1 = short, 2 = long) */
250 0, /* bitsize */
251 FALSE, /* pc_relative */
252 0, /* bitpos */
253 complain_overflow_dont, /* complain_on_overflow */
254 bfd_elf_generic_reloc, /* special_function */
255 "R_NDS32_NONE", /* name */
256 FALSE, /* partial_inplace */
257 0, /* src_mask */
258 0, /* dst_mask */
259 FALSE), /* pcrel_offset */
260
261 /* A 16 bit absolute relocation. */
262 HOWTO (R_NDS32_16, /* type */
263 0, /* rightshift */
264 1, /* size (0 = byte, 1 = short, 2 = long) */
265 16, /* bitsize */
266 FALSE, /* pc_relative */
267 0, /* bitpos */
268 complain_overflow_bitfield, /* complain_on_overflow */
269 nds32_elf_generic_reloc, /* special_function */
270 "R_NDS32_16", /* name */
271 FALSE, /* partial_inplace */
272 0xffff, /* src_mask */
273 0xffff, /* dst_mask */
274 FALSE), /* pcrel_offset */
275
276 /* A 32 bit absolute relocation. */
277 HOWTO (R_NDS32_32, /* type */
278 0, /* rightshift */
279 2, /* size (0 = byte, 1 = short, 2 = long) */
280 32, /* bitsize */
281 FALSE, /* pc_relative */
282 0, /* bitpos */
283 complain_overflow_bitfield, /* complain_on_overflow */
284 nds32_elf_generic_reloc, /* special_function */
285 "R_NDS32_32", /* name */
286 FALSE, /* partial_inplace */
287 0xffffffff, /* src_mask */
288 0xffffffff, /* dst_mask */
289 FALSE), /* pcrel_offset */
290
291 /* A 20 bit address. */
292 HOWTO (R_NDS32_20, /* type */
293 0, /* rightshift */
294 2, /* size (0 = byte, 1 = short, 2 = long) */
295 20, /* bitsize */
296 FALSE, /* pc_relative */
297 0, /* bitpos */
298 complain_overflow_unsigned, /* complain_on_overflow */
299 nds32_elf_generic_reloc, /* special_function */
300 "R_NDS32_20", /* name */
301 FALSE, /* partial_inplace */
302 0xfffff, /* src_mask */
303 0xfffff, /* dst_mask */
304 FALSE), /* pcrel_offset */
305
306 /* An PC Relative 9-bit relocation, shifted by 2.
307 This reloc is complicated because relocations are relative to pc & -4.
308 i.e. branches in the right insn slot use the address of the left insn
309 slot for pc. */
310 /* ??? It's not clear whether this should have partial_inplace set or not.
311 Branch relaxing in the assembler can store the addend in the insn,
312 and if bfd_install_relocation gets called the addend may get added
313 again. */
314 HOWTO (R_NDS32_9_PCREL, /* type */
315 1, /* rightshift */
316 1, /* size (0 = byte, 1 = short, 2 = long) */
317 8, /* bitsize */
318 TRUE, /* pc_relative */
319 0, /* bitpos */
320 complain_overflow_signed, /* complain_on_overflow */
321 nds32_elf_9_pcrel_reloc, /* special_function */
322 "R_NDS32_9_PCREL", /* name */
323 FALSE, /* partial_inplace */
324 0xff, /* src_mask */
325 0xff, /* dst_mask */
326 TRUE), /* pcrel_offset */
327
328 /* A relative 15 bit relocation, right shifted by 1. */
329 HOWTO (R_NDS32_15_PCREL, /* type */
330 1, /* rightshift */
331 2, /* size (0 = byte, 1 = short, 2 = long) */
332 14, /* bitsize */
333 TRUE, /* pc_relative */
334 0, /* bitpos */
335 complain_overflow_signed, /* complain_on_overflow */
336 bfd_elf_generic_reloc, /* special_function */
337 "R_NDS32_15_PCREL", /* name */
338 FALSE, /* partial_inplace */
339 0x3fff, /* src_mask */
340 0x3fff, /* dst_mask */
341 TRUE), /* pcrel_offset */
342
343 /* A relative 17 bit relocation, right shifted by 1. */
344 HOWTO (R_NDS32_17_PCREL, /* type */
345 1, /* rightshift */
346 2, /* size (0 = byte, 1 = short, 2 = long) */
347 16, /* bitsize */
348 TRUE, /* pc_relative */
349 0, /* bitpos */
350 complain_overflow_signed, /* complain_on_overflow */
351 bfd_elf_generic_reloc, /* special_function */
352 "R_NDS32_17_PCREL", /* name */
353 FALSE, /* partial_inplace */
354 0xffff, /* src_mask */
355 0xffff, /* dst_mask */
356 TRUE), /* pcrel_offset */
357
358 /* A relative 25 bit relocation, right shifted by 1. */
359 /* ??? It's not clear whether this should have partial_inplace set or not.
360 Branch relaxing in the assembler can store the addend in the insn,
361 and if bfd_install_relocation gets called the addend may get added
362 again. */
363 HOWTO (R_NDS32_25_PCREL, /* type */
364 1, /* rightshift */
365 2, /* size (0 = byte, 1 = short, 2 = long) */
366 24, /* bitsize */
367 TRUE, /* pc_relative */
368 0, /* bitpos */
369 complain_overflow_signed, /* complain_on_overflow */
370 bfd_elf_generic_reloc, /* special_function */
371 "R_NDS32_25_PCREL", /* name */
372 FALSE, /* partial_inplace */
373 0xffffff, /* src_mask */
374 0xffffff, /* dst_mask */
375 TRUE), /* pcrel_offset */
376
377 /* High 20 bits of address when lower 12 is or'd in. */
378 HOWTO (R_NDS32_HI20, /* type */
379 12, /* rightshift */
380 2, /* size (0 = byte, 1 = short, 2 = long) */
381 20, /* bitsize */
382 FALSE, /* pc_relative */
383 0, /* bitpos */
384 complain_overflow_dont,/* complain_on_overflow */
385 nds32_elf_hi20_reloc, /* special_function */
386 "R_NDS32_HI20", /* name */
387 FALSE, /* partial_inplace */
388 0x000fffff, /* src_mask */
389 0x000fffff, /* dst_mask */
390 FALSE), /* pcrel_offset */
391
392 /* Lower 12 bits of address. */
393 HOWTO (R_NDS32_LO12S3, /* type */
394 3, /* rightshift */
395 2, /* size (0 = byte, 1 = short, 2 = long) */
396 9, /* bitsize */
397 FALSE, /* pc_relative */
398 0, /* bitpos */
399 complain_overflow_dont,/* complain_on_overflow */
400 nds32_elf_lo12_reloc, /* special_function */
401 "R_NDS32_LO12S3", /* name */
402 FALSE, /* partial_inplace */
403 0x000001ff, /* src_mask */
404 0x000001ff, /* dst_mask */
405 FALSE), /* pcrel_offset */
406
407 /* Lower 12 bits of address. */
408 HOWTO (R_NDS32_LO12S2, /* type */
409 2, /* rightshift */
410 2, /* size (0 = byte, 1 = short, 2 = long) */
411 10, /* bitsize */
412 FALSE, /* pc_relative */
413 0, /* bitpos */
414 complain_overflow_dont,/* complain_on_overflow */
415 nds32_elf_lo12_reloc, /* special_function */
416 "R_NDS32_LO12S2", /* name */
417 FALSE, /* partial_inplace */
418 0x000003ff, /* src_mask */
419 0x000003ff, /* dst_mask */
420 FALSE), /* pcrel_offset */
421
422 /* Lower 12 bits of address. */
423 HOWTO (R_NDS32_LO12S1, /* type */
424 1, /* rightshift */
425 2, /* size (0 = byte, 1 = short, 2 = long) */
426 11, /* bitsize */
427 FALSE, /* pc_relative */
428 0, /* bitpos */
429 complain_overflow_dont,/* complain_on_overflow */
430 nds32_elf_lo12_reloc, /* special_function */
431 "R_NDS32_LO12S1", /* name */
432 FALSE, /* partial_inplace */
433 0x000007ff, /* src_mask */
434 0x000007ff, /* dst_mask */
435 FALSE), /* pcrel_offset */
436
437 /* Lower 12 bits of address. */
438 HOWTO (R_NDS32_LO12S0, /* type */
439 0, /* rightshift */
440 2, /* size (0 = byte, 1 = short, 2 = long) */
441 12, /* bitsize */
442 FALSE, /* pc_relative */
443 0, /* bitpos */
444 complain_overflow_dont,/* complain_on_overflow */
445 nds32_elf_lo12_reloc, /* special_function */
446 "R_NDS32_LO12S0", /* name */
447 FALSE, /* partial_inplace */
448 0x00000fff, /* src_mask */
449 0x00000fff, /* dst_mask */
450 FALSE), /* pcrel_offset */
451
452 /* Small data area 15 bits offset. */
453 HOWTO (R_NDS32_SDA15S3, /* type */
454 3, /* rightshift */
455 2, /* size (0 = byte, 1 = short, 2 = long) */
456 15, /* bitsize */
457 FALSE, /* pc_relative */
458 0, /* bitpos */
459 complain_overflow_signed, /* complain_on_overflow */
460 nds32_elf_sda15_reloc, /* special_function */
461 "R_NDS32_SDA15S3", /* name */
462 FALSE, /* partial_inplace */
463 0x00007fff, /* src_mask */
464 0x00007fff, /* dst_mask */
465 FALSE), /* pcrel_offset */
466
467 /* Small data area 15 bits offset. */
468 HOWTO (R_NDS32_SDA15S2, /* type */
469 2, /* rightshift */
470 2, /* size (0 = byte, 1 = short, 2 = long) */
471 15, /* bitsize */
472 FALSE, /* pc_relative */
473 0, /* bitpos */
474 complain_overflow_signed, /* complain_on_overflow */
475 nds32_elf_sda15_reloc, /* special_function */
476 "R_NDS32_SDA15S2", /* name */
477 FALSE, /* partial_inplace */
478 0x00007fff, /* src_mask */
479 0x00007fff, /* dst_mask */
480 FALSE), /* pcrel_offset */
481
482 /* Small data area 15 bits offset. */
483 HOWTO (R_NDS32_SDA15S1, /* type */
484 1, /* rightshift */
485 2, /* size (0 = byte, 1 = short, 2 = long) */
486 15, /* bitsize */
487 FALSE, /* pc_relative */
488 0, /* bitpos */
489 complain_overflow_signed, /* complain_on_overflow */
490 nds32_elf_sda15_reloc, /* special_function */
491 "R_NDS32_SDA15S1", /* name */
492 FALSE, /* partial_inplace */
493 0x00007fff, /* src_mask */
494 0x00007fff, /* dst_mask */
495 FALSE), /* pcrel_offset */
496
497 /* Small data area 15 bits offset. */
498 HOWTO (R_NDS32_SDA15S0, /* type */
499 0, /* rightshift */
500 2, /* size (0 = byte, 1 = short, 2 = long) */
501 15, /* bitsize */
502 FALSE, /* pc_relative */
503 0, /* bitpos */
504 complain_overflow_signed, /* complain_on_overflow */
505 nds32_elf_sda15_reloc, /* special_function */
506 "R_NDS32_SDA15S0", /* name */
507 FALSE, /* partial_inplace */
508 0x00007fff, /* src_mask */
509 0x00007fff, /* dst_mask */
510 FALSE), /* pcrel_offset */
511
512 /* GNU extension to record C++ vtable hierarchy */
513 HOWTO (R_NDS32_GNU_VTINHERIT, /* type */
514 0, /* rightshift */
515 2, /* size (0 = byte, 1 = short, 2 = long) */
516 0, /* bitsize */
517 FALSE, /* pc_relative */
518 0, /* bitpos */
519 complain_overflow_dont,/* complain_on_overflow */
520 NULL, /* special_function */
521 "R_NDS32_GNU_VTINHERIT", /* name */
522 FALSE, /* partial_inplace */
523 0, /* src_mask */
524 0, /* dst_mask */
525 FALSE), /* pcrel_offset */
526
527 /* GNU extension to record C++ vtable member usage */
528 HOWTO (R_NDS32_GNU_VTENTRY, /* type */
529 0, /* rightshift */
530 2, /* size (0 = byte, 1 = short, 2 = long) */
531 0, /* bitsize */
532 FALSE, /* pc_relative */
533 0, /* bitpos */
534 complain_overflow_dont,/* complain_on_overflow */
535 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
536 "R_NDS32_GNU_VTENTRY", /* name */
537 FALSE, /* partial_inplace */
538 0, /* src_mask */
539 0, /* dst_mask */
540 FALSE), /* pcrel_offset */
541
542 /* A 16 bit absolute relocation. */
543 HOWTO (R_NDS32_16_RELA, /* type */
544 0, /* rightshift */
545 1, /* size (0 = byte, 1 = short, 2 = long) */
546 16, /* bitsize */
547 FALSE, /* pc_relative */
548 0, /* bitpos */
549 complain_overflow_bitfield, /* complain_on_overflow */
550 bfd_elf_generic_reloc, /* special_function */
551 "R_NDS32_16_RELA", /* name */
552 FALSE, /* partial_inplace */
553 0xffff, /* src_mask */
554 0xffff, /* dst_mask */
555 FALSE), /* pcrel_offset */
556
557 /* A 32 bit absolute relocation. */
558 HOWTO (R_NDS32_32_RELA, /* type */
559 0, /* rightshift */
560 2, /* size (0 = byte, 1 = short, 2 = long) */
561 32, /* bitsize */
562 FALSE, /* pc_relative */
563 0, /* bitpos */
564 complain_overflow_bitfield, /* complain_on_overflow */
565 bfd_elf_generic_reloc, /* special_function */
566 "R_NDS32_32_RELA", /* name */
567 FALSE, /* partial_inplace */
568 0xffffffff, /* src_mask */
569 0xffffffff, /* dst_mask */
570 FALSE), /* pcrel_offset */
571
572 /* A 20 bit address. */
573 HOWTO (R_NDS32_20_RELA, /* type */
574 0, /* rightshift */
575 2, /* size (0 = byte, 1 = short, 2 = long) */
576 20, /* bitsize */
577 FALSE, /* pc_relative */
578 0, /* bitpos */
579 complain_overflow_signed, /* complain_on_overflow */
580 bfd_elf_generic_reloc, /* special_function */
581 "R_NDS32_20_RELA", /* name */
582 FALSE, /* partial_inplace */
583 0xfffff, /* src_mask */
584 0xfffff, /* dst_mask */
585 FALSE), /* pcrel_offset */
586
587 HOWTO (R_NDS32_9_PCREL_RELA, /* type */
588 1, /* rightshift */
589 1, /* size (0 = byte, 1 = short, 2 = long) */
590 8, /* bitsize */
591 TRUE, /* pc_relative */
592 0, /* bitpos */
593 complain_overflow_signed, /* complain_on_overflow */
594 bfd_elf_generic_reloc, /* special_function */
595 "R_NDS32_9_PCREL_RELA",/* name */
596 FALSE, /* partial_inplace */
597 0xff, /* src_mask */
598 0xff, /* dst_mask */
599 TRUE), /* pcrel_offset */
600
601 /* A relative 15 bit relocation, right shifted by 1. */
602 HOWTO (R_NDS32_15_PCREL_RELA, /* type */
603 1, /* rightshift */
604 2, /* size (0 = byte, 1 = short, 2 = long) */
605 14, /* bitsize */
606 TRUE, /* pc_relative */
607 0, /* bitpos */
608 complain_overflow_signed, /* complain_on_overflow */
609 bfd_elf_generic_reloc, /* special_function */
610 "R_NDS32_15_PCREL_RELA", /* name */
611 FALSE, /* partial_inplace */
612 0x3fff, /* src_mask */
613 0x3fff, /* dst_mask */
614 TRUE), /* pcrel_offset */
615
616 /* A relative 17 bit relocation, right shifted by 1. */
617 HOWTO (R_NDS32_17_PCREL_RELA, /* type */
618 1, /* rightshift */
619 2, /* size (0 = byte, 1 = short, 2 = long) */
620 16, /* bitsize */
621 TRUE, /* pc_relative */
622 0, /* bitpos */
623 complain_overflow_signed, /* complain_on_overflow */
624 bfd_elf_generic_reloc, /* special_function */
625 "R_NDS32_17_PCREL_RELA", /* name */
626 FALSE, /* partial_inplace */
627 0xffff, /* src_mask */
628 0xffff, /* dst_mask */
629 TRUE), /* pcrel_offset */
630
631 /* A relative 25 bit relocation, right shifted by 2. */
632 HOWTO (R_NDS32_25_PCREL_RELA, /* type */
633 1, /* rightshift */
634 2, /* size (0 = byte, 1 = short, 2 = long) */
635 24, /* bitsize */
636 TRUE, /* pc_relative */
637 0, /* bitpos */
638 complain_overflow_signed, /* complain_on_overflow */
639 bfd_elf_generic_reloc, /* special_function */
640 "R_NDS32_25_PCREL_RELA", /* name */
641 FALSE, /* partial_inplace */
642 0xffffff, /* src_mask */
643 0xffffff, /* dst_mask */
644 TRUE), /* pcrel_offset */
645
646 /* High 20 bits of address when lower 16 is or'd in. */
647 HOWTO (R_NDS32_HI20_RELA, /* type */
648 12, /* rightshift */
649 2, /* size (0 = byte, 1 = short, 2 = long) */
650 20, /* bitsize */
651 FALSE, /* pc_relative */
652 0, /* bitpos */
653 complain_overflow_dont,/* complain_on_overflow */
654 bfd_elf_generic_reloc, /* special_function */
655 "R_NDS32_HI20_RELA", /* name */
656 FALSE, /* partial_inplace */
657 0x000fffff, /* src_mask */
658 0x000fffff, /* dst_mask */
659 FALSE), /* pcrel_offset */
660
661 /* Lower 12 bits of address. */
662 HOWTO (R_NDS32_LO12S3_RELA, /* type */
663 3, /* rightshift */
664 2, /* size (0 = byte, 1 = short, 2 = long) */
665 9, /* bitsize */
666 FALSE, /* pc_relative */
667 0, /* bitpos */
668 complain_overflow_dont,/* complain_on_overflow */
669 bfd_elf_generic_reloc, /* special_function */
670 "R_NDS32_LO12S3_RELA", /* name */
671 FALSE, /* partial_inplace */
672 0x000001ff, /* src_mask */
673 0x000001ff, /* dst_mask */
674 FALSE), /* pcrel_offset */
675
676 /* Lower 12 bits of address. */
677 HOWTO (R_NDS32_LO12S2_RELA, /* type */
678 2, /* rightshift */
679 2, /* size (0 = byte, 1 = short, 2 = long) */
680 10, /* bitsize */
681 FALSE, /* pc_relative */
682 0, /* bitpos */
683 complain_overflow_dont,/* complain_on_overflow */
684 bfd_elf_generic_reloc, /* special_function */
685 "R_NDS32_LO12S2_RELA", /* name */
686 FALSE, /* partial_inplace */
687 0x000003ff, /* src_mask */
688 0x000003ff, /* dst_mask */
689 FALSE), /* pcrel_offset */
690
691 /* Lower 12 bits of address. */
692 HOWTO (R_NDS32_LO12S1_RELA, /* type */
693 1, /* rightshift */
694 2, /* size (0 = byte, 1 = short, 2 = long) */
695 11, /* bitsize */
696 FALSE, /* pc_relative */
697 0, /* bitpos */
698 complain_overflow_dont,/* complain_on_overflow */
699 bfd_elf_generic_reloc, /* special_function */
700 "R_NDS32_LO12S1_RELA", /* name */
701 FALSE, /* partial_inplace */
702 0x000007ff, /* src_mask */
703 0x000007ff, /* dst_mask */
704 FALSE), /* pcrel_offset */
705
706 /* Lower 12 bits of address. */
707 HOWTO (R_NDS32_LO12S0_RELA, /* type */
708 0, /* rightshift */
709 2, /* size (0 = byte, 1 = short, 2 = long) */
710 12, /* bitsize */
711 FALSE, /* pc_relative */
712 0, /* bitpos */
713 complain_overflow_dont,/* complain_on_overflow */
714 bfd_elf_generic_reloc, /* special_function */
715 "R_NDS32_LO12S0_RELA", /* name */
716 FALSE, /* partial_inplace */
717 0x00000fff, /* src_mask */
718 0x00000fff, /* dst_mask */
719 FALSE), /* pcrel_offset */
720
721 /* Small data area 15 bits offset. */
722 HOWTO (R_NDS32_SDA15S3_RELA, /* type */
723 3, /* rightshift */
724 2, /* size (0 = byte, 1 = short, 2 = long) */
725 15, /* bitsize */
726 FALSE, /* pc_relative */
727 0, /* bitpos */
728 complain_overflow_signed, /* complain_on_overflow */
729 bfd_elf_generic_reloc, /* special_function */
730 "R_NDS32_SDA15S3_RELA",/* name */
731 FALSE, /* partial_inplace */
732 0x00007fff, /* src_mask */
733 0x00007fff, /* dst_mask */
734 FALSE), /* pcrel_offset */
735
736 /* Small data area 15 bits offset. */
737 HOWTO (R_NDS32_SDA15S2_RELA, /* type */
738 2, /* rightshift */
739 2, /* size (0 = byte, 1 = short, 2 = long) */
740 15, /* bitsize */
741 FALSE, /* pc_relative */
742 0, /* bitpos */
743 complain_overflow_signed, /* complain_on_overflow */
744 bfd_elf_generic_reloc, /* special_function */
745 "R_NDS32_SDA15S2_RELA",/* name */
746 FALSE, /* partial_inplace */
747 0x00007fff, /* src_mask */
748 0x00007fff, /* dst_mask */
749 FALSE), /* pcrel_offset */
750
751 HOWTO (R_NDS32_SDA15S1_RELA, /* type */
752 1, /* rightshift */
753 2, /* size (0 = byte, 1 = short, 2 = long) */
754 15, /* bitsize */
755 FALSE, /* pc_relative */
756 0, /* bitpos */
757 complain_overflow_signed, /* complain_on_overflow */
758 bfd_elf_generic_reloc, /* special_function */
759 "R_NDS32_SDA15S1_RELA",/* name */
760 FALSE, /* partial_inplace */
761 0x00007fff, /* src_mask */
762 0x00007fff, /* dst_mask */
763 FALSE), /* pcrel_offset */
764
765 HOWTO (R_NDS32_SDA15S0_RELA, /* type */
766 0, /* rightshift */
767 2, /* size (0 = byte, 1 = short, 2 = long) */
768 15, /* bitsize */
769 FALSE, /* pc_relative */
770 0, /* bitpos */
771 complain_overflow_signed, /* complain_on_overflow */
772 bfd_elf_generic_reloc, /* special_function */
773 "R_NDS32_SDA15S0_RELA",/* name */
774 FALSE, /* partial_inplace */
775 0x00007fff, /* src_mask */
776 0x00007fff, /* dst_mask */
777 FALSE), /* pcrel_offset */
778
779 /* GNU extension to record C++ vtable hierarchy */
780 HOWTO (R_NDS32_RELA_GNU_VTINHERIT, /* type */
781 0, /* rightshift */
782 2, /* size (0 = byte, 1 = short, 2 = long) */
783 0, /* bitsize */
784 FALSE, /* pc_relative */
785 0, /* bitpos */
786 complain_overflow_dont,/* complain_on_overflow */
787 NULL, /* special_function */
788 "R_NDS32_RELA_GNU_VTINHERIT", /* name */
789 FALSE, /* partial_inplace */
790 0, /* src_mask */
791 0, /* dst_mask */
792 FALSE), /* pcrel_offset */
793
794 /* GNU extension to record C++ vtable member usage */
795 HOWTO (R_NDS32_RELA_GNU_VTENTRY, /* type */
796 0, /* rightshift */
797 2, /* size (0 = byte, 1 = short, 2 = long) */
798 0, /* bitsize */
799 FALSE, /* pc_relative */
800 0, /* bitpos */
801 complain_overflow_dont,/* complain_on_overflow */
802 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
803 "R_NDS32_RELA_GNU_VTENTRY", /* name */
804 FALSE, /* partial_inplace */
805 0, /* src_mask */
806 0, /* dst_mask */
807 FALSE), /* pcrel_offset */
808
809 /* Like R_NDS32_20, but referring to the GOT table entry for
810 the symbol. */
811 HOWTO (R_NDS32_GOT20, /* type */
812 0, /* rightshift */
813 2, /* size (0 = byte, 1 = short, 2 = long) */
814 20, /* bitsize */
815 FALSE, /* pc_relative */
816 0, /* bitpos */
817 complain_overflow_signed, /* complain_on_overflow */
818 bfd_elf_generic_reloc, /* special_function */
819 "R_NDS32_GOT20", /* name */
820 FALSE, /* partial_inplace */
821 0xfffff, /* src_mask */
822 0xfffff, /* dst_mask */
823 FALSE), /* pcrel_offset */
824
825 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
826 entry for the symbol. */
827 HOWTO (R_NDS32_25_PLTREL, /* type */
828 1, /* rightshift */
829 2, /* size (0 = byte, 1 = short, 2 = long) */
830 24, /* bitsize */
831 TRUE, /* pc_relative */
832 0, /* bitpos */
833 complain_overflow_signed, /* complain_on_overflow */
834 bfd_elf_generic_reloc, /* special_function */
835 "R_NDS32_25_PLTREL", /* name */
836 FALSE, /* partial_inplace */
837 0xffffff, /* src_mask */
838 0xffffff, /* dst_mask */
839 TRUE), /* pcrel_offset */
840
841 /* This is used only by the dynamic linker. The symbol should exist
842 both in the object being run and in some shared library. The
843 dynamic linker copies the data addressed by the symbol from the
844 shared library into the object, because the object being
845 run has to have the data at some particular address. */
846 HOWTO (R_NDS32_COPY, /* type */
847 0, /* rightshift */
848 2, /* size (0 = byte, 1 = short, 2 = long) */
849 32, /* bitsize */
850 FALSE, /* pc_relative */
851 0, /* bitpos */
852 complain_overflow_bitfield, /* complain_on_overflow */
853 bfd_elf_generic_reloc, /* special_function */
854 "R_NDS32_COPY", /* name */
855 FALSE, /* partial_inplace */
856 0xffffffff, /* src_mask */
857 0xffffffff, /* dst_mask */
858 FALSE), /* pcrel_offset */
859
860 /* Like R_NDS32_20, but used when setting global offset table
861 entries. */
862 HOWTO (R_NDS32_GLOB_DAT, /* type */
863 0, /* rightshift */
864 2, /* size (0 = byte, 1 = short, 2 = long) */
865 32, /* bitsize */
866 FALSE, /* pc_relative */
867 0, /* bitpos */
868 complain_overflow_bitfield, /* complain_on_overflow */
869 bfd_elf_generic_reloc, /* special_function */
870 "R_NDS32_GLOB_DAT", /* name */
871 FALSE, /* partial_inplace */
872 0xffffffff, /* src_mask */
873 0xffffffff, /* dst_mask */
874 FALSE), /* pcrel_offset */
875
876 /* Marks a procedure linkage table entry for a symbol. */
877 HOWTO (R_NDS32_JMP_SLOT, /* type */
878 0, /* rightshift */
879 2, /* size (0 = byte, 1 = short, 2 = long) */
880 32, /* bitsize */
881 FALSE, /* pc_relative */
882 0, /* bitpos */
883 complain_overflow_bitfield, /* complain_on_overflow */
884 bfd_elf_generic_reloc, /* special_function */
885 "R_NDS32_JMP_SLOT", /* name */
886 FALSE, /* partial_inplace */
887 0xffffffff, /* src_mask */
888 0xffffffff, /* dst_mask */
889 FALSE), /* pcrel_offset */
890
891 /* Used only by the dynamic linker. When the object is run, this
892 longword is set to the load address of the object, plus the
893 addend. */
894 HOWTO (R_NDS32_RELATIVE, /* type */
895 0, /* rightshift */
896 2, /* size (0 = byte, 1 = short, 2 = long) */
897 32, /* bitsize */
898 FALSE, /* pc_relative */
899 0, /* bitpos */
900 complain_overflow_bitfield, /* complain_on_overflow */
901 bfd_elf_generic_reloc, /* special_function */
902 "R_NDS32_RELATIVE", /* name */
903 FALSE, /* partial_inplace */
904 0xffffffff, /* src_mask */
905 0xffffffff, /* dst_mask */
906 FALSE), /* pcrel_offset */
907
908 HOWTO (R_NDS32_GOTOFF, /* type */
909 0, /* rightshift */
910 2, /* size (0 = byte, 1 = short, 2 = long) */
911 20, /* bitsize */
912 FALSE, /* pc_relative */
913 0, /* bitpos */
914 complain_overflow_signed, /* complain_on_overflow */
915 bfd_elf_generic_reloc, /* special_function */
916 "R_NDS32_GOTOFF", /* name */
917 FALSE, /* partial_inplace */
918 0xfffff, /* src_mask */
919 0xfffff, /* dst_mask */
920 FALSE), /* pcrel_offset */
921
922 /* An PC Relative 20-bit relocation used when setting PIC offset
923 table register. */
924 HOWTO (R_NDS32_GOTPC20, /* type */
925 0, /* rightshift */
926 2, /* size (0 = byte, 1 = short, 2 = long) */
927 20, /* bitsize */
928 TRUE, /* pc_relative */
929 0, /* bitpos */
930 complain_overflow_signed, /* complain_on_overflow */
931 bfd_elf_generic_reloc, /* special_function */
932 "R_NDS32_GOTPC20", /* name */
933 FALSE, /* partial_inplace */
934 0xfffff, /* src_mask */
935 0xfffff, /* dst_mask */
936 TRUE), /* pcrel_offset */
937
938 /* Like R_NDS32_HI20, but referring to the GOT table entry for
939 the symbol. */
940 HOWTO (R_NDS32_GOT_HI20, /* type */
941 12, /* rightshift */
942 2, /* size (0 = byte, 1 = short, 2 = long) */
943 20, /* bitsize */
944 FALSE, /* pc_relative */
945 0, /* bitpos */
946 complain_overflow_dont,/* complain_on_overflow */
947 bfd_elf_generic_reloc, /* special_function */
948 "R_NDS32_GOT_HI20", /* name */
949 FALSE, /* partial_inplace */
950 0x000fffff, /* src_mask */
951 0x000fffff, /* dst_mask */
952 FALSE), /* pcrel_offset */
953 HOWTO (R_NDS32_GOT_LO12, /* type */
954 0, /* rightshift */
955 2, /* size (0 = byte, 1 = short, 2 = long) */
956 12, /* bitsize */
957 FALSE, /* pc_relative */
958 0, /* bitpos */
959 complain_overflow_dont,/* complain_on_overflow */
960 bfd_elf_generic_reloc, /* special_function */
961 "R_NDS32_GOT_LO12", /* name */
962 FALSE, /* partial_inplace */
963 0x00000fff, /* src_mask */
964 0x00000fff, /* dst_mask */
965 FALSE), /* pcrel_offset */
966
967 /* An PC Relative relocation used when setting PIC offset table register.
968 Like R_NDS32_HI20, but referring to the GOT table entry for
969 the symbol. */
970 HOWTO (R_NDS32_GOTPC_HI20, /* type */
971 12, /* rightshift */
972 2, /* size (0 = byte, 1 = short, 2 = long) */
973 20, /* bitsize */
974 FALSE, /* pc_relative */
975 0, /* bitpos */
976 complain_overflow_dont,/* complain_on_overflow */
977 bfd_elf_generic_reloc, /* special_function */
978 "R_NDS32_GOTPC_HI20", /* name */
979 FALSE, /* partial_inplace */
980 0x000fffff, /* src_mask */
981 0x000fffff, /* dst_mask */
982 TRUE), /* pcrel_offset */
983 HOWTO (R_NDS32_GOTPC_LO12, /* type */
984 0, /* rightshift */
985 2, /* size (0 = byte, 1 = short, 2 = long) */
986 12, /* bitsize */
987 FALSE, /* pc_relative */
988 0, /* bitpos */
989 complain_overflow_dont, /* complain_on_overflow */
990 bfd_elf_generic_reloc, /* special_function */
991 "R_NDS32_GOTPC_LO12", /* name */
992 FALSE, /* partial_inplace */
993 0x00000fff, /* src_mask */
994 0x00000fff, /* dst_mask */
995 TRUE), /* pcrel_offset */
996
997 HOWTO (R_NDS32_GOTOFF_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_GOTOFF_HI20", /* name */
1006 FALSE, /* partial_inplace */
1007 0x000fffff, /* src_mask */
1008 0x000fffff, /* dst_mask */
1009 FALSE), /* pcrel_offset */
1010 HOWTO (R_NDS32_GOTOFF_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_GOTOFF_LO12", /* name */
1019 FALSE, /* partial_inplace */
1020 0x00000fff, /* src_mask */
1021 0x00000fff, /* dst_mask */
1022 FALSE), /* pcrel_offset */
1023
1024 /* Alignment hint for relaxable instruction. This is used with
1025 R_NDS32_LABEL as a pair. Relax this instruction from 4 bytes to 2
1026 in order to make next label aligned on word boundary. */
1027 HOWTO (R_NDS32_INSN16, /* type */
1028 0, /* rightshift */
1029 2, /* size (0 = byte, 1 = short, 2 = long) */
1030 32, /* bitsize */
1031 FALSE, /* pc_relative */
1032 0, /* bitpos */
1033 complain_overflow_dont,/* complain_on_overflow */
1034 nds32_elf_ignore_reloc,/* special_function */
1035 "R_NDS32_INSN16", /* name */
1036 FALSE, /* partial_inplace */
1037 0x00000fff, /* src_mask */
1038 0x00000fff, /* dst_mask */
1039 FALSE), /* pcrel_offset */
1040
1041 /* Alignment hint for label. */
1042 HOWTO (R_NDS32_LABEL, /* type */
1043 0, /* rightshift */
1044 2, /* size (0 = byte, 1 = short, 2 = long) */
1045 32, /* bitsize */
1046 FALSE, /* pc_relative */
1047 0, /* bitpos */
1048 complain_overflow_dont,/* complain_on_overflow */
1049 nds32_elf_ignore_reloc,/* special_function */
1050 "R_NDS32_LABEL", /* name */
1051 FALSE, /* partial_inplace */
1052 0xffffffff, /* src_mask */
1053 0xffffffff, /* dst_mask */
1054 FALSE), /* pcrel_offset */
1055
1056 /* Relax hint for unconditional call sequence */
1057 HOWTO (R_NDS32_LONGCALL1, /* type */
1058 0, /* rightshift */
1059 2, /* size (0 = byte, 1 = short, 2 = long) */
1060 32, /* bitsize */
1061 FALSE, /* pc_relative */
1062 0, /* bitpos */
1063 complain_overflow_dont,/* complain_on_overflow */
1064 nds32_elf_ignore_reloc,/* special_function */
1065 "R_NDS32_LONGCALL1", /* name */
1066 FALSE, /* partial_inplace */
1067 0xffffffff, /* src_mask */
1068 0xffffffff, /* dst_mask */
1069 FALSE), /* pcrel_offset */
1070
1071 /* Relax hint for conditional call sequence. */
1072 HOWTO (R_NDS32_LONGCALL2, /* type */
1073 0, /* rightshift */
1074 2, /* size (0 = byte, 1 = short, 2 = long) */
1075 32, /* bitsize */
1076 FALSE, /* pc_relative */
1077 0, /* bitpos */
1078 complain_overflow_dont,/* complain_on_overflow */
1079 nds32_elf_ignore_reloc,/* special_function */
1080 "R_NDS32_LONGCALL2", /* name */
1081 FALSE, /* partial_inplace */
1082 0xffffffff, /* src_mask */
1083 0xffffffff, /* dst_mask */
1084 FALSE), /* pcrel_offset */
1085
1086 /* Relax hint for conditional call sequence. */
1087 HOWTO (R_NDS32_LONGCALL3, /* type */
1088 0, /* rightshift */
1089 2, /* size (0 = byte, 1 = short, 2 = long) */
1090 32, /* bitsize */
1091 FALSE, /* pc_relative */
1092 0, /* bitpos */
1093 complain_overflow_dont,/* complain_on_overflow */
1094 nds32_elf_ignore_reloc,/* special_function */
1095 "R_NDS32_LONGCALL3", /* name */
1096 FALSE, /* partial_inplace */
1097 0xffffffff, /* src_mask */
1098 0xffffffff, /* dst_mask */
1099 FALSE), /* pcrel_offset */
1100
1101 /* Relax hint for unconditional branch sequence. */
1102 HOWTO (R_NDS32_LONGJUMP1, /* type */
1103 0, /* rightshift */
1104 2, /* size (0 = byte, 1 = short, 2 = long) */
1105 32, /* bitsize */
1106 FALSE, /* pc_relative */
1107 0, /* bitpos */
1108 complain_overflow_dont,/* complain_on_overflow */
1109 nds32_elf_ignore_reloc,/* special_function */
1110 "R_NDS32_LONGJUMP1", /* name */
1111 FALSE, /* partial_inplace */
1112 0xffffffff, /* src_mask */
1113 0xffffffff, /* dst_mask */
1114 FALSE), /* pcrel_offset */
1115
1116 /* Relax hint for conditional branch sequence. */
1117 HOWTO (R_NDS32_LONGJUMP2, /* type */
1118 0, /* rightshift */
1119 2, /* size (0 = byte, 1 = short, 2 = long) */
1120 32, /* bitsize */
1121 FALSE, /* pc_relative */
1122 0, /* bitpos */
1123 complain_overflow_dont,/* complain_on_overflow */
1124 nds32_elf_ignore_reloc,/* special_function */
1125 "R_NDS32_LONGJUMP2", /* name */
1126 FALSE, /* partial_inplace */
1127 0xffffffff, /* src_mask */
1128 0xffffffff, /* dst_mask */
1129 FALSE), /* pcrel_offset */
1130
1131 /* Relax hint for conditional branch sequence. */
1132 HOWTO (R_NDS32_LONGJUMP3, /* type */
1133 0, /* rightshift */
1134 2, /* size (0 = byte, 1 = short, 2 = long) */
1135 32, /* bitsize */
1136 FALSE, /* pc_relative */
1137 0, /* bitpos */
1138 complain_overflow_dont,/* complain_on_overflow */
1139 nds32_elf_ignore_reloc,/* special_function */
1140 "R_NDS32_LONGJUMP3", /* name */
1141 FALSE, /* partial_inplace */
1142 0xffffffff, /* src_mask */
1143 0xffffffff, /* dst_mask */
1144 FALSE), /* pcrel_offset */
1145
1146 /* Relax hint for load/store sequence. */
1147 HOWTO (R_NDS32_LOADSTORE, /* type */
1148 0, /* rightshift */
1149 2, /* size (0 = byte, 1 = short, 2 = long) */
1150 32, /* bitsize */
1151 FALSE, /* pc_relative */
1152 0, /* bitpos */
1153 complain_overflow_dont,/* complain_on_overflow */
1154 nds32_elf_ignore_reloc,/* special_function */
1155 "R_NDS32_LOADSTORE", /* name */
1156 FALSE, /* partial_inplace */
1157 0xffffffff, /* src_mask */
1158 0xffffffff, /* dst_mask */
1159 FALSE), /* pcrel_offset */
1160
1161 /* Relax hint for load/store sequence. */
1162 HOWTO (R_NDS32_9_FIXED_RELA, /* type */
1163 0, /* rightshift */
1164 1, /* size (0 = byte, 1 = short, 2 = long) */
1165 16, /* bitsize */
1166 FALSE, /* pc_relative */
1167 0, /* bitpos */
1168 complain_overflow_dont,/* complain_on_overflow */
1169 nds32_elf_ignore_reloc,/* special_function */
1170 "R_NDS32_9_FIXED_RELA",/* name */
1171 FALSE, /* partial_inplace */
1172 0x000000ff, /* src_mask */
1173 0x000000ff, /* dst_mask */
1174 FALSE), /* pcrel_offset */
1175
1176 /* Relax hint for load/store sequence. */
1177 HOWTO (R_NDS32_15_FIXED_RELA, /* type */
1178 0, /* rightshift */
1179 2, /* size (0 = byte, 1 = short, 2 = long) */
1180 32, /* bitsize */
1181 FALSE, /* pc_relative */
1182 0, /* bitpos */
1183 complain_overflow_dont,/* complain_on_overflow */
1184 nds32_elf_ignore_reloc,/* special_function */
1185 "R_NDS32_15_FIXED_RELA", /* name */
1186 FALSE, /* partial_inplace */
1187 0x00003fff, /* src_mask */
1188 0x00003fff, /* dst_mask */
1189 FALSE), /* pcrel_offset */
1190
1191 /* Relax hint for load/store sequence. */
1192 HOWTO (R_NDS32_17_FIXED_RELA, /* type */
1193 0, /* rightshift */
1194 2, /* size (0 = byte, 1 = short, 2 = long) */
1195 32, /* bitsize */
1196 FALSE, /* pc_relative */
1197 0, /* bitpos */
1198 complain_overflow_dont,/* complain_on_overflow */
1199 nds32_elf_ignore_reloc,/* special_function */
1200 "R_NDS32_17_FIXED_RELA", /* name */
1201 FALSE, /* partial_inplace */
1202 0x0000ffff, /* src_mask */
1203 0x0000ffff, /* dst_mask */
1204 FALSE), /* pcrel_offset */
1205
1206 /* Relax hint for load/store sequence. */
1207 HOWTO (R_NDS32_25_FIXED_RELA, /* type */
1208 0, /* rightshift */
1209 2, /* size (0 = byte, 1 = short, 2 = long) */
1210 32, /* bitsize */
1211 FALSE, /* pc_relative */
1212 0, /* bitpos */
1213 complain_overflow_dont,/* complain_on_overflow */
1214 nds32_elf_ignore_reloc,/* special_function */
1215 "R_NDS32_25_FIXED_RELA", /* name */
1216 FALSE, /* partial_inplace */
1217 0x00ffffff, /* src_mask */
1218 0x00ffffff, /* dst_mask */
1219 FALSE), /* pcrel_offset */
1220
1221 /* High 20 bits of PLT symbol offset relative to PC. */
1222 HOWTO (R_NDS32_PLTREL_HI20, /* type */
1223 12, /* rightshift */
1224 2, /* size (0 = byte, 1 = short, 2 = long) */
1225 20, /* bitsize */
1226 FALSE, /* pc_relative */
1227 0, /* bitpos */
1228 complain_overflow_dont,/* complain_on_overflow */
1229 bfd_elf_generic_reloc, /* special_function */
1230 "R_NDS32_PLTREL_HI20", /* name */
1231 FALSE, /* partial_inplace */
1232 0x000fffff, /* src_mask */
1233 0x000fffff, /* dst_mask */
1234 FALSE), /* pcrel_offset */
1235
1236 /* Low 12 bits of PLT symbol offset relative to PC. */
1237 HOWTO (R_NDS32_PLTREL_LO12, /* type */
1238 0, /* rightshift */
1239 2, /* size (0 = byte, 1 = short, 2 = long) */
1240 12, /* bitsize */
1241 FALSE, /* pc_relative */
1242 0, /* bitpos */
1243 complain_overflow_dont,/* complain_on_overflow */
1244 bfd_elf_generic_reloc, /* special_function */
1245 "R_NDS32_PLTREL_LO12", /* name */
1246 FALSE, /* partial_inplace */
1247 0x00000fff, /* src_mask */
1248 0x00000fff, /* dst_mask */
1249 FALSE), /* pcrel_offset */
1250
1251 /* High 20 bits of PLT symbol offset relative to GOT (GP). */
1252 HOWTO (R_NDS32_PLT_GOTREL_HI20, /* type */
1253 12, /* rightshift */
1254 2, /* size (0 = byte, 1 = short, 2 = long) */
1255 20, /* bitsize */
1256 FALSE, /* pc_relative */
1257 0, /* bitpos */
1258 complain_overflow_dont,/* complain_on_overflow */
1259 bfd_elf_generic_reloc, /* special_function */
1260 "R_NDS32_PLT_GOTREL_HI20", /* name */
1261 FALSE, /* partial_inplace */
1262 0x000fffff, /* src_mask */
1263 0x000fffff, /* dst_mask */
1264 FALSE), /* pcrel_offset */
1265
1266 /* Low 12 bits of PLT symbol offset relative to GOT (GP). */
1267 HOWTO (R_NDS32_PLT_GOTREL_LO12, /* type */
1268 0, /* rightshift */
1269 2, /* size (0 = byte, 1 = short, 2 = long) */
1270 12, /* bitsize */
1271 FALSE, /* pc_relative */
1272 0, /* bitpos */
1273 complain_overflow_dont,/* complain_on_overflow */
1274 bfd_elf_generic_reloc, /* special_function */
1275 "R_NDS32_PLT_GOTREL_LO12", /* name */
1276 FALSE, /* partial_inplace */
1277 0x00000fff, /* src_mask */
1278 0x00000fff, /* dst_mask */
1279 FALSE), /* pcrel_offset */
1280
1281 /* Small data area 12 bits offset. */
1282 HOWTO (R_NDS32_SDA12S2_DP_RELA, /* type */
1283 2, /* rightshift */
1284 2, /* size (0 = byte, 1 = short, 2 = long) */
1285 12, /* bitsize */
1286 FALSE, /* pc_relative */
1287 0, /* bitpos */
1288 complain_overflow_signed, /* complain_on_overflow */
1289 bfd_elf_generic_reloc, /* special_function */
1290 "R_NDS32_SDA12S2_DP_RELA", /* name */
1291 FALSE, /* partial_inplace */
1292 0x00000fff, /* src_mask */
1293 0x00000fff, /* dst_mask */
1294 FALSE), /* pcrel_offset */
1295
1296 /* Small data area 12 bits offset. */
1297 HOWTO (R_NDS32_SDA12S2_SP_RELA, /* type */
1298 2, /* rightshift */
1299 2, /* size (0 = byte, 1 = short, 2 = long) */
1300 12, /* bitsize */
1301 FALSE, /* pc_relative */
1302 0, /* bitpos */
1303 complain_overflow_signed, /* complain_on_overflow */
1304 bfd_elf_generic_reloc, /* special_function */
1305 "R_NDS32_SDA12S2_SP_RELA", /* name */
1306 FALSE, /* partial_inplace */
1307 0x00000fff, /* src_mask */
1308 0x00000fff, /* dst_mask */
1309 FALSE), /* pcrel_offset */
1310 /* Lower 12 bits of address. */
1311
1312 HOWTO (R_NDS32_LO12S2_DP_RELA, /* type */
1313 2, /* rightshift */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1315 10, /* bitsize */
1316 FALSE, /* pc_relative */
1317 0, /* bitpos */
1318 complain_overflow_dont,/* complain_on_overflow */
1319 bfd_elf_generic_reloc, /* special_function */
1320 "R_NDS32_LO12S2_DP_RELA", /* name */
1321 FALSE, /* partial_inplace */
1322 0x000003ff, /* src_mask */
1323 0x000003ff, /* dst_mask */
1324 FALSE), /* pcrel_offset */
1325
1326 /* Lower 12 bits of address. */
1327 HOWTO (R_NDS32_LO12S2_SP_RELA,/* type */
1328 2, /* rightshift */
1329 2, /* size (0 = byte, 1 = short, 2 = long) */
1330 10, /* bitsize */
1331 FALSE, /* pc_relative */
1332 0, /* bitpos */
1333 complain_overflow_dont,/* complain_on_overflow */
1334 bfd_elf_generic_reloc, /* special_function */
1335 "R_NDS32_LO12S2_SP_RELA", /* name */
1336 FALSE, /* partial_inplace */
1337 0x000003ff, /* src_mask */
1338 0x000003ff, /* dst_mask */
1339 FALSE), /* pcrel_offset */
1340 /* Lower 12 bits of address. Special identity for or case. */
1341 HOWTO (R_NDS32_LO12S0_ORI_RELA, /* type */
1342 0, /* rightshift */
1343 2, /* size (0 = byte, 1 = short, 2 = long) */
1344 12, /* bitsize */
1345 FALSE, /* pc_relative */
1346 0, /* bitpos */
1347 complain_overflow_dont,/* complain_on_overflow */
1348 bfd_elf_generic_reloc, /* special_function */
1349 "R_NDS32_LO12S0_ORI_RELA", /* name */
1350 FALSE, /* partial_inplace */
1351 0x00000fff, /* src_mask */
1352 0x00000fff, /* dst_mask */
1353 FALSE), /* pcrel_offset */
1354 /* Small data area 19 bits offset. */
1355 HOWTO (R_NDS32_SDA16S3_RELA, /* type */
1356 3, /* rightshift */
1357 2, /* size (0 = byte, 1 = short, 2 = long) */
1358 16, /* bitsize */
1359 FALSE, /* pc_relative */
1360 0, /* bitpos */
1361 complain_overflow_signed, /* complain_on_overflow */
1362 bfd_elf_generic_reloc, /* special_function */
1363 "R_NDS32_SDA16S3_RELA",/* name */
1364 FALSE, /* partial_inplace */
1365 0x0000ffff, /* src_mask */
1366 0x0000ffff, /* dst_mask */
1367 FALSE), /* pcrel_offset */
1368
1369 /* Small data area 15 bits offset. */
1370 HOWTO (R_NDS32_SDA17S2_RELA, /* type */
1371 2, /* rightshift */
1372 2, /* size (0 = byte, 1 = short, 2 = long) */
1373 17, /* bitsize */
1374 FALSE, /* pc_relative */
1375 0, /* bitpos */
1376 complain_overflow_signed, /* complain_on_overflow */
1377 bfd_elf_generic_reloc, /* special_function */
1378 "R_NDS32_SDA17S2_RELA",/* name */
1379 FALSE, /* partial_inplace */
1380 0x0001ffff, /* src_mask */
1381 0x0001ffff, /* dst_mask */
1382 FALSE), /* pcrel_offset */
1383
1384 HOWTO (R_NDS32_SDA18S1_RELA, /* type */
1385 1, /* rightshift */
1386 2, /* size (0 = byte, 1 = short, 2 = long) */
1387 18, /* bitsize */
1388 FALSE, /* pc_relative */
1389 0, /* bitpos */
1390 complain_overflow_signed, /* complain_on_overflow */
1391 bfd_elf_generic_reloc, /* special_function */
1392 "R_NDS32_SDA18S1_RELA",/* name */
1393 FALSE, /* partial_inplace */
1394 0x0003ffff, /* src_mask */
1395 0x0003ffff, /* dst_mask */
1396 FALSE), /* pcrel_offset */
1397
1398 HOWTO (R_NDS32_SDA19S0_RELA, /* type */
1399 0, /* rightshift */
1400 2, /* size (0 = byte, 1 = short, 2 = long) */
1401 19, /* bitsize */
1402 FALSE, /* pc_relative */
1403 0, /* bitpos */
1404 complain_overflow_signed, /* complain_on_overflow */
1405 bfd_elf_generic_reloc, /* special_function */
1406 "R_NDS32_SDA19S0_RELA",/* name */
1407 FALSE, /* partial_inplace */
1408 0x0007ffff, /* src_mask */
1409 0x0007ffff, /* dst_mask */
1410 FALSE), /* pcrel_offset */
1411 HOWTO (R_NDS32_DWARF2_OP1_RELA, /* type */
1412 0, /* rightshift */
1413 0, /* size (0 = byte, 1 = short, 2 = long) */
1414 8, /* bitsize */
1415 FALSE, /* pc_relative */
1416 0, /* bitpos */
1417 complain_overflow_dont,/* complain_on_overflow */
1418 nds32_elf_ignore_reloc,/* special_function */
1419 "R_NDS32_DWARF2_OP1_RELA", /* name */
1420 FALSE, /* partial_inplace */
1421 0xff, /* src_mask */
1422 0xff, /* dst_mask */
1423 FALSE), /* pcrel_offset */
1424 HOWTO (R_NDS32_DWARF2_OP2_RELA, /* type */
1425 0, /* rightshift */
1426 1, /* size (0 = byte, 1 = short, 2 = long) */
1427 16, /* bitsize */
1428 FALSE, /* pc_relative */
1429 0, /* bitpos */
1430 complain_overflow_dont,/* complain_on_overflow */
1431 nds32_elf_ignore_reloc,/* special_function */
1432 "R_NDS32_DWARF2_OP2_RELA", /* name */
1433 FALSE, /* partial_inplace */
1434 0xffff, /* src_mask */
1435 0xffff, /* dst_mask */
1436 FALSE), /* pcrel_offset */
1437 HOWTO (R_NDS32_DWARF2_LEB_RELA, /* type */
1438 0, /* rightshift */
1439 2, /* size (0 = byte, 1 = short, 2 = long) */
1440 32, /* bitsize */
1441 FALSE, /* pc_relative */
1442 0, /* bitpos */
1443 complain_overflow_dont,/* complain_on_overflow */
1444 nds32_elf_ignore_reloc,/* special_function */
1445 "R_NDS32_DWARF2_LEB_RELA", /* name */
1446 FALSE, /* partial_inplace */
1447 0xffffffff, /* src_mask */
1448 0xffffffff, /* dst_mask */
1449 FALSE), /* pcrel_offset */
1450 HOWTO (R_NDS32_UPDATE_TA_RELA,/* type */
1451 0, /* rightshift */
1452 1, /* size (0 = byte, 1 = short, 2 = long) */
1453 16, /* bitsize */
1454 FALSE, /* pc_relative */
1455 0, /* bitpos */
1456 complain_overflow_dont,/* complain_on_overflow */
1457 nds32_elf_ignore_reloc,/* special_function */
1458 "R_NDS32_UPDATE_TA_RELA", /* name */
1459 FALSE, /* partial_inplace */
1460 0xffff, /* src_mask */
1461 0xffff, /* dst_mask */
1462 FALSE), /* pcrel_offset */
1463 /* Like R_NDS32_PCREL, but referring to the procedure linkage table
1464 entry for the symbol. */
1465 HOWTO (R_NDS32_9_PLTREL, /* type */
1466 1, /* rightshift */
1467 1, /* size (0 = byte, 1 = short, 2 = long) */
1468 8, /* bitsize */
1469 TRUE, /* pc_relative */
1470 0, /* bitpos */
1471 complain_overflow_signed, /* complain_on_overflow */
1472 bfd_elf_generic_reloc, /* special_function */
1473 "R_NDS32_9_PLTREL", /* name */
1474 FALSE, /* partial_inplace */
1475 0xff, /* src_mask */
1476 0xff, /* dst_mask */
1477 TRUE), /* pcrel_offset */
1478 /* Low 20 bits of PLT symbol offset relative to GOT (GP). */
1479 HOWTO (R_NDS32_PLT_GOTREL_LO20, /* type */
1480 0, /* rightshift */
1481 2, /* size (0 = byte, 1 = short, 2 = long) */
1482 20, /* bitsize */
1483 FALSE, /* pc_relative */
1484 0, /* bitpos */
1485 complain_overflow_dont,/* complain_on_overflow */
1486 bfd_elf_generic_reloc, /* special_function */
1487 "R_NDS32_PLT_GOTREL_LO20", /* name */
1488 FALSE, /* partial_inplace */
1489 0x000fffff, /* src_mask */
1490 0x000fffff, /* dst_mask */
1491 FALSE), /* pcrel_offset */
1492 /* low 15 bits of PLT symbol offset relative to GOT (GP) */
1493 HOWTO (R_NDS32_PLT_GOTREL_LO15, /* type */
1494 0, /* rightshift */
1495 2, /* size (0 = byte, 1 = short, 2 = long) */
1496 15, /* bitsize */
1497 FALSE, /* pc_relative */
1498 0, /* bitpos */
1499 complain_overflow_dont,/* complain_on_overflow */
1500 bfd_elf_generic_reloc, /* special_function */
1501 "R_NDS32_PLT_GOTREL_LO15", /* name */
1502 FALSE, /* partial_inplace */
1503 0x00007fff, /* src_mask */
1504 0x00007fff, /* dst_mask */
1505 FALSE), /* pcrel_offset */
1506 /* Low 19 bits of PLT symbol offset relative to GOT (GP). */
1507 HOWTO (R_NDS32_PLT_GOTREL_LO19, /* type */
1508 0, /* rightshift */
1509 2, /* size (0 = byte, 1 = short, 2 = long) */
1510 19, /* bitsize */
1511 FALSE, /* pc_relative */
1512 0, /* bitpos */
1513 complain_overflow_dont,/* complain_on_overflow */
1514 bfd_elf_generic_reloc, /* special_function */
1515 "R_NDS32_PLT_GOTREL_LO19", /* name */
1516 FALSE, /* partial_inplace */
1517 0x0007ffff, /* src_mask */
1518 0x0007ffff, /* dst_mask */
1519 FALSE), /* pcrel_offset */
1520 HOWTO (R_NDS32_GOT_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_GOT_LO15", /* name */
1529 FALSE, /* partial_inplace */
1530 0x00007fff, /* src_mask */
1531 0x00007fff, /* dst_mask */
1532 FALSE), /* pcrel_offset */
1533 HOWTO (R_NDS32_GOT_LO19, /* type */
1534 0, /* rightshift */
1535 2, /* size (0 = byte, 1 = short, 2 = long) */
1536 19, /* bitsize */
1537 FALSE, /* pc_relative */
1538 0, /* bitpos */
1539 complain_overflow_dont,/* complain_on_overflow */
1540 bfd_elf_generic_reloc, /* special_function */
1541 "R_NDS32_GOT_LO19", /* name */
1542 FALSE, /* partial_inplace */
1543 0x0007ffff, /* src_mask */
1544 0x0007ffff, /* dst_mask */
1545 FALSE), /* pcrel_offset */
1546 HOWTO (R_NDS32_GOTOFF_LO15, /* type */
1547 0, /* rightshift */
1548 2, /* size (0 = byte, 1 = short, 2 = long) */
1549 15, /* bitsize */
1550 FALSE, /* pc_relative */
1551 0, /* bitpos */
1552 complain_overflow_dont,/* complain_on_overflow */
1553 bfd_elf_generic_reloc, /* special_function */
1554 "R_NDS32_GOTOFF_LO15", /* name */
1555 FALSE, /* partial_inplace */
1556 0x00007fff, /* src_mask */
1557 0x00007fff, /* dst_mask */
1558 FALSE), /* pcrel_offset */
1559 HOWTO (R_NDS32_GOTOFF_LO19, /* type */
1560 0, /* rightshift */
1561 2, /* size (0 = byte, 1 = short, 2 = long) */
1562 19, /* bitsize */
1563 FALSE, /* pc_relative */
1564 0, /* bitpos */
1565 complain_overflow_dont,/* complain_on_overflow */
1566 bfd_elf_generic_reloc, /* special_function */
1567 "R_NDS32_GOTOFF_LO19", /* name */
1568 FALSE, /* partial_inplace */
1569 0x0007ffff, /* src_mask */
1570 0x0007ffff, /* dst_mask */
1571 FALSE), /* pcrel_offset */
1572 /* GOT 15 bits offset. */
1573 HOWTO (R_NDS32_GOT15S2_RELA, /* type */
1574 2, /* rightshift */
1575 2, /* size (0 = byte, 1 = short, 2 = long) */
1576 15, /* bitsize */
1577 FALSE, /* pc_relative */
1578 0, /* bitpos */
1579 complain_overflow_signed, /* complain_on_overflow */
1580 bfd_elf_generic_reloc, /* special_function */
1581 "R_NDS32_GOT15S2_RELA",/* name */
1582 FALSE, /* partial_inplace */
1583 0x00007fff, /* src_mask */
1584 0x00007fff, /* dst_mask */
1585 FALSE), /* pcrel_offset */
1586 /* GOT 17 bits offset. */
1587 HOWTO (R_NDS32_GOT17S2_RELA, /* type */
1588 2, /* rightshift */
1589 2, /* size (0 = byte, 1 = short, 2 = long) */
1590 17, /* bitsize */
1591 FALSE, /* pc_relative */
1592 0, /* bitpos */
1593 complain_overflow_signed, /* complain_on_overflow */
1594 bfd_elf_generic_reloc, /* special_function */
1595 "R_NDS32_GOT17S2_RELA",/* name */
1596 FALSE, /* partial_inplace */
1597 0x0001ffff, /* src_mask */
1598 0x0001ffff, /* dst_mask */
1599 FALSE), /* pcrel_offset */
1600 /* A 5 bit address. */
1601 HOWTO (R_NDS32_5_RELA, /* type */
1602 0, /* rightshift */
1603 1, /* size (0 = byte, 1 = short, 2 = long) */
1604 5, /* bitsize */
1605 FALSE, /* pc_relative */
1606 0, /* bitpos */
1607 complain_overflow_signed, /* complain_on_overflow */
1608 bfd_elf_generic_reloc, /* special_function */
1609 "R_NDS32_5_RELA", /* name */
1610 FALSE, /* partial_inplace */
1611 0x1f, /* src_mask */
1612 0x1f, /* dst_mask */
1613 FALSE), /* pcrel_offset */
1614 HOWTO (R_NDS32_10_UPCREL_RELA,/* type */
1615 1, /* rightshift */
1616 1, /* size (0 = byte, 1 = short, 2 = long) */
1617 9, /* bitsize */
1618 TRUE, /* pc_relative */
1619 0, /* bitpos */
1620 complain_overflow_unsigned, /* complain_on_overflow */
1621 bfd_elf_generic_reloc, /* special_function */
1622 "R_NDS32_10_UPCREL_RELA", /* name */
1623 FALSE, /* partial_inplace */
1624 0x1ff, /* src_mask */
1625 0x1ff, /* dst_mask */
1626 TRUE), /* pcrel_offset */
1627 HOWTO (R_NDS32_SDA_FP7U2_RELA,/* type */
1628 2, /* rightshift */
1629 1, /* size (0 = byte, 1 = short, 2 = long) */
1630 7, /* bitsize */
1631 FALSE, /* pc_relative */
1632 0, /* bitpos */
1633 complain_overflow_unsigned, /* complain_on_overflow */
1634 bfd_elf_generic_reloc, /* special_function */
1635 "R_NDS32_SDA_FP7U2_RELA", /* name */
1636 FALSE, /* partial_inplace */
1637 0x0000007f, /* src_mask */
1638 0x0000007f, /* dst_mask */
1639 FALSE), /* pcrel_offset */
1640 HOWTO (R_NDS32_WORD_9_PCREL_RELA, /* type */
1641 1, /* rightshift */
1642 2, /* size (0 = byte, 1 = short, 2 = long) */
1643 8, /* bitsize */
1644 TRUE, /* pc_relative */
1645 0, /* bitpos */
1646 complain_overflow_signed, /* complain_on_overflow */
1647 bfd_elf_generic_reloc, /* special_function */
1648 "R_NDS32_WORD_9_PCREL_RELA", /* name */
1649 FALSE, /* partial_inplace */
1650 0xff, /* src_mask */
1651 0xff, /* dst_mask */
1652 TRUE), /* pcrel_offset */
1653 HOWTO (R_NDS32_25_ABS_RELA, /* type */
1654 1, /* rightshift */
1655 2, /* size (0 = byte, 1 = short, 2 = long) */
1656 24, /* bitsize */
1657 FALSE, /* pc_relative */
1658 0, /* bitpos */
1659 complain_overflow_dont,/* complain_on_overflow */
1660 bfd_elf_generic_reloc, /* special_function */
1661 "R_NDS32_25_ABS_RELA", /* name */
1662 FALSE, /* partial_inplace */
1663 0xffffff, /* src_mask */
1664 0xffffff, /* dst_mask */
1665 FALSE), /* pcrel_offset */
1666
1667 /* A relative 17 bit relocation for ifc, right shifted by 1. */
1668 HOWTO (R_NDS32_17IFC_PCREL_RELA, /* type */
1669 1, /* rightshift */
1670 2, /* size (0 = byte, 1 = short, 2 = long) */
1671 16, /* bitsize */
1672 TRUE, /* pc_relative */
1673 0, /* bitpos */
1674 complain_overflow_signed, /* complain_on_overflow */
1675 bfd_elf_generic_reloc, /* special_function */
1676 "R_NDS32_17IFC_PCREL_RELA", /* name */
1677 FALSE, /* partial_inplace */
1678 0xffff, /* src_mask */
1679 0xffff, /* dst_mask */
1680 TRUE), /* pcrel_offset */
1681
1682 /* A relative unsigned 10 bit relocation for ifc, right shifted by 1. */
1683 HOWTO (R_NDS32_10IFCU_PCREL_RELA, /* type */
1684 1, /* rightshift */
1685 1, /* size (0 = byte, 1 = short, 2 = long) */
1686 9, /* bitsize */
1687 TRUE, /* pc_relative */
1688 0, /* bitpos */
1689 complain_overflow_unsigned, /* complain_on_overflow */
1690 bfd_elf_generic_reloc, /* special_function */
1691 "R_NDS32_10IFCU_PCREL_RELA", /* name */
1692 FALSE, /* partial_inplace */
1693 0x1ff, /* src_mask */
1694 0x1ff, /* dst_mask */
1695 TRUE), /* pcrel_offset */
1696
1697 /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol. */
1698 HOWTO (R_NDS32_TLS_LE_HI20, /* type */
1699 12, /* rightshift */
1700 2, /* size (0 = byte, 1 = short, 2 = long) */
1701 20, /* bitsize */
1702 FALSE, /* pc_relative */
1703 0, /* bitpos */
1704 complain_overflow_dont, /* complain_on_overflow */
1705 bfd_elf_generic_reloc, /* special_function */
1706 "R_NDS32_TLS_LE_HI20", /* name */
1707 FALSE, /* partial_inplace */
1708 0x000fffff, /* src_mask */
1709 0x000fffff, /* dst_mask */
1710 FALSE), /* pcrel_offset */
1711 HOWTO (R_NDS32_TLS_LE_LO12, /* type */
1712 0, /* rightshift */
1713 2, /* size (0 = byte, 1 = short, 2 = long) */
1714 12, /* bitsize */
1715 FALSE, /* pc_relative */
1716 0, /* bitpos */
1717 complain_overflow_dont, /* complain_on_overflow */
1718 bfd_elf_generic_reloc, /* special_function */
1719 "R_NDS32_TLS_LE_LO12", /* name */
1720 FALSE, /* partial_inplace */
1721 0x00000fff, /* src_mask */
1722 0x00000fff, /* dst_mask */
1723 FALSE), /* pcrel_offset */
1724
1725 /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol. */
1726 HOWTO (R_NDS32_TLS_IE_HI20, /* type */
1727 12, /* rightshift */
1728 2, /* size (0 = byte, 1 = short, 2 = long) */
1729 20, /* bitsize */
1730 FALSE, /* pc_relative */
1731 0, /* bitpos */
1732 complain_overflow_dont, /* complain_on_overflow */
1733 bfd_elf_generic_reloc, /* special_function */
1734 "R_NDS32_TLS_IE_HI20", /* name */
1735 FALSE, /* partial_inplace */
1736 0x000fffff, /* src_mask */
1737 0x000fffff, /* dst_mask */
1738 FALSE), /* pcrel_offset */
1739 HOWTO (R_NDS32_TLS_IE_LO12S2, /* type */
1740 2, /* rightshift */
1741 2, /* size (0 = byte, 1 = short, 2 = long) */
1742 10, /* 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_IE_LO12S2", /* name */
1748 FALSE, /* partial_inplace */
1749 0x000003ff, /* src_mask */
1750 0x000003ff, /* dst_mask */
1751 FALSE), /* pcrel_offset */
1752 /* Mark a TLS IE entry in GOT. */
1753 HOWTO (R_NDS32_TLS_TPOFF, /* type */
1754 0, /* rightshift */
1755 2, /* size (0 = byte, 1 = short, 2 = long) */
1756 32, /* bitsize */
1757 FALSE, /* pc_relative */
1758 0, /* bitpos */
1759 complain_overflow_bitfield, /* complain_on_overflow */
1760 bfd_elf_generic_reloc, /* special_function */
1761 "R_NDS32_TLS_TPOFF", /* name */
1762 FALSE, /* partial_inplace */
1763 0xffffffff, /* src_mask */
1764 0xffffffff, /* dst_mask */
1765 FALSE), /* pcrel_offset */
1766 /* A 20 bit address. */
1767 HOWTO (R_NDS32_TLS_LE_20, /* type */
1768 0, /* rightshift */
1769 2, /* size (0 = byte, 1 = short, 2 = long) */
1770 20, /* bitsize */
1771 FALSE, /* pc_relative */
1772 0, /* bitpos */
1773 complain_overflow_signed, /* complain_on_overflow */
1774 bfd_elf_generic_reloc, /* special_function */
1775 "R_NDS32_TLS_LE_20", /* name */
1776 FALSE, /* partial_inplace */
1777 0xfffff, /* src_mask */
1778 0xfffff, /* dst_mask */
1779 FALSE), /* pcrel_offset */
1780 HOWTO (R_NDS32_TLS_LE_15S0, /* type */
1781 0, /* rightshift */
1782 2, /* size (0 = byte, 1 = short, 2 = long) */
1783 15, /* bitsize */
1784 FALSE, /* pc_relative */
1785 0, /* bitpos */
1786 complain_overflow_signed, /* complain_on_overflow */
1787 bfd_elf_generic_reloc, /* special_function */
1788 "R_NDS32_TLS_LE_15S0", /* name */
1789 FALSE, /* partial_inplace */
1790 0x7fff, /* src_mask */
1791 0x7fff, /* dst_mask */
1792 FALSE), /* pcrel_offset */
1793 HOWTO (R_NDS32_TLS_LE_15S1, /* type */
1794 1, /* rightshift */
1795 2, /* size (0 = byte, 1 = short, 2 = long) */
1796 15, /* bitsize */
1797 FALSE, /* pc_relative */
1798 0, /* bitpos */
1799 complain_overflow_signed, /* complain_on_overflow */
1800 bfd_elf_generic_reloc, /* special_function */
1801 "R_NDS32_TLS_LE_15S1", /* name */
1802 FALSE, /* partial_inplace */
1803 0x7fff, /* src_mask */
1804 0x7fff, /* dst_mask */
1805 FALSE), /* pcrel_offset */
1806 HOWTO (R_NDS32_TLS_LE_15S2, /* type */
1807 2, /* rightshift */
1808 2, /* size (0 = byte, 1 = short, 2 = long) */
1809 15, /* bitsize */
1810 FALSE, /* pc_relative */
1811 0, /* bitpos */
1812 complain_overflow_signed, /* complain_on_overflow */
1813 bfd_elf_generic_reloc, /* special_function */
1814 "R_NDS32_TLS_LE_15S2", /* name */
1815 FALSE, /* partial_inplace */
1816 0x7fff, /* src_mask */
1817 0x7fff, /* dst_mask */
1818 FALSE), /* pcrel_offset */
1819
1820 /* Relax hint for unconditional call sequence */
1821 HOWTO (R_NDS32_LONGCALL4, /* type */
1822 0, /* rightshift */
1823 2, /* size (0 = byte, 1 = short, 2 = long) */
1824 32, /* bitsize */
1825 FALSE, /* pc_relative */
1826 0, /* bitpos */
1827 complain_overflow_dont, /* complain_on_overflow */
1828 nds32_elf_ignore_reloc, /* special_function */
1829 "R_NDS32_LONGCALL4", /* name */
1830 FALSE, /* partial_inplace */
1831 0xffffffff, /* src_mask */
1832 0xffffffff, /* dst_mask */
1833 FALSE), /* pcrel_offset */
1834
1835 /* Relax hint for conditional call sequence. */
1836 HOWTO (R_NDS32_LONGCALL5, /* type */
1837 0, /* rightshift */
1838 2, /* size (0 = byte, 1 = short, 2 = long) */
1839 32, /* bitsize */
1840 FALSE, /* pc_relative */
1841 0, /* bitpos */
1842 complain_overflow_dont, /* complain_on_overflow */
1843 nds32_elf_ignore_reloc, /* special_function */
1844 "R_NDS32_LONGCALL5", /* name */
1845 FALSE, /* partial_inplace */
1846 0xffffffff, /* src_mask */
1847 0xffffffff, /* dst_mask */
1848 FALSE), /* pcrel_offset */
1849
1850 /* Relax hint for conditional call sequence. */
1851 HOWTO (R_NDS32_LONGCALL6, /* type */
1852 0, /* rightshift */
1853 2, /* size (0 = byte, 1 = short, 2 = long) */
1854 32, /* bitsize */
1855 FALSE, /* pc_relative */
1856 0, /* bitpos */
1857 complain_overflow_dont, /* complain_on_overflow */
1858 nds32_elf_ignore_reloc, /* special_function */
1859 "R_NDS32_LONGCALL6", /* name */
1860 FALSE, /* partial_inplace */
1861 0xffffffff, /* src_mask */
1862 0xffffffff, /* dst_mask */
1863 FALSE), /* pcrel_offset */
1864
1865 /* Relax hint for unconditional branch sequence. */
1866 HOWTO (R_NDS32_LONGJUMP4, /* type */
1867 0, /* rightshift */
1868 2, /* size (0 = byte, 1 = short, 2 = long) */
1869 32, /* bitsize */
1870 FALSE, /* pc_relative */
1871 0, /* bitpos */
1872 complain_overflow_dont, /* complain_on_overflow */
1873 nds32_elf_ignore_reloc, /* special_function */
1874 "R_NDS32_LONGJUMP4", /* name */
1875 FALSE, /* partial_inplace */
1876 0xffffffff, /* src_mask */
1877 0xffffffff, /* dst_mask */
1878 FALSE), /* pcrel_offset */
1879
1880 /* Relax hint for conditional branch sequence. */
1881 HOWTO (R_NDS32_LONGJUMP5, /* type */
1882 0, /* rightshift */
1883 2, /* size (0 = byte, 1 = short, 2 = long) */
1884 32, /* bitsize */
1885 FALSE, /* pc_relative */
1886 0, /* bitpos */
1887 complain_overflow_dont, /* complain_on_overflow */
1888 nds32_elf_ignore_reloc, /* special_function */
1889 "R_NDS32_LONGJUMP5", /* name */
1890 FALSE, /* partial_inplace */
1891 0xffffffff, /* src_mask */
1892 0xffffffff, /* dst_mask */
1893 FALSE), /* pcrel_offset */
1894
1895 /* Relax hint for conditional branch sequence. */
1896 HOWTO (R_NDS32_LONGJUMP6, /* type */
1897 0, /* rightshift */
1898 2, /* size (0 = byte, 1 = short, 2 = long) */
1899 32, /* bitsize */
1900 FALSE, /* pc_relative */
1901 0, /* bitpos */
1902 complain_overflow_dont, /* complain_on_overflow */
1903 nds32_elf_ignore_reloc, /* special_function */
1904 "R_NDS32_LONGJUMP6", /* name */
1905 FALSE, /* partial_inplace */
1906 0xffffffff, /* src_mask */
1907 0xffffffff, /* dst_mask */
1908 FALSE), /* pcrel_offset */
1909
1910 /* Relax hint for conditional branch sequence. */
1911 HOWTO (R_NDS32_LONGJUMP7, /* type */
1912 0, /* rightshift */
1913 2, /* size (0 = byte, 1 = short, 2 = long) */
1914 32, /* bitsize */
1915 FALSE, /* pc_relative */
1916 0, /* bitpos */
1917 complain_overflow_dont, /* complain_on_overflow */
1918 nds32_elf_ignore_reloc, /* special_function */
1919 "R_NDS32_LONGJUMP7", /* name */
1920 FALSE, /* partial_inplace */
1921 0xffffffff, /* src_mask */
1922 0xffffffff, /* dst_mask */
1923 FALSE), /* pcrel_offset */
1924 };
1925
1926 /* Relocations used for relaxation. */
1927 static reloc_howto_type nds32_elf_relax_howto_table[] =
1928 {
1929 HOWTO (R_NDS32_RELAX_ENTRY, /* type */
1930 0, /* rightshift */
1931 2, /* size (0 = byte, 1 = short, 2 = long) */
1932 32, /* bitsize */
1933 FALSE, /* pc_relative */
1934 0, /* bitpos */
1935 complain_overflow_dont,/* complain_on_overflow */
1936 nds32_elf_ignore_reloc,/* special_function */
1937 "R_NDS32_RELAX_ENTRY", /* name */
1938 FALSE, /* partial_inplace */
1939 0xffffffff, /* src_mask */
1940 0xffffffff, /* dst_mask */
1941 FALSE), /* pcrel_offset */
1942 HOWTO (R_NDS32_GOT_SUFF, /* type */
1943 0, /* rightshift */
1944 2, /* size (0 = byte, 1 = short, 2 = long) */
1945 32, /* bitsize */
1946 FALSE, /* pc_relative */
1947 0, /* bitpos */
1948 complain_overflow_dont,/* complain_on_overflow */
1949 nds32_elf_ignore_reloc,/* special_function */
1950 "R_NDS32_GOT_SUFF", /* name */
1951 FALSE, /* partial_inplace */
1952 0xffffffff, /* src_mask */
1953 0xffffffff, /* dst_mask */
1954 FALSE), /* pcrel_offset */
1955 HOWTO (R_NDS32_GOTOFF_SUFF, /* type */
1956 0, /* rightshift */
1957 2, /* size (0 = byte, 1 = short, 2 = long) */
1958 32, /* bitsize */
1959 FALSE, /* pc_relative */
1960 0, /* bitpos */
1961 complain_overflow_bitfield, /* complain_on_overflow */
1962 nds32_elf_ignore_reloc,/* special_function */
1963 "R_NDS32_GOTOFF_SUFF", /* name */
1964 FALSE, /* partial_inplace */
1965 0xffffffff, /* src_mask */
1966 0xffffffff, /* dst_mask */
1967 FALSE), /* pcrel_offset */
1968 HOWTO (R_NDS32_PLT_GOT_SUFF, /* type */
1969 0, /* rightshift */
1970 2, /* size (0 = byte, 1 = short, 2 = long) */
1971 32, /* bitsize */
1972 FALSE, /* pc_relative */
1973 0, /* bitpos */
1974 complain_overflow_dont,/* complain_on_overflow */
1975 nds32_elf_ignore_reloc,/* special_function */
1976 "R_NDS32_PLT_GOT_SUFF",/* name */
1977 FALSE, /* partial_inplace */
1978 0xffffffff, /* src_mask */
1979 0xffffffff, /* dst_mask */
1980 FALSE), /* pcrel_offset */
1981 HOWTO (R_NDS32_MULCALL_SUFF, /* type */
1982 0, /* rightshift */
1983 2, /* size (0 = byte, 1 = short, 2 = long) */
1984 32, /* bitsize */
1985 FALSE, /* pc_relative */
1986 0, /* bitpos */
1987 complain_overflow_dont,/* complain_on_overflow */
1988 nds32_elf_ignore_reloc,/* special_function */
1989 "R_NDS32_MULCALL_SUFF",/* name */
1990 FALSE, /* partial_inplace */
1991 0xffffffff, /* src_mask */
1992 0xffffffff, /* dst_mask */
1993 FALSE), /* pcrel_offset */
1994 HOWTO (R_NDS32_PTR, /* type */
1995 0, /* rightshift */
1996 2, /* size (0 = byte, 1 = short, 2 = long) */
1997 32, /* bitsize */
1998 FALSE, /* pc_relative */
1999 0, /* bitpos */
2000 complain_overflow_dont,/* complain_on_overflow */
2001 nds32_elf_ignore_reloc,/* special_function */
2002 "R_NDS32_PTR", /* name */
2003 FALSE, /* partial_inplace */
2004 0xffffffff, /* src_mask */
2005 0xffffffff, /* dst_mask */
2006 FALSE), /* pcrel_offset */
2007 HOWTO (R_NDS32_PTR_COUNT, /* type */
2008 0, /* rightshift */
2009 2, /* size (0 = byte, 1 = short, 2 = long) */
2010 32, /* bitsize */
2011 FALSE, /* pc_relative */
2012 0, /* bitpos */
2013 complain_overflow_dont,/* complain_on_overflow */
2014 nds32_elf_ignore_reloc,/* special_function */
2015 "R_NDS32_PTR_COUNT", /* name */
2016 FALSE, /* partial_inplace */
2017 0xffffffff, /* src_mask */
2018 0xffffffff, /* dst_mask */
2019 FALSE), /* pcrel_offset */
2020 HOWTO (R_NDS32_PTR_RESOLVED, /* type */
2021 0, /* rightshift */
2022 2, /* size (0 = byte, 1 = short, 2 = long) */
2023 32, /* bitsize */
2024 FALSE, /* pc_relative */
2025 0, /* bitpos */
2026 complain_overflow_dont,/* complain_on_overflow */
2027 nds32_elf_ignore_reloc,/* special_function */
2028 "R_NDS32_PTR_RESOLVED",/* name */
2029 FALSE, /* partial_inplace */
2030 0xffffffff, /* src_mask */
2031 0xffffffff, /* dst_mask */
2032 FALSE), /* pcrel_offset */
2033 HOWTO (R_NDS32_PLTBLOCK, /* type */
2034 0, /* rightshift */
2035 2, /* size (0 = byte, 1 = short, 2 = long) */
2036 32, /* bitsize */
2037 FALSE, /* pc_relative */
2038 0, /* bitpos */
2039 complain_overflow_dont,/* complain_on_overflow */
2040 nds32_elf_ignore_reloc,/* special_function */
2041 "R_NDS32_PLTBLOCK", /* name */
2042 FALSE, /* partial_inplace */
2043 0xffffffff, /* src_mask */
2044 0xffffffff, /* dst_mask */
2045 FALSE), /* pcrel_offset */
2046 HOWTO (R_NDS32_RELAX_REGION_BEGIN, /* type */
2047 0, /* rightshift */
2048 2, /* size (0 = byte, 1 = short, 2 = long) */
2049 32, /* bitsize */
2050 FALSE, /* pc_relative */
2051 0, /* bitpos */
2052 complain_overflow_dont,/* complain_on_overflow */
2053 nds32_elf_ignore_reloc,/* special_function */
2054 "R_NDS32_RELAX_REGION_BEGIN", /* name */
2055 FALSE, /* partial_inplace */
2056 0xffffffff, /* src_mask */
2057 0xffffffff, /* dst_mask */
2058 FALSE), /* pcrel_offset */
2059 HOWTO (R_NDS32_RELAX_REGION_END, /* type */
2060 0, /* rightshift */
2061 2, /* size (0 = byte, 1 = short, 2 = long) */
2062 32, /* bitsize */
2063 FALSE, /* pc_relative */
2064 0, /* bitpos */
2065 complain_overflow_dont,/* complain_on_overflow */
2066 nds32_elf_ignore_reloc,/* special_function */
2067 "R_NDS32_RELAX_REGION_END", /* name */
2068 FALSE, /* partial_inplace */
2069 0xffffffff, /* src_mask */
2070 0xffffffff, /* dst_mask */
2071 FALSE), /* pcrel_offset */
2072 HOWTO (R_NDS32_MINUEND, /* type */
2073 0, /* rightshift */
2074 2, /* size (0 = byte, 1 = short, 2 = long) */
2075 32, /* bitsize */
2076 FALSE, /* pc_relative */
2077 0, /* bitpos */
2078 complain_overflow_dont,/* complain_on_overflow */
2079 nds32_elf_ignore_reloc,/* special_function */
2080 "R_NDS32_MINUEND", /* name */
2081 FALSE, /* partial_inplace */
2082 0xffffffff, /* src_mask */
2083 0xffffffff, /* dst_mask */
2084 FALSE), /* pcrel_offset */
2085 HOWTO (R_NDS32_SUBTRAHEND, /* type */
2086 0, /* rightshift */
2087 2, /* size (0 = byte, 1 = short, 2 = long) */
2088 32, /* bitsize */
2089 FALSE, /* pc_relative */
2090 0, /* bitpos */
2091 complain_overflow_dont,/* complain_on_overflow */
2092 nds32_elf_ignore_reloc,/* special_function */
2093 "R_NDS32_SUBTRAHEND", /* name */
2094 FALSE, /* partial_inplace */
2095 0xffffffff, /* src_mask */
2096 0xffffffff, /* dst_mask */
2097 FALSE), /* pcrel_offset */
2098 HOWTO (R_NDS32_DIFF8, /* type */
2099 0, /* rightshift */
2100 0, /* size (0 = byte, 1 = short, 2 = long) */
2101 8, /* bitsize */
2102 FALSE, /* pc_relative */
2103 0, /* bitpos */
2104 complain_overflow_dont,/* complain_on_overflow */
2105 nds32_elf_ignore_reloc,/* special_function */
2106 "R_NDS32_DIFF8", /* name */
2107 FALSE, /* partial_inplace */
2108 0x000000ff, /* src_mask */
2109 0x000000ff, /* dst_mask */
2110 FALSE), /* pcrel_offset */
2111 HOWTO (R_NDS32_DIFF16, /* type */
2112 0, /* rightshift */
2113 1, /* size (0 = byte, 1 = short, 2 = long) */
2114 16, /* bitsize */
2115 FALSE, /* pc_relative */
2116 0, /* bitpos */
2117 complain_overflow_dont,/* complain_on_overflow */
2118 nds32_elf_ignore_reloc,/* special_function */
2119 "R_NDS32_DIFF16", /* name */
2120 FALSE, /* partial_inplace */
2121 0x0000ffff, /* src_mask */
2122 0x0000ffff, /* dst_mask */
2123 FALSE), /* pcrel_offset */
2124 HOWTO (R_NDS32_DIFF32, /* type */
2125 0, /* rightshift */
2126 2, /* size (0 = byte, 1 = short, 2 = long) */
2127 32, /* bitsize */
2128 FALSE, /* pc_relative */
2129 0, /* bitpos */
2130 complain_overflow_dont,/* complain_on_overflow */
2131 nds32_elf_ignore_reloc,/* special_function */
2132 "R_NDS32_DIFF32", /* name */
2133 FALSE, /* partial_inplace */
2134 0xffffffff, /* src_mask */
2135 0xffffffff, /* dst_mask */
2136 FALSE), /* pcrel_offset */
2137 HOWTO (R_NDS32_DIFF_ULEB128, /* type */
2138 0, /* rightshift */
2139 0, /* size (0 = byte, 1 = short, 2 = long) */
2140 0, /* bitsize */
2141 FALSE, /* pc_relative */
2142 0, /* bitpos */
2143 complain_overflow_dont,/* complain_on_overflow */
2144 nds32_elf_ignore_reloc,/* special_function */
2145 "R_NDS32_DIFF_ULEB128",/* name */
2146 FALSE, /* partial_inplace */
2147 0xffffffff, /* src_mask */
2148 0xffffffff, /* dst_mask */
2149 FALSE), /* pcrel_offset */
2150 HOWTO (R_NDS32_DATA, /* type */
2151 0, /* rightshift */
2152 2, /* size (0 = byte, 1 = short, 2 = long) */
2153 32, /* bitsize */
2154 FALSE, /* pc_relative */
2155 0, /* bitpos */
2156 complain_overflow_dont,/* complain_on_overflow */
2157 nds32_elf_ignore_reloc,/* special_function */
2158 "R_NDS32_DATA", /* name */
2159 FALSE, /* partial_inplace */
2160 0xffffffff, /* src_mask */
2161 0xffffffff, /* dst_mask */
2162 FALSE), /* pcrel_offset */
2163 HOWTO (R_NDS32_TRAN, /* type */
2164 0, /* rightshift */
2165 2, /* size (0 = byte, 1 = short, 2 = long) */
2166 32, /* bitsize */
2167 FALSE, /* pc_relative */
2168 0, /* bitpos */
2169 complain_overflow_dont,/* complain_on_overflow */
2170 nds32_elf_ignore_reloc,/* special_function */
2171 "R_NDS32_TRAN", /* name */
2172 FALSE, /* partial_inplace */
2173 0xffffffff, /* src_mask */
2174 0xffffffff, /* dst_mask */
2175 FALSE), /* pcrel_offset */
2176 HOWTO (R_NDS32_TLS_LE_ADD, /* type */
2177 0, /* rightshift */
2178 2, /* size (0 = byte, 1 = short, 2 = long) */
2179 32, /* bitsize */
2180 FALSE, /* pc_relative */
2181 0, /* bitpos */
2182 complain_overflow_dont, /* complain_on_overflow */
2183 nds32_elf_ignore_reloc, /* special_function */
2184 "R_NDS32_TLS_LE_ADD", /* name */
2185 FALSE, /* partial_inplace */
2186 0xffffffff, /* src_mask */
2187 0xffffffff, /* dst_mask */
2188 FALSE), /* pcrel_offset */
2189 HOWTO (R_NDS32_TLS_LE_LS, /* type */
2190 0, /* rightshift */
2191 2, /* size (0 = byte, 1 = short, 2 = long) */
2192 32, /* bitsize */
2193 FALSE, /* pc_relative */
2194 0, /* bitpos */
2195 complain_overflow_dont, /* complain_on_overflow */
2196 nds32_elf_ignore_reloc, /* special_function */
2197 "R_NDS32_TLS_LE_LS", /* name */
2198 FALSE, /* partial_inplace */
2199 0xffffffff, /* src_mask */
2200 0xffffffff, /* dst_mask */
2201 FALSE), /* pcrel_offset */
2202 HOWTO (R_NDS32_EMPTY, /* type */
2203 0, /* rightshift */
2204 2, /* size (0 = byte, 1 = short, 2 = long) */
2205 32, /* bitsize */
2206 FALSE, /* pc_relative */
2207 0, /* bitpos */
2208 complain_overflow_dont, /* complain_on_overflow */
2209 nds32_elf_ignore_reloc, /* special_function */
2210 "R_NDS32_EMPTY", /* name */
2211 FALSE, /* partial_inplace */
2212 0xffffffff, /* src_mask */
2213 0xffffffff, /* dst_mask */
2214 FALSE), /* pcrel_offset */
2215 };
2216
2217 \f
2218 /* nds32_insertion_sort sorts an array with nmemb elements of size size.
2219 This prototype is the same as qsort (). */
2220
2221 void
2222 nds32_insertion_sort (void *base, size_t nmemb, size_t size,
2223 int (*compar) (const void *lhs, const void *rhs))
2224 {
2225 char *ptr = (char *) base;
2226 int i, j;
2227 char *tmp = xmalloc (size);
2228
2229 /* If i is less than j, i is inserted before j.
2230
2231 |---- j ----- i --------------|
2232 \ / \ /
2233 sorted unsorted
2234 */
2235
2236 for (i = 1; i < (int) nmemb; i++)
2237 {
2238 for (j = (i - 1); j >= 0; j--)
2239 if (compar (ptr + i * size, ptr + j * size) >= 0)
2240 break;
2241
2242 j++;
2243
2244 if (i == j)
2245 continue; /* i is in order. */
2246
2247 memcpy (tmp, ptr + i * size, size);
2248 memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size);
2249 memcpy (ptr + j * size, tmp, size);
2250 }
2251 free (tmp);
2252 }
2253
2254 /* Sort relocation by r_offset.
2255
2256 We didn't use qsort () in stdlib, because quick-sort is not a stable sorting
2257 algorithm. Relocations at the same r_offset must keep their order.
2258 For example, RELAX_ENTRY must be the very first relocation entry.
2259
2260 Currently, this function implements insertion-sort.
2261
2262 FIXME: If we already sort them in assembler, why bother sort them
2263 here again? */
2264
2265 static int
2266 compar_reloc (const void *lhs, const void *rhs)
2267 {
2268 const Elf_Internal_Rela *l = (const Elf_Internal_Rela *) lhs;
2269 const Elf_Internal_Rela *r = (const Elf_Internal_Rela *) rhs;
2270
2271 if (l->r_offset > r->r_offset)
2272 return 1;
2273 else if (l->r_offset == r->r_offset)
2274 return 0;
2275 else
2276 return -1;
2277 }
2278
2279 /* Functions listed below are only used for old relocs.
2280 * nds32_elf_9_pcrel_reloc
2281 * nds32_elf_do_9_pcrel_reloc
2282 * nds32_elf_hi20_reloc
2283 * nds32_elf_relocate_hi20
2284 * nds32_elf_lo12_reloc
2285 * nds32_elf_sda15_reloc
2286 * nds32_elf_generic_reloc
2287 */
2288
2289 /* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc. */
2290
2291 static bfd_reloc_status_type
2292 nds32_elf_9_pcrel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2293 void *data, asection *input_section, bfd *output_bfd,
2294 char **error_message ATTRIBUTE_UNUSED)
2295 {
2296 /* This part is from bfd_elf_generic_reloc. */
2297 if (output_bfd != (bfd *) NULL
2298 && (symbol->flags & BSF_SECTION_SYM) == 0
2299 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2300 {
2301 reloc_entry->address += input_section->output_offset;
2302 return bfd_reloc_ok;
2303 }
2304
2305 if (output_bfd != NULL)
2306 {
2307 /* FIXME: See bfd_perform_relocation. Is this right? */
2308 return bfd_reloc_continue;
2309 }
2310
2311 return nds32_elf_do_9_pcrel_reloc (abfd, reloc_entry->howto,
2312 input_section,
2313 data, reloc_entry->address,
2314 symbol->section,
2315 (symbol->value
2316 + symbol->section->output_section->vma
2317 + symbol->section->output_offset),
2318 reloc_entry->addend);
2319 }
2320
2321 /* Utility to actually perform an R_NDS32_9_PCREL reloc. */
2322 #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
2323
2324 static bfd_reloc_status_type
2325 nds32_elf_do_9_pcrel_reloc (bfd *abfd, reloc_howto_type *howto,
2326 asection *input_section, bfd_byte *data,
2327 bfd_vma offset,
2328 asection *symbol_section ATTRIBUTE_UNUSED,
2329 bfd_vma symbol_value, bfd_vma addend)
2330 {
2331 bfd_signed_vma relocation;
2332 unsigned short x;
2333 bfd_reloc_status_type status;
2334
2335 /* Sanity check the address (offset in section). */
2336 if (offset > bfd_get_section_limit (abfd, input_section))
2337 return bfd_reloc_outofrange;
2338
2339 relocation = symbol_value + addend;
2340 /* Make it pc relative. */
2341 relocation -= (input_section->output_section->vma
2342 + input_section->output_offset);
2343 /* These jumps mask off the lower two bits of the current address
2344 before doing pcrel calculations. */
2345 relocation -= (offset & -(bfd_vma) 2);
2346
2347 if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1)
2348 status = bfd_reloc_overflow;
2349 else
2350 status = bfd_reloc_ok;
2351
2352 x = bfd_getb16 (data + offset);
2353
2354 relocation >>= howto->rightshift;
2355 relocation <<= howto->bitpos;
2356 x = (x & ~howto->dst_mask)
2357 | (((x & howto->src_mask) + relocation) & howto->dst_mask);
2358
2359 bfd_putb16 ((bfd_vma) x, data + offset);
2360
2361 return status;
2362 }
2363
2364 /* Handle the R_NDS32_HI20_[SU]LO relocs.
2365 HI20_SLO is for the add3 and load/store with displacement instructions.
2366 HI20 is for the or3 instruction.
2367 For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to
2368 the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
2369 we must add one to the high 16 bytes (which will get subtracted off when
2370 the low 16 bits are added).
2371 These relocs have to be done in combination with an R_NDS32_LO12 reloc
2372 because there is a carry from the LO12 to the HI20. Here we just save
2373 the information we need; we do the actual relocation when we see the LO12.
2374 This code is copied from the elf32-mips.c. We also support an arbitrary
2375 number of HI20 relocs to be associated with a single LO12 reloc. The
2376 assembler sorts the relocs to ensure each HI20 immediately precedes its
2377 LO12. However if there are multiple copies, the assembler may not find
2378 the real LO12 so it picks the first one it finds. */
2379
2380 struct nds32_hi20
2381 {
2382 struct nds32_hi20 *next;
2383 bfd_byte *addr;
2384 bfd_vma addend;
2385 };
2386
2387 static struct nds32_hi20 *nds32_hi20_list;
2388
2389 static bfd_reloc_status_type
2390 nds32_elf_hi20_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2391 asymbol *symbol, void *data, asection *input_section,
2392 bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2393 {
2394 bfd_reloc_status_type ret;
2395 bfd_vma relocation;
2396 struct nds32_hi20 *n;
2397
2398 /* This part is from bfd_elf_generic_reloc.
2399 If we're relocating, and this an external symbol, we don't want
2400 to change anything. */
2401 if (output_bfd != (bfd *) NULL
2402 && (symbol->flags & BSF_SECTION_SYM) == 0 && reloc_entry->addend == 0)
2403 {
2404 reloc_entry->address += input_section->output_offset;
2405 return bfd_reloc_ok;
2406 }
2407
2408 /* Sanity check the address (offset in section). */
2409 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2410 return bfd_reloc_outofrange;
2411
2412 ret = bfd_reloc_ok;
2413 if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2414 ret = bfd_reloc_undefined;
2415
2416 if (bfd_is_com_section (symbol->section))
2417 relocation = 0;
2418 else
2419 relocation = symbol->value;
2420
2421 relocation += symbol->section->output_section->vma;
2422 relocation += symbol->section->output_offset;
2423 relocation += reloc_entry->addend;
2424
2425 /* Save the information, and let LO12 do the actual relocation. */
2426 n = (struct nds32_hi20 *) bfd_malloc ((bfd_size_type) sizeof *n);
2427 if (n == NULL)
2428 return bfd_reloc_outofrange;
2429
2430 n->addr = (bfd_byte *) data + reloc_entry->address;
2431 n->addend = relocation;
2432 n->next = nds32_hi20_list;
2433 nds32_hi20_list = n;
2434
2435 if (output_bfd != (bfd *) NULL)
2436 reloc_entry->address += input_section->output_offset;
2437
2438 return ret;
2439 }
2440
2441 /* Handle an NDS32 ELF HI20 reloc. */
2442
2443 static void
2444 nds32_elf_relocate_hi20 (bfd *input_bfd ATTRIBUTE_UNUSED,
2445 int type ATTRIBUTE_UNUSED, Elf_Internal_Rela *relhi,
2446 Elf_Internal_Rela *rello, bfd_byte *contents,
2447 bfd_vma addend)
2448 {
2449 unsigned long insn;
2450 bfd_vma addlo;
2451
2452 insn = bfd_getb32 (contents + relhi->r_offset);
2453
2454 addlo = bfd_getb32 (contents + rello->r_offset);
2455 addlo &= 0xfff;
2456
2457 addend += ((insn & 0xfffff) << 20) + addlo;
2458
2459 insn = (insn & 0xfff00000) | ((addend >> 12) & 0xfffff);
2460 bfd_putb32 (insn, contents + relhi->r_offset);
2461 }
2462
2463 /* Do an R_NDS32_LO12 relocation. This is a straightforward 12 bit
2464 inplace relocation; this function exists in order to do the
2465 R_NDS32_HI20_[SU]LO relocation described above. */
2466
2467 static bfd_reloc_status_type
2468 nds32_elf_lo12_reloc (bfd *input_bfd, arelent *reloc_entry, asymbol *symbol,
2469 void *data, asection *input_section, bfd *output_bfd,
2470 char **error_message)
2471 {
2472 /* This part is from bfd_elf_generic_reloc.
2473 If we're relocating, and this an external symbol, we don't want
2474 to change anything. */
2475 if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2476 && reloc_entry->addend == 0)
2477 {
2478 reloc_entry->address += input_section->output_offset;
2479 return bfd_reloc_ok;
2480 }
2481
2482 if (nds32_hi20_list != NULL)
2483 {
2484 struct nds32_hi20 *l;
2485
2486 l = nds32_hi20_list;
2487 while (l != NULL)
2488 {
2489 unsigned long insn;
2490 unsigned long val;
2491 unsigned long vallo;
2492 struct nds32_hi20 *next;
2493
2494 /* Do the HI20 relocation. Note that we actually don't need
2495 to know anything about the LO12 itself, except where to
2496 find the low 12 bits of the addend needed by the LO12. */
2497 insn = bfd_getb32 (l->addr);
2498 vallo = bfd_getb32 ((bfd_byte *) data + reloc_entry->address);
2499 vallo &= 0xfff;
2500 switch (reloc_entry->howto->type)
2501 {
2502 case R_NDS32_LO12S3:
2503 vallo <<= 3;
2504 break;
2505
2506 case R_NDS32_LO12S2:
2507 vallo <<= 2;
2508 break;
2509
2510 case R_NDS32_LO12S1:
2511 vallo <<= 1;
2512 break;
2513
2514 case R_NDS32_LO12S0:
2515 vallo <<= 0;
2516 break;
2517 }
2518
2519 val = ((insn & 0xfffff) << 12) + vallo;
2520 val += l->addend;
2521
2522 insn = (insn & ~(bfd_vma) 0xfffff) | ((val >> 12) & 0xfffff);
2523 bfd_putb32 ((bfd_vma) insn, l->addr);
2524
2525 next = l->next;
2526 free (l);
2527 l = next;
2528 }
2529
2530 nds32_hi20_list = NULL;
2531 }
2532
2533 /* Now do the LO12 reloc in the usual way.
2534 ??? It would be nice to call bfd_elf_generic_reloc here,
2535 but we have partial_inplace set. bfd_elf_generic_reloc will
2536 pass the handling back to bfd_install_relocation which will install
2537 a section relative addend which is wrong. */
2538 return nds32_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
2539 input_section, output_bfd, error_message);
2540 }
2541
2542 /* Do generic partial_inplace relocation.
2543 This is a local replacement for bfd_elf_generic_reloc. */
2544
2545 static bfd_reloc_status_type
2546 nds32_elf_generic_reloc (bfd *input_bfd, arelent *reloc_entry,
2547 asymbol *symbol, void *data, asection *input_section,
2548 bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2549 {
2550 bfd_reloc_status_type ret;
2551 bfd_vma relocation;
2552 bfd_byte *inplace_address;
2553
2554 /* This part is from bfd_elf_generic_reloc.
2555 If we're relocating, and this an external symbol, we don't want
2556 to change anything. */
2557 if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2558 && reloc_entry->addend == 0)
2559 {
2560 reloc_entry->address += input_section->output_offset;
2561 return bfd_reloc_ok;
2562 }
2563
2564 /* Now do the reloc in the usual way.
2565 ??? It would be nice to call bfd_elf_generic_reloc here,
2566 but we have partial_inplace set. bfd_elf_generic_reloc will
2567 pass the handling back to bfd_install_relocation which will install
2568 a section relative addend which is wrong. */
2569
2570 /* Sanity check the address (offset in section). */
2571 if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section))
2572 return bfd_reloc_outofrange;
2573
2574 ret = bfd_reloc_ok;
2575 if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2576 ret = bfd_reloc_undefined;
2577
2578 if (bfd_is_com_section (symbol->section) || output_bfd != (bfd *) NULL)
2579 relocation = 0;
2580 else
2581 relocation = symbol->value;
2582
2583 /* Only do this for a final link. */
2584 if (output_bfd == (bfd *) NULL)
2585 {
2586 relocation += symbol->section->output_section->vma;
2587 relocation += symbol->section->output_offset;
2588 }
2589
2590 relocation += reloc_entry->addend;
2591 switch (reloc_entry->howto->type)
2592 {
2593 case R_NDS32_LO12S3:
2594 relocation >>= 3;
2595 break;
2596
2597 case R_NDS32_LO12S2:
2598 relocation >>= 2;
2599 break;
2600
2601 case R_NDS32_LO12S1:
2602 relocation >>= 1;
2603 break;
2604
2605 case R_NDS32_LO12S0:
2606 default:
2607 relocation >>= 0;
2608 break;
2609 }
2610
2611 inplace_address = (bfd_byte *) data + reloc_entry->address;
2612
2613 #define DOIT(x) \
2614 x = ((x & ~reloc_entry->howto->dst_mask) | \
2615 (((x & reloc_entry->howto->src_mask) + relocation) & \
2616 reloc_entry->howto->dst_mask))
2617
2618 switch (reloc_entry->howto->size)
2619 {
2620 case 1:
2621 {
2622 short x = bfd_getb16 (inplace_address);
2623
2624 DOIT (x);
2625 bfd_putb16 ((bfd_vma) x, inplace_address);
2626 }
2627 break;
2628 case 2:
2629 {
2630 unsigned long x = bfd_getb32 (inplace_address);
2631
2632 DOIT (x);
2633 bfd_putb32 ((bfd_vma) x, inplace_address);
2634 }
2635 break;
2636 default:
2637 BFD_ASSERT (0);
2638 }
2639
2640 if (output_bfd != (bfd *) NULL)
2641 reloc_entry->address += input_section->output_offset;
2642
2643 return ret;
2644 }
2645
2646 /* Handle the R_NDS32_SDA15 reloc.
2647 This reloc is used to compute the address of objects in the small data area
2648 and to perform loads and stores from that area.
2649 The lower 15 bits are sign extended and added to the register specified
2650 in the instruction, which is assumed to point to _SDA_BASE_.
2651
2652 Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on
2653 the access size, this must be taken care of. */
2654
2655 static bfd_reloc_status_type
2656 nds32_elf_sda15_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2657 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2658 asection *input_section, bfd *output_bfd,
2659 char **error_message ATTRIBUTE_UNUSED)
2660 {
2661 /* This part is from bfd_elf_generic_reloc. */
2662 if (output_bfd != (bfd *) NULL
2663 && (symbol->flags & BSF_SECTION_SYM) == 0
2664 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2665 {
2666 reloc_entry->address += input_section->output_offset;
2667 return bfd_reloc_ok;
2668 }
2669
2670 if (output_bfd != NULL)
2671 {
2672 /* FIXME: See bfd_perform_relocation. Is this right? */
2673 return bfd_reloc_continue;
2674 }
2675
2676 /* FIXME: not sure what to do here yet. But then again, the linker
2677 may never call us. */
2678 abort ();
2679 }
2680
2681 /* nds32_elf_ignore_reloc is the special function for
2682 relocation types which don't need to be relocated
2683 like relaxation relocation types.
2684 This function simply return bfd_reloc_ok when it is
2685 invoked. */
2686
2687 static bfd_reloc_status_type
2688 nds32_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2689 asymbol *symbol ATTRIBUTE_UNUSED,
2690 void *data ATTRIBUTE_UNUSED, asection *input_section,
2691 bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2692 {
2693 if (output_bfd != NULL)
2694 reloc_entry->address += input_section->output_offset;
2695
2696 return bfd_reloc_ok;
2697 }
2698 \f
2699
2700 /* Map BFD reloc types to NDS32 ELF reloc types. */
2701
2702 struct nds32_reloc_map_entry
2703 {
2704 bfd_reloc_code_real_type bfd_reloc_val;
2705 unsigned char elf_reloc_val;
2706 };
2707
2708 static const struct nds32_reloc_map_entry nds32_reloc_map[] =
2709 {
2710 {BFD_RELOC_NONE, R_NDS32_NONE},
2711 {BFD_RELOC_16, R_NDS32_16_RELA},
2712 {BFD_RELOC_32, R_NDS32_32_RELA},
2713 {BFD_RELOC_NDS32_20, R_NDS32_20_RELA},
2714 {BFD_RELOC_NDS32_5, R_NDS32_5_RELA},
2715 {BFD_RELOC_NDS32_9_PCREL, R_NDS32_9_PCREL_RELA},
2716 {BFD_RELOC_NDS32_WORD_9_PCREL, R_NDS32_WORD_9_PCREL_RELA},
2717 {BFD_RELOC_NDS32_15_PCREL, R_NDS32_15_PCREL_RELA},
2718 {BFD_RELOC_NDS32_17_PCREL, R_NDS32_17_PCREL_RELA},
2719 {BFD_RELOC_NDS32_25_PCREL, R_NDS32_25_PCREL_RELA},
2720 {BFD_RELOC_NDS32_10_UPCREL, R_NDS32_10_UPCREL_RELA},
2721 {BFD_RELOC_NDS32_HI20, R_NDS32_HI20_RELA},
2722 {BFD_RELOC_NDS32_LO12S3, R_NDS32_LO12S3_RELA},
2723 {BFD_RELOC_NDS32_LO12S2, R_NDS32_LO12S2_RELA},
2724 {BFD_RELOC_NDS32_LO12S1, R_NDS32_LO12S1_RELA},
2725 {BFD_RELOC_NDS32_LO12S0, R_NDS32_LO12S0_RELA},
2726 {BFD_RELOC_NDS32_LO12S0_ORI, R_NDS32_LO12S0_ORI_RELA},
2727 {BFD_RELOC_NDS32_SDA15S3, R_NDS32_SDA15S3_RELA},
2728 {BFD_RELOC_NDS32_SDA15S2, R_NDS32_SDA15S2_RELA},
2729 {BFD_RELOC_NDS32_SDA15S1, R_NDS32_SDA15S1_RELA},
2730 {BFD_RELOC_NDS32_SDA15S0, R_NDS32_SDA15S0_RELA},
2731 {BFD_RELOC_VTABLE_INHERIT, R_NDS32_RELA_GNU_VTINHERIT},
2732 {BFD_RELOC_VTABLE_ENTRY, R_NDS32_RELA_GNU_VTENTRY},
2733
2734 {BFD_RELOC_NDS32_GOT20, R_NDS32_GOT20},
2735 {BFD_RELOC_NDS32_9_PLTREL, R_NDS32_9_PLTREL},
2736 {BFD_RELOC_NDS32_25_PLTREL, R_NDS32_25_PLTREL},
2737 {BFD_RELOC_NDS32_COPY, R_NDS32_COPY},
2738 {BFD_RELOC_NDS32_GLOB_DAT, R_NDS32_GLOB_DAT},
2739 {BFD_RELOC_NDS32_JMP_SLOT, R_NDS32_JMP_SLOT},
2740 {BFD_RELOC_NDS32_RELATIVE, R_NDS32_RELATIVE},
2741 {BFD_RELOC_NDS32_GOTOFF, R_NDS32_GOTOFF},
2742 {BFD_RELOC_NDS32_GOTPC20, R_NDS32_GOTPC20},
2743 {BFD_RELOC_NDS32_GOT_HI20, R_NDS32_GOT_HI20},
2744 {BFD_RELOC_NDS32_GOT_LO12, R_NDS32_GOT_LO12},
2745 {BFD_RELOC_NDS32_GOT_LO15, R_NDS32_GOT_LO15},
2746 {BFD_RELOC_NDS32_GOT_LO19, R_NDS32_GOT_LO19},
2747 {BFD_RELOC_NDS32_GOTPC_HI20, R_NDS32_GOTPC_HI20},
2748 {BFD_RELOC_NDS32_GOTPC_LO12, R_NDS32_GOTPC_LO12},
2749 {BFD_RELOC_NDS32_GOTOFF_HI20, R_NDS32_GOTOFF_HI20},
2750 {BFD_RELOC_NDS32_GOTOFF_LO12, R_NDS32_GOTOFF_LO12},
2751 {BFD_RELOC_NDS32_GOTOFF_LO15, R_NDS32_GOTOFF_LO15},
2752 {BFD_RELOC_NDS32_GOTOFF_LO19, R_NDS32_GOTOFF_LO19},
2753 {BFD_RELOC_NDS32_INSN16, R_NDS32_INSN16},
2754 {BFD_RELOC_NDS32_LABEL, R_NDS32_LABEL},
2755 {BFD_RELOC_NDS32_LONGCALL1, R_NDS32_LONGCALL1},
2756 {BFD_RELOC_NDS32_LONGCALL2, R_NDS32_LONGCALL2},
2757 {BFD_RELOC_NDS32_LONGCALL3, R_NDS32_LONGCALL3},
2758 {BFD_RELOC_NDS32_LONGCALL4, R_NDS32_LONGCALL4},
2759 {BFD_RELOC_NDS32_LONGCALL5, R_NDS32_LONGCALL5},
2760 {BFD_RELOC_NDS32_LONGCALL6, R_NDS32_LONGCALL6},
2761 {BFD_RELOC_NDS32_LONGJUMP1, R_NDS32_LONGJUMP1},
2762 {BFD_RELOC_NDS32_LONGJUMP2, R_NDS32_LONGJUMP2},
2763 {BFD_RELOC_NDS32_LONGJUMP3, R_NDS32_LONGJUMP3},
2764 {BFD_RELOC_NDS32_LONGJUMP4, R_NDS32_LONGJUMP4},
2765 {BFD_RELOC_NDS32_LONGJUMP5, R_NDS32_LONGJUMP5},
2766 {BFD_RELOC_NDS32_LONGJUMP6, R_NDS32_LONGJUMP6},
2767 {BFD_RELOC_NDS32_LONGJUMP7, R_NDS32_LONGJUMP7},
2768 {BFD_RELOC_NDS32_LOADSTORE, R_NDS32_LOADSTORE},
2769 {BFD_RELOC_NDS32_9_FIXED, R_NDS32_9_FIXED_RELA},
2770 {BFD_RELOC_NDS32_15_FIXED, R_NDS32_15_FIXED_RELA},
2771 {BFD_RELOC_NDS32_17_FIXED, R_NDS32_17_FIXED_RELA},
2772 {BFD_RELOC_NDS32_25_FIXED, R_NDS32_25_FIXED_RELA},
2773 {BFD_RELOC_NDS32_PLTREL_HI20, R_NDS32_PLTREL_HI20},
2774 {BFD_RELOC_NDS32_PLTREL_LO12, R_NDS32_PLTREL_LO12},
2775 {BFD_RELOC_NDS32_PLT_GOTREL_HI20, R_NDS32_PLT_GOTREL_HI20},
2776 {BFD_RELOC_NDS32_PLT_GOTREL_LO12, R_NDS32_PLT_GOTREL_LO12},
2777 {BFD_RELOC_NDS32_PLT_GOTREL_LO15, R_NDS32_PLT_GOTREL_LO15},
2778 {BFD_RELOC_NDS32_PLT_GOTREL_LO19, R_NDS32_PLT_GOTREL_LO19},
2779 {BFD_RELOC_NDS32_PLT_GOTREL_LO20, R_NDS32_PLT_GOTREL_LO20},
2780 {BFD_RELOC_NDS32_SDA12S2_DP, R_NDS32_SDA12S2_DP_RELA},
2781 {BFD_RELOC_NDS32_SDA12S2_SP, R_NDS32_SDA12S2_SP_RELA},
2782 {BFD_RELOC_NDS32_LO12S2_DP, R_NDS32_LO12S2_DP_RELA},
2783 {BFD_RELOC_NDS32_LO12S2_SP, R_NDS32_LO12S2_SP_RELA},
2784 {BFD_RELOC_NDS32_SDA16S3, R_NDS32_SDA16S3_RELA},
2785 {BFD_RELOC_NDS32_SDA17S2, R_NDS32_SDA17S2_RELA},
2786 {BFD_RELOC_NDS32_SDA18S1, R_NDS32_SDA18S1_RELA},
2787 {BFD_RELOC_NDS32_SDA19S0, R_NDS32_SDA19S0_RELA},
2788 {BFD_RELOC_NDS32_SDA_FP7U2_RELA, R_NDS32_SDA_FP7U2_RELA},
2789 {BFD_RELOC_NDS32_DWARF2_OP1, R_NDS32_DWARF2_OP1_RELA},
2790 {BFD_RELOC_NDS32_DWARF2_OP2, R_NDS32_DWARF2_OP2_RELA},
2791 {BFD_RELOC_NDS32_DWARF2_LEB, R_NDS32_DWARF2_LEB_RELA},
2792 {BFD_RELOC_NDS32_UPDATE_TA, R_NDS32_UPDATE_TA_RELA},
2793 {BFD_RELOC_NDS32_GOT_SUFF, R_NDS32_GOT_SUFF},
2794 {BFD_RELOC_NDS32_GOTOFF_SUFF, R_NDS32_GOTOFF_SUFF},
2795 {BFD_RELOC_NDS32_GOT15S2, R_NDS32_GOT15S2_RELA},
2796 {BFD_RELOC_NDS32_GOT17S2, R_NDS32_GOT17S2_RELA},
2797 {BFD_RELOC_NDS32_PTR, R_NDS32_PTR},
2798 {BFD_RELOC_NDS32_PTR_COUNT, R_NDS32_PTR_COUNT},
2799 {BFD_RELOC_NDS32_PLT_GOT_SUFF, R_NDS32_PLT_GOT_SUFF},
2800 {BFD_RELOC_NDS32_PTR_RESOLVED, R_NDS32_PTR_RESOLVED},
2801 {BFD_RELOC_NDS32_RELAX_ENTRY, R_NDS32_RELAX_ENTRY},
2802 {BFD_RELOC_NDS32_MULCALL_SUFF, R_NDS32_MULCALL_SUFF},
2803 {BFD_RELOC_NDS32_PLTBLOCK, R_NDS32_PLTBLOCK},
2804 {BFD_RELOC_NDS32_RELAX_REGION_BEGIN, R_NDS32_RELAX_REGION_BEGIN},
2805 {BFD_RELOC_NDS32_RELAX_REGION_END, R_NDS32_RELAX_REGION_END},
2806 {BFD_RELOC_NDS32_MINUEND, R_NDS32_MINUEND},
2807 {BFD_RELOC_NDS32_SUBTRAHEND, R_NDS32_SUBTRAHEND},
2808 {BFD_RELOC_NDS32_EMPTY, R_NDS32_EMPTY},
2809
2810 {BFD_RELOC_NDS32_DIFF8, R_NDS32_DIFF8},
2811 {BFD_RELOC_NDS32_DIFF16, R_NDS32_DIFF16},
2812 {BFD_RELOC_NDS32_DIFF32, R_NDS32_DIFF32},
2813 {BFD_RELOC_NDS32_DIFF_ULEB128, R_NDS32_DIFF_ULEB128},
2814 {BFD_RELOC_NDS32_25_ABS, R_NDS32_25_ABS_RELA},
2815 {BFD_RELOC_NDS32_DATA, R_NDS32_DATA},
2816 {BFD_RELOC_NDS32_TRAN, R_NDS32_TRAN},
2817 {BFD_RELOC_NDS32_17IFC_PCREL, R_NDS32_17IFC_PCREL_RELA},
2818 {BFD_RELOC_NDS32_10IFCU_PCREL, R_NDS32_10IFCU_PCREL_RELA},
2819 {BFD_RELOC_NDS32_TLS_LE_HI20, R_NDS32_TLS_LE_HI20},
2820 {BFD_RELOC_NDS32_TLS_LE_LO12, R_NDS32_TLS_LE_LO12},
2821 {BFD_RELOC_NDS32_TLS_LE_ADD, R_NDS32_TLS_LE_ADD},
2822 {BFD_RELOC_NDS32_TLS_LE_LS, R_NDS32_TLS_LE_LS},
2823 {BFD_RELOC_NDS32_TLS_IE_HI20, R_NDS32_TLS_IE_HI20},
2824 {BFD_RELOC_NDS32_TLS_IE_LO12S2, R_NDS32_TLS_IE_LO12S2},
2825 {BFD_RELOC_NDS32_TLS_TPOFF, R_NDS32_TLS_TPOFF},
2826 {BFD_RELOC_NDS32_TLS_LE_20, R_NDS32_TLS_LE_20},
2827 {BFD_RELOC_NDS32_TLS_LE_15S0, R_NDS32_TLS_LE_15S0},
2828 {BFD_RELOC_NDS32_TLS_LE_15S1, R_NDS32_TLS_LE_15S1},
2829 {BFD_RELOC_NDS32_TLS_LE_15S2, R_NDS32_TLS_LE_15S2},
2830 };
2831
2832 /* Patch tag. */
2833
2834 static reloc_howto_type *
2835 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2836 const char *r_name)
2837 {
2838 unsigned int i;
2839
2840 for (i = 0; i < ARRAY_SIZE (nds32_elf_howto_table); i++)
2841 if (nds32_elf_howto_table[i].name != NULL
2842 && strcasecmp (nds32_elf_howto_table[i].name, r_name) == 0)
2843 return &nds32_elf_howto_table[i];
2844
2845 for (i = 0; i < ARRAY_SIZE (nds32_elf_relax_howto_table); i++)
2846 if (nds32_elf_relax_howto_table[i].name != NULL
2847 && strcasecmp (nds32_elf_relax_howto_table[i].name, r_name) == 0)
2848 return &nds32_elf_relax_howto_table[i];
2849
2850 return NULL;
2851 }
2852
2853 static reloc_howto_type *
2854 bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code)
2855 {
2856 if (code < R_NDS32_RELAX_ENTRY)
2857 {
2858 BFD_ASSERT (code < ARRAY_SIZE (nds32_elf_howto_table));
2859 return &nds32_elf_howto_table[code];
2860 }
2861 else
2862 {
2863 BFD_ASSERT ((size_t) (code - R_NDS32_RELAX_ENTRY)
2864 < ARRAY_SIZE (nds32_elf_relax_howto_table));
2865 return &nds32_elf_relax_howto_table[code - R_NDS32_RELAX_ENTRY];
2866 }
2867 }
2868
2869 static reloc_howto_type *
2870 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2871 bfd_reloc_code_real_type code)
2872 {
2873 unsigned int i;
2874
2875 for (i = 0; i < ARRAY_SIZE (nds32_reloc_map); i++)
2876 {
2877 if (nds32_reloc_map[i].bfd_reloc_val == code)
2878 return bfd_elf32_bfd_reloc_type_table_lookup
2879 (nds32_reloc_map[i].elf_reloc_val);
2880 }
2881
2882 return NULL;
2883 }
2884
2885 /* Set the howto pointer for an NDS32 ELF reloc. */
2886
2887 static void
2888 nds32_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2889 Elf_Internal_Rela *dst)
2890 {
2891 enum elf_nds32_reloc_type r_type;
2892
2893 r_type = ELF32_R_TYPE (dst->r_info);
2894 if (r_type > R_NDS32_GNU_VTENTRY)
2895 {
2896 /* xgettext:c-format */
2897 _bfd_error_handler (_("%B: invalid NDS32 reloc number: %d"), abfd, r_type);
2898 r_type = 0;
2899 }
2900 cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
2901 }
2902
2903 static void
2904 nds32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2905 Elf_Internal_Rela *dst)
2906 {
2907 BFD_ASSERT ((ELF32_R_TYPE (dst->r_info) == R_NDS32_NONE)
2908 || ((ELF32_R_TYPE (dst->r_info) > R_NDS32_GNU_VTENTRY)
2909 && (ELF32_R_TYPE (dst->r_info) < R_NDS32_max)));
2910 cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (dst->r_info));
2911 }
2912
2913 /* Support for core dump NOTE sections.
2914 Reference to include/linux/elfcore.h in Linux. */
2915
2916 static bfd_boolean
2917 nds32_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2918 {
2919 int offset;
2920 size_t size;
2921
2922 switch (note->descsz)
2923 {
2924 case 0x114:
2925 /* Linux/NDS32 32-bit, ABI1 */
2926
2927 /* pr_cursig */
2928 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2929
2930 /* pr_pid */
2931 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
2932
2933 /* pr_reg */
2934 offset = 72;
2935 size = 200;
2936 break;
2937
2938 case 0xfc:
2939 /* Linux/NDS32 32-bit */
2940
2941 /* pr_cursig */
2942 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2943
2944 /* pr_pid */
2945 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
2946
2947 /* pr_reg */
2948 offset = 72;
2949 size = 176;
2950 break;
2951
2952 default:
2953 return FALSE;
2954 }
2955
2956 /* Make a ".reg" section. */
2957 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2958 size, note->descpos + offset);
2959 }
2960
2961 static bfd_boolean
2962 nds32_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2963 {
2964 switch (note->descsz)
2965 {
2966 case 124:
2967 /* Linux/NDS32 */
2968
2969 /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform. */
2970 elf_tdata (abfd)->core->program =
2971 _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
2972 elf_tdata (abfd)->core->command =
2973 _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
2974 break;
2975
2976 default:
2977 return FALSE;
2978 }
2979
2980 /* Note that for some reason, a spurious space is tacked
2981 onto the end of the args in some (at least one anyway)
2982 implementations, so strip it off if it exists. */
2983 {
2984 char *command = elf_tdata (abfd)->core->command;
2985 int n = strlen (command);
2986
2987 if (0 < n && command[n - 1] == ' ')
2988 command[n - 1] = '\0';
2989 }
2990
2991 return TRUE;
2992 }
2993
2994 /* Hook called by the linker routine which adds symbols from an object
2995 file. We must handle the special NDS32 section numbers here.
2996 We also keep watching for whether we need to create the sdata special
2997 linker sections. */
2998
2999 static bfd_boolean
3000 nds32_elf_add_symbol_hook (bfd *abfd,
3001 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3002 Elf_Internal_Sym *sym,
3003 const char **namep ATTRIBUTE_UNUSED,
3004 flagword *flagsp ATTRIBUTE_UNUSED,
3005 asection **secp, bfd_vma *valp)
3006 {
3007 switch (sym->st_shndx)
3008 {
3009 case SHN_COMMON:
3010 /* Common symbols less than the GP size are automatically
3011 treated as SHN_MIPS_SCOMMON symbols. */
3012 if (sym->st_size > elf_gp_size (abfd)
3013 || ELF_ST_TYPE (sym->st_info) == STT_TLS)
3014 break;
3015
3016 /* st_value is the alignemnt constraint.
3017 That might be its actual size if it is an array or structure. */
3018 switch (sym->st_value)
3019 {
3020 case 1:
3021 *secp = bfd_make_section_old_way (abfd, ".scommon_b");
3022 break;
3023 case 2:
3024 *secp = bfd_make_section_old_way (abfd, ".scommon_h");
3025 break;
3026 case 4:
3027 *secp = bfd_make_section_old_way (abfd, ".scommon_w");
3028 break;
3029 case 8:
3030 *secp = bfd_make_section_old_way (abfd, ".scommon_d");
3031 break;
3032 default:
3033 return TRUE;
3034 }
3035
3036 (*secp)->flags |= SEC_IS_COMMON;
3037 *valp = sym->st_size;
3038 break;
3039 }
3040
3041 return TRUE;
3042 }
3043
3044
3045 /* This function can figure out the best location for a base register to access
3046 data relative to this base register
3047 INPUT:
3048 sda_d0: size of first DOUBLE WORD data section
3049 sda_w0: size of first WORD data section
3050 sda_h0: size of first HALF WORD data section
3051 sda_b : size of BYTE data section
3052 sda_hi: size of second HALF WORD data section
3053 sda_w1: size of second WORD data section
3054 sda_d1: size of second DOUBLE WORD data section
3055 OUTPUT:
3056 offset (always positive) from the beginning of sda_d0 if OK
3057 a negative error value if fail
3058 NOTE:
3059 these 7 sections have to be located back to back if exist
3060 a pass in 0 value for non-existing section */
3061
3062 /* Due to the interpretation of simm15 field of load/store depending on
3063 data accessing size, the organization of base register relative data shall
3064 like the following figure
3065 -------------------------------------------
3066 | DOUBLE WORD sized data (range +/- 128K)
3067 -------------------------------------------
3068 | WORD sized data (range +/- 64K)
3069 -------------------------------------------
3070 | HALF WORD sized data (range +/- 32K)
3071 -------------------------------------------
3072 | BYTE sized data (range +/- 16K)
3073 -------------------------------------------
3074 | HALF WORD sized data (range +/- 32K)
3075 -------------------------------------------
3076 | WORD sized data (range +/- 64K)
3077 -------------------------------------------
3078 | DOUBLE WORD sized data (range +/- 128K)
3079 -------------------------------------------
3080 Its base register shall be set to access these data freely. */
3081
3082 /* We have to figure out the SDA_BASE value, so that we can adjust the
3083 symbol value correctly. We look up the symbol _SDA_BASE_ in the output
3084 BFD. If we can't find it, we're stuck. We cache it in the ELF
3085 target data. We don't need to adjust the symbol value for an
3086 external symbol if we are producing relocatable output. */
3087
3088 static asection *sda_rela_sec = NULL;
3089
3090 #define SDA_SECTION_NUM 10
3091
3092 static bfd_reloc_status_type
3093 nds32_elf_final_sda_base (bfd *output_bfd, struct bfd_link_info *info,
3094 bfd_vma *psb, bfd_boolean add_symbol)
3095 {
3096 int relax_fp_as_gp;
3097 struct elf_nds32_link_hash_table *table;
3098 struct bfd_link_hash_entry *h, *h2;
3099 long unsigned int total = 0;
3100
3101 h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE);
3102 if (!h || (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak))
3103 {
3104 asection *first = NULL, *final = NULL, *temp;
3105 bfd_vma sda_base;
3106 /* The first section must be 4-byte aligned to promise _SDA_BASE_ being
3107 4 byte-aligned. Therefore, it has to set the first section ".data"
3108 4 byte-aligned. */
3109 static const char sec_name[SDA_SECTION_NUM][10] =
3110 {
3111 ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
3112 ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
3113 };
3114 size_t i = 0;
3115
3116 if (output_bfd->sections == NULL)
3117 {
3118 *psb = elf_gp (output_bfd);
3119 return bfd_reloc_ok;
3120 }
3121
3122 /* Get the first and final section. */
3123 while (i < sizeof (sec_name) / sizeof (sec_name [0]))
3124 {
3125 temp = bfd_get_section_by_name (output_bfd, sec_name[i]);
3126 if (temp && !first && (temp->size != 0 || temp->rawsize != 0))
3127 first = temp;
3128 if (temp && (temp->size != 0 || temp->rawsize != 0))
3129 final = temp;
3130
3131 /* Summarize the sections in order to check if joining .bss. */
3132 if (temp && temp->size != 0)
3133 total += temp->size;
3134 else if (temp && temp->rawsize != 0)
3135 total += temp->rawsize;
3136
3137 i++;
3138 }
3139
3140 /* Check .bss size. */
3141 temp = bfd_get_section_by_name (output_bfd, ".bss");
3142 if (temp)
3143 {
3144 if (temp->size != 0)
3145 total += temp->size;
3146 else if (temp->rawsize != 0)
3147 total += temp->rawsize;
3148
3149 if (total < 0x80000)
3150 {
3151 if (!first && (temp->size != 0 || temp->rawsize != 0))
3152 first = temp;
3153 if ((temp->size != 0 || temp->rawsize != 0))
3154 final = temp;
3155 }
3156 }
3157
3158 if (first && final)
3159 {
3160 /* The middle of data region. */
3161 sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
3162
3163 /* Find the section sda_base located. */
3164 i = 0;
3165 while (i < sizeof (sec_name) / sizeof (sec_name [0]))
3166 {
3167 final = bfd_get_section_by_name (output_bfd, sec_name[i]);
3168 if (final && (final->size != 0 || final->rawsize != 0)
3169 && sda_base >= final->vma)
3170 {
3171 first = final;
3172 i++;
3173 }
3174 else
3175 break;
3176 }
3177 }
3178 else
3179 {
3180 /* There is not any data section in output bfd, and set _SDA_BASE_ in
3181 first output section. */
3182 first = output_bfd->sections;
3183 while (first && first->size == 0 && first->rawsize == 0)
3184 first = first->next;
3185 if (!first)
3186 {
3187 *psb = elf_gp (output_bfd);
3188 return bfd_reloc_ok;
3189 }
3190 sda_base = first->vma + first->rawsize;
3191 }
3192
3193 sda_base -= first->vma;
3194 sda_base = sda_base & (~7);
3195
3196 if (!_bfd_generic_link_add_one_symbol
3197 (info, output_bfd, "_SDA_BASE_", BSF_GLOBAL | BSF_WEAK, first,
3198 (bfd_vma) sda_base, (const char *) NULL, FALSE,
3199 get_elf_backend_data (output_bfd)->collect, &h))
3200 return FALSE;
3201
3202 sda_rela_sec = first;
3203
3204 table = nds32_elf_hash_table (info);
3205 relax_fp_as_gp = table->relax_fp_as_gp;
3206 if (relax_fp_as_gp)
3207 {
3208 h2 = bfd_link_hash_lookup (info->hash, FP_BASE_NAME,
3209 FALSE, FALSE, FALSE);
3210 /* Define a weak FP_BASE_NAME here to prevent the undefined symbol.
3211 And set FP equal to SDA_BASE to do relaxation for
3212 la $fp, _FP_BASE_. */
3213 if (!_bfd_generic_link_add_one_symbol
3214 (info, output_bfd, FP_BASE_NAME, BSF_GLOBAL | BSF_WEAK,
3215 first, (bfd_vma) sda_base, (const char *) NULL,
3216 FALSE, get_elf_backend_data (output_bfd)->collect, &h2))
3217 return FALSE;
3218 }
3219 }
3220
3221 if (add_symbol)
3222 {
3223 if (h)
3224 {
3225 /* Now set gp. */
3226 elf_gp (output_bfd) = (h->u.def.value
3227 + h->u.def.section->output_section->vma
3228 + h->u.def.section->output_offset);
3229 }
3230 else
3231 {
3232 _bfd_error_handler (_("error: Can't find symbol: _SDA_BASE_."));
3233 return bfd_reloc_dangerous;
3234 }
3235 }
3236
3237 *psb = h->u.def.value + h->u.def.section->output_section->vma
3238 + h->u.def.section->output_offset;
3239 return bfd_reloc_ok;
3240 }
3241 \f
3242
3243 /* Return size of a PLT entry. */
3244 #define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
3245
3246
3247 /* Create an entry in an nds32 ELF linker hash table. */
3248
3249 static struct bfd_hash_entry *
3250 nds32_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
3251 struct bfd_hash_table *table,
3252 const char *string)
3253 {
3254 struct elf_nds32_link_hash_entry *ret;
3255
3256 ret = (struct elf_nds32_link_hash_entry *) entry;
3257
3258 /* Allocate the structure if it has not already been allocated by a
3259 subclass. */
3260 if (ret == NULL)
3261 ret = (struct elf_nds32_link_hash_entry *)
3262 bfd_hash_allocate (table, sizeof (struct elf_nds32_link_hash_entry));
3263
3264 if (ret == NULL)
3265 return (struct bfd_hash_entry *) ret;
3266
3267 /* Call the allocation method of the superclass. */
3268 ret = (struct elf_nds32_link_hash_entry *)
3269 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
3270
3271 if (ret != NULL)
3272 {
3273 struct elf_nds32_link_hash_entry *eh;
3274
3275 eh = (struct elf_nds32_link_hash_entry *) ret;
3276 eh->dyn_relocs = NULL;
3277 eh->tls_type = GOT_UNKNOWN;
3278 }
3279
3280 return (struct bfd_hash_entry *) ret;
3281 }
3282
3283 /* Create an nds32 ELF linker hash table. */
3284
3285 static struct bfd_link_hash_table *
3286 nds32_elf_link_hash_table_create (bfd *abfd)
3287 {
3288 struct elf_nds32_link_hash_table *ret;
3289
3290 bfd_size_type amt = sizeof (struct elf_nds32_link_hash_table);
3291
3292 ret = (struct elf_nds32_link_hash_table *) bfd_zmalloc (amt);
3293 if (ret == NULL)
3294 return NULL;
3295
3296 /* patch tag. */
3297 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3298 nds32_elf_link_hash_newfunc,
3299 sizeof (struct elf_nds32_link_hash_entry),
3300 NDS32_ELF_DATA))
3301 {
3302 free (ret);
3303 return NULL;
3304 }
3305
3306 return &ret->root.root;
3307 }
3308
3309 /* Create dynamic sections when linking against a dynamic object. */
3310
3311 static bfd_boolean
3312 nds32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3313 {
3314 struct elf_nds32_link_hash_table *htab;
3315 flagword flags, pltflags;
3316 register asection *s;
3317 const struct elf_backend_data *bed;
3318 int ptralign = 2; /* 32-bit */
3319
3320 bed = get_elf_backend_data (abfd);
3321
3322 htab = nds32_elf_hash_table (info);
3323
3324 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3325 .rel[a].bss sections. */
3326
3327 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3328 | SEC_LINKER_CREATED);
3329
3330 pltflags = flags;
3331 pltflags |= SEC_CODE;
3332 if (bed->plt_not_loaded)
3333 pltflags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
3334 if (bed->plt_readonly)
3335 pltflags |= SEC_READONLY;
3336
3337 s = bfd_make_section (abfd, ".plt");
3338 htab->root.splt = s;
3339 if (s == NULL
3340 || !bfd_set_section_flags (abfd, s, pltflags)
3341 || !bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3342 return FALSE;
3343
3344 if (bed->want_plt_sym)
3345 {
3346 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3347 .plt section. */
3348 struct bfd_link_hash_entry *bh = NULL;
3349 struct elf_link_hash_entry *h;
3350
3351 if (!(_bfd_generic_link_add_one_symbol
3352 (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3353 (bfd_vma) 0, (const char *) NULL, FALSE,
3354 get_elf_backend_data (abfd)->collect, &bh)))
3355 return FALSE;
3356
3357 h = (struct elf_link_hash_entry *) bh;
3358 h->def_regular = 1;
3359 h->type = STT_OBJECT;
3360
3361 if (bfd_link_pic (info) && !bfd_elf_link_record_dynamic_symbol (info, h))
3362 return FALSE;
3363 }
3364
3365 s = bfd_make_section (abfd,
3366 bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
3367 htab->root.srelplt = s;
3368 if (s == NULL
3369 || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3370 || !bfd_set_section_alignment (abfd, s, ptralign))
3371 return FALSE;
3372
3373 if (htab->root.sgot == NULL && !_bfd_elf_create_got_section (abfd, info))
3374 return FALSE;
3375
3376 {
3377 const char *secname;
3378 char *relname;
3379 flagword secflags;
3380 asection *sec;
3381
3382 for (sec = abfd->sections; sec; sec = sec->next)
3383 {
3384 secflags = bfd_get_section_flags (abfd, sec);
3385 if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3386 || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3387 continue;
3388 secname = bfd_get_section_name (abfd, sec);
3389 relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
3390 strcpy (relname, ".rela");
3391 strcat (relname, secname);
3392 if (bfd_get_section_by_name (abfd, secname))
3393 continue;
3394 s = bfd_make_section (abfd, relname);
3395 if (s == NULL
3396 || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3397 || !bfd_set_section_alignment (abfd, s, ptralign))
3398 return FALSE;
3399 }
3400 }
3401
3402 if (bed->want_dynbss)
3403 {
3404 /* The .dynbss section is a place to put symbols which are defined
3405 by dynamic objects, are referenced by regular objects, and are
3406 not functions. We must allocate space for them in the process
3407 image and use a R_*_COPY reloc to tell the dynamic linker to
3408 initialize them at run time. The linker script puts the .dynbss
3409 section into the .bss section of the final image. */
3410 s = bfd_make_section (abfd, ".dynbss");
3411 htab->sdynbss = s;
3412 if (s == NULL
3413 || !bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
3414 return FALSE;
3415 /* The .rel[a].bss section holds copy relocs. This section is not
3416 normally needed. We need to create it here, though, so that the
3417 linker will map it to an output section. We can't just create it
3418 only if we need it, because we will not know whether we need it
3419 until we have seen all the input files, and the first time the
3420 main linker code calls BFD after examining all the input files
3421 (size_dynamic_sections) the input sections have already been
3422 mapped to the output sections. If the section turns out not to
3423 be needed, we can discard it later. We will never need this
3424 section when generating a shared object, since they do not use
3425 copy relocs. */
3426 if (!bfd_link_pic (info))
3427 {
3428 s = bfd_make_section (abfd, (bed->default_use_rela_p
3429 ? ".rela.bss" : ".rel.bss"));
3430 htab->srelbss = s;
3431 if (s == NULL
3432 || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3433 || !bfd_set_section_alignment (abfd, s, ptralign))
3434 return FALSE;
3435 }
3436 }
3437
3438 return TRUE;
3439 }
3440
3441 /* Copy the extra info we tack onto an elf_link_hash_entry. */
3442 static void
3443 nds32_elf_copy_indirect_symbol (struct bfd_link_info *info,
3444 struct elf_link_hash_entry *dir,
3445 struct elf_link_hash_entry *ind)
3446 {
3447 struct elf_nds32_link_hash_entry *edir, *eind;
3448
3449 edir = (struct elf_nds32_link_hash_entry *) dir;
3450 eind = (struct elf_nds32_link_hash_entry *) ind;
3451
3452 if (eind->dyn_relocs != NULL)
3453 {
3454 if (edir->dyn_relocs != NULL)
3455 {
3456 struct elf_dyn_relocs **pp;
3457 struct elf_dyn_relocs *p;
3458
3459 if (ind->root.type == bfd_link_hash_indirect)
3460 abort ();
3461
3462 /* Add reloc counts against the weak sym to the strong sym
3463 list. Merge any entries against the same section. */
3464 for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
3465 {
3466 struct elf_dyn_relocs *q;
3467
3468 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3469 if (q->sec == p->sec)
3470 {
3471 q->pc_count += p->pc_count;
3472 q->count += p->count;
3473 *pp = p->next;
3474 break;
3475 }
3476 if (q == NULL)
3477 pp = &p->next;
3478 }
3479 *pp = edir->dyn_relocs;
3480 }
3481
3482 edir->dyn_relocs = eind->dyn_relocs;
3483 eind->dyn_relocs = NULL;
3484 }
3485
3486 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3487 }
3488 \f
3489 /* Find dynamic relocs for H that apply to read-only sections. */
3490
3491 static asection *
3492 readonly_dynrelocs (struct elf_link_hash_entry *h)
3493 {
3494 struct elf_dyn_relocs *p;
3495
3496 for (p = elf32_nds32_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3497 {
3498 asection *s = p->sec->output_section;
3499
3500 if (s != NULL && (s->flags & SEC_READONLY) != 0)
3501 return p->sec;
3502 }
3503 return NULL;
3504 }
3505
3506 /* Adjust a symbol defined by a dynamic object and referenced by a
3507 regular object. The current definition is in some section of the
3508 dynamic object, but we're not including those sections. We have to
3509 change the definition to something the rest of the link can
3510 understand. */
3511
3512 static bfd_boolean
3513 nds32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3514 struct elf_link_hash_entry *h)
3515 {
3516 struct elf_nds32_link_hash_table *htab;
3517 bfd *dynobj;
3518 asection *s;
3519 unsigned int power_of_two;
3520
3521 dynobj = elf_hash_table (info)->dynobj;
3522
3523 /* Make sure we know what is going on here. */
3524 BFD_ASSERT (dynobj != NULL
3525 && (h->needs_plt
3526 || h->is_weakalias
3527 || (h->def_dynamic && h->ref_regular && !h->def_regular)));
3528
3529
3530 /* If this is a function, put it in the procedure linkage table. We
3531 will fill in the contents of the procedure linkage table later,
3532 when we know the address of the .got section. */
3533 if (h->type == STT_FUNC || h->needs_plt)
3534 {
3535 if (!bfd_link_pic (info)
3536 && !h->def_dynamic
3537 && !h->ref_dynamic
3538 && h->root.type != bfd_link_hash_undefweak
3539 && h->root.type != bfd_link_hash_undefined)
3540 {
3541 /* This case can occur if we saw a PLT reloc in an input
3542 file, but the symbol was never referred to by a dynamic
3543 object. In such a case, we don't actually need to build
3544 a procedure linkage table, and we can just do a PCREL
3545 reloc instead. */
3546 h->plt.offset = (bfd_vma) - 1;
3547 h->needs_plt = 0;
3548 }
3549
3550 return TRUE;
3551 }
3552 else
3553 h->plt.offset = (bfd_vma) - 1;
3554
3555 /* If this is a weak symbol, and there is a real definition, the
3556 processor independent code will have arranged for us to see the
3557 real definition first, and we can just use the same value. */
3558 if (h->is_weakalias)
3559 {
3560 struct elf_link_hash_entry *def = weakdef (h);
3561 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
3562 h->root.u.def.section = def->root.u.def.section;
3563 h->root.u.def.value = def->root.u.def.value;
3564 return TRUE;
3565 }
3566
3567 /* This is a reference to a symbol defined by a dynamic object which
3568 is not a function. */
3569
3570 /* If we are creating a shared library, we must presume that the
3571 only references to the symbol are via the global offset table.
3572 For such cases we need not do anything here; the relocations will
3573 be handled correctly by relocate_section. */
3574 if (bfd_link_pic (info))
3575 return TRUE;
3576
3577 /* If there are no references to this symbol that do not use the
3578 GOT, we don't need to generate a copy reloc. */
3579 if (!h->non_got_ref)
3580 return TRUE;
3581
3582 /* If -z nocopyreloc was given, we won't generate them either. */
3583 if (0 && info->nocopyreloc)
3584 {
3585 h->non_got_ref = 0;
3586 return TRUE;
3587 }
3588
3589 /* If we don't find any dynamic relocs in read-only sections, then
3590 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
3591 if (0 && !readonly_dynrelocs (h))
3592 {
3593 h->non_got_ref = 0;
3594 return TRUE;
3595 }
3596
3597 /* We must allocate the symbol in our .dynbss section, which will
3598 become part of the .bss section of the executable. There will be
3599 an entry for this symbol in the .dynsym section. The dynamic
3600 object will contain position independent code, so all references
3601 from the dynamic object to this symbol will go through the global
3602 offset table. The dynamic linker will use the .dynsym entry to
3603 determine the address it must put in the global offset table, so
3604 both the dynamic object and the regular object will refer to the
3605 same memory location for the variable. */
3606
3607 htab = nds32_elf_hash_table (info);
3608 s = htab->sdynbss;
3609 BFD_ASSERT (s != NULL);
3610
3611 /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
3612 to copy the initial value out of the dynamic object and into the
3613 runtime process image. We need to remember the offset into the
3614 .rela.bss section we are going to use. */
3615 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3616 {
3617 asection *srel;
3618
3619 srel = htab->srelbss;
3620 BFD_ASSERT (srel != NULL);
3621 srel->size += sizeof (Elf32_External_Rela);
3622 h->needs_copy = 1;
3623 }
3624
3625 /* We need to figure out the alignment required for this symbol. I
3626 have no idea how ELF linkers handle this. */
3627 power_of_two = bfd_log2 (h->size);
3628 if (power_of_two > 3)
3629 power_of_two = 3;
3630
3631 /* Apply the required alignment. */
3632 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
3633 if (power_of_two > bfd_get_section_alignment (dynobj, s))
3634 {
3635 if (!bfd_set_section_alignment (dynobj, s, power_of_two))
3636 return FALSE;
3637 }
3638
3639 /* Define the symbol as being at this point in the section. */
3640 h->root.u.def.section = s;
3641 h->root.u.def.value = s->size;
3642
3643 /* Increment the section size to make room for the symbol. */
3644 s->size += h->size;
3645
3646 return TRUE;
3647 }
3648
3649 /* Allocate space in .plt, .got and associated reloc sections for
3650 dynamic relocs. */
3651
3652 static bfd_boolean
3653 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3654 {
3655 struct bfd_link_info *info;
3656 struct elf_nds32_link_hash_table *htab;
3657 struct elf_nds32_link_hash_entry *eh;
3658 struct elf_dyn_relocs *p;
3659
3660 if (h->root.type == bfd_link_hash_indirect)
3661 return TRUE;
3662
3663 if (h->root.type == bfd_link_hash_warning)
3664 /* When warning symbols are created, they **replace** the "real"
3665 entry in the hash table, thus we never get to see the real
3666 symbol in a hash traversal. So look at it now. */
3667 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3668
3669 info = (struct bfd_link_info *) inf;
3670 htab = nds32_elf_hash_table (info);
3671
3672 eh = (struct elf_nds32_link_hash_entry *) h;
3673
3674 if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
3675 {
3676 /* Make sure this symbol is output as a dynamic symbol.
3677 Undefined weak syms won't yet be marked as dynamic. */
3678 if (h->dynindx == -1 && !h->forced_local)
3679 {
3680 if (!bfd_elf_link_record_dynamic_symbol (info, h))
3681 return FALSE;
3682 }
3683
3684 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
3685 {
3686 asection *s = htab->root.splt;
3687
3688 /* If this is the first .plt entry, make room for the special
3689 first entry. */
3690 if (s->size == 0)
3691 s->size += PLT_ENTRY_SIZE;
3692
3693 h->plt.offset = s->size;
3694
3695 /* If this symbol is not defined in a regular file, and we are
3696 not generating a shared library, then set the symbol to this
3697 location in the .plt. This is required to make function
3698 pointers compare as equal between the normal executable and
3699 the shared library. */
3700 if (!bfd_link_pic (info) && !h->def_regular)
3701 {
3702 h->root.u.def.section = s;
3703 h->root.u.def.value = h->plt.offset;
3704 }
3705
3706 /* Make room for this entry. */
3707 s->size += PLT_ENTRY_SIZE;
3708
3709 /* We also need to make an entry in the .got.plt section, which
3710 will be placed in the .got section by the linker script. */
3711 htab->root.sgotplt->size += 4;
3712
3713 /* We also need to make an entry in the .rel.plt section. */
3714 htab->root.srelplt->size += sizeof (Elf32_External_Rela);
3715 }
3716 else
3717 {
3718 h->plt.offset = (bfd_vma) - 1;
3719 h->needs_plt = 0;
3720 }
3721 }
3722 else
3723 {
3724 h->plt.offset = (bfd_vma) - 1;
3725 h->needs_plt = 0;
3726 }
3727
3728 if (h->got.refcount > 0)
3729 {
3730 asection *s;
3731 bfd_boolean dyn;
3732 int tls_type = elf32_nds32_hash_entry (h)->tls_type;
3733
3734 /* Make sure this symbol is output as a dynamic symbol.
3735 Undefined weak syms won't yet be marked as dynamic. */
3736 if (h->dynindx == -1 && !h->forced_local)
3737 {
3738 if (!bfd_elf_link_record_dynamic_symbol (info, h))
3739 return FALSE;
3740 }
3741
3742 s = htab->root.sgot;
3743 h->got.offset = s->size;
3744
3745 if (tls_type == GOT_UNKNOWN)
3746 abort ();
3747 else if (tls_type == GOT_NORMAL
3748 || tls_type == GOT_TLS_IE)
3749 /* Need a GOT slot. */
3750 s->size += 4;
3751
3752 dyn = htab->root.dynamic_sections_created;
3753 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
3754 htab->root.srelgot->size += sizeof (Elf32_External_Rela);
3755 }
3756 else
3757 h->got.offset = (bfd_vma) - 1;
3758
3759 if (eh->dyn_relocs == NULL)
3760 return TRUE;
3761
3762 /* In the shared -Bsymbolic case, discard space allocated for
3763 dynamic pc-relative relocs against symbols which turn out to be
3764 defined in regular objects. For the normal shared case, discard
3765 space for pc-relative relocs that have become local due to symbol
3766 visibility changes. */
3767
3768 if (bfd_link_pic (info))
3769 {
3770 if (h->def_regular && (h->forced_local || info->symbolic))
3771 {
3772 struct elf_dyn_relocs **pp;
3773
3774 for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
3775 {
3776 p->count -= p->pc_count;
3777 p->pc_count = 0;
3778 if (p->count == 0)
3779 *pp = p->next;
3780 else
3781 pp = &p->next;
3782 }
3783 }
3784 }
3785 else
3786 {
3787 /* For the non-shared case, discard space for relocs against
3788 symbols which turn out to need copy relocs or are not dynamic. */
3789
3790 if (!h->non_got_ref
3791 && ((h->def_dynamic
3792 && !h->def_regular)
3793 || (htab->root.dynamic_sections_created
3794 && (h->root.type == bfd_link_hash_undefweak
3795 || h->root.type == bfd_link_hash_undefined))))
3796 {
3797 /* Make sure this symbol is output as a dynamic symbol.
3798 Undefined weak syms won't yet be marked as dynamic. */
3799 if (h->dynindx == -1 && !h->forced_local)
3800 {
3801 if (!bfd_elf_link_record_dynamic_symbol (info, h))
3802 return FALSE;
3803 }
3804
3805 /* If that succeeded, we know we'll be keeping all the
3806 relocs. */
3807 if (h->dynindx != -1)
3808 goto keep;
3809 }
3810
3811 eh->dyn_relocs = NULL;
3812
3813 keep:;
3814 }
3815
3816 /* Finally, allocate space. */
3817 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3818 {
3819 asection *sreloc = elf_section_data (p->sec)->sreloc;
3820 sreloc->size += p->count * sizeof (Elf32_External_Rela);
3821 }
3822
3823 return TRUE;
3824 }
3825
3826 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
3827 read-only sections. */
3828
3829 static bfd_boolean
3830 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
3831 {
3832 asection *sec;
3833
3834 if (h->root.type == bfd_link_hash_indirect)
3835 return TRUE;
3836
3837 sec = readonly_dynrelocs (h);
3838 if (sec != NULL)
3839 {
3840 struct bfd_link_info *info = (struct bfd_link_info *) info_p;
3841
3842 info->flags |= DF_TEXTREL;
3843 info->callbacks->minfo
3844 (_("%B: dynamic relocation against `%T' in read-only section `%A'\n"),
3845 sec->owner, h->root.root.string, sec);
3846
3847 /* Not an error, just cut short the traversal. */
3848 return FALSE;
3849 }
3850 return TRUE;
3851 }
3852
3853 /* Set the sizes of the dynamic sections. */
3854
3855 static bfd_boolean
3856 nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3857 struct bfd_link_info *info)
3858 {
3859 struct elf_nds32_link_hash_table *htab;
3860 bfd *dynobj;
3861 asection *s;
3862 bfd_boolean relocs;
3863 bfd *ibfd;
3864
3865 htab = nds32_elf_hash_table (info);
3866 dynobj = htab->root.dynobj;
3867 BFD_ASSERT (dynobj != NULL);
3868
3869 if (htab->root.dynamic_sections_created)
3870 {
3871 /* Set the contents of the .interp section to the interpreter. */
3872 if (bfd_link_executable (info) && !info->nointerp)
3873 {
3874 s = bfd_get_section_by_name (dynobj, ".interp");
3875 BFD_ASSERT (s != NULL);
3876 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3877 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3878 }
3879 }
3880
3881 /* Set up .got offsets for local syms, and space for local dynamic
3882 relocs. */
3883 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3884 {
3885 bfd_signed_vma *local_got;
3886 bfd_signed_vma *end_local_got;
3887 bfd_size_type locsymcount;
3888 Elf_Internal_Shdr *symtab_hdr;
3889 asection *srel;
3890
3891 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3892 continue;
3893
3894 for (s = ibfd->sections; s != NULL; s = s->next)
3895 {
3896 struct elf_dyn_relocs *p;
3897
3898 for (p = ((struct elf_dyn_relocs *)
3899 elf_section_data (s)->local_dynrel);
3900 p != NULL; p = p->next)
3901 {
3902 if (!bfd_is_abs_section (p->sec)
3903 && bfd_is_abs_section (p->sec->output_section))
3904 {
3905 /* Input section has been discarded, either because
3906 it is a copy of a linkonce section or due to
3907 linker script /DISCARD/, so we'll be discarding
3908 the relocs too. */
3909 }
3910 else if (p->count != 0)
3911 {
3912 srel = elf_section_data (p->sec)->sreloc;
3913 srel->size += p->count * sizeof (Elf32_External_Rela);
3914 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
3915 info->flags |= DF_TEXTREL;
3916 }
3917 }
3918 }
3919
3920 local_got = elf_local_got_refcounts (ibfd);
3921 if (!local_got)
3922 continue;
3923
3924 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3925 locsymcount = symtab_hdr->sh_info;
3926 end_local_got = local_got + locsymcount;
3927 s = htab->root.sgot;
3928 srel = htab->root.srelgot;
3929 for (; local_got < end_local_got; ++local_got)
3930 {
3931 if (*local_got > 0)
3932 {
3933 *local_got = s->size;
3934 s->size += 4;
3935 if (bfd_link_pic (info))
3936 srel->size += sizeof (Elf32_External_Rela);
3937 }
3938 else
3939 *local_got = (bfd_vma) - 1;
3940 }
3941 }
3942
3943 /* Allocate global sym .plt and .got entries, and space for global
3944 sym dynamic relocs. */
3945 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (void *) info);
3946
3947 /* We now have determined the sizes of the various dynamic sections.
3948 Allocate memory for them. */
3949 relocs = FALSE;
3950 for (s = dynobj->sections; s != NULL; s = s->next)
3951 {
3952 if ((s->flags & SEC_LINKER_CREATED) == 0)
3953 continue;
3954
3955 if (s == htab->root.splt)
3956 {
3957 /* Strip this section if we don't need it; see the
3958 comment below. */
3959 }
3960 else if (s == htab->root.sgot)
3961 {
3962 got_size += s->size;
3963 }
3964 else if (s == htab->root.sgotplt)
3965 {
3966 got_size += s->size;
3967 }
3968 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
3969 {
3970 if (s->size != 0 && s != htab->root.srelplt)
3971 relocs = TRUE;
3972
3973 /* We use the reloc_count field as a counter if we need
3974 to copy relocs into the output file. */
3975 s->reloc_count = 0;
3976 }
3977 else
3978 {
3979 /* It's not one of our sections, so don't allocate space. */
3980 continue;
3981 }
3982
3983 if (s->size == 0)
3984 {
3985 /* If we don't need this section, strip it from the
3986 output file. This is mostly to handle .rela.bss and
3987 .rela.plt. We must create both sections in
3988 create_dynamic_sections, because they must be created
3989 before the linker maps input sections to output
3990 sections. The linker does that before
3991 adjust_dynamic_symbol is called, and it is that
3992 function which decides whether anything needs to go
3993 into these sections. */
3994 s->flags |= SEC_EXCLUDE;
3995 continue;
3996 }
3997
3998 /* Allocate memory for the section contents. We use bfd_zalloc
3999 here in case unused entries are not reclaimed before the
4000 section's contents are written out. This should not happen,
4001 but this way if it does, we get a R_NDS32_NONE reloc instead
4002 of garbage. */
4003 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4004 if (s->contents == NULL)
4005 return FALSE;
4006 }
4007
4008
4009 if (htab->root.dynamic_sections_created)
4010 {
4011 /* Add some entries to the .dynamic section. We fill in the
4012 values later, in nds32_elf_finish_dynamic_sections, but we
4013 must add the entries now so that we get the correct size for
4014 the .dynamic section. The DT_DEBUG entry is filled in by the
4015 dynamic linker and used by the debugger. */
4016 #define add_dynamic_entry(TAG, VAL) \
4017 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4018
4019 if (!bfd_link_pic (info))
4020 {
4021 if (!add_dynamic_entry (DT_DEBUG, 0))
4022 return FALSE;
4023 }
4024
4025 if (htab->root.splt->size != 0)
4026 {
4027 if (!add_dynamic_entry (DT_PLTGOT, 0)
4028 || !add_dynamic_entry (DT_PLTRELSZ, 0)
4029 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4030 || !add_dynamic_entry (DT_JMPREL, 0))
4031 return FALSE;
4032 }
4033
4034 if (relocs)
4035 {
4036 if (!add_dynamic_entry (DT_RELA, 0)
4037 || !add_dynamic_entry (DT_RELASZ, 0)
4038 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4039 return FALSE;
4040
4041 /* If any dynamic relocs apply to a read-only section,
4042 then we need a DT_TEXTREL entry. */
4043 if ((info->flags & DF_TEXTREL) == 0)
4044 elf_link_hash_traverse (&htab->root, maybe_set_textrel,
4045 (void *) info);
4046
4047 if ((info->flags & DF_TEXTREL) != 0)
4048 {
4049 if (!add_dynamic_entry (DT_TEXTREL, 0))
4050 return FALSE;
4051 }
4052 }
4053 }
4054 #undef add_dynamic_entry
4055
4056 return TRUE;
4057 }
4058
4059 static bfd_reloc_status_type
4060 nds32_relocate_contents (reloc_howto_type *howto, bfd *input_bfd,
4061 bfd_vma relocation, bfd_byte *location)
4062 {
4063 int size;
4064 bfd_vma x = 0;
4065 bfd_reloc_status_type flag;
4066 unsigned int rightshift = howto->rightshift;
4067 unsigned int bitpos = howto->bitpos;
4068
4069 /* If the size is negative, negate RELOCATION. This isn't very
4070 general. */
4071 if (howto->size < 0)
4072 relocation = -relocation;
4073
4074 /* Get the value we are going to relocate. */
4075 size = bfd_get_reloc_size (howto);
4076 switch (size)
4077 {
4078 default:
4079 abort ();
4080 break;
4081 case 0:
4082 return bfd_reloc_ok;
4083 case 2:
4084 x = bfd_getb16 (location);
4085 break;
4086 case 4:
4087 x = bfd_getb32 (location);
4088 break;
4089 }
4090
4091 /* Check for overflow. FIXME: We may drop bits during the addition
4092 which we don't check for. We must either check at every single
4093 operation, which would be tedious, or we must do the computations
4094 in a type larger than bfd_vma, which would be inefficient. */
4095 flag = bfd_reloc_ok;
4096 if (howto->complain_on_overflow != complain_overflow_dont)
4097 {
4098 bfd_vma addrmask, fieldmask, signmask, ss;
4099 bfd_vma a, b, sum;
4100
4101 /* Get the values to be added together. For signed and unsigned
4102 relocations, we assume that all values should be truncated to
4103 the size of an address. For bitfields, all the bits matter.
4104 See also bfd_check_overflow. */
4105 fieldmask = N_ONES (howto->bitsize);
4106 signmask = ~fieldmask;
4107 addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
4108 a = (relocation & addrmask) >> rightshift;
4109 b = (x & howto->src_mask & addrmask) >> bitpos;
4110
4111 switch (howto->complain_on_overflow)
4112 {
4113 case complain_overflow_signed:
4114 /* If any sign bits are set, all sign bits must be set.
4115 That is, A must be a valid negative address after
4116 shifting. */
4117 signmask = ~(fieldmask >> 1);
4118 /* Fall through. */
4119
4120 case complain_overflow_bitfield:
4121 /* Much like the signed check, but for a field one bit
4122 wider. We allow a bitfield to represent numbers in the
4123 range -2**n to 2**n-1, where n is the number of bits in the
4124 field. Note that when bfd_vma is 32 bits, a 32-bit reloc
4125 can't overflow, which is exactly what we want. */
4126 ss = a & signmask;
4127 if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
4128 flag = bfd_reloc_overflow;
4129
4130 /* We only need this next bit of code if the sign bit of B
4131 is below the sign bit of A. This would only happen if
4132 SRC_MASK had fewer bits than BITSIZE. Note that if
4133 SRC_MASK has more bits than BITSIZE, we can get into
4134 trouble; we would need to verify that B is in range, as
4135 we do for A above. */
4136 ss = ((~howto->src_mask) >> 1) & howto->src_mask;
4137 ss >>= bitpos;
4138
4139 /* Set all the bits above the sign bit. */
4140 b = (b ^ ss) - ss;
4141
4142 /* Now we can do the addition. */
4143 sum = a + b;
4144
4145 /* See if the result has the correct sign. Bits above the
4146 sign bit are junk now; ignore them. If the sum is
4147 positive, make sure we did not have all negative inputs;
4148 if the sum is negative, make sure we did not have all
4149 positive inputs. The test below looks only at the sign
4150 bits, and it really just
4151 SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
4152
4153 We mask with addrmask here to explicitly allow an address
4154 wrap-around. The Linux kernel relies on it, and it is
4155 the only way to write assembler code which can run when
4156 loaded at a location 0x80000000 away from the location at
4157 which it is linked. */
4158 if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
4159 flag = bfd_reloc_overflow;
4160
4161 break;
4162
4163 case complain_overflow_unsigned:
4164 /* Checking for an unsigned overflow is relatively easy:
4165 trim the addresses and add, and trim the result as well.
4166 Overflow is normally indicated when the result does not
4167 fit in the field. However, we also need to consider the
4168 case when, e.g., fieldmask is 0x7fffffff or smaller, an
4169 input is 0x80000000, and bfd_vma is only 32 bits; then we
4170 will get sum == 0, but there is an overflow, since the
4171 inputs did not fit in the field. Instead of doing a
4172 separate test, we can check for this by or-ing in the
4173 operands when testing for the sum overflowing its final
4174 field. */
4175 sum = (a + b) & addrmask;
4176 if ((a | b | sum) & signmask)
4177 flag = bfd_reloc_overflow;
4178 break;
4179
4180 default:
4181 abort ();
4182 }
4183 }
4184
4185 /* Put RELOCATION in the right bits. */
4186 relocation >>= (bfd_vma) rightshift;
4187 relocation <<= (bfd_vma) bitpos;
4188
4189 /* Add RELOCATION to the right bits of X. */
4190 /* FIXME : 090616
4191 Because the relaxation may generate duplicate relocation at one address,
4192 an addition to immediate in the instruction may cause the relocation added
4193 several times.
4194 This bug should be fixed in assembler, but a check is also needed here. */
4195 if (howto->partial_inplace)
4196 x = ((x & ~howto->dst_mask)
4197 | (((x & howto->src_mask) + relocation) & howto->dst_mask));
4198 else
4199 x = ((x & ~howto->dst_mask) | ((relocation) & howto->dst_mask));
4200
4201
4202 /* Put the relocated value back in the object file. */
4203 switch (size)
4204 {
4205 default:
4206 case 0:
4207 case 1:
4208 case 8:
4209 abort ();
4210 break;
4211 case 2:
4212 bfd_putb16 (x, location);
4213 break;
4214 case 4:
4215 bfd_putb32 (x, location);
4216 break;
4217 }
4218
4219 return flag;
4220 }
4221
4222 static bfd_reloc_status_type
4223 nds32_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
4224 asection *input_section, bfd_byte *contents,
4225 bfd_vma address, bfd_vma value, bfd_vma addend)
4226 {
4227 bfd_vma relocation;
4228
4229 /* Sanity check the address. */
4230 if (address > bfd_get_section_limit (input_bfd, input_section))
4231 return bfd_reloc_outofrange;
4232
4233 /* This function assumes that we are dealing with a basic relocation
4234 against a symbol. We want to compute the value of the symbol to
4235 relocate to. This is just VALUE, the value of the symbol, plus
4236 ADDEND, any addend associated with the reloc. */
4237 relocation = value + addend;
4238
4239 /* If the relocation is PC relative, we want to set RELOCATION to
4240 the distance between the symbol (currently in RELOCATION) and the
4241 location we are relocating. Some targets (e.g., i386-aout)
4242 arrange for the contents of the section to be the negative of the
4243 offset of the location within the section; for such targets
4244 pcrel_offset is FALSE. Other targets (e.g., m88kbcs or ELF)
4245 simply leave the contents of the section as zero; for such
4246 targets pcrel_offset is TRUE. If pcrel_offset is FALSE we do not
4247 need to subtract out the offset of the location within the
4248 section (which is just ADDRESS). */
4249 if (howto->pc_relative)
4250 {
4251 relocation -= (input_section->output_section->vma
4252 + input_section->output_offset);
4253 if (howto->pcrel_offset)
4254 relocation -= address;
4255 }
4256
4257 return nds32_relocate_contents (howto, input_bfd, relocation,
4258 contents + address);
4259 }
4260
4261 static bfd_boolean
4262 nds32_elf_output_symbol_hook (struct bfd_link_info *info,
4263 const char *name,
4264 Elf_Internal_Sym *elfsym ATTRIBUTE_UNUSED,
4265 asection *input_sec,
4266 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
4267 {
4268 const char *source;
4269 FILE *sym_ld_script = NULL;
4270 struct elf_nds32_link_hash_table *table;
4271
4272 table = nds32_elf_hash_table (info);
4273 sym_ld_script = table->sym_ld_script;
4274 if (!sym_ld_script)
4275 return TRUE;
4276
4277 if (!h || !name || *name == '\0')
4278 return TRUE;
4279
4280 if (input_sec->flags & SEC_EXCLUDE)
4281 return TRUE;
4282
4283 if (!check_start_export_sym)
4284 {
4285 fprintf (sym_ld_script, "SECTIONS\n{\n");
4286 check_start_export_sym = 1;
4287 }
4288
4289 if (h->root.type == bfd_link_hash_defined
4290 || h->root.type == bfd_link_hash_defweak)
4291 {
4292 if (!h->root.u.def.section->output_section)
4293 return TRUE;
4294
4295 if (bfd_is_const_section (input_sec))
4296 source = input_sec->name;
4297 else
4298 source = input_sec->owner->filename;
4299
4300 fprintf (sym_ld_script, "\t%s = 0x%08lx;\t /* %s */\n",
4301 h->root.root.string,
4302 (long) (h->root.u.def.value
4303 + h->root.u.def.section->output_section->vma
4304 + h->root.u.def.section->output_offset), source);
4305 }
4306
4307 return TRUE;
4308 }
4309
4310 /* Relocate an NDS32/D ELF section.
4311 There is some attempt to make this function usable for many architectures,
4312 both for RELA and REL type relocs, if only to serve as a learning tool.
4313
4314 The RELOCATE_SECTION function is called by the new ELF backend linker
4315 to handle the relocations for a section.
4316
4317 The relocs are always passed as Rela structures; if the section
4318 actually uses Rel structures, the r_addend field will always be
4319 zero.
4320
4321 This function is responsible for adjust the section contents as
4322 necessary, and (if using Rela relocs and generating a
4323 relocatable output file) adjusting the reloc addend as
4324 necessary.
4325
4326 This function does not have to worry about setting the reloc
4327 address or the reloc symbol index.
4328
4329 LOCAL_SYMS is a pointer to the swapped in local symbols.
4330
4331 LOCAL_SECTIONS is an array giving the section in the input file
4332 corresponding to the st_shndx field of each local symbol.
4333
4334 The global hash table entry for the global symbols can be found
4335 via elf_sym_hashes (input_bfd).
4336
4337 When generating relocatable output, this function must handle
4338 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
4339 going to be the section symbol corresponding to the output
4340 section, which means that the addend must be adjusted
4341 accordingly. */
4342
4343 static bfd_vma
4344 dtpoff_base (struct bfd_link_info *info)
4345 {
4346 /* If tls_sec is NULL, we should have signalled an error already. */
4347 if (elf_hash_table (info)->tls_sec == NULL)
4348 return 0;
4349 return elf_hash_table (info)->tls_sec->vma;
4350 }
4351
4352 static bfd_boolean
4353 nds32_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
4354 struct bfd_link_info * info,
4355 bfd * input_bfd,
4356 asection * input_section,
4357 bfd_byte * contents,
4358 Elf_Internal_Rela * relocs,
4359 Elf_Internal_Sym * local_syms,
4360 asection ** local_sections)
4361 {
4362 Elf_Internal_Shdr *symtab_hdr;
4363 struct elf_link_hash_entry **sym_hashes;
4364 Elf_Internal_Rela *rel, *relend;
4365 bfd_boolean ret = TRUE; /* Assume success. */
4366 int align = 0;
4367 bfd_reloc_status_type r;
4368 const char *errmsg = NULL;
4369 bfd_vma gp;
4370 struct elf_nds32_link_hash_table *htab;
4371 bfd *dynobj;
4372 bfd_vma *local_got_offsets;
4373 asection *sgot, *splt, *sreloc;
4374 bfd_vma high_address;
4375 struct elf_nds32_link_hash_table *table;
4376 int eliminate_gc_relocs;
4377 bfd_vma fpbase_addr;
4378
4379 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4380 sym_hashes = elf_sym_hashes (input_bfd);
4381 htab = nds32_elf_hash_table (info);
4382 high_address = bfd_get_section_limit (input_bfd, input_section);
4383
4384 dynobj = htab->root.dynobj;
4385 local_got_offsets = elf_local_got_offsets (input_bfd);
4386
4387 sgot = htab->root.sgot;
4388 splt = htab->root.splt;
4389 sreloc = NULL;
4390
4391 rel = relocs;
4392 relend = relocs + input_section->reloc_count;
4393
4394 table = nds32_elf_hash_table (info);
4395 eliminate_gc_relocs = table->eliminate_gc_relocs;
4396 /* By this time, we can adjust the value of _SDA_BASE_. */
4397 if ((!bfd_link_relocatable (info)))
4398 {
4399 is_SDA_BASE_set = 1;
4400 r = nds32_elf_final_sda_base (output_bfd, info, &gp, TRUE);
4401 if (r != bfd_reloc_ok)
4402 return FALSE;
4403 }
4404
4405 if (is_ITB_BASE_set == 0)
4406 {
4407 /* Set the _ITB_BASE_. */
4408 if (!nds32_elf_ex9_itb_base (info))
4409 {
4410 _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"),
4411 output_bfd);
4412 bfd_set_error (bfd_error_bad_value);
4413 }
4414 }
4415
4416 if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
4417 if (!nds32_elf_ifc_reloc ())
4418 _bfd_error_handler (_("error: IFC relocation error."));
4419
4420 /* Relocation for .ex9.itable. */
4421 if (table->target_optimize & NDS32_RELAX_EX9_ON
4422 || (table->ex9_import_file && table->update_ex9_table))
4423 nds32_elf_ex9_reloc_jmp (info);
4424
4425 /* Use gp as fp to prevent truncated fit. Because in relaxation time
4426 the fp value is set as gp, and it has be reverted for instruction
4427 setting fp. */
4428 fpbase_addr = elf_gp (output_bfd);
4429
4430 for (rel = relocs; rel < relend; rel++)
4431 {
4432 enum elf_nds32_reloc_type r_type;
4433 reloc_howto_type *howto = NULL;
4434 unsigned long r_symndx;
4435 struct elf_link_hash_entry *h = NULL;
4436 Elf_Internal_Sym *sym = NULL;
4437 asection *sec;
4438 bfd_vma relocation;
4439
4440 /* We can't modify r_addend here as elf_link_input_bfd has an assert to
4441 ensure it's zero (we use REL relocs, not RELA). Therefore this
4442 should be assigning zero to `addend', but for clarity we use
4443 `r_addend'. */
4444
4445 bfd_vma addend = rel->r_addend;
4446 bfd_vma offset = rel->r_offset;
4447
4448 r_type = ELF32_R_TYPE (rel->r_info);
4449 if (r_type >= R_NDS32_max)
4450 {
4451 /* xgettext:c-format */
4452 _bfd_error_handler (_("%B: error: unknown relocation type %d."),
4453 input_bfd, r_type);
4454 bfd_set_error (bfd_error_bad_value);
4455 ret = FALSE;
4456 continue;
4457 }
4458
4459 if (r_type == R_NDS32_GNU_VTENTRY
4460 || r_type == R_NDS32_GNU_VTINHERIT
4461 || r_type == R_NDS32_NONE
4462 || r_type == R_NDS32_RELA_GNU_VTENTRY
4463 || r_type == R_NDS32_RELA_GNU_VTINHERIT
4464 || (r_type >= R_NDS32_INSN16 && r_type <= R_NDS32_25_FIXED_RELA)
4465 || r_type == R_NDS32_DATA
4466 || r_type == R_NDS32_TRAN
4467 || (r_type >= R_NDS32_LONGCALL4 && r_type <= R_NDS32_LONGJUMP7))
4468 continue;
4469
4470 /* If we enter the fp-as-gp region. Resolve the address
4471 of best fp-base. */
4472 if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_BEGIN
4473 && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
4474 {
4475 int dist;
4476
4477 /* Distance to relocation of best fp-base is encoded in R_SYM. */
4478 dist = rel->r_addend >> 16;
4479 fpbase_addr = calculate_memory_address (input_bfd, rel + dist,
4480 local_syms, symtab_hdr);
4481 }
4482 else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_END
4483 && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
4484 {
4485 fpbase_addr = elf_gp (output_bfd);
4486 }
4487
4488 if (((r_type >= R_NDS32_DWARF2_OP1_RELA
4489 && r_type <= R_NDS32_DWARF2_LEB_RELA)
4490 || r_type >= R_NDS32_RELAX_ENTRY) && !bfd_link_relocatable (info))
4491 continue;
4492
4493 howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
4494 r_symndx = ELF32_R_SYM (rel->r_info);
4495
4496 /* This is a final link. */
4497 sym = NULL;
4498 sec = NULL;
4499 h = NULL;
4500
4501 if (r_symndx < symtab_hdr->sh_info)
4502 {
4503 /* Local symbol. */
4504 sym = local_syms + r_symndx;
4505 sec = local_sections[r_symndx];
4506
4507 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4508 addend = rel->r_addend;
4509 }
4510 else
4511 {
4512 /* External symbol. */
4513 bfd_boolean warned, ignored, unresolved_reloc;
4514 int symndx = r_symndx - symtab_hdr->sh_info;
4515
4516 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4517 r_symndx, symtab_hdr, sym_hashes, h, sec,
4518 relocation, unresolved_reloc, warned,
4519 ignored);
4520
4521 /* la $fp, _FP_BASE_ is per-function (region).
4522 Handle it specially. */
4523 switch ((int) r_type)
4524 {
4525 case R_NDS32_SDA19S0_RELA:
4526 case R_NDS32_SDA15S0_RELA:
4527 case R_NDS32_20_RELA:
4528 if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
4529 FP_BASE_NAME) == 0)
4530 {
4531 relocation = fpbase_addr;
4532 break;
4533 }
4534 }
4535
4536 }
4537
4538 if (bfd_link_relocatable (info))
4539 {
4540 /* This is a relocatable link. We don't have to change
4541 anything, unless the reloc is against a section symbol,
4542 in which case we have to adjust according to where the
4543 section symbol winds up in the output section. */
4544 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4545 rel->r_addend += sec->output_offset + sym->st_value;
4546
4547 continue;
4548 }
4549
4550 /* Sanity check the address. */
4551 if (offset > high_address)
4552 {
4553 r = bfd_reloc_outofrange;
4554 goto check_reloc;
4555 }
4556
4557 if ((r_type >= R_NDS32_DWARF2_OP1_RELA
4558 && r_type <= R_NDS32_DWARF2_LEB_RELA)
4559 || r_type >= R_NDS32_RELAX_ENTRY)
4560 continue;
4561
4562 switch ((int) r_type)
4563 {
4564 case R_NDS32_GOTOFF:
4565 /* Relocation is relative to the start of the global offset
4566 table (for ld24 rx, #uimm24), e.g. access at label+addend
4567
4568 ld24 rx. #label@GOTOFF + addend
4569 sub rx, r12. */
4570 case R_NDS32_GOTOFF_HI20:
4571 case R_NDS32_GOTOFF_LO12:
4572 case R_NDS32_GOTOFF_LO15:
4573 case R_NDS32_GOTOFF_LO19:
4574 BFD_ASSERT (sgot != NULL);
4575
4576 relocation -= elf_gp (output_bfd);
4577 break;
4578
4579 case R_NDS32_9_PLTREL:
4580 case R_NDS32_25_PLTREL:
4581 /* Relocation is to the entry for this symbol in the
4582 procedure linkage table. */
4583
4584 /* The native assembler will generate a 25_PLTREL reloc
4585 for a local symbol if you assemble a call from one
4586 section to another when using -K pic. */
4587 if (h == NULL)
4588 break;
4589
4590 if (h->forced_local)
4591 break;
4592
4593 /* We didn't make a PLT entry for this symbol. This
4594 happens when statically linking PIC code, or when
4595 using -Bsymbolic. */
4596 if (h->plt.offset == (bfd_vma) - 1)
4597 break;
4598
4599 relocation = (splt->output_section->vma
4600 + splt->output_offset + h->plt.offset);
4601 break;
4602
4603 case R_NDS32_PLT_GOTREL_HI20:
4604 case R_NDS32_PLT_GOTREL_LO12:
4605 case R_NDS32_PLT_GOTREL_LO15:
4606 case R_NDS32_PLT_GOTREL_LO19:
4607 case R_NDS32_PLT_GOTREL_LO20:
4608 if (h == NULL || h->forced_local || h->plt.offset == (bfd_vma) - 1)
4609 {
4610 /* We didn't make a PLT entry for this symbol. This
4611 happens when statically linking PIC code, or when
4612 using -Bsymbolic. */
4613 relocation -= elf_gp (output_bfd);
4614 break;
4615 }
4616
4617 relocation = (splt->output_section->vma
4618 + splt->output_offset + h->plt.offset);
4619
4620 relocation -= elf_gp (output_bfd);
4621 break;
4622
4623 case R_NDS32_PLTREL_HI20:
4624 case R_NDS32_PLTREL_LO12:
4625
4626 /* Relocation is to the entry for this symbol in the
4627 procedure linkage table. */
4628
4629 /* The native assembler will generate a 25_PLTREL reloc
4630 for a local symbol if you assemble a call from one
4631 section to another when using -K pic. */
4632 if (h == NULL)
4633 break;
4634
4635 if (h->forced_local)
4636 break;
4637
4638 if (h->plt.offset == (bfd_vma) - 1)
4639 /* We didn't make a PLT entry for this symbol. This
4640 happens when statically linking PIC code, or when
4641 using -Bsymbolic. */
4642 break;
4643
4644 if (splt == NULL)
4645 break;
4646
4647 relocation = (splt->output_section->vma
4648 + splt->output_offset
4649 + h->plt.offset + 4)
4650 - (input_section->output_section->vma
4651 + input_section->output_offset
4652 + rel->r_offset);
4653
4654 break;
4655
4656 case R_NDS32_GOTPC20:
4657 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4658 ld24 rx,#_GLOBAL_OFFSET_TABLE_ */
4659 relocation = elf_gp (output_bfd);
4660 break;
4661
4662 case R_NDS32_GOTPC_HI20:
4663 case R_NDS32_GOTPC_LO12:
4664 {
4665 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4666 bl .+4
4667 seth rx,#high(_GLOBAL_OFFSET_TABLE_)
4668 or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4669 or
4670 bl .+4
4671 seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
4672 add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4673 */
4674 relocation = elf_gp (output_bfd);
4675 relocation -= (input_section->output_section->vma
4676 + input_section->output_offset + rel->r_offset);
4677 break;
4678 }
4679
4680 case R_NDS32_GOT20:
4681 /* Fall through. */
4682 case R_NDS32_GOT_HI20:
4683 case R_NDS32_GOT_LO12:
4684 case R_NDS32_GOT_LO15:
4685 case R_NDS32_GOT_LO19:
4686 /* Relocation is to the entry for this symbol in the global
4687 offset table. */
4688 BFD_ASSERT (sgot != NULL);
4689
4690 if (h != NULL)
4691 {
4692 bfd_boolean dyn;
4693 bfd_vma off;
4694
4695 off = h->got.offset;
4696 BFD_ASSERT (off != (bfd_vma) - 1);
4697 dyn = htab->root.dynamic_sections_created;
4698 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4699 bfd_link_pic (info),
4700 h)
4701 || (bfd_link_pic (info)
4702 && (info->symbolic
4703 || h->dynindx == -1
4704 || h->forced_local) && h->def_regular))
4705 {
4706 /* This is actually a static link, or it is a
4707 -Bsymbolic link and the symbol is defined
4708 locally, or the symbol was forced to be local
4709 because of a version file. We must initialize
4710 this entry in the global offset table. Since the
4711 offset must always be a multiple of 4, we use the
4712 least significant bit to record whether we have
4713 initialized it already.
4714
4715 When doing a dynamic link, we create a .rela.got
4716 relocation entry to initialize the value. This
4717 is done in the finish_dynamic_symbol routine. */
4718 if ((off & 1) != 0)
4719 off &= ~1;
4720 else
4721 {
4722 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
4723 h->got.offset |= 1;
4724 }
4725 }
4726 relocation = sgot->output_section->vma + sgot->output_offset + off
4727 - elf_gp (output_bfd);
4728 }
4729 else
4730 {
4731 bfd_vma off;
4732 bfd_byte *loc;
4733
4734 BFD_ASSERT (local_got_offsets != NULL
4735 && local_got_offsets[r_symndx] != (bfd_vma) - 1);
4736
4737 off = local_got_offsets[r_symndx];
4738
4739 /* The offset must always be a multiple of 4. We use
4740 the least significant bit to record whether we have
4741 already processed this entry. */
4742 if ((off & 1) != 0)
4743 off &= ~1;
4744 else
4745 {
4746 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
4747
4748 if (bfd_link_pic (info))
4749 {
4750 asection *srelgot;
4751 Elf_Internal_Rela outrel;
4752
4753 /* We need to generate a R_NDS32_RELATIVE reloc
4754 for the dynamic linker. */
4755 srelgot = htab->root.srelgot;
4756 BFD_ASSERT (srelgot != NULL);
4757
4758 outrel.r_offset = (elf_gp (output_bfd)
4759 + sgot->output_offset + off);
4760 outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
4761 outrel.r_addend = relocation;
4762 loc = srelgot->contents;
4763 loc +=
4764 srelgot->reloc_count * sizeof (Elf32_External_Rela);
4765 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4766 ++srelgot->reloc_count;
4767 }
4768 local_got_offsets[r_symndx] |= 1;
4769 }
4770 relocation = sgot->output_section->vma + sgot->output_offset + off
4771 - elf_gp (output_bfd);
4772 }
4773
4774 break;
4775
4776 case R_NDS32_16_RELA:
4777 case R_NDS32_20_RELA:
4778 case R_NDS32_5_RELA:
4779 case R_NDS32_32_RELA:
4780 case R_NDS32_9_PCREL_RELA:
4781 case R_NDS32_WORD_9_PCREL_RELA:
4782 case R_NDS32_10_UPCREL_RELA:
4783 case R_NDS32_15_PCREL_RELA:
4784 case R_NDS32_17_PCREL_RELA:
4785 case R_NDS32_25_PCREL_RELA:
4786 case R_NDS32_HI20_RELA:
4787 case R_NDS32_LO12S3_RELA:
4788 case R_NDS32_LO12S2_RELA:
4789 case R_NDS32_LO12S2_DP_RELA:
4790 case R_NDS32_LO12S2_SP_RELA:
4791 case R_NDS32_LO12S1_RELA:
4792 case R_NDS32_LO12S0_RELA:
4793 case R_NDS32_LO12S0_ORI_RELA:
4794 if (bfd_link_pic (info) && r_symndx != 0
4795 && (input_section->flags & SEC_ALLOC) != 0
4796 && (eliminate_gc_relocs == 0
4797 || (sec && (sec->flags & SEC_EXCLUDE) == 0))
4798 && ((r_type != R_NDS32_9_PCREL_RELA
4799 && r_type != R_NDS32_WORD_9_PCREL_RELA
4800 && r_type != R_NDS32_10_UPCREL_RELA
4801 && r_type != R_NDS32_15_PCREL_RELA
4802 && r_type != R_NDS32_17_PCREL_RELA
4803 && r_type != R_NDS32_25_PCREL_RELA
4804 && !(r_type == R_NDS32_32_RELA
4805 && strcmp (input_section->name, ".eh_frame") == 0))
4806 || (h != NULL && h->dynindx != -1
4807 && (!info->symbolic || !h->def_regular))))
4808 {
4809 Elf_Internal_Rela outrel;
4810 bfd_boolean skip, relocate;
4811 bfd_byte *loc;
4812
4813 /* When generating a shared object, these relocations
4814 are copied into the output file to be resolved at run
4815 time. */
4816
4817 if (sreloc == NULL)
4818 {
4819 const char *name;
4820
4821 name = bfd_elf_string_from_elf_section
4822 (input_bfd, elf_elfheader (input_bfd)->e_shstrndx,
4823 elf_section_data (input_section)->rela.hdr->sh_name);
4824 if (name == NULL)
4825 return FALSE;
4826
4827 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
4828 && strcmp (bfd_get_section_name (input_bfd,
4829 input_section),
4830 name + 5) == 0);
4831
4832 sreloc = bfd_get_section_by_name (dynobj, name);
4833 BFD_ASSERT (sreloc != NULL);
4834 }
4835
4836 skip = FALSE;
4837 relocate = FALSE;
4838
4839 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
4840 info,
4841 input_section,
4842 rel->r_offset);
4843 if (outrel.r_offset == (bfd_vma) - 1)
4844 skip = TRUE;
4845 else if (outrel.r_offset == (bfd_vma) - 2)
4846 skip = TRUE, relocate = TRUE;
4847 outrel.r_offset += (input_section->output_section->vma
4848 + input_section->output_offset);
4849
4850 if (skip)
4851 memset (&outrel, 0, sizeof outrel);
4852 else if (r_type == R_NDS32_17_PCREL_RELA
4853 || r_type == R_NDS32_15_PCREL_RELA
4854 || r_type == R_NDS32_25_PCREL_RELA)
4855 {
4856 BFD_ASSERT (h != NULL && h->dynindx != -1);
4857 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4858 outrel.r_addend = rel->r_addend;
4859 }
4860 else
4861 {
4862 /* h->dynindx may be -1 if this symbol was marked to
4863 become local. */
4864 if (h == NULL
4865 || ((info->symbolic || h->dynindx == -1)
4866 && h->def_regular))
4867 {
4868 relocate = TRUE;
4869 outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
4870 outrel.r_addend = relocation + rel->r_addend;
4871 }
4872 else
4873 {
4874 BFD_ASSERT (h->dynindx != -1);
4875 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4876 outrel.r_addend = rel->r_addend;
4877 }
4878 }
4879
4880 loc = sreloc->contents;
4881 loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
4882 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4883 ++sreloc->reloc_count;
4884
4885 /* If this reloc is against an external symbol, we do
4886 not want to fiddle with the addend. Otherwise, we
4887 need to include the symbol value so that it becomes
4888 an addend for the dynamic reloc. */
4889 if (!relocate)
4890 continue;
4891 }
4892 break;
4893
4894 case R_NDS32_25_ABS_RELA:
4895 if (bfd_link_pic (info))
4896 {
4897 _bfd_error_handler
4898 (_("%B: warning: cannot deal R_NDS32_25_ABS_RELA in shared "
4899 "mode."), input_bfd);
4900 return FALSE;
4901 }
4902 break;
4903
4904 case R_NDS32_9_PCREL:
4905 r = nds32_elf_do_9_pcrel_reloc (input_bfd, howto, input_section,
4906 contents, offset,
4907 sec, relocation, addend);
4908 goto check_reloc;
4909
4910 case R_NDS32_HI20:
4911 {
4912 Elf_Internal_Rela *lorel;
4913
4914 /* We allow an arbitrary number of HI20 relocs before the
4915 LO12 reloc. This permits gcc to emit the HI and LO relocs
4916 itself. */
4917 for (lorel = rel + 1;
4918 (lorel < relend
4919 && ELF32_R_TYPE (lorel->r_info) == R_NDS32_HI20); lorel++)
4920 continue;
4921 if (lorel < relend
4922 && (ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S3
4923 || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S2
4924 || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S1
4925 || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S0))
4926 {
4927 nds32_elf_relocate_hi20 (input_bfd, r_type, rel, lorel,
4928 contents, relocation + addend);
4929 r = bfd_reloc_ok;
4930 }
4931 else
4932 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4933 contents, offset, relocation,
4934 addend);
4935 }
4936
4937 goto check_reloc;
4938
4939 case R_NDS32_GOT17S2_RELA:
4940 case R_NDS32_GOT15S2_RELA:
4941 {
4942 bfd_vma off;
4943
4944 BFD_ASSERT (sgot != NULL);
4945
4946 if (h != NULL)
4947 {
4948 bfd_boolean dyn;
4949
4950 off = h->got.offset;
4951 BFD_ASSERT (off != (bfd_vma) - 1);
4952
4953 dyn = htab->root.dynamic_sections_created;
4954 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
4955 (dyn, bfd_link_pic (info), h)
4956 || (bfd_link_pic (info)
4957 && (info->symbolic
4958 || h->dynindx == -1
4959 || h->forced_local)
4960 && h->def_regular))
4961 {
4962 /* This is actually a static link, or it is a
4963 -Bsymbolic link and the symbol is defined
4964 locally, or the symbol was forced to be local
4965 because of a version file. We must initialize
4966 this entry in the global offset table. Since the
4967 offset must always be a multiple of 4, we use the
4968 least significant bit to record whether we have
4969 initialized it already.
4970
4971 When doing a dynamic link, we create a .rela.got
4972 relocation entry to initialize the value. This
4973 is done in the finish_dynamic_symbol routine. */
4974 if ((off & 1) != 0)
4975 off &= ~1;
4976 else
4977 {
4978 bfd_put_32 (output_bfd, relocation,
4979 sgot->contents + off);
4980 h->got.offset |= 1;
4981 }
4982 }
4983 }
4984 else
4985 {
4986 bfd_byte *loc;
4987
4988 BFD_ASSERT (local_got_offsets != NULL
4989 && local_got_offsets[r_symndx] != (bfd_vma) - 1);
4990
4991 off = local_got_offsets[r_symndx];
4992
4993 /* The offset must always be a multiple of 4. We use
4994 the least significant bit to record whether we have
4995 already processed this entry. */
4996 if ((off & 1) != 0)
4997 off &= ~1;
4998 else
4999 {
5000 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5001
5002 if (bfd_link_pic (info))
5003 {
5004 asection *srelgot;
5005 Elf_Internal_Rela outrel;
5006
5007 /* We need to generate a R_NDS32_RELATIVE reloc
5008 for the dynamic linker. */
5009 srelgot = htab->root.srelgot;
5010 BFD_ASSERT (srelgot != NULL);
5011
5012 outrel.r_offset = (elf_gp (output_bfd)
5013 + sgot->output_offset + off);
5014 outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5015 outrel.r_addend = relocation;
5016 loc = srelgot->contents;
5017 loc +=
5018 srelgot->reloc_count * sizeof (Elf32_External_Rela);
5019 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5020 ++srelgot->reloc_count;
5021 }
5022 local_got_offsets[r_symndx] |= 1;
5023 }
5024 }
5025 relocation = sgot->output_section->vma + sgot->output_offset + off
5026 - elf_gp (output_bfd);
5027 }
5028 if (relocation & align)
5029 {
5030 /* Incorrect alignment. */
5031 _bfd_error_handler
5032 (_("%B: warning: unaligned access to GOT entry."), input_bfd);
5033 ret = FALSE;
5034 r = bfd_reloc_dangerous;
5035 goto check_reloc;
5036 }
5037 break;
5038
5039 case R_NDS32_SDA16S3_RELA:
5040 case R_NDS32_SDA15S3_RELA:
5041 case R_NDS32_SDA15S3:
5042 align = 0x7;
5043 goto handle_sda;
5044
5045 case R_NDS32_SDA17S2_RELA:
5046 case R_NDS32_SDA15S2_RELA:
5047 case R_NDS32_SDA12S2_SP_RELA:
5048 case R_NDS32_SDA12S2_DP_RELA:
5049 case R_NDS32_SDA15S2:
5050 case R_NDS32_SDA_FP7U2_RELA:
5051 align = 0x3;
5052 goto handle_sda;
5053
5054 case R_NDS32_SDA18S1_RELA:
5055 case R_NDS32_SDA15S1_RELA:
5056 case R_NDS32_SDA15S1:
5057 align = 0x1;
5058 goto handle_sda;
5059
5060 case R_NDS32_SDA19S0_RELA:
5061 case R_NDS32_SDA15S0_RELA:
5062 case R_NDS32_SDA15S0:
5063 {
5064 align = 0x0;
5065 handle_sda:
5066 BFD_ASSERT (sec != NULL);
5067
5068 /* If the symbol is in the abs section, the out_bfd will be null.
5069 This happens when the relocation has a symbol@GOTOFF. */
5070 r = nds32_elf_final_sda_base (output_bfd, info, &gp, FALSE);
5071 if (r != bfd_reloc_ok)
5072 {
5073 _bfd_error_handler
5074 (_("%B: warning: relocate SDA_BASE failed."), input_bfd);
5075 ret = FALSE;
5076 goto check_reloc;
5077 }
5078
5079 /* At this point `relocation' contains the object's
5080 address. */
5081 if (r_type == R_NDS32_SDA_FP7U2_RELA)
5082 {
5083 relocation -= fpbase_addr;
5084 }
5085 else
5086 relocation -= gp;
5087 /* Now it contains the offset from _SDA_BASE_. */
5088
5089 /* Make sure alignment is correct. */
5090
5091 if (relocation & align)
5092 {
5093 /* Incorrect alignment. */
5094 _bfd_error_handler
5095 /* xgettext:c-format */
5096 (_("%B(%A): warning: unaligned small data access of type %d."),
5097 input_bfd, input_section, r_type);
5098 ret = FALSE;
5099 goto check_reloc;
5100 }
5101 }
5102
5103 break;
5104 case R_NDS32_17IFC_PCREL_RELA:
5105 case R_NDS32_10IFCU_PCREL_RELA:
5106 /* do nothing */
5107 break;
5108
5109 case R_NDS32_TLS_LE_HI20:
5110 case R_NDS32_TLS_LE_LO12:
5111 case R_NDS32_TLS_LE_20:
5112 case R_NDS32_TLS_LE_15S0:
5113 case R_NDS32_TLS_LE_15S1:
5114 case R_NDS32_TLS_LE_15S2:
5115 if (elf_hash_table (info)->tls_sec != NULL)
5116 relocation -= (elf_hash_table (info)->tls_sec->vma + TP_OFFSET);
5117 break;
5118 case R_NDS32_TLS_IE_HI20:
5119 case R_NDS32_TLS_IE_LO12S2:
5120 {
5121 /* Relocation is to the entry for this symbol in the global
5122 offset table. */
5123 unsigned int tls_type;
5124 asection *srelgot;
5125 Elf_Internal_Rela outrel;
5126 bfd_vma off;
5127 bfd_byte *loc;
5128 int indx = 0;
5129
5130 BFD_ASSERT (sgot != NULL);
5131 if (h != NULL)
5132 {
5133 bfd_boolean dyn;
5134
5135 off = h->got.offset;
5136 BFD_ASSERT (off != (bfd_vma) - 1);
5137 dyn = htab->root.dynamic_sections_created;
5138 tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
5139 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5140 && (!bfd_link_pic (info)
5141 || !SYMBOL_REFERENCES_LOCAL (info, h)))
5142 indx = h->dynindx;
5143 }
5144 else
5145 {
5146 /* Never happen currently. */
5147 BFD_ASSERT (local_got_offsets != NULL
5148 && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5149
5150 off = local_got_offsets[r_symndx];
5151
5152 tls_type = elf32_nds32_local_got_tls_type (input_bfd)[r_symndx];
5153 }
5154 relocation = sgot->output_section->vma + sgot->output_offset + off;
5155
5156 if (r_type == R_NDS32_TLS_IE_LO12S2)
5157 break;
5158
5159 /* The offset must always be a multiple of 4. We use
5160 the least significant bit to record whether we have
5161 already processed this entry. */
5162 if ((off & 1) != 0)
5163 off &= ~1;
5164 else
5165 {
5166 bfd_boolean need_relocs = FALSE;
5167 srelgot = htab->root.srelgot;
5168 if ((bfd_link_pic (info) || indx != 0)
5169 && (h == NULL
5170 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5171 || h->root.type != bfd_link_hash_undefweak))
5172 {
5173 need_relocs = TRUE;
5174 BFD_ASSERT (srelgot != NULL);
5175 }
5176 if (tls_type & GOT_TLS_IE)
5177 {
5178 if (need_relocs)
5179 {
5180 if (h->dynindx == 0)
5181 outrel.r_addend = relocation - dtpoff_base (info);
5182 else
5183 outrel.r_addend = 0;
5184 outrel.r_offset = (sgot->output_section->vma
5185 + sgot->output_offset
5186 + off);
5187 outrel.r_info =
5188 ELF32_R_INFO (h->dynindx, R_NDS32_TLS_TPOFF);
5189
5190 loc = srelgot->contents;
5191 loc +=
5192 srelgot->reloc_count * sizeof (Elf32_External_Rela);
5193 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5194 ++srelgot->reloc_count;
5195 }
5196 else
5197 bfd_put_32 (output_bfd, h->root.u.def.value - TP_OFFSET,
5198 sgot->contents + off);
5199 }
5200 }
5201 }
5202 break;
5203
5204 /* DON'T fall through. */
5205
5206 default:
5207 /* OLD_NDS32_RELOC. */
5208
5209 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5210 contents, offset, relocation, addend);
5211 goto check_reloc;
5212 }
5213
5214 switch ((int) r_type)
5215 {
5216 case R_NDS32_20_RELA:
5217 case R_NDS32_5_RELA:
5218 case R_NDS32_9_PCREL_RELA:
5219 case R_NDS32_WORD_9_PCREL_RELA:
5220 case R_NDS32_10_UPCREL_RELA:
5221 case R_NDS32_15_PCREL_RELA:
5222 case R_NDS32_17_PCREL_RELA:
5223 case R_NDS32_25_PCREL_RELA:
5224 case R_NDS32_25_ABS_RELA:
5225 case R_NDS32_HI20_RELA:
5226 case R_NDS32_LO12S3_RELA:
5227 case R_NDS32_LO12S2_RELA:
5228 case R_NDS32_LO12S2_DP_RELA:
5229 case R_NDS32_LO12S2_SP_RELA:
5230 case R_NDS32_LO12S1_RELA:
5231 case R_NDS32_LO12S0_RELA:
5232 case R_NDS32_LO12S0_ORI_RELA:
5233 case R_NDS32_SDA16S3_RELA:
5234 case R_NDS32_SDA17S2_RELA:
5235 case R_NDS32_SDA18S1_RELA:
5236 case R_NDS32_SDA19S0_RELA:
5237 case R_NDS32_SDA15S3_RELA:
5238 case R_NDS32_SDA15S2_RELA:
5239 case R_NDS32_SDA12S2_DP_RELA:
5240 case R_NDS32_SDA12S2_SP_RELA:
5241 case R_NDS32_SDA15S1_RELA:
5242 case R_NDS32_SDA15S0_RELA:
5243 case R_NDS32_SDA_FP7U2_RELA:
5244 case R_NDS32_9_PLTREL:
5245 case R_NDS32_25_PLTREL:
5246 case R_NDS32_GOT20:
5247 case R_NDS32_GOT_HI20:
5248 case R_NDS32_GOT_LO12:
5249 case R_NDS32_GOT_LO15:
5250 case R_NDS32_GOT_LO19:
5251 case R_NDS32_GOT15S2_RELA:
5252 case R_NDS32_GOT17S2_RELA:
5253 case R_NDS32_GOTPC20:
5254 case R_NDS32_GOTPC_HI20:
5255 case R_NDS32_GOTPC_LO12:
5256 case R_NDS32_GOTOFF:
5257 case R_NDS32_GOTOFF_HI20:
5258 case R_NDS32_GOTOFF_LO12:
5259 case R_NDS32_GOTOFF_LO15:
5260 case R_NDS32_GOTOFF_LO19:
5261 case R_NDS32_PLTREL_HI20:
5262 case R_NDS32_PLTREL_LO12:
5263 case R_NDS32_PLT_GOTREL_HI20:
5264 case R_NDS32_PLT_GOTREL_LO12:
5265 case R_NDS32_PLT_GOTREL_LO15:
5266 case R_NDS32_PLT_GOTREL_LO19:
5267 case R_NDS32_PLT_GOTREL_LO20:
5268 case R_NDS32_17IFC_PCREL_RELA:
5269 case R_NDS32_10IFCU_PCREL_RELA:
5270 case R_NDS32_TLS_LE_HI20:
5271 case R_NDS32_TLS_LE_LO12:
5272 case R_NDS32_TLS_IE_HI20:
5273 case R_NDS32_TLS_IE_LO12S2:
5274 case R_NDS32_TLS_LE_20:
5275 case R_NDS32_TLS_LE_15S0:
5276 case R_NDS32_TLS_LE_15S1:
5277 case R_NDS32_TLS_LE_15S2:
5278 /* Instruction related relocs must handle endian properly. */
5279 /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER. */
5280 r = nds32_elf_final_link_relocate (howto, input_bfd,
5281 input_section, contents,
5282 rel->r_offset, relocation,
5283 rel->r_addend);
5284 break;
5285
5286 default:
5287 /* All other relocs can use default handler. */
5288 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5289 contents, rel->r_offset,
5290 relocation, rel->r_addend);
5291 break;
5292 }
5293
5294 check_reloc:
5295
5296 if (r != bfd_reloc_ok)
5297 {
5298 /* FIXME: This should be generic enough to go in a utility. */
5299 const char *name;
5300
5301 if (h != NULL)
5302 name = h->root.root.string;
5303 else
5304 {
5305 name = bfd_elf_string_from_elf_section
5306 (input_bfd, symtab_hdr->sh_link, sym->st_name);
5307 if (name == NULL || *name == '\0')
5308 name = bfd_section_name (input_bfd, sec);
5309 }
5310
5311 if (errmsg != NULL)
5312 goto common_error;
5313
5314 switch (r)
5315 {
5316 case bfd_reloc_overflow:
5317 (*info->callbacks->reloc_overflow)
5318 (info, (h ? &h->root : NULL), name, howto->name,
5319 (bfd_vma) 0, input_bfd, input_section, offset);
5320 break;
5321
5322 case bfd_reloc_undefined:
5323 (*info->callbacks->undefined_symbol)
5324 (info, name, input_bfd, input_section, offset, TRUE);
5325 break;
5326
5327 case bfd_reloc_outofrange:
5328 errmsg = _("internal error: out of range error");
5329 goto common_error;
5330
5331 case bfd_reloc_notsupported:
5332 errmsg = _("internal error: unsupported relocation error");
5333 goto common_error;
5334
5335 case bfd_reloc_dangerous:
5336 errmsg = _("internal error: dangerous error");
5337 goto common_error;
5338
5339 default:
5340 errmsg = _("internal error: unknown error");
5341 /* Fall through. */
5342
5343 common_error:
5344 (*info->callbacks->warning) (info, errmsg, name, input_bfd,
5345 input_section, offset);
5346 break;
5347 }
5348 }
5349 }
5350
5351 return ret;
5352 }
5353
5354 /* Finish up dynamic symbol handling. We set the contents of various
5355 dynamic sections here. */
5356
5357 static bfd_boolean
5358 nds32_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
5359 struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
5360 {
5361 struct elf_nds32_link_hash_table *htab;
5362 bfd_byte *loc;
5363
5364 htab = nds32_elf_hash_table (info);
5365
5366 if (h->plt.offset != (bfd_vma) - 1)
5367 {
5368 asection *splt;
5369 asection *sgot;
5370 asection *srela;
5371
5372 bfd_vma plt_index;
5373 bfd_vma got_offset;
5374 bfd_vma local_plt_offset;
5375 Elf_Internal_Rela rela;
5376
5377 /* This symbol has an entry in the procedure linkage table. Set
5378 it up. */
5379
5380 BFD_ASSERT (h->dynindx != -1);
5381
5382 splt = htab->root.splt;
5383 sgot = htab->root.sgotplt;
5384 srela = htab->root.srelplt;
5385 BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
5386
5387 /* Get the index in the procedure linkage table which
5388 corresponds to this symbol. This is the index of this symbol
5389 in all the symbols for which we are making plt entries. The
5390 first entry in the procedure linkage table is reserved. */
5391 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
5392
5393 /* Get the offset into the .got table of the entry that
5394 corresponds to this function. Each .got entry is 4 bytes.
5395 The first three are reserved. */
5396 got_offset = (plt_index + 3) * 4;
5397
5398 /* Fill in the entry in the procedure linkage table. */
5399 if (!bfd_link_pic (info))
5400 {
5401 unsigned long insn;
5402
5403 insn = PLT_ENTRY_WORD0 + (((sgot->output_section->vma
5404 + sgot->output_offset + got_offset) >> 12)
5405 & 0xfffff);
5406 bfd_putb32 (insn, splt->contents + h->plt.offset);
5407
5408 insn = PLT_ENTRY_WORD1 + (((sgot->output_section->vma
5409 + sgot->output_offset + got_offset) & 0x0fff)
5410 >> 2);
5411 bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
5412
5413 insn = PLT_ENTRY_WORD2;
5414 bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
5415
5416 insn = PLT_ENTRY_WORD3 + (plt_index & 0x7ffff);
5417 bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
5418
5419 insn = PLT_ENTRY_WORD4
5420 + (((unsigned int) ((-(h->plt.offset + 16)) >> 1)) & 0xffffff);
5421 bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
5422 local_plt_offset = 12;
5423 }
5424 else
5425 {
5426 /* sda_base must be set at this time. */
5427 unsigned long insn;
5428 long offset;
5429
5430 /* FIXME, sda_base is 65536, it will damage opcode. */
5431 /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5432 offset = sgot->output_section->vma + sgot->output_offset + got_offset
5433 - elf_gp (output_bfd);
5434 insn = PLT_PIC_ENTRY_WORD0 + ((offset >> 12) & 0xfffff);
5435 bfd_putb32 (insn, splt->contents + h->plt.offset);
5436
5437 insn = PLT_PIC_ENTRY_WORD1 + (offset & 0xfff);
5438 bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
5439
5440 insn = PLT_PIC_ENTRY_WORD2;
5441 bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
5442
5443 insn = PLT_PIC_ENTRY_WORD3;
5444 bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
5445
5446 insn = PLT_PIC_ENTRY_WORD4 + (plt_index & 0x7fffff);
5447 bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
5448
5449 insn = PLT_PIC_ENTRY_WORD5
5450 + (((unsigned int) ((-(h->plt.offset + 20)) >> 1)) & 0xffffff);
5451 bfd_putb32 (insn, splt->contents + h->plt.offset + 20);
5452
5453 local_plt_offset = 16;
5454 }
5455
5456 /* Fill in the entry in the global offset table,
5457 so it will fall through to the next instruction for the first time. */
5458 bfd_put_32 (output_bfd,
5459 (splt->output_section->vma + splt->output_offset
5460 + h->plt.offset + local_plt_offset),
5461 sgot->contents + got_offset);
5462
5463 /* Fill in the entry in the .rela.plt section. */
5464 rela.r_offset = (sgot->output_section->vma
5465 + sgot->output_offset + got_offset);
5466 rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_JMP_SLOT);
5467 rela.r_addend = 0;
5468 loc = srela->contents;
5469 loc += plt_index * sizeof (Elf32_External_Rela);
5470 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5471
5472 if (!h->def_regular)
5473 {
5474 /* Mark the symbol as undefined, rather than as defined in
5475 the .plt section. Leave the value alone. */
5476 sym->st_shndx = SHN_UNDEF;
5477 if (!h->ref_regular_nonweak)
5478 sym->st_value = 0;
5479 }
5480 }
5481
5482 if (h->got.offset != (bfd_vma) - 1)
5483 {
5484 asection *sgot;
5485 asection *srela;
5486 Elf_Internal_Rela rela;
5487
5488 /* This symbol has an entry in the global offset table.
5489 Set it up. */
5490
5491 sgot = htab->root.sgot;
5492 srela = htab->root.srelgot;
5493 BFD_ASSERT (sgot != NULL && srela != NULL);
5494
5495 rela.r_offset = (sgot->output_section->vma
5496 + sgot->output_offset + (h->got.offset & ~1));
5497
5498 /* If this is a -Bsymbolic link, and the symbol is defined
5499 locally, we just want to emit a RELATIVE reloc. Likewise if
5500 the symbol was forced to be local because of a version file.
5501 The entry in the global offset table will already have been
5502 initialized in the relocate_section function. */
5503 if (bfd_link_pic (info)
5504 && (info->symbolic
5505 || h->dynindx == -1 || h->forced_local) && h->def_regular)
5506 {
5507 rela.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5508 rela.r_addend = (h->root.u.def.value
5509 + h->root.u.def.section->output_section->vma
5510 + h->root.u.def.section->output_offset);
5511 }
5512 else
5513 {
5514 BFD_ASSERT ((h->got.offset & 1) == 0);
5515 bfd_put_32 (output_bfd, (bfd_vma) 0,
5516 sgot->contents + h->got.offset);
5517 rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_GLOB_DAT);
5518 rela.r_addend = 0;
5519 }
5520
5521 loc = srela->contents;
5522 loc += srela->reloc_count * sizeof (Elf32_External_Rela);
5523 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5524 ++srela->reloc_count;
5525 }
5526
5527 if (h->needs_copy)
5528 {
5529 asection *s;
5530 Elf_Internal_Rela rela;
5531
5532 /* This symbols needs a copy reloc. Set it up. */
5533
5534 BFD_ASSERT (h->dynindx != -1
5535 && (h->root.type == bfd_link_hash_defined
5536 || h->root.type == bfd_link_hash_defweak));
5537
5538 s = bfd_get_section_by_name (h->root.u.def.section->owner, ".rela.bss");
5539 BFD_ASSERT (s != NULL);
5540
5541 rela.r_offset = (h->root.u.def.value
5542 + h->root.u.def.section->output_section->vma
5543 + h->root.u.def.section->output_offset);
5544 rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_COPY);
5545 rela.r_addend = 0;
5546 loc = s->contents;
5547 loc += s->reloc_count * sizeof (Elf32_External_Rela);
5548 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5549 ++s->reloc_count;
5550 }
5551
5552 /* Mark some specially defined symbols as absolute. */
5553 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5554 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
5555 sym->st_shndx = SHN_ABS;
5556
5557 return TRUE;
5558 }
5559
5560
5561 /* Finish up the dynamic sections. */
5562
5563 static bfd_boolean
5564 nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
5565 {
5566 struct elf_nds32_link_hash_table *htab;
5567 bfd *dynobj;
5568 asection *sdyn;
5569 asection *sgot;
5570
5571 htab = nds32_elf_hash_table (info);
5572 dynobj = htab->root.dynobj;
5573
5574 sgot = htab->root.sgotplt;
5575 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5576
5577 if (htab->root.dynamic_sections_created)
5578 {
5579 asection *splt;
5580 Elf32_External_Dyn *dyncon, *dynconend;
5581
5582 BFD_ASSERT (sgot != NULL && sdyn != NULL);
5583
5584 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5585 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5586
5587 for (; dyncon < dynconend; dyncon++)
5588 {
5589 Elf_Internal_Dyn dyn;
5590 asection *s;
5591
5592 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5593
5594 switch (dyn.d_tag)
5595 {
5596 default:
5597 break;
5598
5599 case DT_PLTGOT:
5600 s = htab->root.sgotplt;
5601 goto get_vma;
5602 case DT_JMPREL:
5603 s = htab->root.srelplt;
5604 get_vma:
5605 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5606 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5607 break;
5608
5609 case DT_PLTRELSZ:
5610 s = htab->root.srelplt;
5611 dyn.d_un.d_val = s->size;
5612 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5613 break;
5614 }
5615 }
5616
5617 /* Fill in the first entry in the procedure linkage table. */
5618 splt = htab->root.splt;
5619 if (splt && splt->size > 0)
5620 {
5621 if (bfd_link_pic (info))
5622 {
5623 unsigned long insn;
5624 long offset;
5625
5626 /* FIXME, sda_base is 65536, it will damage opcode. */
5627 /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5628 offset = sgot->output_section->vma + sgot->output_offset + 4
5629 - elf_gp (output_bfd);
5630 insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff);
5631 bfd_putb32 (insn, splt->contents);
5632
5633 /* insn = PLT0_PIC_ENTRY_WORD0 | (((8 - sda_base) >> 2) & 0x7fff) ; */
5634 /* here has a typo? */
5635 insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff);
5636 bfd_putb32 (insn, splt->contents + 4);
5637
5638 insn = PLT0_PIC_ENTRY_WORD2;
5639 bfd_putb32 (insn, splt->contents + 8);
5640
5641 insn = PLT0_PIC_ENTRY_WORD3;
5642 bfd_putb32 (insn, splt->contents + 12);
5643
5644 insn = PLT0_PIC_ENTRY_WORD4;
5645 bfd_putb32 (insn, splt->contents + 16);
5646
5647 insn = PLT0_PIC_ENTRY_WORD5;
5648 bfd_putb32 (insn, splt->contents + 20);
5649 }
5650 else
5651 {
5652 unsigned long insn;
5653 unsigned long addr;
5654
5655 /* addr = .got + 4 */
5656 addr = sgot->output_section->vma + sgot->output_offset + 4;
5657 insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff);
5658 bfd_putb32 (insn, splt->contents);
5659
5660 insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff);
5661 bfd_putb32 (insn, splt->contents + 4);
5662
5663 insn = PLT0_ENTRY_WORD2;
5664 bfd_putb32 (insn, splt->contents + 8);
5665
5666 insn = PLT0_ENTRY_WORD3;
5667 bfd_putb32 (insn, splt->contents + 12);
5668
5669 insn = PLT0_ENTRY_WORD4;
5670 bfd_putb32 (insn, splt->contents + 16);
5671 }
5672
5673 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
5674 PLT_ENTRY_SIZE;
5675 }
5676 }
5677
5678 /* Fill in the first three entries in the global offset table. */
5679 if (sgot && sgot->size > 0)
5680 {
5681 if (sdyn == NULL)
5682 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5683 else
5684 bfd_put_32 (output_bfd,
5685 sdyn->output_section->vma + sdyn->output_offset,
5686 sgot->contents);
5687 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
5688 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
5689
5690 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5691 }
5692
5693 return TRUE;
5694 }
5695 \f
5696
5697 /* Set the right machine number. */
5698
5699 static bfd_boolean
5700 nds32_elf_object_p (bfd *abfd)
5701 {
5702 static unsigned int cur_arch = 0;
5703
5704 if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH))
5705 {
5706 /* E_N1_ARCH is a wild card, so it is set only when no others exist. */
5707 cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH);
5708 }
5709
5710 switch (cur_arch)
5711 {
5712 default:
5713 case E_N1_ARCH:
5714 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1);
5715 break;
5716 case E_N1H_ARCH:
5717 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h);
5718 break;
5719 case E_NDS_ARCH_STAR_V2_0:
5720 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2);
5721 break;
5722 case E_NDS_ARCH_STAR_V3_0:
5723 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3);
5724 break;
5725 case E_NDS_ARCH_STAR_V3_M:
5726 bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m);
5727 break;
5728 }
5729
5730 return TRUE;
5731 }
5732
5733 /* Store the machine number in the flags field. */
5734
5735 static void
5736 nds32_elf_final_write_processing (bfd *abfd,
5737 bfd_boolean linker ATTRIBUTE_UNUSED)
5738 {
5739 unsigned long val;
5740 static unsigned int cur_mach = 0;
5741
5742 if (bfd_mach_n1 != bfd_get_mach (abfd))
5743 {
5744 cur_mach = bfd_get_mach (abfd);
5745 }
5746
5747 switch (cur_mach)
5748 {
5749 case bfd_mach_n1:
5750 /* Only happen when object is empty, since the case is abandon. */
5751 val = E_N1_ARCH;
5752 val |= E_NDS_ABI_AABI;
5753 val |= E_NDS32_ELF_VER_1_4;
5754 break;
5755 case bfd_mach_n1h:
5756 val = E_N1H_ARCH;
5757 break;
5758 case bfd_mach_n1h_v2:
5759 val = E_NDS_ARCH_STAR_V2_0;
5760 break;
5761 case bfd_mach_n1h_v3:
5762 val = E_NDS_ARCH_STAR_V3_0;
5763 break;
5764 case bfd_mach_n1h_v3m:
5765 val = E_NDS_ARCH_STAR_V3_M;
5766 break;
5767 default:
5768 val = 0;
5769 break;
5770 }
5771
5772 elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH;
5773 elf_elfheader (abfd)->e_flags |= val;
5774 }
5775
5776 /* Function to keep NDS32 specific file flags. */
5777
5778 static bfd_boolean
5779 nds32_elf_set_private_flags (bfd *abfd, flagword flags)
5780 {
5781 BFD_ASSERT (!elf_flags_init (abfd)
5782 || elf_elfheader (abfd)->e_flags == flags);
5783
5784 elf_elfheader (abfd)->e_flags = flags;
5785 elf_flags_init (abfd) = TRUE;
5786 return TRUE;
5787 }
5788
5789 static unsigned int
5790 convert_e_flags (unsigned int e_flags, unsigned int arch)
5791 {
5792 if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9)
5793 {
5794 /* From 0.9 to 1.0. */
5795 e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0;
5796
5797 /* Invert E_NDS32_HAS_NO_MAC_INST. */
5798 e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5799 if (arch == E_NDS_ARCH_STAR_V1_0)
5800 {
5801 /* Done. */
5802 return e_flags;
5803 }
5804 }
5805
5806 /* From 1.0 to 2.0. */
5807 e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0;
5808
5809 /* Clear E_NDS32_HAS_MFUSR_PC_INST. */
5810 e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST;
5811
5812 /* Invert E_NDS32_HAS_NO_MAC_INST. */
5813 e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5814 return e_flags;
5815 }
5816
5817 static bfd_boolean
5818 nds32_check_vec_size (bfd *ibfd)
5819 {
5820 static unsigned int nds32_vec_size = 0;
5821
5822 asection *sec_t = NULL;
5823 bfd_byte *contents = NULL;
5824
5825 sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags");
5826
5827 if (sec_t && sec_t->size >= 4)
5828 {
5829 /* Get vec_size in file. */
5830 unsigned int flag_t;
5831
5832 nds32_get_section_contents (ibfd, sec_t, &contents, TRUE);
5833 flag_t = bfd_get_32 (ibfd, contents);
5834
5835 /* The value could only be 4 or 16. */
5836
5837 if (!nds32_vec_size)
5838 /* Set if not set yet. */
5839 nds32_vec_size = (flag_t & 0x3);
5840 else if (nds32_vec_size != (flag_t & 0x3))
5841 {
5842 _bfd_error_handler
5843 /* xgettext:c-format */
5844 (_("%B: ISR vector size mismatch"
5845 " with previous modules, previous %u-byte, current %u-byte"),
5846 ibfd,
5847 nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff,
5848 (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff);
5849 return FALSE;
5850 }
5851 else
5852 /* Only keep the first vec_size section. */
5853 sec_t->flags |= SEC_EXCLUDE;
5854 }
5855
5856 return TRUE;
5857 }
5858
5859 /* Merge backend specific data from an object file to the output
5860 object file when linking. */
5861
5862 static bfd_boolean
5863 nds32_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
5864 {
5865 bfd *obfd = info->output_bfd;
5866 flagword out_flags;
5867 flagword in_flags;
5868 flagword out_16regs;
5869 flagword in_no_mac;
5870 flagword out_no_mac;
5871 flagword in_16regs;
5872 flagword out_version;
5873 flagword in_version;
5874 flagword out_fpu_config;
5875 flagword in_fpu_config;
5876
5877 /* TODO: Revise to use object-attributes instead. */
5878 if (!nds32_check_vec_size (ibfd))
5879 return FALSE;
5880
5881 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5882 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5883 return TRUE;
5884
5885 if (bfd_little_endian (ibfd) != bfd_little_endian (obfd))
5886 {
5887 _bfd_error_handler
5888 (_("%B: warning: Endian mismatch with previous modules."), ibfd);
5889
5890 bfd_set_error (bfd_error_bad_value);
5891 return FALSE;
5892 }
5893
5894 in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION;
5895 if (in_version == E_NDS32_ELF_VER_1_2)
5896 {
5897 _bfd_error_handler
5898 (_("%B: warning: Older version of object file encountered, "
5899 "Please recompile with current tool chain."), ibfd);
5900 }
5901
5902 /* We may need to merge V1 and V2 arch object files to V2. */
5903 if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
5904 != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
5905 {
5906 /* Need to convert version. */
5907 if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
5908 == E_NDS_ARCH_STAR_RESERVED)
5909 {
5910 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
5911 }
5912 else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9
5913 || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
5914 > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
5915 {
5916 elf_elfheader (obfd)->e_flags =
5917 convert_e_flags (elf_elfheader (obfd)->e_flags,
5918 (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH));
5919 }
5920 else
5921 {
5922 elf_elfheader (ibfd)->e_flags =
5923 convert_e_flags (elf_elfheader (ibfd)->e_flags,
5924 (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH));
5925 }
5926 }
5927
5928 /* Extract some flags. */
5929 in_flags = elf_elfheader (ibfd)->e_flags
5930 & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
5931 | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
5932
5933 /* The following flags need special treatment. */
5934 in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
5935 in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
5936 in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF;
5937
5938 /* Extract some flags. */
5939 out_flags = elf_elfheader (obfd)->e_flags
5940 & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
5941 | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
5942
5943 /* The following flags need special treatment. */
5944 out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
5945 out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
5946 out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF;
5947 out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION;
5948 if (!elf_flags_init (obfd))
5949 {
5950 /* If the input is the default architecture then do not
5951 bother setting the flags for the output architecture,
5952 instead allow future merges to do this. If no future
5953 merges ever set these flags then they will retain their
5954 unitialised values, which surprise surprise, correspond
5955 to the default values. */
5956 if (bfd_get_arch_info (ibfd)->the_default)
5957 return TRUE;
5958
5959 elf_flags_init (obfd) = TRUE;
5960 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
5961
5962 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
5963 && bfd_get_arch_info (obfd)->the_default)
5964 {
5965 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
5966 bfd_get_mach (ibfd));
5967 }
5968
5969 return TRUE;
5970 }
5971
5972 /* Check flag compatibility. */
5973 if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI))
5974 {
5975 _bfd_error_handler
5976 (_("%B: error: ABI mismatch with previous modules."), ibfd);
5977
5978 bfd_set_error (bfd_error_bad_value);
5979 return FALSE;
5980 }
5981
5982 if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH))
5983 {
5984 if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH))
5985 {
5986 _bfd_error_handler
5987 (_("%B: error: Instruction set mismatch with previous modules."), ibfd);
5988
5989 bfd_set_error (bfd_error_bad_value);
5990 return FALSE;
5991 }
5992 }
5993
5994 /* When linking with V1.2 and V1.3 objects together the output is V1.2.
5995 and perf ext1 and DIV are mergerd to perf ext1. */
5996 if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2)
5997 {
5998 elf_elfheader (obfd)->e_flags =
5999 (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6000 | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6001 | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6002 ? E_NDS32_HAS_EXT_INST : 0)
6003 | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6004 ? E_NDS32_HAS_EXT_INST : 0)
6005 | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6006 | ((in_version > out_version) ? out_version : in_version);
6007 }
6008 else
6009 {
6010 if (in_version != out_version)
6011 _bfd_error_handler
6012 /* xgettext:c-format */
6013 (_("%B: warning: Incompatible elf-versions %s and %s."),
6014 ibfd, nds32_elfver_strtab[out_version],
6015 nds32_elfver_strtab[in_version]);
6016
6017 elf_elfheader (obfd)->e_flags = in_flags | out_flags
6018 | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6019 | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config)
6020 | (in_version > out_version ? out_version : in_version);
6021 }
6022
6023 return TRUE;
6024 }
6025
6026 /* Display the flags field. */
6027
6028 static bfd_boolean
6029 nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6030 {
6031 FILE *file = (FILE *) ptr;
6032
6033 BFD_ASSERT (abfd != NULL && ptr != NULL);
6034
6035 _bfd_elf_print_private_bfd_data (abfd, ptr);
6036
6037 fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
6038
6039 switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)
6040 {
6041 default:
6042 case E_N1_ARCH:
6043 fprintf (file, _(": n1 instructions"));
6044 break;
6045 case E_N1H_ARCH:
6046 fprintf (file, _(": n1h instructions"));
6047 break;
6048 }
6049
6050 fputc ('\n', file);
6051
6052 return TRUE;
6053 }
6054
6055 static unsigned int
6056 nds32_elf_action_discarded (asection *sec)
6057 {
6058
6059 if (strncmp
6060 (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0)
6061 return 0;
6062
6063 return _bfd_elf_default_action_discarded (sec);
6064 }
6065
6066 static asection *
6067 nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
6068 Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
6069 Elf_Internal_Sym *sym)
6070 {
6071 if (h != NULL)
6072 switch (ELF32_R_TYPE (rel->r_info))
6073 {
6074 case R_NDS32_GNU_VTINHERIT:
6075 case R_NDS32_GNU_VTENTRY:
6076 case R_NDS32_RELA_GNU_VTINHERIT:
6077 case R_NDS32_RELA_GNU_VTENTRY:
6078 return NULL;
6079 }
6080
6081 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6082 }
6083
6084 /* Look through the relocs for a section during the first phase.
6085 Since we don't do .gots or .plts, we just need to consider the
6086 virtual table relocs for gc. */
6087
6088 static bfd_boolean
6089 nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
6090 asection *sec, const Elf_Internal_Rela *relocs)
6091 {
6092 Elf_Internal_Shdr *symtab_hdr;
6093 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
6094 const Elf_Internal_Rela *rel;
6095 const Elf_Internal_Rela *rel_end;
6096 struct elf_nds32_link_hash_table *htab;
6097 bfd *dynobj;
6098 asection *sreloc = NULL;
6099
6100 if (bfd_link_relocatable (info))
6101 return TRUE;
6102
6103 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6104 sym_hashes = elf_sym_hashes (abfd);
6105 sym_hashes_end =
6106 sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
6107 if (!elf_bad_symtab (abfd))
6108 sym_hashes_end -= symtab_hdr->sh_info;
6109
6110 htab = nds32_elf_hash_table (info);
6111 dynobj = htab->root.dynobj;
6112
6113 rel_end = relocs + sec->reloc_count;
6114 for (rel = relocs; rel < rel_end; rel++)
6115 {
6116 enum elf_nds32_reloc_type r_type;
6117 struct elf_link_hash_entry *h;
6118 unsigned long r_symndx;
6119 int tls_type, old_tls_type;
6120
6121 r_symndx = ELF32_R_SYM (rel->r_info);
6122 r_type = ELF32_R_TYPE (rel->r_info);
6123 if (r_symndx < symtab_hdr->sh_info)
6124 h = NULL;
6125 else
6126 {
6127 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6128 while (h->root.type == bfd_link_hash_indirect
6129 || h->root.type == bfd_link_hash_warning)
6130 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6131 }
6132
6133 /* Some relocs require a global offset table. We create
6134 got section here, since these relocation need got section
6135 and it is not created yet. */
6136 if (htab->root.sgot == NULL)
6137 {
6138 switch (r_type)
6139 {
6140 case R_NDS32_GOT_HI20:
6141 case R_NDS32_GOT_LO12:
6142 case R_NDS32_GOT_LO15:
6143 case R_NDS32_GOT_LO19:
6144 case R_NDS32_GOT17S2_RELA:
6145 case R_NDS32_GOT15S2_RELA:
6146 case R_NDS32_GOTOFF:
6147 case R_NDS32_GOTOFF_HI20:
6148 case R_NDS32_GOTOFF_LO12:
6149 case R_NDS32_GOTOFF_LO15:
6150 case R_NDS32_GOTOFF_LO19:
6151 case R_NDS32_GOTPC20:
6152 case R_NDS32_GOTPC_HI20:
6153 case R_NDS32_GOTPC_LO12:
6154 case R_NDS32_GOT20:
6155 case R_NDS32_TLS_IE_HI20:
6156 case R_NDS32_TLS_IE_LO12S2:
6157 if (dynobj == NULL)
6158 htab->root.dynobj = dynobj = abfd;
6159 if (!_bfd_elf_create_got_section (dynobj, info))
6160 return FALSE;
6161 break;
6162
6163 default:
6164 break;
6165 }
6166 }
6167
6168 switch ((int) r_type)
6169 {
6170 case R_NDS32_GOT_HI20:
6171 case R_NDS32_GOT_LO12:
6172 case R_NDS32_GOT_LO15:
6173 case R_NDS32_GOT_LO19:
6174 case R_NDS32_GOT20:
6175 case R_NDS32_TLS_IE_HI20:
6176 case R_NDS32_TLS_IE_LO12S2:
6177 switch (r_type)
6178 {
6179 case R_NDS32_TLS_IE_HI20:
6180 case R_NDS32_TLS_IE_LO12S2:
6181 tls_type = GOT_TLS_IE;
6182 break;
6183 default:
6184 tls_type = GOT_NORMAL;
6185 break;
6186 }
6187 if (h != NULL)
6188 {
6189 old_tls_type = elf32_nds32_hash_entry (h)->tls_type;
6190 h->got.refcount += 1;
6191 }
6192 else
6193 {
6194 bfd_signed_vma *local_got_refcounts;
6195
6196 /* This is a global offset table entry for a local
6197 symbol. */
6198 local_got_refcounts = elf_local_got_refcounts (abfd);
6199 if (local_got_refcounts == NULL)
6200 {
6201 bfd_size_type size;
6202
6203 size = symtab_hdr->sh_info;
6204 size *= sizeof (bfd_signed_vma);
6205 local_got_refcounts = (bfd_signed_vma *) bfd_zalloc (abfd, size);
6206 if (local_got_refcounts == NULL)
6207 return FALSE;
6208 elf_local_got_refcounts (abfd) = local_got_refcounts;
6209 }
6210 local_got_refcounts[r_symndx] += 1;
6211 old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx];
6212 }
6213
6214 /* We will already have issued an error message if there
6215 is a TLS/non-TLS mismatch, based on the symbol
6216 type. So just combine any TLS types needed. */
6217 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
6218 && tls_type != GOT_NORMAL)
6219 tls_type |= old_tls_type;
6220
6221 if (old_tls_type != tls_type)
6222 {
6223 if (h != NULL)
6224 elf32_nds32_hash_entry (h)->tls_type = tls_type;
6225 else
6226 elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type;
6227 }
6228 break;
6229 case R_NDS32_9_PLTREL:
6230 case R_NDS32_25_PLTREL:
6231 case R_NDS32_PLTREL_HI20:
6232 case R_NDS32_PLTREL_LO12:
6233 case R_NDS32_PLT_GOTREL_HI20:
6234 case R_NDS32_PLT_GOTREL_LO12:
6235 case R_NDS32_PLT_GOTREL_LO15:
6236 case R_NDS32_PLT_GOTREL_LO19:
6237 case R_NDS32_PLT_GOTREL_LO20:
6238
6239 /* This symbol requires a procedure linkage table entry. We
6240 actually build the entry in adjust_dynamic_symbol,
6241 because this might be a case of linking PIC code without
6242 linking in any dynamic objects, in which case we don't
6243 need to generate a procedure linkage table after all. */
6244
6245 /* If this is a local symbol, we resolve it directly without
6246 creating a procedure linkage table entry. */
6247 if (h == NULL)
6248 continue;
6249
6250 if (h->forced_local)
6251 break;
6252
6253 elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL;
6254 h->needs_plt = 1;
6255 h->plt.refcount += 1;
6256 break;
6257
6258 case R_NDS32_16_RELA:
6259 case R_NDS32_20_RELA:
6260 case R_NDS32_5_RELA:
6261 case R_NDS32_32_RELA:
6262 case R_NDS32_HI20_RELA:
6263 case R_NDS32_LO12S3_RELA:
6264 case R_NDS32_LO12S2_RELA:
6265 case R_NDS32_LO12S2_DP_RELA:
6266 case R_NDS32_LO12S2_SP_RELA:
6267 case R_NDS32_LO12S1_RELA:
6268 case R_NDS32_LO12S0_RELA:
6269 case R_NDS32_LO12S0_ORI_RELA:
6270 case R_NDS32_SDA16S3_RELA:
6271 case R_NDS32_SDA17S2_RELA:
6272 case R_NDS32_SDA18S1_RELA:
6273 case R_NDS32_SDA19S0_RELA:
6274 case R_NDS32_SDA15S3_RELA:
6275 case R_NDS32_SDA15S2_RELA:
6276 case R_NDS32_SDA12S2_DP_RELA:
6277 case R_NDS32_SDA12S2_SP_RELA:
6278 case R_NDS32_SDA15S1_RELA:
6279 case R_NDS32_SDA15S0_RELA:
6280 case R_NDS32_SDA_FP7U2_RELA:
6281 case R_NDS32_15_PCREL_RELA:
6282 case R_NDS32_17_PCREL_RELA:
6283 case R_NDS32_25_PCREL_RELA:
6284
6285 if (h != NULL && !bfd_link_pic (info))
6286 {
6287 h->non_got_ref = 1;
6288 h->plt.refcount += 1;
6289 }
6290
6291 /* If we are creating a shared library, and this is a reloc against
6292 a global symbol, or a non PC relative reloc against a local
6293 symbol, then we need to copy the reloc into the shared library.
6294 However, if we are linking with -Bsymbolic, we do not need to
6295 copy a reloc against a global symbol which is defined in an
6296 object we are including in the link (i.e., DEF_REGULAR is set).
6297 At this point we have not seen all the input files, so it is
6298 possible that DEF_REGULAR is not set now but will be set later
6299 (it is never cleared). We account for that possibility below by
6300 storing information in the dyn_relocs field of the hash table
6301 entry. A similar situation occurs when creating shared libraries
6302 and symbol visibility changes render the symbol local.
6303
6304 If on the other hand, we are creating an executable, we may need
6305 to keep relocations for symbols satisfied by a dynamic library
6306 if we manage to avoid copy relocs for the symbol. */
6307 if ((bfd_link_pic (info)
6308 && (sec->flags & SEC_ALLOC) != 0
6309 && ((r_type != R_NDS32_25_PCREL_RELA
6310 && r_type != R_NDS32_15_PCREL_RELA
6311 && r_type != R_NDS32_17_PCREL_RELA
6312 && !(r_type == R_NDS32_32_RELA
6313 && strcmp (sec->name, ".eh_frame") == 0))
6314 || (h != NULL
6315 && (!info->symbolic
6316 || h->root.type == bfd_link_hash_defweak
6317 || !h->def_regular))))
6318 || (!bfd_link_pic (info)
6319 && (sec->flags & SEC_ALLOC) != 0
6320 && h != NULL
6321 && (h->root.type == bfd_link_hash_defweak
6322 || !h->def_regular)))
6323 {
6324 struct elf_dyn_relocs *p;
6325 struct elf_dyn_relocs **head;
6326
6327 if (dynobj == NULL)
6328 htab->root.dynobj = dynobj = abfd;
6329
6330 /* When creating a shared object, we must copy these
6331 relocs into the output file. We create a reloc
6332 section in dynobj and make room for the reloc. */
6333 if (sreloc == NULL)
6334 {
6335 const char *name;
6336
6337 name = bfd_elf_string_from_elf_section
6338 (abfd, elf_elfheader (abfd)->e_shstrndx,
6339 elf_section_data (sec)->rela.hdr->sh_name);
6340 if (name == NULL)
6341 return FALSE;
6342
6343 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
6344 && strcmp (bfd_get_section_name (abfd, sec),
6345 name + 5) == 0);
6346
6347 sreloc = bfd_get_section_by_name (dynobj, name);
6348 if (sreloc == NULL)
6349 {
6350 flagword flags;
6351
6352 sreloc = bfd_make_section (dynobj, name);
6353 flags = (SEC_HAS_CONTENTS | SEC_READONLY
6354 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
6355 if ((sec->flags & SEC_ALLOC) != 0)
6356 flags |= SEC_ALLOC | SEC_LOAD;
6357 if (sreloc == NULL
6358 || !bfd_set_section_flags (dynobj, sreloc, flags)
6359 || !bfd_set_section_alignment (dynobj, sreloc, 2))
6360 return FALSE;
6361
6362 elf_section_type (sreloc) = SHT_RELA;
6363 }
6364 elf_section_data (sec)->sreloc = sreloc;
6365 }
6366
6367 /* If this is a global symbol, we count the number of
6368 relocations we need for this symbol. */
6369 if (h != NULL)
6370 head = &((struct elf_nds32_link_hash_entry *) h)->dyn_relocs;
6371 else
6372 {
6373 asection *s;
6374 void *vpp;
6375
6376 Elf_Internal_Sym *isym;
6377 isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
6378 if (isym == NULL)
6379 return FALSE;
6380
6381 /* Track dynamic relocs needed for local syms too. */
6382 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6383 if (s == NULL)
6384 return FALSE;
6385
6386 vpp = &elf_section_data (s)->local_dynrel;
6387 head = (struct elf_dyn_relocs **) vpp;
6388 }
6389
6390 p = *head;
6391 if (p == NULL || p->sec != sec)
6392 {
6393 bfd_size_type amt = sizeof (*p);
6394 p = (struct elf_dyn_relocs *) bfd_alloc (dynobj, amt);
6395 if (p == NULL)
6396 return FALSE;
6397 p->next = *head;
6398 *head = p;
6399 p->sec = sec;
6400 p->count = 0;
6401 p->pc_count = 0;
6402 }
6403
6404 p->count += 1;
6405 if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA
6406 || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
6407 || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA)
6408 p->pc_count += 1;
6409 }
6410 break;
6411
6412 /* This relocation describes the C++ object vtable hierarchy.
6413 Reconstruct it for later use during GC. */
6414 case R_NDS32_RELA_GNU_VTINHERIT:
6415 case R_NDS32_GNU_VTINHERIT:
6416 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6417 return FALSE;
6418 break;
6419
6420 /* This relocation describes which C++ vtable entries are actually
6421 used. Record for later use during GC. */
6422 case R_NDS32_GNU_VTENTRY:
6423 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
6424 return FALSE;
6425 break;
6426 case R_NDS32_RELA_GNU_VTENTRY:
6427 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
6428 return FALSE;
6429 break;
6430 }
6431 }
6432
6433 return TRUE;
6434 }
6435
6436 /* Write VAL in uleb128 format to P, returning a pointer to the
6437 following byte.
6438 This code is copied from elf-attr.c. */
6439
6440 static bfd_byte *
6441 write_uleb128 (bfd_byte *p, unsigned int val)
6442 {
6443 bfd_byte c;
6444 do
6445 {
6446 c = val & 0x7f;
6447 val >>= 7;
6448 if (val)
6449 c |= 0x80;
6450 *(p++) = c;
6451 }
6452 while (val);
6453 return p;
6454 }
6455
6456 static bfd_signed_vma
6457 calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
6458 Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr,
6459 int *pic_ext_target)
6460 {
6461 bfd_signed_vma foff;
6462 bfd_vma symval, addend;
6463 asection *sym_sec;
6464
6465 /* Get the value of the symbol referred to by the reloc. */
6466 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6467 {
6468 Elf_Internal_Sym *isym;
6469
6470 /* A local symbol. */
6471 isym = isymbuf + ELF32_R_SYM (irel->r_info);
6472
6473 if (isym->st_shndx == SHN_UNDEF)
6474 sym_sec = bfd_und_section_ptr;
6475 else if (isym->st_shndx == SHN_ABS)
6476 sym_sec = bfd_abs_section_ptr;
6477 else if (isym->st_shndx == SHN_COMMON)
6478 sym_sec = bfd_com_section_ptr;
6479 else
6480 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6481 symval = isym->st_value + sym_sec->output_section->vma
6482 + sym_sec->output_offset;
6483 }
6484 else
6485 {
6486 unsigned long indx;
6487 struct elf_link_hash_entry *h;
6488 bfd *owner;
6489
6490 /* An external symbol. */
6491 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6492 h = elf_sym_hashes (abfd)[indx];
6493 BFD_ASSERT (h != NULL);
6494
6495 if (h->root.type != bfd_link_hash_defined
6496 && h->root.type != bfd_link_hash_defweak)
6497 /* This appears to be a reference to an undefined
6498 symbol. Just ignore it--it will be caught by the
6499 regular reloc processing. */
6500 return 0;
6501 owner = h->root.u.def.section->owner;
6502 if (owner && (elf_elfheader (owner)->e_flags & E_NDS32_HAS_PIC))
6503 *pic_ext_target = 1;
6504
6505 if (h->root.u.def.section->flags & SEC_MERGE)
6506 {
6507 sym_sec = h->root.u.def.section;
6508 symval = _bfd_merged_section_offset (abfd, &sym_sec,
6509 elf_section_data (sym_sec)->sec_info,
6510 h->root.u.def.value);
6511 symval = symval + sym_sec->output_section->vma
6512 + sym_sec->output_offset;
6513 }
6514 else
6515 symval = (h->root.u.def.value
6516 + h->root.u.def.section->output_section->vma
6517 + h->root.u.def.section->output_offset);
6518 }
6519
6520 addend = irel->r_addend;
6521
6522 foff = (symval + addend
6523 - (irel->r_offset + sec->output_section->vma + sec->output_offset));
6524 return foff;
6525 }
6526
6527 static bfd_vma
6528 calculate_plt_memory_address (bfd *abfd, struct bfd_link_info *link_info,
6529 Elf_Internal_Sym *isymbuf,
6530 Elf_Internal_Rela *irel,
6531 Elf_Internal_Shdr *symtab_hdr)
6532 {
6533 bfd_vma symval;
6534
6535 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6536 {
6537 Elf_Internal_Sym *isym;
6538 asection *sym_sec;
6539 /* A local symbol. */
6540 isym = isymbuf + ELF32_R_SYM (irel->r_info);
6541
6542 if (isym->st_shndx == SHN_UNDEF)
6543 sym_sec = bfd_und_section_ptr;
6544 else if (isym->st_shndx == SHN_ABS)
6545 sym_sec = bfd_abs_section_ptr;
6546 else if (isym->st_shndx == SHN_COMMON)
6547 sym_sec = bfd_com_section_ptr;
6548 else
6549 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6550 symval = isym->st_value + sym_sec->output_section->vma
6551 + sym_sec->output_offset;
6552 }
6553 else
6554 {
6555 unsigned long indx;
6556 struct elf_link_hash_entry *h;
6557 struct elf_nds32_link_hash_table *htab;
6558 asection *splt;
6559
6560 /* An external symbol. */
6561 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6562 h = elf_sym_hashes (abfd)[indx];
6563 BFD_ASSERT (h != NULL);
6564 htab = nds32_elf_hash_table (link_info);
6565 splt = htab->root.splt;
6566
6567 while (h->root.type == bfd_link_hash_indirect
6568 || h->root.type == bfd_link_hash_warning)
6569 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6570
6571 if (h->plt.offset == (bfd_vma) - 1)
6572 {
6573 if (h->root.type != bfd_link_hash_defined
6574 && h->root.type != bfd_link_hash_defweak)
6575 /* This appears to be a reference to an undefined
6576 * symbol. Just ignore it--it will be caught by the
6577 * regular reloc processing. */
6578 return 0;
6579 symval = (h->root.u.def.value
6580 + h->root.u.def.section->output_section->vma
6581 + h->root.u.def.section->output_offset);
6582 }
6583 else
6584 symval = splt->output_section->vma + h->plt.offset;
6585 }
6586
6587 return symval;
6588 }
6589
6590 static bfd_signed_vma
6591 calculate_plt_offset (bfd *abfd, asection *sec, struct bfd_link_info *link_info,
6592 Elf_Internal_Sym *isymbuf, Elf_Internal_Rela *irel,
6593 Elf_Internal_Shdr *symtab_hdr)
6594 {
6595 bfd_vma foff;
6596 if ((foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
6597 symtab_hdr)) == 0)
6598 return 0;
6599 else
6600 return foff - (irel->r_offset
6601 + sec->output_section->vma + sec->output_offset);
6602 }
6603 \f
6604 /* Convert a 32-bit instruction to 16-bit one.
6605 INSN is the input 32-bit instruction, INSN16 is the output 16-bit
6606 instruction. If INSN_TYPE is not NULL, it the CGEN instruction
6607 type of INSN16. Return 1 if successful. */
6608
6609 static int
6610 nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
6611 int *pinsn_type)
6612 {
6613 uint16_t insn16 = 0;
6614 int insn_type = 0;
6615 unsigned long mach = bfd_get_mach (abfd);
6616
6617 if (N32_SH5 (insn) != 0)
6618 return 0;
6619
6620 switch (N32_SUB5 (insn))
6621 {
6622 case N32_ALU1_ADD_SLLI:
6623 case N32_ALU1_ADD_SRLI:
6624 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6625 {
6626 insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn),
6627 N32_RB5 (insn));
6628 insn_type = NDS32_INSN_ADD333;
6629 }
6630 else if (N32_IS_RT4 (insn))
6631 {
6632 if (N32_RT5 (insn) == N32_RA5 (insn))
6633 insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn));
6634 else if (N32_RT5 (insn) == N32_RB5 (insn))
6635 insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn));
6636 insn_type = NDS32_INSN_ADD45;
6637 }
6638 break;
6639
6640 case N32_ALU1_SUB_SLLI:
6641 case N32_ALU1_SUB_SRLI:
6642 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6643 {
6644 insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn),
6645 N32_RB5 (insn));
6646 insn_type = NDS32_INSN_SUB333;
6647 }
6648 else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6649 {
6650 insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn));
6651 insn_type = NDS32_INSN_SUB45;
6652 }
6653 break;
6654
6655 case N32_ALU1_AND_SLLI:
6656 case N32_ALU1_AND_SRLI:
6657 /* and $rt, $rt, $rb -> and33 for v3, v3m. */
6658 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6659 && N32_IS_RB3 (insn))
6660 {
6661 if (N32_RT5 (insn) == N32_RA5 (insn))
6662 insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn));
6663 else if (N32_RT5 (insn) == N32_RB5 (insn))
6664 insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn));
6665 if (insn16)
6666 insn_type = NDS32_INSN_AND33;
6667 }
6668 break;
6669
6670 case N32_ALU1_XOR_SLLI:
6671 case N32_ALU1_XOR_SRLI:
6672 /* xor $rt, $rt, $rb -> xor33 for v3, v3m. */
6673 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6674 && N32_IS_RB3 (insn))
6675 {
6676 if (N32_RT5 (insn) == N32_RA5 (insn))
6677 insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn));
6678 else if (N32_RT5 (insn) == N32_RB5 (insn))
6679 insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn));
6680 if (insn16)
6681 insn_type = NDS32_INSN_XOR33;
6682 }
6683 break;
6684
6685 case N32_ALU1_OR_SLLI:
6686 case N32_ALU1_OR_SRLI:
6687 /* or $rt, $rt, $rb -> or33 for v3, v3m. */
6688 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6689 && N32_IS_RB3 (insn))
6690 {
6691 if (N32_RT5 (insn) == N32_RA5 (insn))
6692 insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn));
6693 else if (N32_RT5 (insn) == N32_RB5 (insn))
6694 insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn));
6695 if (insn16)
6696 insn_type = NDS32_INSN_OR33;
6697 }
6698 break;
6699 case N32_ALU1_NOR:
6700 /* nor $rt, $ra, $ra -> not33 for v3, v3m. */
6701 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn)
6702 && N32_RA5 (insn) == N32_RB5 (insn))
6703 {
6704 insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn));
6705 insn_type = NDS32_INSN_NOT33;
6706 }
6707 break;
6708 case N32_ALU1_SRAI:
6709 if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6710 {
6711 insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn));
6712 insn_type = NDS32_INSN_SRAI45;
6713 }
6714 break;
6715
6716 case N32_ALU1_SRLI:
6717 if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6718 {
6719 insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn));
6720 insn_type = NDS32_INSN_SRLI45;
6721 }
6722 break;
6723
6724 case N32_ALU1_SLLI:
6725 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8)
6726 {
6727 insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn),
6728 N32_UB5 (insn));
6729 insn_type = NDS32_INSN_SLLI333;
6730 }
6731 break;
6732
6733 case N32_ALU1_ZEH:
6734 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6735 {
6736 insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn));
6737 insn_type = NDS32_INSN_ZEH33;
6738 }
6739 break;
6740
6741 case N32_ALU1_SEB:
6742 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6743 {
6744 insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn));
6745 insn_type = NDS32_INSN_SEB33;
6746 }
6747 break;
6748
6749 case N32_ALU1_SEH:
6750 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6751 {
6752 insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn));
6753 insn_type = NDS32_INSN_SEH33;
6754 }
6755 break;
6756
6757 case N32_ALU1_SLT:
6758 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
6759 {
6760 /* Implicit r15. */
6761 insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn));
6762 insn_type = NDS32_INSN_SLT45;
6763 }
6764 break;
6765
6766 case N32_ALU1_SLTS:
6767 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
6768 {
6769 /* Implicit r15. */
6770 insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn));
6771 insn_type = NDS32_INSN_SLTS45;
6772 }
6773 break;
6774 }
6775
6776 if ((insn16 & 0x8000) == 0)
6777 return 0;
6778
6779 if (pinsn16)
6780 *pinsn16 = insn16;
6781 if (pinsn_type)
6782 *pinsn_type = insn_type;
6783 return 1;
6784 }
6785
6786 static int
6787 nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
6788 int *pinsn_type)
6789 {
6790 uint16_t insn16 = 0;
6791 int insn_type;
6792 unsigned long mach = bfd_get_mach (abfd);
6793
6794 /* TODO: bset, bclr, btgl, btst. */
6795 if (__GF (insn, 6, 4) != 0)
6796 return 0;
6797
6798 switch (N32_IMMU (insn, 6))
6799 {
6800 case N32_ALU2_MUL:
6801 if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6802 && N32_IS_RB3 (insn))
6803 {
6804 if (N32_RT5 (insn) == N32_RA5 (insn))
6805 insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn));
6806 else if (N32_RT5 (insn) == N32_RB5 (insn))
6807 insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn));
6808 if (insn16)
6809 insn_type = NDS32_INSN_MUL33;
6810 }
6811 }
6812
6813 if ((insn16 & 0x8000) == 0)
6814 return 0;
6815
6816 if (pinsn16)
6817 *pinsn16 = insn16;
6818 if (pinsn_type)
6819 *pinsn_type = insn_type;
6820 return 1;
6821 }
6822
6823 int
6824 nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
6825 int *pinsn_type)
6826 {
6827 int op6;
6828 uint16_t insn16 = 0;
6829 int insn_type;
6830 unsigned long mach = bfd_get_mach (abfd);
6831
6832 /* Decode 32-bit instruction. */
6833 if (insn & 0x80000000)
6834 {
6835 /* Not 32-bit insn. */
6836 return 0;
6837 }
6838
6839 op6 = N32_OP6 (insn);
6840
6841 /* Convert it to 16-bit instruction. */
6842 switch (op6)
6843 {
6844 case N32_OP6_MOVI:
6845 if (IS_WITHIN_S (N32_IMM20S (insn), 5))
6846 {
6847 insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn));
6848 insn_type = NDS32_INSN_MOVI55;
6849 }
6850 else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16
6851 && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn))
6852 {
6853 insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn),
6854 N32_IMM20S (insn) - 16);
6855 insn_type = NDS32_INSN_MOVPI45;
6856 }
6857 break;
6858
6859 case N32_OP6_ADDI:
6860 if (N32_IMM15S (insn) == 0)
6861 {
6862 /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
6863 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
6864 if (mach <= MACH_V2
6865 || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
6866 {
6867 insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
6868 insn_type = NDS32_INSN_MOV55;
6869 }
6870 }
6871 else if (N32_IMM15S (insn) > 0)
6872 {
6873 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8)
6874 {
6875 insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn),
6876 N32_IMM15S (insn));
6877 insn_type = NDS32_INSN_ADDI333;
6878 }
6879 else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
6880 && N32_IMM15S (insn) < 32)
6881 {
6882 insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn));
6883 insn_type = NDS32_INSN_ADDI45;
6884 }
6885 else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
6886 && N32_RT5 (insn) == N32_RA5 (insn)
6887 && N32_IMM15S (insn) < 512)
6888 {
6889 insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
6890 insn_type = NDS32_INSN_ADDI10_SP;
6891 }
6892 else if (mach >= MACH_V3 && N32_IS_RT3 (insn)
6893 && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256
6894 && (N32_IMM15S (insn) % 4 == 0))
6895 {
6896 insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn),
6897 N32_IMM15S (insn) >> 2);
6898 insn_type = NDS32_INSN_ADDRI36_SP;
6899 }
6900 }
6901 else
6902 {
6903 /* Less than 0. */
6904 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8)
6905 {
6906 insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn),
6907 0 - N32_IMM15S (insn));
6908 insn_type = NDS32_INSN_SUBI333;
6909 }
6910 else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
6911 && N32_IMM15S (insn) > -32)
6912 {
6913 insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn),
6914 0 - N32_IMM15S (insn));
6915 insn_type = NDS32_INSN_SUBI45;
6916 }
6917 else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
6918 && N32_RT5 (insn) == N32_RA5 (insn)
6919 && N32_IMM15S (insn) >= -512)
6920 {
6921 insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
6922 insn_type = NDS32_INSN_ADDI10_SP;
6923 }
6924 }
6925 break;
6926
6927 case N32_OP6_ORI:
6928 if (N32_IMM15S (insn) == 0)
6929 {
6930 /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
6931 because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
6932 if (mach <= MACH_V2
6933 || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
6934 {
6935 insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
6936 insn_type = NDS32_INSN_MOV55;
6937 }
6938 }
6939 break;
6940
6941 case N32_OP6_SUBRI:
6942 if (mach >= MACH_V3 && N32_IS_RT3 (insn)
6943 && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0)
6944 {
6945 insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn));
6946 insn_type = NDS32_INSN_NEG33;
6947 }
6948 break;
6949
6950 case N32_OP6_ANDI:
6951 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6952 {
6953 if (N32_IMM15U (insn) == 1)
6954 {
6955 insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn));
6956 insn_type = NDS32_INSN_XLSB33;
6957 }
6958 else if (N32_IMM15U (insn) == 0x7ff)
6959 {
6960 insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn));
6961 insn_type = NDS32_INSN_X11B33;
6962 }
6963 else if (N32_IMM15U (insn) == 0xff)
6964 {
6965 insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn));
6966 insn_type = NDS32_INSN_ZEB33;
6967 }
6968 else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn)
6969 && N32_IMM15U (insn) < 256)
6970 {
6971 int imm15u = N32_IMM15U (insn);
6972
6973 if (__builtin_popcount (imm15u) == 1)
6974 {
6975 /* BMSKI33 */
6976 int imm3u = __builtin_ctz (imm15u);
6977
6978 insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u);
6979 insn_type = NDS32_INSN_BMSKI33;
6980 }
6981 else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1)
6982 {
6983 /* FEXTI33 */
6984 int imm3u = __builtin_ctz (imm15u + 1) - 1;
6985
6986 insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u);
6987 insn_type = NDS32_INSN_FEXTI33;
6988 }
6989 }
6990 }
6991 break;
6992
6993 case N32_OP6_SLTI:
6994 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
6995 && IS_WITHIN_U (N32_IMM15S (insn), 5))
6996 {
6997 insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn));
6998 insn_type = NDS32_INSN_SLTI45;
6999 }
7000 break;
7001
7002 case N32_OP6_SLTSI:
7003 if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7004 && IS_WITHIN_U (N32_IMM15S (insn), 5))
7005 {
7006 insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn));
7007 insn_type = NDS32_INSN_SLTSI45;
7008 }
7009 break;
7010
7011 case N32_OP6_LWI:
7012 if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7013 {
7014 insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn));
7015 insn_type = NDS32_INSN_LWI450;
7016 }
7017 else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7018 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7019 {
7020 insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn),
7021 N32_IMM15S (insn));
7022 insn_type = NDS32_INSN_LWI333;
7023 }
7024 else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7025 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7026 {
7027 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7028 insn_type = NDS32_INSN_LWI37;
7029 }
7030 else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7031 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7032 {
7033 insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn));
7034 insn_type = NDS32_INSN_LWI37_SP;
7035 }
7036 else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8
7037 && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0)
7038 {
7039 insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn),
7040 N32_IMM15S (insn) + 32);
7041 insn_type = NDS32_INSN_LWI45_FE;
7042 }
7043 break;
7044
7045 case N32_OP6_SWI:
7046 if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7047 {
7048 insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn));
7049 insn_type = NDS32_INSN_SWI450;
7050 }
7051 else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7052 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7053 {
7054 insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn),
7055 N32_IMM15S (insn));
7056 insn_type = NDS32_INSN_SWI333;
7057 }
7058 else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7059 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7060 {
7061 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7062 insn_type = NDS32_INSN_SWI37;
7063 }
7064 else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7065 && IS_WITHIN_U (N32_IMM15S (insn), 7))
7066 {
7067 insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn));
7068 insn_type = NDS32_INSN_SWI37_SP;
7069 }
7070 break;
7071
7072 case N32_OP6_LWI_BI:
7073 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7074 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7075 {
7076 insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7077 N32_IMM15S (insn));
7078 insn_type = NDS32_INSN_LWI333_BI;
7079 }
7080 break;
7081
7082 case N32_OP6_SWI_BI:
7083 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7084 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7085 {
7086 insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7087 N32_IMM15S (insn));
7088 insn_type = NDS32_INSN_SWI333_BI;
7089 }
7090 break;
7091
7092 case N32_OP6_LHI:
7093 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7094 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7095 {
7096 insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn),
7097 N32_IMM15S (insn));
7098 insn_type = NDS32_INSN_LHI333;
7099 }
7100 break;
7101
7102 case N32_OP6_SHI:
7103 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7104 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7105 {
7106 insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn),
7107 N32_IMM15S (insn));
7108 insn_type = NDS32_INSN_SHI333;
7109 }
7110 break;
7111
7112 case N32_OP6_LBI:
7113 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7114 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7115 {
7116 insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn),
7117 N32_IMM15S (insn));
7118 insn_type = NDS32_INSN_LBI333;
7119 }
7120 break;
7121
7122 case N32_OP6_SBI:
7123 if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7124 && IS_WITHIN_U (N32_IMM15S (insn), 3))
7125 {
7126 insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn),
7127 N32_IMM15S (insn));
7128 insn_type = NDS32_INSN_SBI333;
7129 }
7130 break;
7131
7132 case N32_OP6_ALU1:
7133 return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type);
7134
7135 case N32_OP6_ALU2:
7136 return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type);
7137
7138 case N32_OP6_BR1:
7139 if (!IS_WITHIN_S (N32_IMM14S (insn), 8))
7140 goto done;
7141
7142 if ((insn & N32_BIT (14)) == 0)
7143 {
7144 /* N32_BR1_BEQ */
7145 if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7146 && N32_RT5 (insn) != REG_R5)
7147 insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn));
7148 else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7149 && N32_RA5 (insn) != REG_R5)
7150 insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn));
7151 insn_type = NDS32_INSN_BEQS38;
7152 break;
7153 }
7154 else
7155 {
7156 /* N32_BR1_BNE */
7157 if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7158 && N32_RT5 (insn) != REG_R5)
7159 insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn));
7160 else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7161 && N32_RA5 (insn) != REG_R5)
7162 insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn));
7163 insn_type = NDS32_INSN_BNES38;
7164 break;
7165 }
7166 break;
7167
7168 case N32_OP6_BR2:
7169 switch (N32_BR2_SUB (insn))
7170 {
7171 case N32_BR2_BEQZ:
7172 if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7173 {
7174 insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn));
7175 insn_type = NDS32_INSN_BEQZ38;
7176 }
7177 else if (N32_RT5 (insn) == REG_R15
7178 && IS_WITHIN_S (N32_IMM16S (insn), 8))
7179 {
7180 insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn));
7181 insn_type = NDS32_INSN_BEQZS8;
7182 }
7183 break;
7184
7185 case N32_BR2_BNEZ:
7186 if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7187 {
7188 insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn));
7189 insn_type = NDS32_INSN_BNEZ38;
7190 }
7191 else if (N32_RT5 (insn) == REG_R15
7192 && IS_WITHIN_S (N32_IMM16S (insn), 8))
7193 {
7194 insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn));
7195 insn_type = NDS32_INSN_BNEZS8;
7196 }
7197 break;
7198
7199 case N32_BR2_IFCALL:
7200 if (IS_WITHIN_U (N32_IMM16S (insn), 9))
7201 {
7202 insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn));
7203 insn_type = NDS32_INSN_IFCALL9;
7204 }
7205 break;
7206 }
7207 break;
7208
7209 case N32_OP6_JI:
7210 if ((insn & N32_BIT (24)) == 0)
7211 {
7212 /* N32_JI_J */
7213 if (IS_WITHIN_S (N32_IMM24S (insn), 8))
7214 {
7215 insn16 = N16_TYPE8 (J8, N32_IMM24S (insn));
7216 insn_type = NDS32_INSN_J8;
7217 }
7218 }
7219 break;
7220
7221 case N32_OP6_JREG:
7222 if (__GF (insn, 8, 2) != 0)
7223 goto done;
7224
7225 switch (N32_IMMU (insn, 5))
7226 {
7227 case N32_JREG_JR:
7228 if (N32_JREG_HINT (insn) == 0)
7229 {
7230 /* jr */
7231 insn16 = N16_TYPE5 (JR5, N32_RB5 (insn));
7232 insn_type = NDS32_INSN_JR5;
7233 }
7234 else if (N32_JREG_HINT (insn) == 1)
7235 {
7236 /* ret */
7237 insn16 = N16_TYPE5 (RET5, N32_RB5 (insn));
7238 insn_type = NDS32_INSN_RET5;
7239 }
7240 else if (N32_JREG_HINT (insn) == 3)
7241 {
7242 /* ifret = mov55 $sp, $sp */
7243 insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP);
7244 insn_type = NDS32_INSN_IFRET;
7245 }
7246 break;
7247
7248 case N32_JREG_JRAL:
7249 /* It's convertible when return rt5 is $lp and address
7250 translation is kept. */
7251 if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0)
7252 {
7253 insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn));
7254 insn_type = NDS32_INSN_JRAL5;
7255 }
7256 break;
7257 }
7258 break;
7259
7260 case N32_OP6_MISC:
7261 if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32)
7262 {
7263 /* For v3, swid above 31 are used for ex9.it. */
7264 insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn));
7265 insn_type = NDS32_INSN_BREAK16;
7266 }
7267 break;
7268
7269 default:
7270 /* This instruction has no 16-bit variant. */
7271 goto done;
7272 }
7273
7274 done:
7275 /* Bit-15 of insn16 should be set for a valid instruction. */
7276 if ((insn16 & 0x8000) == 0)
7277 return 0;
7278
7279 if (pinsn16)
7280 *pinsn16 = insn16;
7281 if (pinsn_type)
7282 *pinsn_type = insn_type;
7283 return 1;
7284 }
7285
7286 static int
7287 special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16,
7288 Elf_Internal_Rela *reloc)
7289 {
7290 uint16_t insn16 = 0;
7291
7292 if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0
7293 || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16))
7294 return 0;
7295
7296 if (!N32_IS_RT3 (insn))
7297 return 0;
7298
7299 switch (N32_OP6 (insn))
7300 {
7301 case N32_OP6_LWI:
7302 if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7303 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7304 break;
7305 case N32_OP6_SWI:
7306 if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7307 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7308 break;
7309 case N32_OP6_HWGP:
7310 if (!IS_WITHIN_U (N32_IMM17S (insn), 7))
7311 break;
7312
7313 if (__GF (insn, 17, 3) == 6)
7314 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn));
7315 else if (__GF (insn, 17, 3) == 7)
7316 insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn));
7317 break;
7318 }
7319
7320 if ((insn16 & 0x8000) == 0)
7321 return 0;
7322
7323 *pinsn16 = insn16;
7324 return 1;
7325 }
7326
7327 /* Convert a 16-bit instruction to 32-bit one.
7328 INSN16 it the input and PINSN it the point to output.
7329 Return non-zero on successful. Otherwise 0 is returned. */
7330
7331 int
7332 nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn)
7333 {
7334 uint32_t insn = 0xffffffff;
7335 unsigned long mach = bfd_get_mach (abfd);
7336
7337 /* NOTE: push25, pop25 and movd44 do not have 32-bit variants. */
7338
7339 switch (__GF (insn16, 9, 6))
7340 {
7341 case 0x4: /* add45 */
7342 insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16),
7343 N16_RA5 (insn16));
7344 goto done;
7345 case 0x5: /* sub45 */
7346 insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16),
7347 N16_RA5 (insn16));
7348 goto done;
7349 case 0x6: /* addi45 */
7350 insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7351 N16_IMM5U (insn16));
7352 goto done;
7353 case 0x7: /* subi45 */
7354 insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7355 -N16_IMM5U (insn16));
7356 goto done;
7357 case 0x8: /* srai45 */
7358 insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16),
7359 N16_IMM5U (insn16));
7360 goto done;
7361 case 0x9: /* srli45 */
7362 insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16),
7363 N16_IMM5U (insn16));
7364 goto done;
7365 case 0xa: /* slli333 */
7366 insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16),
7367 N16_IMM3U (insn16));
7368 goto done;
7369 case 0xc: /* add333 */
7370 insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16),
7371 N16_RB3 (insn16));
7372 goto done;
7373 case 0xd: /* sub333 */
7374 insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16),
7375 N16_RB3 (insn16));
7376 goto done;
7377 case 0xe: /* addi333 */
7378 insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7379 N16_IMM3U (insn16));
7380 goto done;
7381 case 0xf: /* subi333 */
7382 insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7383 -N16_IMM3U (insn16));
7384 goto done;
7385 case 0x10: /* lwi333 */
7386 insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16),
7387 N16_IMM3U (insn16));
7388 goto done;
7389 case 0x12: /* lhi333 */
7390 insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16),
7391 N16_IMM3U (insn16));
7392 goto done;
7393 case 0x13: /* lbi333 */
7394 insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16),
7395 N16_IMM3U (insn16));
7396 goto done;
7397 case 0x11: /* lwi333.bi */
7398 insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7399 N16_IMM3U (insn16));
7400 goto done;
7401 case 0x14: /* swi333 */
7402 insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16),
7403 N16_IMM3U (insn16));
7404 goto done;
7405 case 0x16: /* shi333 */
7406 insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16),
7407 N16_IMM3U (insn16));
7408 goto done;
7409 case 0x17: /* sbi333 */
7410 insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16),
7411 N16_IMM3U (insn16));
7412 goto done;
7413 case 0x15: /* swi333.bi */
7414 insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7415 N16_IMM3U (insn16));
7416 goto done;
7417 case 0x18: /* addri36.sp */
7418 insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP,
7419 N16_IMM6U (insn16) << 2);
7420 goto done;
7421 case 0x19: /* lwi45.fe */
7422 insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8,
7423 (N16_IMM5U (insn16) - 32));
7424 goto done;
7425 case 0x1a: /* lwi450 */
7426 insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7427 goto done;
7428 case 0x1b: /* swi450 */
7429 insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7430 goto done;
7431
7432 /* These are r15 implied instructions. */
7433 case 0x30: /* slts45 */
7434 insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7435 goto done;
7436 case 0x31: /* slt45 */
7437 insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7438 goto done;
7439 case 0x32: /* sltsi45 */
7440 insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7441 goto done;
7442 case 0x33: /* slti45 */
7443 insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7444 goto done;
7445 case 0x34: /* beqzs8, bnezs8 */
7446 if (insn16 & N32_BIT (8))
7447 insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16));
7448 else
7449 insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16));
7450 goto done;
7451
7452 case 0x35: /* break16, ex9.it */
7453 /* Only consider range of v3 break16. */
7454 insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK);
7455 goto done;
7456
7457 case 0x3c: /* ifcall9 */
7458 insn = N32_BR2 (IFCALL, 0, N16_IMM9U (insn16));
7459 goto done;
7460 case 0x3d: /* movpi45 */
7461 insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16);
7462 goto done;
7463
7464 case 0x3f: /* MISC33 */
7465 switch (insn16 & 0x7)
7466 {
7467 case 2: /* neg33 */
7468 insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7469 break;
7470 case 3: /* not33 */
7471 insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16),
7472 N16_RA3 (insn16));
7473 break;
7474 case 4: /* mul33 */
7475 insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16),
7476 N16_RA3 (insn16));
7477 break;
7478 case 5: /* xor33 */
7479 insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16),
7480 N16_RA3 (insn16));
7481 break;
7482 case 6: /* and33 */
7483 insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16),
7484 N16_RA3 (insn16));
7485 break;
7486 case 7: /* or33 */
7487 insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16),
7488 N16_RA3 (insn16));
7489 break;
7490 }
7491 goto done;
7492
7493 case 0xb:
7494 switch (insn16 & 0x7)
7495 {
7496 case 0: /* zeb33 */
7497 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff);
7498 break;
7499 case 1: /* zeh33 */
7500 insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7501 break;
7502 case 2: /* seb33 */
7503 insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7504 break;
7505 case 3: /* seh33 */
7506 insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7507 break;
7508 case 4: /* xlsb33 */
7509 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1);
7510 break;
7511 case 5: /* x11b33 */
7512 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff);
7513 break;
7514 case 6: /* bmski33 */
7515 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7516 1 << __GF (insn16, 3, 3));
7517 break;
7518 case 7: /* fexti33 */
7519 insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7520 (1 << (__GF (insn16, 3, 3) + 1)) - 1);
7521 break;
7522 }
7523 goto done;
7524 }
7525
7526 switch (__GF (insn16, 10, 5))
7527 {
7528 case 0x0: /* mov55 or ifret16 */
7529 if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP
7530 && N16_RT5 (insn16) == N16_RA5 (insn16))
7531 insn = N32_JREG (JR, 0, 0, 0, 3);
7532 else
7533 insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0);
7534 goto done;
7535 case 0x1: /* movi55 */
7536 insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16));
7537 goto done;
7538 case 0x1b: /* addi10s (V2) */
7539 insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16));
7540 goto done;
7541 }
7542
7543 switch (__GF (insn16, 11, 4))
7544 {
7545 case 0x7: /* lwi37.fp/swi37.fp */
7546 if (insn16 & N32_BIT (7)) /* swi37.fp */
7547 insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7548 else /* lwi37.fp */
7549 insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7550 goto done;
7551 case 0x8: /* beqz38 */
7552 insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7553 goto done;
7554 case 0x9: /* bnez38 */
7555 insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7556 goto done;
7557 case 0xa: /* beqs38/j8, implied r5 */
7558 if (N16_RT38 (insn16) == 5)
7559 insn = N32_JI (J, N16_IMM8S (insn16));
7560 else
7561 insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7562 goto done;
7563 case 0xb: /* bnes38 and others */
7564 if (N16_RT38 (insn16) == 5)
7565 {
7566 switch (__GF (insn16, 5, 3))
7567 {
7568 case 0: /* jr5 */
7569 insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0);
7570 break;
7571 case 4: /* ret5 */
7572 insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1);
7573 break;
7574 case 1: /* jral5 */
7575 insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0);
7576 break;
7577 case 2: /* ex9.it imm5 */
7578 /* ex9.it had no 32-bit variantl. */
7579 break;
7580 case 5: /* add5.pc */
7581 /* add5.pc had no 32-bit variantl. */
7582 break;
7583 }
7584 }
7585 else /* bnes38 */
7586 insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7587 goto done;
7588 case 0xe: /* lwi37/swi37 */
7589 if (insn16 & (1 << 7)) /* swi37.sp */
7590 insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7591 else /* lwi37.sp */
7592 insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7593 goto done;
7594 }
7595
7596 done:
7597 if (insn & 0x80000000)
7598 return 0;
7599
7600 if (pinsn)
7601 *pinsn = insn;
7602 return 1;
7603 }
7604 \f
7605 static bfd_boolean
7606 is_sda_access_insn (unsigned long insn)
7607 {
7608 switch (N32_OP6 (insn))
7609 {
7610 case N32_OP6_LWI:
7611 case N32_OP6_LHI:
7612 case N32_OP6_LHSI:
7613 case N32_OP6_LBI:
7614 case N32_OP6_LBSI:
7615 case N32_OP6_SWI:
7616 case N32_OP6_SHI:
7617 case N32_OP6_SBI:
7618 case N32_OP6_LWC:
7619 case N32_OP6_LDC:
7620 case N32_OP6_SWC:
7621 case N32_OP6_SDC:
7622 return TRUE;
7623 default:
7624 ;
7625 }
7626 return FALSE;
7627 }
7628
7629 static unsigned long
7630 turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn)
7631 {
7632 uint32_t oinsn = 0;
7633
7634 switch (type)
7635 {
7636 case R_NDS32_GOT_LO12:
7637 case R_NDS32_GOTOFF_LO12:
7638 case R_NDS32_PLTREL_LO12:
7639 case R_NDS32_PLT_GOTREL_LO12:
7640 case R_NDS32_LO12S0_RELA:
7641 switch (N32_OP6 (insn))
7642 {
7643 case N32_OP6_LBI:
7644 /* lbi.gp */
7645 oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
7646 break;
7647 case N32_OP6_LBSI:
7648 /* lbsi.gp */
7649 oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), N32_BIT (19));
7650 break;
7651 case N32_OP6_SBI:
7652 /* sbi.gp */
7653 oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
7654 break;
7655 case N32_OP6_ORI:
7656 /* addi.gp */
7657 oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), N32_BIT (19));
7658 break;
7659 }
7660 break;
7661
7662 case R_NDS32_LO12S1_RELA:
7663 switch (N32_OP6 (insn))
7664 {
7665 case N32_OP6_LHI:
7666 /* lhi.gp */
7667 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
7668 break;
7669 case N32_OP6_LHSI:
7670 /* lhsi.gp */
7671 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (18));
7672 break;
7673 case N32_OP6_SHI:
7674 /* shi.gp */
7675 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (19));
7676 break;
7677 }
7678 break;
7679
7680 case R_NDS32_LO12S2_RELA:
7681 switch (N32_OP6 (insn))
7682 {
7683 case N32_OP6_LWI:
7684 /* lwi.gp */
7685 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
7686 break;
7687 case N32_OP6_SWI:
7688 /* swi.gp */
7689 oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
7690 break;
7691 }
7692 break;
7693
7694 case R_NDS32_LO12S2_DP_RELA:
7695 case R_NDS32_LO12S2_SP_RELA:
7696 oinsn = (insn & 0x7ff07000) | (REG_GP << 15);
7697 break;
7698 }
7699
7700 if (oinsn)
7701 *pinsn = oinsn;
7702
7703 return oinsn != 0;
7704 }
7705
7706 /* Linker hasn't found the correct merge section for non-section symbol
7707 in relax time, this work is left to the function elf_link_input_bfd().
7708 So for non-section symbol, _bfd_merged_section_offset is also needed
7709 to find the correct symbol address. */
7710
7711 static bfd_vma
7712 nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym,
7713 asection **psec, Elf_Internal_Rela *rel)
7714 {
7715 asection *sec = *psec;
7716 bfd_vma relocation;
7717
7718 relocation = (sec->output_section->vma
7719 + sec->output_offset + sym->st_value);
7720 if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
7721 {
7722 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7723 rel->r_addend =
7724 _bfd_merged_section_offset (abfd, psec,
7725 elf_section_data (sec)->sec_info,
7726 sym->st_value + rel->r_addend);
7727 else
7728 rel->r_addend =
7729 _bfd_merged_section_offset (abfd, psec,
7730 elf_section_data (sec)->sec_info,
7731 sym->st_value) + rel->r_addend;
7732
7733 if (sec != *psec)
7734 {
7735 /* If we have changed the section, and our original section is
7736 marked with SEC_EXCLUDE, it means that the original
7737 SEC_MERGE section has been completely subsumed in some
7738 other SEC_MERGE section. In this case, we need to leave
7739 some info around for --emit-relocs. */
7740 if ((sec->flags & SEC_EXCLUDE) != 0)
7741 sec->kept_section = *psec;
7742 sec = *psec;
7743 }
7744 rel->r_addend -= relocation;
7745 rel->r_addend += sec->output_section->vma + sec->output_offset;
7746 }
7747 return relocation;
7748 }
7749
7750 static bfd_vma
7751 calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel,
7752 Elf_Internal_Sym *isymbuf,
7753 Elf_Internal_Shdr *symtab_hdr)
7754 {
7755 bfd_signed_vma foff;
7756 bfd_vma symval, addend;
7757 Elf_Internal_Rela irel_fn;
7758 Elf_Internal_Sym *isym;
7759 asection *sym_sec;
7760
7761 /* Get the value of the symbol referred to by the reloc. */
7762 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
7763 {
7764 /* A local symbol. */
7765 isym = isymbuf + ELF32_R_SYM (irel->r_info);
7766
7767 if (isym->st_shndx == SHN_UNDEF)
7768 sym_sec = bfd_und_section_ptr;
7769 else if (isym->st_shndx == SHN_ABS)
7770 sym_sec = bfd_abs_section_ptr;
7771 else if (isym->st_shndx == SHN_COMMON)
7772 sym_sec = bfd_com_section_ptr;
7773 else
7774 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7775 memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela));
7776 symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn);
7777 addend = irel_fn.r_addend;
7778 }
7779 else
7780 {
7781 unsigned long indx;
7782 struct elf_link_hash_entry *h;
7783
7784 /* An external symbol. */
7785 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
7786 h = elf_sym_hashes (abfd)[indx];
7787 BFD_ASSERT (h != NULL);
7788
7789 while (h->root.type == bfd_link_hash_indirect
7790 || h->root.type == bfd_link_hash_warning)
7791 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7792
7793 if (h->root.type != bfd_link_hash_defined
7794 && h->root.type != bfd_link_hash_defweak)
7795 /* This appears to be a reference to an undefined
7796 symbol. Just ignore it--it will be caught by the
7797 regular reloc processing. */
7798 return 0;
7799
7800 if (h->root.u.def.section->flags & SEC_MERGE)
7801 {
7802 sym_sec = h->root.u.def.section;
7803 symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
7804 (sym_sec)->sec_info, h->root.u.def.value);
7805 symval = symval + sym_sec->output_section->vma
7806 + sym_sec->output_offset;
7807 }
7808 else
7809 symval = (h->root.u.def.value
7810 + h->root.u.def.section->output_section->vma
7811 + h->root.u.def.section->output_offset);
7812 addend = irel->r_addend;
7813 }
7814
7815 foff = symval + addend;
7816
7817 return foff;
7818 }
7819
7820 static bfd_vma
7821 calculate_got_memory_address (bfd *abfd, struct bfd_link_info *link_info,
7822 Elf_Internal_Rela *irel,
7823 Elf_Internal_Shdr *symtab_hdr)
7824 {
7825 int symndx;
7826 bfd_vma *local_got_offsets;
7827 /* Get the value of the symbol referred to by the reloc. */
7828 struct elf_link_hash_entry *h;
7829 struct elf_nds32_link_hash_table *htab = nds32_elf_hash_table (link_info);
7830
7831 /* An external symbol. */
7832 symndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
7833 h = elf_sym_hashes (abfd)[symndx];
7834 while (h->root.type == bfd_link_hash_indirect
7835 || h->root.type == bfd_link_hash_warning)
7836 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7837
7838 if (symndx >= 0)
7839 {
7840 BFD_ASSERT (h != NULL);
7841 return (htab->root.sgot->output_section->vma
7842 + htab->root.sgot->output_offset
7843 + h->got.offset);
7844 }
7845 else
7846 {
7847 local_got_offsets = elf_local_got_offsets (abfd);
7848 BFD_ASSERT (local_got_offsets != NULL);
7849 return (htab->root.sgot->output_section->vma
7850 + htab->root.sgot->output_offset
7851 + local_got_offsets[ELF32_R_SYM (irel->r_info)]);
7852 }
7853
7854 /* The _GLOBAL_OFFSET_TABLE_ may be undefweak(or should be?). */
7855 /* The check of h->root.type is passed. */
7856 }
7857
7858 static int
7859 is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED,
7860 asection *sec, Elf_Internal_Rela *rel)
7861 {
7862 bfd_byte *contents;
7863 unsigned short insn16;
7864
7865 if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG))
7866 return FALSE;
7867 contents = elf_section_data (sec)->this_hdr.contents;
7868 insn16 = bfd_getb16 (contents + rel->r_offset);
7869 if (insn16 == NDS32_NOP16)
7870 return TRUE;
7871 return FALSE;
7872 }
7873
7874 /* It checks whether the instruction could be converted to
7875 16-bit form and returns the converted one.
7876
7877 `internal_relocs' is supposed to be sorted. */
7878
7879 static int
7880 is_convert_32_to_16 (bfd *abfd, asection *sec,
7881 Elf_Internal_Rela *reloc,
7882 Elf_Internal_Rela *internal_relocs,
7883 Elf_Internal_Rela *irelend,
7884 uint16_t *insn16)
7885 {
7886 #define NORMAL_32_TO_16 (1 << 0)
7887 #define SPECIAL_32_TO_16 (1 << 1)
7888 bfd_byte *contents = NULL;
7889 bfd_signed_vma off;
7890 bfd_vma mem_addr;
7891 uint32_t insn = 0;
7892 Elf_Internal_Rela *pc_rel;
7893 int pic_ext_target = 0;
7894 Elf_Internal_Shdr *symtab_hdr;
7895 Elf_Internal_Sym *isymbuf = NULL;
7896 int convert_type;
7897 bfd_vma offset;
7898
7899 if (reloc->r_offset + 4 > sec->size)
7900 return FALSE;
7901
7902 offset = reloc->r_offset;
7903
7904 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
7905 return FALSE;
7906 insn = bfd_getb32 (contents + offset);
7907
7908 if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL))
7909 convert_type = NORMAL_32_TO_16;
7910 else if (special_convert_32_to_16 (insn, insn16, reloc))
7911 convert_type = SPECIAL_32_TO_16;
7912 else
7913 return FALSE;
7914
7915 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7916 if (!nds32_get_local_syms (abfd, sec, &isymbuf))
7917 return FALSE;
7918
7919 /* Find the first relocation of the same relocation-type,
7920 so we iteratie them forward. */
7921 pc_rel = reloc;
7922 while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset)
7923 pc_rel--;
7924
7925 for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
7926 {
7927 if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
7928 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
7929 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA
7930 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
7931 {
7932 off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
7933 &pic_ext_target);
7934 if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1
7935 || off == 0)
7936 return FALSE;
7937 break;
7938 }
7939 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
7940 {
7941 /* movi => movi55 */
7942 mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf,
7943 symtab_hdr);
7944 /* mem_addr is unsigned, but the value should
7945 be between [-16, 15]. */
7946 if ((mem_addr + 0x10) >> 5)
7947 return FALSE;
7948 break;
7949 }
7950 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20)
7951 || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12))
7952 {
7953 /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
7954 because it can be relaxed to addi for TLS_LE_ADD. */
7955 return FALSE;
7956 }
7957 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
7958 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
7959 && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG)
7960 && convert_type == SPECIAL_32_TO_16)
7961 {
7962 /* fp-as-gp
7963 We've selected a best fp-base for this access, so we can
7964 always resolve it anyway. Do nothing. */
7965 break;
7966 }
7967 else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE
7968 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT))
7969 || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY)
7970 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16))
7971 || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE)
7972 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA)))
7973 {
7974 /* Prevent unresolved addi instruction translate
7975 to addi45 or addi333. */
7976 return FALSE;
7977 }
7978 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
7979 {
7980 off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
7981 &pic_ext_target);
7982 if (off >= ACCURATE_U9BIT_S1 || off <= 0)
7983 return FALSE;
7984 break;
7985 }
7986 }
7987
7988 return TRUE;
7989 }
7990
7991 static void
7992 nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents,
7993 Elf_Internal_Rela *reloc,
7994 Elf_Internal_Rela *internal_relocs,
7995 Elf_Internal_Rela *irelend,
7996 unsigned short insn16)
7997 {
7998 Elf_Internal_Rela *pc_rel;
7999 bfd_vma offset;
8000
8001 offset = reloc->r_offset;
8002 bfd_putb16 (insn16, contents + offset);
8003 /* Find the first relocation of the same relocation-type,
8004 so we iteratie them forward. */
8005 pc_rel = reloc;
8006 while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset)
8007 pc_rel--;
8008
8009 for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8010 {
8011 if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8012 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8013 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA)
8014 {
8015 pc_rel->r_info =
8016 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA);
8017 }
8018 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8019 pc_rel->r_info =
8020 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL);
8021 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8022 pc_rel->r_info =
8023 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA);
8024 else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8025 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8026 pc_rel->r_info =
8027 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA);
8028 else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8029 pc_rel->r_info =
8030 ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA);
8031 }
8032 }
8033
8034 /* Find a relocation of type specified by `reloc_type'
8035 of the same r_offset with reloc.
8036 If not found, return irelend.
8037
8038 Assuming relocations are sorted by r_offset,
8039 we find the relocation from `reloc' backward untill relocs,
8040 or find it from `reloc' forward untill irelend. */
8041
8042 static Elf_Internal_Rela *
8043 find_relocs_at_address (Elf_Internal_Rela *reloc,
8044 Elf_Internal_Rela *relocs,
8045 Elf_Internal_Rela *irelend,
8046 enum elf_nds32_reloc_type reloc_type)
8047 {
8048 Elf_Internal_Rela *rel_t;
8049
8050 /* Find backward. */
8051 for (rel_t = reloc;
8052 rel_t >= relocs && rel_t->r_offset == reloc->r_offset;
8053 rel_t--)
8054 if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8055 return rel_t;
8056
8057 /* We didn't find it backward. Try find it forward. */
8058 for (rel_t = reloc;
8059 rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8060 rel_t++)
8061 if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8062 return rel_t;
8063
8064 return irelend;
8065 }
8066
8067 /* Find a relocation of specified type and offset.
8068 `reloc' is just a refence point to find a relocation at specified offset.
8069 If not found, return irelend.
8070
8071 Assuming relocations are sorted by r_offset,
8072 we find the relocation from `reloc' backward untill relocs,
8073 or find it from `reloc' forward untill irelend. */
8074
8075 static Elf_Internal_Rela *
8076 find_relocs_at_address_addr (Elf_Internal_Rela *reloc,
8077 Elf_Internal_Rela *relocs,
8078 Elf_Internal_Rela *irelend,
8079 enum elf_nds32_reloc_type reloc_type,
8080 bfd_vma offset_p)
8081 {
8082 Elf_Internal_Rela *rel_t = NULL;
8083
8084 /* First, we try to find a relocation of offset `offset_p',
8085 and then we use find_relocs_at_address to find specific type. */
8086
8087 if (reloc->r_offset > offset_p)
8088 {
8089 /* Find backward. */
8090 for (rel_t = reloc;
8091 rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--)
8092 /* Do nothing. */;
8093 }
8094 else if (reloc->r_offset < offset_p)
8095 {
8096 /* Find forward. */
8097 for (rel_t = reloc;
8098 rel_t < irelend && rel_t->r_offset < offset_p; rel_t++)
8099 /* Do nothing. */;
8100 }
8101 else
8102 rel_t = reloc;
8103
8104 /* Not found? */
8105 if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p)
8106 return irelend;
8107
8108 return find_relocs_at_address (rel_t, relocs, irelend, reloc_type);
8109 }
8110
8111 static bfd_boolean
8112 nds32_elf_check_dup_relocs (Elf_Internal_Rela *reloc,
8113 Elf_Internal_Rela *internal_relocs,
8114 Elf_Internal_Rela *irelend,
8115 unsigned char reloc_type)
8116 {
8117 Elf_Internal_Rela *rel_t;
8118
8119 for (rel_t = reloc;
8120 rel_t >= internal_relocs && rel_t->r_offset == reloc->r_offset;
8121 rel_t--)
8122 if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8123 {
8124 if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8125 && rel_t->r_addend == reloc->r_addend)
8126 continue;
8127 return TRUE;
8128 }
8129
8130 for (rel_t = reloc; rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8131 rel_t++)
8132 if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8133 {
8134 if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8135 && rel_t->r_addend == reloc->r_addend)
8136 continue;
8137 return TRUE;
8138 }
8139
8140 return FALSE;
8141 }
8142
8143 typedef struct nds32_elf_blank nds32_elf_blank_t;
8144 struct nds32_elf_blank
8145 {
8146 /* Where the blank begins. */
8147 bfd_vma offset;
8148 /* The size of the blank. */
8149 bfd_vma size;
8150 /* The accumulative size before this blank. */
8151 bfd_vma total_size;
8152 nds32_elf_blank_t *next;
8153 nds32_elf_blank_t *prev;
8154 };
8155
8156 static nds32_elf_blank_t *blank_free_list = NULL;
8157
8158 static nds32_elf_blank_t *
8159 create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p)
8160 {
8161 nds32_elf_blank_t *blank_t;
8162
8163 if (blank_free_list)
8164 {
8165 blank_t = blank_free_list;
8166 blank_free_list = blank_free_list->next;
8167 }
8168 else
8169 blank_t = bfd_malloc (sizeof (nds32_elf_blank_t));
8170
8171 if (blank_t == NULL)
8172 return NULL;
8173
8174 blank_t->offset = offset_p;
8175 blank_t->size = size_p;
8176 blank_t->total_size = 0;
8177 blank_t->next = NULL;
8178 blank_t->prev = NULL;
8179
8180 return blank_t;
8181 }
8182
8183 static void
8184 remove_nds32_elf_blank (nds32_elf_blank_t *blank_p)
8185 {
8186 if (blank_free_list)
8187 {
8188 blank_free_list->prev = blank_p;
8189 blank_p->next = blank_free_list;
8190 }
8191 else
8192 blank_p->next = NULL;
8193
8194 blank_p->prev = NULL;
8195 blank_free_list = blank_p;
8196 }
8197
8198 static void
8199 clean_nds32_elf_blank (void)
8200 {
8201 nds32_elf_blank_t *blank_t;
8202
8203 while (blank_free_list)
8204 {
8205 blank_t = blank_free_list;
8206 blank_free_list = blank_free_list->next;
8207 free (blank_t);
8208 }
8209 }
8210
8211 static nds32_elf_blank_t *
8212 search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr)
8213 {
8214 nds32_elf_blank_t *blank_t;
8215
8216 if (!blank_p)
8217 return NULL;
8218 blank_t = blank_p;
8219
8220 while (blank_t && addr < blank_t->offset)
8221 blank_t = blank_t->prev;
8222 while (blank_t && blank_t->next && addr >= blank_t->next->offset)
8223 blank_t = blank_t->next;
8224
8225 return blank_t;
8226 }
8227
8228 static bfd_vma
8229 get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8230 int overwrite)
8231 {
8232 nds32_elf_blank_t *blank_t;
8233
8234 blank_t = search_nds32_elf_blank (*blank_p, addr);
8235 if (!blank_t)
8236 return 0;
8237
8238 if (overwrite)
8239 *blank_p = blank_t;
8240
8241 if (addr < blank_t->offset + blank_t->size)
8242 return blank_t->total_size + (addr - blank_t->offset);
8243 else
8244 return blank_t->total_size + blank_t->size;
8245 }
8246
8247 static bfd_boolean
8248 insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len)
8249 {
8250 nds32_elf_blank_t *blank_t, *blank_t2;
8251
8252 if (!*blank_p)
8253 {
8254 *blank_p = create_nds32_elf_blank (addr, len);
8255 return *blank_p ? TRUE : FALSE;
8256 }
8257
8258 blank_t = search_nds32_elf_blank (*blank_p, addr);
8259
8260 if (blank_t == NULL)
8261 {
8262 blank_t = create_nds32_elf_blank (addr, len);
8263 if (!blank_t)
8264 return FALSE;
8265 while ((*blank_p)->prev != NULL)
8266 *blank_p = (*blank_p)->prev;
8267 blank_t->next = *blank_p;
8268 (*blank_p)->prev = blank_t;
8269 (*blank_p) = blank_t;
8270 return TRUE;
8271 }
8272
8273 if (addr < blank_t->offset + blank_t->size)
8274 {
8275 if (addr > blank_t->offset + blank_t->size)
8276 blank_t->size = addr - blank_t->offset;
8277 }
8278 else
8279 {
8280 blank_t2 = create_nds32_elf_blank (addr, len);
8281 if (!blank_t2)
8282 return FALSE;
8283 if (blank_t->next)
8284 {
8285 blank_t->next->prev = blank_t2;
8286 blank_t2->next = blank_t->next;
8287 }
8288 blank_t2->prev = blank_t;
8289 blank_t->next = blank_t2;
8290 *blank_p = blank_t2;
8291 }
8292
8293 return TRUE;
8294 }
8295
8296 static bfd_boolean
8297 insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8298 bfd_vma len)
8299 {
8300 nds32_elf_blank_t *blank_t;
8301
8302 if (!insert_nds32_elf_blank (blank_p, addr, len))
8303 return FALSE;
8304
8305 blank_t = *blank_p;
8306
8307 if (!blank_t->prev)
8308 {
8309 blank_t->total_size = 0;
8310 blank_t = blank_t->next;
8311 }
8312
8313 while (blank_t)
8314 {
8315 blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size;
8316 blank_t = blank_t->next;
8317 }
8318
8319 return TRUE;
8320 }
8321
8322 static void
8323 calc_nds32_blank_total (nds32_elf_blank_t *blank_p)
8324 {
8325 nds32_elf_blank_t *blank_t;
8326 bfd_vma total_size = 0;
8327
8328 if (!blank_p)
8329 return;
8330
8331 blank_t = blank_p;
8332 while (blank_t->prev)
8333 blank_t = blank_t->prev;
8334 while (blank_t)
8335 {
8336 blank_t->total_size = total_size;
8337 total_size += blank_t->size;
8338 blank_t = blank_t->next;
8339 }
8340 }
8341
8342 static bfd_boolean
8343 nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec,
8344 nds32_elf_blank_t *blank_p)
8345 {
8346 Elf_Internal_Shdr *symtab_hdr; /* Symbol table header of this bfd. */
8347 Elf_Internal_Sym *isym = NULL; /* Symbol table of this bfd. */
8348 Elf_Internal_Sym *isymend; /* Symbol entry iterator. */
8349 unsigned int sec_shndx; /* The section the be relaxed. */
8350 bfd_byte *contents; /* Contents data of iterating section. */
8351 Elf_Internal_Rela *internal_relocs;
8352 Elf_Internal_Rela *irel;
8353 Elf_Internal_Rela *irelend;
8354 struct elf_link_hash_entry **sym_hashes;
8355 struct elf_link_hash_entry **end_hashes;
8356 unsigned int symcount;
8357 asection *sect;
8358 nds32_elf_blank_t *blank_t;
8359 nds32_elf_blank_t *blank_t2;
8360 nds32_elf_blank_t *blank_head;
8361
8362 blank_head = blank_t = blank_p;
8363 while (blank_head->prev != NULL)
8364 blank_head = blank_head->prev;
8365 while (blank_t->next != NULL)
8366 blank_t = blank_t->next;
8367
8368 if (blank_t->offset + blank_t->size <= sec->size)
8369 {
8370 blank_t->next = create_nds32_elf_blank (sec->size + 4, 0);
8371 blank_t->next->prev = blank_t;
8372 }
8373 if (blank_head->offset > 0)
8374 {
8375 blank_head->prev = create_nds32_elf_blank (0, 0);
8376 blank_head->prev->next = blank_head;
8377 blank_head = blank_head->prev;
8378 }
8379
8380 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
8381
8382 /* The deletion must stop at the next ALIGN reloc for an alignment
8383 power larger than the number of bytes we are deleting. */
8384
8385 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8386 if (!nds32_get_local_syms (abfd, sec, &isym))
8387 return FALSE;
8388
8389 if (isym == NULL)
8390 {
8391 isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8392 symtab_hdr->sh_info, 0, NULL, NULL, NULL);
8393 symtab_hdr->contents = (bfd_byte *) isym;
8394 }
8395
8396 if (isym == NULL || symtab_hdr->sh_info == 0)
8397 return FALSE;
8398
8399 blank_t = blank_head;
8400 calc_nds32_blank_total (blank_head);
8401
8402 for (sect = abfd->sections; sect != NULL; sect = sect->next)
8403 {
8404 /* Adjust all the relocs. */
8405
8406 /* Relocations MUST be kept in memory, because relaxation adjust them. */
8407 internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
8408 TRUE /* keep_memory */);
8409 irelend = internal_relocs + sect->reloc_count;
8410
8411 blank_t = blank_head;
8412 blank_t2 = blank_head;
8413
8414 if (!(sect->flags & SEC_RELOC))
8415 continue;
8416
8417 nds32_get_section_contents (abfd, sect, &contents, TRUE);
8418
8419 for (irel = internal_relocs; irel < irelend; irel++)
8420 {
8421 bfd_vma raddr;
8422
8423 if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
8424 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
8425 && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8426 {
8427 unsigned long val = 0;
8428 unsigned long mask;
8429 long before, between;
8430 long offset = 0;
8431
8432 switch (ELF32_R_TYPE (irel->r_info))
8433 {
8434 case R_NDS32_DIFF8:
8435 offset = bfd_get_8 (abfd, contents + irel->r_offset);
8436 break;
8437 case R_NDS32_DIFF16:
8438 offset = bfd_get_16 (abfd, contents + irel->r_offset);
8439 break;
8440 case R_NDS32_DIFF32:
8441 val = bfd_get_32 (abfd, contents + irel->r_offset);
8442 /* Get the signed bit and mask for the high part. The
8443 gcc will alarm when right shift 32-bit since the
8444 type size of long may be 32-bit. */
8445 mask = 0 - (val >> 31);
8446 if (mask)
8447 offset = (val | (mask - 0xffffffff));
8448 else
8449 offset = val;
8450 break;
8451 default:
8452 BFD_ASSERT (0);
8453 }
8454
8455 /* DIFF value
8456 0 |encoded in location|
8457 |------------|-------------------|---------
8458 sym+off(addend)
8459 -- before ---| *****************
8460 --------------------- between ---|
8461
8462 We only care how much data are relax between DIFF,
8463 marked as ***. */
8464
8465 before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8466 between = get_nds32_elf_blank_total (&blank_t,
8467 irel->r_addend + offset, 0);
8468 if (between == before)
8469 goto done_adjust_diff;
8470
8471 switch (ELF32_R_TYPE (irel->r_info))
8472 {
8473 case R_NDS32_DIFF8:
8474 bfd_put_8 (abfd, offset - (between - before),
8475 contents + irel->r_offset);
8476 break;
8477 case R_NDS32_DIFF16:
8478 bfd_put_16 (abfd, offset - (between - before),
8479 contents + irel->r_offset);
8480 break;
8481 case R_NDS32_DIFF32:
8482 bfd_put_32 (abfd, offset - (between - before),
8483 contents + irel->r_offset);
8484 break;
8485 }
8486 }
8487 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
8488 && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8489 {
8490 bfd_vma val = 0;
8491 unsigned int len = 0;
8492 unsigned long before, between;
8493 bfd_byte *endp, *p;
8494
8495 val = _bfd_read_unsigned_leb128 (abfd, contents + irel->r_offset,
8496 &len);
8497
8498 before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8499 between = get_nds32_elf_blank_total (&blank_t,
8500 irel->r_addend + val, 0);
8501 if (between == before)
8502 goto done_adjust_diff;
8503
8504 p = contents + irel->r_offset;
8505 endp = p + len -1;
8506 memset (p, 0x80, len);
8507 *(endp) = 0;
8508 p = write_uleb128 (p, val - (between - before)) - 1;
8509 if (p < endp)
8510 *p |= 0x80;
8511 }
8512 done_adjust_diff:
8513
8514 if (sec == sect)
8515 {
8516 raddr = irel->r_offset;
8517 irel->r_offset -= get_nds32_elf_blank_total (&blank_t2,
8518 irel->r_offset, 1);
8519
8520 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
8521 continue;
8522 if (blank_t2 && blank_t2->next
8523 && (blank_t2->offset > raddr
8524 || blank_t2->next->offset <= raddr))
8525 _bfd_error_handler
8526 (_("%B: Error: search_nds32_elf_blank reports wrong node\n"), abfd);
8527
8528 /* Mark reloc in deleted portion as NONE.
8529 For some relocs like R_NDS32_LABEL that doesn't modify the
8530 content in the section. R_NDS32_LABEL doesn't belong to the
8531 instruction in the section, so we should preserve it. */
8532 if (raddr >= blank_t2->offset
8533 && raddr < blank_t2->offset + blank_t2->size
8534 && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
8535 && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN
8536 && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
8537 && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
8538 && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND
8539 && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND)
8540 {
8541 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
8542 R_NDS32_NONE);
8543 continue;
8544 }
8545 }
8546
8547 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
8548 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
8549 || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
8550 continue;
8551
8552 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
8553 && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
8554 && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
8555 {
8556 if (irel->r_addend <= sec->size)
8557 irel->r_addend -=
8558 get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1);
8559 }
8560 }
8561 }
8562
8563 /* Adjust the local symbols defined in this section. */
8564 blank_t = blank_head;
8565 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
8566 {
8567 if (isym->st_shndx == sec_shndx)
8568 {
8569 if (isym->st_value <= sec->size)
8570 {
8571 bfd_vma ahead;
8572 bfd_vma orig_addr = isym->st_value;
8573
8574 ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1);
8575 isym->st_value -= ahead;
8576
8577 /* Adjust function size. */
8578 if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC
8579 && isym->st_size > 0)
8580 isym->st_size -=
8581 get_nds32_elf_blank_total
8582 (&blank_t, orig_addr + isym->st_size, 0) - ahead;
8583 }
8584 }
8585 }
8586
8587 /* Now adjust the global symbols defined in this section. */
8588 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
8589 - symtab_hdr->sh_info);
8590 sym_hashes = elf_sym_hashes (abfd);
8591 end_hashes = sym_hashes + symcount;
8592 blank_t = blank_head;
8593 for (; sym_hashes < end_hashes; sym_hashes++)
8594 {
8595 struct elf_link_hash_entry *sym_hash = *sym_hashes;
8596
8597 if ((sym_hash->root.type == bfd_link_hash_defined
8598 || sym_hash->root.type == bfd_link_hash_defweak)
8599 && sym_hash->root.u.def.section == sec)
8600 {
8601 if (sym_hash->root.u.def.value <= sec->size)
8602 {
8603 bfd_vma ahead;
8604 bfd_vma orig_addr = sym_hash->root.u.def.value;
8605
8606 ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1);
8607 sym_hash->root.u.def.value -= ahead;
8608
8609 /* Adjust function size. */
8610 if (sym_hash->type == STT_FUNC)
8611 sym_hash->size -=
8612 get_nds32_elf_blank_total
8613 (&blank_t, orig_addr + sym_hash->size, 0) - ahead;
8614
8615 }
8616 }
8617 }
8618
8619 contents = elf_section_data (sec)->this_hdr.contents;
8620 blank_t = blank_head;
8621 while (blank_t->next)
8622 {
8623 /* Actually delete the bytes. */
8624
8625 /* If current blank is the last blank overlap with current section,
8626 go to finish process. */
8627 if (sec->size <= (blank_t->next->offset))
8628 break;
8629
8630 memmove (contents + blank_t->offset - blank_t->total_size,
8631 contents + blank_t->offset + blank_t->size,
8632 blank_t->next->offset - (blank_t->offset + blank_t->size));
8633
8634 blank_t = blank_t->next;
8635 }
8636
8637 if (sec->size > (blank_t->offset + blank_t->size))
8638 {
8639 /* There are remaining code between blank and section boundary.
8640 Move the remaining code to appropriate location. */
8641 memmove (contents + blank_t->offset - blank_t->total_size,
8642 contents + blank_t->offset + blank_t->size,
8643 sec->size - (blank_t->offset + blank_t->size));
8644 sec->size -= blank_t->total_size + blank_t->size;
8645 }
8646 else
8647 /* This blank is not entirely included in the section,
8648 reduce the section size by only part of the blank size. */
8649 sec->size -= blank_t->total_size + (sec->size - blank_t->offset);
8650
8651 while (blank_head)
8652 {
8653 blank_t = blank_head;
8654 blank_head = blank_head->next;
8655 remove_nds32_elf_blank (blank_t);
8656 }
8657
8658 return TRUE;
8659 }
8660
8661 /* Get the contents of a section. */
8662
8663 static int
8664 nds32_get_section_contents (bfd *abfd, asection *sec,
8665 bfd_byte **contents_p, bfd_boolean cache)
8666 {
8667 /* Get the section contents. */
8668 if (elf_section_data (sec)->this_hdr.contents != NULL)
8669 *contents_p = elf_section_data (sec)->this_hdr.contents;
8670 else
8671 {
8672 if (!bfd_malloc_and_get_section (abfd, sec, contents_p))
8673 return FALSE;
8674 if (cache)
8675 elf_section_data (sec)->this_hdr.contents = *contents_p;
8676 }
8677
8678 return TRUE;
8679 }
8680
8681 /* Get the contents of the internal symbol of abfd. */
8682
8683 static int
8684 nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED,
8685 Elf_Internal_Sym **isymbuf_p)
8686 {
8687 Elf_Internal_Shdr *symtab_hdr;
8688 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8689
8690 /* Read this BFD's local symbols if we haven't done so already. */
8691 if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0)
8692 {
8693 *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents;
8694 if (*isymbuf_p == NULL)
8695 {
8696 *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8697 symtab_hdr->sh_info, 0,
8698 NULL, NULL, NULL);
8699 if (*isymbuf_p == NULL)
8700 return FALSE;
8701 }
8702 }
8703 symtab_hdr->contents = (bfd_byte *) (*isymbuf_p);
8704
8705 return TRUE;
8706 }
8707
8708 /* Range of small data. */
8709 static bfd_vma sdata_range[2][2];
8710 static bfd_vma const sdata_init_range[2] =
8711 { ACCURATE_12BIT_S1, ACCURATE_19BIT };
8712
8713 static int
8714 nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
8715 bfd_byte *contents, bfd_vma addr)
8716 {
8717 unsigned long insn = bfd_getb32 (contents + addr);
8718
8719 if (insn & 0x80000000)
8720 return 2;
8721
8722 return 4;
8723 }
8724
8725 /* Set the gp relax range. We have to measure the safe range
8726 to do gp relaxation. */
8727
8728 static void
8729 relax_range_measurement (bfd *abfd)
8730 {
8731 asection *sec_f, *sec_b;
8732 /* For upper bound. */
8733 bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
8734 bfd_vma align;
8735 static int decide_relax_range = 0;
8736 int i;
8737 int range_number = sizeof (sdata_init_range) / sizeof (sdata_init_range[0]);
8738
8739 if (decide_relax_range)
8740 return;
8741 decide_relax_range = 1;
8742
8743 if (sda_rela_sec == NULL)
8744 {
8745 /* Since there is no data sections, we assume the range is page size. */
8746 for (i = 0; i < range_number; i++)
8747 {
8748 sdata_range[i][0] = sdata_init_range[i] - 0x1000;
8749 sdata_range[i][1] = sdata_init_range[i] - 0x1000;
8750 }
8751 return;
8752 }
8753
8754 /* Get the biggest alignment power after the gp located section. */
8755 sec_f = sda_rela_sec->output_section;
8756 sec_b = sec_f->next;
8757 align = 0;
8758 while (sec_b != NULL)
8759 {
8760 if ((unsigned)(1 << sec_b->alignment_power) > align)
8761 align = (1 << sec_b->alignment_power);
8762 sec_b = sec_b->next;
8763 }
8764
8765 /* I guess we can not determine the section before
8766 gp located section, so we assume the align is max page size. */
8767 for (i = 0; i < range_number; i++)
8768 {
8769 sdata_range[i][1] = sdata_init_range[i] - align;
8770 BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]);
8771 sdata_range[i][0] = sdata_init_range[i] - maxpgsz;
8772 BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]);
8773 }
8774 }
8775
8776 /* These are macros used to check flags encoded in r_addend.
8777 They are only used by nds32_elf_relax_section (). */
8778 #define GET_SEQ_LEN(addend) ((addend) & 0x000000ff)
8779 #define IS_1ST_CONVERT(addend) ((addend) & 0x80000000)
8780 #define IS_OPTIMIZE(addend) ((addend) & 0x40000000)
8781 #define IS_16BIT_ON(addend) ((addend) & 0x20000000)
8782
8783 static const char * unrecognized_reloc_msg =
8784 /* xgettext:c-format */
8785 N_("%B: warning: %s points to unrecognized reloc at %#Lx");
8786
8787 /* Relax LONGCALL1 relocation for nds32_elf_relax_section. */
8788
8789 static bfd_boolean
8790 nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
8791 Elf_Internal_Rela *internal_relocs, int *insn_len,
8792 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
8793 Elf_Internal_Shdr *symtab_hdr)
8794 {
8795 /* There are 3 variations for LONGCALL1
8796 case 4-4-2; 16-bit on, optimize off or optimize for space
8797 sethi ta, hi20(symbol) ; LONGCALL1/HI20
8798 ori ta, ta, lo12(symbol) ; LO12S0
8799 jral5 ta ;
8800
8801 case 4-4-4; 16-bit off, optimize don't care
8802 sethi ta, hi20(symbol) ; LONGCALL1/HI20
8803 ori ta, ta, lo12(symbol) ; LO12S0
8804 jral ta ;
8805
8806 case 4-4-4; 16-bit on, optimize for speed
8807 sethi ta, hi20(symbol) ; LONGCALL1/HI20
8808 ori ta, ta, lo12(symbol) ; LO12S0
8809 jral ta ;
8810 Check code for -mlong-calls output. */
8811
8812 /* Get the reloc for the address from which the register is
8813 being loaded. This reloc will tell us which function is
8814 actually being called. */
8815
8816 bfd_vma laddr;
8817 int seq_len; /* Original length of instruction sequence. */
8818 uint32_t insn;
8819 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
8820 int pic_ext_target = 0;
8821 bfd_signed_vma foff;
8822 uint16_t insn16;
8823
8824 irelend = internal_relocs + sec->reloc_count;
8825 seq_len = GET_SEQ_LEN (irel->r_addend);
8826 laddr = irel->r_offset;
8827 *insn_len = seq_len;
8828
8829 hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
8830 R_NDS32_HI20_RELA, laddr);
8831 lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
8832 R_NDS32_LO12S0_ORI_RELA,
8833 laddr + 4);
8834
8835 if (hi_irelfn == irelend || lo_irelfn == irelend)
8836 {
8837 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL1",
8838 irel->r_offset);
8839 return FALSE;
8840 }
8841
8842 /* Get the value of the symbol referred to by the reloc. */
8843 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
8844 &pic_ext_target);
8845
8846 /* This condition only happened when symbol is undefined. */
8847 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
8848 || foff >= CONSERVATIVE_24BIT_S1)
8849 return FALSE;
8850
8851 /* Relax to: jal symbol; 25_PCREL */
8852 /* For simplicity of coding, we are going to modify the section
8853 contents, the section relocs, and the BFD symbol table. We
8854 must tell the rest of the code not to free up this
8855 information. It would be possible to instead create a table
8856 of changes which have to be made, as is done in coff-mips.c;
8857 that would be more work, but would require less memory when
8858 the linker is run. */
8859
8860 /* Replace the long call with a jal. */
8861 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
8862 R_NDS32_25_PCREL_RELA);
8863 irel->r_addend = hi_irelfn->r_addend;
8864
8865 /* We don't resolve this here but resolve it in relocate_section. */
8866 insn = INSN_JAL;
8867 bfd_putb32 (insn, contents + irel->r_offset);
8868
8869 hi_irelfn->r_info =
8870 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
8871 lo_irelfn->r_info =
8872 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
8873 *insn_len = 4;
8874
8875 if (seq_len & 0x2)
8876 {
8877 insn16 = NDS32_NOP16;
8878 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
8879 lo_irelfn->r_info =
8880 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
8881 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
8882 *insn_len += 2;
8883 }
8884 return TRUE;
8885 }
8886
8887 #define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
8888 /* Relax LONGCALL2 relocation for nds32_elf_relax_section. */
8889
8890 static bfd_boolean
8891 nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
8892 Elf_Internal_Rela *internal_relocs, int *insn_len,
8893 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
8894 Elf_Internal_Shdr *symtab_hdr)
8895 {
8896 /* bltz rt, .L1 ; LONGCALL2
8897 jal symbol ; 25_PCREL
8898 .L1: */
8899
8900 /* Get the reloc for the address from which the register is
8901 being loaded. This reloc will tell us which function is
8902 actually being called. */
8903
8904 bfd_vma laddr;
8905 uint32_t insn;
8906 Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend;
8907 int pic_ext_target = 0;
8908 bfd_signed_vma foff;
8909
8910 irelend = internal_relocs + sec->reloc_count;
8911 laddr = irel->r_offset;
8912 i1_irelfn =
8913 find_relocs_at_address_addr (irel, internal_relocs, irelend,
8914 R_NDS32_25_PCREL_RELA, laddr + 4);
8915
8916 if (i1_irelfn == irelend)
8917 {
8918 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL2",
8919 irel->r_offset);
8920 return FALSE;
8921 }
8922
8923 insn = bfd_getb32 (contents + laddr);
8924
8925 /* Get the value of the symbol referred to by the reloc. */
8926 foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr,
8927 &pic_ext_target);
8928
8929 if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
8930 || foff >= CONSERVATIVE_16BIT_S1)
8931 return FALSE;
8932
8933 /* Relax to bgezal rt, label ; 17_PCREL
8934 or bltzal rt, label ; 17_PCREL */
8935
8936 /* Convert to complimentary conditional call. */
8937 insn = CONVERT_CONDITION_CALL (insn);
8938
8939 /* For simplicity of coding, we are going to modify the section
8940 contents, the section relocs, and the BFD symbol table. We
8941 must tell the rest of the code not to free up this
8942 information. It would be possible to instead create a table
8943 of changes which have to be made, as is done in coff-mips.c;
8944 that would be more work, but would require less memory when
8945 the linker is run. */
8946
8947 /* Clean unnessary relocations. */
8948 i1_irelfn->r_info =
8949 ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE);
8950 cond_irelfn =
8951 find_relocs_at_address_addr (irel, internal_relocs, irelend,
8952 R_NDS32_17_PCREL_RELA, laddr);
8953 if (cond_irelfn != irelend)
8954 cond_irelfn->r_info =
8955 ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE);
8956
8957 /* Replace the long call with a bgezal. */
8958 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info),
8959 R_NDS32_17_PCREL_RELA);
8960 irel->r_addend = i1_irelfn->r_addend;
8961
8962 bfd_putb32 (insn, contents + irel->r_offset);
8963
8964 *insn_len = 4;
8965 return TRUE;
8966 }
8967
8968 /* Relax LONGCALL3 relocation for nds32_elf_relax_section. */
8969
8970 static bfd_boolean
8971 nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
8972 Elf_Internal_Rela *internal_relocs, int *insn_len,
8973 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
8974 Elf_Internal_Shdr *symtab_hdr)
8975 {
8976 /* There are 3 variations for LONGCALL3
8977 case 4-4-4-2; 16-bit on, optimize off or optimize for space
8978 bltz rt, $1 ; LONGCALL3
8979 sethi ta, hi20(symbol) ; HI20
8980 ori ta, ta, lo12(symbol) ; LO12S0
8981 jral5 ta ;
8982 $1
8983
8984 case 4-4-4-4; 16-bit off, optimize don't care
8985 bltz rt, $1 ; LONGCALL3
8986 sethi ta, hi20(symbol) ; HI20
8987 ori ta, ta, lo12(symbol) ; LO12S0
8988 jral ta ;
8989 $1
8990
8991 case 4-4-4-4; 16-bit on, optimize for speed
8992 bltz rt, $1 ; LONGCALL3
8993 sethi ta, hi20(symbol) ; HI20
8994 ori ta, ta, lo12(symbol) ; LO12S0
8995 jral ta ;
8996 $1 */
8997
8998 /* Get the reloc for the address from which the register is
8999 being loaded. This reloc will tell us which function is
9000 actually being called. */
9001
9002 bfd_vma laddr;
9003 int seq_len; /* Original length of instruction sequence. */
9004 uint32_t insn;
9005 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9006 int pic_ext_target = 0;
9007 bfd_signed_vma foff;
9008 uint16_t insn16;
9009
9010 irelend = internal_relocs + sec->reloc_count;
9011 seq_len = GET_SEQ_LEN (irel->r_addend);
9012 laddr = irel->r_offset;
9013 *insn_len = seq_len;
9014
9015 hi_irelfn =
9016 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9017 R_NDS32_HI20_RELA, laddr + 4);
9018 lo_irelfn =
9019 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9020 R_NDS32_LO12S0_ORI_RELA, laddr + 8);
9021
9022 if (hi_irelfn == irelend || lo_irelfn == irelend)
9023 {
9024 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL3",
9025 irel->r_offset);
9026 return FALSE;
9027 }
9028
9029 /* Get the value of the symbol referred to by the reloc. */
9030 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9031 &pic_ext_target);
9032
9033 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9034 || foff >= CONSERVATIVE_24BIT_S1)
9035 return FALSE;
9036
9037 insn = bfd_getb32 (contents + laddr);
9038 if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
9039 {
9040 /* Relax to bgezal rt, label ; 17_PCREL
9041 or bltzal rt, label ; 17_PCREL */
9042
9043 /* Convert to complimentary conditional call. */
9044 insn = CONVERT_CONDITION_CALL (insn);
9045 bfd_putb32 (insn, contents + irel->r_offset);
9046
9047 *insn_len = 4;
9048 irel->r_info =
9049 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9050 hi_irelfn->r_info =
9051 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9052 lo_irelfn->r_info =
9053 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9054
9055 cond_irelfn =
9056 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9057 R_NDS32_17_PCREL_RELA, laddr);
9058 if (cond_irelfn != irelend)
9059 {
9060 cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9061 R_NDS32_17_PCREL_RELA);
9062 cond_irelfn->r_addend = hi_irelfn->r_addend;
9063 }
9064
9065 if (seq_len & 0x2)
9066 {
9067 insn16 = NDS32_NOP16;
9068 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9069 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9070 R_NDS32_INSN16);
9071 hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9072 insn_len += 2;
9073 }
9074 }
9075 else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
9076 {
9077 /* Relax to the following instruction sequence
9078 bltz rt, $1 ; LONGCALL2
9079 jal symbol ; 25_PCREL
9080 $1 */
9081 *insn_len = 8;
9082 insn = INSN_JAL;
9083 bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9084
9085 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9086 R_NDS32_25_PCREL_RELA);
9087 irel->r_info =
9088 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2);
9089
9090 lo_irelfn->r_info =
9091 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9092
9093 if (seq_len & 0x2)
9094 {
9095 insn16 = NDS32_NOP16;
9096 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9097 lo_irelfn->r_info =
9098 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9099 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9100 insn_len += 2;
9101 }
9102 }
9103 return TRUE;
9104 }
9105
9106 /* Relax LONGJUMP1 relocation for nds32_elf_relax_section. */
9107
9108 static bfd_boolean
9109 nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9110 Elf_Internal_Rela *internal_relocs, int *insn_len,
9111 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9112 Elf_Internal_Shdr *symtab_hdr)
9113 {
9114 /* There are 3 variations for LONGJUMP1
9115 case 4-4-2; 16-bit bit on, optimize off or optimize for space
9116 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9117 ori ta, ta, lo12(symbol) ; LO12S0
9118 jr5 ta ;
9119
9120 case 4-4-4; 16-bit off, optimize don't care
9121 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9122 ori ta, ta, lo12(symbol) ; LO12S0
9123 jr ta ;
9124
9125 case 4-4-4; 16-bit on, optimize for speed
9126 sethi ta, hi20(symbol) ; LONGJUMP1/HI20
9127 ori ta, ta, lo12(symbol) ; LO12S0
9128 jr ta ; */
9129
9130 /* Get the reloc for the address from which the register is
9131 being loaded. This reloc will tell us which function is
9132 actually being called. */
9133
9134 bfd_vma laddr;
9135 int seq_len; /* Original length of instruction sequence. */
9136 int insn16_on; /* 16-bit on/off. */
9137 uint32_t insn;
9138 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9139 int pic_ext_target = 0;
9140 bfd_signed_vma foff;
9141 uint16_t insn16;
9142 unsigned long reloc;
9143
9144 irelend = internal_relocs + sec->reloc_count;
9145 seq_len = GET_SEQ_LEN (irel->r_addend);
9146 laddr = irel->r_offset;
9147 *insn_len = seq_len;
9148 insn16_on = IS_16BIT_ON (irel->r_addend);
9149
9150 hi_irelfn =
9151 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9152 R_NDS32_HI20_RELA, laddr);
9153 lo_irelfn =
9154 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9155 R_NDS32_LO12S0_ORI_RELA, laddr + 4);
9156 if (hi_irelfn == irelend || lo_irelfn == irelend)
9157 {
9158 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP1",
9159 irel->r_offset);
9160 return FALSE;
9161 }
9162
9163 /* Get the value of the symbol referred to by the reloc. */
9164 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9165 &pic_ext_target);
9166
9167 if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
9168 || foff < -CONSERVATIVE_24BIT_S1)
9169 return FALSE;
9170
9171 if (insn16_on && foff >= -ACCURATE_8BIT_S1
9172 && foff < ACCURATE_8BIT_S1 && (seq_len & 0x2))
9173 {
9174 /* j8 label */
9175 /* 16-bit on, but not optimized for speed. */
9176 reloc = R_NDS32_9_PCREL_RELA;
9177 insn16 = INSN_J8;
9178 bfd_putb16 (insn16, contents + irel->r_offset);
9179 *insn_len = 2;
9180 irel->r_info =
9181 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9182 }
9183 else
9184 {
9185 /* j label */
9186 reloc = R_NDS32_25_PCREL_RELA;
9187 insn = INSN_J;
9188 bfd_putb32 (insn, contents + irel->r_offset);
9189 *insn_len = 4;
9190 irel->r_info =
9191 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16);
9192 irel->r_addend = 0;
9193 }
9194
9195 hi_irelfn->r_info =
9196 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9197 lo_irelfn->r_info =
9198 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9199
9200 if ((seq_len & 0x2) && ((*insn_len & 2) == 0))
9201 {
9202 insn16 = NDS32_NOP16;
9203 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9204 lo_irelfn->r_info =
9205 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9206 R_NDS32_INSN16);
9207 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9208 *insn_len += 2;
9209 }
9210 return TRUE;
9211 }
9212
9213 /* Revert condition branch. This function does not check if the input
9214 instruction is condition branch or not. */
9215
9216 static void
9217 nds32_elf_convert_branch (uint16_t insn16, uint32_t insn,
9218 uint16_t *re_insn16, uint32_t *re_insn)
9219 {
9220 uint32_t comp_insn = 0;
9221 uint16_t comp_insn16 = 0;
9222
9223 if (insn)
9224 {
9225 if (N32_OP6 (insn) == N32_OP6_BR1)
9226 {
9227 /* beqs label. */
9228 comp_insn = (insn ^ 0x4000) & 0xffffc000;
9229 if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5)
9230 {
9231 /* Insn can be contracted to 16-bit implied r5. */
9232 comp_insn16 =
9233 (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38;
9234 comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9235 }
9236 }
9237 else if (N32_OP6 (insn) == N32_OP6_BR3)
9238 {
9239 /* bnec $ta, imm11, label. */
9240 comp_insn = (insn ^ 0x80000) & 0xffffff00;
9241 }
9242 else
9243 {
9244 comp_insn = (insn ^ 0x10000) & 0xffffc000;
9245 if (N32_BR2_SUB (insn) == N32_BR2_BEQZ
9246 || N32_BR2_SUB (insn) == N32_BR2_BNEZ)
9247 {
9248 if (N32_IS_RT3 (insn))
9249 {
9250 /* Insn can be contracted to 16-bit. */
9251 comp_insn16 =
9252 (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38;
9253 comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9254 }
9255 else if (N32_RT5 (insn) == REG_R15)
9256 {
9257 /* Insn can be contracted to 16-bit. */
9258 comp_insn16 =
9259 (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38;
9260 }
9261 }
9262 }
9263 }
9264 else
9265 {
9266 switch ((insn16 & 0xf000) >> 12)
9267 {
9268 case 0xc:
9269 /* beqz38 or bnez38 */
9270 comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9271 comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ;
9272 comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20;
9273 break;
9274
9275 case 0xd:
9276 /* beqs38 or bnes38 */
9277 comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9278 comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ;
9279 comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20)
9280 | (REG_R5 << 15);
9281 break;
9282
9283 case 0xe:
9284 /* beqzS8 or bnezS8 */
9285 comp_insn16 = (insn16 ^ 0x0100) & 0xff00;
9286 comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ;
9287 comp_insn |= REG_R15 << 20;
9288 break;
9289
9290 default:
9291 break;
9292 }
9293 }
9294 if (comp_insn && re_insn)
9295 *re_insn = comp_insn;
9296 if (comp_insn16 && re_insn16)
9297 *re_insn16 = comp_insn16;
9298 }
9299
9300 /* Relax LONGJUMP2 relocation for nds32_elf_relax_section. */
9301
9302 static bfd_boolean
9303 nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9304 Elf_Internal_Rela *internal_relocs, int *insn_len,
9305 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9306 Elf_Internal_Shdr *symtab_hdr)
9307 {
9308 /* There are 3 variations for LONGJUMP2
9309 case 2-4; 1st insn convertible, 16-bit on,
9310 optimize off or optimize for space
9311 bnes38 rt, ra, $1 ; LONGJUMP2
9312 j label ; 25_PCREL
9313 $1:
9314
9315 case 4-4; 1st insn not convertible
9316 bne rt, ra, $1 ; LONGJUMP2
9317 j label ; 25_PCREL
9318 $1:
9319
9320 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9321 bne rt, ra, $1 ; LONGJUMP2
9322 j label ; 25_PCREL
9323 $1: */
9324
9325 /* Get the reloc for the address from which the register is
9326 being loaded. This reloc will tell us which function is
9327 actually being called. */
9328
9329 bfd_vma laddr;
9330 int seq_len; /* Original length of instruction sequence. */
9331 Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend;
9332 int pic_ext_target = 0, first_size;
9333 unsigned int i;
9334 bfd_signed_vma foff;
9335 uint32_t insn, re_insn = 0;
9336 uint16_t insn16, re_insn16 = 0;
9337 unsigned long reloc, cond_reloc;
9338
9339 enum elf_nds32_reloc_type checked_types[] =
9340 { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9341
9342 irelend = internal_relocs + sec->reloc_count;
9343 seq_len = GET_SEQ_LEN (irel->r_addend);
9344 laddr = irel->r_offset;
9345 *insn_len = seq_len;
9346 first_size = (seq_len == 6) ? 2 : 4;
9347
9348 i2_irelfn =
9349 find_relocs_at_address_addr (irel, internal_relocs,
9350 irelend, R_NDS32_25_PCREL_RELA,
9351 laddr + first_size);
9352
9353 for (i = 0; i < sizeof (checked_types) / sizeof(checked_types[0]); i++)
9354 {
9355 cond_irelfn =
9356 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9357 checked_types[i], laddr);
9358 if (cond_irelfn != irelend)
9359 break;
9360 }
9361
9362 if (i2_irelfn == irelend || cond_irelfn == irelend)
9363 {
9364 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP2",
9365 irel->r_offset);
9366 return FALSE;
9367 }
9368
9369 /* Get the value of the symbol referred to by the reloc. */
9370 foff =
9371 calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr,
9372 &pic_ext_target);
9373 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9374 || foff >= CONSERVATIVE_16BIT_S1)
9375 return FALSE;
9376
9377 /* Get the all corresponding instructions. */
9378 if (first_size == 4)
9379 {
9380 insn = bfd_getb32 (contents + laddr);
9381 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9382 }
9383 else
9384 {
9385 insn16 = bfd_getb16 (contents + laddr);
9386 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9387 }
9388
9389 if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size)
9390 && foff < ACCURATE_8BIT_S1 - first_size)
9391 {
9392 if (first_size == 4)
9393 {
9394 /* Don't convert it to 16-bit now, keep this as relaxable for
9395 ``label reloc; INSN16''. */
9396
9397 /* Save comp_insn32 to buffer. */
9398 bfd_putb32 (re_insn, contents + irel->r_offset);
9399 *insn_len = 4;
9400 reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9401 R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9402 cond_reloc = R_NDS32_INSN16;
9403 }
9404 else
9405 {
9406 bfd_putb16 (re_insn16, contents + irel->r_offset);
9407 *insn_len = 2;
9408 reloc = R_NDS32_9_PCREL_RELA;
9409 cond_reloc = R_NDS32_NONE;
9410 }
9411 }
9412 else if (N32_OP6 (re_insn) == N32_OP6_BR1
9413 && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9414 && foff < ACCURATE_14BIT_S1 - first_size))
9415 {
9416 /* beqs label ; 15_PCREL */
9417 bfd_putb32 (re_insn, contents + irel->r_offset);
9418 *insn_len = 4;
9419 reloc = R_NDS32_15_PCREL_RELA;
9420 cond_reloc = R_NDS32_NONE;
9421 }
9422 else if (N32_OP6 (re_insn) == N32_OP6_BR2
9423 && foff >= -CONSERVATIVE_16BIT_S1
9424 && foff < CONSERVATIVE_16BIT_S1)
9425 {
9426 /* beqz label ; 17_PCREL */
9427 bfd_putb32 (re_insn, contents + irel->r_offset);
9428 *insn_len = 4;
9429 reloc = R_NDS32_17_PCREL_RELA;
9430 cond_reloc = R_NDS32_NONE;
9431 }
9432 else
9433 return FALSE;
9434
9435 /* Set all relocations. */
9436 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc);
9437 irel->r_addend = i2_irelfn->r_addend;
9438
9439 cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9440 cond_reloc);
9441 cond_irelfn->r_addend = 0;
9442
9443 if ((seq_len ^ *insn_len ) & 0x2)
9444 {
9445 insn16 = NDS32_NOP16;
9446 bfd_putb16 (insn16, contents + irel->r_offset + 4);
9447 i2_irelfn->r_offset = 4;
9448 i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9449 R_NDS32_INSN16);
9450 i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9451 *insn_len += 2;
9452 }
9453 else
9454 i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9455 R_NDS32_NONE);
9456 return TRUE;
9457 }
9458
9459 /* Relax LONGJUMP3 relocation for nds32_elf_relax_section. */
9460
9461 static bfd_boolean
9462 nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9463 Elf_Internal_Rela *internal_relocs, int *insn_len,
9464 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9465 Elf_Internal_Shdr *symtab_hdr)
9466 {
9467 /* There are 5 variations for LONGJUMP3
9468 case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
9469 optimize off or optimize for space
9470 bnes38 rt, ra, $1 ; LONGJUMP3
9471 sethi ta, hi20(symbol) ; HI20
9472 ori ta, ta, lo12(symbol) ; LO12S0
9473 jr5 ta ;
9474 $1: ;
9475
9476 case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
9477 bnes38 rt, ra, $1 ; LONGJUMP3
9478 sethi ta, hi20(symbol) ; HI20
9479 ori ta, ta, lo12(symbol) ; LO12S0
9480 jr5 ta ;
9481 $1: ; LABEL
9482
9483 case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
9484 optimize off or optimize for space
9485 bne rt, ra, $1 ; LONGJUMP3
9486 sethi ta, hi20(symbol) ; HI20
9487 ori ta, ta, lo12(symbol) ; LO12S0
9488 jr5 ta ;
9489 $1: ;
9490
9491 case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
9492 16-bit off if no INSN16
9493 bne rt, ra, $1 ; LONGJUMP3
9494 sethi ta, hi20(symbol) ; HI20
9495 ori ta, ta, lo12(symbol) ; LO12S0
9496 jr ta ;
9497 $1: ;
9498
9499 case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
9500 16-bit off if no INSN16
9501 bne rt, ra, $1 ; LONGJUMP3
9502 sethi ta, hi20(symbol) ; HI20
9503 ori ta, ta, lo12(symbol) ; LO12S0
9504 jr ta ;
9505 $1: ; LABEL */
9506
9507 /* Get the reloc for the address from which the register is
9508 being loaded. This reloc will tell us which function is
9509 actually being called. */
9510 enum elf_nds32_reloc_type checked_types[] =
9511 { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9512
9513 int reloc_off = 0, cond_removed = 0, convertible;
9514 bfd_vma laddr;
9515 int seq_len; /* Original length of instruction sequence. */
9516 Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9517 int pic_ext_target = 0, first_size;
9518 unsigned int i;
9519 bfd_signed_vma foff;
9520 uint32_t insn, re_insn = 0;
9521 uint16_t insn16, re_insn16 = 0;
9522 unsigned long reloc, cond_reloc;
9523
9524 irelend = internal_relocs + sec->reloc_count;
9525 seq_len = GET_SEQ_LEN (irel->r_addend);
9526 laddr = irel->r_offset;
9527 *insn_len = seq_len;
9528
9529 convertible = IS_1ST_CONVERT (irel->r_addend);
9530
9531 if (convertible)
9532 first_size = 2;
9533 else
9534 first_size = 4;
9535
9536 /* Get all needed relocations. */
9537 hi_irelfn =
9538 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9539 R_NDS32_HI20_RELA, laddr + first_size);
9540 lo_irelfn =
9541 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9542 R_NDS32_LO12S0_ORI_RELA,
9543 laddr + first_size + 4);
9544
9545 for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
9546 {
9547 cond_irelfn =
9548 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9549 checked_types[i], laddr);
9550 if (cond_irelfn != irelend)
9551 break;
9552 }
9553
9554 if (hi_irelfn == irelend || lo_irelfn == irelend || cond_irelfn == irelend)
9555 {
9556 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP3",
9557 irel->r_offset);
9558 return FALSE;
9559 }
9560
9561 /* Get the value of the symbol referred to by the reloc. */
9562 foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9563 &pic_ext_target);
9564
9565 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9566 || foff >= CONSERVATIVE_24BIT_S1)
9567 return FALSE;
9568
9569 /* Get the all corresponding instructions. */
9570 if (first_size == 4)
9571 {
9572 insn = bfd_getb32 (contents + laddr);
9573 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9574 }
9575 else
9576 {
9577 insn16 = bfd_getb16 (contents + laddr);
9578 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9579 }
9580
9581 /* For simplicity of coding, we are going to modify the section
9582 contents, the section relocs, and the BFD symbol table. We
9583 must tell the rest of the code not to free up this
9584 information. It would be possible to instead create a table
9585 of changes which have to be made, as is done in coff-mips.c;
9586 that would be more work, but would require less memory when
9587 the linker is run. */
9588
9589 if (re_insn16 && foff >= -ACCURATE_8BIT_S1 - first_size
9590 && foff < ACCURATE_8BIT_S1 - first_size)
9591 {
9592 if (!(seq_len & 0x2))
9593 {
9594 /* Don't convert it to 16-bit now, keep this as relaxable
9595 for ``label reloc; INSN1a''6. */
9596 /* Save comp_insn32 to buffer. */
9597 bfd_putb32 (re_insn, contents + irel->r_offset);
9598 *insn_len = 4;
9599 reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9600 R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9601 cond_reloc = R_NDS32_INSN16;
9602 }
9603 else
9604 {
9605 /* Not optimize for speed; convert sequence to 16-bit. */
9606 /* Save comp_insn16 to buffer. */
9607 bfd_putb16 (re_insn16, contents + irel->r_offset);
9608 *insn_len = 2;
9609 reloc = R_NDS32_9_PCREL_RELA;
9610 cond_reloc = R_NDS32_NONE;
9611 }
9612 cond_removed = 1;
9613 }
9614 else if (N32_OP6 (re_insn) == N32_OP6_BR1
9615 && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9616 && foff < ACCURATE_14BIT_S1 - first_size))
9617 {
9618 /* beqs label ; 15_PCREL */
9619 bfd_putb32 (re_insn, contents + irel->r_offset);
9620 *insn_len = 4;
9621 reloc = R_NDS32_15_PCREL_RELA;
9622 cond_reloc = R_NDS32_NONE;
9623 cond_removed = 1;
9624 }
9625 else if (N32_OP6 (re_insn) == N32_OP6_BR2
9626 && foff >= -CONSERVATIVE_16BIT_S1
9627 && foff < CONSERVATIVE_16BIT_S1)
9628 {
9629 /* beqz label ; 17_PCREL */
9630 bfd_putb32 (re_insn, contents + irel->r_offset);
9631 *insn_len = 4;
9632 reloc = R_NDS32_17_PCREL_RELA;
9633 cond_reloc = R_NDS32_NONE;
9634 cond_removed = 1;
9635 }
9636 else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
9637 && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
9638 {
9639 /* Relax to one of the following 3 variations
9640
9641 case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
9642 for space
9643 bnes38 rt, $1 ; LONGJUMP2
9644 j label ; 25_PCREL
9645 $1
9646
9647 case 4-4; 1st insn not convertible, others don't care
9648 bne rt, ra, $1 ; LONGJUMP2
9649 j label ; 25_PCREL
9650 $1
9651
9652 case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9653 bne rt, ra, $1 ; LONGJUMP2
9654 j label ; 25_PCREL
9655 $1 */
9656
9657 /* Offset for first instruction. */
9658
9659 /* Use j label as second instruction. */
9660 *insn_len = 4 + first_size;
9661 insn = INSN_J;
9662 bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9663 reloc = R_NDS32_LONGJUMP2;
9664 cond_reloc = R_NDS32_25_PLTREL;
9665 }
9666 else
9667 return FALSE;
9668
9669 if (cond_removed == 1)
9670 {
9671 /* Set all relocations. */
9672 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9673 irel->r_addend = hi_irelfn->r_addend;
9674
9675 cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9676 cond_reloc);
9677 cond_irelfn->r_addend = 0;
9678 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9679 R_NDS32_NONE);
9680 }
9681 else
9682 {
9683 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
9684 irel->r_addend = irel->r_addend;
9685 hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9686 cond_reloc);
9687 }
9688
9689 if ((seq_len ^ *insn_len ) & 0x2)
9690 {
9691 insn16 = NDS32_NOP16;
9692 bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9693 lo_irelfn->r_offset = *insn_len;
9694 lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9695 R_NDS32_INSN16);
9696 lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9697 *insn_len += 2;
9698 }
9699 else
9700 lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9701 R_NDS32_NONE);
9702 return TRUE;
9703 }
9704
9705 /* Relax LONGCALL4 relocation for nds32_elf_relax_section. */
9706
9707 static bfd_boolean
9708 nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9709 Elf_Internal_Rela *internal_relocs, int *insn_len,
9710 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9711 Elf_Internal_Shdr *symtab_hdr)
9712 {
9713 /* The pattern for LONGCALL4. Support for function cse.
9714 sethi ta, hi20(symbol) ; LONGCALL4/HI20
9715 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
9716 jral ta ; PTR_RES/EMPTY/INSN16 */
9717
9718 bfd_vma laddr;
9719 uint32_t insn;
9720 Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel;
9721 Elf_Internal_Rela *irelend;
9722 int pic_ext_target = 0;
9723 bfd_signed_vma foff;
9724
9725 irelend = internal_relocs + sec->reloc_count;
9726 laddr = irel->r_offset;
9727
9728 /* Get the reloc for the address from which the register is
9729 being loaded. This reloc will tell us which function is
9730 actually being called. */
9731 hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9732 R_NDS32_HI20_RELA, laddr);
9733
9734 if (hi_irel == irelend)
9735 {
9736 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
9737 irel->r_offset);
9738 return FALSE;
9739 }
9740
9741 /* Get the value of the symbol referred to by the reloc. */
9742 foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
9743 &pic_ext_target);
9744
9745 /* This condition only happened when symbol is undefined. */
9746 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9747 || foff >= CONSERVATIVE_24BIT_S1)
9748 return FALSE;
9749
9750 /* Relax to: jal symbol; 25_PCREL */
9751 /* For simplicity of coding, we are going to modify the section
9752 contents, the section relocs, and the BFD symbol table. We
9753 must tell the rest of the code not to free up this
9754 information. It would be possible to instead create a table
9755 of changes which have to be made, as is done in coff-mips.c;
9756 that would be more work, but would require less memory when
9757 the linker is run. */
9758
9759 ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9760 R_NDS32_PTR_RESOLVED, irel->r_addend);
9761 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9762 R_NDS32_EMPTY, irel->r_addend);
9763
9764 if (ptr_irel == irelend || em_irel == irelend)
9765 {
9766 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
9767 irel->r_offset);
9768 return FALSE;
9769 }
9770 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
9771 insn = bfd_getb32 (contents + irel->r_addend);
9772 if (insn & 0x80000000)
9773 return FALSE;
9774
9775 /* Replace the long call with a jal. */
9776 em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
9777 R_NDS32_25_PCREL_RELA);
9778 ptr_irel->r_addend = 1;
9779
9780 /* We don't resolve this here but resolve it in relocate_section. */
9781 insn = INSN_JAL;
9782 bfd_putb32 (insn, contents + em_irel->r_offset);
9783
9784 irel->r_info =
9785 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9786
9787 /* If there is function cse, HI20 can not remove now. */
9788 call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9789 R_NDS32_LONGCALL4, laddr);
9790 if (call_irel == irelend)
9791 {
9792 *insn_len = 0;
9793 hi_irel->r_info =
9794 ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
9795 }
9796
9797 insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9798 R_NDS32_INSN16, irel->r_addend);
9799 if (insn_irel != irelend)
9800 insn_irel->r_info =
9801 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9802
9803 return TRUE;
9804 }
9805
9806 /* Relax LONGCALL5 relocation for nds32_elf_relax_section. */
9807
9808 static bfd_boolean
9809 nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9810 Elf_Internal_Rela *internal_relocs, int *insn_len,
9811 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9812 Elf_Internal_Shdr *symtab_hdr)
9813 {
9814 /* The pattern for LONGCALL5.
9815 bltz rt, .L1 ; LONGCALL5/17_PCREL
9816 jal symbol ; 25_PCREL
9817 .L1: */
9818
9819 bfd_vma laddr;
9820 uint32_t insn;
9821 Elf_Internal_Rela *cond_irel, *irelend;
9822 int pic_ext_target = 0;
9823 bfd_signed_vma foff;
9824
9825 irelend = internal_relocs + sec->reloc_count;
9826 laddr = irel->r_offset;
9827 insn = bfd_getb32 (contents + laddr);
9828
9829 /* Get the reloc for the address from which the register is
9830 being loaded. This reloc will tell us which function is
9831 actually being called. */
9832 cond_irel =
9833 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9834 R_NDS32_25_PCREL_RELA, irel->r_addend);
9835 if (cond_irel == irelend)
9836 {
9837 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL5",
9838 irel->r_offset);
9839 return FALSE;
9840 }
9841
9842 /* Get the value of the symbol referred to by the reloc. */
9843 foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
9844 &pic_ext_target);
9845
9846 if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9847 || foff >= CONSERVATIVE_16BIT_S1)
9848 return FALSE;
9849
9850 /* Relax to bgezal rt, label ; 17_PCREL
9851 or bltzal rt, label ; 17_PCREL */
9852
9853 /* Convert to complimentary conditional call. */
9854 insn = CONVERT_CONDITION_CALL (insn);
9855
9856 /* For simplicity of coding, we are going to modify the section
9857 contents, the section relocs, and the BFD symbol table. We
9858 must tell the rest of the code not to free up this
9859 information. It would be possible to instead create a table
9860 of changes which have to be made, as is done in coff-mips.c;
9861 that would be more work, but would require less memory when
9862 the linker is run. */
9863
9864 /* Modify relocation and contents. */
9865 cond_irel->r_info =
9866 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA);
9867
9868 /* Replace the long call with a bgezal. */
9869 bfd_putb32 (insn, contents + cond_irel->r_offset);
9870 *insn_len = 0;
9871
9872 /* Clean unnessary relocations. */
9873 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9874
9875 cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9876 R_NDS32_17_PCREL_RELA, laddr);
9877 cond_irel->r_info =
9878 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
9879
9880 return TRUE;
9881 }
9882
9883 /* Relax LONGCALL6 relocation for nds32_elf_relax_section. */
9884
9885 static bfd_boolean
9886 nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9887 Elf_Internal_Rela *internal_relocs, int *insn_len,
9888 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9889 Elf_Internal_Shdr *symtab_hdr)
9890 {
9891 /* The pattern for LONGCALL6.
9892 bltz rt, .L1 ; LONGCALL6/17_PCREL
9893 sethi ta, hi20(symbol) ; HI20/PTR
9894 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
9895 jral ta ; PTR_RES/EMPTY/INSN16
9896 .L1 */
9897
9898 bfd_vma laddr;
9899 uint32_t insn;
9900 Elf_Internal_Rela *em_irel, *cond_irel, *irelend;
9901 int pic_ext_target = 0;
9902 bfd_signed_vma foff;
9903
9904 irelend = internal_relocs + sec->reloc_count;
9905 laddr = irel->r_offset;
9906
9907 /* Get the reloc for the address from which the register is
9908 being loaded. This reloc will tell us which function is
9909 actually being called. */
9910 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9911 R_NDS32_EMPTY, irel->r_addend);
9912
9913 if (em_irel == irelend)
9914 {
9915 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL6",
9916 irel->r_offset);
9917 return FALSE;
9918 }
9919
9920 /* Get the value of the symbol referred to by the reloc. */
9921 foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr,
9922 &pic_ext_target);
9923
9924 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9925 || foff >= CONSERVATIVE_24BIT_S1)
9926 return FALSE;
9927
9928 /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
9929 insn = bfd_getb32 (contents + irel->r_addend);
9930 if (insn & 0x80000000)
9931 return FALSE;
9932
9933 insn = bfd_getb32 (contents + laddr);
9934 if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
9935 {
9936 /* Relax to bgezal rt, label ; 17_PCREL
9937 or bltzal rt, label ; 17_PCREL */
9938
9939 /* Convert to complimentary conditional call. */
9940 *insn_len = 0;
9941 insn = CONVERT_CONDITION_CALL (insn);
9942 bfd_putb32 (insn, contents + em_irel->r_offset);
9943
9944 em_irel->r_info =
9945 ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA);
9946
9947 /* Set resolved relocation. */
9948 cond_irel =
9949 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9950 R_NDS32_PTR_RESOLVED, irel->r_addend);
9951 if (cond_irel == irelend)
9952 {
9953 _bfd_error_handler (unrecognized_reloc_msg, abfd,
9954 "R_NDS32_LONGCALL6", irel->r_offset);
9955 return FALSE;
9956 }
9957 cond_irel->r_addend = 1;
9958
9959 /* Clear relocations. */
9960
9961 irel->r_info =
9962 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9963
9964 cond_irel =
9965 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9966 R_NDS32_17_PCREL_RELA, laddr);
9967 if (cond_irel != irelend)
9968 cond_irel->r_info =
9969 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
9970
9971 cond_irel =
9972 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9973 R_NDS32_INSN16, irel->r_addend);
9974 if (cond_irel != irelend)
9975 cond_irel->r_info =
9976 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
9977
9978 }
9979 else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
9980 {
9981 /* Relax to the following instruction sequence
9982 bltz rt, .L1 ; LONGCALL2/17_PCREL
9983 jal symbol ; 25_PCREL/PTR_RES
9984 .L1 */
9985 *insn_len = 4;
9986 /* Convert instruction. */
9987 insn = INSN_JAL;
9988 bfd_putb32 (insn, contents + em_irel->r_offset);
9989
9990 /* Convert relocations. */
9991 em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
9992 R_NDS32_25_PCREL_RELA);
9993 irel->r_info =
9994 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5);
9995
9996 /* Set resolved relocation. */
9997 cond_irel =
9998 find_relocs_at_address_addr (irel, internal_relocs, irelend,
9999 R_NDS32_PTR_RESOLVED, irel->r_addend);
10000 if (cond_irel == irelend)
10001 {
10002 _bfd_error_handler (unrecognized_reloc_msg, abfd,
10003 "R_NDS32_LONGCALL6", irel->r_offset);
10004 return FALSE;
10005 }
10006 cond_irel->r_addend = 1;
10007
10008 cond_irel =
10009 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10010 R_NDS32_INSN16, irel->r_addend);
10011 if (cond_irel != irelend)
10012 cond_irel->r_info =
10013 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10014 }
10015 return TRUE;
10016 }
10017
10018 /* Relax LONGJUMP4 relocation for nds32_elf_relax_section. */
10019
10020 static bfd_boolean
10021 nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10022 Elf_Internal_Rela *internal_relocs, int *insn_len,
10023 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10024 Elf_Internal_Shdr *symtab_hdr)
10025 {
10026 /* The pattern for LONGJUMP4.
10027 sethi ta, hi20(symbol) ; LONGJUMP4/HI20
10028 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10029 jr ta ; PTR_RES/INSN16/EMPTY */
10030
10031 bfd_vma laddr;
10032 int seq_len; /* Original length of instruction sequence. */
10033 uint32_t insn;
10034 Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend;
10035 int pic_ext_target = 0;
10036 bfd_signed_vma foff;
10037
10038 irelend = internal_relocs + sec->reloc_count;
10039 seq_len = GET_SEQ_LEN (irel->r_addend);
10040 laddr = irel->r_offset;
10041 *insn_len = seq_len;
10042
10043 /* Get the reloc for the address from which the register is
10044 being loaded. This reloc will tell us which function is
10045 actually being called. */
10046
10047 hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10048 R_NDS32_HI20_RELA, laddr);
10049
10050 if (hi_irel == irelend)
10051 {
10052 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
10053 irel->r_offset);
10054 return FALSE;
10055 }
10056
10057 /* Get the value of the symbol referred to by the reloc. */
10058 foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
10059 &pic_ext_target);
10060
10061 if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
10062 || foff < -CONSERVATIVE_24BIT_S1)
10063 return FALSE;
10064
10065 /* Convert it to "j label", it may be converted to j8 in the final
10066 pass of relaxation. Therefore, we do not consider this currently. */
10067 ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10068 R_NDS32_PTR_RESOLVED, irel->r_addend);
10069 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10070 R_NDS32_EMPTY, irel->r_addend);
10071
10072 if (ptr_irel == irelend || em_irel == irelend)
10073 {
10074 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
10075 irel->r_offset);
10076 return FALSE;
10077 }
10078
10079 em_irel->r_info =
10080 ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA);
10081 ptr_irel->r_addend = 1;
10082
10083 /* Write instruction. */
10084 insn = INSN_J;
10085 bfd_putb32 (insn, contents + em_irel->r_offset);
10086
10087 /* Clear relocations. */
10088 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10089
10090 /* If there is function cse, HI20 can not remove now. */
10091 call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10092 R_NDS32_LONGJUMP4, laddr);
10093 if (call_irel == irelend)
10094 {
10095 *insn_len = 0;
10096 hi_irel->r_info =
10097 ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10098 }
10099
10100 return TRUE;
10101 }
10102
10103 /* Relax LONGJUMP5 relocation for nds32_elf_relax_section. */
10104
10105 static bfd_boolean
10106 nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10107 Elf_Internal_Rela *internal_relocs, int *insn_len,
10108 int *seq_len, bfd_byte *contents,
10109 Elf_Internal_Sym *isymbuf,
10110 Elf_Internal_Shdr *symtab_hdr)
10111 {
10112 /* There are 2 variations for LONGJUMP5
10113 case 2-4; 1st insn convertible, 16-bit on.
10114 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
10115 j label ; 25_PCREL/INSN16
10116 $1:
10117
10118 case 4-4; 1st insn not convertible
10119 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
10120 j label ; 25_PCREL/INSN16
10121 .L1: */
10122
10123 bfd_vma laddr;
10124 Elf_Internal_Rela *cond_irel, *irelend;
10125 int pic_ext_target = 0;
10126 unsigned int i;
10127 bfd_signed_vma foff;
10128 uint32_t insn, re_insn = 0;
10129 uint16_t insn16, re_insn16 = 0;
10130 unsigned long reloc;
10131
10132 enum elf_nds32_reloc_type checked_types[] =
10133 { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10134 R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10135
10136 irelend = internal_relocs + sec->reloc_count;
10137 laddr = irel->r_offset;
10138
10139 /* Get the reloc for the address from which the register is
10140 being loaded. This reloc will tell us which function is
10141 actually being called. */
10142
10143 cond_irel =
10144 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10145 R_NDS32_25_PCREL_RELA, irel->r_addend);
10146 if (cond_irel == irelend)
10147 {
10148 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP5",
10149 irel->r_offset);
10150 return FALSE;
10151 }
10152
10153 /* Get the value of the symbol referred to by the reloc. */
10154 foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10155 &pic_ext_target);
10156
10157 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
10158 || foff >= CONSERVATIVE_16BIT_S1)
10159 return FALSE;
10160
10161 /* Get the all corresponding instructions. */
10162 insn = bfd_getb32 (contents + laddr);
10163 /* Check instruction size. */
10164 if (insn & 0x80000000)
10165 {
10166 *seq_len = 0;
10167 insn16 = insn >> 16;
10168 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10169 }
10170 else
10171 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10172
10173 if (N32_OP6 (re_insn) == N32_OP6_BR1
10174 && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10175 {
10176 /* beqs label ; 15_PCREL. */
10177 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10178 reloc = R_NDS32_15_PCREL_RELA;
10179 }
10180 else if (N32_OP6 (re_insn) == N32_OP6_BR2
10181 && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10182 {
10183 /* beqz label ; 17_PCREL. */
10184 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10185 reloc = R_NDS32_17_PCREL_RELA;
10186 }
10187 else if ( N32_OP6 (re_insn) == N32_OP6_BR3
10188 && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1)
10189 {
10190 /* beqc label ; 9_PCREL. */
10191 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10192 reloc = R_NDS32_WORD_9_PCREL_RELA;
10193 }
10194 else
10195 return FALSE;
10196
10197 /* Set all relocations. */
10198 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc);
10199
10200 /* Clean relocations. */
10201 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10202 for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10203 {
10204 cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10205 checked_types[i], laddr);
10206 if (cond_irel != irelend)
10207 {
10208 if (*seq_len == 0
10209 && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10210 {
10211 /* If the branch instruction is 2 byte, it cannot remove
10212 directly. Only convert it to nop16 and remove it after
10213 checking alignment issue. */
10214 insn16 = NDS32_NOP16;
10215 bfd_putb16 (insn16, contents + laddr);
10216 cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10217 }
10218 else
10219 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10220 R_NDS32_NONE);
10221 }
10222 }
10223 *insn_len = 0;
10224
10225 return TRUE;
10226 }
10227
10228 /* Relax LONGJUMP6 relocation for nds32_elf_relax_section. */
10229
10230 static bfd_boolean
10231 nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10232 Elf_Internal_Rela *internal_relocs, int *insn_len,
10233 int *seq_len, bfd_byte *contents,
10234 Elf_Internal_Sym *isymbuf,
10235 Elf_Internal_Shdr *symtab_hdr)
10236 {
10237 /* There are 5 variations for LONGJUMP6
10238 case : 2-4-4-4; 1st insn convertible, 16-bit on.
10239 bnes38 rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
10240 sethi ta, hi20(symbol) ; HI20/PTR
10241 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10242 jr ta ; PTR_RES/INSN16/EMPTY
10243 .L1:
10244
10245 case : 4-4-4-4; 1st insn not convertible, 16-bit on.
10246 bne rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
10247 sethi ta, hi20(symbol) ; HI20/PTR
10248 ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10249 jr ta ; PTR_RES/INSN16/EMPTY
10250 .L1: */
10251
10252 enum elf_nds32_reloc_type checked_types[] =
10253 { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10254 R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10255
10256 int reloc_off = 0, cond_removed = 0;
10257 bfd_vma laddr;
10258 Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel;
10259 int pic_ext_target = 0;
10260 unsigned int i;
10261 bfd_signed_vma foff;
10262 uint32_t insn, re_insn = 0;
10263 uint16_t insn16, re_insn16 = 0;
10264 unsigned long reloc;
10265
10266 irelend = internal_relocs + sec->reloc_count;
10267 laddr = irel->r_offset;
10268
10269 /* Get the reloc for the address from which the register is
10270 being loaded. This reloc will tell us which function is
10271 actually being called. */
10272 em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10273 R_NDS32_EMPTY, irel->r_addend);
10274
10275 if (em_irel == irelend)
10276 {
10277 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP6",
10278 irel->r_offset);
10279 return FALSE;
10280 }
10281
10282 /* Get the value of the symbol referred to by the reloc. */
10283 foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr,
10284 &pic_ext_target);
10285
10286 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10287 || foff >= CONSERVATIVE_24BIT_S1)
10288 return FALSE;
10289
10290 insn = bfd_getb32 (contents + laddr);
10291 /* Check instruction size. */
10292 if (insn & 0x80000000)
10293 {
10294 *seq_len = 0;
10295 insn16 = insn >> 16;
10296 nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10297 }
10298 else
10299 nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10300
10301 /* For simplicity of coding, we are going to modify the section
10302 contents, the section relocs, and the BFD symbol table. We
10303 must tell the rest of the code not to free up this
10304 information. It would be possible to instead create a table
10305 of changes which have to be made, as is done in coff-mips.c;
10306 that would be more work, but would require less memory when
10307 the linker is run. */
10308
10309 if (N32_OP6 (re_insn) == N32_OP6_BR1
10310 && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10311 {
10312 /* beqs label ; 15_PCREL */
10313 bfd_putb32 (re_insn, contents + em_irel->r_offset);
10314 reloc = R_NDS32_15_PCREL_RELA;
10315 cond_removed = 1;
10316 }
10317 else if (N32_OP6 (re_insn) == N32_OP6_BR2
10318 && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10319 {
10320 /* beqz label ; 17_PCREL */
10321 bfd_putb32 (re_insn, contents + em_irel->r_offset);
10322 reloc = R_NDS32_17_PCREL_RELA;
10323 cond_removed = 1;
10324 }
10325 else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
10326 && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
10327 {
10328 /* Relax to one of the following 2 variations
10329
10330 case 2-4; 1st insn convertible, 16-bit on.
10331 bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
10332 j label ; 25_PCREL/INSN16
10333 $1:
10334
10335 case 4-4; 1st insn not convertible
10336 bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
10337 j label ; 25_PCREL/INSN16
10338 .L1: */
10339
10340 /* Use j label as second instruction. */
10341 insn = INSN_J;
10342 reloc = R_NDS32_25_PCREL_RELA;
10343 bfd_putb32 (insn, contents + em_irel->r_offset);
10344 }
10345 else
10346 return FALSE;
10347
10348 /* Set all relocations. */
10349 em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc);
10350
10351 cond_irel =
10352 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10353 R_NDS32_PTR_RESOLVED, em_irel->r_offset);
10354 cond_irel->r_addend = 1;
10355
10356 /* Use INSN16 of first branch instruction to distinguish if keeping
10357 INSN16 of final instruction or not. */
10358 insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10359 R_NDS32_INSN16, irel->r_offset);
10360 if (insn_irel == irelend)
10361 {
10362 /* Clean the final INSN16. */
10363 insn_irel =
10364 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10365 R_NDS32_INSN16, em_irel->r_offset);
10366 insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10367 R_NDS32_NONE);
10368 }
10369
10370 if (cond_removed == 1)
10371 {
10372 *insn_len = 0;
10373
10374 /* Clear relocations. */
10375 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10376
10377 for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10378 {
10379 cond_irel =
10380 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10381 checked_types[i], laddr);
10382 if (cond_irel != irelend)
10383 {
10384 if (*seq_len == 0
10385 && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10386 {
10387 /* If the branch instruction is 2 byte, it cannot remove
10388 directly. Only convert it to nop16 and remove it after
10389 checking alignment issue. */
10390 insn16 = NDS32_NOP16;
10391 bfd_putb16 (insn16, contents + laddr);
10392 cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10393 }
10394 else
10395 cond_irel->r_info =
10396 ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10397 }
10398 }
10399 }
10400 else
10401 {
10402 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
10403 R_NDS32_LONGJUMP5);
10404 }
10405
10406 return TRUE;
10407 }
10408
10409 /* Relax LONGJUMP7 relocation for nds32_elf_relax_section. */
10410
10411 static bfd_boolean
10412 nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10413 Elf_Internal_Rela *internal_relocs, int *insn_len,
10414 int *seq_len, bfd_byte *contents,
10415 Elf_Internal_Sym *isymbuf,
10416 Elf_Internal_Shdr *symtab_hdr)
10417 {
10418 /* There are 2 variations for LONGJUMP5
10419 case 2-4; 1st insn convertible, 16-bit on.
10420 movi55 ta, imm11 ; LONGJUMP7/INSN16
10421 beq rt, ta, label ; 15_PCREL
10422
10423 case 4-4; 1st insn not convertible
10424 movi55 ta, imm11 ; LONGJUMP7/INSN16
10425 beq rt, ta, label ; 15_PCREL */
10426
10427 bfd_vma laddr;
10428 Elf_Internal_Rela *cond_irel, *irelend, *insn_irel;
10429 int pic_ext_target = 0;
10430 bfd_signed_vma foff;
10431 uint32_t insn, re_insn = 0;
10432 uint16_t insn16;
10433 uint32_t imm11;
10434
10435 irelend = internal_relocs + sec->reloc_count;
10436 laddr = irel->r_offset;
10437
10438 /* Get the reloc for the address from which the register is
10439 being loaded. This reloc will tell us which function is
10440 actually being called. */
10441
10442 cond_irel =
10443 find_relocs_at_address_addr (irel, internal_relocs, irelend,
10444 R_NDS32_15_PCREL_RELA, irel->r_addend);
10445 if (cond_irel == irelend)
10446 {
10447 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP7",
10448 irel->r_offset);
10449 return FALSE;
10450 }
10451
10452 /* Get the value of the symbol referred to by the reloc. */
10453 foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10454 &pic_ext_target);
10455
10456 if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_8BIT_S1
10457 || foff >= CONSERVATIVE_8BIT_S1)
10458 return FALSE;
10459
10460 /* Get the first instruction for its size. */
10461 insn = bfd_getb32 (contents + laddr);
10462 if (insn & 0x80000000)
10463 {
10464 *seq_len = 0;
10465 /* Get the immediate from movi55. */
10466 imm11 = N16_IMM5S (insn >> 16);
10467 }
10468 else
10469 {
10470 /* Get the immediate from movi. */
10471 imm11 = N32_IMM20S (insn);
10472 }
10473
10474 /* Get the branch instruction. */
10475 insn = bfd_getb32 (contents + irel->r_addend);
10476 /* Convert instruction to BR3. */
10477 if ((insn >> 14) & 0x1)
10478 re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0);
10479 else
10480 re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0);
10481
10482 bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10483
10484 /* Set all relocations. */
10485 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10486 R_NDS32_WORD_9_PCREL_RELA);
10487
10488 /* Clean relocations. */
10489 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10490 insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10491 R_NDS32_INSN16, irel->r_offset);
10492 if (insn_irel != irelend)
10493 {
10494 if (*seq_len == 0)
10495 {
10496 /* If the first insntruction is 16bit, convert it to nop16. */
10497 insn16 = NDS32_NOP16;
10498 bfd_putb16 (insn16, contents + laddr);
10499 insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10500 }
10501 else
10502 cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10503 R_NDS32_NONE);
10504 }
10505 *insn_len = 0;
10506
10507 return TRUE;
10508 }
10509
10510 #define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
10511
10512 /* Relax LOADSTORE relocation for nds32_elf_relax_section. */
10513
10514 static bfd_boolean
10515 nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
10516 asection *sec, Elf_Internal_Rela *irel,
10517 Elf_Internal_Rela *internal_relocs, int *insn_len,
10518 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10519 Elf_Internal_Shdr *symtab_hdr, int load_store_relax)
10520 {
10521 int eliminate_sethi = 0, range_type;
10522 unsigned int i;
10523 bfd_vma local_sda, laddr;
10524 int seq_len; /* Original length of instruction sequence. */
10525 uint32_t insn;
10526 Elf_Internal_Rela *hi_irelfn = NULL, *irelend;
10527 bfd_vma access_addr = 0;
10528 bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */
10529 enum elf_nds32_reloc_type checked_types[] =
10530 { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20,
10531 R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20,
10532 R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20,
10533 R_NDS32_TLS_LE_HI20
10534 };
10535
10536 irelend = internal_relocs + sec->reloc_count;
10537 seq_len = GET_SEQ_LEN (irel->r_addend);
10538 laddr = irel->r_offset;
10539 *insn_len = seq_len;
10540
10541 /* Get the high part relocation. */
10542 for (i = 0; i < ARRAY_SIZE (checked_types); i++)
10543 {
10544 hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10545 checked_types[i], laddr);
10546 if (hi_irelfn != irelend)
10547 break;
10548 }
10549
10550 if (hi_irelfn == irelend)
10551 {
10552 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LOADSTORE",
10553 irel->r_offset);
10554 return FALSE;
10555 }
10556
10557 range_type = GET_LOADSTORE_RANGE (irel->r_addend);
10558 nds32_elf_final_sda_base (sec->output_section->owner,
10559 link_info, &local_sda, FALSE);
10560
10561 switch (ELF32_R_TYPE (hi_irelfn->r_info))
10562 {
10563 case R_NDS32_HI20_RELA:
10564 insn = bfd_getb32 (contents + laddr);
10565 access_addr =
10566 calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10567
10568 if (range_type == NDS32_LOADSTORE_IMM)
10569 {
10570 struct elf_link_hash_entry *h = NULL;
10571 int indx;
10572
10573 if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info)
10574 {
10575 indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
10576 h = elf_sym_hashes (abfd)[indx];
10577 }
10578
10579 if ((access_addr < CONSERVATIVE_20BIT)
10580 && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10581 {
10582 eliminate_sethi = 1;
10583 break;
10584 }
10585
10586 /* This is avoid to relax symbol address which is fixed
10587 relocations. Ex: _stack. */
10588 if (h && bfd_is_abs_section (h->root.u.def.section))
10589 return FALSE;
10590 }
10591
10592 if (!load_store_relax)
10593 return FALSE;
10594
10595 /* Case for set gp register. */
10596 if (N32_RT5 (insn) == REG_GP)
10597 break;
10598
10599 if (range_type == NDS32_LOADSTORE_FLOAT_S
10600 || range_type == NDS32_LOADSTORE_FLOAT_S)
10601 {
10602 range_l = sdata_range[0][0];
10603 range_h = sdata_range[0][1];
10604 }
10605 else
10606 {
10607 range_l = sdata_range[1][0];
10608 range_h = sdata_range[1][1];
10609 }
10610 break;
10611
10612 case R_NDS32_GOT_HI20:
10613 access_addr =
10614 calculate_got_memory_address (abfd, link_info, hi_irelfn, symtab_hdr);
10615
10616 /* If this symbol is not in .got, the return value will be -1.
10617 Since the gp value is set to SDA_BASE but not GLOBAL_OFFSET_TABLE,
10618 a negative offset is allowed. */
10619 if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10620 && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10621 eliminate_sethi = 1;
10622 break;
10623
10624 case R_NDS32_PLT_GOTREL_HI20:
10625 access_addr = calculate_plt_memory_address (abfd, link_info, isymbuf,
10626 hi_irelfn, symtab_hdr);
10627
10628 if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10629 && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10630 eliminate_sethi = 1;
10631 break;
10632
10633 case R_NDS32_GOTOFF_HI20:
10634 access_addr =
10635 calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10636
10637 if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10638 && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10639 eliminate_sethi = 1;
10640 break;
10641
10642 case R_NDS32_GOTPC_HI20:
10643 /* The access_addr must consider r_addend of hi_irel. */
10644 access_addr = sec->output_section->vma + sec->output_offset
10645 + irel->r_offset + hi_irelfn->r_addend;
10646
10647 if ((bfd_signed_vma) (local_sda - access_addr) < CONSERVATIVE_20BIT
10648 && (bfd_signed_vma) (local_sda - access_addr) >= -CONSERVATIVE_20BIT)
10649 eliminate_sethi = 1;
10650 break;
10651
10652 case R_NDS32_TLS_LE_HI20:
10653 access_addr =
10654 calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10655 BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
10656 access_addr -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
10657 if ((range_type == NDS32_LOADSTORE_IMM)
10658 && (bfd_signed_vma) (access_addr) < CONSERVATIVE_20BIT
10659 && (bfd_signed_vma) (access_addr) >= -CONSERVATIVE_20BIT)
10660 eliminate_sethi = 1;
10661 break;
10662
10663 default:
10664 return FALSE;
10665 }
10666
10667 /* Delete sethi instruction. */
10668 if (eliminate_sethi == 1
10669 || (local_sda <= access_addr && (access_addr - local_sda) < range_h)
10670 || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
10671 {
10672 hi_irelfn->r_info =
10673 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
10674 irel->r_info =
10675 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10676 *insn_len = 0;
10677 }
10678 return TRUE;
10679 }
10680
10681 /* Relax LO12 relocation for nds32_elf_relax_section. */
10682
10683 static void
10684 nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
10685 asection *sec, Elf_Internal_Rela *irel,
10686 Elf_Internal_Rela *internal_relocs, bfd_byte *contents,
10687 Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
10688 {
10689 uint32_t insn;
10690 bfd_vma local_sda, laddr;
10691 unsigned long reloc;
10692 bfd_vma access_addr;
10693 bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */
10694 Elf_Internal_Rela *irelfn = NULL, *irelend;
10695 struct elf_link_hash_entry *h = NULL;
10696 int indx;
10697
10698 /* For SDA base relative relaxation. */
10699 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
10700 &local_sda, FALSE);
10701
10702 irelend = internal_relocs + sec->reloc_count;
10703 laddr = irel->r_offset;
10704 insn = bfd_getb32 (contents + laddr);
10705
10706 if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI)
10707 return;
10708
10709 access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
10710
10711 if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
10712 {
10713 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
10714 h = elf_sym_hashes (abfd)[indx];
10715 }
10716
10717 if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT
10718 && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10719 {
10720 reloc = R_NDS32_20_RELA;
10721 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10722 insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
10723 bfd_putb32 (insn, contents + laddr);
10724 }
10725 /* This is avoid to relax symbol address which is fixed
10726 relocations. Ex: _stack. */
10727 else if (N32_OP6 (insn) == N32_OP6_ORI
10728 && h && bfd_is_abs_section (h->root.u.def.section))
10729 return;
10730 else
10731 {
10732 range_l = sdata_range[1][0];
10733 range_h = sdata_range[1][1];
10734 switch (ELF32_R_TYPE (irel->r_info))
10735 {
10736 case R_NDS32_LO12S0_RELA:
10737 reloc = R_NDS32_SDA19S0_RELA;
10738 break;
10739 case R_NDS32_LO12S1_RELA:
10740 reloc = R_NDS32_SDA18S1_RELA;
10741 break;
10742 case R_NDS32_LO12S2_RELA:
10743 reloc = R_NDS32_SDA17S2_RELA;
10744 break;
10745 case R_NDS32_LO12S2_DP_RELA:
10746 range_l = sdata_range[0][0];
10747 range_h = sdata_range[0][1];
10748 reloc = R_NDS32_SDA12S2_DP_RELA;
10749 break;
10750 case R_NDS32_LO12S2_SP_RELA:
10751 range_l = sdata_range[0][0];
10752 range_h = sdata_range[0][1];
10753 reloc = R_NDS32_SDA12S2_SP_RELA;
10754 break;
10755 default:
10756 return;
10757 }
10758
10759 /* There are range_h and range_l because linker has to promise
10760 all sections move cross one page together. */
10761 if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
10762 || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
10763 {
10764 if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP)
10765 {
10766 /* Maybe we should add R_NDS32_INSN16 reloc type here
10767 or manually do some optimization. sethi can't be
10768 eliminated when updating $gp so the relative ori
10769 needs to be preserved. */
10770 return;
10771 }
10772 if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info),
10773 &insn))
10774 return;
10775 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10776 bfd_putb32 (insn, contents + laddr);
10777
10778 irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
10779 R_NDS32_INSN16);
10780 /* SDA17 must keep INSN16 for converting fp_as_gp. */
10781 if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA)
10782 irelfn->r_info =
10783 ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE);
10784
10785 }
10786 }
10787 return;
10788 }
10789
10790 /* Relax low part of PIC instruction pattern. */
10791
10792 static void
10793 nds32_elf_relax_piclo12 (struct bfd_link_info *link_info, bfd *abfd,
10794 asection *sec, Elf_Internal_Rela *irel,
10795 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10796 Elf_Internal_Shdr *symtab_hdr)
10797 {
10798 uint32_t insn;
10799 bfd_vma local_sda, laddr;
10800 bfd_signed_vma foff;
10801 unsigned long reloc;
10802
10803 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
10804 &local_sda, FALSE);
10805 laddr = irel->r_offset;
10806 insn = bfd_getb32 (contents + laddr);
10807
10808 if (N32_OP6 (insn) != N32_OP6_ORI)
10809 return;
10810
10811 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12)
10812 {
10813 foff = calculate_got_memory_address (abfd, link_info, irel,
10814 symtab_hdr) - local_sda;
10815 reloc = R_NDS32_GOT20;
10816 }
10817 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12)
10818 {
10819 foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
10820 symtab_hdr) - local_sda;
10821 reloc = R_NDS32_PLT_GOTREL_LO20;
10822 }
10823 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12)
10824 {
10825 foff = calculate_memory_address (abfd, irel, isymbuf,
10826 symtab_hdr) - local_sda;
10827 reloc = R_NDS32_GOTOFF;
10828 }
10829 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12)
10830 {
10831 foff = local_sda - sec->output_section->vma + sec->output_offset
10832 + irel->r_offset + irel->r_addend;
10833 reloc = R_NDS32_GOTPC20;
10834 }
10835 else
10836 return;
10837
10838 if ((foff < CONSERVATIVE_20BIT) && (foff >= -CONSERVATIVE_20BIT))
10839 {
10840 /* Turn into MOVI. */
10841 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10842 insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
10843 bfd_putb32 (insn, contents + laddr);
10844 }
10845 }
10846
10847 /* Relax low part of LE TLS instruction pattern. */
10848
10849 static void
10850 nds32_elf_relax_letlslo12 (struct bfd_link_info *link_info, bfd *abfd,
10851 Elf_Internal_Rela *irel,
10852 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10853 Elf_Internal_Shdr *symtab_hdr)
10854 {
10855 uint32_t insn;
10856 bfd_vma laddr;
10857 bfd_signed_vma foff;
10858 unsigned long reloc;
10859
10860 laddr = irel->r_offset;
10861 foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
10862 BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
10863 foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
10864 insn = bfd_getb32 (contents + laddr);
10865
10866 if ( (bfd_signed_vma) (foff) < CONSERVATIVE_20BIT
10867 && (bfd_signed_vma) (foff) >= -CONSERVATIVE_20BIT)
10868 {
10869 /* Pattern sethi-ori transform to movi. */
10870 reloc = R_NDS32_TLS_LE_20;
10871 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10872 insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
10873 bfd_putb32 (insn, contents + laddr);
10874 }
10875 }
10876
10877 /* Relax LE TLS calculate address instruction pattern. */
10878
10879 static void
10880 nds32_elf_relax_letlsadd (struct bfd_link_info *link_info, bfd *abfd,
10881 asection *sec, Elf_Internal_Rela *irel,
10882 Elf_Internal_Rela *internal_relocs,
10883 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10884 Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
10885 {
10886 /* Local TLS non-pic
10887 sethi ta, hi20(symbol@tpoff) ; TLS_LE_HI20
10888 ori ta, ta, lo12(symbol@tpoff) ; TLS_LE_LO12
10889 add ra, ta, tp ; TLS_LE_ADD */
10890
10891 uint32_t insn;
10892 bfd_vma laddr;
10893 bfd_signed_vma foff;
10894 Elf_Internal_Rela *i1_irelfn, *irelend;
10895
10896 irelend = internal_relocs + sec->reloc_count;
10897 laddr = irel->r_offset;
10898 insn = bfd_getb32 (contents + laddr);
10899 i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
10900 R_NDS32_PTR_RESOLVED);
10901 foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
10902 BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
10903 foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
10904
10905 /* The range is +/-16k. */
10906 if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
10907 && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
10908 {
10909 /* Transform add to addi. */
10910 insn = N32_TYPE2 (ADDI, N32_RT5 (insn), N32_RB5 (insn), 0);
10911 irel->r_info =
10912 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
10913
10914 bfd_putb32 (insn, contents + laddr);
10915 if (i1_irelfn != irelend)
10916 {
10917 i1_irelfn->r_addend |= 1;
10918 *again = TRUE;
10919 }
10920 }
10921 }
10922
10923 /* Relax LE TLS load store instruction pattern. */
10924
10925 static void
10926 nds32_elf_relax_letlsls (struct bfd_link_info *link_info, bfd *abfd,
10927 asection *sec, Elf_Internal_Rela *irel,
10928 Elf_Internal_Rela *internal_relocs,
10929 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10930 Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
10931 {
10932
10933 uint32_t insn;
10934 bfd_vma laddr;
10935 bfd_signed_vma foff;
10936 Elf_Internal_Rela *i1_irelfn, *irelend;
10937 int success = 0;
10938
10939 irelend = internal_relocs + sec->reloc_count;
10940 laddr = irel->r_offset;
10941 insn = bfd_getb32 (contents + laddr);
10942 i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
10943 R_NDS32_PTR_RESOLVED);
10944 foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
10945 BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
10946 foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
10947
10948 switch ((N32_OP6 (insn) << 8) | (insn & 0xff))
10949 {
10950 case (N32_OP6_MEM << 8) | N32_MEM_LB:
10951 case (N32_OP6_MEM << 8) | N32_MEM_SB:
10952 case (N32_OP6_MEM << 8) | N32_MEM_LBS:
10953 /* The range is +/-16k. */
10954 if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
10955 && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
10956 {
10957 insn =
10958 ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
10959 irel->r_info =
10960 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
10961 success = 1;
10962 break;
10963 }
10964 /* Fall through. */
10965 case (N32_OP6_MEM << 8) | N32_MEM_LH:
10966 case (N32_OP6_MEM << 8) | N32_MEM_SH:
10967 case (N32_OP6_MEM << 8) | N32_MEM_LHS:
10968 /* The range is +/-32k. */
10969 if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S1
10970 && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S1)
10971 {
10972 insn =
10973 ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
10974 irel->r_info =
10975 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S1);
10976 success = 1;
10977 break;
10978 }
10979 /* Fall through. */
10980 case (N32_OP6_MEM << 8) | N32_MEM_LW:
10981 case (N32_OP6_MEM << 8) | N32_MEM_SW:
10982 /* The range is +/-64k. */
10983 if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S2
10984 && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S2)
10985 {
10986 insn =
10987 ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
10988 irel->r_info =
10989 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S2);
10990 success = 1;
10991 break;
10992 }
10993 /* Fall through. */
10994 default:
10995 break;
10996 }
10997
10998 if (success)
10999 {
11000 bfd_putb32 (insn, contents + laddr);
11001 if (i1_irelfn != irelend)
11002 {
11003 i1_irelfn->r_addend |= 1;
11004 *again = TRUE;
11005 }
11006 }
11007 }
11008
11009 /* Relax PTR relocation for nds32_elf_relax_section. */
11010
11011 static bfd_boolean
11012 nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11013 Elf_Internal_Rela *internal_relocs, int *insn_len,
11014 int *seq_len, bfd_byte *contents)
11015 {
11016 Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel;
11017
11018 irelend = internal_relocs + sec->reloc_count;
11019
11020 re_irel =
11021 find_relocs_at_address_addr (irel, internal_relocs, irelend,
11022 R_NDS32_PTR_RESOLVED, irel->r_addend);
11023
11024 if (re_irel == irelend)
11025 {
11026 _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_PTR",
11027 irel->r_offset);
11028 return FALSE;
11029 }
11030
11031 if (re_irel->r_addend != 1)
11032 return FALSE;
11033
11034 /* Pointed target is relaxed and no longer needs this void *,
11035 change the type to NONE. */
11036 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11037
11038 /* Find PTR_COUNT to decide remove it or not. If PTR_COUNT does
11039 not exist, it means only count 1 and remove it directly. */
11040 /* TODO: I hope we can obsolate R_NDS32_COUNT in the future. */
11041 count_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11042 R_NDS32_PTR_COUNT);
11043 ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11044 R_NDS32_PTR);
11045 if (count_irel != irelend)
11046 {
11047 if (--count_irel->r_addend > 0)
11048 return FALSE;
11049 }
11050
11051 if (ptr_irel != irelend)
11052 return FALSE;
11053
11054 /* If the PTR_COUNT is already 0, remove current instruction. */
11055 *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset);
11056 *insn_len = 0;
11057 return TRUE;
11058 }
11059
11060 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */
11061
11062 static void
11063 nds32_elf_relax_pltgot_suff (struct bfd_link_info *link_info, bfd *abfd,
11064 asection *sec, Elf_Internal_Rela *irel,
11065 Elf_Internal_Rela *internal_relocs,
11066 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11067 Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11068 {
11069 uint32_t insn;
11070 bfd_signed_vma foff;
11071 Elf_Internal_Rela *i1_irelfn, *irelend;
11072 bfd_vma local_sda, laddr;
11073
11074 irelend = internal_relocs + sec->reloc_count;
11075 laddr = irel->r_offset;
11076 insn = bfd_getb32 (contents + laddr);
11077
11078 /* FIXME: It's a little trouble to turn JRAL5 to JAL since
11079 we need additional space. It might be help if we could
11080 borrow some space from instructions to be eliminated
11081 such as sethi, ori, add. */
11082 if (insn & 0x80000000)
11083 return;
11084
11085 if (nds32_elf_check_dup_relocs
11086 (irel, internal_relocs, irelend, R_NDS32_PLT_GOT_SUFF))
11087 return;
11088
11089 i1_irelfn =
11090 find_relocs_at_address (irel, internal_relocs, irelend,
11091 R_NDS32_PTR_RESOLVED);
11092
11093 /* FIXIT 090606
11094 The boundary should be reduced since the .plt section hasn't
11095 been created and the address of specific entry is still unknown
11096 Maybe the range between the function call and the begin of the
11097 .text section can be used to decide if the .plt is in the range
11098 of function call. */
11099
11100 if (N32_OP6 (insn) == N32_OP6_ALU1
11101 && N32_SUB5 (insn) == N32_ALU1_ADD)
11102 {
11103 /* Get the value of the symbol referred to by the reloc. */
11104 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11105 &local_sda, FALSE);
11106 foff = (bfd_signed_vma) (calculate_plt_memory_address
11107 (abfd, link_info, isymbuf, irel,
11108 symtab_hdr) - local_sda);
11109 /* This condition only happened when symbol is undefined. */
11110 if (foff == 0)
11111 return;
11112
11113 if (foff < -CONSERVATIVE_19BIT || foff >= CONSERVATIVE_19BIT)
11114 return;
11115 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11116 R_NDS32_PLT_GOTREL_LO19);
11117 /* addi.gp */
11118 insn = N32_TYPE1 (SBGP, N32_RT5 (insn), N32_BIT (19));
11119 }
11120 else if (N32_OP6 (insn) == N32_OP6_JREG
11121 && N32_SUB5 (insn) == N32_JREG_JRAL)
11122 {
11123 /* Get the value of the symbol referred to by the reloc. */
11124 foff =
11125 calculate_plt_offset (abfd, sec, link_info, isymbuf, irel, symtab_hdr);
11126 /* This condition only happened when symbol is undefined. */
11127 if (foff == 0)
11128 return;
11129 if (foff < -CONSERVATIVE_24BIT_S1 || foff >= CONSERVATIVE_24BIT_S1)
11130 return;
11131 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_25_PLTREL);
11132 insn = INSN_JAL;
11133 }
11134 else
11135 return;
11136
11137 bfd_putb32 (insn, contents + laddr);
11138 if (i1_irelfn != irelend)
11139 {
11140 i1_irelfn->r_addend |= 1;
11141 *again = TRUE;
11142 }
11143 }
11144
11145 /* Relax GOT_SUFF relocation for nds32_elf_relax_section. */
11146
11147 static void
11148 nds32_elf_relax_got_suff (struct bfd_link_info *link_info, bfd *abfd,
11149 asection *sec, Elf_Internal_Rela *irel,
11150 Elf_Internal_Rela *internal_relocs,
11151 bfd_byte *contents, Elf_Internal_Shdr *symtab_hdr,
11152 bfd_boolean *again)
11153 {
11154 uint32_t insn;
11155 bfd_signed_vma foff;
11156 Elf_Internal_Rela *i1_irelfn, *irelend;
11157 bfd_vma local_sda, laddr;
11158
11159 irelend = internal_relocs + sec->reloc_count;
11160 laddr = irel->r_offset;
11161 insn = bfd_getb32 (contents + laddr);
11162 if (insn & 0x80000000)
11163 return;
11164
11165 if (nds32_elf_check_dup_relocs
11166 (irel, internal_relocs, irelend, R_NDS32_GOT_SUFF))
11167 return;
11168
11169 i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11170 R_NDS32_PTR_RESOLVED);
11171
11172 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11173 &local_sda, FALSE);
11174 foff = calculate_got_memory_address (abfd, link_info, irel,
11175 symtab_hdr) - local_sda;
11176
11177 if (foff < CONSERVATIVE_19BIT && foff >= -CONSERVATIVE_19BIT)
11178 {
11179 /* Turn LW to LWI.GP. Change relocation type to R_NDS32_GOT_REL. */
11180 insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11181 irel->r_info =
11182 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_GOT17S2_RELA);
11183 bfd_putb32 (insn, contents + laddr);
11184 if (i1_irelfn != irelend)
11185 {
11186 i1_irelfn->r_addend |= 1;
11187 *again = TRUE;
11188 }
11189 }
11190 }
11191
11192 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */
11193
11194 static void
11195 nds32_elf_relax_gotoff_suff (struct bfd_link_info *link_info, bfd *abfd,
11196 asection *sec, Elf_Internal_Rela *irel,
11197 Elf_Internal_Rela *internal_relocs,
11198 bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11199 Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11200 {
11201 int opc_insn_gotoff;
11202 uint32_t insn;
11203 bfd_signed_vma foff;
11204 Elf_Internal_Rela *i1_irelfn, *i2_irelfn, *irelend;
11205 bfd_vma local_sda, laddr;
11206
11207 irelend = internal_relocs + sec->reloc_count;
11208 laddr = irel->r_offset;
11209 insn = bfd_getb32 (contents + laddr);
11210
11211 if (insn & 0x80000000)
11212 return;
11213
11214 if (nds32_elf_check_dup_relocs
11215 (irel, internal_relocs, irelend, R_NDS32_GOTOFF_SUFF))
11216 return;
11217
11218 i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11219 R_NDS32_PTR_RESOLVED);
11220 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11221 &local_sda, FALSE);
11222 foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11223 foff = foff - local_sda;
11224
11225 if (foff >= CONSERVATIVE_19BIT || foff < -CONSERVATIVE_19BIT)
11226 return;
11227
11228 /* Concatenate opcode and sub-opcode for switch case.
11229 It may be MEM or ALU1. */
11230 opc_insn_gotoff = (N32_OP6 (insn) << 8) | (insn & 0xff);
11231 switch (opc_insn_gotoff)
11232 {
11233 case (N32_OP6_MEM << 8) | N32_MEM_LW:
11234 /* 4-byte aligned. */
11235 insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11236 irel->r_info =
11237 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11238 break;
11239 case (N32_OP6_MEM << 8) | N32_MEM_SW:
11240 insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
11241 irel->r_info =
11242 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11243 break;
11244 case (N32_OP6_MEM << 8) | N32_MEM_LH:
11245 /* 2-byte aligned. */
11246 insn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
11247 irel->r_info =
11248 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11249 break;
11250 case (N32_OP6_MEM << 8) | N32_MEM_LHS:
11251 insn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (18));
11252 irel->r_info =
11253 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11254 break;
11255 case (N32_OP6_MEM << 8) | N32_MEM_SH:
11256 insn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (19));
11257 irel->r_info =
11258 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11259 break;
11260 case (N32_OP6_MEM << 8) | N32_MEM_LB:
11261 /* 1-byte aligned. */
11262 insn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
11263 irel->r_info =
11264 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11265 break;
11266 case (N32_OP6_MEM << 8) | N32_MEM_LBS:
11267 insn = N32_TYPE1 (LBGP, N32_RT5 (insn), N32_BIT (19));
11268 irel->r_info =
11269 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11270 break;
11271 case (N32_OP6_MEM << 8) | N32_MEM_SB:
11272 insn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
11273 irel->r_info =
11274 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11275 break;
11276 case (N32_OP6_ALU1 << 8) | N32_ALU1_ADD:
11277 insn = N32_TYPE1 (SBGP, N32_RT5 (insn), N32_BIT (19));
11278 irel->r_info =
11279 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11280 break;
11281 default:
11282 return;
11283 }
11284
11285 bfd_putb32 (insn, contents + laddr);
11286 if (i1_irelfn != irelend)
11287 {
11288 i1_irelfn->r_addend |= 1;
11289 *again = TRUE;
11290 }
11291 if ((i2_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11292 R_NDS32_INSN16)) != irelend)
11293 i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11294
11295 }
11296
11297 static bfd_boolean
11298 nds32_relax_adjust_label (bfd *abfd, asection *sec,
11299 Elf_Internal_Rela *internal_relocs,
11300 bfd_byte *contents,
11301 nds32_elf_blank_t **relax_blank_list,
11302 int optimize, int opt_size)
11303 {
11304 /* This code block is used to adjust 4-byte alignment by relax a pair
11305 of instruction a time.
11306
11307 It recognizes three types of relocations.
11308 1. R_NDS32_LABEL - a alignment.
11309 2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11310 3. is_16bit_NOP () - remove a 16-bit instruction. */
11311
11312 /* TODO: It seems currently implementation only support 4-byte alignment.
11313 We should handle any-alignment. */
11314
11315 Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel;
11316 Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL;
11317 Elf_Internal_Rela rel_temp;
11318 Elf_Internal_Rela *irelend;
11319 bfd_vma address;
11320 uint16_t insn16;
11321
11322 /* Checking for branch relaxation relies on the relocations to
11323 be sorted on 'r_offset'. This is not guaranteed so we must sort. */
11324 nds32_insertion_sort (internal_relocs, sec->reloc_count,
11325 sizeof (Elf_Internal_Rela), compar_reloc);
11326
11327 irelend = internal_relocs + sec->reloc_count;
11328
11329 /* Force R_NDS32_LABEL before R_NDS32_INSN16. */
11330 /* FIXME: Can we generate the right order in assembler?
11331 So we don't have to swapping them here. */
11332
11333 for (label_rel = internal_relocs, insn_rel = internal_relocs;
11334 label_rel < irelend; label_rel++)
11335 {
11336 if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL)
11337 continue;
11338
11339 /* Find the first reloc has the same offset with label_rel. */
11340 while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset)
11341 insn_rel++;
11342
11343 for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset;
11344 insn_rel++)
11345 /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11346 address. */
11347 if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16)
11348 break;
11349
11350 if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset
11351 && insn_rel < label_rel)
11352 {
11353 /* Swap the two reloc if the R_NDS32_INSN16 is
11354 before R_NDS32_LABEL. */
11355 memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela));
11356 memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela));
11357 memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela));
11358 }
11359 }
11360
11361 label_rel = NULL;
11362 insn_rel = NULL;
11363 /* If there were a sequence of R_NDS32_LABEL end up with .align 2
11364 or higher, remove other R_NDS32_LABEL with lower alignment.
11365 If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
11366 then the R_NDS32_LABEL sequence is broke. */
11367 for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++)
11368 {
11369 if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL)
11370 {
11371 if (label_rel == NULL)
11372 {
11373 if (tmp_rel->r_addend < 2)
11374 label_rel = tmp_rel;
11375 continue;
11376 }
11377 else if (tmp_rel->r_addend > 1)
11378 {
11379 /* Remove all LABEL relocation from label_rel to tmp_rel
11380 including relocations with same offset as tmp_rel. */
11381 for (tmp2_rel = label_rel; tmp2_rel < tmp_rel
11382 || tmp2_rel->r_offset == tmp_rel->r_offset; tmp2_rel++)
11383 {
11384 if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL
11385 && tmp2_rel->r_addend < 2)
11386 tmp2_rel->r_info =
11387 ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info),
11388 R_NDS32_NONE);
11389 }
11390 label_rel = NULL;
11391 }
11392 }
11393 else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel)
11394 {
11395 /* A new INSN16 which can be converted, so clear label_rel. */
11396 if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs,
11397 irelend, &insn16)
11398 || is_16bit_NOP (abfd, sec, tmp_rel))
11399 label_rel = NULL;
11400 }
11401 }
11402
11403 label_rel = NULL;
11404 insn_rel = NULL;
11405 /* Optimized for speed and nothing has not been relaxed.
11406 It's time to align labels.
11407 We may convert a 16-bit instruction right before a label to
11408 32-bit, in order to align the label if necessary
11409 all reloc entries has been sorted by r_offset. */
11410 for (irel = internal_relocs; irel < irelend; irel++)
11411 {
11412 if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16
11413 && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL)
11414 continue;
11415
11416 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16)
11417 {
11418 /* A new INSN16 found, resize the old one. */
11419 if (is_convert_32_to_16
11420 (abfd, sec, irel, internal_relocs, irelend, &insn16)
11421 || is_16bit_NOP (abfd, sec, irel))
11422 {
11423 if (insn_rel)
11424 {
11425 /* Previous INSN16 reloc exists, reduce its
11426 size to 16-bit. */
11427 if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11428 irelend, &insn16))
11429 {
11430 nds32_elf_write_16 (abfd, contents, insn_rel,
11431 internal_relocs, irelend, insn16);
11432
11433 if (!insert_nds32_elf_blank_recalc_total
11434 (relax_blank_list, insn_rel->r_offset + 2, 2))
11435 return FALSE;
11436 }
11437 else if (is_16bit_NOP (abfd, sec, insn_rel))
11438 {
11439 if (!insert_nds32_elf_blank_recalc_total
11440 (relax_blank_list, insn_rel->r_offset, 2))
11441 return FALSE;
11442 }
11443 insn_rel->r_info =
11444 ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE);
11445 }
11446 /* Save the new one for later use. */
11447 insn_rel = irel;
11448 }
11449 else
11450 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11451 R_NDS32_NONE);
11452 }
11453 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL)
11454 {
11455 /* Search for label. */
11456 int force_relax = 0;
11457
11458 /* Label on 16-bit instruction or optimization
11459 needless, just reset this reloc. */
11460 insn16 = bfd_getb16 (contents + irel->r_offset);
11461 if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000)))
11462 {
11463 irel->r_info =
11464 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11465 continue;
11466 }
11467
11468 address =
11469 irel->r_offset - get_nds32_elf_blank_total (relax_blank_list,
11470 irel->r_offset, 1);
11471
11472 if (!insn_rel)
11473 {
11474 /* Check if there is case which can not be aligned. */
11475 if (irel->r_addend == 2 && address & 0x2)
11476 return FALSE;
11477 continue;
11478 }
11479
11480 /* Try to align this label. */
11481
11482 if ((irel->r_addend & 0x1f) < 2)
11483 {
11484 /* Check if there is a INSN16 at the same address.
11485 Label_rel always seats before insn_rel after
11486 our sort. */
11487
11488 /* Search for INSN16 at LABEL location. If INSN16 is at
11489 same location and this LABEL alignment is lower than 2,
11490 the INSN16 can be converted to 2-byte. */
11491 for (tmp_rel = irel;
11492 tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset;
11493 tmp_rel++)
11494 {
11495 if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16
11496 && (is_convert_32_to_16
11497 (abfd, sec, tmp_rel, internal_relocs,
11498 irelend, &insn16)
11499 || is_16bit_NOP (abfd, sec, tmp_rel)))
11500 {
11501 force_relax = 1;
11502 break;
11503 }
11504 }
11505 }
11506
11507 if (force_relax || irel->r_addend == 1 || address & 0x2)
11508 {
11509 /* Label not aligned. */
11510 /* Previous reloc exists, reduce its size to 16-bit. */
11511 if (is_convert_32_to_16 (abfd, sec, insn_rel,
11512 internal_relocs, irelend, &insn16))
11513 {
11514 nds32_elf_write_16 (abfd, contents, insn_rel,
11515 internal_relocs, irelend, insn16);
11516
11517 if (!insert_nds32_elf_blank_recalc_total
11518 (relax_blank_list, insn_rel->r_offset + 2, 2))
11519 return FALSE;
11520 }
11521 else if (is_16bit_NOP (abfd, sec, insn_rel))
11522 {
11523 if (!insert_nds32_elf_blank_recalc_total
11524 (relax_blank_list, insn_rel->r_offset, 2))
11525 return FALSE;
11526 }
11527
11528 }
11529 /* INSN16 reloc is used. */
11530 insn_rel = NULL;
11531 }
11532 }
11533
11534 address =
11535 sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0);
11536 if (insn_rel && (address & 0x2 || opt_size))
11537 {
11538 if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11539 irelend, &insn16))
11540 {
11541 nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs,
11542 irelend, insn16);
11543 if (!insert_nds32_elf_blank_recalc_total
11544 (relax_blank_list, insn_rel->r_offset + 2, 2))
11545 return FALSE;
11546 insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11547 R_NDS32_NONE);
11548 }
11549 else if (is_16bit_NOP (abfd, sec, insn_rel))
11550 {
11551 if (!insert_nds32_elf_blank_recalc_total
11552 (relax_blank_list, insn_rel->r_offset, 2))
11553 return FALSE;
11554 insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11555 R_NDS32_NONE);
11556 }
11557 }
11558 insn_rel = NULL;
11559 return TRUE;
11560 }
11561
11562 /* Pick relaxation round. */
11563
11564 static int
11565 nds32_elf_pick_relax (bfd_boolean init, asection *sec, bfd_boolean *again,
11566 struct elf_nds32_link_hash_table *table,
11567 struct bfd_link_info *link_info)
11568 {
11569 static asection *final_sec, *first_sec = NULL;
11570 static bfd_boolean normal_again = FALSE;
11571 static bfd_boolean set = FALSE;
11572 static bfd_boolean first = TRUE;
11573 int round_table[] = {
11574 NDS32_RELAX_NORMAL_ROUND,
11575 NDS32_RELAX_JUMP_IFC_ROUND,
11576 NDS32_RELAX_EX9_BUILD_ROUND,
11577 NDS32_RELAX_EX9_REPLACE_ROUND,
11578 };
11579 static int pass = 0;
11580 static int relax_round;
11581
11582 /* The new round. */
11583 if (init && first_sec == sec)
11584 {
11585 set = TRUE;
11586 normal_again = FALSE;
11587 }
11588
11589 if (first)
11590 {
11591 /* Run an empty run to get the final section. */
11592 relax_round = NDS32_RELAX_EMPTY_ROUND;
11593
11594 /* It has to enter relax again because we can
11595 not make sure what the final turn is. */
11596 *again = TRUE;
11597
11598 first = FALSE;
11599 first_sec = sec;
11600 }
11601
11602 if (!set)
11603 {
11604 /* Not reenter yet. */
11605 final_sec = sec;
11606 return relax_round;
11607 }
11608
11609 relax_round = round_table[pass];
11610
11611 if (!init && relax_round == NDS32_RELAX_NORMAL_ROUND && *again)
11612 normal_again = TRUE;
11613
11614 if (!init && final_sec == sec)
11615 {
11616 switch (relax_round)
11617 {
11618 case NDS32_RELAX_NORMAL_ROUND:
11619 if (!normal_again)
11620 {
11621 /* Normal relaxation done. */
11622 if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11623 {
11624 pass++;
11625 *again = TRUE;
11626 }
11627 else if (table->target_optimize & NDS32_RELAX_EX9_ON)
11628 {
11629 pass += 2; /* NDS32_RELAX_EX9_BUILD_ROUND */
11630 *again = TRUE;
11631 }
11632 else if (table->ex9_import_file)
11633 {
11634 /* Import ex9 table. */
11635 if (table->update_ex9_table)
11636 pass += 2; /* NDS32_RELAX_EX9_BUILD_ROUND */
11637 else
11638 pass += 3; /* NDS32_RELAX_EX9_REPLACE_ROUND */
11639 nds32_elf_ex9_import_table (link_info);
11640 *again = TRUE;
11641 }
11642 }
11643 break;
11644 case NDS32_RELAX_JUMP_IFC_ROUND:
11645 if (!nds32_elf_ifc_finish (link_info))
11646 _bfd_error_handler (_("error: Jump IFC Fail."));
11647 if (table->target_optimize & NDS32_RELAX_EX9_ON)
11648 {
11649 pass++;
11650 *again = TRUE;
11651 }
11652 break;
11653 case NDS32_RELAX_EX9_BUILD_ROUND:
11654 nds32_elf_ex9_finish (link_info);
11655 pass++;
11656 *again = TRUE;
11657 break;
11658 case NDS32_RELAX_EX9_REPLACE_ROUND:
11659 if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11660 {
11661 /* Do jump IFC optimization again. */
11662 if (!nds32_elf_ifc_finish (link_info))
11663 _bfd_error_handler (_("error: Jump IFC Fail."));
11664 }
11665 break;
11666 default:
11667 break;
11668 }
11669 }
11670
11671 return relax_round;
11672 }
11673
11674 static bfd_boolean
11675 nds32_elf_relax_section (bfd *abfd, asection *sec,
11676 struct bfd_link_info *link_info, bfd_boolean *again)
11677 {
11678 nds32_elf_blank_t *relax_blank_list = NULL;
11679 Elf_Internal_Shdr *symtab_hdr;
11680 Elf_Internal_Rela *internal_relocs;
11681 Elf_Internal_Rela *irel;
11682 Elf_Internal_Rela *irelend;
11683 Elf_Internal_Sym *isymbuf = NULL;
11684 bfd_byte *contents = NULL;
11685 bfd_boolean result = TRUE;
11686 int optimize = 0;
11687 int opt_size = 0;
11688 uint32_t insn;
11689 uint16_t insn16;
11690
11691 /* Target dependnet option. */
11692 struct elf_nds32_link_hash_table *table;
11693 int load_store_relax;
11694 int relax_round;
11695
11696 relax_blank_list = NULL;
11697
11698 *again = FALSE;
11699
11700 /* Nothing to do for
11701 * relocatable link or
11702 * non-relocatable section or
11703 * non-code section or
11704 * empty content or
11705 * no reloc entry. */
11706 if (bfd_link_relocatable (link_info)
11707 || (sec->flags & SEC_RELOC) == 0
11708 || (sec->flags & SEC_EXCLUDE) != 0
11709 || (sec->flags & SEC_CODE) == 0
11710 || sec->size == 0)
11711 return TRUE;
11712
11713 /* 09.12.11 Workaround. */
11714 /* We have to adjust align for R_NDS32_LABEL if needed.
11715 The adjust approach only can fix 2-byte align once. */
11716 if (sec->alignment_power > 2)
11717 return TRUE;
11718
11719 /* The optimization type to do. */
11720
11721 table = nds32_elf_hash_table (link_info);
11722 relax_round = nds32_elf_pick_relax (TRUE, sec, again, table, link_info);
11723 switch (relax_round)
11724 {
11725 case NDS32_RELAX_JUMP_IFC_ROUND:
11726 /* Here is the entrance of ifc jump relaxation. */
11727 if (!nds32_elf_ifc_calc (link_info, abfd, sec))
11728 return FALSE;
11729 nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11730 return TRUE;
11731
11732 case NDS32_RELAX_EX9_BUILD_ROUND:
11733 /* Here is the entrance of ex9 relaxation. There are two pass of
11734 ex9 relaxation. The one is to traverse all instructions and build
11735 the hash table. The other one is to compare instructions and replace
11736 it by ex9.it. */
11737 if (!nds32_elf_ex9_build_hash_table (abfd, sec, link_info))
11738 return FALSE;
11739 nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11740 return TRUE;
11741
11742 case NDS32_RELAX_EX9_REPLACE_ROUND:
11743 if (!nds32_elf_ex9_replace_instruction (link_info, abfd, sec))
11744 return FALSE;
11745 return TRUE;
11746
11747 case NDS32_RELAX_EMPTY_ROUND:
11748 nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11749 return TRUE;
11750
11751 case NDS32_RELAX_NORMAL_ROUND:
11752 default:
11753 if (sec->reloc_count == 0)
11754 return TRUE;
11755 break;
11756 }
11757
11758 /* The begining of general relaxation. */
11759
11760 if (is_SDA_BASE_set == 0)
11761 {
11762 bfd_vma gp;
11763 is_SDA_BASE_set = 1;
11764 nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11765 &gp, FALSE);
11766 relax_range_measurement (abfd);
11767 }
11768
11769 if (is_ITB_BASE_set == 0)
11770 {
11771 /* Set the _ITB_BASE_. */
11772 if (!nds32_elf_ex9_itb_base (link_info))
11773 {
11774 _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"), abfd);
11775 bfd_set_error (bfd_error_bad_value);
11776 }
11777 }
11778
11779 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
11780 /* Relocations MUST be kept in memory, because relaxation adjust them. */
11781 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
11782 TRUE /* keep_memory */);
11783 if (internal_relocs == NULL)
11784 goto error_return;
11785
11786 irelend = internal_relocs + sec->reloc_count;
11787 irel = find_relocs_at_address (internal_relocs, internal_relocs,
11788 irelend, R_NDS32_RELAX_ENTRY);
11789
11790 if (irel == irelend)
11791 return TRUE;
11792
11793 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
11794 {
11795 if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG)
11796 {
11797 nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11798 return TRUE;
11799 }
11800
11801 if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG)
11802 optimize = 1;
11803
11804 if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG)
11805 opt_size = 1;
11806 }
11807
11808 load_store_relax = table->load_store_relax;
11809
11810 /* Get symbol table and section content. */
11811 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
11812 || !nds32_get_local_syms (abfd, sec, &isymbuf))
11813 goto error_return;
11814
11815 /* Do relax loop only when finalize is not done.
11816 Take care of relaxable relocs except INSN16. */
11817 for (irel = internal_relocs; irel < irelend; irel++)
11818 {
11819 int seq_len; /* Original length of instruction sequence. */
11820 int insn_len = 0; /* Final length of instruction sequence. */
11821 bfd_boolean removed;
11822
11823 insn = 0;
11824 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
11825 && (irel->r_addend & 0x1f) >= 2)
11826 optimize = 1;
11827
11828 /* Relocation Types
11829 R_NDS32_LONGCALL1 53
11830 R_NDS32_LONGCALL2 54
11831 R_NDS32_LONGCALL3 55
11832 R_NDS32_LONGJUMP1 56
11833 R_NDS32_LONGJUMP2 57
11834 R_NDS32_LONGJUMP3 58
11835 R_NDS32_LOADSTORE 59 */
11836 if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1
11837 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE)
11838 seq_len = GET_SEQ_LEN (irel->r_addend);
11839
11840 /* Relocation Types
11841 R_NDS32_LONGCALL4 107
11842 R_NDS32_LONGCALL5 108
11843 R_NDS32_LONGCALL6 109
11844 R_NDS32_LONGJUMP4 110
11845 R_NDS32_LONGJUMP5 111
11846 R_NDS32_LONGJUMP6 112
11847 R_NDS32_LONGJUMP7 113 */
11848 else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4
11849 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7)
11850 seq_len = 4;
11851
11852 /* Relocation Types
11853 R_NDS32_LO12S0_RELA 30
11854 R_NDS32_LO12S1_RELA 29
11855 R_NDS32_LO12S2_RELA 28
11856 R_NDS32_LO12S2_SP_RELA 71
11857 R_NDS32_LO12S2_DP_RELA 70
11858 R_NDS32_GOT_LO12 46
11859 R_NDS32_GOTOFF_LO12 50
11860 R_NDS32_PLTREL_LO12 65
11861 R_NDS32_PLT_GOTREL_LO12 67
11862 R_NDS32_17IFC_PCREL_RELA 96
11863 R_NDS32_GOT_SUFF 193
11864 R_NDS32_GOTOFF_SUFF 194
11865 R_NDS32_PLT_GOT_SUFF 195
11866 R_NDS32_MULCALL_SUFF 196
11867 R_NDS32_PTR 197 */
11868 else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA
11869 && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA)
11870 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA
11871 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA
11872 || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12
11873 || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12
11874 || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12
11875 || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12
11876 || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12
11877 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF
11878 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR)
11879 || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
11880 || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12
11881 || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD
11882 || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS)
11883 seq_len = 0;
11884 else
11885 continue;
11886
11887 insn_len = seq_len;
11888 removed = FALSE;
11889
11890 switch (ELF32_R_TYPE (irel->r_info))
11891 {
11892 case R_NDS32_LONGCALL1:
11893 removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs,
11894 &insn_len, contents, isymbuf,
11895 symtab_hdr);
11896 break;
11897 case R_NDS32_LONGCALL2:
11898 removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs,
11899 &insn_len, contents, isymbuf,
11900 symtab_hdr);
11901 break;
11902 case R_NDS32_LONGCALL3:
11903 removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs,
11904 &insn_len, contents, isymbuf,
11905 symtab_hdr);
11906 break;
11907 case R_NDS32_LONGJUMP1:
11908 removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs,
11909 &insn_len, contents, isymbuf,
11910 symtab_hdr);
11911 break;
11912 case R_NDS32_LONGJUMP2:
11913 removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs,
11914 &insn_len, contents, isymbuf,
11915 symtab_hdr);
11916 break;
11917 case R_NDS32_LONGJUMP3:
11918 removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs,
11919 &insn_len, contents, isymbuf,
11920 symtab_hdr);
11921 break;
11922 case R_NDS32_LONGCALL4:
11923 removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs,
11924 &insn_len, contents, isymbuf,
11925 symtab_hdr);
11926 break;
11927 case R_NDS32_LONGCALL5:
11928 removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs,
11929 &insn_len, contents, isymbuf,
11930 symtab_hdr);
11931 break;
11932 case R_NDS32_LONGCALL6:
11933 removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs,
11934 &insn_len, contents, isymbuf,
11935 symtab_hdr);
11936 break;
11937 case R_NDS32_LONGJUMP4:
11938 removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs,
11939 &insn_len, contents, isymbuf,
11940 symtab_hdr);
11941 break;
11942 case R_NDS32_LONGJUMP5:
11943 removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs,
11944 &insn_len, &seq_len, contents,
11945 isymbuf, symtab_hdr);
11946 break;
11947 case R_NDS32_LONGJUMP6:
11948 removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs,
11949 &insn_len, &seq_len, contents,
11950 isymbuf, symtab_hdr);
11951 break;
11952 case R_NDS32_LONGJUMP7:
11953 removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs,
11954 &insn_len, &seq_len, contents,
11955 isymbuf, symtab_hdr);
11956 break;
11957 case R_NDS32_LOADSTORE:
11958 removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel,
11959 internal_relocs, &insn_len,
11960 contents, isymbuf, symtab_hdr,
11961 load_store_relax);
11962 break;
11963 case R_NDS32_LO12S0_RELA:
11964 case R_NDS32_LO12S1_RELA:
11965 case R_NDS32_LO12S2_DP_RELA:
11966 case R_NDS32_LO12S2_SP_RELA:
11967 case R_NDS32_LO12S2_RELA:
11968 /* Relax for low part. */
11969 nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs,
11970 contents, isymbuf, symtab_hdr);
11971
11972 /* It is impossible to delete blank, so just continue. */
11973 continue;
11974 case R_NDS32_GOT_LO12:
11975 case R_NDS32_GOTOFF_LO12:
11976 case R_NDS32_PLTREL_LO12:
11977 case R_NDS32_PLT_GOTREL_LO12:
11978 case R_NDS32_GOTPC_LO12:
11979 /* Relax for PIC gp-relative low part. */
11980 nds32_elf_relax_piclo12 (link_info, abfd, sec, irel, contents,
11981 isymbuf, symtab_hdr);
11982
11983 /* It is impossible to delete blank, so just continue. */
11984 continue;
11985 case R_NDS32_TLS_LE_LO12:
11986 /* Relax for LE TLS low part. */
11987 nds32_elf_relax_letlslo12 (link_info, abfd, irel, contents,
11988 isymbuf, symtab_hdr);
11989
11990 /* It is impossible to delete blank, so just continue. */
11991 continue;
11992 case R_NDS32_TLS_LE_ADD:
11993 nds32_elf_relax_letlsadd (link_info, abfd, sec, irel, internal_relocs,
11994 contents, isymbuf, symtab_hdr, again);
11995 /* It is impossible to delete blank, so just continue. */
11996 continue;
11997 case R_NDS32_TLS_LE_LS:
11998 nds32_elf_relax_letlsls (link_info, abfd, sec, irel, internal_relocs,
11999 contents, isymbuf, symtab_hdr, again);
12000 continue;
12001 case R_NDS32_PTR:
12002 removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs,
12003 &insn_len, &seq_len, contents);
12004 break;
12005 case R_NDS32_PLT_GOT_SUFF:
12006 nds32_elf_relax_pltgot_suff (link_info, abfd, sec, irel,
12007 internal_relocs, contents,
12008 isymbuf, symtab_hdr, again);
12009 /* It is impossible to delete blank, so just continue. */
12010 continue;
12011 case R_NDS32_GOT_SUFF:
12012 nds32_elf_relax_got_suff (link_info, abfd, sec, irel,
12013 internal_relocs, contents,
12014 symtab_hdr, again);
12015 /* It is impossible to delete blank, so just continue. */
12016 continue;
12017 case R_NDS32_GOTOFF_SUFF:
12018 nds32_elf_relax_gotoff_suff (link_info, abfd, sec, irel,
12019 internal_relocs, contents,
12020 isymbuf, symtab_hdr, again);
12021 /* It is impossible to delete blank, so just continue. */
12022 continue;
12023 default:
12024 continue;
12025
12026 }
12027 if (removed && seq_len - insn_len > 0)
12028 {
12029 if (!insert_nds32_elf_blank
12030 (&relax_blank_list, irel->r_offset + insn_len,
12031 seq_len - insn_len))
12032 goto error_return;
12033 *again = TRUE;
12034 }
12035 }
12036
12037 calc_nds32_blank_total (relax_blank_list);
12038
12039 if (table->relax_fp_as_gp)
12040 {
12041 if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs,
12042 irelend, isymbuf))
12043 goto error_return;
12044
12045 if (!*again)
12046 {
12047 if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs,
12048 irelend))
12049 goto error_return;
12050 }
12051 }
12052
12053 nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12054
12055 if (!*again)
12056 {
12057 if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents,
12058 &relax_blank_list, optimize, opt_size))
12059 goto error_return;
12060 }
12061
12062 /* It doesn't matter optimize_for_space_no_align anymore.
12063 If object file is assembled with flag '-Os',
12064 the we don't adjust jump-destination on 4-byte boundary. */
12065
12066 if (relax_blank_list)
12067 {
12068 nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12069 relax_blank_list = NULL;
12070 }
12071
12072 if (!*again)
12073 {
12074 /* Closing the section, so we don't relax it anymore. */
12075 bfd_vma sec_size_align;
12076 Elf_Internal_Rela *tmp_rel;
12077
12078 /* Pad to alignment boundary. Only handle current section alignment. */
12079 sec_size_align = (sec->size + (~((-1U) << sec->alignment_power)))
12080 & ((-1U) << sec->alignment_power);
12081 if ((sec_size_align - sec->size) & 0x2)
12082 {
12083 insn16 = NDS32_NOP16;
12084 bfd_putb16 (insn16, contents + sec->size);
12085 sec->size += 2;
12086 }
12087
12088 while (sec_size_align != sec->size)
12089 {
12090 insn = NDS32_NOP32;
12091 bfd_putb32 (insn, contents + sec->size);
12092 sec->size += 4;
12093 }
12094
12095 tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs,
12096 irelend, R_NDS32_RELAX_ENTRY);
12097 if (tmp_rel != irelend)
12098 tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
12099
12100 clean_nds32_elf_blank ();
12101 }
12102
12103 finish:
12104 if (internal_relocs != NULL
12105 && elf_section_data (sec)->relocs != internal_relocs)
12106 free (internal_relocs);
12107
12108 if (contents != NULL
12109 && elf_section_data (sec)->this_hdr.contents != contents)
12110 free (contents);
12111
12112 if (isymbuf != NULL && symtab_hdr->contents != (bfd_byte *) isymbuf)
12113 free (isymbuf);
12114
12115 return result;
12116
12117 error_return:
12118 result = FALSE;
12119 goto finish;
12120 }
12121
12122 static struct bfd_elf_special_section const nds32_elf_special_sections[] =
12123 {
12124 {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE},
12125 {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
12126 {NULL, 0, 0, 0, 0}
12127 };
12128
12129 static bfd_boolean
12130 nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
12131 struct bfd_link_info *info,
12132 void *finfo ATTRIBUTE_UNUSED,
12133 bfd_boolean (*func) (void *, const char *,
12134 Elf_Internal_Sym *,
12135 asection *,
12136 struct elf_link_hash_entry *)
12137 ATTRIBUTE_UNUSED)
12138 {
12139 FILE *sym_ld_script = NULL;
12140 struct elf_nds32_link_hash_table *table;
12141
12142 table = nds32_elf_hash_table (info);
12143 sym_ld_script = table->sym_ld_script;
12144
12145 if (check_start_export_sym)
12146 fprintf (sym_ld_script, "}\n");
12147
12148 return TRUE;
12149 }
12150
12151 static enum elf_reloc_type_class
12152 nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
12153 const asection *rel_sec ATTRIBUTE_UNUSED,
12154 const Elf_Internal_Rela *rela)
12155 {
12156 switch ((int) ELF32_R_TYPE (rela->r_info))
12157 {
12158 case R_NDS32_RELATIVE:
12159 return reloc_class_relative;
12160 case R_NDS32_JMP_SLOT:
12161 return reloc_class_plt;
12162 case R_NDS32_COPY:
12163 return reloc_class_copy;
12164 default:
12165 return reloc_class_normal;
12166 }
12167 }
12168
12169 /* Put target dependent option into info hash table. */
12170 void
12171 bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info,
12172 int relax_fp_as_gp,
12173 int eliminate_gc_relocs,
12174 FILE * sym_ld_script, int load_store_relax,
12175 int target_optimize, int relax_status,
12176 int relax_round, FILE * ex9_export_file,
12177 FILE * ex9_import_file,
12178 int update_ex9_table, int ex9_limit,
12179 bfd_boolean ex9_loop_aware,
12180 bfd_boolean ifc_loop_aware)
12181 {
12182 struct elf_nds32_link_hash_table *table;
12183
12184 table = nds32_elf_hash_table (link_info);
12185 if (table == NULL)
12186 return;
12187
12188 table->relax_fp_as_gp = relax_fp_as_gp;
12189 table->eliminate_gc_relocs = eliminate_gc_relocs;
12190 table->sym_ld_script = sym_ld_script;
12191 table ->load_store_relax = load_store_relax;
12192 table->target_optimize = target_optimize;
12193 table->relax_status = relax_status;
12194 table->relax_round = relax_round;
12195 table->ex9_export_file = ex9_export_file;
12196 table->ex9_import_file = ex9_import_file;
12197 table->update_ex9_table = update_ex9_table;
12198 table->ex9_limit = ex9_limit;
12199 table->ex9_loop_aware = ex9_loop_aware;
12200 table->ifc_loop_aware = ifc_loop_aware;
12201 }
12202 \f
12203 /* These functions and data-structures are used for fp-as-gp
12204 optimization. */
12205
12206 #define FAG_THRESHOLD 3 /* At least 3 gp-access. */
12207 /* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12208 the read-only section and read-write section. */
12209 #define FAG_WINDOW (508 - 32)
12210
12211 /* An nds32_fag represent a gp-relative access.
12212 We find best fp-base by using a sliding window
12213 to find a base address which can cover most gp-access. */
12214 struct nds32_fag
12215 {
12216 struct nds32_fag *next; /* NULL-teminated linked list. */
12217 bfd_vma addr; /* The address of this fag. */
12218 Elf_Internal_Rela **relas; /* The relocations associated with this fag.
12219 It is used for applying FP7U2_FLAG. */
12220 int count; /* How many times this address is referred.
12221 There should be exactly `count' relocations
12222 in relas. */
12223 int relas_capcity; /* The buffer size of relas.
12224 We use an array instead of linked-list,
12225 and realloc is used to adjust buffer size. */
12226 };
12227
12228 static void
12229 nds32_fag_init (struct nds32_fag *head)
12230 {
12231 memset (head, 0, sizeof (struct nds32_fag));
12232 }
12233
12234 static void
12235 nds32_fag_verify (struct nds32_fag *head)
12236 {
12237 struct nds32_fag *iter;
12238 struct nds32_fag *prev;
12239
12240 prev = NULL;
12241 iter = head->next;
12242 while (iter)
12243 {
12244 if (prev && prev->addr >= iter->addr)
12245 puts ("Bug in fp-as-gp insertion.");
12246 prev = iter;
12247 iter = iter->next;
12248 }
12249 }
12250
12251 /* Insert a fag in ascending order.
12252 If a fag of the same address already exists,
12253 they are chained by relas array. */
12254
12255 static void
12256 nds32_fag_insert (struct nds32_fag *head, bfd_vma addr,
12257 Elf_Internal_Rela * rel)
12258 {
12259 struct nds32_fag *iter;
12260 struct nds32_fag *new_fag;
12261 const int INIT_RELAS_CAP = 4;
12262
12263 for (iter = head;
12264 iter->next && iter->next->addr <= addr;
12265 iter = iter->next)
12266 /* Find somewhere to insert. */ ;
12267
12268 /* `iter' will be equal to `head' if the list is empty. */
12269 if (iter != head && iter->addr == addr)
12270 {
12271 /* The address exists in the list.
12272 Insert `rel' into relocation list, relas. */
12273
12274 /* Check whether relas is big enough. */
12275 if (iter->count >= iter->relas_capcity)
12276 {
12277 iter->relas_capcity *= 2;
12278 iter->relas = bfd_realloc
12279 (iter->relas, iter->relas_capcity * sizeof (void *));
12280 }
12281 iter->relas[iter->count++] = rel;
12282 return;
12283 }
12284
12285 /* This is a new address. Create a fag node for it. */
12286 new_fag = bfd_malloc (sizeof (struct nds32_fag));
12287 memset (new_fag, 0, sizeof (*new_fag));
12288 new_fag->addr = addr;
12289 new_fag->count = 1;
12290 new_fag->next = iter->next;
12291 new_fag->relas_capcity = INIT_RELAS_CAP;
12292 new_fag->relas = (Elf_Internal_Rela **)
12293 bfd_malloc (new_fag->relas_capcity * sizeof (void *));
12294 new_fag->relas[0] = rel;
12295 iter->next = new_fag;
12296
12297 nds32_fag_verify (head);
12298 }
12299
12300 static void
12301 nds32_fag_free_list (struct nds32_fag *head)
12302 {
12303 struct nds32_fag *iter;
12304
12305 iter = head->next;
12306 while (iter)
12307 {
12308 struct nds32_fag *tmp = iter;
12309 iter = iter->next;
12310 free (tmp->relas);
12311 tmp->relas = NULL;
12312 free (tmp);
12313 }
12314 }
12315
12316 /* Find the best fp-base address.
12317 The relocation associated with that address is returned,
12318 so we can track the symbol instead of a fixed address.
12319
12320 When relaxation, the address of an datum may change,
12321 because a text section is shrinked, so the data section
12322 moves forward. If the aligments of text and data section
12323 are different, their distance may change too.
12324 Therefore, tracking a fixed address is not appriate. */
12325
12326 static int
12327 nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp)
12328 {
12329 struct nds32_fag *base; /* First fag in the window. */
12330 struct nds32_fag *last; /* First fag outside the window. */
12331 int accu = 0; /* Usage accumulation. */
12332 struct nds32_fag *best; /* Best fag. */
12333 int baccu = 0; /* Best accumulation. */
12334
12335 /* Use first fag for initial, and find the last fag in the window.
12336
12337 In each iteration, we could simply subtract previous fag
12338 and accumulate following fags which are inside the window,
12339 untill we each the end. */
12340
12341 if (head->next == NULL)
12342 {
12343 *bestpp = NULL;
12344 return 0;
12345 }
12346
12347 /* Initialize base. */
12348 base = head->next;
12349 best = base;
12350 for (last = base;
12351 last && last->addr < base->addr + FAG_WINDOW;
12352 last = last->next)
12353 accu += last->count;
12354
12355 baccu = accu;
12356
12357 /* Record the best base in each iteration. */
12358 while (base->next)
12359 {
12360 accu -= base->count;
12361 base = base->next;
12362 /* Account fags in window. */
12363 for (/* Nothing. */;
12364 last && last->addr < base->addr + FAG_WINDOW;
12365 last = last->next)
12366 accu += last->count;
12367
12368 /* A better fp-base? */
12369 if (accu > baccu)
12370 {
12371 best = base;
12372 baccu = accu;
12373 }
12374 }
12375
12376 if (bestpp)
12377 *bestpp = best;
12378 return baccu;
12379 }
12380
12381 /* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12382 so we can convert it fo fp-relative access later.
12383 `best_fag' is the best fp-base. Only those inside the window
12384 of best_fag is applied the flag. */
12385
12386 static bfd_boolean
12387 nds32_fag_mark_relax (struct bfd_link_info *link_info,
12388 bfd *abfd, struct nds32_fag *best_fag,
12389 Elf_Internal_Rela *internal_relocs,
12390 Elf_Internal_Rela *irelend)
12391 {
12392 struct nds32_fag *ifag;
12393 bfd_vma best_fpbase, gp;
12394 bfd *output_bfd;
12395
12396 output_bfd = abfd->sections->output_section->owner;
12397 nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
12398 best_fpbase = best_fag->addr;
12399
12400 if (best_fpbase > gp + sdata_range[1][1]
12401 || best_fpbase < gp - sdata_range[1][0])
12402 return FALSE;
12403
12404 /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12405 so we know they can be converted to lwi37.fp. */
12406 for (ifag = best_fag;
12407 ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next)
12408 {
12409 int i;
12410
12411 for (i = 0; i < ifag->count; i++)
12412 {
12413 Elf_Internal_Rela *insn16_rel;
12414 Elf_Internal_Rela *fag_rel;
12415
12416 fag_rel = ifag->relas[i];
12417
12418 /* Only if this is within the WINDOWS, FP7U2_FLAG
12419 is applied. */
12420
12421 insn16_rel = find_relocs_at_address
12422 (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12423
12424 if (insn16_rel != irelend)
12425 insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG;
12426 }
12427 }
12428 return TRUE;
12429 }
12430
12431 /* Reset INSN16 to clean fp as gp. */
12432
12433 static void
12434 nds32_fag_unmark_relax (struct nds32_fag *fag,
12435 Elf_Internal_Rela *internal_relocs,
12436 Elf_Internal_Rela *irelend)
12437 {
12438 struct nds32_fag *ifag;
12439 int i;
12440 Elf_Internal_Rela *insn16_rel;
12441 Elf_Internal_Rela *fag_rel;
12442
12443 for (ifag = fag; ifag; ifag = ifag->next)
12444 {
12445 for (i = 0; i < ifag->count; i++)
12446 {
12447 fag_rel = ifag->relas[i];
12448
12449 /* Restore the INSN16 relocation. */
12450 insn16_rel = find_relocs_at_address
12451 (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12452
12453 if (insn16_rel != irelend)
12454 insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG;
12455 }
12456 }
12457 }
12458
12459 /* This is the main function of fp-as-gp optimization.
12460 It should be called by relax_section. */
12461
12462 static bfd_boolean
12463 nds32_relax_fp_as_gp (struct bfd_link_info *link_info,
12464 bfd *abfd, asection *sec,
12465 Elf_Internal_Rela *internal_relocs,
12466 Elf_Internal_Rela *irelend,
12467 Elf_Internal_Sym *isymbuf)
12468 {
12469 Elf_Internal_Rela *begin_rel = NULL;
12470 Elf_Internal_Rela *irel;
12471 struct nds32_fag fag_head;
12472 Elf_Internal_Shdr *symtab_hdr;
12473 bfd_byte *contents;
12474 bfd_boolean ifc_inside = FALSE;
12475
12476 /* FIXME: Can we bfd_elf_link_read_relocs for the relocs? */
12477
12478 /* Per-function fp-base selection.
12479 1. Create a list for all the gp-relative access.
12480 2. Base on those gp-relative address,
12481 find a fp-base which can cover most access.
12482 3. Use the fp-base for fp-as-gp relaxation.
12483
12484 NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12485 we should
12486 1. delete the `la $fp, _FP_BASE_' instruction and
12487 2. not convert lwi.gp to lwi37.fp.
12488
12489 To delete the _FP_BASE_ instruction, we simply apply
12490 R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12491
12492 To suppress the conversion, we simply NOT to apply
12493 R_NDS32_INSN16_FP7U2_FLAG flag. */
12494
12495 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12496
12497 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12498 || !nds32_get_local_syms (abfd, sec, &isymbuf))
12499 return FALSE;
12500
12501 /* Check whether it is worth for fp-as-gp optimization,
12502 i.e., at least 3 gp-load.
12503
12504 Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12505 apply this optimization. */
12506
12507 for (irel = internal_relocs; irel < irelend; irel++)
12508 {
12509 /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12510 One we enter the begin of the region, we track all the LW/ST
12511 instructions, so when we leave the region, we try to find
12512 the best fp-base address for those LW/ST instructions. */
12513
12514 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12515 && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12516 {
12517 /* Begin of the region. */
12518 if (begin_rel)
12519 /* xgettext:c-format */
12520 _bfd_error_handler (_("%B: Nested OMIT_FP in %A."), abfd, sec);
12521
12522 begin_rel = irel;
12523 nds32_fag_init (&fag_head);
12524 ifc_inside = FALSE;
12525 }
12526 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12527 && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12528 {
12529 int accu;
12530 struct nds32_fag *best_fag, *tmp_fag;
12531 int dist;
12532
12533 /* End of the region.
12534 Check whether it is worth to do fp-as-gp. */
12535
12536 if (begin_rel == NULL)
12537 {
12538 /* xgettext:c-format */
12539 _bfd_error_handler (_("%B: Unmatched OMIT_FP in %A."), abfd, sec);
12540 continue;
12541 }
12542
12543 accu = nds32_fag_find_base (&fag_head, &best_fag);
12544
12545 /* Clean FP7U2_FLAG because they may set ever. */
12546 tmp_fag = fag_head.next;
12547 nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend);
12548
12549 /* Check if it is worth, and FP_BASE is near enough to SDA_BASE. */
12550 if (accu < FAG_THRESHOLD
12551 || !nds32_fag_mark_relax (link_info, abfd, best_fag,
12552 internal_relocs, irelend))
12553 {
12554 /* Not worth to do fp-as-gp. */
12555 begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12556 begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12557 irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12558 irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12559 nds32_fag_free_list (&fag_head);
12560 begin_rel = NULL;
12561 continue;
12562 }
12563
12564 /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
12565 so we use it to record the distance to the reloction of best
12566 fp-base. */
12567 dist = best_fag->relas[0] - begin_rel;
12568 BFD_ASSERT (dist > 0 && dist < 0xffffff);
12569 /* Use high 16 bits of addend to record the _FP_BASE_ matched
12570 relocation. And get the base value when relocating. */
12571 begin_rel->r_addend &= (0x1 << 16) - 1;
12572 begin_rel->r_addend |= dist << 16;
12573
12574 nds32_fag_free_list (&fag_head);
12575 begin_rel = NULL;
12576 }
12577
12578 if (begin_rel == NULL || ifc_inside)
12579 /* Skip if we are not in the region of fp-as-gp. */
12580 continue;
12581
12582 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA
12583 || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA)
12584 {
12585 bfd_vma addr;
12586 uint32_t insn;
12587
12588 /* A gp-relative access is found. Insert it to the fag-list. */
12589
12590 /* Rt is necessary an RT3, so it can be converted to lwi37.fp. */
12591 insn = bfd_getb32 (contents + irel->r_offset);
12592 if (!N32_IS_RT3 (insn))
12593 continue;
12594
12595 addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
12596 nds32_fag_insert (&fag_head, addr, irel);
12597 }
12598 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA)
12599 {
12600 begin_rel = NULL;
12601 }
12602 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12603 || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
12604 {
12605 /* Suppress fp as gp when encounter ifc. */
12606 ifc_inside = TRUE;
12607 }
12608 }
12609
12610 return TRUE;
12611 }
12612
12613 /* Remove unused `la $fp, _FD_BASE_' instruction. */
12614
12615 static bfd_boolean
12616 nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec,
12617 Elf_Internal_Rela *internal_relocs,
12618 Elf_Internal_Rela *irelend)
12619 {
12620 Elf_Internal_Rela *irel;
12621 Elf_Internal_Shdr *symtab_hdr;
12622 bfd_byte *contents = NULL;
12623 nds32_elf_blank_t *relax_blank_list = NULL;
12624 bfd_boolean result = TRUE;
12625 bfd_boolean unused_region = FALSE;
12626
12627 /*
12628 NOTE: Disable fp-as-gp if we encounter ifcall relocations.
12629 * R_NDS32_17IFC_PCREL_RELA
12630 * R_NDS32_10IFCU_PCREL_RELA
12631
12632 CASE??????????????
12633 */
12634
12635 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12636 nds32_get_section_contents (abfd, sec, &contents, TRUE);
12637
12638 for (irel = internal_relocs; irel < irelend; irel++)
12639 {
12640 /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
12641 we marked to in previous pass.
12642 DO NOT scan relocations again, since we've alreadly decided it
12643 and set the flag. */
12644 const char *syname;
12645 int syndx;
12646 uint32_t insn;
12647
12648 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12649 && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12650 unused_region = TRUE;
12651 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12652 && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12653 unused_region = FALSE;
12654
12655 /* We're not in the region. */
12656 if (!unused_region)
12657 continue;
12658
12659 /* _FP_BASE_ must be a GLOBAL symbol. */
12660 syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
12661 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
12662 continue;
12663
12664 /* The symbol name must be _FP_BASE_. */
12665 syname = elf_sym_hashes (abfd)[syndx]->root.root.string;
12666 if (strcmp (syname, FP_BASE_NAME) != 0)
12667 continue;
12668
12669 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA)
12670 {
12671 /* addi.gp $fp, -256 */
12672 insn = bfd_getb32 (contents + irel->r_offset);
12673 if (insn != INSN_ADDIGP_TO_FP)
12674 continue;
12675 }
12676 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA)
12677 {
12678 /* addi $fp, $gp, -256 */
12679 insn = bfd_getb32 (contents + irel->r_offset);
12680 if (insn != INSN_ADDI_GP_TO_FP)
12681 continue;
12682 }
12683 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
12684 {
12685 /* movi $fp, FP_BASE */
12686 insn = bfd_getb32 (contents + irel->r_offset);
12687 if (insn != INSN_MOVI_TO_FP)
12688 continue;
12689 }
12690 else
12691 continue;
12692
12693 /* We got here because a FP_BASE instruction is found. */
12694 if (!insert_nds32_elf_blank_recalc_total
12695 (&relax_blank_list, irel->r_offset, 4))
12696 goto error_return;
12697 }
12698
12699 finish:
12700 if (relax_blank_list)
12701 {
12702 nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12703 relax_blank_list = NULL;
12704 }
12705 return result;
12706
12707 error_return:
12708 result = FALSE;
12709 goto finish;
12710 }
12711
12712 /* This is a version of bfd_generic_get_relocated_section_contents.
12713 We need this variety because relaxation will modify the dwarf
12714 infomation. When there is undefined symbol reference error mesage,
12715 linker need to dump line number where the symbol be used. However
12716 the address is be relaxed, it can not get the original dwarf contents.
12717 The variety only modify function call for reading in the section. */
12718
12719 static bfd_byte *
12720 nds32_elf_get_relocated_section_contents (bfd *abfd,
12721 struct bfd_link_info *link_info,
12722 struct bfd_link_order *link_order,
12723 bfd_byte *data,
12724 bfd_boolean relocatable,
12725 asymbol **symbols)
12726 {
12727 bfd *input_bfd = link_order->u.indirect.section->owner;
12728 asection *input_section = link_order->u.indirect.section;
12729 long reloc_size;
12730 arelent **reloc_vector;
12731 long reloc_count;
12732
12733 reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
12734 if (reloc_size < 0)
12735 return NULL;
12736
12737 /* Read in the section. */
12738 if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE))
12739 return NULL;
12740
12741 if (reloc_size == 0)
12742 return data;
12743
12744 reloc_vector = (arelent **) bfd_malloc (reloc_size);
12745 if (reloc_vector == NULL)
12746 return NULL;
12747
12748 reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
12749 reloc_vector, symbols);
12750 if (reloc_count < 0)
12751 goto error_return;
12752
12753 if (reloc_count > 0)
12754 {
12755 arelent **parent;
12756 for (parent = reloc_vector; *parent != NULL; parent++)
12757 {
12758 char *error_message = NULL;
12759 asymbol *symbol;
12760 bfd_reloc_status_type r;
12761
12762 symbol = *(*parent)->sym_ptr_ptr;
12763 if (symbol->section && discarded_section (symbol->section))
12764 {
12765 bfd_byte *p;
12766 static reloc_howto_type none_howto
12767 = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
12768 "unused", FALSE, 0, 0, FALSE);
12769
12770 p = data + (*parent)->address * bfd_octets_per_byte (input_bfd);
12771 _bfd_clear_contents ((*parent)->howto, input_bfd, input_section,
12772 p);
12773 (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
12774 (*parent)->addend = 0;
12775 (*parent)->howto = &none_howto;
12776 r = bfd_reloc_ok;
12777 }
12778 else
12779 r = bfd_perform_relocation (input_bfd, *parent, data,
12780 input_section,
12781 relocatable ? abfd : NULL,
12782 &error_message);
12783
12784 if (relocatable)
12785 {
12786 asection *os = input_section->output_section;
12787
12788 /* A partial link, so keep the relocs. */
12789 os->orelocation[os->reloc_count] = *parent;
12790 os->reloc_count++;
12791 }
12792
12793 if (r != bfd_reloc_ok)
12794 {
12795 switch (r)
12796 {
12797 case bfd_reloc_undefined:
12798 (*link_info->callbacks->undefined_symbol)
12799 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
12800 input_bfd, input_section, (*parent)->address, TRUE);
12801 break;
12802 case bfd_reloc_dangerous:
12803 BFD_ASSERT (error_message != NULL);
12804 (*link_info->callbacks->reloc_dangerous)
12805 (link_info, error_message,
12806 input_bfd, input_section, (*parent)->address);
12807 break;
12808 case bfd_reloc_overflow:
12809 (*link_info->callbacks->reloc_overflow)
12810 (link_info, NULL,
12811 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
12812 (*parent)->howto->name, (*parent)->addend,
12813 input_bfd, input_section, (*parent)->address);
12814 break;
12815 case bfd_reloc_outofrange:
12816 /* PR ld/13730:
12817 This error can result when processing some partially
12818 complete binaries. Do not abort, but issue an error
12819 message instead. */
12820 link_info->callbacks->einfo
12821 /* xgettext:c-format */
12822 (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"),
12823 abfd, input_section, * parent);
12824 goto error_return;
12825
12826 default:
12827 abort ();
12828 break;
12829 }
12830 }
12831 }
12832 }
12833
12834 free (reloc_vector);
12835 return data;
12836
12837 error_return:
12838 free (reloc_vector);
12839 return NULL;
12840 }
12841 \f
12842 /* Link-time IFC relaxation.
12843 In this optimization, we chains jump instructions
12844 of the same destination with ifcall. */
12845
12846
12847 /* List to save jal and j relocation. */
12848 struct elf_nds32_ifc_symbol_entry
12849 {
12850 asection *sec;
12851 struct elf_link_hash_entry *h;
12852 struct elf_nds32_ifc_irel_list *irel_head;
12853 unsigned long insn;
12854 int times;
12855 int enable; /* Apply ifc. */
12856 int ex9_enable; /* Apply ifc after ex9. */
12857 struct elf_nds32_ifc_symbol_entry *next;
12858 };
12859
12860 struct elf_nds32_ifc_irel_list
12861 {
12862 Elf_Internal_Rela *irel;
12863 asection *sec;
12864 bfd_vma addr;
12865 /* If this is set, then it is the last instruction for
12866 ifc-chain, so it must be keep for the actual branching. */
12867 int keep;
12868 struct elf_nds32_ifc_irel_list *next;
12869 };
12870
12871 static struct elf_nds32_ifc_symbol_entry *ifc_symbol_head = NULL;
12872
12873 /* Insert symbol of jal and j for ifc. */
12874
12875 static void
12876 nds32_elf_ifc_insert_symbol (asection *sec,
12877 struct elf_link_hash_entry *h,
12878 Elf_Internal_Rela *irel,
12879 unsigned long insn)
12880 {
12881 struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
12882
12883 /* Check there is target of existing entry the same as the new one. */
12884 while (ptr != NULL)
12885 {
12886 if (((h == NULL && ptr->sec == sec
12887 && ELF32_R_SYM (ptr->irel_head->irel->r_info) == ELF32_R_SYM (irel->r_info)
12888 && ptr->irel_head->irel->r_addend == irel->r_addend)
12889 || h != NULL)
12890 && ptr->h == h
12891 && ptr->insn == insn)
12892 {
12893 /* The same target exist, so insert into list. */
12894 struct elf_nds32_ifc_irel_list *irel_list = ptr->irel_head;
12895
12896 while (irel_list->next != NULL)
12897 irel_list = irel_list->next;
12898 irel_list->next = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
12899 irel_list = irel_list->next;
12900 irel_list->irel = irel;
12901 irel_list->keep = 1;
12902
12903 if (h == NULL)
12904 irel_list->sec = NULL;
12905 else
12906 irel_list->sec = sec;
12907 irel_list->next = NULL;
12908 return;
12909 }
12910 if (ptr->next == NULL)
12911 break;
12912 ptr = ptr->next;
12913 }
12914
12915 /* There is no same target entry, so build a new one. */
12916 if (ifc_symbol_head == NULL)
12917 {
12918 ifc_symbol_head = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
12919 ptr = ifc_symbol_head;
12920 }
12921 else
12922 {
12923 ptr->next = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
12924 ptr = ptr->next;
12925 }
12926
12927 ptr->h = h;
12928 ptr->irel_head = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
12929 ptr->irel_head->irel = irel;
12930 ptr->insn = insn;
12931 ptr->irel_head->keep = 1;
12932
12933 if (h == NULL)
12934 {
12935 /* Local symbols. */
12936 ptr->sec = sec;
12937 ptr->irel_head->sec = NULL;
12938 }
12939 else
12940 {
12941 /* Global symbol. */
12942 ptr->sec = NULL;
12943 ptr->irel_head->sec = sec;
12944 }
12945
12946 ptr->irel_head->next = NULL;
12947 ptr->times = 0;
12948 ptr->enable = 0;
12949 ptr->ex9_enable = 0;
12950 ptr->next = NULL;
12951 }
12952
12953 /* Gather all jal and j instructions. */
12954
12955 static bfd_boolean
12956 nds32_elf_ifc_calc (struct bfd_link_info *info,
12957 bfd *abfd, asection *sec)
12958 {
12959 Elf_Internal_Rela *internal_relocs;
12960 Elf_Internal_Rela *irelend;
12961 Elf_Internal_Rela *irel;
12962 Elf_Internal_Shdr *symtab_hdr;
12963 bfd_byte *contents = NULL;
12964 uint32_t insn, insn_with_reg;
12965 unsigned long r_symndx;
12966 struct elf_link_hash_entry *h;
12967 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
12968 struct elf_nds32_link_hash_table *table;
12969 bfd_boolean ifc_loop_aware;
12970
12971 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
12972 TRUE /* keep_memory */);
12973 irelend = internal_relocs + sec->reloc_count;
12974 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12975
12976 /* Check if the object enable ifc. */
12977 irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
12978 R_NDS32_RELAX_ENTRY);
12979
12980 if (irel == NULL
12981 || irel >= irelend
12982 || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
12983 || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
12984 && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG)))
12985 return TRUE;
12986
12987 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
12988 return FALSE;
12989
12990 table = nds32_elf_hash_table (info);
12991 ifc_loop_aware = table->ifc_loop_aware;
12992 while (irel != NULL && irel < irelend)
12993 {
12994 /* Traverse all relocation and gather all of them to build the list. */
12995
12996 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN)
12997 {
12998 if (ifc_loop_aware == 1
12999 && (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0)
13000 {
13001 /* Check the region if loop or not. If it is true and
13002 ifc-loop-aware is true, ignore the region till region end. */
13003 while (irel != NULL
13004 && irel < irelend
13005 && (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
13006 || (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0))
13007 irel++;
13008 }
13009 }
13010
13011 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
13012 {
13013 insn = bfd_getb32 (contents + irel->r_offset);
13014 nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
13015 r_symndx = ELF32_R_SYM (irel->r_info);
13016 if (r_symndx < symtab_hdr->sh_info)
13017 {
13018 /* Local symbol. */
13019 nds32_elf_ifc_insert_symbol (sec, NULL, irel, insn_with_reg);
13020 }
13021 else
13022 {
13023 /* External symbol. */
13024 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
13025 nds32_elf_ifc_insert_symbol (sec, h, irel, insn_with_reg);
13026 }
13027 }
13028 irel++;
13029 }
13030 return TRUE;
13031 }
13032
13033 /* Determine whether j and jal should be substituted. */
13034
13035 static void
13036 nds32_elf_ifc_filter (struct bfd_link_info *info)
13037 {
13038 struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13039 struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13040 struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13041 struct elf_nds32_link_hash_table *table;
13042 int target_optimize;
13043 bfd_vma address;
13044
13045 table = nds32_elf_hash_table (info);
13046 target_optimize = table->target_optimize;
13047 while (ptr)
13048 {
13049 irel_ptr = ptr->irel_head;
13050 if (ptr->h == NULL)
13051 {
13052 /* Local symbol. */
13053 irel_keeper = irel_ptr;
13054 while (irel_ptr && irel_ptr->next)
13055 {
13056 /* Check there is jump target can be used. */
13057 if ((irel_ptr->next->irel->r_offset
13058 - irel_keeper->irel->r_offset) > 1022)
13059 irel_keeper = irel_ptr->next;
13060 else
13061 {
13062 ptr->enable = 1;
13063 irel_ptr->keep = 0;
13064 }
13065 irel_ptr = irel_ptr->next;
13066 }
13067 }
13068 else
13069 {
13070 /* Global symbol. */
13071 /* We have to get the absolute address and decide
13072 whether to keep it or not. */
13073 while (irel_ptr)
13074 {
13075 address = (irel_ptr->irel->r_offset
13076 + irel_ptr->sec->output_section->vma
13077 + irel_ptr->sec->output_offset);
13078 irel_ptr->addr = address;
13079 irel_ptr = irel_ptr->next;
13080 }
13081
13082 irel_ptr = ptr->irel_head;
13083 while (irel_ptr)
13084 {
13085 /* Sort by address. */
13086 struct elf_nds32_ifc_irel_list *irel_dest = irel_ptr;
13087 struct elf_nds32_ifc_irel_list *irel_temp = irel_ptr;
13088 struct elf_nds32_ifc_irel_list *irel_ptr_prev = NULL;
13089 struct elf_nds32_ifc_irel_list *irel_dest_prev = NULL;
13090
13091 /* Get the smallest one. */
13092 while (irel_temp->next)
13093 {
13094 if (irel_temp->next->addr < irel_dest->addr)
13095 {
13096 irel_dest_prev = irel_temp;
13097 irel_dest = irel_temp->next;
13098 }
13099 irel_temp = irel_temp->next;
13100 }
13101
13102 if (irel_dest != irel_ptr)
13103 {
13104 if (irel_ptr_prev)
13105 irel_ptr_prev->next = irel_dest;
13106 if (irel_dest_prev)
13107 irel_dest_prev->next = irel_ptr;
13108 irel_temp = irel_ptr->next;
13109 irel_ptr->next = irel_dest->next;
13110 irel_dest->next = irel_temp;
13111 }
13112 irel_ptr_prev = irel_ptr;
13113 irel_ptr = irel_ptr->next;
13114 }
13115
13116 irel_ptr = ptr->irel_head;
13117 irel_keeper = irel_ptr;
13118 while (irel_ptr && irel_ptr->next)
13119 {
13120 if ((irel_ptr->next->addr - irel_keeper->addr) > 1022)
13121 irel_keeper = irel_ptr->next;
13122 else
13123 {
13124 ptr->enable = 1;
13125 irel_ptr->keep = 0;
13126 }
13127 irel_ptr = irel_ptr->next;
13128 }
13129 }
13130
13131 /* Ex9 enable. Reserve it for ex9. */
13132 if ((target_optimize & NDS32_RELAX_EX9_ON)
13133 && ptr->irel_head != irel_keeper)
13134 ptr->enable = 0;
13135 ptr = ptr->next;
13136 }
13137 }
13138
13139 /* Determine whether j and jal should be substituted after ex9 done. */
13140
13141 static void
13142 nds32_elf_ifc_filter_after_ex9 (void)
13143 {
13144 struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13145 struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13146
13147 while (ptr)
13148 {
13149 if (ptr->enable == 0)
13150 {
13151 /* Check whether ifc is applied or not. */
13152 irel_ptr = ptr->irel_head;
13153 ptr->ex9_enable = 1;
13154 while (irel_ptr)
13155 {
13156 if (ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_TRAN)
13157 {
13158 /* Ex9 already. */
13159 ptr->ex9_enable = 0;
13160 break;
13161 }
13162 irel_ptr = irel_ptr->next;
13163 }
13164 }
13165 ptr = ptr->next;
13166 }
13167 }
13168
13169 /* Wrapper to do ifc relaxation. */
13170
13171 bfd_boolean
13172 nds32_elf_ifc_finish (struct bfd_link_info *info)
13173 {
13174 int relax_status;
13175 struct elf_nds32_link_hash_table *table;
13176
13177 table = nds32_elf_hash_table (info);
13178 relax_status = table->relax_status;
13179
13180 if (!(relax_status & NDS32_RELAX_JUMP_IFC_DONE))
13181 nds32_elf_ifc_filter (info);
13182 else
13183 nds32_elf_ifc_filter_after_ex9 ();
13184
13185 if (!nds32_elf_ifc_replace (info))
13186 return FALSE;
13187
13188 if (table)
13189 table->relax_status |= NDS32_RELAX_JUMP_IFC_DONE;
13190 return TRUE;
13191 }
13192
13193 /* Traverse the result of ifc filter and replace it with ifcall9. */
13194
13195 static bfd_boolean
13196 nds32_elf_ifc_replace (struct bfd_link_info *info)
13197 {
13198 struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13199 struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13200 nds32_elf_blank_t *relax_blank_list = NULL;
13201 bfd_byte *contents = NULL;
13202 Elf_Internal_Rela *internal_relocs;
13203 Elf_Internal_Rela *irel;
13204 Elf_Internal_Rela *irelend;
13205 unsigned short insn16 = INSN_IFCALL9;
13206 struct elf_nds32_link_hash_table *table;
13207 int relax_status;
13208
13209 table = nds32_elf_hash_table (info);
13210 relax_status = table->relax_status;
13211
13212 while (ptr)
13213 {
13214 /* Traverse the ifc gather list, and replace the
13215 filter entries by ifcall9. */
13216 if ((!(relax_status & NDS32_RELAX_JUMP_IFC_DONE) && ptr->enable == 1)
13217 || ((relax_status & NDS32_RELAX_JUMP_IFC_DONE)
13218 && ptr->ex9_enable == 1))
13219 {
13220 irel_ptr = ptr->irel_head;
13221 if (ptr->h == NULL)
13222 {
13223 /* Local symbol. */
13224 internal_relocs = _bfd_elf_link_read_relocs
13225 (ptr->sec->owner, ptr->sec, NULL, NULL, TRUE /* keep_memory */);
13226 irelend = internal_relocs + ptr->sec->reloc_count;
13227
13228 if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13229 &contents, TRUE))
13230 return FALSE;
13231
13232 while (irel_ptr)
13233 {
13234 if (irel_ptr->keep == 0 && irel_ptr->next)
13235 {
13236 /* The one can be replaced. We have to check whether
13237 there is any alignment point in the region. */
13238 irel = irel_ptr->irel;
13239 while (((irel_ptr->next->keep == 0
13240 && irel < irel_ptr->next->irel)
13241 || (irel_ptr->next->keep == 1 && irel < irelend))
13242 && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13243 && (irel->r_addend & 0x1f) == 2))
13244 irel++;
13245 if (irel >= irelend
13246 || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13247 && (irel->r_addend & 0x1f) == 2
13248 && ((irel->r_offset - get_nds32_elf_blank_total
13249 (&relax_blank_list, irel->r_offset, 1))
13250 & 0x02) == 0))
13251 {
13252 /* Replace by ifcall9. */
13253 bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13254 if (!insert_nds32_elf_blank_recalc_total
13255 (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13256 return FALSE;
13257 irel_ptr->irel->r_info =
13258 ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13259 R_NDS32_10IFCU_PCREL_RELA);
13260 }
13261 }
13262 irel_ptr = irel_ptr->next;
13263 }
13264
13265 /* Delete the redundant code. */
13266 if (relax_blank_list)
13267 {
13268 nds32_elf_relax_delete_blanks (ptr->sec->owner, ptr->sec,
13269 relax_blank_list);
13270 relax_blank_list = NULL;
13271 }
13272 }
13273 else
13274 {
13275 /* Global symbol. */
13276 while (irel_ptr)
13277 {
13278 if (irel_ptr->keep == 0 && irel_ptr->next)
13279 {
13280 /* The one can be replaced, and we have to check
13281 whether there is any alignment point in the region. */
13282 internal_relocs = _bfd_elf_link_read_relocs
13283 (irel_ptr->sec->owner, irel_ptr->sec, NULL, NULL,
13284 TRUE /* keep_memory */);
13285 irelend = internal_relocs + irel_ptr->sec->reloc_count;
13286 if (!nds32_get_section_contents (irel_ptr->sec->owner,
13287 irel_ptr->sec, &contents,
13288 TRUE))
13289 return FALSE;
13290
13291 irel = irel_ptr->irel;
13292 while (((irel_ptr->sec == irel_ptr->next->sec
13293 && irel_ptr->next->keep == 0
13294 && irel < irel_ptr->next->irel)
13295 || ((irel_ptr->sec != irel_ptr->next->sec
13296 || irel_ptr->next->keep == 1)
13297 && irel < irelend))
13298 && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13299 && (irel->r_addend & 0x1f) == 2))
13300 irel++;
13301 if (irel >= irelend
13302 || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13303 && (irel->r_addend & 0x1f) == 2
13304 && ((irel->r_offset
13305 - get_nds32_elf_blank_total (&relax_blank_list,
13306 irel->r_offset, 1)) & 0x02) == 0))
13307 {
13308 /* Replace by ifcall9. */
13309 bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13310 if (!insert_nds32_elf_blank_recalc_total
13311 (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13312 return FALSE;
13313
13314 /* Delete the redundant code, and clear the relocation. */
13315 nds32_elf_relax_delete_blanks (irel_ptr->sec->owner,
13316 irel_ptr->sec,
13317 relax_blank_list);
13318 irel_ptr->irel->r_info =
13319 ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13320 R_NDS32_10IFCU_PCREL_RELA);
13321 relax_blank_list = NULL;
13322 }
13323 }
13324
13325 irel_ptr = irel_ptr->next;
13326 }
13327 }
13328 }
13329 ptr = ptr->next;
13330 }
13331
13332 return TRUE;
13333 }
13334
13335 /* Relocate ifcall. */
13336
13337 static bfd_boolean
13338 nds32_elf_ifc_reloc (void)
13339 {
13340 struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13341 struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13342 struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13343 bfd_vma relocation, address;
13344 unsigned short insn16;
13345 bfd_byte *contents = NULL;
13346 static bfd_boolean done = FALSE;
13347
13348 if (done)
13349 return TRUE;
13350
13351 done = TRUE;
13352
13353 while (ptr)
13354 {
13355 /* Check the entry is enable ifcall. */
13356 if (ptr->enable == 1 || ptr->ex9_enable == 1)
13357 {
13358 /* Get the reserve jump. */
13359 irel_ptr = ptr->irel_head;
13360 while (irel_ptr)
13361 {
13362 if (irel_ptr->keep == 1)
13363 {
13364 irel_keeper = irel_ptr;
13365 break;
13366 }
13367 irel_ptr = irel_ptr->next;
13368 }
13369
13370 irel_ptr = ptr->irel_head;
13371 if (ptr->h == NULL)
13372 {
13373 /* Local symbol. */
13374 if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13375 &contents, TRUE))
13376 return FALSE;
13377
13378 while (irel_ptr)
13379 {
13380 if (irel_ptr->keep == 0
13381 && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13382 {
13383 relocation = irel_keeper->irel->r_offset;
13384 relocation = relocation - irel_ptr->irel->r_offset;
13385 while (irel_keeper && relocation > 1022)
13386 {
13387 irel_keeper = irel_keeper->next;
13388 if (irel_keeper && irel_keeper->keep == 1)
13389 {
13390 relocation = irel_keeper->irel->r_offset;
13391 relocation = relocation - irel_ptr->irel->r_offset;
13392 }
13393 }
13394 if (relocation > 1022)
13395 {
13396 /* Double check. */
13397 irel_keeper = ptr->irel_head;
13398 while (irel_keeper)
13399 {
13400 if (irel_keeper->keep == 1)
13401 {
13402 relocation = irel_keeper->irel->r_offset;
13403 relocation = relocation - irel_ptr->irel->r_offset;
13404 }
13405 if (relocation <= 1022)
13406 break;
13407 irel_keeper = irel_keeper->next;
13408 }
13409 if (!irel_keeper)
13410 return FALSE;
13411 }
13412 irel_ptr->irel->r_info =
13413 ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13414 R_NDS32_NONE);
13415 insn16 = INSN_IFCALL9 | (relocation >> 1);
13416 bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13417 }
13418 irel_ptr = irel_ptr->next;
13419 }
13420 }
13421 else
13422 {
13423 /* Global symbol. */
13424 while (irel_ptr)
13425 {
13426 if (irel_ptr->keep == 0
13427 && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13428 {
13429 /* Get the distance between ifcall and jump. */
13430 relocation = (irel_keeper->irel->r_offset
13431 + irel_keeper->sec->output_section->vma
13432 + irel_keeper->sec->output_offset);
13433 address = (irel_ptr->irel->r_offset
13434 + irel_ptr->sec->output_section->vma
13435 + irel_ptr->sec->output_offset);
13436 relocation = relocation - address;
13437
13438 /* The distance is over ragne, find callee again. */
13439 while (irel_keeper && relocation > 1022)
13440 {
13441 irel_keeper = irel_keeper->next;
13442 if (irel_keeper && irel_keeper->keep ==1)
13443 {
13444 relocation = (irel_keeper->irel->r_offset
13445 + irel_keeper->sec->output_section->vma
13446 + irel_keeper->sec->output_offset);
13447 relocation = relocation - address;
13448 }
13449 }
13450
13451 if (relocation > 1022)
13452 {
13453 /* Double check. */
13454 irel_keeper = ptr->irel_head;
13455 while (irel_keeper)
13456 {
13457 if (irel_keeper->keep == 1)
13458 {
13459
13460 relocation = (irel_keeper->irel->r_offset
13461 + irel_keeper->sec->output_section->vma
13462 + irel_keeper->sec->output_offset);
13463 relocation = relocation - address;
13464 }
13465 if (relocation <= 1022)
13466 break;
13467 irel_keeper = irel_keeper->next;
13468 }
13469 if (!irel_keeper)
13470 return FALSE;
13471 }
13472 if (!nds32_get_section_contents
13473 (irel_ptr->sec->owner, irel_ptr->sec, &contents, TRUE))
13474 return FALSE;
13475 insn16 = INSN_IFCALL9 | (relocation >> 1);
13476 bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13477 irel_ptr->irel->r_info =
13478 ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13479 R_NDS32_NONE);
13480 }
13481 irel_ptr =irel_ptr->next;
13482 }
13483 }
13484 }
13485 ptr = ptr->next;
13486 }
13487
13488 return TRUE;
13489 }
13490
13491 /* End of IFC relaxation. */
13492 \f
13493 /* EX9 Instruction Table Relaxation. */
13494
13495 /* Global hash list. */
13496 struct elf_link_hash_entry_list
13497 {
13498 struct elf_link_hash_entry *h;
13499 struct elf_link_hash_entry_list *next;
13500 };
13501
13502 /* Save different destination but same insn. */
13503 struct elf_link_hash_entry_mul_list
13504 {
13505 /* Global symbol times. */
13506 int times;
13507 /* Save relocation for each global symbol but useful?? */
13508 Elf_Internal_Rela *irel;
13509 /* For sethi, two sethi may have the same high-part but different low-parts. */
13510 Elf_Internal_Rela rel_backup;
13511 struct elf_link_hash_entry_list *h_list;
13512 struct elf_link_hash_entry_mul_list *next;
13513 };
13514
13515 /* Instruction hash table. */
13516 struct elf_nds32_code_hash_entry
13517 {
13518 struct bfd_hash_entry root;
13519 int times;
13520 /* For insn that can use relocation or constant ex: sethi. */
13521 int const_insn;
13522 asection *sec;
13523 struct elf_link_hash_entry_mul_list *m_list;
13524 /* Using r_addend. */
13525 Elf_Internal_Rela *irel;
13526 /* Using r_info. */
13527 Elf_Internal_Rela rel_backup;
13528 };
13529
13530 /* Instruction count list. */
13531 struct elf_nds32_insn_times_entry
13532 {
13533 const char *string;
13534 int times;
13535 int order;
13536 asection *sec;
13537 struct elf_link_hash_entry_mul_list *m_list;
13538 Elf_Internal_Rela *irel;
13539 Elf_Internal_Rela rel_backup;
13540 struct elf_nds32_insn_times_entry *next;
13541 };
13542
13543 /* J and JAL symbol list. */
13544 struct elf_nds32_symbol_entry
13545 {
13546 char *string;
13547 unsigned long insn;
13548 struct elf_nds32_symbol_entry *next;
13549 };
13550
13551 /* Relocation list. */
13552 struct elf_nds32_irel_entry
13553 {
13554 Elf_Internal_Rela *irel;
13555 struct elf_nds32_irel_entry *next;
13556 };
13557
13558 /* ex9.it insn need to be fixed. */
13559 struct elf_nds32_ex9_refix
13560 {
13561 Elf_Internal_Rela *irel;
13562 asection *sec;
13563 struct elf_link_hash_entry *h;
13564 int order;
13565 struct elf_nds32_ex9_refix *next;
13566 };
13567
13568 static struct bfd_hash_table ex9_code_table;
13569 static struct elf_nds32_insn_times_entry *ex9_insn_head = NULL;
13570 static struct elf_nds32_ex9_refix *ex9_refix_head = NULL;
13571
13572 /* EX9 hash function. */
13573
13574 static struct bfd_hash_entry *
13575 nds32_elf_code_hash_newfunc (struct bfd_hash_entry *entry,
13576 struct bfd_hash_table *table,
13577 const char *string)
13578 {
13579 struct elf_nds32_code_hash_entry *ret;
13580
13581 /* Allocate the structure if it has not already been allocated by a
13582 subclass. */
13583 if (entry == NULL)
13584 {
13585 entry = (struct bfd_hash_entry *)
13586 bfd_hash_allocate (table, sizeof (*ret));
13587 if (entry == NULL)
13588 return entry;
13589 }
13590
13591 /* Call the allocation method of the superclass. */
13592 entry = bfd_hash_newfunc (entry, table, string);
13593 if (entry == NULL)
13594 return entry;
13595
13596 ret = (struct elf_nds32_code_hash_entry*) entry;
13597 ret->times = 0;
13598 ret->const_insn = 0;
13599 ret->m_list = NULL;
13600 ret->sec = NULL;
13601 ret->irel = NULL;
13602 return &ret->root;
13603 }
13604
13605 /* Insert ex9 entry
13606 this insert must be stable sorted by times. */
13607
13608 static void
13609 nds32_elf_ex9_insert_entry (struct elf_nds32_insn_times_entry *ptr)
13610 {
13611 struct elf_nds32_insn_times_entry *temp;
13612 struct elf_nds32_insn_times_entry *temp2;
13613
13614 if (ex9_insn_head == NULL)
13615 {
13616 ex9_insn_head = ptr;
13617 ptr->next = NULL;
13618 }
13619 else
13620 {
13621 temp = ex9_insn_head;
13622 temp2 = ex9_insn_head;
13623 while (temp->next &&
13624 (temp->next->times >= ptr->times
13625 || temp->times == -1))
13626 {
13627 if (temp->times == -1)
13628 temp2 = temp;
13629 temp = temp->next;
13630 }
13631 if (ptr->times > temp->times && temp->times != -1)
13632 {
13633 ptr->next = temp;
13634 if (temp2->times == -1)
13635 temp2->next = ptr;
13636 else
13637 ex9_insn_head = ptr;
13638 }
13639 else if (temp->next == NULL)
13640 {
13641 temp->next = ptr;
13642 ptr->next = NULL;
13643 }
13644 else
13645 {
13646 ptr->next = temp->next;
13647 temp->next = ptr;
13648 }
13649 }
13650 }
13651
13652 /* Examine each insn times in hash table.
13653 Handle multi-link hash entry.
13654
13655 TODO: This function doesn't assign so much info since it is fake. */
13656
13657 static int
13658 nds32_elf_examine_insn_times (struct elf_nds32_code_hash_entry *h)
13659 {
13660 struct elf_nds32_insn_times_entry *ptr;
13661 int times;
13662
13663 if (h->m_list == NULL)
13664 {
13665 /* Local symbol insn or insn without relocation. */
13666 if (h->times < 3)
13667 return TRUE;
13668
13669 ptr = (struct elf_nds32_insn_times_entry *)
13670 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13671 ptr->times = h->times;
13672 ptr->string = h->root.string;
13673 ptr->m_list = NULL;
13674 ptr->sec = h->sec;
13675 ptr->irel = h->irel;
13676 ptr->rel_backup = h->rel_backup;
13677 nds32_elf_ex9_insert_entry (ptr);
13678 }
13679 else
13680 {
13681 /* Global symbol insn. */
13682 /* Only sethi insn has multiple m_list. */
13683 struct elf_link_hash_entry_mul_list *m_list = h->m_list;
13684
13685 times = 0;
13686 while (m_list)
13687 {
13688 times += m_list->times;
13689 m_list = m_list->next;
13690 }
13691 if (times >= 3)
13692 {
13693 m_list = h->m_list;
13694 ptr = (struct elf_nds32_insn_times_entry *)
13695 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13696 ptr->times = times; /* Use the total times. */
13697 ptr->string = h->root.string;
13698 ptr->m_list = m_list;
13699 ptr->sec = h->sec;
13700 ptr->irel = m_list->irel;
13701 ptr->rel_backup = m_list->rel_backup;
13702 nds32_elf_ex9_insert_entry (ptr);
13703 }
13704 if (h->const_insn == 1)
13705 {
13706 /* sethi with constant value. */
13707 if (h->times < 3)
13708 return TRUE;
13709
13710 ptr = (struct elf_nds32_insn_times_entry *)
13711 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13712 ptr->times = h->times;
13713 ptr->string = h->root.string;
13714 ptr->m_list = NULL;
13715 ptr->sec = NULL;
13716 ptr->irel = NULL;
13717 ptr->rel_backup = h->rel_backup;
13718 nds32_elf_ex9_insert_entry (ptr);
13719 }
13720 }
13721 return TRUE;
13722 }
13723
13724 /* Count each insn times in hash table.
13725 Handle multi-link hash entry. */
13726
13727 static int
13728 nds32_elf_count_insn_times (struct elf_nds32_code_hash_entry *h)
13729 {
13730 int reservation, times;
13731 unsigned long relocation, min_relocation;
13732 struct elf_nds32_insn_times_entry *ptr;
13733
13734 if (h->m_list == NULL)
13735 {
13736 /* Local symbol insn or insn without relocation. */
13737 if (h->times < 3)
13738 return TRUE;
13739 ptr = (struct elf_nds32_insn_times_entry *)
13740 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13741 ptr->times = h->times;
13742 ptr->string = h->root.string;
13743 ptr->m_list = NULL;
13744 ptr->sec = h->sec;
13745 ptr->irel = h->irel;
13746 ptr->rel_backup = h->rel_backup;
13747 nds32_elf_ex9_insert_entry (ptr);
13748 }
13749 else
13750 {
13751 /* Global symbol insn. */
13752 /* Only sethi insn has multiple m_list. */
13753 struct elf_link_hash_entry_mul_list *m_list = h->m_list;
13754
13755 if (ELF32_R_TYPE (m_list->rel_backup.r_info) == R_NDS32_HI20_RELA
13756 && m_list->next != NULL)
13757 {
13758 /* Sethi insn has different symbol or addend but has same hi20. */
13759 times = 0;
13760 reservation = 1;
13761 relocation = 0;
13762 min_relocation = 0xffffffff;
13763 while (m_list)
13764 {
13765 /* Get the minimum sethi address
13766 and calculate how many entry the sethi-list have to use. */
13767 if ((m_list->h_list->h->root.type == bfd_link_hash_defined
13768 || m_list->h_list->h->root.type == bfd_link_hash_defweak)
13769 && (m_list->h_list->h->root.u.def.section != NULL
13770 && m_list->h_list->h->root.u.def.section->output_section != NULL))
13771 {
13772 relocation = (m_list->h_list->h->root.u.def.value +
13773 m_list->h_list->h->root.u.def.section->output_section->vma +
13774 m_list->h_list->h->root.u.def.section->output_offset);
13775 relocation += m_list->irel->r_addend;
13776 }
13777 else
13778 relocation = 0;
13779 if (relocation < min_relocation)
13780 min_relocation = relocation;
13781 times += m_list->times;
13782 m_list = m_list->next;
13783 }
13784 if (min_relocation < ex9_relax_size)
13785 reservation = (min_relocation >> 12) + 1;
13786 else
13787 reservation = (min_relocation >> 12)
13788 - ((min_relocation - ex9_relax_size) >> 12) + 1;
13789 if (reservation < (times / 3))
13790 {
13791 /* Efficient enough to use ex9. */
13792 int i;
13793
13794 for (i = reservation ; i > 0; i--)
13795 {
13796 /* Allocate number of reservation ex9 entry. */
13797 ptr = (struct elf_nds32_insn_times_entry *)
13798 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13799 ptr->times = h->m_list->times / reservation;
13800 ptr->string = h->root.string;
13801 ptr->m_list = h->m_list;
13802 ptr->sec = h->sec;
13803 ptr->irel = h->m_list->irel;
13804 ptr->rel_backup = h->m_list->rel_backup;
13805 nds32_elf_ex9_insert_entry (ptr);
13806 }
13807 }
13808 }
13809 else
13810 {
13811 /* Normal global symbol that means no different address symbol
13812 using same ex9 entry. */
13813 if (m_list->times >= 3)
13814 {
13815 ptr = (struct elf_nds32_insn_times_entry *)
13816 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13817 ptr->times = m_list->times;
13818 ptr->string = h->root.string;
13819 ptr->m_list = h->m_list;
13820 ptr->sec = h->sec;
13821 ptr->irel = h->m_list->irel;
13822 ptr->rel_backup = h->m_list->rel_backup;
13823 nds32_elf_ex9_insert_entry (ptr);
13824 }
13825 }
13826
13827 if (h->const_insn == 1)
13828 {
13829 /* sethi with constant value. */
13830 if (h->times < 3)
13831 return TRUE;
13832
13833 ptr = (struct elf_nds32_insn_times_entry *)
13834 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13835 ptr->times = h->times;
13836 ptr->string = h->root.string;
13837 ptr->m_list = NULL;
13838 ptr->sec = NULL;
13839 ptr->irel = NULL;
13840 ptr->rel_backup = h->rel_backup;
13841 nds32_elf_ex9_insert_entry (ptr);
13842 }
13843 }
13844
13845 return TRUE;
13846 }
13847
13848 /* Hash table traverse function. */
13849
13850 static void
13851 nds32_elf_code_hash_traverse (int (*func) (struct elf_nds32_code_hash_entry*))
13852 {
13853 unsigned int i;
13854
13855 ex9_code_table.frozen = 1;
13856 for (i = 0; i < ex9_code_table.size; i++)
13857 {
13858 struct bfd_hash_entry *p;
13859
13860 for (p = ex9_code_table.table[i]; p != NULL; p = p->next)
13861 if (!func ((struct elf_nds32_code_hash_entry *) p))
13862 goto out;
13863 }
13864 out:
13865 ex9_code_table.frozen = 0;
13866 }
13867
13868
13869 /* Give order number to insn list. */
13870
13871 static void
13872 nds32_elf_order_insn_times (struct bfd_link_info *info)
13873 {
13874 struct elf_nds32_insn_times_entry *ex9_insn;
13875 struct elf_nds32_insn_times_entry *temp = NULL;
13876 struct elf_nds32_link_hash_table *table;
13877 int ex9_limit;
13878 int number = 0;
13879
13880 if (ex9_insn_head == NULL)
13881 return;
13882
13883 /* The max number of entries is 512. */
13884 ex9_insn = ex9_insn_head;
13885 table = nds32_elf_hash_table (info);
13886 ex9_limit = table->ex9_limit;
13887
13888 ex9_insn = ex9_insn_head;
13889
13890 while (ex9_insn != NULL && number < ex9_limit)
13891 {
13892 ex9_insn->order = number;
13893 number++;
13894 temp = ex9_insn;
13895 ex9_insn = ex9_insn->next;
13896 }
13897
13898 if (ex9_insn && temp)
13899 temp->next = NULL;
13900
13901 while (ex9_insn != NULL)
13902 {
13903 /* Free useless entry. */
13904 temp = ex9_insn;
13905 ex9_insn = ex9_insn->next;
13906 free (temp);
13907 }
13908 }
13909
13910 /* Build .ex9.itable section. */
13911
13912 static void
13913 nds32_elf_ex9_build_itable (struct bfd_link_info *link_info)
13914 {
13915 asection *table_sec;
13916 struct elf_nds32_insn_times_entry *ptr;
13917 bfd *it_abfd;
13918 int number = 0;
13919 bfd_byte *contents = NULL;
13920
13921 for (it_abfd = link_info->input_bfds; it_abfd != NULL;
13922 it_abfd = it_abfd->link.next)
13923 {
13924 /* Find the section .ex9.itable, and put all entries into it. */
13925 table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
13926 if (table_sec != NULL)
13927 {
13928 if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
13929 return;
13930
13931 for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
13932 number++;
13933
13934 table_sec->size = number * 4;
13935
13936 if (number == 0)
13937 return;
13938
13939 elf_elfheader (link_info->output_bfd)->e_flags |= E_NDS32_HAS_EX9_INST;
13940 number = 0;
13941 for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
13942 {
13943 long val;
13944
13945 val = strtol (ptr->string, NULL, 16);
13946 bfd_putb32 ((bfd_vma) val, (char *) contents + (number * 4));
13947 number++;
13948 }
13949 break;
13950 }
13951 }
13952 }
13953
13954 /* Get insn with regs according to relocation type. */
13955
13956 static void
13957 nds32_elf_get_insn_with_reg (Elf_Internal_Rela *irel,
13958 uint32_t insn, uint32_t *insn_with_reg)
13959 {
13960 reloc_howto_type *howto = NULL;
13961
13962 if (irel == NULL
13963 || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
13964 && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
13965 >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
13966 {
13967 *insn_with_reg = insn;
13968 return;
13969 }
13970
13971 howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
13972 *insn_with_reg = insn & (0xffffffff ^ howto->dst_mask);
13973 }
13974
13975 /* Mask number of address bits according to relocation. */
13976
13977 static unsigned long
13978 nds32_elf_irel_mask (Elf_Internal_Rela *irel)
13979 {
13980 reloc_howto_type *howto = NULL;
13981
13982 if (irel == NULL
13983 || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
13984 && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
13985 >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
13986 return 0;
13987
13988 howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
13989 return howto->dst_mask;
13990 }
13991
13992 static void
13993 nds32_elf_insert_irel_entry (struct elf_nds32_irel_entry **irel_list,
13994 struct elf_nds32_irel_entry *irel_ptr)
13995 {
13996 if (*irel_list == NULL)
13997 {
13998 *irel_list = irel_ptr;
13999 irel_ptr->next = NULL;
14000 }
14001 else
14002 {
14003 irel_ptr->next = *irel_list;
14004 *irel_list = irel_ptr;
14005 }
14006 }
14007
14008 static void
14009 nds32_elf_ex9_insert_fix (asection * sec, Elf_Internal_Rela * irel,
14010 struct elf_link_hash_entry *h, int order)
14011 {
14012 struct elf_nds32_ex9_refix *ptr;
14013
14014 ptr = bfd_malloc (sizeof (struct elf_nds32_ex9_refix));
14015 ptr->sec = sec;
14016 ptr->irel = irel;
14017 ptr->h = h;
14018 ptr->order = order;
14019 ptr->next = NULL;
14020
14021 if (ex9_refix_head == NULL)
14022 ex9_refix_head = ptr;
14023 else
14024 {
14025 struct elf_nds32_ex9_refix *temp = ex9_refix_head;
14026
14027 while (temp->next != NULL)
14028 temp = temp->next;
14029 temp->next = ptr;
14030 }
14031 }
14032
14033 enum
14034 {
14035 DATA_EXIST = 1,
14036 CLEAN_PRE = 1 << 1,
14037 PUSH_PRE = 1 << 2
14038 };
14039
14040 /* Check relocation type if supporting for ex9. */
14041
14042 static int
14043 nds32_elf_ex9_relocation_check (struct bfd_link_info *info,
14044 Elf_Internal_Rela **irel,
14045 Elf_Internal_Rela *irelend,
14046 nds32_elf_blank_t *relax_blank_list,
14047 asection *sec,bfd_vma *off,
14048 bfd_byte *contents)
14049 {
14050 /* Suppress ex9 if `.no_relax ex9' or inner loop. */
14051 bfd_boolean nested_ex9, nested_loop;
14052 bfd_boolean ex9_loop_aware;
14053 /* We use the highest 1 byte of result to record
14054 how many bytes location counter has to move. */
14055 int result = 0;
14056 Elf_Internal_Rela *irel_save = NULL;
14057 struct elf_nds32_link_hash_table *table;
14058
14059 table = nds32_elf_hash_table (info);
14060 ex9_loop_aware = table->ex9_loop_aware;
14061
14062 while ((*irel) != NULL && (*irel) < irelend && *off == (*irel)->r_offset)
14063 {
14064 switch (ELF32_R_TYPE ((*irel)->r_info))
14065 {
14066 case R_NDS32_RELAX_REGION_BEGIN:
14067 /* Ignore code block. */
14068 nested_ex9 = FALSE;
14069 nested_loop = FALSE;
14070 if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG)
14071 || (ex9_loop_aware
14072 && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)))
14073 {
14074 /* Check the region if loop or not. If it is true and
14075 ex9-loop-aware is true, ignore the region till region end. */
14076 /* To save the status for in .no_relax ex9 region and
14077 loop region to conform the block can do ex9 relaxation. */
14078 nested_ex9 = ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG);
14079 nested_loop = (ex9_loop_aware
14080 && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG));
14081 while ((*irel) && (*irel) < irelend && (nested_ex9 || nested_loop))
14082 {
14083 (*irel)++;
14084 if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN)
14085 {
14086 /* There may be nested region. */
14087 if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14088 nested_ex9 = TRUE;
14089 else if (ex9_loop_aware
14090 && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14091 nested_loop = TRUE;
14092 }
14093 else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END)
14094 {
14095 /* The end of region. */
14096 if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14097 nested_ex9 = FALSE;
14098 else if (ex9_loop_aware
14099 && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14100 nested_loop = FALSE;
14101 }
14102 else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_LABEL
14103 && ((*irel)->r_addend & 0x1f) == 2)
14104 {
14105 /* Alignment exist in the region. */
14106 result |= CLEAN_PRE;
14107 if (((*irel)->r_offset -
14108 get_nds32_elf_blank_total (&relax_blank_list,
14109 (*irel)->r_offset, 0)) & 0x02)
14110 result |= PUSH_PRE;
14111 }
14112 }
14113 if ((*irel) >= irelend)
14114 *off = sec->size;
14115 else
14116 *off = (*irel)->r_offset;
14117
14118 /* The final instruction in the region, regard this one as data to ignore it. */
14119 result |= DATA_EXIST;
14120 return result;
14121 }
14122 break;
14123
14124 case R_NDS32_LABEL:
14125 if (((*irel)->r_addend & 0x1f) == 2)
14126 {
14127 /* Check this point is align and decide to do ex9 or not. */
14128 result |= CLEAN_PRE;
14129 if (((*irel)->r_offset -
14130 get_nds32_elf_blank_total (&relax_blank_list,
14131 (*irel)->r_offset, 0)) & 0x02)
14132 result |= PUSH_PRE;
14133 }
14134 break;
14135 case R_NDS32_32_RELA:
14136 /* Data. */
14137 result |= (4 << 24);
14138 result |= DATA_EXIST;
14139 break;
14140 case R_NDS32_16_RELA:
14141 /* Data. */
14142 result |= (2 << 24);
14143 result |= DATA_EXIST;
14144 break;
14145 case R_NDS32_DATA:
14146 /* Data. */
14147 /* The least code alignment is 2. If the data is only one byte,
14148 we have to shift one more byte. */
14149 if ((*irel)->r_addend == 1)
14150 result |= ((*irel)->r_addend << 25) ;
14151 else
14152 result |= ((*irel)->r_addend << 24) ;
14153
14154 result |= DATA_EXIST;
14155 break;
14156
14157 case R_NDS32_25_PCREL_RELA:
14158 case R_NDS32_SDA16S3_RELA:
14159 case R_NDS32_SDA15S3_RELA:
14160 case R_NDS32_SDA15S3:
14161 case R_NDS32_SDA17S2_RELA:
14162 case R_NDS32_SDA15S2_RELA:
14163 case R_NDS32_SDA12S2_SP_RELA:
14164 case R_NDS32_SDA12S2_DP_RELA:
14165 case R_NDS32_SDA15S2:
14166 case R_NDS32_SDA18S1_RELA:
14167 case R_NDS32_SDA15S1_RELA:
14168 case R_NDS32_SDA15S1:
14169 case R_NDS32_SDA19S0_RELA:
14170 case R_NDS32_SDA15S0_RELA:
14171 case R_NDS32_SDA15S0:
14172 case R_NDS32_HI20_RELA:
14173 case R_NDS32_LO12S0_ORI_RELA:
14174 case R_NDS32_LO12S0_RELA:
14175 case R_NDS32_LO12S1_RELA:
14176 case R_NDS32_LO12S2_RELA:
14177 /* These relocation is supported ex9 relaxation currently. */
14178 /* We have to save the relocation for using later, since we have
14179 to check there is any alignment in the same address. */
14180 irel_save = *irel;
14181 break;
14182 default:
14183 /* Not support relocations. */
14184 if (ELF32_R_TYPE ((*irel)->r_info) < ARRAY_SIZE (nds32_elf_howto_table)
14185 && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_NONE
14186 && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_INSN16)
14187 {
14188 /* Note: To optimize aggressively, it maybe can ignore R_NDS32_INSN16 here.
14189 But we have to consider if there is any side-effect. */
14190 if (!(result & DATA_EXIST))
14191 {
14192 /* We have to confirm there is no data relocation in the
14193 same address. In general case, this won't happen. */
14194 /* We have to do ex9 conservative, for those relocation not
14195 considerd we ignore instruction. */
14196 result |= DATA_EXIST;
14197 if (*(contents + *off) & 0x80)
14198 result |= (2 << 24);
14199 else
14200 result |= (4 << 24);
14201 break;
14202 }
14203 }
14204 }
14205 if ((*irel) < irelend
14206 && ((*irel) + 1) < irelend
14207 && (*irel)->r_offset == ((*irel) + 1)->r_offset)
14208 /* There are relocations pointing to the same address, we have to
14209 check all of them. */
14210 (*irel)++;
14211 else
14212 {
14213 if (irel_save)
14214 *irel = irel_save;
14215 return result;
14216 }
14217 }
14218 return result;
14219 }
14220
14221 /* Replace with ex9 instruction. */
14222
14223 static bfd_boolean
14224 nds32_elf_ex9_push_insn (uint16_t insn16, bfd_byte *contents, bfd_vma pre_off,
14225 nds32_elf_blank_t **relax_blank_list,
14226 struct elf_nds32_irel_entry *pre_irel_ptr,
14227 struct elf_nds32_irel_entry **irel_list)
14228 {
14229 if (insn16 != 0)
14230 {
14231 /* Implement the ex9 relaxation. */
14232 bfd_putb16 (insn16, contents + pre_off);
14233 if (!insert_nds32_elf_blank_recalc_total (relax_blank_list,
14234 pre_off + 2, 2))
14235 return FALSE;
14236 if (pre_irel_ptr != NULL)
14237 nds32_elf_insert_irel_entry (irel_list, pre_irel_ptr);
14238 }
14239 return TRUE;
14240 }
14241
14242 /* Replace input file instruction which is in ex9 itable. */
14243
14244 static bfd_boolean
14245 nds32_elf_ex9_replace_instruction (struct bfd_link_info *info, bfd *abfd, asection *sec)
14246 {
14247 struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
14248 bfd_byte *contents = NULL;
14249 bfd_vma off;
14250 uint16_t insn16, insn_ex9;
14251 /* `pre_*' are used to track previous instruction that can use ex9.it. */
14252 bfd_vma pre_off = -1;
14253 uint16_t pre_insn16 = 0;
14254 struct elf_nds32_irel_entry *pre_irel_ptr = NULL;
14255 Elf_Internal_Rela *internal_relocs;
14256 Elf_Internal_Rela *irel;
14257 Elf_Internal_Rela *irelend;
14258 Elf_Internal_Shdr *symtab_hdr;
14259 Elf_Internal_Sym *isym = NULL;
14260 nds32_elf_blank_t *relax_blank_list = NULL;
14261 uint32_t insn = 0;
14262 uint32_t insn_with_reg = 0;
14263 uint32_t it_insn;
14264 uint32_t it_insn_with_reg;
14265 unsigned long r_symndx;
14266 asection *isec;
14267 struct elf_nds32_irel_entry *irel_list = NULL;
14268 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
14269 int data_flag, do_replace, save_irel;
14270 struct elf_link_hash_entry_list *h_list;
14271
14272
14273 /* Load section instructions, relocations, and symbol table. */
14274 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
14275 || !nds32_get_local_syms (abfd, sec, &isym))
14276 return FALSE;
14277 internal_relocs =
14278 _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, TRUE /* keep_memory */);
14279 irelend = internal_relocs + sec->reloc_count;
14280 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
14281
14282 off = 0;
14283
14284 /* Check if the object enable ex9. */
14285 irel = find_relocs_at_address (internal_relocs, internal_relocs,
14286 irelend, R_NDS32_RELAX_ENTRY);
14287
14288 /* Check this section trigger ex9 relaxation. */
14289 if (irel == NULL
14290 || irel >= irelend
14291 || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
14292 || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
14293 && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
14294 return TRUE;
14295
14296 irel = internal_relocs;
14297
14298 /* Check alignment and fetch proper relocation. */
14299 while (off < sec->size)
14300 {
14301 struct elf_link_hash_entry *h = NULL;
14302 struct elf_nds32_irel_entry *irel_ptr = NULL;
14303
14304 /* Syn the instruction and the relocation. */
14305 while (irel != NULL && irel < irelend && irel->r_offset < off)
14306 irel++;
14307
14308 data_flag = nds32_elf_ex9_relocation_check (info, &irel, irelend,
14309 relax_blank_list, sec,
14310 &off, contents);
14311 if (data_flag & PUSH_PRE)
14312 if (!nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14313 &relax_blank_list, pre_irel_ptr,
14314 &irel_list))
14315 return FALSE;
14316
14317 if (data_flag & CLEAN_PRE)
14318 {
14319 pre_off = 0;
14320 pre_insn16 = 0;
14321 pre_irel_ptr = NULL;
14322 }
14323 if (data_flag & DATA_EXIST)
14324 {
14325 /* We save the move offset in the highest byte. */
14326 off += (data_flag >> 24);
14327 continue;
14328 }
14329
14330 if (*(contents + off) & 0x80)
14331 {
14332 /* 2-byte instruction. */
14333 off += 2;
14334 continue;
14335 }
14336
14337 /* Load the instruction and its opcode with register for comparing. */
14338 ex9_insn = ex9_insn_head;
14339 insn = bfd_getb32 (contents + off);
14340 insn_with_reg = 0;
14341 while (ex9_insn)
14342 {
14343 it_insn = strtol (ex9_insn->string, NULL, 16);
14344 it_insn_with_reg = 0;
14345 do_replace = 0;
14346 save_irel = 0;
14347
14348 if (irel != NULL && irel < irelend && irel->r_offset == off)
14349 {
14350 /* Insn with relocation. */
14351 nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
14352
14353 if (ex9_insn->irel != NULL)
14354 nds32_elf_get_insn_with_reg (ex9_insn->irel, it_insn,
14355 &it_insn_with_reg);
14356
14357 if (ex9_insn->irel != NULL
14358 && (ELF32_R_TYPE (irel->r_info) ==
14359 ELF32_R_TYPE (ex9_insn->irel->r_info))
14360 && (insn_with_reg == it_insn_with_reg))
14361 {
14362 /* Insn relocation and format is the same as table entry. */
14363
14364 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
14365 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
14366 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
14367 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
14368 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
14369 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
14370 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
14371 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
14372 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
14373 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
14374 && ELF32_R_TYPE (irel->r_info) <=
14375 R_NDS32_SDA12S2_SP_RELA)
14376 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
14377 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
14378 {
14379 r_symndx = ELF32_R_SYM (irel->r_info);
14380 if (r_symndx < symtab_hdr->sh_info)
14381 {
14382 /* Local symbol. */
14383 int shndx = isym[r_symndx].st_shndx;
14384
14385 isec = elf_elfsections (abfd)[shndx]->bfd_section;
14386 if (ex9_insn->sec == isec
14387 && ex9_insn->irel->r_addend == irel->r_addend
14388 && ex9_insn->irel->r_info == irel->r_info)
14389 {
14390 do_replace = 1;
14391 save_irel = 1;
14392 }
14393 }
14394 else
14395 {
14396 /* External symbol. */
14397 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14398 if (ex9_insn->m_list)
14399 {
14400 h_list = ex9_insn->m_list->h_list;
14401 while (h_list)
14402 {
14403 if (h == h_list->h
14404 && (ex9_insn->m_list->irel->r_addend ==
14405 irel->r_addend))
14406 {
14407 do_replace = 1;
14408 save_irel = 1;
14409 break;
14410 }
14411 h_list = h_list->next;
14412 }
14413 }
14414 }
14415 }
14416 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA)
14417 {
14418 r_symndx = ELF32_R_SYM (irel->r_info);
14419 if (r_symndx < symtab_hdr->sh_info)
14420 {
14421 /* Local symbols. Compare its base symbol and offset. */
14422 int shndx = isym[r_symndx].st_shndx;
14423
14424 isec = elf_elfsections (abfd)[shndx]->bfd_section;
14425 if (ex9_insn->sec == isec
14426 && ex9_insn->irel->r_addend == irel->r_addend
14427 && ex9_insn->irel->r_info == irel->r_info)
14428 {
14429 do_replace = 1;
14430 save_irel = 1;
14431 }
14432 }
14433 else
14434 {
14435 /* External symbol. */
14436 struct elf_link_hash_entry_mul_list *m_list;
14437
14438 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14439 m_list = ex9_insn->m_list;
14440
14441 while (m_list)
14442 {
14443 h_list = m_list->h_list;
14444
14445 while (h_list)
14446 {
14447 if (h == h_list->h
14448 && (m_list->irel->r_addend
14449 == irel->r_addend))
14450 {
14451 do_replace = 1;
14452 save_irel = 1;
14453 if (ex9_insn->next
14454 && ex9_insn->m_list
14455 && ex9_insn->m_list == ex9_insn->next->m_list)
14456 {
14457 /* sethi multiple entry must be fixed */
14458 nds32_elf_ex9_insert_fix (sec, irel,
14459 h, ex9_insn->order);
14460 }
14461 break;
14462 }
14463 h_list = h_list->next;
14464 }
14465 m_list = m_list->next;
14466 }
14467 }
14468 }
14469 }
14470
14471 /* Import table: Check the symbol hash table and the
14472 jump target. Only R_NDS32_25_PCREL_RELA now. */
14473 else if (ex9_insn->times == -1
14474 && ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
14475 {
14476 nds32_elf_get_insn_with_reg (irel, it_insn, &it_insn_with_reg);
14477 if (insn_with_reg == it_insn_with_reg)
14478 {
14479 char code[10];
14480 bfd_vma relocation;
14481
14482 r_symndx = ELF32_R_SYM (irel->r_info);
14483 if (r_symndx >= symtab_hdr->sh_info)
14484 {
14485 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14486 if ((h->root.type == bfd_link_hash_defined
14487 || h->root.type == bfd_link_hash_defweak)
14488 && h->root.u.def.section != NULL
14489 && h->root.u.def.section->output_section != NULL
14490 && h->root.u.def.section->gc_mark == 1
14491 && bfd_is_abs_section (h->root.u.def.section)
14492 && h->root.u.def.value > sec->size)
14493 {
14494 relocation = h->root.u.def.value +
14495 h->root.u.def.section->output_section->vma +
14496 h->root.u.def.section->output_offset;
14497 relocation += irel->r_addend;
14498 insn = insn_with_reg
14499 | ((relocation >> 1) & 0xffffff);
14500 snprintf (code, sizeof (code), "%08x", insn);
14501 if (strcmp (code, ex9_insn->string) == 0)
14502 {
14503 do_replace = 1;
14504 save_irel = 1;
14505 }
14506 }
14507 }
14508 }
14509 }
14510 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
14511 || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
14512 || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
14513 {
14514 /* These relocations do not have to relocate contens, so it can
14515 be regard as instruction without relocation. */
14516 if (insn == it_insn && ex9_insn->irel == NULL)
14517 do_replace = 1;
14518 }
14519 }
14520 else
14521 {
14522 /* Instruction without relocation, we only
14523 have to compare their byte code. */
14524 if (insn == it_insn && ex9_insn->irel == NULL)
14525 do_replace = 1;
14526 }
14527
14528 /* Insntruction match so replacing the code here. */
14529 if (do_replace == 1)
14530 {
14531 /* There are two formats of ex9 instruction. */
14532 if (ex9_insn->order < 32)
14533 insn_ex9 = INSN_EX9_IT_2;
14534 else
14535 insn_ex9 = INSN_EX9_IT_1;
14536 insn16 = insn_ex9 | ex9_insn->order;
14537
14538 /* Insert ex9 instruction. */
14539 nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14540 &relax_blank_list, pre_irel_ptr,
14541 &irel_list);
14542 pre_off = off;
14543 pre_insn16 = insn16;
14544
14545 if (save_irel)
14546 {
14547 /* For instuction with relocation do relax. */
14548 irel_ptr = (struct elf_nds32_irel_entry *)
14549 bfd_malloc (sizeof (struct elf_nds32_irel_entry));
14550 irel_ptr->irel = irel;
14551 irel_ptr->next = NULL;
14552 pre_irel_ptr = irel_ptr;
14553 }
14554 else
14555 pre_irel_ptr = NULL;
14556 break;
14557 }
14558 ex9_insn = ex9_insn->next;
14559 }
14560 off += 4;
14561 }
14562
14563 /* Insert ex9 instruction. */
14564 nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14565 &relax_blank_list, pre_irel_ptr,
14566 &irel_list);
14567
14568 /* Delete the redundant code. */
14569 if (relax_blank_list)
14570 {
14571 nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
14572 relax_blank_list = NULL;
14573 }
14574
14575 /* Clear the relocation that is replaced by ex9. */
14576 while (irel_list)
14577 {
14578 struct elf_nds32_irel_entry *irel_ptr;
14579
14580 irel_ptr = irel_list;
14581 irel_list = irel_ptr->next;
14582 irel_ptr->irel->r_info =
14583 ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), R_NDS32_TRAN);
14584 free (irel_ptr);
14585 }
14586 return TRUE;
14587 }
14588
14589 /* Initialize ex9 hash table. */
14590
14591 int
14592 nds32_elf_ex9_init (void)
14593 {
14594 if (!bfd_hash_table_init_n (&ex9_code_table, nds32_elf_code_hash_newfunc,
14595 sizeof (struct elf_nds32_code_hash_entry),
14596 1023))
14597 {
14598 _bfd_error_handler (_("Linker: cannot init ex9 hash table error \n"));
14599 return FALSE;
14600 }
14601 return TRUE;
14602 }
14603
14604 /* Predict how many bytes will be relaxed with ex9 and ifc. */
14605
14606 static void
14607 nds32_elf_ex9_total_relax (struct bfd_link_info *info)
14608 {
14609 struct elf_nds32_insn_times_entry *ex9_insn;
14610 struct elf_nds32_insn_times_entry *temp;
14611 int target_optimize;
14612 struct elf_nds32_link_hash_table *table;
14613
14614 if (ex9_insn_head == NULL)
14615 return;
14616
14617 table = nds32_elf_hash_table (info);
14618 target_optimize = table->target_optimize;
14619 ex9_insn = ex9_insn_head;
14620 while (ex9_insn)
14621 {
14622 ex9_relax_size = ex9_insn->times * 2 + ex9_relax_size;
14623 temp = ex9_insn;
14624 ex9_insn = ex9_insn->next;
14625 free (temp);
14626 }
14627 ex9_insn_head = NULL;
14628
14629 if ((target_optimize & NDS32_RELAX_JUMP_IFC_ON))
14630 {
14631 /* Examine ifc reduce size. */
14632 struct elf_nds32_ifc_symbol_entry *ifc_ent = ifc_symbol_head;
14633 struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
14634 int size = 0;
14635
14636 while (ifc_ent)
14637 {
14638 if (ifc_ent->enable == 0)
14639 {
14640 /* Not ifc yet. */
14641 irel_ptr = ifc_ent->irel_head;
14642 while (irel_ptr)
14643 {
14644 size += 2;
14645 irel_ptr = irel_ptr->next;
14646 }
14647 }
14648 size -= 2;
14649 ifc_ent = ifc_ent->next;
14650 }
14651 ex9_relax_size += size;
14652 }
14653 }
14654
14655 /* Finish ex9 table. */
14656
14657 void
14658 nds32_elf_ex9_finish (struct bfd_link_info *link_info)
14659 {
14660 nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
14661 nds32_elf_order_insn_times (link_info);
14662 nds32_elf_ex9_total_relax (link_info);
14663 /* Traverse the hash table and count its times. */
14664 nds32_elf_code_hash_traverse (nds32_elf_count_insn_times);
14665 nds32_elf_order_insn_times (link_info);
14666 nds32_elf_ex9_build_itable (link_info);
14667 }
14668
14669 /* Relocate the entries in ex9 table. */
14670
14671 static bfd_vma
14672 nds32_elf_ex9_reloc_insn (struct elf_nds32_insn_times_entry *ptr,
14673 struct bfd_link_info *link_info)
14674 {
14675 Elf_Internal_Sym *isym = NULL;
14676 bfd_vma relocation = -1;
14677 struct elf_link_hash_entry *h;
14678
14679 if (ptr->m_list != NULL)
14680 {
14681 /* Global symbol. */
14682 h = ptr->m_list->h_list->h;
14683 if ((h->root.type == bfd_link_hash_defined
14684 || h->root.type == bfd_link_hash_defweak)
14685 && h->root.u.def.section != NULL
14686 && h->root.u.def.section->output_section != NULL)
14687 {
14688
14689 relocation = h->root.u.def.value +
14690 h->root.u.def.section->output_section->vma +
14691 h->root.u.def.section->output_offset;
14692 relocation += ptr->m_list->irel->r_addend;
14693 }
14694 else
14695 relocation = 0;
14696 }
14697 else if (ptr->sec !=NULL)
14698 {
14699 /* Local symbol. */
14700 Elf_Internal_Sym sym;
14701 asection *sec = NULL;
14702 asection isec;
14703 asection *isec_ptr = &isec;
14704 Elf_Internal_Rela irel_backup = *(ptr->irel);
14705 asection *sec_backup = ptr->sec;
14706 bfd *abfd = ptr->sec->owner;
14707
14708 if (!nds32_get_local_syms (abfd, sec, &isym))
14709 return FALSE;
14710 isym = isym + ELF32_R_SYM (ptr->irel->r_info);
14711
14712 sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
14713 if (sec != NULL)
14714 *isec_ptr = *sec;
14715 sym = *isym;
14716
14717 /* The purpose is same as elf_link_input_bfd. */
14718 if (isec_ptr != NULL
14719 && isec_ptr->sec_info_type == SEC_INFO_TYPE_MERGE
14720 && ELF_ST_TYPE (isym->st_info) != STT_SECTION)
14721 {
14722 sym.st_value =
14723 _bfd_merged_section_offset (ptr->sec->output_section->owner, &isec_ptr,
14724 elf_section_data (isec_ptr)->sec_info,
14725 isym->st_value);
14726 }
14727 relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, &sym,
14728 &ptr->sec, ptr->irel);
14729 if (ptr->irel != NULL)
14730 relocation += ptr->irel->r_addend;
14731
14732 /* Restore origin value since there may be some insntructions that
14733 could not be replaced with ex9.it. */
14734 *(ptr->irel) = irel_backup;
14735 ptr->sec = sec_backup;
14736 }
14737
14738 return relocation;
14739 }
14740
14741 /* Import ex9 table and build list. */
14742
14743 void
14744 nds32_elf_ex9_import_table (struct bfd_link_info *info)
14745 {
14746 int num = 0;
14747 bfd_byte *contents;
14748 FILE *ex9_import_file;
14749 int update_ex9_table;
14750 struct elf_nds32_link_hash_table *table;
14751
14752 table = nds32_elf_hash_table (info);
14753 ex9_import_file = table->ex9_import_file;
14754 rewind (table->ex9_import_file);
14755
14756 contents = bfd_malloc (sizeof (bfd_byte) * 4);
14757
14758 /* Read instructions from the input file and build the list. */
14759 while (!feof (ex9_import_file))
14760 {
14761 unsigned long insn;
14762 char *code;
14763 struct elf_nds32_insn_times_entry *ptr;
14764 size_t nread;
14765
14766 nread = fread (contents, sizeof (bfd_byte) * 4, 1, ex9_import_file);
14767 /* Ignore the final byte 0x0a. */
14768 if (nread < 1)
14769 break;
14770 insn = bfd_getb32 (contents);
14771 code = bfd_malloc (sizeof (char) * 9);
14772 snprintf (code, 9, "%08lx", (insn & 0xffffffff));
14773 ptr = bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14774 ptr->string = code;
14775 ptr->order = num;
14776 ptr->times = -1;
14777 ptr->sec = NULL;
14778 ptr->m_list = NULL;
14779 ptr->rel_backup.r_offset = 0;
14780 ptr->rel_backup.r_info = 0;
14781 ptr->rel_backup.r_addend = 0;
14782 ptr->irel = NULL;
14783 ptr->next = NULL;
14784 nds32_elf_ex9_insert_entry (ptr);
14785 num++;
14786 }
14787
14788 update_ex9_table = table->update_ex9_table;
14789 if (update_ex9_table == 1)
14790 {
14791 /* It has to consider of sethi need to use multiple page
14792 but it not be done yet. */
14793 nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
14794 nds32_elf_order_insn_times (info);
14795 }
14796 }
14797
14798 /* Export ex9 table. */
14799
14800 static void
14801 nds32_elf_ex9_export (struct bfd_link_info *info,
14802 bfd_byte *contents, int size)
14803 {
14804 FILE *ex9_export_file;
14805 struct elf_nds32_link_hash_table *table;
14806
14807 table = nds32_elf_hash_table (info);
14808 ex9_export_file = table->ex9_export_file;
14809 fwrite (contents, sizeof (bfd_byte), size, ex9_export_file);
14810 fclose (ex9_export_file);
14811 }
14812
14813 /* Adjust relocations of J and JAL in ex9.itable.
14814 Export ex9 table. */
14815
14816 static void
14817 nds32_elf_ex9_reloc_jmp (struct bfd_link_info *link_info)
14818 {
14819 asection *table_sec = NULL;
14820 struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
14821 struct elf_nds32_insn_times_entry *temp_ptr, *temp_ptr2;
14822 bfd *it_abfd;
14823 uint32_t insn, insn_with_reg, source_insn;
14824 bfd_byte *contents = NULL, *source_contents = NULL;
14825 int size = 0;
14826 bfd_vma gp;
14827 int shift, update_ex9_table, offset = 0;
14828 reloc_howto_type *howto = NULL;
14829 Elf_Internal_Rela rel_backup;
14830 unsigned short insn_ex9;
14831 struct elf_nds32_link_hash_table *table;
14832 FILE *ex9_export_file;
14833 static bfd_boolean done = FALSE;
14834
14835 if (done)
14836 return;
14837
14838 done = TRUE;
14839
14840 table = nds32_elf_hash_table (link_info);
14841 if (table)
14842 table->relax_status |= NDS32_RELAX_EX9_DONE;
14843
14844
14845 update_ex9_table = table->update_ex9_table;
14846 /* Generated ex9.itable exactly. */
14847 if (update_ex9_table == 0)
14848 {
14849 for (it_abfd = link_info->input_bfds; it_abfd != NULL;
14850 it_abfd = it_abfd->link.next)
14851 {
14852 table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
14853 if (table_sec != NULL)
14854 break;
14855 }
14856
14857 if (table_sec != NULL)
14858 {
14859 bfd *output_bfd;
14860
14861 output_bfd = table_sec->output_section->owner;
14862 nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
14863 if (table_sec->size == 0)
14864 return;
14865
14866 if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
14867 return;
14868 }
14869 }
14870 else
14871 {
14872 /* Set gp. */
14873 bfd *output_bfd;
14874
14875 output_bfd = link_info->input_bfds->sections->output_section->owner;
14876 nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
14877 contents = bfd_malloc (sizeof (bfd_byte) * 2048);
14878 }
14879
14880 /* Relocate instruction. */
14881 while (ex9_insn)
14882 {
14883 bfd_vma relocation, min_relocation = 0xffffffff;
14884
14885 insn = strtol (ex9_insn->string, NULL, 16);
14886 insn_with_reg = 0;
14887 if (ex9_insn->m_list != NULL || ex9_insn->sec != NULL)
14888 {
14889 if (ex9_insn->m_list)
14890 rel_backup = ex9_insn->m_list->rel_backup;
14891 else
14892 rel_backup = ex9_insn->rel_backup;
14893
14894 nds32_elf_get_insn_with_reg (&rel_backup, insn, &insn_with_reg);
14895 howto =
14896 bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE
14897 (rel_backup.r_info));
14898 shift = howto->rightshift;
14899 if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_25_PCREL_RELA
14900 || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_ORI_RELA
14901 || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_RELA
14902 || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S1_RELA
14903 || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S2_RELA)
14904 {
14905 relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
14906 insn =
14907 insn_with_reg | ((relocation >> shift) &
14908 nds32_elf_irel_mask (&rel_backup));
14909 bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
14910 }
14911 else if ((ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3
14912 && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0)
14913 || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3_RELA
14914 && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0_RELA)
14915 || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA12S2_DP_RELA
14916 && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA12S2_SP_RELA)
14917 || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA16S3_RELA
14918 && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA19S0_RELA))
14919 {
14920 relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
14921 insn =
14922 insn_with_reg | (((relocation - gp) >> shift) &
14923 nds32_elf_irel_mask (&rel_backup));
14924 bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
14925 }
14926 else if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_HI20_RELA)
14927 {
14928 /* Sethi may be multiple entry for one insn. */
14929 if (ex9_insn->next && ex9_insn->m_list
14930 && ex9_insn->m_list == ex9_insn->next->m_list)
14931 {
14932 struct elf_link_hash_entry_mul_list *m_list;
14933 struct elf_nds32_ex9_refix *fix_ptr;
14934 struct elf_link_hash_entry *h;
14935
14936 temp_ptr = ex9_insn;
14937 temp_ptr2 = ex9_insn;
14938 m_list = ex9_insn->m_list;
14939 while (m_list)
14940 {
14941 h = m_list->h_list->h;
14942 relocation = h->root.u.def.value +
14943 h->root.u.def.section->output_section->vma +
14944 h->root.u.def.section->output_offset;
14945 relocation += m_list->irel->r_addend;
14946
14947 if (relocation < min_relocation)
14948 min_relocation = relocation;
14949 m_list = m_list->next;
14950 }
14951 relocation = min_relocation;
14952
14953 /* Put insntruction into ex9 table. */
14954 insn = insn_with_reg
14955 | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
14956 bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
14957 relocation = relocation + 0x1000; /* hi20 */
14958
14959 while (ex9_insn->next && ex9_insn->m_list
14960 && ex9_insn->m_list == ex9_insn->next->m_list)
14961 {
14962 /* Multiple sethi. */
14963 ex9_insn = ex9_insn->next;
14964 size += 4;
14965 insn =
14966 insn_with_reg | ((relocation >> shift) &
14967 nds32_elf_irel_mask (&rel_backup));
14968 bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
14969 relocation = relocation + 0x1000; /* hi20 */
14970 }
14971
14972 fix_ptr = ex9_refix_head;
14973 while (fix_ptr)
14974 {
14975 /* Fix ex9 insn. */
14976 /* temp_ptr2 points to the head of multiple sethi. */
14977 temp_ptr = temp_ptr2;
14978 while (fix_ptr->order != temp_ptr->order && fix_ptr->next)
14979 {
14980 fix_ptr = fix_ptr->next;
14981 }
14982 if (fix_ptr->order != temp_ptr->order)
14983 break;
14984
14985 /* Set source insn. */
14986 relocation =
14987 fix_ptr->h->root.u.def.value +
14988 fix_ptr->h->root.u.def.section->output_section->vma +
14989 fix_ptr->h->root.u.def.section->output_offset;
14990 relocation += fix_ptr->irel->r_addend;
14991 /* sethi imm is imm20s. */
14992 source_insn = insn_with_reg | ((relocation >> shift) & 0xfffff);
14993
14994 while (temp_ptr)
14995 {
14996 /* Match entry and source code. */
14997 insn = bfd_getb32 (contents + (temp_ptr->order) * 4 + offset);
14998 if (insn == source_insn)
14999 {
15000 /* Fix the ex9 insn. */
15001 if (temp_ptr->order != fix_ptr->order)
15002 {
15003 if (!nds32_get_section_contents
15004 (fix_ptr->sec->owner, fix_ptr->sec,
15005 &source_contents, TRUE))
15006 _bfd_error_handler
15007 (_("Linker: error cannot fixed ex9 relocation \n"));
15008 if (temp_ptr->order < 32)
15009 insn_ex9 = INSN_EX9_IT_2;
15010 else
15011 insn_ex9 = INSN_EX9_IT_1;
15012 insn_ex9 = insn_ex9 | temp_ptr->order;
15013 bfd_putb16 (insn_ex9, source_contents + fix_ptr->irel->r_offset);
15014 }
15015 break;
15016 }
15017 else
15018 {
15019 if (!temp_ptr->next || temp_ptr->m_list != temp_ptr->next->m_list)
15020 _bfd_error_handler
15021 (_("Linker: error cannot fixed ex9 relocation \n"));
15022 else
15023 temp_ptr = temp_ptr->next;
15024 }
15025 }
15026 fix_ptr = fix_ptr->next;
15027 }
15028 }
15029 else
15030 {
15031 relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15032 insn = insn_with_reg
15033 | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
15034 bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15035 }
15036 }
15037 }
15038 else
15039 {
15040 /* Insn without relocation does not have to be fixed
15041 if need to update export table. */
15042 if (update_ex9_table == 1)
15043 bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15044 }
15045 ex9_insn = ex9_insn->next;
15046 size += 4;
15047 }
15048
15049 ex9_export_file = table->ex9_export_file;
15050 if (ex9_export_file != NULL)
15051 nds32_elf_ex9_export (link_info, contents, table_sec->size);
15052 else if (update_ex9_table == 1)
15053 {
15054 table->ex9_export_file = table->ex9_import_file;
15055 rewind (table->ex9_export_file);
15056 nds32_elf_ex9_export (link_info, contents, size);
15057 }
15058 }
15059
15060 /* Generate ex9 hash table. */
15061
15062 static bfd_boolean
15063 nds32_elf_ex9_build_hash_table (bfd *abfd, asection *sec,
15064 struct bfd_link_info *link_info)
15065 {
15066 Elf_Internal_Rela *internal_relocs;
15067 Elf_Internal_Rela *irelend;
15068 Elf_Internal_Rela *irel;
15069 Elf_Internal_Rela *jrel;
15070 Elf_Internal_Rela rel_backup;
15071 Elf_Internal_Shdr *symtab_hdr;
15072 Elf_Internal_Sym *isym = NULL;
15073 asection *isec;
15074 struct elf_link_hash_entry **sym_hashes;
15075 bfd_byte *contents = NULL;
15076 bfd_vma off = 0;
15077 unsigned long r_symndx;
15078 uint32_t insn, insn_with_reg;
15079 struct elf_link_hash_entry *h;
15080 int data_flag, shift, align;
15081 bfd_vma relocation;
15082 /* Suppress ex9 if `.no_relax ex9' or inner loop. */
15083 reloc_howto_type *howto = NULL;
15084
15085 sym_hashes = elf_sym_hashes (abfd);
15086 /* Load section instructions, relocations, and symbol table. */
15087 if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
15088 return FALSE;
15089
15090 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
15091 TRUE /* keep_memory */);
15092 irelend = internal_relocs + sec->reloc_count;
15093 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
15094 if (!nds32_get_local_syms (abfd, sec, &isym))
15095 return FALSE;
15096
15097 /* Check the object if enable ex9. */
15098 irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
15099 R_NDS32_RELAX_ENTRY);
15100
15101 /* Check this section trigger ex9 relaxation. */
15102 if (irel == NULL
15103 || irel >= irelend
15104 || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
15105 || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
15106 && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
15107 return TRUE;
15108
15109 irel = internal_relocs;
15110
15111 /* Push each insn into hash table. */
15112 while (off < sec->size)
15113 {
15114 char code[10];
15115 struct elf_nds32_code_hash_entry *entry;
15116
15117 while (irel != NULL && irel < irelend && irel->r_offset < off)
15118 irel++;
15119
15120 data_flag = nds32_elf_ex9_relocation_check (link_info, &irel, irelend,
15121 NULL, sec, &off, contents);
15122 if (data_flag & DATA_EXIST)
15123 {
15124 /* We save the move offset in the highest byte. */
15125 off += (data_flag >> 24);
15126 continue;
15127 }
15128
15129 if (*(contents + off) & 0x80)
15130 {
15131 off += 2;
15132 }
15133 else
15134 {
15135 h = NULL;
15136 isec = NULL;
15137 jrel = NULL;
15138 rel_backup.r_info = 0;
15139 rel_backup.r_offset = 0;
15140 rel_backup.r_addend = 0;
15141 /* Load the instruction and its opcode with register for comparing. */
15142 insn = bfd_getb32 (contents + off);
15143 insn_with_reg = 0;
15144 if (irel != NULL && irel < irelend && irel->r_offset == off)
15145 {
15146 nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
15147 howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
15148 shift = howto->rightshift;
15149 align = (1 << shift) - 1;
15150 if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
15151 || ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA
15152 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
15153 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
15154 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
15155 || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
15156 ||(ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15157 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15158 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15159 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15160 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15161 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15162 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15163 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15164 {
15165 r_symndx = ELF32_R_SYM (irel->r_info);
15166 jrel = irel;
15167 rel_backup = *irel;
15168 if (r_symndx < symtab_hdr->sh_info)
15169 {
15170 /* Local symbol. */
15171 int shndx = isym[r_symndx].st_shndx;
15172
15173 bfd_vma st_value = (isym + r_symndx)->st_value;
15174 isec = elf_elfsections (abfd)[shndx]->bfd_section;
15175 relocation = (isec->output_section->vma + isec->output_offset
15176 + st_value + irel->r_addend);
15177 }
15178 else
15179 {
15180 /* External symbol. */
15181 bfd_boolean warned ATTRIBUTE_UNUSED;
15182 bfd_boolean ignored ATTRIBUTE_UNUSED;
15183 bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED;
15184 asection *sym_sec;
15185
15186 /* Maybe there is a better way to get h and relocation */
15187 RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel,
15188 r_symndx, symtab_hdr, sym_hashes,
15189 h, sym_sec, relocation,
15190 unresolved_reloc, warned, ignored);
15191 relocation += irel->r_addend;
15192 if ((h->root.type != bfd_link_hash_defined
15193 && h->root.type != bfd_link_hash_defweak)
15194 || strcmp (h->root.root.string, "_FP_BASE_") == 0)
15195 {
15196 off += 4;
15197 continue;
15198 }
15199 }
15200
15201 /* Check for gp relative instruction alignment. */
15202 if ((ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15203 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15204 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15205 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15206 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15207 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15208 || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15209 && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15210 {
15211 bfd_vma gp;
15212 bfd *output_bfd = sec->output_section->owner;
15213 bfd_reloc_status_type r;
15214
15215 /* If the symbol is in the abs section, the out_bfd will be null.
15216 This happens when the relocation has a symbol@GOTOFF. */
15217 r = nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15218 if (r != bfd_reloc_ok)
15219 {
15220 off += 4;
15221 continue;
15222 }
15223
15224 relocation -= gp;
15225
15226 /* Make sure alignment is correct. */
15227 if (relocation & align)
15228 {
15229 /* Incorrect alignment. */
15230 _bfd_error_handler
15231 /* xgettext:c-format */
15232 (_("%B: warning: unaligned small data access "
15233 "for entry: {%Ld, %Ld, %Ld}, addr = %#Lx, align = %#x"),
15234 abfd, irel->r_offset,
15235 irel->r_info, irel->r_addend, relocation, align);
15236 off += 4;
15237 continue;
15238 }
15239 }
15240
15241 insn = insn_with_reg
15242 | ((relocation >> shift) & nds32_elf_irel_mask (irel));
15243 }
15244 else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
15245 || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
15246 || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
15247 {
15248 /* These relocations do not have to relocate contens, so it can
15249 be regard as instruction without relocation. */
15250 }
15251 else
15252 {
15253 off += 4;
15254 continue;
15255 }
15256 }
15257
15258 snprintf (code, sizeof (code), "%08x", insn);
15259 /* Copy "code". */
15260 entry = (struct elf_nds32_code_hash_entry*)
15261 bfd_hash_lookup (&ex9_code_table, code, TRUE, TRUE);
15262 if (entry == NULL)
15263 {
15264 _bfd_error_handler
15265 (_("failed creating ex9.it %s hash table entry"), code);
15266 return FALSE;
15267 }
15268 if (h)
15269 {
15270 if (h->root.type == bfd_link_hash_undefined)
15271 return TRUE;
15272 /* Global symbol. */
15273 /* In order to do sethi with different symbol but same value. */
15274 if (entry->m_list == NULL)
15275 {
15276 struct elf_link_hash_entry_mul_list *m_list_new;
15277 struct elf_link_hash_entry_list *h_list_new;
15278
15279 m_list_new = (struct elf_link_hash_entry_mul_list *)
15280 bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15281 h_list_new = (struct elf_link_hash_entry_list *)
15282 bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15283 entry->m_list = m_list_new;
15284 m_list_new->h_list = h_list_new;
15285 m_list_new->rel_backup = rel_backup;
15286 m_list_new->times = 1;
15287 m_list_new->irel = jrel;
15288 m_list_new->next = NULL;
15289 h_list_new->h = h;
15290 h_list_new->next = NULL;
15291 }
15292 else
15293 {
15294 struct elf_link_hash_entry_mul_list *m_list = entry->m_list;
15295 struct elf_link_hash_entry_list *h_list;
15296
15297 while (m_list)
15298 {
15299 /* Build the different symbols that point to the same address. */
15300 h_list = m_list->h_list;
15301 if (h_list->h->root.u.def.value == h->root.u.def.value
15302 && h_list->h->root.u.def.section->output_section->vma
15303 == h->root.u.def.section->output_section->vma
15304 && h_list->h->root.u.def.section->output_offset
15305 == h->root.u.def.section->output_offset
15306 && m_list->rel_backup.r_addend == rel_backup.r_addend)
15307 {
15308 m_list->times++;
15309 m_list->irel = jrel;
15310 while (h_list->h != h && h_list->next)
15311 h_list = h_list->next;
15312 if (h_list->h != h)
15313 {
15314 struct elf_link_hash_entry_list *h_list_new;
15315
15316 h_list_new = (struct elf_link_hash_entry_list *)
15317 bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15318 h_list->next = h_list_new;
15319 h_list_new->h = h;
15320 h_list_new->next = NULL;
15321 }
15322 break;
15323 }
15324 /* The sethi case may have different address but the
15325 hi20 is the same. */
15326 else if (ELF32_R_TYPE (jrel->r_info) == R_NDS32_HI20_RELA
15327 && m_list->next == NULL)
15328 {
15329 struct elf_link_hash_entry_mul_list *m_list_new;
15330 struct elf_link_hash_entry_list *h_list_new;
15331
15332 m_list_new = (struct elf_link_hash_entry_mul_list *)
15333 bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15334 h_list_new = (struct elf_link_hash_entry_list *)
15335 bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15336 m_list->next = m_list_new;
15337 m_list_new->h_list = h_list_new;
15338 m_list_new->rel_backup = rel_backup;
15339 m_list_new->times = 1;
15340 m_list_new->irel = jrel;
15341 m_list_new->next = NULL;
15342 h_list_new->h = h;
15343 h_list_new->next = NULL;
15344 break;
15345 }
15346 m_list = m_list->next;
15347 }
15348 if (!m_list)
15349 {
15350 off += 4;
15351 continue;
15352 }
15353 }
15354 }
15355 else
15356 {
15357 /* Local symbol and insn without relocation*/
15358 entry->times++;
15359 entry->rel_backup = rel_backup;
15360 }
15361
15362 /* Use in sethi insn with constant and global symbol in same format. */
15363 if (!jrel)
15364 entry->const_insn = 1;
15365 else
15366 entry->irel = jrel;
15367 entry->sec = isec;
15368 off += 4;
15369 }
15370 }
15371 return TRUE;
15372 }
15373
15374 /* Set the _ITB_BASE, and point it to ex9 table. */
15375
15376 bfd_boolean
15377 nds32_elf_ex9_itb_base (struct bfd_link_info *link_info)
15378 {
15379 bfd *abfd;
15380 asection *sec;
15381 bfd *output_bfd = NULL;
15382 struct bfd_link_hash_entry *bh = NULL;
15383
15384 if (is_ITB_BASE_set == 1)
15385 return TRUE;
15386
15387 is_ITB_BASE_set = 1;
15388
15389 bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_", FALSE, FALSE, TRUE);
15390
15391 if (bh && (bh->type == bfd_link_hash_defined
15392 || bh->type == bfd_link_hash_defweak))
15393 return TRUE;
15394
15395 for (abfd = link_info->input_bfds; abfd != NULL;
15396 abfd = abfd->link.next)
15397 {
15398 sec = bfd_get_section_by_name (abfd, ".ex9.itable");
15399 if (sec != NULL)
15400 {
15401 output_bfd = sec->output_section->owner;
15402 break;
15403 }
15404 }
15405 if (output_bfd == NULL)
15406 {
15407 output_bfd = link_info->output_bfd;
15408 if (output_bfd->sections == NULL)
15409 return TRUE;
15410 else
15411 sec = bfd_abs_section_ptr;
15412 }
15413 bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_",
15414 FALSE, FALSE, TRUE);
15415 return (_bfd_generic_link_add_one_symbol
15416 (link_info, output_bfd, "_ITB_BASE_",
15417 BSF_GLOBAL | BSF_WEAK, sec, 0,
15418 (const char *) NULL, FALSE, get_elf_backend_data
15419 (output_bfd)->collect, &bh));
15420 } /* End EX9.IT */
15421 \f
15422
15423 #define ELF_ARCH bfd_arch_nds32
15424 #define ELF_MACHINE_CODE EM_NDS32
15425 #define ELF_MAXPAGESIZE 0x1000
15426 #define ELF_TARGET_ID NDS32_ELF_DATA
15427
15428 #define TARGET_BIG_SYM nds32_elf32_be_vec
15429 #define TARGET_BIG_NAME "elf32-nds32be"
15430 #define TARGET_LITTLE_SYM nds32_elf32_le_vec
15431 #define TARGET_LITTLE_NAME "elf32-nds32le"
15432
15433 #define elf_info_to_howto nds32_info_to_howto
15434 #define elf_info_to_howto_rel nds32_info_to_howto_rel
15435
15436 #define bfd_elf32_bfd_link_hash_table_create nds32_elf_link_hash_table_create
15437 #define bfd_elf32_bfd_merge_private_bfd_data nds32_elf_merge_private_bfd_data
15438 #define bfd_elf32_bfd_print_private_bfd_data nds32_elf_print_private_bfd_data
15439 #define bfd_elf32_bfd_relax_section nds32_elf_relax_section
15440 #define bfd_elf32_bfd_set_private_flags nds32_elf_set_private_flags
15441
15442 #define bfd_elf32_mkobject nds32_elf_mkobject
15443 #define elf_backend_action_discarded nds32_elf_action_discarded
15444 #define elf_backend_add_symbol_hook nds32_elf_add_symbol_hook
15445 #define elf_backend_check_relocs nds32_elf_check_relocs
15446 #define elf_backend_adjust_dynamic_symbol nds32_elf_adjust_dynamic_symbol
15447 #define elf_backend_create_dynamic_sections nds32_elf_create_dynamic_sections
15448 #define elf_backend_finish_dynamic_sections nds32_elf_finish_dynamic_sections
15449 #define elf_backend_finish_dynamic_symbol nds32_elf_finish_dynamic_symbol
15450 #define elf_backend_size_dynamic_sections nds32_elf_size_dynamic_sections
15451 #define elf_backend_relocate_section nds32_elf_relocate_section
15452 #define elf_backend_gc_mark_hook nds32_elf_gc_mark_hook
15453 #define elf_backend_grok_prstatus nds32_elf_grok_prstatus
15454 #define elf_backend_grok_psinfo nds32_elf_grok_psinfo
15455 #define elf_backend_reloc_type_class nds32_elf_reloc_type_class
15456 #define elf_backend_copy_indirect_symbol nds32_elf_copy_indirect_symbol
15457 #define elf_backend_link_output_symbol_hook nds32_elf_output_symbol_hook
15458 #define elf_backend_output_arch_syms nds32_elf_output_arch_syms
15459 #define elf_backend_object_p nds32_elf_object_p
15460 #define elf_backend_final_write_processing nds32_elf_final_write_processing
15461 #define elf_backend_special_sections nds32_elf_special_sections
15462 #define bfd_elf32_bfd_get_relocated_section_contents \
15463 nds32_elf_get_relocated_section_contents
15464
15465 #define elf_backend_can_gc_sections 1
15466 #define elf_backend_can_refcount 1
15467 #define elf_backend_want_got_plt 1
15468 #define elf_backend_plt_readonly 1
15469 #define elf_backend_want_plt_sym 0
15470 #define elf_backend_got_header_size 12
15471 #define elf_backend_may_use_rel_p 1
15472 #define elf_backend_default_use_rela_p 1
15473 #define elf_backend_may_use_rela_p 1
15474 #define elf_backend_dtrel_excludes_plt 1
15475
15476 #include "elf32-target.h"
15477
15478 #undef ELF_MAXPAGESIZE
15479 #define ELF_MAXPAGESIZE 0x2000
15480
15481 #undef TARGET_BIG_SYM
15482 #define TARGET_BIG_SYM nds32_elf32_linux_be_vec
15483 #undef TARGET_BIG_NAME
15484 #define TARGET_BIG_NAME "elf32-nds32be-linux"
15485 #undef TARGET_LITTLE_SYM
15486 #define TARGET_LITTLE_SYM nds32_elf32_linux_le_vec
15487 #undef TARGET_LITTLE_NAME
15488 #define TARGET_LITTLE_NAME "elf32-nds32le-linux"
15489 #undef elf32_bed
15490 #define elf32_bed elf32_nds32_lin_bed
15491
15492 #include "elf32-target.h"
This page took 0.4607 seconds and 4 git commands to generate.