]> Git Repo - binutils.git/blob - bfd/elf32-nds32.c
asan: readelf: wild read in get_num_dynamic_syms
[binutils.git] / bfd / elf32-nds32.c
1 /* NDS32-specific support for 32-bit ELF.
2    Copyright (C) 2012-2020 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 "bfdlink.h"
26 #include "libbfd.h"
27 #include "elf-bfd.h"
28 #include "libiberty.h"
29 #include "elf/nds32.h"
30 #include "opcode/nds32.h"
31 #include "elf32-nds32.h"
32 #include "opcode/cgen.h"
33 #include "../opcodes/nds32-opc.h"
34
35 /* All users of this file have bfd_octets_per_byte (abfd, sec) == 1.  */
36 #define OCTETS_PER_BYTE(ABFD, SEC) 1
37
38 /* Relocation HOWTO functions.  */
39 static bfd_reloc_status_type nds32_elf_ignore_reloc
40   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
41 static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
42   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43 static bfd_reloc_status_type nds32_elf_hi20_reloc
44   (bfd *, arelent *, asymbol *, void *,
45    asection *, bfd *, char **);
46 static bfd_reloc_status_type nds32_elf_lo12_reloc
47   (bfd *, arelent *, asymbol *, void *,
48    asection *, bfd *, char **);
49 static bfd_reloc_status_type nds32_elf_generic_reloc
50   (bfd *, arelent *, asymbol *, void *,
51    asection *, bfd *, char **);
52 static bfd_reloc_status_type nds32_elf_sda15_reloc
53   (bfd *, arelent *, asymbol *, void *,
54    asection *, bfd *, char **);
55
56 /* Helper functions for HOWTO.  */
57 static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
58   (bfd *, reloc_howto_type *, asection *, bfd_byte *, bfd_vma,
59    asection *, bfd_vma, bfd_vma);
60
61 /* Nds32 helper functions.  */
62 static bfd_vma calculate_memory_address
63   (bfd *, Elf_Internal_Rela *, Elf_Internal_Sym *, Elf_Internal_Shdr *);
64 static int nds32_get_section_contents (bfd *, asection *,
65                                        bfd_byte **, bfd_boolean);
66 static int nds32_get_local_syms (bfd *, asection *ATTRIBUTE_UNUSED,
67                                  Elf_Internal_Sym **);
68 static bfd_boolean  nds32_relax_fp_as_gp
69   (struct bfd_link_info *link_info, bfd *abfd, asection *sec,
70    Elf_Internal_Rela *internal_relocs, Elf_Internal_Rela *irelend,
71    Elf_Internal_Sym *isymbuf);
72 static bfd_boolean nds32_fag_remove_unused_fpbase
73   (bfd *abfd, asection *sec, Elf_Internal_Rela *internal_relocs,
74    Elf_Internal_Rela *irelend);
75
76 enum
77 {
78   MACH_V1 = bfd_mach_n1h,
79   MACH_V2 = bfd_mach_n1h_v2,
80   MACH_V3 = bfd_mach_n1h_v3,
81   MACH_V3M = bfd_mach_n1h_v3m
82 };
83
84 #define MIN(a, b) ((a) > (b) ? (b) : (a))
85 #define MAX(a, b) ((a) > (b) ? (a) : (b))
86
87 /* The name of the dynamic interpreter.  This is put in the .interp
88    section.  */
89 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
90
91 #define NDS32_GUARD_SEC_P(flags) ((flags) & SEC_ALLOC \
92                                   && (flags) & SEC_LOAD \
93                                   && (flags) & SEC_READONLY)
94
95 /* The nop opcode we use.  */
96 #define NDS32_NOP32 0x40000009
97 #define NDS32_NOP16 0x9200
98
99 /* The size in bytes of an entry in the procedure linkage table.  */
100 #define PLT_ENTRY_SIZE 24
101 #define PLT_HEADER_SIZE 24
102
103 /* The first entry in a procedure linkage table are reserved,
104    and the initial contents are unimportant (we zero them out).
105    Subsequent entries look like this.  */
106 #define PLT0_ENTRY_WORD0  0x46f00000            /* sethi   r15, HI20(.got+4)      */
107 #define PLT0_ENTRY_WORD1  0x58f78000            /* ori     r15, r25, LO12(.got+4) */
108 #define PLT0_ENTRY_WORD2  0x05178000            /* lwi     r17, [r15+0]           */
109 #define PLT0_ENTRY_WORD3  0x04f78001            /* lwi     r15, [r15+4]           */
110 #define PLT0_ENTRY_WORD4  0x4a003c00            /* jr      r15                    */
111
112 /* $ta is change to $r15 (from $r25).  */
113 #define PLT0_PIC_ENTRY_WORD0  0x46f00000        /* sethi   r15, HI20(got[1]@GOT)  */
114 #define PLT0_PIC_ENTRY_WORD1  0x58f78000        /* ori     r15, r15, LO12(got[1]@GOT) */
115 #define PLT0_PIC_ENTRY_WORD2  0x40f7f400        /* add     r15, gp, r15           */
116 #define PLT0_PIC_ENTRY_WORD3  0x05178000        /* lwi     r17, [r15+0]           */
117 #define PLT0_PIC_ENTRY_WORD4  0x04f78001        /* lwi     r15, [r15+4]           */
118 #define PLT0_PIC_ENTRY_WORD5  0x4a003c00        /* jr      r15                    */
119
120 #define PLT_ENTRY_WORD0  0x46f00000             /* sethi   r15, HI20(&got[n+3])      */
121 #define PLT_ENTRY_WORD1  0x04f78000             /* lwi     r15, r15, LO12(&got[n+3]) */
122 #define PLT_ENTRY_WORD2  0x4a003c00             /* jr      r15                       */
123 #define PLT_ENTRY_WORD3  0x45000000             /* movi    r16, sizeof(RELA) * n     */
124 #define PLT_ENTRY_WORD4  0x48000000             /* j      .plt0.                     */
125
126 #define PLT_PIC_ENTRY_WORD0  0x46f00000         /* sethi  r15, HI20(got[n+3]@GOT)    */
127 #define PLT_PIC_ENTRY_WORD1  0x58f78000         /* ori    r15, r15,    LO12(got[n+3]@GOT) */
128 #define PLT_PIC_ENTRY_WORD2  0x38febc02         /* lw     r15, [gp+r15]              */
129 #define PLT_PIC_ENTRY_WORD3  0x4a003c00         /* jr     r15                        */
130 #define PLT_PIC_ENTRY_WORD4  0x45000000         /* movi   r16, sizeof(RELA) * n      */
131 #define PLT_PIC_ENTRY_WORD5  0x48000000         /* j      .plt0                      */
132
133 /* These are macros used to get the relocation accurate value.  */
134 #define ACCURATE_8BIT_S1        (0x100)
135 #define ACCURATE_U9BIT_S1       (0x400)
136 #define ACCURATE_12BIT_S1       (0x2000)
137 #define ACCURATE_14BIT_S1       (0x4000)
138 #define ACCURATE_19BIT          (0x40000)
139
140 /* These are macros used to get the relocation conservative value.  */
141 #define CONSERVATIVE_8BIT_S1    (0x100 - 4)
142 #define CONSERVATIVE_14BIT_S1   (0x4000 - 4)
143 #define CONSERVATIVE_16BIT_S1   (0x10000 - 4)
144 #define CONSERVATIVE_24BIT_S1   (0x1000000 - 4)
145 /* These must be more conservative because the address may be in
146    different segment.  */
147 #define CONSERVATIVE_15BIT      (0x4000 - 0x1000)
148 #define CONSERVATIVE_15BIT_S1   (0x8000 - 0x1000)
149 #define CONSERVATIVE_15BIT_S2   (0x10000 - 0x1000)
150 #define CONSERVATIVE_19BIT      (0x40000 - 0x1000)
151 #define CONSERVATIVE_20BIT      (0x80000 - 0x1000)
152
153 /* Size of small data/bss sections, used to calculate SDA_BASE.  */
154 static long got_size = 0;
155 static int is_SDA_BASE_set = 0;
156
157 /* Convert ELF-VER in eflags to string for debugging purpose.  */
158 static const char *const nds32_elfver_strtab[] =
159 {
160   "ELF-1.2",
161   "ELF-1.3",
162   "ELF-1.4",
163 };
164
165 /* The nds32 linker needs to keep track of the number of relocs that it
166    decides to copy in check_relocs for each symbol.  This is so that
167    it can discard PC relative relocs if it doesn't need them when
168    linking with -Bsymbolic.  We store the information in a field
169    extending the regular ELF linker hash table.  */
170
171 /* This structure keeps track of the number of PC relative relocs we
172    have copied for a given symbol.  */
173
174 struct elf_nds32_pcrel_relocs_copied
175 {
176   /* Next section.  */
177   struct elf_nds32_pcrel_relocs_copied *next;
178   /* A section in dynobj.  */
179   asection *section;
180   /* Number of relocs copied in this section.  */
181   bfd_size_type count;
182 };
183
184 enum elf_nds32_tls_type
185 {
186   GOT_UNKNOWN = (0),
187   GOT_NORMAL = (1 << 0),
188   GOT_TLS_LE = (1 << 1),
189   GOT_TLS_IE = (1 << 2),
190   GOT_TLS_IEGP = (1 << 3),
191   GOT_TLS_LD = (1 << 4),
192   GOT_TLS_GD = (1 << 5),
193   GOT_TLS_DESC = (1 << 6),
194 };
195
196 /* Nds32 ELF linker hash entry.  */
197
198 struct elf_nds32_link_hash_entry
199 {
200   struct elf_link_hash_entry root;
201
202   /* Track dynamic relocs copied for this symbol.  */
203   struct elf_dyn_relocs *dyn_relocs;
204
205   /* For checking relocation type.  */
206   enum elf_nds32_tls_type tls_type;
207
208   int offset_to_gp;
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
216 /* The offset for executable tls relaxation.  */
217 #define TP_OFFSET 0x0
218
219 typedef struct
220 {
221   int min_id;
222   int max_id;
223   int count;
224   int bias;
225   int init;
226 } elf32_nds32_relax_group_t;
227
228 struct elf_nds32_obj_tdata
229 {
230   struct elf_obj_tdata root;
231
232   /* tls_type for each local got entry.  */
233   char *local_got_tls_type;
234
235   /* GOTPLT entries for TLS descriptors.  */
236   bfd_vma *local_tlsdesc_gotent;
237
238   /* for R_NDS32_RELAX_GROUP handling.  */
239   elf32_nds32_relax_group_t relax_group;
240
241   unsigned int hdr_size;
242   int* offset_to_gp;
243 };
244
245 #define elf_nds32_tdata(bfd) \
246   ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
247
248 #define elf32_nds32_local_got_tls_type(bfd) \
249   (elf_nds32_tdata (bfd)->local_got_tls_type)
250
251 #define elf32_nds32_local_gp_offset(bfd) \
252   (elf_nds32_tdata (bfd)->offset_to_gp)
253
254 #define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
255
256 #define elf32_nds32_relax_group_ptr(bfd) \
257   &(elf_nds32_tdata (bfd)->relax_group)
258
259 static bfd_boolean
260 nds32_elf_mkobject (bfd *abfd)
261 {
262   return bfd_elf_allocate_object (abfd, sizeof (struct elf_nds32_obj_tdata),
263                                   NDS32_ELF_DATA);
264 }
265
266 /* Relocations used for relocation.  */
267 /* Define HOWTO2 (for relocation) and HOWTO3 (for relaxation) to
268    initialize array nds32_elf_howto_table in any order. The benefit
269    is that we can add any new relocations with any numbers and don't
270    need to fill the gap by lots of EMPTY_HOWTO. */
271 #define HOWTO2(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
272   [C] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC)
273
274 static reloc_howto_type nds32_elf_howto_table[] =
275 {
276   /* This reloc does nothing.  */
277   HOWTO2 (R_NDS32_NONE,         /* 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          bfd_elf_generic_reloc, /* special_function  */
285          "R_NDS32_NONE",        /* name  */
286          FALSE,                 /* partial_inplace  */
287          0,                     /* src_mask  */
288          0,                     /* dst_mask  */
289          FALSE),                /* pcrel_offset  */
290
291   /* A 16 bit absolute relocation.  */
292   HOWTO2 (R_NDS32_16,           /* type  */
293          0,                     /* rightshift  */
294          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
295          16,                    /* bitsize  */
296          FALSE,                 /* pc_relative  */
297          0,                     /* bitpos  */
298          complain_overflow_bitfield,/* complain_on_overflow  */
299          nds32_elf_generic_reloc,/* special_function  */
300          "R_NDS32_16",          /* name  */
301          FALSE,                 /* partial_inplace  */
302          0xffff,                /* src_mask  */
303          0xffff,                /* dst_mask  */
304          FALSE),                /* pcrel_offset  */
305
306   /* A 32 bit absolute relocation.  */
307   HOWTO2 (R_NDS32_32,           /* type  */
308          0,                     /* rightshift  */
309          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
310          32,                    /* bitsize  */
311          FALSE,                 /* pc_relative  */
312          0,                     /* bitpos  */
313          complain_overflow_bitfield,/* complain_on_overflow  */
314          nds32_elf_generic_reloc,/* special_function  */
315          "R_NDS32_32",          /* name  */
316          FALSE,                 /* partial_inplace  */
317          0xffffffff,            /* src_mask  */
318          0xffffffff,            /* dst_mask  */
319          FALSE),                /* pcrel_offset  */
320
321   /* A 20 bit address.  */
322   HOWTO2 (R_NDS32_20,           /* type  */
323          0,                     /* rightshift  */
324          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
325          20,                    /* bitsize  */
326          FALSE,                 /* pc_relative  */
327          0,                     /* bitpos  */
328          complain_overflow_unsigned,/* complain_on_overflow  */
329          nds32_elf_generic_reloc,/* special_function  */
330          "R_NDS32_20",          /* name  */
331          FALSE,                 /* partial_inplace  */
332          0xfffff,               /* src_mask  */
333          0xfffff,               /* dst_mask  */
334          FALSE),                /* pcrel_offset  */
335
336   /* An PC Relative 9-bit relocation, shifted by 2.
337      This reloc is complicated because relocations are relative to pc & -4.
338      i.e. branches in the right insn slot use the address of the left insn
339      slot for pc.  */
340   /* It's not clear whether this should have partial_inplace set or not.
341      Branch relaxing in the assembler can store the addend in the insn,
342      and if bfd_install_relocation gets called the addend may get added
343      again.  */
344   HOWTO2 (R_NDS32_9_PCREL,      /* type  */
345          1,                     /* rightshift  */
346          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
347          8,                     /* bitsize  */
348          TRUE,                  /* pc_relative  */
349          0,                     /* bitpos  */
350          complain_overflow_signed,/* complain_on_overflow  */
351          nds32_elf_9_pcrel_reloc,/* special_function  */
352          "R_NDS32_9_PCREL",     /* name  */
353          FALSE,                 /* partial_inplace  */
354          0xff,                  /* src_mask  */
355          0xff,                  /* dst_mask  */
356          TRUE),                 /* pcrel_offset  */
357
358   /* A relative 15 bit relocation, right shifted by 1.  */
359   HOWTO2 (R_NDS32_15_PCREL,     /* type  */
360          1,                     /* rightshift  */
361          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
362          14,                    /* bitsize  */
363          TRUE,                  /* pc_relative  */
364          0,                     /* bitpos  */
365          complain_overflow_signed,/* complain_on_overflow  */
366          bfd_elf_generic_reloc, /* special_function  */
367          "R_NDS32_15_PCREL",    /* name  */
368          FALSE,                 /* partial_inplace  */
369          0x3fff,                /* src_mask  */
370          0x3fff,                /* dst_mask  */
371          TRUE),                 /* pcrel_offset  */
372
373   /* A relative 17 bit relocation, right shifted by 1.  */
374   HOWTO2 (R_NDS32_17_PCREL,     /* type  */
375          1,                     /* rightshift  */
376          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
377          16,                    /* bitsize  */
378          TRUE,                  /* pc_relative  */
379          0,                     /* bitpos  */
380          complain_overflow_signed,/* complain_on_overflow  */
381          bfd_elf_generic_reloc, /* special_function  */
382          "R_NDS32_17_PCREL",    /* name  */
383          FALSE,                 /* partial_inplace  */
384          0xffff,                /* src_mask  */
385          0xffff,                /* dst_mask  */
386          TRUE),                 /* pcrel_offset  */
387
388   /* A relative 25 bit relocation, right shifted by 1.  */
389   /* It's not clear whether this should have partial_inplace set or not.
390      Branch relaxing in the assembler can store the addend in the insn,
391      and if bfd_install_relocation gets called the addend may get added
392      again.  */
393   HOWTO2 (R_NDS32_25_PCREL,     /* type  */
394          1,                     /* rightshift  */
395          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
396          24,                    /* bitsize  */
397          TRUE,                  /* pc_relative  */
398          0,                     /* bitpos  */
399          complain_overflow_signed,/* complain_on_overflow  */
400          bfd_elf_generic_reloc, /* special_function  */
401          "R_NDS32_25_PCREL",    /* name  */
402          FALSE,                 /* partial_inplace  */
403          0xffffff,              /* src_mask  */
404          0xffffff,              /* dst_mask  */
405          TRUE),                 /* pcrel_offset  */
406
407   /* High 20 bits of address when lower 12 is or'd in.  */
408   HOWTO2 (R_NDS32_HI20,         /* type  */
409          12,                    /* rightshift  */
410          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
411          20,                    /* bitsize  */
412          FALSE,                 /* pc_relative  */
413          0,                     /* bitpos  */
414          complain_overflow_dont,/* complain_on_overflow  */
415          nds32_elf_hi20_reloc,  /* special_function  */
416          "R_NDS32_HI20",        /* name  */
417          FALSE,                 /* partial_inplace  */
418          0x000fffff,            /* src_mask  */
419          0x000fffff,            /* dst_mask  */
420          FALSE),                /* pcrel_offset  */
421
422   /* Lower 12 bits of address.  */
423   HOWTO2 (R_NDS32_LO12S3,       /* type  */
424          3,                     /* rightshift  */
425          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
426          9,                     /* 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_LO12S3",      /* name  */
432          FALSE,                 /* partial_inplace  */
433          0x000001ff,            /* src_mask  */
434          0x000001ff,            /* dst_mask  */
435          FALSE),                /* pcrel_offset  */
436
437   /* Lower 12 bits of address.  */
438   HOWTO2 (R_NDS32_LO12S2,       /* type  */
439          2,                     /* rightshift  */
440          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
441          10,                    /* 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_LO12S2",      /* name  */
447          FALSE,                 /* partial_inplace  */
448          0x000003ff,            /* src_mask  */
449          0x000003ff,            /* dst_mask  */
450          FALSE),                /* pcrel_offset  */
451
452   /* Lower 12 bits of address.  */
453   HOWTO2 (R_NDS32_LO12S1,       /* type  */
454          1,                     /* rightshift  */
455          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
456          11,                    /* bitsize  */
457          FALSE,                 /* pc_relative  */
458          0,                     /* bitpos  */
459          complain_overflow_dont,/* complain_on_overflow  */
460          nds32_elf_lo12_reloc,  /* special_function  */
461          "R_NDS32_LO12S1",      /* name  */
462          FALSE,                 /* partial_inplace  */
463          0x000007ff,            /* src_mask  */
464          0x000007ff,            /* dst_mask  */
465          FALSE),                /* pcrel_offset  */
466
467   /* Lower 12 bits of address.  */
468   HOWTO2 (R_NDS32_LO12S0,       /* type  */
469          0,                     /* rightshift  */
470          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
471          12,                    /* bitsize  */
472          FALSE,                 /* pc_relative  */
473          0,                     /* bitpos  */
474          complain_overflow_dont,/* complain_on_overflow  */
475          nds32_elf_lo12_reloc,  /* special_function  */
476          "R_NDS32_LO12S0",      /* name  */
477          FALSE,                 /* partial_inplace  */
478          0x00000fff,            /* src_mask  */
479          0x00000fff,            /* dst_mask  */
480          FALSE),                /* pcrel_offset  */
481
482   /* Small data area 15 bits offset.  */
483   HOWTO2 (R_NDS32_SDA15S3,      /* type  */
484          3,                     /* 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_SDA15S3",     /* 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   HOWTO2 (R_NDS32_SDA15S2,      /* type  */
499          2,                     /* 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_SDA15S2",     /* name  */
507          FALSE,                 /* partial_inplace  */
508          0x00007fff,            /* src_mask  */
509          0x00007fff,            /* dst_mask  */
510          FALSE),                /* pcrel_offset  */
511
512   /* Small data area 15 bits offset.  */
513   HOWTO2 (R_NDS32_SDA15S1,      /* type  */
514          1,                     /* rightshift  */
515          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
516          15,                    /* bitsize  */
517          FALSE,                 /* pc_relative  */
518          0,                     /* bitpos  */
519          complain_overflow_signed,/* complain_on_overflow  */
520          nds32_elf_sda15_reloc, /* special_function  */
521          "R_NDS32_SDA15S1",     /* name  */
522          FALSE,                 /* partial_inplace  */
523          0x00007fff,            /* src_mask  */
524          0x00007fff,            /* dst_mask  */
525          FALSE),                /* pcrel_offset  */
526
527   /* Small data area 15 bits offset.  */
528   HOWTO2 (R_NDS32_SDA15S0,      /* type  */
529          0,                     /* rightshift  */
530          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
531          15,                    /* bitsize  */
532          FALSE,                 /* pc_relative  */
533          0,                     /* bitpos  */
534          complain_overflow_signed,/* complain_on_overflow  */
535          nds32_elf_sda15_reloc, /* special_function  */
536          "R_NDS32_SDA15S0",     /* name  */
537          FALSE,                 /* partial_inplace  */
538          0x00007fff,            /* src_mask  */
539          0x00007fff,            /* dst_mask  */
540          FALSE),                /* pcrel_offset  */
541
542   /* GNU extension to record C++ vtable hierarchy  */
543   HOWTO2 (R_NDS32_GNU_VTINHERIT,/* type  */
544          0,                     /* rightshift  */
545          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
546          0,                     /* bitsize  */
547          FALSE,                 /* pc_relative  */
548          0,                     /* bitpos  */
549          complain_overflow_dont,/* complain_on_overflow  */
550          NULL,                  /* special_function  */
551          "R_NDS32_GNU_VTINHERIT",/* name  */
552          FALSE,                 /* partial_inplace  */
553          0,                     /* src_mask  */
554          0,                     /* dst_mask  */
555          FALSE),                /* pcrel_offset  */
556
557   /* GNU extension to record C++ vtable member usage  */
558   HOWTO2 (R_NDS32_GNU_VTENTRY,  /* type  */
559          0,                     /* rightshift  */
560          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
561          0,                     /* bitsize  */
562          FALSE,                 /* pc_relative  */
563          0,                     /* bitpos  */
564          complain_overflow_dont,/* complain_on_overflow  */
565          _bfd_elf_rel_vtable_reloc_fn,/* special_function  */
566          "R_NDS32_GNU_VTENTRY", /* name  */
567          FALSE,                 /* partial_inplace  */
568          0,                     /* src_mask  */
569          0,                     /* dst_mask  */
570          FALSE),                /* pcrel_offset  */
571
572   /* A 16 bit absolute relocation.  */
573   HOWTO2 (R_NDS32_16_RELA,      /* type  */
574          0,                     /* rightshift  */
575          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
576          16,                    /* bitsize  */
577          FALSE,                 /* pc_relative  */
578          0,                     /* bitpos  */
579          complain_overflow_bitfield,/* complain_on_overflow  */
580          bfd_elf_generic_reloc, /* special_function  */
581          "R_NDS32_16_RELA",     /* name  */
582          FALSE,                 /* partial_inplace  */
583          0xffff,                /* src_mask  */
584          0xffff,                /* dst_mask  */
585          FALSE),                /* pcrel_offset  */
586
587   /* A 32 bit absolute relocation.  */
588   HOWTO2 (R_NDS32_32_RELA,      /* type  */
589          0,                     /* rightshift  */
590          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
591          32,                    /* bitsize  */
592          FALSE,                 /* pc_relative  */
593          0,                     /* bitpos  */
594          complain_overflow_bitfield,/* complain_on_overflow  */
595          bfd_elf_generic_reloc, /* special_function  */
596          "R_NDS32_32_RELA",     /* name  */
597          FALSE,                 /* partial_inplace  */
598          0xffffffff,            /* src_mask  */
599          0xffffffff,            /* dst_mask  */
600          FALSE),                /* pcrel_offset  */
601
602   /* A 20 bit address.  */
603   HOWTO2 (R_NDS32_20_RELA,      /* type  */
604          0,                     /* rightshift  */
605          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
606          20,                    /* bitsize  */
607          FALSE,                 /* pc_relative  */
608          0,                     /* bitpos  */
609          complain_overflow_signed,/* complain_on_overflow  */
610          bfd_elf_generic_reloc, /* special_function  */
611          "R_NDS32_20_RELA",     /* name  */
612          FALSE,                 /* partial_inplace  */
613          0xfffff,               /* src_mask  */
614          0xfffff,               /* dst_mask  */
615          FALSE),                /* pcrel_offset  */
616
617   HOWTO2 (R_NDS32_9_PCREL_RELA, /* type  */
618          1,                     /* rightshift  */
619          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
620          8,                     /* 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_9_PCREL_RELA",/* name  */
626          FALSE,                 /* partial_inplace  */
627          0xff,                  /* src_mask  */
628          0xff,                  /* dst_mask  */
629          TRUE),                 /* pcrel_offset  */
630
631   /* A relative 15 bit relocation, right shifted by 1.  */
632   HOWTO2 (R_NDS32_15_PCREL_RELA,/* type  */
633          1,                     /* rightshift  */
634          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
635          14,                    /* 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_15_PCREL_RELA",/* name  */
641          FALSE,                 /* partial_inplace  */
642          0x3fff,                /* src_mask  */
643          0x3fff,                /* dst_mask  */
644          TRUE),                 /* pcrel_offset  */
645
646   /* A relative 17 bit relocation, right shifted by 1.  */
647   HOWTO2 (R_NDS32_17_PCREL_RELA,/* type  */
648          1,                     /* rightshift  */
649          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
650          16,                    /* bitsize  */
651          TRUE,                  /* pc_relative  */
652          0,                     /* bitpos  */
653          complain_overflow_signed,/* complain_on_overflow  */
654          bfd_elf_generic_reloc, /* special_function  */
655          "R_NDS32_17_PCREL_RELA",/* name  */
656          FALSE,                 /* partial_inplace  */
657          0xffff,                /* src_mask  */
658          0xffff,                /* dst_mask  */
659          TRUE),                 /* pcrel_offset  */
660
661   /* A relative 25 bit relocation, right shifted by 2.  */
662   HOWTO2 (R_NDS32_25_PCREL_RELA,/* type  */
663          1,                     /* rightshift  */
664          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
665          24,                    /* bitsize  */
666          TRUE,                  /* pc_relative  */
667          0,                     /* bitpos  */
668          complain_overflow_signed,/* complain_on_overflow  */
669          bfd_elf_generic_reloc, /* special_function  */
670          "R_NDS32_25_PCREL_RELA",/* name  */
671          FALSE,                 /* partial_inplace  */
672          0xffffff,              /* src_mask  */
673          0xffffff,              /* dst_mask  */
674          TRUE),                 /* pcrel_offset  */
675
676   /* High 20 bits of address when lower 16 is or'd in.  */
677   HOWTO2 (R_NDS32_HI20_RELA,    /* type  */
678          12,                    /* rightshift  */
679          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
680          20,                    /* 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_HI20_RELA",   /* name  */
686          FALSE,                 /* partial_inplace  */
687          0x000fffff,            /* src_mask  */
688          0x000fffff,            /* dst_mask  */
689          FALSE),                /* pcrel_offset  */
690
691   /* Lower 12 bits of address.  */
692   HOWTO2 (R_NDS32_LO12S3_RELA,  /* type  */
693          3,                     /* rightshift  */
694          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
695          9,                     /* 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_LO12S3_RELA", /* name  */
701          FALSE,                 /* partial_inplace  */
702          0x000001ff,            /* src_mask  */
703          0x000001ff,            /* dst_mask  */
704          FALSE),                /* pcrel_offset  */
705
706   /* Lower 12 bits of address.  */
707   HOWTO2 (R_NDS32_LO12S2_RELA,  /* type  */
708          2,                     /* rightshift  */
709          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
710          10,                    /* 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_LO12S2_RELA", /* name  */
716          FALSE,                 /* partial_inplace  */
717          0x000003ff,            /* src_mask  */
718          0x000003ff,            /* dst_mask  */
719          FALSE),                /* pcrel_offset  */
720
721   /* Lower 12 bits of address.  */
722   HOWTO2 (R_NDS32_LO12S1_RELA,  /* type  */
723          1,                     /* rightshift  */
724          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
725          11,                    /* bitsize  */
726          FALSE,                 /* pc_relative  */
727          0,                     /* bitpos  */
728          complain_overflow_dont,/* complain_on_overflow  */
729          bfd_elf_generic_reloc, /* special_function  */
730          "R_NDS32_LO12S1_RELA", /* name  */
731          FALSE,                 /* partial_inplace  */
732          0x000007ff,            /* src_mask  */
733          0x000007ff,            /* dst_mask  */
734          FALSE),                /* pcrel_offset  */
735
736   /* Lower 12 bits of address.  */
737   HOWTO2 (R_NDS32_LO12S0_RELA,  /* type  */
738          0,                     /* rightshift  */
739          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
740          12,                    /* bitsize  */
741          FALSE,                 /* pc_relative  */
742          0,                     /* bitpos  */
743          complain_overflow_dont,/* complain_on_overflow  */
744          bfd_elf_generic_reloc, /* special_function  */
745          "R_NDS32_LO12S0_RELA", /* name  */
746          FALSE,                 /* partial_inplace  */
747          0x00000fff,            /* src_mask  */
748          0x00000fff,            /* dst_mask  */
749          FALSE),                /* pcrel_offset  */
750
751   /* Small data area 15 bits offset.  */
752   HOWTO2 (R_NDS32_SDA15S3_RELA, /* type  */
753          3,                     /* rightshift  */
754          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
755          15,                    /* bitsize  */
756          FALSE,                 /* pc_relative  */
757          0,                     /* bitpos  */
758          complain_overflow_signed,/* complain_on_overflow  */
759          bfd_elf_generic_reloc, /* special_function  */
760          "R_NDS32_SDA15S3_RELA",/* name  */
761          FALSE,                 /* partial_inplace  */
762          0x00007fff,            /* src_mask  */
763          0x00007fff,            /* dst_mask  */
764          FALSE),                /* pcrel_offset  */
765
766   /* Small data area 15 bits offset.  */
767   HOWTO2 (R_NDS32_SDA15S2_RELA, /* type  */
768          2,                     /* rightshift  */
769          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
770          15,                    /* bitsize  */
771          FALSE,                 /* pc_relative  */
772          0,                     /* bitpos  */
773          complain_overflow_signed,/* complain_on_overflow  */
774          bfd_elf_generic_reloc, /* special_function  */
775          "R_NDS32_SDA15S2_RELA",/* name  */
776          FALSE,                 /* partial_inplace  */
777          0x00007fff,            /* src_mask  */
778          0x00007fff,            /* dst_mask  */
779          FALSE),                /* pcrel_offset  */
780
781   HOWTO2 (R_NDS32_SDA15S1_RELA, /* type  */
782          1,                     /* rightshift  */
783          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
784          15,                    /* bitsize  */
785          FALSE,                 /* pc_relative  */
786          0,                     /* bitpos  */
787          complain_overflow_signed,/* complain_on_overflow  */
788          bfd_elf_generic_reloc, /* special_function  */
789          "R_NDS32_SDA15S1_RELA",/* name  */
790          FALSE,                 /* partial_inplace  */
791          0x00007fff,            /* src_mask  */
792          0x00007fff,            /* dst_mask  */
793          FALSE),                /* pcrel_offset  */
794
795   HOWTO2 (R_NDS32_SDA15S0_RELA, /* type  */
796          0,                     /* rightshift  */
797          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
798          15,                    /* bitsize  */
799          FALSE,                 /* pc_relative  */
800          0,                     /* bitpos  */
801          complain_overflow_signed,/* complain_on_overflow  */
802          bfd_elf_generic_reloc, /* special_function  */
803          "R_NDS32_SDA15S0_RELA",/* name  */
804          FALSE,                 /* partial_inplace  */
805          0x00007fff,            /* src_mask  */
806          0x00007fff,            /* dst_mask  */
807          FALSE),                /* pcrel_offset  */
808
809   /* GNU extension to record C++ vtable hierarchy  */
810   HOWTO2 (R_NDS32_RELA_GNU_VTINHERIT,/* type  */
811          0,                     /* rightshift  */
812          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
813          0,                     /* bitsize  */
814          FALSE,                 /* pc_relative  */
815          0,                     /* bitpos  */
816          complain_overflow_dont,/* complain_on_overflow  */
817          NULL,                  /* special_function  */
818          "R_NDS32_RELA_GNU_VTINHERIT",/* name  */
819          FALSE,                 /* partial_inplace  */
820          0,                     /* src_mask  */
821          0,                     /* dst_mask  */
822          FALSE),                /* pcrel_offset  */
823
824   /* GNU extension to record C++ vtable member usage  */
825   HOWTO2 (R_NDS32_RELA_GNU_VTENTRY,/* type  */
826          0,                     /* rightshift  */
827          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
828          0,                     /* bitsize  */
829          FALSE,                 /* pc_relative  */
830          0,                     /* bitpos  */
831          complain_overflow_dont,/* complain_on_overflow  */
832          _bfd_elf_rel_vtable_reloc_fn,/* special_function  */
833          "R_NDS32_RELA_GNU_VTENTRY",/* name  */
834          FALSE,                 /* partial_inplace  */
835          0,                     /* src_mask  */
836          0,                     /* dst_mask  */
837          FALSE),                /* pcrel_offset  */
838
839   /* Like R_NDS32_20, but referring to the GOT table entry for
840      the symbol.  */
841   HOWTO2 (R_NDS32_GOT20,        /* type  */
842          0,                     /* rightshift  */
843          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
844          20,                    /* bitsize  */
845          FALSE,                 /* pc_relative  */
846          0,                     /* bitpos  */
847          complain_overflow_signed,/* complain_on_overflow  */
848          bfd_elf_generic_reloc, /* special_function  */
849          "R_NDS32_GOT20",       /* name  */
850          FALSE,                 /* partial_inplace  */
851          0xfffff,               /* src_mask  */
852          0xfffff,               /* dst_mask  */
853          FALSE),                /* pcrel_offset  */
854
855   /* Like R_NDS32_PCREL, but referring to the procedure linkage table
856      entry for the symbol.  */
857   HOWTO2 (R_NDS32_25_PLTREL,    /* type  */
858          1,                     /* rightshift  */
859          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
860          24,                    /* bitsize  */
861          TRUE,                  /* pc_relative  */
862          0,                     /* bitpos  */
863          complain_overflow_signed,/* complain_on_overflow  */
864          bfd_elf_generic_reloc, /* special_function  */
865          "R_NDS32_25_PLTREL",   /* name  */
866          FALSE,                 /* partial_inplace  */
867          0xffffff,              /* src_mask  */
868          0xffffff,              /* dst_mask  */
869          TRUE),                 /* pcrel_offset  */
870
871   /* This is used only by the dynamic linker.  The symbol should exist
872      both in the object being run and in some shared library.  The
873      dynamic linker copies the data addressed by the symbol from the
874      shared library into the object, because the object being
875      run has to have the data at some particular address.  */
876   HOWTO2 (R_NDS32_COPY,         /* type  */
877          0,                     /* rightshift  */
878          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
879          32,                    /* bitsize  */
880          FALSE,                 /* pc_relative  */
881          0,                     /* bitpos  */
882          complain_overflow_bitfield,/* complain_on_overflow  */
883          bfd_elf_generic_reloc, /* special_function  */
884          "R_NDS32_COPY",        /* name  */
885          FALSE,                 /* partial_inplace  */
886          0xffffffff,            /* src_mask  */
887          0xffffffff,            /* dst_mask  */
888          FALSE),                /* pcrel_offset  */
889
890   /* Like R_NDS32_20, but used when setting global offset table
891      entries.  */
892   HOWTO2 (R_NDS32_GLOB_DAT,     /* type  */
893          0,                     /* rightshift  */
894          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
895          32,                    /* bitsize  */
896          FALSE,                 /* pc_relative  */
897          0,                     /* bitpos  */
898          complain_overflow_bitfield,/* complain_on_overflow  */
899          bfd_elf_generic_reloc, /* special_function  */
900          "R_NDS32_GLOB_DAT",    /* name  */
901          FALSE,                 /* partial_inplace  */
902          0xffffffff,            /* src_mask  */
903          0xffffffff,            /* dst_mask  */
904          FALSE),                /* pcrel_offset  */
905
906   /* Marks a procedure linkage table entry for a symbol.  */
907   HOWTO2 (R_NDS32_JMP_SLOT,     /* type  */
908          0,                     /* rightshift  */
909          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
910          32,                    /* bitsize  */
911          FALSE,                 /* pc_relative  */
912          0,                     /* bitpos  */
913          complain_overflow_bitfield,/* complain_on_overflow  */
914          bfd_elf_generic_reloc, /* special_function  */
915          "R_NDS32_JMP_SLOT",    /* name  */
916          FALSE,                 /* partial_inplace  */
917          0xffffffff,            /* src_mask  */
918          0xffffffff,            /* dst_mask  */
919          FALSE),                /* pcrel_offset  */
920
921   /* Used only by the dynamic linker.  When the object is run, this
922      longword is set to the load address of the object, plus the
923      addend.  */
924   HOWTO2 (R_NDS32_RELATIVE,     /* type  */
925          0,                     /* rightshift  */
926          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
927          32,                    /* bitsize  */
928          FALSE,                 /* pc_relative  */
929          0,                     /* bitpos  */
930          complain_overflow_bitfield,/* complain_on_overflow  */
931          bfd_elf_generic_reloc, /* special_function  */
932          "R_NDS32_RELATIVE",    /* name  */
933          FALSE,                 /* partial_inplace  */
934          0xffffffff,            /* src_mask  */
935          0xffffffff,            /* dst_mask  */
936          FALSE),                /* pcrel_offset  */
937
938   HOWTO2 (R_NDS32_GOTOFF,       /* type  */
939          0,                     /* rightshift  */
940          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
941          20,                    /* bitsize  */
942          FALSE,                 /* pc_relative  */
943          0,                     /* bitpos  */
944          complain_overflow_signed,/* complain_on_overflow  */
945          bfd_elf_generic_reloc, /* special_function  */
946          "R_NDS32_GOTOFF",      /* name  */
947          FALSE,                 /* partial_inplace  */
948          0xfffff,               /* src_mask  */
949          0xfffff,               /* dst_mask  */
950          FALSE),                /* pcrel_offset  */
951
952   /* An PC Relative 20-bit relocation used when setting PIC offset
953      table register.  */
954   HOWTO2 (R_NDS32_GOTPC20,      /* type  */
955          0,                     /* rightshift  */
956          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
957          20,                    /* bitsize  */
958          TRUE,                  /* pc_relative  */
959          0,                     /* bitpos  */
960          complain_overflow_signed,/* complain_on_overflow  */
961          bfd_elf_generic_reloc, /* special_function  */
962          "R_NDS32_GOTPC20",     /* name  */
963          FALSE,                 /* partial_inplace  */
964          0xfffff,               /* src_mask  */
965          0xfffff,               /* dst_mask  */
966          TRUE),                 /* pcrel_offset  */
967
968   /* Like R_NDS32_HI20, but referring to the GOT table entry for
969      the symbol.  */
970   HOWTO2 (R_NDS32_GOT_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_GOT_HI20",    /* name  */
979          FALSE,                 /* partial_inplace  */
980          0x000fffff,            /* src_mask  */
981          0x000fffff,            /* dst_mask  */
982          FALSE),                /* pcrel_offset  */
983   HOWTO2 (R_NDS32_GOT_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_GOT_LO12",    /* name  */
992          FALSE,                 /* partial_inplace  */
993          0x00000fff,            /* src_mask  */
994          0x00000fff,            /* dst_mask  */
995          FALSE),                /* pcrel_offset  */
996
997   /* An PC Relative relocation used when setting PIC offset table register.
998      Like R_NDS32_HI20, but referring to the GOT table entry for
999      the symbol.  */
1000   HOWTO2 (R_NDS32_GOTPC_HI20,   /* type  */
1001          12,                    /* rightshift  */
1002          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1003          20,                    /* bitsize  */
1004          FALSE,                 /* pc_relative  */
1005          0,                     /* bitpos  */
1006          complain_overflow_dont,/* complain_on_overflow  */
1007          bfd_elf_generic_reloc, /* special_function  */
1008          "R_NDS32_GOTPC_HI20",  /* name  */
1009          FALSE,                 /* partial_inplace  */
1010          0x000fffff,            /* src_mask  */
1011          0x000fffff,            /* dst_mask  */
1012          TRUE),                 /* pcrel_offset  */
1013   HOWTO2 (R_NDS32_GOTPC_LO12,   /* type  */
1014          0,                     /* rightshift  */
1015          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1016          12,                    /* bitsize  */
1017          FALSE,                 /* pc_relative  */
1018          0,                     /* bitpos  */
1019          complain_overflow_dont,/* complain_on_overflow  */
1020          bfd_elf_generic_reloc, /* special_function  */
1021          "R_NDS32_GOTPC_LO12",  /* name  */
1022          FALSE,                 /* partial_inplace  */
1023          0x00000fff,            /* src_mask  */
1024          0x00000fff,            /* dst_mask  */
1025          TRUE),                 /* pcrel_offset  */
1026
1027   HOWTO2 (R_NDS32_GOTOFF_HI20,  /* type  */
1028          12,                    /* rightshift  */
1029          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1030          20,                    /* bitsize  */
1031          FALSE,                 /* pc_relative  */
1032          0,                     /* bitpos  */
1033          complain_overflow_dont,/* complain_on_overflow  */
1034          bfd_elf_generic_reloc, /* special_function  */
1035          "R_NDS32_GOTOFF_HI20", /* name  */
1036          FALSE,                 /* partial_inplace  */
1037          0x000fffff,            /* src_mask  */
1038          0x000fffff,            /* dst_mask  */
1039          FALSE),                /* pcrel_offset  */
1040   HOWTO2 (R_NDS32_GOTOFF_LO12,  /* type  */
1041          0,                     /* rightshift  */
1042          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1043          12,                    /* bitsize  */
1044          FALSE,                 /* pc_relative  */
1045          0,                     /* bitpos  */
1046          complain_overflow_dont,/* complain_on_overflow  */
1047          bfd_elf_generic_reloc, /* special_function  */
1048          "R_NDS32_GOTOFF_LO12", /* name  */
1049          FALSE,                 /* partial_inplace  */
1050          0x00000fff,            /* src_mask  */
1051          0x00000fff,            /* dst_mask  */
1052          FALSE),                /* pcrel_offset  */
1053
1054   /* Alignment hint for relaxable instruction.  This is used with
1055      R_NDS32_LABEL as a pair.  Relax this instruction from 4 bytes to 2
1056      in order to make next label aligned on word boundary.  */
1057   HOWTO2 (R_NDS32_INSN16,       /* 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_INSN16",      /* name  */
1066          FALSE,                 /* partial_inplace  */
1067          0x00000fff,            /* src_mask  */
1068          0x00000fff,            /* dst_mask  */
1069          FALSE),                /* pcrel_offset  */
1070
1071   /* Alignment hint for label.  */
1072   HOWTO2 (R_NDS32_LABEL,        /* 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_LABEL",       /* name  */
1081          FALSE,                 /* partial_inplace  */
1082          0xffffffff,            /* src_mask  */
1083          0xffffffff,            /* dst_mask  */
1084          FALSE),                /* pcrel_offset  */
1085
1086   /* Relax hint for unconditional call sequence  */
1087   HOWTO2 (R_NDS32_LONGCALL1,    /* 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_LONGCALL1",   /* name  */
1096          FALSE,                 /* partial_inplace  */
1097          0xffffffff,            /* src_mask  */
1098          0xffffffff,            /* dst_mask  */
1099          FALSE),                /* pcrel_offset  */
1100
1101   /* Relax hint for conditional call sequence.  */
1102   HOWTO2 (R_NDS32_LONGCALL2,    /* 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_LONGCALL2",   /* name  */
1111          FALSE,                 /* partial_inplace  */
1112          0xffffffff,            /* src_mask  */
1113          0xffffffff,            /* dst_mask  */
1114          FALSE),                /* pcrel_offset  */
1115
1116   /* Relax hint for conditional call sequence.  */
1117   HOWTO2 (R_NDS32_LONGCALL3,    /* 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_LONGCALL3",   /* name  */
1126          FALSE,                 /* partial_inplace  */
1127          0xffffffff,            /* src_mask  */
1128          0xffffffff,            /* dst_mask  */
1129          FALSE),                /* pcrel_offset  */
1130
1131   /* Relax hint for unconditional branch sequence.  */
1132   HOWTO2 (R_NDS32_LONGJUMP1,    /* 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_LONGJUMP1",   /* name  */
1141          FALSE,                 /* partial_inplace  */
1142          0xffffffff,            /* src_mask  */
1143          0xffffffff,            /* dst_mask  */
1144          FALSE),                /* pcrel_offset  */
1145
1146   /* Relax hint for conditional branch sequence.  */
1147   HOWTO2 (R_NDS32_LONGJUMP2,    /* 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_LONGJUMP2",   /* name  */
1156          FALSE,                 /* partial_inplace  */
1157          0xffffffff,            /* src_mask  */
1158          0xffffffff,            /* dst_mask  */
1159          FALSE),                /* pcrel_offset  */
1160
1161   /* Relax hint for conditional branch sequence.  */
1162   HOWTO2 (R_NDS32_LONGJUMP3,    /* type  */
1163          0,                     /* rightshift  */
1164          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1165          32,                    /* 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_LONGJUMP3",   /* name  */
1171          FALSE,                 /* partial_inplace  */
1172          0xffffffff,            /* src_mask  */
1173          0xffffffff,            /* dst_mask  */
1174          FALSE),                /* pcrel_offset  */
1175
1176   /* Relax hint for load/store sequence.   */
1177   HOWTO2 (R_NDS32_LOADSTORE,    /* 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_LOADSTORE",   /* name  */
1186          FALSE,                 /* partial_inplace  */
1187          0xffffffff,            /* src_mask  */
1188          0xffffffff,            /* dst_mask  */
1189          FALSE),                /* pcrel_offset  */
1190
1191   /* Relax hint for load/store sequence.  */
1192   HOWTO2 (R_NDS32_9_FIXED_RELA, /* type  */
1193          0,                     /* rightshift  */
1194          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1195          16,                    /* 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_9_FIXED_RELA",/* name  */
1201          FALSE,                 /* partial_inplace  */
1202          0x000000ff,            /* src_mask  */
1203          0x000000ff,            /* dst_mask  */
1204          FALSE),                /* pcrel_offset  */
1205
1206   /* Relax hint for load/store sequence.  */
1207   HOWTO2 (R_NDS32_15_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_15_FIXED_RELA",/* name  */
1216          FALSE,                 /* partial_inplace  */
1217          0x00003fff,            /* src_mask  */
1218          0x00003fff,            /* dst_mask  */
1219          FALSE),                /* pcrel_offset  */
1220
1221   /* Relax hint for load/store sequence.  */
1222   HOWTO2 (R_NDS32_17_FIXED_RELA,/* type  */
1223          0,                     /* rightshift  */
1224          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1225          32,                    /* bitsize  */
1226          FALSE,                 /* pc_relative  */
1227          0,                     /* bitpos  */
1228          complain_overflow_dont,/* complain_on_overflow  */
1229          nds32_elf_ignore_reloc,/* special_function  */
1230          "R_NDS32_17_FIXED_RELA",/* name  */
1231          FALSE,                 /* partial_inplace  */
1232          0x0000ffff,            /* src_mask  */
1233          0x0000ffff,            /* dst_mask  */
1234          FALSE),                /* pcrel_offset  */
1235
1236   /* Relax hint for load/store sequence.  */
1237   HOWTO2 (R_NDS32_25_FIXED_RELA,/* type  */
1238          0,                     /* rightshift  */
1239          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1240          32,                    /* bitsize  */
1241          FALSE,                 /* pc_relative  */
1242          0,                     /* bitpos  */
1243          complain_overflow_dont,/* complain_on_overflow  */
1244          nds32_elf_ignore_reloc,/* special_function  */
1245          "R_NDS32_25_FIXED_RELA",/* name  */
1246          FALSE,                 /* partial_inplace  */
1247          0x00ffffff,            /* src_mask  */
1248          0x00ffffff,            /* dst_mask  */
1249          FALSE),                /* pcrel_offset  */
1250
1251   /* High 20 bits of PLT symbol offset relative to PC.  */
1252   HOWTO2 (R_NDS32_PLTREL_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_PLTREL_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 PC.  */
1267   HOWTO2 (R_NDS32_PLTREL_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_PLTREL_LO12", /* name  */
1276          FALSE,                 /* partial_inplace  */
1277          0x00000fff,            /* src_mask  */
1278          0x00000fff,            /* dst_mask  */
1279          FALSE),                /* pcrel_offset  */
1280
1281   /* High 20 bits of PLT symbol offset relative to GOT (GP).  */
1282   HOWTO2 (R_NDS32_PLT_GOTREL_HI20,      /* type  */
1283          12,                    /* rightshift  */
1284          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1285          20,                    /* bitsize  */
1286          FALSE,                 /* pc_relative  */
1287          0,                     /* bitpos  */
1288          complain_overflow_dont,/* complain_on_overflow  */
1289          bfd_elf_generic_reloc, /* special_function  */
1290          "R_NDS32_PLT_GOTREL_HI20",/* name  */
1291          FALSE,                 /* partial_inplace  */
1292          0x000fffff,            /* src_mask  */
1293          0x000fffff,            /* dst_mask  */
1294          FALSE),                /* pcrel_offset  */
1295
1296   /* Low 12 bits of PLT symbol offset relative to GOT (GP).  */
1297   HOWTO2 (R_NDS32_PLT_GOTREL_LO12,/* type  */
1298          0,                     /* rightshift  */
1299          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1300          12,                    /* bitsize  */
1301          FALSE,                 /* pc_relative  */
1302          0,                     /* bitpos  */
1303          complain_overflow_dont,/* complain_on_overflow  */
1304          bfd_elf_generic_reloc, /* special_function  */
1305          "R_NDS32_PLT_GOTREL_LO12",/* name  */
1306          FALSE,                 /* partial_inplace  */
1307          0x00000fff,            /* src_mask  */
1308          0x00000fff,            /* dst_mask  */
1309          FALSE),                /* pcrel_offset  */
1310
1311   /* Small data area 12 bits offset.  */
1312   HOWTO2 (R_NDS32_SDA12S2_DP_RELA,/* type  */
1313          2,                     /* rightshift  */
1314          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1315          12,                    /* bitsize  */
1316          FALSE,                 /* pc_relative  */
1317          0,                     /* bitpos  */
1318          complain_overflow_signed,/* complain_on_overflow  */
1319          bfd_elf_generic_reloc, /* special_function  */
1320          "R_NDS32_SDA12S2_DP_RELA",/* name  */
1321          FALSE,                 /* partial_inplace  */
1322          0x00000fff,            /* src_mask  */
1323          0x00000fff,            /* dst_mask  */
1324          FALSE),                /* pcrel_offset  */
1325
1326   /* Small data area 12 bits offset.  */
1327   HOWTO2 (R_NDS32_SDA12S2_SP_RELA,/* type  */
1328          2,                     /* rightshift  */
1329          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1330          12,                    /* bitsize  */
1331          FALSE,                 /* pc_relative  */
1332          0,                     /* bitpos  */
1333          complain_overflow_signed,/* complain_on_overflow  */
1334          bfd_elf_generic_reloc, /* special_function  */
1335          "R_NDS32_SDA12S2_SP_RELA",/* name  */
1336          FALSE,                 /* partial_inplace  */
1337          0x00000fff,            /* src_mask  */
1338          0x00000fff,            /* dst_mask  */
1339          FALSE),                /* pcrel_offset  */
1340   /* Lower 12 bits of address.  */
1341
1342   HOWTO2 (R_NDS32_LO12S2_DP_RELA,       /* type  */
1343          2,                     /* rightshift  */
1344          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1345          10,                    /* bitsize  */
1346          FALSE,                 /* pc_relative  */
1347          0,                     /* bitpos  */
1348          complain_overflow_dont,/* complain_on_overflow  */
1349          bfd_elf_generic_reloc, /* special_function  */
1350          "R_NDS32_LO12S2_DP_RELA",/* name  */
1351          FALSE,                 /* partial_inplace  */
1352          0x000003ff,            /* src_mask  */
1353          0x000003ff,            /* dst_mask  */
1354          FALSE),                /* pcrel_offset  */
1355
1356   /* Lower 12 bits of address.  */
1357   HOWTO2 (R_NDS32_LO12S2_SP_RELA,/* type  */
1358          2,                     /* rightshift  */
1359          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1360          10,                    /* bitsize  */
1361          FALSE,                 /* pc_relative  */
1362          0,                     /* bitpos  */
1363          complain_overflow_dont,/* complain_on_overflow  */
1364          bfd_elf_generic_reloc, /* special_function  */
1365          "R_NDS32_LO12S2_SP_RELA",/* name  */
1366          FALSE,                 /* partial_inplace  */
1367          0x000003ff,            /* src_mask  */
1368          0x000003ff,            /* dst_mask  */
1369          FALSE),                /* pcrel_offset  */
1370   /* Lower 12 bits of address.  Special identity for or case.  */
1371   HOWTO2 (R_NDS32_LO12S0_ORI_RELA,/* type  */
1372          0,                     /* rightshift  */
1373          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1374          12,                    /* bitsize  */
1375          FALSE,                 /* pc_relative  */
1376          0,                     /* bitpos  */
1377          complain_overflow_dont,/* complain_on_overflow  */
1378          bfd_elf_generic_reloc, /* special_function  */
1379          "R_NDS32_LO12S0_ORI_RELA",/* name  */
1380          FALSE,                 /* partial_inplace  */
1381          0x00000fff,            /* src_mask  */
1382          0x00000fff,            /* dst_mask  */
1383          FALSE),                /* pcrel_offset  */
1384   /* Small data area 19 bits offset.  */
1385   HOWTO2 (R_NDS32_SDA16S3_RELA, /* type  */
1386          3,                     /* rightshift  */
1387          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1388          16,                    /* bitsize  */
1389          FALSE,                 /* pc_relative  */
1390          0,                     /* bitpos  */
1391          complain_overflow_signed,/* complain_on_overflow  */
1392          bfd_elf_generic_reloc, /* special_function  */
1393          "R_NDS32_SDA16S3_RELA",/* name  */
1394          FALSE,                 /* partial_inplace  */
1395          0x0000ffff,            /* src_mask  */
1396          0x0000ffff,            /* dst_mask  */
1397          FALSE),                /* pcrel_offset  */
1398
1399   /* Small data area 15 bits offset.  */
1400   HOWTO2 (R_NDS32_SDA17S2_RELA, /* type  */
1401          2,                     /* rightshift  */
1402          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1403          17,                    /* bitsize  */
1404          FALSE,                 /* pc_relative  */
1405          0,                     /* bitpos  */
1406          complain_overflow_signed,/* complain_on_overflow  */
1407          bfd_elf_generic_reloc, /* special_function  */
1408          "R_NDS32_SDA17S2_RELA",/* name  */
1409          FALSE,                 /* partial_inplace  */
1410          0x0001ffff,            /* src_mask  */
1411          0x0001ffff,            /* dst_mask  */
1412          FALSE),                /* pcrel_offset  */
1413
1414   HOWTO2 (R_NDS32_SDA18S1_RELA, /* type  */
1415          1,                     /* rightshift  */
1416          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1417          18,                    /* bitsize  */
1418          FALSE,                 /* pc_relative  */
1419          0,                     /* bitpos  */
1420          complain_overflow_signed,/* complain_on_overflow  */
1421          bfd_elf_generic_reloc, /* special_function  */
1422          "R_NDS32_SDA18S1_RELA",/* name  */
1423          FALSE,                 /* partial_inplace  */
1424          0x0003ffff,            /* src_mask  */
1425          0x0003ffff,            /* dst_mask  */
1426          FALSE),                /* pcrel_offset  */
1427
1428   HOWTO2 (R_NDS32_SDA19S0_RELA, /* type  */
1429          0,                     /* rightshift  */
1430          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1431          19,                    /* bitsize  */
1432          FALSE,                 /* pc_relative  */
1433          0,                     /* bitpos  */
1434          complain_overflow_signed,/* complain_on_overflow  */
1435          bfd_elf_generic_reloc, /* special_function  */
1436          "R_NDS32_SDA19S0_RELA",/* name  */
1437          FALSE,                 /* partial_inplace  */
1438          0x0007ffff,            /* src_mask  */
1439          0x0007ffff,            /* dst_mask  */
1440          FALSE),                /* pcrel_offset  */
1441   HOWTO2 (R_NDS32_DWARF2_OP1_RELA,/* type  */
1442          0,                     /* rightshift  */
1443          0,                     /* size (0 = byte, 1 = short, 2 = long)  */
1444          8,                     /* bitsize  */
1445          FALSE,                 /* pc_relative  */
1446          0,                     /* bitpos  */
1447          complain_overflow_dont,/* complain_on_overflow  */
1448          nds32_elf_ignore_reloc,/* special_function  */
1449          "R_NDS32_DWARF2_OP1_RELA",/* name  */
1450          FALSE,                 /* partial_inplace  */
1451          0xff,                  /* src_mask  */
1452          0xff,                  /* dst_mask  */
1453          FALSE),                /* pcrel_offset  */
1454   HOWTO2 (R_NDS32_DWARF2_OP2_RELA,/* type  */
1455          0,                     /* rightshift  */
1456          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1457          16,                    /* bitsize  */
1458          FALSE,                 /* pc_relative  */
1459          0,                     /* bitpos  */
1460          complain_overflow_dont,/* complain_on_overflow  */
1461          nds32_elf_ignore_reloc,/* special_function  */
1462          "R_NDS32_DWARF2_OP2_RELA",/* name  */
1463          FALSE,                 /* partial_inplace  */
1464          0xffff,                /* src_mask  */
1465          0xffff,                /* dst_mask  */
1466          FALSE),                /* pcrel_offset  */
1467   HOWTO2 (R_NDS32_DWARF2_LEB_RELA,/* type  */
1468          0,                     /* rightshift  */
1469          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1470          32,                    /* bitsize  */
1471          FALSE,                 /* pc_relative  */
1472          0,                     /* bitpos  */
1473          complain_overflow_dont,/* complain_on_overflow  */
1474          nds32_elf_ignore_reloc,/* special_function  */
1475          "R_NDS32_DWARF2_LEB_RELA",/* name  */
1476          FALSE,                 /* partial_inplace  */
1477          0xffffffff,            /* src_mask  */
1478          0xffffffff,            /* dst_mask  */
1479          FALSE),                /* pcrel_offset  */
1480   HOWTO2 (R_NDS32_UPDATE_TA_RELA,/* type  */
1481          0,                     /* rightshift  */
1482          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1483          16,                    /* bitsize  */
1484          FALSE,                 /* pc_relative  */
1485          0,                     /* bitpos  */
1486          complain_overflow_dont,/* complain_on_overflow  */
1487          nds32_elf_ignore_reloc,/* special_function  */
1488          "R_NDS32_UPDATE_TA_RELA",/* name  */
1489          FALSE,                 /* partial_inplace  */
1490          0xffff,                /* src_mask  */
1491          0xffff,                /* dst_mask  */
1492          FALSE),                /* pcrel_offset  */
1493   /* Like R_NDS32_PCREL, but referring to the procedure linkage table
1494      entry for the symbol.  */
1495   HOWTO2 (R_NDS32_9_PLTREL,     /* type  */
1496          1,                     /* rightshift  */
1497          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1498          8,                     /* bitsize  */
1499          TRUE,                  /* pc_relative  */
1500          0,                     /* bitpos  */
1501          complain_overflow_signed,/* complain_on_overflow  */
1502          bfd_elf_generic_reloc, /* special_function  */
1503          "R_NDS32_9_PLTREL",    /* name  */
1504          FALSE,                 /* partial_inplace  */
1505          0xff,                  /* src_mask  */
1506          0xff,                  /* dst_mask  */
1507          TRUE),                 /* pcrel_offset  */
1508   /* Low 20 bits of PLT symbol offset relative to GOT (GP).  */
1509   HOWTO2 (R_NDS32_PLT_GOTREL_LO20,/* type  */
1510          0,                     /* rightshift  */
1511          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1512          20,                    /* bitsize  */
1513          FALSE,                 /* pc_relative  */
1514          0,                     /* bitpos  */
1515          complain_overflow_dont,/* complain_on_overflow  */
1516          bfd_elf_generic_reloc, /* special_function  */
1517          "R_NDS32_PLT_GOTREL_LO20",/* name  */
1518          FALSE,                 /* partial_inplace  */
1519          0x000fffff,            /* src_mask  */
1520          0x000fffff,            /* dst_mask  */
1521          FALSE),                /* pcrel_offset  */
1522   /* low 15 bits of PLT symbol offset relative to GOT (GP)  */
1523   HOWTO2 (R_NDS32_PLT_GOTREL_LO15,/* type  */
1524          0,                     /* rightshift  */
1525          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1526          15,                    /* bitsize  */
1527          FALSE,                 /* pc_relative  */
1528          0,                     /* bitpos  */
1529          complain_overflow_dont,/* complain_on_overflow  */
1530          bfd_elf_generic_reloc, /* special_function  */
1531          "R_NDS32_PLT_GOTREL_LO15",/* name  */
1532          FALSE,                 /* partial_inplace  */
1533          0x00007fff,            /* src_mask  */
1534          0x00007fff,            /* dst_mask  */
1535          FALSE),                /* pcrel_offset  */
1536   /* Low 19 bits of PLT symbol offset relative to GOT (GP).  */
1537   HOWTO2 (R_NDS32_PLT_GOTREL_LO19,/* type  */
1538          0,                     /* rightshift  */
1539          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1540          19,                    /* bitsize  */
1541          FALSE,                 /* pc_relative  */
1542          0,                     /* bitpos  */
1543          complain_overflow_dont,/* complain_on_overflow  */
1544          bfd_elf_generic_reloc, /* special_function  */
1545          "R_NDS32_PLT_GOTREL_LO19",/* name  */
1546          FALSE,                 /* partial_inplace  */
1547          0x0007ffff,            /* src_mask  */
1548          0x0007ffff,            /* dst_mask  */
1549          FALSE),                /* pcrel_offset  */
1550   HOWTO2 (R_NDS32_GOT_LO15,     /* type  */
1551          0,                     /* rightshift  */
1552          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1553          15,                    /* bitsize  */
1554          FALSE,                 /* pc_relative  */
1555          0,                     /* bitpos  */
1556          complain_overflow_dont,/* complain_on_overflow  */
1557          bfd_elf_generic_reloc, /* special_function  */
1558          "R_NDS32_GOT_LO15",    /* name  */
1559          FALSE,                 /* partial_inplace  */
1560          0x00007fff,            /* src_mask  */
1561          0x00007fff,            /* dst_mask  */
1562          FALSE),                /* pcrel_offset  */
1563   HOWTO2 (R_NDS32_GOT_LO19,     /* type  */
1564          0,                     /* rightshift  */
1565          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1566          19,                    /* bitsize  */
1567          FALSE,                 /* pc_relative  */
1568          0,                     /* bitpos  */
1569          complain_overflow_dont,/* complain_on_overflow  */
1570          bfd_elf_generic_reloc, /* special_function  */
1571          "R_NDS32_GOT_LO19",    /* name  */
1572          FALSE,                 /* partial_inplace  */
1573          0x0007ffff,            /* src_mask  */
1574          0x0007ffff,            /* dst_mask  */
1575          FALSE),                /* pcrel_offset  */
1576   HOWTO2 (R_NDS32_GOTOFF_LO15,  /* type  */
1577          0,                     /* rightshift  */
1578          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1579          15,                    /* bitsize  */
1580          FALSE,                 /* pc_relative  */
1581          0,                     /* bitpos  */
1582          complain_overflow_dont,/* complain_on_overflow  */
1583          bfd_elf_generic_reloc, /* special_function  */
1584          "R_NDS32_GOTOFF_LO15", /* name  */
1585          FALSE,                 /* partial_inplace  */
1586          0x00007fff,            /* src_mask  */
1587          0x00007fff,            /* dst_mask  */
1588          FALSE),                /* pcrel_offset  */
1589   HOWTO2 (R_NDS32_GOTOFF_LO19,  /* type  */
1590          0,                     /* rightshift  */
1591          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1592          19,                    /* bitsize  */
1593          FALSE,                 /* pc_relative  */
1594          0,                     /* bitpos  */
1595          complain_overflow_dont,/* complain_on_overflow  */
1596          bfd_elf_generic_reloc, /* special_function  */
1597          "R_NDS32_GOTOFF_LO19", /* name  */
1598          FALSE,                 /* partial_inplace  */
1599          0x0007ffff,            /* src_mask  */
1600          0x0007ffff,            /* dst_mask  */
1601          FALSE),                /* pcrel_offset  */
1602   /* GOT 15 bits offset.  */
1603   HOWTO2 (R_NDS32_GOT15S2_RELA, /* type  */
1604          2,                     /* rightshift  */
1605          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1606          15,                    /* bitsize  */
1607          FALSE,                 /* pc_relative  */
1608          0,                     /* bitpos  */
1609          complain_overflow_signed,/* complain_on_overflow  */
1610          bfd_elf_generic_reloc, /* special_function  */
1611          "R_NDS32_GOT15S2_RELA",/* name  */
1612          FALSE,                 /* partial_inplace  */
1613          0x00007fff,            /* src_mask  */
1614          0x00007fff,            /* dst_mask  */
1615          FALSE),                /* pcrel_offset  */
1616   /* GOT 17 bits offset.  */
1617   HOWTO2 (R_NDS32_GOT17S2_RELA, /* type  */
1618          2,                     /* rightshift  */
1619          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1620          17,                    /* bitsize  */
1621          FALSE,                 /* pc_relative  */
1622          0,                     /* bitpos  */
1623          complain_overflow_signed,/* complain_on_overflow  */
1624          bfd_elf_generic_reloc, /* special_function  */
1625          "R_NDS32_GOT17S2_RELA",/* name  */
1626          FALSE,                 /* partial_inplace  */
1627          0x0001ffff,            /* src_mask  */
1628          0x0001ffff,            /* dst_mask  */
1629          FALSE),                /* pcrel_offset  */
1630   /* A 5 bit address.  */
1631   HOWTO2 (R_NDS32_5_RELA,       /* type  */
1632          0,                     /* rightshift  */
1633          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1634          5,                     /* bitsize  */
1635          FALSE,                 /* pc_relative  */
1636          0,                     /* bitpos  */
1637          complain_overflow_signed,/* complain_on_overflow  */
1638          bfd_elf_generic_reloc, /* special_function  */
1639          "R_NDS32_5_RELA",      /* name  */
1640          FALSE,                 /* partial_inplace  */
1641          0x1f,                  /* src_mask  */
1642          0x1f,                  /* dst_mask  */
1643          FALSE),                /* pcrel_offset  */
1644   HOWTO2 (R_NDS32_10_UPCREL_RELA,/* type  */
1645          1,                     /* rightshift  */
1646          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1647          9,                     /* bitsize  */
1648          TRUE,                  /* pc_relative  */
1649          0,                     /* bitpos  */
1650          complain_overflow_unsigned,/* complain_on_overflow  */
1651          bfd_elf_generic_reloc, /* special_function  */
1652          "R_NDS32_10_UPCREL_RELA",/* name  */
1653          FALSE,                 /* partial_inplace  */
1654          0x1ff,                 /* src_mask  */
1655          0x1ff,                 /* dst_mask  */
1656          TRUE),                 /* pcrel_offset  */
1657   HOWTO2 (R_NDS32_SDA_FP7U2_RELA,/* type  */
1658          2,                     /* rightshift  */
1659          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1660          7,                     /* bitsize  */
1661          FALSE,                 /* pc_relative  */
1662          0,                     /* bitpos  */
1663          complain_overflow_unsigned,/* complain_on_overflow  */
1664          bfd_elf_generic_reloc, /* special_function  */
1665          "R_NDS32_SDA_FP7U2_RELA",/* name  */
1666          FALSE,                 /* partial_inplace  */
1667          0x0000007f,            /* src_mask  */
1668          0x0000007f,            /* dst_mask  */
1669          FALSE),                /* pcrel_offset  */
1670   HOWTO2 (R_NDS32_WORD_9_PCREL_RELA,/* type  */
1671          1,                     /* rightshift  */
1672          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1673          8,                     /* bitsize  */
1674          TRUE,                  /* pc_relative  */
1675          0,                     /* bitpos  */
1676          complain_overflow_signed,/* complain_on_overflow  */
1677          bfd_elf_generic_reloc, /* special_function  */
1678          "R_NDS32_WORD_9_PCREL_RELA",/* name  */
1679          FALSE,                 /* partial_inplace  */
1680          0xff,                  /* src_mask  */
1681          0xff,                  /* dst_mask  */
1682          TRUE),                 /* pcrel_offset  */
1683   HOWTO2 (R_NDS32_25_ABS_RELA,  /* type  */
1684          1,                     /* rightshift  */
1685          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1686          24,                    /* bitsize  */
1687          FALSE,                 /* pc_relative  */
1688          0,                     /* bitpos  */
1689          complain_overflow_dont,/* complain_on_overflow  */
1690          bfd_elf_generic_reloc, /* special_function  */
1691          "R_NDS32_25_ABS_RELA", /* name  */
1692          FALSE,                 /* partial_inplace  */
1693          0xffffff,              /* src_mask  */
1694          0xffffff,              /* dst_mask  */
1695          FALSE),                /* pcrel_offset  */
1696
1697   /* A relative 17 bit relocation for ifc, right shifted by 1.  */
1698   HOWTO2 (R_NDS32_17IFC_PCREL_RELA,/* type  */
1699          1,                     /* rightshift  */
1700          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1701          16,                    /* bitsize  */
1702          TRUE,                  /* pc_relative  */
1703          0,                     /* bitpos  */
1704          complain_overflow_signed,/* complain_on_overflow  */
1705          bfd_elf_generic_reloc, /* special_function  */
1706          "R_NDS32_17IFC_PCREL_RELA",/* name  */
1707          FALSE,                 /* partial_inplace  */
1708          0xffff,                /* src_mask  */
1709          0xffff,                /* dst_mask  */
1710          TRUE),                 /* pcrel_offset  */
1711
1712   /* A relative unsigned 10 bit relocation for ifc, right shifted by 1.  */
1713   HOWTO2 (R_NDS32_10IFCU_PCREL_RELA,/* type  */
1714          1,                     /* rightshift  */
1715          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
1716          9,                     /* bitsize  */
1717          TRUE,                  /* pc_relative  */
1718          0,                     /* bitpos  */
1719          complain_overflow_unsigned,/* complain_on_overflow  */
1720          bfd_elf_generic_reloc, /* special_function  */
1721          "R_NDS32_10IFCU_PCREL_RELA",/* name  */
1722          FALSE,                 /* partial_inplace  */
1723          0x1ff,                 /* src_mask  */
1724          0x1ff,                 /* dst_mask  */
1725          TRUE),                 /* pcrel_offset  */
1726
1727   /* Like R_NDS32_HI20, but referring to the TLS LE entry for the symbol.  */
1728   HOWTO2 (R_NDS32_TLS_LE_HI20,  /* type  */
1729          12,                    /* rightshift  */
1730          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1731          20,                    /* bitsize  */
1732          FALSE,                 /* pc_relative  */
1733          0,                     /* bitpos  */
1734          complain_overflow_dont,/* complain_on_overflow  */
1735          bfd_elf_generic_reloc, /* special_function  */
1736          "R_NDS32_TLS_LE_HI20", /* name  */
1737          FALSE,                 /* partial_inplace  */
1738          0x000fffff,            /* src_mask  */
1739          0x000fffff,            /* dst_mask  */
1740          FALSE),                /* pcrel_offset  */
1741
1742   HOWTO2 (R_NDS32_TLS_LE_LO12,  /* type  */
1743          0,                     /* rightshift  */
1744          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1745          12,                    /* bitsize  */
1746          FALSE,                 /* pc_relative  */
1747          0,                     /* bitpos  */
1748          complain_overflow_dont,/* complain_on_overflow  */
1749          bfd_elf_generic_reloc, /* special_function  */
1750          "R_NDS32_TLS_LE_LO12", /* name  */
1751          FALSE,                 /* partial_inplace  */
1752          0x00000fff,            /* src_mask  */
1753          0x00000fff,            /* dst_mask  */
1754          FALSE),                /* pcrel_offset  */
1755
1756   /* Like R_NDS32_HI20, but referring to the TLS IE entry for the symbol.  */
1757   HOWTO2 (R_NDS32_TLS_IE_HI20,  /* type  */
1758          12,                    /* rightshift  */
1759          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1760          20,                    /* bitsize  */
1761          FALSE,                 /* pc_relative  */
1762          0,                     /* bitpos  */
1763          complain_overflow_dont,/* complain_on_overflow  */
1764          bfd_elf_generic_reloc, /* special_function  */
1765          "R_NDS32_TLS_IE_HI20", /* name  */
1766          FALSE,                 /* partial_inplace  */
1767          0x000fffff,            /* src_mask  */
1768          0x000fffff,            /* dst_mask  */
1769          FALSE),                /* pcrel_offset  */
1770
1771   HOWTO2 (R_NDS32_TLS_IE_LO12S2,/* type  */
1772          2,                     /* rightshift  */
1773          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1774          10,                    /* bitsize  */
1775          FALSE,                 /* pc_relative  */
1776          0,                     /* bitpos  */
1777          complain_overflow_dont,/* complain_on_overflow  */
1778          bfd_elf_generic_reloc, /* special_function  */
1779          "R_NDS32_TLS_IE_LO12S2",/* name  */
1780          FALSE,                 /* partial_inplace  */
1781          0x000003ff,            /* src_mask  */
1782          0x000003ff,            /* dst_mask  */
1783          FALSE),                /* pcrel_offset  */
1784
1785   /* TLS LE TP offset relocation  */
1786   HOWTO2 (R_NDS32_TLS_TPOFF,    /* type  */
1787          0,                     /* rightshift  */
1788          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1789          32,                    /* bitsize  */
1790          FALSE,                 /* pc_relative  */
1791          0,                     /* bitpos  */
1792          complain_overflow_bitfield,/* complain_on_overflow  */
1793          bfd_elf_generic_reloc, /* special_function  */
1794          "R_NDS32_TLS_TPOFF",   /* name  */
1795          FALSE,                 /* partial_inplace  */
1796          0xffffffff,            /* src_mask  */
1797          0xffffffff,            /* dst_mask  */
1798          FALSE),                /* pcrel_offset  */
1799
1800   /* A 20 bit address.  */
1801   HOWTO2 (R_NDS32_TLS_LE_20,    /* type  */
1802          0,                     /* rightshift  */
1803          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1804          20,                    /* bitsize  */
1805          FALSE,                 /* pc_relative  */
1806          0,                     /* bitpos  */
1807          complain_overflow_signed,/* complain_on_overflow  */
1808          bfd_elf_generic_reloc, /* special_function  */
1809          "R_NDS32_TLS_LE_20",   /* name  */
1810          FALSE,                 /* partial_inplace  */
1811          0xfffff,               /* src_mask  */
1812          0xfffff,               /* dst_mask  */
1813          FALSE),                /* pcrel_offset  */
1814
1815   HOWTO2 (R_NDS32_TLS_LE_15S0,  /* type  */
1816          0,                     /* rightshift  */
1817          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1818          15,                    /* bitsize  */
1819          FALSE,                 /* pc_relative  */
1820          0,                     /* bitpos  */
1821          complain_overflow_signed,/* complain_on_overflow  */
1822          bfd_elf_generic_reloc, /* special_function  */
1823          "R_NDS32_TLS_LE_15S0", /* name  */
1824          FALSE,                 /* partial_inplace  */
1825          0x7fff,                /* src_mask  */
1826          0x7fff,                /* dst_mask  */
1827          FALSE),                /* pcrel_offset  */
1828   HOWTO2 (R_NDS32_TLS_LE_15S1,  /* type  */
1829          1,                     /* rightshift  */
1830          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1831          15,                    /* bitsize  */
1832          FALSE,                 /* pc_relative  */
1833          0,                     /* bitpos  */
1834          complain_overflow_signed,/* complain_on_overflow  */
1835          bfd_elf_generic_reloc, /* special_function  */
1836          "R_NDS32_TLS_LE_15S1", /* name  */
1837          FALSE,                 /* partial_inplace  */
1838          0x7fff,                /* src_mask  */
1839          0x7fff,                /* dst_mask  */
1840          FALSE),                /* pcrel_offset  */
1841   HOWTO2 (R_NDS32_TLS_LE_15S2,  /* type  */
1842          2,                     /* rightshift  */
1843          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1844          15,                    /* bitsize  */
1845          FALSE,                 /* pc_relative  */
1846          0,                     /* bitpos  */
1847          complain_overflow_signed,/* complain_on_overflow  */
1848          bfd_elf_generic_reloc, /* special_function  */
1849          "R_NDS32_TLS_LE_15S2", /* name  */
1850          FALSE,                 /* partial_inplace  */
1851          0x7fff,                /* src_mask  */
1852          0x7fff,                /* dst_mask  */
1853          FALSE),                /* pcrel_offset  */
1854
1855   /* Relax hint for unconditional call sequence  */
1856   HOWTO2 (R_NDS32_LONGCALL4,    /* type  */
1857          0,                     /* rightshift  */
1858          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1859          32,                    /* bitsize  */
1860          FALSE,                 /* pc_relative  */
1861          0,                     /* bitpos  */
1862          complain_overflow_dont,/* complain_on_overflow  */
1863          nds32_elf_ignore_reloc,/* special_function  */
1864          "R_NDS32_LONGCALL4",   /* name  */
1865          FALSE,                 /* partial_inplace  */
1866          0xffffffff,            /* src_mask  */
1867          0xffffffff,            /* dst_mask  */
1868          FALSE),                /* pcrel_offset  */
1869
1870   /* Relax hint for conditional call sequence.  */
1871   HOWTO2 (R_NDS32_LONGCALL5,    /* type  */
1872          0,                     /* rightshift  */
1873          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1874          32,                    /* bitsize  */
1875          FALSE,                 /* pc_relative  */
1876          0,                     /* bitpos  */
1877          complain_overflow_dont,/* complain_on_overflow  */
1878          nds32_elf_ignore_reloc,/* special_function  */
1879          "R_NDS32_LONGCALL5",   /* name  */
1880          FALSE,                 /* partial_inplace  */
1881          0xffffffff,            /* src_mask  */
1882          0xffffffff,            /* dst_mask  */
1883          FALSE),                /* pcrel_offset  */
1884
1885   /* Relax hint for conditional call sequence.  */
1886   HOWTO2 (R_NDS32_LONGCALL6,    /* type  */
1887          0,                     /* rightshift  */
1888          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1889          32,                    /* bitsize  */
1890          FALSE,                 /* pc_relative  */
1891          0,                     /* bitpos  */
1892          complain_overflow_dont,/* complain_on_overflow  */
1893          nds32_elf_ignore_reloc,/* special_function  */
1894          "R_NDS32_LONGCALL6",   /* name  */
1895          FALSE,                 /* partial_inplace  */
1896          0xffffffff,            /* src_mask  */
1897          0xffffffff,            /* dst_mask  */
1898          FALSE),                /* pcrel_offset  */
1899
1900   /* Relax hint for unconditional branch sequence.  */
1901   HOWTO2 (R_NDS32_LONGJUMP4,    /* type  */
1902          0,                     /* rightshift  */
1903          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1904          32,                    /* bitsize  */
1905          FALSE,                 /* pc_relative  */
1906          0,                     /* bitpos  */
1907          complain_overflow_dont,/* complain_on_overflow  */
1908          nds32_elf_ignore_reloc,/* special_function  */
1909          "R_NDS32_LONGJUMP4",   /* name  */
1910          FALSE,                 /* partial_inplace  */
1911          0xffffffff,            /* src_mask  */
1912          0xffffffff,            /* dst_mask  */
1913          FALSE),                /* pcrel_offset  */
1914
1915   /* Relax hint for conditional branch sequence.  */
1916   HOWTO2 (R_NDS32_LONGJUMP5,    /* type  */
1917          0,                     /* rightshift  */
1918          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1919          32,                    /* bitsize  */
1920          FALSE,                 /* pc_relative  */
1921          0,                     /* bitpos  */
1922          complain_overflow_dont,/* complain_on_overflow  */
1923          nds32_elf_ignore_reloc,/* special_function  */
1924          "R_NDS32_LONGJUMP5",   /* name  */
1925          FALSE,                 /* partial_inplace  */
1926          0xffffffff,            /* src_mask  */
1927          0xffffffff,            /* dst_mask  */
1928          FALSE),                /* pcrel_offset  */
1929
1930   /* Relax hint for conditional branch sequence.  */
1931   HOWTO2 (R_NDS32_LONGJUMP6,    /* type  */
1932          0,                     /* rightshift  */
1933          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1934          32,                    /* bitsize  */
1935          FALSE,                 /* pc_relative  */
1936          0,                     /* bitpos  */
1937          complain_overflow_dont,/* complain_on_overflow  */
1938          nds32_elf_ignore_reloc,/* special_function  */
1939          "R_NDS32_LONGJUMP6",   /* name  */
1940          FALSE,                 /* partial_inplace  */
1941          0xffffffff,            /* src_mask  */
1942          0xffffffff,            /* dst_mask  */
1943          FALSE),                /* pcrel_offset  */
1944
1945   /* Relax hint for conditional branch sequence.  */
1946   HOWTO2 (R_NDS32_LONGJUMP7,    /* type  */
1947          0,                     /* rightshift  */
1948          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1949          32,                    /* bitsize  */
1950          FALSE,                 /* pc_relative  */
1951          0,                     /* bitpos  */
1952          complain_overflow_dont,/* complain_on_overflow  */
1953          nds32_elf_ignore_reloc,/* special_function  */
1954          "R_NDS32_LONGJUMP7",   /* name  */
1955          FALSE,                 /* partial_inplace  */
1956          0xffffffff,            /* src_mask  */
1957          0xffffffff,            /* dst_mask  */
1958          FALSE),                /* pcrel_offset  */
1959
1960   HOWTO2 (R_NDS32_TLS_IE_LO12,  /* type  */
1961          0,                     /* rightshift  */
1962          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1963          12,                    /* bitsize  */
1964          FALSE,                 /* pc_relative  */
1965          0,                     /* bitpos  */
1966          complain_overflow_dont,/* complain_on_overflow  */
1967          bfd_elf_generic_reloc, /* special_function  */
1968          "R_NDS32_TLS_IE_LO12", /* name  */
1969          FALSE,                 /* partial_inplace  */
1970          0x00000fff,            /* src_mask  */
1971          0x00000fff,            /* dst_mask  */
1972          FALSE),                /* pcrel_offset  */
1973
1974   /* Like R_NDS32_HI20, but referring to the TLS IE (PIE)
1975      entry for the symbol.  */
1976   HOWTO2 (R_NDS32_TLS_IEGP_HI20,/* type  */
1977          12,                    /* rightshift  */
1978          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1979          20,                    /* bitsize  */
1980          FALSE,                 /* pc_relative  */
1981          0,                     /* bitpos  */
1982          complain_overflow_dont,/* complain_on_overflow  */
1983          bfd_elf_generic_reloc, /* special_function  */
1984          "R_NDS32_TLS_IEGP_HI20",/* name  */
1985          FALSE,                 /* partial_inplace  */
1986          0x000fffff,            /* src_mask  */
1987          0x000fffff,            /* dst_mask  */
1988          FALSE),                /* pcrel_offset  */
1989
1990   HOWTO2 (R_NDS32_TLS_IEGP_LO12,/* type  */
1991          0,                     /* rightshift  */
1992          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
1993          12,                    /* bitsize  */
1994          FALSE,                 /* pc_relative  */
1995          0,                     /* bitpos  */
1996          complain_overflow_dont,/* complain_on_overflow  */
1997          bfd_elf_generic_reloc, /* special_function  */
1998          "R_NDS32_TLS_IEGP_LO12",/* name  */
1999          FALSE,                 /* partial_inplace  */
2000          0x00000fff,            /* src_mask  */
2001          0x00000fff,            /* dst_mask  */
2002          FALSE),                /* pcrel_offset  */
2003
2004   HOWTO2 (R_NDS32_TLS_IEGP_LO12S2,/* type  */
2005          2,                     /* rightshift  */
2006          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2007          10,                    /* bitsize  */
2008          FALSE,                 /* pc_relative  */
2009          0,                     /* bitpos  */
2010          complain_overflow_dont,/* complain_on_overflow  */
2011          bfd_elf_generic_reloc, /* special_function  */
2012          "R_NDS32_TLS_IEGP_LO12S2",/* name  */
2013          FALSE,                 /* partial_inplace  */
2014          0x000003ff,            /* src_mask  */
2015          0x000003ff,            /* dst_mask  */
2016          FALSE),                /* pcrel_offset  */
2017
2018   /* TLS description relocation  */
2019   HOWTO2 (R_NDS32_TLS_DESC,     /* type  */
2020          12,                    /* rightshift  */
2021          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2022          20,                    /* bitsize  */
2023          FALSE,                 /* pc_relative  */
2024          0,                     /* bitpos  */
2025          complain_overflow_dont,/* complain_on_overflow  */
2026          nds32_elf_hi20_reloc,  /* special_function  */
2027          "R_NDS32_TLS_DESC_HI20",/* name  */
2028          FALSE,                 /* partial_inplace  */
2029          0x000fffff,            /* src_mask  */
2030          0x000fffff,            /* dst_mask  */
2031          FALSE),                /* pcrel_offset  */
2032
2033   /* TLS GD/LD description offset high part.  */
2034   HOWTO2 (R_NDS32_TLS_DESC_HI20,/* type  */
2035          12,                    /* rightshift  */
2036          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2037          20,                    /* bitsize  */
2038          FALSE,                 /* pc_relative  */
2039          0,                     /* bitpos  */
2040          complain_overflow_dont,/* complain_on_overflow  */
2041          nds32_elf_hi20_reloc,  /* special_function  */
2042          "R_NDS32_TLS_DESC_HI20",/* name  */
2043          FALSE,                 /* partial_inplace  */
2044          0x000fffff,            /* src_mask  */
2045          0x000fffff,            /* dst_mask  */
2046          FALSE),                /* pcrel_offset  */
2047
2048   /* TLS GD/LD description offset low part.  */
2049   HOWTO2 (R_NDS32_TLS_DESC_LO12,/* type  */
2050          0,                     /* rightshift  */
2051          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2052          12,                    /* bitsize  */
2053          FALSE,                 /* pc_relative  */
2054          0,                     /* bitpos  */
2055          complain_overflow_dont,/* complain_on_overflow  */
2056          nds32_elf_lo12_reloc,  /* special_function  */
2057          "R_NDS32_TLS_DESC_LO12",/* name  */
2058          FALSE,                 /* partial_inplace  */
2059          0x00000fff,            /* src_mask  */
2060          0x00000fff,            /* dst_mask  */
2061          FALSE),                /* pcrel_offset  */
2062
2063   /* TLS GD/LD description offset set (movi).  */
2064   HOWTO2 (R_NDS32_TLS_DESC_20,  /* type  */
2065          0,                     /* rightshift  */
2066          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2067          20,                    /* bitsize  */
2068          FALSE,                 /* pc_relative  */
2069          0,                     /* bitpos  */
2070          complain_overflow_signed,/* complain_on_overflow  */
2071          bfd_elf_generic_reloc, /* special_function  */
2072          "R_NDS32_TLS_DESC_20", /* name  */
2073          FALSE,                 /* partial_inplace  */
2074          0x000fffff,            /* src_mask  */
2075          0x000fffff,            /* dst_mask  */
2076          FALSE),                /* pcrel_offset  */
2077
2078   /* TLS GD/LD description offset set (lwi.gp).  */
2079   HOWTO2 (R_NDS32_TLS_DESC_SDA17S2,/* type  */
2080          2,                     /* rightshift  */
2081          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2082          17,                    /* bitsize  */
2083          FALSE,                 /* pc_relative  */
2084          0,                     /* bitpos  */
2085          complain_overflow_signed,/* complain_on_overflow  */
2086          bfd_elf_generic_reloc, /* special_function  */
2087          "R_NDS32_TLS_DESC_SDA17S2",/* name  */
2088          FALSE,                 /* partial_inplace  */
2089          0x0001ffff,            /* src_mask  */
2090          0x0001ffff,            /* dst_mask  */
2091          FALSE),                /* pcrel_offset  */
2092 };
2093
2094 /* Relocations used for relaxation.  */
2095 #define HOWTO3(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
2096   [C-R_NDS32_RELAX_ENTRY] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC)
2097
2098 static reloc_howto_type nds32_elf_relax_howto_table[] = {
2099   HOWTO3 (R_NDS32_RELAX_ENTRY,  /* type  */
2100          0,                     /* rightshift  */
2101          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2102          32,                    /* bitsize  */
2103          FALSE,                 /* pc_relative  */
2104          0,                     /* bitpos  */
2105          complain_overflow_dont,/* complain_on_overflow  */
2106          nds32_elf_ignore_reloc,/* special_function  */
2107          "R_NDS32_RELAX_ENTRY", /* name  */
2108          FALSE,                 /* partial_inplace  */
2109          0xffffffff,            /* src_mask  */
2110          0xffffffff,            /* dst_mask  */
2111          FALSE),                /* pcrel_offset  */
2112   HOWTO3 (R_NDS32_GOT_SUFF,     /* type  */
2113          0,                     /* rightshift  */
2114          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2115          32,                    /* bitsize  */
2116          FALSE,                 /* pc_relative  */
2117          0,                     /* bitpos  */
2118          complain_overflow_dont,/* complain_on_overflow  */
2119          nds32_elf_ignore_reloc,/* special_function  */
2120          "R_NDS32_GOT_SUFF",    /* name  */
2121          FALSE,                 /* partial_inplace  */
2122          0xffffffff,            /* src_mask  */
2123          0xffffffff,            /* dst_mask  */
2124          FALSE),                /* pcrel_offset  */
2125   HOWTO3 (R_NDS32_GOTOFF_SUFF,  /* type  */
2126          0,                     /* rightshift  */
2127          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2128          32,                    /* bitsize  */
2129          FALSE,                 /* pc_relative  */
2130          0,                     /* bitpos  */
2131          complain_overflow_bitfield,/* complain_on_overflow  */
2132          nds32_elf_ignore_reloc,/* special_function  */
2133          "R_NDS32_GOTOFF_SUFF", /* name  */
2134          FALSE,                 /* partial_inplace  */
2135          0xffffffff,            /* src_mask  */
2136          0xffffffff,            /* dst_mask  */
2137          FALSE),                /* pcrel_offset  */
2138   HOWTO3 (R_NDS32_PLT_GOT_SUFF, /* type  */
2139          0,                     /* rightshift  */
2140          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2141          32,                    /* bitsize  */
2142          FALSE,                 /* pc_relative  */
2143          0,                     /* bitpos  */
2144          complain_overflow_dont,/* complain_on_overflow  */
2145          nds32_elf_ignore_reloc,/* special_function  */
2146          "R_NDS32_PLT_GOT_SUFF",/* name  */
2147          FALSE,                 /* partial_inplace  */
2148          0xffffffff,            /* src_mask  */
2149          0xffffffff,            /* dst_mask  */
2150          FALSE),                /* pcrel_offset  */
2151   HOWTO3 (R_NDS32_MULCALL_SUFF, /* type  */
2152          0,                     /* rightshift  */
2153          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2154          32,                    /* bitsize  */
2155          FALSE,                 /* pc_relative  */
2156          0,                     /* bitpos  */
2157          complain_overflow_dont,/* complain_on_overflow  */
2158          nds32_elf_ignore_reloc,/* special_function  */
2159          "R_NDS32_MULCALL_SUFF",/* name  */
2160          FALSE,                 /* partial_inplace  */
2161          0xffffffff,            /* src_mask  */
2162          0xffffffff,            /* dst_mask  */
2163          FALSE),                /* pcrel_offset  */
2164   HOWTO3 (R_NDS32_PTR,          /* type  */
2165          0,                     /* rightshift  */
2166          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2167          32,                    /* bitsize  */
2168          FALSE,                 /* pc_relative  */
2169          0,                     /* bitpos  */
2170          complain_overflow_dont,/* complain_on_overflow  */
2171          nds32_elf_ignore_reloc,/* special_function  */
2172          "R_NDS32_PTR",         /* name  */
2173          FALSE,                 /* partial_inplace  */
2174          0xffffffff,            /* src_mask  */
2175          0xffffffff,            /* dst_mask  */
2176          FALSE),                /* pcrel_offset  */
2177   HOWTO3 (R_NDS32_PTR_COUNT,    /* type  */
2178          0,                     /* rightshift  */
2179          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2180          32,                    /* bitsize  */
2181          FALSE,                 /* pc_relative  */
2182          0,                     /* bitpos  */
2183          complain_overflow_dont,/* complain_on_overflow  */
2184          nds32_elf_ignore_reloc,/* special_function  */
2185          "R_NDS32_PTR_COUNT",   /* name  */
2186          FALSE,                 /* partial_inplace  */
2187          0xffffffff,            /* src_mask  */
2188          0xffffffff,            /* dst_mask  */
2189          FALSE),                /* pcrel_offset  */
2190   HOWTO3 (R_NDS32_PTR_RESOLVED, /* type  */
2191          0,                     /* rightshift  */
2192          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2193          32,                    /* bitsize  */
2194          FALSE,                 /* pc_relative  */
2195          0,                     /* bitpos  */
2196          complain_overflow_dont,/* complain_on_overflow  */
2197          nds32_elf_ignore_reloc,/* special_function  */
2198          "R_NDS32_PTR_RESOLVED",/* name  */
2199          FALSE,                 /* partial_inplace  */
2200          0xffffffff,            /* src_mask  */
2201          0xffffffff,            /* dst_mask  */
2202          FALSE),                /* pcrel_offset  */
2203   HOWTO3 (R_NDS32_PLTBLOCK,     /* type  */
2204          0,                     /* rightshift  */
2205          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2206          32,                    /* bitsize  */
2207          FALSE,                 /* pc_relative  */
2208          0,                     /* bitpos  */
2209          complain_overflow_dont,/* complain_on_overflow  */
2210          nds32_elf_ignore_reloc,/* special_function  */
2211          "R_NDS32_PLTBLOCK",    /* name  */
2212          FALSE,                 /* partial_inplace  */
2213          0xffffffff,            /* src_mask  */
2214          0xffffffff,            /* dst_mask  */
2215          FALSE),                /* pcrel_offset  */
2216   HOWTO3 (R_NDS32_RELAX_REGION_BEGIN,/* type  */
2217          0,                     /* rightshift  */
2218          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2219          32,                    /* bitsize  */
2220          FALSE,                 /* pc_relative  */
2221          0,                     /* bitpos  */
2222          complain_overflow_dont,/* complain_on_overflow  */
2223          nds32_elf_ignore_reloc,/* special_function  */
2224          "R_NDS32_RELAX_REGION_BEGIN",/* name  */
2225          FALSE,                 /* partial_inplace  */
2226          0xffffffff,            /* src_mask  */
2227          0xffffffff,            /* dst_mask  */
2228          FALSE),                /* pcrel_offset  */
2229   HOWTO3 (R_NDS32_RELAX_REGION_END,/* type  */
2230          0,                     /* rightshift  */
2231          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2232          32,                    /* bitsize  */
2233          FALSE,                 /* pc_relative  */
2234          0,                     /* bitpos  */
2235          complain_overflow_dont,/* complain_on_overflow  */
2236          nds32_elf_ignore_reloc,/* special_function  */
2237          "R_NDS32_RELAX_REGION_END",/* name  */
2238          FALSE,                 /* partial_inplace  */
2239          0xffffffff,            /* src_mask  */
2240          0xffffffff,            /* dst_mask  */
2241          FALSE),                /* pcrel_offset  */
2242   HOWTO3 (R_NDS32_MINUEND,      /* type  */
2243          0,                     /* rightshift  */
2244          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2245          32,                    /* bitsize  */
2246          FALSE,                 /* pc_relative  */
2247          0,                     /* bitpos  */
2248          complain_overflow_dont,/* complain_on_overflow  */
2249          nds32_elf_ignore_reloc,/* special_function  */
2250          "R_NDS32_MINUEND",     /* name  */
2251          FALSE,                 /* partial_inplace  */
2252          0xffffffff,            /* src_mask  */
2253          0xffffffff,            /* dst_mask  */
2254          FALSE),                /* pcrel_offset  */
2255   HOWTO3 (R_NDS32_SUBTRAHEND,   /* type  */
2256          0,                     /* rightshift  */
2257          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2258          32,                    /* bitsize  */
2259          FALSE,                 /* pc_relative  */
2260          0,                     /* bitpos  */
2261          complain_overflow_dont,/* complain_on_overflow  */
2262          nds32_elf_ignore_reloc,/* special_function  */
2263          "R_NDS32_SUBTRAHEND",  /* name  */
2264          FALSE,                 /* partial_inplace  */
2265          0xffffffff,            /* src_mask  */
2266          0xffffffff,            /* dst_mask  */
2267          FALSE),                /* pcrel_offset  */
2268   HOWTO3 (R_NDS32_DIFF8,        /* type  */
2269          0,                     /* rightshift  */
2270          0,                     /* size (0 = byte, 1 = short, 2 = long)  */
2271          8,                     /* bitsize  */
2272          FALSE,                 /* pc_relative  */
2273          0,                     /* bitpos  */
2274          complain_overflow_dont,/* complain_on_overflow  */
2275          nds32_elf_ignore_reloc,/* special_function  */
2276          "R_NDS32_DIFF8",       /* name  */
2277          FALSE,                 /* partial_inplace  */
2278          0x000000ff,            /* src_mask  */
2279          0x000000ff,            /* dst_mask  */
2280          FALSE),                /* pcrel_offset  */
2281   HOWTO3 (R_NDS32_DIFF16,       /* type  */
2282          0,                     /* rightshift  */
2283          1,                     /* size (0 = byte, 1 = short, 2 = long)  */
2284          16,                    /* bitsize  */
2285          FALSE,                 /* pc_relative  */
2286          0,                     /* bitpos  */
2287          complain_overflow_dont,/* complain_on_overflow  */
2288          nds32_elf_ignore_reloc,/* special_function  */
2289          "R_NDS32_DIFF16",      /* name  */
2290          FALSE,                 /* partial_inplace  */
2291          0x0000ffff,            /* src_mask  */
2292          0x0000ffff,            /* dst_mask  */
2293          FALSE),                /* pcrel_offset  */
2294   HOWTO3 (R_NDS32_DIFF32,       /* type  */
2295          0,                     /* rightshift  */
2296          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2297          32,                    /* bitsize  */
2298          FALSE,                 /* pc_relative  */
2299          0,                     /* bitpos  */
2300          complain_overflow_dont,/* complain_on_overflow  */
2301          nds32_elf_ignore_reloc,/* special_function  */
2302          "R_NDS32_DIFF32",      /* name  */
2303          FALSE,                 /* partial_inplace  */
2304          0xffffffff,            /* src_mask  */
2305          0xffffffff,            /* dst_mask  */
2306          FALSE),                /* pcrel_offset  */
2307   HOWTO3 (R_NDS32_DIFF_ULEB128, /* type  */
2308          0,                     /* rightshift  */
2309          0,                     /* size (0 = byte, 1 = short, 2 = long)  */
2310          0,                     /* bitsize  */
2311          FALSE,                 /* pc_relative  */
2312          0,                     /* bitpos  */
2313          complain_overflow_dont,/* complain_on_overflow  */
2314          nds32_elf_ignore_reloc,/* special_function  */
2315          "R_NDS32_DIFF_ULEB128",/* name  */
2316          FALSE,                 /* partial_inplace  */
2317          0xffffffff,            /* src_mask  */
2318          0xffffffff,            /* dst_mask  */
2319          FALSE),                /* pcrel_offset  */
2320   HOWTO3 (R_NDS32_DATA,         /* type  */
2321          0,                     /* rightshift  */
2322          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2323          32,                    /* bitsize  */
2324          FALSE,                 /* pc_relative  */
2325          0,                     /* bitpos  */
2326          complain_overflow_dont,/* complain_on_overflow  */
2327          nds32_elf_ignore_reloc,/* special_function  */
2328          "R_NDS32_DATA",        /* name  */
2329          FALSE,                 /* partial_inplace  */
2330          0xffffffff,            /* src_mask  */
2331          0xffffffff,            /* dst_mask  */
2332          FALSE),                /* pcrel_offset  */
2333   HOWTO3 (R_NDS32_TRAN,         /* type  */
2334          0,                     /* rightshift  */
2335          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2336          32,                    /* bitsize  */
2337          FALSE,                 /* pc_relative  */
2338          0,                     /* bitpos  */
2339          complain_overflow_dont,/* complain_on_overflow  */
2340          nds32_elf_ignore_reloc,/* special_function  */
2341          "R_NDS32_TRAN",        /* name  */
2342          FALSE,                 /* partial_inplace  */
2343          0xffffffff,            /* src_mask  */
2344          0xffffffff,            /* dst_mask  */
2345          FALSE),                /* pcrel_offset  */
2346   HOWTO3 (R_NDS32_TLS_LE_ADD,   /* type  */
2347          0,                     /* rightshift  */
2348          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2349          32,                    /* bitsize  */
2350          FALSE,                 /* pc_relative  */
2351          0,                     /* bitpos  */
2352          complain_overflow_dont,/* complain_on_overflow  */
2353          nds32_elf_ignore_reloc,/* special_function  */
2354          "R_NDS32_TLS_LE_ADD",  /* name  */
2355          FALSE,                 /* partial_inplace  */
2356          0xffffffff,            /* src_mask  */
2357          0xffffffff,            /* dst_mask  */
2358          FALSE),                /* pcrel_offset  */
2359   HOWTO3 (R_NDS32_TLS_LE_LS,    /* type  */
2360          0,                     /* rightshift  */
2361          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2362          32,                    /* bitsize  */
2363          FALSE,                 /* pc_relative  */
2364          0,                     /* bitpos  */
2365          complain_overflow_dont,/* complain_on_overflow  */
2366          nds32_elf_ignore_reloc,/* special_function  */
2367          "R_NDS32_TLS_LE_LS",   /* name  */
2368          FALSE,                 /* partial_inplace  */
2369          0xffffffff,            /* src_mask  */
2370          0xffffffff,            /* dst_mask  */
2371          FALSE),                /* pcrel_offset  */
2372   HOWTO3 (R_NDS32_EMPTY,        /* type  */
2373          0,                     /* rightshift  */
2374          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2375          32,                    /* bitsize  */
2376          FALSE,                 /* pc_relative  */
2377          0,                     /* bitpos  */
2378          complain_overflow_dont,/* complain_on_overflow  */
2379          nds32_elf_ignore_reloc,/* special_function  */
2380          "R_NDS32_EMPTY",       /* name  */
2381          FALSE,                 /* partial_inplace  */
2382          0xffffffff,            /* src_mask  */
2383          0xffffffff,            /* dst_mask  */
2384          FALSE),                /* pcrel_offset  */
2385   /* TLS GD/LD description address base addition.  */
2386   HOWTO3 (R_NDS32_TLS_DESC_ADD, /* type  */
2387          0,                     /* rightshift  */
2388          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2389          32,                    /* bitsize  */
2390          FALSE,                 /* pc_relative  */
2391          0,                     /* bitpos  */
2392          complain_overflow_dont,/* complain_on_overflow  */
2393          nds32_elf_ignore_reloc,/* special_function  */
2394          "R_NDS32_TLS_DESC_ADD",/* name  */
2395          FALSE,                 /* partial_inplace  */
2396          0xffffffff,            /* src_mask  */
2397          0xffffffff,            /* dst_mask  */
2398          FALSE),                /* pcrel_offset  */
2399   /* TLS GD/LD description function load.  */
2400   HOWTO3 (R_NDS32_TLS_DESC_FUNC,/* type  */
2401          0,                     /* rightshift  */
2402          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2403          32,                    /* bitsize  */
2404          FALSE,                 /* pc_relative  */
2405          0,                     /* bitpos  */
2406          complain_overflow_dont,/* complain_on_overflow  */
2407          nds32_elf_ignore_reloc,/* special_function  */
2408          "R_NDS32_TLS_DESC_FUNC",/* name  */
2409          FALSE,                 /* partial_inplace  */
2410          0xffffffff,            /* src_mask  */
2411          0xffffffff,            /* dst_mask  */
2412          FALSE),                /* pcrel_offset  */
2413   /* TLS DESC resolve function call.  */
2414   HOWTO3 (R_NDS32_TLS_DESC_CALL,/* type  */
2415          0,                     /* rightshift  */
2416          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2417          32,                    /* bitsize  */
2418          FALSE,                 /* pc_relative  */
2419          0,                     /* bitpos  */
2420          complain_overflow_dont,/* complain_on_overflow  */
2421          nds32_elf_ignore_reloc,/* special_function  */
2422          "R_NDS32_TLS_DESC_CALL",/* name  */
2423          FALSE,                 /* partial_inplace  */
2424          0xffffffff,            /* src_mask  */
2425          0xffffffff,            /* dst_mask  */
2426          FALSE),                /* pcrel_offset  */
2427   /* TLS DESC variable access.  */
2428   HOWTO3 (R_NDS32_TLS_DESC_MEM, /* type  */
2429          0,                     /* rightshift  */
2430          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2431          32,                    /* bitsize  */
2432          FALSE,                 /* pc_relative  */
2433          0,                     /* bitpos  */
2434          complain_overflow_dont,/* complain_on_overflow  */
2435          nds32_elf_ignore_reloc,/* special_function  */
2436          "R_NDS32_TLS_DESC_MEM",/* name  */
2437          FALSE,                 /* partial_inplace  */
2438          0xffffffff,            /* src_mask  */
2439          0xffffffff,            /* dst_mask  */
2440          FALSE),                /* pcrel_offset  */
2441   /* TLS GD/LD description mark (@tlsdec).  */
2442   HOWTO3 (R_NDS32_RELAX_REMOVE, /* type  */
2443          0,                     /* rightshift  */
2444          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2445          32,                    /* bitsize  */
2446          FALSE,                 /* pc_relative  */
2447          0,                     /* bitpos  */
2448          complain_overflow_dont,/* complain_on_overflow  */
2449          nds32_elf_ignore_reloc,/* special_function  */
2450          "R_NDS32_REMOVE",      /* name  */
2451          FALSE,                 /* partial_inplace  */
2452          0xffffffff,            /* src_mask  */
2453          0xffffffff,            /* dst_mask  */
2454          FALSE),                /* pcrel_offset  */
2455   /* TLS GD/LD description mark (@tlsdec).  */
2456   HOWTO3 (R_NDS32_RELAX_GROUP,  /* type  */
2457          0,                     /* rightshift  */
2458          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2459          32,                    /* bitsize  */
2460          FALSE,                 /* pc_relative  */
2461          0,                     /* bitpos  */
2462          complain_overflow_dont,/* complain_on_overflow  */
2463          nds32_elf_ignore_reloc,/* special_function  */
2464          "R_NDS32_GROUP",       /* name  */
2465          FALSE,                 /* partial_inplace  */
2466          0xffffffff,            /* src_mask  */
2467          0xffffffff,            /* dst_mask  */
2468          FALSE),                /* pcrel_offset  */
2469   HOWTO3 (R_NDS32_TLS_IEGP_LW,  /* type  */
2470          0,                     /* rightshift  */
2471          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2472          32,                    /* bitsize  */
2473          FALSE,                 /* pc_relative  */
2474          0,                     /* bitpos  */
2475          complain_overflow_dont,/* complain_on_overflow  */
2476          nds32_elf_ignore_reloc,/* special_function  */
2477          "R_NDS32_TLS_IEGP_LW", /* name  */
2478          FALSE,                 /* partial_inplace  */
2479          0xffffffff,            /* src_mask  */
2480          0xffffffff,            /* dst_mask  */
2481          FALSE),                /* pcrel_offset  */
2482   /* LA and FLSI relaxation.  */
2483   HOWTO3 (R_NDS32_LSI,          /* type  */
2484          0,                     /* rightshift  */
2485          2,                     /* size (0 = byte, 1 = short, 2 = long)  */
2486          32,                    /* bitsize  */
2487          FALSE,                 /* pc_relative  */
2488          0,                     /* bitpos  */
2489          complain_overflow_dont,/* complain_on_overflow  */
2490          nds32_elf_ignore_reloc,/* special_function  */
2491          "R_NDS32_LSI",         /* name  */
2492          FALSE,                 /* partial_inplace  */
2493          0xffffffff,            /* src_mask  */
2494          0xffffffff,            /* dst_mask  */
2495          FALSE),
2496 };
2497
2498 static unsigned long dl_tlsdesc_lazy_trampoline[] =
2499 {
2500   0x46200000,                   /* sethi $r2,#0x0      */
2501   0x58210000,                   /* ori $r2,$r2,#0x0    */
2502   0x40217400,                   /* add $r2,$r2,$gp     */
2503   0x04210000,                   /* lwi $r2,[$r2+#0x0]  */
2504   0x46300000,                   /* sethi $r3,#0x0      */
2505   0x58318000,                   /* ori $r3,$r3,#0x0    */
2506   0x4031f400,                   /* add $r3,$r3,$gp     */
2507   0x4a000800,                   /* jr $r2              */
2508 };
2509
2510 static void
2511 nds32_put_trampoline (void *contents, const unsigned long *template,
2512                       unsigned count)
2513 {
2514   unsigned ix;
2515
2516   for (ix = 0; ix != count; ix++)
2517     {
2518       unsigned long insn = template[ix];
2519       bfd_putb32 (insn, (char *) contents + ix * 4);
2520     }
2521 }
2522
2523 /* nds32_insertion_sort sorts an array with nmemb elements of size size.
2524    This prototype is the same as qsort ().  */
2525
2526 void
2527 nds32_insertion_sort (void *base, size_t nmemb, size_t size,
2528                       int (*compar) (const void *lhs, const void *rhs))
2529 {
2530   char *ptr = (char *) base;
2531   int i, j;
2532   char tmp[sizeof (Elf_Internal_Rela)];
2533
2534   BFD_ASSERT (size <= sizeof (tmp));
2535
2536   /* If i is less than j, i is inserted before j.
2537
2538      |---- j ----- i --------------|
2539       \          / \              /
2540          sorted         unsorted
2541    */
2542
2543   for (i = 1; i < (int) nmemb; i++)
2544     {
2545       for (j = (i - 1); j >= 0; j--)
2546         if (compar (ptr + i * size, ptr + j * size) >= 0)
2547           break;
2548
2549       j++;
2550
2551       if (i == j)
2552         continue; /* i is in order.  */
2553
2554       memcpy (tmp, ptr + i * size, size);
2555       memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size);
2556       memcpy (ptr + j * size, tmp, size);
2557     }
2558 }
2559
2560 /* Sort relocation by r_offset.
2561
2562    We didn't use qsort () in stdlib, because quick-sort is not a stable sorting
2563    algorithm.  Relocations at the same r_offset must keep their order.
2564    For example, RELAX_ENTRY must be the very first relocation entry.
2565
2566    Currently, this function implements insertion-sort.
2567
2568    FIXME: If we already sort them in assembler, why bother sort them
2569           here again?  */
2570
2571 static int
2572 compar_reloc (const void *lhs, const void *rhs)
2573 {
2574   const Elf_Internal_Rela *l = (const Elf_Internal_Rela *) lhs;
2575   const Elf_Internal_Rela *r = (const Elf_Internal_Rela *) rhs;
2576
2577   if (l->r_offset > r->r_offset)
2578     return 1;
2579   else if (l->r_offset == r->r_offset)
2580     return 0;
2581   else
2582     return -1;
2583 }
2584
2585 /* Functions listed below are only used for old relocs.
2586      nds32_elf_9_pcrel_reloc
2587      nds32_elf_do_9_pcrel_reloc
2588      nds32_elf_hi20_reloc
2589      nds32_elf_relocate_hi20
2590      nds32_elf_lo12_reloc
2591      nds32_elf_sda15_reloc
2592      nds32_elf_generic_reloc.  */
2593
2594 /* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc.  */
2595
2596 static bfd_reloc_status_type
2597 nds32_elf_9_pcrel_reloc (bfd *       abfd,
2598                          arelent *   reloc_entry,
2599                          asymbol *   symbol,
2600                          void *      data,
2601                          asection *  input_section,
2602                          bfd *       output_bfd,
2603                          char **     error_message ATTRIBUTE_UNUSED)
2604 {
2605   /* This part is from bfd_elf_generic_reloc.  */
2606   if (output_bfd != (bfd *) NULL
2607       && (symbol->flags & BSF_SECTION_SYM) == 0
2608       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2609     {
2610       reloc_entry->address += input_section->output_offset;
2611       return bfd_reloc_ok;
2612     }
2613
2614   if (output_bfd != NULL)
2615     {
2616       /* FIXME: See bfd_perform_relocation.  Is this right?  */
2617       return bfd_reloc_continue;
2618     }
2619
2620   return nds32_elf_do_9_pcrel_reloc (abfd, reloc_entry->howto,
2621                                      input_section,
2622                                      data, reloc_entry->address,
2623                                      symbol->section,
2624                                      (symbol->value
2625                                       + symbol->section->output_section->vma
2626                                       + symbol->section->output_offset),
2627                                      reloc_entry->addend);
2628 }
2629
2630 /* Utility to actually perform an R_NDS32_9_PCREL reloc.  */
2631 #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
2632
2633 static bfd_reloc_status_type
2634 nds32_elf_do_9_pcrel_reloc (bfd *               abfd,
2635                             reloc_howto_type *  howto,
2636                             asection *          input_section,
2637                             bfd_byte *          data,
2638                             bfd_vma             offset,
2639                             asection *          symbol_section ATTRIBUTE_UNUSED,
2640                             bfd_vma             symbol_value,
2641                             bfd_vma             addend)
2642 {
2643   bfd_signed_vma relocation;
2644   unsigned short x;
2645   bfd_reloc_status_type status;
2646
2647   /* Sanity check the address (offset in section).  */
2648   if (offset > bfd_get_section_limit (abfd, input_section))
2649     return bfd_reloc_outofrange;
2650
2651   relocation = symbol_value + addend;
2652   /* Make it pc relative.  */
2653   relocation -= (input_section->output_section->vma
2654                  + input_section->output_offset);
2655   /* These jumps mask off the lower two bits of the current address
2656      before doing pcrel calculations.  */
2657   relocation -= (offset & -(bfd_vma) 2);
2658
2659   if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1)
2660     status = bfd_reloc_overflow;
2661   else
2662     status = bfd_reloc_ok;
2663
2664   x = bfd_getb16 (data + offset);
2665
2666   relocation >>= howto->rightshift;
2667   relocation <<= howto->bitpos;
2668   x = (x & ~howto->dst_mask)
2669       | (((x & howto->src_mask) + relocation) & howto->dst_mask);
2670
2671   bfd_putb16 ((bfd_vma) x, data + offset);
2672
2673   return status;
2674 }
2675
2676 /* Handle the R_NDS32_HI20_[SU]LO relocs.
2677    HI20_SLO is for the add3 and load/store with displacement instructions.
2678    HI20 is for the or3 instruction.
2679    For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to
2680    the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
2681    we must add one to the high 16 bytes (which will get subtracted off when
2682    the low 16 bits are added).
2683    These relocs have to be done in combination with an R_NDS32_LO12 reloc
2684    because there is a carry from the LO12 to the HI20.  Here we just save
2685    the information we need; we do the actual relocation when we see the LO12.
2686    This code is copied from the elf32-mips.c.  We also support an arbitrary
2687    number of HI20 relocs to be associated with a single LO12 reloc.  The
2688    assembler sorts the relocs to ensure each HI20 immediately precedes its
2689    LO12.  However if there are multiple copies, the assembler may not find
2690    the real LO12 so it picks the first one it finds.  */
2691
2692 struct nds32_hi20
2693 {
2694   struct nds32_hi20 *next;
2695   bfd_byte *addr;
2696   bfd_vma addend;
2697 };
2698
2699 static struct nds32_hi20 *nds32_hi20_list;
2700
2701 static bfd_reloc_status_type
2702 nds32_elf_hi20_reloc (bfd *abfd ATTRIBUTE_UNUSED,
2703                       arelent *reloc_entry,
2704                       asymbol *symbol,
2705                       void *data,
2706                       asection *input_section,
2707                       bfd *output_bfd,
2708                       char **error_message ATTRIBUTE_UNUSED)
2709 {
2710   bfd_reloc_status_type ret;
2711   bfd_vma relocation;
2712   struct nds32_hi20 *n;
2713
2714   /* This part is from bfd_elf_generic_reloc.
2715      If we're relocating, and this an external symbol, we don't want
2716      to change anything.  */
2717   if (output_bfd != (bfd *) NULL
2718       && (symbol->flags & BSF_SECTION_SYM) == 0 && reloc_entry->addend == 0)
2719     {
2720       reloc_entry->address += input_section->output_offset;
2721       return bfd_reloc_ok;
2722     }
2723
2724   /* Sanity check the address (offset in section).  */
2725   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2726     return bfd_reloc_outofrange;
2727
2728   ret = bfd_reloc_ok;
2729   if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2730     ret = bfd_reloc_undefined;
2731
2732   if (bfd_is_com_section (symbol->section))
2733     relocation = 0;
2734   else
2735     relocation = symbol->value;
2736
2737   relocation += symbol->section->output_section->vma;
2738   relocation += symbol->section->output_offset;
2739   relocation += reloc_entry->addend;
2740
2741   /* Save the information, and let LO12 do the actual relocation.  */
2742   n = (struct nds32_hi20 *) bfd_malloc ((bfd_size_type) sizeof *n);
2743   if (n == NULL)
2744     return bfd_reloc_outofrange;
2745
2746   n->addr = (bfd_byte *) data + reloc_entry->address;
2747   n->addend = relocation;
2748   n->next = nds32_hi20_list;
2749   nds32_hi20_list = n;
2750
2751   if (output_bfd != (bfd *) NULL)
2752     reloc_entry->address += input_section->output_offset;
2753
2754   return ret;
2755 }
2756
2757 /* Handle an NDS32 ELF HI20 reloc.  */
2758
2759 static void
2760 nds32_elf_relocate_hi20 (bfd *input_bfd ATTRIBUTE_UNUSED,
2761                          int type ATTRIBUTE_UNUSED,
2762                          Elf_Internal_Rela *relhi,
2763                          Elf_Internal_Rela *rello,
2764                          bfd_byte *contents,
2765                          bfd_vma addend)
2766 {
2767   unsigned long insn;
2768   bfd_vma addlo;
2769
2770   insn = bfd_getb32 (contents + relhi->r_offset);
2771
2772   addlo = bfd_getb32 (contents + rello->r_offset);
2773   addlo &= 0xfff;
2774
2775   addend += ((insn & 0xfffff) << 20) + addlo;
2776
2777   insn = (insn & 0xfff00000) | ((addend >> 12) & 0xfffff);
2778   bfd_putb32 (insn, contents + relhi->r_offset);
2779 }
2780
2781 /* Do an R_NDS32_LO12 relocation.  This is a straightforward 12 bit
2782    inplace relocation; this function exists in order to do the
2783    R_NDS32_HI20_[SU]LO relocation described above.  */
2784
2785 static bfd_reloc_status_type
2786 nds32_elf_lo12_reloc (bfd *input_bfd, arelent *reloc_entry, asymbol *symbol,
2787                       void *data, asection *input_section, bfd *output_bfd,
2788                       char **error_message)
2789 {
2790   /* This part is from bfd_elf_generic_reloc.
2791      If we're relocating, and this an external symbol, we don't want
2792      to change anything.  */
2793   if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2794       && reloc_entry->addend == 0)
2795     {
2796       reloc_entry->address += input_section->output_offset;
2797       return bfd_reloc_ok;
2798     }
2799
2800   if (nds32_hi20_list != NULL)
2801     {
2802       struct nds32_hi20 *l;
2803
2804       l = nds32_hi20_list;
2805       while (l != NULL)
2806         {
2807           unsigned long insn;
2808           unsigned long val;
2809           unsigned long vallo;
2810           struct nds32_hi20 *next;
2811
2812           /* Do the HI20 relocation.  Note that we actually don't need
2813              to know anything about the LO12 itself, except where to
2814              find the low 12 bits of the addend needed by the LO12.  */
2815           insn = bfd_getb32 (l->addr);
2816           vallo = bfd_getb32 ((bfd_byte *) data + reloc_entry->address);
2817           vallo &= 0xfff;
2818           switch (reloc_entry->howto->type)
2819             {
2820             case R_NDS32_LO12S3:
2821               vallo <<= 3;
2822               break;
2823
2824             case R_NDS32_LO12S2:
2825               vallo <<= 2;
2826               break;
2827
2828             case R_NDS32_LO12S1:
2829               vallo <<= 1;
2830               break;
2831
2832             case R_NDS32_LO12S0:
2833               vallo <<= 0;
2834               break;
2835             }
2836
2837           val = ((insn & 0xfffff) << 12) + vallo;
2838           val += l->addend;
2839
2840           insn = (insn & ~(bfd_vma) 0xfffff) | ((val >> 12) & 0xfffff);
2841           bfd_putb32 ((bfd_vma) insn, l->addr);
2842
2843           next = l->next;
2844           free (l);
2845           l = next;
2846         }
2847
2848       nds32_hi20_list = NULL;
2849     }
2850
2851   /* Now do the LO12 reloc in the usual way.
2852      ??? It would be nice to call bfd_elf_generic_reloc here,
2853      but we have partial_inplace set.  bfd_elf_generic_reloc will
2854      pass the handling back to bfd_install_relocation which will install
2855      a section relative addend which is wrong.  */
2856   return nds32_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
2857                                   input_section, output_bfd, error_message);
2858 }
2859
2860 /* Do generic partial_inplace relocation.
2861    This is a local replacement for bfd_elf_generic_reloc.  */
2862
2863 static bfd_reloc_status_type
2864 nds32_elf_generic_reloc (bfd *input_bfd, arelent *reloc_entry,
2865                          asymbol *symbol, void *data, asection *input_section,
2866                          bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2867 {
2868   bfd_reloc_status_type ret;
2869   bfd_vma relocation;
2870   bfd_byte *inplace_address;
2871
2872   /* This part is from bfd_elf_generic_reloc.
2873      If we're relocating, and this an external symbol, we don't want
2874      to change anything.  */
2875   if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2876       && reloc_entry->addend == 0)
2877     {
2878       reloc_entry->address += input_section->output_offset;
2879       return bfd_reloc_ok;
2880     }
2881
2882   /* Now do the reloc in the usual way.
2883      ??? It would be nice to call bfd_elf_generic_reloc here,
2884      but we have partial_inplace set.  bfd_elf_generic_reloc will
2885      pass the handling back to bfd_install_relocation which will install
2886      a section relative addend which is wrong.  */
2887
2888   /* Sanity check the address (offset in section).  */
2889   if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section))
2890     return bfd_reloc_outofrange;
2891
2892   ret = bfd_reloc_ok;
2893   if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2894     ret = bfd_reloc_undefined;
2895
2896   if (bfd_is_com_section (symbol->section) || output_bfd != (bfd *) NULL)
2897     relocation = 0;
2898   else
2899     relocation = symbol->value;
2900
2901   /* Only do this for a final link.  */
2902   if (output_bfd == (bfd *) NULL)
2903     {
2904       relocation += symbol->section->output_section->vma;
2905       relocation += symbol->section->output_offset;
2906     }
2907
2908   relocation += reloc_entry->addend;
2909   switch (reloc_entry->howto->type)
2910     {
2911     case R_NDS32_LO12S3:
2912       relocation >>= 3;
2913       break;
2914
2915     case R_NDS32_LO12S2:
2916       relocation >>= 2;
2917       break;
2918
2919     case R_NDS32_LO12S1:
2920       relocation >>= 1;
2921       break;
2922
2923     case R_NDS32_LO12S0:
2924     default:
2925       relocation >>= 0;
2926       break;
2927     }
2928
2929   inplace_address = (bfd_byte *) data + reloc_entry->address;
2930
2931 #define DOIT(x)                                         \
2932   x = ((x & ~reloc_entry->howto->dst_mask) |            \
2933   (((x & reloc_entry->howto->src_mask) +  relocation) & \
2934   reloc_entry->howto->dst_mask))
2935
2936   switch (reloc_entry->howto->size)
2937     {
2938     case 1:
2939       {
2940         short x = bfd_getb16 (inplace_address);
2941
2942         DOIT (x);
2943         bfd_putb16 ((bfd_vma) x, inplace_address);
2944       }
2945       break;
2946     case 2:
2947       {
2948         unsigned long x = bfd_getb32 (inplace_address);
2949
2950         DOIT (x);
2951         bfd_putb32 ((bfd_vma) x, inplace_address);
2952       }
2953       break;
2954     default:
2955       BFD_ASSERT (0);
2956     }
2957
2958   if (output_bfd != (bfd *) NULL)
2959     reloc_entry->address += input_section->output_offset;
2960
2961   return ret;
2962 }
2963
2964 /* Handle the R_NDS32_SDA15 reloc.
2965    This reloc is used to compute the address of objects in the small data area
2966    and to perform loads and stores from that area.
2967    The lower 15 bits are sign extended and added to the register specified
2968    in the instruction, which is assumed to point to _SDA_BASE_.
2969
2970    Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on
2971    the access size, this must be taken care of.  */
2972
2973 static bfd_reloc_status_type
2974 nds32_elf_sda15_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2975                        asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2976                        asection *input_section, bfd *output_bfd,
2977                        char **error_message ATTRIBUTE_UNUSED)
2978 {
2979   /* This part is from bfd_elf_generic_reloc.  */
2980   if (output_bfd != (bfd *) NULL
2981       && (symbol->flags & BSF_SECTION_SYM) == 0
2982       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2983     {
2984       reloc_entry->address += input_section->output_offset;
2985       return bfd_reloc_ok;
2986     }
2987
2988   if (output_bfd != NULL)
2989     {
2990       /* FIXME: See bfd_perform_relocation.  Is this right?  */
2991       return bfd_reloc_continue;
2992     }
2993
2994   /* FIXME: not sure what to do here yet.  But then again, the linker
2995      may never call us.  */
2996   abort ();
2997 }
2998
2999 /* nds32_elf_ignore_reloc is the special function for
3000    relocation types which don't need to be relocated
3001    like relaxation relocation types.
3002    This function simply return bfd_reloc_ok when it is
3003    invoked.  */
3004
3005 static bfd_reloc_status_type
3006 nds32_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
3007                         asymbol *symbol ATTRIBUTE_UNUSED,
3008                         void *data ATTRIBUTE_UNUSED, asection *input_section,
3009                         bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
3010 {
3011   if (output_bfd != NULL)
3012     reloc_entry->address += input_section->output_offset;
3013
3014   return bfd_reloc_ok;
3015 }
3016 \f
3017
3018 /* Map BFD reloc types to NDS32 ELF reloc types.  */
3019
3020 struct nds32_reloc_map_entry
3021 {
3022   bfd_reloc_code_real_type bfd_reloc_val;
3023   unsigned char elf_reloc_val;
3024 };
3025
3026 static const struct nds32_reloc_map_entry nds32_reloc_map[] =
3027 {
3028   {BFD_RELOC_NONE, R_NDS32_NONE},
3029   {BFD_RELOC_16, R_NDS32_16_RELA},
3030   {BFD_RELOC_32, R_NDS32_32_RELA},
3031   {BFD_RELOC_VTABLE_INHERIT, R_NDS32_RELA_GNU_VTINHERIT},
3032   {BFD_RELOC_VTABLE_ENTRY, R_NDS32_RELA_GNU_VTENTRY},
3033
3034   {BFD_RELOC_NDS32_20, R_NDS32_20_RELA},
3035   {BFD_RELOC_NDS32_9_PCREL, R_NDS32_9_PCREL_RELA},
3036   {BFD_RELOC_NDS32_WORD_9_PCREL, R_NDS32_WORD_9_PCREL_RELA},
3037   {BFD_RELOC_NDS32_15_PCREL, R_NDS32_15_PCREL_RELA},
3038   {BFD_RELOC_NDS32_17_PCREL, R_NDS32_17_PCREL_RELA},
3039   {BFD_RELOC_NDS32_25_PCREL, R_NDS32_25_PCREL_RELA},
3040   {BFD_RELOC_NDS32_HI20, R_NDS32_HI20_RELA},
3041   {BFD_RELOC_NDS32_LO12S3, R_NDS32_LO12S3_RELA},
3042   {BFD_RELOC_NDS32_LO12S2, R_NDS32_LO12S2_RELA},
3043   {BFD_RELOC_NDS32_LO12S1, R_NDS32_LO12S1_RELA},
3044   {BFD_RELOC_NDS32_LO12S0, R_NDS32_LO12S0_RELA},
3045   {BFD_RELOC_NDS32_LO12S0_ORI, R_NDS32_LO12S0_ORI_RELA},
3046   {BFD_RELOC_NDS32_SDA15S3, R_NDS32_SDA15S3_RELA},
3047   {BFD_RELOC_NDS32_SDA15S2, R_NDS32_SDA15S2_RELA},
3048   {BFD_RELOC_NDS32_SDA15S1, R_NDS32_SDA15S1_RELA},
3049   {BFD_RELOC_NDS32_SDA15S0, R_NDS32_SDA15S0_RELA},
3050   {BFD_RELOC_NDS32_SDA16S3, R_NDS32_SDA16S3_RELA},
3051   {BFD_RELOC_NDS32_SDA17S2, R_NDS32_SDA17S2_RELA},
3052   {BFD_RELOC_NDS32_SDA18S1, R_NDS32_SDA18S1_RELA},
3053   {BFD_RELOC_NDS32_SDA19S0, R_NDS32_SDA19S0_RELA},
3054   {BFD_RELOC_NDS32_GOT20, R_NDS32_GOT20},
3055   {BFD_RELOC_NDS32_9_PLTREL, R_NDS32_9_PLTREL},
3056   {BFD_RELOC_NDS32_25_PLTREL, R_NDS32_25_PLTREL},
3057   {BFD_RELOC_NDS32_COPY, R_NDS32_COPY},
3058   {BFD_RELOC_NDS32_GLOB_DAT, R_NDS32_GLOB_DAT},
3059   {BFD_RELOC_NDS32_JMP_SLOT, R_NDS32_JMP_SLOT},
3060   {BFD_RELOC_NDS32_RELATIVE, R_NDS32_RELATIVE},
3061   {BFD_RELOC_NDS32_GOTOFF, R_NDS32_GOTOFF},
3062   {BFD_RELOC_NDS32_GOTOFF_HI20, R_NDS32_GOTOFF_HI20},
3063   {BFD_RELOC_NDS32_GOTOFF_LO12, R_NDS32_GOTOFF_LO12},
3064   {BFD_RELOC_NDS32_GOTPC20, R_NDS32_GOTPC20},
3065   {BFD_RELOC_NDS32_GOT_HI20, R_NDS32_GOT_HI20},
3066   {BFD_RELOC_NDS32_GOT_LO12, R_NDS32_GOT_LO12},
3067   {BFD_RELOC_NDS32_GOTPC_HI20, R_NDS32_GOTPC_HI20},
3068   {BFD_RELOC_NDS32_GOTPC_LO12, R_NDS32_GOTPC_LO12},
3069   {BFD_RELOC_NDS32_INSN16, R_NDS32_INSN16},
3070   {BFD_RELOC_NDS32_LABEL, R_NDS32_LABEL},
3071   {BFD_RELOC_NDS32_LONGCALL1, R_NDS32_LONGCALL1},
3072   {BFD_RELOC_NDS32_LONGCALL2, R_NDS32_LONGCALL2},
3073   {BFD_RELOC_NDS32_LONGCALL3, R_NDS32_LONGCALL3},
3074   {BFD_RELOC_NDS32_LONGJUMP1, R_NDS32_LONGJUMP1},
3075   {BFD_RELOC_NDS32_LONGJUMP2, R_NDS32_LONGJUMP2},
3076   {BFD_RELOC_NDS32_LONGJUMP3, R_NDS32_LONGJUMP3},
3077   {BFD_RELOC_NDS32_LOADSTORE, R_NDS32_LOADSTORE},
3078   {BFD_RELOC_NDS32_9_FIXED, R_NDS32_9_FIXED_RELA},
3079   {BFD_RELOC_NDS32_15_FIXED, R_NDS32_15_FIXED_RELA},
3080   {BFD_RELOC_NDS32_17_FIXED, R_NDS32_17_FIXED_RELA},
3081   {BFD_RELOC_NDS32_25_FIXED, R_NDS32_25_FIXED_RELA},
3082   {BFD_RELOC_NDS32_LONGCALL4, R_NDS32_LONGCALL4},
3083   {BFD_RELOC_NDS32_LONGCALL5, R_NDS32_LONGCALL5},
3084   {BFD_RELOC_NDS32_LONGCALL6, R_NDS32_LONGCALL6},
3085   {BFD_RELOC_NDS32_LONGJUMP4, R_NDS32_LONGJUMP4},
3086   {BFD_RELOC_NDS32_LONGJUMP5, R_NDS32_LONGJUMP5},
3087   {BFD_RELOC_NDS32_LONGJUMP6, R_NDS32_LONGJUMP6},
3088   {BFD_RELOC_NDS32_LONGJUMP7, R_NDS32_LONGJUMP7},
3089   {BFD_RELOC_NDS32_PLTREL_HI20, R_NDS32_PLTREL_HI20},
3090   {BFD_RELOC_NDS32_PLTREL_LO12, R_NDS32_PLTREL_LO12},
3091   {BFD_RELOC_NDS32_PLT_GOTREL_HI20, R_NDS32_PLT_GOTREL_HI20},
3092   {BFD_RELOC_NDS32_PLT_GOTREL_LO12, R_NDS32_PLT_GOTREL_LO12},
3093   {BFD_RELOC_NDS32_SDA12S2_DP, R_NDS32_SDA12S2_DP_RELA},
3094   {BFD_RELOC_NDS32_SDA12S2_SP, R_NDS32_SDA12S2_SP_RELA},
3095   {BFD_RELOC_NDS32_LO12S2_DP, R_NDS32_LO12S2_DP_RELA},
3096   {BFD_RELOC_NDS32_LO12S2_SP, R_NDS32_LO12S2_SP_RELA},
3097   {BFD_RELOC_NDS32_DWARF2_OP1, R_NDS32_DWARF2_OP1_RELA},
3098   {BFD_RELOC_NDS32_DWARF2_OP2, R_NDS32_DWARF2_OP2_RELA},
3099   {BFD_RELOC_NDS32_DWARF2_LEB, R_NDS32_DWARF2_LEB_RELA},
3100   {BFD_RELOC_NDS32_UPDATE_TA, R_NDS32_UPDATE_TA_RELA},
3101   {BFD_RELOC_NDS32_PLT_GOTREL_LO20, R_NDS32_PLT_GOTREL_LO20},
3102   {BFD_RELOC_NDS32_PLT_GOTREL_LO15, R_NDS32_PLT_GOTREL_LO15},
3103   {BFD_RELOC_NDS32_PLT_GOTREL_LO19, R_NDS32_PLT_GOTREL_LO19},
3104   {BFD_RELOC_NDS32_GOT_LO15, R_NDS32_GOT_LO15},
3105   {BFD_RELOC_NDS32_GOT_LO19, R_NDS32_GOT_LO19},
3106   {BFD_RELOC_NDS32_GOTOFF_LO15, R_NDS32_GOTOFF_LO15},
3107   {BFD_RELOC_NDS32_GOTOFF_LO19, R_NDS32_GOTOFF_LO19},
3108   {BFD_RELOC_NDS32_GOT15S2, R_NDS32_GOT15S2_RELA},
3109   {BFD_RELOC_NDS32_GOT17S2, R_NDS32_GOT17S2_RELA},
3110   {BFD_RELOC_NDS32_5, R_NDS32_5_RELA},
3111   {BFD_RELOC_NDS32_10_UPCREL, R_NDS32_10_UPCREL_RELA},
3112   {BFD_RELOC_NDS32_SDA_FP7U2_RELA, R_NDS32_SDA_FP7U2_RELA},
3113   {BFD_RELOC_NDS32_RELAX_ENTRY, R_NDS32_RELAX_ENTRY},
3114   {BFD_RELOC_NDS32_GOT_SUFF, R_NDS32_GOT_SUFF},
3115   {BFD_RELOC_NDS32_GOTOFF_SUFF, R_NDS32_GOTOFF_SUFF},
3116   {BFD_RELOC_NDS32_PLT_GOT_SUFF, R_NDS32_PLT_GOT_SUFF},
3117   {BFD_RELOC_NDS32_MULCALL_SUFF, R_NDS32_MULCALL_SUFF},
3118   {BFD_RELOC_NDS32_PTR, R_NDS32_PTR},
3119   {BFD_RELOC_NDS32_PTR_COUNT, R_NDS32_PTR_COUNT},
3120   {BFD_RELOC_NDS32_PTR_RESOLVED, R_NDS32_PTR_RESOLVED},
3121   {BFD_RELOC_NDS32_PLTBLOCK, R_NDS32_PLTBLOCK},
3122   {BFD_RELOC_NDS32_RELAX_REGION_BEGIN, R_NDS32_RELAX_REGION_BEGIN},
3123   {BFD_RELOC_NDS32_RELAX_REGION_END, R_NDS32_RELAX_REGION_END},
3124   {BFD_RELOC_NDS32_MINUEND, R_NDS32_MINUEND},
3125   {BFD_RELOC_NDS32_SUBTRAHEND, R_NDS32_SUBTRAHEND},
3126   {BFD_RELOC_NDS32_DIFF8, R_NDS32_DIFF8},
3127   {BFD_RELOC_NDS32_DIFF16, R_NDS32_DIFF16},
3128   {BFD_RELOC_NDS32_DIFF32, R_NDS32_DIFF32},
3129   {BFD_RELOC_NDS32_DIFF_ULEB128, R_NDS32_DIFF_ULEB128},
3130   {BFD_RELOC_NDS32_EMPTY, R_NDS32_EMPTY},
3131   {BFD_RELOC_NDS32_25_ABS, R_NDS32_25_ABS_RELA},
3132   {BFD_RELOC_NDS32_DATA, R_NDS32_DATA},
3133   {BFD_RELOC_NDS32_TRAN, R_NDS32_TRAN},
3134   {BFD_RELOC_NDS32_17IFC_PCREL, R_NDS32_17IFC_PCREL_RELA},
3135   {BFD_RELOC_NDS32_10IFCU_PCREL, R_NDS32_10IFCU_PCREL_RELA},
3136   /* Not sure.  */
3137   {BFD_RELOC_NDS32_TPOFF, R_NDS32_TLS_TPOFF},
3138   /* Missing: BFD_RELOC_NDS32_GOTTPOFF.  */
3139   {BFD_RELOC_NDS32_TLS_LE_HI20, R_NDS32_TLS_LE_HI20},
3140   {BFD_RELOC_NDS32_TLS_LE_LO12, R_NDS32_TLS_LE_LO12},
3141   {BFD_RELOC_NDS32_TLS_LE_20, R_NDS32_TLS_LE_20},
3142   {BFD_RELOC_NDS32_TLS_LE_15S0, R_NDS32_TLS_LE_15S0},
3143   {BFD_RELOC_NDS32_TLS_LE_15S1, R_NDS32_TLS_LE_15S1},
3144   {BFD_RELOC_NDS32_TLS_LE_15S2, R_NDS32_TLS_LE_15S2},
3145   {BFD_RELOC_NDS32_TLS_LE_ADD, R_NDS32_TLS_LE_ADD},
3146   {BFD_RELOC_NDS32_TLS_LE_LS, R_NDS32_TLS_LE_LS},
3147   {BFD_RELOC_NDS32_TLS_IE_HI20, R_NDS32_TLS_IE_HI20},
3148   {BFD_RELOC_NDS32_TLS_IE_LO12, R_NDS32_TLS_IE_LO12},
3149   {BFD_RELOC_NDS32_TLS_IE_LO12S2, R_NDS32_TLS_IE_LO12S2},
3150   {BFD_RELOC_NDS32_TLS_IEGP_HI20, R_NDS32_TLS_IEGP_HI20},
3151   {BFD_RELOC_NDS32_TLS_IEGP_LO12, R_NDS32_TLS_IEGP_LO12},
3152   {BFD_RELOC_NDS32_TLS_IEGP_LO12S2, R_NDS32_TLS_IEGP_LO12S2},
3153   {BFD_RELOC_NDS32_TLS_IEGP_LW, R_NDS32_TLS_IEGP_LW},
3154   {BFD_RELOC_NDS32_TLS_DESC, R_NDS32_TLS_DESC},
3155   {BFD_RELOC_NDS32_TLS_DESC_HI20, R_NDS32_TLS_DESC_HI20},
3156   {BFD_RELOC_NDS32_TLS_DESC_LO12, R_NDS32_TLS_DESC_LO12},
3157   {BFD_RELOC_NDS32_TLS_DESC_20, R_NDS32_TLS_DESC_20},
3158   {BFD_RELOC_NDS32_TLS_DESC_SDA17S2, R_NDS32_TLS_DESC_SDA17S2},
3159   {BFD_RELOC_NDS32_TLS_DESC_ADD, R_NDS32_TLS_DESC_ADD},
3160   {BFD_RELOC_NDS32_TLS_DESC_FUNC, R_NDS32_TLS_DESC_FUNC},
3161   {BFD_RELOC_NDS32_TLS_DESC_CALL, R_NDS32_TLS_DESC_CALL},
3162   {BFD_RELOC_NDS32_TLS_DESC_MEM, R_NDS32_TLS_DESC_MEM},
3163   {BFD_RELOC_NDS32_REMOVE, R_NDS32_RELAX_REMOVE},
3164   {BFD_RELOC_NDS32_GROUP, R_NDS32_RELAX_GROUP},
3165   {BFD_RELOC_NDS32_LSI, R_NDS32_LSI},
3166 };
3167
3168 /* Patch tag.  */
3169
3170 static reloc_howto_type *
3171 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3172                                  const char *r_name)
3173 {
3174   unsigned int i;
3175
3176   for (i = 0; i < ARRAY_SIZE (nds32_elf_howto_table); i++)
3177     if (nds32_elf_howto_table[i].name != NULL
3178         && strcasecmp (nds32_elf_howto_table[i].name, r_name) == 0)
3179       return &nds32_elf_howto_table[i];
3180
3181   for (i = 0; i < ARRAY_SIZE (nds32_elf_relax_howto_table); i++)
3182     if (nds32_elf_relax_howto_table[i].name != NULL
3183         && strcasecmp (nds32_elf_relax_howto_table[i].name, r_name) == 0)
3184       return &nds32_elf_relax_howto_table[i];
3185
3186   return NULL;
3187 }
3188
3189 static reloc_howto_type *
3190 bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code)
3191 {
3192   if (code < R_NDS32_RELAX_ENTRY)
3193     {
3194       BFD_ASSERT (code < ARRAY_SIZE (nds32_elf_howto_table));
3195       return &nds32_elf_howto_table[code];
3196     }
3197   else
3198     {
3199       if ((size_t) (code - R_NDS32_RELAX_ENTRY)
3200           >= ARRAY_SIZE (nds32_elf_relax_howto_table))
3201         {
3202           int i = code;
3203           i += 1;
3204         }
3205
3206       BFD_ASSERT ((size_t) (code - R_NDS32_RELAX_ENTRY)
3207                   < ARRAY_SIZE (nds32_elf_relax_howto_table));
3208       return &nds32_elf_relax_howto_table[code - R_NDS32_RELAX_ENTRY];
3209     }
3210 }
3211
3212 static reloc_howto_type *
3213 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3214                                  bfd_reloc_code_real_type code)
3215 {
3216   unsigned int i;
3217
3218   for (i = 0; i < ARRAY_SIZE (nds32_reloc_map); i++)
3219     {
3220       if (nds32_reloc_map[i].bfd_reloc_val == code)
3221         return bfd_elf32_bfd_reloc_type_table_lookup
3222           (nds32_reloc_map[i].elf_reloc_val);
3223     }
3224
3225   return NULL;
3226 }
3227
3228 /* Set the howto pointer for an NDS32 ELF reloc.  */
3229
3230 static bfd_boolean
3231 nds32_info_to_howto_rel (bfd *abfd, arelent *cache_ptr,
3232                          Elf_Internal_Rela *dst)
3233 {
3234   enum elf_nds32_reloc_type r_type;
3235
3236   r_type = ELF32_R_TYPE (dst->r_info);
3237   if (r_type > R_NDS32_GNU_VTENTRY)
3238     {
3239       /* xgettext:c-format */
3240       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3241                           abfd, r_type);
3242       bfd_set_error (bfd_error_bad_value);
3243       return FALSE;
3244     }
3245
3246   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) <= R_NDS32_GNU_VTENTRY);
3247   cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
3248   return TRUE;
3249 }
3250
3251 static bfd_boolean
3252 nds32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
3253                      Elf_Internal_Rela *dst)
3254 {
3255   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
3256
3257   if ((r_type == R_NDS32_NONE)
3258       || ((r_type > R_NDS32_GNU_VTENTRY)
3259           && (r_type < R_NDS32_max)))
3260     {
3261       cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
3262       return TRUE;
3263     }
3264
3265   /* xgettext:c-format */
3266   _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r_type);
3267   bfd_set_error (bfd_error_bad_value);
3268   return FALSE;
3269 }
3270
3271 /* Support for core dump NOTE sections.
3272    Reference to include/linux/elfcore.h in Linux.  */
3273
3274 static bfd_boolean
3275 nds32_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3276 {
3277   int offset;
3278   size_t size;
3279
3280   switch (note->descsz)
3281     {
3282     case 0x114:
3283       /* Linux/NDS32 32-bit, ABI1.  */
3284
3285       /* pr_cursig */
3286       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3287
3288       /* pr_pid */
3289       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3290
3291       /* pr_reg */
3292       offset = 72;
3293       size = 200;
3294       break;
3295
3296     case 0xfc:
3297       /* Linux/NDS32 32-bit.  */
3298
3299       /* pr_cursig */
3300       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3301
3302       /* pr_pid */
3303       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3304
3305       /* pr_reg */
3306       offset = 72;
3307       size = 176;
3308       break;
3309
3310     default:
3311       return FALSE;
3312     }
3313
3314   /* Make a ".reg" section.  */
3315   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3316                                           size, note->descpos + offset);
3317 }
3318
3319 static bfd_boolean
3320 nds32_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3321 {
3322   switch (note->descsz)
3323     {
3324     case 124:
3325       /* Linux/NDS32.  */
3326
3327       /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform.  */
3328       elf_tdata (abfd)->core->program =
3329         _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
3330       elf_tdata (abfd)->core->command =
3331         _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
3332       break;
3333
3334     default:
3335       return FALSE;
3336     }
3337
3338   /* Note that for some reason, a spurious space is tacked
3339      onto the end of the args in some (at least one anyway)
3340      implementations, so strip it off if it exists.  */
3341   {
3342     char *command = elf_tdata (abfd)->core->command;
3343     int n = strlen (command);
3344
3345     if (0 < n && command[n - 1] == ' ')
3346       command[n - 1] = '\0';
3347   }
3348
3349   return TRUE;
3350 }
3351
3352 /* Hook called by the linker routine which adds symbols from an object
3353    file.  We must handle the special NDS32 section numbers here.
3354    We also keep watching for whether we need to create the sdata special
3355    linker sections.  */
3356
3357 static bfd_boolean
3358 nds32_elf_add_symbol_hook (bfd *abfd,
3359                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
3360                            Elf_Internal_Sym *sym,
3361                            const char **namep ATTRIBUTE_UNUSED,
3362                            flagword *flagsp ATTRIBUTE_UNUSED,
3363                            asection **secp, bfd_vma *valp)
3364 {
3365   switch (sym->st_shndx)
3366     {
3367     case SHN_COMMON:
3368       /* Common symbols less than the GP size are automatically
3369          treated as SHN_MIPS_SCOMMON symbols.  */
3370       if (sym->st_size > elf_gp_size (abfd)
3371           || ELF_ST_TYPE (sym->st_info) == STT_TLS)
3372         break;
3373
3374       /* st_value is the alignemnt constraint.
3375          That might be its actual size if it is an array or structure.  */
3376       switch (sym->st_value)
3377         {
3378         case 1:
3379           *secp = bfd_make_section_old_way (abfd, ".scommon_b");
3380           break;
3381         case 2:
3382           *secp = bfd_make_section_old_way (abfd, ".scommon_h");
3383           break;
3384         case 4:
3385           *secp = bfd_make_section_old_way (abfd, ".scommon_w");
3386           break;
3387         case 8:
3388           *secp = bfd_make_section_old_way (abfd, ".scommon_d");
3389           break;
3390         default:
3391           return TRUE;
3392         }
3393
3394       (*secp)->flags |= SEC_IS_COMMON;
3395       *valp = sym->st_size;
3396       break;
3397     }
3398
3399   return TRUE;
3400 }
3401
3402 /* This function can figure out the best location for a base register to access
3403    data relative to this base register
3404    INPUT:
3405    sda_d0: size of first DOUBLE WORD data section
3406    sda_w0: size of first WORD data section
3407    sda_h0: size of first HALF WORD data section
3408    sda_b : size of BYTE data section
3409    sda_hi: size of second HALF WORD data section
3410    sda_w1: size of second WORD data section
3411    sda_d1: size of second DOUBLE WORD data section
3412    OUTPUT:
3413    offset (always positive) from the beginning of sda_d0 if OK
3414    a negative error value if fail
3415    NOTE:
3416    these 7 sections have to be located back to back if exist
3417    a pass in 0 value for non-existing section   */
3418
3419 /* Due to the interpretation of simm15 field of load/store depending on
3420    data accessing size, the organization of base register relative data shall
3421    like the following figure
3422    -------------------------------------------
3423    |  DOUBLE WORD sized data (range +/- 128K)
3424    -------------------------------------------
3425    |  WORD sized data (range +/- 64K)
3426    -------------------------------------------
3427    |  HALF WORD sized data (range +/- 32K)
3428    -------------------------------------------
3429    |  BYTE sized data (range +/- 16K)
3430    -------------------------------------------
3431    |  HALF WORD sized data (range +/- 32K)
3432    -------------------------------------------
3433    |  WORD sized data (range +/- 64K)
3434    -------------------------------------------
3435    |  DOUBLE WORD sized data (range +/- 128K)
3436    -------------------------------------------
3437    Its base register shall be set to access these data freely.  */
3438
3439 /* We have to figure out the SDA_BASE value, so that we can adjust the
3440    symbol value correctly.  We look up the symbol _SDA_BASE_ in the output
3441    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
3442    target data.  We don't need to adjust the symbol value for an
3443    external symbol if we are producing relocatable output.  */
3444
3445 static asection *sda_rela_sec = NULL;
3446
3447 #define SDA_SECTION_NUM 10
3448
3449 static bfd_reloc_status_type
3450 nds32_elf_final_sda_base (bfd *                   output_bfd,
3451                           struct bfd_link_info *  info,
3452                           bfd_vma *               psb,
3453                           bfd_boolean             add_symbol)
3454 {
3455   int relax_fp_as_gp;
3456   struct elf_nds32_link_hash_table *table;
3457   struct bfd_link_hash_entry *h, *h2;
3458   long unsigned int total = 0;
3459   asection *first = NULL, *final = NULL, *temp;
3460   bfd_vma sda_base = 0;
3461
3462   h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE);
3463   if (!h || (h->type != bfd_link_hash_defined
3464              && h->type != bfd_link_hash_defweak))
3465     {
3466       /* The first section must be 4-byte aligned to promise _SDA_BASE_ being
3467          4 byte-aligned.  Therefore, it has to set the first section ".data"
3468          4 byte-aligned.  */
3469       static const char sec_name[SDA_SECTION_NUM][10] =
3470         {
3471           ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
3472           ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
3473         };
3474       size_t i = 0;
3475
3476       if (output_bfd->sections == NULL)
3477         {
3478           *psb = elf_gp (output_bfd);
3479           return bfd_reloc_ok;
3480         }
3481
3482       /* Get the first and final section.  */
3483       while (i < ARRAY_SIZE (sec_name))
3484         {
3485           temp = bfd_get_section_by_name (output_bfd, sec_name[i]);
3486           if (temp && !first && (temp->size != 0 || temp->rawsize != 0))
3487             first = temp;
3488           if (temp && (temp->size != 0 || temp->rawsize != 0))
3489             final = temp;
3490
3491           /* Summarize the sections in order to check if joining .bss.  */
3492           if (temp && temp->size != 0)
3493             total += temp->size;
3494           else if (temp && temp->rawsize != 0)
3495             total += temp->rawsize;
3496
3497           i++;
3498         }
3499
3500       /* Check .bss size.  */
3501       temp = bfd_get_section_by_name (output_bfd, ".bss");
3502       if (temp)
3503         {
3504           if (temp->size != 0)
3505             total += temp->size;
3506           else if (temp->rawsize != 0)
3507             total += temp->rawsize;
3508
3509           if (total < 0x80000)
3510             {
3511               if (!first && (temp->size != 0 || temp->rawsize != 0))
3512                 first = temp;
3513               if ((temp->size != 0 || temp->rawsize != 0))
3514                 final = temp;
3515             }
3516         }
3517
3518       if (first && final)
3519         {
3520           /* The middle of data region.  */
3521           sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
3522
3523           /* Find the section sda_base located.  */
3524           i = 0;
3525           while (i < ARRAY_SIZE (sec_name))
3526             {
3527               final = bfd_get_section_by_name (output_bfd, sec_name[i]);
3528               if (final && (final->size != 0 || final->rawsize != 0)
3529                   && sda_base >= final->vma)
3530                 {
3531                   first = final;
3532                   i++;
3533                 }
3534               else
3535                 break;
3536             }
3537         }
3538       else
3539         {
3540           /* If there is not any default data section in output bfd, try to find
3541              the first data section.  If no data section be found, just simplily
3542              choose the first output section.  */
3543           temp = output_bfd->sections;
3544           while (temp)
3545             {
3546               if (temp->flags & SEC_ALLOC
3547                   && (((temp->flags & SEC_DATA)
3548                        && ((temp->flags & SEC_READONLY) == 0))
3549                       || (temp->flags & SEC_LOAD) == 0)
3550                   && (temp->size != 0 || temp->rawsize != 0))
3551                 {
3552                   if (!first)
3553                     first = temp;
3554                   final = temp;
3555                 }
3556               temp = temp->next;
3557             }
3558
3559           /* There is no data or bss section.  */
3560           if (!first || (first->size == 0 && first->rawsize == 0))
3561             {
3562               first = output_bfd->sections;
3563               while (first && first->size == 0 && first->rawsize == 0)
3564                 first = first->next;
3565             }
3566
3567           /* There is no concrete section.  */
3568           if (!first)
3569             {
3570               *psb = elf_gp (output_bfd);
3571               return bfd_reloc_ok;
3572             }
3573
3574           if (final && (final->vma + final->rawsize - first->vma) <= 0x4000)
3575             sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
3576           else
3577             sda_base = first->vma + 0x2000;
3578         }
3579
3580       sda_base -= first->vma;
3581       sda_base = sda_base & (~7);
3582
3583       if (!_bfd_generic_link_add_one_symbol
3584           (info, output_bfd, "_SDA_BASE_", BSF_GLOBAL | BSF_WEAK, first,
3585            (bfd_vma) sda_base, (const char *) NULL, FALSE,
3586            get_elf_backend_data (output_bfd)->collect, &h))
3587         return FALSE;
3588
3589       sda_rela_sec = first;
3590     }
3591
3592   /* Set _FP_BASE_ to _SDA_BASE_.  */
3593   table = nds32_elf_hash_table (info);
3594   relax_fp_as_gp = table->relax_fp_as_gp;
3595   h2 = bfd_link_hash_lookup (info->hash, FP_BASE_NAME, FALSE, FALSE, FALSE);
3596   /* _SDA_BASE_ is difined in linker script.  */
3597   if (!first)
3598     {
3599       first = h->u.def.section;
3600       sda_base = h->u.def.value;
3601     }
3602
3603   if (relax_fp_as_gp && h2
3604       && (h2->type == bfd_link_hash_undefweak
3605           || h2->type == bfd_link_hash_undefined))
3606     {
3607       /* Define a weak FP_BASE_NAME here to prevent the undefined symbol.
3608          And set FP equal to SDA_BASE to do relaxation for
3609          la $fp, _FP_BASE_.  */
3610       if (!_bfd_generic_link_add_one_symbol
3611           (info, output_bfd, FP_BASE_NAME, BSF_GLOBAL | BSF_WEAK,
3612            first, sda_base, (const char *) NULL,
3613            FALSE, get_elf_backend_data (output_bfd)->collect, &h2))
3614         return FALSE;
3615     }
3616
3617   if (add_symbol)
3618     {
3619       if (h)
3620         {
3621           /* Now set gp.  */
3622           elf_gp (output_bfd) = (h->u.def.value
3623                                  + h->u.def.section->output_section->vma
3624                                  + h->u.def.section->output_offset);
3625         }
3626       else
3627         {
3628           _bfd_error_handler (_("error: can't find symbol: %s"), "_SDA_BASE_");
3629           return bfd_reloc_dangerous;
3630         }
3631     }
3632
3633   *psb = h->u.def.value
3634     + h->u.def.section->output_section->vma
3635     + h->u.def.section->output_offset;
3636   return bfd_reloc_ok;
3637 }
3638 \f
3639
3640 /* Return size of a PLT entry.  */
3641 #define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
3642
3643 /* Create an entry in an nds32 ELF linker hash table.  */
3644
3645 static struct bfd_hash_entry *
3646 nds32_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
3647                              struct bfd_hash_table *table,
3648                              const char *string)
3649 {
3650   struct elf_nds32_link_hash_entry *ret;
3651
3652   ret = (struct elf_nds32_link_hash_entry *) entry;
3653
3654   /* Allocate the structure if it has not already been allocated by a
3655      subclass.  */
3656   if (ret == NULL)
3657     ret = (struct elf_nds32_link_hash_entry *)
3658        bfd_hash_allocate (table, sizeof (struct elf_nds32_link_hash_entry));
3659
3660   if (ret == NULL)
3661     return (struct bfd_hash_entry *) ret;
3662
3663   /* Call the allocation method of the superclass.  */
3664   ret = (struct elf_nds32_link_hash_entry *)
3665     _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
3666
3667   if (ret != NULL)
3668     {
3669       struct elf_nds32_link_hash_entry *eh;
3670
3671       eh = (struct elf_nds32_link_hash_entry *) ret;
3672       eh->dyn_relocs = NULL;
3673       eh->tls_type = GOT_UNKNOWN;
3674       eh->offset_to_gp = 0;
3675     }
3676
3677   return (struct bfd_hash_entry *) ret;
3678 }
3679
3680 /* Create an nds32 ELF linker hash table.  */
3681
3682 static struct bfd_link_hash_table *
3683 nds32_elf_link_hash_table_create (bfd *abfd)
3684 {
3685   struct elf_nds32_link_hash_table *ret;
3686
3687   size_t amt = sizeof (struct elf_nds32_link_hash_table);
3688
3689   ret = (struct elf_nds32_link_hash_table *) bfd_zmalloc (amt);
3690   if (ret == NULL)
3691     return NULL;
3692
3693   /* Patch tag.  */
3694   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3695                                       nds32_elf_link_hash_newfunc,
3696                                       sizeof (struct elf_nds32_link_hash_entry),
3697                                       NDS32_ELF_DATA))
3698     {
3699       free (ret);
3700       return NULL;
3701     }
3702
3703   ret->sdynbss = NULL;
3704   ret->srelbss = NULL;
3705   ret->sym_ld_script = NULL;
3706
3707   return &ret->root.root;
3708 }
3709
3710 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3711    shortcuts to them in our hash table.  */
3712
3713 static bfd_boolean
3714 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3715 {
3716   struct elf_link_hash_table *ehtab;
3717
3718   if (!_bfd_elf_create_got_section (dynobj, info))
3719     return FALSE;
3720
3721   ehtab = elf_hash_table (info);
3722   ehtab->sgot = bfd_get_section_by_name (dynobj, ".got");
3723   ehtab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
3724   if (!ehtab->sgot || !ehtab->sgotplt)
3725     abort ();
3726
3727   /* _bfd_elf_create_got_section will create it for us.  */
3728   ehtab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3729   if (ehtab->srelgot == NULL
3730       || !bfd_set_section_flags (ehtab->srelgot,
3731                                  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3732                                   | SEC_IN_MEMORY | SEC_LINKER_CREATED
3733                                   | SEC_READONLY))
3734       || !bfd_set_section_alignment (ehtab->srelgot, 2))
3735     return FALSE;
3736
3737   return TRUE;
3738 }
3739
3740 /* Create dynamic sections when linking against a dynamic object.  */
3741
3742 static bfd_boolean
3743 nds32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3744 {
3745   struct elf_link_hash_table *ehtab;
3746   struct elf_nds32_link_hash_table *htab;
3747   flagword flags, pltflags;
3748   register asection *s;
3749   const struct elf_backend_data *bed;
3750   int ptralign = 2;             /* 32-bit  */
3751   const char *secname;
3752   char *relname;
3753   flagword secflags;
3754   asection *sec;
3755
3756   bed = get_elf_backend_data (abfd);
3757   ehtab = elf_hash_table (info);
3758   htab = nds32_elf_hash_table (info);
3759
3760   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3761      .rel[a].bss sections.  */
3762
3763   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3764            | SEC_LINKER_CREATED);
3765
3766   pltflags = flags;
3767   pltflags |= SEC_CODE;
3768   if (bed->plt_not_loaded)
3769     pltflags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
3770   if (bed->plt_readonly)
3771     pltflags |= SEC_READONLY;
3772
3773   s = bfd_make_section (abfd, ".plt");
3774   ehtab->splt = s;
3775   if (s == NULL
3776       || !bfd_set_section_flags (s, pltflags)
3777       || !bfd_set_section_alignment (s, bed->plt_alignment))
3778     return FALSE;
3779
3780   if (bed->want_plt_sym)
3781     {
3782       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3783          .plt section.  */
3784       struct bfd_link_hash_entry *bh = NULL;
3785       struct elf_link_hash_entry *h;
3786
3787       if (!(_bfd_generic_link_add_one_symbol
3788             (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3789              (bfd_vma) 0, (const char *) NULL, FALSE,
3790              get_elf_backend_data (abfd)->collect, &bh)))
3791         return FALSE;
3792
3793       h = (struct elf_link_hash_entry *) bh;
3794       h->def_regular = 1;
3795       h->type = STT_OBJECT;
3796
3797       if (bfd_link_pic (info) && !bfd_elf_link_record_dynamic_symbol (info, h))
3798         return FALSE;
3799     }
3800
3801   s = bfd_make_section (abfd,
3802                         bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
3803   ehtab->srelplt = s;
3804   if (s == NULL
3805       || !bfd_set_section_flags (s, flags | SEC_READONLY)
3806       || !bfd_set_section_alignment (s, ptralign))
3807     return FALSE;
3808
3809   if (ehtab->sgot == NULL && !create_got_section (abfd, info))
3810     return FALSE;
3811
3812   for (sec = abfd->sections; sec; sec = sec->next)
3813     {
3814       secflags = bfd_section_flags (sec);
3815       if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3816           || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3817         continue;
3818       secname = bfd_section_name (sec);
3819       relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
3820       strcpy (relname, ".rela");
3821       strcat (relname, secname);
3822       if (bfd_get_section_by_name (abfd, secname))
3823         continue;
3824       s = bfd_make_section (abfd, relname);
3825       if (s == NULL
3826           || !bfd_set_section_flags (s, flags | SEC_READONLY)
3827           || !bfd_set_section_alignment (s, ptralign))
3828         return FALSE;
3829     }
3830
3831   if (bed->want_dynbss)
3832     {
3833       /* The .dynbss section is a place to put symbols which are defined
3834          by dynamic objects, are referenced by regular objects, and are
3835          not functions.  We must allocate space for them in the process
3836          image and use a R_*_COPY reloc to tell the dynamic linker to
3837          initialize them at run time.  The linker script puts the .dynbss
3838          section into the .bss section of the final image.  */
3839       s = bfd_make_section (abfd, ".dynbss");
3840       htab->sdynbss = s;
3841       if (s == NULL
3842           || !bfd_set_section_flags (s, SEC_ALLOC | SEC_LINKER_CREATED))
3843         return FALSE;
3844       /* The .rel[a].bss section holds copy relocs.  This section is not
3845          normally needed.  We need to create it here, though, so that the
3846          linker will map it to an output section.  We can't just create it
3847          only if we need it, because we will not know whether we need it
3848          until we have seen all the input files, and the first time the
3849          main linker code calls BFD after examining all the input files
3850          (size_dynamic_sections) the input sections have already been
3851          mapped to the output sections.  If the section turns out not to
3852          be needed, we can discard it later.  We will never need this
3853          section when generating a shared object, since they do not use
3854          copy relocs.  */
3855       if (!bfd_link_pic (info))
3856         {
3857           s = bfd_make_section (abfd, (bed->default_use_rela_p
3858                                        ? ".rela.bss" : ".rel.bss"));
3859           htab->srelbss = s;
3860           if (s == NULL
3861               || !bfd_set_section_flags (s, flags | SEC_READONLY)
3862               || !bfd_set_section_alignment (s, ptralign))
3863             return FALSE;
3864         }
3865     }
3866
3867   return TRUE;
3868 }
3869
3870 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3871 static void
3872 nds32_elf_copy_indirect_symbol (struct bfd_link_info *info,
3873                                 struct elf_link_hash_entry *dir,
3874                                 struct elf_link_hash_entry *ind)
3875 {
3876   struct elf_nds32_link_hash_entry *edir, *eind;
3877
3878   edir = (struct elf_nds32_link_hash_entry *) dir;
3879   eind = (struct elf_nds32_link_hash_entry *) ind;
3880
3881   if (eind->dyn_relocs != NULL)
3882     {
3883       if (edir->dyn_relocs != NULL)
3884         {
3885           struct elf_dyn_relocs **pp;
3886           struct elf_dyn_relocs *p;
3887
3888           if (ind->root.type == bfd_link_hash_indirect)
3889             abort ();
3890
3891           /* Add reloc counts against the weak sym to the strong sym
3892              list.  Merge any entries against the same section.  */
3893           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
3894             {
3895               struct elf_dyn_relocs *q;
3896
3897               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3898                 if (q->sec == p->sec)
3899                   {
3900                     q->pc_count += p->pc_count;
3901                     q->count += p->count;
3902                     *pp = p->next;
3903                     break;
3904                   }
3905               if (q == NULL)
3906                 pp = &p->next;
3907             }
3908           *pp = edir->dyn_relocs;
3909         }
3910
3911       edir->dyn_relocs = eind->dyn_relocs;
3912       eind->dyn_relocs = NULL;
3913     }
3914
3915   if (ind->root.type == bfd_link_hash_indirect)
3916     {
3917       if (dir->got.refcount <= 0)
3918         {
3919           edir->tls_type = eind->tls_type;
3920           eind->tls_type = GOT_UNKNOWN;
3921         }
3922     }
3923
3924   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3925 }
3926 \f
3927
3928 /* Find dynamic relocs for H that apply to read-only sections.  */
3929
3930 static asection *
3931 readonly_dynrelocs (struct elf_link_hash_entry *h)
3932 {
3933   struct elf_dyn_relocs *p;
3934
3935   for (p = elf32_nds32_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3936     {
3937       asection *s = p->sec->output_section;
3938
3939       if (s != NULL && (s->flags & SEC_READONLY) != 0)
3940         return p->sec;
3941     }
3942   return NULL;
3943 }
3944
3945 /* Adjust a symbol defined by a dynamic object and referenced by a
3946    regular object.  The current definition is in some section of the
3947    dynamic object, but we're not including those sections.  We have to
3948    change the definition to something the rest of the link can
3949    understand.  */
3950
3951 static bfd_boolean
3952 nds32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3953                                  struct elf_link_hash_entry *h)
3954 {
3955   struct elf_nds32_link_hash_table *htab;
3956   bfd *dynobj;
3957   asection *s;
3958   unsigned int power_of_two;
3959
3960   dynobj = elf_hash_table (info)->dynobj;
3961
3962   /* Make sure we know what is going on here.  */
3963   BFD_ASSERT (dynobj != NULL
3964               && (h->needs_plt
3965                   || h->is_weakalias
3966                   || (h->def_dynamic && h->ref_regular && !h->def_regular)));
3967
3968
3969   /* If this is a function, put it in the procedure linkage table.  We
3970      will fill in the contents of the procedure linkage table later,
3971      when we know the address of the .got section.  */
3972   if (h->type == STT_FUNC || h->needs_plt)
3973     {
3974       if (!bfd_link_pic (info)
3975           && !h->def_dynamic
3976           && !h->ref_dynamic
3977           && h->root.type != bfd_link_hash_undefweak
3978           && h->root.type != bfd_link_hash_undefined)
3979         {
3980           /* This case can occur if we saw a PLT reloc in an input
3981              file, but the symbol was never referred to by a dynamic
3982              object.  In such a case, we don't actually need to build
3983              a procedure linkage table, and we can just do a PCREL
3984              reloc instead.  */
3985           h->plt.offset = (bfd_vma) - 1;
3986           h->needs_plt = 0;
3987         }
3988
3989       return TRUE;
3990     }
3991   else
3992     h->plt.offset = (bfd_vma) - 1;
3993
3994   /* If this is a weak symbol, and there is a real definition, the
3995      processor independent code will have arranged for us to see the
3996      real definition first, and we can just use the same value.  */
3997   if (h->is_weakalias)
3998     {
3999       struct elf_link_hash_entry *def = weakdef (h);
4000       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
4001       h->root.u.def.section = def->root.u.def.section;
4002       h->root.u.def.value = def->root.u.def.value;
4003       return TRUE;
4004     }
4005
4006   /* This is a reference to a symbol defined by a dynamic object which
4007      is not a function.  */
4008
4009   /* If we are creating a shared library, we must presume that the
4010      only references to the symbol are via the global offset table.
4011      For such cases we need not do anything here; the relocations will
4012      be handled correctly by relocate_section.  */
4013   if (bfd_link_pic (info))
4014     return TRUE;
4015
4016   /* If there are no references to this symbol that do not use the
4017      GOT, we don't need to generate a copy reloc.  */
4018   if (!h->non_got_ref)
4019     return TRUE;
4020
4021   /* If -z nocopyreloc was given, we won't generate them either.  */
4022   if (0 && info->nocopyreloc)
4023     {
4024       h->non_got_ref = 0;
4025       return TRUE;
4026     }
4027
4028   /* If we don't find any dynamic relocs in read-only sections, then
4029      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
4030   if (!readonly_dynrelocs (h))
4031     {
4032       h->non_got_ref = 0;
4033       return TRUE;
4034     }
4035
4036   /* We must allocate the symbol in our .dynbss section, which will
4037      become part of the .bss section of the executable.  There will be
4038      an entry for this symbol in the .dynsym section.  The dynamic
4039      object will contain position independent code, so all references
4040      from the dynamic object to this symbol will go through the global
4041      offset table.  The dynamic linker will use the .dynsym entry to
4042      determine the address it must put in the global offset table, so
4043      both the dynamic object and the regular object will refer to the
4044      same memory location for the variable.  */
4045
4046   htab = nds32_elf_hash_table (info);
4047   s = htab->sdynbss;
4048   BFD_ASSERT (s != NULL);
4049
4050   /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
4051      to copy the initial value out of the dynamic object and into the
4052      runtime process image.  We need to remember the offset into the
4053      .rela.bss section we are going to use.  */
4054   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4055     {
4056       asection *srel;
4057
4058       srel = htab->srelbss;
4059       BFD_ASSERT (srel != NULL);
4060       srel->size += sizeof (Elf32_External_Rela);
4061       h->needs_copy = 1;
4062     }
4063
4064   /* We need to figure out the alignment required for this symbol.  I
4065      have no idea how ELF linkers handle this.  */
4066   power_of_two = bfd_log2 (h->size);
4067   if (power_of_two > 3)
4068     power_of_two = 3;
4069
4070   /* Apply the required alignment.  */
4071   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
4072   if (power_of_two > bfd_section_alignment (s))
4073     {
4074       if (!bfd_set_section_alignment (s, power_of_two))
4075         return FALSE;
4076     }
4077
4078   /* Define the symbol as being at this point in the section.  */
4079   h->root.u.def.section = s;
4080   h->root.u.def.value = s->size;
4081
4082   /* Increment the section size to make room for the symbol.  */
4083   s->size += h->size;
4084
4085   return TRUE;
4086 }
4087
4088 /* Allocate space in .plt, .got and associated reloc sections for
4089    dynamic relocs.  */
4090
4091 static bfd_boolean
4092 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
4093 {
4094   struct bfd_link_info *info;
4095   struct elf_link_hash_table *ehtab;
4096   struct elf_nds32_link_hash_table *htab;
4097   struct elf_nds32_link_hash_entry *eh;
4098   struct elf_dyn_relocs *p;
4099
4100   if (h->root.type == bfd_link_hash_indirect)
4101     return TRUE;
4102
4103   /* When warning symbols are created, they **replace** the "real"
4104      entry in the hash table, thus we never get to see the real
4105      symbol in a hash traversal. So look at it now.  */
4106   if (h->root.type == bfd_link_hash_warning)
4107     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4108
4109   eh = (struct elf_nds32_link_hash_entry *) h;
4110
4111   info = (struct bfd_link_info *) inf;
4112   ehtab = elf_hash_table (info);
4113   htab = nds32_elf_hash_table (info);
4114   if (htab == NULL)
4115     return FALSE;
4116
4117   eh = (struct elf_nds32_link_hash_entry *) h;
4118
4119   if ((htab->root.dynamic_sections_created || h->type == STT_GNU_IFUNC)
4120       && h->plt.refcount > 0
4121       && !(bfd_link_pie (info) && h->def_regular))
4122     {
4123       /* Make sure this symbol is output as a dynamic symbol.
4124          Undefined weak syms won't yet be marked as dynamic.  */
4125       if (h->dynindx == -1 && !h->forced_local)
4126         {
4127           if (!bfd_elf_link_record_dynamic_symbol (info, h))
4128             return FALSE;
4129         }
4130
4131       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
4132         {
4133           asection *s = ehtab->splt;
4134
4135           /* If this is the first .plt entry, make room for the special
4136              first entry.  */
4137           if (s->size == 0)
4138             s->size += PLT_ENTRY_SIZE;
4139
4140           h->plt.offset = s->size;
4141
4142           /* If this symbol is not defined in a regular file, and we are
4143              not generating a shared library, then set the symbol to this
4144              location in the .plt.  This is required to make function
4145              pointers compare as equal between the normal executable and
4146              the shared library.  */
4147           if (!bfd_link_pic (info) && !h->def_regular)
4148             {
4149               h->root.u.def.section = s;
4150               h->root.u.def.value = h->plt.offset;
4151             }
4152
4153           /* Make room for this entry.  */
4154           s->size += PLT_ENTRY_SIZE;
4155
4156           /* We also need to make an entry in the .got.plt section, which
4157              will be placed in the .got section by the linker script.  */
4158           ehtab->sgotplt->size += 4;
4159
4160           /* We also need to make an entry in the .rel.plt section.  */
4161           ehtab->srelplt->size += sizeof (Elf32_External_Rela);
4162           if (htab->tls_desc_trampoline)
4163             htab->next_tls_desc_index++;
4164         }
4165       else
4166         {
4167           h->plt.offset = (bfd_vma) - 1;
4168           h->needs_plt = 0;
4169         }
4170     }
4171   else
4172     {
4173       h->plt.offset = (bfd_vma) - 1;
4174       h->needs_plt = 0;
4175     }
4176
4177   if (h->got.refcount > 0)
4178     {
4179       asection *sgot;
4180       bfd_boolean dyn;
4181       int tls_type = elf32_nds32_hash_entry (h)->tls_type;
4182
4183       /* Make sure this symbol is output as a dynamic symbol.
4184          Undefined weak syms won't yet be marked as dynamic.  */
4185       if (h->dynindx == -1 && !h->forced_local)
4186         {
4187           if (!bfd_elf_link_record_dynamic_symbol (info, h))
4188             return FALSE;
4189         }
4190
4191       sgot = elf_hash_table (info)->sgot;
4192       h->got.offset = sgot->size;
4193
4194       if (tls_type == GOT_UNKNOWN)
4195         abort ();
4196
4197       /* Non-TLS symbols, and TLS_IE need one GOT slot.  */
4198       if (tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP))
4199         sgot->size += 4;
4200       else
4201         {
4202           /* TLS_DESC, TLS_GD, and TLS_LD need 2 consecutive GOT slots.  */
4203           if (tls_type & GOT_TLS_DESC)
4204             sgot->size += 8;
4205         }
4206
4207       dyn = htab->root.dynamic_sections_created;
4208
4209       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
4210         {
4211           if (tls_type == GOT_TLS_DESC && htab->tls_desc_trampoline)
4212             {
4213               /* TLS_DESC with trampoline needs a relocation slot
4214                  within .rela.plt.  */
4215               htab->num_tls_desc++;
4216               ehtab->srelplt->size += sizeof (Elf32_External_Rela);
4217               htab->tls_trampoline = -1;
4218             }
4219           else
4220             {
4221               /* other relocations, including TLS_DESC without trampoline, need
4222                  a relocation slot within .rela.got.  */
4223               ehtab->srelgot->size += sizeof (Elf32_External_Rela);
4224             }
4225         }
4226     }
4227   else
4228     h->got.offset = (bfd_vma)-1;
4229
4230   if (eh->dyn_relocs == NULL)
4231     return TRUE;
4232
4233   /* In the shared -Bsymbolic case, discard space allocated for
4234      dynamic pc-relative relocs against symbols which turn out to be
4235      defined in regular objects.  For the normal shared case, discard
4236      space for pc-relative relocs that have become local due to symbol
4237      visibility changes.  */
4238
4239   if (bfd_link_pic (info))
4240     {
4241       if (h->def_regular && (h->forced_local || info->symbolic))
4242         {
4243           struct elf_dyn_relocs **pp;
4244
4245           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
4246             {
4247               p->count -= p->pc_count;
4248               p->pc_count = 0;
4249               if (p->count == 0)
4250                 *pp = p->next;
4251               else
4252                 pp = &p->next;
4253             }
4254         }
4255     }
4256   else
4257     {
4258       /* For the non-shared case, discard space for relocs against
4259          symbols which turn out to need copy relocs or are not dynamic.  */
4260
4261       if (!h->non_got_ref
4262           && ((h->def_dynamic
4263                && !h->def_regular)
4264               || (htab->root.dynamic_sections_created
4265                   && (h->root.type == bfd_link_hash_undefweak
4266                       || h->root.type == bfd_link_hash_undefined))))
4267         {
4268           /* Make sure this symbol is output as a dynamic symbol.
4269              Undefined weak syms won't yet be marked as dynamic.  */
4270           if (h->dynindx == -1 && !h->forced_local)
4271             {
4272               if (!bfd_elf_link_record_dynamic_symbol (info, h))
4273                 return FALSE;
4274             }
4275
4276           /* If that succeeded, we know we'll be keeping all the
4277              relocs.  */
4278           if (h->dynindx != -1)
4279             goto keep;
4280         }
4281
4282       eh->dyn_relocs = NULL;
4283
4284     keep:;
4285     }
4286
4287   /* Finally, allocate space.  */
4288   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4289     {
4290       asection *sreloc = elf_section_data (p->sec)->sreloc;
4291       sreloc->size += p->count * sizeof (Elf32_External_Rela);
4292     }
4293
4294   return TRUE;
4295 }
4296
4297 /* Add relocation REL to the end of relocation section SRELOC.  */
4298
4299 static void
4300 elf32_nds32_add_dynreloc (bfd *output_bfd,
4301                           struct bfd_link_info *info ATTRIBUTE_UNUSED,
4302                           asection *sreloc, Elf_Internal_Rela *rel)
4303 {
4304   bfd_byte *loc;
4305   if (sreloc == NULL)
4306     abort ();
4307
4308   loc = sreloc->contents;
4309   loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4310   if (sreloc->reloc_count * sizeof (Elf32_External_Rela) > sreloc->size)
4311     abort ();
4312
4313   bfd_elf32_swap_reloca_out (output_bfd, rel, loc);
4314 }
4315
4316 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
4317    read-only sections.  */
4318
4319 static bfd_boolean
4320 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
4321 {
4322   asection *sec;
4323
4324   if (h->root.type == bfd_link_hash_indirect)
4325     return TRUE;
4326
4327   sec = readonly_dynrelocs (h);
4328   if (sec != NULL)
4329     {
4330       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
4331
4332       info->flags |= DF_TEXTREL;
4333       info->callbacks->minfo
4334         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
4335          sec->owner, h->root.root.string, sec);
4336
4337       /* Not an error, just cut short the traversal.  */
4338       return FALSE;
4339     }
4340   return TRUE;
4341 }
4342
4343 /* Set the sizes of the dynamic sections.  */
4344
4345 static bfd_boolean
4346 nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4347                                  struct bfd_link_info *info)
4348 {
4349   struct elf_nds32_link_hash_table *htab;
4350   bfd *dynobj;
4351   asection *s;
4352   bfd_boolean relocs;
4353   bfd_boolean plt;
4354   bfd *ibfd;
4355
4356   htab = nds32_elf_hash_table (info);
4357   if (htab == NULL)
4358     return FALSE;
4359
4360   dynobj = elf_hash_table (info)->dynobj;
4361   BFD_ASSERT (dynobj != NULL);
4362
4363   if (elf_hash_table (info)->dynamic_sections_created)
4364     {
4365       /* Set the contents of the .interp section to the interpreter.  */
4366       if (bfd_link_executable (info) && !info->nointerp)
4367         {
4368           s = bfd_get_section_by_name (dynobj, ".interp");
4369           BFD_ASSERT (s != NULL);
4370           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4371           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4372         }
4373     }
4374
4375   /* Set up .got offsets for local syms, and space for local dynamic
4376      relocs.  */
4377   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
4378     {
4379       bfd_signed_vma *local_got;
4380       bfd_signed_vma *end_local_got;
4381       bfd_size_type locsymcount;
4382       Elf_Internal_Shdr *symtab_hdr;
4383       asection *sgot;
4384       char *local_tls_type;
4385       unsigned long symndx;
4386       bfd_vma *local_tlsdesc_gotent;
4387
4388       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4389         continue;
4390
4391       for (s = ibfd->sections; s != NULL; s = s->next)
4392         {
4393           struct elf_dyn_relocs *p;
4394
4395           for (p = ((struct elf_dyn_relocs *)
4396                     elf_section_data (s)->local_dynrel);
4397                p != NULL; p = p->next)
4398             {
4399               if (!bfd_is_abs_section (p->sec)
4400                   && bfd_is_abs_section (p->sec->output_section))
4401                 {
4402                   /* Input section has been discarded, either because
4403                      it is a copy of a linkonce section or due to
4404                      linker script /DISCARD/, so we'll be discarding
4405                      the relocs too.  */
4406                 }
4407               else if (p->count != 0)
4408                 {
4409                   asection *sreloc = elf_section_data (p->sec)->sreloc;
4410                   sreloc->size += p->count * sizeof (Elf32_External_Rela);
4411                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4412                     info->flags |= DF_TEXTREL;
4413                 }
4414             }
4415         }
4416
4417       local_got = elf_local_got_refcounts (ibfd);
4418       if (!local_got)
4419         continue;
4420
4421       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4422       locsymcount = symtab_hdr->sh_info;
4423       end_local_got = local_got + locsymcount;
4424       sgot = elf_hash_table (info)->sgot;
4425       local_tls_type = elf32_nds32_local_got_tls_type (ibfd);
4426       local_tlsdesc_gotent = elf32_nds32_local_tlsdesc_gotent (ibfd);
4427       for (symndx = 0; local_got < end_local_got;
4428            ++local_got, ++local_tls_type, ++local_tlsdesc_gotent, ++symndx)
4429         {
4430           if (*local_got > 0)
4431             {
4432               int num_of_got_entry_needed = 0;
4433               *local_got = sgot->size;
4434               *local_tlsdesc_gotent = sgot->size;
4435
4436               /* TLS_NORMAL, and TLS_IE need one slot in .got.  */
4437               if (*local_tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP))
4438                 num_of_got_entry_needed = 1;
4439               /* TLS_GD, TLS_LD, and TLS_DESC need an 8-byte structure in the GOT.  */
4440               else if (*local_tls_type & GOT_TLS_DESC)
4441                 num_of_got_entry_needed = 2;
4442
4443               sgot->size += (num_of_got_entry_needed << 2);
4444
4445               /* non-relax-able TLS_DESCs need a slot in .rela.plt.
4446                  others need a slot in .rela.got.  */
4447               if (*local_tls_type == GOT_TLS_DESC)
4448                 {
4449                   if (bfd_link_pic (info))
4450                     {
4451                       if (htab->tls_desc_trampoline)
4452                         {
4453                           htab->num_tls_desc++;
4454                           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
4455                           htab->tls_trampoline = -1;
4456                         }
4457                       else
4458                         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4459                     }
4460                   else
4461                     {
4462                       /* TLS_DESC -> TLS_LE  */
4463                     }
4464                 }
4465               else
4466                 {
4467                   htab->root.srelgot->size += sizeof (Elf32_External_Rela);
4468                 }
4469             }
4470           else
4471             {
4472               *local_got = (bfd_vma) -1;
4473               *local_tlsdesc_gotent = (bfd_vma) -1;
4474             }
4475         }
4476     }
4477
4478   /* Allocate global sym .plt and .got entries, and space for global
4479      sym dynamic relocs.  */
4480   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (void *) info);
4481
4482   /* For every jump slot reserved in the sgotplt, reloc_count is
4483      incremented.  However, when we reserve space for TLS descriptors,
4484      it's not incremented, so in order to compute the space reserved
4485      for them, it suffices to multiply the reloc count by the jump
4486      slot size.  */
4487   if (htab->tls_desc_trampoline && htab->root.srelplt)
4488     htab->sgotplt_jump_table_size = elf32_nds32_compute_jump_table_size (htab);
4489
4490   if (htab->tls_trampoline)
4491     {
4492       htab->tls_trampoline = htab->root.splt->size;
4493
4494       /* If we're not using lazy TLS relocations, don't generate the
4495          PLT and GOT entries they require.  */
4496       if (!(info->flags & DF_BIND_NOW))
4497         {
4498           htab->dt_tlsdesc_got = htab->root.sgot->size;
4499           htab->root.sgot->size += 4;
4500
4501           htab->dt_tlsdesc_plt = htab->root.splt->size;
4502           htab->root.splt->size += 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline);
4503         }
4504     }
4505
4506   /* We now have determined the sizes of the various dynamic sections.
4507      Allocate memory for them.  */
4508   /* The check_relocs and adjust_dynamic_symbol entry points have
4509      determined the sizes of the various dynamic sections.  Allocate
4510      memory for them.  */
4511   plt = FALSE;
4512   relocs = FALSE;
4513   for (s = dynobj->sections; s != NULL; s = s->next)
4514     {
4515       if ((s->flags & SEC_LINKER_CREATED) == 0)
4516         continue;
4517
4518       if (s == htab->root.splt)
4519         {
4520           /* Strip this section if we don't need it; see the
4521              comment below.  */
4522           plt = s->size != 0;
4523         }
4524       else if (s == elf_hash_table (info)->sgot)
4525         {
4526           got_size += s->size;
4527         }
4528       else if (s == elf_hash_table (info)->sgotplt)
4529         {
4530           got_size += s->size;
4531         }
4532       else if (strncmp (bfd_section_name (s), ".rela", 5) == 0)
4533         {
4534           if (s->size != 0 && s != elf_hash_table (info)->srelplt)
4535             relocs = TRUE;
4536
4537           /* We use the reloc_count field as a counter if we need
4538              to copy relocs into the output file.  */
4539           s->reloc_count = 0;
4540         }
4541       else
4542         {
4543           /* It's not one of our sections, so don't allocate space.  */
4544           continue;
4545         }
4546
4547       if (s->size == 0)
4548         {
4549           /* If we don't need this section, strip it from the
4550              output file.  This is mostly to handle .rela.bss and
4551              .rela.plt.  We must create both sections in
4552              create_dynamic_sections, because they must be created
4553              before the linker maps input sections to output
4554              sections.  The linker does that before
4555              adjust_dynamic_symbol is called, and it is that
4556              function which decides whether anything needs to go
4557              into these sections.  */
4558           s->flags |= SEC_EXCLUDE;
4559           continue;
4560         }
4561
4562       /* Allocate memory for the section contents.  We use bfd_zalloc
4563          here in case unused entries are not reclaimed before the
4564          section's contents are written out.  This should not happen,
4565          but this way if it does, we get a R_NDS32_NONE reloc instead
4566          of garbage.  */
4567       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4568       if (s->contents == NULL)
4569         return FALSE;
4570     }
4571
4572
4573   if (htab->root.dynamic_sections_created)
4574     {
4575       /* Add some entries to the .dynamic section.  We fill in the
4576          values later, in nds32_elf_finish_dynamic_sections, but we
4577          must add the entries now so that we get the correct size for
4578          the .dynamic section.  The DT_DEBUG entry is filled in by the
4579          dynamic linker and used by the debugger.  */
4580 #define add_dynamic_entry(TAG, VAL) \
4581   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4582
4583       if (bfd_link_executable (info))
4584         {
4585           if (!add_dynamic_entry (DT_DEBUG, 0))
4586             return FALSE;
4587         }
4588
4589       if (elf_hash_table (info)->splt->size != 0)
4590         {
4591           if (!add_dynamic_entry (DT_PLTGOT, 0)
4592               || !add_dynamic_entry (DT_PLTRELSZ, 0)
4593               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4594               || !add_dynamic_entry (DT_JMPREL, 0))
4595             return FALSE;
4596         }
4597
4598       if (htab->tls_desc_trampoline && plt)
4599         {
4600           if (htab->dt_tlsdesc_plt
4601               && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
4602                   || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
4603             return FALSE;
4604         }
4605
4606       if (relocs)
4607         {
4608           if (!add_dynamic_entry (DT_RELA, 0)
4609               || !add_dynamic_entry (DT_RELASZ, 0)
4610               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4611             return FALSE;
4612
4613           /* If any dynamic relocs apply to a read-only section,
4614              then we need a DT_TEXTREL entry.  */
4615           if ((info->flags & DF_TEXTREL) == 0)
4616             elf_link_hash_traverse (&htab->root, maybe_set_textrel,
4617                                     (void *) info);
4618
4619           if ((info->flags & DF_TEXTREL) != 0)
4620             {
4621               if (!add_dynamic_entry (DT_TEXTREL, 0))
4622                 return FALSE;
4623             }
4624         }
4625     }
4626 #undef add_dynamic_entry
4627
4628   return TRUE;
4629 }
4630
4631 static bfd_reloc_status_type
4632 nds32_relocate_contents (reloc_howto_type *howto, bfd *input_bfd,
4633                          bfd_vma relocation, bfd_byte *location)
4634 {
4635   int size;
4636   bfd_vma x = 0;
4637   bfd_reloc_status_type flag;
4638   unsigned int rightshift = howto->rightshift;
4639   unsigned int bitpos = howto->bitpos;
4640
4641   /* If the size is negative, negate RELOCATION.  This isn't very
4642      general.  */
4643   if (howto->size < 0)
4644     relocation = -relocation;
4645
4646   /* Get the value we are going to relocate.  */
4647   size = bfd_get_reloc_size (howto);
4648   switch (size)
4649     {
4650     default:
4651       abort ();
4652       break;
4653     case 0:
4654       return bfd_reloc_ok;
4655     case 2:
4656       x = bfd_getb16 (location);
4657       break;
4658     case 4:
4659       x = bfd_getb32 (location);
4660       break;
4661     }
4662
4663   /* Check for overflow.  FIXME: We may drop bits during the addition
4664      which we don't check for.  We must either check at every single
4665      operation, which would be tedious, or we must do the computations
4666      in a type larger than bfd_vma, which would be inefficient.  */
4667   flag = bfd_reloc_ok;
4668   if (howto->complain_on_overflow != complain_overflow_dont)
4669     {
4670       bfd_vma addrmask, fieldmask, signmask, ss;
4671       bfd_vma a, b, sum;
4672
4673       /* Get the values to be added together.  For signed and unsigned
4674          relocations, we assume that all values should be truncated to
4675          the size of an address.  For bitfields, all the bits matter.
4676          See also bfd_check_overflow.  */
4677       fieldmask = N_ONES (howto->bitsize);
4678       signmask = ~fieldmask;
4679       addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
4680       a = (relocation & addrmask) >> rightshift;
4681       b = (x & howto->src_mask & addrmask) >> bitpos;
4682
4683       switch (howto->complain_on_overflow)
4684         {
4685         case complain_overflow_signed:
4686           /* If any sign bits are set, all sign bits must be set.
4687              That is, A must be a valid negative address after
4688              shifting.  */
4689           signmask = ~(fieldmask >> 1);
4690           /* Fall through.  */
4691
4692         case complain_overflow_bitfield:
4693           /* Much like the signed check, but for a field one bit
4694              wider.  We allow a bitfield to represent numbers in the
4695              range -2**n to 2**n-1, where n is the number of bits in the
4696              field.  Note that when bfd_vma is 32 bits, a 32-bit reloc
4697              can't overflow, which is exactly what we want.  */
4698           ss = a & signmask;
4699           if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
4700             flag = bfd_reloc_overflow;
4701
4702           /* We only need this next bit of code if the sign bit of B
4703              is below the sign bit of A.  This would only happen if
4704              SRC_MASK had fewer bits than BITSIZE.  Note that if
4705              SRC_MASK has more bits than BITSIZE, we can get into
4706              trouble; we would need to verify that B is in range, as
4707              we do for A above.  */
4708           ss = ((~howto->src_mask) >> 1) & howto->src_mask;
4709           ss >>= bitpos;
4710
4711           /* Set all the bits above the sign bit.  */
4712           b = (b ^ ss) - ss;
4713
4714           /* Now we can do the addition.  */
4715           sum = a + b;
4716
4717           /* See if the result has the correct sign.  Bits above the
4718              sign bit are junk now; ignore them.  If the sum is
4719              positive, make sure we did not have all negative inputs;
4720              if the sum is negative, make sure we did not have all
4721              positive inputs.  The test below looks only at the sign
4722              bits, and it really just
4723              SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
4724
4725              We mask with addrmask here to explicitly allow an address
4726              wrap-around.  The Linux kernel relies on it, and it is
4727              the only way to write assembler code which can run when
4728              loaded at a location 0x80000000 away from the location at
4729              which it is linked.  */
4730           if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
4731             flag = bfd_reloc_overflow;
4732
4733           break;
4734
4735         case complain_overflow_unsigned:
4736           /* Checking for an unsigned overflow is relatively easy:
4737              trim the addresses and add, and trim the result as well.
4738              Overflow is normally indicated when the result does not
4739              fit in the field.  However, we also need to consider the
4740              case when, e.g., fieldmask is 0x7fffffff or smaller, an
4741              input is 0x80000000, and bfd_vma is only 32 bits; then we
4742              will get sum == 0, but there is an overflow, since the
4743              inputs did not fit in the field.  Instead of doing a
4744              separate test, we can check for this by or-ing in the
4745              operands when testing for the sum overflowing its final
4746              field.  */
4747           sum = (a + b) & addrmask;
4748           if ((a | b | sum) & signmask)
4749             flag = bfd_reloc_overflow;
4750           break;
4751
4752         default:
4753           abort ();
4754         }
4755     }
4756
4757   /* Put RELOCATION in the right bits.  */
4758   relocation >>= (bfd_vma) rightshift;
4759   relocation <<= (bfd_vma) bitpos;
4760
4761   /* Add RELOCATION to the right bits of X.  */
4762   /* FIXME : 090616
4763      Because the relaxation may generate duplicate relocation at one address,
4764      an addition to immediate in the instruction may cause the relocation added
4765      several times.
4766      This bug should be fixed in assembler, but a check is also needed here.  */
4767   if (howto->partial_inplace)
4768     x = ((x & ~howto->dst_mask)
4769          | (((x & howto->src_mask) + relocation) & howto->dst_mask));
4770   else
4771     x = ((x & ~howto->dst_mask) | ((relocation) & howto->dst_mask));
4772
4773
4774   /* Put the relocated value back in the object file.  */
4775   switch (size)
4776     {
4777     default:
4778     case 0:
4779     case 1:
4780     case 8:
4781       abort ();
4782       break;
4783     case 2:
4784       bfd_putb16 (x, location);
4785       break;
4786     case 4:
4787       bfd_putb32 (x, location);
4788       break;
4789     }
4790
4791   return flag;
4792 }
4793
4794 static bfd_reloc_status_type
4795 nds32_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
4796                                asection *input_section, bfd_byte *contents,
4797                                bfd_vma address, bfd_vma value, bfd_vma addend)
4798 {
4799   bfd_vma relocation;
4800
4801   /* Sanity check the address.  */
4802   if (address > bfd_get_section_limit (input_bfd, input_section))
4803     return bfd_reloc_outofrange;
4804
4805   /* This function assumes that we are dealing with a basic relocation
4806      against a symbol.  We want to compute the value of the symbol to
4807      relocate to.  This is just VALUE, the value of the symbol, plus
4808      ADDEND, any addend associated with the reloc.  */
4809   relocation = value + addend;
4810
4811   /* If the relocation is PC relative, we want to set RELOCATION to
4812      the distance between the symbol (currently in RELOCATION) and the
4813      location we are relocating.  If pcrel_offset is FALSE we do not
4814      need to subtract out the offset of the location within the
4815      section (which is just ADDRESS).  */
4816   if (howto->pc_relative)
4817     {
4818       relocation -= (input_section->output_section->vma
4819                      + input_section->output_offset);
4820       if (howto->pcrel_offset)
4821         relocation -= address;
4822     }
4823
4824   return nds32_relocate_contents (howto, input_bfd, relocation,
4825                                   contents + address);
4826 }
4827
4828 static bfd_boolean
4829 nds32_elf_output_symbol_hook (struct bfd_link_info *info,
4830                               const char *name,
4831                               Elf_Internal_Sym *elfsym ATTRIBUTE_UNUSED,
4832                               asection *input_sec,
4833                               struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
4834 {
4835   const char *source;
4836   FILE *sym_ld_script = NULL;
4837   struct elf_nds32_link_hash_table *table;
4838
4839   table = nds32_elf_hash_table (info);
4840   sym_ld_script = table->sym_ld_script;
4841   if (!sym_ld_script)
4842     return TRUE;
4843
4844   if (!h || !name || *name == '\0')
4845     return TRUE;
4846
4847   if (input_sec->flags & SEC_EXCLUDE)
4848     return TRUE;
4849
4850   if (!check_start_export_sym)
4851     {
4852       fprintf (sym_ld_script, "SECTIONS\n{\n");
4853       check_start_export_sym = 1;
4854     }
4855
4856   if (h->root.type == bfd_link_hash_defined
4857       || h->root.type == bfd_link_hash_defweak)
4858     {
4859       if (!h->root.u.def.section->output_section)
4860         return TRUE;
4861
4862       if (bfd_is_const_section (input_sec))
4863         source = input_sec->name;
4864       else
4865         source = bfd_get_filename (input_sec->owner);
4866
4867       fprintf (sym_ld_script, "\t%s = 0x%08lx;\t /* %s */\n",
4868                h->root.root.string,
4869                (long) (h->root.u.def.value
4870                 + h->root.u.def.section->output_section->vma
4871                 + h->root.u.def.section->output_offset), source);
4872     }
4873
4874   return TRUE;
4875 }
4876
4877 /* Relocate an NDS32/D ELF section.
4878    There is some attempt to make this function usable for many architectures,
4879    both for RELA and REL type relocs, if only to serve as a learning tool.
4880
4881    The RELOCATE_SECTION function is called by the new ELF backend linker
4882    to handle the relocations for a section.
4883
4884    The relocs are always passed as Rela structures; if the section
4885    actually uses Rel structures, the r_addend field will always be
4886    zero.
4887
4888    This function is responsible for adjust the section contents as
4889    necessary, and (if using Rela relocs and generating a
4890    relocatable output file) adjusting the reloc addend as
4891    necessary.
4892
4893    This function does not have to worry about setting the reloc
4894    address or the reloc symbol index.
4895
4896    LOCAL_SYMS is a pointer to the swapped in local symbols.
4897
4898    LOCAL_SECTIONS is an array giving the section in the input file
4899    corresponding to the st_shndx field of each local symbol.
4900
4901    The global hash table entry for the global symbols can be found
4902    via elf_sym_hashes (input_bfd).
4903
4904    When generating relocatable output, this function must handle
4905    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
4906    going to be the section symbol corresponding to the output
4907    section, which means that the addend must be adjusted
4908    accordingly.  */
4909
4910 /* Return the base VMA address which should be subtracted from real addresses
4911    when resolving @dtpoff relocation.
4912    This is PT_TLS segment p_vaddr.  */
4913
4914 /* Return the relocation value for @tpoff relocation
4915    if STT_TLS virtual address is ADDRESS.  */
4916
4917 /* Return the relocation value for @gottpoff relocation
4918    if STT_TLS virtual address is ADDRESS.  */
4919
4920 static bfd_vma
4921 gottpoff (struct bfd_link_info *info, bfd_vma address)
4922 {
4923   bfd_vma tp_base;
4924   bfd_vma tp_offset;
4925
4926   /* If tls_sec is NULL, we should have signalled an error already.  */
4927   if (elf_hash_table (info)->tls_sec == NULL)
4928     return 0;
4929
4930   tp_base = elf_hash_table (info)->tls_sec->vma;
4931   tp_offset = address - tp_base;
4932
4933   return tp_offset;
4934 }
4935
4936 static bfd_boolean
4937 patch_tls_desc_to_ie (bfd_byte *contents, Elf_Internal_Rela *rel, bfd *ibfd)
4938 {
4939   /* TLS_GD/TLS_LD model #1
4940      46 00 00 00 sethi $r0,#0x0
4941      58 00 00 00 ori $r0,$r0,#0x0
4942      40 00 74 00 add $r0,$r0,$gp
4943      04 10 00 00 lwi $r1,[$r0+#0x0]
4944      4b e0 04 01 jral $lp,$r1  */
4945
4946   /* TLS_GD/TLS_LD model #2
4947      46 00 00 00 sethi $r0,#0x0
4948      58 00 00 00 ori $r0,$r0,#0x0
4949      38 10 74 02 lw $r1,[$r0+($gp<<#0x0)]
4950      40 00 74 00 add $r0,$r0,$gp
4951      4b e0 04 01 jral $lp,$r1  */
4952
4953   /* TLS_IE model (non-PIC)
4954      46 00 00 00 sethi $r0,#0x0
4955      04 00 00 00 lwi $r0,[$r0+#0x0]
4956      38 00 64 02 lw $r0,[$r0+($r25<<#0x0)]  */
4957
4958   /* TLS_IE model (PIC)
4959      46 00 00 00 sethi $r0,#0x0
4960      58 00 00 00 ori $r0,$r0,#0x0
4961      38 00 74 02 lw $r0,[$r0+($gp<<#0x0)]
4962      38 00 64 02 lw $r0,[$r0+($r25<<#0x0)]  */
4963
4964   /* TLS_GD_TO_IE model
4965      46 00 00 00 sethi $r0,#0x0
4966      58 00 00 00 ori $r0,$r0,#0x0
4967      40 00 74 00 add $r0,$rM,$gp
4968      04 00 00 01 lwi $r0,[$r0+#0x4]
4969      40 00 64 00 add $r0,$r0,$r25  */
4970
4971   bfd_boolean rz = FALSE;
4972
4973   typedef struct
4974     {
4975       uint32_t opcode;
4976       uint32_t mask;
4977     } pat_t;
4978
4979   uint32_t patch[3] =
4980     {
4981       0x40007400, /* add $r0,$rM,$gp     */
4982       0x04000001, /* lwi $r0,[$r0+#0x4]  */
4983       0x40006400, /* add $r0,$r0,$r25    */
4984     };
4985
4986   pat_t mode0[3] =
4987     {
4988         { 0x40000000, 0xfe0003ff },
4989         { 0x04000000, 0xfe000000 },
4990         { 0x4be00001, 0xffff83ff },
4991     };
4992
4993   pat_t mode1[3] =
4994     {
4995         { 0x38007402, 0xfe007fff },
4996         { 0x40007400, 0xfe007fff },
4997         { 0x4be00001, 0xffff83ff },
4998     };
4999
5000   unsigned char *p = contents + rel->r_offset;
5001
5002   uint32_t insn;
5003   uint32_t regidx = 0;
5004   insn = bfd_getb32 (p);
5005   if (INSN_SETHI == (0xfe0fffffu & insn))
5006     {
5007       regidx = 0x1f & (insn >> 20);
5008       p += 4;
5009     }
5010
5011   insn = bfd_getb32 (p);
5012   if (INSN_ORI == (0xfe007fffu & insn))
5013     {
5014       regidx = 0x1f & (insn >> 20);
5015       p += 4;
5016     }
5017
5018   if (patch[2] == bfd_getb32 (p + 8)) /* Character instruction.  */
5019     {
5020       /* already patched?  */
5021       if ((patch[0] == (0xfff07fffu & bfd_getb32 (p + 0))) &&
5022           (patch[1] == bfd_getb32 (p + 4)))
5023         rz = TRUE;
5024     }
5025   else if (mode0[0].opcode == (mode0[0].mask & bfd_getb32 (p + 0)))
5026     {
5027       if ((mode0[1].opcode == (mode0[1].mask & bfd_getb32 (p + 4))) &&
5028           (mode0[2].opcode == (mode0[2].mask & bfd_getb32 (p + 8))))
5029         {
5030           bfd_putb32 (patch[0] | (regidx << 15), p + 0);
5031           bfd_putb32 (patch[1], p + 4);
5032           bfd_putb32 (patch[2], p + 8);
5033           rz = TRUE;
5034         }
5035     }
5036   else if (mode1[0].opcode == (mode1[0].mask & bfd_getb32 (p + 0)))
5037     {
5038       if ((mode1[1].opcode == (mode1[1].mask & bfd_getb32 (p + 4))) &&
5039           (mode1[2].opcode == (mode1[2].mask & bfd_getb32 (p + 8))))
5040         {
5041           bfd_putb32 (patch[0] | (regidx << 15), p + 0);
5042           bfd_putb32 (patch[1], p + 4);
5043           bfd_putb32 (patch[2], p + 8);
5044           rz = TRUE;
5045         }
5046     }
5047
5048   if (!rz)
5049     {
5050       printf ("%s: %s @ 0x%08x\n", __func__, bfd_get_filename (ibfd),
5051               (int) rel->r_offset);
5052       BFD_ASSERT(0); /* Unsupported pattern.  */
5053     }
5054
5055   return rz;
5056 }
5057
5058 static enum elf_nds32_tls_type
5059 get_tls_type (enum elf_nds32_reloc_type r_type, struct elf_link_hash_entry *h);
5060
5061 static unsigned int
5062 ones32 (register unsigned int x)
5063 {
5064   /* 32-bit recursive reduction using SWAR...
5065      but first step is mapping 2-bit values
5066      into sum of 2 1-bit values in sneaky way.  */
5067   x -= ((x >> 1) & 0x55555555);
5068   x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
5069   x = (((x >> 4) + x) & 0x0f0f0f0f);
5070   x += (x >> 8);
5071   x += (x >> 16);
5072   return (x & 0x0000003f);
5073 }
5074
5075 #if !HAVE_FLS
5076 static unsigned int
5077 fls (register unsigned int x)
5078 {
5079   return ffs (x & (-x));
5080 }
5081 #endif /* !HAVE_FLS */
5082
5083 #define nds32_elf_local_tlsdesc_gotent(bfd) \
5084   (elf_nds32_tdata (bfd)->local_tlsdesc_gotent)
5085
5086 static bfd_boolean
5087 nds32_elf_relocate_section (bfd *                  output_bfd ATTRIBUTE_UNUSED,
5088                             struct bfd_link_info * info,
5089                             bfd *                  input_bfd,
5090                             asection *             input_section,
5091                             bfd_byte *             contents,
5092                             Elf_Internal_Rela *    relocs,
5093                             Elf_Internal_Sym *     local_syms,
5094                             asection **            local_sections)
5095 {
5096   Elf_Internal_Shdr *symtab_hdr;
5097   struct elf_link_hash_entry **sym_hashes;
5098   Elf_Internal_Rela *rel, *relend;
5099   bfd_boolean ret = TRUE;               /* Assume success.  */
5100   int align = 0;
5101   bfd_reloc_status_type r;
5102   const char *errmsg = NULL;
5103   bfd_vma gp;
5104   struct elf_link_hash_table *ehtab;
5105   struct elf_nds32_link_hash_table *htab;
5106   bfd *dynobj;
5107   bfd_vma *local_got_offsets;
5108   asection *sgot, *splt, *sreloc;
5109   bfd_vma high_address;
5110   struct elf_nds32_link_hash_table *table;
5111   int eliminate_gc_relocs;
5112   bfd_vma fpbase_addr;
5113
5114   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5115   sym_hashes = elf_sym_hashes (input_bfd);
5116   ehtab = elf_hash_table (info);
5117   htab = nds32_elf_hash_table (info);
5118   high_address = bfd_get_section_limit (input_bfd, input_section);
5119
5120   dynobj = htab->root.dynobj;
5121   local_got_offsets = elf_local_got_offsets (input_bfd);
5122
5123   sgot = ehtab->sgot;
5124   splt = ehtab->splt;
5125   sreloc = NULL;
5126
5127   rel = relocs;
5128   relend = relocs + input_section->reloc_count;
5129
5130   table = nds32_elf_hash_table (info);
5131   eliminate_gc_relocs = table->eliminate_gc_relocs;
5132
5133   /* By this time, we can adjust the value of _SDA_BASE_.  */
5134   /* Explain _SDA_BASE_  */
5135   if ((!bfd_link_relocatable (info)))
5136     {
5137       is_SDA_BASE_set = 1;
5138       r = nds32_elf_final_sda_base (output_bfd, info, &gp, TRUE);
5139       if (r != bfd_reloc_ok)
5140         return FALSE;
5141     }
5142
5143   /* Do TLS model conversion once at first.  */
5144   nds32_elf_unify_tls_model (input_bfd, input_section, contents, info);
5145
5146   /* Use gp as fp to prevent truncated fit.  Because in relaxation time
5147      the fp value is set as gp, and it has be reverted for instruction
5148      setting fp.  */
5149   fpbase_addr = elf_gp (output_bfd);
5150
5151   /* Deal with (dynamic) relocations.  */
5152   for (rel = relocs; rel < relend; rel++)
5153     {
5154       enum elf_nds32_reloc_type r_type;
5155       reloc_howto_type *howto = NULL;
5156       unsigned long r_symndx;
5157       struct elf_link_hash_entry *h = NULL;
5158       Elf_Internal_Sym *sym = NULL;
5159       asection *sec;
5160       bfd_vma relocation;
5161       bfd_vma relocation_sym = 0xdeadbeef;
5162       Elf_Internal_Rela *lorel;
5163       bfd_vma off;
5164
5165       /* We can't modify r_addend here as elf_link_input_bfd has an assert to
5166          ensure it's zero (we use REL relocs, not RELA).  Therefore this
5167          should be assigning zero to `addend', but for clarity we use
5168          `r_addend'.  */
5169
5170       bfd_vma addend = rel->r_addend;
5171       bfd_vma offset = rel->r_offset;
5172
5173       r_type = ELF32_R_TYPE (rel->r_info);
5174       if (r_type >= R_NDS32_max)
5175         {
5176           /* xgettext:c-format */
5177           _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
5178                               input_bfd, r_type);
5179           bfd_set_error (bfd_error_bad_value);
5180           ret = FALSE;
5181           continue;
5182         }
5183
5184       if (r_type == R_NDS32_GNU_VTENTRY
5185           || r_type == R_NDS32_GNU_VTINHERIT
5186           || r_type == R_NDS32_NONE
5187           || r_type == R_NDS32_RELA_GNU_VTENTRY
5188           || r_type == R_NDS32_RELA_GNU_VTINHERIT
5189           || (r_type >= R_NDS32_INSN16 && r_type <= R_NDS32_25_FIXED_RELA)
5190           || r_type == R_NDS32_DATA
5191           || r_type == R_NDS32_TRAN)
5192         continue;
5193
5194       /* If we enter the fp-as-gp region.  Resolve the address
5195          of best fp-base.  */
5196       if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_BEGIN
5197           && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
5198         {
5199           int dist;
5200
5201           /* Distance to relocation of best fp-base is encoded in R_SYM.  */
5202           dist =  rel->r_addend >> 16;
5203           fpbase_addr = calculate_memory_address (input_bfd, rel + dist,
5204                                                   local_syms, symtab_hdr);
5205         }
5206       else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_END
5207                && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
5208         {
5209           fpbase_addr = elf_gp (output_bfd);
5210         }
5211
5212       /* Skip the relocations used for relaxation.  */
5213       /* We have to update LONGCALL and LONGJUMP
5214          relocations when generating the relocatable files.  */
5215       if (!bfd_link_relocatable (info)
5216           && (r_type >= R_NDS32_RELAX_ENTRY
5217               || (r_type >= R_NDS32_LONGCALL4
5218                   && r_type <= R_NDS32_LONGJUMP7)))
5219         continue;
5220
5221       howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
5222       r_symndx = ELF32_R_SYM (rel->r_info);
5223
5224       /* This is a final link.  */
5225       sym = NULL;
5226       sec = NULL;
5227       h = NULL;
5228
5229       if (r_symndx < symtab_hdr->sh_info)
5230         {
5231           /* Local symbol.  */
5232           sym = local_syms + r_symndx;
5233           sec = local_sections[r_symndx];
5234
5235           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5236           addend = rel->r_addend;
5237
5238           /* keep symbol location for static TLS_IE GOT entry  */
5239           relocation_sym = relocation;
5240           if (bfd_link_relocatable (info))
5241             {
5242               /* This is a relocatable link.  We don't have to change
5243                  anything, unless the reloc is against a section symbol,
5244                  in which case we have to adjust according to where the
5245                  section symbol winds up in the output section.  */
5246               if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5247                 rel->r_addend += sec->output_offset + sym->st_value;
5248
5249               continue;
5250             }
5251         }
5252       else
5253         {
5254           /* External symbol.  */
5255           if (bfd_link_relocatable (info))
5256             continue;
5257           bfd_boolean warned, ignored, unresolved_reloc;
5258           int symndx = r_symndx - symtab_hdr->sh_info;
5259
5260           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
5261                                    r_symndx, symtab_hdr, sym_hashes, h, sec,
5262                                    relocation, unresolved_reloc, warned,
5263                                    ignored);
5264
5265           /* keep symbol location for static TLS_IE GOT entry  */
5266           relocation_sym = relocation;
5267
5268           /* la $fp, _FP_BASE_ is per-function (region).
5269              Handle it specially.  */
5270           switch ((int) r_type)
5271             {
5272             case R_NDS32_HI20_RELA:
5273             case R_NDS32_LO12S0_RELA:
5274               if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
5275                           FP_BASE_NAME) == 0)
5276                 {
5277                   if (!bfd_link_pie (info))
5278                     {
5279                       _bfd_error_handler
5280                         ("%pB: warning: _FP_BASE_ setting insns relaxation failed.",
5281                          input_bfd);
5282                     }
5283                   relocation = fpbase_addr;
5284                 }
5285               break;
5286             case R_NDS32_SDA19S0_RELA:
5287             case R_NDS32_SDA15S0_RELA:
5288             case R_NDS32_20_RELA:
5289               if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
5290                           FP_BASE_NAME) == 0)
5291                 {
5292                   relocation = fpbase_addr;
5293                   break;
5294                 }
5295             }
5296         }
5297
5298       /* Sanity check the address.  */
5299       if (offset > high_address)
5300         {
5301           r = bfd_reloc_outofrange;
5302           goto check_reloc;
5303         }
5304
5305       if (r_type >= R_NDS32_RELAX_ENTRY)
5306         continue;
5307
5308       switch ((int) r_type)
5309         {
5310         case R_NDS32_GOTOFF:
5311           /* Relocation is relative to the start of the global offset
5312              table (for ld24 rx, #uimm24), e.g. access at label+addend
5313
5314              ld24 rx. #label@GOTOFF + addend
5315              sub  rx, r12.  */
5316         case R_NDS32_GOTOFF_HI20:
5317         case R_NDS32_GOTOFF_LO12:
5318         case R_NDS32_GOTOFF_LO15:
5319         case R_NDS32_GOTOFF_LO19:
5320           BFD_ASSERT (sgot != NULL);
5321
5322           relocation -= elf_gp (output_bfd);
5323           break;
5324
5325         case R_NDS32_9_PLTREL:
5326         case R_NDS32_25_PLTREL:
5327           /* Relocation is to the entry for this symbol in the
5328              procedure linkage table.  */
5329
5330           /* The native assembler will generate a 25_PLTREL reloc
5331              for a local symbol if you assemble a call from one
5332              section to another when using -K pic.  */
5333           if (h == NULL)
5334             break;
5335
5336           if (h->forced_local)
5337             break;
5338
5339           /* We didn't make a PLT entry for this symbol.  This
5340              happens when statically linking PIC code, or when
5341              using -Bsymbolic.  */
5342           if (h->plt.offset == (bfd_vma) - 1)
5343             break;
5344
5345           relocation = (splt->output_section->vma
5346                         + splt->output_offset + h->plt.offset);
5347           break;
5348
5349         case R_NDS32_PLT_GOTREL_HI20:
5350         case R_NDS32_PLT_GOTREL_LO12:
5351         case R_NDS32_PLT_GOTREL_LO15:
5352         case R_NDS32_PLT_GOTREL_LO19:
5353         case R_NDS32_PLT_GOTREL_LO20:
5354           if (h == NULL
5355               || h->forced_local
5356               || h->plt.offset == (bfd_vma) -1
5357               || (bfd_link_pie (info) && h->def_regular))
5358             {
5359               /* Maybe we should find better checking to optimize
5360                  PIE PLT relocations.  */
5361               /* We didn't make a PLT entry for this symbol.  This
5362                  happens when statically linking PIC code, or when
5363                  using -Bsymbolic.  */
5364               if (h)
5365                 h->plt.offset = (bfd_vma) -1;   /* Cancel PLT trampoline.  */
5366               relocation -= elf_gp (output_bfd);
5367               break;
5368             }
5369
5370           relocation = (splt->output_section->vma
5371                         + splt->output_offset + h->plt.offset);
5372
5373           relocation -= elf_gp (output_bfd);
5374           break;
5375
5376         case R_NDS32_PLTREL_HI20:
5377         case R_NDS32_PLTREL_LO12:
5378
5379           /* Relocation is to the entry for this symbol in the
5380              procedure linkage table.  */
5381
5382           /* The native assembler will generate a 25_PLTREL reloc
5383              for a local symbol if you assemble a call from one
5384              section to another when using -K pic.  */
5385           if (h == NULL)
5386             break;
5387
5388           if (h->forced_local)
5389             break;
5390
5391           if (h->plt.offset == (bfd_vma) - 1)
5392             /* We didn't make a PLT entry for this symbol.  This
5393                happens when statically linking PIC code, or when
5394                using -Bsymbolic.  */
5395             break;
5396
5397           if (splt == NULL)
5398             break;
5399
5400           relocation = (splt->output_section->vma
5401                         + splt->output_offset
5402                         + h->plt.offset + 4)
5403                        - (input_section->output_section->vma
5404                           + input_section->output_offset
5405                           + rel->r_offset);
5406
5407           break;
5408
5409         case R_NDS32_GOTPC20:
5410           /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
5411              ld24 rx,#_GLOBAL_OFFSET_TABLE_  */
5412           relocation = elf_gp (output_bfd);
5413           break;
5414
5415         case R_NDS32_GOTPC_HI20:
5416         case R_NDS32_GOTPC_LO12:
5417           /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
5418              bl .+4
5419              seth rx,#high(_GLOBAL_OFFSET_TABLE_)
5420              or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
5421              or
5422              bl .+4
5423              seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
5424              add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)  */
5425           relocation = elf_gp (output_bfd);
5426           relocation -= (input_section->output_section->vma
5427                          + input_section->output_offset + rel->r_offset);
5428           break;
5429
5430         case R_NDS32_GOT20:
5431           /* Fall through.  */
5432         case R_NDS32_GOT_HI20:
5433         case R_NDS32_GOT_LO12:
5434         case R_NDS32_GOT_LO15:
5435         case R_NDS32_GOT_LO19:
5436           /* Relocation is to the entry for this symbol in the global
5437              offset table.  */
5438           BFD_ASSERT (sgot != NULL);
5439
5440           if (h != NULL)
5441             {
5442               /* External symbol  */
5443               bfd_boolean dyn;
5444
5445               off = h->got.offset;
5446               BFD_ASSERT (off != (bfd_vma) - 1);
5447               dyn = htab->root.dynamic_sections_created;
5448               if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
5449                                                     bfd_link_pic (info),
5450                                                     h)
5451                   || (bfd_link_pic (info)
5452                       && (info->symbolic
5453                           || h->dynindx == -1
5454                           || h->forced_local) && h->def_regular))
5455                 {
5456                   /* This is actually a static link, or it is a
5457                      -Bsymbolic link and the symbol is defined
5458                      locally, or the symbol was forced to be local
5459                      because of a version file.  We must initialize
5460                      this entry in the global offset table.  Since the
5461                      offset must always be a multiple of 4, we use the
5462                      least significant bit to record whether we have
5463                      initialized it already.
5464
5465                      When doing a dynamic link, we create a .rela.got
5466                      relocation entry to initialize the value.  This
5467                      is done in the finish_dynamic_symbol routine.  */
5468                   if ((off & 1) != 0)   /* clear LSB  */
5469                     off &= ~1;
5470                   else
5471                     {
5472                       bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5473                       h->got.offset |= 1;
5474                     }
5475                 }
5476               relocation = sgot->output_section->vma + sgot->output_offset + off
5477                            - elf_gp (output_bfd);
5478             }
5479           else
5480             {
5481               /* Local symbol  */
5482               bfd_byte *loc;
5483
5484               BFD_ASSERT (local_got_offsets != NULL
5485                           && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5486
5487               off = local_got_offsets[r_symndx];
5488
5489               /* The offset must always be a multiple of 4.  We use
5490                  the least significant bit to record whether we have
5491                  already processed this entry.  */
5492               if ((off & 1) != 0)       /* clear LSB  */
5493                 off &= ~1;
5494               else
5495                 {
5496                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5497
5498                   if (bfd_link_pic (info))
5499                     {
5500                       asection *srelgot;
5501                       Elf_Internal_Rela outrel;
5502
5503                       /* We need to generate a R_NDS32_RELATIVE reloc
5504                          for the dynamic linker.  */
5505                       srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
5506                       BFD_ASSERT (srelgot != NULL);
5507
5508                       outrel.r_offset = (elf_gp (output_bfd)
5509                                          + sgot->output_offset + off);
5510                       outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5511                       outrel.r_addend = relocation;
5512                       loc = srelgot->contents;
5513                       loc +=
5514                         srelgot->reloc_count * sizeof (Elf32_External_Rela);
5515                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5516                       ++srelgot->reloc_count;
5517                     }
5518                   local_got_offsets[r_symndx] |= 1;
5519                 }
5520               relocation = sgot->output_section->vma + sgot->output_offset + off
5521                            - elf_gp (output_bfd);
5522             }
5523
5524           break;
5525
5526         case R_NDS32_16_RELA:
5527         case R_NDS32_20_RELA:
5528         case R_NDS32_5_RELA:
5529         case R_NDS32_32_RELA:
5530         case R_NDS32_9_PCREL_RELA:
5531         case R_NDS32_WORD_9_PCREL_RELA:
5532         case R_NDS32_10_UPCREL_RELA:
5533         case R_NDS32_15_PCREL_RELA:
5534         case R_NDS32_17_PCREL_RELA:
5535         case R_NDS32_25_PCREL_RELA:
5536         case R_NDS32_HI20_RELA:
5537         case R_NDS32_LO12S3_RELA:
5538         case R_NDS32_LO12S2_RELA:
5539         case R_NDS32_LO12S2_DP_RELA:
5540         case R_NDS32_LO12S2_SP_RELA:
5541         case R_NDS32_LO12S1_RELA:
5542         case R_NDS32_LO12S0_RELA:
5543         case R_NDS32_LO12S0_ORI_RELA:
5544           if (bfd_link_pic (info) && r_symndx != 0
5545               && (input_section->flags & SEC_ALLOC) != 0
5546               && (eliminate_gc_relocs == 0
5547                   || (sec && (sec->flags & SEC_EXCLUDE) == 0))
5548               && ((r_type != R_NDS32_9_PCREL_RELA
5549                    && r_type != R_NDS32_WORD_9_PCREL_RELA
5550                    && r_type != R_NDS32_10_UPCREL_RELA
5551                    && r_type != R_NDS32_15_PCREL_RELA
5552                    && r_type != R_NDS32_17_PCREL_RELA
5553                    && r_type != R_NDS32_25_PCREL_RELA
5554                    && !(r_type == R_NDS32_32_RELA
5555                         && strcmp (input_section->name, ".eh_frame") == 0))
5556                   || (h != NULL && h->dynindx != -1
5557                       && (!info->symbolic || !h->def_regular))))
5558             {
5559               Elf_Internal_Rela outrel;
5560               bfd_boolean skip, relocate;
5561               bfd_byte *loc;
5562
5563               /* When generating a shared object, these relocations
5564                  are copied into the output file to be resolved at run
5565                  time.  */
5566
5567               if (sreloc == NULL)
5568                 {
5569                   const char *name;
5570
5571                   name = bfd_elf_string_from_elf_section
5572                     (input_bfd, elf_elfheader (input_bfd)->e_shstrndx,
5573                      elf_section_data (input_section)->rela.hdr->sh_name);
5574                   if (name == NULL)
5575                     return FALSE;
5576
5577                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5578                               && strcmp (bfd_section_name (input_section),
5579                                          name + 5) == 0);
5580
5581                   sreloc = bfd_get_section_by_name (dynobj, name);
5582                   BFD_ASSERT (sreloc != NULL);
5583                 }
5584
5585               skip = FALSE;
5586               relocate = FALSE;
5587
5588               outrel.r_offset = _bfd_elf_section_offset (output_bfd,
5589                                                          info,
5590                                                          input_section,
5591                                                          rel->r_offset);
5592               if (outrel.r_offset == (bfd_vma) - 1)
5593                 skip = TRUE;
5594               else if (outrel.r_offset == (bfd_vma) - 2)
5595                 skip = TRUE, relocate = TRUE;
5596               outrel.r_offset += (input_section->output_section->vma
5597                                   + input_section->output_offset);
5598
5599               if (skip)
5600                 memset (&outrel, 0, sizeof outrel);
5601               else if (r_type == R_NDS32_17_PCREL_RELA
5602                        || r_type == R_NDS32_15_PCREL_RELA
5603                        || r_type == R_NDS32_25_PCREL_RELA)
5604                 {
5605                   BFD_ASSERT (h != NULL && h->dynindx != -1);
5606                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5607                   outrel.r_addend = rel->r_addend;
5608                 }
5609               else
5610                 {
5611                   /* h->dynindx may be -1 if this symbol was marked to
5612                      become local.  */
5613                   if (h == NULL
5614                       || ((info->symbolic || h->dynindx == -1)
5615                           && h->def_regular)
5616                       || (bfd_link_pie (info) && h->def_regular))
5617                     {
5618                       relocate = TRUE;
5619                       outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5620                       outrel.r_addend = relocation + rel->r_addend;
5621
5622                       if (h)
5623                         {
5624                           h->plt.offset = (bfd_vma) -1;   /* cancel PLT trampoline.  */
5625
5626                           BFD_ASSERT (sgot != NULL);
5627                           /* If we did not allocate got entry for the symbol,
5628                              we can not fill the nonexistent got entry.  */
5629                           if (h->got.offset != (bfd_vma) -1
5630                               && (h->got.offset & 1) == 0)
5631                             {
5632                               bfd_put_32 (output_bfd, outrel.r_addend,
5633                                           sgot->contents + h->got.offset);
5634                             }
5635                         }
5636                     }
5637                   else
5638                     {
5639                       if (h->dynindx == -1)
5640                         {
5641                           _bfd_error_handler
5642                             (_("%pB: relocation %s against `%s' can not be used when "
5643                                "making a shared object; recompile with -fPIC"),
5644                              input_bfd, nds32_elf_howto_table[r_type].name, h->root.root.string);
5645                           bfd_set_error (bfd_error_bad_value);
5646                           return FALSE;
5647                         }
5648
5649                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5650                       outrel.r_addend = rel->r_addend;
5651                     }
5652                 }
5653
5654               loc = sreloc->contents;
5655               loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
5656               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5657               ++sreloc->reloc_count;
5658
5659               /* If this reloc is against an external symbol, we do
5660                  not want to fiddle with the addend.  Otherwise, we
5661                  need to include the symbol value so that it becomes
5662                  an addend for the dynamic reloc.  */
5663               if (!relocate)
5664                 continue;
5665             }
5666           break;
5667
5668         case R_NDS32_25_ABS_RELA:
5669           if (bfd_link_pic (info))
5670             {
5671               _bfd_error_handler
5672                 (_("%pB: warning: %s unsupported in shared mode"),
5673                  input_bfd, "R_NDS32_25_ABS_RELA");
5674               return FALSE;
5675             }
5676           break;
5677
5678         case R_NDS32_9_PCREL:
5679           r = nds32_elf_do_9_pcrel_reloc (input_bfd, howto, input_section,
5680                                           contents, offset,
5681                                           sec, relocation, addend);
5682           goto check_reloc;
5683
5684         case R_NDS32_HI20:
5685           /* We allow an arbitrary number of HI20 relocs before the
5686              LO12 reloc.  This permits gcc to emit the HI and LO relocs
5687              itself.  */
5688           for (lorel = rel + 1;
5689                (lorel < relend
5690                 && ELF32_R_TYPE (lorel->r_info) == R_NDS32_HI20); lorel++)
5691             continue;
5692           if (lorel < relend
5693               && (ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S3
5694                   || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S2
5695                   || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S1
5696                   || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S0))
5697             {
5698               nds32_elf_relocate_hi20 (input_bfd, r_type, rel, lorel,
5699                                        contents, relocation + addend);
5700               r = bfd_reloc_ok;
5701             }
5702           else
5703             r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5704                                           contents, offset, relocation,
5705                                           addend);
5706           goto check_reloc;
5707
5708         case R_NDS32_GOT17S2_RELA:
5709         case R_NDS32_GOT15S2_RELA:
5710           BFD_ASSERT (sgot != NULL);
5711
5712           if (h != NULL)
5713             {
5714               bfd_boolean dyn;
5715
5716               off = h->got.offset;
5717               BFD_ASSERT (off != (bfd_vma) - 1);
5718
5719               dyn = htab->root.dynamic_sections_created;
5720               if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
5721                   (dyn, bfd_link_pic (info), h)
5722                   || (bfd_link_pic (info)
5723                       && (info->symbolic
5724                           || h->dynindx == -1
5725                           || h->forced_local)
5726                       && h->def_regular))
5727                 {
5728                   /* This is actually a static link, or it is a
5729                      -Bsymbolic link and the symbol is defined
5730                      locally, or the symbol was forced to be local
5731                      because of a version file.  We must initialize
5732                      this entry in the global offset table.  Since the
5733                      offset must always be a multiple of 4, we use the
5734                      least significant bit to record whether we have
5735                      initialized it already.
5736
5737                      When doing a dynamic link, we create a .rela.got
5738                      relocation entry to initialize the value.  This
5739                      is done in the finish_dynamic_symbol routine.  */
5740                   if ((off & 1) != 0)
5741                     off &= ~1;
5742                   else
5743                     {
5744                       bfd_put_32 (output_bfd, relocation,
5745                                   sgot->contents + off);
5746                       h->got.offset |= 1;
5747                     }
5748                 }
5749             }
5750           else
5751             {
5752               bfd_byte *loc;
5753
5754               BFD_ASSERT (local_got_offsets != NULL
5755                           && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5756
5757               off = local_got_offsets[r_symndx];
5758
5759               /* The offset must always be a multiple of 4.  We use
5760                  the least significant bit to record whether we have
5761                  already processed this entry.  */
5762               if ((off & 1) != 0)
5763                 off &= ~1;
5764               else
5765                 {
5766                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5767
5768                   if (bfd_link_pic (info))
5769                     {
5770                       asection *srelgot;
5771                       Elf_Internal_Rela outrel;
5772
5773                       /* We need to generate a R_NDS32_RELATIVE reloc
5774                          for the dynamic linker.  */
5775                       srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
5776                       BFD_ASSERT (srelgot != NULL);
5777
5778                       outrel.r_offset = (elf_gp (output_bfd)
5779                                          + sgot->output_offset + off);
5780                       outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5781                       outrel.r_addend = relocation;
5782                       loc = srelgot->contents;
5783                       loc +=
5784                         srelgot->reloc_count * sizeof (Elf32_External_Rela);
5785                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5786                       ++srelgot->reloc_count;
5787                     }
5788                   local_got_offsets[r_symndx] |= 1;
5789                 }
5790             }
5791           relocation = sgot->output_section->vma + sgot->output_offset + off
5792             - elf_gp (output_bfd);
5793
5794           if (relocation & align)
5795             {
5796               /* Incorrect alignment.  */
5797               _bfd_error_handler
5798                 (_("%pB: warning: unaligned access to GOT entry"), input_bfd);
5799               ret = FALSE;
5800               r = bfd_reloc_dangerous;
5801               goto check_reloc;
5802             }
5803           break;
5804
5805         case R_NDS32_SDA16S3_RELA:
5806         case R_NDS32_SDA15S3_RELA:
5807         case R_NDS32_SDA15S3:
5808           align = 0x7;
5809           goto handle_sda;
5810
5811         case R_NDS32_SDA17S2_RELA:
5812         case R_NDS32_SDA15S2_RELA:
5813         case R_NDS32_SDA12S2_SP_RELA:
5814         case R_NDS32_SDA12S2_DP_RELA:
5815         case R_NDS32_SDA15S2:
5816         case R_NDS32_SDA_FP7U2_RELA:
5817           align = 0x3;
5818           goto handle_sda;
5819
5820         case R_NDS32_SDA18S1_RELA:
5821         case R_NDS32_SDA15S1_RELA:
5822         case R_NDS32_SDA15S1:
5823           align = 0x1;
5824           goto handle_sda;
5825
5826         case R_NDS32_SDA19S0_RELA:
5827         case R_NDS32_SDA15S0_RELA:
5828         case R_NDS32_SDA15S0:
5829           align = 0x0;
5830         handle_sda:
5831           BFD_ASSERT (sec != NULL);
5832
5833           /* If the symbol is in the abs section, the out_bfd will be null.
5834              This happens when the relocation has a symbol@GOTOFF.  */
5835           r = nds32_elf_final_sda_base (output_bfd, info, &gp, FALSE);
5836           if (r != bfd_reloc_ok)
5837             {
5838               _bfd_error_handler
5839                 (_("%pB: warning: relocate SDA_BASE failed"), input_bfd);
5840               ret = FALSE;
5841               goto check_reloc;
5842             }
5843
5844           /* At this point `relocation' contains the object's
5845              address.  */
5846           if (r_type == R_NDS32_SDA_FP7U2_RELA)
5847             {
5848               relocation -= fpbase_addr;
5849             }
5850           else
5851             relocation -= gp;
5852           /* Now it contains the offset from _SDA_BASE_.  */
5853
5854           /* Make sure alignment is correct.  */
5855
5856           if (relocation & align)
5857             {
5858               /* Incorrect alignment.  */
5859               _bfd_error_handler
5860                 /* xgettext:c-format */
5861                 (_("%pB(%pA): warning: unaligned small data access"
5862                    " of type %d"),
5863                  input_bfd, input_section, r_type);
5864               ret = FALSE;
5865               goto check_reloc;
5866             }
5867           break;
5868
5869         case R_NDS32_17IFC_PCREL_RELA:
5870         case R_NDS32_10IFCU_PCREL_RELA:
5871           /* Do nothing.  */
5872           break;
5873
5874         case R_NDS32_TLS_LE_HI20:
5875         case R_NDS32_TLS_LE_LO12:
5876         case R_NDS32_TLS_LE_20:
5877         case R_NDS32_TLS_LE_15S0:
5878         case R_NDS32_TLS_LE_15S1:
5879         case R_NDS32_TLS_LE_15S2:
5880           /* We do not have garbage collection for got entries.
5881              Therefore, IE to LE may have one empty entry, and DESC to
5882              LE may have two.  */
5883           if (elf_hash_table (info)->tls_sec != NULL)
5884             relocation -= (elf_hash_table (info)->tls_sec->vma + TP_OFFSET);
5885           break;
5886
5887         case R_NDS32_TLS_IE_HI20:
5888         case R_NDS32_TLS_IE_LO12S2:
5889         case R_NDS32_TLS_DESC_HI20:
5890         case R_NDS32_TLS_DESC_LO12:
5891         case R_NDS32_TLS_IE_LO12:
5892         case R_NDS32_TLS_IEGP_HI20:
5893         case R_NDS32_TLS_IEGP_LO12:
5894         case R_NDS32_TLS_IEGP_LO12S2:
5895           {
5896             /* Relocation is to the entry for this symbol in the global
5897                offset table.  */
5898             enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type;
5899             asection *srelgot;
5900             Elf_Internal_Rela outrel;
5901             bfd_byte *loc;
5902             int indx = 0;
5903
5904             eff_tls_type = org_tls_type = get_tls_type (r_type, h);
5905
5906             BFD_ASSERT (sgot != NULL);
5907             if (h != NULL)
5908               {
5909                 bfd_boolean dyn;
5910
5911                 off = h->got.offset;
5912                 BFD_ASSERT (off != (bfd_vma) -1);
5913                 dyn = htab->root.dynamic_sections_created;
5914                 tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
5915                 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5916                     && (!bfd_link_pic (info)
5917                         || !SYMBOL_REFERENCES_LOCAL (info, h)))
5918                   indx = h->dynindx;
5919               }
5920             else
5921               {
5922                 BFD_ASSERT (local_got_offsets != NULL
5923                             && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5924                 off = local_got_offsets[r_symndx];
5925                 tls_type = elf32_nds32_local_got_tls_type (input_bfd)[r_symndx];
5926               }
5927
5928             relocation = sgot->output_section->vma + sgot->output_offset + off;
5929
5930             if (1 < ones32 (tls_type))
5931               {
5932                 eff_tls_type = 1 << (fls (tls_type) - 1);
5933                 /* TLS model shall be handled in nds32_elf_unify_tls_model ().  */
5934
5935                 /* TLS model X -> LE is not implement yet!
5936                    workaround here!  */
5937                 if (eff_tls_type == GOT_TLS_LE)
5938                   {
5939                     eff_tls_type = 1 << (fls (tls_type ^ eff_tls_type) - 1);
5940                   }
5941               }
5942
5943             /* The offset must always be a multiple of 4.  We use
5944                the least significant bit to record whether we have
5945                already processed this entry.  */
5946             bfd_boolean need_relocs = FALSE;
5947             srelgot = ehtab->srelgot;
5948             if ((bfd_link_pic (info) || indx != 0)
5949                 && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5950                     || h->root.type != bfd_link_hash_undefweak))
5951               {
5952                 need_relocs = TRUE;
5953                 BFD_ASSERT (srelgot != NULL);
5954               }
5955
5956             if (off & 1)
5957               {
5958                 off &= ~1;
5959                 relocation &= ~1;
5960
5961                 if (eff_tls_type & GOT_TLS_DESC)
5962                   {
5963                     relocation -= elf_gp (output_bfd);
5964                     if ((R_NDS32_TLS_DESC_HI20 == r_type) && (!need_relocs))
5965                       {
5966                         /* TLS model shall be converted.  */
5967                         BFD_ASSERT(0);
5968                       }
5969                   }
5970                 else if (eff_tls_type & GOT_TLS_IEGP)
5971                   {
5972                     relocation -= elf_gp (output_bfd);
5973                   }
5974               }
5975             else
5976               {
5977                 if ((eff_tls_type & GOT_TLS_LE) && (tls_type ^ eff_tls_type))
5978                   {
5979                     /* TLS model workaround shall be applied.  */
5980                     BFD_ASSERT(0);
5981                   }
5982                 else if (eff_tls_type & (GOT_TLS_IE | GOT_TLS_IEGP))
5983                   {
5984                     if (eff_tls_type & GOT_TLS_IEGP)
5985                       relocation -= elf_gp(output_bfd);
5986
5987                     if (need_relocs)
5988                       {
5989                         if (indx == 0)
5990                           outrel.r_addend = gottpoff (info, relocation_sym);
5991                         else
5992                           outrel.r_addend = 0;
5993                         outrel.r_offset = (sgot->output_section->vma
5994                                            + sgot->output_offset + off);
5995                         outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_TPOFF);
5996
5997                         elf32_nds32_add_dynreloc (output_bfd, info, srelgot,
5998                                                   &outrel);
5999                       }
6000                     else
6001                       {
6002                         bfd_put_32 (output_bfd, gottpoff (info, relocation_sym),
6003                                     sgot->contents + off);
6004                       }
6005                   }
6006                 else if (eff_tls_type & GOT_TLS_DESC)
6007                   {
6008                     relocation -= elf_gp (output_bfd);
6009                     if (need_relocs)
6010                       {
6011                         if (indx == 0)
6012                           outrel.r_addend = gottpoff (info, relocation_sym);
6013                         else
6014                           outrel.r_addend = 0;
6015                         outrel.r_offset = (sgot->output_section->vma
6016                                            + sgot->output_offset + off);
6017                         outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_DESC);
6018
6019                         if (htab->tls_desc_trampoline)
6020                           {
6021                             asection *srelplt;
6022                             srelplt = ehtab->srelplt;
6023                             loc = srelplt->contents;
6024                             loc += htab->next_tls_desc_index++ * sizeof (Elf32_External_Rela);
6025                             BFD_ASSERT (loc + sizeof (Elf32_External_Rela)
6026                                         <= srelplt->contents + srelplt->size);
6027
6028                             bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6029                           }
6030                         else
6031                           {
6032                             loc = srelgot->contents;
6033                             loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
6034                             bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6035                             ++srelgot->reloc_count;
6036                           }
6037                       }
6038                     else
6039                       {
6040                         /* feed me!  */
6041                         bfd_put_32 (output_bfd, 0xdeadbeef,
6042                                     sgot->contents + off);
6043                         bfd_put_32 (output_bfd, gottpoff (info, relocation_sym),
6044                                     sgot->contents + off + 4);
6045                         patch_tls_desc_to_ie (contents, rel, input_bfd);
6046                         BFD_ASSERT(0);
6047                       }
6048                   }
6049                 else
6050                   {
6051                     /* TLS model workaround shall be applied.  */
6052                     BFD_ASSERT(0);
6053                   }
6054
6055                 if (h != NULL)
6056                   h->got.offset |= 1;
6057                 else
6058                   local_got_offsets[r_symndx] |= 1;
6059               }
6060           }
6061         break;
6062           /* DON'T fall through.  */
6063
6064         default:
6065           /* OLD_NDS32_RELOC.  */
6066
6067           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
6068                                         contents, offset, relocation, addend);
6069           goto check_reloc;
6070         }
6071
6072       switch ((int) r_type)
6073         {
6074         case R_NDS32_20_RELA:
6075         case R_NDS32_5_RELA:
6076         case R_NDS32_9_PCREL_RELA:
6077         case R_NDS32_WORD_9_PCREL_RELA:
6078         case R_NDS32_10_UPCREL_RELA:
6079         case R_NDS32_15_PCREL_RELA:
6080         case R_NDS32_17_PCREL_RELA:
6081         case R_NDS32_25_PCREL_RELA:
6082         case R_NDS32_25_ABS_RELA:
6083         case R_NDS32_HI20_RELA:
6084         case R_NDS32_LO12S3_RELA:
6085         case R_NDS32_LO12S2_RELA:
6086         case R_NDS32_LO12S2_DP_RELA:
6087         case R_NDS32_LO12S2_SP_RELA:
6088         case R_NDS32_LO12S1_RELA:
6089         case R_NDS32_LO12S0_RELA:
6090         case R_NDS32_LO12S0_ORI_RELA:
6091         case R_NDS32_SDA16S3_RELA:
6092         case R_NDS32_SDA17S2_RELA:
6093         case R_NDS32_SDA18S1_RELA:
6094         case R_NDS32_SDA19S0_RELA:
6095         case R_NDS32_SDA15S3_RELA:
6096         case R_NDS32_SDA15S2_RELA:
6097         case R_NDS32_SDA12S2_DP_RELA:
6098         case R_NDS32_SDA12S2_SP_RELA:
6099         case R_NDS32_SDA15S1_RELA:
6100         case R_NDS32_SDA15S0_RELA:
6101         case R_NDS32_SDA_FP7U2_RELA:
6102         case R_NDS32_9_PLTREL:
6103         case R_NDS32_25_PLTREL:
6104         case R_NDS32_GOT20:
6105         case R_NDS32_GOT_HI20:
6106         case R_NDS32_GOT_LO12:
6107         case R_NDS32_GOT_LO15:
6108         case R_NDS32_GOT_LO19:
6109         case R_NDS32_GOT15S2_RELA:
6110         case R_NDS32_GOT17S2_RELA:
6111         case R_NDS32_GOTPC20:
6112         case R_NDS32_GOTPC_HI20:
6113         case R_NDS32_GOTPC_LO12:
6114         case R_NDS32_GOTOFF:
6115         case R_NDS32_GOTOFF_HI20:
6116         case R_NDS32_GOTOFF_LO12:
6117         case R_NDS32_GOTOFF_LO15:
6118         case R_NDS32_GOTOFF_LO19:
6119         case R_NDS32_PLTREL_HI20:
6120         case R_NDS32_PLTREL_LO12:
6121         case R_NDS32_PLT_GOTREL_HI20:
6122         case R_NDS32_PLT_GOTREL_LO12:
6123         case R_NDS32_PLT_GOTREL_LO15:
6124         case R_NDS32_PLT_GOTREL_LO19:
6125         case R_NDS32_PLT_GOTREL_LO20:
6126         case R_NDS32_17IFC_PCREL_RELA:
6127         case R_NDS32_10IFCU_PCREL_RELA:
6128         case R_NDS32_TLS_LE_HI20:
6129         case R_NDS32_TLS_LE_LO12:
6130         case R_NDS32_TLS_IE_HI20:
6131         case R_NDS32_TLS_IE_LO12S2:
6132         case R_NDS32_TLS_LE_20:
6133         case R_NDS32_TLS_LE_15S0:
6134         case R_NDS32_TLS_LE_15S1:
6135         case R_NDS32_TLS_LE_15S2:
6136         case R_NDS32_TLS_DESC_HI20:
6137         case R_NDS32_TLS_DESC_LO12:
6138         case R_NDS32_TLS_IE_LO12:
6139         case R_NDS32_TLS_IEGP_HI20:
6140         case R_NDS32_TLS_IEGP_LO12:
6141         case R_NDS32_TLS_IEGP_LO12S2:
6142           /* Instruction related relocs must handle endian properly.  */
6143           /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER.  */
6144           r = nds32_elf_final_link_relocate (howto, input_bfd,
6145                                              input_section, contents,
6146                                              rel->r_offset, relocation,
6147                                              rel->r_addend);
6148           break;
6149
6150         default:
6151           /* All other relocs can use default handler.  */
6152           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
6153                                         contents, rel->r_offset,
6154                                         relocation, rel->r_addend);
6155           break;
6156         }
6157
6158     check_reloc:
6159
6160       if (r != bfd_reloc_ok)
6161         {
6162           /* FIXME: This should be generic enough to go in a utility.  */
6163           const char *name;
6164
6165           if (h != NULL)
6166             name = h->root.root.string;
6167           else
6168             {
6169               name = bfd_elf_string_from_elf_section
6170                       (input_bfd, symtab_hdr->sh_link, sym->st_name);
6171               if (name == NULL || *name == '\0')
6172                 name = bfd_section_name (sec);
6173             }
6174
6175           if (errmsg != NULL)
6176             goto common_error;
6177
6178           switch (r)
6179             {
6180             case bfd_reloc_overflow:
6181               (*info->callbacks->reloc_overflow)
6182                 (info, (h ? &h->root : NULL), name, howto->name,
6183                  (bfd_vma) 0, input_bfd, input_section, offset);
6184               break;
6185
6186             case bfd_reloc_undefined:
6187               (*info->callbacks->undefined_symbol)
6188                 (info, name, input_bfd, input_section, offset, TRUE);
6189               break;
6190
6191             case bfd_reloc_outofrange:
6192               errmsg = _("internal error: out of range error");
6193               goto common_error;
6194
6195             case bfd_reloc_notsupported:
6196               errmsg = _("internal error: unsupported relocation error");
6197               goto common_error;
6198
6199             case bfd_reloc_dangerous:
6200               errmsg = _("internal error: dangerous error");
6201               goto common_error;
6202
6203             default:
6204               errmsg = _("internal error: unknown error");
6205               /* Fall through.  */
6206
6207             common_error:
6208               (*info->callbacks->warning) (info, errmsg, name, input_bfd,
6209                                            input_section, offset);
6210               break;
6211             }
6212         }
6213     }
6214
6215   /* Resotre header size to avoid overflow load.  */
6216   if (elf_nds32_tdata (input_bfd)->hdr_size != 0)
6217     symtab_hdr->sh_size = elf_nds32_tdata (input_bfd)->hdr_size;
6218
6219   return ret;
6220 }
6221
6222 /* Finish up dynamic symbol handling.  We set the contents of various
6223    dynamic sections here.  */
6224
6225 static bfd_boolean
6226 nds32_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
6227                                  struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
6228 {
6229   struct elf_link_hash_table *ehtab;
6230   struct elf_nds32_link_hash_entry *hent;
6231   bfd_byte *loc;
6232
6233   ehtab = elf_hash_table (info);
6234   hent = (struct elf_nds32_link_hash_entry *) h;
6235
6236   if (h->plt.offset != (bfd_vma) - 1)
6237     {
6238       asection *splt;
6239       asection *sgot;
6240       asection *srela;
6241
6242       bfd_vma plt_index;
6243       bfd_vma got_offset;
6244       bfd_vma local_plt_offset;
6245       Elf_Internal_Rela rela;
6246
6247       /* This symbol has an entry in the procedure linkage table.  Set
6248          it up.  */
6249
6250       BFD_ASSERT (h->dynindx != -1);
6251
6252       splt = ehtab->splt;
6253       sgot = ehtab->sgotplt;
6254       srela = ehtab->srelplt;
6255       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
6256
6257       /* Get the index in the procedure linkage table which
6258          corresponds to this symbol.  This is the index of this symbol
6259          in all the symbols for which we are making plt entries.  The
6260          first entry in the procedure linkage table is reserved.  */
6261       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
6262
6263       /* Get the offset into the .got table of the entry that
6264          corresponds to this function.  Each .got entry is 4 bytes.
6265          The first three are reserved.  */
6266       got_offset = (plt_index + 3) * 4;
6267
6268       /* Fill in the entry in the procedure linkage table.  */
6269       if (!bfd_link_pic (info))
6270         {
6271           unsigned long insn;
6272
6273           insn = PLT_ENTRY_WORD0 + (((sgot->output_section->vma
6274                                       + sgot->output_offset + got_offset) >> 12)
6275                                     & 0xfffff);
6276           bfd_putb32 (insn, splt->contents + h->plt.offset);
6277
6278           insn = PLT_ENTRY_WORD1 + (((sgot->output_section->vma
6279                                       + sgot->output_offset + got_offset) & 0x0fff)
6280                                     >> 2);
6281           bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
6282
6283           insn = PLT_ENTRY_WORD2;
6284           bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
6285
6286           insn = PLT_ENTRY_WORD3 + (plt_index & 0x7ffff);
6287           bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
6288
6289           insn = PLT_ENTRY_WORD4
6290                  + (((unsigned int) ((-(h->plt.offset + 16)) >> 1)) & 0xffffff);
6291           bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
6292           local_plt_offset = 12;
6293         }
6294       else
6295         {
6296           /* sda_base must be set at this time.  */
6297           unsigned long insn;
6298           long offset;
6299
6300           offset = sgot->output_section->vma + sgot->output_offset + got_offset
6301                    - elf_gp (output_bfd);
6302           insn = PLT_PIC_ENTRY_WORD0 + ((offset >> 12) & 0xfffff);
6303           bfd_putb32 (insn, splt->contents + h->plt.offset);
6304
6305           insn = PLT_PIC_ENTRY_WORD1 + (offset & 0xfff);
6306           bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
6307
6308           insn = PLT_PIC_ENTRY_WORD2;
6309           bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
6310
6311           insn = PLT_PIC_ENTRY_WORD3;
6312           bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
6313
6314           insn = PLT_PIC_ENTRY_WORD4 + (plt_index & 0x7fffff);
6315           bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
6316
6317           insn = PLT_PIC_ENTRY_WORD5
6318             + (((unsigned int) ((-(h->plt.offset + 20)) >> 1)) & 0xffffff);
6319           bfd_putb32 (insn, splt->contents + h->plt.offset + 20);
6320
6321           local_plt_offset = 16;
6322         }
6323
6324       /* Fill in the entry in the global offset table,
6325          so it will fall through to the next instruction for the first time.  */
6326       bfd_put_32 (output_bfd,
6327                   (splt->output_section->vma + splt->output_offset
6328                    + h->plt.offset + local_plt_offset),
6329                   sgot->contents + got_offset);
6330
6331       /* Fill in the entry in the .rela.plt section.  */
6332       rela.r_offset = (sgot->output_section->vma
6333                        + sgot->output_offset + got_offset);
6334       rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_JMP_SLOT);
6335       rela.r_addend = 0;
6336       loc = srela->contents;
6337       loc += plt_index * sizeof (Elf32_External_Rela);
6338       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
6339
6340       if (!h->def_regular)
6341         {
6342           /* Mark the symbol as undefined, rather than as defined in
6343              the .plt section.  Leave the value alone.  */
6344           sym->st_shndx = SHN_UNDEF;
6345           if (!h->ref_regular_nonweak)
6346             sym->st_value = 0;
6347         }
6348     }
6349
6350   if (h->got.offset != (bfd_vma) - 1
6351       && hent->tls_type == GOT_NORMAL)
6352     {
6353       asection *sgot;
6354       asection *srelagot;
6355       Elf_Internal_Rela rela;
6356
6357       /* This symbol has an entry in the global offset table.
6358          Set it up.  */
6359
6360       sgot = ehtab->sgot;
6361       srelagot = ehtab->srelgot;
6362       BFD_ASSERT (sgot != NULL && srelagot != NULL);
6363
6364       rela.r_offset = (sgot->output_section->vma
6365                        + sgot->output_offset + (h->got.offset & ~1));
6366
6367       /* If this is a -Bsymbolic link, and the symbol is defined
6368          locally, we just want to emit a RELATIVE reloc.  Likewise if
6369          the symbol was forced to be local because of a version file.
6370          The entry in the global offset table will already have been
6371          initialized in the relocate_section function.  */
6372       if ((bfd_link_pic (info)
6373            && (info->symbolic || h->dynindx == -1 || h->forced_local)
6374            && h->def_regular)
6375           || (bfd_link_pie (info) && h->def_regular))
6376         {
6377           rela.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
6378           rela.r_addend = (h->root.u.def.value
6379                            + h->root.u.def.section->output_section->vma
6380                            + h->root.u.def.section->output_offset);
6381
6382           if ((h->got.offset & 1) == 0)
6383             {
6384               bfd_put_32 (output_bfd, rela.r_addend,
6385                           sgot->contents + h->got.offset);
6386             }
6387         }
6388       else
6389         {
6390           BFD_ASSERT ((h->got.offset & 1) == 0);
6391           bfd_put_32 (output_bfd, (bfd_vma) 0,
6392                       sgot->contents + h->got.offset);
6393           rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_GLOB_DAT);
6394           rela.r_addend = 0;
6395         }
6396
6397       loc = srelagot->contents;
6398       loc += srelagot->reloc_count * sizeof (Elf32_External_Rela);
6399       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
6400       ++srelagot->reloc_count;
6401       BFD_ASSERT (loc < (srelagot->contents + srelagot->size));
6402     }
6403
6404   if (h->needs_copy)
6405     {
6406       asection *s;
6407       Elf_Internal_Rela rela;
6408
6409       /* This symbols needs a copy reloc.  Set it up.  */
6410
6411       BFD_ASSERT (h->dynindx != -1
6412                   && (h->root.type == bfd_link_hash_defined
6413                       || h->root.type == bfd_link_hash_defweak));
6414
6415       s = bfd_get_section_by_name (h->root.u.def.section->owner, ".rela.bss");
6416       BFD_ASSERT (s != NULL);
6417
6418       rela.r_offset = (h->root.u.def.value
6419                        + h->root.u.def.section->output_section->vma
6420                        + h->root.u.def.section->output_offset);
6421       rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_COPY);
6422       rela.r_addend = 0;
6423       loc = s->contents;
6424       loc += s->reloc_count * sizeof (Elf32_External_Rela);
6425       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
6426       ++s->reloc_count;
6427     }
6428
6429   /* Mark some specially defined symbols as absolute.  */
6430   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
6431       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
6432     sym->st_shndx = SHN_ABS;
6433
6434   return TRUE;
6435 }
6436
6437
6438 /* Finish up the dynamic sections.  */
6439
6440 static bfd_boolean
6441 nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
6442 {
6443   bfd *dynobj;
6444   asection *sdyn;
6445   asection *sgotplt;
6446   struct elf_link_hash_table *ehtab;
6447   struct elf_nds32_link_hash_table *htab;
6448
6449   ehtab = elf_hash_table (info);
6450   htab = nds32_elf_hash_table (info);
6451   if (htab == NULL)
6452     return FALSE;
6453
6454   dynobj = elf_hash_table (info)->dynobj;
6455
6456   sgotplt = ehtab->sgotplt;
6457   /* A broken linker script might have discarded the dynamic sections.
6458      Catch this here so that we do not seg-fault later on.  */
6459   if (sgotplt != NULL && bfd_is_abs_section (sgotplt->output_section))
6460     return FALSE;
6461   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
6462
6463   if (elf_hash_table (info)->dynamic_sections_created)
6464     {
6465       asection *splt;
6466       Elf32_External_Dyn *dyncon, *dynconend;
6467
6468       BFD_ASSERT (sgotplt != NULL && sdyn != NULL);
6469
6470       dyncon = (Elf32_External_Dyn *) sdyn->contents;
6471       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
6472
6473       for (; dyncon < dynconend; dyncon++)
6474         {
6475           Elf_Internal_Dyn dyn;
6476           asection *s;
6477
6478           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
6479
6480           switch (dyn.d_tag)
6481             {
6482             default:
6483               break;
6484
6485             case DT_PLTGOT:
6486               /* name = ".got";  */
6487               s = ehtab->sgot->output_section;
6488               goto get_vma;
6489             case DT_JMPREL:
6490               s = ehtab->srelplt->output_section;
6491             get_vma:
6492               BFD_ASSERT (s != NULL);
6493               dyn.d_un.d_ptr = s->vma;
6494               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6495               break;
6496
6497             case DT_PLTRELSZ:
6498               s = ehtab->srelplt->output_section;
6499               BFD_ASSERT (s != NULL);
6500               dyn.d_un.d_val = s->size;
6501               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6502               break;
6503
6504             case DT_RELASZ:
6505               /* My reading of the SVR4 ABI indicates that the
6506                  procedure linkage table relocs (DT_JMPREL) should be
6507                  included in the overall relocs (DT_RELA).  This is
6508                  what Solaris does.  However, UnixWare can not handle
6509                  that case.  Therefore, we override the DT_RELASZ entry
6510                  here to make it not include the JMPREL relocs.  Since
6511                  the linker script arranges for .rela.plt to follow all
6512                  other relocation sections, we don't have to worry
6513                  about changing the DT_RELA entry.  */
6514               if (ehtab->srelplt != NULL)
6515                 {
6516                   s = ehtab->srelplt->output_section;
6517                   dyn.d_un.d_val -= s->size;
6518                 }
6519               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6520               break;
6521
6522             case DT_TLSDESC_PLT:
6523               s = htab->root.splt;
6524               dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
6525                                 + htab->dt_tlsdesc_plt);
6526               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6527               break;
6528
6529             case DT_TLSDESC_GOT:
6530               s = htab->root.sgot;
6531               dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
6532                                 + htab->dt_tlsdesc_got);
6533               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6534               break;
6535             }
6536         }
6537
6538       /* Fill in the first entry in the procedure linkage table.  */
6539       splt = ehtab->splt;
6540       if (splt && splt->size > 0)
6541         {
6542           if (bfd_link_pic (info))
6543             {
6544               unsigned long insn;
6545               long offset;
6546
6547               offset = sgotplt->output_section->vma + sgotplt->output_offset + 4
6548                 - elf_gp (output_bfd);
6549               insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff);
6550               bfd_putb32 (insn, splt->contents);
6551
6552               /* here has a typo?  */
6553               insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff);
6554               bfd_putb32 (insn, splt->contents + 4);
6555
6556               insn = PLT0_PIC_ENTRY_WORD2;
6557               bfd_putb32 (insn, splt->contents + 8);
6558
6559               insn = PLT0_PIC_ENTRY_WORD3;
6560               bfd_putb32 (insn, splt->contents + 12);
6561
6562               insn = PLT0_PIC_ENTRY_WORD4;
6563               bfd_putb32 (insn, splt->contents + 16);
6564
6565               insn = PLT0_PIC_ENTRY_WORD5;
6566               bfd_putb32 (insn, splt->contents + 20);
6567             }
6568           else
6569             {
6570               unsigned long insn;
6571               unsigned long addr;
6572
6573               /* addr = .got + 4 */
6574               addr = sgotplt->output_section->vma + sgotplt->output_offset + 4;
6575               insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff);
6576               bfd_putb32 (insn, splt->contents);
6577
6578               insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff);
6579               bfd_putb32 (insn, splt->contents + 4);
6580
6581               insn = PLT0_ENTRY_WORD2;
6582               bfd_putb32 (insn, splt->contents + 8);
6583
6584               insn = PLT0_ENTRY_WORD3;
6585               bfd_putb32 (insn, splt->contents + 12);
6586
6587               insn = PLT0_ENTRY_WORD4;
6588               bfd_putb32 (insn, splt->contents + 16);
6589             }
6590
6591           elf_section_data (splt->output_section)->this_hdr.sh_entsize =
6592             PLT_ENTRY_SIZE;
6593         }
6594
6595       if (htab->dt_tlsdesc_plt)
6596         {
6597           /* Calculate addresses.  */
6598           asection *sgot = sgot = ehtab->sgot;
6599           bfd_vma pltgot = sgotplt->output_section->vma
6600             + sgotplt->output_offset;
6601           bfd_vma tlsdesc_got = sgot->output_section->vma + sgot->output_offset
6602             + htab->dt_tlsdesc_got;
6603
6604           /* Get GP offset.  */
6605           pltgot -= elf_gp (output_bfd) - 4; /* PLTGOT[1]  */
6606           tlsdesc_got -= elf_gp (output_bfd);
6607
6608           /* Do relocation.  */
6609           dl_tlsdesc_lazy_trampoline[0] += ((1 << 20) - 1) & (tlsdesc_got >> 12);
6610           dl_tlsdesc_lazy_trampoline[1] += 0xfff & tlsdesc_got;
6611           dl_tlsdesc_lazy_trampoline[4] += ((1 << 20) - 1) & (pltgot >> 12);
6612           dl_tlsdesc_lazy_trampoline[5] +=  0xfff & pltgot;
6613
6614           /* Insert .plt.  */
6615           nds32_put_trampoline (splt->contents + htab->dt_tlsdesc_plt,
6616                                 dl_tlsdesc_lazy_trampoline,
6617                                 ARRAY_SIZE (dl_tlsdesc_lazy_trampoline));
6618         }
6619     }
6620
6621   /* Fill in the first three entries in the global offset table.  */
6622   if (sgotplt && sgotplt->size > 0)
6623     {
6624       if (sdyn == NULL)
6625         bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
6626       else
6627         bfd_put_32 (output_bfd,
6628                     sdyn->output_section->vma + sdyn->output_offset,
6629                     sgotplt->contents);
6630       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
6631       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
6632
6633       elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
6634     }
6635
6636   return TRUE;
6637 }
6638 \f
6639
6640 /* Set the right machine number.  */
6641
6642 static bfd_boolean
6643 nds32_elf_object_p (bfd *abfd)
6644 {
6645   static unsigned int cur_arch = 0;
6646
6647   if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH))
6648     {
6649       /* E_N1_ARCH is a wild card, so it is set only when no others exist.  */
6650       cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH);
6651     }
6652
6653   switch (cur_arch)
6654     {
6655     default:
6656     case E_N1_ARCH:
6657       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1);
6658       break;
6659     case E_N1H_ARCH:
6660       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h);
6661       break;
6662     case E_NDS_ARCH_STAR_V2_0:
6663       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2);
6664       break;
6665     case E_NDS_ARCH_STAR_V3_0:
6666       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3);
6667       break;
6668     case E_NDS_ARCH_STAR_V3_M:
6669       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m);
6670       break;
6671     }
6672
6673   return TRUE;
6674 }
6675
6676 /* Store the machine number in the flags field.  */
6677
6678 static bfd_boolean
6679 nds32_elf_final_write_processing (bfd *abfd)
6680 {
6681   unsigned long val;
6682   static unsigned int cur_mach = 0;
6683
6684   if (bfd_mach_n1 != bfd_get_mach (abfd))
6685     {
6686       cur_mach = bfd_get_mach (abfd);
6687     }
6688
6689   switch (cur_mach)
6690     {
6691     case bfd_mach_n1:
6692       /* Only happen when object is empty, since the case is abandon.  */
6693       val = E_N1_ARCH;
6694       val |= E_NDS_ABI_AABI;
6695       val |= E_NDS32_ELF_VER_1_4;
6696       break;
6697     case bfd_mach_n1h:
6698       val = E_N1H_ARCH;
6699       break;
6700     case bfd_mach_n1h_v2:
6701       val = E_NDS_ARCH_STAR_V2_0;
6702       break;
6703     case bfd_mach_n1h_v3:
6704       val = E_NDS_ARCH_STAR_V3_0;
6705       break;
6706     case bfd_mach_n1h_v3m:
6707       val = E_NDS_ARCH_STAR_V3_M;
6708       break;
6709     default:
6710       val = 0;
6711       break;
6712     }
6713
6714   elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH;
6715   elf_elfheader (abfd)->e_flags |= val;
6716   return _bfd_elf_final_write_processing (abfd);
6717 }
6718
6719 /* Function to keep NDS32 specific file flags.  */
6720
6721 static bfd_boolean
6722 nds32_elf_set_private_flags (bfd *abfd, flagword flags)
6723 {
6724   BFD_ASSERT (!elf_flags_init (abfd)
6725               || elf_elfheader (abfd)->e_flags == flags);
6726
6727   elf_elfheader (abfd)->e_flags = flags;
6728   elf_flags_init (abfd) = TRUE;
6729   return TRUE;
6730 }
6731
6732 static unsigned int
6733 convert_e_flags (unsigned int e_flags, unsigned int arch)
6734 {
6735   if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9)
6736     {
6737       /* From 0.9 to 1.0.  */
6738       e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0;
6739
6740       /* Invert E_NDS32_HAS_NO_MAC_INST.  */
6741       e_flags ^= E_NDS32_HAS_NO_MAC_INST;
6742       if (arch == E_NDS_ARCH_STAR_V1_0)
6743         {
6744           /* Done.  */
6745           return e_flags;
6746         }
6747     }
6748
6749   /* From 1.0 to 2.0.  */
6750   e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0;
6751
6752   /* Clear E_NDS32_HAS_MFUSR_PC_INST.  */
6753   e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST;
6754
6755   /* Invert E_NDS32_HAS_NO_MAC_INST.  */
6756   e_flags ^= E_NDS32_HAS_NO_MAC_INST;
6757   return e_flags;
6758 }
6759
6760 static bfd_boolean
6761 nds32_check_vec_size (bfd *ibfd)
6762 {
6763   static unsigned int nds32_vec_size = 0;
6764
6765   asection *sec_t = NULL;
6766   bfd_byte *contents = NULL;
6767
6768   sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags");
6769
6770   if (sec_t && sec_t->size >= 4)
6771     {
6772       /* Get vec_size in file.  */
6773       unsigned int flag_t;
6774
6775       nds32_get_section_contents (ibfd, sec_t, &contents, TRUE);
6776       flag_t = bfd_get_32 (ibfd, contents);
6777
6778       /* The value could only be 4 or 16.  */
6779
6780       if (!nds32_vec_size)
6781         /* Set if not set yet.  */
6782         nds32_vec_size = (flag_t & 0x3);
6783       else if (nds32_vec_size != (flag_t & 0x3))
6784         {
6785           _bfd_error_handler
6786             /* xgettext:c-format */
6787             (_("%pB: ISR vector size mismatch"
6788                " with previous modules, previous %u-byte, current %u-byte"),
6789              ibfd,
6790              nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff,
6791              (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff);
6792           return FALSE;
6793         }
6794       else
6795         /* Only keep the first vec_size section.  */
6796         sec_t->flags |= SEC_EXCLUDE;
6797     }
6798
6799   return TRUE;
6800 }
6801
6802 /* Merge backend specific data from an object file to the output
6803    object file when linking.  */
6804
6805 static bfd_boolean
6806 nds32_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
6807 {
6808   bfd *obfd = info->output_bfd;
6809   flagword out_flags;
6810   flagword in_flags;
6811   flagword out_16regs;
6812   flagword in_no_mac;
6813   flagword out_no_mac;
6814   flagword in_16regs;
6815   flagword out_version;
6816   flagword in_version;
6817   flagword out_fpu_config;
6818   flagword in_fpu_config;
6819
6820   /* FIXME: What should be checked when linking shared libraries?  */
6821   if ((ibfd->flags & DYNAMIC) != 0)
6822     return TRUE;
6823
6824   /* TODO: Revise to use object-attributes instead.  */
6825   if (!nds32_check_vec_size (ibfd))
6826     return FALSE;
6827
6828   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6829       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6830     return TRUE;
6831
6832   if (bfd_little_endian (ibfd) != bfd_little_endian (obfd))
6833     {
6834       _bfd_error_handler
6835         (_("%pB: warning: endian mismatch with previous modules"), ibfd);
6836
6837       bfd_set_error (bfd_error_bad_value);
6838       return FALSE;
6839     }
6840
6841   /* -B option in objcopy cannot work as expected. e_flags = 0 shall be
6842      treat as generic one without checking and merging.  */
6843   if (elf_elfheader (ibfd)->e_flags)
6844     {
6845       in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION;
6846       if (in_version == E_NDS32_ELF_VER_1_2)
6847         {
6848           _bfd_error_handler
6849             (_("%pB: warning: older version of object file encountered, "
6850                "please recompile with current tool chain"), ibfd);
6851         }
6852
6853       /* We may need to merge V1 and V2 arch object files to V2.  */
6854       if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6855           != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
6856         {
6857           /* Need to convert version.  */
6858           if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6859               == E_NDS_ARCH_STAR_RESERVED)
6860             {
6861               elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6862             }
6863           else if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6864                    == E_NDS_ARCH_STAR_V3_M
6865                    && (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)
6866                    == E_NDS_ARCH_STAR_V3_0)
6867             {
6868               elf_elfheader (ibfd)->e_flags =
6869                 (elf_elfheader (ibfd)->e_flags & (~EF_NDS_ARCH))
6870                 | E_NDS_ARCH_STAR_V3_0;
6871             }
6872           else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)
6873                    == E_NDS_ARCH_STAR_V0_9
6874                    || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6875                    > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
6876             {
6877               elf_elfheader (obfd)->e_flags =
6878                 convert_e_flags (elf_elfheader (obfd)->e_flags,
6879                                  (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH));
6880             }
6881           else
6882             {
6883               elf_elfheader (ibfd)->e_flags =
6884                 convert_e_flags (elf_elfheader (ibfd)->e_flags,
6885                                  (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH));
6886             }
6887         }
6888
6889       /* Extract some flags.  */
6890       in_flags = elf_elfheader (ibfd)->e_flags
6891         & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6892              | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6893
6894       /* The following flags need special treatment.  */
6895       in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6896       in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6897       in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF;
6898
6899       /* Extract some flags.  */
6900       out_flags = elf_elfheader (obfd)->e_flags
6901         & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6902              | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6903
6904       /* The following flags need special treatment.  */
6905       out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6906       out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6907       out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF;
6908       out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION;
6909       if (!elf_flags_init (obfd))
6910         {
6911           /* If the input is the default architecture then do not
6912              bother setting the flags for the output architecture,
6913              instead allow future merges to do this.  If no future
6914              merges ever set these flags then they will retain their
6915              unitialised values, which surprise surprise, correspond
6916              to the default values.  */
6917           if (bfd_get_arch_info (ibfd)->the_default)
6918             return TRUE;
6919
6920           elf_flags_init (obfd) = TRUE;
6921           elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6922
6923           if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6924               && bfd_get_arch_info (obfd)->the_default)
6925             {
6926               return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
6927                                         bfd_get_mach (ibfd));
6928             }
6929
6930           return TRUE;
6931         }
6932
6933       /* Check flag compatibility.  */
6934       if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI))
6935         {
6936           _bfd_error_handler
6937             (_("%pB: error: ABI mismatch with previous modules"), ibfd);
6938           bfd_set_error (bfd_error_bad_value);
6939           return FALSE;
6940         }
6941
6942       if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH))
6943         {
6944           if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH))
6945             {
6946               _bfd_error_handler
6947                 (_("%pB: error: instruction set mismatch with previous modules"),
6948                  ibfd);
6949
6950               bfd_set_error (bfd_error_bad_value);
6951               return FALSE;
6952             }
6953         }
6954
6955       /* When linking with V1.2 and V1.3 objects together the output is V1.2.
6956          and perf ext1 and DIV are mergerd to perf ext1.  */
6957       if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2)
6958         {
6959           elf_elfheader (obfd)->e_flags =
6960             (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6961             | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6962             | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6963                ?  E_NDS32_HAS_EXT_INST : 0)
6964             | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6965                ?  E_NDS32_HAS_EXT_INST : 0)
6966             | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6967             | ((in_version > out_version) ? out_version : in_version);
6968         }
6969       else
6970         {
6971           if (in_version != out_version)
6972             _bfd_error_handler
6973               /* xgettext:c-format */
6974               (_("%pB: warning: incompatible elf-versions %s and %s"),
6975                ibfd, nds32_elfver_strtab[out_version],
6976                nds32_elfver_strtab[in_version]);
6977
6978           elf_elfheader (obfd)->e_flags = in_flags | out_flags
6979             | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6980             | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config)
6981             | (in_version > out_version ?  out_version : in_version);
6982         }
6983     }
6984
6985   return TRUE;
6986 }
6987
6988 /* Display the flags field.  */
6989
6990 static bfd_boolean
6991 nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6992 {
6993   FILE *file = (FILE *) ptr;
6994
6995   BFD_ASSERT (abfd != NULL && ptr != NULL);
6996
6997   _bfd_elf_print_private_bfd_data (abfd, ptr);
6998
6999   fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
7000
7001   switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)
7002     {
7003     default:
7004     case E_N1_ARCH:
7005       fprintf (file, _(": n1 instructions"));
7006       break;
7007     case E_N1H_ARCH:
7008       fprintf (file, _(": n1h instructions"));
7009       break;
7010     }
7011
7012   fputc ('\n', file);
7013
7014   return TRUE;
7015 }
7016
7017 static unsigned int
7018 nds32_elf_action_discarded (asection *sec)
7019 {
7020
7021   if (strncmp
7022       (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0)
7023     return 0;
7024
7025   return _bfd_elf_default_action_discarded (sec);
7026 }
7027
7028 static asection *
7029 nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
7030                         Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
7031                         Elf_Internal_Sym *sym)
7032 {
7033   if (h != NULL)
7034     switch (ELF32_R_TYPE (rel->r_info))
7035       {
7036       case R_NDS32_GNU_VTINHERIT:
7037       case R_NDS32_GNU_VTENTRY:
7038       case R_NDS32_RELA_GNU_VTINHERIT:
7039       case R_NDS32_RELA_GNU_VTENTRY:
7040         return NULL;
7041       }
7042
7043   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
7044 }
7045
7046 static enum elf_nds32_tls_type
7047 get_tls_type (enum elf_nds32_reloc_type r_type,
7048               struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
7049 {
7050   enum elf_nds32_tls_type tls_type;
7051
7052   switch (r_type)
7053     {
7054     case R_NDS32_TLS_LE_HI20:
7055     case R_NDS32_TLS_LE_LO12:
7056       tls_type = GOT_TLS_LE;
7057       break;
7058     case R_NDS32_TLS_IE_HI20:
7059     case R_NDS32_TLS_IE_LO12S2:
7060     case R_NDS32_TLS_IE_LO12:
7061       tls_type = GOT_TLS_IE;
7062       break;
7063     case R_NDS32_TLS_IEGP_HI20:
7064     case R_NDS32_TLS_IEGP_LO12:
7065     case R_NDS32_TLS_IEGP_LO12S2:
7066       tls_type = GOT_TLS_IEGP;
7067       break;
7068     case R_NDS32_TLS_DESC_HI20:
7069     case R_NDS32_TLS_DESC_LO12:
7070     case R_NDS32_TLS_DESC_ADD:
7071     case R_NDS32_TLS_DESC_FUNC:
7072     case R_NDS32_TLS_DESC_CALL:
7073       tls_type = GOT_TLS_DESC;
7074       break;
7075     default:
7076       tls_type = GOT_NORMAL;
7077       break;
7078     }
7079
7080   return tls_type;
7081 }
7082
7083 /* Ensure that we have allocated bookkeeping structures for ABFD's local
7084    symbols.  */
7085
7086 static bfd_boolean
7087 elf32_nds32_allocate_local_sym_info (bfd *abfd)
7088 {
7089   if (elf_local_got_refcounts (abfd) == NULL)
7090     {
7091       bfd_size_type num_syms;
7092       bfd_size_type size;
7093       char *data;
7094
7095       num_syms = elf_tdata (abfd)->symtab_hdr.sh_info;
7096       /* This space is for got_refcounts, got_tls_type, tlsdesc_gotent, and
7097          gp_offset.  The details can refer to struct elf_nds32_obj_tdata.  */
7098       size = num_syms * (sizeof (bfd_signed_vma) + sizeof (char)
7099                          + sizeof (bfd_vma) + sizeof (int)
7100                          + sizeof (bfd_boolean) + sizeof (bfd_vma));
7101       data = bfd_zalloc (abfd, size);
7102       if (data == NULL)
7103         return FALSE;
7104
7105       elf_local_got_refcounts (abfd) = (bfd_signed_vma *) data;
7106       data += num_syms * sizeof (bfd_signed_vma);
7107
7108       elf32_nds32_local_got_tls_type (abfd) = (char *) data;
7109       data += num_syms * sizeof (char);
7110
7111       elf32_nds32_local_tlsdesc_gotent (abfd) = (bfd_vma *) data;
7112       data += num_syms * sizeof (bfd_vma);
7113
7114       elf32_nds32_local_gp_offset (abfd) = (int *) data;
7115       data += num_syms * sizeof (int);
7116     }
7117
7118   return TRUE;
7119 }
7120
7121 /* Look through the relocs for a section during the first phase.
7122    Since we don't do .gots or .plts, we just need to consider the
7123    virtual table relocs for gc.  */
7124
7125 static bfd_boolean
7126 nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
7127                         asection *sec, const Elf_Internal_Rela *relocs)
7128 {
7129   Elf_Internal_Shdr *symtab_hdr;
7130   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
7131   const Elf_Internal_Rela *rel;
7132   const Elf_Internal_Rela *rel_end;
7133   struct elf_link_hash_table *ehtab;
7134   struct elf_nds32_link_hash_table *htab;
7135   bfd *dynobj;
7136   asection *sreloc = NULL;
7137
7138   /* No need for relocation if relocatable already.  */
7139   if (bfd_link_relocatable (info))
7140     {
7141       elf32_nds32_check_relax_group (abfd, sec);
7142       return TRUE;
7143     }
7144
7145   /* Don't do anything special with non-loaded, non-alloced sections.
7146      In particular, any relocs in such sections should not affect GOT
7147      and PLT reference counting (ie. we don't allow them to create GOT
7148      or PLT entries), there's no possibility or desire to optimize TLS
7149      relocs, and there's not much point in propagating relocs to shared
7150      libs that the dynamic linker won't relocate.  */
7151   if ((sec->flags & SEC_ALLOC) == 0)
7152     return TRUE;
7153
7154   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7155   sym_hashes = elf_sym_hashes (abfd);
7156   sym_hashes_end =
7157     sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
7158   if (!elf_bad_symtab (abfd))
7159     sym_hashes_end -= symtab_hdr->sh_info;
7160
7161   ehtab = elf_hash_table (info);
7162   htab = nds32_elf_hash_table (info);
7163   dynobj = htab->root.dynobj;
7164
7165   rel_end = relocs + sec->reloc_count;
7166   for (rel = relocs; rel < rel_end; rel++)
7167     {
7168       enum elf_nds32_reloc_type r_type;
7169       struct elf_link_hash_entry *h;
7170       unsigned long r_symndx;
7171       enum elf_nds32_tls_type tls_type, old_tls_type;
7172
7173       r_symndx = ELF32_R_SYM (rel->r_info);
7174       r_type = ELF32_R_TYPE (rel->r_info);
7175       if (r_symndx < symtab_hdr->sh_info)
7176         h = NULL;
7177       else
7178         {
7179           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7180           while (h->root.type == bfd_link_hash_indirect
7181                  || h->root.type == bfd_link_hash_warning)
7182             h = (struct elf_link_hash_entry *) h->root.u.i.link;
7183         }
7184
7185       /* Create .got section if necessary.
7186          Some relocs require a global offset table.  We create
7187          got section here, since these relocation need a got section
7188          and if it is not created yet.  */
7189       if (ehtab->sgot == NULL)
7190         {
7191           switch (r_type)
7192             {
7193             case R_NDS32_GOT_HI20:
7194             case R_NDS32_GOT_LO12:
7195             case R_NDS32_GOT_LO15:
7196             case R_NDS32_GOT_LO19:
7197             case R_NDS32_GOT17S2_RELA:
7198             case R_NDS32_GOT15S2_RELA:
7199             case R_NDS32_GOTOFF:
7200             case R_NDS32_GOTOFF_HI20:
7201             case R_NDS32_GOTOFF_LO12:
7202             case R_NDS32_GOTOFF_LO15:
7203             case R_NDS32_GOTOFF_LO19:
7204             case R_NDS32_GOTPC20:
7205             case R_NDS32_GOTPC_HI20:
7206             case R_NDS32_GOTPC_LO12:
7207             case R_NDS32_GOT20:
7208             case R_NDS32_TLS_IE_HI20:
7209             case R_NDS32_TLS_IE_LO12:
7210             case R_NDS32_TLS_IE_LO12S2:
7211             case R_NDS32_TLS_IEGP_HI20:
7212             case R_NDS32_TLS_IEGP_LO12:
7213             case R_NDS32_TLS_IEGP_LO12S2:
7214             case R_NDS32_TLS_DESC_HI20:
7215             case R_NDS32_TLS_DESC_LO12:
7216               if (dynobj == NULL)
7217                 htab->root.dynobj = dynobj = abfd;
7218               if (!create_got_section (dynobj, info))
7219                 return FALSE;
7220               break;
7221
7222             default:
7223               break;
7224             }
7225         }
7226
7227       /* Check relocation type.  */
7228       switch ((int) r_type)
7229         {
7230         case R_NDS32_GOT_HI20:
7231         case R_NDS32_GOT_LO12:
7232         case R_NDS32_GOT_LO15:
7233         case R_NDS32_GOT_LO19:
7234         case R_NDS32_GOT20:
7235         case R_NDS32_TLS_LE_HI20:
7236         case R_NDS32_TLS_LE_LO12:
7237         case R_NDS32_TLS_IE_HI20:
7238         case R_NDS32_TLS_IE_LO12:
7239         case R_NDS32_TLS_IE_LO12S2:
7240         case R_NDS32_TLS_IEGP_HI20:
7241         case R_NDS32_TLS_IEGP_LO12:
7242         case R_NDS32_TLS_IEGP_LO12S2:
7243         case R_NDS32_TLS_DESC_HI20:
7244         case R_NDS32_TLS_DESC_LO12:
7245           tls_type = get_tls_type (r_type, h);
7246           if (h)
7247             {
7248               if (tls_type != GOT_TLS_LE)
7249                 h->got.refcount += 1;
7250               old_tls_type = elf32_nds32_hash_entry (h)->tls_type;
7251             }
7252           else
7253             {
7254               /* This is a global offset table entry for a local symbol.  */
7255               if (!elf32_nds32_allocate_local_sym_info (abfd))
7256                 return FALSE;
7257
7258               BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
7259               if (tls_type != GOT_TLS_LE)
7260                 elf_local_got_refcounts (abfd)[r_symndx] += 1;
7261               old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx];
7262             }
7263
7264           /* We would already have issued an error message if there
7265              is a TLS/non-TLS mismatch, based on the symbol
7266              type.  So just combine any TLS types needed.  */
7267           if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
7268               && tls_type != GOT_NORMAL)
7269             tls_type |= old_tls_type;
7270
7271           /* DESC to IE/IEGP if link to executable.  */
7272           if ((tls_type & (GOT_TLS_DESC | GOT_TLS_IEGP))
7273               && (bfd_link_executable (info)))
7274             tls_type |= (bfd_link_pie (info) ? GOT_TLS_IEGP : GOT_TLS_IE);
7275
7276           if (old_tls_type != tls_type)
7277             {
7278               if (h != NULL)
7279                 elf32_nds32_hash_entry (h)->tls_type = tls_type;
7280               else
7281                 elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type;
7282             }
7283           break;
7284         case R_NDS32_9_PLTREL:
7285         case R_NDS32_25_PLTREL:
7286         case R_NDS32_PLTREL_HI20:
7287         case R_NDS32_PLTREL_LO12:
7288         case R_NDS32_PLT_GOTREL_HI20:
7289         case R_NDS32_PLT_GOTREL_LO12:
7290         case R_NDS32_PLT_GOTREL_LO15:
7291         case R_NDS32_PLT_GOTREL_LO19:
7292         case R_NDS32_PLT_GOTREL_LO20:
7293
7294           /* This symbol requires a procedure linkage table entry.  We
7295              actually build the entry in adjust_dynamic_symbol,
7296              because this might be a case of linking PIC code without
7297              linking in any dynamic objects, in which case we don't
7298              need to generate a procedure linkage table after all.  */
7299
7300           /* If this is a local symbol, we resolve it directly without
7301              creating a procedure linkage table entry.  */
7302           if (h == NULL)
7303             continue;
7304
7305           if (h->forced_local
7306               || (bfd_link_pie (info) && h->def_regular))
7307             break;
7308
7309           elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL;
7310           h->needs_plt = 1;
7311           h->plt.refcount += 1;
7312           break;
7313
7314         case R_NDS32_16_RELA:
7315         case R_NDS32_20_RELA:
7316         case R_NDS32_5_RELA:
7317         case R_NDS32_32_RELA:
7318         case R_NDS32_HI20_RELA:
7319         case R_NDS32_LO12S3_RELA:
7320         case R_NDS32_LO12S2_RELA:
7321         case R_NDS32_LO12S2_DP_RELA:
7322         case R_NDS32_LO12S2_SP_RELA:
7323         case R_NDS32_LO12S1_RELA:
7324         case R_NDS32_LO12S0_RELA:
7325         case R_NDS32_LO12S0_ORI_RELA:
7326         case R_NDS32_SDA16S3_RELA:
7327         case R_NDS32_SDA17S2_RELA:
7328         case R_NDS32_SDA18S1_RELA:
7329         case R_NDS32_SDA19S0_RELA:
7330         case R_NDS32_SDA15S3_RELA:
7331         case R_NDS32_SDA15S2_RELA:
7332         case R_NDS32_SDA12S2_DP_RELA:
7333         case R_NDS32_SDA12S2_SP_RELA:
7334         case R_NDS32_SDA15S1_RELA:
7335         case R_NDS32_SDA15S0_RELA:
7336         case R_NDS32_SDA_FP7U2_RELA:
7337         case R_NDS32_15_PCREL_RELA:
7338         case R_NDS32_17_PCREL_RELA:
7339         case R_NDS32_25_PCREL_RELA:
7340
7341           if (h != NULL && !bfd_link_pic (info))
7342             {
7343               h->non_got_ref = 1;
7344               h->plt.refcount += 1;
7345             }
7346
7347           /* If we are creating a shared library, and this is a reloc against
7348              a global symbol, or a non PC relative reloc against a local
7349              symbol, then we need to copy the reloc into the shared library.
7350              However, if we are linking with -Bsymbolic, we do not need to
7351              copy a reloc against a global symbol which is defined in an
7352              object we are including in the link (i.e., DEF_REGULAR is set).
7353              At this point we have not seen all the input files, so it is
7354              possible that DEF_REGULAR is not set now but will be set later
7355              (it is never cleared).  We account for that possibility below by
7356              storing information in the dyn_relocs field of the hash table
7357              entry.  A similar situation occurs when creating shared libraries
7358              and symbol visibility changes render the symbol local.
7359
7360              If on the other hand, we are creating an executable, we may need
7361              to keep relocations for symbols satisfied by a dynamic library
7362              if we manage to avoid copy relocs for the symbol.  */
7363           if ((bfd_link_pic (info)
7364                && (sec->flags & SEC_ALLOC) != 0
7365                && ((r_type != R_NDS32_25_PCREL_RELA
7366                     && r_type != R_NDS32_15_PCREL_RELA
7367                     && r_type != R_NDS32_17_PCREL_RELA
7368                     && !(r_type == R_NDS32_32_RELA
7369                          && strcmp (sec->name, ".eh_frame") == 0))
7370                    || (h != NULL
7371                        && (!info->symbolic
7372                            || h->root.type == bfd_link_hash_defweak
7373                            || !h->def_regular))))
7374               || (!bfd_link_pic (info)
7375                   && (sec->flags & SEC_ALLOC) != 0
7376                   && h != NULL
7377                   && (h->root.type == bfd_link_hash_defweak
7378                       || !h->def_regular)))
7379             {
7380               struct elf_dyn_relocs *p;
7381               struct elf_dyn_relocs **head;
7382
7383               if (dynobj == NULL)
7384                 htab->root.dynobj = dynobj = abfd;
7385
7386               /* When creating a shared object, we must copy these
7387                  relocs into the output file.  We create a reloc
7388                  section in dynobj and make room for the reloc.  */
7389               if (sreloc == NULL)
7390                 {
7391                   const char *name;
7392
7393                   name = bfd_elf_string_from_elf_section
7394                     (abfd, elf_elfheader (abfd)->e_shstrndx,
7395                      elf_section_data (sec)->rela.hdr->sh_name);
7396                   if (name == NULL)
7397                     return FALSE;
7398
7399                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
7400                               && strcmp (bfd_section_name (sec),
7401                                          name + 5) == 0);
7402
7403                   sreloc = bfd_get_section_by_name (dynobj, name);
7404                   if (sreloc == NULL)
7405                     {
7406                       flagword flags;
7407
7408                       sreloc = bfd_make_section (dynobj, name);
7409                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
7410                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
7411                       if ((sec->flags & SEC_ALLOC) != 0)
7412                         flags |= SEC_ALLOC | SEC_LOAD;
7413                       if (sreloc == NULL
7414                           || !bfd_set_section_flags (sreloc, flags)
7415                           || !bfd_set_section_alignment (sreloc, 2))
7416                         return FALSE;
7417
7418                       elf_section_type (sreloc) = SHT_RELA;
7419                     }
7420                   elf_section_data (sec)->sreloc = sreloc;
7421                 }
7422
7423               /* If this is a global symbol, we count the number of
7424                  relocations we need for this symbol.  */
7425               if (h != NULL)
7426                 head = &((struct elf_nds32_link_hash_entry *) h)->dyn_relocs;
7427               else
7428                 {
7429                   asection *s;
7430                   void *vpp;
7431
7432                   Elf_Internal_Sym *isym;
7433                   isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
7434                   if (isym == NULL)
7435                     return FALSE;
7436
7437                   /* Track dynamic relocs needed for local syms too.  */
7438                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
7439                   if (s == NULL)
7440                     return FALSE;
7441
7442                   vpp = &elf_section_data (s)->local_dynrel;
7443                   head = (struct elf_dyn_relocs **) vpp;
7444                 }
7445
7446               p = *head;
7447               if (p == NULL || p->sec != sec)
7448                 {
7449                   size_t amt = sizeof (*p);
7450                   p = (struct elf_dyn_relocs *) bfd_alloc (dynobj, amt);
7451                   if (p == NULL)
7452                     return FALSE;
7453                   p->next = *head;
7454                   *head = p;
7455                   p->sec = sec;
7456                   p->count = 0;
7457                   p->pc_count = 0;
7458                 }
7459
7460               p->count += 1;
7461
7462               /* Since eh_frame is readonly, R_NDS32_32_RELA
7463                  reloc for eh_frame will cause shared library has
7464                  TEXTREL entry in the dynamic section. This lead glibc
7465                  testsuites to failure (bug-13092) and cause kernel fail
7466                  (bug-11819).  I think the best solution is to replace
7467                  absolute reloc with pc relative reloc in the eh_frame.
7468                  To do that, we need to support the following issues:
7469
7470                  === For GCC ===
7471                  * gcc/config/nds32/nds32.h: Define
7472                  ASM_PREFERRED_EH_DATA_FORMAT to encode DW_EH_PE_pcrel
7473                  and DW_EH_PE_sdata4 into DWARF exception header when
7474                  option have '-fpic'.
7475
7476                  === For binutils ===
7477                  * bfd/: Define new reloc R_NDS32_32_PCREL_RELA.
7478                  * gas/config/tc-nds32.h: Define DIFF_EXPR_OK. This
7479                  may break our nds DIFF mechanism, therefore, we
7480                  must disable all linker relaxations to ensure
7481                  correctness.
7482                  * gas/config/tc-nds32.c (nds32_apply_fix): Replace
7483                  R_NDS32_32_RELA with R_NDS32_32_PCREL_RELA, and
7484                  do the necessary modification.
7485
7486                  Unfortunately, it still have some problems for nds32
7487                  to support pc relative reloc in the eh_frame. So I use
7488                  another solution to fix this issue.
7489
7490                  However, I find that ld always emit TEXTREL marker for
7491                  R_NDS32_NONE relocs in rel.dyn. These none relocs are
7492                  correspond to R_NDS32_32_RELA for .eh_frame section.
7493                  It means that we always reserve redundant entries of rel.dyn
7494                  for these relocs which actually do nothing in dynamic linker.
7495
7496                  Therefore, we regard these relocs as pc relative relocs
7497                  here and increase the pc_count.  */
7498               if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA
7499                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
7500                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA
7501                   || (r_type == R_NDS32_32_RELA
7502                       && strcmp (sec->name, ".eh_frame") == 0))
7503                 p->pc_count += 1;
7504             }
7505           break;
7506
7507           /* This relocation describes the C++ object vtable hierarchy.
7508              Reconstruct it for later use during GC.  */
7509         case R_NDS32_RELA_GNU_VTINHERIT:
7510         case R_NDS32_GNU_VTINHERIT:
7511           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
7512             return FALSE;
7513           break;
7514
7515           /* This relocation describes which C++ vtable entries are actually
7516              used.  Record for later use during GC.  */
7517         case R_NDS32_GNU_VTENTRY:
7518           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
7519             return FALSE;
7520           break;
7521         case R_NDS32_RELA_GNU_VTENTRY:
7522           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
7523             return FALSE;
7524           break;
7525         }
7526     }
7527
7528   return TRUE;
7529 }
7530
7531 /* Write VAL in uleb128 format to P, returning a pointer to the
7532    following byte.
7533    This code is copied from elf-attr.c.  */
7534
7535 static bfd_byte *
7536 write_uleb128 (bfd_byte *p, unsigned int val)
7537 {
7538   bfd_byte c;
7539   do
7540     {
7541       c = val & 0x7f;
7542       val >>= 7;
7543       if (val)
7544         c |= 0x80;
7545       *(p++) = c;
7546     }
7547   while (val);
7548   return p;
7549 }
7550
7551 static bfd_signed_vma
7552 calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
7553                   Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
7554 {
7555   bfd_signed_vma foff;
7556   bfd_vma symval, addend;
7557   asection *sym_sec;
7558
7559   /* Get the value of the symbol referred to by the reloc.  */
7560   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
7561     {
7562       Elf_Internal_Sym *isym;
7563
7564       /* A local symbol.  */
7565       isym = isymbuf + ELF32_R_SYM (irel->r_info);
7566
7567       if (isym->st_shndx == SHN_UNDEF)
7568         sym_sec = bfd_und_section_ptr;
7569       else if (isym->st_shndx == SHN_ABS)
7570         sym_sec = bfd_abs_section_ptr;
7571       else if (isym->st_shndx == SHN_COMMON)
7572         sym_sec = bfd_com_section_ptr;
7573       else
7574         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7575       symval = isym->st_value + sym_sec->output_section->vma
7576                + sym_sec->output_offset;
7577     }
7578   else
7579     {
7580       unsigned long indx;
7581       struct elf_link_hash_entry *h;
7582
7583       /* An external symbol.  */
7584       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
7585       h = elf_sym_hashes (abfd)[indx];
7586       BFD_ASSERT (h != NULL);
7587
7588       if (h->root.type != bfd_link_hash_defined
7589           && h->root.type != bfd_link_hash_defweak)
7590         /* This appears to be a reference to an undefined
7591            symbol.  Just ignore it--it will be caught by the
7592            regular reloc processing.  */
7593         return 0;
7594
7595       if (h->root.u.def.section->flags & SEC_MERGE)
7596         {
7597           sym_sec = h->root.u.def.section;
7598           symval = _bfd_merged_section_offset (abfd, &sym_sec,
7599                                                elf_section_data (sym_sec)->sec_info,
7600                                                h->root.u.def.value);
7601           symval = symval + sym_sec->output_section->vma
7602                    + sym_sec->output_offset;
7603         }
7604       else
7605         symval = (h->root.u.def.value
7606                   + h->root.u.def.section->output_section->vma
7607                   + h->root.u.def.section->output_offset);
7608     }
7609
7610   addend = irel->r_addend;
7611
7612   foff = (symval + addend
7613           - (irel->r_offset + sec->output_section->vma + sec->output_offset));
7614   return foff;
7615 }
7616 \f
7617
7618 /* Convert a 32-bit instruction to 16-bit one.
7619    INSN is the input 32-bit instruction, INSN16 is the output 16-bit
7620    instruction.  If INSN_TYPE is not NULL, it the CGEN instruction
7621    type of INSN16.  Return 1 if successful.  */
7622
7623 static int
7624 nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7625                              int *pinsn_type)
7626 {
7627   uint16_t insn16 = 0;
7628   int insn_type = 0;
7629   unsigned long mach = bfd_get_mach (abfd);
7630
7631   if (N32_SH5 (insn) != 0)
7632     return 0;
7633
7634   switch (N32_SUB5 (insn))
7635     {
7636     case N32_ALU1_ADD_SLLI:
7637     case N32_ALU1_ADD_SRLI:
7638       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
7639         {
7640           insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn),
7641                                 N32_RB5 (insn));
7642           insn_type = NDS32_INSN_ADD333;
7643         }
7644       else if (N32_IS_RT4 (insn))
7645         {
7646           if (N32_RT5 (insn) == N32_RA5 (insn))
7647             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn));
7648           else if (N32_RT5 (insn) == N32_RB5 (insn))
7649             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn));
7650           insn_type = NDS32_INSN_ADD45;
7651         }
7652       break;
7653
7654     case N32_ALU1_SUB_SLLI:
7655     case N32_ALU1_SUB_SRLI:
7656       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
7657         {
7658           insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn),
7659                                 N32_RB5 (insn));
7660           insn_type = NDS32_INSN_SUB333;
7661         }
7662       else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
7663         {
7664           insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn));
7665           insn_type = NDS32_INSN_SUB45;
7666         }
7667       break;
7668
7669     case N32_ALU1_AND_SLLI:
7670     case N32_ALU1_AND_SRLI:
7671       /* and $rt, $rt, $rb -> and33 for v3, v3m.  */
7672       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7673           && N32_IS_RB3 (insn))
7674         {
7675           if (N32_RT5 (insn) == N32_RA5 (insn))
7676             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn));
7677           else if (N32_RT5 (insn) == N32_RB5 (insn))
7678             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn));
7679           if (insn16)
7680             insn_type = NDS32_INSN_AND33;
7681         }
7682       break;
7683
7684     case N32_ALU1_XOR_SLLI:
7685     case N32_ALU1_XOR_SRLI:
7686       /* xor $rt, $rt, $rb -> xor33 for v3, v3m.  */
7687       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7688           && N32_IS_RB3 (insn))
7689         {
7690           if (N32_RT5 (insn) == N32_RA5 (insn))
7691             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn));
7692           else if (N32_RT5 (insn) == N32_RB5 (insn))
7693             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn));
7694           if (insn16)
7695             insn_type = NDS32_INSN_XOR33;
7696         }
7697       break;
7698
7699     case N32_ALU1_OR_SLLI:
7700     case N32_ALU1_OR_SRLI:
7701       /* or $rt, $rt, $rb -> or33 for v3, v3m.  */
7702       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7703           && N32_IS_RB3 (insn))
7704         {
7705           if (N32_RT5 (insn) == N32_RA5 (insn))
7706             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn));
7707           else if (N32_RT5 (insn) == N32_RB5 (insn))
7708             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn));
7709           if (insn16)
7710             insn_type = NDS32_INSN_OR33;
7711         }
7712       break;
7713     case N32_ALU1_NOR:
7714       /* nor $rt, $ra, $ra -> not33 for v3, v3m.  */
7715       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn)
7716           && N32_RA5 (insn) == N32_RB5 (insn))
7717         {
7718           insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn));
7719           insn_type = NDS32_INSN_NOT33;
7720         }
7721       break;
7722     case N32_ALU1_SRAI:
7723       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
7724         {
7725           insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn));
7726           insn_type = NDS32_INSN_SRAI45;
7727         }
7728       break;
7729
7730     case N32_ALU1_SRLI:
7731       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
7732         {
7733           insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn));
7734           insn_type = NDS32_INSN_SRLI45;
7735         }
7736       break;
7737
7738     case N32_ALU1_SLLI:
7739       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8)
7740         {
7741           insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn),
7742                                 N32_UB5 (insn));
7743           insn_type = NDS32_INSN_SLLI333;
7744         }
7745       break;
7746
7747     case N32_ALU1_ZEH:
7748       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7749         {
7750           insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn));
7751           insn_type = NDS32_INSN_ZEH33;
7752         }
7753       break;
7754
7755     case N32_ALU1_SEB:
7756       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7757         {
7758           insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn));
7759           insn_type = NDS32_INSN_SEB33;
7760         }
7761       break;
7762
7763     case N32_ALU1_SEH:
7764       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7765         {
7766           insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn));
7767           insn_type = NDS32_INSN_SEH33;
7768         }
7769       break;
7770
7771     case N32_ALU1_SLT:
7772       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
7773         {
7774           /* Implicit r15.  */
7775           insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn));
7776           insn_type = NDS32_INSN_SLT45;
7777         }
7778       break;
7779
7780     case N32_ALU1_SLTS:
7781       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
7782         {
7783           /* Implicit r15.  */
7784           insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn));
7785           insn_type = NDS32_INSN_SLTS45;
7786         }
7787       break;
7788     }
7789
7790   if ((insn16 & 0x8000) == 0)
7791     return 0;
7792
7793   if (pinsn16)
7794     *pinsn16 = insn16;
7795   if (pinsn_type)
7796     *pinsn_type = insn_type;
7797   return 1;
7798 }
7799
7800 static int
7801 nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7802                              int *pinsn_type)
7803 {
7804   uint16_t insn16 = 0;
7805   int insn_type;
7806   unsigned long mach = bfd_get_mach (abfd);
7807
7808   /* TODO: bset, bclr, btgl, btst.  */
7809   if (__GF (insn, 6, 4) != 0)
7810     return 0;
7811
7812   switch (N32_IMMU (insn, 6))
7813     {
7814     case N32_ALU2_MUL:
7815       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7816           && N32_IS_RB3 (insn))
7817         {
7818           if (N32_RT5 (insn) == N32_RA5 (insn))
7819             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn));
7820           else if (N32_RT5 (insn) == N32_RB5 (insn))
7821             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn));
7822           if (insn16)
7823             insn_type = NDS32_INSN_MUL33;
7824         }
7825     }
7826
7827   if ((insn16 & 0x8000) == 0)
7828     return 0;
7829
7830   if (pinsn16)
7831     *pinsn16 = insn16;
7832   if (pinsn_type)
7833     *pinsn_type = insn_type;
7834   return 1;
7835 }
7836
7837 int
7838 nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7839                         int *pinsn_type)
7840 {
7841   int op6;
7842   uint16_t insn16 = 0;
7843   int insn_type = 0;
7844   unsigned long mach = bfd_get_mach (abfd);
7845
7846   /* Decode 32-bit instruction.  */
7847   if (insn & 0x80000000)
7848     {
7849       /* Not 32-bit insn.  */
7850       return 0;
7851     }
7852
7853   op6 = N32_OP6 (insn);
7854
7855   /* Convert it to 16-bit instruction.  */
7856   switch (op6)
7857     {
7858     case N32_OP6_MOVI:
7859       if (IS_WITHIN_S (N32_IMM20S (insn), 5))
7860         {
7861           insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn));
7862           insn_type = NDS32_INSN_MOVI55;
7863         }
7864       else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16
7865                && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn))
7866         {
7867           insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn),
7868                                N32_IMM20S (insn) - 16);
7869           insn_type = NDS32_INSN_MOVPI45;
7870         }
7871       break;
7872
7873     case N32_OP6_ADDI:
7874       if (N32_IMM15S (insn) == 0)
7875         {
7876           /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
7877              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7878           if (mach <= MACH_V2
7879               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7880             {
7881               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7882               insn_type = NDS32_INSN_MOV55;
7883             }
7884         }
7885       else if (N32_IMM15S (insn) > 0)
7886         {
7887           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8)
7888             {
7889               insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn),
7890                                     N32_IMM15S (insn));
7891               insn_type = NDS32_INSN_ADDI333;
7892             }
7893           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7894                    && N32_IMM15S (insn) < 32)
7895             {
7896               insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn));
7897               insn_type = NDS32_INSN_ADDI45;
7898             }
7899           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7900                    && N32_RT5 (insn) == N32_RA5 (insn)
7901                    && N32_IMM15S (insn) < 512)
7902             {
7903               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7904               insn_type = NDS32_INSN_ADDI10_SP;
7905             }
7906           else if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7907                    && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256
7908                    && (N32_IMM15S (insn) % 4 == 0))
7909             {
7910               insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn),
7911                                    N32_IMM15S (insn) >> 2);
7912               insn_type = NDS32_INSN_ADDRI36_SP;
7913             }
7914         }
7915       else
7916         {
7917           /* Less than 0.  */
7918           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8)
7919             {
7920               insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn),
7921                                     0 - N32_IMM15S (insn));
7922               insn_type = NDS32_INSN_SUBI333;
7923             }
7924           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7925                    && N32_IMM15S (insn) > -32)
7926             {
7927               insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn),
7928                                    0 - N32_IMM15S (insn));
7929               insn_type = NDS32_INSN_SUBI45;
7930             }
7931           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7932                    && N32_RT5 (insn) == N32_RA5 (insn)
7933                    && N32_IMM15S (insn) >= -512)
7934             {
7935               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7936               insn_type = NDS32_INSN_ADDI10_SP;
7937             }
7938         }
7939       break;
7940
7941     case N32_OP6_ORI:
7942       if (N32_IMM15S (insn) == 0)
7943         {
7944           /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
7945              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7946           if (mach <= MACH_V2
7947               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7948             {
7949               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7950               insn_type = NDS32_INSN_MOV55;
7951             }
7952         }
7953       break;
7954
7955     case N32_OP6_SUBRI:
7956       if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7957           && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0)
7958         {
7959           insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn));
7960           insn_type = NDS32_INSN_NEG33;
7961         }
7962       break;
7963
7964     case N32_OP6_ANDI:
7965       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7966         {
7967           if (N32_IMM15U (insn) == 1)
7968             {
7969               insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn));
7970               insn_type = NDS32_INSN_XLSB33;
7971             }
7972           else if (N32_IMM15U (insn) == 0x7ff)
7973             {
7974               insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn));
7975               insn_type = NDS32_INSN_X11B33;
7976             }
7977           else if (N32_IMM15U (insn) == 0xff)
7978             {
7979               insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn));
7980               insn_type = NDS32_INSN_ZEB33;
7981             }
7982           else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn)
7983                    && N32_IMM15U (insn) < 256)
7984             {
7985               int imm15u = N32_IMM15U (insn);
7986
7987               if (__builtin_popcount (imm15u) == 1)
7988                 {
7989                   /* BMSKI33 */
7990                   int imm3u = __builtin_ctz (imm15u);
7991
7992                   insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u);
7993                   insn_type = NDS32_INSN_BMSKI33;
7994                 }
7995               else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1)
7996                 {
7997                   /* FEXTI33 */
7998                   int imm3u = __builtin_ctz (imm15u + 1) - 1;
7999
8000                   insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u);
8001                   insn_type = NDS32_INSN_FEXTI33;
8002                 }
8003             }
8004         }
8005       break;
8006
8007     case N32_OP6_SLTI:
8008       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
8009           && IS_WITHIN_U (N32_IMM15S (insn), 5))
8010         {
8011           insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn));
8012           insn_type = NDS32_INSN_SLTI45;
8013         }
8014       break;
8015
8016     case N32_OP6_SLTSI:
8017       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
8018           && IS_WITHIN_U (N32_IMM15S (insn), 5))
8019         {
8020           insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn));
8021           insn_type = NDS32_INSN_SLTSI45;
8022         }
8023       break;
8024
8025     case N32_OP6_LWI:
8026       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
8027         {
8028           insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn));
8029           insn_type = NDS32_INSN_LWI450;
8030         }
8031       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8032                && IS_WITHIN_U (N32_IMM15S (insn), 3))
8033         {
8034           insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn),
8035                                 N32_IMM15S (insn));
8036           insn_type = NDS32_INSN_LWI333;
8037         }
8038       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
8039                && IS_WITHIN_U (N32_IMM15S (insn), 7))
8040         {
8041           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
8042           insn_type = NDS32_INSN_LWI37;
8043         }
8044       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
8045                && IS_WITHIN_U (N32_IMM15S (insn), 7))
8046         {
8047           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn));
8048           insn_type = NDS32_INSN_LWI37_SP;
8049         }
8050       else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8
8051                && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0)
8052         {
8053           insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn),
8054                                N32_IMM15S (insn) + 32);
8055           insn_type = NDS32_INSN_LWI45_FE;
8056         }
8057       break;
8058
8059     case N32_OP6_SWI:
8060       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
8061         {
8062           insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn));
8063           insn_type = NDS32_INSN_SWI450;
8064         }
8065       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8066                && IS_WITHIN_U (N32_IMM15S (insn), 3))
8067         {
8068           insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn),
8069                                 N32_IMM15S (insn));
8070           insn_type = NDS32_INSN_SWI333;
8071         }
8072       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
8073                && IS_WITHIN_U (N32_IMM15S (insn), 7))
8074         {
8075           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
8076           insn_type = NDS32_INSN_SWI37;
8077         }
8078       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
8079                && IS_WITHIN_U (N32_IMM15S (insn), 7))
8080         {
8081           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn));
8082           insn_type = NDS32_INSN_SWI37_SP;
8083         }
8084       break;
8085
8086     case N32_OP6_LWI_BI:
8087       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8088           && IS_WITHIN_U (N32_IMM15S (insn), 3))
8089         {
8090           insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
8091                                 N32_IMM15S (insn));
8092           insn_type = NDS32_INSN_LWI333_BI;
8093         }
8094       break;
8095
8096     case N32_OP6_SWI_BI:
8097       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8098           && IS_WITHIN_U (N32_IMM15S (insn), 3))
8099         {
8100           insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
8101                                 N32_IMM15S (insn));
8102           insn_type = NDS32_INSN_SWI333_BI;
8103         }
8104       break;
8105
8106     case N32_OP6_LHI:
8107       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8108           && IS_WITHIN_U (N32_IMM15S (insn), 3))
8109         {
8110           insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn),
8111                                 N32_IMM15S (insn));
8112           insn_type = NDS32_INSN_LHI333;
8113         }
8114       break;
8115
8116     case N32_OP6_SHI:
8117       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8118           && IS_WITHIN_U (N32_IMM15S (insn), 3))
8119         {
8120           insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn),
8121                                 N32_IMM15S (insn));
8122           insn_type = NDS32_INSN_SHI333;
8123         }
8124       break;
8125
8126     case N32_OP6_LBI:
8127       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8128           && IS_WITHIN_U (N32_IMM15S (insn), 3))
8129         {
8130           insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn),
8131                                 N32_IMM15S (insn));
8132           insn_type = NDS32_INSN_LBI333;
8133         }
8134       break;
8135
8136     case N32_OP6_SBI:
8137       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
8138           && IS_WITHIN_U (N32_IMM15S (insn), 3))
8139         {
8140           insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn),
8141                                 N32_IMM15S (insn));
8142           insn_type = NDS32_INSN_SBI333;
8143         }
8144       break;
8145
8146     case N32_OP6_ALU1:
8147       return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type);
8148
8149     case N32_OP6_ALU2:
8150       return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type);
8151
8152     case N32_OP6_BR1:
8153       if (!IS_WITHIN_S (N32_IMM14S (insn), 8))
8154         goto done;
8155
8156       if ((insn & N32_BIT (14)) == 0)
8157         {
8158           /* N32_BR1_BEQ */
8159           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
8160               && N32_RT5 (insn) != REG_R5)
8161             insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn));
8162           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
8163                    && N32_RA5 (insn) != REG_R5)
8164             insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn));
8165           insn_type = NDS32_INSN_BEQS38;
8166           break;
8167         }
8168       else
8169         {
8170           /* N32_BR1_BNE */
8171           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
8172               && N32_RT5 (insn) != REG_R5)
8173             insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn));
8174           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
8175                    && N32_RA5 (insn) != REG_R5)
8176             insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn));
8177           insn_type = NDS32_INSN_BNES38;
8178           break;
8179         }
8180       break;
8181
8182     case N32_OP6_BR2:
8183       switch (N32_BR2_SUB (insn))
8184         {
8185         case N32_BR2_BEQZ:
8186           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
8187             {
8188               insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn));
8189               insn_type = NDS32_INSN_BEQZ38;
8190             }
8191           else if (N32_RT5 (insn) == REG_R15
8192                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
8193             {
8194               insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn));
8195               insn_type = NDS32_INSN_BEQZS8;
8196             }
8197           break;
8198
8199         case N32_BR2_BNEZ:
8200           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
8201             {
8202               insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn));
8203               insn_type = NDS32_INSN_BNEZ38;
8204             }
8205           else if (N32_RT5 (insn) == REG_R15
8206                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
8207             {
8208               insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn));
8209               insn_type = NDS32_INSN_BNEZS8;
8210             }
8211           break;
8212
8213         case N32_BR2_SOP0:
8214           if (__GF (insn, 20, 5) == 0 && IS_WITHIN_U (N32_IMM16S (insn), 9))
8215             {
8216               insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn));
8217               insn_type = NDS32_INSN_IFCALL9;
8218             }
8219           break;
8220         }
8221       break;
8222
8223     case N32_OP6_JI:
8224       if ((insn & N32_BIT (24)) == 0)
8225         {
8226           /* N32_JI_J */
8227           if (IS_WITHIN_S (N32_IMM24S (insn), 8))
8228             {
8229               insn16 = N16_TYPE8 (J8, N32_IMM24S (insn));
8230               insn_type = NDS32_INSN_J8;
8231             }
8232         }
8233       break;
8234
8235     case N32_OP6_JREG:
8236       if (__GF (insn, 8, 2) != 0)
8237         goto done;
8238
8239       switch (N32_IMMU (insn, 5))
8240         {
8241         case N32_JREG_JR:
8242           if (N32_JREG_HINT (insn) == 0)
8243             {
8244               /* jr */
8245               insn16 = N16_TYPE5 (JR5, N32_RB5 (insn));
8246               insn_type = NDS32_INSN_JR5;
8247             }
8248           else if (N32_JREG_HINT (insn) == 1)
8249             {
8250               /* ret */
8251               insn16 = N16_TYPE5 (RET5, N32_RB5 (insn));
8252               insn_type = NDS32_INSN_RET5;
8253             }
8254           else if (N32_JREG_HINT (insn) == 3)
8255             {
8256               /* ifret = mov55 $sp, $sp */
8257               insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP);
8258               insn_type = NDS32_INSN_IFRET;
8259             }
8260           break;
8261
8262         case N32_JREG_JRAL:
8263           /* It's convertible when return rt5 is $lp and address
8264              translation is kept.  */
8265           if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0)
8266             {
8267               insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn));
8268               insn_type = NDS32_INSN_JRAL5;
8269             }
8270           break;
8271         }
8272       break;
8273
8274     case N32_OP6_MISC:
8275       if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32)
8276         {
8277           /* For v3, swid above 31 are used for ex9.it.  */
8278           insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn));
8279           insn_type = NDS32_INSN_BREAK16;
8280         }
8281       break;
8282
8283     default:
8284       /* This instruction has no 16-bit variant.  */
8285       goto done;
8286     }
8287
8288  done:
8289   /* Bit-15 of insn16 should be set for a valid instruction.  */
8290   if ((insn16 & 0x8000) == 0)
8291     return 0;
8292
8293   if (pinsn16)
8294     *pinsn16 = insn16;
8295   if (pinsn_type)
8296     *pinsn_type = insn_type;
8297   return 1;
8298 }
8299
8300 static int
8301 special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16,
8302                           Elf_Internal_Rela *reloc)
8303 {
8304   uint16_t insn16 = 0;
8305
8306   if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0
8307       || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16))
8308     return 0;
8309
8310   if (!N32_IS_RT3 (insn))
8311     return 0;
8312
8313   switch (N32_OP6 (insn))
8314     {
8315     case N32_OP6_LWI:
8316       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
8317         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
8318       break;
8319     case N32_OP6_SWI:
8320       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
8321         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
8322       break;
8323     case N32_OP6_HWGP:
8324       if (!IS_WITHIN_U (N32_IMM17S (insn), 7))
8325         break;
8326
8327       if (__GF (insn, 17, 3) == 6)
8328         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn));
8329       else if (__GF (insn, 17, 3) == 7)
8330         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn));
8331       break;
8332     }
8333
8334   if ((insn16 & 0x8000) == 0)
8335     return 0;
8336
8337   *pinsn16 = insn16;
8338   return 1;
8339 }
8340
8341 /* Convert a 16-bit instruction to 32-bit one.
8342    INSN16 it the input and PINSN it the point to output.
8343    Return non-zero on successful.  Otherwise 0 is returned.  */
8344
8345 int
8346 nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn)
8347 {
8348   uint32_t insn = 0xffffffff;
8349   unsigned long mach = bfd_get_mach (abfd);
8350
8351   /* NOTE: push25, pop25 and movd44 do not have 32-bit variants.  */
8352
8353   switch (__GF (insn16, 9, 6))
8354     {
8355     case 0x4:                   /* add45 */
8356       insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16),
8357                        N16_RA5 (insn16));
8358       goto done;
8359     case 0x5:                   /* sub45 */
8360       insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16),
8361                        N16_RA5 (insn16));
8362       goto done;
8363     case 0x6:                   /* addi45 */
8364       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
8365                         N16_IMM5U (insn16));
8366       goto done;
8367     case 0x7:                   /* subi45 */
8368       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
8369                         -N16_IMM5U (insn16));
8370       goto done;
8371     case 0x8:                   /* srai45 */
8372       insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16),
8373                        N16_IMM5U (insn16));
8374       goto done;
8375     case 0x9:                   /* srli45 */
8376       insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16),
8377                        N16_IMM5U (insn16));
8378       goto done;
8379     case 0xa:                   /* slli333 */
8380       insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16),
8381                        N16_IMM3U (insn16));
8382       goto done;
8383     case 0xc:                   /* add333 */
8384       insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16),
8385                        N16_RB3 (insn16));
8386       goto done;
8387     case 0xd:                   /* sub333 */
8388       insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16),
8389                        N16_RB3 (insn16));
8390       goto done;
8391     case 0xe:                   /* addi333 */
8392       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
8393                         N16_IMM3U (insn16));
8394       goto done;
8395     case 0xf:                   /* subi333 */
8396       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
8397                         -N16_IMM3U (insn16));
8398       goto done;
8399     case 0x10:                  /* lwi333 */
8400       insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16),
8401                         N16_IMM3U (insn16));
8402       goto done;
8403     case 0x12:                  /* lhi333 */
8404       insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16),
8405                         N16_IMM3U (insn16));
8406       goto done;
8407     case 0x13:                  /* lbi333 */
8408       insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16),
8409                         N16_IMM3U (insn16));
8410       goto done;
8411     case 0x11:                  /* lwi333.bi */
8412       insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
8413                         N16_IMM3U (insn16));
8414       goto done;
8415     case 0x14:                  /* swi333 */
8416       insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16),
8417                         N16_IMM3U (insn16));
8418       goto done;
8419     case 0x16:                  /* shi333 */
8420       insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16),
8421                         N16_IMM3U (insn16));
8422       goto done;
8423     case 0x17:                  /* sbi333 */
8424       insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16),
8425                         N16_IMM3U (insn16));
8426       goto done;
8427     case 0x15:                  /* swi333.bi */
8428       insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
8429                         N16_IMM3U (insn16));
8430       goto done;
8431     case 0x18:                  /* addri36.sp */
8432       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP,
8433                         N16_IMM6U (insn16) << 2);
8434       goto done;
8435     case 0x19:                  /* lwi45.fe */
8436       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8,
8437                         (N16_IMM5U (insn16) - 32));
8438       goto done;
8439     case 0x1a:                  /* lwi450 */
8440       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
8441       goto done;
8442     case 0x1b:                  /* swi450 */
8443       insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
8444       goto done;
8445
8446       /* These are r15 implied instructions.  */
8447     case 0x30:                  /* slts45 */
8448       insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
8449       goto done;
8450     case 0x31:                  /* slt45 */
8451       insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
8452       goto done;
8453     case 0x32:                  /* sltsi45 */
8454       insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
8455       goto done;
8456     case 0x33:                  /* slti45 */
8457       insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
8458       goto done;
8459     case 0x34:                  /* beqzs8, bnezs8 */
8460       if (insn16 & N32_BIT (8))
8461         insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16));
8462       else
8463         insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16));
8464       goto done;
8465
8466     case 0x35:                  /* break16, ex9.it */
8467       /* Only consider range of v3 break16.  */
8468       insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK);
8469       goto done;
8470
8471     case 0x3c:                  /* ifcall9 */
8472       insn = N32_BR2 (SOP0, 0, N16_IMM9U (insn16));
8473       goto done;
8474     case 0x3d:                  /* movpi45 */
8475       insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16);
8476       goto done;
8477
8478     case 0x3f:                  /* MISC33 */
8479       switch (insn16 & 0x7)
8480         {
8481         case 2:                 /* neg33 */
8482           insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8483           break;
8484         case 3:                 /* not33 */
8485           insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16),
8486                            N16_RA3 (insn16));
8487           break;
8488         case 4:                 /* mul33 */
8489           insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16),
8490                            N16_RA3 (insn16));
8491           break;
8492         case 5:                 /* xor33 */
8493           insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16),
8494                            N16_RA3 (insn16));
8495           break;
8496         case 6:                 /* and33 */
8497           insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16),
8498                            N16_RA3 (insn16));
8499           break;
8500         case 7:                 /* or33 */
8501           insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16),
8502                            N16_RA3 (insn16));
8503           break;
8504         }
8505       goto done;
8506
8507     case 0xb:
8508       switch (insn16 & 0x7)
8509         {
8510         case 0:                 /* zeb33 */
8511           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff);
8512           break;
8513         case 1:                 /* zeh33 */
8514           insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8515           break;
8516         case 2:                 /* seb33 */
8517           insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8518           break;
8519         case 3:                 /* seh33 */
8520           insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
8521           break;
8522         case 4:                 /* xlsb33 */
8523           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1);
8524           break;
8525         case 5:                 /* x11b33 */
8526           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff);
8527           break;
8528         case 6:                 /* bmski33 */
8529           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
8530                             1 << __GF (insn16, 3, 3));
8531           break;
8532         case 7:                 /* fexti33 */
8533           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
8534                             (1 << (__GF (insn16, 3, 3) + 1)) - 1);
8535           break;
8536         }
8537       goto done;
8538     }
8539
8540   switch (__GF (insn16, 10, 5))
8541     {
8542     case 0x0:                   /* mov55 or ifret16 */
8543       if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP
8544           && N16_RT5 (insn16) == N16_RA5 (insn16))
8545         insn = N32_JREG (JR, 0, 0, 0, 3);
8546       else
8547         insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0);
8548       goto done;
8549     case 0x1:                   /* movi55 */
8550       insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16));
8551       goto done;
8552     case 0x1b:                  /* addi10s (V2) */
8553       insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16));
8554       goto done;
8555     }
8556
8557   switch (__GF (insn16, 11, 4))
8558     {
8559     case 0x7:                   /* lwi37.fp/swi37.fp */
8560       if (insn16 & N32_BIT (7)) /* swi37.fp */
8561         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
8562       else                      /* lwi37.fp */
8563         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
8564       goto done;
8565     case 0x8:                   /* beqz38 */
8566       insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16));
8567       goto done;
8568     case 0x9:                   /* bnez38 */
8569       insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16));
8570       goto done;
8571     case 0xa:                   /* beqs38/j8, implied r5 */
8572       if (N16_RT38 (insn16) == 5)
8573         insn = N32_JI (J, N16_IMM8S (insn16));
8574       else
8575         insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
8576       goto done;
8577     case 0xb:                   /* bnes38 and others.  */
8578       if (N16_RT38 (insn16) == 5)
8579         {
8580           switch (__GF (insn16, 5, 3))
8581             {
8582             case 0:             /* jr5 */
8583               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0);
8584               break;
8585             case 4:             /* ret5 */
8586               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1);
8587               break;
8588             case 1:             /* jral5 */
8589               insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0);
8590               break;
8591             case 2:             /* ex9.it imm5 */
8592               /* ex9.it had no 32-bit variantl.  */
8593               break;
8594             case 5:             /* add5.pc */
8595               /* add5.pc had no 32-bit variantl.  */
8596               break;
8597             }
8598         }
8599       else                      /* bnes38 */
8600         insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
8601       goto done;
8602     case 0xe:                   /* lwi37/swi37 */
8603       if (insn16 & (1 << 7))    /* swi37.sp */
8604         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
8605       else                      /* lwi37.sp */
8606         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
8607       goto done;
8608     }
8609
8610  done:
8611   if (insn & 0x80000000)
8612     return 0;
8613
8614   if (pinsn)
8615     *pinsn = insn;
8616   return 1;
8617 }
8618 \f
8619
8620 static bfd_boolean
8621 is_sda_access_insn (unsigned long insn)
8622 {
8623   switch (N32_OP6 (insn))
8624     {
8625     case N32_OP6_LWI:
8626     case N32_OP6_LHI:
8627     case N32_OP6_LHSI:
8628     case N32_OP6_LBI:
8629     case N32_OP6_LBSI:
8630     case N32_OP6_SWI:
8631     case N32_OP6_SHI:
8632     case N32_OP6_SBI:
8633     case N32_OP6_LWC:
8634     case N32_OP6_LDC:
8635     case N32_OP6_SWC:
8636     case N32_OP6_SDC:
8637       return TRUE;
8638     default:
8639       ;
8640     }
8641   return FALSE;
8642 }
8643
8644 static unsigned long
8645 turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn)
8646 {
8647   uint32_t oinsn = 0;
8648
8649   switch (type)
8650     {
8651     case R_NDS32_GOT_LO12:
8652     case R_NDS32_GOTOFF_LO12:
8653     case R_NDS32_PLTREL_LO12:
8654     case R_NDS32_PLT_GOTREL_LO12:
8655     case R_NDS32_LO12S0_RELA:
8656       switch (N32_OP6 (insn))
8657         {
8658         case N32_OP6_LBI:
8659           /* lbi.gp */
8660           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
8661           break;
8662         case N32_OP6_LBSI:
8663           /* lbsi.gp */
8664           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), N32_BIT (19));
8665           break;
8666         case N32_OP6_SBI:
8667           /* sbi.gp */
8668           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
8669           break;
8670         case N32_OP6_ORI:
8671           /* addi.gp */
8672           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), N32_BIT (19));
8673           break;
8674         }
8675       break;
8676
8677     case R_NDS32_LO12S1_RELA:
8678       switch (N32_OP6 (insn))
8679         {
8680         case N32_OP6_LHI:
8681           /* lhi.gp */
8682           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
8683           break;
8684         case N32_OP6_LHSI:
8685           /* lhsi.gp */
8686           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (18));
8687           break;
8688         case N32_OP6_SHI:
8689           /* shi.gp */
8690           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), N32_BIT (19));
8691           break;
8692         }
8693       break;
8694
8695     case R_NDS32_LO12S2_RELA:
8696       switch (N32_OP6 (insn))
8697         {
8698         case N32_OP6_LWI:
8699           /* lwi.gp */
8700           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
8701           break;
8702         case N32_OP6_SWI:
8703           /* swi.gp */
8704           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
8705           break;
8706         }
8707       break;
8708
8709     case R_NDS32_LO12S2_DP_RELA:
8710     case R_NDS32_LO12S2_SP_RELA:
8711       oinsn = (insn & 0x7ff07000) | (REG_GP << 15);
8712       break;
8713     }
8714
8715   if (oinsn)
8716     *pinsn = oinsn;
8717
8718   return oinsn != 0;
8719 }
8720
8721 /* Linker hasn't found the correct merge section for non-section symbol
8722    in relax time, this work is left to the function elf_link_input_bfd().
8723    So for non-section symbol, _bfd_merged_section_offset is also needed
8724    to find the correct symbol address.  */
8725
8726 static bfd_vma
8727 nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym,
8728                           asection **psec, Elf_Internal_Rela *rel)
8729 {
8730   asection *sec = *psec;
8731   bfd_vma relocation;
8732
8733   relocation = (sec->output_section->vma
8734                 + sec->output_offset + sym->st_value);
8735   if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
8736     {
8737       if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
8738         rel->r_addend =
8739           _bfd_merged_section_offset (abfd, psec,
8740                                       elf_section_data (sec)->sec_info,
8741                                       sym->st_value + rel->r_addend);
8742       else
8743         rel->r_addend =
8744           _bfd_merged_section_offset (abfd, psec,
8745                                       elf_section_data (sec)->sec_info,
8746                                       sym->st_value) + rel->r_addend;
8747
8748       if (sec != *psec)
8749         {
8750           /* If we have changed the section, and our original section is
8751              marked with SEC_EXCLUDE, it means that the original
8752              SEC_MERGE section has been completely subsumed in some
8753              other SEC_MERGE section.  In this case, we need to leave
8754              some info around for --emit-relocs.  */
8755           if ((sec->flags & SEC_EXCLUDE) != 0)
8756             sec->kept_section = *psec;
8757           sec = *psec;
8758         }
8759       rel->r_addend -= relocation;
8760       rel->r_addend += sec->output_section->vma + sec->output_offset;
8761     }
8762   return relocation;
8763 }
8764
8765 static bfd_vma
8766 calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel,
8767                           Elf_Internal_Sym *isymbuf,
8768                           Elf_Internal_Shdr *symtab_hdr)
8769 {
8770   bfd_signed_vma foff;
8771   bfd_vma symval, addend;
8772   Elf_Internal_Rela irel_fn;
8773   Elf_Internal_Sym *isym;
8774   asection *sym_sec;
8775
8776   /* Get the value of the symbol referred to by the reloc.  */
8777   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
8778     {
8779       /* A local symbol.  */
8780       isym = isymbuf + ELF32_R_SYM (irel->r_info);
8781
8782       if (isym->st_shndx == SHN_UNDEF)
8783         sym_sec = bfd_und_section_ptr;
8784       else if (isym->st_shndx == SHN_ABS)
8785         sym_sec = bfd_abs_section_ptr;
8786       else if (isym->st_shndx == SHN_COMMON)
8787         sym_sec = bfd_com_section_ptr;
8788       else
8789         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
8790       memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela));
8791       symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn);
8792       addend = irel_fn.r_addend;
8793     }
8794   else
8795     {
8796       unsigned long indx;
8797       struct elf_link_hash_entry *h;
8798
8799       /* An external symbol.  */
8800       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
8801       h = elf_sym_hashes (abfd)[indx];
8802       BFD_ASSERT (h != NULL);
8803
8804       while (h->root.type == bfd_link_hash_indirect
8805              || h->root.type == bfd_link_hash_warning)
8806         h = (struct elf_link_hash_entry *) h->root.u.i.link;
8807
8808       if (h->root.type != bfd_link_hash_defined
8809           && h->root.type != bfd_link_hash_defweak)
8810         /* This appears to be a reference to an undefined
8811            symbol.  Just ignore it--it will be caught by the
8812            regular reloc processing.  */
8813         return 0;
8814
8815       if (h->root.u.def.section->flags & SEC_MERGE)
8816         {
8817           sym_sec = h->root.u.def.section;
8818           symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
8819                                                (sym_sec)->sec_info, h->root.u.def.value);
8820           symval = symval + sym_sec->output_section->vma
8821                    + sym_sec->output_offset;
8822         }
8823       else
8824         symval = (h->root.u.def.value
8825                   + h->root.u.def.section->output_section->vma
8826                   + h->root.u.def.section->output_offset);
8827       addend = irel->r_addend;
8828     }
8829
8830   foff = symval + addend;
8831
8832   return foff;
8833 }
8834
8835 static int
8836 is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED,
8837               asection *sec, Elf_Internal_Rela *rel)
8838 {
8839   bfd_byte *contents;
8840   unsigned short insn16;
8841
8842   if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG))
8843     return FALSE;
8844   contents = elf_section_data (sec)->this_hdr.contents;
8845   insn16 = bfd_getb16 (contents + rel->r_offset);
8846   if (insn16 == NDS32_NOP16)
8847     return TRUE;
8848   return FALSE;
8849 }
8850
8851 /* It checks whether the instruction could be converted to
8852    16-bit form and returns the converted one.
8853
8854    `internal_relocs' is supposed to be sorted.  */
8855
8856 static int
8857 is_convert_32_to_16 (bfd *abfd, asection *sec,
8858                      Elf_Internal_Rela *reloc,
8859                      Elf_Internal_Rela *internal_relocs,
8860                      Elf_Internal_Rela *irelend,
8861                      uint16_t *insn16)
8862 {
8863 #define NORMAL_32_TO_16 (1 << 0)
8864 #define SPECIAL_32_TO_16 (1 << 1)
8865   bfd_byte *contents = NULL;
8866   bfd_signed_vma off;
8867   bfd_vma mem_addr;
8868   uint32_t insn = 0;
8869   Elf_Internal_Rela *pc_rel;
8870   Elf_Internal_Shdr *symtab_hdr;
8871   Elf_Internal_Sym *isymbuf = NULL;
8872   int convert_type;
8873   bfd_vma offset;
8874
8875   if (reloc->r_offset + 4 > sec->size)
8876     return FALSE;
8877
8878   offset = reloc->r_offset;
8879
8880   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
8881     return FALSE;
8882   insn = bfd_getb32 (contents + offset);
8883
8884   if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL))
8885     convert_type = NORMAL_32_TO_16;
8886   else if (special_convert_32_to_16 (insn, insn16, reloc))
8887     convert_type = SPECIAL_32_TO_16;
8888   else
8889     return FALSE;
8890
8891   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8892   if (!nds32_get_local_syms (abfd, sec, &isymbuf))
8893     return FALSE;
8894
8895   /* Find the first relocation of the same relocation-type,
8896      so we iteratie them forward.  */
8897   pc_rel = reloc;
8898   while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset)
8899     pc_rel--;
8900
8901   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8902     {
8903       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8904           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8905           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA
8906           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8907         {
8908           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr);
8909           if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1
8910               || off == 0)
8911             return FALSE;
8912           break;
8913         }
8914       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8915         {
8916           /* movi => movi55  */
8917           mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf,
8918                                                symtab_hdr);
8919           /* mem_addr is unsigned, but the value should
8920              be between [-16, 15].  */
8921           if ((mem_addr + 0x10) >> 5)
8922             return FALSE;
8923           break;
8924         }
8925       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20)
8926                || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12))
8927         {
8928           /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
8929              because it can be relaxed to addi for TLS_LE_ADD.  */
8930           return FALSE;
8931         }
8932       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8933                 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8934                && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG)
8935                && convert_type == SPECIAL_32_TO_16)
8936         {
8937           /* fp-as-gp
8938              We've selected a best fp-base for this access, so we can
8939              always resolve it anyway.  Do nothing.  */
8940           break;
8941         }
8942       else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE
8943                 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT))
8944                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY)
8945                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16))
8946                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE)
8947                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA)))
8948         {
8949           /* Prevent unresolved addi instruction translate
8950              to addi45 or addi333.  */
8951           return FALSE;
8952         }
8953       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8954         {
8955           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr);
8956           if (off >= ACCURATE_U9BIT_S1 || off <= 0)
8957             return FALSE;
8958           break;
8959         }
8960     }
8961
8962   return TRUE;
8963 }
8964
8965 static void
8966 nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents,
8967                     Elf_Internal_Rela *reloc,
8968                     Elf_Internal_Rela *internal_relocs,
8969                     Elf_Internal_Rela *irelend,
8970                     unsigned short insn16)
8971 {
8972   Elf_Internal_Rela *pc_rel;
8973   bfd_vma offset;
8974
8975   offset = reloc->r_offset;
8976   bfd_putb16 (insn16, contents + offset);
8977   /* Find the first relocation of the same relocation-type,
8978      so we iteratie them forward.  */
8979   pc_rel = reloc;
8980   while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset)
8981     pc_rel--;
8982
8983   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8984     {
8985       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8986           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8987           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA)
8988         {
8989           pc_rel->r_info =
8990             ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA);
8991         }
8992       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8993         pc_rel->r_info =
8994           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL);
8995       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8996         pc_rel->r_info =
8997           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA);
8998       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8999                || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
9000         pc_rel->r_info =
9001           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA);
9002       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
9003         pc_rel->r_info =
9004           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA);
9005     }
9006 }
9007
9008 /* Find a relocation of type specified by `reloc_type'
9009    of the same r_offset with reloc.
9010    If not found, return irelend.
9011
9012    Assuming relocations are sorted by r_offset,
9013    we find the relocation from `reloc' backward untill relocs,
9014    or find it from `reloc' forward untill irelend.  */
9015
9016 static Elf_Internal_Rela *
9017 find_relocs_at_address (Elf_Internal_Rela *reloc,
9018                         Elf_Internal_Rela *relocs,
9019                         Elf_Internal_Rela *irelend,
9020                         enum elf_nds32_reloc_type reloc_type)
9021 {
9022   Elf_Internal_Rela *rel_t;
9023
9024   /* Find backward.  */
9025   for (rel_t = reloc;
9026        rel_t >= relocs && rel_t->r_offset == reloc->r_offset;
9027        rel_t--)
9028     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
9029       return rel_t;
9030
9031   /* We didn't find it backward.  Try find it forward.  */
9032   for (rel_t = reloc;
9033        rel_t < irelend && rel_t->r_offset == reloc->r_offset;
9034        rel_t++)
9035     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
9036       return rel_t;
9037
9038   return irelend;
9039 }
9040
9041 /* Find a relocation of specified type and offset.
9042    `reloc' is just a refence point to find a relocation at specified offset.
9043    If not found, return irelend.
9044
9045    Assuming relocations are sorted by r_offset,
9046    we find the relocation from `reloc' backward untill relocs,
9047    or find it from `reloc' forward untill irelend.  */
9048
9049 static Elf_Internal_Rela *
9050 find_relocs_at_address_addr (Elf_Internal_Rela *reloc,
9051                              Elf_Internal_Rela *relocs,
9052                              Elf_Internal_Rela *irelend,
9053                              enum elf_nds32_reloc_type reloc_type,
9054                              bfd_vma offset_p)
9055 {
9056   Elf_Internal_Rela *rel_t = NULL;
9057
9058   /* First, we try to find a relocation of offset `offset_p',
9059      and then we use find_relocs_at_address to find specific type.  */
9060
9061   if (reloc->r_offset > offset_p)
9062     {
9063       /* Find backward.  */
9064       for (rel_t = reloc;
9065            rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--)
9066         /* Do nothing.  */;
9067     }
9068   else if (reloc->r_offset < offset_p)
9069     {
9070       /* Find forward.  */
9071       for (rel_t = reloc;
9072            rel_t < irelend && rel_t->r_offset < offset_p; rel_t++)
9073         /* Do nothing.  */;
9074     }
9075   else
9076     rel_t = reloc;
9077
9078   /* Not found?  */
9079   if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p)
9080     return irelend;
9081
9082   return find_relocs_at_address (rel_t, relocs, irelend, reloc_type);
9083 }
9084
9085 typedef struct nds32_elf_blank nds32_elf_blank_t;
9086 struct nds32_elf_blank
9087 {
9088   /* Where the blank begins.  */
9089   bfd_vma offset;
9090   /* The size of the blank.  */
9091   bfd_vma size;
9092   /* The accumulative size before this blank.  */
9093   bfd_vma total_size;
9094   nds32_elf_blank_t *next;
9095   nds32_elf_blank_t *prev;
9096 };
9097
9098 static nds32_elf_blank_t *blank_free_list = NULL;
9099
9100 static nds32_elf_blank_t *
9101 create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p)
9102 {
9103   nds32_elf_blank_t *blank_t;
9104
9105   if (blank_free_list)
9106     {
9107       blank_t = blank_free_list;
9108       blank_free_list = blank_free_list->next;
9109     }
9110   else
9111     blank_t = bfd_malloc (sizeof (nds32_elf_blank_t));
9112
9113   if (blank_t == NULL)
9114     return NULL;
9115
9116   blank_t->offset = offset_p;
9117   blank_t->size = size_p;
9118   blank_t->total_size = 0;
9119   blank_t->next = NULL;
9120   blank_t->prev = NULL;
9121
9122   return blank_t;
9123 }
9124
9125 static void
9126 remove_nds32_elf_blank (nds32_elf_blank_t *blank_p)
9127 {
9128   if (blank_free_list)
9129     {
9130       blank_free_list->prev = blank_p;
9131       blank_p->next = blank_free_list;
9132     }
9133   else
9134     blank_p->next = NULL;
9135
9136   blank_p->prev = NULL;
9137   blank_free_list = blank_p;
9138 }
9139
9140 static void
9141 clean_nds32_elf_blank (void)
9142 {
9143   nds32_elf_blank_t *blank_t;
9144
9145   while (blank_free_list)
9146     {
9147       blank_t = blank_free_list;
9148       blank_free_list = blank_free_list->next;
9149       free (blank_t);
9150     }
9151 }
9152
9153 static nds32_elf_blank_t *
9154 search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr)
9155 {
9156   nds32_elf_blank_t *blank_t;
9157
9158   if (!blank_p)
9159     return NULL;
9160   blank_t = blank_p;
9161
9162   while (blank_t && addr < blank_t->offset)
9163     blank_t = blank_t->prev;
9164   while (blank_t && blank_t->next && addr >= blank_t->next->offset)
9165     blank_t = blank_t->next;
9166
9167   return blank_t;
9168 }
9169
9170 static bfd_vma
9171 get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
9172                            int overwrite)
9173 {
9174   nds32_elf_blank_t *blank_t;
9175
9176   blank_t = search_nds32_elf_blank (*blank_p, addr);
9177   if (!blank_t)
9178     return 0;
9179
9180   if (overwrite)
9181     *blank_p = blank_t;
9182
9183   if (addr < blank_t->offset + blank_t->size)
9184     return blank_t->total_size + (addr - blank_t->offset);
9185   else
9186     return blank_t->total_size + blank_t->size;
9187 }
9188
9189 static bfd_boolean
9190 insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len)
9191 {
9192   nds32_elf_blank_t *blank_t, *blank_t2;
9193
9194   if (!*blank_p)
9195     {
9196       *blank_p = create_nds32_elf_blank (addr, len);
9197       return *blank_p ? TRUE : FALSE;
9198     }
9199
9200   blank_t = search_nds32_elf_blank (*blank_p, addr);
9201
9202   if (blank_t == NULL)
9203     {
9204       blank_t = create_nds32_elf_blank (addr, len);
9205       if (!blank_t)
9206         return FALSE;
9207       while ((*blank_p)->prev != NULL)
9208         *blank_p = (*blank_p)->prev;
9209       blank_t->next = *blank_p;
9210       (*blank_p)->prev = blank_t;
9211       (*blank_p) = blank_t;
9212       return TRUE;
9213     }
9214
9215   if (addr < blank_t->offset + blank_t->size)
9216     {
9217       /* Extend the origin blank.  */
9218       if (addr + len > blank_t->offset + blank_t->size)
9219         blank_t->size = addr + len - blank_t->offset;
9220     }
9221   else
9222     {
9223       blank_t2 = create_nds32_elf_blank (addr, len);
9224       if (!blank_t2)
9225         return FALSE;
9226       if (blank_t->next)
9227         {
9228           blank_t->next->prev = blank_t2;
9229           blank_t2->next = blank_t->next;
9230         }
9231       blank_t2->prev = blank_t;
9232       blank_t->next = blank_t2;
9233       *blank_p = blank_t2;
9234     }
9235
9236   return TRUE;
9237 }
9238
9239 static bfd_boolean
9240 insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
9241                                      bfd_vma len)
9242 {
9243   nds32_elf_blank_t *blank_t;
9244
9245   if (!insert_nds32_elf_blank (blank_p, addr, len))
9246     return FALSE;
9247
9248   blank_t = *blank_p;
9249
9250   if (!blank_t->prev)
9251     {
9252       blank_t->total_size = 0;
9253       blank_t = blank_t->next;
9254     }
9255
9256   while (blank_t)
9257     {
9258       blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size;
9259       blank_t = blank_t->next;
9260     }
9261
9262   return TRUE;
9263 }
9264
9265 static void
9266 calc_nds32_blank_total (nds32_elf_blank_t *blank_p)
9267 {
9268   nds32_elf_blank_t *blank_t;
9269   bfd_vma total_size = 0;
9270
9271   if (!blank_p)
9272     return;
9273
9274   blank_t = blank_p;
9275   while (blank_t->prev)
9276     blank_t = blank_t->prev;
9277   while (blank_t)
9278     {
9279       blank_t->total_size = total_size;
9280       total_size += blank_t->size;
9281       blank_t = blank_t->next;
9282     }
9283 }
9284
9285 static bfd_boolean
9286 nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec,
9287                                nds32_elf_blank_t *blank_p)
9288 {
9289   Elf_Internal_Shdr *symtab_hdr;        /* Symbol table header of this bfd.  */
9290   Elf_Internal_Sym *isym = NULL;        /* Symbol table of this bfd.  */
9291   Elf_Internal_Sym *isymend;            /* Symbol entry iterator.  */
9292   unsigned int sec_shndx;               /* The section the be relaxed.  */
9293   bfd_byte *contents;                   /* Contents data of iterating section.  */
9294   Elf_Internal_Rela *internal_relocs;
9295   Elf_Internal_Rela *irel;
9296   Elf_Internal_Rela *irelend;
9297   struct elf_link_hash_entry **sym_hashes;
9298   struct elf_link_hash_entry **end_hashes;
9299   unsigned int symcount;
9300   asection *sect;
9301   nds32_elf_blank_t *blank_t;
9302   nds32_elf_blank_t *blank_t2;
9303   nds32_elf_blank_t *blank_head;
9304
9305   blank_head = blank_t = blank_p;
9306   while (blank_head->prev != NULL)
9307     blank_head = blank_head->prev;
9308   while (blank_t->next != NULL)
9309     blank_t = blank_t->next;
9310
9311   if (blank_t->offset + blank_t->size <= sec->size)
9312     {
9313       blank_t->next = create_nds32_elf_blank (sec->size + 4, 0);
9314       blank_t->next->prev = blank_t;
9315     }
9316   if (blank_head->offset > 0)
9317     {
9318       blank_head->prev = create_nds32_elf_blank (0, 0);
9319       blank_head->prev->next = blank_head;
9320       blank_head = blank_head->prev;
9321     }
9322
9323   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
9324
9325   /* The deletion must stop at the next ALIGN reloc for an alignment
9326      power larger than the number of bytes we are deleting.  */
9327
9328   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9329   if (!nds32_get_local_syms (abfd, sec, &isym))
9330     return FALSE;
9331
9332   if (isym == NULL)
9333     {
9334       isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
9335                                    symtab_hdr->sh_info, 0, NULL, NULL, NULL);
9336       symtab_hdr->contents = (bfd_byte *) isym;
9337     }
9338
9339   if (isym == NULL || symtab_hdr->sh_info == 0)
9340     return FALSE;
9341
9342   blank_t = blank_head;
9343   calc_nds32_blank_total (blank_head);
9344
9345   for (sect = abfd->sections; sect != NULL; sect = sect->next)
9346     {
9347       /* Adjust all the relocs.  */
9348
9349       /* Relocations MUST be kept in memory, because relaxation adjust them.  */
9350       internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
9351                                                    TRUE /* keep_memory */);
9352       irelend = internal_relocs + sect->reloc_count;
9353
9354       blank_t = blank_head;
9355       blank_t2 = blank_head;
9356
9357       if (!(sect->flags & SEC_RELOC))
9358         continue;
9359
9360       nds32_get_section_contents (abfd, sect, &contents, TRUE);
9361
9362       for (irel = internal_relocs; irel < irelend; irel++)
9363         {
9364           bfd_vma raddr;
9365
9366           if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
9367               && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
9368               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
9369             {
9370               unsigned long val = 0;
9371               unsigned long mask;
9372               long before, between;
9373               long offset = 0;
9374
9375               switch (ELF32_R_TYPE (irel->r_info))
9376                 {
9377                 case R_NDS32_DIFF8:
9378                   offset = bfd_get_8 (abfd, contents + irel->r_offset);
9379                   break;
9380                 case R_NDS32_DIFF16:
9381                   offset = bfd_get_16 (abfd, contents + irel->r_offset);
9382                   break;
9383                 case R_NDS32_DIFF32:
9384                   val = bfd_get_32 (abfd, contents + irel->r_offset);
9385                   /* Get the signed bit and mask for the high part.  The
9386                      gcc will alarm when right shift 32-bit since the
9387                      type size of long may be 32-bit.  */
9388                   mask = 0 - (val >> 31);
9389                   if (mask)
9390                     offset = (val | (mask - 0xffffffff));
9391                   else
9392                     offset = val;
9393                   break;
9394                 default:
9395                   BFD_ASSERT (0);
9396                 }
9397
9398               /*                  DIFF value
9399                 0            |encoded in location|
9400                 |------------|-------------------|---------
9401                             sym+off(addend)
9402                 -- before ---| *****************
9403                 --------------------- between ---|
9404
9405                 We only care how much data are relax between DIFF,
9406                 marked as ***.  */
9407
9408               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
9409               between = get_nds32_elf_blank_total (&blank_t,
9410                                                    irel->r_addend + offset, 0);
9411               if (between == before)
9412                 goto done_adjust_diff;
9413
9414               switch (ELF32_R_TYPE (irel->r_info))
9415                 {
9416                 case R_NDS32_DIFF8:
9417                   bfd_put_8 (abfd, offset - (between - before),
9418                              contents + irel->r_offset);
9419                   break;
9420                 case R_NDS32_DIFF16:
9421                   bfd_put_16 (abfd, offset - (between - before),
9422                               contents + irel->r_offset);
9423                   break;
9424                 case R_NDS32_DIFF32:
9425                   bfd_put_32 (abfd, offset - (between - before),
9426                               contents + irel->r_offset);
9427                   break;
9428                 }
9429             }
9430           else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
9431               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
9432             {
9433               bfd_vma val = 0;
9434               unsigned int len = 0;
9435               unsigned long before, between;
9436               bfd_byte *endp, *p;
9437
9438               val = _bfd_read_unsigned_leb128 (abfd, contents + irel->r_offset,
9439                                                &len);
9440
9441               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
9442               between = get_nds32_elf_blank_total (&blank_t,
9443                                                    irel->r_addend + val, 0);
9444               if (between == before)
9445                 goto done_adjust_diff;
9446
9447               p = contents + irel->r_offset;
9448               endp = p + len -1;
9449               memset (p, 0x80, len);
9450               *(endp) = 0;
9451               p = write_uleb128 (p, val - (between - before)) - 1;
9452               if (p < endp)
9453                 *p |= 0x80;
9454             }
9455         done_adjust_diff:
9456
9457           if (sec == sect)
9458             {
9459               raddr = irel->r_offset;
9460               irel->r_offset -= get_nds32_elf_blank_total (&blank_t2,
9461                                                            irel->r_offset, 1);
9462
9463               if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
9464                 continue;
9465               if (blank_t2 && blank_t2->next
9466                   && (blank_t2->offset > raddr
9467                       || blank_t2->next->offset <= raddr))
9468                 _bfd_error_handler
9469                   (_("%pB: error: search_nds32_elf_blank reports wrong node"),
9470                    abfd);
9471
9472               /* Mark reloc in deleted portion as NONE.
9473                  For some relocs like R_NDS32_LABEL that doesn't modify the
9474                  content in the section.  R_NDS32_LABEL doesn't belong to the
9475                  instruction in the section, so we should preserve it.  */
9476               if (raddr >= blank_t2->offset
9477                   && raddr < blank_t2->offset + blank_t2->size
9478                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
9479                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN
9480                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
9481                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
9482                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND
9483                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND)
9484                 {
9485                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
9486                                                R_NDS32_NONE);
9487                   continue;
9488                 }
9489             }
9490
9491           if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
9492               || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
9493               || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
9494             continue;
9495
9496           if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
9497               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
9498               && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
9499             {
9500               if (irel->r_addend <= sec->size)
9501                 irel->r_addend -=
9502                   get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1);
9503             }
9504         }
9505     }
9506
9507   /* Adjust the local symbols defined in this section.  */
9508   blank_t = blank_head;
9509   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
9510     {
9511       if (isym->st_shndx == sec_shndx)
9512         {
9513           if (isym->st_value <= sec->size)
9514             {
9515               bfd_vma ahead;
9516               bfd_vma orig_addr = isym->st_value;
9517
9518               ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1);
9519               isym->st_value -= ahead;
9520
9521               /* Adjust function size.  */
9522               if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC
9523                   && isym->st_size > 0)
9524                 isym->st_size -=
9525                   get_nds32_elf_blank_total
9526                   (&blank_t, orig_addr + isym->st_size, 0) - ahead;
9527             }
9528         }
9529     }
9530
9531   /* Now adjust the global symbols defined in this section.  */
9532   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
9533               - symtab_hdr->sh_info);
9534   sym_hashes = elf_sym_hashes (abfd);
9535   end_hashes = sym_hashes + symcount;
9536   blank_t = blank_head;
9537   for (; sym_hashes < end_hashes; sym_hashes++)
9538     {
9539       struct elf_link_hash_entry *sym_hash = *sym_hashes;
9540
9541       if ((sym_hash->root.type == bfd_link_hash_defined
9542            || sym_hash->root.type == bfd_link_hash_defweak)
9543           && sym_hash->root.u.def.section == sec)
9544         {
9545           if (sym_hash->root.u.def.value <= sec->size)
9546             {
9547               bfd_vma ahead;
9548               bfd_vma orig_addr = sym_hash->root.u.def.value;
9549
9550               ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1);
9551               sym_hash->root.u.def.value -= ahead;
9552
9553               /* Adjust function size.  */
9554               if (sym_hash->type == STT_FUNC)
9555                 sym_hash->size -=
9556                   get_nds32_elf_blank_total
9557                   (&blank_t, orig_addr + sym_hash->size, 0) - ahead;
9558
9559             }
9560         }
9561     }
9562
9563   contents = elf_section_data (sec)->this_hdr.contents;
9564   blank_t = blank_head;
9565   while (blank_t->next)
9566     {
9567       /* Actually delete the bytes.  */
9568
9569       /* If current blank is the last blank overlap with current section,
9570          go to finish process.  */
9571       if (sec->size <= (blank_t->next->offset))
9572         break;
9573
9574       memmove (contents + blank_t->offset - blank_t->total_size,
9575                contents + blank_t->offset + blank_t->size,
9576                blank_t->next->offset - (blank_t->offset + blank_t->size));
9577
9578       blank_t = blank_t->next;
9579     }
9580
9581   if (sec->size > (blank_t->offset + blank_t->size))
9582     {
9583       /* There are remaining code between blank and section boundary.
9584          Move the remaining code to appropriate location.  */
9585       memmove (contents + blank_t->offset - blank_t->total_size,
9586                contents + blank_t->offset + blank_t->size,
9587                sec->size - (blank_t->offset + blank_t->size));
9588       sec->size -= blank_t->total_size + blank_t->size;
9589     }
9590   else
9591     /* This blank is not entirely included in the section,
9592        reduce the section size by only part of the blank size.  */
9593     sec->size -= blank_t->total_size + (sec->size - blank_t->offset);
9594
9595   while (blank_head)
9596     {
9597       blank_t = blank_head;
9598       blank_head = blank_head->next;
9599       remove_nds32_elf_blank (blank_t);
9600     }
9601
9602   return TRUE;
9603 }
9604
9605 /* Get the contents of a section.  */
9606
9607 static int
9608 nds32_get_section_contents (bfd *abfd, asection *sec,
9609                             bfd_byte **contents_p, bfd_boolean cache)
9610 {
9611   /* Get the section contents.  */
9612   if (elf_section_data (sec)->this_hdr.contents != NULL)
9613     *contents_p = elf_section_data (sec)->this_hdr.contents;
9614   else
9615     {
9616       if (!bfd_malloc_and_get_section (abfd, sec, contents_p))
9617         return FALSE;
9618       if (cache)
9619         elf_section_data (sec)->this_hdr.contents = *contents_p;
9620     }
9621
9622   return TRUE;
9623 }
9624
9625 /* Get the contents of the internal symbol of abfd.  */
9626
9627 static int
9628 nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED,
9629                       Elf_Internal_Sym **isymbuf_p)
9630 {
9631   Elf_Internal_Shdr *symtab_hdr;
9632   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9633
9634   /* Read this BFD's local symbols if we haven't done so already.  */
9635   if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0)
9636     {
9637       *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents;
9638       if (*isymbuf_p == NULL)
9639         {
9640           *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr,
9641                                              symtab_hdr->sh_info, 0,
9642                                              NULL, NULL, NULL);
9643           if (*isymbuf_p == NULL)
9644             return FALSE;
9645         }
9646     }
9647   symtab_hdr->contents = (bfd_byte *) (*isymbuf_p);
9648
9649   return TRUE;
9650 }
9651
9652 /* Range of small data.  */
9653 static bfd_vma sdata_range[2][2];
9654 static bfd_vma const sdata_init_range[2] =
9655 { ACCURATE_12BIT_S1, ACCURATE_19BIT };
9656
9657 static int
9658 nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
9659                      bfd_byte *contents, bfd_vma addr)
9660 {
9661   unsigned long insn = bfd_getb32 (contents + addr);
9662
9663   if (insn & 0x80000000)
9664     return 2;
9665
9666   return 4;
9667 }
9668
9669 /* Set the gp relax range.  We have to measure the safe range
9670    to do gp relaxation.  */
9671
9672 static void
9673 relax_range_measurement (bfd *abfd)
9674 {
9675   asection *sec_f, *sec_b;
9676   /* For upper bound.   */
9677   bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
9678   bfd_vma align;
9679   static int decide_relax_range = 0;
9680   int i;
9681   int range_number = ARRAY_SIZE (sdata_init_range);
9682
9683   if (decide_relax_range)
9684     return;
9685   decide_relax_range = 1;
9686
9687   if (sda_rela_sec == NULL)
9688     {
9689       /* Since there is no data sections, we assume the range is page size.  */
9690       for (i = 0; i < range_number; i++)
9691         {
9692           sdata_range[i][0] = sdata_init_range[i] - 0x1000;
9693           sdata_range[i][1] = sdata_init_range[i] - 0x1000;
9694         }
9695       return;
9696     }
9697
9698   /* Get the biggest alignment power after the gp located section.  */
9699   sec_f = sda_rela_sec->output_section;
9700   sec_b = sec_f->next;
9701   align = 0;
9702   while (sec_b != NULL)
9703     {
9704       if ((unsigned)(1 << sec_b->alignment_power) > align)
9705         align = (1 << sec_b->alignment_power);
9706       sec_b = sec_b->next;
9707     }
9708
9709   /* I guess we can not determine the section before
9710      gp located section, so we assume the align is max page size.  */
9711   for (i = 0; i < range_number; i++)
9712     {
9713       sdata_range[i][1] = sdata_init_range[i] - align;
9714       BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]);
9715       sdata_range[i][0] = sdata_init_range[i] - maxpgsz;
9716       BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]);
9717     }
9718 }
9719
9720 /* These are macros used to check flags encoded in r_addend.
9721    They are only used by nds32_elf_relax_section ().  */
9722 #define GET_SEQ_LEN(addend)     ((addend) & 0x000000ff)
9723 #define IS_1ST_CONVERT(addend)  ((addend) & 0x80000000)
9724 #define IS_OPTIMIZE(addend)     ((addend) & 0x40000000)
9725 #define IS_16BIT_ON(addend)     ((addend) & 0x20000000)
9726
9727 static const char * unrecognized_reloc_msg =
9728   /* xgettext:c-format */
9729   N_("%pB: warning: %s points to unrecognized reloc at %#" PRIx64);
9730
9731 /* Relax LONGCALL1 relocation for nds32_elf_relax_section.  */
9732
9733 static bfd_boolean
9734 nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9735                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9736                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9737                            Elf_Internal_Shdr *symtab_hdr)
9738 {
9739   /* There are 3 variations for LONGCALL1
9740      case 4-4-2; 16-bit on, optimize off or optimize for space
9741      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9742      ori   ta, ta, lo12(symbol) ; LO12S0
9743      jral5 ta                   ;
9744
9745      case 4-4-4; 16-bit off, optimize don't care
9746      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9747      ori   ta, ta, lo12(symbol) ; LO12S0
9748      jral  ta                   ;
9749
9750      case 4-4-4; 16-bit on, optimize for speed
9751      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9752      ori   ta, ta, lo12(symbol) ; LO12S0
9753      jral  ta                   ;
9754      Check code for -mlong-calls output.  */
9755
9756   /* Get the reloc for the address from which the register is
9757      being loaded.  This reloc will tell us which function is
9758      actually being called.  */
9759
9760   bfd_vma laddr;
9761   int seq_len;  /* Original length of instruction sequence.  */
9762   uint32_t insn;
9763   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9764   bfd_signed_vma foff;
9765   uint16_t insn16;
9766
9767   irelend = internal_relocs + sec->reloc_count;
9768   seq_len = GET_SEQ_LEN (irel->r_addend);
9769   laddr = irel->r_offset;
9770   *insn_len = seq_len;
9771
9772   hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9773                                            R_NDS32_HI20_RELA, laddr);
9774   lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9775                                            R_NDS32_LO12S0_ORI_RELA,
9776                                            laddr + 4);
9777
9778   if (hi_irelfn == irelend || lo_irelfn == irelend)
9779     {
9780       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL1",
9781                           (uint64_t) irel->r_offset);
9782       return FALSE;
9783     }
9784
9785   /* Get the value of the symbol referred to by the reloc.  */
9786   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
9787
9788   /* This condition only happened when symbol is undefined.  */
9789   if (foff == 0
9790       || foff < -CONSERVATIVE_24BIT_S1
9791       || foff >= CONSERVATIVE_24BIT_S1)
9792     return FALSE;
9793
9794   /* Relax to: jal symbol; 25_PCREL.  */
9795   /* For simplicity of coding, we are going to modify the section
9796      contents, the section relocs, and the BFD symbol table.  We
9797      must tell the rest of the code not to free up this
9798      information.  It would be possible to instead create a table
9799      of changes which have to be made, as is done in coff-mips.c;
9800      that would be more work, but would require less memory when
9801      the linker is run.  */
9802
9803   /* Replace the long call with a jal.  */
9804   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9805                                R_NDS32_25_PCREL_RELA);
9806   irel->r_addend = hi_irelfn->r_addend;
9807
9808   /* We don't resolve this here but resolve it in relocate_section.  */
9809   insn = INSN_JAL;
9810   bfd_putb32 (insn, contents + irel->r_offset);
9811
9812   hi_irelfn->r_info =
9813     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9814   lo_irelfn->r_info =
9815     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9816   *insn_len = 4;
9817
9818   if (seq_len & 0x2)
9819     {
9820       insn16 = NDS32_NOP16;
9821       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9822       lo_irelfn->r_info =
9823         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9824       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9825       *insn_len += 2;
9826     }
9827   return TRUE;
9828 }
9829
9830 #define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
9831 /* Relax LONGCALL2 relocation for nds32_elf_relax_section.  */
9832
9833 static bfd_boolean
9834 nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9835                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9836                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9837                            Elf_Internal_Shdr *symtab_hdr)
9838 {
9839   /* bltz  rt, .L1   ; LONGCALL2
9840      jal   symbol   ; 25_PCREL
9841      .L1: */
9842
9843   /* Get the reloc for the address from which the register is
9844      being loaded.  This reloc will tell us which function is
9845      actually being called.  */
9846
9847   bfd_vma laddr;
9848   uint32_t insn;
9849   Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend;
9850   bfd_signed_vma foff;
9851
9852   irelend = internal_relocs + sec->reloc_count;
9853   laddr = irel->r_offset;
9854   i1_irelfn =
9855     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9856                                  R_NDS32_25_PCREL_RELA, laddr + 4);
9857
9858   if (i1_irelfn == irelend)
9859     {
9860       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL2",
9861                           (uint64_t) irel->r_offset);
9862       return FALSE;
9863     }
9864
9865   insn = bfd_getb32 (contents + laddr);
9866
9867   /* Get the value of the symbol referred to by the reloc.  */
9868   foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr);
9869
9870   if (foff == 0
9871       || foff < -CONSERVATIVE_16BIT_S1
9872       || foff >= CONSERVATIVE_16BIT_S1)
9873     return FALSE;
9874
9875   /* Relax to   bgezal   rt, label ; 17_PCREL
9876      or         bltzal   rt, label ; 17_PCREL */
9877
9878   /* Convert to complimentary conditional call.  */
9879   insn = CONVERT_CONDITION_CALL (insn);
9880
9881   /* For simplicity of coding, we are going to modify the section
9882      contents, the section relocs, and the BFD symbol table.  We
9883      must tell the rest of the code not to free up this
9884      information.  It would be possible to instead create a table
9885      of changes which have to be made, as is done in coff-mips.c;
9886      that would be more work, but would require less memory when
9887      the linker is run.  */
9888
9889   /* Clean unnessary relocations.  */
9890   i1_irelfn->r_info =
9891     ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE);
9892   cond_irelfn =
9893     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9894                                  R_NDS32_17_PCREL_RELA, laddr);
9895   if (cond_irelfn != irelend)
9896     cond_irelfn->r_info =
9897       ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE);
9898
9899   /* Replace the long call with a bgezal.  */
9900   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info),
9901                                R_NDS32_17_PCREL_RELA);
9902   irel->r_addend = i1_irelfn->r_addend;
9903
9904   bfd_putb32 (insn, contents + irel->r_offset);
9905
9906   *insn_len = 4;
9907   return TRUE;
9908 }
9909
9910 /* Relax LONGCALL3 relocation for nds32_elf_relax_section.  */
9911
9912 static bfd_boolean
9913 nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9914                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9915                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9916                            Elf_Internal_Shdr *symtab_hdr)
9917 {
9918   /* There are 3 variations for LONGCALL3
9919      case 4-4-4-2; 16-bit on, optimize off or optimize for space
9920      bltz  rt,   $1                ; LONGCALL3
9921      sethi ta,   hi20(symbol)      ; HI20
9922      ori   ta, ta,  lo12(symbol)   ; LO12S0
9923      jral5 ta                      ;
9924      $1
9925
9926      case 4-4-4-4; 16-bit off, optimize don't care
9927      bltz  rt,   $1                ; LONGCALL3
9928      sethi ta,   hi20(symbol)      ; HI20
9929      ori   ta, ta,  lo12(symbol)   ; LO12S0
9930      jral  ta                      ;
9931      $1
9932
9933      case 4-4-4-4; 16-bit on, optimize for speed
9934      bltz  rt,   $1                ; LONGCALL3
9935      sethi ta,   hi20(symbol)      ; HI20
9936      ori   ta, ta,  lo12(symbol)   ; LO12S0
9937      jral  ta                      ;
9938      $1 */
9939
9940   /* Get the reloc for the address from which the register is
9941      being loaded.  This reloc will tell us which function is
9942      actually being called.  */
9943
9944   bfd_vma laddr;
9945   int seq_len;  /* Original length of instruction sequence.  */
9946   uint32_t insn;
9947   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9948   bfd_signed_vma foff;
9949   uint16_t insn16;
9950
9951   irelend = internal_relocs + sec->reloc_count;
9952   seq_len = GET_SEQ_LEN (irel->r_addend);
9953   laddr = irel->r_offset;
9954   *insn_len = seq_len;
9955
9956   hi_irelfn =
9957     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9958                                  R_NDS32_HI20_RELA, laddr + 4);
9959   lo_irelfn =
9960     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9961                                  R_NDS32_LO12S0_ORI_RELA, laddr + 8);
9962
9963   if (hi_irelfn == irelend || lo_irelfn == irelend)
9964     {
9965       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL3",
9966                           (uint64_t) irel->r_offset);
9967       return FALSE;
9968     }
9969
9970   /* Get the value of the symbol referred to by the reloc.  */
9971   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
9972
9973   if (foff == 0
9974       || foff < -CONSERVATIVE_24BIT_S1
9975       || foff >= CONSERVATIVE_24BIT_S1)
9976     return FALSE;
9977
9978   insn = bfd_getb32 (contents + laddr);
9979   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
9980     {
9981       /* Relax to  bgezal   rt, label ; 17_PCREL
9982          or        bltzal   rt, label ; 17_PCREL */
9983
9984       /* Convert to complimentary conditional call.  */
9985       insn = CONVERT_CONDITION_CALL (insn);
9986       bfd_putb32 (insn, contents + irel->r_offset);
9987
9988       *insn_len = 4;
9989       irel->r_info =
9990         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9991       hi_irelfn->r_info =
9992         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9993       lo_irelfn->r_info =
9994         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9995
9996       cond_irelfn =
9997         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9998                                      R_NDS32_17_PCREL_RELA, laddr);
9999       if (cond_irelfn != irelend)
10000         {
10001           cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
10002                                               R_NDS32_17_PCREL_RELA);
10003           cond_irelfn->r_addend = hi_irelfn->r_addend;
10004         }
10005
10006       if (seq_len & 0x2)
10007         {
10008           insn16 = NDS32_NOP16;
10009           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
10010           hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
10011                                             R_NDS32_INSN16);
10012           hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10013           insn_len += 2;
10014         }
10015     }
10016   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
10017     {
10018       /* Relax to the following instruction sequence
10019          bltz  rt,   $1 ; LONGCALL2
10020          jal   symbol   ; 25_PCREL
10021          $1     */
10022       *insn_len = 8;
10023       insn = INSN_JAL;
10024       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
10025
10026       hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
10027                                         R_NDS32_25_PCREL_RELA);
10028       irel->r_info =
10029         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2);
10030
10031       lo_irelfn->r_info =
10032         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
10033
10034       if (seq_len & 0x2)
10035         {
10036           insn16 = NDS32_NOP16;
10037           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
10038           lo_irelfn->r_info =
10039             ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
10040           lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10041           insn_len += 2;
10042         }
10043     }
10044   return TRUE;
10045 }
10046
10047 /* Relax LONGJUMP1 relocation for nds32_elf_relax_section.  */
10048
10049 static bfd_boolean
10050 nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10051                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10052                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10053                            Elf_Internal_Shdr *symtab_hdr)
10054 {
10055   /* There are 3 variations for LONGJUMP1
10056      case 4-4-2; 16-bit bit on, optimize off or optimize for space
10057      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
10058      ori   ta, ta, lo12(symbol)  ; LO12S0
10059      jr5   ta                    ;
10060
10061      case 4-4-4; 16-bit off, optimize don't care
10062      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
10063      ori   ta, ta, lo12(symbol)  ; LO12S0
10064      jr    ta                    ;
10065
10066      case 4-4-4; 16-bit on, optimize for speed
10067      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
10068      ori   ta, ta, lo12(symbol)  ; LO12S0
10069      jr    ta                    ;      */
10070
10071   /* Get the reloc for the address from which the register is
10072      being loaded.  This reloc will tell us which function is
10073      actually being called.  */
10074
10075   bfd_vma laddr;
10076   int seq_len;  /* Original length of instruction sequence.  */
10077   int insn16_on;        /* 16-bit on/off.  */
10078   uint32_t insn;
10079   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
10080   bfd_signed_vma foff;
10081   uint16_t insn16;
10082   unsigned long reloc;
10083
10084   irelend = internal_relocs + sec->reloc_count;
10085   seq_len = GET_SEQ_LEN (irel->r_addend);
10086   laddr = irel->r_offset;
10087   *insn_len = seq_len;
10088   insn16_on = IS_16BIT_ON (irel->r_addend);
10089
10090   hi_irelfn =
10091     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10092                                  R_NDS32_HI20_RELA, laddr);
10093   lo_irelfn =
10094     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10095                                  R_NDS32_LO12S0_ORI_RELA, laddr + 4);
10096   if (hi_irelfn == irelend || lo_irelfn == irelend)
10097     {
10098       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP1",
10099                           (uint64_t) irel->r_offset);
10100       return FALSE;
10101     }
10102
10103   /* Get the value of the symbol referred to by the reloc.  */
10104   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
10105
10106   if (foff == 0
10107       || foff >= CONSERVATIVE_24BIT_S1
10108       || foff < -CONSERVATIVE_24BIT_S1)
10109     return FALSE;
10110
10111   if (insn16_on
10112       && foff >= -ACCURATE_8BIT_S1
10113       && foff < ACCURATE_8BIT_S1
10114       && (seq_len & 0x2))
10115     {
10116       /* j8     label */
10117       /* 16-bit on, but not optimized for speed.  */
10118       reloc = R_NDS32_9_PCREL_RELA;
10119       insn16 = INSN_J8;
10120       bfd_putb16 (insn16, contents + irel->r_offset);
10121       *insn_len = 2;
10122       irel->r_info =
10123         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10124     }
10125   else
10126     {
10127       /* j     label */
10128       reloc = R_NDS32_25_PCREL_RELA;
10129       insn = INSN_J;
10130       bfd_putb32 (insn, contents + irel->r_offset);
10131       *insn_len = 4;
10132       irel->r_info =
10133         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16);
10134       irel->r_addend = 0;
10135     }
10136
10137   hi_irelfn->r_info =
10138     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
10139   lo_irelfn->r_info =
10140     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
10141
10142   if ((seq_len & 0x2) && ((*insn_len & 2) == 0))
10143     {
10144       insn16 = NDS32_NOP16;
10145       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
10146       lo_irelfn->r_info =
10147         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
10148                       R_NDS32_INSN16);
10149       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10150       *insn_len += 2;
10151     }
10152   return TRUE;
10153 }
10154
10155 /* Revert condition branch.  This function does not check if the input
10156    instruction is condition branch or not.  */
10157
10158 static void
10159 nds32_elf_convert_branch (uint16_t insn16, uint32_t insn,
10160                            uint16_t *re_insn16, uint32_t *re_insn)
10161 {
10162   uint32_t comp_insn = 0;
10163   uint16_t comp_insn16 = 0;
10164
10165   if (insn)
10166     {
10167       if (N32_OP6 (insn) == N32_OP6_BR1)
10168         {
10169           /* beqs label.  */
10170           comp_insn = (insn ^ 0x4000) & 0xffffc000;
10171           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5)
10172             {
10173               /* Insn can be contracted to 16-bit implied r5.  */
10174               comp_insn16 =
10175                 (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38;
10176               comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
10177             }
10178         }
10179       else if (N32_OP6 (insn) == N32_OP6_BR3)
10180         {
10181           /* bnec $ta, imm11, label.  */
10182           comp_insn = (insn ^ 0x80000) & 0xffffff00;
10183         }
10184       else
10185         {
10186           comp_insn = (insn ^ 0x10000) & 0xffffc000;
10187           if (N32_BR2_SUB (insn) == N32_BR2_BEQZ
10188               || N32_BR2_SUB (insn) == N32_BR2_BNEZ)
10189             {
10190               if (N32_IS_RT3 (insn))
10191                 {
10192                   /* Insn can be contracted to 16-bit.  */
10193                   comp_insn16 =
10194                     (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38;
10195                   comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
10196                 }
10197               else if (N32_RT5 (insn) == REG_R15)
10198                 {
10199                   /* Insn can be contracted to 16-bit.  */
10200                   comp_insn16 =
10201                     (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38;
10202                 }
10203             }
10204         }
10205     }
10206   else
10207     {
10208       switch ((insn16 & 0xf000) >> 12)
10209         {
10210         case 0xc:
10211           /* beqz38 or bnez38 */
10212           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
10213           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ;
10214           comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20;
10215           break;
10216
10217         case 0xd:
10218           /* beqs38 or bnes38 */
10219           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
10220           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ;
10221           comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20)
10222             | (REG_R5 << 15);
10223           break;
10224
10225         case 0xe:
10226           /* beqzS8 or bnezS8 */
10227           comp_insn16 = (insn16 ^ 0x0100) & 0xff00;
10228           comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ;
10229           comp_insn |= REG_R15 << 20;
10230           break;
10231
10232         default:
10233           break;
10234         }
10235     }
10236   if (comp_insn && re_insn)
10237     *re_insn = comp_insn;
10238   if (comp_insn16 && re_insn16)
10239     *re_insn16 = comp_insn16;
10240 }
10241
10242 /* Relax LONGJUMP2 relocation for nds32_elf_relax_section.  */
10243
10244 static bfd_boolean
10245 nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10246                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10247                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10248                            Elf_Internal_Shdr *symtab_hdr)
10249 {
10250   /* There are 3 variations for LONGJUMP2
10251      case 2-4;  1st insn convertible, 16-bit on,
10252      optimize off or optimize for space
10253      bnes38  rt, ra, $1 ; LONGJUMP2
10254      j       label      ; 25_PCREL
10255      $1:
10256
10257      case 4-4; 1st insn not convertible
10258      bne  rt, ra, $1 ; LONGJUMP2
10259      j    label      ; 25_PCREL
10260      $1:
10261
10262      case 4-4; 1st insn convertible, 16-bit on, optimize for speed
10263      bne  rt, ra, $1 ; LONGJUMP2
10264      j    label      ; 25_PCREL
10265      $1: */
10266
10267   /* Get the reloc for the address from which the register is
10268      being loaded.  This reloc will tell us which function is
10269      actually being called.  */
10270
10271   bfd_vma laddr;
10272   int seq_len;  /* Original length of instruction sequence.  */
10273   Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend;
10274   int first_size;
10275   unsigned int i;
10276   bfd_signed_vma foff;
10277   uint32_t insn, re_insn = 0;
10278   uint16_t insn16, re_insn16 = 0;
10279   unsigned long reloc, cond_reloc;
10280
10281   enum elf_nds32_reloc_type checked_types[] =
10282     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
10283
10284   irelend = internal_relocs + sec->reloc_count;
10285   seq_len = GET_SEQ_LEN (irel->r_addend);
10286   laddr = irel->r_offset;
10287   *insn_len = seq_len;
10288   first_size = (seq_len == 6) ? 2 : 4;
10289
10290   i2_irelfn =
10291     find_relocs_at_address_addr (irel, internal_relocs,
10292                                  irelend, R_NDS32_25_PCREL_RELA,
10293                                  laddr + first_size);
10294
10295   for (i = 0; i < ARRAY_SIZE (checked_types); i++)
10296     {
10297       cond_irelfn =
10298         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10299                                      checked_types[i], laddr);
10300       if (cond_irelfn != irelend)
10301         break;
10302     }
10303
10304   if (i2_irelfn == irelend || cond_irelfn == irelend)
10305     {
10306       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP2",
10307                           (uint64_t) irel->r_offset);
10308       return FALSE;
10309     }
10310
10311   /* Get the value of the symbol referred to by the reloc.  */
10312   foff = calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr);
10313   if (foff == 0
10314       || foff < -CONSERVATIVE_16BIT_S1
10315       || foff >= CONSERVATIVE_16BIT_S1)
10316     return FALSE;
10317
10318   /* Get the all corresponding instructions.  */
10319   if (first_size == 4)
10320     {
10321       insn = bfd_getb32 (contents + laddr);
10322       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10323     }
10324   else
10325     {
10326       insn16 = bfd_getb16 (contents + laddr);
10327       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10328     }
10329
10330   if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size)
10331       && foff < ACCURATE_8BIT_S1 - first_size)
10332     {
10333       if (first_size == 4)
10334         {
10335           /* Don't convert it to 16-bit now, keep this as relaxable for
10336              ``label reloc; INSN16''.  */
10337
10338           /* Save comp_insn32 to buffer.  */
10339           bfd_putb32 (re_insn, contents + irel->r_offset);
10340           *insn_len = 4;
10341           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
10342             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
10343           cond_reloc = R_NDS32_INSN16;
10344         }
10345       else
10346         {
10347           bfd_putb16 (re_insn16, contents + irel->r_offset);
10348           *insn_len = 2;
10349           reloc = R_NDS32_9_PCREL_RELA;
10350           cond_reloc = R_NDS32_NONE;
10351         }
10352     }
10353   else if (N32_OP6 (re_insn) == N32_OP6_BR1
10354            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
10355                && foff < ACCURATE_14BIT_S1 - first_size))
10356     {
10357       /* beqs     label    ; 15_PCREL */
10358       bfd_putb32 (re_insn, contents + irel->r_offset);
10359       *insn_len = 4;
10360       reloc = R_NDS32_15_PCREL_RELA;
10361       cond_reloc = R_NDS32_NONE;
10362     }
10363   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10364            && foff >= -CONSERVATIVE_16BIT_S1
10365            && foff < CONSERVATIVE_16BIT_S1)
10366     {
10367       /* beqz     label ; 17_PCREL */
10368       bfd_putb32 (re_insn, contents + irel->r_offset);
10369       *insn_len = 4;
10370       reloc = R_NDS32_17_PCREL_RELA;
10371       cond_reloc = R_NDS32_NONE;
10372     }
10373   else
10374     return FALSE;
10375
10376   /* Set all relocations.  */
10377   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc);
10378   irel->r_addend = i2_irelfn->r_addend;
10379
10380   cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
10381                                       cond_reloc);
10382   cond_irelfn->r_addend = 0;
10383
10384   if ((seq_len ^ *insn_len ) & 0x2)
10385     {
10386       insn16 = NDS32_NOP16;
10387       bfd_putb16 (insn16, contents + irel->r_offset + 4);
10388       i2_irelfn->r_offset = 4;
10389       i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
10390                                         R_NDS32_INSN16);
10391       i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10392       *insn_len += 2;
10393     }
10394   else
10395     i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
10396                                       R_NDS32_NONE);
10397   return TRUE;
10398 }
10399
10400 /* Relax LONGJUMP3 relocation for nds32_elf_relax_section.  */
10401
10402 static bfd_boolean
10403 nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10404                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10405                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10406                            Elf_Internal_Shdr *symtab_hdr)
10407 {
10408   /* There are 5 variations for LONGJUMP3
10409      case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
10410      optimize off or optimize for space
10411      bnes38   rt, ra, $1            ; LONGJUMP3
10412      sethi    ta, hi20(symbol)      ; HI20
10413      ori      ta, ta, lo12(symbol)  ; LO12S0
10414      jr5      ta                    ;
10415      $1:                            ;
10416
10417      case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
10418      bnes38   rt, ra, $1           ; LONGJUMP3
10419      sethi    ta, hi20(symbol)     ; HI20
10420      ori      ta, ta, lo12(symbol) ; LO12S0
10421      jr5      ta                   ;
10422      $1:                           ; LABEL
10423
10424      case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
10425      optimize off or optimize for space
10426      bne   rt, ra, $1           ; LONGJUMP3
10427      sethi ta, hi20(symbol)     ; HI20
10428      ori   ta, ta, lo12(symbol) ; LO12S0
10429      jr5   ta                   ;
10430      $1:                        ;
10431
10432      case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
10433      16-bit off if no INSN16
10434      bne   rt, ra, $1           ; LONGJUMP3
10435      sethi ta, hi20(symbol)     ; HI20
10436      ori   ta, ta, lo12(symbol) ; LO12S0
10437      jr    ta                   ;
10438      $1:                        ;
10439
10440      case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
10441      16-bit off if no INSN16
10442      bne   rt, ra, $1           ; LONGJUMP3
10443      sethi ta, hi20(symbol)     ; HI20
10444      ori   ta, ta, lo12(symbol) ; LO12S0
10445      jr    ta                   ;
10446      $1:                        ; LABEL */
10447
10448   /* Get the reloc for the address from which the register is
10449      being loaded.  This reloc will tell us which function is
10450      actually being called.  */
10451   enum elf_nds32_reloc_type checked_types[] =
10452     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
10453
10454   int reloc_off = 0, cond_removed = 0, convertible;
10455   bfd_vma laddr;
10456   int seq_len;  /* Original length of instruction sequence.  */
10457   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
10458   int first_size;
10459   unsigned int i;
10460   bfd_signed_vma foff;
10461   uint32_t insn, re_insn = 0;
10462   uint16_t insn16, re_insn16 = 0;
10463   unsigned long reloc, cond_reloc;
10464
10465   irelend = internal_relocs + sec->reloc_count;
10466   seq_len = GET_SEQ_LEN (irel->r_addend);
10467   laddr = irel->r_offset;
10468   *insn_len = seq_len;
10469
10470   convertible = IS_1ST_CONVERT (irel->r_addend);
10471
10472   if (convertible)
10473     first_size = 2;
10474   else
10475     first_size = 4;
10476
10477   /* Get all needed relocations.  */
10478   hi_irelfn =
10479     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10480                                  R_NDS32_HI20_RELA, laddr + first_size);
10481   lo_irelfn =
10482     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10483                                  R_NDS32_LO12S0_ORI_RELA,
10484                                  laddr + first_size + 4);
10485
10486   for (i = 0; i < ARRAY_SIZE (checked_types); i++)
10487     {
10488       cond_irelfn =
10489         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10490                                      checked_types[i], laddr);
10491       if (cond_irelfn != irelend)
10492         break;
10493     }
10494
10495   if (hi_irelfn == irelend
10496       || lo_irelfn == irelend
10497       || cond_irelfn == irelend)
10498     {
10499       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP3",
10500                           (uint64_t) irel->r_offset);
10501       return FALSE;
10502     }
10503
10504   /* Get the value of the symbol referred to by the reloc.  */
10505   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
10506
10507   if (foff == 0
10508       || foff < -CONSERVATIVE_24BIT_S1
10509       || foff >= CONSERVATIVE_24BIT_S1)
10510     return FALSE;
10511
10512   /* Get the all corresponding instructions.  */
10513   if (first_size == 4)
10514     {
10515       insn = bfd_getb32 (contents + laddr);
10516       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10517     }
10518   else
10519     {
10520       insn16 = bfd_getb16 (contents + laddr);
10521       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10522     }
10523
10524   /* For simplicity of coding, we are going to modify the section
10525      contents, the section relocs, and the BFD symbol table.  We
10526      must tell the rest of the code not to free up this
10527      information.  It would be possible to instead create a table
10528      of changes which have to be made, as is done in coff-mips.c;
10529      that would be more work, but would require less memory when
10530      the linker is run.  */
10531
10532   if (re_insn16
10533       && foff >= -ACCURATE_8BIT_S1 - first_size
10534       && foff < ACCURATE_8BIT_S1 - first_size)
10535     {
10536       if (!(seq_len & 0x2))
10537         {
10538           /* Don't convert it to 16-bit now, keep this as relaxable
10539              for ``label reloc; INSN1a''6.  */
10540           /* Save comp_insn32 to buffer.  */
10541           bfd_putb32 (re_insn, contents + irel->r_offset);
10542           *insn_len = 4;
10543           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
10544             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
10545           cond_reloc = R_NDS32_INSN16;
10546         }
10547       else
10548         {
10549           /* Not optimize for speed; convert sequence to 16-bit.  */
10550           /* Save comp_insn16 to buffer.  */
10551           bfd_putb16 (re_insn16, contents + irel->r_offset);
10552           *insn_len = 2;
10553           reloc = R_NDS32_9_PCREL_RELA;
10554           cond_reloc = R_NDS32_NONE;
10555         }
10556       cond_removed = 1;
10557     }
10558   else if (N32_OP6 (re_insn) == N32_OP6_BR1
10559            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
10560                && foff < ACCURATE_14BIT_S1 - first_size))
10561     {
10562       /* beqs     label    ; 15_PCREL */
10563       bfd_putb32 (re_insn, contents + irel->r_offset);
10564       *insn_len = 4;
10565       reloc = R_NDS32_15_PCREL_RELA;
10566       cond_reloc = R_NDS32_NONE;
10567       cond_removed = 1;
10568     }
10569   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10570            && foff >= -CONSERVATIVE_16BIT_S1
10571            && foff < CONSERVATIVE_16BIT_S1)
10572     {
10573       /* beqz     label ; 17_PCREL */
10574       bfd_putb32 (re_insn, contents + irel->r_offset);
10575       *insn_len = 4;
10576       reloc = R_NDS32_17_PCREL_RELA;
10577       cond_reloc = R_NDS32_NONE;
10578       cond_removed = 1;
10579     }
10580   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
10581            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
10582     {
10583       /* Relax to one of the following 3 variations
10584
10585          case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
10586          for space
10587          bnes38  rt, $1 ; LONGJUMP2
10588          j       label  ; 25_PCREL
10589          $1
10590
10591          case 4-4; 1st insn not convertible, others don't care
10592          bne   rt, ra, $1 ; LONGJUMP2
10593          j     label      ; 25_PCREL
10594          $1
10595
10596          case 4-4; 1st insn convertible, 16-bit on, optimize for speed
10597          bne   rt, ra, $1 ; LONGJUMP2
10598          j     label      ; 25_PCREL
10599          $1 */
10600
10601       /* Offset for first instruction.  */
10602
10603       /* Use j label as second instruction.  */
10604       *insn_len = 4 + first_size;
10605       insn = INSN_J;
10606       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
10607       reloc = R_NDS32_LONGJUMP2;
10608       cond_reloc = R_NDS32_25_PLTREL;
10609     }
10610     else
10611       return FALSE;
10612
10613     if (cond_removed == 1)
10614       {
10615         /* Set all relocations.  */
10616         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
10617         irel->r_addend = hi_irelfn->r_addend;
10618
10619         cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
10620                                             cond_reloc);
10621         cond_irelfn->r_addend = 0;
10622         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
10623                                           R_NDS32_NONE);
10624       }
10625     else
10626       {
10627         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10628         irel->r_addend = irel->r_addend;
10629         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
10630                                           cond_reloc);
10631       }
10632
10633   if ((seq_len ^ *insn_len ) & 0x2)
10634     {
10635       insn16 = NDS32_NOP16;
10636       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
10637       lo_irelfn->r_offset = *insn_len;
10638       lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
10639                                         R_NDS32_INSN16);
10640       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10641       *insn_len += 2;
10642     }
10643   else
10644     lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
10645                                       R_NDS32_NONE);
10646   return TRUE;
10647 }
10648
10649 /* Relax LONGCALL4 relocation for nds32_elf_relax_section.  */
10650
10651 static bfd_boolean
10652 nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10653                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10654                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10655                            Elf_Internal_Shdr *symtab_hdr)
10656 {
10657   /* The pattern for LONGCALL4.  Support for function cse.
10658      sethi ta, hi20(symbol)     ; LONGCALL4/HI20
10659      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10660      jral  ta                   ; PTR_RES/EMPTY/INSN16  */
10661
10662   bfd_vma laddr;
10663   uint32_t insn;
10664   Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel;
10665   Elf_Internal_Rela *irelend;
10666   bfd_signed_vma foff;
10667
10668   irelend = internal_relocs + sec->reloc_count;
10669   laddr = irel->r_offset;
10670
10671   /* Get the reloc for the address from which the register is
10672      being loaded.  This reloc will tell us which function is
10673      actually being called.  */
10674   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10675                                          R_NDS32_HI20_RELA, laddr);
10676
10677   if (hi_irel == irelend)
10678     {
10679       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
10680                           (uint64_t) irel->r_offset);
10681       return FALSE;
10682     }
10683
10684   /* Get the value of the symbol referred to by the reloc.  */
10685   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr);
10686
10687   /* This condition only happened when symbol is undefined.  */
10688   if (foff == 0
10689       || foff < -CONSERVATIVE_24BIT_S1
10690       || foff >= CONSERVATIVE_24BIT_S1)
10691     return FALSE;
10692
10693   /* Relax to: jal symbol; 25_PCREL.  */
10694   /* For simplicity of coding, we are going to modify the section
10695      contents, the section relocs, and the BFD symbol table.  We
10696      must tell the rest of the code not to free up this
10697      information.  It would be possible to instead create a table
10698      of changes which have to be made, as is done in coff-mips.c;
10699      that would be more work, but would require less memory when
10700      the linker is run.  */
10701
10702   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10703                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
10704   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10705                                           R_NDS32_EMPTY, irel->r_addend);
10706
10707   if (ptr_irel == irelend || em_irel == irelend)
10708     {
10709       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
10710                           (uint64_t) irel->r_offset);
10711       return FALSE;
10712     }
10713   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
10714   insn = bfd_getb32 (contents + irel->r_addend);
10715   if (insn & 0x80000000)
10716     return FALSE;
10717
10718   /* Replace the long call with a jal.  */
10719   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10720                                   R_NDS32_25_PCREL_RELA);
10721   ptr_irel->r_addend = 1;
10722
10723   /* We don't resolve this here but resolve it in relocate_section.  */
10724   insn = INSN_JAL;
10725   bfd_putb32 (insn, contents + em_irel->r_offset);
10726
10727   irel->r_info =
10728     ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10729
10730   /* If there is function cse, HI20 can not remove now.  */
10731   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10732                                            R_NDS32_LONGCALL4, laddr);
10733   if (call_irel == irelend)
10734     {
10735       *insn_len = 0;
10736       hi_irel->r_info =
10737         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10738     }
10739
10740   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10741                                           R_NDS32_INSN16, irel->r_addend);
10742   if (insn_irel != irelend)
10743     insn_irel->r_info =
10744       ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10745
10746   return TRUE;
10747 }
10748
10749 /* Relax LONGCALL5 relocation for nds32_elf_relax_section.  */
10750
10751 static bfd_boolean
10752 nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10753                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10754                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10755                            Elf_Internal_Shdr *symtab_hdr)
10756 {
10757   /* The pattern for LONGCALL5.
10758      bltz  rt, .L1      ; LONGCALL5/17_PCREL
10759      jal   symbol       ; 25_PCREL
10760      .L1:  */
10761
10762   bfd_vma laddr;
10763   uint32_t insn;
10764   Elf_Internal_Rela *cond_irel, *irelend;
10765   bfd_signed_vma foff;
10766
10767   irelend = internal_relocs + sec->reloc_count;
10768   laddr = irel->r_offset;
10769   insn = bfd_getb32 (contents + laddr);
10770
10771   /* Get the reloc for the address from which the register is
10772      being loaded.  This reloc will tell us which function is
10773      actually being called.  */
10774   cond_irel =
10775     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10776                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
10777   if (cond_irel == irelend)
10778     {
10779       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL5",
10780                           (uint64_t) irel->r_offset);
10781       return FALSE;
10782     }
10783
10784   /* Get the value of the symbol referred to by the reloc.  */
10785   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
10786
10787   if (foff == 0
10788       || foff < -CONSERVATIVE_16BIT_S1
10789       || foff >= CONSERVATIVE_16BIT_S1)
10790     return FALSE;
10791
10792   /* Relax to   bgezal   rt, label ; 17_PCREL
10793      or         bltzal   rt, label ; 17_PCREL.  */
10794
10795   /* Convert to complimentary conditional call.  */
10796   insn = CONVERT_CONDITION_CALL (insn);
10797
10798   /* For simplicity of coding, we are going to modify the section
10799      contents, the section relocs, and the BFD symbol table.  We
10800      must tell the rest of the code not to free up this
10801      information.  It would be possible to instead create a table
10802      of changes which have to be made, as is done in coff-mips.c;
10803      that would be more work, but would require less memory when
10804      the linker is run.  */
10805
10806   /* Modify relocation and contents.  */
10807   cond_irel->r_info =
10808     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA);
10809
10810   /* Replace the long call with a bgezal.  */
10811   bfd_putb32 (insn, contents + cond_irel->r_offset);
10812   *insn_len = 0;
10813
10814   /* Clean unnessary relocations.  */
10815   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10816
10817   cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10818                                            R_NDS32_17_PCREL_RELA, laddr);
10819   cond_irel->r_info =
10820     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10821
10822   return TRUE;
10823 }
10824
10825 /* Relax LONGCALL6 relocation for nds32_elf_relax_section.  */
10826
10827 static bfd_boolean
10828 nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10829                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10830                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10831                            Elf_Internal_Shdr *symtab_hdr)
10832 {
10833   /* The pattern for LONGCALL6.
10834      bltz  rt,   .L1                    ; LONGCALL6/17_PCREL
10835      sethi ta,   hi20(symbol)           ; HI20/PTR
10836      ori   ta, ta,  lo12(symbol)        ; LO12S0_ORI/PTR
10837      jral  ta                           ; PTR_RES/EMPTY/INSN16
10838      .L1  */
10839
10840   bfd_vma laddr;
10841   uint32_t insn;
10842   Elf_Internal_Rela *em_irel, *cond_irel, *irelend;
10843   bfd_signed_vma foff;
10844
10845   irelend = internal_relocs + sec->reloc_count;
10846   laddr = irel->r_offset;
10847
10848   /* Get the reloc for the address from which the register is
10849      being loaded.  This reloc will tell us which function is
10850      actually being called.  */
10851   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10852                                          R_NDS32_EMPTY, irel->r_addend);
10853
10854   if (em_irel == irelend)
10855     {
10856       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL6",
10857                           (uint64_t) irel->r_offset);
10858       return FALSE;
10859     }
10860
10861   /* Get the value of the symbol referred to by the reloc.  */
10862   foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr);
10863
10864   if (foff == 0
10865       || foff < -CONSERVATIVE_24BIT_S1
10866       || foff >= CONSERVATIVE_24BIT_S1)
10867     return FALSE;
10868
10869   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
10870   insn = bfd_getb32 (contents + irel->r_addend);
10871   if (insn & 0x80000000)
10872     return FALSE;
10873
10874   insn = bfd_getb32 (contents + laddr);
10875   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10876     {
10877       /* Relax to  bgezal   rt, label ; 17_PCREL
10878          or        bltzal   rt, label ; 17_PCREL.  */
10879
10880       /* Convert to complimentary conditional call.  */
10881       *insn_len = 0;
10882       insn = CONVERT_CONDITION_CALL (insn);
10883       bfd_putb32 (insn, contents + em_irel->r_offset);
10884
10885       em_irel->r_info =
10886         ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA);
10887
10888       /* Set resolved relocation.  */
10889       cond_irel =
10890         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10891                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10892       if (cond_irel == irelend)
10893         {
10894           _bfd_error_handler (unrecognized_reloc_msg, abfd,
10895                               "R_NDS32_LONGCALL6", (uint64_t) irel->r_offset);
10896           return FALSE;
10897         }
10898       cond_irel->r_addend = 1;
10899
10900       /* Clear relocations.  */
10901
10902       irel->r_info =
10903         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10904
10905       cond_irel =
10906         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10907                                      R_NDS32_17_PCREL_RELA, laddr);
10908       if (cond_irel != irelend)
10909         cond_irel->r_info =
10910           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10911
10912       cond_irel =
10913         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10914                                      R_NDS32_INSN16, irel->r_addend);
10915       if (cond_irel != irelend)
10916         cond_irel->r_info =
10917           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10918
10919     }
10920   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
10921     {
10922       /* Relax to the following instruction sequence
10923          bltz  rt, .L1  ; LONGCALL2/17_PCREL
10924          jal   symbol   ; 25_PCREL/PTR_RES
10925          .L1  */
10926       *insn_len = 4;
10927       /* Convert instruction.  */
10928       insn = INSN_JAL;
10929       bfd_putb32 (insn, contents + em_irel->r_offset);
10930
10931       /* Convert relocations.  */
10932       em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10933                                       R_NDS32_25_PCREL_RELA);
10934       irel->r_info =
10935         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5);
10936
10937       /* Set resolved relocation.  */
10938       cond_irel =
10939         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10940                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10941       if (cond_irel == irelend)
10942         {
10943           _bfd_error_handler (unrecognized_reloc_msg, abfd,
10944                               "R_NDS32_LONGCALL6", (uint64_t) irel->r_offset);
10945           return FALSE;
10946         }
10947       cond_irel->r_addend = 1;
10948
10949       cond_irel =
10950         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10951                                      R_NDS32_INSN16, irel->r_addend);
10952       if (cond_irel != irelend)
10953         cond_irel->r_info =
10954           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10955     }
10956   return TRUE;
10957 }
10958
10959 /* Relax LONGJUMP4 relocation for nds32_elf_relax_section.  */
10960
10961 static bfd_boolean
10962 nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10963                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10964                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10965                            Elf_Internal_Shdr *symtab_hdr)
10966 {
10967   /* The pattern for LONGJUMP4.
10968      sethi ta, hi20(symbol)     ; LONGJUMP4/HI20
10969      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10970      jr    ta                   ; PTR_RES/INSN16/EMPTY  */
10971
10972   bfd_vma laddr;
10973   int seq_len;  /* Original length of instruction sequence.  */
10974   uint32_t insn;
10975   Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend;
10976   bfd_signed_vma foff;
10977
10978   irelend = internal_relocs + sec->reloc_count;
10979   seq_len = GET_SEQ_LEN (irel->r_addend);
10980   laddr = irel->r_offset;
10981   *insn_len = seq_len;
10982
10983   /* Get the reloc for the address from which the register is
10984      being loaded.  This reloc will tell us which function is
10985      actually being called.  */
10986
10987   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10988                                          R_NDS32_HI20_RELA, laddr);
10989
10990   if (hi_irel == irelend)
10991     {
10992       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
10993                           (uint64_t) irel->r_offset);
10994       return FALSE;
10995     }
10996
10997   /* Get the value of the symbol referred to by the reloc.  */
10998   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr);
10999
11000   if (foff == 0
11001       || foff >= CONSERVATIVE_24BIT_S1
11002       || foff < -CONSERVATIVE_24BIT_S1)
11003     return FALSE;
11004
11005   /* Convert it to "j label", it may be converted to j8 in the final
11006      pass of relaxation.  Therefore, we do not consider this currently.  */
11007   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11008                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
11009   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11010                                          R_NDS32_EMPTY, irel->r_addend);
11011
11012   if (ptr_irel == irelend || em_irel == irelend)
11013     {
11014       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
11015                           (uint64_t) irel->r_offset);
11016       return FALSE;
11017     }
11018
11019   em_irel->r_info =
11020     ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA);
11021   ptr_irel->r_addend = 1;
11022
11023   /* Write instruction.  */
11024   insn = INSN_J;
11025   bfd_putb32 (insn, contents + em_irel->r_offset);
11026
11027   /* Clear relocations.  */
11028   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11029
11030   /* If there is function cse, HI20 can not remove now.  */
11031   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11032                                            R_NDS32_LONGJUMP4, laddr);
11033   if (call_irel == irelend)
11034     {
11035       *insn_len = 0;
11036       hi_irel->r_info =
11037         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
11038     }
11039
11040   return TRUE;
11041 }
11042
11043 /* Relax LONGJUMP5 relocation for nds32_elf_relax_section.  */
11044
11045 static bfd_boolean
11046 nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11047                            Elf_Internal_Rela *internal_relocs, int *insn_len,
11048                            int *seq_len, bfd_byte *contents,
11049                            Elf_Internal_Sym *isymbuf,
11050                            Elf_Internal_Shdr *symtab_hdr)
11051 {
11052   /* There are 2 variations for LONGJUMP5
11053      case 2-4;  1st insn convertible, 16-bit on.
11054      bnes38  rt, ra, .L1        ; LONGJUMP5/9_PCREL/INSN16
11055      j       label              ; 25_PCREL/INSN16
11056      $1:
11057
11058      case 4-4; 1st insn not convertible
11059      bne  rt, ra, .L1   ; LONGJUMP5/15_PCREL/INSN16
11060      j    label         ; 25_PCREL/INSN16
11061      .L1:  */
11062
11063   bfd_vma laddr;
11064   Elf_Internal_Rela *cond_irel,  *irelend;
11065   unsigned int i;
11066   bfd_signed_vma foff;
11067   uint32_t insn, re_insn = 0;
11068   uint16_t insn16, re_insn16 = 0;
11069   unsigned long reloc;
11070
11071   enum elf_nds32_reloc_type checked_types[] =
11072     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
11073       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
11074
11075   irelend = internal_relocs + sec->reloc_count;
11076   laddr = irel->r_offset;
11077
11078   /* Get the reloc for the address from which the register is
11079      being loaded.  This reloc will tell us which function is
11080      actually being called.  */
11081
11082   cond_irel =
11083     find_relocs_at_address_addr (irel, internal_relocs, irelend,
11084                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
11085   if (cond_irel == irelend)
11086     {
11087       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP5",
11088                           (uint64_t) irel->r_offset);
11089       return FALSE;
11090     }
11091
11092   /* Get the value of the symbol referred to by the reloc.  */
11093   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
11094
11095   if (foff == 0
11096       || foff < -CONSERVATIVE_16BIT_S1
11097       || foff >= CONSERVATIVE_16BIT_S1)
11098     return FALSE;
11099
11100   /* Get the all corresponding instructions.  */
11101   insn = bfd_getb32 (contents + laddr);
11102   /* Check instruction size.  */
11103   if (insn & 0x80000000)
11104     {
11105       *seq_len = 0;
11106       insn16 = insn >> 16;
11107       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
11108     }
11109   else
11110     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
11111
11112   if (N32_OP6 (re_insn) == N32_OP6_BR1
11113       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
11114     {
11115       /* beqs label ; 15_PCREL.  */
11116       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
11117       reloc = R_NDS32_15_PCREL_RELA;
11118     }
11119   else if (N32_OP6 (re_insn) == N32_OP6_BR2
11120            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
11121     {
11122       /* beqz label ; 17_PCREL.  */
11123       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
11124       reloc = R_NDS32_17_PCREL_RELA;
11125     }
11126   else if ( N32_OP6 (re_insn) == N32_OP6_BR3
11127            && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1)
11128     {
11129       /* beqc label ; 9_PCREL.  */
11130       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
11131       reloc = R_NDS32_WORD_9_PCREL_RELA;
11132     }
11133   else
11134     return FALSE;
11135
11136   /* Set all relocations.  */
11137   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc);
11138
11139   /* Clean relocations.  */
11140   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11141   for (i = 0; i < ARRAY_SIZE (checked_types); i++)
11142     {
11143       cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11144                                                checked_types[i], laddr);
11145       if (cond_irel != irelend)
11146         {
11147           if (*seq_len == 0
11148               && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
11149             {
11150               /* If the branch instruction is 2 byte, it cannot remove
11151                  directly.  Only convert it to nop16 and remove it after
11152                  checking alignment issue.  */
11153               insn16 = NDS32_NOP16;
11154               bfd_putb16 (insn16, contents + laddr);
11155               cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
11156             }
11157           else
11158             cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11159                                               R_NDS32_NONE);
11160         }
11161     }
11162   *insn_len = 0;
11163
11164   return TRUE;
11165 }
11166
11167 /* Relax LONGJUMP6 relocation for nds32_elf_relax_section.  */
11168
11169 static bfd_boolean
11170 nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11171                            Elf_Internal_Rela *internal_relocs, int *insn_len,
11172                            int *seq_len, bfd_byte *contents,
11173                            Elf_Internal_Sym *isymbuf,
11174                            Elf_Internal_Shdr *symtab_hdr)
11175 {
11176   /* There are 5 variations for LONGJUMP6
11177      case : 2-4-4-4; 1st insn convertible, 16-bit on.
11178      bnes38   rt, ra, .L1               ; LONGJUMP6/15_PCREL/INSN16
11179      sethi    ta, hi20(symbol)          ; HI20/PTR
11180      ori      ta, ta, lo12(symbol)      ; LO12S0_ORI/PTR
11181      jr       ta                        ; PTR_RES/INSN16/EMPTY
11182      .L1:
11183
11184      case : 4-4-4-4; 1st insn not convertible, 16-bit on.
11185      bne   rt, ra, .L1          ; LONGJUMP6/15_PCREL/INSN16
11186      sethi ta, hi20(symbol)     ; HI20/PTR
11187      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
11188      jr    ta                   ; PTR_RES/INSN16/EMPTY
11189      .L1:  */
11190
11191   enum elf_nds32_reloc_type checked_types[] =
11192     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
11193       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
11194
11195   int reloc_off = 0, cond_removed = 0;
11196   bfd_vma laddr;
11197   Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel;
11198   unsigned int i;
11199   bfd_signed_vma foff;
11200   uint32_t insn, re_insn = 0;
11201   uint16_t insn16, re_insn16 = 0;
11202   unsigned long reloc;
11203
11204   irelend = internal_relocs + sec->reloc_count;
11205   laddr = irel->r_offset;
11206
11207   /* Get the reloc for the address from which the register is
11208      being loaded.  This reloc will tell us which function is
11209      actually being called.  */
11210   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11211                                          R_NDS32_EMPTY, irel->r_addend);
11212
11213   if (em_irel == irelend)
11214     {
11215       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP6",
11216                           (uint64_t) irel->r_offset);
11217       return FALSE;
11218     }
11219
11220   /* Get the value of the symbol referred to by the reloc.  */
11221   foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr);
11222
11223   if (foff == 0
11224       || foff < -CONSERVATIVE_24BIT_S1
11225       || foff >= CONSERVATIVE_24BIT_S1)
11226     return FALSE;
11227
11228   insn = bfd_getb32 (contents + laddr);
11229   /* Check instruction size.  */
11230   if (insn & 0x80000000)
11231     {
11232       *seq_len = 0;
11233       insn16 = insn >> 16;
11234       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
11235     }
11236   else
11237     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
11238
11239   /* For simplicity of coding, we are going to modify the section
11240      contents, the section relocs, and the BFD symbol table.  We
11241      must tell the rest of the code not to free up this
11242      information.  It would be possible to instead create a table
11243      of changes which have to be made, as is done in coff-mips.c;
11244      that would be more work, but would require less memory when
11245      the linker is run.  */
11246
11247   if (N32_OP6 (re_insn) == N32_OP6_BR1
11248       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
11249     {
11250       /* beqs     label    ; 15_PCREL.  */
11251       bfd_putb32 (re_insn, contents + em_irel->r_offset);
11252       reloc = R_NDS32_15_PCREL_RELA;
11253       cond_removed = 1;
11254     }
11255   else if (N32_OP6 (re_insn) == N32_OP6_BR2
11256            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
11257     {
11258       /* beqz     label ; 17_PCREL.  */
11259       bfd_putb32 (re_insn, contents + em_irel->r_offset);
11260       reloc = R_NDS32_17_PCREL_RELA;
11261       cond_removed = 1;
11262     }
11263   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
11264            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
11265     {
11266       /* Relax to one of the following 2 variations
11267
11268          case 2-4;  1st insn convertible, 16-bit on.
11269          bnes38  rt, ra, .L1    ; LONGJUMP5/9_PCREL/INSN16
11270          j       label          ; 25_PCREL/INSN16
11271          $1:
11272
11273          case 4-4; 1st insn not convertible
11274          bne  rt, ra, .L1       ; LONGJUMP5/15_PCREL/INSN16
11275          j    label             ; 25_PCREL/INSN16
11276          .L1:  */
11277
11278       /* Use j label as second instruction.  */
11279       insn = INSN_J;
11280       reloc = R_NDS32_25_PCREL_RELA;
11281       bfd_putb32 (insn, contents + em_irel->r_offset);
11282     }
11283   else
11284     return FALSE;
11285
11286   /* Set all relocations.  */
11287   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc);
11288
11289   cond_irel =
11290     find_relocs_at_address_addr (irel, internal_relocs, irelend,
11291                                  R_NDS32_PTR_RESOLVED, em_irel->r_offset);
11292   cond_irel->r_addend = 1;
11293
11294   /* Use INSN16 of first branch instruction to distinguish if keeping
11295      INSN16 of final instruction or not.  */
11296   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11297                                            R_NDS32_INSN16, irel->r_offset);
11298   if (insn_irel == irelend)
11299     {
11300       /* Clean the final INSN16.  */
11301       insn_irel =
11302         find_relocs_at_address_addr (irel, internal_relocs, irelend,
11303                                      R_NDS32_INSN16, em_irel->r_offset);
11304       insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11305                                         R_NDS32_NONE);
11306     }
11307
11308   if (cond_removed == 1)
11309     {
11310       *insn_len = 0;
11311
11312       /* Clear relocations.  */
11313       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11314
11315       for (i = 0; i < ARRAY_SIZE (checked_types); i++)
11316         {
11317           cond_irel =
11318             find_relocs_at_address_addr (irel, internal_relocs, irelend,
11319                                          checked_types[i], laddr);
11320           if (cond_irel != irelend)
11321             {
11322               if (*seq_len == 0
11323                   && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
11324                 {
11325                   /* If the branch instruction is 2 byte, it cannot remove
11326                      directly.  Only convert it to nop16 and remove it after
11327                      checking alignment issue.  */
11328                   insn16 = NDS32_NOP16;
11329                   bfd_putb16 (insn16, contents + laddr);
11330                   cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
11331                 }
11332               else
11333                 cond_irel->r_info =
11334                   ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
11335             }
11336         }
11337     }
11338   else
11339     {
11340       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11341                                    R_NDS32_LONGJUMP5);
11342     }
11343
11344   return TRUE;
11345 }
11346
11347 /* Relax LONGJUMP7 relocation for nds32_elf_relax_section.  */
11348
11349 static bfd_boolean
11350 nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11351                            Elf_Internal_Rela *internal_relocs, int *insn_len,
11352                            int *seq_len, bfd_byte *contents,
11353                            Elf_Internal_Sym *isymbuf,
11354                            Elf_Internal_Shdr *symtab_hdr)
11355 {
11356   /* There are 2 variations for LONGJUMP5
11357      case 2-4;  1st insn convertible, 16-bit on.
11358      movi55  ta, imm11          ; LONGJUMP7/INSN16
11359      beq     rt, ta, label      ; 15_PCREL
11360
11361      case 4-4; 1st insn not convertible
11362      movi55  ta, imm11          ; LONGJUMP7/INSN16
11363      beq     rt, ta, label      ; 15_PCREL  */
11364
11365   bfd_vma laddr;
11366   Elf_Internal_Rela *cond_irel,  *irelend, *insn_irel;
11367   bfd_signed_vma foff;
11368   uint32_t insn, re_insn = 0;
11369   uint16_t insn16;
11370   uint32_t imm11;
11371
11372   irelend = internal_relocs + sec->reloc_count;
11373   laddr = irel->r_offset;
11374
11375   /* Get the reloc for the address from which the register is
11376      being loaded.  This reloc will tell us which function is
11377      actually being called.  */
11378
11379   cond_irel =
11380     find_relocs_at_address_addr (irel, internal_relocs, irelend,
11381                                  R_NDS32_15_PCREL_RELA, irel->r_addend);
11382   if (cond_irel == irelend)
11383     {
11384       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP7",
11385                           (uint64_t) irel->r_offset);
11386       return FALSE;
11387     }
11388
11389   /* Get the value of the symbol referred to by the reloc.  */
11390   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
11391
11392   if (foff == 0
11393       || foff < -CONSERVATIVE_8BIT_S1
11394       || foff >= CONSERVATIVE_8BIT_S1)
11395     return FALSE;
11396
11397   /* Get the first instruction for its size.  */
11398   insn = bfd_getb32 (contents + laddr);
11399   if (insn & 0x80000000)
11400     {
11401       *seq_len = 0;
11402       /* Get the immediate from movi55.  */
11403       imm11 = N16_IMM5S (insn >> 16);
11404     }
11405   else
11406     {
11407       /* Get the immediate from movi.  */
11408       imm11 = N32_IMM20S (insn);
11409     }
11410
11411   /* Get the branch instruction.  */
11412   insn = bfd_getb32 (contents + irel->r_addend);
11413   /* Convert instruction to BR3.  */
11414   if ((insn >> 14) & 0x1)
11415     re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0);
11416   else
11417     re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0);
11418
11419   bfd_putb32 (re_insn, contents + cond_irel->r_offset);
11420
11421   /* Set all relocations.  */
11422   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11423                                     R_NDS32_WORD_9_PCREL_RELA);
11424
11425   /* Clean relocations.  */
11426   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11427   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11428                                            R_NDS32_INSN16, irel->r_offset);
11429   if (insn_irel != irelend)
11430     {
11431       if (*seq_len == 0)
11432         {
11433           /* If the first insntruction is 16bit, convert it to nop16.  */
11434           insn16 = NDS32_NOP16;
11435           bfd_putb16 (insn16, contents + laddr);
11436           insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
11437         }
11438       else
11439         cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
11440                                           R_NDS32_NONE);
11441     }
11442   *insn_len = 0;
11443
11444   return TRUE;
11445 }
11446
11447 /* We figure out and reassign the best gp value in nds32_elf_final_sda_base
11448    for each relax round. But the gp may changed dramatically and then cause
11449    the truncated to fit errors for the the converted gp instructions.
11450    Therefore, we must reserve the minimum but safe enough size to prevent it.  */
11451
11452 static bfd_boolean
11453 nds32_elf_relax_guard (bfd_vma *access_addr, bfd_vma local_sda, asection *sec,
11454                        Elf_Internal_Rela *irel, bfd_boolean *again,
11455                        bfd_boolean init,
11456                        struct elf_nds32_link_hash_table *table,
11457                        Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
11458
11459 {
11460   int offset_to_gp;
11461   static bfd_boolean sec_pass = FALSE;
11462   static asection *first_sec = NULL, *sym_sec;
11463   /* Record the number of instructions which may be removed.  */
11464   static int count = 0, record_count;
11465   Elf_Internal_Sym *isym;
11466   struct elf_link_hash_entry *h = NULL;
11467   int indx;
11468   unsigned long r_symndx;
11469   bfd *abfd = sec->owner;
11470   static bfd_vma record_sda = 0;
11471   int sda_offset = 0;
11472
11473   /* Force doing relaxation when hyper-relax is high.  */
11474   if (table->hyper_relax == 2)
11475     return TRUE;
11476
11477   /* Do not relax the load/store patterns for the first
11478      relax round.  */
11479   if (init)
11480     {
11481       if (!first_sec)
11482         first_sec = sec;
11483       else if (first_sec == sec)
11484         {
11485           record_count = count;
11486           count = 0;
11487           sec_pass = TRUE;
11488         }
11489
11490       if (!sec_pass)
11491         *again = TRUE;
11492
11493       return TRUE;
11494     }
11495
11496   /* Generally, _SDA_BASE_ is fixed or smaller. But the large
11497      DATA_SEGMENT_ALIGN size in the linker script may make it
11498      get even bigger.  */
11499   if (record_sda == 0)
11500     record_sda = local_sda;
11501   else if (local_sda > record_sda)
11502     sda_offset = local_sda - record_sda;
11503
11504   /* Assume the instruction will be removed in the best case.  */
11505   count++;
11506
11507   /* We record the offset to gp for each symbol, and then check
11508      if it is changed dramatically after relaxing.
11509      (global symbol): elf32_nds32_hash_entry (h)->offset_to_gp
11510      (local symbol) : elf32_nds32_local_gp_offset (abfd)[r_symndx].  */
11511   r_symndx = ELF32_R_SYM (irel->r_info);
11512   if (r_symndx >= symtab_hdr->sh_info)
11513     {
11514       /* Global symbols.  */
11515       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
11516       h = elf_sym_hashes (abfd)[indx];
11517       sym_sec = h->root.u.def.section;
11518       if (NDS32_GUARD_SEC_P (sym_sec->flags)
11519           || bfd_is_abs_section (sym_sec))
11520         {
11521           /* Forbid doing relaxation when hyper-relax is low.  */
11522           if (table->hyper_relax == 0)
11523             return FALSE;
11524
11525           offset_to_gp = *access_addr - local_sda;
11526           if (elf32_nds32_hash_entry (h)->offset_to_gp == 0)
11527             elf32_nds32_hash_entry (h)->offset_to_gp = offset_to_gp;
11528           else if (abs (elf32_nds32_hash_entry (h)->offset_to_gp)
11529                    < abs (offset_to_gp) - sda_offset)
11530             {
11531               /* This may cause the error, so we reserve the
11532                  safe enough size for relaxing.  */
11533               if (*access_addr >= local_sda)
11534                 *access_addr += (record_count * 4);
11535               else
11536                 *access_addr -= (record_count * 4);
11537             }
11538           return sec_pass;
11539         }
11540     }
11541   else
11542     {
11543       /* Local symbols.  */
11544       if (!elf32_nds32_allocate_local_sym_info (abfd))
11545         return FALSE;
11546       isym = isymbuf + r_symndx;
11547
11548       sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
11549       if (NDS32_GUARD_SEC_P (sym_sec->flags))
11550         {
11551           /* Forbid doing relaxation when hyper-relax is low.  */
11552           if (table->hyper_relax == 0)
11553             return FALSE;
11554
11555           offset_to_gp = *access_addr - local_sda;
11556           if (elf32_nds32_local_gp_offset (abfd)[r_symndx] == 0)
11557             elf32_nds32_local_gp_offset (abfd)[r_symndx] = offset_to_gp;
11558           else if (abs (elf32_nds32_local_gp_offset (abfd)[r_symndx])
11559                    < abs (offset_to_gp) - sda_offset)
11560             {
11561               /* This may cause the error, so we reserve the
11562                  safe enough size for relaxing.  */
11563               if (*access_addr >= local_sda)
11564                 *access_addr += (record_count * 4);
11565               else
11566                 *access_addr -= (record_count * 4);
11567             }
11568           return sec_pass;
11569         }
11570     }
11571
11572   return TRUE;
11573 }
11574
11575 #define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
11576
11577 /* Relax LOADSTORE relocation for nds32_elf_relax_section.  */
11578
11579 static bfd_boolean
11580 nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
11581                            asection *sec, Elf_Internal_Rela *irel,
11582                            Elf_Internal_Rela *internal_relocs, int *insn_len,
11583                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11584                            Elf_Internal_Shdr *symtab_hdr, int load_store_relax,
11585                            struct elf_nds32_link_hash_table *table)
11586 {
11587   int eliminate_sethi = 0, range_type;
11588   unsigned int i;
11589   bfd_vma local_sda, laddr;
11590   int seq_len;  /* Original length of instruction sequence.  */
11591   uint32_t insn;
11592   Elf_Internal_Rela *hi_irelfn = NULL, *irelend;
11593   bfd_vma access_addr = 0;
11594   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
11595   struct elf_link_hash_entry *h = NULL;
11596   int indx;
11597   enum elf_nds32_reloc_type checked_types[] =
11598     { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20,
11599       R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20,
11600       R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20,
11601       R_NDS32_TLS_LE_HI20
11602     };
11603
11604   irelend = internal_relocs + sec->reloc_count;
11605   seq_len = GET_SEQ_LEN (irel->r_addend);
11606   laddr = irel->r_offset;
11607   *insn_len = seq_len;
11608
11609   /* Get the high part relocation.  */
11610   for (i = 0; i < ARRAY_SIZE (checked_types); i++)
11611     {
11612       hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
11613                                                checked_types[i], laddr);
11614       if (hi_irelfn != irelend)
11615         break;
11616     }
11617
11618   if (hi_irelfn == irelend)
11619     {
11620       /* Not R_NDS32_HI20_RELA.  */
11621       if (i != 0)
11622         _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LOADSTORE",
11623                             (uint64_t) irel->r_offset);
11624       return FALSE;
11625     }
11626
11627   range_type = GET_LOADSTORE_RANGE (irel->r_addend);
11628   nds32_elf_final_sda_base (sec->output_section->owner,
11629                             link_info, &local_sda, FALSE);
11630
11631   switch (ELF32_R_TYPE (hi_irelfn->r_info))
11632     {
11633     case R_NDS32_HI20_RELA:
11634       insn = bfd_getb32 (contents + laddr);
11635       access_addr =
11636         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
11637
11638       if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info)
11639         {
11640           indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
11641           h = elf_sym_hashes (abfd)[indx];
11642         }
11643
11644       /* Try movi.  */
11645       if (range_type == NDS32_LOADSTORE_IMM
11646           && access_addr < CONSERVATIVE_20BIT
11647           && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
11648         {
11649           eliminate_sethi = 1;
11650           break;
11651         }
11652
11653       if (h && strcmp (h->root.root.string, FP_BASE_NAME) == 0)
11654         {
11655           eliminate_sethi = 1;
11656           break;
11657         }
11658       else if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, hi_irelfn,
11659                                        NULL, FALSE, table, isymbuf, symtab_hdr))
11660         return FALSE;
11661
11662       if (!load_store_relax)
11663         return FALSE;
11664
11665       /* Case for set gp register.  */
11666       if (N32_RT5 (insn) == REG_GP)
11667         return FALSE;
11668
11669       if (range_type == NDS32_LOADSTORE_FLOAT_S
11670           || range_type == NDS32_LOADSTORE_FLOAT_D)
11671         {
11672           range_l = sdata_range[0][0];
11673           range_h = sdata_range[0][1];
11674         }
11675       else
11676         {
11677           range_l = sdata_range[1][0];
11678           range_h = sdata_range[1][1];
11679         }
11680       break;
11681
11682     default:
11683       return FALSE;
11684     }
11685
11686   /* Delete sethi instruction.  */
11687   if (eliminate_sethi == 1
11688       || (local_sda <= access_addr && (access_addr - local_sda) < range_h)
11689       || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
11690     {
11691       hi_irelfn->r_info =
11692         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
11693       irel->r_info =
11694         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11695       *insn_len = 0;
11696       return TRUE;
11697     }
11698
11699   return FALSE;
11700 }
11701
11702 /* Relax LO12 relocation for nds32_elf_relax_section.  */
11703
11704 static void
11705 nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
11706                       asection *sec, Elf_Internal_Rela *irel,
11707                       Elf_Internal_Rela *internal_relocs, bfd_byte *contents,
11708                       Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr,
11709                       struct elf_nds32_link_hash_table *table)
11710 {
11711   uint32_t insn;
11712   bfd_vma local_sda, laddr;
11713   unsigned long reloc;
11714   bfd_vma access_addr;
11715   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
11716   Elf_Internal_Rela *irelfn = NULL, *irelend;
11717   struct elf_link_hash_entry *h = NULL;
11718   int indx;
11719
11720   /* For SDA base relative relaxation.  */
11721   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11722                             &local_sda, FALSE);
11723
11724   irelend = internal_relocs + sec->reloc_count;
11725   laddr = irel->r_offset;
11726   insn = bfd_getb32 (contents + laddr);
11727
11728   if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI)
11729     return;
11730
11731   access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11732
11733   if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
11734     {
11735       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
11736       h = elf_sym_hashes (abfd)[indx];
11737     }
11738
11739   /* Try movi.  */
11740   if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT
11741       && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
11742     {
11743       reloc = R_NDS32_20_RELA;
11744       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11745       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11746       bfd_putb32 (insn, contents + laddr);
11747     }
11748   else
11749     {
11750       if (h && strcmp (h->root.root.string, FP_BASE_NAME) == 0)
11751         {
11752           /* Fall through.  */
11753         }
11754       else if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, irel, NULL,
11755                                        FALSE, table, isymbuf, symtab_hdr))
11756         return;
11757
11758       range_l = sdata_range[1][0];
11759       range_h = sdata_range[1][1];
11760       switch (ELF32_R_TYPE (irel->r_info))
11761         {
11762         case R_NDS32_LO12S0_RELA:
11763           reloc = R_NDS32_SDA19S0_RELA;
11764           break;
11765         case R_NDS32_LO12S1_RELA:
11766           reloc = R_NDS32_SDA18S1_RELA;
11767           break;
11768         case R_NDS32_LO12S2_RELA:
11769           reloc = R_NDS32_SDA17S2_RELA;
11770           break;
11771         case R_NDS32_LO12S2_DP_RELA:
11772           range_l = sdata_range[0][0];
11773           range_h = sdata_range[0][1];
11774           reloc = R_NDS32_SDA12S2_DP_RELA;
11775           break;
11776         case R_NDS32_LO12S2_SP_RELA:
11777           range_l = sdata_range[0][0];
11778           range_h = sdata_range[0][1];
11779           reloc = R_NDS32_SDA12S2_SP_RELA;
11780           break;
11781         default:
11782           return;
11783         }
11784
11785       /* There are range_h and range_l because linker has to promise
11786          all sections move cross one page together.  */
11787       if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
11788           || (local_sda > access_addr && (local_sda - access_addr) <= range_l)
11789           || (h && strcmp (h->root.root.string, FP_BASE_NAME) == 0))
11790         {
11791           if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP)
11792             {
11793               /* Maybe we should add R_NDS32_INSN16 reloc type here
11794                  or manually do some optimization.  sethi can't be
11795                  eliminated when updating $gp so the relative ori
11796                  needs to be preserved.  */
11797               return;
11798             }
11799           if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info),
11800                                         &insn))
11801             return;
11802           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11803           bfd_putb32 (insn, contents + laddr);
11804
11805           irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11806                                            R_NDS32_INSN16);
11807           /* SDA17 must keep INSN16 for converting fp_as_gp.  */
11808           if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA)
11809             irelfn->r_info =
11810               ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE);
11811
11812         }
11813     }
11814   return;
11815 }
11816
11817 /* Relax PTR relocation for nds32_elf_relax_section.  */
11818
11819 static bfd_boolean
11820 nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11821                      Elf_Internal_Rela *internal_relocs, int *insn_len,
11822                      int *seq_len, bfd_byte *contents)
11823 {
11824   Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel;
11825
11826   irelend = internal_relocs + sec->reloc_count;
11827
11828   re_irel =
11829     find_relocs_at_address_addr (irel, internal_relocs, irelend,
11830                                  R_NDS32_PTR_RESOLVED, irel->r_addend);
11831
11832   if (re_irel == irelend)
11833     {
11834       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_PTR",
11835                           (uint64_t) irel->r_offset);
11836       return FALSE;
11837     }
11838
11839   if (re_irel->r_addend != 1)
11840     return FALSE;
11841
11842   /* Pointed target is relaxed and no longer needs this void *,
11843      change the type to NONE.  */
11844   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11845
11846   /* Find PTR_COUNT to decide remove it or not.  If PTR_COUNT does
11847      not exist, it means only count 1 and remove it directly.  */
11848   /* TODO: I hope we can obsolate R_NDS32_COUNT in the future.  */
11849   count_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11850                                        R_NDS32_PTR_COUNT);
11851   ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11852                                      R_NDS32_PTR);
11853   if (count_irel != irelend)
11854     {
11855       if (--count_irel->r_addend > 0)
11856         return FALSE;
11857     }
11858
11859   if (ptr_irel != irelend)
11860     return FALSE;
11861
11862   /* If the PTR_COUNT is already 0, remove current instruction.  */
11863   *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset);
11864   *insn_len = 0;
11865   return TRUE;
11866 }
11867
11868 /* Relax LWC relocation for nds32_elf_relax_section.  */
11869
11870 static void
11871 nds32_elf_relax_flsi (struct bfd_link_info *link_info, bfd *abfd,
11872                       asection *sec, Elf_Internal_Rela *irel,
11873                       Elf_Internal_Rela *internal_relocs,
11874                       bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11875                       Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11876 {
11877   /* Pattern:
11878      sethi    ra, hi20(symbol)      ; HI20/LOADSTORE
11879      ori      ra, ra, lo12(symbol)  ; LO12S0/PTR/PTR/.../INSN16
11880      flsi     fsa, [ra + offset1]   ; LSI/PTR_RESOLVED/INSN16
11881      flsi     fsb, [ra + offset2]   ; LSI/PTR_RESOLVED/INSN16
11882      ...  */
11883
11884   uint32_t insn;
11885   bfd_vma local_sda, laddr;
11886   unsigned long reloc;
11887   bfd_vma access_addr, flsi_offset;
11888   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
11889   Elf_Internal_Rela *irelend, *re_irel;
11890   unsigned int opcode;
11891
11892   irelend = internal_relocs + sec->reloc_count;
11893   laddr = irel->r_offset;
11894   insn = bfd_getb32 (contents + laddr);
11895
11896   if ((insn & 0x80000000) || !is_sda_access_insn (insn))
11897     return;
11898
11899   /* Can not do relaxation for bi format.  */
11900   if ((insn & 0x1000))
11901     return;
11902
11903   /* Only deal with flsi, fssi, fldi, fsdi, so far.  */
11904   opcode = N32_OP6 (insn);
11905   if ((opcode == N32_OP6_LWC) || (opcode == N32_OP6_SWC))
11906     reloc = R_NDS32_SDA12S2_SP_RELA;
11907   else if ((opcode == N32_OP6_LDC) || (opcode == N32_OP6_SDC))
11908     reloc = R_NDS32_SDA12S2_DP_RELA;
11909   else
11910     return;
11911
11912   re_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11913                                     R_NDS32_PTR_RESOLVED);
11914   if (re_irel == irelend)
11915     {
11916       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LSI",
11917                           (uint64_t) irel->r_offset);
11918       return;
11919     }
11920
11921   /* For SDA base relative relaxation.  */
11922   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11923                             &local_sda, FALSE);
11924   access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11925   flsi_offset = (insn & 0xfff) << 2;
11926   access_addr += flsi_offset;
11927   range_l = sdata_range[0][0];
11928   range_h = sdata_range[0][1];
11929
11930   if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
11931       || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
11932     {
11933       /* Turn flsi instruction into sda access format.  */
11934       insn = (insn & 0x7ff07000) | (REG_GP << 15);
11935
11936       /* Add relocation type to flsi.  */
11937       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11938       irel->r_addend += flsi_offset;
11939       bfd_putb32 (insn, contents + re_irel->r_offset);
11940
11941       re_irel->r_addend |= 1;
11942       *again = TRUE;
11943     }
11944 }
11945
11946 static bfd_boolean
11947 nds32_relax_adjust_label (bfd *abfd, asection *sec,
11948                           Elf_Internal_Rela *internal_relocs,
11949                           bfd_byte *contents,
11950                           nds32_elf_blank_t **relax_blank_list,
11951                           int optimize, int opt_size)
11952 {
11953   /* This code block is used to adjust 4-byte alignment by relax a pair
11954      of instruction a time.
11955
11956      It recognizes three types of relocations.
11957      1. R_NDS32_LABEL - a alignment.
11958      2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11959      3. is_16bit_NOP () - remove a 16-bit instruction.  */
11960
11961   /* TODO: It seems currently implementation only support 4-byte alignment.
11962      We should handle any-alignment.  */
11963
11964   Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel;
11965   Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL;
11966   Elf_Internal_Rela rel_temp;
11967   Elf_Internal_Rela *irelend;
11968   bfd_vma address;
11969   uint16_t insn16;
11970
11971   /* Checking for branch relaxation relies on the relocations to
11972      be sorted on 'r_offset'.  This is not guaranteed so we must sort.  */
11973   nds32_insertion_sort (internal_relocs, sec->reloc_count,
11974                         sizeof (Elf_Internal_Rela), compar_reloc);
11975
11976   irelend = internal_relocs + sec->reloc_count;
11977
11978   /* Force R_NDS32_LABEL before R_NDS32_INSN16.  */
11979   /* FIXME: Can we generate the right order in assembler?
11980      So we don't have to swapping them here.  */
11981
11982   for (label_rel = internal_relocs, insn_rel = internal_relocs;
11983        label_rel < irelend; label_rel++)
11984     {
11985       if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL)
11986         continue;
11987
11988       /* Find the first reloc has the same offset with label_rel.  */
11989       while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset)
11990         insn_rel++;
11991
11992       for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset;
11993            insn_rel++)
11994         /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11995            address.  */
11996         if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16)
11997           break;
11998
11999       if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset
12000           && insn_rel < label_rel)
12001         {
12002           /* Swap the two reloc if the R_NDS32_INSN16 is
12003              before R_NDS32_LABEL.  */
12004           memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela));
12005           memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela));
12006           memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela));
12007         }
12008     }
12009
12010   label_rel = NULL;
12011   insn_rel = NULL;
12012   /* If there were a sequence of R_NDS32_LABEL end up with .align 2
12013      or higher, remove other R_NDS32_LABEL with lower alignment.
12014      If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
12015      then the R_NDS32_LABEL sequence is broke.  */
12016   for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++)
12017     {
12018       if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL)
12019         {
12020           if (label_rel == NULL)
12021             {
12022               if (tmp_rel->r_addend < 2)
12023                 label_rel = tmp_rel;
12024               continue;
12025             }
12026           else if (tmp_rel->r_addend > 1)
12027             {
12028               /* Remove all LABEL relocation from label_rel to tmp_rel
12029                  including relocations with same offset as tmp_rel.  */
12030               for (tmp2_rel = label_rel; tmp2_rel < tmp_rel; tmp2_rel++)
12031                 {
12032                   if (tmp2_rel->r_offset == tmp_rel->r_offset)
12033                     break;
12034
12035                   if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL
12036                       && tmp2_rel->r_addend < 2)
12037                     tmp2_rel->r_info =
12038                       ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info),
12039                                     R_NDS32_NONE);
12040                 }
12041               label_rel = NULL;
12042             }
12043         }
12044       else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel)
12045         {
12046           /* A new INSN16 which can be converted, so clear label_rel.  */
12047           if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs,
12048                                    irelend, &insn16)
12049               || is_16bit_NOP (abfd, sec, tmp_rel))
12050             label_rel = NULL;
12051         }
12052     }
12053
12054   label_rel = NULL;
12055   insn_rel = NULL;
12056   /* Optimized for speed and nothing has not been relaxed.
12057      It's time to align labels.
12058      We may convert a 16-bit instruction right before a label to
12059      32-bit, in order to align the label if necessary
12060      all reloc entries has been sorted by r_offset.  */
12061   for (irel = internal_relocs;
12062        irel < irelend && irel->r_offset < sec->size; irel++)
12063     {
12064       if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16
12065           && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL)
12066         continue;
12067
12068       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16)
12069         {
12070           /* A new INSN16 found, resize the old one.  */
12071           if (is_convert_32_to_16
12072               (abfd, sec, irel, internal_relocs, irelend, &insn16)
12073               || is_16bit_NOP (abfd, sec, irel))
12074             {
12075               if (insn_rel)
12076                 {
12077                   /* Previous INSN16 reloc exists, reduce its
12078                      size to 16-bit.  */
12079                   if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
12080                                            irelend, &insn16))
12081                     {
12082                       nds32_elf_write_16 (abfd, contents, insn_rel,
12083                                           internal_relocs, irelend, insn16);
12084
12085                       if (!insert_nds32_elf_blank_recalc_total
12086                           (relax_blank_list, insn_rel->r_offset + 2, 2))
12087                         return FALSE;
12088                     }
12089                   else if (is_16bit_NOP (abfd, sec, insn_rel))
12090                     {
12091                       if (!insert_nds32_elf_blank_recalc_total
12092                           (relax_blank_list, insn_rel->r_offset, 2))
12093                         return FALSE;
12094                     }
12095                   insn_rel->r_info =
12096                     ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE);
12097                 }
12098               /* Save the new one for later use.  */
12099               insn_rel = irel;
12100             }
12101           else
12102             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
12103                                          R_NDS32_NONE);
12104         }
12105       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL)
12106         {
12107           /* Search for label.  */
12108           int force_relax = 0;
12109
12110           /* Label on 16-bit instruction or optimization
12111              needless, just reset this reloc.  */
12112           insn16 = bfd_getb16 (contents + irel->r_offset);
12113           if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000)))
12114             {
12115               irel->r_info =
12116                 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
12117               continue;
12118             }
12119
12120           address =
12121             irel->r_offset - get_nds32_elf_blank_total (relax_blank_list,
12122                                                         irel->r_offset, 1);
12123
12124           if (!insn_rel)
12125             {
12126               /* Check if there is case which can not be aligned.  */
12127               if (irel->r_addend == 2 && address & 0x2)
12128                 return FALSE;
12129               continue;
12130             }
12131
12132           /* Try to align this label.  */
12133
12134           if ((irel->r_addend & 0x1f) < 2)
12135             {
12136               /* Check if there is a INSN16 at the same address.
12137                  Label_rel always seats before insn_rel after
12138                  our sort.  */
12139
12140               /* Search for INSN16 at LABEL location.  If INSN16 is at
12141                  same location and this LABEL alignment is lower than 2,
12142                  the INSN16 can be converted to 2-byte.  */
12143               for (tmp_rel = irel;
12144                    tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset;
12145                    tmp_rel++)
12146                 {
12147                   if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16
12148                       && (is_convert_32_to_16
12149                           (abfd, sec, tmp_rel, internal_relocs,
12150                            irelend, &insn16)
12151                           || is_16bit_NOP (abfd, sec, tmp_rel)))
12152                     {
12153                       force_relax = 1;
12154                       break;
12155                     }
12156                 }
12157             }
12158
12159           if (force_relax || irel->r_addend == 1 || address & 0x2)
12160             {
12161               /* Label not aligned.  */
12162               /* Previous reloc exists, reduce its size to 16-bit.  */
12163               if (is_convert_32_to_16 (abfd, sec, insn_rel,
12164                                        internal_relocs, irelend, &insn16))
12165                 {
12166                   nds32_elf_write_16 (abfd, contents, insn_rel,
12167                                       internal_relocs, irelend, insn16);
12168
12169                   if (!insert_nds32_elf_blank_recalc_total
12170                       (relax_blank_list, insn_rel->r_offset + 2, 2))
12171                     return FALSE;
12172                 }
12173               else if (is_16bit_NOP (abfd, sec, insn_rel))
12174                 {
12175                   if (!insert_nds32_elf_blank_recalc_total
12176                       (relax_blank_list, insn_rel->r_offset, 2))
12177                     return FALSE;
12178                 }
12179
12180             }
12181           /* INSN16 reloc is used.  */
12182           insn_rel = NULL;
12183         }
12184     }
12185
12186   address =
12187     sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0);
12188   if (insn_rel && (address & 0x2 || opt_size))
12189     {
12190       if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
12191                                irelend, &insn16))
12192         {
12193           nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs,
12194                               irelend, insn16);
12195           if (!insert_nds32_elf_blank_recalc_total
12196               (relax_blank_list, insn_rel->r_offset + 2, 2))
12197             return FALSE;
12198           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
12199                                            R_NDS32_NONE);
12200         }
12201       else if (is_16bit_NOP (abfd, sec, insn_rel))
12202         {
12203           if (!insert_nds32_elf_blank_recalc_total
12204               (relax_blank_list, insn_rel->r_offset, 2))
12205             return FALSE;
12206           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
12207                                            R_NDS32_NONE);
12208         }
12209     }
12210   insn_rel = NULL;
12211   return TRUE;
12212 }
12213
12214 static bfd_boolean
12215 nds32_elf_relax_section (bfd *abfd, asection *sec,
12216                          struct bfd_link_info *link_info, bfd_boolean *again)
12217 {
12218   nds32_elf_blank_t *relax_blank_list = NULL;
12219   Elf_Internal_Shdr *symtab_hdr;
12220   Elf_Internal_Rela *internal_relocs;
12221   Elf_Internal_Rela *irel;
12222   Elf_Internal_Rela *irelend;
12223   Elf_Internal_Sym *isymbuf = NULL;
12224   bfd_byte *contents = NULL;
12225   bfd_boolean result = TRUE;
12226   int optimize = 0;
12227   int opt_size = 0;
12228   uint32_t insn;
12229   uint16_t insn16;
12230
12231   /* Target dependnet option.  */
12232   struct elf_nds32_link_hash_table *table;
12233   int load_store_relax;
12234
12235   relax_blank_list = NULL;
12236
12237   *again = FALSE;
12238
12239   /* Nothing to do for
12240    * relocatable link or
12241    * non-relocatable section or
12242    * non-code section or
12243    * empty content or
12244    * no reloc entry.  */
12245   if (bfd_link_relocatable (link_info)
12246       || (sec->flags & SEC_RELOC) == 0
12247       || (sec->flags & SEC_EXCLUDE) != 0
12248       || (sec->flags & SEC_CODE) == 0
12249       || sec->size == 0
12250       || sec->reloc_count == 0)
12251     return TRUE;
12252
12253   /* 09.12.11 Workaround.  */
12254   /*  We have to adjust align for R_NDS32_LABEL if needed.
12255       The adjust approach only can fix 2-byte align once.  */
12256   if (sec->alignment_power > 2)
12257     return TRUE;
12258
12259   /* Do TLS model conversion once at first.  */
12260   nds32_elf_unify_tls_model (abfd, sec, contents, link_info);
12261
12262   /* The optimization type to do.  */
12263
12264   table = nds32_elf_hash_table (link_info);
12265
12266   /* Save the first section for abs symbol relaxation.
12267      This is used for checking gp relaxation in the
12268      nds32_elf_relax_loadstore and nds32_elf_relax_lo12.  */
12269   nds32_elf_relax_guard (NULL, 0, sec, NULL, again, TRUE,
12270                          table, NULL, NULL);
12271
12272   /* The begining of general relaxation.  */
12273
12274   if (is_SDA_BASE_set == 0)
12275     {
12276       bfd_vma gp;
12277       is_SDA_BASE_set = 1;
12278       nds32_elf_final_sda_base (sec->output_section->owner, link_info,
12279                                 &gp, FALSE);
12280       relax_range_measurement (abfd);
12281     }
12282
12283   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12284   /* Relocations MUST be kept in memory, because relaxation adjust them.  */
12285   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
12286                                                TRUE /* keep_memory */);
12287   if (internal_relocs == NULL)
12288     goto error_return;
12289
12290   irelend = internal_relocs + sec->reloc_count;
12291   irel = find_relocs_at_address (internal_relocs, internal_relocs,
12292                                  irelend, R_NDS32_RELAX_ENTRY);
12293
12294   if (irel == irelend)
12295     return TRUE;
12296
12297   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
12298     {
12299       if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG)
12300         return TRUE;
12301
12302       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG)
12303         optimize = 1;
12304
12305       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG)
12306         opt_size = 1;
12307     }
12308
12309   load_store_relax = table->load_store_relax;
12310
12311   /* Get symbol table and section content.  */
12312   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12313       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12314     goto error_return;
12315
12316   /* Do relax loop only when finalize is not done.
12317      Take care of relaxable relocs except INSN16.  */
12318   for (irel = internal_relocs; irel < irelend; irel++)
12319     {
12320       int seq_len;              /* Original length of instruction sequence.  */
12321       int insn_len = 0;         /* Final length of instruction sequence.  */
12322       bfd_boolean removed;
12323
12324       insn = 0;
12325       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
12326           && (irel->r_addend & 0x1f) >= 2)
12327         optimize = 1;
12328
12329       /* Relocation Types
12330          R_NDS32_LONGCALL1      53
12331          R_NDS32_LONGCALL2      54
12332          R_NDS32_LONGCALL3      55
12333          R_NDS32_LONGJUMP1      56
12334          R_NDS32_LONGJUMP2      57
12335          R_NDS32_LONGJUMP3      58
12336          R_NDS32_LOADSTORE      59  */
12337       if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1
12338           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE)
12339         seq_len = GET_SEQ_LEN (irel->r_addend);
12340
12341       /* Relocation Types
12342          R_NDS32_LONGCALL4      107
12343          R_NDS32_LONGCALL5      108
12344          R_NDS32_LONGCALL6      109
12345          R_NDS32_LONGJUMP4      110
12346          R_NDS32_LONGJUMP5      111
12347          R_NDS32_LONGJUMP6      112
12348          R_NDS32_LONGJUMP7      113  */
12349       else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4
12350                && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7)
12351         seq_len = 4;
12352
12353         /* Relocation Types
12354          R_NDS32_LO12S0_RELA            30
12355          R_NDS32_LO12S1_RELA            29
12356          R_NDS32_LO12S2_RELA            28
12357          R_NDS32_LO12S2_SP_RELA         71
12358          R_NDS32_LO12S2_DP_RELA         70
12359          R_NDS32_GOT_LO12               46
12360          R_NDS32_GOTOFF_LO12            50
12361          R_NDS32_PLTREL_LO12            65
12362          R_NDS32_PLT_GOTREL_LO12        67
12363          R_NDS32_17IFC_PCREL_RELA       96
12364          R_NDS32_GOT_SUFF               193
12365          R_NDS32_GOTOFF_SUFF            194
12366          R_NDS32_PLT_GOT_SUFF           195
12367          R_NDS32_MULCALL_SUFF           196
12368          R_NDS32_PTR                    197  */
12369       else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA
12370                 && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA)
12371                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA
12372                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA
12373                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12
12374                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12
12375                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12
12376                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12
12377                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12
12378                || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF
12379                    && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR)
12380                || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12381                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12
12382                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD
12383                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS
12384                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LSI)
12385         seq_len = 0;
12386       else
12387         continue;
12388
12389       insn_len = seq_len;
12390       removed = FALSE;
12391
12392       switch (ELF32_R_TYPE (irel->r_info))
12393         {
12394         case R_NDS32_LONGCALL1:
12395           removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs,
12396                                                &insn_len, contents, isymbuf,
12397                                                symtab_hdr);
12398           break;
12399         case R_NDS32_LONGCALL2:
12400           removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs,
12401                                                &insn_len, contents, isymbuf,
12402                                                symtab_hdr);
12403           break;
12404         case R_NDS32_LONGCALL3:
12405           removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs,
12406                                                &insn_len, contents, isymbuf,
12407                                                symtab_hdr);
12408           break;
12409         case R_NDS32_LONGJUMP1:
12410           removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs,
12411                                                &insn_len, contents, isymbuf,
12412                                                symtab_hdr);
12413           break;
12414         case R_NDS32_LONGJUMP2:
12415           removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs,
12416                                                &insn_len, contents, isymbuf,
12417                                                symtab_hdr);
12418           break;
12419         case R_NDS32_LONGJUMP3:
12420           removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs,
12421                                                &insn_len, contents, isymbuf,
12422                                                symtab_hdr);
12423           break;
12424         case R_NDS32_LONGCALL4:
12425           removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs,
12426                                                &insn_len, contents, isymbuf,
12427                                                symtab_hdr);
12428           break;
12429         case R_NDS32_LONGCALL5:
12430           removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs,
12431                                                &insn_len, contents, isymbuf,
12432                                                symtab_hdr);
12433           break;
12434         case R_NDS32_LONGCALL6:
12435           removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs,
12436                                                &insn_len, contents, isymbuf,
12437                                                symtab_hdr);
12438           break;
12439         case R_NDS32_LONGJUMP4:
12440           removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs,
12441                                                &insn_len, contents, isymbuf,
12442                                                symtab_hdr);
12443           break;
12444         case R_NDS32_LONGJUMP5:
12445           removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs,
12446                                                &insn_len, &seq_len, contents,
12447                                                isymbuf, symtab_hdr);
12448           break;
12449         case R_NDS32_LONGJUMP6:
12450           removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs,
12451                                                &insn_len, &seq_len, contents,
12452                                                isymbuf, symtab_hdr);
12453           break;
12454         case R_NDS32_LONGJUMP7:
12455           removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs,
12456                                                &insn_len, &seq_len, contents,
12457                                                isymbuf, symtab_hdr);
12458           break;
12459         case R_NDS32_LOADSTORE:
12460           removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel,
12461                                                internal_relocs, &insn_len,
12462                                                contents, isymbuf, symtab_hdr,
12463                                                load_store_relax, table);
12464           break;
12465         case R_NDS32_LO12S0_RELA:
12466         case R_NDS32_LO12S1_RELA:
12467         case R_NDS32_LO12S2_RELA:
12468         case R_NDS32_LO12S2_DP_RELA:
12469         case R_NDS32_LO12S2_SP_RELA:
12470           /* Relax for low part.  */
12471           nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs,
12472                                 contents, isymbuf, symtab_hdr, table);
12473
12474           /* It is impossible to delete blank, so just continue.  */
12475           continue;
12476         case R_NDS32_PTR:
12477           removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs,
12478                                          &insn_len, &seq_len, contents);
12479           break;
12480         case R_NDS32_LSI:
12481           nds32_elf_relax_flsi (link_info, abfd, sec, irel, internal_relocs,
12482                                 contents, isymbuf, symtab_hdr, again);
12483           continue;
12484         case R_NDS32_GOT_LO12:
12485         case R_NDS32_GOTOFF_LO12:
12486         case R_NDS32_PLTREL_LO12:
12487         case R_NDS32_PLT_GOTREL_LO12:
12488         case R_NDS32_GOTPC_LO12:
12489         case R_NDS32_TLS_LE_LO12:
12490         case R_NDS32_TLS_LE_ADD:
12491         case R_NDS32_TLS_LE_LS:
12492         case R_NDS32_PLT_GOT_SUFF:
12493         case R_NDS32_GOT_SUFF:
12494         case R_NDS32_GOTOFF_SUFF:
12495           continue;
12496         default:
12497           continue;
12498         }
12499
12500       if (removed && seq_len - insn_len > 0)
12501         {
12502           if (!insert_nds32_elf_blank
12503               (&relax_blank_list, irel->r_offset + insn_len,
12504                seq_len - insn_len))
12505             goto error_return;
12506           *again = TRUE;
12507         }
12508     }
12509
12510   calc_nds32_blank_total (relax_blank_list);
12511
12512   if (table->relax_fp_as_gp)
12513     {
12514       if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs,
12515                                  irelend, isymbuf))
12516         goto error_return;
12517
12518       if (!*again)
12519         {
12520           if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs,
12521                                                irelend))
12522             goto error_return;
12523         }
12524     }
12525
12526   if (!*again)
12527     {
12528       if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents,
12529                                      &relax_blank_list, optimize, opt_size))
12530         goto error_return;
12531     }
12532
12533   /* It doesn't matter optimize_for_space_no_align anymore.
12534        If object file is assembled with flag '-Os',
12535        the we don't adjust jump-destination on 4-byte boundary.  */
12536
12537   if (relax_blank_list)
12538     {
12539       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12540       relax_blank_list = NULL;
12541     }
12542
12543   if (!*again)
12544     {
12545       /* Closing the section, so we don't relax it anymore.  */
12546       bfd_vma sec_size_align;
12547       Elf_Internal_Rela *tmp_rel;
12548
12549       /* Pad to alignment boundary.  Only handle current section alignment.  */
12550       sec_size_align = (sec->size + (~((-1U) << sec->alignment_power)))
12551                        & ((-1U) << sec->alignment_power);
12552       if ((sec_size_align - sec->size) & 0x2)
12553         {
12554           insn16 = NDS32_NOP16;
12555           bfd_putb16 (insn16, contents + sec->size);
12556           sec->size += 2;
12557         }
12558
12559       while (sec_size_align != sec->size)
12560         {
12561           insn = NDS32_NOP32;
12562           bfd_putb32 (insn, contents + sec->size);
12563           sec->size += 4;
12564         }
12565
12566       tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs,
12567                                         irelend, R_NDS32_RELAX_ENTRY);
12568       if (tmp_rel != irelend)
12569         tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
12570
12571       clean_nds32_elf_blank ();
12572     }
12573
12574  finish:
12575   if (internal_relocs != NULL
12576       && elf_section_data (sec)->relocs != internal_relocs)
12577     free (internal_relocs);
12578
12579   if (contents != NULL
12580       && elf_section_data (sec)->this_hdr.contents != contents)
12581     free (contents);
12582
12583   if (isymbuf != NULL && symtab_hdr->contents != (bfd_byte *) isymbuf)
12584     free (isymbuf);
12585
12586   return result;
12587
12588  error_return:
12589   result = FALSE;
12590   goto finish;
12591 }
12592
12593 static struct bfd_elf_special_section const nds32_elf_special_sections[] =
12594 {
12595   {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE},
12596   {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
12597   {NULL, 0, 0, 0, 0}
12598 };
12599
12600 static bfd_boolean
12601 nds32_elf_section_flags (const Elf_Internal_Shdr *hdr)
12602 {
12603   const char *name = hdr->bfd_section->name;
12604
12605   if (strncmp (name, ".sbss", 5) == 0
12606       || strncmp (name, ".sdata", 6) == 0)
12607     hdr->bfd_section->flags |= SEC_SMALL_DATA;
12608
12609   return TRUE;
12610 }
12611
12612 static bfd_boolean
12613 nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
12614                             struct bfd_link_info *info,
12615                             void *finfo ATTRIBUTE_UNUSED,
12616                             bfd_boolean (*func) (void *, const char *,
12617                                                  Elf_Internal_Sym *,
12618                                                  asection *,
12619                                                  struct elf_link_hash_entry *)
12620                             ATTRIBUTE_UNUSED)
12621 {
12622   FILE *sym_ld_script = NULL;
12623   struct elf_nds32_link_hash_table *table;
12624
12625   table = nds32_elf_hash_table (info);
12626   sym_ld_script = table->sym_ld_script;
12627
12628   if (check_start_export_sym)
12629     fprintf (sym_ld_script, "}\n");
12630
12631   return TRUE;
12632 }
12633
12634 static enum elf_reloc_type_class
12635 nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
12636                             const asection *rel_sec ATTRIBUTE_UNUSED,
12637                             const Elf_Internal_Rela *rela)
12638 {
12639   switch ((int) ELF32_R_TYPE (rela->r_info))
12640     {
12641     case R_NDS32_RELATIVE:
12642       return reloc_class_relative;
12643     case R_NDS32_JMP_SLOT:
12644       return reloc_class_plt;
12645     case R_NDS32_COPY:
12646       return reloc_class_copy;
12647     default:
12648       return reloc_class_normal;
12649     }
12650 }
12651
12652 /* Put target dependent option into info hash table.  */
12653 void
12654 bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info,
12655                                    int relax_fp_as_gp,
12656                                    int eliminate_gc_relocs,
12657                                    FILE * sym_ld_script,
12658                                    int hyper_relax,
12659                                    int tls_desc_trampoline,
12660                                    int load_store_relax)
12661 {
12662   struct elf_nds32_link_hash_table *table;
12663
12664   table = nds32_elf_hash_table (link_info);
12665   if (table == NULL)
12666     return;
12667
12668   table->relax_fp_as_gp = relax_fp_as_gp;
12669   table->eliminate_gc_relocs = eliminate_gc_relocs;
12670   table->sym_ld_script = sym_ld_script;
12671   table->hyper_relax = hyper_relax;
12672   table->tls_desc_trampoline = tls_desc_trampoline;
12673   table ->load_store_relax = load_store_relax;
12674 }
12675 \f
12676
12677 /* These functions and data-structures are used for fp-as-gp
12678    optimization.  */
12679
12680 #define FAG_THRESHOLD   3       /* At least 3 gp-access.  */
12681 /* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12682    the read-only section and read-write section.  */
12683 #define FAG_WINDOW      (508 - 32)
12684
12685 /* An nds32_fag represent a gp-relative access.
12686    We find best fp-base by using a sliding window
12687    to find a base address which can cover most gp-access.  */
12688 struct nds32_fag
12689 {
12690   struct nds32_fag *next;       /* NULL-teminated linked list.  */
12691   bfd_vma addr;                 /* The address of this fag.  */
12692   Elf_Internal_Rela **relas;    /* The relocations associated with this fag.
12693                                    It is used for applying FP7U2_FLAG.  */
12694   int count;                    /* How many times this address is referred.
12695                                    There should be exactly `count' relocations
12696                                    in relas.  */
12697   int relas_capcity;            /* The buffer size of relas.
12698                                    We use an array instead of linked-list,
12699                                    and realloc is used to adjust buffer size.  */
12700 };
12701
12702 static void
12703 nds32_fag_init (struct nds32_fag *head)
12704 {
12705   memset (head, 0, sizeof (struct nds32_fag));
12706 }
12707
12708 static void
12709 nds32_fag_verify (struct nds32_fag *head)
12710 {
12711   struct nds32_fag *iter;
12712   struct nds32_fag *prev;
12713
12714   prev = NULL;
12715   iter = head->next;
12716   while (iter)
12717     {
12718       if (prev && prev->addr >= iter->addr)
12719         puts ("Bug in fp-as-gp insertion.");
12720       prev = iter;
12721       iter = iter->next;
12722     }
12723 }
12724
12725 /* Insert a fag in ascending order.
12726    If a fag of the same address already exists,
12727    they are chained by relas array.  */
12728
12729 static void
12730 nds32_fag_insert (struct nds32_fag *head, bfd_vma addr,
12731                   Elf_Internal_Rela * rel)
12732 {
12733   struct nds32_fag *iter;
12734   struct nds32_fag *new_fag;
12735   const int INIT_RELAS_CAP = 4;
12736
12737   for (iter = head;
12738        iter->next && iter->next->addr <= addr;
12739        iter = iter->next)
12740     /* Find somewhere to insert.  */ ;
12741
12742   /* `iter' will be equal to `head' if the list is empty.  */
12743   if (iter != head && iter->addr == addr)
12744     {
12745       /* The address exists in the list.
12746          Insert `rel' into relocation list, relas.  */
12747
12748       /* Check whether relas is big enough.  */
12749       if (iter->count >= iter->relas_capcity)
12750         {
12751           iter->relas_capcity *= 2;
12752           iter->relas = bfd_realloc
12753             (iter->relas, iter->relas_capcity * sizeof (void *));
12754         }
12755       iter->relas[iter->count++] = rel;
12756       return;
12757     }
12758
12759   /* This is a new address.  Create a fag node for it.  */
12760   new_fag = bfd_malloc (sizeof (struct nds32_fag));
12761   memset (new_fag, 0, sizeof (*new_fag));
12762   new_fag->addr = addr;
12763   new_fag->count = 1;
12764   new_fag->next = iter->next;
12765   new_fag->relas_capcity = INIT_RELAS_CAP;
12766   new_fag->relas = (Elf_Internal_Rela **)
12767     bfd_malloc (new_fag->relas_capcity * sizeof (void *));
12768   new_fag->relas[0] = rel;
12769   iter->next = new_fag;
12770
12771   nds32_fag_verify (head);
12772 }
12773
12774 static void
12775 nds32_fag_free_list (struct nds32_fag *head)
12776 {
12777   struct nds32_fag *iter;
12778
12779   iter = head->next;
12780   while (iter)
12781     {
12782       struct nds32_fag *tmp = iter;
12783       iter = iter->next;
12784       free (tmp->relas);
12785       tmp->relas = NULL;
12786       free (tmp);
12787     }
12788 }
12789
12790 /* Find the best fp-base address.
12791    The relocation associated with that address is returned,
12792    so we can track the symbol instead of a fixed address.
12793
12794    When relaxation, the address of an datum may change,
12795    because a text section is shrinked, so the data section
12796    moves forward.  If the aligments of text and data section
12797    are different, their distance may change too.
12798    Therefore, tracking a fixed address is not appriate.  */
12799
12800 static int
12801 nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp)
12802 {
12803   struct nds32_fag *base;       /* First fag in the window.  */
12804   struct nds32_fag *last;       /* First fag outside the window.  */
12805   int accu = 0;                 /* Usage accumulation.  */
12806   struct nds32_fag *best;       /* Best fag.  */
12807   int baccu = 0;                /* Best accumulation.  */
12808
12809   /* Use first fag for initial, and find the last fag in the window.
12810
12811      In each iteration, we could simply subtract previous fag
12812      and accumulate following fags which are inside the window,
12813      untill we each the end.  */
12814
12815   if (head->next == NULL)
12816     {
12817       *bestpp = NULL;
12818       return 0;
12819     }
12820
12821   /* Initialize base.  */
12822   base = head->next;
12823   best = base;
12824   for (last = base;
12825        last && last->addr < base->addr + FAG_WINDOW;
12826        last = last->next)
12827     accu += last->count;
12828
12829   baccu = accu;
12830
12831   /* Record the best base in each iteration.  */
12832   while (base->next)
12833     {
12834       accu -= base->count;
12835       base = base->next;
12836       /* Account fags in window.  */
12837       for (/* Nothing.  */;
12838            last && last->addr < base->addr + FAG_WINDOW;
12839            last = last->next)
12840         accu += last->count;
12841
12842       /* A better fp-base?  */
12843       if (accu > baccu)
12844         {
12845           best = base;
12846           baccu = accu;
12847         }
12848     }
12849
12850   if (bestpp)
12851     *bestpp = best;
12852   return baccu;
12853 }
12854
12855 /* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12856    so we can convert it fo fp-relative access later.
12857    `best_fag' is the best fp-base.  Only those inside the window
12858    of best_fag is applied the flag.  */
12859
12860 static bfd_boolean
12861 nds32_fag_mark_relax (struct bfd_link_info *link_info,
12862                       asection *sec, struct nds32_fag *best_fag,
12863                       Elf_Internal_Rela *internal_relocs,
12864                       Elf_Internal_Rela *irelend)
12865 {
12866   struct nds32_fag *ifag;
12867   bfd_vma best_fpbase, gp;
12868   bfd *output_bfd;
12869
12870   output_bfd = sec->output_section->owner;
12871   nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
12872   best_fpbase = best_fag->addr;
12873
12874   if (best_fpbase > gp + sdata_range[1][1]
12875       || best_fpbase < gp - sdata_range[1][0])
12876     return FALSE;
12877
12878   /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12879      so we know they can be converted to lwi37.fp.   */
12880   for (ifag = best_fag;
12881        ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next)
12882     {
12883       int i;
12884
12885       for (i = 0; i < ifag->count; i++)
12886         {
12887           Elf_Internal_Rela *insn16_rel;
12888           Elf_Internal_Rela *fag_rel;
12889
12890           fag_rel = ifag->relas[i];
12891
12892           /* Only if this is within the WINDOWS, FP7U2_FLAG
12893              is applied.  */
12894
12895           insn16_rel = find_relocs_at_address
12896             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12897
12898           if (insn16_rel != irelend)
12899             insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG;
12900         }
12901     }
12902   return TRUE;
12903 }
12904
12905 /* Reset INSN16 to clean fp as gp.  */
12906
12907 static void
12908 nds32_fag_unmark_relax (struct nds32_fag *fag,
12909                         Elf_Internal_Rela *internal_relocs,
12910                         Elf_Internal_Rela *irelend)
12911 {
12912   struct nds32_fag *ifag;
12913   int i;
12914   Elf_Internal_Rela *insn16_rel;
12915   Elf_Internal_Rela *fag_rel;
12916
12917   for (ifag = fag; ifag; ifag = ifag->next)
12918     {
12919       for (i = 0; i < ifag->count; i++)
12920         {
12921           fag_rel = ifag->relas[i];
12922
12923           /* Restore the INSN16 relocation.  */
12924           insn16_rel = find_relocs_at_address
12925             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12926
12927           if (insn16_rel != irelend)
12928             insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG;
12929         }
12930     }
12931 }
12932
12933 /* This is the main function of fp-as-gp optimization.
12934    It should be called by relax_section.  */
12935
12936 static bfd_boolean
12937 nds32_relax_fp_as_gp (struct bfd_link_info *link_info,
12938                       bfd *abfd, asection *sec,
12939                       Elf_Internal_Rela *internal_relocs,
12940                       Elf_Internal_Rela *irelend,
12941                       Elf_Internal_Sym *isymbuf)
12942 {
12943   Elf_Internal_Rela *begin_rel = NULL;
12944   Elf_Internal_Rela *irel;
12945   struct nds32_fag fag_head;
12946   Elf_Internal_Shdr *symtab_hdr;
12947   bfd_byte *contents;
12948   bfd_boolean ifc_inside = FALSE;
12949
12950   /* FIXME: Can we bfd_elf_link_read_relocs for the relocs?  */
12951
12952   /* Per-function fp-base selection.
12953      1. Create a list for all the gp-relative access.
12954      2. Base on those gp-relative address,
12955         find a fp-base which can cover most access.
12956      3. Use the fp-base for fp-as-gp relaxation.
12957
12958      NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12959      we should
12960      1. delete the `la $fp, _FP_BASE_' instruction and
12961      2. not convert lwi.gp to lwi37.fp.
12962
12963      To delete the _FP_BASE_ instruction, we simply apply
12964      R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12965
12966      To suppress the conversion, we simply NOT to apply
12967      R_NDS32_INSN16_FP7U2_FLAG flag.  */
12968
12969   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12970
12971   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12972       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12973     return FALSE;
12974
12975   /* Check whether it is worth for fp-as-gp optimization,
12976      i.e., at least 3 gp-load.
12977
12978      Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12979      apply this optimization.  */
12980
12981   for (irel = internal_relocs; irel < irelend; irel++)
12982     {
12983       /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12984          One we enter the begin of the region, we track all the LW/ST
12985          instructions, so when we leave the region, we try to find
12986          the best fp-base address for those LW/ST instructions.  */
12987
12988       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12989           && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12990         {
12991           /* Begin of the region.  */
12992           if (begin_rel)
12993             /* xgettext:c-format */
12994             _bfd_error_handler (_("%pB: nested OMIT_FP in %pA"), abfd, sec);
12995
12996           begin_rel = irel;
12997           nds32_fag_init (&fag_head);
12998           ifc_inside = FALSE;
12999         }
13000       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
13001                && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
13002         {
13003           int accu;
13004           struct nds32_fag *best_fag, *tmp_fag;
13005           int dist;
13006
13007           /* End of the region.
13008              Check whether it is worth to do fp-as-gp.  */
13009
13010           if (begin_rel == NULL)
13011             {
13012               /* xgettext:c-format */
13013               _bfd_error_handler (_("%pB: unmatched OMIT_FP in %pA"),
13014                                   abfd, sec);
13015               continue;
13016             }
13017
13018           accu = nds32_fag_find_base (&fag_head, &best_fag);
13019
13020           /* Clean FP7U2_FLAG because they may set ever.  */
13021           tmp_fag = fag_head.next;
13022           nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend);
13023
13024           /* Check if it is worth, and FP_BASE is near enough to SDA_BASE.  */
13025           if (accu < FAG_THRESHOLD
13026               || !nds32_fag_mark_relax (link_info, sec, best_fag,
13027                                         internal_relocs, irelend))
13028             {
13029               /* Not worth to do fp-as-gp.  */
13030               begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
13031               begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
13032               irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
13033               irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
13034               nds32_fag_free_list (&fag_head);
13035               begin_rel = NULL;
13036               continue;
13037             }
13038
13039           /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
13040              so we use it to record the distance to the reloction of best
13041              fp-base.  */
13042           dist = best_fag->relas[0] - begin_rel;
13043           BFD_ASSERT (dist > 0 && dist < 0xffffff);
13044           /* Use high 16 bits of addend to record the _FP_BASE_ matched
13045              relocation.  And get the base value when relocating.  */
13046           begin_rel->r_addend &= (0x1 << 16) - 1;
13047           begin_rel->r_addend |= dist << 16;
13048
13049           nds32_fag_free_list (&fag_head);
13050           begin_rel = NULL;
13051         }
13052
13053       if (begin_rel == NULL || ifc_inside)
13054         /* Skip if we are not in the region of fp-as-gp.  */
13055         continue;
13056
13057       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA
13058           || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA)
13059         {
13060           bfd_vma addr;
13061           uint32_t insn;
13062
13063           /* A gp-relative access is found.  Insert it to the fag-list.  */
13064
13065           /* Rt is necessary an RT3, so it can be converted to lwi37.fp.  */
13066           insn = bfd_getb32 (contents + irel->r_offset);
13067           if (!N32_IS_RT3 (insn))
13068             continue;
13069
13070           addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
13071           nds32_fag_insert (&fag_head, addr, irel);
13072         }
13073       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA)
13074         {
13075           begin_rel = NULL;
13076         }
13077       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
13078                || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13079         {
13080           /* Suppress fp as gp when encounter ifc.  */
13081           ifc_inside = TRUE;
13082         }
13083     }
13084
13085   return TRUE;
13086 }
13087
13088 /* Remove unused `la $fp, _FD_BASE_' instruction.  */
13089
13090 static bfd_boolean
13091 nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec,
13092                                 Elf_Internal_Rela *internal_relocs,
13093                                 Elf_Internal_Rela *irelend)
13094 {
13095   Elf_Internal_Rela *irel;
13096   Elf_Internal_Shdr *symtab_hdr;
13097   bfd_byte *contents = NULL;
13098   nds32_elf_blank_t *relax_blank_list = NULL;
13099   bfd_boolean result = TRUE;
13100   bfd_boolean unused_region = FALSE;
13101
13102   /*
13103      NOTE: Disable fp-as-gp if we encounter ifcall relocations:
13104        R_NDS32_17IFC_PCREL_RELA
13105        R_NDS32_10IFCU_PCREL_RELA.  */
13106
13107   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13108   nds32_get_section_contents (abfd, sec, &contents, TRUE);
13109
13110   for (irel = internal_relocs; irel < irelend; irel++)
13111     {
13112       /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
13113          we marked to in previous pass.
13114          DO NOT scan relocations again, since we've alreadly decided it
13115          and set the flag.  */
13116       const char *syname;
13117       int syndx;
13118       uint32_t insn;
13119
13120       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
13121           && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
13122         unused_region = TRUE;
13123       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
13124                && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
13125         unused_region = FALSE;
13126
13127       /* We're not in the region.  */
13128       if (!unused_region)
13129         continue;
13130
13131       /* _FP_BASE_ must be a GLOBAL symbol.  */
13132       syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
13133       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
13134         continue;
13135
13136       /* The symbol name must be _FP_BASE_.  */
13137       syname = elf_sym_hashes (abfd)[syndx]->root.root.string;
13138       if (strcmp (syname, FP_BASE_NAME) != 0)
13139         continue;
13140
13141       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA)
13142         {
13143           /* addi.gp  $fp, -256  */
13144           insn = bfd_getb32 (contents + irel->r_offset);
13145           if (insn != INSN_ADDIGP_TO_FP)
13146             continue;
13147         }
13148       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA)
13149         {
13150           /* addi  $fp, $gp, -256  */
13151           insn = bfd_getb32 (contents + irel->r_offset);
13152           if (insn != INSN_ADDI_GP_TO_FP)
13153             continue;
13154         }
13155       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
13156         {
13157           /* movi  $fp, FP_BASE  */
13158           insn = bfd_getb32 (contents + irel->r_offset);
13159           if (insn != INSN_MOVI_TO_FP)
13160             continue;
13161         }
13162       else
13163         continue;
13164
13165       /* We got here because a FP_BASE instruction is found.  */
13166       if (!insert_nds32_elf_blank_recalc_total
13167           (&relax_blank_list, irel->r_offset, 4))
13168         goto error_return;
13169     }
13170
13171  finish:
13172   if (relax_blank_list)
13173     {
13174       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
13175       relax_blank_list = NULL;
13176     }
13177   return result;
13178
13179  error_return:
13180   result = FALSE;
13181   goto finish;
13182 }
13183
13184 /* This is a version of bfd_generic_get_relocated_section_contents.
13185    We need this variety because relaxation will modify the dwarf
13186    infomation.  When there is undefined symbol reference error mesage,
13187    linker need to dump line number where the symbol be used.  However
13188    the address is be relaxed, it can not get the original dwarf contents.
13189    The variety only modify function call for reading in the section.  */
13190
13191 static bfd_byte *
13192 nds32_elf_get_relocated_section_contents (bfd *abfd,
13193                                           struct bfd_link_info *link_info,
13194                                           struct bfd_link_order *link_order,
13195                                           bfd_byte *data,
13196                                           bfd_boolean relocatable,
13197                                           asymbol **symbols)
13198 {
13199   bfd *input_bfd = link_order->u.indirect.section->owner;
13200   asection *input_section = link_order->u.indirect.section;
13201   long reloc_size;
13202   arelent **reloc_vector;
13203   long reloc_count;
13204
13205   reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13206   if (reloc_size < 0)
13207     return NULL;
13208
13209   /* Read in the section.  */
13210   if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE))
13211     return NULL;
13212
13213   if (reloc_size == 0)
13214     return data;
13215
13216   reloc_vector = (arelent **) bfd_malloc (reloc_size);
13217   if (reloc_vector == NULL)
13218     return NULL;
13219
13220   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
13221                                         reloc_vector, symbols);
13222   if (reloc_count < 0)
13223     goto error_return;
13224
13225   if (reloc_count > 0)
13226     {
13227       arelent **parent;
13228       for (parent = reloc_vector; *parent != NULL; parent++)
13229         {
13230           char *error_message = NULL;
13231           asymbol *symbol;
13232           bfd_reloc_status_type r;
13233
13234           symbol = *(*parent)->sym_ptr_ptr;
13235           if (symbol->section && discarded_section (symbol->section))
13236             {
13237               bfd_vma off;
13238               static reloc_howto_type none_howto
13239                 = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
13240                          "unused", FALSE, 0, 0, FALSE);
13241
13242               off = (*parent)->address * OCTETS_PER_BYTE (input_bfd,
13243                                                           input_section);
13244               _bfd_clear_contents ((*parent)->howto, input_bfd,
13245                                    input_section, data, off);
13246               (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
13247               (*parent)->addend = 0;
13248               (*parent)->howto = &none_howto;
13249               r = bfd_reloc_ok;
13250             }
13251           else
13252             r = bfd_perform_relocation (input_bfd, *parent, data,
13253                                         input_section,
13254                                         relocatable ? abfd : NULL,
13255                                         &error_message);
13256
13257           if (relocatable)
13258             {
13259               asection *os = input_section->output_section;
13260
13261               /* A partial link, so keep the relocs.  */
13262               os->orelocation[os->reloc_count] = *parent;
13263               os->reloc_count++;
13264             }
13265
13266           if (r != bfd_reloc_ok)
13267             {
13268               switch (r)
13269                 {
13270                 case bfd_reloc_undefined:
13271                   (*link_info->callbacks->undefined_symbol)
13272                     (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13273                      input_bfd, input_section, (*parent)->address, TRUE);
13274                   break;
13275                 case bfd_reloc_dangerous:
13276                   BFD_ASSERT (error_message != NULL);
13277                   (*link_info->callbacks->reloc_dangerous)
13278                     (link_info, error_message,
13279                      input_bfd, input_section, (*parent)->address);
13280                   break;
13281                 case bfd_reloc_overflow:
13282                   (*link_info->callbacks->reloc_overflow)
13283                     (link_info, NULL,
13284                      bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13285                      (*parent)->howto->name, (*parent)->addend,
13286                      input_bfd, input_section, (*parent)->address);
13287                   break;
13288                 case bfd_reloc_outofrange:
13289                   /* PR ld/13730:
13290                      This error can result when processing some partially
13291                      complete binaries.  Do not abort, but issue an error
13292                      message instead.  */
13293                   link_info->callbacks->einfo
13294                     /* xgettext:c-format */
13295                     (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
13296                      abfd, input_section, * parent);
13297                   goto error_return;
13298
13299                 default:
13300                   abort ();
13301                   break;
13302                 }
13303             }
13304         }
13305     }
13306
13307   free (reloc_vector);
13308   return data;
13309
13310  error_return:
13311   free (reloc_vector);
13312   return NULL;
13313 }
13314
13315 /* Check target symbol.  */
13316
13317 static bfd_boolean
13318 nds32_elf_is_target_special_symbol (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
13319 {
13320   if (!sym || !sym->name || sym->name[0] != '$')
13321     return FALSE;
13322   return TRUE;
13323 }
13324
13325 /* nds32 find maybe function sym.  Ignore target special symbol
13326    first, and then go the general function.  */
13327
13328 static bfd_size_type
13329 nds32_elf_maybe_function_sym (const asymbol *sym, asection *sec,
13330                               bfd_vma *code_off)
13331 {
13332   if (nds32_elf_is_target_special_symbol (NULL, (asymbol *) sym))
13333     return 0;
13334
13335   return _bfd_elf_maybe_function_sym (sym, sec, code_off);
13336 }
13337 \f
13338
13339 /* Do TLS model conversion.  */
13340
13341 typedef struct relax_group_list_t
13342 {
13343   Elf_Internal_Rela *relo;
13344   struct relax_group_list_t *next;
13345   struct relax_group_list_t *next_sibling;
13346   int id;
13347 } relax_group_list_t;
13348
13349 int
13350 list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem);
13351
13352 int
13353 list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem);
13354
13355 void
13356 dump_chain (relax_group_list_t *pHead);
13357
13358 int
13359 list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem)
13360 {
13361   relax_group_list_t *pNext = pHead;
13362
13363   /* Find place.  */
13364   while (pNext->next)
13365     {
13366       if (pNext->next->id > (int) pElem->r_addend)
13367         break;
13368
13369       pNext = pNext->next;
13370     }
13371
13372   /* Insert node.  */
13373   relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t));
13374   if (!pNew)
13375     return FALSE;
13376
13377   relax_group_list_t *tmp = pNext->next;
13378   pNext->next = pNew;
13379
13380   pNew->id = pElem->r_addend;
13381   pNew->relo = pElem;
13382   pNew->next = tmp;
13383   pNew->next_sibling = NULL;
13384
13385   return TRUE;
13386 }
13387
13388 int
13389 list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem)
13390 {
13391   relax_group_list_t *pNext = pNode;
13392
13393   /* Find place.  */
13394   while (pNext->next_sibling)
13395     {
13396       pNext = pNext->next_sibling;
13397     }
13398
13399   /* Insert node.  */
13400   relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t));
13401   if (!pNew)
13402     return FALSE;
13403
13404   relax_group_list_t *tmp = pNext->next_sibling;
13405   pNext->next_sibling = pNew;
13406
13407   pNew->id = -1;
13408   pNew->relo = pElem;
13409   pNew->next = NULL;
13410   pNew->next_sibling = tmp;
13411
13412   return TRUE;
13413 }
13414
13415 void
13416 dump_chain (relax_group_list_t *pHead)
13417 {
13418   relax_group_list_t *pNext = pHead->next;
13419   while (pNext)
13420     {
13421       printf("group %d @ 0x%08x", pNext->id, (unsigned)pNext->relo->r_offset);
13422       relax_group_list_t *pNextSib = pNext->next_sibling;
13423       while (pNextSib)
13424         {
13425           printf(", %d", (unsigned) ELF32_R_TYPE (pNextSib->relo->r_info));
13426           pNextSib = pNextSib->next_sibling;
13427         }
13428       pNext = pNext->next;
13429       printf("\n");
13430     }
13431 }
13432
13433 /* Check R_NDS32_RELAX_GROUP of each section.
13434    There might be multiple sections in one object file.  */
13435
13436 int
13437 elf32_nds32_check_relax_group (bfd *abfd, asection *asec)
13438 {
13439   elf32_nds32_relax_group_t *relax_group_ptr =
13440     elf32_nds32_relax_group_ptr (abfd);
13441
13442   int min_id = relax_group_ptr->min_id;
13443   int max_id = relax_group_ptr->max_id;
13444
13445   Elf_Internal_Rela *rel;
13446   Elf_Internal_Rela *relend;
13447   Elf_Internal_Rela *relocs;
13448   enum elf_nds32_reloc_type rtype;
13449
13450   do
13451     {
13452       /* Relocations MUST be kept in memory, because relaxation adjust them.  */
13453       relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL,
13454                                           TRUE /* keep_memory  */);
13455       if (relocs == NULL)
13456         break;
13457
13458       /* Check R_NDS32_RELAX_GROUP.  */
13459       relend = relocs + asec->reloc_count;
13460       for (rel = relocs; rel < relend; rel++)
13461         {
13462           int id;
13463           rtype = ELF32_R_TYPE (rel->r_info);
13464           if (rtype != R_NDS32_RELAX_GROUP)
13465             continue;
13466
13467           id = rel->r_addend;
13468           if (id < min_id)
13469             min_id = id;
13470           else if (id > max_id)
13471             max_id = id;
13472         }
13473     }
13474   while (FALSE);
13475
13476   if ((relocs != NULL) && (elf_section_data (asec)->relocs != relocs))
13477     free (relocs);
13478
13479   if ((min_id != relax_group_ptr->min_id)
13480       || (max_id != relax_group_ptr->max_id))
13481     {
13482       relax_group_ptr->count = max_id - min_id + 1;
13483       BFD_ASSERT(min_id <= relax_group_ptr->min_id);
13484       relax_group_ptr->min_id = min_id;
13485       BFD_ASSERT(max_id >= relax_group_ptr->max_id);
13486       relax_group_ptr->max_id = max_id;
13487     }
13488
13489   return relax_group_ptr->count;
13490 }
13491
13492 /* Reorder RELAX_GROUP ID when command line option '-r' is applied.  */
13493 struct section_id_list_t *relax_group_section_id_list = NULL;
13494
13495 struct section_id_list_t *
13496 elf32_nds32_lookup_section_id (int id, struct section_id_list_t **lst_ptr)
13497 {
13498   struct section_id_list_t *result = NULL;
13499   struct section_id_list_t *lst = *lst_ptr;
13500
13501   if (NULL == lst)
13502     {
13503       result = (struct section_id_list_t *) calloc
13504         (1, sizeof (struct section_id_list_t));
13505       BFD_ASSERT (result); /* Feed me.  */
13506       result->id = id;
13507       *lst_ptr = result;
13508     }
13509   else
13510     {
13511       struct section_id_list_t *cur = lst;
13512       struct section_id_list_t *prv = NULL;
13513       struct section_id_list_t *sec = NULL;
13514
13515       while (cur)
13516         {
13517           if (cur->id < id)
13518             {
13519               prv = cur;
13520               cur = cur->next;
13521               continue;
13522             }
13523
13524           if (cur->id > id)
13525             {
13526               cur = NULL; /* To insert after prv.  */
13527               sec = cur;  /* In case prv == NULL.  */
13528             }
13529
13530           break;
13531         }
13532
13533       if (NULL == cur)
13534         {
13535           /* Insert after prv.  */
13536           result = (struct section_id_list_t *) calloc
13537             (1, sizeof (struct section_id_list_t));
13538           BFD_ASSERT (result); /* Feed me.  */
13539           result->id = id;
13540           if (NULL != prv)
13541             {
13542               result->next = prv->next;
13543               prv->next = result;
13544             }
13545           else
13546             {
13547               *lst_ptr = result;
13548               result->next = sec;
13549             }
13550         }
13551     }
13552
13553   return result;
13554 }
13555
13556 int
13557 elf32_nds32_unify_relax_group (bfd *abfd, asection *asec)
13558 {
13559   static int next_relax_group_bias = 0;
13560
13561   elf32_nds32_relax_group_t *relax_group_ptr =
13562     elf32_nds32_relax_group_ptr (abfd);
13563
13564   bfd_boolean result = TRUE;
13565   Elf_Internal_Rela *rel;
13566   Elf_Internal_Rela *relend;
13567   Elf_Internal_Rela *relocs = NULL;
13568   enum elf_nds32_reloc_type rtype;
13569   struct section_id_list_t *node = NULL;
13570   int count = 0;
13571
13572   do
13573     {
13574       if (0 == relax_group_ptr->count)
13575         break;
13576
13577       /* Check if this section has been handled.  */
13578       node = elf32_nds32_lookup_section_id (asec->id, &relax_group_section_id_list);
13579       if (NULL == node)
13580         break; /* Hit, the section id has handled.  */
13581
13582       /* Relocations MUST be kept in memory, because relaxation adjust them.  */
13583       relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL,
13584                                           TRUE /* keep_memory  */);
13585       if (relocs == NULL)
13586         {
13587           BFD_ASSERT (0); /* feed me */
13588           break;
13589         }
13590
13591       /* Allocate group id bias for this bfd!  */
13592       if (0 == relax_group_ptr->init)
13593         {
13594           relax_group_ptr->bias = next_relax_group_bias;
13595           next_relax_group_bias += relax_group_ptr->count;
13596           relax_group_ptr->init = 1;
13597         }
13598
13599       /* Reorder relax group groups.  */
13600       relend = relocs + asec->reloc_count;
13601       for (rel = relocs; rel < relend; rel++)
13602         {
13603           rtype = ELF32_R_TYPE(rel->r_info);
13604           if (rtype != R_NDS32_RELAX_GROUP)
13605             continue;
13606
13607           /* Change it.  */
13608           rel->r_addend += relax_group_ptr->bias;
13609           /* Debugging count.  */
13610           count++;
13611         }
13612     }
13613   while (FALSE);
13614
13615   if (relocs != NULL && elf_section_data (asec)->relocs != relocs)
13616     free (relocs);
13617
13618   return result;
13619 }
13620
13621 int
13622 nds32_elf_unify_tls_model (bfd *inbfd, asection *insec, bfd_byte *incontents,
13623                            struct bfd_link_info *lnkinfo)
13624 {
13625   bfd_boolean result = TRUE;
13626   Elf_Internal_Rela *irel;
13627   Elf_Internal_Rela *irelend;
13628   Elf_Internal_Rela *internal_relocs;
13629   unsigned long r_symndx;
13630   enum elf_nds32_reloc_type r_type;
13631
13632   Elf_Internal_Sym *local_syms = NULL;
13633   bfd_byte *contents = NULL;
13634
13635   relax_group_list_t chain = { .id = -1, .next = NULL, .next_sibling = NULL };
13636
13637   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (inbfd)->symtab_hdr;
13638   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
13639   sym_hashes = elf_sym_hashes (inbfd);
13640   sym_hashes_end =
13641     sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
13642   if (!elf_bad_symtab (inbfd))
13643     sym_hashes_end -= symtab_hdr->sh_info;
13644
13645   /* Reorder RELAX_GROUP when command line option '-r' is applied.  */
13646   if (bfd_link_relocatable (lnkinfo))
13647     {
13648       elf32_nds32_unify_relax_group (inbfd, insec);
13649       return result;
13650     }
13651
13652   /* Relocations MUST be kept in memory, because relaxation adjust them.  */
13653   internal_relocs = _bfd_elf_link_read_relocs (inbfd, insec, NULL, NULL,
13654                                                TRUE /* keep_memory  */);
13655   if (internal_relocs == NULL)
13656     goto error_return;
13657
13658   irelend = internal_relocs + insec->reloc_count;
13659   irel = find_relocs_at_address (internal_relocs, internal_relocs,
13660                                  irelend, R_NDS32_RELAX_ENTRY);
13661   if (irel == irelend)
13662     goto finish;
13663
13664   /* Chain/remove groups.  */
13665   for (irel = internal_relocs; irel < irelend; irel++)
13666     {
13667       r_symndx = ELF32_R_SYM (irel->r_info);
13668       r_type = ELF32_R_TYPE (irel->r_info);
13669       if (r_type != R_NDS32_RELAX_GROUP)
13670         continue;
13671
13672       /* Remove it.  */
13673       irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_NONE);
13674       /* Chain it now.  */
13675       if (!list_insert (&chain, irel))
13676         goto error_return;
13677     }
13678
13679   /* Collect group relocations.  */
13680   /* Presume relocations are sorted.  */
13681   relax_group_list_t *pNext = chain.next;
13682   while (pNext)
13683     {
13684       for (irel = internal_relocs; irel < irelend; irel++)
13685         {
13686           if (irel->r_offset == pNext->relo->r_offset)
13687             {
13688               /* Ignore Non-TLS relocation types.  */
13689               r_type = ELF32_R_TYPE (irel->r_info);
13690               if ((R_NDS32_TLS_LE_HI20 > r_type)
13691                   || (R_NDS32_RELAX_ENTRY == r_type))
13692                 continue;
13693
13694               if (!list_insert_sibling (pNext, irel))
13695                 goto error_return;
13696             }
13697           else if (irel->r_offset > pNext->relo->r_offset)
13698             {
13699               pNext = pNext->next;
13700               if (!pNext)
13701                 break;
13702
13703               bfd_vma current_offset = pNext->relo->r_offset;
13704               if (irel->r_offset > current_offset)
13705                 irel = internal_relocs; /* restart from head */
13706               else
13707                 --irel; /* Check current irel again.  */
13708               continue;
13709             }
13710           else
13711             {
13712               /* This shouldn't be reached.  */
13713             }
13714         }
13715       if (pNext)
13716         pNext = pNext->next;
13717     }
13718
13719 #ifdef DUBUG_VERBOSE
13720   dump_chain(&chain);
13721 #endif
13722
13723   /* Get symbol table and section content.  */
13724   if (incontents)
13725     contents = incontents;
13726   else if (!nds32_get_section_contents (inbfd, insec, &contents, TRUE)
13727            || !nds32_get_local_syms (inbfd, insec, &local_syms))
13728     goto error_return;
13729
13730   char *local_got_tls_type = elf32_nds32_local_got_tls_type (inbfd);
13731
13732   /* Convert TLS model each group if necessary.  */
13733   pNext = chain.next;
13734
13735   int cur_grp_id = -1;
13736   int sethi_rt = -1;
13737   int add_rt = -1;
13738   enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type;
13739
13740   tls_type = org_tls_type = eff_tls_type = 0;
13741
13742   while (pNext)
13743     {
13744       relax_group_list_t *pNextSig = pNext->next_sibling;
13745       while (pNextSig)
13746         {
13747           struct elf_link_hash_entry *h = NULL;
13748
13749           irel = pNextSig->relo;
13750           r_symndx = ELF32_R_SYM(irel->r_info);
13751           r_type = ELF32_R_TYPE(irel->r_info);
13752
13753           if (pNext->id != cur_grp_id)
13754             {
13755               cur_grp_id = pNext->id;
13756               org_tls_type = get_tls_type (r_type, NULL);
13757               if (r_symndx >= symtab_hdr->sh_info)
13758                 {
13759                   h = sym_hashes[r_symndx - symtab_hdr->sh_info];
13760                   while (h->root.type == bfd_link_hash_indirect
13761                          || h->root.type == bfd_link_hash_warning)
13762                     h = (struct elf_link_hash_entry *) h->root.u.i.link;
13763                   tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
13764                 }
13765               else
13766                 {
13767                   tls_type = local_got_tls_type
13768                     ? local_got_tls_type[r_symndx]
13769                     : GOT_NORMAL;
13770                 }
13771
13772               eff_tls_type = 1 << (fls (tls_type) - 1);
13773               sethi_rt = N32_RT5(bfd_getb32 (contents + irel->r_offset));
13774             }
13775
13776           if (eff_tls_type != org_tls_type)
13777             {
13778               switch (org_tls_type)
13779                 {
13780                   /* DESC to IEGP/IE/LE.  */
13781                 case GOT_TLS_DESC:
13782                   switch (eff_tls_type)
13783                     {
13784                     case GOT_TLS_IE:
13785                       switch (r_type)
13786                         {
13787                         case R_NDS32_TLS_DESC_HI20:
13788                           irel->r_info = ELF32_R_INFO(r_symndx,
13789                                                       R_NDS32_TLS_IE_HI20);
13790                           break;
13791                         case R_NDS32_TLS_DESC_LO12:
13792                           irel->r_info = ELF32_R_INFO(r_symndx,
13793                                                       R_NDS32_TLS_IE_LO12);
13794                           break;
13795                         case R_NDS32_TLS_DESC_ADD:
13796                           {
13797                             uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13798                             add_rt = N32_RT5 (insn);
13799                             insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0);
13800                             bfd_putb32 (insn, contents + irel->r_offset);
13801
13802                             irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13803                           }
13804                           break;
13805                         case R_NDS32_TLS_DESC_FUNC:
13806                           bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13807                           irel->r_info = ELF32_R_INFO(r_symndx,
13808                                                       R_NDS32_RELAX_REMOVE);
13809                           break;
13810                         case R_NDS32_TLS_DESC_CALL:
13811                           {
13812                             uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt,
13813                                                      REG_TP);
13814                             bfd_putb32 (insn, contents + irel->r_offset);
13815
13816                             irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13817                           }
13818                           break;
13819                         case R_NDS32_LOADSTORE:
13820                         case R_NDS32_PTR:
13821                         case R_NDS32_PTR_RESOLVED:
13822                         case R_NDS32_NONE:
13823                         case R_NDS32_LABEL:
13824                           break;
13825                         default:
13826                           BFD_ASSERT(0);
13827                           break;
13828                         }
13829                       break;
13830                     case GOT_TLS_IEGP:
13831                       switch (r_type)
13832                         {
13833                         case R_NDS32_TLS_DESC_HI20:
13834                           irel->r_info = ELF32_R_INFO(r_symndx,
13835                                                       R_NDS32_TLS_IEGP_HI20);
13836                           break;
13837                         case R_NDS32_TLS_DESC_LO12:
13838                           irel->r_info = ELF32_R_INFO(r_symndx,
13839                                                       R_NDS32_TLS_IEGP_LO12);
13840                           break;
13841                         case R_NDS32_TLS_DESC_ADD:
13842                           {
13843                             uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13844                             add_rt = N32_RT5 (insn);
13845                             insn = N32_MEM(LW, add_rt, sethi_rt, REG_GP, 0);
13846                             bfd_putb32 (insn, contents + irel->r_offset);
13847
13848                             irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13849                           }
13850                           break;
13851                         case R_NDS32_TLS_DESC_FUNC:
13852                           bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13853                           irel->r_info = ELF32_R_INFO(r_symndx,
13854                                                       R_NDS32_RELAX_REMOVE);
13855                           break;
13856                         case R_NDS32_TLS_DESC_CALL:
13857                           {
13858                             uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt,
13859                                                      REG_TP);
13860                             bfd_putb32 (insn, contents + irel->r_offset);
13861
13862                             irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
13863                           }
13864                           break;
13865                         case R_NDS32_LOADSTORE:
13866                         case R_NDS32_PTR:
13867                         case R_NDS32_PTR_RESOLVED:
13868                         case R_NDS32_NONE:
13869                         case R_NDS32_LABEL:
13870                           break;
13871                         default:
13872                           BFD_ASSERT(0);
13873                           break;
13874                         }
13875                       break;
13876                     case GOT_TLS_LE:
13877                       switch (r_type)
13878                         {
13879                         case R_NDS32_TLS_DESC_HI20:
13880                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_HI20);
13881                           break;
13882                         case R_NDS32_TLS_DESC_LO12:
13883                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_LO12);
13884                           break;
13885                         case R_NDS32_TLS_DESC_ADD:
13886                           {
13887                             uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13888
13889                             add_rt = N32_RT5 (insn);
13890                             insn = N32_ALU1 (ADD, REG_R0, sethi_rt, REG_TP);
13891                             bfd_putb32 (insn, contents + irel->r_offset);
13892
13893                             irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_ADD);
13894                           }
13895                           break;
13896                         case R_NDS32_TLS_DESC_FUNC:
13897                           bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13898                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_RELAX_REMOVE);
13899                           break;
13900                         case R_NDS32_TLS_DESC_CALL:
13901                           bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13902                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_RELAX_REMOVE);
13903                           break;
13904                         case R_NDS32_LOADSTORE:
13905                         case R_NDS32_PTR:
13906                         case R_NDS32_PTR_RESOLVED:
13907                         case R_NDS32_NONE:
13908                         case R_NDS32_LABEL:
13909                           break;
13910                         default:
13911                           BFD_ASSERT(0);
13912                           break;
13913                         }
13914                       break;
13915                     default:
13916                       break;
13917                     }
13918                   break;
13919                   /* IEGP to IE/LE.  */
13920                 case GOT_TLS_IEGP:
13921                   switch (eff_tls_type)
13922                     {
13923                     case GOT_TLS_IE:
13924                       switch (r_type)
13925                         {
13926                         case R_NDS32_TLS_IEGP_HI20:
13927                           irel->r_info = ELF32_R_INFO(r_symndx,
13928                                                       R_NDS32_TLS_IE_HI20);
13929                           break;
13930                         case R_NDS32_TLS_IEGP_LO12:
13931                           irel->r_info = ELF32_R_INFO(r_symndx,
13932                                                       R_NDS32_TLS_IE_LO12);
13933                           break;
13934                         case R_NDS32_PTR_RESOLVED:
13935                           {
13936                             uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13937
13938                             add_rt = N32_RT5 (insn);
13939                             insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0);
13940                             bfd_putb32 (insn, contents + irel->r_offset);
13941                           }
13942                           break;
13943                         case R_NDS32_TLS_IEGP_LW:
13944                           break;
13945                         case R_NDS32_LOADSTORE:
13946                         case R_NDS32_PTR:
13947                         case R_NDS32_NONE:
13948                         case R_NDS32_LABEL:
13949                           break;
13950                         default:
13951                           BFD_ASSERT(0);
13952                           break;
13953                         }
13954                       break;
13955                     case GOT_TLS_LE:
13956                       switch (r_type)
13957                         {
13958                         case R_NDS32_TLS_IEGP_HI20:
13959                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_HI20);
13960                           break;
13961                         case R_NDS32_TLS_IEGP_LO12:
13962                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_LO12);
13963                           break;
13964                         case R_NDS32_TLS_IEGP_LW:
13965                           bfd_putb32 (INSN_NOP, contents + irel->r_offset);
13966                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_RELAX_REMOVE);
13967                           break;
13968                         case R_NDS32_LOADSTORE:
13969                         case R_NDS32_PTR:
13970                         case R_NDS32_NONE:
13971                         case R_NDS32_LABEL:
13972                         case R_NDS32_PTR_RESOLVED:
13973                           break;
13974                         default:
13975                           BFD_ASSERT(0);
13976                           break;
13977                         }
13978                       break;
13979                     default:
13980                       break;
13981                     }
13982                   break;
13983                   /* IE to LE. */
13984                 case GOT_TLS_IE:
13985                   switch (eff_tls_type)
13986                     {
13987                     case GOT_TLS_LE:
13988                       switch (r_type)
13989                         {
13990                         case R_NDS32_TLS_IE_HI20:
13991                           irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_HI20);
13992                           break;
13993                         case R_NDS32_TLS_IE_LO12S2:
13994                           {
13995                             uint32_t insn = bfd_getb32 (contents + irel->r_offset);
13996
13997                             add_rt = N32_RT5 (insn);
13998                             insn = N32_TYPE2 (ORI, add_rt, sethi_rt, 0);
13999                             bfd_putb32 (insn, contents + irel->r_offset);
14000
14001                             irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_LE_LO12);
14002                           }
14003                           break;
14004                         case R_NDS32_LOADSTORE:
14005                         case R_NDS32_PTR:
14006                         case R_NDS32_NONE:
14007                         case R_NDS32_LABEL:
14008                           break;
14009                         default:
14010                           BFD_ASSERT(0);
14011                           break;
14012                         }
14013                       break;
14014                     default:
14015                       break;
14016                     }
14017                   break;
14018                 default:
14019                   break;
14020                 }
14021             }
14022           pNextSig = pNextSig->next_sibling;
14023         }
14024
14025 #if 1
14026       pNext = pNext->next;
14027 #else
14028       while (pNext)
14029         {
14030           if (pNext->id != cur_grp_id)
14031             break;
14032           pNext = pNext->next;
14033         }
14034 #endif
14035     }
14036
14037  finish:
14038   if (incontents)
14039     contents = NULL;
14040
14041   if (internal_relocs != NULL
14042       && elf_section_data (insec)->relocs != internal_relocs)
14043     free (internal_relocs);
14044
14045   if (contents != NULL
14046       && elf_section_data (insec)->this_hdr.contents != contents)
14047     free (contents);
14048
14049   if (local_syms != NULL && symtab_hdr->contents != (bfd_byte *) local_syms)
14050     free (local_syms);
14051
14052   if (chain.next)
14053     {
14054       pNext = chain.next;
14055       relax_group_list_t *pDel;
14056       while (pNext)
14057         {
14058           pDel = pNext;
14059           pNext = pNext->next;
14060           free (pDel);
14061         }
14062     }
14063
14064   return result;
14065
14066  error_return:
14067   result = FALSE;
14068   goto finish;
14069 }
14070
14071 /* End TLS model conversion.  */
14072
14073 #define ELF_ARCH                                bfd_arch_nds32
14074 #define ELF_MACHINE_CODE                        EM_NDS32
14075 #define ELF_MAXPAGESIZE                         0x1000
14076 #define ELF_TARGET_ID                           NDS32_ELF_DATA
14077
14078 #define TARGET_BIG_SYM                          nds32_elf32_be_vec
14079 #define TARGET_BIG_NAME                         "elf32-nds32be"
14080 #define TARGET_LITTLE_SYM                       nds32_elf32_le_vec
14081 #define TARGET_LITTLE_NAME                      "elf32-nds32le"
14082
14083 #define elf_info_to_howto                       nds32_info_to_howto
14084 #define elf_info_to_howto_rel                   nds32_info_to_howto_rel
14085
14086 #define bfd_elf32_bfd_link_hash_table_create    nds32_elf_link_hash_table_create
14087 #define bfd_elf32_bfd_merge_private_bfd_data    nds32_elf_merge_private_bfd_data
14088 #define bfd_elf32_bfd_print_private_bfd_data    nds32_elf_print_private_bfd_data
14089 #define bfd_elf32_bfd_relax_section             nds32_elf_relax_section
14090 #define bfd_elf32_bfd_set_private_flags         nds32_elf_set_private_flags
14091
14092 #define bfd_elf32_mkobject                      nds32_elf_mkobject
14093 #define elf_backend_action_discarded            nds32_elf_action_discarded
14094 #define elf_backend_add_symbol_hook             nds32_elf_add_symbol_hook
14095 #define elf_backend_check_relocs                nds32_elf_check_relocs
14096 #define elf_backend_adjust_dynamic_symbol       nds32_elf_adjust_dynamic_symbol
14097 #define elf_backend_create_dynamic_sections     nds32_elf_create_dynamic_sections
14098 #define elf_backend_finish_dynamic_sections     nds32_elf_finish_dynamic_sections
14099 #define elf_backend_finish_dynamic_symbol       nds32_elf_finish_dynamic_symbol
14100 #define elf_backend_size_dynamic_sections       nds32_elf_size_dynamic_sections
14101 #define elf_backend_relocate_section            nds32_elf_relocate_section
14102 #define elf_backend_gc_mark_hook                nds32_elf_gc_mark_hook
14103 #define elf_backend_grok_prstatus               nds32_elf_grok_prstatus
14104 #define elf_backend_grok_psinfo                 nds32_elf_grok_psinfo
14105 #define elf_backend_reloc_type_class            nds32_elf_reloc_type_class
14106 #define elf_backend_copy_indirect_symbol        nds32_elf_copy_indirect_symbol
14107 #define elf_backend_link_output_symbol_hook     nds32_elf_output_symbol_hook
14108 #define elf_backend_output_arch_syms            nds32_elf_output_arch_syms
14109 #define elf_backend_object_p                    nds32_elf_object_p
14110 #define elf_backend_final_write_processing      nds32_elf_final_write_processing
14111 #define elf_backend_special_sections            nds32_elf_special_sections
14112 #define elf_backend_section_flags               nds32_elf_section_flags
14113 #define bfd_elf32_bfd_get_relocated_section_contents \
14114                                 nds32_elf_get_relocated_section_contents
14115 #define bfd_elf32_bfd_is_target_special_symbol  nds32_elf_is_target_special_symbol
14116 #define elf_backend_maybe_function_sym          nds32_elf_maybe_function_sym
14117
14118 #define elf_backend_can_gc_sections             1
14119 #define elf_backend_can_refcount                1
14120 #define elf_backend_want_got_plt                1
14121 #define elf_backend_plt_readonly                1
14122 #define elf_backend_want_plt_sym                0
14123 #define elf_backend_got_header_size             12
14124 #define elf_backend_may_use_rel_p               1
14125 #define elf_backend_default_use_rela_p          1
14126 #define elf_backend_may_use_rela_p              1
14127 #define elf_backend_dtrel_excludes_plt          0
14128
14129 #include "elf32-target.h"
14130
14131 #undef ELF_MAXPAGESIZE
14132 #define ELF_MAXPAGESIZE                         0x2000
14133
14134 #undef  TARGET_BIG_SYM
14135 #define TARGET_BIG_SYM                          nds32_elf32_linux_be_vec
14136 #undef  TARGET_BIG_NAME
14137 #define TARGET_BIG_NAME                         "elf32-nds32be-linux"
14138 #undef  TARGET_LITTLE_SYM
14139 #define TARGET_LITTLE_SYM                       nds32_elf32_linux_le_vec
14140 #undef  TARGET_LITTLE_NAME
14141 #define TARGET_LITTLE_NAME                      "elf32-nds32le-linux"
14142 #undef  elf32_bed
14143 #define elf32_bed                               elf32_nds32_lin_bed
14144
14145 #include "elf32-target.h"
This page took 0.860717 seconds and 4 git commands to generate.